BeagleBone Black (BBB) と PocketBeagle の比較

色々先走って書き出してしまいましたが BeagleBone Black (BBB) と PocketBeagle の比較表ぐらいは必要だろうと作成してみました。

表レイアウトが微妙なのは筆者のスキル不足です。

モデルBeagleBone Black (BBB)PocketBeagle
価格
$55$25
プロセッサ1GHz AM335x x 1
32bit RPUs x 2
1GHz AM335x x 1
32bit RPUs x 2
メモリ
512MB DDR3512MB DDR3
ストレージ4GB eMMC

MicroSD スロット
MicroSD スロット
映像出力micro-HDMIなし
デバッグJTAGJTAG
インターフェース
46pin GPIO x 236pin GPIO x 2
ネットワーク10/100 Ethernetなし
無線LANなしなし
電源USB経由 または DCジャック (5.5mm)USB経由またはGPIOヘッダ

ご覧のとおり、インターフェースには明確な差異があるものの、プロセッサとメモリ構成は、実は BBB と PocketBeagle で同じなんですね。

小さい=非力ではないので、アプリケーションの構成によってはPocketBeagleでも BBB と同等の性能を発揮できそうです。これは嬉しい。

ですので、BBB と PocketBeagle どちらを選ぶかは、性能ではなくユーザの利用目的で選べばいいと思います。Raspberry Pi 的な使い方をしたい人は BBB、Arudino や mbed マイコン的な組み込みに近い用途で開発をしたい人は PocketBeagle という感じでしょうか。

でも、ラズパイ的な使い方したい人はラズパイ買っちゃうだろうから、結局 BBB の認知度はちっとも上がらないんですよね。。。

オチがついたところで今日はここまで。

BeagleBoneのGPIO最大電流は4-6mA

タイトルそのまんまなんですが。結構少ないなという印象です。

GPIO 接続で電流を消費するデバイスと言われて思い浮かぶのは LED なんですが、よくある感じの LED でも標準電流 20mA なので、定格オーバーしないように注意が必要です。(BeagleBone に限った話ではないですが)

ちなみに少し調べてみると、マイコン別の最大電流は Arduino Uno で 10-20 mA、mbed リファレンス機である LPC1768 で45-50mA でした。Raspberry Pi でも 17mA なので、他家と比べても控えめですね。

BeagleBone のデータシートはこちらからどうぞ。

cordova プロジェクトで platform が依存する cordova バージョンを確認する方法

cordova プロジェクトにおいて、個々のプラットフォームがビルドに必要とする cordova のバージョン番号を確認するには、CordovaLib 以下にある VERSION ファイルの中身を参照すれば OK です。

具体的な例として、例えば ios プラットフォームの場合、プロジェクト直下で以下のコマンドを実行すればバージョン番号が確認できます。

$ cat ./platforms/ios/CordovaLib/VERSION 
3.5.0

ちなみに、このバージョン番号は CORDOVA_VERSION_MIN_REQUIRED として CDVAvailability.h 内でも定義されているとおり、特定のプラットフォームにおいてビルドを実行するのに必要となる「最小のバージョン番号」になります。

CORDOVA_VERSION_MAX_REQUIRED という定数は定義されていないため、感覚的にはこれよりも大きい cordova バージョンを使えば問題なさそうですが、実際には cordova バージョンが大きすぎる場合ビルドに失敗することがあります。

もし cordova build が失敗する場合は、このファイルで定義されているバージョン番号と同じか、少しだけ大きいバージョン番号で試すと良いでしょう。

$ grep "CORDOVA_VERSION_MIN_REQUIRED __CORDOVA" ./platforms/ios/CordovaLib/Classes/CDVAvailability.h
    #define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_3_5_0

このプロジェクトの例では、cordova 3.5.0-0.2.0 〜 3.6.3-0.2.13 では問題ありませんでしたが、cordova 4.0.0 〜 ではビルド NG でした。

バグが出たからと数年前に納品済みのアプリのソース一式を渡されて、ビルドすらできずに戸惑った自分への戒めを含めたメモでした。

