2010年4月20日

久々に趣味プログラミングをしようと思ったら

どこから手を加えて良いのか、さっぱりわからなくなっていたでござるの巻。たかだか2000行程度のプロジェクトでこれですよ。間を開けないことの重要性を再確認しました。あと、コメントはもっと多めにすべきですねぇ。当時は十分だと思っていたのに、今の俺から見ると足りないわけです。難しいもんです。

2010年1月29日

やっつけiPadアプリ

iPhone SDK 3.2 betaのダウンロードが終わったので、ちょっとだけ遊んでみた。アプリはアドレス帳とセッティングしか入ってない。日本語キーボードは選択肢にあるけど、入力出来ない。動作はかなりもっさり。

テンプレート選択画面でProductというドロップボックスにiPadが追加されており、それを選択するとiPadアプリが作れるみたい。とりあえずUIViewを置いてみた。適当な画像をロード。久々にObjective-Cを書いたら構文忘れていてピンチ。Interface Builderの使い方が思い出せないので、直接ガリガリ書いた。そっちを覚えているのはどうよ?って気がする。

iPhone SDK 3.2 beta ダウンロード記念 や... - hajimepg(hajimepg)

明日も仕事なので、寝ますかね。

2009年11月13日

Programming Language Go

Googleが発表した新しいプログラミング言語「Go」。C言語ライクな構文にガベージコレクションや並列プログラミングなどの機能を追加した言語です。ポインタはあるけど、ポインタ操作はないというのもバランス的におもしろいです。

発表初日にインストールを試みたのですが、ソースファイルをチェックアウトするためのmercurialのインストールがうまく行かず、一日遅れとなりました。

とりあえずHello, worldを作ってみた。

package main

import "fmt"

func main() {
        fmt.Printf("Hello, World\n")
}

その後、公式サイトでドキュメントを読みました。3days courseの初日が終わったあたりです。

そんなことをしている間にもネットで有名なプログラマー達は、おもしろいサンプルコードを書き上げていたりするわけで。

学習速度の差を見せつけられてへこんでいるところです。Goのコンパイルが終わってから、2時間ほど経ったんだけど、このお二人が記事を書くまで何時間ぐらい掛かったんだろうか・・・。

2009年10月25日

iPhone App作ってます その10

PivixViewerDay10.png

ウィークリー、マンスリーランキング表示に対応しました。思ったより楽に出来ました。次はブックマークを実装します。

2009年10月15日

iPhone App作ってます その7

画像データのキャッシュと非表示データの解放を実装しました。前者はネットワークアクセス、後者は使用メモリが軽減されます。(ネットワークアクセスは1画像1アクセスになり、使用メモリは「50MB使用してメモリ不足でOS側から強制終了される」が5MBに軽減しました)

いずれ作らなくてはいけない機能でしたので、これまでの開発でも意識していたつもりなんですが、全然考慮が足りず、苦戦しました。なんとか実装出来ましたが、リファクタリングが必要なひどい状態になっています。無駄な処理が多くて動作ももっさりしちゃってます。メモリ使用量が減ったのにもっさりとか無いわぁ。

当面の問題点は洗い出せたので、数日は新しい構成案を練って、プロトタイプ2から3に切り替えることになりそうです。プロトタイプ5あたりが制式採用される予定です。

2009年9月28日

iPhone Developer Program に登録しました

現在、アクティベーションコード待ち。

2009年7月29日

DrillDownSaveを再実装しました

画面状態保存のサンプルプログラムでした。UserDefaultsと言うところに保存するのが簡単みたいです。iPhoneではディクショナリを保存するのが一般的なのかな。プログラムからも利用しやすいクラスですし、アプリを作る際にはお世話になりそうです。

アプリを作成する際に各コンポーネントの編集順なのですが、ヘッダファイル→NIBファイル→ソースファイルの順が良さそうだと思いました。ヘッダファイルとNIBファイルを編集しないと変数名の自動補完が効きません。なので、ソースファイルは最後。ヘッダとNIBではヘッダにてIBOutletを定義しておかないと、コンポーネントのリンクが張れないので、ヘッダが最初。

そういえばNIBファイルからソースファイルの生成も出来るんでしたっけ。ただ、Visual Studioほど賢くないので、2回目以降の更新ではマージコマンドで差分を自分で合成することになるようです。やっぱりマイクロソフトはすごいなぁ、と思いました。

話は変わりまして、UIApplicationDelegateプロトコルを実装したクラスの差し替え方法を調べました。デフォルトで生成されるものはクラス名が長すぎて使いにくいんですよね。Interface Builderでクラス名の後ろが省略されてしまう。新しく自分で作ったクラスを利用したいのですが、Interface Builderに認識させる方法がわからない。15分ほどハマってようやくわかりました。Interface BuilderでライブラリウインドウからObjectを選び、メインウインドウ?に追加し、クラスを自分が作ったクラスに変更すれば良いようです。その後、File's Ownerのdelegate先として指定してやればオッケーです。

Interface Builderにも少しずつ慣れてきた今日この頃です。まだ使いやすいとは思えませんけどね・・・。アプリがアクティブじゃないと閉じるウインドウが多いのが鬱陶しいです。ブラウザで調べようと思っても勝手に非表示になってしまうのは使いにくいです。2つ以上のNIBファイルを開くとどのウインドウがどのNIBファイルのものかわかりにくいのも困りものです。XCodeみたいに1ウインドウですべてをこなせる方が好きです。

2009年7月27日

Accessoryを再実装しました

カスタムのインディケータを実装するサンプルだったんですが、本題とは別にプロパティリストからのテーブルデータのロードのサンプルにもなっており、一粒で二度おいしいサンプルでした。プロパティリスト内の各要素を文字列ではなく辞書として定義しておいて、テーブルデータの読み込みだけではなく、現在の選択状況の保存にも使用しているのは、是非真似をしたいと思いました。

HeaderFooterを再実装しました

iPhone Dev CenterのSample Code、HeaderFooterを再実装しました。

前回苦戦したメソッドシグネチャですが、エスケープキーを押すと補完候補が表示されることがわかりました。コンテキストに応じて自動的に補完候補を絞ってくれているので、入力ミスは無くなりそうです。どうせなら引数名まで補完して欲しいところですが、そういう機能はないみたいです。

インターフェイスビルダーによる作業は相変わらずもたつきます。Windows-based Application(一番ピュアなテンプレート)から作成しているのですが、以下の手順でやると良さそうです。

  1. ルートコントローラを決める。例えばNavigation Controllerとか、Tab Bar Controllerとか。
  2. 決めたルートコントローラをライブラリウインドウからメインウインドウへ追加する(ドラッグ・アンド・ドロップ)。
  3. メインウインドウに追加されたルートコントローラを右クリックし、デリゲート先を設定する。

これでベースは出来るので、あとはコントローラなりサブビューなりを追加していけば良さそうです。

2009年7月25日

SimpleDrillDownを再実装しました

iPhone Dev CenterのSample Codeを自分の手で入力しています。プログラミングの勉強の基本は写経(お経を写すかのようにソースコードを写すこと)だと思っています。

対象はTable View Controllerを利用しているものにしました。8つ見つかったので、全部やろうと思います。まずは一番簡単そうなSimpleDrillDownに挑みました。

急がずに理解出来ないコードは今までに読んだドキュメントに戻って丁寧に作業しました。いくつも理解が浅かった箇所を発見でき、とても有意義な時間を過ごせました。

問題はユーザーインターフェイスの部分です。Interface BuilderというGUIツールで作成するのですが、どこがデフォルトから変更されたのか、とてもわかりにくいのです。MicrosoftのVisual Studioなら変更された項目は太字で表示されるため、わかりやすいのですが・・・。設定箇所もインスペクタウインドウだったり、オブジェクトを右クリックだったり、煩雑な感じです。対象ファイルをテキストとして開くとXML形式で閲覧できましたが、とても人間が読めるものではなく・・・。結局、トライ・アンド・エラーでかなりの時間をかけることになりました。

最初のサンプルコードを試してみての感想ですが、Cocoaの開発環境ではボトムアップによる開発はあまり向いていない印象を受けました。まず最低限の機能を作ってビルド&テスト。その後に拡張とやりたいのですが、最初の実行までに実装しなければならない部分が多く、うまくいきませんでした。環境になれてくると必要最低限の部分が割り出せるようになり、うまく出来るのかも知れませんが、自分が今までに触ってきた開発環境よりは敷居が高いのは間違いないと思います。

もう1つ気になったのが、メソッドのシグネチャの自動入力がないところです。Cocoaフレームワークから指定されているメソッド名、引数でメソッドを実装するのが基本作業なのですが、Objective-Cはメソッド定義がかなり長いのに手で入力するしか方法がないようなのです。一文字でも間違うとシグネチャが違うため、実行されません。問題なのは、必要となるメソッドだけ実装すれば良いため、実行時にメソッドが見つからなくてもエラーにならないところです。結局、デバッガでメソッドが実行されていることを確認するしかなく、デバッグ作業が長引くことになります。Visual Studioですと、ドロップダウンリストから実装したいメソッドを選ぶと自動で入力されます。これと同等の機能は欲しいところです。

2009年7月24日

iPhone OS Table Viewプログラミングガイド 読了

これまた良くできたフレームワークだなぁ、と感心。iPhone関連のフレームワークは命名規則はイマイチに思えるけど、設計思想は良くできているように思います。

これで一通りドキュメントは読了。アドレスブック、アニメーション、サウンドは読んでいないけど、利用するつもりもないので、良しとします。

次はサンプルアプリケーションをいくつか作って、いよいよ自作アプリの開発ですかね。アイディアはいくつかあるんですが、まだ煮詰めていないので、頑張らなくては。

iPhone OS View Controllerプログラミングガイド 読了

標準的な画面構成のガイドラインかと思ったら、思った以上に機能豊富でビックリした。例えばTab Bar Controllerに6個以上のView Controllerを追加すると自動的に最後のタブを「その他(More)」にしてくれてタブの入れ替え機能まで付けてくれたりする。しかし、完全に動作するサンプルはなかったので、100%理解できている実感はない。あとでサンプルコードを探さねば。

Cocoaメモリ管理プログラミングガイド 読了

参照カウンタ方式だけど、カウンタの増減はプログラマが意識して行う必要がある・・・と言ったところかな。参照のコピーではカウンタ数は増加せず、retainメソッドを使用すると、参照カウンタの増加と所有権の取得(概念的なモノで動作には関わりなし?)が出来る。使い終わったら、releaseメソッドで参照カウンタの減少と所有権の放棄を行う。参照カウンタが0になったら即座に解放される・・・のかな?それに関する言及は見つからなかった気がする。

自動開放プール(Autorelease Pools)という機能があって、autoreleaseメソッドを使用するとこの自動開放プールにオブジェクトが登録される。あとは自動開放プールの有効範囲を抜ける際にreleaseメソッドが呼ばれる仕組み。その際に参照カウンタが0になったら解放される。おもしろいのは、この自動開放プールがスタック可能なこと。新しい自動開放プールを作成すると(スタックなので当たり前ではありますが)スタックの最上位に置かれ、以後のautoreleaseメソッドは新しい自動開放プールへの登録となる。多数のオブジェクトの作成と解放を行う処理の前に自動開放プールを作っておくと、そこで作成したオブジェクトだけ早めに解放できたりしそうですね。この機能がiPhoneで使えるのかは不明です。

C,C++のようにプログラマに全部任せるわけでもなく、Java,Rubyのようにプログラムが全部やってくれるわけでもない。どういう意図でこういう設計になったのか知りたい設計です。ガベージコレクタは重い処理なので、iPhoneでは使いにくいのは分かるんですが、Cocoa自体はMac OS Xでも使いますしねぇ。違和感はありますが、慣れてしまえば、プログラマは適切な位置で参照カウンタを更新するメソッドを呼ぶだけで良いので、楽そうではあります。

Objective-C 2.0プログラミング言語 読了

今までのドキュメントが良質だったので、「Appleやるじゃん」と思っていたのですが、難解なObjective-Cのドキュメントがハズレでした。クラスの説明の前にクラス変数への言及があったりして、まず構成がおかしい。文章も読みにくいので、きっとAppleの技術責任者(ドキュメント書きのプロではない)あたりが書いたのだろうなぁ、と推測されます。

なんとか読み終えまして、どうにかObjective-Cは使うことが出来そうな雰囲気です。しかし、愛せる言語ではないですね。

2009年7月23日

iPhone開発ガイド 読了

アプリケーション開発からテスト、チューニング、テスターへの配布までの概要資料。いずれ使うことになりそう。まだiPhoneデベロッパプログラムに加入していないのです><

iPhone OSテクノロジーの概要 読了

50ページ弱なので、サクッと読了。しかし、テクノロジーレイヤー説明や、フレームワーク一覧があるので、たびたび参照することになりそうなドキュメントでした。

2009年7月22日

iPhoneヒューマンインターフェイスガイドライン 読了

パート1が概要、パート2がネイティブアプリケーション、パート3がWebアプリケーションという内容だった。パート1は勢いで、パート2は楽しく、パート3は惰性で読んだという感じ。一番長いパート2が興味深い内容だったので、全体としてサクッと読めた印象です。

iPhoneアプリケーションプログラミングガイド 読了

全176ページ。このドキュメントは概要で、詳細は各リファレンスガイドに書いてある感じ。概要なので、一応全部読んだ方が良いだろうと、グラフィックやサウンドの章も読みました。あまり理解出来てはいませんが、勉強中は愚直にやる方が良い場合もあるんで、頑張ります。

2009年7月20日

ドミニオン得点計算機 for iPhone 作った

習作アプリ一本目。ドミニオンも拡張パックが増えて得点計算が面倒になったので、作ってみました。40分ぐらいで出来ました。しかし、アップルにお金を払っていないので、実機での動作テストが出来ません。セグメンテッドコントロールが小さすぎて押し間違いばかりでキレそうな気もします。

ドミニオン得点計算機 for iPhone

iPhone Appの勉強を始めました

RubyKaigiで熱をもらったので、冷めないうちに。

とりあえず定期購読しているMacFanのバックナンバーのサンプルプログラムを全部、作ってみたのですが、Objective-Cの構文に慣れず、知識の応用がきかない状態です。まずはObjective-Cを簡単にでも勉強した方がいいかもしれないです。

お薦めの書籍やサイトなどがありましたら、コメントで教えて頂けるとうれしいです。

2009年7月19日

RubyKaigi 2009 お疲れ様でした

今年は(無職中でお財布が厳しいため)Ustream.tvでの視聴での参加になりました。

1日目

朝から待機していたのですが、配信の調子が悪く視聴に耐えなかったため、1時間足らずで撤退しました。配信側のネットワークトラブルだったそうなのですが、すぐに原因を究明して、2日目からは快適な視聴にしてくれたKaigiFreaksに感謝します。

2日目

朝からまつもとさんの基調講演まで参加しました。

Ruby 1.8 のゆくえ(卜部 昌平さん)

Ruby 1.8の今後の予定のお話でした。未だに1.8をメインで使っているので、しっかりと聞かせてもらいました。

Ruby 1.9.2ロードマップ(園田 裕貴さん)

今度は1.9のお話。スピーカーの園田さんはお話がおもしろい方なので、今年も楽しませて頂きました。話している内容は固いんですが、口調と時々言うジョークだけでこれだけおもしろくなるとは。

Ruby リファレンスマニュアル刷新計画 2009 夏(okkezさん)

今年中に重要度の低い部分を省き、いったんクローズさせるという発表がありました。あと、青木さん、本の執筆お疲れ様でした。

基調講演(まつもとゆきひろさん)

質疑応答で「アメリカだとすごい勢いで質問されるんだけど」とおっしゃっていたのがおもしろかったです。RubyConf(アメリカのRubyイベント)にも一度は行ってみたいです。

3日目

朝までボードゲームをやっていたので、お昼から参加です。

RubyならMacでしょう(Vincent Isambartさん)

外国の方なんですが、日本語でセッションしてくださいました。快適すぎる。MacRubyの紹介でした。MacRubyの開発中バージョンである0.5は、かなり期待されているらしく、この後のセッションでもよく名前が出てきました。

RubyCocoa/HotCocoa(RHC) 〜RubyではじめるMac OS Xデスクトップアプリケーション開発〜(高尾 宏治さん)

RubyCocoaとその周辺技術であるObject-CやCocoaのお話。Macにおけるプログラミング入門としても分かり易かったと思います。各技術の登場背景と役割がわかりました。9月にRubyCocoaの本を出されるそうなので、購入決定です。

RubyをつかったiPhoneアプリケーション開発(森 琢磨さん)

ハッキング魂が見ることができました。iPhoneでRubyを動かして、Telnetサーバを起動してリモートからirbで動作中のプログラムを変更とか。すごいの一言です。

Take the Red Pill(角谷 信太郎さん)

角谷さんのセッションも毎回、楽しみにしています。1時間枠なのに、本編が30分で終わった時はどうしようかと思いましたが、質問がバンバン出てきて、予定時間までしっかり埋まっていました。中盤あたりはRubyに対するスタンスの違いでの議論もありました。

基調講演: Rubyと私、そして日本Rubyの会(高橋 征義さん)

最終セッションです。総括と日本Rubyの会をよりよくするためのお話でした。最後のセッションに相応しいないようだったと思います。

Reject Kaigi

今年で3回目を迎えるRejectKaigi。本編やTLで採択されなかったセッションや小ネタを話す1本3分のセッションです。今回は24本だったようです。色んな内容がありますし、短くて飽きが来ないので、毎回楽しみにしています。今年も楽しめました。

お疲れ様でした

スピーカー、スタッフ、参加者の皆さん、お疲れ様でした。来年はまた現地で参加したいと思います。

2009年4月 2日

Oracle Master 11g Bronzeを取ってきた

手持ちのスキルが死に体なので、拡張すべく動いてます。やっぱり強いのはOracleかなぁ(あと、Ciscoは強そう。縁がないけど) 、と思ったので、Goldまで一気に頑張ります。

今日はBronzeに必要な2教科を受験してきました。DBAは79%、SQLは72%で合格しました。

実務ではあまり縁のなかったDBAの方に重点を置いて勉強したのは確かなんですが、SQLの方が正解率が低いと、プログラマとしてどうかと思いますね。受験結果には正解率と、大まかにどの分野で間違ったのかしか載っていない(試験問題の漏洩対策?)ので、復習がやりにくいのでイヤな感じです。

次はSilverなんですが、目標は1週間での取得です。しかし、まだ試験範囲すらは把握していないので、大きく前後するとは思います。

ぼちぼち頑張ります。

2009年3月31日

「新書.in」 新機能をリリースしました

2009年3月29日

Debian lenny Rails環境構築メモ

はじめに

VMWare FusionにDebian lennyをインストールし、Rails環境を構築した際の作業メモです。Debian lennyは最小構成でインストールしています。

各作業は一般ユーザでログインした状態で開始した場合のコマンドです。

SSHのインストール

su -
apt-get install ssh
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
awk ' { if ($0 ~ /PermitRootLogin/ ) { print "PermitRootLogin no" } else { print $0 } } ' /etc/ssh/sshd_config.default > /etc/ssh/sshd_config
/etc/init.d/ssh restart

rootによるログインを不可に変更しています。参考URLではviを使用していますが、今後、自動インストールに対応させたいので、コマンドラインで実行しています。awkが最適な方法なのかは自信がありません。冗長すぎる感じがします。
参考URL:SSHの導入 - Debian(etch)|窓の便利帳

zshのインストール

su -
apt-get install zsh

sudoのインストール

su -
apt-get install sudo
echo -e 'hajime\tALL=(ALL) ALL' >> /etc/sudoers

本当はvisudoで編集したほうが安全です。

Subversionのインストール

sudo apt-get install subversion

開発ツールのインストール

sudo apt-get install gcc g++ make zlib1g-dev libreadline5-dev openssl libssl0.9.8 libssl-dev libc6-dev bzip2 patch

Rubyのインストール

