T

サイト内メッセージのよくあるトラブル

コミュニティ系のウェブサイトを運営している人は似たような経験があるかもしれませんが、ウェブサービス内部で送信されるメッセージは肝心の送信先のユーザーに閲覧されないこともあり得るから、サイトの性格によっては急ぎの連絡としては全く信用ならないと知っておいた方がいいと思います。

今日、夕方からとあるイベントに顔を出す予定でした。そろそろ時間なので会場の情報をもう一度調べようとアクセスすると、あれ?マイページに参加予定のイベントとしてこれが登録されていない…

実は事前にこんなことがありました。イベントの参加登録の際に、申し込み画面で懇談会に参加する/しないを選択できるようになっていたのですが、ぼくが間違えて両方に参加するとしてしまっていたため、一人で二人分登録している状態になっていたのです。主催者の方がそれに気づいて、このサイトにログインすると閲覧できるメッセージ機能で6/6に連絡してくれていました。

peatix3

ほんと、すいませんでした。

というわけで、ぼくは安心して当日を迎えたわけですが、なんとその後にまたメッセージが入っていたのです。

peatix4

知らんがなーっ!ちなみに時間の表記はUTCなので、日本時間は+9時間です。6/20の8時って、ようするに今日の17時台ってことです。。。

最後、完全に負け惜しみのクレームまで書いてますが、いやあ、こういうのってサイト運営とかイベント運営とかしてると、結構やってしまいがちですよね。気をつけよう。まあ、その、どう見ても「情弱 vs. 情弱」のデスマッチって感じですね。

というわけで、今日の夕方はまるっと空いてしまいました。一人で部屋で盆踊りの練習でもしたいと思います。


update: 2013/06/21
もうどうなるものでもないのですが、この後少しやり取りがあって、以下の捨て台詞を残して全て諦めました。

To: イベント主催者
そうですか。こちらも特に悪意があってのことだとは思っていませんし、そもそも復旧出来ない状態となっていることなので、これ以上詮索するつもりもございません。

とはいえ、もしぼくが逆の立場だったら、つまり今回のように愚かにも二重登録してしまった間抜けなユーザーの後処理をしようとして、うっかり自分の方がドジを踏んでそのユーザーの登録を全てキャンセルしてしまったなどという場合には、そして復旧には相手側のアクションが必要ですぐに連絡したにも関わらず二週間もずっと音沙汰がないときは、きっとメールが届いていないとか、ここに登録したメールアドレスが使用頻度が低いやつだったとか、仕事柄通信事情が悪い場所に張り付くことが多いだとか、口に出せない悲しい理由があるだとか、とにかく何らかの事情があるんじゃないかと想像します。そんなとき、こちとら暇じゃねえんだクソ食らえと放置するのもひとつの手ではありますが、上記したような不手際を自分の方が為出来したときには、せめて、例えばこのメッセージの名前の欄をクリックしてFacebookページのリンクを見つけて、連絡の一つもしてみようかなと考えることもあり得ると思います。そのような単純な工夫が見られなかった点だけが、大変残念でございました。もっとも、これはぼくが年季の入ったウェブアプリケーション開発者として、一般の方々と比べて恐ろしくリテラシーが高いが故にそう考えるだけなのかもしれませんので、あくまで特殊なバイアスのかかったひとつの参考意見として聞き流して頂ければ結構でございます。

ぼくは東洋人らしく物事の縁というのもある程度は重要なものと考えていますので、せっかくお誘い頂いて恐縮ですが、グループへの参加についてはまた今度検討させてください。では。

「LINEで送る」をTitaniumで

ということで調べてみると、マニュアルが見つかりました。カスタムURLスキームが用意されていて、LINEではAndroidはローカルに保存した画像のパスを、iOSではClipboardに貼付けてClipboardの名前を渡すことで実現できるそうです。なんだ簡単、と思ったら、TitaniumではiOSのClipboardの名前が取得できないんですね。

