トップ 最新 追記

Route 477



2009-06-17

[ruby] Rubyの新世代パッケージングシステム、Ripの目指すところ

GitHub Rebaseで「Rip」というプロジェクトが開始した、というニュースを見たので調べてみた。

特徴は

  • ディレクトリ・ファイル・github・gemなどいろんなソースからインストール可能。
  • 必ずしもパッケージを「ビルド」する必要はなく、リポジトリから特定のバージョンを直接インストール可能
  • "ripenv"という、仮想環境機能がある。ライブラリの新バージョンが出たときは、まず新しい環境を作って試してみるとか
  • 依存関係はdeps.ripというテキストファイルに、一行一ライブラリで指定する。バージョンも込みなので、RubyGemsよりきっちり管理できる(?)

ということらしい。

状況は

  • まだ始まったばかり
  • RubyGemsを置き換える気はなく、共存すればいいと思っている
  • けど、便利さゆえにシェアが逆転する可能性はいずれあるかも?

というところのようだ。


まとめると「今後に注目」ということで。

以下は調査ログ。

InfoQ: Rip: A New Package Management System for Ruby

  • Githubチームの新作
  • ディレクトリ・ファイル・github・gemなどいろんなソースからインストール可能
  • "ripenv"という、仮想環境機能がある。ライブラリの新バージョンが出たときは、まず新しい環境を作って試してみるとか
  • 別にRubyGemsが嫌いなわけじゃない、むしろ大好き
  • Ripはライブラリの配布より使用側に重点を置いている
  • どのバージョンが使われるのかちゃんと分かるようにしたい

RipとRubyGemsの違い

  • RubyGemsはrequireをハックするが、Ripは$LOAD_PATHをハックする
  • RubyGemsのような「require 'rubygems'」が不要
  • RubyGemsは1つの環境に複数バージョンのライブラリをインストールするが、Ripは複数の環境を持ち、それぞれは1つのバージョンのライブラリしか持たない(?)
  • RubyGemsは*.gemしかインストールできないが、Ripはもっといろいろなソースに対応する(予定)
  • 要するにゴールが違うんだ。RubyGemsと共存できればいいと思っているよ。
  • Ripだと、処理系(1.8, 1.9, JRuby,..)ごとに別の環境を作ることができる。簡単でしょ。

あと今後の予定についていろいろ。svnとかhgとかもサポートするつもりだそう。

JamesWilding.net - Rip: a RubyGems Replacement?

  • RipはRubyの次世代パッケージングシステムを作るプロジェクトで、まだ荒削りだけどいい感じだよ。
  • 「パッケージングシステム」っていうか、gitリポジトリからインストールとかできるから、そもそもパッケージ作る必要もないんだけど。
  • なんならgistからだってインストールできる。もう*.gemspecは書かなくていいってわけだ。

Rip: A Next Generation Ruby Packaging System - Watch Out RubyGems!

  • RipはRubyGemsのいくつかの欠点を解決すると共に、全く新しいアイデアも提供する。
  • まだ"development alpha"バージョン
  • 「パッケージ」というものを、別のレイヤで抽象化する
  • いくつかの仮想環境を作り、それぞれ別のライブラリ群をインストールできる
  • Gitと同様、分散指向。「中央のRipパッケージサーバ」みたいなものは存在せず、各人が好きなところから好きなものを入れる。
  • だから、「gem install ライブラリ名」の代わりに、「rip install URI」のような感じになる。
  • Ripはいろんな長所があるし、Gitがこんなに速く普及したのを考えると、すぐに人気になってもおかしくないと思うね。

GitHub Rebase #23

  • RipはRubyのための新しいパッケージングシステムで、パない
  • いろんなソースからインストールできる
  • 仮想環境
  • 実行時じゃなく、インストール時に依存が満たされてるかチェック

About Rip

 $ rip install git://github.com/defunkt/grit.git v1.1.1b

Pythonのvirtualenvpipにインスパイアされた

特徴

  • いろんなパッケージ形式のサポート
  • 仮想環境(ripenv)。あるripenvを作るためのレシピも簡単に作成・公開できる
  • インストール時に、依存関係をチェック。(※実装はどうなってるんだろう?)
  • 親切なエラーメッセージ
  • Rip自身はRubyだけあれば動く

