僕は発展途上技術者

長野新幹線に乗っている間に Rails プラグインを作ってみる

東京 - 長野間は約1時間40分。その間に Rails プラグインを作り、公開して、ブログまで書けるかやってみました。


作るプラグインはとても簡単。


帳票などの機能を作っていると、日付や時刻を年度で考えなければならない、ってときがあります。

そこで、DateやTimeクラスを拡張し、fiscal_yearというメソッドを追加して、



% script/console

Loading development environment (Rails 2.2.2)

>> Date.new(2009, 3, 31).fiscal_year

=> 2008

>> Date.new(2009, 4, 1).fiscal_year

=> 2009


のように年度を返すようなことをやっていたのですが、これをプラグイン化してみました。


13:24 東京駅出発。


パソコンをリュックから取り出し、準備万端。


上野駅到着。


script/generate plugin fiscal_year


でプラグインのひな形を作成。


う、emobile つながらない。ま、いいや。とりあえずすでに config/initializers 以下に置いて利用していたコードをコピーします。


ほとんどコピペですむので早くもプラグイン完成。



% script/console

Loading development environment (Rails 2.2.2)

>> Date.new(2009, 3, 31).fiscal_year

NoMethodError: undefined method `fiscal_year' for Tue, 31 Mar 2009:Date

from (irb):1


ありゃ NoMethodError。


init.rb に



require 'fiscal_year'


と書き忘れてました。



% script/console

Loading development environment (Rails 2.2.2)

>> Date.new(2009, 3, 31).fiscal_year

=> 2008

>> Date.new(2009, 4, 1).fiscal_year

=> 2009


OK。ほぼ完成。


README を書く。


大宮駅でやっと emobile つながった。


github にレポジトリを作り、表示された以下の指示の通りに実行。



mkdir fiscal_year

cd fiscal_year

git init

touch README

git add README

git commit -m 'first commit'

git remote add origin git@github.com:champierre/fiscal_year.git

git push origin master


git push origin master で、公開準備も整った。


写真をぱしゃり。


20090403135648.jpg


サンプルアプリから、githubに置いたプラグインをインストールして実行してみる。



script/plugin install git://github.com/champierre/fiscal_year.git


テストを書き足す。


» The Complete Guide to Rails Plugins: Part II | Ruby on Rails for Newbies


を参考に。


A surprisingly large number of plugins have no tests at all.


と揶揄されている。僕は書くぞー。


なんの進展もないまま高崎に着いちゃった。


山がみえてきた。トンネルも多いし、これはやばい。emobile 切れそう。


軽井沢につくころ、ようやくテストが通った。


テストの冒頭に書く



require 'test/unit'

require 'test/test_helper'

require File.dirname(__FILE__) + '/../lib/fiscal_year'


あたりでつまづいていた。


レポジトリに再度プッシュ、サンプルアプリからもう一回プラグインをインストールして、テストまで通るか試す。



% script/plugin install git://github.com/champierre/fiscal_year.git

Initialized empty Git repository in /Users/ishihara/rails/sample/vendor/plugins/fiscal_year/.git/

remote: Counting objects: 19, done.

remote: Compressing objects: 100% (15/15), done.

remote: Total 19 (delta 1), reused 0 (delta 0)

Unpacking objects: 100% (19/19), done.

From git://github.com/champierre/fiscal_year

* branch HEAD -> FETCH_HEAD

% cd vendor/plugins/fiscal_year

% rake test

(in /Users/ishihara/rails/sample/vendor/plugins/fiscal_year)

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -Ilib:lib:test "/Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/fiscal_year_test.rb"

Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader

Started

..

Finished in 0.00118 seconds.


2 tests, 2 assertions, 0 failures, 0 errors


ok。完成。


残り時間は急いで、このエントリーの下書きを書く。酔いそう。


エントリーも完成。


15:04 長野駅到着。


FiscalYear プラグインは以下で公開しています。


» champierre's fiscal_year at master - GitHub


「かなぶん」iPhone 版クローズドベータのご案内

「かなぶん」というゲームを作りました。いまから3年前です。


» かなぶん(α版) - 僕は発展途上技術者 2.0


残念ながら、ウノウ退社とともにサイトはクローズしたのですが、昨年 id:Kanta さんに全面的に協力いただいて、Ruby on Rails 版で復活しました。


» かなぶん。


» かなぶん。公開中。 - KCLAB


そして、今、同じ id:Kanta さんに iPhone 版を開発いただいており、クローズドベータテストを開始しました。


僕を個人的に知っている方に限らせていただくのですが、iPhone または iPod Touch を持っていて、試してもいいよ、という方がいましたら、僕宛に UDID を送ってください。


UDID の調べ方については


» iPhone/iPod Touch の UDID(Unique Device Identifier) の調べ方 : 僕は発展途上技術者


を参考にしてください。


photo.jpg


日付のカレンダー入力を可能にする calendar_date_select プラグイン

日付の入力は、プルダウンよりもカレンダーから入力したほうが楽です。特に日付に加えて時刻まで入力する場合にはなおさらです。


calendar_date_select はそのカレンダー入力を可能にする Rails プラグイン。prototype.js ベース、Javascript で書かれたカレンダーピッカーと連動します。


» calendardateselect - Google Code


ただ、日本語環境で使用するには多少手を入れることが必要です。その手順も含め、Rails 2.3 での導入方法を記しておきます。


追記

calendar_date_select プラグインを fork し、以下延々と書き記した追加点を含めておきました。せっかちな方は、



% script/plugin install git://github.com/champierre/calendar_date_select.git


で calendar_date_select + Japanese support プラグインをインストールし、README_JA の指示に従ってください。


» champierre's calendar_date_select at master - GitHub


インストール


まず本家ページの説明どおり、gem でのインストールを試みて使用してみようとしたところ、



undefined method `calendar_date_select_tag' for #


