Ruby 1.8.6のREXML/XPathのバグ

Ruby 1.8.6でXML構文を扱うとき、XPathがうまく機能しないバグがあるそうです。Rubyのソースファイルを修正すると正常に動作します。

修正ファイル: /usr/lib/ruby/1.8/rexml/element.rb

修正箇所:
def attribute( name, namespace=nil ) prefix = nil
■■prefix = namespaces.index(namespace) if namespace
■■prefix = nil if prefix == ‘xmlns’ #この行を追加
■■attributes.get_attribute( “#{prefix ? prefix + ‘:’ : }#{name}” )
end

参考:
#102 (Cannot select attribute with default namespace) – rexml – Trac

Award on Rails 2007 大賞をいただきました!

2007年10月27日、有楽町でプログラミングコンテストAward on Rails 2007の表彰式が行われ、なんと「hakatter」が大賞をいただきました! (審査結果発表はこちら) 

こちらが賞金のパネル。テレビ番組などでよく目にするヤツですね。立派なパネルなので、ぜひにといただいて帰りました。台風が近づいている中、大きなパネルを持って歩くのは少し大変でした(笑)。どこに飾ろうかな。

hakatterは「体重をもっと簡単に記録したい。ひとりでPCに記録するだけじゃ続かない。Webを使ってみんなで記録できるようなサイトが欲しい」という思いから生まれました。特に目新しい技術を使っているわけではありませんが、明確なニーズのある分野に対して、シンプルで使いやすいサービスを提供した点が評価されたのかもしれません。

コンテスト主催者の皆さん、懇親会でお話をさせていただいた皆さん、hakatterを利用しているユーザーの皆さん、そしてRuby on Railsというフレームワークの開発に携わっている世界中の開発者の皆さんに、感謝の気持ちでいっぱいです。ありがとうございました。

自分が欲しいものを作って、他の人にも使ってもらえて、喜んでもらえて、ほめてもらえるなんて、開発者冥利につきるとはこのことですね~。

体重管理サービス hakatter α版公開

Ruby on Rails で作成している、はかるだけダイエット支援サービス「hakatter」のα版を、とりあえず公開してみました。みなさんのご意見をお待ちしています。

みんなで! はかるだけダイエット 「hakatter」
僕のページ http://hakatter.com/electricdoc

hakatterは「1日2回、朝と晩に体重をはかることが体重管理に重要である」という「はかるだけダイエット」を支援するサービスです。「ひとりだとなかなかモチベーションが続かない」という課題を解決するために作成しました。

□ Ajaxを駆使したデータ入力画面。

今の段階でできること

  • はかるだけダイエットの機能はほとんど作り込んだ
  • 体重の記録をつけ、グラフ化する。
  • グラフを他のブログなどにはりつける。
  • 他のひとの記録を眺める。

まだできていない部分

  • 「みんなで!」の部分は仕様を検討中
  • モチベータ (お気に入り? 足あと? Follower?)の実装
  • サイドバーのアイコン一覧をどうしようか迷い中。
  • トップページのデザインや、マニュアルなどのドキュメント

「みんなで!」の部分をどう実装しようか

ひとりで「はかるだけダイエット」を行うための機能はだいたいできあがりました。これからは「みんなで!」の部分を作っていきます。ユーザー同士でモチベーションを高めあい、体重の記録を継続できるような仕組みを作りたいのですが……なかなかアイディアがまとまりません。

□ とりあえずトップページに最新の更新を並べてみた

ユーザー同士のつながりというと、mixiの「マイミクシィ」や「足あと」機能などがあります。しかし、「いつもアクセスしてくる人がいてイヤだ」、「誰も自分の体重の記録をみてくれない」という問題をはらみます。

海外のフィットネス支援サービスtraineoには、週に1度、登録しておいた「モチベーター」のみんなに週報メールを送る、という機能があります。これも、メール送信先の認証を得る必要がある(あるいはtraineoの会員登録が必要)など、少し敷居が高い感じもします。

また、社内からのアクセスを許可してもらうためには、SNSやチャットに相当する機能はつけられないという制限もあります。つながりの距離、使いやすさなどを考えてみると、twitterのFollower (お気に入り) の機能が一番シンプルなような気がします。

体重測定のモチベーションを維持するために、どんな機能がふさわしいか、みなさんのアイディアや、不具合報告、要望など、ご意見をお待ちしています。

Ruby on Railsでの開発でつまづいたこと(メモ)

体重管理サービス「hakatter」を開発中です。プログラミングをしていると、たくさんの「なんかよくわからないけど、動かない」という場面に遭遇します。そんなとき、ネットや書籍も参考になるのですが、自分の環境に合った答えをみつけるまでに、とても苦労します。そんなわけで、簡単にメモ。

検索などでこのページにたどりついた方のために、僕の環境を書いておきます。

■開発環境と実行環境

  • Mac OS X 10.4
  • Apache / 1.3.33
  • ruby 1.8.6
  • Rails 1.2.3

■CSS関連

  • デフォルトではフォームの下端に余白ができるのでCSSで消す。
  • 全ての要素の余白を“ * {margin:0; padding:0;} と初期化できる。
  • フォームのテキスト入力欄の幅はブラウザの種類によって変わるが、CSSでピクセル単位で指定するとそろう。
  • 同じようなものを並べるときは、tableタグでレイアウトするのではなく、ulやliなどの箇条書きをCSSでレイアウトする。
  • WindowsのIEとMacのSafariとは、文字表示やフォントが全く違うので、どちらの表示も満足させるCSSの指定は難しい。
  • CSSを無効にしたとき、平文でも構造化されたHTMLが出てくるとうれしい。
  • view/layoutにあるレイアウト用のrhtmlファイルの先頭行を次のようにする。 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”ja” lang=”ja”>

■Ruby on Railsの動きについて

  • ブラウザからアクセスがあると、新しくコントローラのインスタンスが作られる。コントローラの処理によって、表示するデータを用意して、ビューやヘルパーに渡してHTMLを描画する。
  • コントローラ > ビュー (ヘルパー) の流れまでは、インスタンス変数(@で始まる変数)の内容は保持される。1つのアクセスに対する処理が終わったらすべて消えてしまう。
  • 次の画面(Ajax含む)へ情報を渡したいときは、フォームやリンクに情報を埋め込むか、セッション情報を使う。
  • ファイルのアップロードを行うと、10KB以下のものはStringIOオブジェクトとして、10KB以上だとTempFileオブジェクトが生成される。StringIOオブジェクトの場合は、localpathメソッドが使えないため、画像ファイルの変換など、ファイル名が必要なときは自分で保存しておく。

■Ajax関連

  • タグの正しい入れ子の順番は<div><form><table><tr><td>。

■ページめくりの処理を自前で行う

  • ページめくりの処理を自分で書くには、1ページの項目数 > 全体の項目数 > 最終ページ番号 > 表示するページ番号 > 表示する最初の項目の位置、の順に求める。

■Ruby on RailsをApacheで動かす

  • デバッグに多用する p メソッドは、Apacheサーバーでは Malformed header というCGIのエラーになるので、公開時にはすべて消しておくこと。
  • 何かエラーが起きたとき、ブラウザ画面上には「サーバーエラー」としか表示されない。詳細はApacheのログファイルを見ないと分からない。
  • Apacheのエラーログは /var/log/httpd/errorlog にある。
  • 公開前に、tmpフォルダ、logフォルダの中身はすべて消しておくこと。中身が残っているとエラーの原因になる。
  • tmp、logフォルダに対して、wwwユーザーが読み書きできるようにしておくこと(“chmod -R a+w tmp”“chmod -R a+w log”)。

■Rubyの日本語処理

  • environment.rb に ”$KCODE=’u’と設定してUTF-8環境で動くよう明示しておく。ターミナル画面への出力や、正規表現ライブラリなどはここを参照して動く。
  • UTF-8の日本語文字は1文字が3バイト

かんたん! たのしい! Ruby on Rails な週末

台風4号を避けるため、この週末は家に閉じこもって「Ruby on Rails」でプログラミングをしていました。「体重管理 Web サービス」を作るためには、今から PHP 言語を覚えるよりも、Ruby 言語と Ruby on Rails フレームワークを使った方が手っ取り早いのではないかと考えたのです。コマンドラインの使い方など戸惑うところも多々ありましたが、たった1日半で機能が充実した Web アプリケーションのサンプルを作り上げることができました。

Dk108 L

まず、入門書「たのしい Ruby」を読みながら Ruby 言語のお勉強です。Mac OS X には最初から Ruby がインストールされているので、サンプルプログラムをすぐに動かして確認できます。「ある数が素数かどうか判定するプログラムを書け」「ある月のカレンダーを表示するプログラムを書け」などの課題もあり、ひさしぶりに頭をひねって、楽しくプログラミングできました。

そして次は、本命の「かんたん Ruby on Rails で Web アプリケーション開発」を開きます。Ruby on Rails というのは Web アプリケーションを作るための土台となるものです。開発がしやすく生産性が高いといわれており、「わずか 15 分でブログを作る」(Mac、英語解説)「わずか 10 分でブックマークを作る」(Windows、日本語解説)といったデモ動画も有名です。

Dk196 L

しかし、ここからしばらく苦難の道が続きました。Ruby on Rails を動かすためには Unix のコマンド画面を使っていろいろなツールを導入しなくてはなりません。グラフィカルなインストーラに慣れてしまった身には、ソースファイルを自分でビルドするという作業はちんぷんかんぷんでした。

その後も、RubyGems で導入するツールのバージョン違いの問題や(本の通りインストールした後、gems update コマンドで最新版を導入し、さらに cleanup コマンドで古いバージョンを削除して解決)、rake コマンドでデータベースが作成できないというトラブル(rake environment RAILS_ENV=development db_setup のように、環境変数を明示して解決)にも見舞われ、なかなか大変でした。

また、プログラミングを楽に行うため、Rails のデモ動画などでは必ず使われている定番エディタ TextMate をインストールしました。日本語の表示や入力ができないという致命的な問題は CJK-Input プラグインForMateKonaVe フォントで解決しました。

Dk042 L

そうした壁を乗り越えて、おそるおそる Ruby on Rails の上を走り出したわけですが、その開発と学習のスピードには驚きました。たった 1 日半で、メール通知を使ったユーザー登録・認証の仕組みを備え、日本語と英語リソースの両方に対応し、Yahoo! 検索の Web サービスと連携した、Ajax を使った画面描画や JavaScript による画面効果を組み込んだ、フォトアルバムのシステムが完成したのですから、まさに「急行列車」並みです。

Ruby on Rails のおかげで「Web プログラミングは HTML 言語とスクリプト言語と Java スクリプトがぐちゃぐちゃで手に負えない」というネガティブなイメージが吹き飛びました。モデル、コントローラ、ビューという仕組みも理解しやすく、新規に書くコードの量も少ないため、見通しがとてもいいのです。「体重管理 Web サービス」完成までの道のりが、ぐっとスムーズになった気がします。楽しい週末でした。