2014/05/22

FeliCa Linkモジュール

FeliCa Linkってどこにも売られてないよなあ、と思っていたが、ちょっと考えが違っていたようだ。
RC-S967はチップで、それだと自分でアンテナとかをやってやらんといかんかったみたい。
私が想像していたのはRC-S730みたいな、アンテナとかが一体になったモジュールだった。

http://www.sony.co.jp/Products/felica/business/press/140304.html

そうそう、そういうのでいいんだよ!
だけど、まだ売られているのは見たことがない・・・。

2014/05/17

[ios]もうちょっと言語切替のことを考える

あれから、言語切替についてもう少し考えてみた。

そうだ、私はiPadだけじゃなくて、iPhoneにも対応しようとしてたんだ。
Universalで作っているので、Storyboardは2つある。
でも、ほとんど同じような画面になるので、文言なんかは共通にしたい。
でもでも、Storyboardが別なので、ObjectIDなんかも別になる。
そしたら、iPad用に一度stringsを作っても、それをそのままiPad用にする、というわけにはいかない。
むー。

そのとき、どこからか声がした。
「ObjectIDにあわせるのではない。ObjectIDをあわせるのだ」

はっ!!
私はStoryboardファイルをソースコードとして開き、idを書き換え、stringsを更新するスクリプトを実行した。
そうすると、ちゃんと反映されるではないか。

/* Class = "IBUILabel"; text = "クエリー"; ObjectID = "IPAD-SECTION1-QUERY"; */
"IPAD-SECTION1-QUERY.text" = "クエリー";

こんな感じだ。
これができるなら、ObjectIDをリソースID代わりに使って、プレフィクスとかでiPadとiPhoneを切り分けるようにすることができるんじゃなかろうか。


もちろん、最大の難関は、ObjectIDを書き換えることだ。
見ている限りでは、Storyboardとstringsで完結しているようなので、書き換えること自体は問題なさそうなんだけど、どうやって書き換えるかだ。
XcodeのStoryboardエディタからはできないので、自分でやらないとできない。
せめて、ObjectIDじゃなくて、Labelとかで管理できればいいのになぁ。

[ios]言語切り替えに対応するのは、けっこう面倒

まだ設定画面を作ろうとしている段階だが、そういえば他言語切替はどうやってやるんだろう?ということに思い当たった。
Androidだとstrings.xmlとか、リソースIDで取ってくるとかやるのだが。

iPadとiPhoneのstoryboardがそれぞれある場合で試してみよう。


まず、アプリを新規で作ることにする。
そしてstoryboardを開き、既存のViewControllerを削除し、Navigation Controllerを置く。意味はないんだけど、作ろうとしているアプリに近くしておくだけ。

自動的にTableView Controllerができているので、TableViewをAttributes inspectorでStatic Cellsにしておく。デフォルトはDynamicでソースに書いていくようになってるけど、まあ、それはあとだ。

ここら辺で、PROJECTのInfo設定で、Localizationsにjaを追加。
ダイアログが出てきて、チェックが全部入っていたので、そのままFinish。
そしたら、プロジェクトツリーのStoryboardのところに▲が出てきて開けるようになる。
開くと、「Main_iPad.storyboard(Base)」「Main_iPad.strings(Japanese)」みたいなものになっていた。
StoryboardエディタでFile inspectorを見ると、LocalizationがBaseとJapanseseにチェックが入っていて、EnglishとJapaneseの設定?がLocalizable Stringsになっていた。
つまり、UI画面ではBaseとなる言語(今回は英語)で文字列を書き、stringsファイルに変換する日本語を書く、というスタイルになるのか。

それはそれでいいんだけど、stringsファイルがこんな感じなのが困る。
/* Class = "IBUILabel"; text = "Label"; ObjectID = "2zy-iV-2j6"; */

"2zy-iV-2j6.text" = "Label";
オブジェクトIDになっているので、どれがどれかわからん・・・・。

設定?をLocalizable StringsからInterface Builderに変えると、もう1枚Storyboardができあがった。
つまり、日本語用のUI画面ができた、と。
これはこれでめんどくさい・・・。

私がやるなら、先に英語なり日本語なりでUIの文字を全部埋めてからLocalizationsに追加して、stringsファイルのコメントに文字列が既に書かれるようにしたいな。