というエラーがでます。検索して調べてみたところ、同様の問題に対する解決方法として、プラグインでのインストールが推奨されていたので、



% script/plugin install git://github.com/timcharper/calendar_date_select.git


でインストールします。


layout ファイルに、



<%= javascript_include_tag :defaults %>

<%= calendar_date_select_includes "red" %>


カレンダーを表示したい部分には、



<% form_for(@model) do |f| %>


で囲っている場合には



<%= f.calendar_date_select "date_and_time", :time => true, :popup => :force %>


そうでない場合には、



<%= calendar_date_select_tag "model[date_and_time]", Time.now, :time => true, :popup => :force %>


といったように記述することで、以下のようなカレンダー入力が可能となります。


calendar.png


カレンダーアイコンをクリックすればカレンダーがテキストフィールドの下に開きます。


calendar2.png


各オプションの役割を知るには、CalendarDateSelect Demoを参考にするとよいでしょう。テキストフィールド内の自由入力を許してしまうと、日付フォーマットのチェックが必要になってしまうので、これを禁止してしまう :popup => :force をつけるのがおすすめです。


さて、これでひとまず動作はするのですが、このままだと日付のフォーマットやインターフェースが英語のままで具合が悪いです。順に日本語化していきます。


表示の日本語化


public/javascripts/calendar_date_select/locale 以下に ja.js というファイルを新規作成し、以下をそのままコピー & ペーストします。



次に、layout ファイル内の記述を



<%= javascript_include_tag :defaults %>

<%= calendar_date_select_includes "red", :locale => 'ja' %>


のように変更、:locale => 'ja' を付け足しています。


これで曜日などの表示が日本語化されるはずです。


日付フォーマットの日本語化


2009/01/31 13:30 のような YYYY/mm/dd HH:MM というフォーマットを日本式とみなします。


別の形式を使いたい場合には、以下の説明を適当に読み替えてください。


public/javascripts/calendar_date_select 以下に format_japanese.js というファイルを新規作成し、以下をそのままコピー & ペーストします。



次に、config/environments.rb に以下を追記します。



