いまさら正規表現ではまるより。viとかemacsとかの話がでてくるのでEUC-JPでの話だろうと思ってLinux上で確認。
% irb
irb(main):001:0> [RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM]
["1.6.2", "2001-01-10", "i486-linux"]
irb(main):002:0> /a\b/ === 'あaあ'
2
irb(main):003:0> /\ba/ === 'あaあ'
nil
irb(main):004:0> /\ba/e === 'あaあ'
nil
irb(main):005:0> /\ba/e === 'あaあ'
nil
ruby-listとかでもそうだけど、バグ報告とかよくわからない動作とかは常にruby -vの結果をつけた方がいいと思っているので、自分のメールでは忘れてない限りついてるはず。
ついてれば後からbladeとかでみたときにもいつのバージョンの頃の話だったのかわかりやすいし。
String#strip_tags
にArray
を渡したら[]
になるのってバグっぽい。%
は%%
にしないといけないのに、その説明がなくて、していなかったときのエラー(minibbs.rb:280:in `regexp_keyword': undefined method `[]' for nil (NameError))が非常にわかりにくい。というかわからない。エラーの原因を調べるためにはじめてデバッガを使ったぐらい(^^;)(今まではほとんどirbで確認していた。)
No.0063のtrの問題はメール来てたことに気づかず見逃していた。メール処理の仕方を考えた方がいいのかも。
で、No.0064の解答。
foreach (@strings) {
print '"';
print join ' ',/\b(\w+) (?=\1er\b)/g;
print qq{"\n};
}
exciteのサイトのradioのあたりが変更されていたので更新した。
Wakaba.0038の解答。
最初はperl -e 'print qq{<html>\n<table border="1">\n<tr><td>},join("</td></tr>\n<tr><td>",map{chomp;join"</td><td>",split/,/}<>),qq{</td></tr>\n</table>\n</html>\n}'
。chompが必要だったのが予想外だったので気に入らない。それにsplitしてjoinするのが長くなってる原因のような気がした。
で次にperl -e 'print qq{<html>\n<table border="1">\n},join("",map{s|\d+|<td>$&</td>|g;s|,||g;s|^|<tr>|;s|$|</tr>|;$_}<>),qq{</table>\n</html>\n}'
。mapの最後に$_が必要だったのが予想外だったがかなり短くなった。
でもjoinもいらなくてperl -e 'print qq{<html>\n<table border="1">\n},(map{s|\d+|<td>$&</td>|g;s|,||g;s|^|<tr>|;s|$|</tr>|;$_}<>),qq{</table>\n</html>\n}'
で良かった。
後はコマンドラインオプションの-lを使って最後の\nをなくせるぐらい?
というわけでperl -le 'print qq{<html>\n<table border="1">\n},(map{s|\d+|<td>$&</td>|g;s|,||g;s|^|<tr>|;s|$|</tr>|;$_}<>),qq{</table>\n</html>}'
で送ってみる。
Excite エキサイト : 翻訳がpowered by AMiKAiになってしまって、Amikai翻訳は以前から公開されていたので、今までのexcite翻訳が無くなってしまっただけ、という気もして残念な感じ。
参考までに今までと違うということをhttp://yasu.asuka.net/diary/old/200009C.html#20000927Bと同じものを試して確認した。「奈良先端科学技術大学院大学」の和英は今まで通り出来たけど、英和は出来なくなったような気がした。(今まで出来ていたことが確認できない。)
とりあえず入れてもらったのでman-1.6へのリンクと極道編の情報を入れてみた。RDPはRWiki版にリンクしていいのかどうかわからなくて悩み中。
crypt したパスワードはruby -e 'pw = gets.chomp; a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; srand; puts pw.crypt(a[rand(a.size),1] + a[rand(a.size),1])'
で作ればいいらしい。
mkdir -pのRubyバージョンってftoolsを使ってruby -rftools -e 'File::makedirs("hoge/foo//1//2///3/4////////5/6/7/8/9////10//11//")'
とか。
[Perl Quiz 2001-02-09 No.0065]への解答。\dの3の倍数を表現するのに非常に苦労しました。
・赤ラクダ本にも載っていたようなwhileを使うシンプルなやり方。
1 while s/\d+(?=\d{3})/$&,/;
・reverseを使うやり方。
$_ = reverse $_;
s/\d{3}(?=\d)/$&,/g;
$_ = reverse $_;
・正規表現1発でやるやり方。
s/\d+?(?=(?:\d{3})+(?!\d))/$&,/g;
試行錯誤の記録。以下のような失敗の後、上のができました。
s/\d+(?=(?:\d{3})+)/$&,/g;
s/\d+?(?=(?:\d{3})+)/$&,/g;
s/\d+?(?=(?:\d{3})+)(?!\d)/$&,/g;
[Perl Quiz 2001-02-07 Puzzle.0010]の解答。
$a = " 1999, 2000, 2001, 2002 ";
$b = ( 1999, 2000, 2001, 2002 );
$c = [ 1999, 2000, 2001, 2002 ];
$d = { 1999, 2000, 2001, 2002 };
$e = sub { 1999, 2000, 2001, 2002 };
$f = 2_0_0_1 ;
$g = "2 0 0 1";
$h = "\2\0\0\1";
$i = \2001;
$j = "1002";
$k = \*_2001;
print '', (split(', ',$a))[2], "(a)\n";
print $b-1, "(b)\n";
print $c->[2], "(c)\n";
# 配列にする。
print '', (%$d)[2], "(d)\n";
# 意地でもハッシュとして扱う。
print {''=>'',reverse(%$d)}->{2002}, "(d)\n";
# keysを使う。
print '', (sort keys %$d)[1], "(d)\n";
print &$e-1, "(e)\n";
print $f, "(f)\n";
print split(' ',$g), "(g)\n";
print map({ord}split('',$h)), "(h)\n";
print $$i, "(i)\n";
print reverse(split //,$j), "(j)\n";
print map({/\d+/;$&}$$k), "(k)\n";
setupを実行してみたらcygwin-1.1.8-2になった。他にも色々。squid-2.4.PRE-STABLEまで入るのか。wget-1.6-1が入ったようなので1.6を使いたいときはCygwinのを使えば良さそう。1.5.3で間に合ってる気もするけど。
cygwin-1.1.8-2といえばRuby 1.6.3が出る頃にはクロスの環境も1.1.8-2にするらしいですが、Ruby 1.6.3はまだ?
いつの間にかext/というのが出来て、てんこ盛りパックじゃなくなってたRuby Binariesですが、気になったことがいくつか。
mingw版RubyWinでフォントを変更しても文字化けするという話があったので試してみたが再現出来なかった。ふとp $KCODE
をしてみたら"UTF8"だったのでちょっと驚いた。
[PQ/P][Perl Quiz 2001-02-10 Puzzle.0011]は解答編だった。勉強になったと思ったものを列挙。
(
がこないようにするためやprintのarrayコンテキスト中に式をおくための工夫。[code]->[2]
とか@{[code]}
とかsub{}->()
とか0+
とか+
とかeval
とか"".
とか。
freemlでMLを作ってみた。jewel boxの方にフォームをおいてみました。
JavaScriptをカテゴリーの選択のところで使っているので作成するのに苦労して、参加キットのところにもJavaScriptがあるので苦労した。さらに参加キットをつけてからAnother HTML-lintでチェックしたらエラーがたくさんだったので苦労した。
環境変数に=を設定できなくて困った。set QUERY_STRING=name=valueってしたかっただけなのに。
停止中っていうのは参加者情報のページをみてみたときにちょっと気になってたんですが、あんまり気にしてませんでした。
ちなみに現在の参加者は25人らしい。
Becky!2でまず一度作業用のフォルダにメールを全部コピーしてコンパクト化最小をしてから、eml形式(1メール1ファイル)でエクスポート。
ruby -Ks -e "Dir['*.eml'].each{|f|p [f,/\d+/.match(f)[0]]}"
でrename前のチェックをしてruby -Ks -e "Dir['*.eml'].each{|f|File.rename *[f,/\d+/.match(f)[0]]}"
で実際にrename。2バイト目に「\」が入る「ソ」を含むファイル名のファイルがrenameどころかDir['*']ででてこなくて困った。
他のページと比べて表示されるまでにちょっと時間がかかる。<H1 CLASS="Title">のfilterが原因?
UNC対応って余計なことをすると逆に非対応になりそうな気が。特に何もしていないLHA.EXEが対応できているという話をみたことあるような気がするので。
dosishじゃない環境ってhelium…と思ったらruby-lang.orgなアカウントは使ってませんでしたか。
sshの公開鍵があれば使えるようになりそうですが、それだとchshとか使えなくてちょっと悩んでしまった。.profileか.bash_profileあたりでexecすれば良さそうなのですが、設定ファイルを持っていくのが面倒なので保留。
helium.ruby-lang.orgというかwww.ruby-lang.orgにログインしてから設定したことは、user-ja-confの実行、.bashrcにaliasの追加、.forwardの作成ぐらいだった気がする。
ActiveScriptRubyと同じ様なことが出来るPerlScriptはActivePerlについてるはず。
最近何日分の内容がどんどん入れ替わるindex.htmlがヒットするのはうれしくないので、lastest.htmlに<meta name="ROBOTS" content="NOINDEX,NOARCHIVE">を入れてみた。これでindex.htmlに入るはず。
「filter外してみました。」と書いてるのに変わらないと思っていたら、CSSファイルがキャッシュの方になっていたらしく、今みたらfilterじゃなくなってて、他のページと同じようにすぐに表示されるようになっていた。
UNC対応の話は「ruby -e "p Dir['//machine/user/*']"」でちゃんと「ls -d //machine/user/*」と同じものがマッチしていて何が問題なのかわかりませんでした。
もしかして相手がsambaだから問題がないだけなのかも。
heliumのアカウントってそういえば詳しい説明は全然なかったような。
Debian(potato)は最近使ってるので日本語を使えるようにするにはuser-ja-confを実行すれば良さそうとか、他の人のホームディレクトリや/etcをみてpostfixだから.forwardを作っておこうとか、public_htmlを作っておこうとか、そういう感じで自分で調べて色々設定していきましたが。
過去ログ更新。
renameは結局sambaでLinuxマシンに持っていってそこでやってみたら何の問題もなく出来た。
作業場所として~/Maildir/tmpを使ってしまったのはかなり間違ってる気がするけど。
3ヶ月前にVineSeedに出した話の続き。patchが間違ってて違うファイル(termcap.kterm)にあたってて/etc/termcapにちゃんとあたってなかった。
patchってunified diffだと---の行と+++の行のうち短い方のファイル名を取り出しているっぽい。
バカが征くより。yen dotもmod_ruby使ってるのかな?
むっきー。¥.が落ちてる。しかも:
/usr/lib/ruby/site_ruby/1.4/drb/drb.rb:166:in `method_missing': nested transaction (PStore::Error)
from /tmp/index.rhtml.IX1zni:207
なんてケッコーなものを拝ませてくれるし。w3mがruby使ってるのかと思っちゃ
いましたよ? でも、も一回やったら、フツーに見れました。何が起こったの?
Cマガジン2001年3月号のプログラミング期末試験をやってみた。結果をcsvっぽいファイルで1桁目に点数を入れたファイルに記録してみたので、ruby -e "ARGV.each{|f|n=0;File.foreach(f){|s|n+=s.to_i};p f,n}" *.csv
で集計してみた。
trap("EXIT") { print 'Just another Ruby hacker,' }
$\ = 'Just another Ruby hacker,';print ''
print Struct.new(:Just,:another,:Ruby,:hacker).members.join(' ')+','
print /Just another Ruby hacker,/.source
Marshal.load Marshal.dump('').chop+"\036Just another Ruby hacker,"
Marshal.load Marshal.dump('x'*25)[0..-26]+"Just another Ruby hacker,"
print Thread.start{"Just another Ruby hacker,"}.value
xheader.rbsをX-Maidへの対応させたついでにヘッダの追加も出来るようにしてみたが、ヘッダの追加はテンプレートでやった方が良さそうに思った。
C,Perl,Rubyが83点,98点,94点ですか。こちらの結果は、答えに間違いがあるので公開しようかどうか悩んだけど、結局公開しちゃうと以下のような感じ。JavaはJDK解体新書を時々読んでただけなので低いのはいいとして、Ruby編が思ったより低かったのがちょっとあれかも。
C言語編 ひ
C++編 ・
Java編 み
Perl編 ・
Ruby編 つ
Perl編の問25は最初に「Perlのバージョンは5を想定しています。」と書いてあるので悩むところですが、perl-lesson ML ダイジェスト 2001-02-07にあるようにバージョンによって違います、というのが一番正解だと思います。
バージョンによって違いがでるポイントは、たぶん以下の2点ですが、どのバージョンで変わったかまでは未確認です。
解答の文でどちらも(2)になってて変というのは御意。
ちなみにバージョンによって違うというのはRTCでフィンローダさんに伝えておきましたがどうなるかな。
Ruby編の問17と問22のうち問17はC MAGAZINE お詫びと訂正に訂正がでています。他にも問24の解答の出力例が間違っているようです。
print Time.now.strftime('Just another Ruby hacker,')
メール用にiso-2022-jpでのバイト数を小さくしようとするスクリプトを書いてみた。
いわゆる全角でも半角でもいい文字が6文字のところがバイト数の変わり目らしくて、今のままだと元がどっちだったかは気にせずminでたまたま選ばれた方になるけど、これは仕方がないかも。
最初は$KCODEを自動で判断するようにしてたけど、スクリプト中に漢字などを使っていると実行開始後に$KCODEを設定しても手遅れなので、結局1行目に-Ksをつけた。
実行中に$KCODEを変更するのはコマンドラインオプションの-Kを(実行中は)無視すると言うことなので、普通は実行中に$KCODEを変更してはいけない。するのなら//nとか//sのようにそれぞれの正規表現に文字コードの指定をつけるべき。
# $KCODEの自動判断。
if /^[nN]/ === $KCODE
if /win/i === RUBY_PLATFORM
$KCODE = 'SJIS'
else
$KCODE = 'EUC'
end
end
moduleの中でloadしてもトップレベルになることを確認した。
% cat a.rb
module A
module B;end
load "b.rb"
end
p B.new
p A::B.new
% cat b.rb
class B;end
% ruby -v a.rb
ruby 1.6.2 (2001-02-09) [i386-cygwin]
#<B:0x459ac28>
a.rb:7: undefined method `new' for A::B:Module (NameError)
特異メソッドは::で呼び出せるのかを試してみた。
小文字で始まるメソッド名なら::でも呼び出せて、大文字だと定数とみなされるみたい。
% cat a.rb
class C
def C.m
'C.m'
end
def C.M
'C.M'
end
end
puts C.m
puts C.M
begin
puts C::M
rescue NameError
puts $! #=> uninitialized constant C::M
end
class C
M = 'C::M'
end
puts C.M
puts C::M
% ruby -v a.rb
ruby 1.6.2 (2001-01-10) [i486-linux]
C.m
C.M
uninitialized constant C::M
C.M
C::M