こちらを見ながら、stringsファイルを更新してくれるスクリプトを動かすようにすると、後からでも更新されるので便利だ。
http://d.hatena.ne.jp/paraches/20130225
どうやってるのかわからないけど、stringsファイルを手動更新したところは残ってるし、Storyboardで更新されたところは入ってるし。
ただ、Storyboardで文字列を更新すると、stringsファイルでそのオブジェクトの文字列を手動で更新していても、それは捨てられてStoryboardの文字列が入るようになっていた。

それなら、だ。
Baseにはそれっぽい文字列を埋め込むだけにして、各言語の文字列は全部stringsファイルで管理した方がやりやすいだろう。
そうすれば、Storyboardの変更に強くなる。

あとはもう一歩進めて、Excelか何かでオブジェクトIDと文字列の管理表を作り、マクロでstringsファイルを自動生成する、というのができると、Androidみたいな文言リソース管理ができそうだ。
これがオブジェクトIDじゃなくて、リソースIDとして別扱いにできればいいんだけどなぁ。

2014/05/14

[ios]設定画面を作るだけ、でも私には難しい(現在進行形)

iOS版の威嚇アプリに花を添えよう(訳:iTunes connectにRejectされたので機能を追加したい)と思い、とりあえず設定画面を作ることにした。

Androidだと、なんとかPreferenceActivity、みたいなので作ることができたと思うんだが、iOSはどうやるんだろう?

 

あまり明確な基準はないようだが、

  • TableViewControllerを使う
  • Dynamicな設定にする

みたいな感じらしい。
ほほぅ。

んで、Staticな設定もあり、それを使うとStoryboardでぺたぺた貼っていけばよいようだ。
ロケールの使い分けなんかもあるので、そっちの方が楽なのかな?
Xcodeの言語切替のやり方は、Qtのに似てる気がする(どっちが先かは知らんが)。

2014/05/12

[rpi]gettyはtty1

gettyの設定をtty1にすることで、ログインプロンプトが表示された。

/etc/inittabを直接書き換えたのだが、それで良いみたい。

# Put a getty on the serial port
tty1::respawn:/sbin/getty -L  tty1 115200 vt100 # GENERIC_SERIAL

2014/05/11

[rpi]buildrootをビルドしてみよう

buildrootをRaspberry-Pi用にビルドしてみよう。
あんまりよくわかってないけど、kernelとbuildrootがあれば、起動するLinux一式は整うんだと思う。
ここら辺を参考にしよう。
http://blog.kmckk.com/archives/4131505.html#more

 

まず、menuconfigで設定する。

  • Target options
    • Target Architecture : ARM(little endian)
    • Target Architecture Variant : arm1176jzf-s
  • Build options
    • Number of jobs to run simultaneously : 4(にしたけど、0はautoなのでそのままでよいかも)
  • Toolchain
    • Toolchain type : External toolchain
    • Toolchain : custom toolchain
    • Toolchain path : ~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64
    • Toolchain prefix : arm-linux-gnueabihf
    • External toolchain kernel headers series : 3.2.x
  • Filesystem images
    • [*] ext2/3/4 root filesystem
      • ext4

Toolchainを、Raspberry Piのgithubに入っているコンパイラでやろうとしたんだけど、チェックで引っかかる。

>>> toolchain-external undefined Configuring
External toolchain uses the unsuported OABI

OABIのOは、oldのOらしい。
http://www.oidon.net/linux/arm-eabi-oabi

が、よくわからないので、toolchainはbuildrootに任せることにした。自動でダウンロードするようだ。
makeするとけっこう時間がかかったがビルドできた。

 

output/imagesの中にできているようだ。
rootfs.ext2、rootfs.ext4、rootfs.tarができていた。
「Filesystem images」で設定したのはこれだったのか・・・。じゃあ、tarだけでいいやん。
sudo tar xf rootfs.tar -C /media/sd、みたいな感じで展開。

さあ、これでどうだ!
・・・だめだー。
/dev/ttyS0が開けない、というエラーが出てる。
そういえば、Raspberry Piって、標準出力がHDMIに出てくるんだな。
gettyの設定を無効にするとエラーは出なくなったけど、ログインプロンプトが出ないな。

ありゃ、どうしたらいいんかね?

[linux]ボリュームラベルの変更

覚え書き

vfat系:
mtoolsをインストールして、/etc/mtools.confを書き換え、mlabelコマンドで変更。
mtools.conf変更するよりも、-i使ってデバイス指定した方が楽かも。
コマンド実行してエラーが出たら、それに従うとよい。
~/.mtoolsrcに「mtools_skip_check=1」と書くなど。

e2fs系:
e2labelコマンドでよさそう。

2014/05/10