以上で日付のフォーマットも変更できました。


微調整をいくつか


カレンダー内の時刻のプルダウンとそれに続く 現在 | OK | 閉じる のメニューの一行が長くなってしまって、レイアウトが乱れてしまいます。


そこでこれを修正するため、public/javascripts/calendar_date_select/calendar_date_select.js の 220 行目に br タグを挿入する処理を追加します。



次に、細かい話なのですが、IE などのブラウザでカレンダーアイコンにカーソルをあてると、「Calendar」とツールチップに表示されます。これを「カレンダーから入力」という日本語表示に変更します。


vendor/plugins/calendar_date_select/lib/calendar_date_select/form_helpers.rb の 202 行目に alt 属性を追加します。



以上、日本語化した結果は以下の通り。


calendar3.png


DateHelperJa プラグインを Rails 2.3.2 上で動作確認

date_select/datetime_select を日本語表示させる Rails プラグイン DateHelperJa が Rails 2.3.2 でも動作することを確認しました。


Rails のバージョンがあがるたびにテストアプリケーションを作って、DateHelperJa プラグインをインストールして、date_select を使うようなモデルを作成して、といったルーチンワークをいちいちおこなうのは面倒です。


そこで、Rails 2.3 より使用可能になったアプリケーションテンプレート機能を使い、以下のコマンドを実行することで即座にサンプルアプリを作成できるようにしておきました。



% rails sample -m http://github.com/elm200/date_helper_ja/raw/master/templates/date_helper_ja.rb


参考:

» DateHelperJa プラグインで date_select/datetime_select を和暦に対応させる : 僕は発展途上技術者


iPhone/iPod Touch の UDID(Unique Device Identifier) の調べ方

iPhone アプリの adhoc 版を配布するにあたり、配布先 iPhone/iPod Touch の UDID(Unique Device Identifier)が必要になります。


その UDID の調べ方。


1) iPhone または iPod Touch を Mac に接続する。

2) iTunes を起動(または自動起動)し、左メニューのデバイスの箇所に現れる iPhone/iPod Touch アイコンをクリック。

3) 概要タブの「シリアル番号:」の部分(番号ではなく太字の部分)をクリックすると、「識別子:」に変わります。afc5fb... といったやや長い文字列が UDID です。

4) この文字列の上にカーソルをあわせたまま、Mac なら Command + c、Windows なら Ctrl + c でコピー。

5) メールなどに Command + v (Mac)または Ctrl + v (Windows)でペーストします。


3) の部分がややわかりにくいので、動画キャプチャを載せておきます。



はまりポイント解説付き iphone adhoc ビルドの方法

いまちょっとした iPhone アプリを開発しています。まだまだ見習い状態で、四苦八苦。


登録した端末(最大100台まで)に限定してアプリをインストールして動かすことができる adhoc ビルドという方法があるのですが、これを成功させるために散々につまづいたポイントとともに方法を記録しておきます。


まず基本は、Apple 公式サイトにある解説に沿ってひとつひとつ手順を踏んでいきます。慣れない最初は、この解説のありかさえわからずウロウロ探し回っていました。


» Apple Developer Connection - iPhone Dev Center - Preparation(Apple Developer Connection に要ログイン)


で解説されている手順に沿っていきます。



  • Obtaining your iPhone Distribution Certificate(adhoc 用証明書の取得)

  • Create and download your iPhone Distribution Provisioning Profile for App Store Distribution(adhoc 用 Provisioning Profile の作成)


は難なくクリアしたのですが、



  • Building your Application with Xcode for Distribution(adhoc 用アプリケーションのビルド)


ではまりました。


第1のはまりポイント: Entitlements.plist: Argument list too long


手順通りやったと思い込み、ビルドしてみると、見事失敗。ビルド結果の画面には



Entitlements.plist: Argument list too long


の文字。too long とあるので、ファイル名が長いのかと思い込み、解説では Entitlements.plist とあるところをすべて dist.plist などと短い名前に変えファイルを作成し直して再ビルド。


