腕に違和感
昨日の夕方2時間寝たいがいずっと PC つかいっぱのせいか、左腕に違和感がある。腱鞘炎フラグ?
とりあえず冷やしてみた。というか寝ようよおれ……
昨日の夕方2時間寝たいがいずっと PC つかいっぱのせいか、左腕に違和感がある。腱鞘炎フラグ?
とりあえず冷やしてみた。というか寝ようよおれ……
確実、とは言えないけどだいたいうまくいくほうほう
# てきとうに doc.rb とでもつける
require "rubygems"
require "rubygems/doc_manager"
class Gem::DocManager
alias :origi_initialize :initialize
def initialize(*args)
origi_initialize(*args)
def @spec.has_rdoc
true
end
def @spec.rdoc_options
t = super
p t
[] # --exclude . とか排除
end
end
endsudo ruby -rdoc `which gem` rdoc --no-ri --config-file ~/.gemrc --backtrace capistrano
-r で上の読みこんだ上で gem を実行する。capistrano は rdoc あるのになんで生成されないんだろ。あと rails は rdoc 生成しようとすると ruby が暴走する。なぞい。
./configure --prefix=/usr/local/vim7 --enable-multibyte --enable-rubyinterp --enable-gpm --enable-cscope --with-features=huge --enable-fontset --disable-gui --without-x --disable-xim --enable-pythoninterp --enable-perlinterp
http://cutagem.rubyforge.org/ - Cut a Gem をリリースしました。
sudo gem install cutagem
昨日
*newgem を使ってない。
最近つかってない。Rakefile はカスタマイズがすぐできるように Hoe を使わないようにしてる。(Rakefile が何やってるか全然わからなくなるのがいやだ。task が生で書いてあってほしい。こういうのは DRY よりコピペのほうがやりやすいと思う。Hoe からコピペしてるタスクはある)なので、newgem が生成する Rakefile は使えなくて、あと History.txt じゃなくて ChangeLog にしくて (RDoc 書くっていう意味では間違ってるんだけど、ChangeLog のほうが数倍書きやすいし……)、あとあと version.rb がきもちわるいから嫌で、あとあとあと、newgem hoge-gura とかやったときキモいファイル名ができるし、なんかもう全部カスタマイズ済みのを newgem で生成したいなぁとおもったんだけど、できないみたいだ。(ちなみに最近つくった gem は「前につくった gem を cp -r して頑張って置換」してつくってる)
bin/newgem を読んでみると、全部決めうちなのよね。~/.newgem/template があったら読んでくれてるんだろうとか漠然と思ってたけどそんなことなかった。完全なる決めうちだった。清々しいぐらい決めうち。
こういうのってパッチ送るより自分で書いたほうがはやい。
というところまで書いたところで (コメントアウトして保存して)、じゃあ書こうっていう話に脳内でなったので書いた。
http://www.vim.org/scripts/script.php?script_id=1890
lookupfile 関係さがしてたら id:secondlife さんところで見つけて、ためしてみたらやばかった。これはやばい。やばいよ。文乃さんなみにやばい。いやそこまでいかない。zsh でディレクトリ cd していくのがめんどくさくなるぐらいやばい。
nmap bg :BufferExplorer<CR> nmap bG :FilesystemExplorerFromHere<CR> nmap gb :FilesystemExplorer<CR>
タブきりかえの gt gT (タブばっか使ってるので) を意識した感じ
なんか気が付いたら本編も何度か見直してた。いいよ! いいよ! 自由にやりな! 勝手にやりな!
なにが見所なのかよくわからないけど、たぶんたまちゃんなんだよね?
おれはもう終わったことだからいいけど、もし子供ができたらなんとかしないといけない。陸上とかスキーとか飛び箱とかだけにすりゃいいのになぁ。チームプレー入れんなよ。
それにしても「そんなの気の持ちよう」とかいう人間のクズは今すぐ首つって死ねばいいのになぁ……だいたい体育教師もそういやつだから、さらに絶望的な感じになる。
:registers --- Registers --- "" M ^JM ^JM ^JM ^JM ^JM "0 ^I^I^I<div id="footer">^J^I^I^I^I<% require ...
unnamed がこわれる。paste 系のコマンドは ("0 を使うって説明されてるのを見掛けたけど、少くとも vim7.1においては)、"" が使われる。LustyExplorer は他のレジスタは復元するけど " だけ復元しないっぽい。
--- lusty-explorer.vim.orig 2007-10-07 22:50:11.000000000 +0900
+++ lusty-explorer.vim 2007-10-07 22:51:27.000000000 +0900
@@ -957,6 +957,7 @@
@sidescroll = eva "&sidescroll"
@sidescrolloff = eva "&sidescrolloff"
+ @reg = vim_single_quote_escape(eva('@"'))
@reg0 = vim_single_quote_escape(eva("@0"))
@reg1 = vim_single_quote_escape(eva("@1"))
@reg2 = vim_single_quote_escape(eva("@2"))
@@ -1000,6 +1001,7 @@
exe "set sidescroll=#{@sidescroll}"
exe "set sidescrolloff=#{@sidescrolloff}"
+ exe "let @¥" = '#{@reg}'"
exe "let @0 = '#{@reg0}'"
exe "let @1 = '#{@reg1}'"
exe "let @2 = '#{@reg2}'"
なんていうんだろう。ここ最近そんな感じだったから、じゃあカーテン締めて暗いままだとずっと眠れないんだろうかと思ってしめっぱにしていたらやっぱ眠れない。
UNIQLO とニトリのちらしが、派手さと落ちついた感じのバランスと、情報量の多さと余白のバランスがなんかよくて、すげーって思った。
たまには折込チラシも見るべきだなぁ。
読んでると、感じるような気持ちが、作家によって違う。あたりまえなのかもしれないけど、結構不思議だ。作品によって、じゃなくて、作家によって違う。
っていうのを見るとなんかムカついて目を反らしてしまう。Ruby は勉強するものじゃない。そうなって欲しくないと思う。
JS とか C とか Java にはそういうの感じない。なんなんだろう。
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 ごと新しく作ろうと思ったけど、名前に困ったのでやめた。どっちにしろほとんどコピペになるし……互換性なくなったらそうしよう。
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
endoptparse で banner 書くときによく使う。
あと晒せないけどごちゃごちゃ。鯖もローカル (Mac) も共通なのはこれぐらい
http://jp.rubyist.net/magazine/?0010-PackageManagement の generate_yaml_index.rb はいまはこのなまえ。
カレントディレクトリの gems/* を見て、
を生成する。yaml には gems/* 以下の Gem::Specification をあつめたやつが入ってる。キャッシュらしい。.rz/.Z は zlib で圧縮されたやつだけど gzip ではない。
rubygems
uri = source + "/gems/#{spec.full_name}.gem"
response = Gem::RemoteFetcher.fetcher.fetch_path uri
109: zipped_yaml = fetch_path("/quick/" + spec_name + ".gemspec.rz")
123: def get_quick_index
124: zipped_index = fetch_path("/quick/index.rz")
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 のパッチクライアントを思い出した。
>
なにがちがうんだって思ったらリファレンスマニュアルに書いてあった……
- サブクラスから参照/代入が可能
- インスタンスメソッドから参照/代入が可能
サブクラスからの参照/代入が大きな違いかな。クラスのインスタンス変数はあくまでそのクラスにしか属さないから、サブクラスからは頑張って superclass 探すしかアクセスする術がない。
無駄だけど以下のようにすればだいたいクラス変数と同じことがクラスのインスタンス変数でできる。
class Hoge
@@test = :CV_test
@test = :IV_test
def hoge
[
@@test,
self.class.ancestors.find {|c|
c.instance_variables.include?("@test")
}.instance_variable_get(:@test)
]
end
end
p Hoge.new.hoge #=> [:CV_test, :IV_test]
p Hoge.new.hoge #=> [:CV_test, :IV_test]
class Fuga < Hoge
end
p Fuga.new.hoge #=> [:CV_test, :IV_test]
p Fuga.new.hoge #=> [:CV_test, :IV_test]サブクラスからはアクセスされたくない場合だけクラスのインスタンス変数をつかうべきかな (具体的にはどういうケースだろう)
ただし、ローカル変数だけは instance_eval の外側のスコープと共有します。
class Hoge
@@hoge = :hoge
def initialize
@test = :Nice_boat
end
end
o = :test
Hoge.new.instance_eval do
p o #=> :test
p @test #=> :Nice_boat
p @@hoge #=> uninitialized class variable @@hoge in Object (NameError)
endクラス変数も外側のスコープになってるような。module_eval のほうでは : version 1.6.8 以降でブロックが与えられた場合は、定数とクラス変数のスコープも外側のスコープになります。
って書いてあるけど、instance_eval もそうなのかな。
だとすると、ruby 1.8.3 で class_variable_set/get が実装されるまで、クラス変数に直接オブジェクトをセットする方法ってなかったのかな。Mac の ruby は 1.8.2 なのだけど、クラス変数を外から代入するのをどう書いたらいいかわからない……
とここで思いたって、たぶん同じことを ML できいたひとがいるだろうと class_variable_set を検索すると、[ruby-talk:144741] に "Why no class_variable_set?" という投稿があった。ML のアーカイブが全部 not found になっててリンクはれないけどキャッシュでみたところ、アクセサメソッドを定義してた。なるほど……
未定義にするところまで含めると以下のようにすれば一応できる。きもい。
class Hoge
@@hoge = :hoge
def t
@@hoge
end
end
o = :test
Hoge.class_eval %{
def self.hoge=(val)
@@hoge = val
end
}
Hoge.hoge = o
(class << Hoge; self; end).instance_eval do
remove_method(:hoge=)
end
p Hoge.new.t #=> :test
Hoge.hoge = :aaa # undefined method `hoge=' for Hoge:Class (NoMethodError)
なんか更めて読みなおしてみるとあたりまえすぎる……べつに定義されていないなら、class_variable_set/get を定義すればいいだけじゃん
あれでも、結局 eval するはめになってだめか。おれあたまわるい……もうやだ
なんかひさしぶりに特異クラスを意識して、あぁ Ruby はクラスベースなんだなぁってなんだか実感した。普段使う分にはインスタンスにメソッドが直接定義されてるように見えて特異クラスを意識しないもんなぁ。
特異メソッドは全て特異クラスに定義されているんだから、特異クラスも間接的に使いまくってるんだよなぁ。Class.new も特異クラスのメソッドだもんなぁ。Class さえ Object のインスタンスであるから特異クラスを持ってる。特異クラスもクラスのインスタンスなのだから、特異クラスを持ってる。
なんとなく思いついて特異クラスもクラスなんだからインスタンスつくれんのかなぁって思ったけど作れなかった。(clone からデータコピーをのぞいた感じになるのかなぁと漠然と想像した)
in `new': can't create instance of virtual class (TypeError)
CGI で AR つかってたらこれがでてすすまなくなった。一時間ぐらいハマった……
and that the folder that the DB file is in is also readable and writeable by the Apache user
オーナーシップと該当ファイルのパーミッションだけじゃなくて、ディレクトリのパーミッションもだった……
別に gems じゃなくてもそうだけど、ああいうパッケージシステムのウェブのほうは、ドキュメントが表になってるべきで、rubyforge みたいにプロジェクトがいきなりでてくるようになってるべきじゃないと思う。だってプロジェクトの情報なんてそのモジュールを使うためには全く必要ない。
gem のサーバってどうなってんのかな。おれおれサーバつくったほうがいい気がしてきた。
http://jp.rubyist.net/magazine/?0010-PackageManagement
に書いてあった。