kindle 無印と kindle paperwhite の割引セール 8/21まで

ずっと気になってた kindle ですが、最近リニューアルされた無印(一番安いグレード)が、かなりコストパフォーマンスが良いと知人から聞いてますます欲しくなってしまいました。

ガラケー、スマホ、タブレット、ノートPCをそれぞれ所有し、しかも仕事で毎日それら全てを運んでいるという、便利なのかバカなのかわからない状態の作者。ここで kindle 購入したらある意味コンプリート。完全なバカ。

バカは別にいいんですが、これ買っちゃったらもう欲しいガジェットなくなっちゃうんだろうなぁ…と、目的とは若干ずれた視点でも悩んでたりもします。好きなものは最後にとっておくタイプなので。

で、結論から言うと、買っちゃいました。(ポチっただけですが)

いつ何かに背中を押されてもおかしくない状態だったのですが、決め手となったのは、離れて暮らす父親の誕生日に贈ろうかな…と。

kindle は本をギフトとして贈ることもできるらしいので、kindle 本体を贈った後も、父親が好きな歴史ものの本を見つけるたびに贈る、といった事もできそうです。父親とは最近すっかり疎遠になってしまっているので(主に自分が悪いんですが)、「kindle+本」を通じたコミュニケーションなんてのも面白いかなあと。

本当は直接会って本の感想とか言い合いながら酒を酌み交わすなんてのが理想なんですけど、遠距離と仕事と子育てに奮闘していると、なかなかそんな機会にも恵まれないです。職人だった父親は用がないと連絡してこない人タイプの人なので、引退してからはますます音沙汰がなくなってしまい、何かきっかけが欲しいと思っていたところなので、今回のキャンペーンに乗じて kindle 試してみる事にしました。