以前(野良コンパイル)は1.8.6-p36。etchは1.8.2-1。最新の1.8.7-p72を野良コンパイル。
参考URL:Studio H.F.F.:Ruby 1.8.6 / RubyGems 0.9.2 インストール

wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz
tar xzf ruby-1.8.7-p72
cd ruby-1.8.7-p72
./configure
make
make test
sudo make install

RubyGemsのインストール

参考URL:Studio H.F.F.:Ruby 1.8.6 / RubyGems 0.9.2 インストール
今回は0.9.4をインストール。Rails2.0からこのバージョン以上が必須になったらしいので。
0.9.5からはsetup.rbの仕様が変わるので注意(ハマりにハマった)

# 環境変数を使うので、sudoではなくsuで実行
su -
# ruby setup.rb installでGEM_HOME環境変数を使用する
# 設定していない場合、sourcesという必須gemがインストールされない(ハマった)
# gemをインストールする際に設定する必要があるので、rootの.profileに書いておくと楽
export GEM_HOME=/usr/local/rubygems
mkdir $GEM_HOME
wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
tar xzf rubygems-1.3.1.tgz
cd rubygems-1.3.1
ruby setup.rb

vimのインストール

今回はSubversionからソースを取得。最新の7.2系のパッチ148まで適用。
参考URL:Studio H.F.F.:Vim 7.0 install

wget ftp://ftp.vim.org/pub/vim/unix/vim-7.2.tar.bz2
wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-extra.tar.gz
wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gz
tar xjf vim-7.2.tar.bz2
tar xzf vim-7.2-extra.tar.gz
tar xzf vim-7.2-lang.tar.gz
cd vim72
mkdir patches
cd patches
wget ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.001-100.gz
zsh -c "wget ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.{101..148}"
gunzip 7.2.001-100.gz
cd ..
cat patches/7.2.* | patch -p0
./configure --enable-multibyte --enable-xim --enable-fontset --without-x --enable-rubyinterp --with-features=big
make
sudo make install

rails.vimのインストール

vimでRailsを編集する際の支援プラグインをインストール。
参考URL:Studio H.F.F.:rails.vim install

svn co http://svn.tpope.net/rails/vim/railsvim
cd railsvim
mkdir ~/.vim
cp -pr plugin doc autoload ~/.vim

MySQLのインストール

参考URL:Studio H.F.F.:MySQL 4.1 install

sudo apt-get install mysql-server-5.0

lighttpdのインストール

sudo apt-get install lighttpd

Railsのインストール

su -
#環境変数を設定していないなら下の1行を実行
export GEM_HOME=/usr/local/rubygems
gem install rails

Capistranoのインストール

参考URL:Studio H.F.F.:Capistrano 2.1 利用法

su -
#環境変数を設定していないなら下の1行を実行
export GEM_HOME=/usr/local/rubygems
gem install capistrano

Mongrelのインストール

su -
#環境変数を設定していないなら下の1行を実行
export GEM_HOME=/usr/local/rubygems
gem install mongrel

etchインストール時のエントリを参考に作業をしたのですが、標準でインストールされているパッケージが減っていてビックリしました。開発系のパッケージ数が増えすぎて、人によって必要なものが違うので、標準は減ったのかもしれませんね。

2009年2月10日

RSpec on RailsでHTTPステータスコードを確認するにはどうすればいいの?

今回はTest::Unitじゃなくて、RSpec on Railsを使おうと思ったのですが、早速ハマっておりました。

HTTPステータスコード(404 Not Foundとか)を確認するテストを書こうと思ったところ、200と300系については専用の構文(response.should be_success )があるんですが、それ以外についてはどうすればいいのか、わからず。

小一時間ほど悩んだあげく、以下のように書いたんですが、これでいいんでしょうか?

it "IDが9桁の場合、400(Bad Request)を返すこと" do
  get 'show', :id => '123456789'
  response.status.should =~ /400/
end

正規表現を使って400をチェックしていますが、「400 Bad Request」の完全一致がいいのかしら。

そんなわけで、「新書.in」の機能拡張、手間取っています。

2009年1月24日

vim 7.2 install

vimのバージョンを7.0から7.2に更新しました。 7.0のインストールはこちら 本体をダウンロード。
# wget ftp://ftp.vim.org/pub/vim/unix/vim-7.2.tar.bz2
# wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-extra.tar.gz
# wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gz
# tar xjf vim-7.2.tar.bz2
# tar xzf vim-7.2-extra.tar.gz
# tar xzf vim-7.2-lang.tar.gz
パッチを適用。
# cd vim72
# mkdir patches
# cd patches
# zsh -c "wget ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.{001..088}"
# cd ..
コンパイル。
# cat patches/7.2.* | patch -p0
# ./configure --enable-multibyte --enable-xim --enable-fontset --without-x --enable-rubyinterp --with-features=big
# make
# sudo make install
自サイトの過去エントリが自分の役に立つのって嬉しいです。

2009年1月10日

オライリーから「プログラミング言語 Ruby」が出るようです。

英語版の発売から1年、ついに和訳です。Rubyについての名著は多数ありますが、やはり言語設計者自らが書いた本は別格です。購入決定の一冊です。

Best of Ruby Quizも和訳されないかなぁ、と待っています。

2008年10月 8日

Debian Etch ソフトウェア・メンテナンス

「そのうちやろう」と思ってずっとやっていなかったDebianのメンテを行いました。実際に作業を始めると30分掛からないんですけど、腰が重くていけないですね。

sudo apt-get update
sudo apt-get -s upgrade
sudo apt-get upgrade
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz
cd ruby-1.8.7-p72
./configure
make
make test
sudo make install

2008年8月 8日

iPhone用ページを追加しました

http://blog.studiohff.net/i/

「iPhoneテンプレートfor MT」を利用させてもらっています。あっという間に設置出来ました。

2008年6月22日

MacRuby rev299 インストール

RubyKaigi2008で知ったMacRubyがおもしろそうなので、インストールしてみました。

最新のリリースバージョン(0.2)と開発中(Subversionのtrunk)では、コンパイル方法が変わっていました。0.2では、CRuby(Matz Ruby)と同じように、configure → make → make installですが、trunkではrakeを使うようになっていました。rake → rake installとなります。

この記事で対象としているMacRubyはSubversionのtrunkでリビジョン299になります。

まず最初にtrunkをインストールしてみました。前述の通り、簡単にインストールできました。各実行ファイル名にはプレフィックスmacが付くようになっています。ruby→macruby、irb→macirbのようにです。

0.2ではrubyという名前でインストールされてしまいますので、既にCRubyがあった場合、上書きされてしまいます。自分の環境ではruby-1.8.7が入っていたので、再インストールする羽目になりました・・・。MacOS X標準のRubyは別の場所にあるので競合しませんが、自分でRuby1.8/1.9をコンパイルされているような方は、configureにprefixを指定する必要があります。
Ruby Install Guide::各バイナリの共存方法
この記事が参考になるかと思います。

自分の環境では、0.2は正しくインストールすることが出来ませんでした。make installを行うとLIBRUBY_SOのインストール中に異常終了してしまいます。作業ディレクトリにそのようなファイルはないので、 Makefileがおかしいのか、まだ移植が不完全な部分なのだと思います。

trunkは前述の通り、rakeでインストールを行うため、問題なくインストール出来ました。

$ macruby -v
MacRuby version 0.3 (ruby 1.9.0 2008-06-03) [universal-darwin9.3]
$ macruby -e "p :hello"
:hello

ちゃんと動くようです。しかし、、、

