トップ 最新 追記

Route 477



2009-05-18

[ruby] Tab Sweep

MITがSICPをやめた件について、ワドラー先生のコメント

「ライブラリが重要なのもわかるけど、組み立て方の基礎が不要になったわけじゃないだろ」

github公式(?)gemspecメーカー

俺はrtask + 手書きでやってるけど。

もう一つ。githubのgemがビルドされたかどうかを監視するものらしい。忙しいあなたに。

プログラミング言語Nu

「Macのための、Lisp風文法+Ruby風意味論の言語」らしい。謎すぎる。 コード例

_why先生プレゼンツ、Rubyでファミコンぽい音を鳴らすためのライブラリ

portaudioというライブラリに依存しています。

例はREADMEに載ってるけど、もう一つ:

require 'bloops'

b = Bloops.new
b.tempo = 140

s1 = b.sound Bloops::SQUARE
s1.punch = 0.5
s1.sustain = 0.9

b.tune s1, "16:c6 16:b5 16:a 16:g 16:b 16:a 16:g 16:f 16:a 16:g 16:f 16:e 16:c 16:d 16:e 16:g 1:c6 "
b.tune s1, "8 16:c6 16:b5 16:a 16:g 16:b 16:a 16:g 16:f 16:g 16:f 16:e 16:d 16:c 16:d 1:e "
b.tune s1, "8 16 16:c6 16:b5 16:a 16:g 16:f 16:a 16:g 16:f 16:e 16:f 16:e 16:d 16:c 1:g "

b.play
sleep 1 while !b.stopped?

見ただけで何のテーマ曲か分かった人は、PC-98ユーザだったはず(笑)。

Rack環境でruby-debugを使うためのミドルウェア

ruby-debugの呼び出しをRackのミドルウェアとして実現したもののよう。

Rackを使ってるフレームワークならどれでも使える、ということなのかな。こうやって RubyのWebフレームワーク汎用のライブラリが増えるのは良いですね。

今年のRubyConfは11/19-11/21

行きたい。


2009-05-13

[git] githubでは「あるファイルの最新版」にリンクすることができない?

例えばRamazeの、lib/ramaze/helper.rbというファイルのURLは

のようになっていて、これはファイルに変更があると「最新版」のURLではなくなってしまう。

github上で「あるファイルの最新版」にリンクする方法はないのかなぁ。

本日のツッコミ(全3件) [ツッコミを入れる]