RubyGemsとの違い

  • パッケージを「ビルド」しなくていい。Gitリポジトリにタグを打って「これが最新版だよ」とか。
  • 依存関係はテキストファイルで、一行一ライブラリで指定する。
  • 仮想環境。ライブラリのバージョンを上げるときは、既存の環境をコピーし、インストールして試してみる。うまく行ったら、古いほうの環境を消す。
  • Ripではあるライブラリの「どのバージョン」が必要なのか指定するので、実行してみてからバージョン違いで動かない…みたいなことはない(?)
  • 既存のライブラリをRipに対応させるには、ただdeps.ripというテキストファイルを書くだけ。
  • 中央集権的な「Ripサーバ」は存在しない(良くも悪くも…)

あるプロジェクト(ambition)のdeps.rip

git://github.com/drnic/rubigen.git REL-1.3.0
git://github.com/seattlerb/ruby2ruby.git e3cf57559 # 1.1.8
git://github.com/seattlerb/parsetree.git 480ede9d9 # 2.1.1

ambitionをインストールすると、これら(とその依存ライブラリ)も同時にインストールされる。rip install deps.ripとかもできる。

  • アンインストールは、単にripenvを削除すればいい。rip uninstall <package>もできるけど。-dで依存関係ごとアンインストール。
  • 拡張ライブラリのコンパイルは、rip buildで行う。これはプロジェクトのRakefileを使ってrake rip:install を行う。
  • Windowsには未対応 (※インタビューに1.0までには、って書いてあったね)

2009-06-10

[ruby][memo] Ruby 1.9のM17Nについての3つの記事

これで来たるべき1.9時代もばっちり!(かな?)

あとは実装寄りなら Ruby 1.9 m17n リファレンス (不完全版) ですね。


DXRubyの「Windowsで日本語ユーザ名だとtmpdirのパスに日本語が入ってrequireできない問題」ですが、 IRCの%rubyで聞いてみたところ、

  • Dir.tmpdirの返り値がASCII-8BIT固定なのが問題
    • が、どう直すかは悩ましい部分がある(ENVとか)
  • $LOAD_PATHにファイルシステムエンコーディングな文字列を追加することでとりあえず対応できる

という感じでした。

1.9.2になったら自然に直ってるかも知れませんね。でも一体なんでフルパスでrequireするんだろう…?もうちょっと調べてみたいところ。


2009-06-09

[ruby] Rubyのテスト環境大戦争

おまいらは本当にテストが好きだな!というわけで、Rubyのテスト関係のライブラリを並べてみた。

テストフレームワーク

Test::Unit
Ruby標準添付のユニットテスト用フレームワーク。
RSpec
DSLを使う、「BDD」という概念を流行らしたユニットテスト用フレームワーク。
Cucumber
自然言語を使って、ブラックボックステストを記述する。RSpecの「Stories」と呼ばれていた機能が独立した。

あとはShouldaとかbaconとかいろいろありますけども。

モック・スタブライブラリ

モック=あるオブジェクトに期待したメッセージが飛ぶかどうかテストするためのオブジェクト、 スタブ=ネットワークが絡むとか、実際のオブジェクトが使えない場合に使う偽オブジェクト。 と思ってるんですけどどうなんですかね(more: モックとスタブの違い)

FlexMock
モック・スタブライブラリ。
Mocha
モック・スタブライブラリ。
RR(double ruby)
簡潔な記述を目指したモック・スタブライブラリ。

あとRSpecにもモック・スタブ機能が標準で付いてきます。

テストデータライブラリ

Railsのfixturesみたいに、テスト用のデータを用意するためのライブラリ。

詳しいことは神まとめ http://wota.jp/ac/?date=20090608#p01 を読んでもらうとして:

fixture
RailsにはYAMLからテスト用データを作る仕組み(fixture)がありますね。
Factory Girl
YAMLを捨てて、Rubyで全部書く。
Machinist
Factory Girlのリライト。Fakerもサポートしてます。
Faker
なんちゃって個人情報」的なライブラリ。適当な名前とか電話番号とかを生成してくれる。PerlのData::Fakerの移植らしい。

まとめ

正直なところ、アツすぎてどれがどれやら分かんないですね(笑)。 好きなのを探して応援するもよし、追いかけるのなんてめんどいぜーという人はTest::UnitとかRSpecとか情報の多いやつを使っておくもよし。 ものによっては、書き直しの理由が「構文が気に入らない」だったりしますし、そのうち一番多くの人の支持を得られるやつが生き残るんじゃないすかね。


2009-06-08