[ble]iBeaconのRSSIは、基準値に過ぎない

前回の続きにもなるが、iBeaconのadvertisingパケットにはRSSIが載っている。
もちろん、送信側なので「R」じゃないんだけど。
思っていたのは、「RSSIを位置として使うんだったら、詳細な位置情報を計測するしくみを載せてうまいこと送信してやれば、受信側も正確な位置情報がわかるやん」というものだった。
・・・ばかだねー。
iBeaconは、文字通りビーコン動作がメインだ。
ビーコンを出すものがいて、それを受信する方が処理するしくみ。
pingはその逆か。
打って、それに応答があるかどうかを送信する方が処理するしくみ。
(pingを「ぴんぐ」と呼ぶのは少数派か・・・)

電力消費的には、ping方式の方がサービスを受ける側としては少ないはず。
だって、ビーコン方式は定期的に送信して、受信側も受けられるようになっていないと成り立たない。
お店にビーコンがあるなら、電源の確保はしやすいだろうからそれでいいんだろうけどさ。
NFCの挙動が、今まで(FeliCa的?)はサービスを受ける方が受信するしくみだったけど、Androidによってサービスを受ける方が送信するようになった、というものに近いような気がした。
別に、どっちがいい、というわけではなく、状況の変化だろう。
当時の携帯電話は、「携帯電話の電力消費を抑える!」という文化だったと思う。それに合わせてサービスもできていたから、NFCのほうもサービスを提供する方がデータを送信していた(FeliCa Pushが代表的か)。
今は、「スマートホンは電池がすぐに切れるもの」「電力消費が派手でなければスマホにやらせてしまえ」みたいな感じなんだろうと思う。持ってないけど。
オセロがひっくり返ったようなものか。
なので、状況としてはよくなってるように思うのだけど、NFCってあんまりはやってない。
「FeliCa」としては、インフラっぽくなってるので成功かもしれないけど、インフラとして結びついたところしか成功していないような。
NFCをボタンっぽく使うアイデアが最近あったけど、それでもまだ敷居が高いのかな-、と思ってしまう。
というよりも。
iBeaconも含め、近距離という分野が、ユーザになじみにくいのではないか、という心配もある。
WiFiでうごけばいいしー、みたいな。
電子ブックとか購入しても、WiFiだけで終わるから、じゃあそれでいいじゃないか、と。
私のように徒歩通勤で、ご飯も現金で購入したりすると、まあNFCって日常で使わないよね、ということになる。

NFCは技術的に枯れていると思っている。
SecureElementだHCEだといっても、小手先のものという視点だ(あるいは自然の流れというか)。
まあ、そんなことをいえばBTだってWiFiだってとなるけど、NFCは超近距離という使命がある以上、選択肢が少ない。
あるとすれば、通信速度を上げるくらいか。距離を大きくするなら別の技術でいいし。
とかとか。
そういうことを考えた一日であった。
余裕があるって、いいことよね。

[ble]SensorTag iBeaconの復習

iBeaconパケットの復習をしておこう。
といっても、SensorTagでしか試したことがないので、そのパケットだ。

1A : 全長
FF : Manufacturer Specific Data
4C, 00 : Company Identifier Code。これがAppleの企業識別子
02, 15 : おそらく、0x02はこのブロックが2バイトという意味で、0x15はこれ以降が21バイトという意味。
FA, 5F, 55, D9, BC, 63, 40, 2E, A2, 54, 09, 1B, 8F, E8, C9, 91 : iBeacon proximity uuid
00, 01 : major
00, 01 : minor
C5 : Tx Power

image

大きく載せなくてもよいのだけど、RSSIの0xC5は、2の補数で-59。

image

でもこれって、送信側のパケットよね。
RSSIじゃなくて、補正値みたいなものかしら?

ネットで見ていると、1m離れたところで受信すると、このRSSI値になるくらいの送信をしている、みたいな値らしい。
なので、送信ワット数のようなものかね。
この値は、SensorTagの設定で変更できる。

[rpi]ようやくkernelビルド

kernelからビルドしよう、と思い立った。
幸い、ビルドの方法はあちこちのサイトに書いてある。

が、config設定のデフォルトが「動いているRaspberry Piから持ってくる」しか見つけられず、めんどうなのでdefconfigがないか探すことにした。

http://www.raspberrypi.org/forums/viewtopic.php?f=71&t=16668

ミニマムのがあるらしい。
あまり設定を見ずにビルドすることにした。

