T

2016年の卒業式の贈る言葉

 学生の皆さん、ご卒業おめでとうございます。成績の方はいかがでしたか?ご不満のある方は自分の胸に手を当てながら、一歩前に出て来てください。

 さて、今年は就職活動も大変でインターンやアルバイトで出席がなかった学生さんも多いので、大事なことをいくつかこの機会にまとめてお伝えしておきたいと思います。

 まず、これから社会人になる皆さんは、必ずこの資料に目を通しておいてください。ブラック企業対策プロジェクトが発行している「ブラック企業の見分け方」という冊子です。66ページもある長い資料ですが、しっかり読んでおいてください。あるいは、もう就職してしまったのでから意味がないと思う方もいらっしゃるでしょうから、その場合は「会社をどう休む、病院でなんて言う」をお勧めします。

 なぜなら、皆さんがこれから就職して仕事を始める企業の大半は、ブラック企業だからです。すいません、いきなり変なこと言っちゃって。

 先日、三月三日に誕生日ケーキを買いに、近所で評判のケーキ屋さんに行きました。甘い匂いにつられたアリのように、といっては失礼かもしれませんが、店の外まで大勢のお客さんが並んで、大変繁盛しています。それもそのはず、このお店のケーキは都心の有名店も霞むほどの美味しさで近隣では知らない人はいないほどの知る人ぞ知る名店なのです。なので、毎日こうして行列が絶えません。

 しばらくしてようやく店の中に入ると、一時は住宅でも流行していたいわゆる南仏風の建物の奥、レジの向こうの厨房がガラス張りになっていて、お揃いの白衣に身を包んだ大勢の人たちが一心不乱に働いているのが見えます。ケーキ屋さんのケーキって、手作業が多くてなかなか自動化できないみたいなんですね。だから、人気店の需要を捌くには、どうしても大勢の作業者が必要になります。そんな姿を見ていると、ちょっと嫌なことに思い当たって、ついギョッとしてしまいました。

 …まだ読んでる?ごめんねいきなりケーキの話になっちゃって。もう少し我慢して。

 で、このお店のケーキは、美味しいだけじゃなくて、値段が手頃なことでも知られています。確かに、あまり洋菓子に詳しくなくても、この味でこの値段はちょっとあり得ないだろう、ということだけはすぐにわかります。でも、お店にはこれだけ大勢の人たちが働いているのです。おかしいと思いませんか?ケーキを1つ作るのにも何人もの作業が必要なのですから、当然人件費がかかります。またお菓子なので材料費も必要です。どちらを削っても、質の悪い職人、質の悪い材料、いずれもケーキの味が悪くなる要因になり得ます。

 すると、お店の前に小さな看板が掲げられているのに気付きました(わざとらしい気付き方ですね)。アルバイトの募集です。そして掲載された時給に驚きました。なんと、これだけ多忙なお店で、確かに可愛らしい制服を着て甘い匂いに包まれて過ごせる職場ではありますが、時給は都の最低賃金程度なんですね。またパティシエも募集中でしたが、こちらも月給20万程度です。つまり、削っていたのは、職人や材料の質ではなく、職人を含めた従業員の賃金だったんです。

 不当に安価にものを販売することを、ダンピングといいます。例えば、市場を独占するために赤字覚悟で不当廉売するような行為はこのダンピングに該当し、独占禁止法で禁止されています。一見するとものが安く手に入るのだから消費者には嬉しいようにも思われますが、例えばある企業が不当にものを安く売ることで他のライバルが参入できなくした後で、市場を独占して一気に価格を吊り上げたらどうなるでしょう。これがケーキなら我慢すればいいかもしれませんが、例えばどうしても定期的に服薬する必要がある深刻な病気の特効薬だったらどうでしょうか。このように、ダンピングは健全な競争を破壊して不健康な状態の市場を作り出してしまうので禁止されている行為なのです。

 もちろん、ケーキ屋さんも不当に市場を支配して競合を蹴落とし、甘いものを求める近隣住民の欲望を一気に支配することが目的で人件費を下げているというわけではないと思います。もっと単純に、例えば、善意から、みんなに美味しいケーキを少しでも手軽な値段で食べてもらいたいと考えているかもしれません。ただ、経済においては本人の意図というのはあまり重要ではなく、そこに現れる否応無しに突きつけられる現実、過度な競争や軋轢を生むシステムそのものが問題になってくるのです。

 ふうん、ケーキ屋さんもアンタみたいに面倒くさい客が寄り付いて大変だね、と思いながら読んでいる卒業生の皆さん。これはケーキ屋さんだけに限った話ではありません。っていうか普通はそうだと思うけど、卒業の贈る言葉なんだから当然皆さんのこれからの進路に関係ある話です。上の方で思いっきりほのめかしてますけど、なぜなら皆さんが就職する職場もまた、ダンピングによって成り立っているからです。

 なんだってーとかいうアスキーアートは掲載しません。

 もちろん、ソフトウェア業界とケーキ屋さんには大小様々な違いがあります。仕事という面ではソフトウェア業界の方がまずいことの方が多いかもしれませんね。競争過多なのは同じでも、まず第一にあんまりお客さんが満足していないし、第二にこれっぽっちも美味くなくて、職人の給料と一緒に質も平気で削る世界ですから。思い出してください。皆さんが今の就職先に採用されたのは、その高いスキルで会社を飛躍的に発展させるからではなかったはずです。というか正直、技術の面で何らかの選抜を一切受けていない人の方が多いと思います。面接でコードを書いたり、Githubアカウントを送ったりもしていないでしょう。つまり、大半の場合は若くて(つまり給料が安くて)なんかこちらのいうこと聞きそう、くらいの理由で雇われているのが現状です。これが、上司や経営者が高い給料で贅沢するための措置であれば悪意が原因なのでまだマシなのですが、その上司や経営者も大した報酬もないまま働いているはずです。まあ、もちろん、それでも皆さんよりは稼いでいるかもしれないですけどね。

 悪意が原因ではなく、ただ値段を下げて相手に買ってもらうために人件費を削り、削れない場合は従業員の質を削って安く雇い、低価格でサービスや商品を提供する。これは二重のダンピングです。一つは、普通の意味でのダンピング。もう一つは、安く働く従業員である皆さんによる、労働力を不当に安く提供するダンピングです。え?オレたちが?いやいや、給料は目一杯もらってるし、下げる気なんかさらさらない上に、今の給料も同級生と比べても別に安くないよ?とおっしゃるかもしれません。

 でも、自分の収入が適正かどうかなんてあんまり考えたことないですよね?

 まず、預金額を考えてみます。あんまり溜め込んでも仕方がないので、預金はほどほどでもいいと思うのですが、でも全然ないというのはまずいです。給与の3ヶ月分くらいはないといざという時に困るはず。みなさんの給与は結構高い所で額面20万、税金や保険で手取りはその80%の16万円くらいでしょうか。60万円貯金するのには、毎月5万円コツコツ貯めて1年かかります。ボーナスの話は一旦脇に置きます。すると11万円で生活するわけですが、家賃と光熱費はどれくらいが適正でしょうか。都心で働くとして、もちろん都心に違いほど通勤は楽です。通勤が楽なら自分への投資、勉強会に出たり本を買って読んだりする時間を捻出しやすくなります。反面、まだまだまともな条件の物件は高いはずです。仮にドアからドアで通勤に1時間かかる部屋を7万円で借りたとします。残りの光熱費や生活費を4万円でやりくりするわけですが、きっと携帯電話とインターネットプロバイダの契約だけで1万円くらい吹っ飛んでいるので、1日に500円も使えない生活になるはずです。かなり厳しいですよね。こんな風に、働いても働いても豊かにならないことを、ワーキングプアと呼ぶ人もいます。

 どうしましょう。ええ、こういう時に真っ先に削るといいのは預金です。金利もないんだし、ここを削って生活をもう少しマシなものにしましょう。じゃあ、いくら削って、どんな生活にすればいいのでしょうか。

 みなさんは、将来、家を買ったり車を買う、あるいは子育てをしたいと思いますか?あるいは、贅沢な暮らしがしたいとか、毎年旅行に行きたいとか、そういった類の将来プランはあるでしょうか。まあ、漠然とでもいいので何かあるとして、ではその場合、給料がいくらくらい必要になりますか?

 いや、別にモニタに向かって叫んだり急いでメールを書いて送ってもらわなくてもいいです。清貧生活であれば別にいいですが、そうでなければ、どのプランであっても、ちょっと給与が足りないですよね?足りてるっていうなら、それはそれで別にいいんですよ。でも、そうでないなと思ったら、続きを読んでくださいな。

 基本的に、皆さんは、いくら働いてもあんまり豊かになれない条件で自分の労働を会社に提供しています。つまり、自分自身(の労働時間)をダンピングしているのです。だって、そうしないと職に就けないから。そう、知らず知らずのうちに、皆さんは求人市場における不当廉売行為に手を染めているのです。もちろん、他の大勢の人たちもそうです。ダンピング、というと聞こえは悪いですが、ワーキングプアになるような待遇を受け入れることは、やはり労働力の不当廉売なのです。自分の将来を売って今の生活に替えているだけなのですから。なので、どこかの時点で価格を適正にしないと、自分の方が倒れてしまいます。

 もちろん、急いで言い添えますが、皆さんの待遇は違法行為によって不当に低くなっているというわけでは全くありません。それは皆さんが強欲な亡者で労働市場を不当に占拠しているからでもなければ、経営者が血も涙もない鬼畜で奴隷を買いに行くついでに皆さんを雇ったからでもありません。そうではなく(例外はいるでしょうが)、上にも書いたように、関わっている人たちの善意や悪意は関係なく、ただ否応無しにそんなことになってしまう傾向があるということなのです。多分、昔は年功序列で経済も右肩上がりだったので、給料は将来どんどん上がるものとみなされていたから、若いうちに安月給でも問題はなかったのに、今はそういう状況じゃないくせに古い制度や慣習だけが残っているだけのことなのでしょう。もし本当に悪巧みをする連中がいて、そのせいで良くないことが起きているならまだ良かったのですが、そうではなく、ただ世の中の大半が不当に低い待遇で暮らしているだけだという事実こそが、この問題の根深さなのです。最低限、自分自身が生きていけるだけの分しか保障されていないので、例えば人口の再生産(子供を産んだり育てたりすることです)などは昔と比べて相当難しく、それは昨今の出生率の低下を見ても明らかです。大事なことなので繰り返しますが、これは、皆さんや雇用主が個人的に悪い人だからではなく、世の中がそういう傾向にあるということなので、うっかり社長の部屋に怒鳴り込んだりしないでください。

 そして、だからこそ、せめて悪い会社や上司に行き当たった場合に備えて、上のリンクの冊子を読んで自己防衛してください。

 でも、悪い話ばかりじゃいけないと思うので、こんな状況で皆さんはどうすればいいのか、まあ授業中にもお話ししたとは思うのですが、最後にもう一度繰り返しておきます。

 預金がそれなりにあっても、収入がそんなに高くなければあんまりお金を使うのはいいことではありません。第一、不安で使えないはずです。だから、できることなら、皆さんはまだ若いんだし、今は小銭を溜め込むより、そのお金を自分に投資してスキルを上げて、より高い給与で仕事が出来るようになるべきです。入ってくる当てがある時だけ、安心してお金を使えるからです。まともな生活には、多めの預金よりも多めの月収が効いてきます。だから、どんな人生プランがあったとしても、もしそれが何も使わず何も所有しない清貧暮らしであれば別ですが(それはそれでいいと思います)、当面の目標は、健康を維持しながら月収を上げること、給料を上げることにするべきです。

 では、皆さんの会社で給料を上げる方法は、何でしょうか。

 普通、ここは答えは「会社による」なんですが、皆さんの就職される会社は別です。なぜなら、スキルを必要とする業務にもかかわらずスキルの良し悪しで選考していないで皆さんを採用した会社に、ちゃんとしたキャリアプランが用意されている方が稀だからです。ごめんね、せっかく入った会社なんだから、皆さんもその会社を好きになりたいだろうけど、でもやっぱり、これは経営者が善人じゃないからとか悪人だからとかいう話ではなく、どうしようもない傾向なんですよ。だから、もっとぶっちゃけると、給料を(ごくわずかな場合を除き)上げる方法はありません。転職するしかないのです。というわけで、条件のいい会社に転職できる人間になることが皆さん共通の目下の最大の目的となります。

 そういう風に目標を設定すると、お金の使い方もおのずと決まってきます。自分のスキルを上げる時間を確保するためなら1万円家賃が高くても会社から近い場所に住むべきでしょう。通勤が楽な方が健康も維持しやすいはずです。そのお金で時間と体力を買ったことにして、勉強時間に投資してください。会社の業務を覚えることも勉強ですが、同僚がそのまま力尽きて倒れて寝ている間に、帰ってもう少し先まで学んでください。無茶を言う上司には上の資料を使って適当に対抗し、ちゃんと休憩しながらパフォーマンスを発揮出来るよう調整してください。飲みに行くのもいいですが、出来れば勉強会などでスキルの高い人たちの話を聞くために出かけるよう心がけてください。戦国武将のどうでもいい逸話を披露する上司の話はスルーしてその間に英単語の一つでも覚えましょう。ピープルウェアを読みましょう。C言語を覚えましょう。ミクロ経済学を学びましょう。

 「チョコレートを、食べなさい。あなたの脳を、洗いなさい。ダダ、ダダ、水を飲みなさい

 そして、学びながら、世の中は知れば知るほど結構面白いと気づいてください。もう知っている人はもう一度味わってください。そこまで心が広くないという、まるでぼくみたいな人には、「Living well is the best revenge」という、一説ではジョージ・バーバートのものと伝えられているものの、実際にはユダヤ教の口伝(タルムード)にある「Live well. It’s the best revenge」が由来という、不穏な感じがすごくいいので気に入っている言葉を贈りたいと思います。ぼくらの世代がそろそろ仕事を引退する頃には、最大の人数を誇る最悪の世代として悪名高いジェンレーションXが労働市場から次々に消え去るわけで、高スキルの人材は引く手数多になっているでしょう。その頃までコツコツ頑張っていればきっと大きく報われるんでしょうね。いいなあ。