$ macirb -v
/Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/irb/locale.rb:43:in `String': no such file to load -- kconv (LoadError)
	from /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/irb/locale.rb:129:in `real_load'
	from /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/irb/locale.rb:120:in `block in load'
	from /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/irb/locale.rb:118:in `each'
	from /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/irb/locale.rb:118:in `load'
	from /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/irb/init.rb:120:in `init_error'
	from /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/irb/init.rb:17:in `setup'
	from /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/irb.rb:53:in `start'
	from /usr/local/bin/macirb:12:in `
'

irbはRubyKaigi2008のデモで使用されていたので、動かないとは思いにくいです。 locale.rbとなっているので、日本語環境が原因かも?

$ LANG=C macirb -v
irb 0.9.5(05/04/13)

ビンゴ!しばらくは英語環境でやった方がよさそうですね。

とりあえずはこのあたりで

「RubyKaigi2008 2nd Day」に参加しました

RubyKaigi2008最終日です。今日は9時からスタートと言うことで、昨日より早い開始となりました。そのせいか、最初のセッションは人もまばらで寂しかったです。

午前の第一セッションは、特に琴線に触れる話がなかったかな?redmineというRuby製のバグトラッキングシステムの評判が良かったので、後で触ってみようと思ったぐらい。

続いての午前第二セッションがとても充実した内容。田中哲さんの「matzを説得する方法」というのは内輪ネタかな?と思っていたのだけど、仕様変更を提案する際の正当性を考えるためになるお話でした。次の2つには期待していたのだけど、こちらは流すつもりだったので、意外な収穫でした。

続いて、青木峰郎さんの「日本Rubyのリファレンスマニュアル2008・初夏」いつもお世話になっているリファレンスマニュアルのお話。去年は2%だった進捗が30%、大型ライブラリ2つを除くと50%、組み込みに限れば98%ということでした。去年は人材募集のアナウンスだったのだけど、今年はそういう雰囲気ではなくて、今後はこういう風に進めるよ、というお話に思えました。静的HTML出力は期待したいですね。今は

alias rurima='(cd ~/Documents/ruby-refm-1.9.0-dynamic-20080529; ruby server.rb)'

と定義して使っております。サーバ起動はおおげさで面倒ではあるので、静的HTMLはうれしい。

午前最後のセッションはLaurent Sansonettiの「The future of Ruby in Mac OS X」MacOS Xの機能へRubyからアクセスする方法。CocoaというフレームワークにアクセスするRubyCocoaから始まり、直接、MacOS Xの機能を叩けるMacRubyへと話が繋がりました。帰宅後に早速MacRubyを入れてみたので、別エントリで上げます。

実は午後のセッションは参加せずに帰っちゃいました。特別興味があるセッションもなかったし、疲れてきたし、閉会までいると電車混みそうだし、UStreamで中継しているし、YouTubeなどにもアップされるらしいし、とそんな理由。会場から自宅までは1時間ちょっとで移動できるので、帰宅後、シャワーだけ浴びてUstで続きを見ていました。「Inside Tabelog's Backend」から見られました。RejectKaigiは中継がないので、ちょっともったいなくはあるけど、明日から仕事だし、金曜日にお休みをいただいた分、頑張らないといけないから、しょうがないところです。

去年はDave Thomasが来たせいか、熱狂という感じだったけど、今年は落ち着いた感じだったかなぁ、という印象です。相変わらず知人・友人はいないので、来年までには頑張らないといけないと思いました。とりあえず次のRails勉強会に参加したいです。

講演者・スタッフ・参加者各位、お疲れ様でした。

2008年6月21日

「RubyKaigi2008 1st Day」に参加しました

UStreamで中継されたり、ニコニコ動画にアップされたりするそうなので、講演内容の要約ではなく、感想の方が(些末な人間の文章とはいえ)価値があるのではないかと思うので、その方向で。

開場と同時に会場入り。意外と混んでいない印象。電源を確保しようとしたけど、最前列にしか見当たらず、ここは関係者席のはずなので自重。電源は諦めて2列目に座ったところ、斜め前にMatzが着席されました。やっぱり前列に限るなぁ、と思いました。後列は出入りがしやすかったり、(今回に限って言えば)座席に机が付いているので便利ではあるんですが、ライブ感を楽しむなら前列に限ると思います。

午前中は実装系のおはなし。YARV(CRuby、Ruby1.9)、JRuby、Rubiniusの実装者がお話してくれた。貴重ではあるのだろうけど、あまり興味のない分野。ただ、皆さん、頭の回転が速いなー、と感じることが行動の端々にあった。知識以上の実力差を感じます。

昼休みは90分もあったのだけど、午前中の延長とつくばの外食事情から開始ギリギリに会場に到着。しかし、前列に余裕で座れる。席の埋まり具合も5割程度だし、チケットを買ったけど来ない人とか、一部だけ参加の人が多いのかも。熱気は去年の方が上だなぁ、と感じました。

午後は基調講演からスタート。Matzいいよ、Matz。公演後にすぐ帰られるとのことでしたが、ちょっと寂しい。用事があるのか、それとも宗教上の理由とかなのかしら?(Matzはキリスト教信者らしい。Wikipedia情報なので真偽のほどは不明。日曜は休まなきゃいけないとか、教会に行かなきゃいけないとか、ありそうではあります) その後はM17Nのおはなし。正直、さっぱりわかりませんでした。

午後の第2セッションはRubyと教育のお話。「Ruby”で”教えている学校の先生」「Ruby”を”エンジニアに教えている講師」「同僚にRubyを教えてデスマーチを乗り切ったエンジニアさん」「Ruby認定試験を学習コースを行っている会社の方」。多種多様なスピーカーを集められたなぁ、という印象。特にデスマーチ話が最高でした。YuguiさんというRuby界隈では有名な方で、今月オライリーからRuby本も出されたというすごい方なのですが、話の内容も語り口もおもしろい。個人的には本日一番楽しめたセッションでした。

その後はライトニングトーク。多種多様な話題が楽しい。特にコードリーディングのお話がおもしろかったです。

懇親会は不参加。Ruby界隈で知り合いがいないので、どう考えても時間をもてあます。来年までに実績を作って「○○を作ったHajimepgでーす」と言えるようにするか、勉強会に参加して顔見知りを増やすか、どっちかを行わねば。つぅか、どっちもやりたい!

昨日と同じお店で夕飯をいただいて、この時期を書いております。来年もつくばでやらないかなー。お店、気に入っちゃったよ。会場もだけど。

2008年6月20日

「RubyKaigi2008 0th Day」に参加しました

平日ですが会社を休むことが出来たので(来週はちょっと頑張らないといけない)、0th Dayから参加することが出来ました。

0th Dayは多目的ホールを使用してのスポンサーセッションとコミュニティセッションがメインでした。併設としてRuby認定試験も行われました。最初から参加したかったのですが、MiniCard(名刺)が午前中に届くとのことで、午後からの出発となりました。去年は聴衆として参加しただけでしたが、今年は知人・友人を増やしたいなぁ、と思い、月曜日に慌てて注文したのです。間に合わなければ諦めるつもりだったのですが、ギリギリ間に合いました。

到着したのは16時頃ですでにスポンサーセッションの最後の楽天さんのターンでした。その後のコミュニティセッションはすべて聞くことが出来ました。舞波さんのお顔を初めて拝見しました。想像していたのと違っていましたが、COOLな雰囲気でした。

「明日は登録が混みそうだからチケットがある人は事前にやっておいてね」とのことなので、事前登録をしました。ノベルティはタンブラーでした。RubyKaigi2008と書かれています。個人的には去年の方が好みかなー。

その後は前夜祭ということでしたが、Rubyistの知り合いが一人(しかも、仕事繋がりでRuby繋がりではないので、こういう場で頼るのはずるいように思える)だけの身なので、「ちょっとだけ顔を出して雰囲気だけ味わって帰ろう」と思っていたのですが、先に夕飯を食べに行った先で長居してしまい(熟考しただけあっていい感じのお店でした)、戻ってきたら22時です。さすがに終わってるだろうということで早く寝ることにします。

2008年6月 4日

「Unix/Linux プログラミング 理論と実践」を読んでいます Part2

今日は(残業|明日はシレン3が出るので早く寝る)ので、ちょっとだけ。82ページから91ページまでを読みました。cpコマンドの作成を通じて、readとcreatシステムコールを学びました。システムコール呼び出しはユーザモードとカーネルモードのスイッチが必要になるため、コストが高いので、なるべく呼び出し回数を減らすようにした方がよい。そのためにはバッファリングが有効です。次回は以前に作ったwhoをバッファリングに対応させ、効率を上げるところから再開です。

余談ですが、createではなくcreatなのは、初期の開発者がスペルミスをしたせいだと、別の本で読んだ記憶があります。元は誤字ですが、Unixの歴史である40年弱、そのまま使われてきているので、ここまで来ると文化になっている気がします。

「Unix/Linux プログラミング 理論と実践」を読んでいます Part1

Unix/Linuxプログラミング理論と実践【AA】

Unix/Linuxの標準コマンドを作りつつ、仕組みを学ぼう、という本です。

現在、第2章の途中まで読んで、実践しています。作ったコマンドはmore・whoの2つです。moreでは/dev/ttyを、whoでは/var/run/utmpを学ぶことが出来ました。今まででは不思議だなぁ、と思いつつも、自分には持ち合わせていない深い領域にある知識がないと理解できないと思っていました。しかし、注意深くmanとヘッダファイルを読んでいき、ちょっとの推測を行えば、たどり着けるのだと言うことがわかりました。

ちょうどいいことに実際のコードを試しているのはMacOS Xですので、Unixベースではありますが、所々に違いがあります。本書ではwhoコマンドを作る際にutmpを使用するとなっていますが、MacOS Xではutmpを非推奨となっており、拡張されたutmpxを使用するようになっていました。(この情報もヘッダファイルから入手)頭を使わずに写経するだけではダメなので、わかったつもりになりにくいのではないかと思います。

Blogに勉強の経過を載せますと、良い刺激になることが前回わかりましたので、今回もメモを残しつつ、がんばりたいと思います。人に見てもらっても有益な情報はあまりないエントリになると思いますが、よろしくお願いします。

2008年5月31日

勝手に添削

Twitterで見かけたC言語プログラムを添削させていただく。C言語は10年近く触っているけど、ここ3年は離れていたので苦戦しました。

2008-05-30 - yaottiの日記 - ハチロク世代

"勝手に添削"の続きを読む

2008年5月15日

Jeffrey E.F. Friedl著 株式会社ロングテール/長尾 高弘訳 「詳説 正規表現 第3版」 読了

正規表現は仕事で日常的に利用しているので、すんなりと読めると思っていたのですが、大変でした。自分の知っていた知識なんて、本書の1章の内容にすら劣っていました。正規表現についてここまで詳しく書いてある本とは思っていませんでした。

7章の冒頭で筆者はこんなことを述べています。

一般的な書籍の著者からすればうらやましいようなぜいたくが私にはある。普通は章を通じて話の途切れることのない一貫性のある物語を織り成すことが目的になってしまって、重要な細部を省略せざるを得ないところだが、私はそんな心配をしなくて済むのだ。問題の中には複雑なものが含まれているし、細部が分厚く積み重なっている部分もある。一度にすべてを理解できなくても心配する必要はない。最初は全体像がつかめる程度に章を読み通し、後で必要になったときリファレンスとして読み返すことをお勧めする。

7章はPerl言語に特化した話になっており、Perlに詳しくない読者への言葉なのですが、7章だけならず、本書全体に通して言えることだと思いました。

「正規表現」という分野の最高のリファレンスとして作成されたこの本は、読者にわかりにくい(しかし、重要な)ところを省略したり、曖昧な解説で済ませていることがありません。読んでいて頭がクラクラしてしまい、何回も中断せざるを得なくなりましたが、その甲斐はある本だと思います。

正直、筆者の言葉をかみ砕いて咀嚼するだけで精一杯でして、自分の中でそれらが混沌としているのを感じます。これから時間をおいて読み直したり、実際に活用することがあってこそ、血肉となるのだと思います。

第3版まで手を付けることのなかったことをもったいなく思いつつも、出会えて良かったと感じています。

是非、皆さんの本棚にも置いてください。

2008年5月14日

Mosh 0.0.2をDebian Etch/GNU Linuxでコンパイルしてみた。

higeponさんが開発されていたScheme処理系の最初のバージョンが公開されたので、早速、コンパイルしてみました。(準備をしているうちにバージョンがあがってましたので、そちらに切り替えました。)

Scheme 処理系 「Mosh 0.0.1」 をリリースしました - ひげぽん OSとか作っちゃうかMona-

"Mosh 0.0.2をDebian Etch/GNU Linuxでコンパイルしてみた。"の続きを読む

2008年5月12日

Ruby Kaigi 2008 ホテルを予約しました

今回の会場はつくば国際会議場なのですが、つくばエクスプレスで秋葉原から1時間になったとはいえ、自宅から2時間掛かります。往復4時間を会期中(金・土・日)、毎日移動するのはバカらしい。そういうわけでホテルを予約しました。

予約したのは会場に隣接しているオークラフロンティアホテルつくば・エポカル。すでにかなり予約が埋まっていました。同じ部屋で連泊は無理だったので、別の部屋×2日分を予約しました。電話で確認したところ、荷物は預かってくれるとのことなので、Kaigi中、着替えなどが入った大荷物を持ち歩く必要は無く、安心しました。

おそらく同ホテルはRubyistだらけになると思われますので、知人を増やすことが出来たらいいなー、と思っています。

「Kaigiに着ていく服がない」って感じなので、買いに行かねば。

2008年5月10日

Ruby Kaigi 2008 チケット取れた

無事に確保。去年は不要だった(と思う、ちょっとあやふや)ローソンチケットの会員登録が必要で、販売開始時間を過ぎてから慌てて登録したので、その間に売り切れちゃうんじゃないかと焦った。みなさん、つくばでお会いしましょうー。

2008年5月 6日

「日本 Ruby 会議 2008」のチケットは5月10日(土) 午前10時販売開始!

日本 Ruby 会議 2008 - 参加方法

去年に比べ、会場が広くなっているため、楽に買えると思う。しかし、買えなかったらイヤなので、10時ジャストに買いに行きます。

2008年4月18日

先日のGoogle App Engineのコードを解説してみる

前エントリのコードはownerチェックが甘かったので、きちんとチェックするようにしました。稚拙なコードだとは思いますが、晒してみる勇気。

"先日のGoogle App Engineのコードを解説してみる"の続きを読む

2008年4月16日

Google App EngineでCRUDを一通り使っているアプリ作ったよー

題材は以前から作りたかった漫画雑誌管理アプリケーションにしました。大手少年漫画誌は3ヶ月も待てば雑誌連載が単行本化しますが、月刊誌で、マイナージャンルで、出版社の移動が激しいと、単行本が出ない、出たとしても2年掛かるというのはザラなわけです。その間、お気に入りの作家の漫画雑誌は捨てられないわけで、とても大変な量になるわけで。「あれ、あの漫画、どの雑誌の何月号に載っていたっけ?」「この作家さん、どの雑誌とどの雑誌で連載していたっけ?」となるわけで。具体的に言いますとエロマンガなんですけどね(笑)

そんなわけでこんなアプリを作りました。

  • 雑誌1冊単位で登録します
  • 各雑誌は作品を持てます(最大20個としました)
  • 各作品は作者を持てます(共著は管理できません)
  • 作者単位で作品名・雑誌名を検索できます

Google App Engineの勉強としては以下の点が学べるかもしれません。しかし、Python暦0日の俺が4時間で作ったので、きっと酷いコードです。

  • モデルのリレーションシップ(1対1、1対多)
  • CREATE・READ・UPDATE・DELETEという基本操作

以下の点は酷いものだと思います。

  • ユーザーインターフェイス
  • 検索(未実装、完全一致しか使えないように見えます)

今日は時間が取れないので、後日に解説記事をアップしようと思います。動作中のURLとソースファイルを置いておきます。

Python本まとめ

Python本を買おうと思い、調べてみたのですが、原書に比べると1版遅れの本がほとんどでした。時期が悪かったようです。

Pythonチュートリアル
出版社
オライリー
価格
1,260円
出版年月
2007/09
対応バージョン
不明
原書の最新版
不明
補足
原書はiUniverse Inc.から出ているPython Tutorial(2000/04)ではないかと思われるが、確認取れず。
初めてのPython 第2版
出版社
オライリー
価格
5,040円
出版年月
2004/11
対応バージョン
Python 2.2
原書の最新版
Learning Python, Third Editon(2007/10, Python 2.5)
Python入門, Pythonプログラミング
出版社
オライリー
価格
絶版
出版年月
1998/02, 1998/07
対応バージョン
不明
原書の最新版
Programming Python, Third Edition(2006/08, Python 2.5)
補足
原書は1600ページ近い大作。日本語版は2分冊になっている。
Pythonクイックリファレンス
出版社
オライリー
価格
6,195円
出版年月
2004/03
対応バージョン
Python 2.3
原書の最新版
Python in a Nutshell, Second Edition (2006/06, Python 2.5)
Pythonクックグック 第2版
出版社
オライリー
価格
4,410円
出版年月
2007/06
対応バージョン
Python 2.4
原書の最新版
Python Cookbook, Second Edition (2005/03, Python 2.4)

2008年4月15日

「Google App Engine」を使ってみた

Google App Engineとは、Googleの持つサーバやミドルウェアを外部に提供するサービスのことです。スケーラブルなサーバやGFS、BigTableを使えるということです。

1万人限定のプレビューには登録が間に合わなかったのですが、先ほど追加登録されたとのメールが送られてきましたので、早速使ってみました。

定番のHello worldを作るチュートリアルを行いました。既にあちこちに記事があるため、そちらを参照してください。

Pythonに初めて触ったのですが、意外とすんなり作れました。インデントに意味があるというのは新鮮でした。って、これじゃGoogle App Engineの感想になりませんね。Google App Engineでは、データストアへのアクセスにSQLではなくGDLというSQLライクな言語を使うのですが、

greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC")

これを以下のようにも書けるのです。

greetings = Greeting.all().order('-date')

Greetingというモデルクラスがデータストアのテーブルと対応するのはRailsと同じなのですが、「全部持ってきて」「dateの逆順に並びかえ」と指定できるのはおもしろい。直感的ではあるのですが、これがどのように処理されるのか気になりました。データストアから全データを持ってきた後、アプリケーションサーバが並び替えることになりそうなので、重そうに感じるのですが・・・。Googleのサーバ能力からすれば、共有のデータストアに処理をさせるより、何千台もあるアプリケーションサーバが処理した方がいいということなんでしょうかねー。それともこの構文からクエリー指定と同じクエリーを生成出来るのかなぁ。Ruby脳だと「Greetingクラスのallメソッドを呼び出し」「その戻り値であるオブジェクトの配列に対して、orderメソッドを引数'-date'で呼び出す」となるんですが。リファレンスを読むことにします。

ここから追記

リファレンスを読んで謎が解けました。all(),order(),filter()などを呼び出した時点ではまだ実際のデータ検索処理は行われていないのです。実際にフェッチされるのは、以下の2つのどちらかになります。

  1. fetch()が呼び出されたとき

    greetings.fetch(10)
  2. イテレータとして使われたとき

    for greeting in greetings:

なるほど、all(),order(),filter()はQueryオブジェクトに条件を追加していく動作になるわけですね。

greetings = Greeting.all() # SELECT * FROM Greetings
greetings.filter('owner = ', users.get_current_user()) # SELECT * FROM Greetings WHERE owner = :1
greetings.order('-date') # SELECT * FROM Greetings WHERE owner = :1 ORDER BY date DESC

これらのメソッドはレシーバの状態を更新し、更新後のレシーバを返すので、以下のように書くことも出来ます。

greetings = Greeting.all().filter('owner = ', users.get_current_user()).order('-date')

余談ですが、WHERE句は左辺値の後にスペースを入れないと動作しないようです。ちょっとはまりました。

greetings.filter('owner=' users.get_current_user()) #これは動作しない
greetings.filter('owner =' users.get_current_user()) #これでOK

2008年4月 9日

JavaScript DOMツリー中に含まれるスクリプトを実行する

はじめに

エントリにサンプルコードを載せて、ボタンを押したら実行できるようにしたい。同じコードを表示用と実行用で2回書くのはナンセンスなので、DOMツリー中からコードを取得してevalしたい。

簡単じゃね?

俺には未体験ゾーンです。

続きは専用ページで

グローバル名前空間を汚すので、インデックスや月別アーカイブに全文を載せるのは気が引ける。

"JavaScript DOMツリー中に含まれるスクリプトを実行する"の続きを読む

2008年3月21日

AutoTest::Screenとredgreenを同時に使用するには

autotest
ZenTestに含まれる4つのユーティリティのうちの1つで、あらかじめautotestを実行しておくとファイルを変更した際に、"関連あるテストを自動実行してくれる"ユーティリティ
AutoTest::Screen
autotestのプラグインの1つ。テスト結果をscreenのステータスラインに表示する
redgreen
RubyのTest::Unitの実行結果に色付け(成功なら緑、失敗なら赤)をしてくれるツール。視認性の向上と開発者のモチベーションアップに繋がる(公式)
この2つを同時に使おうとしたのですが、AutoTest::Screenがエラーを検知出来なかったのです。色々と調べたところ、redgreenが追加する色付け用特殊文字が正規表現に含まれていないからなのでした。かなり時間をかけてしまったので、情けない気分です・・・。 以下の.autotestでredgreenを使用している場合でも、使用していない場合でも、正しく動作するはずです。.autotestの内容は「Autotest::Screenが便利な件について。 (SaikyoLine.jp)」を参考にさせて頂きました。
require 'autotest/redgreen'
require 'autotest/screen'

Autotest::Screen.statusline = %q[%{=r dd} %-w%{=b dd}[%n] %t %{-}%+w %=]
class Autotest::Screen
  Autotest.add_hook :run_command do |at|
    message 'Testing...' if execute?
  end

  Autotest.add_hook :ran_command do |at|
    if execute? then
      output = at.results.join
      failed = output.scan(/^\s+\d+\) (\e\[31m){0,1}(Failure|Error)(\e\[0m){0,1}:\n(.*?)\((.*?)\)/)
      if failed.size == 0 then
        message "All Green", :green
      else
        f,e = failed.partition { |s| s[0] =~ /Failure/ }
        message "Red F:#{f.size} E:#{e.size}", :red
      end
    end
  end
end

2008年3月20日

オライリー 「GNU Emacs 入門」を読んでいます その2

「2章 テキストの編集」「3章 検索と置換」「4章 バッファとウィンドウおよびフレームの利用」「5章 作業環境としてのEmacs」「6章 マクロの記述」と読み終えた。目から鱗が落ちるような内容には出会っていないけど、徐々にEmacsの考え方が染みこんできている気がする。

2008年3月19日

オライリー 「GNU Emacs 入門」を読んでいます その1

昨日「欲しい!」と思ったら、今日「Amazonからお荷物ですー」と届く良い世界。 「1章 Emacs入門」だけ読みました。コマンドの使用頻度と割り当てるキーの押しやすさの相関性などがわかりました。(Ctrl、Meta、Ctrl-x、Meta-xの順) 続きが読みたいのですが、異常に眠い・・・。

Windows Vista SP1

Windows Vista SP1のWindows Update経由での配布が開始されなかったなぁ。週末開始は月曜に大騒ぎになる可能性があるので、木曜日ぐらいかと思っていたのだけど、木曜日を過ぎても、金土日を過ぎても何も起きていません。15日から秋葉原などではSP1適用済みのパッケージを販売しているようなので、延期はないんだろうけど、どうしちゃったんでしょうね?今週前半には出して欲しいところです。早くVistaとGoogle Desktop Searchを結合したい。
Studio H.F.F.:そういえば・・・
自動配布は来月からだったようです。マイクロソフトのサイトから既にダウンロード可能になっていました。 ダウンロードの詳細 : Windows Vista Service Pack 1 (5 言語用スタンドアロン版) (KB936330) 帰宅後に早速入れる。

2008年3月18日

オライリー 「プログラミング Gauche」を読んでいます その2

前回。 Studio H.F.F.:オライリー 「プログラミング Gauche」を読んでいます その1 Emacsに戸惑いつつも、ゆっくりと進めています。「4章 Gaucheの開発スタイル」「5章 プログラムの書式」「6章 リスト」が終わりました。 Gaucheに組み込まれている手続き(手続き型言語で言うところの関数)を実装しつつ、関数型言語の考え方を学ぶような構成になっています。組み込み手続きを覚えられるし、有意な練習問題だし、関数型言語の考え方も学べるし、と3度おいしい。 Emacsよりvi派だったんですが、Lisp系言語(Gaucheもそうです)を編集する際には、さすがに使いやすいです。手続き型言語では必ず発生するインデント戦争も、Emacsの自動インデントが賢いおかげで起こらない気がします。今、とってもEmacs本が欲しいです。id:naoyaオススメのこの本に興味津々。キーストロークを暗記しようとするより、何故そのキーストロークでその機能が実行されるのかという背景を学習した方が有意だと思うのです。

2008年3月17日

オライリー 「プログラミング Gauche」を読んでいます その1

オライリーの「プログラミング Gauche」の読書記録を付けます。JavaScript本よりはサクサク読めそうですが、実際にコードを入力してみようと思うので、結局トントンになりそうです。

「第1部 予備知識」は「1章 LispとScheme」「2章 Gaucheの特徴」「3章 Gaucheの設計思想や誕生の背景」の3つで構成されており、一気に読みました。

「第2部 Gaucheの基礎練習」から実際のコードが出てくるようなので、一時中断して、「付録A Gaucheインストール」「付録B Emacsの設定」を行いました。

Gaucheのインストール

OSはDebian GNU/Linux Etch 4.0r1です。apt(Debianのパッケージ管理ツール)には古いバージョンのGaucheしかなかったため、ソースからコンパイルを行いました。特に難しい点はなく終了。

wget http://prdownloads.sourceforge.net/gauche/Gauche-0.8.13.tgz
tar zxvf Gauche-0.8.13.tgz
cd Gauche-0.8.13
./configure
make
sudo make install
gosh -V

.zshrcの設定

Gaucheの実行プログラムである"gash"(発音はどちらも"ゴーシュ"。こういう遊び心は大好き)を実行しようとするとzshが打ち間違いだと思い、修正候補を表示してしまうので、nocorrectでこの機能を無効にします。.zshrcに以下の1行を追加。

alias gosh='nocorrect gosh'   # no spelling correction on gosh

Emacsのインストール

こちらは最新が22.1というバージョンのようですが、そんなに最新の機能は(きっと)要らないので、aptから21.4をインストールしました。Emacs用の設定ファイルである.emacsは本書のサポートページからダウンロードして、それを利用させて貰うことにします。自分用のカスタマイズはいずれ行いますが、まずは"守破離"の順番を守ります。

wget "http://www.kahua.org/cgi-bin/viewvc.cgi/ProgrammingGauche/trunk/appB/dot_emacs?view=co"
mv dot_emacs\?view=co .emacs

今日はここまで。

2008年3月11日

JavaScript いきなり大苦戦

所詮、本を一冊読んだ程度じゃこの程度だよ!「特定のタグの下にあるすべてのチェックボックスをオンにする」だけで苦戦中。XPathでやろうとしているんだけど、ネームスペースの概念がよくわからねー。すげぇ楽しいんで、ガンバル。 (追記) XPathがうまくいかんので、DOM APIでやってみたところ、getElementsByTagNameの呼び出し回数がえらいことになった。なるほど、先人はこの苦労を重ねたあげくprototype.jsの$()関数にたどり着く訳か・・・。
function checkAllOrNothing(checked) {
  if (typeof checked == "undefined") {
    checked = true;
  }

  var inputs = document.getElementById("release_list").
                getElementsByTagName('form')[1].
                getElementsByTagName('div')[0].
                getElementsByTagName('div')[3].
                getElementsByTagName('table')[0].
                getElementsByTagName('tbody')[0].
                getElementsByTagName('input');

  for (var i = 0; i < inputs.length; i++) {
      if (inputs[i].type == "checkbox") {
          inputs[i].checked = checked;
      }
  }

  return false; // アンカー・ボタンの標準動作を抑制する
}
ネストが大変なことにwww タグにIDで名前を付ける重要性を理解した今日この頃です。

2008年3月 9日

オライリー JavaScript 第5版 を読んでいます その7

ようやく読み終わりました。 前回 Studio H.F.F.:オライリー JavaScript 第5版 を読んでいます その6 今回もファミレスで読書。「21章 JavaScriptとXML」「22章 クライアントサイドグラフィックの制御」「23章 JavaアプレットとFlashムービーの制御」と読んでついに読了しました! 読み始めたのが、2月19日なので、20日ほどかかったようです。しかし、これでJavaScriptの基礎はバッチリ把握出来たので、時間をかける価値があったと思います。 早速、開発中のWebサイトにJavaScriptを使用した機能を追加したり、有名なライブラリのコードリーディングをしたいと思います。

2008年3月 8日

オライリー JavaScript 第5版 を読んでいます その6

週末は読書の日! と言うことで、ファミレスで昼食を摂りつつ、読んできました。 前回 Studio H.F.F.:オライリー JavaScript 第5版 を読んでいます その5 「17章 イベントとイベント処理」の途中から再開して、「18章 フォームとフォーム要素」「19章 クッキーとクライアントサイドの永続性」「20章 HTTPの制御」まで読み終わりました。コア言語に比べれば、軽い章ばかりだったので、サクサクと進んでいます。次回で読破となりそうです。 P.S.今回は駅前のファミレスで読んでいたのですが、人の出入りが多いので、ちょっと落ち着かったです。いつものバイパス沿いのファミレスの方が良さそうな感じです。近いうちに、神戸屋レストランにも行ってみようと思うのですが、ウェイトレスさんが気になって集中できないような気もします(笑)

2008年3月 2日

オライリー JavaScript 第5版 を読んでいます その5

前回の続き。 Studio H.F.F.:オライリー JavaScript 第5版 を読んでいます その4 今日はスタバまで行って読んできました。他にも読書をしている人がたくさんいたので、長居しても良さそうな雰囲気が嬉しいです。「15章 ドキュメントの制御」から再開し、「16章 CSSとダイナミックHTML」、「17章 イベントとイベント処理」の途中で終了。重たい内容を扱っている章を2つぐらい読むと集中力が限界に達するようです。自分の読書ペースがわかってきて嬉しい。

2008年3月 1日

オライリー JavaScript 第5版 を読んでいます その4

前回の続き。 Studio H.F.F.:オライリー JavaScript 第5版 を読んでいます その3 「12章 Javaをスクリプトする」から開始。さくっと読み終えて第1部終了。いよいよブラウザ上でのJavaScriptを扱う第2部へ。「13章 Webブラウザに組み込まれたJavaScript」「14章 ブラウザウィンドウの制御」と読み進み、「15章 ドキュメントの制御」の途中で終了。第2部は言語ではなく、環境を取り扱っているだけなので、第1部の内容をしっかりと理解していればサクサク読めます。

2008年2月27日

オライリー JavaScript 第5版 を読んでいます その3

前回はこちら。 Studio H.F.F.:オライリー JavaScript 第5版 を読んでいます その2 「9章 クラスとコンストラクタとプロトタイプ」の続きからスタートして、「10章 モジュールと名前空間」「11章 正規表現パターンマッチング」まで読んだ。10章は、言語ではサポートしていない機能を擬似的に実装する方法が載っていた。最近のJavaScriptライブラリがグローバル名前空間を汚さない方向に向かっているようなので、そのようなライブラリを(作る|コードリーディングする)際に参考になりそう。今はさらっと流す。11章は、正規表現自体は知っているので、さくっと読めた。 出来れば「12章 Javaをスクリプトする」まで読みたかった。そこまで読めば、第1部は読み終わるので。しかし、寝る時間なので、諦め。ページで言うと219ページまで読み終わったようです。

2008年2月24日

オライリー JavaScript 第5版 を読んでいます その2

前回の続き。 Studio H.F.F.:オライリー JavaScript 第5版 を読んでいます ファミレスで夕飯を食べつつ、1時間ほど読んできました。 「8章 関数」と「9章 クラスとコンストラクタとプロトタイプ」の半分を読み進めることが出来ました。 プロトタイプについてはしっかり理解できたのですが、クロージャは消化し切れていません。一昔前のC言語の時代は、初心者が躓くところと言えば、「ポインタ」だったのですが、今はこのクロージャがそうなのかなぁ、と思います。ポインタを理解し切らなくてもC言語のプログラムはそれなりに出来ますが、理解しておいた方がより効率的なコードが書けました。クロージャも同じようにしっかり自分の言葉で説明できるレベルまで理解したいです。 今日は170ページまで読み進めました。この山を越えたらコア言語としてのJavaScriptの山場は終わりそうです。あまり日を空けずに駆け抜けたいところです。

2008年2月19日

オライリー JavaScript 第5版 を読んでいます

分厚くて敬遠していたのですが、とても読みやすかい。もっと早めに手を出せば良かった。 他の主要言語との違いや利便性のために原則を破っている箇所、どうしてこのような実装になっているのかという理由が併記してあるのが素晴らしい。JavaScriptのライブラリを読むと、言語機能なのか、トリッキーな使い方なのか、仕様の穴を付いたのか、わからないことが多いのだけど、これで基礎を固めておけば、惑わされることもなさそうだ。 (下手に他の言語を知っているだけ素直に受け取れないということだと思う。どのような原理で動いているのか気になってしまう。最初の言語なら「そういうもの」として素直に受け取れたのだと思う。) 読み始めて3日目で、125ページまで読み終わった。全629ページを読むには、あと12日ぐらいかかるようだ。

2008年2月14日

OpenIDについて調査しました Part2

仕様書を「7.3.2.2. Extracting Authentication Data」まで読んだ。和訳してくださってるid:ZIGOROuさんに感謝します。ここまでしか集中力が持たなかった。その代わり、妥協はしてないので、読んだところは理解出来た・・・と思う。 んで、Railsのプラグイン open_id_authenticationを入れてみたところ、OpenID 2.0には対応していないよ、と書いてあってしょんぼり。もちろん、学習は続けますけれど。

2008年2月13日

OpenIDについて調査しました

自作アプリのユーザ管理を自前からOpenIDに変えようかと考えています。 早速調査をしてみました。WikipediaとはてなブックマークからOpenID関連情報をチェック。有益そうな情報をすべてはてなブックマークに登録。 HTTPベースの認証なので、あまり複雑なところはなく、すぐに理解できそうです。次は仕様書(英語)とサンプルプログラムの作成を行いたいと思います。土曜日にでもやろうかな。

2008年1月19日

Debian etch Rails環境構築メモ

はじめに

Mac mini(intel)にDebian etchをインストールし、Rails環境を構築した際の作業メモです。Debian etchは最小構成でインストールしています。

各作業は一般ユーザでログインした状態で開始した場合のコマンドです。

Mac依存箇所はありませんので、Rails環境構築の際、参考にしてください。

SSHのインストール

su -
apt-get install ssh
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
awk ' { if ($0 ~ /PermitRootLogin/ ) { print "PermitRootLogin no" } else { print $0 } } ' /etc/ssh/sshd_config.default > /etc/ssh/sshd_config
/etc/init.d/ssh restart

rootによるログインを不可に変更しています。参考URLではviを使用していますが、今後、自動インストールに対応させたいので、コマンドラインで実行しています。awkが最適な方法なのかは自信がありません。冗長すぎる感じがします。
参考URL:SSHの導入 - Debian(etch)|窓の便利帳

zshのインストール

su -
apt-get install zsh

以前(sarge)は4.2.5。etchは4.3.2

sudoのインストール

su -
apt-get install sudo
echo -e 'hajime\tALL=(ALL) ALL' >> /etc/sudoers

本当はvisudoで編集したほうが安全です。

開発ツールのインストール

sudo apt-get install gcc g++ make zlib1g-dev libreadline5-dev openssl libssl0.9.7 libssl-dev

Subversionのインストール

以前(野良コンパイル)で1.4.3。etchは1.4.2dfsg1-2。バージョンが下がるのは悪影響が出かねないので、野良コンパイル。
参考URL:Studio H.F.F.:Subversion 1.4.3 install

wget http://subversion.tigris.org/downloads/subversion-1.4.3.tar.gz
wget http://subversion.tigris.org/downloads/subversion-deps-1.4.3.tar.gz
tar xzvf subversion-1.4.3.tar.gz
tar xzvf subversion-deps-1.4.3.tar.gz
cd subversion-1.4.3
./configure --without-berkeley-db
make
sudo make install

Rubyのインストール

以前(野良コンパイル)は1.8.6-p36。etchは1.8.2-1。最新の1.8.6-p111を野良コンパイル。
参考URL:Studio H.F.F.:Ruby 1.8.6 / RubyGems 0.9.2 インストール

wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p111.tar.gz
tar xzvf ruby-1.8.6-p111.tar.gz
cd ruby-1.8.6-p111
./configure
make
make test
sudo make install

RubyGemsのインストール

参考URL:Studio H.F.F.:Ruby 1.8.6 / RubyGems 0.9.2 インストール
今回は0.9.4をインストール。Rails2.0からこのバージョン以上が必須になったらしいので。
0.9.5からはsetup.rbの仕様が変わるので注意(ハマりにハマった)

# 環境変数を使うので、sudoではなくsuで実行
su -
# ruby setup.rb installでGEM_HOME環境変数を使用する
# 設定していない場合、sourcesという必須gemがインストールされない(ハマった)
# gemをインストールする際に設定する必要があるので、rootの.profileに書いておくと楽
export GEM_HOME=/usr/local/rubygems
mkdir $GEM_HOME
wget http://rubyforge.org/frs/download.php/20989/rubygems-0.9.4.tgz
tar xzvf rubygems-0.9.4.tgz
cd rubygems-0.9.4
ruby setup.rb config
ruby setup.rb setup
# インストール先ディレクトリの確認
ruby setup.rb show
ruby setup.rb install

vimのインストール

7.1系が出ていたけど、コンパイル実績のある7.0系にしました。
今回はSubversionからソースを取得。最新の7.0系安定版パッチ243を使用。
参考URL:Studio H.F.F.:Vim 7.0 install

svn co http://vim.svn.sourceforge.net/svnroot/vim/tags/vim7.0.243/
cd vim7.0.243
./configure --enable-multibyte --enable-xim --enable-fontset --without-x --enable-rubyinterp --with-features=big
make
sudo make install

rails.vimのインストール

vimでRailsを編集する際の支援プラグインをインストール。
参考URL:Studio H.F.F.:rails.vim install

svn co http://svn.tpope.net/rails/vim/railsvim
cd railsvim
mkdir ~/.vim
cp -pr plugin doc autoload ~/.vim

MySQLのインストール

参考URL:Studio H.F.F.:MySQL 4.1 install

sudo apt-get install mysql-server-4.1

lighttpdのインストール

sudo apt-get install lighttpd

Railsのインストール

su -
#環境変数を設定していないなら下の1行を実行
export GEM_HOME=/usr/local/rubygems
gem install rails --version 1.2.3 --remote --include-dependencies

Capistranoのインストール

参考URL:Studio H.F.F.:Capistrano 2.1 利用法

su -
#環境変数を設定していないなら下の1行を実行
export GEM_HOME=/usr/local/rubygems
gem install capistrano --include-dependencies

Mongrelのインストール

バージョンは開発と同じ。mongrel=1.0.1、fastthread=1.0。

su -
#環境変数を設定していないなら下の1行を実行
export GEM_HOME=/usr/local/rubygems
gem install mongrel --version 1.0.1 --remote --include-dependencies

2007年12月21日

移行終わった

Mac miniはディスプレイを接続しておかないと起動できないという罠はあったものの、サーバ移行完了。後は数日様子を見よう。作業履歴はまとめて公開する予定。

2007年12月20日

RubyGemsでハマったけど、順調に推移中

RubyGemsを入れようと公式サイトを確認したら、今日付で1.0が出ており、つい入れようとしてとてもハマった。良い勉強にはなったので、別エントリで書きたい。 今日は本番環境の構築がほぼ終了。lighttpd+mongrelでトップページの表示を確認できた。あとはデータ移行すれば完了。

2007年12月 2日

Code Craft買ってきた

プログラマ向けの(技術|啓蒙)書。 「よ〜し、パパ一気に読み切っちゃうぞ」と気張っていたんですが、7000円近くするだけあってすごい分量です。これは土日でも読み終わらないかもわからんね。 P.S. GANTZは一気に21巻まで読めた。あっという間に5時間経ってましたよ。おもしろいマンガって恐ろしい。 P.S.2. マンガと比較すると文字ばかりの本はまだまだ心理的圧迫が高いというコトかしら?

2007年11月13日

Capistrano 2.1 利用法

Capistranoとは、アプリケーションの配布・再起動などを簡単に行えるツールです。CapistranoはRubyで作られており、簡単に拡張することができます。特にRuby on Railsとの相性がよく、サーバ名などを設定するだけで使用することができます。 Capistranoの解説記事はあちこちで見かけることができますが、最新の2.0系では利用方法が変わっており、以前の記事があまり役に立たなくなっています。今回、2.1で環境構築したので、その際に得たノウハウをまとめておきます。 使用した環境は以下の通りです。
  • Debian GNU/Linux Sarge
  • Ruby 1.8.6
  • RubyGems 0.9.2
  • Rails 1.2.3
  • Mongrel 1.0.1
  • Subversion 1.4.3
  • Capstrano 2.1.0
CapistranoはRubyGemsを使用してインストールします。その際にいくつかの関連パッケージが必要になります。以下のコマンドでCapistranoをインストールできます。
# gem install capistrano --include-dependencies
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed capistrano-2.1.0
Successfully installed net-ssh-1.1.2
Successfully installed needle-1.3.0
Successfully installed net-sftp-1.1.0
Successfully installed highline-1.4.0
Installing ri documentation for net-ssh-1.1.2...
Installing ri documentation for needle-1.3.0...
Installing ri documentation for net-sftp-1.1.0...
Installing ri documentation for highline-1.4.0...
Installing RDoc documentation for net-ssh-1.1.2...
Installing RDoc documentation for needle-1.3.0...
Installing RDoc documentation for net-sftp-1.1.0...
Installing RDoc documentation for highline-1.4.0...
正常にインストールされた場合、capというコマンドが使えるようになります。このコマンドを使って、アプリケーションの配布などを行います。
$ cap --version
Capistrano v2.1.0
RailsにCapistranoを組み込むためには、capifyコマンドの第一引数にRailsプロジェクトのルートディレクトリを指定して実行してください。Capfileとconfig/deploy.rbの2つのファイルが作成されます。
$ capify work/cap_test
[add] writing `work/cap_test/Capfile'
[add] writing `work/cap_test/config/deploy.rb'
[done] capified!
CapfileとはmakeにおけるMakefileやrakeにおけるRakefileのようなものです。このファイルにはタスクを記述することができます。しかし、Rails用の基本的なタスクはすでに定義されているため、特に記述しないで利用することができます。追加タスクを作りたい場合や、既存のタスク内容を変更したい際に編集します。初期状態でのCapfileの内容は以下の通りです。
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
config/deploy.rbにはRailsの配布サーバやソース管理サーバなどを設定します。初期状態でのconfig/deploy.rbの内容は以下の通りです。
set :application, "set your application name here"
set :repository,  "set your repository location here"

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"

# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "your app-server here"
role :web, "your web-server here"
role :db,  "your db-server here", :primary => true
applicationにはアプリケーション名を指定します。配布先のディレクトリ名などに利用されます。repositoryにはSubversionのリポジトリへのパスを指定します。アプリケーションの配布を行う際はここから取得されます。標準のアプリケーションの配布先は/u/apps/#{application}です。変更したい場合は、deploy_toに配布先のパスを設定します。scmにはソースコード管理システムの名称を指定します。標準ではSubversionになっていますが、この値を変更することによってCVSなどのソースコード管理システムを利用することができます。MicrosoftのVisual Source Safeには対応していないそうです。app・web・dbにはアプリケーションサーバ・ウェブサーバ・データベースサーバの名前、もしくはIPアドレスを指定します。 以上が標準的な設定ですが、他にもいくつか設定できる項目があります。残念ながらCapistranoはまだドキュメントが充実しておらず、ソースコードやコミュニティBBSから情報を集めるしかないようです。以下、便利そうなものをいくつか紹介します。
set :scm_user, "Your SCM user name"
set :scm_password, "Your SCM Password"
ソースコード管理システムにログインするユーザ名・パスワードを指定出来ます。
set :use_sudo, false
標準はtrue。コマンドを実行する際にsudoを利用しなくなります。レンタルサーバなのでsudoが利用できない場合に便利かと思います。
set :user, "Your user name"
サーバにログインする際のユーザを変更できます。
default_run_options[:pty] = true
標準はfalse。pseudo-ttyを利用するかどうか設定できます。バージョン2.1からpseudo-ttyを標準では利用しないようになったのですが、いくつかのサーバでは問題が発生することがあり、その際にはこのオプションをtrueに変更すると以前と同じ動作をするよ、ということのようです。
default_run_options[:shell] = false
標準はtrue。コマンドを実行する際にsh -c "コマンド"で発行するのですが、これを無効にすることが出来ます。 コマンド実行について Capistranoのコマンドを実行する際にはcapというコマンドを使います。 まずはcap -Tでコマンドの一覧を確認します。
$ cap -T
cap deploy               # Deploys your project.
cap deploy:check         # Test deployment dependencies.
cap deploy:cleanup       # Clean up old releases.
cap deploy:cold          # Deploys and starts a `cold' application.
cap deploy:migrate       # Run the migrate rake task.
cap deploy:migrations    # Deploy and run pending migrations.
cap deploy:pending       # Displays the commits since your last deploy.
cap deploy:pending:diff  # Displays the `diff' since your last deploy.
cap deploy:restart       # Restarts your application.
cap deploy:rollback      # Rolls back to a previous version and restarts.
cap deploy:rollback_code # Rolls back to the previously deployed version.
cap deploy:setup         # Prepares one or more servers for deployment.
cap deploy:start         # Start the application servers.
cap deploy:stop          # Stop the application servers.
cap deploy:symlink       # Updates the symlink to the most recently deployed ...
cap deploy:update        # Copies your project and updates the symlink.
cap deploy:update_code   # Copies your project to the remote servers.
cap deploy:upload        # Copy files to the currently deployed version.
cap deploy:web:disable   # Present a maintenance page to visitors.
cap deploy:web:enable    # Makes the application web-accessible again.
cap invoke               # Invoke a single command on the remote servers.
cap shell                # Begin an interactive Capistrano session.