[misc] 今週末は東京です

(6/12), 6/13, 6/14。


2009-06-06

[ruby][memo] DXRubyスターターキットとか作れんじゃねーの

DXRuby使ったRubyスクリプトをOcraで普通に固められたので、 これはDXRubyスターターキット作るしかない。

と思ったけどexeのパスがスクリプトから取れなくて困った。リクエスト は上がってるみたいなんでそのうちできるようになるかなぁ。

まあとりあえずは、カレントディレクトリとexeのパスが一致すると仮定して問題ないんかな。


以下は製作過程のメモです。

構造

exeに含めるのは、ruby本体といくつかのファイルだけ。

D:\proj2\rskit2>ocra.rb.bat --no-autodll dxtest.rb
=== Loading script to check dependencies
=== Building dxtest.exe
m src
a src\dxtest.rb
m bin
a bin\ruby.exe
a bin\msvcrt-ruby191.dll
m lib
m lib\ruby
m lib\ruby\1.9.1
m lib\ruby\1.9.1\i386-mswin32
m lib\ruby\1.9.1\i386-mswin32\enc
a lib\ruby\1.9.1\i386-mswin32\enc\encdb.so
a lib\ruby\1.9.1\i386-mswin32\enc\shift_jis.so
m lib\ruby\1.9.1\i386-mswin32\enc\trans
a lib\ruby\1.9.1\i386-mswin32\enc\trans\transdb.so
a lib\ruby\1.9.1\rubygems.rb
m lib\ruby\site_ruby
m lib\ruby\site_ruby\1.9.1
m lib\ruby\site_ruby\1.9.1\i386-msvcrt
a lib\ruby\site_ruby\1.9.1\i386-msvcrt\dxruby.so
e RUBYOPT
e RUBYLIB
l bin\ruby.exe ruby.exe &#63731;\src\dxtest.rb
=== Compressing
=== Finished (Final size was 804769)

Rubyスクリプトは、起動用のファイルのみを含める。そこから、main.rbを動的にrequireする。

ただしmain.rbはexeファイルと同じディレクトリ(←これはカレントディレクトリとは限らない)から探さなくてはならない。 なので、まずexeファイルのパスを取得する必要がある。

が、

 kicker.exe
 -> ファイル展開
 -> bin/ruby src/kicker.rb

となるので、kicker.rbからはkicker.exeの情報を知るすべがない。これは困った。

[web] いまひどいCAPTCHAを見た

http://narabete.com/ にユーザ登録しようとしたんだが

画像の説明

真ん中の数字が読めねえwww 1か3か5か6か7か0のどれかだと思う。

まあ何回かリロードしたら普通に読めるようなの( 画像の説明 )が出てきたのでなんとかなった。

…って、これじゃ強度が足らなくないか?ロボットが防げる程度なら良いってことかな。

[ruby] Rubyスクリプトをexe化するためのソフト、Ocra

Rubyスクリプトのexe化というとRubyScript2ExeExerbが有名ですが、 最近Ocraというソフトウェアがリリースされたので紹介してみる。

まずはインストール。

 c:\> gem install ocra
 c:\> gem install win32-api   # Ruby 1.8系のみ(今のところ)

あとは適当なスクリプトを用意して、

 c:\> ocra.rb.bat hello.rb

すれば*1、hello.exeの出来上がり。ね、簡単でしょ?

仕組みはわりと簡単で、hello.rbを実行して必要なファイルを収集し、Ruby本体とそれらをexe内に格納する。 exeが実行されたら、テンポラリディレクトリに一式を解凍して、Ruby本体にスクリプトを実行させる。という感じ。

おまけ

比較してみた。

  • Ocra
    • 必要なものだけを圧縮・展開するので、速度・サイズともに悪くない。
    • 試験実行を行うため、クロスコンパイルはできない(今のところ)。
    • 1.9も対応済み。
  • Exerb
    • 必要なものだけを圧縮する。
    • さらに、requireをハックしてexe内部からスクリプトを読み込むので、テンポラリディレクトリを使わない。かっこいい。
    • コアファイル(ruby本体)を外だしできるので、アプリケーション(exe)がたくさんある場合もファイルサイズを抑えられる。
    • しかしRubyGemsと相性が悪いという弱点が。
    • ファイルサイズと(展開不要による)実行速度がメリットだが、どちらも昨今は余剰気味である。
    • そういえばクロスコンパイルができた。
  • RubyScript2Exe
    • 使ってるRuby環境をまるごとexeにして、実行時にはテンポラリディレクトリに展開する。
    • lib以下をぜんぶ圧縮・展開するので遅い。おすすめできない。
    • ただし作戦がシンプルなのでLinux/Macも対応しているようだ(未確認)。
    • 2007年以来更新されてない。
  • Crate
    • まだWindowsに対応してない。
    • バイナリを作るのにCコンパイラが必要。
    • スクリプトはsqliteのDBに圧縮して格納する。実行時は(requireをハックして)DBからRubyスクリプトを読み込む。
    • (作者の根気が続けば)テンポラリディレクトリなし・クロスコンパイル可能と、Exerbの上位互換になり得る。

