明るくならないと眠れないみたいだ
なんていうんだろう。ここ最近そんな感じだったから、じゃあカーテン締めて暗いままだとずっと眠れないんだろうかと思ってしめっぱにしていたらやっぱ眠れない。
なんていうんだろう。ここ最近そんな感じだったから、じゃあカーテン締めて暗いままだとずっと眠れないんだろうかと思ってしめっぱにしていたらやっぱ眠れない。
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
に書いてあった。
ustreamer の join/part を表示しないプラグインを書くべきだ……とおもって書いた。/ignore でできるのかもしれないけどわかんない。
use strict;
use warnings;
use Irssi;
use vars qw($VERSION %IRSSI);
$VERSION = "0.01";
%IRSSI = (
authors => "cho45",
contact => "cho45¥@lowreal.net",
name => "all",
description => "ignore ustreamer join/part",
license => "Public Domain",
url => "http://irssi.org/",
changed => "2007-10-04T01:15:00+09:00"
);
sub message_join {
my ($srv, $channel, $nick, $addr) = @_;
Irssi::signal_stop() if $nick =~ /^ustreamer/;
}
sub message_quit {
my ($srv, $nick, $addr, $reason) = @_;
Irssi::signal_stop() if $nick =~ /^ustreamer/;
}
Irssi::signal_add_first("message join", "message_join") ;
Irssi::signal_add_first("message quit", "message_quit") ;Irssi::signal_stop() よべばなんか止まるらしい。
結局ナチュラルに徹夜してしまった……眠いし寝たいけど眠れない……眠りにつこうとできない。
ホスト間で SSH トンネリングと Rinda つかって簡単な情報 (IRCの通知情報とか、クリップボード内容とか) を簡単にやりとるするフレームワークを簡単に書こうとおもっていたのに、プラグイン機構が欲しいなぁと思ってそっちを書きはじめる罠
Rinda はタプルの要素数を3個に制限することでおてがるなトリプルサーバとして使えそうだなぁ。正規表現マッチもできるしというか === の比較をしてくれるから入れるオブジェクト (URI) さえ考えてあげればうまいことつかえそう。もちろんこれは全然関係のない話なんだ!
タプルの要素数を制限してしまえば、完全に notify で傍受できるから、デバッグしやすいし、削除とかも <invalid_resource> <rdf:type> <hoge::InvalidResource> とか投げてやるとサーバ内で take して削除したりとかできそう。SPARQL の実装つくんないとだめだけど……SPARQL とかパーサつくるのからしてめんどくさい……
一年ほど MacBook を使ってみて
の順ぐらいにキートップが削れてる。他のキーは差がわからない。