Hatena::ブログ(Diary)

おし、プログラミング

2012-05-20

Mac OSXにlibnfcをインストールしてICタグを読み込む

| 12:35 | Mac OSXにlibnfcをインストールしてICタグを読み込むを含むブックマーク

f:id:ichhi:20120520124907j:image

インストール

準備物

Mac Portsgccが入っているものとして話を進めます。

まず、libusbをインストール

$ sudo port install libusb 
$ sudo port install libusb-compat

次にlibnfcのソースコードダウンロードし、それを解凍

執筆時の最新版はlibnfc-1.6.0-rc1

$ wget http://libnfc.googlecode.com/files/libnfc-1.6.0-rc1.tar.gz
$ tar xvf libnfc-1.6.0-rc1
$ cd libnfc-1.6.0-rc1

最後にビルドインストール

configureのパラメータは各自で合わせてください。メモと参考までにパラメータを載せておきます。

$ ./configure LDFLAGS="-L/opt/local/lib" CFLAGS="-I/opt/local/include -I/opt/local/include/libusb-1.0 -I/Developer/SDKs/MacOSX10.6.sdk/usr/include/pcap"
$ make && make install

もしmakeで失敗したら

私の環境ではmake中にエラーが出て、解決中に調べたことをメモ。

参考資料 MIN is undefined on Mac OS X - libnfc developers group | Google Groups

make中に下記のエラーがでたら

Undefined symbols:
  "_MIN", referenced from:
      _pn53x_usb_receive in libnfcdrivers.a(libnfcdrivers_la-pn53x_usb.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[3]: *** [libnfc.la] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

libnfc/nfc-internal.hの27行目くらいにこのコードを追加。

#ifndef MAX 
#define MAX(a,b) (((a) > (b)) ? (a) : (b)) 
#endif 
#ifndef MIN 
#define MIN(a,b) (((a) < (b)) ? (a) : (b)) 
#endif 

2012-02-26

makeでジョブ数を増やしてビルドの高速化

23:53 | makeでジョブ数を増やしてビルドの高速化を含むブックマーク

はじめに

makeコマンドでは

$ make -j2

ジョブ数を2個に増やすことができ、ビルド時間を短くすることができる。-jNでジョブ数Nとして設定できる。


実験

どれくらい速くなるかベンチマークをとってみた。

環境

まず、ベンチマーク用に程よい大きさのソースを用意。今回はnginx-1.1.15を使った。

以下、ベンチマークの環境。

nginxで普通に./configureするとrewriteモジュールが足りないとエラーをはくので、今回は

$ ./configure --without-http_rewrite_module

とした。

計測

計測にはtimeコマンドを使い、realの値をベンチマークの結果とした。

ジョブ数1-6個で計測した。

計測回数はそれぞれ1回。

結果
ジョブ数時間[s]
128.10
217.85
317.92
418.79
518.41
617.28

f:id:ichhi:20120226234130p:image


まとめ

ジョブ数1個じゃさすがに遅いけど、2個以上だと速い。2個以上のベンチマークは各環境ごとに多く取らないといけない。今回は1回しか取っていないことに注意。

-jNオプションは積極的に使うべき。

コーヒータイムを長くしたいときは-jNオプションを外すべき。

2011-12-30

Chrome拡張のバックグラウンドのDOMを取得する方法

06:21 | Chrome拡張のバックグラウンドのDOMを取得する方法を含むブックマーク

chrome.extension.getBackgroundPage().document

これでバックグラウンドページのDOMを取得できる。

またバックグランド内で定義された変数hogeも取得できる

<script>
// background.html
var hoge = null;
</script>
<script>
// NOT_backgroud.html
chrome.extension.getBackgroundPage().hoge
</script>

このサンプルを見て知った : http://code.google.com/chrome/extensions/samples.html#56a8d2ac24ca7bba78fd88ad57f43fc13c784497

WVHP64WVHP64 2012/01/05 09:10 4 で calculator.idl をコンパイルする時に、以下のようなメッセージが表示され
コンパイルできません。原因は何が考えられるでしょうか?

1>------ ビルド開始: プロジェクト: calculator, 構成: Debug Win32 ------
1> Performing Custom Build Tools
1> Traceback (most recent call last):
1> File "C:\Users\WVHP64\Desktop\nixysa-read-only\nixysa\codegen.py", line 38, in ?
1> import locking
1> File "C:\Users\WVHP64\Desktop\nixysa-read-only\nixysa\locking.py", line 24, in ?
1> import pywintypes
1> ImportError: No module named pywintypes
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5): error MSB6006: "cmd.exe" はコード 1 を伴って終了しました。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