*1 Ruby 1.9系の人は --no-autodllを付けてください

[ruby] DXRubyスターターキットできたよー

Ocra見てからスターターキット余裕でした。

game.exeをダブルクリックするとmain.rbが実行されます。

development.exeはgame.exeと同じですが、DOS窓が出るのでデバッグしたり例外を確認したりできます。

解説

単にカレントディレクトリのmain.rbをloadするようなファイルをOcraで固めただけです。

  1. お使いのRubyにDXRubyを入れる
  2. gem install ocra
  3. rake[Enter]
  4. game.exeとdevlopment.exeができる

ドキュメント書いたりとかはid:mirichiさんに任せました(ひどい!)

[Ruby/SDL] Ruby/SDLスターターキット2

上のやつのRuby/SDL + MyGame版

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

Before...

k-zakko [rskit2を使わせていただきました。ありがとうございました。もし配布方法に問題がありましたらコメント下さい。 ht..]

yhara [問題ありません。使っていただけて嬉しいです。]

k-zakko [了解しました。感謝します。]


2009-06-05

[ruby][rails] RubyKaigiに備えてRails Envy Podcastを聞こう

Rails Envy Podcastは、Jason SeiferとGregg Pollackが RubyやRailsの話題について喋るポッドキャストだ。毎週水曜に公開され、長さは20分くらい。 僕は皿洗いしながら聞くことが多い。

よくリスニング練習用に挙げられるESL Podcastなどと違って、 ネイティブ向けの容赦ない速度だけど、 話題がRuby/Rails関係だから、「server」とか「unittest」とか「can't scale」とか、断片的にいろいろ聞き取れると思う。

RubyKaigi2009は海外からのゲストも多いみたいだから、今のうちにリスニングの練習をしておくといいかもね。

喜びの声

  • 半年くらい前かな、最初のうちは全然聞き取れなかったんだけど、聞き続けているうちに「単語は聞き取れないけど、何を言ってるか意味はわかる」ようになってきたよ。初めてジョークを理解できたときは嬉しかったなあ。
  • ruby-talkを始め、いろんなところからニュースを拾ってるから、かなりのRubyマニアでも毎週ひとつは知らない情報があるはずだよ。最近だと、OcraBlue Ridgeはここで知った。Show Noteに参考リンクが載ってるのが嬉しいね。
  • 「ジャイアントロバーツ・スマッシング・アザー・ジャイアントロバーツ」って漫画か何かかと思ってたけど、GIANT ROBOTSだったんだね…。他にも、「sqlite」を「すぃーこぅらい」って発音するとか、技術者のリアルな英語に触れられるのが魅力さ。

2009-06-04

[ruby] RDoc書いただけで「リファレンスは完璧だお!」とか言ってるやつなんなの

タイトルは釣りですw。自分が実践でき(て)ないのであんまり強くはいえない。

以下、メモ書き程度だけど、個人的に、現状のRDocはユーザリファレンスに向いてないと思ってる。

問題は、

  • 内部用のクラス・メソッドまで全部リストアップされてしまうこと
  • どこから読めばいいか分からないこと
  • クラス構成に1対1対応したリファレンスしか作れないこと

の3点。

1点目は:nodoc:付ければ解決するけど、内部用のメソッドもライブラリのメンテナ候補生にとっては有り難いものだから、 無くしてしまうのはまずい。ので、「内部用のみ」と「内部用+外部用」の2つに分けてリファレンス作れるといいと思う。

2点目は、README(というかrdocのトップ)に、クラス構成の概要とかexampleとかをしっかり書いておけば解決できる。 「rdoc書くときは概要も書きましょう」というのを広めたい。