あ、そもそも使ってくれるかという疑問は、確かにありますけどね。老眼だし。
いやむしろ文字サイズを変えられる kindle なら読みやすい?
まあ出たとこ勝負ですね(笑

Firefox OS Bluetooth API の翻訳(と試行錯誤)

このエントリは MDNやFirefox OSのドキュメントをみんなで翻訳! Advent Calendar 2015 の 21 日目 です。

Bluetoothマネージャと設定操作に必要な Setting API あたりを翻訳してみました。
初めての翻訳作業でしたが、初日のUemmra3さんの投稿などを参考にさせていただきながら、色々悩みつつも楽しんで作業しました。

訳したのはこのあたり↓です。
BluetoothManager (Firefox OS)
デバイス設定の利用

基本自分は締め切りに終われないと動かない(動けない)人なので、ウィキペディアとか自主的に書いてる人本当にすごいなあと思います。

今回もそうなんですが、作業開始からある地点を超えると、どんどん作業速度が増してくるんですよ。で、そのスピードに乗れると、今度は作業そのものが楽しくなってきて、気がつくと時間を忘れて没頭してたりするんです。
(ただしその地点をいつ越えられるかが分からないので、それまでは終わりの見えない悶絶タイムが続くわけですが)

今回 Firefox OS の bluetooth まわりを翻訳してみようと思ったきっかけは、Firefox OSで bluetooth がらみのアプリを作りたいなとのほほんと思いついたからなんですが、名乗りを上げてからよくよく調べてみると、bluetooth 関連のAPIは認定アプリ(内部アプリとか公認アプリとか呼ばれていたりもします)に属するAPIで、セキュリティの観点から通信事業者やOEM事業者、つまりプリインストールされるアプリにのみその利用を限定されてたんですね。

どおりでテストプログラム書いて BluetoothManager オブジェクトとか取得しても null 返ってくるわけですよ・・・

ドキュメントちゃんと読めって感じです。訳して下さった方ごめんなさい。というか翻訳作業者が何やってるんだって感じですが。

で、そもそも触れないAPI翻訳したって仕方ないじゃないの、とやさぐれてたんですが、久しぶりに引っ張り出してきた Firefox Flame の開発者メニューを眺めてたらこんな項目を見つけて釘付けに。

flame_unlock_privilages

何この危険そうな感じの素敵なスイッチ。押してみよう。

2015-12-22-02-37-14

セキュリティを解除した上にデータまで削除。
たぶんよい子は押しちゃいけないやつです。でも押す。

2015-12-22-02-37-23

この画面のあとボタンを10回押すとFASTBOOTの画面が表示され、本当に真っ新な状態でデバイスが起動しました。

期待をこめて、Bluetooth Managerを取得してコンソールに出力するだけの簡単なコードを実行してみます。

// Bluetooth Manager 取得
bluetooth = window.navigator.mozBluetooth;
console.info("mozBluetooth", bluetooth);
console.info("BluetoothManager.enabled", bluetooth.enabled);

すると・・・

console_log

ちゃんとオブジェクト返ってきてます!成功です!!

・・・と、思ったんですが、よく見るとたった一つしかない .enabled プロパティが取れていません。(涙)
.getAdapters() メソッドも叩いて見たのですが、やはりこちらも空っぽの配列が返ってくるだけ。
つまりオブジェクトが取れただけで、あとは何もできないんです。

Firefox WebIDE は認定アプリのデバッグは正式にサポートしていないし、そもそもコンソールのデバッグにも限界を感じ始めました。そこでない知恵を絞って色々考えてながら調べてゆくと、Android SDK にバンドルされている Android Monitor が使えそうだということに。

Android Monitor | Android Developers

ええもう翻訳時間よりデバッグ時間の方が長くなってます。

実は BluetoothManager は、マネージャーと言いつつも Bluetooth アダプタの取得と bluetooth の有効/無効の監視くらいしかできなかったりします。割と守備範囲の狭い子なんです。

そこで Settings API を使って Bluetooth の状態変更を任意に発生させ、イベント発生を拾えないかテストしてみました。

新たに追記した Setting API はこれだけです。

// Setting API の取得と lock オブジェクト作成
var settings = window.navigator.mozSettings;
var lock    = settings.createLock();

// 設定取得
var setting = lock.get('bluetooth.enabled');
setting.onsuccess = function () {
    console.log('setting.result', setting.result);
};
setting.onerror = function () {
    console.warn('setting.error', setting.error);
};
// 設定変更
var result = lock.set({
    'bluetooth.enabled': true
});
result.onsuccess = function () {
    console.log("bluetooth settings has been changed");
};
result.onerror = function () {
    console.log("An error occure, the bluetooth settings remain unchanged");
};
console.info("result", result);

その実行結果がこちら。
(読みにくくてすみません)

12-22 00:17:01.346: I/BlueToothTest(5221): Content JS INFO: mozBluetooth [object BluetoothManager] 
12-22 00:17:01.356: I/BlueToothTest(5221): Content JS INFO: BluetoothManager.enabled  
12-22 00:17:01.676: I/BlueToothTest(5221): Content JS LOG: bluetooth settings has been changed 
12-22 00:17:01.746: I/GeckoDump(2449): [system] [SettingsCore][2851.691] observing settings bluetooth.enabled changed to true
12-22 00:17:01.746: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.694] observing bluetooth.enabled : true
12-22 00:17:01.746: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.695] observer for bluetooth.enabled found, invoking.
12-22 00:17:01.746: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.696] unsuspending: bluetooth.suspended
12-22 00:17:01.746: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.696] writing {"bluetooth.suspended":false} to settings db
12-22 00:17:01.746: I/GeckoDump(2449): [system] [SettingsCore][2851.697] writing {"bluetooth.suspended":false} to settings db.
12-22 00:17:01.796: I/GeckoDump(2449): [system] [SettingsCore][2851.741] observing settings bluetooth.suspended changed to false
12-22 00:17:01.796: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.741] observing bluetooth.suspended : false

ログを見る限りでは Setting API で Bluetooth の有効に成功しているし、実際 Setting API の .onsuccess() コールバック関数では設定変更のイベントも取得できているんですが、肝心の BluetoothManager が設定の変更を検知してくれないんです。

