クリスマスにRubyを〜RubyMotionでTwitterクライアント

いよいよクリスマスです。何の因果か毎年、クリスマスって連休とかぶりますよね。国が仕向けているのか因果律の結果なのか、みなさんクリスマスの予定やらコミケのカタログチェックなどで大忙しでこんな記事読んでる暇なんてないでしょうけど、RubyMotionの話です。

この記事は RubyMotion Advent Calendar 2012 の22日目の記事です。

久々にiOSのアプリ書いたので、かなり忘却しており、リバビリがてらRubyMotionの勉強もかねて、Twitterクライアントでも作ってみるかと思い、作ってみました。機能的にはたいしたこともなく、起動時にPinでOAuth認証してから、テーブルビューに#rubymotionの検索結果を表示、フォトアルバムから選択して画像投稿もできるという簡単なものです。

https://github.com/kazhiramatsu/motion-oauth.git

 
app/constant.rbのCONSUMER_KEYとCONSUMER_SECRETを設定してからrakeで起動します。アクセストークンをキーチェインに保存します。テストもろく書いてないのでアレですが、雰囲気は伝わるかと思います。
 
さてRubyMotionで開発するにあたって困るのは、既存のgemが使えないことです。標準ライブラリですら使えない。酷いよ酷すぎるよこんなのってないよ。これじゃObj-Cで書いても大して変わらないよ、と投げ出しそうになりましたが、cocoapodsでObj-Cで作ったライブラリを何ら手を加えることなくRubyコードとして呼び出せるので、RubyMotion凄いです。
 
さて、Twitterクライアントで問題になるのがOAuth認証です。Twitter API 1.1からOAuth認証が必須になります。OAuth 1.0 は自力でやると複雑なのでなんらかのライブラリを使うというのが定番ですが、Obj-CでOAuthのみに特化して使いやすそうなライブラリがありません。せっかくなので自作しました。車輪の再発明です。仕事では絶対しせんが。詳しくはソースを見て下さい。。ただHMAC-SHA1の処理とキーチェインに保存する処理はObj-Cで記述しました。このあたりもcocoapods化しないといけないですね。
 
細かいところでRubyMotionの気になった箇所などを。
 
1.Obj-Cの型チェックがなくなったせいで、typoなどで簡単に落ちます。実行しないとエラーとわからないので、落ちる回数はObj-Cよりかなり増えました。これは地味にイライラします。Xcodeなどを使うとコンパイルが通ればその手のエラーは起きないので。なのでテストは必須でしょう。
 
2.Cライブラリ形式の関数が直接呼び出せない。Securityライブラリの関数などはよく使うので、これは自分でObj-Cでラッパークラス書いて取り込むという感じになります。
 
3.コンパイルするファイルの依存関係をある程度自力で管理しないといけない。includeで外部ファイルのクラスを取り込むときは、自力でロードする順番を管理したりしないといけない。
 
このあたりが改善されれば、より使いやすくなっていい感じになるかなと思います。
 



YAPC::Asia 2012

非常に素晴らしかった。

個別のトークが素晴らしいのはもちろん、941さん、牧さん、スタッフのみなさんの連携が本当に素晴らしい。

YAPC::Asia 2010でスタッフをさせて頂いたが、その時よりもはるかによくなっていると思う。

懇親会の食事もすごくおいしくてびっくりした。

以前は、懇親会というとケータリングっぽいものだった気がするけど、今回はホテルのバイキングみたいな感じだった。

トークに関しては、ガチガチのPerlについてのトークは控えめで、多言語でも応用できそうな実践的な内容と初心者向けの内容とでうまくバランスがとれていると思った。

やはりPerlはピークを終えてるのは間違いなく(あくまで企業が使う言語という意味で)、Webアプリに関して言えば、一部のこだわりを持っている会社以外では、90%以上がPHPを使われているように思う。

LTではPHPerの人や多言語メインの方も多く見られて、時代に合わせてYAPC自体も柔軟に変わるところもPerlっぽいと感じた。

Perlだけにこだわってると、ここまで多くの人を呼ぶことはできなかったかなと思う。

業務でPerlを使っている会社が減っているのは間違いなく、そこは少し寂しいし、なんとかしたいと思いつつもなんともできない歯がゆさも感じる。