WVHP64WVHP64 2012/01/05 09:16 すみません。2011-03-06の「C++でGoogle Chromeのプラグインを書いてみた」に
投稿するつもりでしたが、間違ってここに投稿してしまいました。

ichhiichhi 2012/01/05 10:05 WVHP64さん。

http://d.hatena.ne.jp/ichhi/20110306/1299434439#c1325725319
こちらに返信を書きました。

2011-12-28

Google Chrome 拡張機能でOAuthを利用する方法

| 05:17 | Google Chrome 拡張機能でOAuthを利用する方法を含むブックマーク

記事について

GoogleカレンダーAPIを使って拡張機能を作りたかったけど、OAuthでの認証が必要と分かった。色々調べていると認証が通ったので、そのメモ書き。

拡張機能OAuthを利用する際に問題になること

  1. CONSUMER_KEYやCONSUMER_SECRETを公開してしまうこと
  2. 認証の際に別URLへコールバックされること

1に関して。

Googleのカレンダーやコンタクトや何やらのGoogle Data APIを叩きたかったら、OAuthで認証する必要がある。OAuthは通常CONSUMER_KEYやCONSUMER_SECRETをサービス提供側が事前に取得する必要がある。この2つのキーは他人に公開すると悪用される場合があるため、教えてはならない。

2に関して。

OAuthの仕様上、認証に必要なキーを取得するためにコールバックで別のURLを飛ばされてしまう。コールバックのURLにはhttp://* かhttps:// しか指定できず、Chrome拡張機能を示すchrome-extension://*は指定できない。

解決策

問題1の解決策は、CONSUMER_KEYとCONSUMER_SECRETに両方'anonymous'を入れるだけ。

問題2に関して。

Chrome APIのサンプルにOAuth機能を実現するサンプルが有る。Sample - OAuth Contacts

このサンプルを実行するとユーザのコンタクト情報が取得できたことが分かる。今回はこの中の

  • chrome_ex_oauth.js
  • chrome_ex_oauthsimple.js
  • chrome_ex_oauth.html

3ファイルを利用する。これらのファイルは拡張機能OAuthを実現するために必要なファイルである。chrome_ex_ouath.htmlはコールバック先のファイルである。内部でどういった動作をしているかはわからないので、解説はできない。

実装

以下のプログラムGoogleカレンダーAPIを使い予定を登録するプログラムである。

まずmanifest.jsonにはこのように書く。

{
    ...
    "background_page": "background.html",
    "permissions": [
        "tabs",
        "http://www.google.com/calendar/feeds/*",
        "https://www.google.com/accounts/OAuthGetRequestToken",
        "https://www.google.com/accounts/OAuthAuthorizeToken",
        "https://www.google.com/accounts/OAuthGetAccessToken"
    ],
    ...
}

background.htmlで認証処理を行わせる。認証の際にドメインを複数またぐので、その許可を求める。

今回はGoogleOAuth認証を行うのでそれ用の設定をしたが、Twitterに関しては別の方が書かれていた。LDRでふぁぼるChrome拡張の内部動作 | monoの開発ブログ

background.htmlで行わせる処理。