全くの素人が自転車を買ったので記録しておく(1)

自転車修理事始め

血圧も高いし体重も減らすべきだと会う人みんなに言われるので、自転車を買った。

周りに誰もスポーツバイクに乗っている人がいないので、最初に参考にしたのはひたすら @kanose さんのブログと検索だった。正直、ここまで調べ上げているサイトは他になかなかないし、意見もとても参考になる。そこから貼られているリンクをたどって読むだけで十分に勉強になるはずだ。もっとも、全部を本気で調べたらきっとペダルを漕ぎだす前に老衰で動けなくなるかもしれないが。

その後、仕事の関係で筋金入りの自転車狂に出会ったので色々と質問してみたりしながら準備を進めた。結局、方針としては

・買うのはクロスバイク
・サイズが合うこと重視
・予算は上限10万円くらい

くらいにざっくり決めて、いざ自転車屋さんに出向いたのだが、最初は情報を仕入れるだけにしようと思っていたのに、結局なんだかんだ言ってこれだよねとその場で一発で決めてしまった。

GIANTというのは台湾のメーカーで、70年代から主にOEMで色々なブランドの自転車を生産してきた会社だ。以降本格的なレースにも参戦し、世界中で高い実績を積み上げている。店員さん曰く、店内にざっと並んだ色々なブランドのおしゃれ自転車も「まあぶっちゃけみんなGIANTが作ってますよ」とのこと。特徴としては、とにかく価格が安く、価格破壊のレベルといえるアグレッシブな製品を出してくることで有名らしい。確かに、この自転車もシリーズでもっとも安いモデルでさえ内装ケーブルになっていたりする。正直、たまの通勤に使うだけでレースに出るわけでもないので、そこまでハイスペックなものは求めていない上に、初めての買い物なので安く済むならそれだけでもありがたい。また大震災の際には輸送に使われるようにマウンテンバイクを千台も寄付して使い方を指導し、割と早く交通インフラが復旧したのでそれらは最終的には遠距離通学になってしまった子供達の通学用に使われることになったりした記事を読んでグッときたのも決め手になった。たまたまサイズがちょうどいいのが在庫にあったので、翌日には納車となった。

どうせスポーツバイクなんか乗ったこともないので、買うまで試乗もしなかった。

ちゃんとした製品みたいだし、まあレースに出るわけでもないから、安いに越したことはない。たまたま空気入れはパナレーサーのが自宅にあったので、あとは手袋でも買うかなあ、などと最初は気楽に考えていた。しかし、そんな甘い考えはすぐに文字通り打ち砕かれてしまったのであった。続く