export CCPREFIX=~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
export KERNEL_SRC=`pwd`
make ARCH=arm CROSS_COMPILE=${CCPREFIX} bcmrpi_defconfig
make ARCH=arm CROSS_COMPILE=${CCPREFIX}
make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules
make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=

昔はKERNEL_SRCなんて設定はなくてもよかったように思うが、時代が変わったのか?
まあ、私がやってたのは2.4.18とかなので、情報が古すぎるんだがね・・・。

これでビルドできたarch/arm/boot/zImageをkernel.imgという名前にする。
あと、ここからbootcode.binとstart.elfを持ってくれば、とりあえずkernelの読み込みまでは動作した。
https://github.com/raspberrypi/firmware/tree/master/boot

まだinitがないので、最後はkernel panicで終わるけどね。

2014/05/05

[ios]Storyboardとソースファイルの結びつき

以前リリースした(そしてRejectされた)iOSアプリを、そろそろなんとかしたい。
機能を増やすというのも難しいが、とりあえず設定画面を追加して、画像を変更できたりすれば言い逃れできないだろうか(弱気)。
できなかったとしても、なにかしら設定できるようにしておかないと、増やせるものも増えないだろう。

そう思って、StoryboardにNavigation Controllerを追加してみた。
既存のViewに引っ付けるようなイメージでいたんだけど、2つのViewControllerがSegueでつながったものがドロップされた。
んー、なんか思ったのと違うみたいだ。


XcodeでプロジェクトをSingleViewで作ると、ViewControllerが1つと、そのソースが1対入ったものができあがる。
そこにNavigationControllerを追加し、最初からあったViewControllerをStoryboardから削除すると、それでもソースファイルのViewControllerは残っている。
じゃあ、とviewDidLoadとかにブレークポイントを設定したまま起動しても、止まらない。
うーむ。



http://selection9.blogspot.jp/2012/06/ios-storyboardnavigation-controller.html
こちらを見ると、Storyboardの"Custom Class"で設定するようだ。
設定したら、ブレークポイントに止まった。
ほほぅ。

しかし、ソースコードに現れるわけでもないし、StoryboardがiPadとiPhoneで分けてる場合はどうなるんだろうとか、わかりやすいという感じはしないな。
実は見る方法があるのかもしれんが、わからんなぁ。

[ios]iBeaconのAppleが0x004cなのは、Bluetoothの企業識別子

iBeaconのパケットを見ていて、なんでAppleが0x004cなんだろう?と疑問に思った。
検索すると、出てきた。

https://www.bluetooth.org/ja-jp/specification/assigned-numbers/company-identifiers


もう1つ謎なのが、02 15。
advertisement indicatorらしいんだけど、別のサイトでは、0x02がデータタイプで、0x15は残りデータ長、と書いてある。
うーん・・・?

http://stackoverflow.com/questions/22144098/understanding-ibeacon-data-the-power-field-and-other-bytes

http://makezine.com/2014/01/03/reverse-engineering-the-estimote/

[ios]iBeaconはロック画面を突き抜けてきた!

iBeaconの通知センターは、ロック状態だったら画面に出てこないんだ!と思い込んでいたのだが、そうではないようだ。

時間が多少かかるのと、距離っぽいのがあるのかな。
ちゃんとLCDが点灯して出てきた。

[ios]SensorTagのiBeaconパケット

BLEのスニファで、SensorTagのiBeaconパケットを取ってみた。
iBeaconというよりも、BLEがまだよくわかっていないので、そこからだ。
Core_V4.1の"Core System Package [Low Energy Controller volume] PartB  LINK LAYER SPECIFICATION"に説明がありそうだ。

image

 

iBeaconは、「俺ここにいるぜ!」のようなビーコンパケットに特定のフォーマットを持たせたものだ、という認識。
サザエのしっぽを、苦いから切り捨てるか、これはつまみによいと思って食べるか、の違いみたいなものか。
通信めいたものはAdvertisingだけで、あとは受信側がそれを解析して、好きなように使うだけなんだろう。

image


image

image

まず、ADV_NON_CONN_INDから。
Core_v4.1のp.2507 2.3.1.3 ADV_NONCONN_IND。
このPDUは、non-connectable undirected advertisingイベントで使うものらしい。
接続せず、特定の相手向けでもない、ということか。

image

Lengthが33で、AdvAが6ということは、AdvDataは27ということになる。
AdvAは、advertiser's public(TxAdd=0) or random(TxAdd=1) device addressが載っているらしい。TxAddは0だから、SensorTag固有の値か、TI固有の値か、そんなのなんだろう。
AdvDataには、advertiser's HostからのAdvertising Dataが載っているとのこと。