もろはし [http://github.com/manveru/ramaze/blob/master/lib/ramaze/he..]

Constellation [http://github.com/manveru/ramaze/raw/master/lib/ramaze/hel..]

yhara [もろはしさん、Constellationさん: おお、できてますね。ありがとうございます!]


2009-05-12

[ramaze] Ramazeの読みは「ラマゼ」で合ってるのか

manveruさんは「らめぃず」と発音してたよ? >Ramaze(「ラマゼ」と読みます)

[はてなブックマーク - Ruby Freaks Lounge:第11回 自由なWebフレームワーク,Ramaze|gihyo.jp … 技術評論社より引用]

一応、

  • リニューアル前のramaze.netで、左上のロゴに片仮名で「ラマゼ」と書かれてたのと、
  • インタビュー

it’s called Ramaze (pronounced ra-ma-ze, Japanese style, even if the name comes from Ruby-Amaze).

[Ramaze: a Ruby framework that will amaze | Zen and the Art of Programmingより引用]

という記述から「ラマゼ」説を採用しました。

でもmanveruさん自身はそう読んでないのか…w 「Ruby + Amaze」が名前の由来だそうなので、作者にとっては自然にそう読めてしまうのかも知れないですね。

[css] 960 Grid Systemについて調べてみた

画像の説明

CSSフレームワークの一つである、960 Grid Systemについて調べてみた。

960 Grid Systemでは、その名の通り横幅960pxの空間を12(もしくは16)に区切って、その中にdivを配置していく。 この960pxという数値は、

  • 最近のマシンなら横1024pxはあるよね
  • 960はいろんな数値(2, 3, 4, 5, 6, 8, ...)で割り切れる

というところから決められたみたい。

とりあえずデモを見てもらえればどんなものかは分かると思う。

解析

ソース を見てみる。12カラムと16カラムの指定があるけど、ここでは12カラムの方だけ見る。

.container_12 {
  margin-left: auto;
  margin-right: auto;
  width: 960px;
}

まず.container_12というスタイルがあり、全体をこれで囲むことになる。これの幅が960pxになっている。

次に、実際に配置されるgrid unitのスタイルの定義がある。

.grid_1 ... .grid_12{
  display: inline;
  float: left;
  margin-left: 10px;
  margin-right: 10px;
}
.container_12 .grid_1 {  width: 60px;}
...
.container_12 .grid_12 {  width: 940px;}

.container_12 .prefix_1 {padding-left: 80px;}
...
.container_12 .prefix_11 {padding-left: 880px;}

.container_12 .suffix_1 {  padding-right: 80px;}
...
.container_12 .suffix_11 {padding-right: 880px;}

要するに、grid unitのために

  • divの幅を規定するスタイル(.grid_n, nはカラム数)
  • divの左端を規定するスタイル(.prefix_n, nは左側にあるカラムの数)
  • divの右端を規定するスタイル(.suffix_n, nは右側にあるカラムの数)

があって、これを使って好きな位置に並べてねということらしい。

基本的に.grid_*だけを使えば良くて、例えば横に3つgrid unitを並べるなら、.grid_4, .grid_4, .grid_4とすればいい(12カラムの場合)。 空間を空けたいときに.prefix_*や.suffix_*を使うらしい。

縦方向のサポートは特になくて、.clearというスタイルを使って「次の段」に進むだけ。.clearはこんなの。

/* http://sonspring.com/journal/clearing-floats */

.clear {
  clear: both;
  display: block;
  overflow: hidden;
  visibility: hidden;
  width: 0;
  height: 0;
}

最後に.alphaと.omegaというスタイルがあって、これはgrid unitの中に別のgrid unitを入れたいときに使う。

.alpha {
  margin-left: 0;
}
.omega {
  margin-right: 0;
}

感想

当然だけど、CSSフレームワークは単なる道具であって、格好いいサイトを作るにはそれなりのデザインセンスが必要だということが分かった (現実は非情である)。新聞紙みたいな複雑なレイアウトが簡単にできるだけでも楽しいけどね。

公式からリンクされてるチュートリアル でも、「CSSフレームワークは全てを解決するわけじゃない」「960 Grid Systemでプロトタイプをさくっと作り、それを育てていこう」 みたいに書かれてますね。

あと http://960.gs というドメイン名がいいね。

[git] Githubでのgem公開は、masterからしかできない

Gems will only be built when the gemspec version is bumped on the master branch.

[GitHub RubyGemsより引用]

ということはですね、master(という名前のブランチ)はリリースブランチとして使わないといけないってことだよね。

masterを開発版のHEADとして使ってると、「既存のリリースにバグがあったので再リリースしたい」っていう時に困る。

-o-o-o-o-o-o master
 |
 o-o v1.0.0
   |
   o-o v1.0.1 #このブランチのgemspecをpushしても、gemはビルドされない(´・ω・`)

みんなこの辺どうしてるんだろうなぁ。

(5/27追記:default branchに設定したブランチからgemリリースできるようになった !))

[ruby] Ruby Tab Sweep (2)

1.8/1.9共用のgemを作る方法

Nokogiri作者のアーロンさんより。

NokogiriのWindows版バイナリが入ったgemを作ってるんだが、1.8と1.9の両方に対応する簡単な方法はないか?という話。

提案されている方法は、1.8用/1.9用両方の*.soが入ったでかいgemを作って、実行時にRUBY_VERSIONを見てロードする.soを決める、という感じ。

Sinatraの子供たち

Sinatraの最大の発明は「アプリ書くのに、クラス定義とか要らないよね」っていうやつだ。

ネームスペースの衝突を避けるためのgem、Akidoka

Akidoka…。何語なんだ。

2.0が出た暁にはこういうのも要らなくなるのかな。

CSSメタフレームワーク、Compass

よく分からんが、

  • Blueprintや960 Grid SystemといったCSSフレームワークを、Rubyから便利に使うためのもの
  • Sassを利用している
  • Rails/Merb/Sinatra/Merb/Webby/Staticmaticに対応

…というとこまで分かった。「SassからBlueprint等を使うためのプラグイン」みたいに思っとけばいいのかなぁ。

JSでmp3を再生するためのjQueryプラグイン、jPlayer

ダウンロードするとswfファイルが1つと、jQueryプラグイン(.js)が1つ入っている。簡単でいいね。(しまった、Ruby関係ない)


2009-05-11

[sinatra] MOONGIFTさんに取り上げられました

いろんなOSS/フリーウェアを紹介されているMOONGIFTさんにて、Sinatraの話題が。

SinatBBSだなんて、思いっきり名前被ってるなーと思ったら、gihyo.jpの記事のために 作ったやつだった(笑)。(まさかこんな形で載ることになるとは…)


掲示板を選んだのはコードがシンプルというのもあるけれど、 実はRuby-KENT構想というのを考えていて、KENT WEBのCGIを Sinatraで再実装したら面白いんじゃないかなと思っていたのだった。

んで、実際にCGIに乗せてみたらエラーでうまく動かせなかったので、記事には書かなかったんだけど、 最近直ったみたいだし(?) もう一度トライしてみようかな。


gihyo.jpの方は、Ramazeの紹介がアップロードされました。 Sinatraと同じくシンプルなフレームワークですが、よりRubyらしさを大事にする感じなので、Sinatraはラジカルすぎるわという方も ぜひ触ってみてほしいところです。


2009-05-06

[web] CSSを「ちゃんと」書けるようになりたい

僕のCSS知識はとほほのスタイルシート入門で止まっている。 borderとかcolorとかは分かる。(positionとかfloatとかはちょっと怪しい。)

ちゃんと書ける、というのは、

  • marginやpaddingはとりあえず0にするものなのか
  • 文字のサイズはem, px, pt, %のどれで指定すべきなのか
  • divを3カラムに並べる方法
  • ブラウザの非互換を踏まないために気をつけること

とかいう「常識」を身につけたい、ということだ。

なんかお薦めの本とかサイトとかありませんかね。

追記

コメント欄とかブックマークコメントで いろいろアドバイスをいただきました。ありがとうございます。

muscovyduckさん:

id:K-Onoさん: 4774136840 4839929734

とりあえずホップ本とCSSNite本買っとけばいいんじゃないか。

id:Layzieさん: 4798010928

うーん…。取りあえず、コーダーの人のブログを読むとかかなあ。俺は「Web標準の教科書」で基本を覚えた気がするけど。

id:rh-kimataさん: 4774127833 4774136840

 W3Cの仕様書、といいたいところだけど通読するのは大変なので、"セオリー・オブ・スタイルシート (Quick Master of Web Technique)" と "実践 Web Standards Design ~Web標準の基本とCSSレイアウト&Tips~" をお勧めする (両方とも書籍)

id:ks1234_1234(すみけん)さん:

 自著宣伝になるし古いが、ひとまず。http://www.asahi-net.or.jp/~jy3k-sm/css1/2003maki/index.html ▼自分はBODYに絶対値を指定して、あとは相対値がいいと1998年に書いたが、プロ制作現場はどうなさってるんでしょね

Yuguiさんからも一票。

okkezさん: 4839918066 4839918074

id:Layzieさん:

リンク元から:

本日のツッコミ(全6件) [ツッコミを入れる]

Before...

okkez [http://stack.nayutaya.jp/author/247 この二冊が手を動かして覚えるには良かった。 ..]

Layzie [エントリ書いてみました。よければ参考にしてください。 http://d.hatena.ne.jp/Layzie/20..]

yhara [本文に追記しました。ありがとうございます!>皆様]


2009-05-04

[ruby] Rubyの本リスト

るびまに「これまでに出たRuby本」みたいな常設記事があってもいいのかも

[[ruby][idea] Re: Rubyist Magazine - Ruby の歩き方 - Greenbear Diary (2009-02-10)より引用]

という話を昔書きましたが(忘れてないよ!)、そういうリストを作っておられる方を見つけてしまった。

単にこのリストにリンクするのでも役立ちそうですね。

[esobook] 奇妙な言語本のレビューをいただきました

久しぶりにamazonを見たら、レビューが一件増えていた。

Ruby初心者にオススメします, 2009/3/28

[Amazon.co.jp: Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~: 原 悠: 本より引用]

「ネタだよね?」と言われることもあるけど、「Ruby初心者の2冊目の本におすすめ」というフレーズはわりと本気のつもりで 書いてた。なので、そういう方向で役立てていただいてとても嬉しいです。

ところで、実はいま献本用の在庫が2冊余ってるんだけど、どうしようかなぁ。1冊はるびまのプレゼントに出すとして*1、もう一冊。

  1. 応募者の中から抽選でプレゼント。
  2. 応募者の中で一番実年齢が若い人にプレゼント(以前twitterで「金がなくて買えない」という人が居た気がするので)。
  3. 「俺の考えた言語」コンテストを開き、人気投票一位の人にプレゼント。

どれがいいでしょう?

4839927847

*1 プレゼント企画があればだけど

本日のツッコミ(全1件) [ツッコミを入れる]

okkez [SSB の Ruby タグもなかなか。 http://stack.nayutaya.jp/tag/ruby]


2009-05-01

[ruby] Diamondback Ruby = Ruby+型チェック

省略形はDRubyだそうな。おいおい、dRuby(drb)と思いっきり被ってるんだが…'D'だからいいってことかいな。

それはそれとして、進化の方向性としては正しいと思う。

存在しないメソッド呼び出しの静的検出とか、コメント行による型指定とかができるみたい。


2009-04-30

[git] git-svnが意外に簡単だった件

以下を参考に。

リポジトリの初期化

 $ git svn clone <subversion-url> ?optional-directory-name?

svnのリポジトリから、ローカルなgitのリポジトリを作る。全ての履歴を取ってくるので多少、時間はかかる。(たぶんオプションで最新版だけとかできそう)

コミットの受信

 $ git svn rebase

コミットの送信

 $ git svn dcommit

ローカルの各コミットがsvn側に送信される。

注意点としては、「マージ」はsvnにうまく変換できないこと。だからローカルでブランチを作るときは、マージ時にfast-forwardになるようにしなければならない(多分)。

こういうのはいいけど、

   *-*-
  /    \
--*-----*--

こういうのはダメなんじゃないかな。

   *-*-
  /    \
--*--*--*--

というか、怖いので当面はブランチ作らない予定。

それ意味あるの?と言われそうだけど、git logが爆速なのでそれだけで幸せです(^o^)

本日のツッコミ(全3件) [ツッコミを入れる]

okkez [trunk だけ clone してるけど、ブランチ関連で困ったことはないですよ。 master で git svn ..]

ujihisa [意外に]

yhara [thx]


2009-04-29

[git] WEB+DB PRESS Vol50の「はじめてのGit」が神記事

読み終わった。

477413838X

なんといってもメンテナ自らが書いてるということで、言ってみれば世界一Gitに詳しい人(の一人)による入門記事なわけですよ。

紹介されているコマンドは以下の通り。

  • git add : ファイル・変更の追加
  • git commit : コミット
  • git diff : 差分 (git diff, git diff --cached, git diff HEADの違いも!)
  • git status : ワークツリーの状態を表示
  • git show : あるコミットの情報を表示
  • git log : コミット履歴
  • git blame :
  • gitk : GUIツール
  • git revert : コミットの取り消し(あるコミットを打ち消すコミットを行う)
  • git checkout : ファイルの取り出し
  • git reset : コミットの取り消し(コミット履歴そのものを削除する)
  • git rebase -i : 2つ以上前のコミットの書き換え
  • git pull : 変更の受信
  • git push : 変更の送信
  • git clone : リポジトリの複製
  • git init : リポジトリの初期化

「Gitではこういうことができます」という記事はWebにいろいろあるけど、 「Gitはこういう風に使います」というところまで書いてあるのが嬉しかった。 プロジェクトの規模に合わせて、柔軟にブランチを管理できるみたい。

本日のツッコミ(全2件) [ツッコミを入れる]

いまい [pullとpushが逆?]

yhara [直しました。ありがとうございます。]


2009-04-28

[ruby][scraping] Nokogiriに新機能が取り込まれたよ

NokogiriにもWeb::Scraperのshellみたいのが欲しいなーと思っていて、そしたらSequel添付のsequelコマンドが irbを使ってそれっぽいことを簡単に実現してたので、真似してみた。bin/nokogiri

んで、コミットしてpull request送ったら採用されました。これは嬉しい。

使い方は、

$ nokogiri http://www.ruby-lang.org/ (もしくはHTMlファイルのパス)

などとすると、変数@docに指定URLのHTMLを表すNokogiriオブジェクトが入った状態でirbが起動する、という感じです。 自分でいうのも何だけどこれは便利。

そのうちリリースされると思います (追記:されました) (今すぐ使いたい方はbin/nokogiriだけ取ってきてパスを通せばおk)


2009-04-27

[ruby] gihyo.jpにSinatraで掲示板を作る記事を書きました

SequelとHamlの紹介もあるよ!

こちらもどうぞ↓

[biwascheme][memo] JSのテストをJSでできないか

JSのテストをJSでできないか。イベント処理も含めて。

作戦1

Prototype.jsではカスタムイベント+fireが使えるので、BiwaSchemeでいうとadd-handler! (Element.observe相当) をオーバーライドして カスタムイベントを経由させれば、スクリプトからイベントを発火させることが可能に。

という実験をBiwaSchemeでやってるんだけどさー。 「新規アイテム作成→削除」という単純なテストがあったときに

  (js-invoke ($ "origin") "fire" "bs:click")                                
  ; ---
  (expect (vector-length (ticket-divs)) is 1)
                                                                            
  (js-invoke ($ "hand_delete") "fire" "bs:click")
  ; ---
  (expect (vector-length (ticket-divs)) is 0)

上の「---」の部分がイベントハンドラの実行終了までブロックしてくれないので、アイテムが作られる前にexpectが実行されちゃってfailした。

作戦2

もうイベントハンドラ自分で実行すればいいんじゃないかなぁ。

(つづく?)

本日のツッコミ(全2件) [ツッコミを入れる]

jugyo [ブログ記事へのリンクありがとうございますー]

yhara [いえいえー]



2009-04-22

[misc] ATOKだと「。」の変換で「…」が出せるぞ!

しらんかった。。。

これで「点」とか「店」に変換されてイラっとくることもなくなりますね…。

本日のツッコミ(全1件) [ツッコミを入れる]

g_maeda [「・」または「・・・」の変換でもOKです。]


2009-04-21

[ruby] gemを自作したのに実行ファイルがインストールされないと思ったら

gemspecの書き方が悪かった。$GEM_HOME/specification/*.gemspec から適当なものを参考に…と思ったけど、 それよりもまず:

ちゃんとマニュアル読まないとね。

executablesに実行ファイル名のリストを、 default_executableに一番重要な実行ファイル名を書く。

 spec.executables = ['bin/foo', 'bin/bar']
 spec.default_executable = 'bin/bar'

といっても、default_executableは今のところは何にも使われないみたいだけど。

  •  

ちなみにgemspec作るにはrtask使うのが簡単ですよ。 デフォルトで移動がカーソルキーなのにだけ注意。

[ruby] Hpricot 0.7出てたのか

MechanizeがNokogiriに移行しちゃったしなー(というかそのためのNokogiriかね)、Hpricot追いかける意欲が減退してるのは本当。

しかし「JRubyで動くのはHpricotだけ!」、その通り。IronRubyへのポートも進んでるとか。すげえ。

以下、「おまえらHpricotに不利なベンチマーク取ってるだろ」とすねる_why先生と、 「つーかバグトラッカー放置しすぎ」と正論を吐くRyan Davis、そして 「ベンチマークのコードはgithubにあるから改善してくれない?」と提案する(そして断られる)アーロンさん。


2009-04-19

[haskell] link: HaskellによるAOBenchのコードの高速化をしてみた - 2009-04-11 - TTSYの日記

7.98秒っていうと、インタプリタではなかなか出せない感じのタイムですね。

高速化されたあとのコードがgithubに。高度なHaskellは読めん。

AOBenchのページはこちら。


2009-04-16

[softs] Apache Couchdb

Web 時代の非リレーショナルデータベース: 第 1 回 Apache CouchDB の概要とインストール

  • RDBではなく、json形式のデータを保存。スキーマはない
  • HTTP経由のREST APIで操作
  • MapReduce風のクエリが使える
  • 実装はErlang

なんぞこれー。

[web] formula

TeX形式で書いた数式をブログに貼れるサービスらしい。

これでtDiaryでも簡単に数式が書けますね。

[misc] 人につくらせ、人に選ばせることで目的のものを手に入れる

(via http://b.hatena.ne.jp/kokokubeta/20090416 )

面白かった。

あるサイトに誘導するための広告バナーが欲しいときに、

  • ユーザに200個くらいバナーを作ってもらい、
  • それらを実際に表示し、クリック率の高いものを選ぶ

ことで「本当にクリックされるバナー広告」を作ることができる、という話。(いや、そういうシステムのバナー製作サイトができた、という話か。)

「作成」と「選別」に(大量の)人力を使うところがポイントか。

例えば芸能人のそっくりさんを探したいときに、

  • 芸能人に似てる写真を投稿するサイトと (「顔ちぇき」とかあるよね)
  • 芸能人に似てる度をユーザが評価するサイト

を用意すれば、自動的にそっくりさんが集まる、と。(効率がいいかはともかく)


2009-04-15

[javascript][scheme] js-scheme

a Scheme interpreter written in JavaScript…とな?

継続は脱出用途しかサポートしないようだけど、デモのコマンドライン風REPLはいいな。

via http://onbangdo.readymade.jp/etc/?p=%282009.04.14%29

[misc] 英語を練習するためのチャット作った

インターネットのおかげで外人とチャットするとかすげー簡単になったわけなんですけど(例:IRC@freenode)、 やっぱりちょっとなんというか敷居が高いわけです。 剣道で例えると、自分は授業でちょろっとやっただけなのに五段の人と練習試合するみたいな。 「大丈夫、手加減するから」って言われても怖いじゃないですかwww

なので最初は日本人どうしで練習すればいいと思った。

ujihisaに昔の記事をremindされて思いつきました。ノープランですがよろしくお願いします。 日本人どうしだから超適当でも大丈夫だよ!!

#んで「間違いを気にしなければ意外と書けるんだ」ってことに気づいたら、英語のMLとかIRCとかに参戦できるようになると思います。

[ruby] ライブラリ「ActiveRecord」「DataMapper」の元ネタについて調べてみた

PofEAAっつー本のデザインパターン名らしい。

0321127420 4798105538

以下メモ

OTN Japan - 今だからデータ・アクセスを真剣に考える! 第1回

  • システムはだいだい以下の階層に分けられるよ(分け方は人によるけど)
    • UI層 / アプリ層 / サービス層 / ドメイン層 / パーシステンス層 / データストア(RDBなど)
    • Table Data Gateway、Row Data Gateway、Active Record、Data Mapper はパーシステンス層のパターン
  • ドメイン層にも以下のようなパターンがあるよ
    • Transaction Script
      • 機能をクラスにし処理をメソッドにする。
    • Domain Model
      • データをクラスにする。OO寄り。テーブルとクラスが(必ずしも)対応しない。
    • Table Module
      • データをクラスにする。RDB寄り。1テーブル1クラス。
    • 対象が複雑になったときの拡張性が違う。

OTN Japan - 今だからデータ・アクセスを真剣に考える! 第2回

  • パーシステンス層のパターン
    • Table Data Gateway
      • あるテーブルにアクセスするクラスを定義し、そいつ経由でDBアクセスを行う。
    • Row Data Gateway
      • あるテーブルの1行(レコード)を表すクラスを定義する。
    • Active Record
      • テーブルの1行(レコード)が1インスタンスになる。Row Data Gatewayと似ている
      • Row Data Gatewayと違い、ドメインロジックをメソッドとして含む。(Railsでいうモデルに定義するメソッドとか)
    • Data Mapper
      • ドメイン層にもデータストアにもなるべく依存せず、O/R間のデータ変換を行う
  • それぞれ、ドメイン層のどのパターンと合わせやすいかが違う
    • # RubyだとORMライブラリがドメイン層まで吸収してるので考える余地はなさそう
  • O/Rインピーダンスミスマッチの話
  • 大規模開発においては、OとRを分離して作りやすい「Domain Model」+「Data Mapper」がいいんじゃないか

[book][javascript] オライリー本「Prototype & script.aculo.us」

買っちゃった。

4873113725

  • 単なるリファレンスじゃなくて、「この関数はこういう時に使え」みたいなことも書いてあるのが嬉しい。
  • インプレース編集機能とかあったのか…。

2009-04-14

[ruby][git] JRubyがgitに移行

JRubyのリポジトリがsvnからgitに移行したそうな。

なぜgitを選んだかについては、

  • 長いこと分散SCMを検討していて、Mercurialかgitにしようと思っていた
  • KenaiはsvnとMercurialしか使えなかったんだけど、最近gitがサポートされた
  • githubにリポジトリ置いた方がRubyistの援助を集めやすいんじゃね?
  • そうこうする間にgitが気に入ってきた
  • まあ結局、Ruby界でgitが人気だからgitにした。もしJythonの開発をやってたらMercurialの方を選んだだろうね

とのこと。

[ruby][javascript] Rubyでブラウザを使わずにJavaScriptのテストを行う

WWW::MecanizeやNokogiriのアーロンさんより。

rake testでJSのテストまでやりたかったので、いろいろyak shavingしてるうちに1年以上ハックし続けてしまったそうなw。

んで、実現に必要なものが3つあって、即ち:

  1. Rubyから操作できるJavaScript処理系。→ jhonsonというspidemonkeyのRubyラッパが使える。
  2. 適当なHTMLも解析できるXMLパーザ。→nokogiriが使える。
  3. DOMをエミュレートするライブラリ。→takaできたよー

これらを使うことで、

 assert_equal 0, @document.getElementsByTagName('option').length

という感じでJSのテストが書けると。…無茶しやがってwww

まだtakaで実装してないDOMのapiもあるそうなんで、応援したい人はがんがんパッチ書くと良いです。

本日のツッコミ(全1件) [ツッコミを入れる]

wtnabe [ほしかったっす!]


2009-04-13

[git] 「gitを始める前に知っておいたほうがいいこと」的な発表をした

社内勉強会でgitの話をした。gitはsvnと違うところがありすぎて(コマンド名とかstagingとか)、いきなり触るととっつきにくいところが多いので、 そのへんを自分なりにまとめてみた感じです。

そのうちこっちにまとめる。

[ruby][sinatra] gihyo.jpにSinatraの記事を書きました

mameさんからバトンをいただいて、gihyo.jpのWeb連載 「Ruby Freaks Lounge」でRubyのWebフレームワークの話を書かせていただきました。

SinatraはDSLを使ってWebアプリを簡単に書けるフレームワークで……という話は連載の方に譲りますが、 Sinatraは充分実用に耐える能力を持っていると思うので、ぜひ一度試してみて下さい。

まだ整理中ですが、Sinatraのチートシートも書いたので良ければどうぞ。


2009-04-10

[event][ruby] 9月、松江にて「RubyWorld Conference」

国際会議だそうですよ。

松江を訪れたことない方はこの機会にどうでしょう。

[ruby] Thorってなんなの?yet another rakeなの?

Thorについて分かっていること:

  • rubyforgeにアカウントがあるがリリースはない
  • と思ったらgithubから入れろということか
  • コマンドラインアプリを書くためのツールらしい
  • 作者の説明
  • Merbの開発者だ
  • sinatra-bookのビルドにも使われてる

どうも、*.thorというファイルでThorを継承したクラスを定義しておくと、そのメソッドが thor なんちゃら で呼べたりするらしい。

例。test.thor (ファイル名はどうも関係ないらしい)

class Sample < Thor
  desc "hello", "greets to you"
  def hello
    puts "Hello!"
  end
end

thor sample:hello で実行。

Hello!

thor -Tでタスク一覧。

sample
------
sample:hello                       greets to you

ふーん。

Rakeタスクとできることは同じような感じだけど*1

  • Rakeは依存関係を記述するのが主目的で、コマンドラインツールとして使うのは若干目的を外れている
  • Thorの方が薄いDSL (素のRubyに近い) ので書きやすそう

と思った。

*1 bin/rake2thorとかあるから、意識はしてるみたいだw

[ruby] Hamlのチートシートを書きました

「cheet sheet」の日本語訳って何だろうと考えると、やっぱり「早見表」だと思うんよね。

どうぞご利用下さい。


2009-04-09

[biwascheme] GoogleMapsに1800個くらいマーカー置こうとしたらブラウザが限界に達した

所用で久しぶりに(卒論以来か?) BiwaSchemeでGoogle Mapsいじるコードを書いてたんだけど、 マーカーを1800個くらい置くSchemeのコードを書いたらFirefoxもOperaもSafarも 操作不能になった(いや、Operaは操作はできたな)。

ところどころにsleep入れてるんだけど、それでも駄目なんだよね。というか、evalじゃなくてread時に時間かかってるっぽい。 別にS式が巨大なわけじゃなくて、120文字くらいのが2000個あるだけなんだけど。もう少し要調査か。

ところがですね、製作途中らしいMac版Google Chrome(参考)だけは 実用的な速度(10秒くらい?)で動くんですよ。まあ機能がまだ全然ないので速いってのもあるかも知れんけど、それにしてもChromeやばい。

ちなみに書いてたコードはこんなの。「新しくマーカを作り、クリックされたらInfoWindowにこの文字列を表示する」とかも普通にできます。

(define *map* #f)
(define *markers* #f)

(define (point lat lng)
  (js-new "GLatLng" lat lng))

(define (marker-new pt)
  (js-new "GMarker" pt))

(define (add-marker! pt proc)
  (let ((marker (marker-new pt))
        (depth (- 15 (random-integer 2))))
    (js-invoke *markers* "addMarker"
               marker depth)
    (js-invoke (js-eval "GEvent") "addListener"
               marker "click"
               (js-closure (lambda (e) (proc marker))))))

(define (add-store! name lat lng addr url misc)
  (define (on-click marker)
    (let* ((br "<br>\n")
           (str (string-append name br addr br url br misc br)))
      (js-invoke marker "openInfoWindowHtml" str)))
  (when lat
    (add-marker! (point lat lng) on-click)))

(define center (point 35.4813224 133.0679589))
(define (init)
  (set! *map* (js-new "GMap2" ($ "map")))
  (js-invoke *map* "setCenter" center 14)
  (js-invoke *map* "addControl" (js-new "GLargeMapControl"))
  (set! *markers* (js-new "MarkerManager" *map*))
  )

(init)

(load "loader.scm")

[rails] Rails2.3だとプロジェクト作るときにテンプレート使えるらしい

bortとかextended-bortとかrocket-starterとか、「いろんなプラグインが入った状態から開発を始める」ための Rails関連ツールってのがいくつもあったわけですが、 Rails2.3からは「Rails Template」(Application Template?)という、railsコマンドでプロジェクト作ったあとに 自動でなんかするための機構が導入されたみたい。

参考:

まあなんかtemplate.rbに

# template.rb
run "rm public/index.html"
generate(:scaffold, "person name:string")
route "map.root :controller => 'people'"
rake("db:migrate")

git :init
git :add => "."
git :commit => "-a -m 'Initial commit'"

などと書いておき、

 rails foobar -m template.rb

とすると、プロジェクト作成後に自動的にscaffoldしたり、db:migrateしたり、gitリポジトリ作ったりしてくれると。 なかなか良い感じです。

サンプルがこのへんにあります。

ただ一つ気になったのは、pluginコマンドでプラグインを追加するとき、リポジトリの最新版しか取って来れないという点。 せっかく、script/pluginならタグが指定できるってのに…。 しかもscript/pluginはこれはこれでgitのsubmoduleにできないんだね(pluginコマンドはこれができる)。

んで、むりやり特定バージョンをsubmoduleにする方法を考えてみた。

# Install plugins
def submodule(url, tag=nil)
  name = url[%r{/([^/]*)\.git\z}, 1] or raise "wrong git url? #{url}"
  run "git submodule add #{url} vendor/plugins/#{name}"
  inside("vendor/plugins/#{name}"){ 
    run "git checkout #{tag}" if tag
  }
end

submodule 'git://github.com/dchelimsky/rspec.git', '1.2.2'
submodule 'git://github.com/dchelimsky/rspec-rails.git', '1.2.2'

うん、まあ、そのうち対応される気がするんで、おとなしく手でsubmodule addすればいいんじゃないかな。

本日のツッコミ(全3件) [ツッコミを入れる]

Yuya [Google Mapsは、MarkerManagerを使うと改善したりしないですかね。]

yhara [いえ、MarkerManager使ってこんな感じでした。]

Yuya [おっと失礼。GMarkerManagerだったかな。 MarkerManagerには2つのメジャーな実装があったよう..]


2009-04-08

[prog] ジェバンニが一晩で

朝起きてtrackfeedのログを見てびっくりした(笑)。

db33e44e16f5b3a0159a2bf9a98f9af1.png

皆さん仕事が速すぎる。

[rails][rspec] restful-authenticationの作るspecがRails 2.3.2に対応していない

以下のようなエラーが出ると思う。

3)NoMethodError in 'UsersController named routing should route user_(:id => '1') to /users/1'
undefined method `formatted_user_path' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_4::Subclass_3:0x22bcd8c>./spec/controllers/users_controller_spec.rb:152:

4)Test::Unit::AssertionFailedError in 'UsersController route generation should route users's 'update' action correctly'The recognized options <{"action"=>"show", "id"=>"1", "controller"=>"users"}> did not match <{"action"=>"update", "id"=>"1", "controller"=>"users"}>, difference: <{"action"=>"update"}>
./spec/controllers/users_controller_spec.rb:83:

こんな感じで直した。

http://gist.github.com/91779

参考:


2009-04-07

[event][biwascheme] BiwaScheme Hackathon #1

というイベントが、先週土曜日に行なわれました。

流れとしては、東京行きますという日記を書いたらyamatoさんとmokeheheさんからお誘いを頂いて、せっかくならご一緒にお会いしましょうかということで今回のイベントになりました。

そんで行ってみたら初対面の方が5人いたり、全員がBiwaSchemeを知ってたり(まあそうか)異常な空間だった。

どうやらyamatoさんは本気でアプリケーションを書こうとされているようで、プロジェクトに対する責任感が芽生えたような気がしました。 もう自分のためだけのBiwaSchemeじゃないのね、みたいな。

BiwaSchemeの内部構造の話をしたり、デバッガの話をしたり、長らく忘れてたことをいろいろ思い出しました。 あといろいろアイデアをいただいた。

  • 例外処理。throwとcatchで実装できるかと思ったけど、ネットワーク通信とか挟むとスレッドが変わるから駄目だなぁ。jsで書かれたライブラリ関数からもraiseしたいと思うとマクロですますわけにも。
  • wonderscm(wonderflのScheme版)は面白いと思うので、さくっと実装できそうだったらぜひやってみたい。
  • メモ代わりに、specに「これがバグるよ」という項があるといい。
  • URLのパラメータ部分をJSから取得したい。
  • dumpの色分け。
  • cookie。
  • CDATAでくくる。

twitterにも書いたけど、自分のプロジェクトのイベントができるというのはとても幸せなことであるのが分かった。 続けていると良いことがあるものです。 改めて、今回来て下さった方に感謝を。次回以降も機会を見つけてやりたいと思ってるので、今回参加できなかった方もよろしくお願いします。

[scala] Scala DSLによるBASIC実装

Scalaすげー。

Rubyでは行番号がどうやっても無理で、Schemeでも改行がread時に消えちゃうからダメ。 Common Lisp+リーダマクロならできると思うけど。

[prog] Lisp風のマクロとPython風の文法を持つ言語、PLOT

それ何てCyan?て感じですが…。

リファレンスで、if式より前にマクロがあるところがなんとも(笑)。

        if x < 10
          f(x)
          g(x - 1)
        elseif x < 100
          f(x, x * 2)
        else
          f(x / 1000)

forという構文を定義するマクロの例(一番下)。Lispから括弧を抜いたような雰囲気がありますが、しかし記号が多いな…。