個別のトークでいうとgperlの話が面白かった。

perl5を再実装するという内容のもので、konohaという静的スクリプト言語を開発していた方がperlの勉強をするために実装し始めたというもの。

jitをサポートして高速に動作する、lua-jitやmrubyなどでも一部採用されているNaN boxingという手法を使って、数値計算などを高速に実行できるのが特徴のよう。

perlは、数値でもSV構造体分、メモリを使うのでメモリ効率は良くない。NaN boxingを使えば数値に関しては、メモリをallocする必要がないので、メモリ効率が非常に良い。

perlの仕様は複雑で完全に仕様を満たすものを作るのはかなり大変だと思うけど、数値計算や一部の動作に特化したものとして使うのもありなんじゃないかと思った。

そしてなんといってもLTthon。

最初、LTする人ってそんな簡単に来るかな?と思っていたけど、YAPCに来るような人はそんな心配は無用だったよう。

結果として、常に誰かが発表している状態で大盛況。自分も発表しました。

ただ盛り上がりすぎて、注意される一面も。

本編のトーク会場の横だったので、笑い声が思いっきり聞こえてましたね・・・。

LTthonで発表した人は、ほとんどPerl使ったことない人が多くて、それも盛り上がった原因だったかと思う。

一番良かったのはやはり本編のLT。

久々に腹が痛くなるほど笑った・・・。

他のカンファレンスでもLTが一番おもしろいことが多いと思うけど、YAPCのLTは漫才でいうとホントM-1かと思うレベルでそのへんのお笑い芸人より遥かに面白いし、技術的な内容も高いものからネタ的なものまで幅広くて、最高です。

もちろんこの笑いが共有できるのは開発者だけなので、ほんと開発者という道を選んでよかったと思う。

最後のtakesakoさんのLTは、なんというかこれぞLTというかLTの教科書に載せてもいい。

1+1という文字列の連結するというプログラムをPerlPHPPython、node.jsを使って数万回、数十万回繰り返して実行時エラーを起こさないものが勝ち残っていくというトーナメント方式での言語対決。

順調にPerlが勝ち残って最後、決勝でnode.jsが出てきたときは、会場全体が「こいつはダメだ。勝てない」と思ったはず。まさに絶望。最後で負けるんかい・・と。

だがしかし!最後までPerlはやってくれました。みごとnode.jsに打ち勝ち、最強の言語の称号を得たのでした。

ほんとちょっと最後泣きそうになった。

笑いと感動を与えてくれる、それがYAPC

来年も期待しています。

screenからtmuxへスイッチ

しばらくscreenの縦分割機能が便利だったので使っていたんですが、gccとかでコンパイルするときに画面が崩れまくって、お話にならなかったので、かねてから噂のtmuxにスイッチしてみた。

インストールは、ソースから入れました。最新版(1.3)だとlibeventに依存しているようで、yumなりapt-getなりでlibeventをいれてから、いつものようにconfigure、make、sudo make installでOK。

で、基本的にはscreenと変わらない。
256colorにしたいのとprefixをC-tにしたかったので、TERM=xterm-256colorにして、~/.tmux.confに以下を記述すればOK

set-option -g default-terminal xterm-256color
set-option -g prefix C-t
unbind-key C-b
bind-key C-t send-prefix

縦分割は、-%でできます。
(この場合、-%)

Starmanベースで構築した新サービス「Saizen」リリース

久々のエントリが宣伝で申し訳ないのですが、「Saizen」というiPhoneアプリをリリースしました。

位置情報を使って、iPhone上で再生している曲情報をGoogle Maps上に表示します。

Map上でピンがたった場合の曲情報を収集して、地域別のランキングや曲ごとのユーザーランキング、ユーザーのお気に入り登録などができます。

まだ、リリースしたばかりで、ユーザーも少ないので、ぜひダウンロードしてみてください。

f:id:kaz_hiramatsu:20100629174351j:image

http://itunes.apple.com/jp/app/allotme/id376637760?mt=8

肝心のアーキテクチャですが、Appサーバーは、amazonEC2環境で、Server::Starter + Starman + daemontoolsで運用しています。

DBサーバーは、MySQL5.1、innodb pluginでBarracudaを使っています。

