2007年 10月 06日

明るくならないと眠れないみたいだ

なんていうんだろう。ここ最近そんな感じだったから、じゃあカーテン締めて暗いままだとずっと眠れないんだろうかと思ってしめっぱにしていたらやっぱ眠れない。

ちらし

UNIQLO とニトリのちらしが、派手さと落ちついた感じのバランスと、情報量の多さと余白のバランスがなんかよくて、すげーって思った。
たまには折込チラシも見るべきだなぁ。

作家の印象

読んでると、感じるような気持ちが、作家によって違う。あたりまえなのかもしれないけど、結構不思議だ。作品によって、じゃなくて、作家によって違う。

「Ruby の勉強をはじめました」

っていうのを見るとなんかムカついて目を反らしてしまう。Ruby は勉強するものじゃない。そうなって欲しくないと思う。

JS とか C とか Java にはそういうの感じない。なんなんだろう。

RDoc テンプレート Resh

RDoc のデフォルトテンプレとか、出回ってるテンプレみたかぎりとか、なんていうか、色が濃すぎて、みんな嫌いなので RDoc のソースよみながら書いてみた。
http://safeeval.rubyforge.org/ こんなかんじになります。safeeval はちいさすぎていまいちだけど、ローカル gem の rdoc とかにつかうといいと思う。

配色とかは search.cpan.org っぽい感じにした。Ruby カラーの赤ってなんかドキュメントにいれるとイライラしてしまうので、というかドキュメント見てるときってだいたいイライラしてるので心を落ちつかせる青系がいいと思う。

svn co http://svn.coderepos.org/share/lang/ruby/rdoc/generators/template/html/resh/ resh

local gem の rdoc をアップデートするには

$ cat ~/.gemrc
rdoc: --template ~/coderepos/lang/ruby/rdoc/generators/template/html/resh/resh.rb --inline-source
$ sudo gem rdoc --all --no-ri --config-file ~/.gemrc 

もし gem つくったときにデフォルトのテンプレートにしたいなら、Rake::RDocTask にオプション設定

        rdoc.template = "#{ENV["HOME"]}/coderepos/lang/ruby/rdoc/generators/template/html/resh/resh.rb" 

最初に表示されるページは指定されたオプションをガン無視して、README (あれば) と、クラス・メソッド・ファイルのインデックスをあわせたみたいなのにした。わりとうまくいく。
あと --inline-source オプションも常に無視して、常に inline-source 表示するようにしてる。でも邪魔は邪魔なので、JS で見えたり消えたりするようにしてる。ボックスが目立たないから最初はとまどうかもしれないけど、目立つべきじゃないのでこうしてる。慣れる。


実装は hate rdoc/template って感じでわざわざ ERB つかうように RDoc のメソッドをオーバーライドしてる。だから html_generator の実装が変わるとバグるかもしれない。generator ごと新しく作ろうと思ったけど、名前に困ったのでやめた。どっちにしろほとんどコピペになるし……互換性なくなったらそうしよう。

module-pluggable リリース

http://modulepluggable.rubyforge.org/

sudo gem install module-pluggable

Module::Pluggable っぽいのをつくろうとおもったのだけど、よくわかんないのでほしいのつくった。中身は chokan の plugin 機構とほとんど同じ。なので、スクリプトロード後のリロード (デーモンっぽいやつでの動的リロード) とか、多数のインスタンスをつくったり、リロードしないまんまのプラグインの状態を保持ったりできる。そのかわり直接プラグインのクラスにはアクセスできない (匿名モジュール内にロードされてインスタンス化される)。

それはともかく
なんか rubyforge config すると

package_ids: 
  modulepluggable: 5722

とかなってしまって

package_ids: 
  module-pluggable: 5722

にしないとリリースできない。これ config するたびに書きかえないといけないのかなぁ

ヒアドキュメントのマーカ

EOF (End of file), EOS (End of string) を一番つかう。
これ以外のときも EOx にするようにしてる気がする。
タブインデントだとヒアドキュメント書くときに楽ができる

classs Hoge
     def hoge
         <<-EOS.gsub(/^\t+/, "")
             hoge 
               hoge
                               aaaaa
         EOS
     end
