T

Birthday Boy


ほしいものリストはあるけど、砂を送ってはいけないよ。

フリーランス生活2周年記念

2010年9月からフリーランスになったので、今月でちょうど2周年になりました。今日まで無事やってこれたのも、皆様からの暖かいご支援あってのことです。どうもありがとうございました。これからもどうぞよろしくお願い申し上げます。

3年目を迎えるにあたり、これまでのソフトウェア開発一辺倒から少し距離を置いて、新しいことを始めました。まず、いつも何かとお世話になっているフォーワンファースト様の方で「Titaniumで始めるスマートフォンアプリ開発講座」を開講して頂き、不定期にセミナーを実施するようになりました。それから、この9月からはバンタンドットライブアカデミーでスマートフォン向けアプリ開発者を目指す方々のためにTitanium Mobileを使ったアプリ制作の講義を毎週担当することになりました。詳しいことは発表されてからお伝えしますが、今からとても楽しみにしています。

ご存知の方もいると思いますが、Titanium Mobileを使うようになってから、受託案件であれこれと苦労したことを共有したくて、コミュニティのサポートサイトなどでこれまで積極的に回答など書き込んできました。まさかその延長で仕事をしようなどとは考えたこともなかったのですが、ああいった活動は、きれいごとを抜きにしても、意外なほど他人のためというよりむしろ自分のためになります。最初は単なる親切心と苦労話の共有がしたかっただけなのですが、やってみるとその意義には思った以上のものがあるようなのです。仕事としては正直なところ全然ペイしないというか、たとえ3時間程度のセミナーでも準備を含めれば相当な時間も使う上に体力も必要なので、その間に案件でもこなしていた方がよっぽど儲かります。でも、モジュールやコードサンプルを作って公開したり、ドキュメントを翻訳したりするのも全く同じだと思うのですが、まず初心者を手助けすることでユーザ数が増えれば、その分だけプラットフォームの世間的な認知度が上がるので、先行者受益があります(セミナーの依頼が来たりとか)。それから、実際に案件などで経験できることは限られている一方で、あるプラットフォームについての知見は関連するコードを書いた量と踏んだ地雷に数に伴って増えていくので、質問に答えるためにコードを書いたり内部の実装を調査していくことによりさらにいろいろなことに詳しくなり、自分の案件で同じ問題に躓かなくなるのでかなりお得です。もちろん、感謝されると自尊心がみたされるので、特に自己評価が低くなりがちな人にはおすすめです。

また、セミナーにご来場の皆さんがとても真剣にアプリ制作について学ぼうとされている姿はとても刺激になります。そこで質問されてきちんと回答できなかったことがあったりするとひどく恐縮してしまいます。見知らぬ人たちの考え方やニーズを聞くのは面白いことなので、ソフトウェア開発の経験をだいぶ積んできたと思っている方はぜひやってみるといいと思います。

そんなわけで、高層マンションでシャルドネ片手に偉そうなメルマガを美人秘書に口述筆記させて暮らすような段階には至っておりませんが、自転車操業ながらここまでやってこられたのも皆様のおかげであるとあらためて感謝しつつ、3年目も何卒よろしくお願いいたします。サポートサイトやQAサイト、Twitterでの質問への回答といった活動もこれまで通り続けていきます。

zsh、rvm、vim

zshを使ってみて、vimでファイルの編集中に「:!ruby %」で実行したらrvmがちゃんと動いていなかったので調べたら、vimは.zshrcを読まなくて、かわりに.zshenvを読み込んでいた。ln -s ~/.zshrc ~/.zshenvする必要がある(.zshenvを置いてない人は)。

参考はこちら:rails.vim, rvm, ZSH, and a curious (infuriating) bug

光のことを教えておじいさん

2枚の向かい合った鏡があるとします。その間を光がピュンピュンと反射し合っています。鏡は平行すぎるくらい平行で、その表面は平すぎるくらい平たいとします。

このとき、光が鏡の間を行ったり来たりする時間は、一定ですよね?光で時計が作れるかもしれません。

で、教えてほしいのは、じゃあこの鏡が実は電車に乗っていて、動いている場合。

このとき、光が2枚の鏡の間を行ったり来たりするのにかかる時間は、長くなるのでしょうか。それとも、変わらないのでしょうか。