モジュール類は、全てcpanmを使ってアプリケーションユーザーのhomeディレクトリにインストールしています。

Appサーバーは、PlackベースにRouter::Simple、DBIx::Skinnyを利用した簡易フレームワークもどきを作りました。

今後は、Twitter連携なども視野に入れています。
(類似のiPhoneアプリで言うと、now playing songみたいなもの)

このアプリをリリースするにあたり多くのPerlモジュールを使用しました。
改めてPerlコミュニティのみなさんに感謝したいと思います。

今後、amazonEC2環境でStarmanの運用方法やらのノウハウも少しずつ紹介していきたいと思います。

Perl is unDead

Perlは終わってもいないし、Perl6に関しては、まさにこの瞬間も開発されてる。

Perlはもう終り? | | プログラマ2.0日報 | あすなろBLOG

1. 言語仕様が汚い。

この点に関しては、スラッシュドットのラリーのインタビューを読めばPerl設計思想がよくわかる。

本家インタビュー:Perl開発者ラリー・ウォール | スラッシュドット・ジャパン

コンピュータ言語で僕が最も欲しいと思うのは、幅広いダイナミック・レンジだから。汚くって低級な要素とオシャレで高級な要素の両方を兼ね備えている言語を僕は求めている。赤ちゃん語でもオトナの喋りでも受け容れるような言語が欲しい。他の言語では、そういったレベルの違いがひとつに均されてしまう傾向にある。

ここで重要なのは、「赤ちゃん語でも」ってところ。他のプログラム言語では挫折したけど、Perlでプログラミングの世界に入ったという人は多いのではないだろうか。

自分は、プログラミングはCから入ったけど、まともにCでプログラムをかけるようになるには、1年ぐらいかかった。最初にPerlを学んでいれば、こんなに苦労することもなかったなあと思う。

言語仕様が汚いと言ってる人は、たいがい他のプログラム言語をある程度マスターしている人が多い。自分がマスターしている言語仕様を基準に考えてしまうからそう感じるんだろうけど、Perlの持つこの赤ちゃんから大人まで受け入れられる性質のおかげで、ここまで幅広いユーザーに受け入れられたのだと思う。

変数はすべてグローバルで特に宣言した場合だけローカルになる...というあたりの仕様は、そりゃインタプリタの実装は楽チンだろうけども、美意識(とミスしにくさ)には欠けるよね。

これもラリーのインタビューを読むと実装が駱駝からだとかそんな理由でないことがわかる。

詳しく言うと、Perl 6に暗黙のレキシカル・スコープを採り入れないことにした主な理由は、Rubyの例があったからだと言っておかねばならない。僕たちは、明示的なmy宣言にこの先もこだわっていたい。


Rubyで僕が一番問題だと思うのは、暗黙のレキシカル・スコープがそうであるように、「驚き最小の原則」が人を迷わせるということだ。問題は、ひとは誰の驚きで悲観するのか、ということ。上級者は初心者とは違うことに驚くし、小さなプログラムを大きく育てようとする人は、最初から大きなプログラムを設計する人とは違うことに驚くのだ。

Rubyの「驚き最小の原則」は今や死語になったけど、人によっては暗黙のレキシカル・スコープはわかりにくいとラリーは考えてる。だから、明示的にmyをつける。

実はこれ、Perlの一番好きなところだったりする。異なるスコープで同じ変数名を使う場合とかに特に効力を発揮するし、変数がどこで最初に宣言されたのかってのが明示的だとプログラムがすごい読みやすい。(と自分は思う。)あと、同じ変数名でスカラー、配列、ハッシュと書き分けられるところも分かりやすいと思う。

2. 後付けのオブジェクト指向。何かヘンテコなやり方です...神の祝福が要る(bless)わけですが、「神の祝福」って何だろ?

この点に関しては、変だと言われれば認めざる終えない。

ただ、やはりやり方はいくらでもあって、最近だとMooseを使えば、少なくとも他の言語に勝るとも劣らないオブジェクト指向ができる。メソッド呼び出し前後のフックとかは他の言語ではなかなかできないんじゃないか。

3. 5.8(2002年) でマルチエンコーディングに(実質上Unicodeに)ようやく対応。これはタイミング的にはちょっと遅れを取った感が否定できなかったです....