3点目は少し解説が必要だろう。RDocは1クラス1ページが基本だけど、ユーザ視点から見た場合、複数のクラスのメソッドを 同時に表示してほしいことがままある。例えば最近経験した例だと、Ramaze::Controller のメソッドはRamaze::ControllerとInnate::NodeとRamaze::*HelperとInnate::*Helperに分けて定義されていて、 だけどユーザからしたらそんなのはどうでもいいことで、「コントローラ内で使えるメソッド」としては これらの全部がまとめて見えてほしい。そういう柔軟な構成がRDocではできない。

まとめると、RDocはライブラリ開発者のための包括的なドキュメントを作るには向いてるけど、 ユーザ向けの親切な「リファレンスマニュアル」を作るにはあんまり向いてないと思う。 至高のユーザリファレンスのためにはクラス構造を潰せるような機能が必要で、 そのためには一から設計した新しい何かが必要。

[book][rails] 「600万人の女性に支持されるクックパッドというビジネス」

「Railsだってちゃんとスケールするんです!」という本でした(違う?)。 Ruby/Railsの話は少し出てくるだけですが、相当の負荷を捌いているようです。

4827550719

最近、技術系以外の話を書くサブブログを立ち上げたので(というほどまだ何も書いてないですが)、内容のことはそちらで。

「実装は?」と聞かれそうなブログ名だけど、実装の話はここに書くので(笑)。

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

okkez [継承関係か include されてれば bitclust でできると思う。]

yhara [bitclustはけっこう(Rubyコア以外にも)使えそうですよね。]

Yugui [柔軟な構成を人間が頑張る形ならRDで既にできたんですけど、RDocに退化しましたね。今からならbitclustなんで..]


2009-06-02

[misc] サーバが不安定です

しばらく、mono.kmc.gr.jp以下が見えたり見えなかったりするかも知れません。route477.netもです。

[arc] Arcの最新版が出たらしいが

http://arclanguage.org/item?id=9383

  • (thaddeus) Ken Shiriffがarc2のリリース時に書いてたみたいな変更点まとめはないですか?
  • (pg) ないよ。diff取るといいよ。

pgぱねぇwww

ダウンロードは:http://www.ycombinator.com/arc/arc3.tar

[ruby] Ruby1.8/1.9同時にgemをインストールするシェルスクリプトを書いた

いちいち「sudo gem install hoge」して「gem-1.9 install hoge」するのはめんどいなーと思い始めたので、 両方に一気にgemをインストールするコマンドを書いた。 「gem-1.9」というコマンド名は適当に変えてね。

--format-executableは、gemに実行ファイルが含まれていたときに、そのファイル名をリネームするための指定。 上の設定だと、例えばramazeをインストールしたときに、1.8のは「ramaze」で、1.9のは「ramaze-1.9」で起動できるようになる。

[ruby] そろそろrequire 'rubygems'は止めようと思った

Rubyスクリプトを書くときはたいてい「require 'rubygems'」から始めるわけですが、 RubyGemsが標準添付になった1.9系ではもうこれ不要なんですよね。

なので、未来を見越して、今日から「require 'rubygems'」を手書きするのは止めることにしました。

シェルの設定で

 export RUBYOPT="rubygems"

と書いておけば、rubyの起動時にRubyGemsを読み込むオプションが指定されたと見なされるので、 1.8系でもいちいち「require 'rubygems'」と書かなくて良くなります。楽ちんですね!


ちなみに上の設定は、rubyの起動時に「-rubygems」というオプションを指定するのと同じことになります。 え、そんなオプションあったっけって?ruby -hを読むと、「-r<ライブラリ名>」は「require '<ライブラリ名>'」 と同じことが分かります。ということは「-rubygems」は「require 'ubygems'」と同じはず…。 そこで /usr/lib/ruby/site_ruby/1.8/ を見ると、なんと「ubygems.rb」が。中身は、単に require 'rubygems'しているだけです。

[git] イントラネット用githubとな!?

その名もGithub:FI (Firewall Installの略らしい)。

スクリーンキャスト見たけど、 「ローカルで動くgithub」そのものだった。クール