Rage Against エセ民間療法

 偶然にも二人の著名人がガンに罹患し、片方は亡くなりもう一人もすでに転移して悪化した状態だという。そして、どちらも医療を拒否し民間療法に頼るという間違いを犯した。

 うん、間違いとはっきり言い切ってしまって構わないし言い切るべきだ。

 事例はデータではない。ガンについてこれで治った、これが効いたという宣伝は必ずしもデータに依るものではない。本当なのか、他の要因はなかったのか、検討されている証拠もない。

 よく、科学は万能ではないとかいう人がいる。当たり前だ。誰もそんなことを前提になどしていない。科学への批判としてこれはそもそも理屈が成り立っていない。第一、そうでないと科学は進歩しない。

 でも、科学的手法というものはまた別の話だ。

 もちろん調査に誤りや手違いが起きることはある。当たり前だ。でも、調査そのものを慎重に設計して、十分にランダムなサンプルからデータを収集し、またそれらすべてを公開して、あらゆる方面から誰もが何度も検討することを可能にするという科学的手法そのものは、たとえ科学が万能でなくても、有効性がなくなるものではない。

 ここで少し自分語りをさせてもらいたい。いや、正確には母親のことだけれど。

 検診で母にガンが見つかり、しかもステージ4と診断されてから、世の中には民間療法の宣伝がずいぶんたくさんあることに気づいた。何気なく読んでいる新聞にも、毎日のように書籍や雑誌の見出しに見つかる。医者には行くな、抗がん剤は悪い、ダイエットでガンが治る、などなど。母はなんといっても占いとかが大好きな人だったので、もちろんちゃんとした情報にも当たっていたが、それらの変な情報もあれこれ追いかけていた。そして、有望そうなものがあれば医師にこれはどうだろう、あれはどうだろうと尋ねたりしていた。国立がんセンターの医師はインフォームドコンセントという面でもしっかりした人で、手術で取り除けない転移があること、それらを全部取ると結果生命も失うので、抗がん剤により縮小させて手術可能になったら取り除く方針であること、抗がん剤は強力な副作用もあるが、何よりどれが誰にどう効くのかは使ってみないとわからないこと、そのためにきちんと検診して効果を見極めながら治療する必要があること、などを丁寧に説明してくれたので、最初はショックだった母もた闘うか降参するかしかないことを理解し、闘うことを選択することができた。笑ってしまう人もいるかもしれないが、医師にあれやこれやの民間療法についてアドバイスを求めるのも、母にしてみれば立派な闘いだったのだ。医師はそんな母の変な質問にも、決して嘲るようなことはせず、ひとつひとつ丁寧にその矛盾や誤りを説明してくれた。一番完結な説明は、もしそれが効くと正しい手法で調査され、有意な差が認められているなら、もちろん我々は治療に採用します、というものだった。そりゃそうだよね、と母も納得していた。

 ぼくも納得した。そして、同時に強い憤りを覚えた。普段は気丈に振る舞っているが、実際には母がわなわな震えるほどの強い不安に毎日何度も苛まれているのは知っていた。それを押して週に何度も電車やタクシーで遠くの病院まで通いながら命をかけて闘っている人間に、善人面して嘘や過ちを信じさせようとあの手この手を使う連中がいる。そりゃ多少の気休めにはなるかもしれない。でも、もし誰かが心の弱さや無知からそんなものを本気で信じてしまい、積み上げられた知見から設計された医療を拒否するようになってしまったら、というかあの手の奴らの中には積極的にそういう方向に読者を誘導している輩もいるのだが、それはもう十分に殺人ではないか。生きたいという至極まっとうな欲求を貶めて金をむしり取る行為を正当化できる理由はひとつもない。そんな嘘の本で汚い金を稼いでいる出版社だって、その広告を載せているふざけた新聞だってみんな同罪だ。

 患者が納得しているならいいじゃないか、という意見に与することはできない。死というものはまたその足音を聞いたことのない者には単なる空想の産物でしかない。死に至る病を背負った人の不安なんて自分がそうなってみないとわかるわけがない。そんな状態の患者の判断を尊重するというのは、やっぱりおかしいじゃないかと思うからだ。それより何より、不安に苛まれている人が、正常な判断力を失って間違った方向に進んでしまうことを助長するあらゆる言説を支持するわけにはいかないのだ。

 ステージ4のガンが治る確率など微々たるもので、せっかく手術したって一桁台の生存率がやっと二桁になるくらいが関の山だ。だけど、母は確率もクソもない薄汚い連中の嘘ばかりの甘言に惑わされることなく、最後まで闘い、やがて治療の甲斐なくターミナルケアに移され、そこで短い生涯を終えた。ひょっとしたら、インチキ代替医療を宣伝する連中はそれ見たことかと言い立てるかもしれない。図々しい奴らだから。けれど、息子として一言いわせてもらいたいのだが、母は少なくともあいつらの勧める気休めとやらには勝ったし、今でもそれが大いに誇らしい。

 上の方で民間医療に頼ってしまった二人を、間違っていると書いたけれど、それは両人を断罪したいからでは決してない。死への恐怖は人から正常な判断力を奪い、また世の中には支えが必要なそんな状態の人たちを食い物にする鬼畜がいて、そいつらを駆逐するには、やっぱりそういうのは間違っていると常に言い立てることが必要だからだ。なので、困っている人たち、本当に助けが必要な人たちの、生きたいという願いを悪意からでも善意からでも邪魔する連中が消え去るまで続けるつもりだ。

6年目とこれからの話

 2010年9月からフリーランス生活を始めて、これで6年目に突入しました。日頃から様々な面で皆様に支えられてこれまでやってこられたことを感謝いたします。ありがとうございます。これからも宜しくお願いします。

 現在の仕事の内容は大きく分けると受託開発とコンサルティングです。この5年間ほとんど変わっていません。最近では受託はスマートフォン向けアプリが多いですね。コンサルティングはいろいろです。その他の時間は個人的な勉強に充てています。また週に一度のペースでウェブアプリケーションの開発などの講座を専門学校で担当しています。

 また、仕事も講師業の他はほぼ家で作業しているので、三食家族と一緒の日がほとんどで、子供らの送迎やイベントに出席する機会にも恵まれ、ワークライフバランスはすこぶるいい感じです。

 仕事の方もおかげさまで状況は安定し、年内の予定はほぼ埋まってしまいそうです。多少の上下はありましたが、今年も目標の予算は達成できそうなので、ありがたいことです。所得税を払うまでは少しだけ浮かれた気分で過ごしたいと思います。

 経済的にはこの3年ほど微増続きでだいたい同じような感じです。なにぶん一人でやっているものですから、リソースもないので急激に成長させることはそもそも無理なのですが、投資家とは無縁の自己資金だけの世界に暮らしステークホルダも自分だけなので困ることはありません。もともと、無理に利益を積み上げていくようなガツガツしたスタートアップのようなものはあまり好きではなく、どちらかといえばスモールビジネスを続けて自分に合ったニッチを見つけ細々と、でもある程度豊かに暮らしていきたいと考えていたので、今のところこれが理想通りだったのかなという気がしています。

 しかし、同時に、個人でやっている以上は現状だけでなく今後の生活についても考えていかないといけません。なんといっても退職金もなく収入保障の保険はあっても病気や長期的なトラブルを抱え込んだりするとひとたまりもありません。

 それに、これまでは受託開発である程度のパフォーマンスを発揮できればそれで十分だったわけですが、それを今後何年続けることができるのか、ちゃんと考える必要があります。本来、会社の業務であれば調子が良ければ人を雇って収益を増やしたり、スケールするサービスを展開するなどしていけばいいわけですが、どうも性分として出来ればいつも一人でいたいので、いまいち事業の成長という方面に乗り出すことができません。

 それでも、今後は一人のリソースで対応した分だけ収入があるという状態を改善する方法を考えていかないといけないでしょう。老後の資金の確保だけでなく、子供の進学などで支出も増えるわけですから、うまくいっている内に次の対策を考えるのがいちばん賢いやり方なはずです。課税される消費税がどんどん上がることを考えるとなおさら真剣に考えないといけません。

 よく考えたら、サラリーマン時代だってどんなに干されようがいつか来る日のためにあれこれ布石を打ってきて、ようやくそれが実になってきたようなものですから、今後も同じですね。

 というわけで、年末から来年にかけては、次の10年のための布石を打つ作業をもう少し本格的にやっていきたいと思います。具体的なことは失敗すると恥ずかしいので明かせませんが、小さく一歩ずつやっていきます。

 せいぜい5年くらいニッチに居座って細々暮らしているだけで成功談も何もあったもんじゃないですが、やはりここまでこられたのは運の他にもいくつかの要因があったと思います。まず、プログラミング関連の仕事をしている中で、ああこれは本当に有利だったなと実感したのは、他の人より英語ができること、といって悪ければ英語に抵抗が全然ないことです。ログやマニュアルがちゃんと読めるだけでなく、各種の用語で使われている単語や言い回しも元は普通の生活の中で使われている語であったりするので、プログラミングを巡るいろいろな概念の理解も楽になります。次に、仕事自体が気に入っているというのも大事でした。ぼくはさほど頭が切れるわけではないので、みんながやっていることについてじっくり眺めて考えて、ゆっくりとそれらを学び取り、そこからようやく競争相手を安く早く出し抜く方法を探すことが出来ればいいやと考えているので、眺めているのが好きなものを仕事にしてよかったと思っています。単純に新しい技術だけでなく、過去から思いがけず背中を叩かれるように復古してくる技術もあり、全く関係がないと思っていたものが突然繋がったりするのでソフトウェアの世界はなかなか飽きません。

 ええ、裏を返せば、ソフトウェア開発の仕事はそこまで高度に抽象化された仕事になってしまったのだ、ともいえるでしょうね。それは賢い人たちが本来の仕事をするために簡単な事はたいしたことがない連中(ぼくだよ!)でもできるように、より簡単にしていった結果でもあるのでしょう。いい時代です。

 だらだらと長くなりましたが、今後もこんな感じで、スモールビジネスで自分の手が届く範囲内を充実させるべく努力していきます。そして、結果として皆様の利益につながるものが提供できれば幸いです。これまで支えていただいた皆様に感謝すると同時に、これからもどうぞよろしくお願い致します。