Javaよりかは早いんじゃないでしょうか。JavaのStringクラスは、UTF-16で符号化されてるらしいので、JavaでまともにUnicodeを扱おうと思うとcodePointAtとか使わないといけないようだし。

Perl6 は登場(そりゃ現在でも Haskell で実装された Pugs はありますが...)しても全然普及せずに、Perl5 だけ「レガシー資産」扱いで細々とメンテされる

確かにPerl6が出てもすぐ普及するってことはないかもしれない。ただし、Parrotを使えば、Perl5もPerl6も同じバイトコードへコンパイルされ、全てParrot上で動作するようになるので、どのPerlを使うのかは全く考えなくてもよくなる。Perl6からPerl5を使ったり、Perl5からPerl6を使えたりする。

ちなみにParrotは、来月にようやく1.0がリリースされる。


Parrot VM

Perlが盛り上がるきっかけになればいいな。

YAPC::Asia 2008について

YAPC::Asia 2008にスピーカとして参加させていただきました。
スライドは、以下の場所に置いてあります。

http://www.slideshare.net/kaz_hiramatsu/parrot-compiler-tools

今回初めてYAPCに参加したのですが、改めてPerlコミュニティの凄さ、面白さを体感しました。
どのスピーチも面白かったのですが、2日目のMichael SchwernのPerl Is unDeadが特に良かったです。
Web1.0の覇者は、Perlだったけど、Web2.0には付いていけなかった。
回りからまだ、Perl使っているのとよく言われるけど、Perlはまだ死んでいない。
CPANにアップされたモジュール数やカンファレンスの数がそれを証明している。
でも、Perlのコミィニティは内に閉じている。
もっと違うコミュニティに積極的に参加していろんなところから知識を学ぼうという内容。

あと、Folk Programming。
誰に教わることなく自分でソースを読み、書く。
素人のミュージシャンがFolk Songを作るかのようにプログラミングを楽しむことが大切。
でも、今のPerlは、Folk Programmingではない。

Perlとそのコミュニティの良い点、悪い点をユーモアを交えつつ楽しく聞くことができました。
こんなプレゼンできるようになりたいなぁ。
ちなみにunDeadだから、ゾンビネタだったのかと後になって気付いた・・・。

既に色んな人が言っていますが、PHPRuby全盛の中、Perlのカンファレンスに500人もの人間が集まったというのは凄いことだと思います。
実行委員会の皆さん、本当にありがとうございました。
来年は、ぜひ京都(?)で参加したいと思います。!!

Perl6バイナリを作る

先月リリースされたParrot 0.6.0を使って、Perl6のバイナリを作ってみました。
以下、その手順です。

まず、http://www.parrotcode.org/から最新のソースをダウンロードして、
Parrotをmakeします。

$ wget http://www.parrotcode.org/release/devel
$ tar zxvf parrot-0.6.0.tar.gz
$ cd parrot-0.6.0
$ perl Configure.pl
$ make

インストールした環境は、colinux上のdebianですが、
以下のパッケージを追加でインストールしました。

$ sudo apt-get install libc6-dev

次に、Perl6をmakeします。

$ cd languages/perl6
$ make

Perl6バイナリを作るには、以下のコマンドを実行します。

$ cd ../../
$ ./pbc_to_exe languages/perl6/perl6.pbc

以上の作業で、Perl6のバイナリがlanguages/perl6配下に作られます。

Perl6のテストは、languages/perl6/tにあるようですが、
動くのは、基本的なsyntaxのみでclassとかは、まだ動かないようです。

テストを実行するには、以下のようにします。

$ cd languages/perl6
$ ./perl6 t/01-sanity/01-tap.t

Perl6バイナリを使わずに、parrotを使って、
Perl6を実行するには、以下のようにします。

$ cd ../..
$ ./parrot languages/perl6/perl6.pbc languages/perl6/t/01-sanity/01-tap.t


.pbcという拡張子のファイルは、Parrot Bytecodeの略で、
Perl6をバイトコードにコンパイルしたファイルのことです。

しかし、Parrotって、まだ0.6.0なんですね。
Perl6の正式リリースには、あとどれくらいかかるのだろうか・・・。