厚意を上手に受け取る


<div class="p1">どうしてこの人は、こんなに自分によくしてくれるのだろうか、と思うことが、ときどきある。その厚意は嬉しいけれども、自分よりも他に、もっとそれを受け取るのにふさわしい人がいるのではないか、と。</div><div class="p2">
</div><div class="p1">そういうとき自分は「いえいえ、それは是非○○さんに」と辞退しがちだ。でもこれは、厚意をくれた人のことを考えているわけでもなければ、○○さんのことを考えているわけでもなく、自分のことしか考えていないヒドイ行いだと気づいた。人に譲って、辞退して、いいことをした気になっているだけ。</div><div class="p2">
</div><div class="p1">厚意を差し向けてくれた人は、タイミングとか、いろいろ事情がある中で、その時点では僕がその厚意を受け取るに最も相応しい人だと考えた。ならば、自分は相応しくないからといって辞退するのは単なる逃げで、相手の厚意を無にする行いだ。</div><div class="p2">
</div><div class="p1">ここはひとつ、厚意を真正面から上手に受け取って、相手も自分も喜べるようにしたい。厚意を受け取って、循環させて、さらに大きな厚意が巡り巡ってくるようにしたい。そう思える出来事が今日、あった。感謝。

</div>

applicationDidFinishLaunching: と application:didFinishLaunchingWitnOptions:


<div class="p1">少し古い本を読んでいると、iOS アプリケーションの起動時に UIApplicationDelegate プロトコルの applicationDidFinishLaunching: が呼ばれることになっている。しかし新しい本だと application:didFinishLaunchingWitnOptions: が使われている。</div><div class="p2">
</div><div class="p1">両者は基本的には同じだが、前者が iOS 2.0以降、後者が iOS 3.0以降で使えるメソッドで、いまは後者の利用が強く推奨されている。</div><div class="p1">
</div><div class="p1">Appleのドキュメントにはこう記されている。</div><div class="p2">
</div><blockquote class="tr_bq">applicationDidFinishLaunching:
This method is used in earlier versions of iOS to initialize the application and prepare it to run. In iOS 3.0 and later, you should use theapplication:didFinishLaunchingWithOptions: instead.</blockquote>
<blockquote class="tr_bq">application:didFinishLaunchingWithOptions:
Note: It is highly recommended that you use this method to initialize your application and not the applicationDidFinishLaunching: method.</blockquote><div class="p7">
</div><div class="p1">application:didFinishLaunchingWithOptions: の (NSDictionary*) launchOptions には、アプリケーションの起動理由(the reason the application was launched)が入っている。起動理由というのは、他のアプリケーションから openURL: で起動されたときの NSURL や、起動元のアプリケーションの bundle ID だ。なぜこのアプリケーションが起動に至ったのかがわかる。</div><div class="p2">
</div><blockquote class="tr_bq">Launch Options Keys
Keys used to access values in the launch options dictionary passed to the application:didFinishLaunchingWithOptions: method of the application delegate.
NSString *const UIApplicationLaunchOptionsURLKey;
NSString *const UIApplicationLaunchOptionsSourceApplicationKey;
NSString *const UIApplicationLaunchOptionsRemoteNotificationKey;
NSString *const UIApplicationLaunchOptionsAnnotationKey;
NSString *const UIApplicationLaunchOptionsLocalNotificationKey;
NSString *const UIApplicationLaunchOptionsLocationKey;
NSString *const UIApplicationLaunchOptionsNewsstandDownloadsKey;</blockquote><div class="p2">
</div>

Titanium Mobile で OSError: No such file or directory: bad path


<div class="p1">Titanum Mobile 1.8.2 でスマホ向けのアプリを試しているが、Titanium Studio から iPhoneシミュレータを起動すると、2回に1回必ずエラーで止まる。</div><div class="p2">
</div><blockquote class="tr_bq">[INFO] One moment, building …
[INFO] Titanium SDK version: 1.8.2 (02/23/12 17:46 59b3a90)
[INFO] iPhone Device family: universal
[INFO] iPhone SDK version: 5.0
[INFO] iPhone simulated device: iphone
[ERROR] Error: Traceback (most recent call last):
  File “/Users/xxx/Library/Application Support/Titanium/mobilesdk/osx/1.8.2/iphone/builder.py”, line 1310, in main
    cleanup_app_logfiles(ti, log_id, iphone_version)
  File “/Users/xxx/Library/Application Support/Titanium/mobilesdk/osx/1.8.2/iphone/builder.py”, line 534, in cleanup_app_logfiles
    os.remove(i)