SPIKEのWebhookをRailsで受け取る

久しぶりにブログでも書こう。

手数料無料の驚きのカード決済サービスSPIKE、使わない手はないということで試してみたのだけれど、RailsでWebhookを受け取るとエラーになってしまう。

Error occurred while parsing request parameters.
Contents:

なんかURLエンコードされた文字列

JSONをPOSTされた際にうまくパースできないようなのだが、コントローラで受けたときにはもうエラーになっているのでアプリケーションのレベルでは対処しようがない。結局、こちらを参考にモンキーパッチで動かしてみたのだけれど、もっと楽なやり方があれば教えてもらいたい。

まずはinitializerを用意して、特定のページへのアクセスでデフォルトのパーサを迂回させる。

# config/initialize/webhook.rb
# https://github.com/intridea/grape/issues/340
require File.dirname(__FILE__) + '/../../lib/webhook_parser.rb'

MyApp::Application.config.middleware.swap ActionDispatch::ParamsParser, MyApp::ParamsParser, :ignore_prefix => '/path/to/webhook'

これでwebhookへのアクセスのときはlib/webhook_parser.rbが呼び出されるようになった。

#lib/webhook_parser.rb
# https://github.com/intridea/grape/issues/340
module MyApp
  class ParamsParser < ActionDispatch::ParamsParser
    def initialize(app, opts = {})
      @app = app
      @opts = opts
      super
    end

    def call(env)
      if @opts[:ignore_prefix].nil? or !env['PATH_INFO'].start_with?(@opts[:ignore_prefix])
        super(env)
      else
        @app.call(env)
      end
    end
  end
end

これでSPIKEからのWebhookをエラー無しにコントローラで処理できるようにはなった。

  #webhookを受け取るコントローラ
  def webhook
    # SPIKEから送信されるrequest bodyから余計なバックスラッシュと先頭と最後のダブルクォートを消す
    parsed_request_body = JSON.parse(URI.decode(request.body.read).match(/\A"(.+)"\Z/)[1].gsub(/\\/, ''))
    # あとはお好きなように
  end