第2のはまりポイント: dlist.plist: code object is not signed


すると、今度は



dlist.plist: code object is not signed


というエラーメッセージに変わりました。


なにか根本的な間違いをしているに違いないと、Apple の解説を読み返し読み返しします。



Select the Target and open the Build settings inspector. In the ‘Code Signing Entitlements’ build setting, type in the filename of the new Entitlements.plist file including the extension. There is no need to specify a path unless you have put the Entitlements.plist file somewhere other than the top level of the project.


という解説とともに以下のキャプチャがあるのですが、


1.png


これを見て実際に設定したのがこちら↓


2.png


英語と日本語の GUI の差に見事にだまされてしまったのですが、正しくは Code Signing Entitlements の部分に *.plist のファイル名を入力しなくてはいけないところを、同じ位置にあるのですが、英語に直せば Other Code Signing Flags となる「その他のコード署名フラグ」という間違ったフィールドにそれを入力していたのでした。


しかし、そうなると Code Signing Entitlements に該当するフィールドがありません。


第3のはまりポイント: ターゲットの情報 > ビルド > コード署名 に Code Signing Entitlements がない


ここでしばし途方にくれてしまいました。いろいろ検索して、助けとなったのが、以下のフォーラム記事。


» Apple - Support - Discussions - [iPhone] Code Signing Entitlements ...



Inside the Target Build Settings->Architecture, Make sure your Base SDK is set to Device and not Simulator.


つまり、以下のキャプチャにある「アーキテクチャ」セクションの「ベース SDK」の値がもともと Simulator - iPhone OS x.x.x となっていたところを Device - iPhone OS に変更したところ、Code Signing Entitlements が現れて *.plist のファイル名が入力できるようになりました。


3.png


以上をクリアしてなんとか adhoc ビルドを成功させました。


iPhone 開発、いまのところの印象は、まだまだこなれてない感じで随所に落とし穴満載といった感じですが、うまく動いたときの喜びはその分大きい。


[RAILS_APP]/config/boot.rb:26:Warning: Gem::SourceIndex#search support for String patterns is deprecated メッセージを消す

以前の案件の Rails アプリケーションで


# rake db:migrate


を実行してみたところ、うまく動くは動くのだが



[RAILS_APP]/config/boot.rb:26:Warning: Gem::SourceIndex#search support for String patterns is deprecated


という Warning メッセージが出る。


config/boot.rb の26行目



rails_gem = Gem.cache.search('rails', "~>#{version}.0").sort_by { |g| g.version.version }.last




rails_gem = Gem.cache.find_name('rails', "~>#{version}.0").sort_by { |g| g.version.version }.last


に修正すれば、Warning は消える。


» #8729 ([PATCH] Rake rails:freeze:gems loads the last gem that starts with the string "rails") - Rails Trac - Trac


に詳細が書かれている。



In the source for the rake task, the code is calling the search method for the Gem SourceIndex. This method matches anything that has the pattern of the string passed in, in this case "rails" which would include any gem starting with the string "rails." I have patched this code to use the find_name method that returns the exact match of the string that is passed in; in this case, "rails."


search メソッドだと、rails で始まるすべての gem にマッチしてしまうので、"rails" gem だけにマッチさせるよう find_name に変更された、とのこと。


Facebooker を使い Facebook プロフィールを更新する

いったいどのくらいの人にこの情報が役立つか疑問だが、日本語の情報は皆無ではまりにはまったので、自分のためにもメモしておきます。


Facebooker は Rails で Facebook アプリを開発するのを助けてくれるプラグイン。Kanji-Fandom Facebook 版を開発するのに使いました。


» 英語の名前を漢字に変換する Kanji-Fandom Facebook 版をリリースしました : 僕は発展途上技術者


作成したアプリから Facebook のプロフィールに自由に情報を追加したり、更新できるのですが、Facebook 側の仕様が変わっていて、開発当初の方法ではうまくプロフィールが操作できなくなっていました。