end

optparse で banner 書くときによく使う。

$HOME の構成

  • bin/
    • app/*/bin/* への symlink だったり
    • ruby1.9 系とかへの symlink だったり
  • app/
    • appname/*
  • src/
    • tmp/ とかあんまり住みわけできてない
    • 定期的に svn up したりしながらインストールするかな? ってときはこっち
  • tmp/
    • test.{rb,pl,lua} つかいまくる
  • config/
    • svn からチェックアウトした config
    • $HOME から symlink
  • repos/
    • 個人公開リポジトリの svk co パス
  • private/
    • 個人非公開リポジトリの svk co パス
  • coderepos/
    • CodeRepos の svn co パス (なぜか svk つかってない)
  • www/
    • /srv/www への symlink だったりちがかったり
  • sdk/
    • AS の SDK とか
  • lib/
    • AS のライブラリとか
  • swp/
    • vim の .swp おきば
  • project/
    • 自分のじゃないプロジェクトで自分が関わっているもののチェックアウトパス
  • graphic/
    • web/
      • *.psd

あと晒せないけどごちゃごちゃ。鯖もローカル (Mac) も共通なのはこれぐらい

index_gem_repository.rb memo

http://jp.rubyist.net/magazine/?0010-PackageManagement の generate_yaml_index.rb はいまはこのなまえ。
カレントディレクトリの gems/* を見て、

  • yaml
  • yaml.Z
  • quick/
    • index # 一行ごとに gem のファイル名が書いてある。
    • index.rz
    • name-version.gemspec.rz

を生成する。yaml には gems/* 以下の Gem::Specification をあつめたやつが入ってる。キャッシュらしい。.rz/.Z は zlib で圧縮されたやつだけど gzip ではない。


rubygems

  • remote_installer.rb
      uri = source + "/gems/#{spec.full_name}.gem"
      response = Gem::RemoteFetcher.fetcher.fetch_path uri
  • incremental_fetcher.rb
109:      zipped_yaml = fetch_path("/quick/" + spec_name + ".gemspec.rz")
123:    def get_quick_index
124:      zipped_index = fetch_path("/quick/index.rz")
  • source_index.rb
300:    # Get the quick index needed for incremental updates.
301:    def fetch_quick_index(source_uri)
302:      zipped_index = fetcher.fetch_path source_uri + '/quick/index.rz'
306:            "No quick index found: " + ex.message
355:          spec_uri = source_uri + "/quick/#{spec_name}.gemspec.rz"

なんか似たようなのがふたつ。

よくみる Bulk updating Gem source index for: は yaml.Z/yaml の更新 (source_index.rb)
quick/* を利用した incremental な source index の更新は

use_incremental = missing_gems.size <= INCREMENTAL_THRESHHOLD

で決まってる。INCREMENTAL_THRESHHOLD = 50。missing_gems はサーバの quick/index[.Z] と、ローカルの spec を比べたときにサーバがわにしかない spec。差分 spec が 50 以上のときと、quick index が利用できないときは常に bulk update により yaml[.Z] が取得される。

yaml[.Z] のサイズは rubyforge のもので .Z が 855KB, 圧縮していないのは 11MB (!) もある (単純に http://gems.rubyforge.org/yaml[.Z] にアクセスすればわかる)。リリースごとに spec は増えていくはずだから、あんだけ大きい gem サーバだとすぐ 50 を超えて bulk update になるだろうと思う。というかおれの使いかただと gem install するごとに毎回 bulk update してる感じだ。quick/index は 140KB。1行に1gem だから、rubyforge がホストしている gem の数は

wget http://gems.rubyforge.org/quick/index
wc -l index

すればわかる。現在だと 8555 gems のようだ (バージョン違いの gem を含む)。

quick/index + 1M ぐらいダウンロードしてきて、伸張して YAML.load してるんだからそりゃ遅いよなぁ。gem の名前ごとに gem サーバをわけるとか、あるいはもっと根本的に解決しないとどんどこ遅くなっていくなぁ。なんか昔の RO のパッチクライアントを思い出した。


>