もし長くなる場合、この電車に乗ってる人にとっては、光の速度が遅くなってしまいます。だって、その人にとっては、動いていない鏡を見ているのと同じはずだから。

もし長くならない場合、この電車に乗っている人にとっては、光の速度が速くなったことになってしまいます。だって、実際には光は止まっているときより長い距離を移動しているはずだから。

あれ?どういうこと?誰か教えて。

Current situation in Japan

Real ninja wears white mask.

human scum

石原慎太郎の失言を報じるツィート

副長官番A)節電の要請に訪れた蓮舫・節電啓発担当相と会談した石原都知事。会談後に「震災への日本国民の対応をどう評価するか」と質問したところ、石原さんは「日本人のアイデンティティーは我欲。この津波をうまく利用して我欲を1回洗い落とす必要がある。やっぱり天罰だと思う」と述べました

この発言で思い出されるのが、死んだキリスト教右翼ジェリー・ファルェルだ。天災をおのれの政治信条に利用しようとするとは見下げ果てたクズである。

東京で暮らしていると、ひとつだけいいことがある。こいつや、こいつが支持する人間には、絶対に投票しないで、落選させてやるチャンスがある。

決戦!Titanium 対 PhoneGap

結論:文句あったらプラグイン書けばまあたいていどっちでもなんとかなるYO!

以上。

PhoneGapで起動画面(Android)

PhoneGapで作成したアプリの起動画面の設定は以下の通り。ここでは画像をドーンと表示する例。まずメインとなるJavaのonCreateにsetIntegerPropertyを追加する。

public class movie extends DroidGap{
  super.onCreate(savedInstanceState);
  super.setIntegerProperty("splashscreen", R.drawable.splashscreen); //←ココ
  super.loadUrl("file:///android_asset/www/index.html");

それから、対応する画像をres/drawable/splashscreen.pngとして用意する。おしまい。

PhoneGap雑感

PhoneGapでAndroid向けアプリを制作してみての雑感。

よいところ

・学ぶのが簡単

基本的に設定が終わったらあとはHTMLとJavaScriptを書くだけ。デザイン的なこともHTMLで記述している分には慣れている人にはほとんど問題ない。

サードパーティーのツールも豊富

Sencha touchやjQtouchといったJavaScriptライブラリもあってUIの作成は簡単。他にも各プラットフォーム向けのプラグインがたくさん公開されている。

・仕組みが単純

DroidGapクラスをextendsするクラスを用意するだけで済むので、onCreateやいろんなところでちょっとしたフックを挿入したいと思ったらTitaniumより楽に動作させられる。Titaniumの場合、プロキシの仕組みを追いかけてどこで何をやっているのかちゃんと把握していないと変なところで動かなくなってしまう。それから、単純な分だけapkファイルのサイズも小さいのもいい。

困ったところ:

・ハマると大変

HTMLとJavaScriptで書けばいい、とはいうものの、例えばjQtouchやSencha touchを使う場合はHTMLの書き出しまでJavaScriptのライブラリ任せになるので、細かい調整はいろいろと難しくなる。ドキュメントも豊富とはいえないので、ソースを追いかけ始めると大変。

・onResumeやonPauseでうまく動かすのが難しい

他のアプリやActivityを起動して元の画面に戻ると、初回起動と同じシーケンスが走る。つまり、ウェブブラウザをリロードして最初の画面に戻ってしまう状態になる。つまり、Ajaxをバリバリ使ってウェブアプリを作成しているのときに外部サイトにリンクしてそこから戻るボタンを押したのと同じような問題が起きる。ステートレスなウェブの考え方をステートフルなアプリの世界に持ち込むことの弊害とでもいおうか。これエミュレータだけの現象みたい。

・遅い、遅い、遅い

WebViewはメモリも食うし、とにかく動作が遅い。エミュレータだと不安になるくらい重い。起動から動き出すまでにかなり時間がかかる。

PhoneGap (Android)でローテーションの固定

Titaniumでも同じような手が使えたので試してみたら大丈夫だった。

AndroidManifest.xmlで各Activityのところを(portraitで固定したいなら)こんな風に記述する。

android:configChanges="keyboardHidden"←ココ
android:screenOrientation="portrait"

keyboardHiddenからあとの部分を消す。