2014年のオークランド・アスレティックス

 まさかの2連覇を果たしても順位予想は2位か3位という悲しきアンダードッグ、オークランド・アスレティックスの2014年は割と地味に始まった。

 まず投手陣。補強されたのは無名の若手とのトレードで移籍したフェルナンド・エイバッドセス・スミスと交換でやって来たルーク・グレガーソン。球は速いがコントロールに難がある左投手と、中継ぎのくせに球速はないがスライダーを多投してタイミングを外すことに専念する地味な右投手だ。実績のあるグレガーソンは2015年にはFAなので1年限りの腰掛け移籍である。このエイバッドの獲得もあってか、この数年左のワンポイントから割と長いイニングまで投げていたジェリー・ブレヴィンズ(日米野球で来日してましたね)がところてん式に放出され、小柄で全くパワーがないがやたらめったら足の速いビリー・バーンズが加入している。ブレヴィンズ、どういうわけかやたらとイチローを苦手としていたのでナショナルリーグに移籍できてよかった。そして華々しいルーキー時代の活躍から一転、長期契約を獲得した直後からずっと怪我で出場していなかったブレット・アンダーソン(北京五輪の三位決定戦で日本相手に勝ち投手になった人)が放出され、これまたなかなか芽が出ずポテンシャルの高さだけは定評のあった長身左腕ドリュー・ポメランツとトレードされた。それからなんといっても驚きだったのは独立リーグを経てMLBに復帰したスコット・カズミアーの獲得だ。『マネーボール』に出てくるカージマー、といえば通りがいいかもしれない。そう、あの有名なドラフトのシーンでメッツが獲得したお陰でビリー・ビーンがずっと狙っていたスウィッシャーを見事A’sにもたらした、あの高卒ルーキーが何の因果かA’sに入るのだ。2013年シーズンはクリーヴランドで好成績を挙げてカムバック賞まで獲得したのだが、独立リーグ時代に著名なピッチングコーチから指導されていたらしく、驚くべきことにそのコーチは今は元A’sのエースにしてFAで巨額+長期契約を獲得した途端に二流の先発投手に成り下がったまま無事契約満了してバイアウト$7Mまで手に入れて、悪名高い代理人スコット・ボラスと一緒にサンフランシスコ・ジャイアンツを骨までしゃぶった挙句、当然のように契約してくれるチームがなくなり引退状態だったバリー・ジートを指導しているとのこと。これで2014年のローテーションはカズミアー、グレイA J・グリフィンパーカーとなり、残り一枠はトミー・ミローンが有力視されていたが、加えてソフトバンクが数年前に獲得し損ねたジェシー・チャベスとポメランツが争うことになった。また昨年までのクローザーで地元の人気選手、オーストラリア人のグラント・バルフォアがFAで高給取りになるので、新しいクローザーとして昨年まで2シーズンで100セーブを達成しているジム・ジョンソンが入ることになった。松井がサヨナラホームランを放ったことがあるベテランでシンカーを多投する地味な選手だが実績は十分だ。

 野手の補強はもっと地味で、まず全くの期待外れだったクリス・ヤングを解雇して、地元出身のユーティリティのニック・プントを獲得。ショートも守れるので中島が全く使えないと判断された以上は必要な補強だ。それから、レイズからFAになったサム・ファルドを獲得している。ファルドはどうやらかなり前から狙っていたようで、守備が上手で足が使えてボール球を振らず勉強も出来るという、最近のA’sが好みそうな選手だ。これでチームにはジェド・ロウリーとファルドという二人のスタンフォード出身(しかも元チームメイト)が在籍することになった。スタンフォードといえば最近ではGoogleみたいな企業で有名だが、主席で卒業しながら若いうちは野球をやるとMLBに入り通算270勝を挙げた上に20勝した年に引退したマイク・ムッシーナ(歴史上20勝して引退したのはサンディ・コーファックス以来42年振りらしい)や、飛び級で3年で卒業した秀才なのに西武ライオンズや日本の独立リーグでもプレーしたクリス・カーターのように面白い野球選手を外出していることでも有名だ。ロウリーも奥さんが外交官で本人も野球関係の文章を新聞に寄稿するちょっとした文化人だったりする。いずれにせよ、途中ポジションがかぶっているジェントリーを昇格させるためウェイバー扱いになりミネソタに移籍したファルドをトレード期限までに先発投手を放出してまで再獲得したのだから、A’sはよっぽどファルドに何かを見出しているのだろう。

 2014年のA’sは昨年に続いてプラトーン戦略を継続し、強力な投手陣に支えられてペナントを制するという戦術でシーズンに臨んだ。スティーヴン・ヴォートが怪我で出遅れ、野手はこんな布陣になった:捕手は右投手にだけ異様に強いジョン・ジェイソと、長打力はあるが守備はお粗末なデレク・ノリスが併用。一塁は右投手が相手なら超一流のホームラン打者ブランドン・モスと左投手用にネイト・フレイマン、二塁はアマ時代は強打で知られた守備のいいオタク顔でシーズンオフには嫌がらせのような大量の票を集め「Face of MLB」投票で決勝まで勝ち進んだエリック・ソガードが右投手用で、DV事件を起こして逮捕歴もありとにかく三振しないが守備に難があるアルベルト・カヤスポが左投手用。三塁はこのチームには珍しく固定されているが、それは有名選手と若手数人のトレードで加入したパッとしない控え捕手から内野にコンバートされた途端に急成長しトリプルAで四割を打って昇格後はMVP級の選手になったチーム最高のスター選手ジョシュ・ドナルドソンが入るからだ。ちなみに同じトレードでA’sに入ってきた選手に阪神のマット・マートンがいる。ショートにはおそらくレギュラーとしてはMLB全球団で最低の守備範囲を誇る両打ちのジェド・ロウリー。レフトはなんだかんだいってセンターから素直にコンバートされレフトにしては送球がいいので捕殺の多いヨエニス・セスペデス、センターは衰えたとはいえまだまだ広い守備範囲とMLBの外野手として最低レベルの肩でとうとうマイク・トラウトにセンターフライで一塁から二塁に走られた(間一髪でアウト)両打ちのココ・クリスプ、ライトは移籍直後の華々しい活躍が嘘のように打撃不調に苦しむMLBトップクラスの強肩ジョシュ・レディック

 そして、いよいよ開幕を迎えたわけだが、まず崩壊したのは投手陣。二桁勝利を達成してこれから飛躍が期待されたAJ・グリフィンとチームのエースになりかかっていたパーカーがトミー・ジョン手術で開幕前に脱落。A’sは先発ローテーションの2/5を失うという大惨事に見舞われた。その穴を埋めたのはロングリリーフからの転向組、チャベスとポメランツで、共に抜群の投球を披露し、特にポメランツは課題だった制球も安定しておおいに期待に応えた。もっとも、ノックアウトされた後にベンチを殴って骨折する杉内リスペクト行為で6月に故障者リスト入りしてしまったが。一方のチャベスも、MLBの投手としては異様に細い体格ながら鋭いカッターを武器に長いイニングを投げても安定感を見せた。短いイニングを全力で投げても被本塁打が多いのでむしろ先発の方がいいのかもしれない。とにかく、マイナー組織が非常に手薄なため昇格させる先発がいなかったA’sの前半戦はこの二人が救ったといっていいだろう。

 惨事は続く。新クローザーのジム・ジョンソンは顔を出すたびに失点を重ね、ついにクローザーを降ろされてしまった。この2年間クローザーを務めたバルフォアはとにかくセーブ失敗がないので地元でも非常に人気が高く、9回になると外野席のファンがずらりと並んでヘッドバンギングをしてテンションを高めるという儀式まで出来上がっていたくらいなので、不甲斐ない後継者にファンは容赦なくブーイングを浴びせていた。バルフォアがFAで高年俸になるという理由で獲得したのに高年俸でしかもバルフォア自身はメディカルチェックに引っかかってボルチモアへの移籍が破断になり格安でタンパベイに移籍したのだから余計に間が悪かった。チームは懸命にジョンソンの復活をフォローしていたが、点差がある場面であろうがどこで使っても結果を残せず、移籍先も見つからないまま月日は過ぎ去り、最終的には解雇となってしまった。

 しかしジョンソンの崩壊の一方でチームは代替となる戦力をきっちり確保できていた。新加入のエイバッドは神がかった投球を続け、年明け早々に獲得しておいたトミー・ジョン手術明けのエリック・オフラハティは夏以降復帰してから安定感のある投球で貴重な中継ぎとなった。ヴェンターズ、キンブレルと並んでアトランタのブルペンを支えたオフラハティが獲得できてきっちり復活し、おまけに2015年のオプションまであるのだから感動ものである。また、ケガ続きの野手だった若手が最後の手段で投手に転向したらシングルA級では誰も打てないことが判明し、ダブルAでもトリプルAでも三振の山を築くのでMLBに昇格したらミゲル・カブレラでさえ手こずる球を投げることがわかったという映画みたいな人生を歩んできたドゥーリトルがジョンソンに代わるクローザーに指名された。昨年からの持ち越しでダン・オテロは相変わらずシュートが冴え渡りゴロの山を築き、不調だったライアン・クックもそれなりに数字を残したのできっともうすぐいいトレードのネタになるだろう。

 そんな感じで、なんとなく前半を切り抜けたA’sだったが、不安要素はたくさんあった。まずグレイもチャベスやポメランツも年間を通して投げ切った実績がなく、ポメランツは上記のように杉内ってしまった。球速が持ち味のカズミアーも夏場以降はやや安定感を欠く投球が見受けられるようになり、先発のテコ入れは急務となった。実績のある先発投手はトレードで放出済みなので昇格というオプションはない。そこでビリー・ビーンと冷酷な仲間たちは他チームと次々と大型トレードをキメていく。まずマイナーリーグの若手有望株トップ一位のアディソン・ラッセルと昨年のドラフト一位のビル・マッキニー、先発経験もあるダン・ストレイリーをまとめてシカゴに放出し、FAまで半年しかないジェイソン・ハメルと2015年シーズン終了後にFAになるジェフ・サマージャを獲得。それからキューバ出身の選手として過去最高額で契約したセスペデスをボストンに送りやはりあと半年しか契約できないジョン・レスターを獲得した。レスターといえばガンから復活したボストンのエースでポストシーズンにもやたらと強いことで知られており、このトレードは今年こそはデトロイトの壁を打ち破るという意思の表れと当初は受け取られていたが、後のインタビューによればビリー・ビーンは事態はもっと切迫しているとみなしていたようで、レスター無しでポストシーズン進出は無理だと判断していたらしい。一方、二年連続ホームランダービーで優勝するなど地元でも人気の高かったセスペデスの放出はファンの間に大きなショックを与えた。ちなみにA’s残留と契約延長を希望していたセスペデスはインタビューによればトレードの知らせに泣きそうになったが、電話したら母親が大泣きしてしまいタイミングを失ったので泣けなかったそうだ。セスペデスの母は元キューバ代表のソフトボールの投手で、シドニー五輪に出場し120km/hを投げたこともある豪腕である。ちなみに、このトレードに触発されたのかデトロイトはデヴィッド・プライスを獲得するという大型トレードを敢行したが、ポストシーズンではヴァーランダーシャーザー、プライスの豪華三本立てできっちり三連敗して敗退し、ヴァーランダーは付き合っているグラビアアイドルのプライベート写真がiCloudから流出した。

 トレードの結果はまずまずだった。毎年前半しか活躍しないハメルは案の定ピリッとしない投球が続いたが、2014年のMLBで最もツキのなかった男サマージャはチームが変わってそれなりの打線の援護もあり、結果を残すことになる。レスターはさすがの投球で、観戦するたびに、ああ、いいピッチャーっていいピッチャーなんだなあと同語反復するしかない見事な活躍を見せた。

 だが、崩壊したのは投手陣だけではない。野手の成績もまたシーズンが進むにつれてひどい下降線をたどってみせた。毎年過小評価されるA’sについての記事を書く仕事を記者から奪い取るために今年のオールスターにはなんと5名もの選手がA’sから選出されたのだが、選ばれた野手のドナルドソン、モス、ノリスが揃ってシーズン中盤から後半に極端に成績を落とした。わかりやすいOPSだけで見ても、ドナルドソンは終盤やや持ち直したものの6月が.509、9-10月は.686と大きく下げた(2014シーズンのOPSは.798)。モスは8月のOPSが.548で9-10月が.613(シーズン.772)、ノリスは.560、.642(.763)だ。ほぼ独走かと思われた前半から結局エンジェルズに抜かれてワイルドカードでポストシーズンに進出するまで成績が落ちたのだから、先発投手陣の補強がなかったらと思うとぞっとする。いずれにせよ、怪我であろうが不調だろうが、原因は何であっても、打撃の主力がここまで一気に成績を落とすと前半と後半ではまるで別のチームになってしまった。また移籍したセスペデスも7月はOPSは.573、その後も8月こそ.754と持ち直したが9月は.680なのであまり足しにはならなかっただろう。そういえば新加入のニック・プントもフェルナンド・ロドニーの高めのボールがストライクとコールされてヘルメットを叩きつけて退場させられた際には奥さんが若い頃の自分のおっぱいより高かったとTweetして援護するもキャリア最低の打撃成績で終わってしまった。またジョン・ジェイソはこの数年ずっとシーズン途中で脳震盪とその後遺症により出場できなくなる問題が続いているが、2014年も結局同じように消えてしまった。もう捕手は無理だろう。ところでチームは怪我の多いキャッチャーの補強のため膝の手術からFAとなっていたジオバニー・ソトをシーズン終盤に獲得しているのだが、レギュラーでプレーしていた経験のあるベテランらしくは安心できる試合運びとプレーを見せてくれた。ノリスと比べるとその差は歴然だった。フロントの大勝利だろう。それから打線のテコ入れに特大ホームランか三振か三振か三振というA’sらしいベテランのアダム・ダンを年俸はホワイトソックス持ちで加入させた。ダンは今年で引退する意思を表明しており、現役選手で最も長い期間ポストシーズン経験がない記録を更新し続けていたので温情もあったのだろう。

 と、いろいろあって、なんとかポストシーズンに滑り込むことに成功したA’sは89年以来の進出となるカンザスシティと初のワンゲームプレーオフに臨む。先発は当然レスター、途中まで4点のリードを奪うものの、序盤にキャッチャーのソトが怪我で退場した途端、守備に難のあるノリスが6個も盗塁を許し、決勝点も盗塁で進んだランナーの生還で敗退してしまった。ダン・オテロのボールは確かにシュートしてくるくせ球かもしれないが、ウェストしたボールを落とすのだからノリスの技術には深刻な問題がある。まあ、いい試合ではあったけれど、レスターを獲得して今年こそはポストシーズンを勝ち進む姿を見たかったのに残念な結果となってしまった。あんなに無茶なトレードをしたのだから、来年以降のことなんかどうでもいいとなりふり構わず攻めたフロントの活躍も虚しく、2014年もまたいつものように3年連続でポストシーズンの最序盤でA’sは姿を消したわけだ。何が悲しいって、結局この試合にアダム・ダンは出場していないので、最後までポストシーズンの出場がないまま引退してしまったのだ。

 A’sのファンは負けてもまだ楽しみが残っている。オフシーズンこそがA’sのA’sたる所以なのだ。敗退直後、ビリー・ビーンは今頃息してないんじゃないかと思ったのもつかの間、A’sは次々と大型トレードを敢行する。まだ契約が残っているが年俸調停権を得たチーム最高のスター選手ドナルドソンをブレッド・ロウリーを含む1対4のトレードでトロントへ放出したのを皮切りに、ブランドン・モスを若手ジョー・ウェンドルとの交換でクリーヴランドへ、サマージャをフェグリーやセミアンを含む若手4人との交換でシカゴ・ホワイトソックスへ、そしてノリスを2投手と交換でサンディエゴへとそれぞれ放出してしまったのだから驚きだ。確かにいずれもトレード価値としては最高の時期にあるので最大の見返りを期待できるのだが、それにしても三年連続ポストシーズンに進出したチームをほぼ解体してしまったわけだから大胆極まりない。しかもロウリーをFAで失った後釜のショートにドリューやアズドルバル・カブレラのような有名選手を獲得するといわれていたのが蓋を開けてみれば(失敗しただけかもしれないが)MLBでショートの実績がないセミアンになるサプライズもあり(続報:ジョン・ジェイソ、アリゾナ・フォール・リーグで活躍したダニエル・ロバートソンとマイナーリーグで目覚ましい成績をあげながらアンフェタミンで50試合の出場停止を食らったブーグ・パウエルを放出してベン・ゾブリストユネル・エスコバルを獲得しましたよ)、やっぱりシーズン中より見ていて楽しい。そうそう、中心となる右打者としてビリー・バトラーと三年契約を結んだのも、契約延長のオプションを破棄した元の所属チームのカンザスシティーと比較すると意外な高評価であったため驚きの契約となった。

 結局、昨年やや高くなったチーム総年俸がまた10Mほど下がり、ギャングやスラムで有名な(ドラマ『サンズ・オブ・アナーキー』の舞台でもある)オークランドから富裕層の多いサンノゼに移転する計画も頓挫したまま貧乏球団であり続ける2015年シーズンを迎えることになったわけだが、おそらくマネーボールの第2章となるにふさわしい成功を遂げたこの3年間の体制はいったんここで終わりになり、来年からはまた新たな姿のチームに生まれ変わることになるのだろう。それがうまくいくのか、それとも2000年代後半のような低迷期となるのかはまだわからない。が、それでもこの低予算ゆえに頭と度胸でなんとかしなければならない宿命のA’sは見る者をまた楽しませてくれることは間違いない。