そういえば誰かがモジュール作ってたなあ、と思って調べると、確かにありました。「TiCustomPasteboard」ですね。終了〜。と思ったら、テキストしか扱えないとのことなので、画像を扱えるようにしておきました

これで、たぶんiOSなら動くはず。

var Pb = require('jp.hsj.ticustompasteboard');
var pb = 'org.selfkleptomaniac.myapp.pb';
Pb.createPasteboard(pb);
Pb.setImage(pb, imageBlob);

var message = "言いたい事は山ほどある";
var mime = 'image/png'; //画像に合わせてね
Ti.Platform.openURL('line://' + message + '/ ' + mime + '/' + pb);

終了〜

ところが。これでおしまいと思ったら、donayamaさん曰く

ただ、名前が名前のモジュールなのでString以外の要素(Colorとか諸々)のやりとりを行えるように、いつかはしないとダメでしょうね…(^^;

とのことなので、色も扱えるようにしないといけないみたいですね。機会があったらまた今度。残念。

ニート兄弟はニートのエリート

身近ではあるが近所ではない、某所に暮らすとある兄弟の話だ。まとめる気にもなれないから、つらつらと書いておく。

===========================================================
・エピソード1

兄か弟か忘れた。就職して最初の研修(合宿)に、ママからもらったクマさんのぬいぐるみを持参。これから同僚となる女子社員に「なにこれ〜、おかしいよ〜」と笑われたのでキレて泣き叫んで無断帰宅、そのまま辞職。

・エピソード2

弟30歳。毎年、ママのお友達に年賀状を送る。手描きのガンダムのイラスト入りで。

・エピソード3

ニート兄弟で喧嘩して刃傷沙汰に。お兄ちゃんもそろそろ大きくなったし独立しましょ、とママが駅前のアパート6万5千円を借りてくれる。生活費は毎月30万支給。兄、当然働かず。でもパパのお金とママのブックオフのバイトではまかないきれず、泣く泣く20万に減額するママを罵倒、暴行。無職は続行。

・エピソード4

弟だったかな。ママのお友達とカラオケ。ニートがひたすらアニソンを歌うのをみんなに聴かせる。

・エピソード5

兄だったかな。殊勝にも求人に応募するも、慢性的な人手不足で有名な介護の現場で、7度も面接で落とされる。

・エピソード6

ネット、新聞もママが用意してくれた上に、求人広告もママが近所の家を巡って集めてきてくれる。自分の足で職安に行くことはない。

・エピソード7

パパとママは外国語教育で有名な某私大のテニスサークルで出会った。パパは某有名大学の教授。

・エピソード8

兄、20歳の頃に40歳の「彼女」を連れて登場。両親は認めず、しばらくして別れる。残念、もう先の見えてきたママの跡継ぎを見つけてきたかもしれないのにね。
===========================================================

あちこちで語られるいわゆる「ニート」、実際のところは千差万別、いろいろな人がいるのだろうが、この兄弟のような、いわゆる真の腐った人間、エリートのニートも、ごく稀な例ではあるだろうが、確かに実在している。やることもなく一日中ネット三昧で、学もないし社会で手にした功績もないが、ただひたすら大上段に構えて、画面の向こうの「真実」の威光に光り輝きながら、今日もキーボードで威張っている。

最近の仕事と勉強について

先月は仕事に関係ない勉強としてTiTwilioを作ってみました。Titaniumのアプリに数行でIP通話機能を追加することができるようになりました。今月は、今のところAndroidのHolo themeをTitaniumで作ったアプリでカスタマイズする方法と、Node.ACSAppcelerator Cloud Service連携させる方法、それらを組み合わせてNode.ACS上にチャットサーバを立ててTwilioの通話アプリと共存させる方法を勉強しています。ちょっとしたLINEを作るみたいな感じですね。これまで縁がなくてその手のやつを実装したことはなかったので、ちょっとやってみます。それから、Elixirの本を買ったので通読してみようと思います。これも、簡単なウェブサーバとか実装してみると理解が深まりそうな気がしています。

こういうの、「40の手習い」っていうんでしたっけ?

どんだけ暇なんだ、という感じですが、仕事もしていないわけではありません。先日まではデジタルコンテンツの販売と管理の仕組みを実装していました。現在はとあるアプリの制作を進めています。先週はイベントなどであちこち出かけたので、今週からはじっくり腰を落ち着けてプロトタイプを作成中です。それから、今月は各所で講師やトレーニングの仕事が平均すると週に二度ほど入っています。月末までにはまた別のアプリの案件が何件か予定されています。つまり、普通の人と同じくらいか、少し足りない程度には働いています。朝は遅いですが、子供をお風呂に入れたり雨の日には幼稚園の送迎をしたりしながら、自分のペースで毎日それなりの時間ずっと仕事をしています。

「うん、それで?何が言いたいの?」って思いました?

実は、さっきからこんな見せびらかしみたいなことを書いている最中も、誰だってこんなのを読んでも面白いとは思わないだろうって自覚していました。なんていったら、じゃあなんでそんなもん書いてんだボケ、と思われましたよね?実際にはもっと高尚な事をお考えかもしれませんが、話の都合上、そういうことにしておいてください。

実はこれ、IT系の職場にプログラマとして就職していたり、これから就職しようというのに全然勉強しない人たちをdisるために書いているんです。時間がないとか、何をしていいかわからないとか、まあいろんな理由があると思いますが、全部まとめてdisりまくりたいんです。

勉強しなきゃいけない、その理由は別に説明しなくたってわかりますよね?きわめて少数の例外や大金持ちを除けば、いつまでも「えー、ループとかってちょっと苦手なんですよね」とかいってられないくらいのことは理解して頂けるでしょうし、いま扱っている技術は2年もしないうちにたいてい陳腐化して、まるでアイドルのように需要がなくなっていくとわかっているので、逆に今更どんな技術を身につけていいのかわからない、なんて小話みたいなことを考えている初学者だって珍しくはありません。コの世界がそれだけ追い立てられ続ける性質のものであることは、そんなに異論はないのではないかと思います。あ、もちろん技術は常に新しいネタが湧いて来るんじゃなくて、結構高い割合で温故知新なネタが吹き荒れる世界であることはわかっているつもりですよ。全ての新しい言語はLispの再実装か盗用ですからね、はい。

話が逸れました。

そう、で、勉強しない人たちが憎いんです。disりたくてたまらないんです。もちろん、「だってお前は自宅で働くフリーター(子持ちローン有り)だろ?時間の都合なんかいくらでもつくじゃないか」と反論される方もいらっしゃるかもしれません。はい、おっしゃる通りです。でも、そうでない勤め人時代だって、それはそれは本当にクソ忙しい職場でしたが、ちゃんとそれなりに時間を作っていました。例えば、今日は22時に上がりだ、早いなあ、なんて日にはいつもの時間である23時半になるまで喫茶店で本を読むか仕事と関係ないコードを書いていました。新しい言語を覚えるために、今日から職場で作る書き捨てのスクリプトは全部○○で書く、とか決めて勝手に修行したり、会社の倉庫に積まれたボロいマシンを引っ張り出して実験環境を作ったり、いろいろ涙ぐましいことをしていましたね。先日ようやくバッテリーの膨張にともなう故障で廃棄処分にしましたが、鞄にいつもUSキーボードに換装したhp miniを入れて、あわよくば帰りの電車でもプログラムが書けるように備えていたのもいい思い出です。これ、地元の駅で夜中にときどきhp miniにUbuntuを入れてずっとターミナルでコード書いてる人を見かけていたので真似をしたんですが、話しかけたこともないけど、彼は今頃元気にやってるんでしょうかね。

もちろん、会社がそういう活動を支援してくれる制度を用意してくれるととても素晴らしいのですが、どこもそんなに理解のある会社ばかりではないでしょうから、合法的に利用できる手段を考えるしかない場合もあります。例えば、夜中にwebinarがあるけど翌朝遅刻しちゃう、なんてときは、どうせ上司を説得しても無駄だから、ぼくは正々堂々と仮病で有給を半日使っていました。ちなみに毎晩遅くまで仕事してもフレックス制なんかなかった(やるやる詐欺で導入はされなかった)ので、体調維持のため遅刻したいときは全て有給でまかなっていましたから、退職時の有休消化率はほぼ100%、ほとんど残っていませんでした。まあ、子供の頃からプログラムが大好きで理系の大学を出て就職したLisp処理系の実装が趣味の商業非モテ、なんていうタイプじゃないぼくみたいな人間がこの業界でありつける職なんてロクでもないことがほとんどですから、支援なんか期待する方が間違いです。よっぽど甘やかされて育ったのなら知りませんが、職場と学校とは違うんですからね。

あ、もちろん、そういう職場環境を用意している人はそれだけで競争優位になりますから、どうぞ続けてください。大変素晴らしいことだと思います。「いやあ、でも制度とかなんとか用意したって、うちのスタッフは全然そういうの利用しないんだよねえ」とボヤいたり、「優遇して欲しいなら、まずそれなりの数字を出してからにしろってんだよ」と息巻く経営者の方もいらっしゃると思うのですが、そんな方々の言い分は、実は全くもって正しいです。正論です。あまりの正しさに光り輝いているので、もはや裸眼で直視することさえできません。なので、振り向いて、そうですね、もっと広い場所、そうそう、牧場とかに行くといいと思います。そこには馬とか牛とか羊なんかが飼育されているはずですが、飼育係の人に聞いてごらんなさい。誰だって動物を飼い葉桶まで連れて行くことはなんとか出来ますけど、そこから先、実際に食うかどうかはそいつ次第だねって教えてくれると思います。制度を用意しない経営者は、だから飼い葉桶を燃やして捨てる牧場主と同じです。ぞくぞくし過ぎてガッタガタ震えるくらい過激な経営方針ですね。

話が逸れました。

そう、勉強しない人たちが憎いっていう話でした。誤解しないでほしいんですが、別にマッチョ自慢したいわけじゃないんです。「最悪な戦場を生き延びたオレたち」的な自慢話がしたいわけではありません。いや、してもいいんだけど、それが本論じゃないんです。よくいうじゃないですか、モテないモテないっていってる人たちって、例えばモテない異性愛者の男性なら、それは確かにその人が冴えないボンクラで誰にも魅力が伝わらないってこともあるとは思いますが、それだけが原因なんじゃなくて、そもそもたいして女性が好きじゃないからなんだってことらしいんですよ。もし本当に心の底から女性が好きでとにかく優先順位の第1位が女性である人生を送っているなら、非モテだなんだってボサッとしてないで、死力を尽くして女性にモテようとするじゃないですか。ええと、具体的に何をするかはよくわからないんですが、なんかほら、まめまめしくかいがいしく女性に接して、己の小さなエゴは全て捨て去って女性のために行動し、思考し、大好きな女性に不快に思われないような身なりを常に心がけて、大好きな女性を楽しませるためにあらゆるスキルをどん欲に身につけて、大好きな女性のために必要な金銭を稼ぎ出して、みたいな感じですよたぶん。で、本当に女性が好きなら、そこまでやって当たり前だろ、っていわれたとき、非モテの人って反論できるんですかね?ぼくは、難しいと思います。いや、人間としてどうかと思うとか、そういうことは言い返せるかもしれません。でも、モテないのはお前のせいだ、っていう反論には全く太刀打ち出来ません。したくもないけど。

で。それでも、disりたいのは、実はこのモテ話と同じで、正確には「努力もしないで文句ばっか垂れて技術を向上させないプログラマ」っていう意味での「勉強しない人たち」なんです。どうしてIT系にはブラック企業がいっぱいなの?って聞かれたら、大きな声で、それはお前らのせいだよって言い返したいからなんです。ぼくだってたいしたプログラマじゃないしときどき自分でも頭悪いなあと逆の意味で感心しますが、それだってなんとかもがいてやってるわけじゃないですか。おっさんの手習い、下手の横好きで上等ですよ。なぜなら、ぼくはコの世界が大好きだし、出来ればずっとこういう仕事をしていたい、新しいことを覚えると楽しいし人様に見せびらかしておもしろ可笑しく生きていたい。そんな強い欲求があって、それはモテより金銭よりずっと強く、@otsuneをオフラインにしたら死ぬのと同じくらい重要な生の欲求に直結している事柄だからです。さっきグータラ経営者の悪口を書きましたが、実はそういう人たちの気持ちも理屈もわかります。ロクに学びもしない奴らに何をあてがっても無駄だっていうのは、間違いではないからです。IT系のブラック企業が存在するのは、別に怠惰なプログラマのせいってわけではありませんが、しかしそんなのが存続し続けるのには、飼い葉桶に顔を突っ込んでもエサを食べない自殺願望の家畜のように怠惰な勉強しないプログラマが加担しているってことは間違いないだろうってことです。

え?でも何をベンキョウしたらいいか、わからないですって?ほほう、どうやらわれわれはひとつの結論に近づいたようですね。つまり、いつかぼくが技術書をものして売るときまでに、みなさんはなんでもいいからノイローゼのように勉強しまくって、もう暴走し過ぎて内容なんか無視してひたすら技術書を買い込む(出来れば一人三冊くらい)という性癖を骨の奥まで叩き込んでおいてほしい、ということです。おわり。

TiTwilio

TitaniumでTwilioを簡単に扱うためのモジュール、TiTwilioを公開しましたので、使い方を説明します。Android、iOS共通です。

最初にTwilioのアカウントを作成します。電話番号を取得したら、次にアプリを登録します。自分が用意する認証サーバとTwilioを連携させるために必要なので、必ず登録してください。

tw1

「TwiMLAppを作成する」ボタンから登録することができます。

大事なのは、Request URLのところです。認証が始まってCapability Tokenを取得した端末は、このRequest URLにPOSTリクエストを発行します。このリクエストへのレスポンスでアプリの挙動が決まります。
tw

TiTwilioでは、リダイレクト時にサーバに指定されたパラメータを追加する機能があります。Titaniumで作成したアプリと認証サーバ間との連携に利用します。実際のコードで説明します。

var TiTwilio = require('org.selfkleptomaniac.mod.titwilio');

// call
TiTwilio.connect({
  url: 'http://your-auth-server.example.com', // auth server (required)
  params: {key: value, post: data} // post data (optional)
});

これだけのコードで上の図の一連の動作が実行されます。paramsに指定した値がPOSTリクエストのキーと値としてRequest URLに送信されます。従って、サーバ側ではこのparamsによってアプリ同士の通話や携帯・固定電話への通話、自動返信などの挙動を変えることができます。

githubのレポジトリにはsinatraで動くRubyのサーバ側スクリプトがserverディレクトリにあります。こちらではRequest URLに「/call-to-me」で終わるURLを指定するようになっています。POSTで送信するtypeの値によってアプリ間通信や携帯・固定電話への通話など機能が分離しています。

アプリ間の通信や携帯・固定電話からの通話を受け付けるためには、認証サーバにログインしている必要があります。Androidの場合はPendingIntentに受信時に起動するサービスを登録しておきます。

var TiTwilio = require('org.selfkleptomaniac.mod.titwilio');

var pendingIntent;
if(Ti.Platform.osname === 'android'){
  var intent = Ti.Android.createServiceIntent({url:'service.js', twilio: TiTwilio});
  pendingIntent = Ti.Android.createPendingIntent({intent: intent});
}

// login
TiTwilio.login({
  url: 'http://your-auth-server.example.com', // auth server (required)
  params: {key: value, post: data}, // post data (optional)
  pendingIntent: pendingIntent
});

これで受信の準備が完了します。iOSの場合はincomingCallイベントをTiTwilioオブジェクトに追加するだけで受信することができます。

Androidの場合は、Resources/android/以下にservice.jsを用意します。通話を受信するたびにこのサービスが起動しますので、ダイアログを出したりするなど受信時の動作をアプリケーションレベルのイベントに登録しておいて、それをこちらからfireEventで呼び出します。

try{
  var service = Titanium.Android.currentService;
  var intent = service.intent;

  Ti.App.fireEvent('inComingCall', {intent: intent});
  service.stop();
}catch(e){
  Ti.API.info(e);
}
service.stop();

サービスの詳細についてはこちらをご覧ください。ただし、intervalで登録しても意味がないので、tiapp.xmlは

<services>
  <service url="service.js" />
</services>

のように記述します。また、Androidのパーミッションの設定も忘れないようにしてください。以下2行を追記する必要があります。

  <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

PiLのライブはよかったのですが

Python Image Libraryじゃない方のPiL、Public Image Ltdのライブを観てきました。予報では東京は暴風雨になっているはずでしたが、なんとか持ちこたえました。直前まで北京と上海で公演があったのは報じられていたものの、日本公演はそんなに話題になっておらず心配しましたが、客の入りはそんなに悪くなかったようです。まあ、マイブラみたいに立錐の余地もないというわけにもいきませんが。それと、前回はまだみんな本当にジョン・ライドンが観られるのかと半信半疑な顔で眺めていた部分もあったような気がしたのですが、今回はもっとこなれた感じの反応をする観客が多かったように思われました。そんな人たちが帰り道にみんな口々に今日のライブはよかったと話していたのでほっとしましたよ。いや、ぼくが親心を発揮してほっとしている意味は何もないんですが、前回公演でこれまでのPiLのイメージがガラリと覆ってしまったので、2009年から始まった今のPiLがキース・レヴィン抜きで演奏するようになってから一番だと思う身としては、たくさんの人にこれを受け入れてほしいという気持ちもあるのです。

今日の演奏は2011年8月と比べるとさらにタイトになっているようでした。そりゃこなしたステージの数が違いますからね。変なところで変な音が鳴るみたいなトラブルは全然ありません。しかし、会場の方がちょっと問題で、どうも少し離れたところに居た方が音響がいいらしく、喜び勇んで最前列に行くと、そこではあんまり音が聞こえなくなる(分離が悪くなる)という、困った音響設計になっていました。ひょっとしたらステージ上も音は聞こえにくかったのかもしれません。One Dropのような最近の曲は割とかっちりと構成された演奏をしようとしていたようですが、ギターがズレたまま進行したりしていました。その辺りは、構成とか無視して適当に叫ぶだけ(褒めてます)の曲の方が演奏しやすいみたいでしたし、正直なところThis is PiLからの曲はときどき少しちぐはぐな感じもしました。あと、ジョンは前回よりも喉の調子が悪いというか、手鼻をかんでいたくらいなのでちょっと風邪をひいていたようでした。

が。

大事なことなので一回しか言いませんが、PiLのライブはよかったです。どれくらいよかったかというと、すごくよかったです。

ただ、問題があるとすれば、それを上手に言い表す語彙がぼくにはないってことなんです。2011年の来日公演も観ているわけだし、どんな演奏になるのかはだいたい予想していた通りでした。だから今さら驚きはありません。よかろうと期待して、よかったってことです。今更ティーン時代のアイドルのステージでキャーキャーいうわけでもないし、かといって、アイリッシュのジョン・ライドンが旧宗主国の女王を侮辱してその国民には胎児のセリフを叫び散らすカソリックの道徳を押し付けることの意味を深読みしてセックス・ピストルズを再評価してロッキンオンの誌面に印刷された汚れを増やすユニバーサル小姑を真似たような感想を書き散らしたいわけでもないし、えーと、なんの話してんでしたっけ。とにかく、一度は体験しておいた方がいいと思うよ。

専門学校の卒業式の祝辞

みなさん

今日は卒業式でしたね。おめでとうございます。
あいにく仕事で出席することはできませんでしたが、天気も良く、久しぶりに顔を合わせる人たちも居たでしょうから、きっと楽しい式になったと思います。後期からの短い期間でしたが、とても面白い経験をさせて頂きました。ありがとうございました。人に教えるというのは自分でも学んでみるいい機会であり、ついでにちょっとくらいはお金ももらえるので悪い話ではありません。

さて、これからみなさんが社会人として仕事をするようになると、学校や親が厳しいなんて思っていた過去の自分を蹴りたくなるくらい大変なことがたくさんあると思います。特にIT業界はその点では悪名高い存在です。みなさんの上司やお客様の大半は、みなさんの人間的成長や気高い自尊心、未知の可能性といった素晴らしいであろう面についてはおそらくほとんど何の関心もありません。会社という組織では、失敗は厳しく咎められる一方で、成功は体よく無視されるのはまだマシな方で、油断すると誰かに手柄を横取りされることも珍しくはありません。ほらね、おそらく学校やご家庭では、皆さんはもう少し優しく、失敗にも寛容に扱ってもらえたはずです。

でも心配することはありません。そんなものは人生のごく一部です。この世が面白くないと思えたり、これから先にもロクなことはないと感じられたら、それは自分の観測範囲が狭いからで、世の中にはまだ自分には見えていないところの方がずっと多いという事実を思い出してください。ちなみに、これは世間では想像力と呼ばれています。例えば、何も知らなかったときには冴えないリーマンとしか思えなかったような人が、実は尊敬すべき人間であることにある日突然気づいたり、逆にすごくイケてると思っていた人たちが実際にはどーしよーもないただのクズだとわかってしまうような体験がこれから先に何度もみなさんを待ち構えています。そうした瞬間に、今まで大きな問題であるかのように見えた事柄が、実は間抜けな水たまり程度のトラップでしかないことがわかることだってあるかもしれません。そんなタイミングを逃さないように、何度も繰り返して自分自身に定期的にアップグレード用パッチを適用し続けることを、世間では成長と呼んでいます。

いいプログラマーになるのには10年かかるように、たった半年足らずでは何も完璧に教えることなど出来やしませんが、少なくともそういった意味での成長や想像力を巡らせるためのヒントになりそうなことは、授業を通して少しくらいは伝えてきたつもりです。ぼくは正直なところみなさんがどこに就職するとかいう話には全く興味がありません。そんなことより、どんなことに関心を持って、どんなことに挑戦して、どんなことに反抗しているのかの方がよっぽど興味深いと思っています。だから、これから先、みなさんがいろいろなことを吸収しながら、世界中にアンテナを張り巡らせて、明るく楽しく局地戦を展開していく愉快で陽気で歌が大好きなゲリラ部隊のように逞しく生きていくことだけを期待しています。

Birthday Boy


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

Titanium + VMware(Android x86)でAndroidアプリ開発

そう、さっきのエントリを読んでお気づきの方もいらっしゃるでしょうが、実はほぼ同じやり方でVMware上のAndroid x86を動作させることも可能です。インストールについてはこちらの記事なんかが参考になるでしょうか。ネットワークの設定はブリッジで追加のデバイスとすれば

$ adb connect 192.168.1.5 #VMware上のAndroidのIPアドレス(例)
$ adb devices
List of devices attached 
emulator-5554	device
192.168.1.5:5555	device

こんな感じで認識します。CLIからのビルドとインストールはこんな感じ(デバイスの指定は例です):

titanium build --platform=android --build-only && \
adb -s 192.168.1.5:5555 install -r build/android/bin/app.apk

androx86

こっちはActionBarに対応していましたね。

もちろん、Androidのエミュレータでx86のイメージを使ってもいいんですが、あれっていまいち不安定でちゃんと動かなかったりすることが多くないですか?原因の切り分けが難しい割に再現する頻度は高いので、最近ちょっとくじけています。

Titanium + BlueStacksでAndroid開発

Androidのエミュレータの動作の遅さには困ったものがあります。ホストと異なるアーキテクシャのマシンをエミュレートするのですから遅いのは当然のことではありますが、開発の意欲を削ぐほどのノロさなので、いくらなんでも限界というものがあります。そういう場合、普通は(1)諦める(2)報復を仄めかす(3)工夫するといった選択肢が考えられますが、われわれ歌と踊りが大好きな愉快で楽しいTitaniumユーザーとしては、3の路線でいきたいものです。

というわけで、先日発表されて話題になった、WindowsやMac OS上でAndroidのアプリが実行できる環境を提供するBlueStacksを使ってみました。BlueStacksのインストールは簡単で、Mac OS Xならダウンロードしたファイルを展開してコピーするだけです。さっそく起動してみましょう。

bs

なんかそれっぽい画面が出てきましたね。さっそくゲームとかいろいろやってみたいところですが、いったん我慢して、Titaniumで作成したAndroidアプリをインストールできるようにします。ターミナルからadbをリロードしてみましょう。

$ adb kill-server
$ adb start-server

おそらくこれだけでBlueStacksがエミュレータとして認識されるはずです。されていなければ、ここだけの話ですが、localhostの10000とか10001とか10002、あるいは5550から順番にconnectを試したら繋がります。

$ adb connect localhost:1000x
$ adb connect localhost:555x

ひどい話ですね。

$ adb devices
List of devices attached 
emulator-5554	device

こんな風に表示されたらしめたものです。あとはTitaniumがエミュレータとして認識してくれれば楽なのですが、面倒くさい+CLIしか使わないので「build-onlyでapkファイルだけ作成」したら「adbでインストール」という手順でやってしまうことにしました。プロジェクトのディレクトリから

$ titanium build --platform=android --build-only && \
adb -s emulator-5554 install -r build/android/bin/app.apk

これで、apkファイルを作成し、インストールするはずです。さっそく実行します。ところが…

なぜだ…

なぜだ…

あれーっ!エラーがいっぱい!そう、実は3.0.2.GA時点でAndroidはbuild-onlyオプションが正しく動作しないのです。仕方がないので対応させてみましょう。$HOME/Library/Application\ Support/Titanium/mobilesdk/osx/3.0.2.GA/android/cli/commands/_build.jsを編集します。

$ diff /tmp/_build.js /tmp/_build_old.js 
404,405d403
<       } else if (cli.argv['build-only']){
<         return;

うーん、問題なければPull Requestしようかな。これでbuild-onlyを無視しなくなります。もう一度さっきのコマンドを実行してみます。

$ titanium build --platform=android --build-only && \
adb -s emulator-5554 install -r build/android/bin/app.apk

BlueStacksには普通のAndroidデバイスにあるようなアプリ一覧みたいなメニューがないので、ホーム画面左側の大きな「My Apps」ボタンをクリックします。

bs2

インストールされていましたね(画像のActionBar2っていうのがそうです。ええ、ついうっかりFruit Ninja Freeも入れましたとも)。ActionBarの動作を試したかったのですが、どうやら対応していないみたい。

bs3