そもそも .enabled プロパティは相変わらず null だし、そもそもあるはずの Bluetooth アダプタが返ってこないのもおかしい。

もはやソースコードを確認するしかない。
他のプラットフォームなら多分諦めてますが、こんな時ソースコードがJavascriptで書かれているのが有難いです。

githubを彷徨って、多分これが BluetoothManager のソースコードだと思われる箇所を発見。

gaia/apps/bluetooth/js/modules/bluetooth/bluetooth_adapter_manager.js

しかし .enable プロパティが定義されていない。あれ?間違えた?
ここで初期化された後どこかで追加されるとか。いや、そんな追いにくいコード書くかなぁ。
システム構造の基本知識がないから判断に迷うところです。こんな事なら Firefox OSのコードリーディングに参加しておくんだった・・・

gaia/apps/system/js/bluetooth_v2.js

あれ、bluetooth_v2.js なんてソースコードがあるぞ?
こっちには .enabled が定義されてる。ひょっとして flame に入れた OS のバージョンが古い?いやいや Latest master builds なんですけど・・・。

と、色々試行錯誤しているうちに時間切れになってしまいました。
ここまで読んで下さった人、本当に申し訳ない。でもありがとうございます。

今回の経験を通じて問題解決のための手数が増えたので、一応得るものはあったのですが、やっぱり解決にたどり着けなかったのは悔しいです・・・というか気になって仕方がないです。

あと後半は脱線気味でしたが、自分はやはり bluetooth まわりを習得したいです。
でも頑張って作っても自分の開発端末でしか動かせない、配布できないというのは寂しいです。

なのでもし将来的にはマーケットのレビュープロセスで配布可能になったり、カメラAPIのように低い権限レベルでも利用可能になると嬉しいです。Mozillaの偉いひと、お願いします。そんな未来がやってくるならデバッグにも身が入ります(笑)

OSX MavericksでApache使うときの覚え書き

とりあえず以下の3つ覚えておけば何とかなるかと。

$ sudo apachectl start
$ sudo apachectl stop
$ sudo apachectl restart

というかマニュアル見た方が早い?