SwiftとTitanium

Objective-Cと並んでiOS用アプリの開発に利用できる言語、Swiftが発表されました。私たち歌と踊りが大好きな陽気で愉快なTitaniumユーザーとしても注目すべきニュースです。

Titaniumとは、ご存知の通り、アプリの上にJavaScript実行環境を用意して、JavaScriptを通じてアプリを実際に動かすネイティブのAPIを叩いてしまうツールです、というとわかりにくいですが、ようするにネイティブのAPIで動作するアプリがJavaScriptで書けてしまう素敵なツールです。インストールガイドを辿るくらいの手間をかけるだけで簡単にセットアップできる上に、Node.jsなどモダンなJavaScriptの知識を活かして大規模なプログラムを作成することも可能です。ややこしい設定もなくiOSやAndroidなどに対応し、慣れたユーザーなら複数のプラットフォームで動作するアプリを短期間で開発することができます。

さて、Titaniumはこれまで、JavaScriptで書かれたプログラムをアプリの上で動作するJavaScript実行環境が評価して、その結果をネイティブな環境とやり取りする仕組みで動作するものでした。しかし、現在開発中の次期バージョン、Ti.Nextと呼ばれている新しいシステムでは、JavaScriptに独自拡張を施した言語で記述するとそれらをObjective-CやJavaといった言語にコンパイルして、文字通りネイティブアプリにしてしまう仕組みが導入される予定です。本当はJavaScriptがそのままObjective-Cに変換できればいいのでしょうが、さすがにちょっと記述するのが難しいので独自の変更が入っています。おそらく、現在JavaScriptとXMLでTitaniumのアプリを作成するAlloyフレームワークがあるので、ユーザーは新しい変な言語を覚えるのではなく、これまで通りAlloyでアプリを作成すれば、その他のツールチェインがよろしく取りはからってくれるよう、いわばAlloyがDSLとして機能するようになると予想されます。Alloy自体はBackbone.jsのModelやCollectionを取り入れたBackbone.js + Underscore.jsみたいな最近よくあるJavaScriptのMVCフレームワークに似たところもあるので、慣れてしまえば結構便利です。

そこへ話題のSwiftの登場となるわけですが、RubyMotionのような開発環境を提供しているサードパーディーのコミュニティは割と早めに反応しているようなので、TitaniumとSwiftのこれからについても、簡単な展望を予想してみたいと思います。このSwift、ざっと眺めたところJavaScriptとかなりよく似ています。少なくともObjective-Cの文法に追随するためのヘンテコな仕組みを必要とせずJavaScriptからのコンパイラも作成しやすいように見受けられます。そのため、特にTi.Nextのような仕組みはiOSに関しては飛躍的にTitaniumに有利になるでしょう。Swiftを覚えなくても馴染みのあるJavaScriptで記述できる上に、単純な仕組みのコンパイル部分を理解すればいろいろな応用が出来るはずです。TitaniumはバックエンドはAndroidやTizenなどプラットフォーム毎に切り離されているので、Titanium自体の開発者にとってはそれぞれに合わせてネイティブの言語でAPI層を構築するのが大変でしたが、その手間がかなり軽減されそうです。そして、それはJavaScriptでクロスプラットフォームのアプリを作成する利用者にとっても大きなメリットになるでしょう。

Titaniumの使い方として、まだObjective-CやAndroidのJavaにあまり精通していない人でも、とりあえず動作するものが作れてしまう利点を最大限に利用して、動くものを作りながら、徐々にプラットフォーム毎の仕組みを理解し、やがてはそれぞれのネイティブな言語での開発を始めるに至るブリッジの役割を求めるケースが最近増えてきているように思われます。そんな意味では、Swiftを活用するのはいったんエキスパートに任せて、JavaScriptからSwiftを利用しつつ徐々に学んでいくのも悪くないと思います。なんといっても動く製品がなければビジネスも何も始められませんからね。

そうそう、METALが発表されましたが、このあたりはLanicaの人たちに頑張ってほしいですね。

StartSSLをEngineYardで使う

SSLの設定といえば

次ハマったらTATOOしかない。

とそれなりの覚悟が必要なことでも知られていますが、子供もいるのでプールや銭湯に入れるように、ブログに書いて次からハマらないようにします。

StartSSLという格安のSSL証明書を発行するサービスがあります。いえ、嘘をつきました。格安じゃなくて、無料です。無料のSSLです。全てのブラウザでサポートされているわけではありませんが、サービスによっては十分なのではないでしょうか。