なにこれ?
イントラネット用のgithubだよ。会社の都合でgithubに(privateでも)アップロードできない場合にどうぞ!
どうやって動かすの?
ダウンロード→インストール(質問いくつか)→うごくよ!(10分くらい) いまのところLinux専用だよ。
システム構成は?
githubとほとんど一緒だよ。JRubyで動かすところが違うくらいかな。見た目も同じだし、少なくとも10万ユーザは大丈夫だよ!
でも、お高いんでしょ?
料金はインストール単位だよ。他のソース管理システムと競える値段だよ。
サポートは?
ヘルプデスク・メールサポート・ナレッジベースが使えるStandardと、技術スタッフが電話対応するPremiumを提供するよ。(※なんかhttp://support.github.com/ とかできてる!)
ちょっと見積もりしてほしいんだけど
今すぐ http://fi.github.com/ へGo!

2009-05-29

[ruby][games] DXRubyすげー

DXRubyという、RubyからDirectXを使ってゲーム作るためのライブラリを作られているのですが。

20090528110656.jpg

30fpsで9600個…だと…!?

(5/29追記:12500個!)

Ruby/SDLがどれくらいか忘れたけど、こんなには出せなかったような。

ところで

マップ描画をRuby1.9.1で動かすと結構速い。

まあ、Exerbが出ないことにはいかんともし難いのも事実で、Ruby1.9系は動向を見つつも、まだしばらくは様子見ということになるだろう。

[Ruby191の速さ - mirichiの日記より引用]

Exerbって1.9は未対応でしたっけ。

最近出たocraっていうアプリを使うとRubyスクリプトを Windows用の自己解凍ファイルにできるらしいですが。(まだ試してない) 1.9も対応済みらしい。まあインタプリタごと圧縮する方式だからできるか。


蛇足だけど、Rubyゲーム界の問題は、みんな(俺を含め)フレームワークを作るのに忙しくて、ゲーム本体を作る人が足らないことだと 思います。フレームワーク作るのが楽しすぎるのがいかんのだ(フレームワークを作るのは、箱庭というか、世界をひとつ作ることだから、 たぶん言語設計に近い。言語>フレームワーク>ライブラリの順でこの要素が大きい。って前書いたことがあるな)。

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

Before...

yhara [「ディスク容量が潤沢なんだから、インタプリタごと配布すればいいじゃん」ってことでしょうか?]

Yuya [いらない子は言い過ぎか。:-) インポートテーブルを書き換えるなどの小手先を使うと、どうしても互換性に問題があるの..]

arton [> そもそもRubyGemsがまともに動作しないのが致命的 まあ、そうかな。というか、requireのところも引っか..]


2009-05-28

[ruby][memo] Re: コマンドラインのmp3 id3 タグ編集ツール

僕も最近同じようなことをした。

iTunesはCDリッパーとしてはとても優れているのだけど、残念ながらID3タグが付いてないMP3の扱いが壊滅的で、 不用意に昔読み込んだmp3とかを食わせるとひどいことになる(ぜんぶ「不明なアルバム」に突っ込まれる)。

だからディレクトリ構成で管理する方が好きなんだ俺は…という愚痴はおいといて、とりあえず mp3にID3タグを付ける方法を考えなくてはならない。それも、できるだけ手軽に。

Windowsならフリーウェアがいくらでもありそうな気がしたけど、今回はコマンドラインでなんとかできないか調べてみた。 すると、id3v2というツールがあるらしい(sudo port install id3v2)。

んで、なんやかんやあって、こんな感じでファイル名をタグに変換した。ときどき文字化けするのでそれは手作業で。

[softs] SVK終了のお知らせ

Subversionを分散型VCSとして使うためのソフト、SVKの新規開発終了のアナウンスがあったようだ。 少なくともあと1年半は、Subversionの最新版に追随はするけど、新機能とか性能改善とかはもう入れないそうな。

作り始めた当時(2003)はバックエンドにSubversionを利用するのは良い選択肢だったけど、 最近は限界を感じることもあったようだ(複雑なマージとか)。

ともあれ、CVS/SVNの世界と、(思ったより早く広まった)分散型VCSの世界の間を、 SVKはいい感じに橋渡しできたんじゃないかな、とのことで、 cvs→svn→svk→hg→gitと以降してきた僕もこれは完全に同意するところ。

お疲れさまでした。

via http://shyouhei.tumblr.com/post/114349647/first-things-first-to-answer-the-subject-of-this


2009-05-27

[prog][memo] 最近、新しいプログラミング言語のニュースが多くないか

もう一個くらいあったような気がするけど忘れた。


2009-05-26

[ramaze] Ramazeの解説記事を書きました

公開されましたね。

今回はこんな↓サンプルアプリです。HTML入れて120行です。

