地獄のジェネレータ: Ruby Advent Calendar jp: 2010の24日目 - 2010-12-24 - ククログ

ククログ

株式会社クリアコード > ククログ > 地獄のジェネレータ: Ruby Advent Calendar jp: 2010の24日目

地獄のジェネレータ: Ruby Advent Calendar jp: 2010の24日目

注: この記事にライセンスは設定されていません。

これはRuby Advent Calendar jp: 2010の参加エントリです。前日はysakakiさんでした。

今年のAdvent Calender界隈では惚れさせを集めたり惚れさせを作ったり忙しい人でも惚れさせを見れるようにしたりしているので、もう一歩先を行くことにしました。

地獄の名札ジェネレータ

名札には名前を大きく書きましょうジェネレータに「地獄モード」が追加されました。

地獄の名札ジェネレータ

これを使うと札幌Ruby会議03のプロの無職を楽しむことができます。

戦力外(フォントはIPA Pゴシック)

ちゃんとした会社員

地獄のコマンドラインジェネレータ

地獄の名札ジェネレータはTwitterのプロフィール画像や説明文から惚れさせ名札を生成します。フォームに自分のTwitter IDを(カチャカチャカチャ…)と入力して(ッターン!)と「生成!」できるのでお手軽ですが、もっと惚れさせるために試行錯誤したい場合は少し不便ですね。

エンターキー

ということで、ささたつさんが作ったmisawa gem画像生成に対応させました。

% sudo gem install gtk2
% wget https://github.com/kou/misawa/raw/master/lib/misawa.rb
% wget -O misawa_background.jpg http://a2.twimg.com/profile_images/461389564/aaa.jpg
% ruby -r misawa -e 'misawa("俺ってそんなに\n唐揚げとたいやき食べてる\nイメージあるー?\n\nそれどこ情報?どこ情報よー?")'
% display misawa.png

どこ情報?

縦書き

名言はPangoとcairoで描画しています。この2つのフリーソフトウェアを組み合わせることにより日本語の縦書きも描画できます。「ー」など単純に回転させるだけだと問題が起こる文字も、フォントが対応していれば1きちんと描画できます。

ポイントはPangoGravitycairo_rotate()です。

Pangoにはpango-viewというPangoのオプションを簡単に試せるツールがついています。これを使ってオプションの効果を確認します。

まず、そのまま描画した場合です。横書きになっていますね。

% pango-view --output normal.png --font "MotoyaLMaru 48" --text "つれーわー"

実質(そのまま)

次に、PangoGravityにPANGO_GRAVITY_EASTを指定した場合です。横に転がっていますが縦書きになっています。

% pango-view --output east.png --font "MotoyaLMaru 48" --text "つれーわー" --gravity east

実質(PANGO_GRAVITY_EAST)

ここまでくればあとは実質回転させるだけだからつれーわー。最後に、-90度回転させれば縦書きが完成です。

% pango-view --output east-rotate.png --font "MotoyaLMaru 48" --text "つれーわー" --gravity east --rotate -90

実質(PANGO_GRAVITY_EASTと-90度回転)

この縦書き機能はPango 1.16からサポートされています。Pango 1.16は2007年にリリースされているので、4年くらい前に見て、一番先に飽きた人もいるのではないでしょうか。

もちろん、Ruby/PangoでもPangoGravityを使うことができます。具体的な使い方は名札ジェネレータmisawa gemを見てください。misawa gemの方がシンプルでわかりやすいでしょう。

名言を描画するところでは、文字を縦書きで描画するだけではなく、縦書きの文字に白い影もつけています。そのあたりのやり方もソースを見ればわかるでしょう。

まとめ

惚れさせるために必要なRubyで縦書きを描画する方法を紹介しました。みなさんもRuby/Pangoとrcairoを使って縦書きなクリスマスカードや年賀状をRubyで生成してみてはいかがでしょうか。

明日のRuby Advent Calendar jp: 2010tmaedaさんです。最後なのでとてもすごいのがくるはずですよ!

  1. たぶん。フォントによって問題が起きたり起きなかったりするから。