自分で設定する場合にはStartSSLのマニュアルを参照すればだいたい事足りるのですが、EngineYardのSSLはお作法が決まっているのでメモしておきます。

とはいえCSRの作成なんかはルーティン作業なので詳細は省きます。

# openssl genrsa -aes128 2048 > server.key
# openssl req -new -key server.key > server.csr

StartSSLは1024bitは脆弱すぎるので受け付けません。作成したcsrで証明書を取得します。

StartSSLの申し込み手続きが完了すると、ca_root.pem、ca.pem、ssl.crtが手に入ります。EngineYardのSSLの登録フォームも名称を除けば3つの入力欄があるのでちょうど良さそうですが、そうは問屋がビジネスしません。

ey-ssl-form

ここには、上からssl.crt、CSRを作成したときに用意した秘密鍵を入力します。秘密鍵はパスフレーズを設定してはいけませんので、解除しておきます。

# cp server.key server.key.back
# openssl rsa -in server.key > server_no_pass.key

残る一つの入力欄ですが、ここではまりました。直感的には中間証明書を入力すれば済みそうなのですが、それだけだと不十分です。EngineYardでは特殊なことをしない限りnginxを利用することになりますが、nginxは中間証明書をサポートしないので、サーバ証明書と結合してあげないといけません。StartSSLの中間証明書はこちらから入手できます。Class 1であればこちらをダウンロードします。最後の欄にはこの中間証明書と、先ほど入手したca.pemを結合します。

# cat ca.pem sub.class1.server.ca.pem > unite.csr

EngineYardのmainのChefが実行されると、この入力欄の一番上と一番下が結合されて1つのcrtファイルに加工されます。nginxの設定ファイルにはこの結合されたファイルが指定されることになります。ファイルは/etc/nginx/ssl/以下(/data/nginx/sslとしてバックアップ対象にもなっているようです)に保存されますので、もし心配な場合は上のコマンドをサーバ内で実行して自分で試してもいいでしょう。/etc/init.d/nginx configtestが通れば少なくとも起動はします。

とにかく、これで3つの入力欄が埋まりましたので、保存してアプリケーション画面でSSLを設定、Applyを実行すれば反映されます。正しく設定されたかどうかSSLのチェッカーなどで確認してみましょう。

Titanium™ Advent Calendar 2013

Titanium™ Advent Calendar 2013」12/4はユーザー会の名ばかり会長が担当です。肩書きは偉そうですが、活動といえばもっぱらサポート係をやっています。サポートサイトを見るといつも同じやつがレスつけてんな、と思う方もいらっしゃるでしょうが、趣味なので止めないでください。まあ、まだまだ至らないことがたくさんありますが、今日はそのあたりのことについていろいろとお話しします。

サポートサイト用自動運転ボットと化した自分の手元の環境には常にSupportとSupportAlloyというプロジェクトが用意されています。サポートサイトに質問があると、このどちらかに検証用のコードを書いて試しています。なので、質問の際はAlloyかどうかを書いてもらえると助かります。検証用のプロジェクトの中身のJSは時に数百行になっていますが、これは前の質問の検証用コードをコメントアウトして継ぎ足して使うことが多いからで、実際には数行で動かしています。最近ではsamplemoduleとiOSSampleModuleいうモジュール用のプロジェクトもあります。もちろんモジュールの試験用です。

もうずっとこの活動をしていますが、やっていてよかった点は:

Pros

そんじょそこらの人よりずっと詳しくなった

わからないとソースコードを調べることができるのがFOSSのいいところなので、質問を受けてわからなければObj-CやJavaのレベルまでなら降りて調べています。そのためずいぶんとTitaniumの中身について詳しくなりました。逆に、おそらくAptanaの抱える権利関係のあれやこれやで公開されていないTitanium Studioなど普段Eclipseも使わないのでこれっぽっちもわかりません。

SDKに勝手に手を入れてオレオレSDKを作るのはあまりおすすめできるやり方ではありませんが、慣れてくるととても簡単なのでついついやってしまうんですよね。それが割と気軽に出来るのも、日頃のサポート活動のお陰だと思います。

さらにいうと、これのお陰でJavaだろうがObj-Cだろうが普通のアプリくらいなら書けるようにもなってしまいました。なので、これからアプリ開発を始めたいというウェブ開発者のみなさんには、入門としてTitaniumというのはそう悪くない選択肢だし、学びながらも結果を出せるところもいいよとお勧めしたいです。

知らない機能を触って練習できる

iOSもAndridもこれだけ豊富な機能を備えているのですから、案件や自分のアプリで要求されない限り触れることはない機能はたくさんあると思います。サポートサイトをやっていると、擬似的に案件を受注するようなものですから、いい練習になります。それに、たとえわからなくても、案件と違って失うものは何も無いので、社会的信用に関わると震え上がる必要はありません。一度でも触ったことがあるAPIならともだちだよね、という感じで口笛吹いて空き地に出かけてもいいと思います。

ときどき仕事になる

これは思わぬ副産物ですが、最近ではサポートサイトには出せないので案件として改修を受注するケースが増えてきました。基本的には副業なのであまり深くコミットすることはありませんが、普及活動として基本的には知っている情報は目一杯お伝えすることにしています。おそらく今後もこのようなケースは増えるでしょうから、サポートサイトでも有償の案件として開発者を募集する仕組みを導入するのがいいかなと考えています。サステイナブルなサポートはマネタイズできるスキームがASAPに明後日の方向へWIN/WINがマストなお部屋探しです。ジャストアイデアですが。

あと、来年からTitaniumの講習を都内で平日夜に定期開催するかもしれません。詳しいことが決まり次第お知らせします。

「Titaniumの人」になれる

お歳暮にハムを贈るだけでハムの人にはなれますが、Titaniumを贈ってもなかなかそうは呼ばれません。しかしユーザー会を立ち上げたりサポートサイトを運営していると、開発者向けのイベントなどにお呼びがかかることがあります。大変ありがたいことです。この2月にイベントのために急遽作成したユーザー会の名刺も年内に全て配り切ってしまいました。やはり、なんだかんだといって、エンジニア同士は横のつながりがとても大事です。今後も可能な限りいろいろなところに出向いていきたいと思います。しかし、本当はもっと全国のイベントに参加したいのですが、なにぶん当方とても貧乏な3人の子持ちのフリーター40歳なのでそれほど潤沢に自由な時間とお金があるわけではありません。そこで、ユーザー会のみなさんにも、もし積極的に関わって頂けるのであれば、もう勝手に支部長とか名誉会長とか本家とか裏組織とか北斗琉拳とか自由に名乗っていただいて結構なので、是非Titaniumの人として各地のイベントに出没してください。

もくもく会でも、知らない方に声をかけて頂けるとそれだけで横の世界が広がっていくので、ありがたいことです。

Cons

と、いい面ばかりを強調しましたが、それはもちろんこの後に課題を挙げるためです。先にいいことを書くのは文章作成の基本だそうですから。

サポートサイトを運用していて気づいたのですが、この広い世の中にはサポートサイトにさえ辿り着かずに消えていく・不満を抱えたまま別のプラットフォームに鞍替えしてしまうケースがたくさんあるようです。いくつかよくあるパターンを挙げてみると:

インストールが出来ない

Titaniumは、いうなればmoving targetなので、常に変化しています。新しい機能を追加する方が優先で、UIの固定などにはあまり興味がありません。そのため、インストールの方法も変化しています。ウェブ上にはたくさんの情報があり、少し検索するだけでたくさんの詳細な(時には動画まで用意された!)インストール手順が見つかります。しかし、当然ではありますが、それらはTitaniumの変更に合わせてアップデートされているわけではありません。そのため、せっかくTitaniumを試してみようとしても、ここで困惑してしまい先に進めない方も大勢いらっしゃるようです。この状態でユーザー会のサポートサイトに来る人はあまりいませんので、大変残念な結果となってしまいます。

ちなみに、Titaniumの書籍をものすと直後に何かしらUIの変更があるというのはジンクスとなっています。

この問題を解決する方法は、ユーザー会としてメンテナンスするインストール手順のページを用意することだと思います。と書くと簡単なようですが、実はこれは結構面倒くさい作業です。ユーザー会でアクティブに活動するような人たちはたいていそれなりのスキルを備えていて、インストール時に経験した問題など自力で解決してしまうことがほとんどです。またTitanium歴が長ければそれだけ最後にインストールしたのはずいぶん昔だったりするので、今更どうやったのか思い出すだけでも一苦労です。おそらく理想的なのは、開発よりも開発環境そのものに興味があり、クリーンインストールしても惜しくない環境を維持できている人材なのですが、そうそう見つかるものではありません。もし我こそはという方がいらっしゃれば、ユーザー会の方でWikiページを用意したので、是非インストール方法を解説するページを作ってもらえるととても助かります。