TH400_ramaze-wordsfile.jpg

ramaze-usersも最近また更新してるのでよろしくお願いします。 「ここさえ見ればアプリが書けるサイト」が目標です。

まあそんなわけで、Sinatra概要Sinatra実践Ramaze概要Ramaze実践と続いた連載もこれで無事終わりました。良かった良かった。

[softs] ブラウザのタブの話とか

ブラウザのタブってそんな、数十も開くのが一般的なんでしょうか?

[ブラウザのタブ - ema log (2008-02-03)より引用]

一般的かは分かりませんが、いまこの瞬間はOperaのウィンドウが3つあって、それぞれ10以上のタブが開かれてますね。

主な原因は多分「タブをこまめに閉じる癖がつかない」ってことなんですが、 もう一つ「複数の作業を並行しているから」っていうのもあるかも知れません。

タブが10を超えると、1ウィンドウでは確実にカオスになるので、「やっている作業」 ごとにタブを分ける。例えば開発用のウィンドウなら、「開発用」に1つ開くのではなくて、 作業中のプロジェクトに対して1つずつ、ウィンドウを用意する。 どこか旅行に行くなら、それ用のウィンドウを開いて、そこで宿とか地図とかの調査をする。 んでこれらとは別にもう一つ「メイン」のウィンドウがあって、Gmailとかカレンダーとか絶対復習(さりげなく宣伝) とかはそこに置いてあります。「暇ができたときに見るタブ」がメインウィンドウにある感じかな。

とまあ、このようにウィンドウを分ける習慣が付いたおかげで、一時よりははるかにカオス度を抑えることができるようになりました。 が、未だに量が多いのが「LDRから開いたままの『あとで読む』タブ」なんで、とりあえず手近なウィンドウでLDR開く癖を直さないと…。

結論としては、タブの量に大きな差を与えているのは、一点集中型の性格なのか、複数並行型の性格なのかという違いではないかと思う所存です。


蛇足。本質的には、「タブを閉じる」っていう操作が不要だと思っています。 それくらい機械で勝手に判断すべき。 長いこと開きっぱなしで見てないタブとか、 多分必要ないんだから、自動的に閉じてくれればいい気がする(「自動的に閉じた」という情報が残っていればいい)。

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

ku-ma-me [連載お疲れさまでしたー。ramaze-users 期待してます。 タブもだけど、油断するとターミナルエミュレータも数..]

yhara [ありがとうございます。 screenは、10を超えると数字キーで移動できないので、一桁に抑えてますね。 閉じるとカ..]

ramaze数寄者 [Ramazeの紹介記事を拝見しました。あまり、情報がないので大変たすかりました。 「Ramazeは第7回で紹介した..]


2009-05-22

[ruby][git] gemspecの作り方がわからない?ならばjewelerだ

githubなりrubyforgeなりでgemを公開するときに必要となるのがgemspecファイルですけれども、 これは手書きするのははっきりいってめんどい。それをなんとかしてくれるgithubおすすめの ツールができたらしい。

その名もjeweler。

使い方は上のページに書いてあるけど、Rakefileに

begin
  require 'jeweler'
  Jeweler::Tasks.new do |gemspec|
    gemspec.name = "the-perfect-gem"
    gemspec.summary = "TODO"
    gemspec.email = "josh@technicalpickles.com"
    gemspec.homepage = "http://github.com/technicalpickles/the-perfect-gem"
    gemspec.description = "TODO"
    gemspec.authors = ["Josh Nichols"]
  end
rescue LoadError
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
end

みたいに追記するだけ。そうしたら、

$ rake version:write
$ rake version_required

でVERSIONファイルを初期化する。(あ、人によってはこのへんの作業が必要になるかも)

あとは、

$ rake gemspec

でgemspecファイルができて、

$ rake build

でpkg/以下にgemがビルドされる。さらには

$ rake release

というコマンドがあって、これはgemspecを作り、タグを切って、githubにpushまでしてくれる。楽ちんですね。

バージョン番号を上げるときは

$ rake version:bump:major
$ rake version:bump:minor
$ rake version:bump:patch

のいずれかを使う。

gemspecの内容のいじり方はWiki参照

(追記:githubで公開するときは、リポジトリの設定で「RubyGem」を有効にするのを忘れずに^^; gemstalkerを入れておくと、 $ gemstalk yhara lifelog とかでgithubでgemが公開されたときに教えてくれるようだ。)


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)