OSError: [Errno 2] No such file or directory: ‘bad path 79AFC600-0000-0000-0000-006B00000000’</blockquote><div class="p2">
</div><div class="p1">コードが悪いのかといろいろ変えてみたが症状おさまらず。ググってみたら、開発環境のバグらしい。</div><div class="p2">
</div><div class="p3">http://developer.appcelerator.com/question/131296/crash-every-2nd-time-i-launch</div><div class="p2">
</div><div class="p1">上記エラーメッセージ中に出てくる builder.py を変更したら直った。パス中の空白をバックスラッシュでエスケープする。</div><div class="p4">
</div><div class="p1">変更前</div><blockquote class="tr_bq">simulator_dir = os.path.expanduser(‘~/Library/Application Support/iPhone Simulator/%s’ % iphone_version)</blockquote><div class="p6">
</div><div class="p7">変更後</div><blockquote class="tr_bq">simulator_dir = os.path.expanduser(‘~/Library/Application\ Support/iPhone\ Simulator/%s’ % iphone_version)</blockquote><div class="p5">
</div>

Smarty の math 関数


Smarty の math 関数

Smarty の math で、剰余を得る % 演算子を使いたいなと思ってマニュアルを調べると、

<blockquote class="tr_bq">+, -, /, *, abs, ceil, cos, exp, floor, log, log10, max, min, pi, pow, rand, round, sin, sqrt, srans and tan are all valid operators. Check the PHP documentation for further information on these math functions.</blockquote>
としか書かれていない。四則演算はいいけど % はダメなのかと思ったが、実際にコードを書くと問題なく動く。

そこで math 関数の実装を覗いてみた。
http://smarty-php.googlecode.com/svn/trunk/distribution/libs/plugins/function.math.php

許される関数は
<blockquote class="tr_bq">    static $_allowed_funcs = array(
        ‘int’ => true, ‘abs’ => true, ‘ceil’ => true, ‘cos’ => true, ‘exp’ => true, ‘floor’ => true,
        ‘log’ => true, ‘log10’ => true, ‘max’ => true, ‘min’ => true, ‘pi’ => true, ‘pow’ => true,
        ‘rand’ => true, ‘round’ => true, ‘sin’ => true, ‘sqrt’ => true, ‘srand’ => true ,’tan’ => true
    );</blockquote>と決まっている。

まず丸カッコの個数が合っていることを確認する。

<blockquote class="tr_bq">    if (substr_count($equation,”(“) != substr_count($equation,”)”)) {
        trigger_error(“math: unbalanced parenthesis”,E_USER_WARNING);
        return;
    }</blockquote>
次に equation で渡された数式を要素に分ける。16進数または文字列(変数名または関数名)を探して $match に入れる。

<blockquote class="tr_bq">    preg_match_all(“!(?:0x[a-fA-F0-9]+)
([a-zA-Z][a-zA-Z0-9_]*)!”,$equation, $match);</blockquote>
$match[1] には文字列の配列が入っている。正規表現の (?: により16進数はキャプチャされない。文字列が引数として渡された変数名でもなく、$_allowed_funcs で定義された関数名でもなければエラー。

<blockquote class="tr_bq">    foreach($match[1] as $curr_var) {
        if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) {
            trigger_error(“math: function call $curr_var not allowed”,E_USER_WARNING);
            return;
        }
    }</blockquote>
引数として渡された変数が空ではなく、さらに数値であることを確認する。問題なければ $equation 中の変数を変数値で置き換える。