いまさらっと書きましたけど、ここすっごい大事ですよ。Wikiなのでみなさんのご協力があればとてもいいことがあると思うんですよ。@donayama さんが作ってくれていた過去の資料なんかも統合できれば最高じゃないですか。

どうやって書いたらいいかわからない

一時期、まだTitanium黎明期の頃、おそらく2年か3年くらい前に、「私はこう書いている」というエントリがいくつか立ち上がり、Titaniumでアプリを作るにはそもそもどういうやり方をするのがベストなのかをユーザー同士で探り合っていたのを覚えています。上のインストールと同じく、実はTitaniumで書くJavaScriptについても推奨されるやり方はいくつかの変遷を辿り、今日ではおおまかに2つのパターンに収斂してきたといっていいでしょう。これも、ウェブ上のドキュメントでメンテナンスされ続けているものがなく、古い情報が残ったままになっているので、なんとかしなければいけない状況です。最近、仕事としていくつか既存のプロジェクトのソースコードに触れる機会があったのですが、半分くらいは古い資料を元に構築してしまい困っているケースでした。もうある程度動いているプログラムを根本的に改修するのは基本的に愚かなことなので対症療法的になる方がいいはずなのですが、この場合はどうしても根治療を目指さざるを得なくなるので困ったものです。

今後のあらゆるTitaniumのプロジェクトは、Ti.Includeを決して使わず、塩分控えめなシングルコンテクストで書くべきであり、それほど複雑なものでなければなるべくAlloyを使うべきでしょう。Ruby on Railsはもうずいぶんと長いことウェブアプリケーションフレームワークの中でも最も影響力のある立場にありますが、初心者向けのドキュメントが熱心にメンテナンスされていることでも特筆すべき存在です。書籍もずっと改訂されており(まあそれだけ売れてるってことなんでしょうね)、見習いたいと思います。

もし可能であれば、お題を決めて一緒にアプリを作るイベントとかやるといいかもしれないですね。嫌らしい話をすると、本来は公式トレーニングがこの役目を果たすべきなのでしょうが、とってもお高いですし、なんといっても今年から国内では提供されなくなりましたので、もうユーザー同士でなんとかしてしまうしかないと思います。親切なことに教材は公開されていますからね。

大きな声で繰り返しましょう、もっと大きな声で!:

  • Ti.Includeは使わない!
  • createWindowにurlプロパティは使わない!
  • ループの中でfunctionを作らない!
  • グローバル空間を汚染しない!

猿があなたを見つめています。

* ユーザー会の方でWikiページを用意したので、この辺も載せていきたいですね。

他人のせいにしたい誘惑

もう何年も前のことですが、とある会社内でTitaniumについて本国のベンダに問い合わせしたい項目を募集したところ、集まってきた答えに愕然としたことがあります。例えば「JavaScriptではtrueになるはずのif文にtrueが返らない不具合がある」といったものがずらずらと並んでいたのです。仕組み上、JavaScriptを実行している部分は既存のV8などなので、まあ間違いなくお書きになったJavaScriptの方が間違っているわけですが、案件で切羽詰まっているとついつい「自分のせいじゃない」と主張したくなってしまうのが人間というものです。その点、TitaniumはObj-CやJavaのAPIを抽象化している存在なので、開発者から見れば問題はそこにあるに違いないように感じられるものですから、うまくいかないときはすぐに集中砲火を浴びる性質があります。もちろんここに不具合がないというわけではなく、それどころか結構○○なこともよくあったわけですが、それでも、ちょっと考えればソースコードは全部見られるのですから調べればすぐにわかります。またググるだけで結構な情報が得られることにもすぐ気づくと思います。というわけで、私は個人的にはもちろんTitaniumにも欠点はあり、そこから離れてしまうユーザーもいるのは当然で、むしろ卒業みたいな感じで飛び立ってくれるならたとえ大恩あるChatWorkさんでも喜んでお見送ります(qnypは許さないといっているわけではありません)。しかし、ロクに調べもせずに他人のせいにしたい誘惑に駆られただけの文句であれば、世論と予算が許す限りは顔を出してちょっと待ったとお節介にも口を出します。お代を頂ければコードも出します。研修だってします。JavaScriptへの愛が足りない人間には容赦しない、これは鉄則です。繰り返します。汝の隣人と汝自身より少しだけ多くJavaScriptを愛しなさい。猿があなたを見つめています。

というわけで、駆け足に振り返りすぎていろいろ振り切ってしまいましたが、来年はもう少し活動領域を広げて、開発の方にも力を入れていきたいと思います。なんと今年はモジュールばっかり書いて全くアプリを作っていないんですよね。モジュールのサンプルアプリしか書いていない。他人のJavaScriptって基本的には誰にとっても読むのは苦痛ですが、そんなことばっかりやってたらよろしくないので、たまにはひっでえJavaScriptを恐れ多くも他人に読ませる側にまわりたいと思います。わっはっは、誰も恐怖からは逃れられないのだ。

明日は @h5y1m141 さんだよ!猿があなたを見つめています。

Windows AzureでCentOS

今日、「クラウド電話API!Twilio API 勉強会 Vol.10 @東京」のイベントでちょこっとお手伝いと宣伝+自慢に行ってきたのですが、Microsoftさんのご好意によりWindows Azureのお試しアカウントを頂きました。IISの運用経験がほとんどないので、いったいどうしようかと思っていたのですが、お話を伺うと別に普通にCentOSも動くということなのでさっそく動かしてみました。Azureのイベントということで、なんか萌えキャラとかばんばん見せられたらうんざりと思っていたら、そんなの一瞬たりとも出てこなかったので大変好感を持ちました。まあAzure自体がまだ英語のままの部分もあったりして日本ローカルの部分は少ないっぽいんですが、そのお陰でセットアップまで一度も幼稚なアニメキャラとか見ないで済みました。すばらしいです。

Azure上の仮想サーバの作成自体はめちゃめちゃに簡単です。事前準備としてSSHでのログインに鍵認証を利用したかったので事前にopensslでcerまたはpam形式の鍵ペアを作成しておくといいでしょう。

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out cert.pem
$ chmod 600 private.key
$ openssl  x509 -outform der -in cert.pem -out cert.cer

ダッシュボードで仮想マシンを作成します。下の方に新規追加ボタンがあるので「コンピューティング」→「仮想マシン」→「ギャラリーから」を選択すると「OpenLogic」としてCentOSが表示されます。

azure1

OpenLogicというのはCentOSのサポートなどを提供する会社だそうです。こいつを選択して、上で作成したキーの公開鍵の方を登録すれば準備完了です。しばらく待てばサーバが起動するので(デフォルトでSSHのポートが開いています)、早速ログインしてみましょう。サーバはデフォルトで○○.cloudapp.netという名前で公開されるようです。好きな名前をつけてください。最初のユーザーアカウントもここで決めることが出来ます。

$ ssh -i private.key your_name@○○.cloudapp.net

これでいつものCentOSにログインできます。特にサービスは起動していません。また外部からの接続もSSHのポートしか開放されていないので、このままでは何も出来ません。iptablesが起動しているのですが、Azureの環境自体でインバウンドのアクセスはコントロールできるので、細かい制御をしない場合はiptablesを落としてしまってもまあ大丈夫です。

が。困ったことにビルド関連のツールが一切入っていません。そこでyumでインストールしようと

$ sudo yum groupinstall 'Development Tools'

を実行してみたのですが、kernel-headerのバージョンがどうこうといわれてエラーになってしまいます。というのも、デフォルトでyumはkernelを除外するようになっており、その設定を変更しないといけないからです。/etc/yum.confには

exclude=kernel*

としっかり記述されているので、これを

#exclude=kernel*

に書き換えるとインストールできるようになります。なぜ除外されていたのかわかりませんが、開発関連のツールのインストールが終われば元に戻しておいてもいいでしょう。

ここまで来たら、あとはいつもの作業です。nginxやrbenv、bundlerやrailsをインストールするともうほとんど完成です。めでたしめでたし。

おっと、1つ忘れてはいけないことが。Azure上の仮想マシンの一覧から作成した仮想マシンを選択し、その管理画面からエンドポイントを選択します。デフォルトではSSHしか開放されていないので、ここにHTTPを追加してみます。

endpoint

しばらく待つと設定が完了し、リモートから80番ポートへのアクセスを受け付けるようになります。

これで準備が完了しました。あとはAzureのストレージを利用するgemなんかを試してみると面白いかもしれません。