Some tasks were not listed, either because they have no description,
or because they are only used internally by other tasks. To see all
tasks, type `cap -Tv'.

Extended help may be available for these tasks.
Type `cap -e taskname' to view it.
cap deploy:setupで配布先サーバにCapistranoで必要なディレクトリを作成します。このコマンドは配布先サーバが変更、または増えた場合にも実行する必要があります。
$ cap deploy:setup
  * executing `deploy:setup'
  * executing "umask 02 && mkdir -p /home/hajime/production/nanigadeta /home/hajime/production/nanigadeta/releases /home/hajime/production/nanigadeta/shared /home/hajime/production/nanigadeta/shared/system /home/hajime/production/nanigadeta/shared/log /home/hajime/production/nanigadeta/shared/pids"
    servers: ["localhost"]
    [localhost] executing command
    command finished
Capistranoでは実行しているコマンドがこのようにログに表示されるため、処理内容の確認がしやすくて良いです。 続いて、cap deploy:coldで初回配布を行います。(coldの意味がわからないけど、初回はこれらしい) コマンドを実行するとSubversionから最新のソースコードが取得され、setupで作成したreleaseディレクトリ以下のサブディレクトリに格納されます。最後にcurrentディレクトリにシンボリックリンクが張られます。最新版を参照する際は常にcurrentディレクトリを見ればよいわけです。 coldの意味を調べました。 /opt/local/rubygems/gems/capistrano-2.1.0/lib/capistrano/recipes/deploy.rbのdesc曰く
Deploys and starts a `cold' application. This is useful if you have not deployed your application before, or if your application is (for some other reason) not currently running. It will deploy the code, run any pending migrations, and then instead of invoking `deploy:restart', it will invoke `deploy:start' to fire up the application servers.
拙い和訳
`cold'アプリケーションを配布し、起動します。以前にアプリケーションを配布していない場合や、(なんらかの理由で)現在あなたのアプリケーションが稼動していない場合に便利です。これは、コードを配布し、保留されているすべてのマイグレーションを実施し、そして、'deploy:invoke'を実行します。 これは、 'deploy:start'を実行し、アプリケーションサーバを起動します。
deployとの違いはmigrateの実施の有無だけでした。「固まって凍っていた」アプリケーションを配布することによって解凍する、という意味合いのようです。 Twitter上でnorioさんに助けていただきました、ありがとう!
2回目以降の配布はcap deployで行えます。環境構築をするまでは大変ですが(自分はSSHがらみでハマりました)、一度構築してしまえば、アプリケーションの配布が楽になり、作業負担やケアレスミスを減らすことができます。 以下、Mongrel用の解説です。 アプリケーションの配布が正常に終了すると、Capistranoはサーバの再起動を試みます。この際に利用するコマンドがscript/spinです。ここにWebサーバごとの起動コマンドを記述する必要があります。自分の場合、フロントにlighttpdを利用して、バックには4つのMongrelプロセスを8000〜80003番のポートで開いています。フロント側はシステム起動時に起動しているので、バックのMongrelの起動方法をscirpt/spinに記述します。
/path/to/rails/application/current/script/process/spawner -p 8000 -i 4
/path/to/rails/applicationは適宜置き換えてください。最後にSubversionでこのファイルに実行属性を付加するように指定しておきます。
$ svn proplist script/spin
Properties on 'script/spin':
  svn:executable
解説は以上です。独自タスクの作成など他にもいろんな機能があるので、ぜひ調べてみてください。

2007年11月 6日

Debian(sarge)でsudo gem〜ってしたいんだけど、動かない(未解決)