<blockquote class="tr_bq">    foreach($params as $key => $val) {
        if ($key != “equation” && $key != “format” && $key != “assign”) {
            // make sure value is not empty
            if (strlen($val)==0) {
                trigger_error(“math: parameter $key is empty”,E_USER_WARNING);
                return;
            }
            if (!is_numeric($val)) {
                trigger_error(“math: parameter $key: is not numeric”,E_USER_WARNING);
                return;
            }
            $equation = preg_replace(“/\b$key\b/”, “ $params[‘$key’] “, $equation);
        }
    }</blockquote>
最後に eval() で評価する。

<blockquote class="tr_bq">    $smarty_math_result = null;
    eval(“$smarty_math_result = “.$equation.”;”);</blockquote>
ということで、演算子はチェック対象外なので、なんでも通る、ということがわかった。
<div>
</div>

ABC 2012 Spring


<div class="p1">日本アンドロイドの会のイベント ABC 2012 Spring に初参加してきた。いまから本格的にスマホアプリ開発をするにあたって、日本のスマホアプリ開発の現状を肌で感じることができる貴重な機会。他にやること山積だけど、行かないわけにはいかない。</div><div class="p2">
</div><h4> Unityで実践する次世代モバイルゲーム開発ワークフロー</h4><h4> 大前 広樹さん(ユニティ・テクノロジーズ・ジャパン合同会社)</h4><div class="p1">3Dゲームエンジンの Unity は、最近本屋でも関連本がたくさん置かれているので、ちょっと気になっていた。とはいえ自分が 3D ゲームを作ることはないだろうと素通りしてた。しかしこのセッションを聞いて、3Dゲームに限らず、リッチなビジュアルを持つアプリの場合は選択肢に入れたほうがよいことがわかった。</div><div class="p1"></div><ul><li>アセットストア:開発環境上から部品を直接購入できる。たとえば洞窟を作る Cave Creator は $40。ゲームの一部に洞窟のシーンがあるけれども、大事なシーンではないからそんなにコストをかけたくない、という場合に最適。そんな脇役シーンでも、クリエータに発注すれば20万とか、かかってしまう。それが$40で買えるというのはすてき。他にも、雨を降らしたいとか、石、土など、どうでもいいものから凝ったものまで、2000以上の部品が購入できる。</li><li>日本での普及度:昨年から全世界中で日本の売上が2位。すでに300社以上が導入。国内ユーザは8000超。すでに1万を超えているのではないか。</li><li>個人やスタートアップは無償。これで売り物を作ってかまわない。ただし Android/iOS アプリを作る機能は別売りで各3~4万円といっていたような気がする。しかし! 4/8 まで無料で「売っている」。</li><li>Pro版は13万円くらいする。ネイティブコードやプロファイラが使える。</li><li>Android でまともに動くのは 2.2 以降。それ以降ならどの端末でも問題なく動くかというと、残念ながらそんなことはない。日本法人では、日本固有のデバイスで動きのおかしいものを見つけると本社に送っている。</li><li>グラフィックリッチでUXに凝りたいアプリに向いている。Flashデベロッパーなどは、プログラムだけでなくアニメーションして見せることに長けている人が多い。そういう開発者との相性がいい。</li></ul>
<h4> Scaling Titanium Mobile
おぐら じゅんやさん(合同会社キュニップ 代表)</h4><div class="p1">1月に友人と qnyp という会社を立ち上げたという、おぐらじゅんやさんの講演。なんと、Titanium Mobile だけで受託開発している。いままでの案件5件すべて Titanium Mobile。Ti で受託開発は危険じゃないかと考えていたが、できるのか。すごいすごい。さらに CoffeeScript も、その 5件すべてで採用しているという。そうか、JavaScript で開発するんだから、CoffeeScript も使えちゃうよね。当たり前かもしれないけど、実績があるというのは重要。</div><div class="p2">
</div><div class="p1">今後の開発の参考になるなと思ったのは、カスタムイベントの積極活用。JavaScript でイベントというと、click が定番。しかしアプリ固有のイベントもばんばん作ってしまおうという話。関数呼び出しでなくイベント経由の呼び出しにすると、エラー処理が分散しないのがいい(とおっしゃっていたが、まだよく理解できていない)。それと、アプリケーションにイベントハンドラを定義して、アプリケーショングローバルなイベントを処理するように作れるのだけれど、アプリケーションレベルのイベントハンドラ中で重いオブジェクトを作ると、自動的に解放されないので注意が必要(Androidだけという話だったかもしれない)。必要なくなったら明示的に removeEventHandler すること。