$ sudo apachectl -man
Usage: /usr/sbin/httpd [-D name] [-d directory] [-f file]
                       [-C "directive"] [-c "directive"]
                       [-k start|restart|graceful|graceful-stop|stop]
                       [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed settings (currently only vhost settings)
  -S                 : a synonym for -t -D DUMP_VHOSTS
  -t -D DUMP_MODULES : show all loaded modules 
  -M                 : a synonym for -t -D DUMP_MODULES
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check

上記マニュアルには載ってないけれどconfigtestも使えるみたいです。

$ sudo apachectl configtest
Syntax OK

Mac版 Google Chrome の Local Storage の場所

JavaScriptの開発にはJetBrains WebStormとGoogle Chromeの組み合わせが最強だと信じて疑わない自分です。おかげでFireFox全然使わなくなっちゃいました。

で、今回開発環境を引っ越す必要があり、Local Storage使い回せないかなーと少し調べてみました。目的のファイルは

~/Library/Application\ Support/Google/Chrome/Default/Local\ Storage/ 

にあります。Local Storageを生成したサイトのURL毎に作成されているのですぐ分かると思います。

ShareMarker 1.00 リリースしました

今月半ばに申請を出していたiPhoneアプリ「ShareMarker」がようやく受理されました。

ShareMarker
カテゴリ: SNS
価格: 無料 App

実際にアプリを申請された方のブログなどを拝見していますと、通常アプリケーションをiTunes Connectに送信してからレビュー開始までに1週間程度待たされるものの、実際にレビューが始まると約1日くらいで結果が分かると書いてあったのですが、ShareMarkerの場合、レビュー開始までに1週間、その後レビュー完了までさらに2週間を要しました。最初だから時間がかかったのか、画面遷移が多いのでレビューに時間がかかったのかは不明ですが、ここまで2週間ずっとモヤモヤしていたのでとりあえずホッとしたというのが正直な感想です。

せっかくなので、アプリの宣伝をちょこっとだけ。

ShareMarkerは自分だけが知っている(はず)お気に入りの場所を共有するサービスです。
気に入った場所・お店を見つけたら、写真を撮って、コメントを書いて、地図上に貼り付けることで友人達と情報を共有することができます。

こうしたサービスは、例えば大手サイトなどでも似たようなものを見かけたりしますが、個人的な狙いとしてはもう少しローカルな、地元の人たちが気軽に訪れる場所とかお店をメインに集めていきたいと考えています。

現在は札幌市内、特にすすきの周辺(笑)のお店情報が充実しているわけですが、狙いがローカルなのでこんな感じになります。こういう小さな輪が、全国あちこちに広がればいいなと考えています。

久しぶりに帰省した友人連れて飲みに行くときに「あの店どこだっけな」的な使い方をしてもらったり、友人が旅行先で投稿したマーカーを見て「へえ、素敵な場所だな」と興味を持ってもらえたら最高ですね。

アプリ的には機能に関してまだまだ不親切な部分があるのと、友人間での情報共有の手段をもっと充実させないといかんなあと思っています。
使ってみての感想・要望などあればコメントお願いします。

AppStore経由でのXcode 4.2アップデートにハマる

Xcode4から、入手先がAppStore経由でのダウンロード方式に変わったわけですが、これで見事にハマりました。
正確にはXcodeではなくAppStoreなんですが。

Xcode4.2にアップデートしようとしたものの、1.8GBもあるファイルを一気に落としきれず、一旦中断。
ダウンロード途中のファイルは一時フォルダに格納されてレジューム状態に入るため、再開すれば中断した状態からダウンロードが再開される・・・はずだったんですが、これがいつまでたっても再開しないのです。

AppStoreを立ち上げ直したり、アカウントをサインアウト&サインインしてみても効果なし。
AppStoreのメニューには[Store]→[ダウンロードが完了していない項目があるか確認…]という、いかにもそれらしい項目は存在するのですが、こちらをクリックしても「全てダウンロードされています」と表示されるだけ。

諦めてXcode4.1で開発続けようとも思いましたが、残っている作業はiOS5での実機テストだったので、SDKがないことにはインストールもできません。ほとほと困ってしまいました。

で、ひょっとしたらレジューム状態の一時ファイル消しちゃえばいいんじゃない?と思いついたわけです。

結果的にこれがアタリだったわけですが、まず一時ファイルの格納先がわからず調査。
するとAppStoreにデバッグモードなんてナイスなモードが存在することが分かりました

Where does the Mac AppStore download temp files to
http://www.ryanragle.com/index.php?/site/comments/where-does-the-mac-app-store-download-temp-files-to

具体的には、ターミナル上から「defaults write com.apple.appstore ShowDebugMenu -bool true」と叩いてからAppStoreを立ち上げると、メニュー最後尾に「Debug」が追加されます。ここから「Show Download Folder…」を選択すると、ファイルの格納先が表示されます。私の環境では「/private/var/folders/0s/[英数字の羅列]/C」というパスでしたが、このあたりは環境によって異なってくるかと思われます。

で、そのフォルダ直下にあった「com.apple.Xcode.501」フォルダをまるっとゴミ箱へ放り込み、AppStoreを起動します。
すると「アップデート」のアイコンに「①」というバッジが表示されており、クリックするとXcodeがダウンロード開始をゼロの状態で待ち受けていてめでたしめでたし、というわけでした。

ちなみにインストール完了後、自動的にXcodeが4.2にアップデートされるわけではなくて、アプリケーションフォルダにある「Install Xcode.app」を起動することでXcode 4.2への更新が始まります。なんで?って感じなんですけどね。恐らくはAppStoreのレジューム機能を活用したかったのではないかと邪推するわけですが、それにしても直感的でないですよね。アップルらしくないというか。