StandardError (This method is deprecated):

.../vendor/plugins/facebooker/lib/facebooker/parser.rb:505:in `process'


というエラーが頻発。method is deprecated らしいです。


そこで、あちこち検索を駆使してたどりついたのが以下の情報。


» Agile Ajax » Getting Started with Facebooker » Pathfinder Development


The Funner (More Fun) Stuff: Setting Information セクションの情報に救われました。


まず、大きなミソとなっていたのが、これまでは「Facebook プロフィールを更新しろ」という命令だけで更新できていたのが、


1) プロフィール情報を更新する

2) 更新した情報をプロフィールに明示的に追加する(初回だけ)


の二段階になっていたこと。


これに気づかず、1) だけをおこない、ログを眺めてもエラーが発生していない、でもプロフィールには更新した情報が追加されず、しばらく途方に暮れてしまいました。


まず、わりと比較的楽にクリアできる 1) の部分のコード。



これを



fbml = "This is test"


あるいは、



fbml = render_to_string(:partial => "profile", ...


のように fbml に表示したい内容を入れたあと



TestPublisher.deliver_profile_update(@user, fbml)


のように呼び出せば、プロフィールの情報が更新されます。


続いて 2) の部分をおこなうには、facebook で用意された「プロフィールに追加(Add to Profile)」ボタンをビューから呼び出すのです。



僕の場合は 1) をおこなった直後にリダイレクトされる画面に上記のコードを用意しました。


<fb:if-section-not-added section="profile">で挟むことによって、まだ一度もこの追加処理を行っていない場合にだけボタンが表示されるようにしています。なので、アプリケーションによってはいたるところ、ユーザーの目につくところに置くというのでもいいでしょう。


Facebook は API の仕様がころころ変わる印象を受けます。常にウォッチしていないと、僕のように、ごくたまにメンテで触るというレベルだと正直しんどい。。。


Mac のスクリーンをロックする方法

席を離れるときにロックしたい。windows のときは確か windows ボタン + L で簡単にできたはずなんですが。。。


mac だと意外とすんなりとはできない。以下の方法がスマートでよいです。


» わかばマークのMacの備忘録 : Macのスクリーンをロックする


DateHelperJa プラグインで date_select/datetime_select を和暦に対応させる

date_select/datetime_select を日本語表示させる Rails プラグイン DateHelperJa が和暦に対応した。


» DateHelperJa 0.2 リリース - Rails で行こう!


» elm200's date_helper_ja at master - GitHub


和暦対応と Rails 2.2.2 への対応部分で、微力ながら協力させていただいた。


DateHelperJa は、Rails やフリーでの仕事のしかたでいろいろと相談に乗ってくれる僕の師匠、酒井さんが公開していたプラグイン。date_select の部分を日本語化する必要があり、date_select_ja みたいなヘルパーを自分で作ってもよかったのだが、なにかスマートな方法がないかと調べていたところ偶然見つけた。


対応する Rails のバージョンが 1.2.x で、僕は 2.2.2 で対応させたかったのと、昭和、平成などの和暦に対応させたかったので、その部分は自分で書き足し、酒井さんにマージをお願いした。酒井さんは、現在ベトナムにいるにも関わらず快く応じてくれ、Skype とメールを駆使して全く距離の不便を感じることなく、スムーズにコミュニケーションが取れた。


おかげで、Rails プラグインの開発、オープンソースプロジェクトへの貢献、そして GitHub の利用と非常に貴重な体験をさせてもらって感謝している。ありがたく使わせていただきます。


プロフィール

株式会社まちクエスト代表、つくる社LLC代表。

Scratchで楽しく学ぶ アート&サイエンスRaspberry Piではじめる どきどきプログラミングを書きました。

オンラインコンテンツ: 大人のためのScratch

Amazonから図書館検索 Libron、iPhoneアプリ ひらがなゲーム かなぶん を作っています。

Email: webmaster at champierre dot com

Twitter @jishiha

最近のエントリー

アーカイブ