</div><h4> Androidとmbedのあれこれ
勝 純一さん(Android mbed部)</h4><div class="p1">クラウドでプログラミングできる、というと意味不明だが、開発環境がウェブブラウザ。ブラウザ上に IDE が実現されている。コンパイルするとバイナリがダウンロードできるので、それを mbed にインストールする。インストールも簡単で、mbed はなんと、USBメモリとして動作するようになっている。PCにつないで、USBメモリとして認識される mbed に、ダウンロードしたバイナリファイルをコピーすればインストール完了。

</div><h4> ADB(Android Debug Bridge) そのしくみから応用まで
小林哲之さん(京都マイクロコンピュータ株式会社)</h4><div class="p2">すごい大盛況の会場。日々お世話になっているけれども、どうやって動いているか実はよくわかっていない ADB に、みんな興味しんしんなのだと思う。</div><div class="p2">
</div><div class="p1">ADB は、ADBクライアント、ADBサーバ、ADBデーモンの3コンポーネントからなっている。ADBクライアントはADBコマンドやDDMS。ADBクライアントを立ち上げたホスト上でADBサーバが動いていて、ADBサーバがターゲットデバイス上のADBデーモンと通信する。</div><div class="p2">
</div><div class="p1">ADBサーバの主な役割は通信経路の確保。ターゲットとUSBでつながっていようが、TCP/IPでつながっていようが関係なく、ADBクライアントに同じインタフェースを提供する。</div><div class="p2">
</div><div class="p1">Android 4.0からは、ターゲット上で ADB コマンドが使えるようになった。何がうれしいのかよくわからないものの、Android端末で立ち上げたADBから、別のAndroid端末を操作できる。

</div><h4> ADKを作ってわかったオープンソースハードウェアの可能性
久川真吾さん(株式会社鳥人間)</h4><div class="p1">ADK の回路図は一見複雑に見えるけど、部品をどんどん削っていくと、ほら、こんなにシンプル、というお話。その回路を自分で実装したのだけれど、なんと表面実装部品。基板のパターンを描いて中国に発注。その上にチップ部品などを置いて、たしか、フライパンで半田付けしたとか、おっしゃっていただろうか???</div><div class="p2">
</div><div class="p1">これを手でやるのは数が稼げないので、オープンソースハードをつくる場合に無償で使える FabLab という施設で量産し、ひとつ3000円弱で販売している。FabLab では、1台300万のレーザーカッターでプラスチック上に部品トレイを作成し、そのトレイの上に表面実装部品をセットして、同じく1台300万の表面実装器で基板に部品を載せる。それを1台100万のリフロー炉で過熱すると半田付け完了。</div><div class="p2">
</div><div class="p1">数十台ずつ量産し、無くなったらまた FabLab に出かけて作る。なるほど。このお話を伺うと、自分にもできる気がしてくる。もちろん知識ゼロの僕には簡単なことではないだろうけど、不可能ではない。

</div><h4> エクストリームフラグメントUIプログラミング
あんざいゆきさん(株式会社ウフィカ 代表取締役)</h4><div class="p2">かなり広い部屋なのに、超満員の会場。あんざいゆきさんが人気があるのか、みんなフラグメントに関心があるのか。あんざいさん、説明が上手。技術系セミナーの発表者によくある、すごいだろう、というのが無く、どうしたら理解してもらえるかに心を砕いている。</div><div class="p2">
</div><div class="p1">フラグメントを AJAX にたとえていたことに、一番関心した。昔のウェブは全画面書き換え。これはActivityに対応する。フラグメントを使うと、AJAXのように画面の一部だけを入れ替えることができる。一部だけだから、表示も速い。わずか200-300msではあるけど、十分に体感できる速度差。</div><div class="p1">
</div>