気がついたら2時間粘ってる。sudoには詳しくなれたが解決はしていない。 Blogなどを参考にRubyGemsをインストールするときに発行するコマンドが
$ sudo gem install rails
ってな感じになるんですが、Debian(Sarge)だと
sudo: gem: command not found
って動かないんですよ。gemをフルパスで指定すると
$ sudo /opt/local/bin/gem install rails
/opt/local/bin/gem:9:in `require': no such file to load -- rubygems (LoadError)
from /opt/local/bin/gem:9
今度は環境変数GEM_HOMEも参照できない模様。しょうがないので、suしてgemしてたんですが、いい加減、気にくわないので、ちゃんと調べてみた。でも、解決しなかった! 問題点は2つありまして
  • 環境変数PATHが使えない
  • 環境変数GEM_HOMEが使えない
どっちも環境変数だし、同じ原因だろうと思っていたんですが、後者は解決できたんですが、前者は特例扱いらしく未だにダメです。 原因はsudoコマンドのセキュリティ強化のようです。 CVE - CVE-2005-4158 (under review)
Sudo before 1.6.8 p12, when the Perl taint flag is off, does not clear the (1) PERLLIB, (2) PERL5LIB, and (3) PERL5OPT environment variables, which allows limited local users to cause a Perl script to include and execute arbitrary library files that have the same name as library files that are included by the script.
ブラックリスト方式からホワイトリスト方式なったと。同時にリストを操作する方法も追加されたので、変更してみました。スーパーユーザでvisudoを実行すると/etc/sudoersがエディタで開かれるので以下の行を追加。
Defaults env_keep+="PATH GEM_HOME RUBYLIB"
env_keepという変数に+=で値を追加しています。PATHとGEM_HOMEとRUBYLIB。詳しくはsudoers(5)を参照してください。 これで後者は解決しました。gemをフルパスで指定すると無事に起動しました。しかし、PATHについては利用してくれない・・・。 いろいろを見てみたところ、
$ echo $PATH
/opt/local/rubygems/bin:/opt/local/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
$ printenv PATH
/opt/local/rubygems/bin:/opt/local/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
$ sudo echo $PATH
/opt/local/rubygems/bin:/opt/local/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
$ sudo printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
変数には設定されているけど、環境変数には設定されていない・・・?sudoが強制的に初期化している気がします。初期値がどこに入っているのかを探したのですが、見つからず。そろそろソースコード見なきゃいけない領域に入ってしまったので、後日に回します。 しかし、まぁ
$ sudo `which gem` install rails
で実行できるようになったのは、小さいながらも成果だと思いたい。

2007年8月 4日

LL魂、参加してきました

Lightweight Language 魂。軽量言語(コンパイルが要らなかったり、型宣言が不要だったり、言語機能が豊富だったりする奴らですな)の祭典です。初参加であります。 基調講演に多少遅れて到着したのですが、積分機(コンピュータの原型。ほとんど機械。出力は棒の回転数で出るらしい)の話をしていてビックリ。まさに原初のハッカー。 席は7割ほど埋まっていました。RubyKaigi2007は席確保に留意しなくてはいけなかったのですが、これぐらい空いているとあまり気にしなくても良いので、助かります。運営としてはやばいんでしょうけど。 今回はレポートはナシです。「Language Update」と「キミならどう書く」のセッションがおもしろかったです。他言語|他人の考え方や思想を知るのはとても楽しい。逆に「VM魂」は個人的にはいまいち。前半の発表は良かったのだけど、ディスカッションでの司会の質問が的を射ているようには思えず、退屈に感じました。「Lightning Talk」はどのイベントでも楽しいです。「これはあとで試そう」というものが1,2個は見つかるのでとても良い刺激になります。 印象に残ったどうでも良いこと。
  • Matzに騙された(笑)
  • 来年の会場をすでに確保済みとか仕事早すぎ
お疲れ様でした。

2007年6月30日

Railsでhelperをテストする

Railsの開発でちょっとしたhelperを作った。レコードの日付と現在日付を比較して、一定の期間毎に違うCSSクラス名を返す。各CSSクラスでは背景色だけが違い、それによって視覚化できるというもの。 簡単ではあるんだけど、日付を4つのパターンに分解するので、境界が多い。コードも甘いような気がするので、後々のリファクタリングのために、テストを自動化しておこうと思った。
def get_tr_class( result )
  return "tr_past" if result.release_date.blank?

  now_term      = 14 # Days
  future_border = now_term.days.since.strftime('%Y/%m/%d')
  today         = Time.now.strftime('%Y/%m/%d')
  past_border   = now_term.days.ago.strftime('%Y/%m/%d')

  if result.release_date < past_border
    "tr_past"
  elsif result.release_date > future_border
    "tr_future"
  elsif result.release_date <= future_border && result.release_date > today
    "tr_soon"
  else
    "tr_now"
  end
end
ところが、Railsってhelperのテストを行う箇所がないのですね。行いたいテストはunitテスト程度の単純なもの。functionalテストでデータを用意し、responseから該当部分を探すという手もあるけど、ちょっと大袈裟すぎ。 色々考えた結果、プリミティブなオブジェクトを作って、それにhelperの機能を追加してみた。
def test_get_tr_class
  helper = Object.new.extend(ReleaseHelper)
  r = Result.new( :release_date => 15.days.since.strftime('%Y/%m/%d') )
  assert_equal "tr_future", helper.get_tr_class( r )
  r = Result.new( :release_date => 14.days.since.strftime('%Y/%m/%d') )
  assert_equal "tr_soon", helper.get_tr_class( r )
  r = Result.new( :release_date =>  1.days.since.strftime('%Y/%m/%d') )
  assert_equal "tr_soon", helper.get_tr_class( r )
  r = Result.new( :release_date =>  Time.now.strftime('%Y/%m/%d') )
  assert_equal "tr_now", helper.get_tr_class( r )
  r = Result.new( :release_date =>  1.days.ago.strftime('%Y/%m/%d') )
  assert_equal "tr_now", helper.get_tr_class( r )
  r = Result.new( :release_date => 14.days.ago.strftime('%Y/%m/%d') )
  assert_equal "tr_now", helper.get_tr_class( r )
  r = Result.new( :release_date => 15.days.ago.strftime('%Y/%m/%d') )
  assert_equal "tr_past", helper.get_tr_class( r )
  r = Result.new # release_date is blank
  assert_equal "tr_past", helper.get_tr_class( r )
end
テストは機能的にはunitレベルといえ、helper自体がControllerに属するのでfunctionalに追加した。 この方法で正しいのでしょうか?「俺はこうやってるよ」などの意見を伺いたいです。

2007年6月28日

Lighttpd インストール

とりあえずこんな感じで・・・。
wget http://apt.utsl.gen.nz/debian/pool/sarge-i386/lighttpd_1.4.5-1_i386.deb
dpkg -i lighttpd_1.4.5-1_i386.deb
Stable版のパッケージが出ていないので、wgetで取得して手動インストール。これが最適な解とは思えませんが、とりあえずこれで。

2007年6月27日

Lighttpdのインストールがうまくいきません

自作アプリがとりあえずの完成を見たので、公開用に準備をしました。構成はLighttpd+Mongrel。評価はしていないけど、評判がいいので、とりあえずこれで。Mongrelはgemで終了したんですが、Lighttpdで数時間ハマり、未だ解決せず。
  • パッケージをダウンロードしてきて、dpkg -iでインストール → 依存関係でエラー出まくりで解決出来ず
  • ソースからコンパイル → コンパイル成功。とりあえず動作しているが、/etc/init.d/lighttpdが動かない(自動化出来ない)
2番目は粘れば解決出来そうな雰囲気はあるんですが、素人がTRY&ERRORで直すには怖いなぁ。 次は、開発版のパッケージを取得してみよう。今からやるとまた明け方までやってそうなので、明日に回す。 プログラマとしてはノリノリで徹夜したいんですが、社会人としてはちゃんと睡眠を取って仕事に行かないといけないのが辛いところです。

2007年6月11日

Scrubyt ファーストインプレッション

半日ほど触ってみました。ドキュメントや機能に不足を感じる部分はありますが、ソースコードを読めばわかる程度の分量です。非常に楽しいライブラリでした。

早速、自サイトから読書履歴を抽出するスクリプトを作ってみました。

require 'rubygems'
require 'scrubyt'

mysite_data= Scrubyt::Extractor.define do
        fetch 'http://blog.studiohff.net/'
        click_link '読書'

        book do
                date '2007/06/10 22:06:34'
                title '「サイエンス夜話 不思議な科学の世界を語り明かす」 読了'
                readtime '3時間半'
        end
end

mysite_data.to_xml.write(open('result.xml', 'w'), 1)

出力はこんな感じ

  <root>
    <book>
      <date>2007/06/10 22:06:34</date>
      <title>「サイエンス夜話 不思議な科学の世界を語り明かす」 読了</title>
      <readtime>3時間半</readtime>
    </book>
    <book>
      <date>2007/04/24 01:36:13</date>
      <title>「Subversion 実践入門 第2版」を第1版と読み比べてみた</title>
    </book>

ハマった原因のほとんどは、英文読解能力の不足。公式サイトのサンプルがもっと多いと、英語が読めなくても雰囲気が掴めるので助かるなぁ、とは思います。

機能面で不足していると感じたのは、

  • 取得結果への編集
    今のところ、リードオンリーです。作成者も問題と認識しておりTODOになっているようなので、近いうちに改善するでしょう。
  • イテレータ
    mysite_data.book[0].dataという表現が出来るのに、mysite_data.book.each doは使えない。配列っぽくアクセス出来るなら、イテレータは欲しいところです。

DebianにScrubytをInstallしてみた

先日のRubyKaigi2007で朴 芝印さんがプレゼンしていたWebScrappingTool「scRubyt」をインストールしてみました。プレゼンでは「gem install」でOKとのことでしたが、結構はまりました。 日本 Ruby 会議 2007 「rubyでする Web scrapping - Hpricot と mechanize そして scRubyt (朴 芝印)」 まず、scRubytの公式サイトはこちらです。 scRUBYt! - a Simple to Learn and Use, yet Powerful Web Scraping Toolkit Written in Ruby 朴さんのサイトも探してみたのですが(プレゼン資料欲しい!)、見つからず。後日にでもRubyKaigi2007のサイトに登録されるといいなぁ、と言ってみる。 公式サイトに従ってインストール。インストール先の環境はDebian 3.1.r5です。パッケージは標準インストール時からいくつか追加してあります(ZLibとか)。同じ手順で行えば完璧にうまくいくという資料にはなってないです。申し訳ない。
su - root
gem install mechanize
gem install parsetree ruby2ruby
gem install scrubyt
gem install ParseTreeReloaded
最後の1行は公式サイトのインストール方法には記載されていないので注意してください。公式フォーラムに解決策が載っています。 LoadError: no such file to load -- parse_tree_reloaded - scRUBYt! これで問題ないはずなんですが、自分の環境にopensslが入ってなかったので、もうひとハマり。結局opensslの開発向けパッケージを入れて、Rubyを再コンパイルしたらうまくいきました。せっかくなので、最新パッチを適用してみます。(RubyKaigi2007開催中にリアルタイムリリースされた品です)
sudo apt-get install openssl libssl0.9.7 libssl-dev
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p36.tar.gz
tar zxvf ruby-1.8.6-p36.tar.gz
cd ruby-1.8.6-p36
./configure
make
make test
sudo make install
これでirbでrequire 'scrubyt'が成功。ようやく遊べる。

2007年6月10日

Ruby Kaigi 2007 第二日目 午後

午後でございます。そろそろ電池の残り量が不安です。昨日、電源が使えることを確認したのに、ACアダプタを忘れてしまった。モッタイナイ。
  • スポンサーセッション
    • 日本IBM システム・エンジニアリング RubyとDB2
      • Starter Toolkit for DB2 on Rails
      • DB2版Instant Railsのようなもの
      • WindowsとLinuxに提供
      • Intel Macの方は、Windowsを入れて試してください
      • gem install ibm_db
    • ニフティ
      • @nifty TimeLine β
      • http://timeline.nifty.com/
      • はてブ 590user
      • 「ニフティらしくないサービス」(良い意味で)
      • Railsで開発
      • 企画/開発一体型のトライアル
      • 技術系社員の技術力向上
      • Web開発プラットフォームの選定
      • 開発スタイル「本業の間に」
      • 「木曜はRailsの日」
      • アジャイル開発
      • システム構成 各種データについて
    • 楽天
      • Railsの導入を進めています
      • Rubyを社内標準の一つに
      • Rubyで独自の研究開発を行う
      • テクノロジー施策 「エンジニアが中心か?」「テクノロジーに貢献するか?」
      • 3月15日 Rubyプロジェクトサービスリリース
      • 5月31日 まつもとさんの技術フェロー就任
      • RadRails+CVS
      • Rubyサイコー!!!
      • 生産性が1.6倍〜3倍
      • 6月 Rubyプロジェクト第二弾 複数サービス+標準化
      • エンジニア60人以上を対象にRuby勉強会
    • NaCl
      • Network Applied Communication Laboratory(ネットワーク応用通信研究所)
      • 「えぬ・えー・しー・える」(「なくる」じゃないよ!)
      • 松江本社・東京支社・松江オープンソースラボサテライトオフィス
      • 業務内容
      • 研究
      • システムインテグレーション
      • 保守・運用
      • 教育・コンサルティング
      • まつもとゆきひろ氏在籍
      • http://www.ruby-lang.orgなどを提供
      • Rubyを業務に利用
      • Do not control
      • Spec(仕様)
      • Source
      • Matz 「do not control」というよりは「can not control」
    • (株)アスタリクス
      • 「アスタリスク」じゃなくて「アスタリクス」
      • Rails製CMS Rubricks
      • XOOPSを参考に開発
      • MITライセンス
      • Bizca
      • ビジネスマン向け社内システム
      • Rubricksで作られている
      • SaaS(Software as a Service)で公開
      • 6月末からサービス開始
      • Rubricks0.6は6月から7月にリリース
    • インフォテリア(株)
      • LimeChat・Ring開発
      • Cometサーバ
      • Java6で実装したが、パフォーマンス悪
      • Cで4週間で開発
      • epollでI/O multiplexingはシングルスレッドでも十分な性能が出る
      • Cは機能拡張が大変なので、今後はRubyで作りたい
      • Rubyでのボトルネックは、select&fd_set
    • (株)ドリコム
      • Rubyは仕事で使えますか?
      • やっと答えが出た/li>
      • 使えます
      • 以上
      • お知らせ
      • Award on Rails 2007
      • 優勝賞金100万円
      • 6/8エントリ
      • 7月から受付
      • 審査Matz
      • サーバ貸し出します
      • 去年との違い
      • 海外からの参加もOK
      • 開発を支援
      • 初心者講習会 7月
      • 開発合宿 8月から9月
      • Babie!!
      • Rails限定
      • BOON!
  • Inside Ruby/Tk (永井 秀利)
    • Ruby/TkとはRubyに標準添付されているグラフィックライブラリ
    • Tcl/Tkの全機能をRubyに移植したもの
    • 手軽にGUIを作成できるスクリプト言語
    • 標準構成は比較的コンパクト
    • 拡張ライブラリが多数
    • 欠点 真に使いこなすのは難しいかも
  • Hello Ruby-GNOME2 World (武藤 昌夫(むとう まさお))
    • Ruby-GNOME2の紹介
    • GNOMEの提供するライブラリをRubyからアクセスできるようにしたもの
    • X Windowベースのデスクトップ(ry
    • 何ができるの?
    • 画像処理
    • GUIツールキット
    • マルチプラットフォーム(Linux FreeBSD Mac Win)
    • RubyらしいAPI
    • Graphics 様々なフォーマットの画像・文字を扱う強力な画像処理ライブラリ群
    • Xと関係ない(Webアプリでも使えます)
    • rcario(ext) 超強力描画エンジン
    • GdxPixbuf 画像の読み込み保存
    • RSVG PDF
    • Widgets ボタンやラベルなどのGUI部品
    • GDK 主要なWidgets
    • GDK SoruceView シンタックスハイライト
    • GNOME Canvas
    • GtkGLExt
    • GtkMozEmbed
    • プレゼンツール Ruby−GNOME2で作ったラビット
    • GConf Winのレジストリのようなもの
    • Ruby-GetText-Package(ext) メッセージのローカライズ
    • Glade GUIビルダを使ったRapidアプリ開発
  • VisualuRuby計画(仮称)によるWindowsでのGUI開発 (nyasu)
    • Windows用GUI作成ライブラリ
    • Windows等のクラス化
    • イベント配送
    • sourceforgeでの開発
    • イベント受信方法
    • VBライク
    • ハンドラはFormオブジェクトのメソッド/li>
    • 長所 (昔の)Windows APIと相性が良い
    • 拡張容易
    • Windows用ライブラリ利用可能
    • 環境構築・配布が容易 他のDLLが不要
    • FormDegignerがある
    • 短所 メソッドの命名 作者すら混乱
    • 定数やAPIのラッブが不十分
    • レイアウトマネージャが弱い
    • GUIのコンポーネントが古い
    • 将来 インストール数が増加
    • 老兵は死なず、消え去るのみ??
    • 所感・雑感 思ったより使われている
    • vruby!=GUIを使う人(?)
  • RubyCocoa - RubyによるMac OS Xソフトウェア開発 (藤本 尚邦)
    • RubyCocoaとは?
    • RubyCocoaでできること
    • Ruby拡張ライブラリとして使う
    • Mac OS X nativeなアプリの開発
    • irbでCocoaをつつく
    • darkroom.rb WebKitフレームワークを使って指定されたURLをスクリーンキャプチャ
    • MailDemoActiveRecordBindings OS Xアプリケーション Railsの機能をアプリで利用
    • Wiiリモコン用プレゼンツール
    • CocoaはObjective-Cだが、Rubyでもいいんじゃ? → そのためのブリッジがRubyCocoa
    • 今年秋に1.0リリース
  • モテる Ruby!Ruby で画像編集のあの手この手 (舘野 祐一)
    • Ruby界隈で女性→デザイナ→画像→画像編集が出来ればモテる!
    • Rubyの画像ライブラリ
    • Ruby/GD,GD2
    • ImageScience
    • rcairo
    • RMagick
    • ImageMagickのRubyBinding
    • API
    • Document
    • Sample
    • 欠点 API大杉
    • 入れるのが大変
    • やりたいことが見つからないドキュメント
    • メモリリーク・微妙にバギー
    • はてなセリフ
    • favicon2
    • Polarize
    • StarMaker
    Ruby/SDLとその周辺 (大林 一平(ohai) / 原 悠(yhara))
    • Rubyでゲームを作るためのライブラリ
    • SDL(Simple DirectMedia Layer)のラッパ
    • SDLとは?
    • クロスプラットフォームなマルチメディアライブラリ
    • 様々なバックエンド(DirectX, GDI, X)
    • 様々な言語のライブラリ
    • 何が出来るか?
    • 2D高速描画
    • キーボード、マウス、ジョイパッド
    • 音声出力
    • 文字列描画
    • 何が出来ないか?
    • 高水準なGUI(ボタンなど)
    • 音声入力
    • 高度な画像加工・PNGの出力
    • 特徴
    • SDLのAPIに比較的忠実
    • 高速なAPIと便利だけど遅いAPIの両方を提供
    • 危険な機能は使えないように
    • それ以外はできるだけ機能を網羅
    • 高いポータビリティ
    • Ruby/SDL スタータキット
    • HSPの簡単さをRuby/SDLで実現
    rcairo (須藤 功平)
    • プレゼン画面下でウサギとカメがレース(Rabbit)
    • cairo(C)のRubyBinding
    • 1API, Multi-Output
    • 高品質
    • アンチエイリアス
    • アルファチャンネル
    • 拡大・縮小(ry
    私はいかにRubyでメディア・アート作品をつくり、しかも一円も損をしなかったか (えと こういちろう)
    • メディア・アート作品をRubyで作る
    • PS2ゲームの自動生成にRubyを使用
    • SGL
  • Island Ruby, or How To Survive Invasions, Immigrants, and Cultural Attacks(島国としてのRuby、我々はいかにして侵攻・移民・文化的侵略から生き延びるか)
    • 英語を聞き取ることと、拍手をすることで精一杯(笑) 技術に結びついているプレゼンではなく、心のプレゼン。最後のプレゼンにふさわしい内容。
閉幕後にdRuby本の著者の関 将俊さんにサインいただきました。巨体のヤツがいきなり話かけてしまってすいません。会話の内容を用意してなくてすいません。サインだけ頂いてすごすごと帰ってしまってすいません。サイン、ありがとうございました。dRuby役立てます。

Ruby Kaigi 2007 第二日目 午前

二日目の開始でございます。関係者席を除くと最前列の中央を確保。最高の環境です。頑張って吸収しよう。
  • もっと仕事で使うRuby (後藤 謙太郎(ごとけん))
    • 仕事で使うRuby(ワンライナー)
    • Linux+Zsh
    • Unixパイプ ようやく詳しい分野が来たw
    • ワンライナーからスクリプトに昇格した例
    • Rubyを糊として
    • 手をかけて新製品にw
  • JRuby on Rails でエンタープライズ Ruby (高井 直人)
    • JRubyブームに水を差す(笑)
    • 今日の目玉は日本語で話す(笑)
    • Javaでinterfaceを作成し、Rubyで実装。DSLにいいんじゃないか?
    • JRuby on Rails 98%のテストを通過
    • GoldSpike Survlet Container(GlassFish,Jetty,Tomcat)の上にRailsServletが乗っている
    • GoldSpike SingleWarファイルに出来る(個人的にはツボ)
    • Grizzly on Rails=Glassfish appserv-http-engine, IO Framework, JRuby Support
    • なぜJava? → Monitoring(JMX) C(Mongrel)では出来ない。RCM(リソース管理)。AsyncFilter(非同期フィルタ)
    • Webrick<Mongrel<Grizzly<Mongrel(C)
    • Railsが選ばなかったものはセンスがいい
    • Javaの世界で成熟したエンタープライズ技術を(JRubyを使って)Railsに組み込む
    • 「グラスに水が半分しか入っていない」ではなく「グラスに水が半分も入っている」と考えてほしい
  • OpenWFEru, a Ruby workflow engine (John Mettraux)
    • オープンソースでかかれたワークフロー管理?
    • 元々はJavaだったのをRubyに書き直した
    • アプリケーション?ソリューション?
    • なんのために使うの?
    • ビジネスプロセスの最適化
    • 参加者よりもプロセスの方がすぐ変わる
    • プロセスは一級市民だ
    • プロセスが一級市民な世界といえばOS
    • OpenWFEruはビジネスプロセスのOSだ!
  • AP4R : Ruby のための非同期メッセージングライブラリ (篠原 俊一 / 加藤 究)
    • AP4R=軽量なメッセージング
    • 特徴=軽量・堅牢
    • 優先度の高いものから処理する
    • 負荷分散
    • メッセージが消えたり、重複したりしてはだめ、確実な配送保証
    • デモ
    • AP4Rのイメージキャラクター「まじろう」
    • 適用事例
    • Working with Rails Blog投稿のフィードをキュー。非同期で取得 → スケールできる。フィードの種類に柔軟に対応
    • 社内サイト 新しいアプリはRailsで作りたいが、現行アプリはJava。早くてリッチなUI。Ruby・Javaのデータ変換。UIから重い処理を分離。JavaからRubyを呼び出す。
    • IRCでまじろう大人気
    • ユーザへの等々に不要な処理は非同期か
    • 別のトランザクションでよいか?
    • 外部呼び出し(遅い・不安定)
    • シンプルAPI
    • Railsとシームレスに連携
関さんのdRuby本買いました。近くの座席でお見かけしたので、サインをお願いしよう。

2007年6月 9日

Ruby Kaigi 2007 第一日目 午後

帰宅して、風呂入って、洗濯して、夕飯食べたら、もう22時です。このまま寝てしまいたいところですが、ざっとでも感想を書かないと、後日書こうとしたときに苦労しそうなので、頑張って書きます。 オフィシャルのログが強すぎるので、個人的感想だけでいいや、と開き直れて楽。 日本 Ruby 会議 2007 - RubyKaigi2007速報ログ ほぼリアルタイムで更新されてましたよ。すごすぎ。
  • まつもとさんの基調講演 初めての生「愛」講座。 Matzかっこいい。
  • 他言語ライブラリの利用 他言語の利用法をいくつか、それぞれの長所と短所。
  • Cより速いRubyプログラム パフォーマンスチューニングのお話。IRCでのつっこみが激しかった。
  • YAR(V)I Ruby1.9で採用されるVMのお話。これも突っ込み厳しめ。
  • rubyでする Web scrapping - Hpricot と mechanize そして scRubyt 実例のスライドで本日最大級の拍手と爆笑。まじめな話から唐突すぎて意表を突かれました。
  • Thw World in 30 Minutes 文字コード(Unicode)のお話。前半は何とかわかったけど、後半の合成文字とかはピンと来なかった。
  • Rinda: Answering the RubyConf and RubyKaigi dRuby本買う。
  • 以下、Lightning Talks
    • 数値データ管理・解析・可視化アプリケーション "Gfdnavi"。コンピュータと機器の精度が急激に増した結果、データ量が増え、解析・共有が大変になったので、なんとかしましょう、というお話。学会で共通フォーマットを策定したりはしないんすかね。
    • Software is Made of Design and Communication。マインドマップのすごいひと。手元の紙をビデオカメラで撮ってプロジェクタに表示し、リアルタイムで書き込んでいくのはおもしろかったです。
    • 「Ruby+Miyako」でおもろいプレゼン アニメネタが多かったのですが、爆笑してはいけないような気がしたので、笑いをかみ殺してました。チョココロネ。
    • Rubyでファミコンプログラミング Rubyコードからファミコンアセンブラを生成。プレゼンツールを作った。すごすぎ。
    • Ruby on Railsでデータマイニング おもしろそうなアプリケーションなので興味津々。プレゼン中に画面写真がなかったのが惜しまれます。後で試す。
    • Rubyのパーサーを拡張して "end" の対応付けをチェックする (山野 ゆき菜) 発表者重要(笑)
    • マルチコアプロセッサでのRubyプログラムの高速実行方式 並列化出来る部分をdRubyで行ったところ、8並列で6.67倍の速度が出たよ。8時間かかった作業がなんと1時間に!!しかしC言語なら12秒。
    • 「地域資源」Rubyと島根県の産業振興の取り組み Matzの地元、島根の方。お堅いプレゼンかな、と思っていたのに、予想外におもしろかったです。
    • 5分で作るCometチャット これは(良い意味で)ひどい
    • データで予想する Ruby のリリース Matzいぢり
    • 第2日本Rubyの会について Matzいぢり2

Ruby Kaigi 2007 第一日目 午前

img052.jpg 今、お昼休みでご飯を食べながら書いてます。 あとで清書するとして覚え書き。
  • プロジェクタは2台。右がプレゼン資料で、左がIRC表示。リアルタイムでツッコミや翻訳が表示される。とてもおもしろい。/li>
  • ささださん Ruby1.9 雲の上のお話。ただただ感心して聞くばかり。
  • 安定版Ruby 地味な安定版マネージャーのモチベーションの秘密は、コミット内容のチェックらしい。縁の下の力持ち、感謝。
  • マニュアル刷新 人手不足らしい。応募してみようかしら。軽い気持ちだと迷惑だろうし、ちゃんと考える。
  • JRuby Sunのエンジニアさんお二人。とても聞き取りやすい英語。質疑応答まで全部英語で驚いた。みんな、英語出来るんだねぇ。

2007年6月 5日

LL魂のチケットを購入しました

開催案内 | Event | Lightweight Language Spirit ruby-listにチケット販売開始告知が流れたので、慌てて会社付近のローソンへ行って購入しました。 今週末はRubyKaigi2007もあるし、どちらも楽しみです。

2007年4月14日

Ruby Kaigi 2007 チケット取れた

10時前に起きて気合いを入れて待機し、F5を200回ぐらい押してやっと確保して、勝利と幸福に酔いしれていたのですが、12時過ぎの現在もまだ普通に買える様子。しょぼにょろーん。

2007年4月 9日

Debian GNU/Linux 4.0 Release

リリースノート ようやく3.1での環境構築が一段落したというのに!! 最新機能が必要なわけでもないので移行はしません。 ただ、情報だけは追いかけておきたい。

RubyKaigi2007

日本 Ruby 会議 2007 - トップページ 4/14(土) 10:00からチケット販売開始。休日なのはありがたい。(寝坊|忘却)しないように気をつけよう。

2007年4月 3日

MySQL 4.1 install

Railsのマイグレーションを実行したところ、UTF8関連のエラーが発生。 調べてみたところ、MySQL 4.1以上を入れる必要があるらしい。 情報元 忘れたときに備えた記録 - MySQL の encoding 設定 , MySQL の encoding 設定 (2) , Amazonの規約 , Amazon始めました , MySQL の encoding 設定 (3)
$ apt-get install mysql-server-4.1
文字コード設定を/etc/mysql/my.cnfに追加。
[mysqld]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
再起動。
# /etc/init.d/mysql restart

MySQL install

5.0系の最新版を入れたいな、と思ったのですが、ハマったので、とりあえず4.0系で妥協。CRUDしか使ってないから大差ないだろう・・・。
apt-get install mysql-server

2007年4月 2日

Rails install

gem install rails -v 1.1.5 --include-dependencies
今までの開発バージョンと同じものを入れる。動作確認出来たら、1.1.xで最新に差し替え。

2007年3月31日

rails.vim install

2008年1月19日現在、rails.vimのRakefileにバグがあります。rails.vimを構成する3ファイル(plugin/rails.vim, doc/rails.txt, autoload/rails.vim)のうち、2ファイルしかパッケージングしないのです。
files = ['plugin/rails.vim', 'doc/rails.txt']
Rakefileの上記の部分にautoload/rails.vimを追加するか、パッケージを使用せずに手動でインストールする必要があります。いかに手動インストール方法を示します。(と言ってもコピーするだけですが)
svn co http://svn.tpope.net/rails/vim/railsvim
cd railsvim
mkdir ~/.vim
cp -pr plugin doc autoload ~/.vim

2007年3月30日

Vim 7.0 install

subversionであれだけはまったので、高機能エディタであるvimはやばいだろう〜、と思っていたのですが、案外さっくりと出来ちゃいました。 参考サイト 本体をダウンロード。wget便利すぎ。
# wget ftp://ftp.vim.org/pub/vim/unix/vim-7.0.tar.bz2
# wget ftp://ftp.vim.org/pub/vim/extra/vim-7.0-extra.tar.gz
# wget ftp://ftp.vim.org/pub/vim/extra/vim-7.0-lang.tar.gz
# tar xjvf vim-7.0.tar.bz2
# tar xzvf vim-7.0-extra.tar.gz
# tar xzvf vim-7.0-lang.tar.gz
パッチを適用。
# cd vim70
# mkdir patches
# cd patches
# wget ftp://ftp.vim.org/pub/vim/patches/7.0/7.0.001-100.gz
# wget ftp://ftp.vim.org/pub/vim/patches/7.0/7.0.101-200.gz
# zsh -c "wget ftp://ftp.vim.org/pub/vim/patches/7.0/7.0.{201..224}"
# gunzip 7.0.001-100.gz
# gunzip 7.0.101-200.gz
# cd ..
コンパイル。
# cat patches/7.0.* | patch -p0
# ./configure --enable-multibyte --enable-xim --enable-fontset --without-x --enable-rubyinterp --with-features=big
# make
# make install
とりあえず大丈夫そう。
# vim --version
VIM - Vi IMproved 7.0 (2006 May 7, compiled Mar 30 2007 16:30:55)
Included patches: 1-224
Compiled by root@udon
Big version without GUI.  Features included (+) or not (-):
+arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
+cryptv +cscope +cursorshape +dialog_con +diff +digraphs -dnd -ebcdic
+emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path
+folding -footer +fork() -gettext -hangul_input +iconv +insert_expand +jumplist
 +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap +menu
+mksession +modify_fname +mouse -mouseshape +mouse_dec -mouse_gpm
-mouse_jsbterm +mouse_netterm +mouse_xterm +multi_byte +multi_lang -mzscheme
-netbeans_intg -osfiletype +path_extra -perl +postscript +printer -profile
-python +quickfix +reltime +rightleft +ruby +scrollbind +signs +smartindent
-sniff +statusline -sun_workshop +syntax +tag_binary +tag_old_static
-tag_any_white -tcl +terminfo +termresponse +textobjects +title -toolbar
+user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace
+wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
-xterm_clipboard -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/local/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H     -g -O2       -I/usr/local//lib/ruby/1.8/i686-linux
Linking: gcc   -rdynamic -Wl,-export-dynamic  -L/usr/local/lib -o vim       -lncurses -lruby-static -ldl -lcrypt -lm

続いてはvim7.0の予定

  1. Subversionリポジトリからファイル取得に成功
  2. そろそろvimがデフォルトなのが気になる
  3. rails.vimというプラグインが良いらしい
  4. vim7.0以降だとさっくりインストール出来るらしい
  5. vim --version # => 6.3
  6. またソースから入れるか
  7. Debianインストール用の情報を調べる
  8. 結構大変そう ← いまここ(午前3時)
さすがに明日にしよう・・・。

2007年3月29日

Subversion 1.4.3 install

すでにApache+Subversionで構築したサーバあるので、Debianからはクライアントで繋ぐだけ。でも、せっかくだから、サーバも設定しておこうかな、と思ったのがトラブルの始まり。 BarkeleyDBが必要とのことなので入れてみる。
# wget http://download.oracle.com/berkeley-db/db-4.3.29.tar.gz
# tar xzvf db-4.3.29.tar.gz
# cd db-4.3.29/build_unix
# ../dist/configure
# make
# make install
Subversionのインストール
# wget http://subversion.tigris.org/downloads/subversion-1.4.3.tar.gz
# wget http://subversion.tigris.org/downloads/subversion-deps-1.4.3.tar.gz
# tar xzvf subversion-1.4.3.tar.gz
# tar xzvf subversion-deps-1.4.3.tar.gz
# cd subversion-1.4.3
# ./configure --with-berkeley-db=/usr/local/BerkeleyDB.4.3
# make
# make install
configureが通らず! BarkeleyDBのパスを指定しているのに見つからないと言われる・・・。 結局数時間挑んでもダメなのであきらめ。クライアントだけならBarkeleyDBは要らないらしい。
# wget http://subversion.tigris.org/downloads/subversion-1.4.3.tar.gz
# wget http://subversion.tigris.org/downloads/subversion-deps-1.4.3.tar.gz
# tar xzvf subversion-1.4.3.tar.gz
# tar xzvf subversion-deps-1.4.3.tar.gz
# cd subversion-1.4.3
# ./configure --without-berkeley-db
# make
# make install
無事インストール完了。
# svn --version --quiet
1.4.3
色々インストールしたので、バックアップしておいたVMwareのイメージを戻してクリーンインストール。仮想OSのこういう点は便利すぎます。

Ruby 1.8.6 / RubyGems 0.9.2 インストール

aptのrubyのバージョンが1.8.2だったので、ソースからコンパイルしました。 参考サイト 参考サイトとはバージョンが違いますが、問題なく使えました。最初にapt-getを忘れてはまりましたが・・・。 rubyインストール。
# apt-get install zlib1g-dev
# apt-get install libreadline5-dev
# wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.6.tar.gz
# tar xzvf ruby-1.8.6.tar.gz
# cd ruby-1.8.6
# ./configure --prefix=/usr/local/
# make
# make install
rubygemsインストール。
# wget -c http://rubyforge.org/frs/download.php/17190/rubygems-0.9.2.tgz
# tar zxvf rubygems-0.9.2.tgz
# cd rubygems-0.9.2
# mkdir -p /opt/local/rubygems
# export GEM_HOME=/opt/local/rubygems
# ruby setup.rb config --prefix=/opt/local/
# ruby setup.rb setup
# ruby setup.rb install
apt-get忘れた場合のリカバリ方法。
# cd ruby-1.8.6/ext/zlib
# ruby extconf.rb --with-zlib-include=/usr/include --with-zlib-lib=/usr/lib
# make
# make install
# cd ../..
# make clean
あとはruby makeからやり直しでOK。
$ ruby --version
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux]
$ gem --version
0.9.2

2007年3月28日

.zshrc作成

zshの環境構築。 以下のサイトを参考にさせていただきました。 /usr/share/doc/zsh/examplesにzshrc.gzがあるので、これをベースに構築しました。
$ cd /usr/share/doc/zsh/examples
$ cp zshrc.gz ~
$ cd ~
$ gunzip zshrc.gz
$ mv zshrc .zshrc
グローバル・エイリアス。「ls -ltr | tail」が「ls -ltr -g T 10」に省略出来る。便利!
alias -g L='| less'
alias -g H='| head'
alias -g T='| tail'
alias -g G='| grep'
alias -g W='| wc'
alias -g S='| sed'
alias -g A='| awk'
alias -g W='| wc'
プロンプト。色付き。
local GREEN=$'%{\e[1;32m%}'
local BLUE=$'%{\e[1;34m%}'
local DEFAULT=$'%{\e[1;m%}'
PROMPT=$BLUE"[${USER}@${HOST}] %(!.#.$) "$DEFAULT    # default prompt
RPROMPT=$GREEN'[%~]'$DEFAULT     # prompt for right side of screen
履歴。10万件まで保存。複数セッションで共有。重複除外。
HISTFILE=~/.zsh-history
HISTSIZE=100000
SAVEHIST=100000
setopt extended_history
setopt share_history
setopt hist_ignore_dups
function history-all { history -E 1 }
履歴検索。「vi」と打った状態でCtrl+P/Nでviから始まるコマンド履歴を検索。
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
バインドキー。viモードに設定。マジックスペース有効。タブ入力で文字補完。
bindkey -v               # vi key bindings
bindkey ' ' magic-space    # also do history expansion on space
bindkey '^I' complete-word # complete on tab, leave expansion to _expand
補完機能を有効。
autoload -U compinit
compinit
前方予測機能を有効に。履歴をフル活用して可能な限り補完。ウザイほどに補完しまくります。軽く使ってみましたが、重いのでオフにするかも。
autoload predict-on
predict-on
以上。おかげさまでキーを数回入力するだけで勝手に文字が出たり、妙にカラフルだったりするイイカンジの環境になりました。examplesにあったので残したままにしているオプションがいっぱいあるので徐々に整理していきたいです。 余談。PuTTYとUTF8Teratermを両方試してるんですが、UTF8Teratermだとvimがあまりカラフルにならない感じ。どういう設定すればいいんじゃろう?

2007年3月22日

Debian学習

DSC_6764.jpg VMWareでDebian環境を整えたまでは良かったのだけど、UNIXとは設定ファイルの位置などが変わってる感じ!これはちゃんと学習しないといかんな、と言うことで書籍購入。Amazonで頼んだら翌日に届いた。祝日だったので、まとまった時間がとれて良い感じ。 購入したのはこちら。
Debian GNU/Linux徹底入門第3版 Sarge対応
武藤 健志
翔泳社 (2005/08/04)
売り上げランキング: 5686
おすすめ度の平均: 5.0
5 ほぼ網羅出来ます
5 Debian派に転向
5 分かりやすいdebianの入門書+パッケージ
Debian 辞典
Debian 辞典
posted with amazlet on 07.03.22
武藤 健志
翔泳社 (2005/05/24)
売り上げランキング: 17135
おすすめ度の平均: 4.5
5 Debianを使おうと思っている人必携
3 待望の...でも
5 インストールから公式開発者を目指す人まで、あらゆるDebian使いのための辞典
同じ筆者・出版社なのでデザインも揃っていて良い感じ。 「徹底入門」の方を第1章「UNIX、Linux、Debian!」から第5章「シェルを活用しよう」まで一気に読んだ。UNIXは知ってるので、流し読みしつつ、パッケージ管理ツールAPTについてはしっかり熟読。Amazonのカスタマーレビューで星5つが付いているだけあって良書。広く浅くではあるけど、これ一冊で必要な知識はすべて得られると思う。骨子だけではなく、肉付けもしっかりされているあたりが好み。その反動で700ページという分量になっているけど、絵図が多いし、文体も読みやすいので、ページ数から感じるほどのプレッシャーは感じない。 と言うわけで、有意義な祝日を過ごせました。あとは弟と焼き肉を食いに行ったりとか。

2006年8月11日

Rails 1.1.6

ありがちですが、問題箇所が見つかったようで、1.1.5から1日でバージョンアップ。

Railsを1.1.2→1.1.5に更新したらLoginEngineが動かなくなった

自宅にサーバ環境整えるついでに最新の1.1.5にするかー、と軽い気持ちで更新してみたら、動かなくなりましたとさ。ちょっとした修正で直るんだろうけど、脇道の逸れちゃうので、1.1.2に戻してみた。

2006年8月10日

Rails 1.1.5

セキュリティホール対応だそうで。 http://itpro.nikkeibp.co.jp/article/NEWS/20060810/245599/

with_scope使用時には、new→saveは厳禁。

自分の勘違いなんだけども。
SearchTask.with_scope( :create => { :user_id => 1 } ) do
  @search_task = SearchTask.new(params[:search_task])
  if @search_task.save
    redirect_to :action => 'list'
  else
    render :action => 'new'
  end
end # with_scope
こんなコードを書いていたのですが、動かなかったのです。SearchTaskクラスのwith_scopeメソッドで条件を追加しているわけですが、これが有効なのはクラスメソッドを呼び出した場合だけみたい。上のソースのようにクラスメソッドnewで生成されたインスタンス@search_taskにはこの条件は引き継がれない。ブロック内ではuser_idには常に1が入って欲しいように思うのですが・・・。 こういうコードに直して対応。「新しいレコードじゃなかったらcreate成功」とかわかりにくいなぁ、と思う。
SearchTask.with_scope( :create => { :user_id => 1 } ) do
  @search_task = SearchTask.create(params[:search_task])
  unless @search_task.new_record?
    redirect_to :action => 'list'
  else
    render :action => 'new'
  end
end # with_scope

RadRailsってファイルI/Oが妙に重くない?

絶不調気味。Ctrl+Sを気軽に押すと固まってくださる。

2006年8月 9日

Windows + Rubyでiconv

「RailsにActiveHeartをインストールしてIso2022jpMailerで日本語メールを送っちゃうぞ」ではまりました。 Iso2022jpMailerを継承してクラスを作る。
class NewArrivalMailer < Iso2022jpMailer
  def welcome(to)
    recipients to
    subject "ご登録ありがとうございます"
    from "bookshelf@studiohff.net"
    body :to => to
  end
end
consoleでテスト。
ruby script/console
NewArrivalMailer.deliver_welcome( "hff@bl.mods.jp" ) => require 'iconv'でnot loadedエラー
この後、色々はまったのですが、Ruby1.8.2にはiconvが入っていないというオチ。安定版1.8.4に更新。 http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html Windowsにはiconvが入ってないので、DLLを入れる。(\Windows\system) http://www.kaoriya.net/#LIBICONV 無事に動いた。

2006年8月 3日

Rails ML(海外)のに入ったんですが、

毎日100件もメールが来るよ!!英語でこの量は消化出来ないので、タイトルから取捨選択する方向で。しかし、数日忘れると、げんなりする量になりそうだなぁ・・・。

2006年8月 2日

舞波本、購入

ザコンで購入。本当にAAが載っていてびっくり。文章は砕けているのに内容は深くていい感じ〜。

2006年7月31日

舞波本、明日発売

「くまくまー」こと、舞波さんのRails本が明日出るらしいよ? 7月後半に出る、とのことだったのに、出版社のHPにも載ってないから不安だったのですが、8月1日に発売になるようです。 わっくてっか、わっくてっか♪
Ruby on Rails入門―優しいRailsの育て方
西 和則
秀和システム (2006/08)

2006年7月26日

(LEFT|RIGHT) OUTER JOIN

SQLの外部結合の条件指定ですが、長らくOracleの(+)指定に慣れていたので、使うときに不安になります。
  • (+)指定は、指定された方のカラムにデータを「足す」
  • (LEFT|RIGHT) OUTER JOINは、(LETF|RIGHT)のテーブルを「軸足にする」
メモってみた。

M+ と IPAフォントの合成フォント

「プログラマにはきれいなフォントが必須」らしいので、「M+ と IPAフォントの合成フォント」をインストールしてみました。フリーで配布されています。インストールしたのは、M+2P+IPAG(可変幅)とM+2VM+IPAG circle(等幅)。[コントロールパネル]-[画面]-[デザイン]で使用フォントをM+2P+IPAGに設定。同[効果]で[次の方法でスクリーンフォントの縁を滑らかにする]を[ClearType]に設定。続いて各種エディタ(秀丸・TeraTerm・RadRails)のフォントをM+2VM+IPAG circleに設定。最後にFirefoxの[ツール]-[オプション]-[コンテンツ]を設定。これでいつも使っているアプリは設定完了。きれいだけど、10年もMS Pゴシックとやってきたので、違和感があります。まぁ、慣れるっしょ。同じ設定をあと4PCにしなくてはいけなくてちょっとだるい。

2006年7月24日

とりあえず完成、新刊検索サービス

自分用にRailsで作っていた「新刊検索サービス」が一通り完成しました。 検索条件を指定しておくと定期的にアマゾンを検索して新しい商品があったら登録(これは作った)・通知(これはまだ作ってない)という感じのアプリです。 「新刊が出たら即買うよ!」って漫画が100種類を超えている自分には結構便利になりそうな予感。 毎日、本屋さんで確認するわけにも行きませんしねー。(前の職場なら神保町が近かったので可能だったんですが) アマゾンを検索するライブラリを使用しているだけなので、しょぼいプログラムなんですけど、妙に時間がかかってしまいました。 先を見越せず、テーブルリレーションを2回も直したからねorz そのたびにプログラムとテストを直さないといけないわけでして。 ただいま三度、「has_many :through使いTAI」とか思ってますが、危ないのでやめておくことにしましょう。 はじめから広い視野があれば、こういう手直しも少ないはずなんですが、いやはや。

RailsのUnitTestがコケまくる

大抵
The error occured while evaluatine nil.メソッド名
というエラーなのですが、これってフィクスチャが正しくロードできてないエラーなんですよね。 重複エラーだったり、has_one指定なのに複数取れちゃったり、そんなことが多いです。 フィクスチャが全件ロードできなかった時点で、そういうエラーメッセージを出してほしいなぁ、と思うところ。

2006年7月21日

Subversion+ApacheでUpdateは出来るのにCommitが出来ん!

会社のファイアウォールの内側からのお話。 どちらもポート80番のHTTPを利用していると思うのですが、なぜかしらん? UpdateはGETで、CommitはPOSTだろうと思っていたのですが、Commitを別の方法で実装しているっぽい? 時間が取れたらパケットキャプチャしてみよう。

"Subversion+ApacheでUpdateは出来るのにCommitが出来ん!"の続きを読む

2006年7月14日

Lost connection to MySQL server during query:

自宅の続きを会社でやるぞ〜、とウキウキしながら開発環境を立ち上げたら、いきなり上のエラーではまりました。 Rails界隈では有名なハマリらしいですね。決定的な解決方法は見つかっていないみたいで、「gem install mysqlしろ」「MySQLのバージョンを変えろ」「MySQLを再インストールしろ」とか。どれもダメだったんですが、 http://happiese.exblog.jp/3648309 を参考にInstantRailsに最初から登録されているrootパスワードなしでアクセスしたらうまく行っちゃいました・・・。ちゃんとユーザー作って最低限の権限与えて運用って段階になるとInstantRailsじゃダメってことですかね。

2006年7月10日

るびまプレゼント当選〜

わーい。 http://jp.rubyist.net/magazine/?RubyKaigi2006-Present お金で買えない価値がある・・・に違いないTシャツが当たりました。週末プログラミングはこのTシャツを装備してやることにします。

2006年7月 7日

Ruby On Rails の好きなところって何ですか?

トラックバッカーズ - [ Ruby On Rails の好きなところって何ですか? ] 「フルスタックなWeb開発フレームワーク」だったりするのですが、選択肢にないので「Active Record」で回答。Railsで初めてRubyに触れたのですが、C言語/C++/Javaぐらいしか知らない自分には、最初はどのようにActiveRecordが実装されているのか見当もつかず、ソースコードを見て感動した覚えがあります。method_missing斬新。

2006年7月 1日

「ライド・オン・Rails」第1章読了

感想。
  • 誤字発見。p.7「og」→「log」。報告してみた
  • ルーティング設定方法は、AWDwR本にはなかったので、勉強になった
  • Windows・Linux・MacOSでの環境構築がとても丁寧に書かれている
  • 今後のベースとなる蔵書管理システムの作成
  • 「ストーリー」って良い。実装すべき機能がわかりやすく伝わる
  • recipeというプロジェクト名に違和感がある。自分ならbookshelfかなぁ
  • マイグレーションを使って、テーブル定義しているのが良い
  • いきなりテスト実行が良い
  • 早い段階からテスト実装している。AWDwR本では本筋とは外れた「タスク:T」となっていたが、どちらがいいんだろうか。
  • ちょうど50ページで、テストまで含まれたアプリケーションを実装している。今後はこれを壊さない形で機能を増やしていくと思われる。こういう作り方は途中で自信を持って作業が進められるので好き。

2006年6月30日

「ライド・オン・Rails」7月3日発売に延期 → ごめん、買えました

今日(6月30日)発売とのことで、かなり必死に探し回ったのですが、どこにも見つからず・・・。 出版元ホームページを確認したところ、7月3日発売になってる。 Amazonは6月30日のままです。 週末に写経するつもりだったので、ちょっと残念です。 あ、サンプルコード発見。ここから妄想するか!
ライド・オン・Rails Ruby on Railsを徹底攻略
吉田 和弘 馬場 道明
ソフトバンククリエイティブ (2006/06/30)

"「ライド・オン・Rails」7月3日発売に延期 → ごめん、買えました"の続きを読む

2006年6月29日

Haskell やっとfoldコマンドが作れた

p191の練習問題です。 ひどいコードだけど晒してみる(*ノノ)
fold_length = 60

main = do cs <- getContents
          putStr $ unlines $ concat $ map mysplit $ lines cs

mysplit :: String -> [String]
mysplit cs = mysplit_sub $ splitAt fold_length cs
  where
    mysplit_sub :: (String,String) -> [String]
    mysplit_sub (a,b)
      | null b    = [a]
      | length b > fold_length =
                a : (mysplit_sub $ splitAt fold_length b)
      | otherwise = [a,b]
作り終えたあと、巻末の回答を確認。・・・うわ、めっさエレガントなコードが。caseの使用が思いつかなかったので、mysplit関数とmysplit_sub関数を作っていますが、caseを使えばひとつにまとめられるわけか。 余談ですけど、第4章の回答を確認したところ、第4章時点では紹介されていない「関数合成」を使った回答例が載っていた。これってどうかなぁ・・・。本を最初から読みつつ、理解度チェックのために課題をやっているわけだから、いくらシンプルなコードになるといえ、回答としてはNGだと思う。自分なりに考えに考えて出した答えがベストにどれだけ近い形に出来たのか、それを確認したいのに・・・。

Rubyist Magagine 日本 Ruby カンファレンス 2006 特別号

http://jp.rubyist.net/magazine/?RubyKaigi2006

おもしろかったー、3時間かけて読みました。

  • トップ画像でまず先制攻撃を食らう
  • 各レポートが同じ粒度で書かれていて読みやすい
  • 「〜度」でニヤニヤ
  • Q&Aが楽しい
  • みんな、生き生きしていて素敵&かっこいい
  • 掲示板おもしろい
  • すごい分量、編集おつかれさまでした

2006年6月28日

Rails 1.1.3 公開

早速

gem update rails

しております。会社の回線遅いので、結構かかりそう〜。変更点は何なのかしらん、かしらん。

インストール完了。

そして、リリースノートを読んでみた。セキュリティ対策とちょっとしたバグ修正のみらしい。CRUD対応はバージョン1.2。(1.2はすぐに出る、と書いてあるように思える。しかし、英語は得意ではないので、自信が無い)

リリースノート
http://weblog.rubyonrails.org/2006/6/27/rails-1-1-3-security-fix-and-minor-fixes

2006年6月23日

Haskell + Windows + cygwinで文字コードに問題あり?

「ふつうのHaskellプログラミング」の写経をしていた際にはまりました。

p64からのexpnadコマンドのところなんですが、

c = if c == '\t' then '@' else c

の一文が動いてくれません。(ファイル入力・標準入力ともにNG)

cygwin上でコンパイルしたイメージを使用して、コマンドプロンプトで実行したところ、正常に動作。cygwinの内部文字コードあたりが問題を起こしているのかなぁ・・・。裏は取ってませんケド。

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
青木 峰郎 山下 伸夫
ソフトバンククリエイティブ (2006/06/01)

"Haskell + Windows + cygwinで文字コードに問題あり?"の続きを読む

2006年6月22日

バックシングルクオテーション?

社内で新人教育している人が発言していたのですが、あまり使わないよね?

「シングルクオート」のバックバージョンだからなのだろうけど、「ダブルクオート」のバックバージョンが無いから、
「バッククオート」でわかるわけで。

ついでに「クオート」と「クオテーション」「クォテーション」はどちらが多数派なのか気になったので、グーグル先生に聞いてみた。

  • シングルクオート 309,000件
  • シングルクオテーション 42件
  • シングルクォテーション 111件
  • バッククオート 19,600件
  • バッククオテーション 7件
  • バッククオテーション 8件
  • ダブルクオート 74,800件
  • ダブルクオテーション 219件
  • ダブルクォテーション 276件
  • バックシングルクオート 3件
  • バックシングルクオテーション 0件
  • バックシングルクオテーション 0件

「クオートvsクオテーション」では意外にも大差での勝利。接戦かと思ったんですが。

「バックシングルクオート」はやっぱり少数派みたいです。冗長だものね。

ちなみに自分はどっちを使っているかなー、と思い出してみたところ、基本は「クオート」ですが、発声する際は「クオテーション」たまに使っている気がします。声に出した際に収まりがいいというか・・・。

皆さんはどっちっすか?

2006年6月21日

Ruby チャネルボール確率計算

友達とM:tGというカードゲームについて懐古話をしていた際に、凶悪コンボ「チャネルボール」の失敗確率が気になりました。

チャネルボール とは

一般的な問題に直しますと、A・B・Cそれぞれ20枚ずつ入ったカードの山から7枚カードを引き、AABCが含まれている確率を調べるということになります。

以下、やっつけコード。

def channelBall
  deck = []
  20.times do 
    deck << "BlackLotus"
    deck << "Fireball"
    deck << "Channel"
  end
  deck.each_index do |i|
    j = rand(deck.length)
    deck[i], deck[j] = deck[j], deck[i]
  end
  hand = []
  7.times do |i|
    hand << deck[i]
  end
  hand
end
success_cnt = 0
fail_cnt = 0
success_hand = [ "BlackLotus", "BlackLotus", "Channel", "Fireball" ]
10000.times do 
  hand = channelBall
  if (success_hand - hand).empty?
    success_cnt += 1
  else
    fail_cnt += 1
  end
end
p "Success Count #{success_cnt}"
p "Fail    Count #{fail_cnt}"

失敗確率は15%はぐらいみたいです。意外と多いのねぇ、という印象。

Ruby yieldがよくわからない

C言語の関数ポインタの逆みたいなもんすかね。処理構造は定義するけど、具体的な処理は、呼び出し側が定義できる、と。

Rubyリファレンスマニュアルに載っているコードを一通りに入力し、以下のサンプルを作ってみた。

渡された配列の各要素をひとつ飛ばしでループする。

def skipping(arr)
    idx = 0
    while idx < arr.size
        yield(arr[idx])
        idx += 2
    end
end
skipping([1, 2, 3, 4, 5]) do |num|
    p num
end # => 1, 3, 5

今、ブームの素数表示。

def priming(arr)
  for num in arr
    next if num <= 1
    isPrime = true
    2.upto(num) { |i| isPrime = false if num % i == 0 && num != i }
    if isPrime == true then
      yield num 
    end
  end
end
primes = []
priming((1..100).to_a) {|prime| primes << prime}
p primes # => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

配列に対しての処理には便利そう。「条件を満たす要素だけ抜き出す」「並び替え」など。標準機能となっているわけですが・・・(苦笑) これらのリッチな処理はyieldで実装されている予感。

irbにTABTAB

勉強用のRubyコードを書いています。(yieldの理解が足りてない感じがするの)

こういうときにirbは便利。構文を間違えつつ、TRY&ERRORするので、エディタでコードを書いて、irb(のコマンドプロンプト)に貼り付けていました。

最初はうまく行っていたんですが、突然。

Display all 314 possibilities? (y or n)

とか出てきて、数十行コマンドリストがダダーっと表示された。びびった。

原因を調べてみたところ、インデントにタブ文字を使用していて、2段階インデントを掘るコードでタブ・タブとなった際に、irbの自動補完機能がコマンド一覧を表示してくれた、というオチ。

いつもはタブでインデントしているんですが、rubyに関してはスペースが無難っぽい。

2006年6月19日

Rails Recipes Paper Book

届きました。無理矢理ポストにねじ込まれていた。幸い痛んでなかった。写経をするときは、PDFの方が便利かなぁ、と思い始めたので、この本はいつ読むのだろう・・・?勉強会?

2006年5月29日

土日はほとんどプログラム出来ず

珍しく土日ともに早起きし、深夜まで充実した時間を過ごせました。(いつもは「起きたら夕方だった」とかいう情けないことが多いです)これでRubyプログラムの勉強できたらよかったのですが、「さぁ、やるぞ」と時間を取れたのが日曜日の午後8時。1時間ほどユニットテストを書いたところで猛烈な眠気に襲われました。眠気覚ましに本でも読もうと思い、買ったばかり「Subversion実践入門」を開いたところ、10ページも読まないうちに寝落ちしてました。土日が充実していた分、疲れが出たのだと思いますが、プログラムが書けなかったのは残念です。今後はプログラムの予定は前半にいれ、後半は頭を使わない予定になるよう調整していこうと思います。

2006年5月27日

使いそうなRadRailsショートカットキーをメモ

Content Assist : Ctrl+Space
Incremental Find : Ctrl+J
Incremental Find Reverse : Ctrl+Shift+J
Word Completion : Alt+/
Switch to test : Ctrl+Alt+T
Switch to view : Ctrl+Shift+V
Ruby Comment : Ctrl+/
Ruby Uncomment : Ctrl+\
Copy Lines : Ctrl+Alt+Down

Context Informationってなんだろう?

2006年5月25日

今さらだけど、Railsの「intro 15min video」を見た

Railsを使って15分でBlogシステムを作る過程を動画に納めたもの。本当に15分でUnitTestまで含めて雛形が出来てしまう。あと、開発ツールが洗練されているので、魔法のように効率的にコードが埋まっていく。こちらも感動。単純なシステムをベースにして、それを壊すことなく、どんどん新機能を追加していく。つまり、アジャイルな開発スタイルの動画になってる。これが事前準備無しでリアルタイムで考えながら行っているとしたら、本当に凄い2005年最高のハッカーに選ばれているだけのことはありました。プログラムに関わっている人なら、Railsに興味が無くても良い刺激になるので、見て欲しい。

http://www.rubyonrails.com/media/video/rails_take2_with_sound.mov

"今さらだけど、Railsの「intro 15min video」を見た"の続きを読む

2006年5月23日

初めてのRailsのUnitTest

AWDwR本のテストの章を読みつつ、UnitTestを実装。今まで「UnitTestを勉強するためのUnitTest」しか書いたことがなかったので、実際に自分が作りたいアプリでの実装は新鮮。自然と「このテストもやっておいた方がいいかな?」と考える。

現在のテストのCoverageはこんな感じ

C:\work\RoR\higureason>rake stats
(in C:/work/RoR/higureason)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Helpers              |     7 |     6 |       0 |       0 |   0 |     0 |
| Controllers          |   263 |   196 |       3 |      21 |   7 |     7 |
| Components           |     0 |     0 |       0 |       0 |   0 |     0 |
|   Functional tests   |   146 |   105 |       4 |      16 |   4 |     4 |
| Models               |   260 |   212 |      10 |      25 |   2 |     6 |
|   Unit tests         |   209 |   158 |       8 |      25 |   3 |     4 |
| Libraries            |     0 |     0 |       0 |       0 |   0 |     0 |
|   Integration tests  |     0 |     0 |       0 |       0 |   0 |     0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |   885 |   677 |      25 |      87 |   3 |     5 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 414     Test LOC: 263     Code to Test Ratio: 1:0.6

"Code to Test Ratio"がテスト達成率。60%と出てますが、絶対そんなに終わってません。行数を調べているだけのようなので、目安程度ですね。もっとちゃんとした統計情報と取るにはRuby Coverageというツールがあるそうで。

gem install coverage

でインストールし

ruby -rcoverage unit_test.rb

で統計情報が出るらしい。RadRailsから呼べるように出来るといいんだけど、今日は時間切れ。

O'ReillyのSafari

Rubyistな方々のBlogを見ていると、ときおり「Safariに入れて〜」などと言う記述があり、MacのブラウザSafariのことだと思っていたのですが、文脈に違和感があったので、調べてみたところ・・・。

O'Relly Network Safari Bookshelf

これか!!オンラインの本棚みたい。定額料金($9.99/月〜)を支払うことによって、オライリーの書籍のオンライン閲覧・検索が出来るようになるみたい。料金プランによって、本棚に入れておける冊数が変わる(5冊〜30冊)、オフラインでも閲覧したい場合、$5追加でダウンロード可能になる。一度本棚に入れた書籍は最低30日は変更できない。

月1200円でオライリーの書籍が5冊読める、と考えると格安。資料として常に本棚に入れておきたいものなら、印刷された紙書籍を買ったほうがいいかもしれない。ちょっとした調べ物とか、数ヶ月での概要勉強とか、色々と使い勝手はありそう。デジタルデータは場所を取らないし、検索に強い。ちょっと試してみたいサービスかも。

amazletのブックマークレット修正

ここ10日ほどの間にAmazonのURLの形式が変わったようです。今まで使えていたamazlet(アフィリエイト作成のブックマークレット)が使えなくなってました。

幸い、自分でもわかる程度の簡単な内容だったので、修正。

修正前

javascript:var%20afid='stuhff-22';var%20u=document.location.href;javascript:var%20ai=u.indexOf('ASIN');var%20asin=u.substring(ai+5,ai+15);void(window.open('http://app.bloghackers.net/amazlet/?__mode=asinsearch&asin='+asin+'&affiliate_id='+afid,'_blank','width=440,height=600,resizable=1,scrollbars=1,status=1'))

修正後

javascript:var%20afid='stuhff-22';var%20u=document.location.href;javascript:var%20ai=u.indexOf('product');var%20asin=u.substring(ai+8,ai+18);void(window.open('http://app.bloghackers.net/amazlet/?__mode=asinsearch&asin='+asin+'&affiliate_id='+afid,'_blank','width=440,height=600,resizable=1,scrollbars=1,status=1'))

URLからASINを切り出す処理を直しただけです。自分の環境に合わせてアソシエイトIDは変更してくださいな。

"amazletのブックマークレット修正"の続きを読む

日本Rubyカンファレンス2006追加も逃した!!

続き。

追加分20日に発売だったみたいです。Little Nonライヴで大騒ぎしていたころだ! RSSリーダーへの登録を怠った自分南無、ってことで。

Subversionをインターネットで使いたい

Let's Noteも買ったので、どこからでもUpdate/Commit出来るようにしたい。XREAで出来ないかなー、と思ったのですが、Apacheが1.3系なので無理そう。やっぱり自宅で鯖を立ててDDNSを利用するしかないみたい。PCはあるんだけど、電気代を考えるとあまり立てたくないなぁ、というのが正直なところ。買ったばかりのMac miniを使えば、月に1000円もかからないのだろうけど、そうするとMacとして使えなくなるしな(笑) 電気食いまくりの現鯖PCにSubversoin乗せるしかなさそうね。

2006年5月18日

Railsのすごい人たち。

Rails勉強会のトラックバックからRails使いの人のBlogを呼んでいるんですが、良い刺激受けまくり。みなさん、モチベーション高い、アウトプット多いし、すごい人たちばっかり。早速RSSリーダーに登録しまくりですよ。

日本Rubyカンファレンス2006追加チケットが出る・・・らしい

売り切れでしょんぼりしてのですが、追加販売があるらしい。主催者の人に感謝しつつ、買い逃さないようにしようと思います。

2006年5月17日

破綻→構造改革

うわーい(壊)

最初は2テーブル(users,messages)でスタートしたこのプログラムも、現在10テーブルになっております。

繋ぎたいように繋いできたんですが、いよいよ破綻して参りました。DeleteやUpdateを行おうとすると、外部キーエラーが出まくって、それを回避するコードを書いて・・・、こりゃあかん。

関係図に書いて整理しないといけない時期に来ているようです。先に動く物を作ってから内部動作を直したかったんですが・・・、なんとかそこまで持ってくれるかしら。

今の登場テーブルさんたち。

answers
game_masters
logon_users
messages
people
places
play_orders
statuses
users
weapons

まとめられそうなテーブルメモ。
people, places, weapons=犯人・場所・武器カードのマスターテーブル
answers, logon_users, play_orders=ゲーム状態を管理するテーブルたち
messages=最初に作ったので、発言者名を文字列で持っている、usersテーブルと結合すべき?
statuses=複数形がキモイ
users=お前は良い子だな、問題なし!!

このまま、完成まで突っ走って、その後戻ってこようかと〜。

2006年5月16日

独りよがりはいかんね

Dの人にプログラム構成を相談してみた。

自分でも薄々気づいていたけど、なんとかなるだろう、と思って保留していた箇所をしっかり指摘されましたさ。

プレイ順番を保存するテーブルと、現在順番のアクティブプレイヤー情報を保存するテーブルを一個にまとめようとしてたのですよ。

関連性はあるが、別テーブルが正しいですな。

帰宅後に修正前後のコードを追記予定。

"独りよがりはいかんね"の続きを読む

リファクタ・リファクタ

最近読んだ本で得た知識を元にソースを修正してました。10行あったガチンコ直球のコードがエレガントな3行になった!!とかとても楽しい。

Railsは自然にMVCモデルになるのがいいですね。なぜならそうするとRails側が世話を見てくれるので、プログラムがとても楽だから。気がつくと正しい形になっている。

ただ、正しさは50%以上80%未満ぐらいまでしかいかない。100%正しい物を作るにはやっぱりちゃんとした勉強が必要になります。「これがベストとは思えないけど、これしか浮かばない〜」と悶々としたコードが増えております。

ここで「じゃあ、デザインパターンの勉強だ」と言ってしまうと、手を広げすぎて破綻するので、このまま続行で、とりあえず使える物を作ろう。

機能の90%は実装完了。あとは、プレイ順番のローテーションとゲーム終了時の処理で終わり。難しい部分は残っていないので、何とかゴールできそうです。

2006年5月14日

JavaScriptクックブック

「ページ表示時にメッセージ入力用テキストボックスにフォーカスを設定しておく方法がわからねーーー」ということで買ってきた
立ち読みで1行のスクリプトを覚えて帰っても良かったんだけど、こういう知識は多い方が良い
簡単にできることを知らずに力業で実装した事が何度あったか・・・

JavaScript & DHTMLクックブック―Webエキスパート必携テクニック集
ダニー グッドマン Danny Goodman 村上 列
オライリージャパン (2004/01)
売り上げランキング: 1,845
おすすめ度の平均: 3.5
1 直訳の為に頭が痛くなる本です
4 汎用ライブラリのための険しい道
5 Web作成に詰まったときに

2006年5月12日

Ruby本購入

プログラムの雛形がほぼ完成し、次のステップは例外処理と重複したコードの効率化です。

この際にRuby特有の構文を理解した方がより効率的に作業できるので、プログラミング言語Ruby自体の学習を開始しました。

"Ruby本購入"の続きを読む

2006年5月11日

日本Rubyカンファレンス2006申し込み間に合わず

今、知りました。

5月9日から一般販売だったようですが、既に売り切れ御礼。残念無念。

2006年5月10日

breakpointerマジ便利

仕事を休んだので、一日中Railsの勉強してました。10時間はやったと思います。 その甲斐あって、アプリの雛形は完成。見た目がしょぼいとか、ゲーム状態制御が甘いとか、AJAX投げすぎて激重とか、色々問題点はありますが、身内で使う分には近いうちに実用化できそう。 今日はバリバリ書いたのですが、コードが酷すぎてお見せできる状態ではないので、Rails用デバッガbreakpointerの使用方法を書いておこうかと思います。

"breakpointerマジ便利"の続きを読む

Rails習作 ログイン一覧作った

ちょっと高機能なチャットCGIになると必ずついている"現在ログインしているユーザ一覧を表示”を作ってみました。

"Rails習作 ログイン一覧作った"の続きを読む

2006年5月 9日

Rubyプログラミング環境

WindowsXP+コマンドプロンプト+秀丸+Subversionってのは、COOLじゃないなぁ、と思う。Subversionだけはまともですが、これが「作業前に日付名のフォルダにバックアップしてます」とかだと極まってた。coLinux+FedoraCore+zsh+vim+Subversionとかにしてぇなぁ、と思うのだけど、あちこち新しくすると勉強コストが大きくなって破綻しそうだなぁ、とも思う。今のネタを作り終えるまでは環境は我慢して、その後に移行するってのが無難かねぇ・・・。

RoRのORMに感動

これは楽でいい!!テーブル・クラス・インスタンスのマッピングを自動で行ってくれるのでロジック部分にだけ集中できる。最初に勤めていた会社がC言語+Pro*Cというプリミティブな組み合わせで構築していたので、DBからデータを取り出すだけなのにすごい量コードが必要だった。勉強になる部分はあったけど、何回も繰り返すとさすがに苦痛だった。RoRを使えば単一テーブルからへのCRUD(CreateReadUpdateDeleteの頭文字)操作なら一切コードを書かずに行える。

# Create

message = Message.new

message.name = "hajime"

message.message = "test"

message.save

# Read

message = Message.find_by_name( "hajime" )

# Update

message.message = "test2"

message.save

# Delete

message.destroy

こんな感じ。

ひぐらし推理ゲームだけど、まずはチャットプログラムとして作成。そこにゲーム部分を追加していく形での考えてます。チャット部分はほぼ出来たと思う。セッション・ログインも作った。(before_filterは素晴らしい)今日当たりからゲーム部分です。

早めにコードを公開したいのだけど、セキュリティ面への考慮がまったくないので、まだ無理です。信頼できる身内と一緒に動作確認中であります。

2006年4月28日

プログラミングRuby

プログラム言語の世界では「プログラムミング XXX」と名付けられた本は大抵、その言語のバイブルになってます。

Rubyを勉強するには「プログラミング Ruby」を購入しておくべきだろうと調べたところ、5月22日に第2版が出るそうで。

最新の情報が欲しいので、発売待ちですな。それまではネットの情報で頑張る方向で。

Rubyで行こうかと

昨日の続き。

PHPはHTML出力には向いているようだけど、今回はXMLかJSON出力を予定しているのでRubyでも良さそう。どちらがやりたいか、と同じ条件で聴かれればRubyなので、Rubyで行こう。

Shibuya.jsTT#1でお話を聞いたid:secondlifeさんお薦めの本を買ってきた。

2006年4月18日

Shibuya.js Technical Talk #1に行ってきました

Shibuya.js Technical Talk #1に行ってきました。

Webプログラムとは縁がなかった自分ですが、興味はあるんです。ちょっとしたツールをさっくりと作れると楽しそうじゃないですか。

実際に活躍している方々の話を聞けたのは非常に参考になりました。

同じプログラマなのですが、オープンソースで情報を発信していこうとやっているかたは雰囲気が違いますね。みなさん、明るくてかっこいい。さらに話も面白い。発表をされた方の年齢は自分より下の人が多かったと思います。あっという間に置いていかれそうです。(すでに抜かれているわけですが)

偶然、高校時代の先輩(7年ぶり!)、前の会社の同期(2年ぶり!)に再開することも出来、得るものの多い時間でした。

高倍率になるとは思いますが、2回目以降も参加していきたいです。

2006年3月 8日

30日で作るOS 1日目

連続記事にする気はさらさらないんだが、最初の画面だけ張っておきますね。


"Hello, XXX”を改造するのは基本といえよう。

2006年3月 3日

ITエンジニアと食生活

弁当は買って食べる、そんなITエンジニアに贈る コンビニランチでも健康を維持しよう!


開発が佳境に入ると、お昼をゆっくりと食べる時間はない。そんな場合、近くのコンビニで弁当を買って済ませる人も多いのではないだろうか。そこで、フードプロデューサー、フードジャーナリスト、料理研究家でタレントの園山真希絵さんに、健康的なコンビニ弁当の選び方を伝授してもらおう。

食事って生物の活動の源ですから重要なのはわかるんですけど、TV番組を鵜呑みにしていると「何を食べて良いのかわからねー!!」となりませんか。あるある大辞典とみのもんたに聞いてみたいところです。時間をかけずに安価で食事診断をやってくれるサービスがあれば現代人には受けるんじゃないかな、と思います。

自分の食生活ですが、フリーになってからは安定しております。その前の職場ではストレス解消のために暴飲暴食でしたから、それはそれは(カロリー的にも金銭的にも)大変なことに。激務がなくなったおかげで、ストレスが減り、暴飲暴食をしなくなり、カロリー的にも金銭的にもスリムに。たまに思い出して体重計に乗ると意外と減っていてびっくりしました。

ここ最近の平日のパターンは、朝:缶コーヒー、昼:月曜→カレー、火曜→定食屋さんでさば味噌定食、水〜金曜:蕎麦、おやつ:野菜生活100で安定しております。夜はパターン化に至っておりません。近所の100円ショップで購入したレトルトで済ませたり、ファーストフードに入ったり、メイド喫茶でオムライスだったりします。

この商売、体が資本っすからね。気をつけていきたいところです。

「30日でできる! OS自作入門」川合 秀実

新規に発行されるコンピュータ系技術書のタイトルは一通りチェックしているのですが、ひさびさに「お?」と思わせてくれるタイトルでした。発行されたということで早速購入してきました。

プログラマにとって「自作OSを作る」は一度は夢見ることのひとつです。自分もご多分に漏れず一時期は「Lions' Commentary on UNIX」を読んでいたこともありました。しかし、OSを作るなんて、常人にはできることじゃありません。技術力の問題もありますが、その前に気持ちが折れます。WindowsでもMacでもUNIXでもいいですが、それらを一般ユーザーより詳しく知っているプログラマは、これらのすごさを知っており、「自分に作れるわけがない」と萎縮してしまいます。

ほとんどの人がそうなるところを乗り越えてOSを作り上げた人はそれだけでスーパープログラマといえると思います。Linuxでも、モナーOSでも、一緒です。

この本の作者もそういうすごい人の中の一人です。この本を通して32BitCPUで動作し、GUIを持ったOSを一から作れます。最初はバイナリエディタでディスクイメージを書き(アセンブラですらない)、フロッピーディスクから起動するところからスタートします。

タイトルにあるとおり、30日(30章+序章+あとがき)という構成になっており、徐々にステップアップしてOSを作っていくことが出来ます。1日22ページほどの分量ですが、密度が濃いので理解して実際に動作させるためには1日当たり2時間ぐらいはかかると思います。(ここでコードを手打ちすることが非常に重要と考えます。タイプミスをして、誤動作し、それを直すというステップが非常に重要です。付属のCD-ROMからソースコードをコピー&ペーストしてはまったく身につかないと思います。)

700ページほどある本ですが価格は3990円と非常にリーズナブル。洋書の翻訳なら6000円はするであろう内容です。日本語ネイティブですから、文章が読みやすいのもポイントです。

"「30日でできる! OS自作入門」川合 秀実"の続きを読む

2006年3月 2日

春ですね、起業シーズン?

この頃、やたらと引き抜きの電話が来ます。以前にお世話になったコンサルタントの方が独立したとか、新規事業部を立ち上げたとかで人材が欲しいとのお誘いです。

しばらくの間はそういうつもりもないのでお断りしてるんですが、そういうシーズンなのでしょうかね。Dの人から会社を作りやすい法律が出来た(出来る?)という話は聞いてますが、雨後の竹の子のようににょきにょきしてる印象があります。自分の周りだけ起業が重なっただけなのか、業界的にそうなのか、気になるところです。Web2.0とかいう新しいキーワードも出てきて、インターネットバブルに乗り損ねた起業志向の人が一斉奮起したってのもありそうです。

なんにしろ、誘ってもらえること自体はうれしい限りです。実力を認めてもらっているのか、頭数をそろえたいだけなのかわかりませんが。

2006年2月 9日

ボーランド、IDE事業を売却

米ボーランドがIDE事業を売却、「Delphi」はどこへ(@IT)
米BorlandがDelphiなどIDE事業を売却、アプリライフサイクル管理分野に注力(Enterprise Watch)

一時期はMicrosoftのVisual Studioと良い勝負をしていた印象がありますが、最近はバージョンアップの頻度が下がっていましたし、Microsoftとの体力勝負に根を上げてしまったということでしょう。競争があるから進歩があり、消費者は選択権があるわけです。Microsoft一社の独占状態にならないよう対抗馬が生まれてくれるといいのですが。筆頭はオープンソースのEclipseでしょうか。一企業としてMicrosoftと競えるところはなく、多数の人間の努力によって成り立っているオープンソースだけが対抗出来る時代になったようです。

Visual Studio 2005 Express の Web インストール開始

Visual Studio 2005 Express の Web インストール開始

小サイズのインストーラーをダウンロードし、ストリーミングでダウンロードできる方式が追加されました。isoファイルのマウントやCD-Rの作成が必要ないので気軽にインストールできるのが売りと言えます。しかし、Express Editionは1年間の期間限定公開なので、出来ればisoファイルをダウンロードしておいたほうが良いかと思います。プログラム雑誌にCD-ROMが付属している場合もありますので、こちらもお勧めです。CD-ROMはCD-Rに比べ、データ破損が起きにくいからです。自分は日経ソフトウェアを購入し、CD-ROMを入手しました。

2006年1月18日

Ruby Development Tools(RDT)のインストール

メモ。

Eclipse上でRuby開発を行えるRuby Development Tools(RDT)のインストール方法。

Eclipseを起動してHelp -> Software Updates -> Find and Install...を選ぶとダイアログが表示される。
Search for new features to installを選択し、Nextを押す。
New Remote Site...を押すとダイアログが表示される。
NameにRDT、URLにhttp://rubyeclipse.sf.net/updatesiteと入力し、OKを押す。
RDTにチェックが入っていることを確認し、Finishを押す。
自動でインストールが始まる。

Ruby on Railsのインストール

メモ。

RubyGemを利用してのRuby on Railsのインストール方法。

コマンドプロンプトを起動して

gem install rails --remote

と入力する。依存性のあるライブラリをすべて調べてくれるので、インストール中にY/Nの入力を促されたら、すべてYで答えること。

Rubyインストール

メモ。

http://rubyforge.org/projects/rubyinstaller/からruby182-15.exeをダウンロード。本家には1.8.4が出ているんですが、インストーラー形式のほうが楽なのでこちらを使用。1.8.4のインストーラー版は1月末に出るそうです。

2005年10月22日

FolderWatcher

久々に趣味プログラミング。

使用ツールはVisual C#。.net Frameworkのバージョンは1.1。

作ろうとしたのはFileSystemWatcherを利用したちょっと便利そうなツール。

"FolderWatcher"の続きを読む

2005年10月 8日

MovableType3.2を無理矢理導入してみた

前回

「Berkeley DBがダメなら別形式のDBを使えばいいじゃん」ということで、Sqliteに更新しようとしたんですが・・・。

1.MovableType3.2をインストール
2.Berkeley DBからSqliteへのコンバート
の順で実行したところ、
1 → データファイルの文字コードが変わったのか、既存レコードがすべて文字化け
2 → CGIで変換するのですが、サーバから割り当てられた最大CPU時間内に終わらずタイムアウト
となりました。

しょうがないので、ロールバックしました。
修正版が出るまで待てと言うことですね。

2005年10月 7日

Movable Type3.2を導入しようと思ったら・・・

時間が取れたので、導入してみようと思ったら、バグが発覚して修正版のリリース待ちのようです。せっかくやろうと思ったのに間が悪い。

なんとなくトラックバックしてみました。未だにこの概念は慣れないです。

2004年11月11日

社会人向け大学に編入してIT技術を究める

http://jibun.atmarkit.co.jp/ad/fyi/12wakhok/wakhok01.html

スキルアップしようと思っても、一人だと、途中で挫折してしまったり、何をやって良いかわからなかったりと言うことがあると思うので、こういうのはいいなぁ、と
ただ、うちの会社にいながらは無理かなぁ。
土日出勤大杉

2004年11月 4日

Javaでなんか作ろうかと

ROの転生も伸びちゃったし、仕事も一段落したので、時間が取れそうなんで、新しいことの勉強開始。

趣味と実益をかねて、JavaAppletで動くROダメージ計算機を考えてます。
ROのステータス計算機はみすとれ巣様で事足りるわけですが、装備・ステの比較検討には向いていないんですよね。
縦軸をダメージ、横軸をStrにして、各種条件を変えたときの平均ダメージをグラフ表示するモノを作ろうと思ってます。

ネタ帳
浅煎り珈琲Java アプリケーション入門
@IT:Java Solution
Eclipse
Visual Editor
JAVA Developer.jp