2012-05-20
Mac OSXにlibnfcをインストールしてICタグを読み込む
インストール
準備物
Mac Portsとgccが入っているものとして話を進めます。
まず、libusbをインストール
$ sudo port install libusb $ sudo port install libusb-compat
執筆時の最新版は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でジョブ数を増やしてビルドの高速化
はじめに
makeコマンドでは
$ make -j2
ジョブ数を2個に増やすことができ、ビルド時間を短くすることができる。-jNでジョブ数Nとして設定できる。
実験
どれくらい速くなるかベンチマークをとってみた。
環境
まず、ベンチマーク用に程よい大きさのソースを用意。今回はnginx-1.1.15を使った。
以下、ベンチマークの環境。
- MacBook Air
- OS: Mac OS X 10.6.8
- CPU: 1.86 GHz Intel Core 2 Duo
- メモリ: 4GB 1067 MHz DDR3
nginxで普通に./configureするとrewriteモジュールが足りないとエラーをはくので、今回は
$ ./configure --without-http_rewrite_module
とした。
計測
計測にはtimeコマンドを使い、realの値をベンチマークの結果とした。
ジョブ数1-6個で計測した。
計測回数はそれぞれ1回。
結果
| ジョブ数 | 時間[s] |
|---|---|
| 1 | 28.10 |
| 2 | 17.85 |
| 3 | 17.92 |
| 4 | 18.79 |
| 5 | 18.41 |
| 6 | 17.28 |
まとめ
ジョブ数1個じゃさすがに遅いけど、2個以上だと速い。2個以上のベンチマークは各環境ごとに多く取らないといけない。今回は1回しか取っていないことに注意。
-jNオプションは積極的に使うべき。
2011-12-30
Chrome拡張のバックグラウンドのDOMを取得する方法
chrome.extension.getBackgroundPage().document
<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
- background.html
- contacts.html
2011-12-28
Google Chrome 拡張機能でOAuthを利用する方法
プログラミング, Javascript | |
記事について
GoogleカレンダーAPIを使って拡張機能を作りたかったけど、OAuthでの認証が必要と分かった。色々調べていると認証が通ったので、そのメモ書き。
拡張機能でOAuthを利用する際に問題になること
- CONSUMER_KEYやCONSUMER_SECRETを公開してしまうこと
- 認証の際に別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
このサンプルを実行するとユーザのコンタクト情報が取得できたことが分かる。今回はこの中の
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で認証処理を行わせる。認証の際にドメインを複数またぐので、その許可を求める。
今回はGoogleのOAuth認証を行うのでそれ用の設定をしたが、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> ...
ChromeのOAuthサンプルのファイルを読み込ませる。その後に、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のバージョンも追加しておいた。今回のプログラムではバージョン情報を追加しなくとも動くことが確認できた。
これらの情報を送信するAPIはoauth.sendSignedRequestである。引数はそれぞれ、APIのURL、送信後のレスポンスを受け取る関数、送信情報である。
終りに
GoogleカレンダーAPIをつかって予定を登録することができた。手こずったのは予定を登録する処理である。APIのドキュメントを読みながらやっていたからである。
以上メモ書き。
2011-12-23
Chrome拡張機能「ニコ生を見る予定」を作りました
プログラミング, Javascript | |
公開場所
この拡張について
ニコ生の放送予定をGoogleカレンダーに書く込むのがすごく面倒、そんな面倒を解決するのがこの拡張機能です。
2クリックでGoogleカレンダーの予定を作成します。
操作方法は簡単!放送予定で[Googleカレンダー]ボタンを押し、予定作成ページに移動したら[作成]ボタンを押すだけです。






コンパイルできません。原因は何が考えられるでしょうか?
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 スキップ ==========
投稿するつもりでしたが、間違ってここに投稿してしまいました。
http://d.hatena.ne.jp/ichhi/20110306/1299434439#c1325725319
こちらに返信を書きました。