...
<script src="OAuthSimple/chrome_ex_oauth.js"></script>
<script src="OAuthSimple/chrome_ex_oauthsimple.js"></script>
<script>
var oauth = ChromeExOAuth.initBackgroundPage({
        'request_url' : 'https://www.google.com/accounts/OAuthGetRequestToken',
        'authorize_url' : 'https://www.google.com/accounts/OAuthAuthorizeToken',
        'access_url' : 'https://www.google.com/accounts/OAuthGetAccessToken',
        'consumer_key' : 'anonymous',
        'consumer_secret' : 'anonymous',
        'scope' : 'http://www.google.com/calendar/feeds/',
        'app_name' : 'Application Name'
});
window.chromeExOAuth.callback_page = 'OAuthSimple/chrome_ex_oauth.html';

oauth.authorize(function() {
    var url = "http://www.google.com/calendar/feeds/default/private/full";
    var body = JSON.stringify({
        "data": { "title": "Tennis with Beth",
            "details": "Meet for a quick lesson.",
            "transparency": "opaque",
            "status": "confirmed",
            "location": "Rolling Lawn Courts",
            "when": [
            {
                "start": "2010-04-17T15:00:00.000Z",
                "end": "2010-04-17T17:00:00.000Z"
            }
            ]
        }
    });
    oauth.sendSignedRequest(url,
    function(text, xhr) {
        console.log(text);
    },
    {
        'method': 'POST',
        'headers': {'GData-Version': '2', 'Content-Type': 'application/json'},
        'body': body
    });
});

...
</script>
...

ChromeOAuthサンプルのファイルを読み込ませる。その後に、ChromeExOAuth.initBackgroundPage APIを使い認証の設定させる。問題1の解決策で書いたようにconsumer_keyとconsumer_secretに'anonymous'を入れる。

次の行に関してだが、これはコールバックURLの変更する手続きである。コールバックURLデフォルトは'chrome_ex_oauth.html'となっている。変更するオプションも同APIに存在するが、変更出来なかった。chrome_ex_oauth.jsの関係するコードを読むと設定方法が分かった。windos.chromeExOAuth.callback_pageに任意のコールバックURLを入れることで設定ができた。

oauth.authorizeで認証を行わせる。引数関数はtokenが取得できた時に呼ばれる関数である。ここで初めて、GoogleカレンダーAPIを使い予定を登録したり取得することが可能となる。

最後にGoogle カレンダーAPIを使い予定を登録する。そのためのAPIこれ。POSTメソッドを使い予定を送信する。この時JSONフォーマットで送るので

Content-Type: application/json
GData-Version: 2

とした。このヘッダ情報に加えてGoogle Data APIのバージョンも追加しておいた。今回のプログラムではバージョン情報を追加しなくとも動くことが確認できた。

これらの情報を送信するAPIoauth.sendSignedRequestである。引数はそれぞれ、APIURL、送信後のレスポンスを受け取る関数、送信情報である。

終りに

GoogleカレンダーAPIをつかって予定を登録することができた。手こずったのは予定を登録する処理である。APIのドキュメントを読みながらやっていたからである。

以上メモ書き。

2011-12-23

Chrome拡張機能「ニコ生を見る予定」を作りました

| 03:01 |  Chrome拡張機能「ニコ生を見る予定」を作りましたを含むブックマーク

f:id:ichhi:20111224024345p:image

公開場所

Chrome Web Store - ニコ生を見る予定

この拡張について

ニコ生の放送予定をGoogleカレンダーに書く込むのがすごく面倒、そんな面倒を解決するのがこの拡張機能です。

2クリックでGoogleカレンダーの予定を作成します。

f:id:ichhi:20111224025926p:image

f:id:ichhi:20111224035040p:image

操作方法は簡単!放送予定で[Googleカレンダー]ボタンを押し、予定作成ページに移動したら[作成]ボタンを押すだけです。