Advertising Dataのフォーマットみたいなものが見当たらない。これがいいのか?
https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile


image

ここからは、iBeaconのデータと言うことになる。
http://stackoverflow.com/questions/18906988/what-is-the-ibeacon-bluetooth-profile

1A : データ長。AdvDataが27バイトなので、残り26バイト。

FF : <<Manufacturer Specific Data>> CSS v4.pdf
image

4C, 00 : Company Identifier Code。これがAppleのコードらしい。

02, 15 : iBeacon advertisement indicator

FA, 5F, 55, D9, BC, 63, 40, 2E, A2, 54, 09, 1B, 8F, E8, C9, 91 : iBeacon proximity uuid

00, 01 : major
00, 01 : minor

C5 : Tx Power

2014/05/04

[ios]iBeaconの通知は、ロック状態を突き抜けるほどではない?

後日談あり
http://hiro99ma.blogspot.com/2014/05/iosibeacon_5.html

TIのSensorTagをiBeaconモードで使っていて気付いたのだが、ロック状態で通知センターに表示するようにしていても、確かにロック画面には表示されるのだが突き抜けて表示するってほどではないんだな。

何を言ってるのかわからんかもしれんが・・・。
例えば、時計アプリで目覚ましをかけていると、ロック状態でLCDがオフの状態でも、それを突き破って通知してくるじゃないか(通知センターとは違うんだけど)。
そうじゃないんだな、というだけの話だ。

 

通知センターの動作とは、またちょっと違うと思うのだな。
普段お仕事でやってるアプリなんかは、基本的にロック状態でも突き抜けるようになっている(なっていた)ので、なんかそういう風に作ってあるんだろう。
こういう、小技というか、こういうことをしたいとき、みたいなのをうまく探し出せないんだよなぁ。。。

[ios]SensorTagのiBeaconモードがわかった気がする

TIのSensorTagだが、iBeaconにもなるFWが公開されているのは把握していた。
そして、それを焼いていたのだが、どう使うのかわかっていなかった。
iBeaconアプリがそもそもどういう動きをするのかもわかってなかったので、何かしないと使えんのか、というくらいの認識だったけど、ようやくわかった気がする(弱い・・・)。

 

まず、SensorTagのアプリをAppStoreからダウンロードする。
どうも、"SensorTag"と"Multitool"というものがあるらしいのだが、違いがよくわからない。。。
私はSensorTagを使っていたので、それでFWを焼いた。
以下のサイトを見ると、SensorTag_iBeacon_BeataB_v1_0.bin、を焼くように書いてあるし、私が焼いたときもそうだったんだけど、今のアプリを見るとAとBしかないな。。。
統合されたのかもしれないが、焼いてないからわからない。
http://processors.wiki.ti.com/index.php/SensorTag_with_iBeacon

 

さて、焼いてからSensorTagアプリに接続すると、ボタンとか温度とかの設定のある画面の下の方に、iBeacon Configurationというものが出てくる。
出てくるのか、出てきたのかはよくわからない。。。
デフォルト値は、こうなっているようだ。

  • iBeacon Major : 0x0001
  • iBeacon Minor : 0x0001
  • iBeacon TX Power : -59
  • iBeacon Interval 16390

 よくわからんが、このままにしておこう。

 

ここでもう1つアプリをインストールしておこう。
"iBeacon Loc"というアプリだ。
これが、SensorTagのiBeaconアプリというかになるみたいだ。
起動すると、部屋割りっぽい画面が出てくる。
ここで、SensorTagの横ボタンを長押し! 2秒らしい。
そうすると、画面にSensorTagが出てくるんじゃないかと思う。
赤い輪っかが点滅していないだろうか。

輪っかは3重になっていて、Far、Near、Immidiate、の意味らしい。
これは、iBeaconの「距離」だったと思う。


さて、このSensorTagがどう動いているのかというのが、よくわかっていない。
横ボタンを短押しするとデフォルトモードで、2秒押しでiBeaconモード。
SensorTagにはD1とD2のLEDがあるけど、D1が点滅するときがデフォルトモードで、D2が点滅するときがiBeaconモードのような気がする。

そして、iBeacon Locをインストールしておけば、アプリ起動していなくてもSensorTagがiBeaconモードになると通知センターに表示されるようだ。
話には聞いていたけど「本当なんだー」というのが、正直な感想だ。
ほら、iOSアプリって起動していないと何もしない、というイメージがあるではないか。