setopt prompt_subst
PROMPTCOLOR=31
PROMPT='%{PROMPTCOLOR=31+($PROMPTCOLOR-30)%7]m%}%#%{%} '
RPROMPT='%{PROMPTCOLOR}m%}<%U%n@%m:%~%u%{PROMPTCOLOR}m%}>%{%}'
例外の捕捉って一度全部catchした後、instanceofで関係ないのはthrowしなおすっていうのはダメ?
try {
// InterruptedException と IOException が発生しうる。
} catch (Exception e) {
if (! e instanceof InterruptedException && ! e instanceof IOException) {
throw;
}
// 処理
}
セキュリティホール memoで紹介されていた。紹介されたのって魔道編だけ?
nifty:FC/MES/02/2998からのツリーで話題になってました。nifty:FC/MES/02/3007によると「2001年9月9日問題のネタもとのWWWページ」は「日立製作所 ソフトウェア&サービス」「[12/1] 西暦2001年9月9日以降に発生する問題のお知らせ」らしいです。
mingw版だとOpen3でforkがNotImplementedErrorになって困るらしい。
というわけでTempfileを使って回避。
ついでにStringにメソッドを追加されるのもなんか嫌なので削除。
f = Tempfile.new('rt_filter')
f.print inn.readlines
out.print(`ruby -S rt2 -r rt/rt2#{ext}-lib #{f.path}`)
require 'thread'
q = Queue.new
th = Thread.start do
while s = q.pop
print s
end
end
q.push 'Just '
q.push 'another '
q.push 'Ruby '
q.push 'hacker,'
q.push nil
th.join
「X-Mailer: BeOS Mail」っていうのだとスレッドが切れるのが気になる。
「$=」でできるので、こんな風にしてみました。Perlのlocalみたいなのがあればもうちょっと楽にかけるます。それと同じことをするにはsuperのところをyieldに変えたメソッドを用意すればいいのですが、結局2度手間になるだけなのでそのままにしてます。
module IgnoreCase
def [](key)
save = $=
$= = true
val = super
$= = save
val
end
def []=(key,val)
save = $=
$= = true
delete key
super
$= = save
val
end
end
h = Hash.new
h.extend IgnoreCase
h['from'] = 'foo'
h['From'] = 'bar'
p h #=> {"From"=>"bar"}
ちなみにdelete keyをしないと{"from"=>"bar"}
になってしまいます。
moduleにする利点はHash以外でも使えるということらしいです。
# サーバ側を書くときのイディオム
uri = ARGV.shift
DRb.start_service(uri, front)
puts DRb.uri
puts '[return] to exit'
gets
# クライアント側
begin
uri = ARGV.shift || raise
rescue
puts "usage: #{$0} <URI>"
exit 1
end
DRb.start_service
ro = DRbObject.new(nil, uri)
require 'crontab'
tab = Crontab.new
tab.add("* * * * *"){print 'Just another Ruby hacker,'}
tab.run
no titleからno titleに移転してたのに今頃気づく。
前のところも残ってるから気づかなかったのか。
no title?
i31s nowからリンクされてた。
Cygwin版RubyのThreadの中で``を使うと止まる。仕方がないのでCtrl+Cで止める。systemだと止まらない。
C:\tmp>ruby -ve "Thread.new{`echo test`}.join"
ruby 1.6.3 (2001-04-06) [i386-cygwin]
-e:1:in `join': Interrupt
from -e:1
C:\tmp>ruby -ve "Thread.new{system 'echo test'}.join"
ruby 1.6.3 (2001-04-06) [i386-cygwin]
test
ちょっと反則(Rubyスクリプトだけで完結してない)。__FILE__は$0でも同じ。シェルによってはquoteが必要だけど。
echo print __FILE__ > "Just another Ruby hacker,"
ruby "Just another Ruby hacker,"
コマンドラインで使い物にならない気がしたので改善した。
どうしてもReadlineとかが使えない場合のことを考えてしまうので長くなってしまう。
さすがにsttyをPATHから探すのは無駄過ぎる気がしたので、とりあえずRUBY_PLATFORMで判断してお茶を濁すことにした。
無理があります。
ちなみにpotatoのパッケージが古かったので自分でmakeして~/lib/ruby/kakasi.soに入れてしまってます。
require 'kakasi'
print Kakasi.kakasi('-Ha', 'じゅst あのtへr ').capitalize
print Kakasi.kakasi('-Ha', 'るby はcけr,').capitalize
JARHだけだと何についてのJARHなのかわかりにくいので、何を使ったJARHかとtopicにつけてみた。
それからruby diary allを実行するとエラーになった。年月指定でもエラーになった。
200101がallと同じエラーになるので1月分が原因っぽいが、1月分は何も変更していない。何か過去のバージョンと変わってる?
>ruby diary all
-- nDiary version 0.9.3.beta5 --
./ndiary-lib.rb:444:in `tohtml': undefined method `join' for nil (NameError)
from ./ndiary-lib.rb:474:in `writeHTML'
from ./ndiary-lib.rb:473:in `each'
from ./ndiary-lib.rb:473:in `writeHTML'
from ./ndiary-lib.rb:603:in `makeHTML'
from ./ndiary-lib.rb:600:in `each'
from ./ndiary-lib.rb:600:in `makeHTML'
from ./ndiary-lib.rb:723:in `main'
from ./ndiary-lib.rb:721:in `each'
from ./ndiary-lib.rb:721:in `main'
from diary:13
>ruby diary 200103
-- nDiary version 0.9.3.beta5 --
make '/(略)/200103.html'
./lib/topic.rb:35:in `diary=': undefined method `lastestFilename' for nil (NameError)
from ./ndiary-lib.rb:739:in `main'
from diary:13
一瞬print 'Just another Ruby hacker,'.split(/\Z/)[0]
の間違いかと思ってしまったけど、どっちでも同じ。
ruby-devはそこそこの流量だと思いますが、ruby-extって少ないと思う。
でも思ってたのとは違って0通の日ってほとんど無いみたい。
入っているRuby関係のメーリングリストで一番流量が少ないのはruby-projects。
enjaやjaenで呼び出されたときに、っていうのはいいかも。
と思ったのでサポート。
ちなみに変更したのは直接実行されたときの部分だけなのでrequireして使う場合には影響なしのはずです。というか影響があると自分が作っている他のものに影響がでるので困ります。
JARH = ['Just ','another ','Ruby ','hacker,']
4.times{|i| print JARH[i] }
(1..4).each{|i| print JARH[i-1] }
-4.step(-1,1){|i| print JARH[4+i] }
0.upto(3){|i| print JARH[i] }
4.downto(1){|i| print JARH[4-i] }
パッチをあててruby diary allするとこのエラーはまだでてきた。
./lib/topic.rb:35:in `diary=': undefined method `lastestFilename' for nil (NameError)
from ./ndiary-lib.rb:739:in `main'
from diary:13
ついでにtopic_noフィルタを入れてみた。
っていきなりバグ発見です。「○ n2Diary」っていう感じでリンク先の方に数字がついてしまいました。
.+
を[^>]+
にする方がいいかも。
--- filter/topic_no.rb 2001/04/11 14:56:19 1.1
+++ filter/topic_no.rb 2001/04/11 15:01:40
@@ -5,7 +5,7 @@
case type
when :AFTER_TOPIC
if @diary.kind_of?(LastDiary) then # 最新分の日記の時のみ処理
- str.sub!(/<h5><a .+t(\d+)\">./i){
+ str.sub!(/<h5><a .+?t(\d+)\">./i){
$& + '<small>' + $1 + '</small>'
}
end
Quoteだとpreがつかないからインデントが崩れるのか。今まで気づいてなかった…。
Singletonを使わなくても特異オブジェクトを使えば似たようなことができる。それぞれの利点と欠点は何?
Singleton | 特異オブジェクト |
---|---|
クラスとオブジェクトがあるのでわかりやすい。 | オブジェクトしかないので慣れていないとわかりにくい。 |
Marshalできる。 | Marshalできない。 |
foo.rdをRDに変換って...。
謎のparse errorではまったので、とりあえずCodeにしておいた。
evalで使っている変数の後始末が不充分だったという感じみたい。
SyntaxErrorのおこるevalを使っているスクリプトで発生する可能性があったみたいだけど、SyntaxErrorで場合分けするようなスクリプトって滅多になさそうだから今まで見つからなかったみたい。
ruby -dで動かしたときにSyntaxErrorを使ってるというのは気づいたけどそれが原因の1つだとは気づかなかった。インタプリタの実装については知らないので当然といえば当然かも。
ndiary-lib.rbをみてて気になったところをついでに直してみた。
ローカルのCVSに入れて使おうとするとRCSのキーワードが入っているものってちょっと注意が必要。
--- ndiary-lib.rb 2001/04/11 14:52:00 1.7
+++ ndiary-lib.rb 2001/04/13 09:33:12
@@ -169,7 +169,7 @@
begin
ret = true if send(filter, str, type) == :THROUGH
rescue NameError
- $stderr.puts "\n** Filleter error: undefined method '#{filter}'.\n"
+ $stderr.puts "\n** Filter error: undefined method '#{filter}'.\n"
@filterlist.delete(filter)
end
}
@@ -226,6 +226,7 @@
@lastestFilename = 'index.html'
@monthlyFilename = '%Y%0m.html'
@filename = ''
+ @topicSortReverse = false
end
# 日記ファイル取得
mhc-cvsを使い始めた。
.cvsrcに書いてある設定を補完するとこんな感じ?
今回追加したのは最後の2行。
# mhc first
cvs -d :pserver:anonymous@cvs.quickhack.net:/cvsroot -z3 login
CVS password: (そのまま Enter)
cvs -d :pserver:anonymous@cvs.quickhack.net:/cvsroot -z3 co -Pd mhc-current mhc
# CVS以外をコピー
rsync -avC mhc-current/ mhc
# configureとmake
cd mhc
ruby configure.rb --disable-palm
ruby make.rb
# ~/lib/elispディレクトリからemacsにmhcというシンボリックリンクをはる。
ln -s .../mhc/emacs/ ~/lib/elisp/mhc
#!/bin/sh
# mhc-update.sh
(echo mhc update && cd mhc-current && cvs -qz3 update -dP)
echo rsync mhc-current
rsync -avC mhc-current/ mhc
cd mhc
ruby configure.rb --disable-palm
ruby make.rb
;;; for mhc
(setq load-path (append '("~/lib/elisp/mhc") load-path))
(autoload 'mhc-mew-setup "mhc-mew")
(add-hook 'mew-init-hook 'mhc-mew-setup)
(setq mhc-file-method 'mhc-cvs)
(setq mhc-cvs-repository-path nil)
自分でmakeしてみてruby.exeだけ入れ替えてみたら、makeしただけだと$LOAD_PATHが相対で/usr/local/binに移動したら$LOAD_PATHがi586-cygwinでnkf.soがrequireできず。
「(http://www.spc.gr.jp/bbs/RuBBS.html)」みたいに「(」で始まってたら「)」の前までにする、というのを思いついた。イメージとしてはこんな感じ。
parens = { '('=>')', '['=>']', '{'=>'}' }
if /(.?)(http:\S+)/
if parens.keys? $1
$2.sub /#{parens[$1]}.*/, ''
else
$2
end
end
終了時処理JARHを確認してみると、インスタンスが消滅するときだとfinalizerしかなさそう。
finalizerからの参照でGCされないという問題があるのでちょっと難しいけど、finalizerが簡単ならこんな感じできました。
Procオブジェクトのbindingをインスタンスと切り離すのが難しかった。
これだと文字列しか渡せないので、tempfile.rbのようにクラスメソッドを使う方が楽そう。
class JARH
def initialize
ObjectSpace.define_finalizer self, eval %{
proc { print 'Just another Ruby hacker,' }
}, TOPLEVEL_BINDING
end
end
JARH.new
GC.start
PerlのtrがRubyだとこんな感じで複数のメソッドに分かれてるのはそういうことかな。
ほとんど確認してないので間違いがあるかも。
Perl | Ruby |
---|---|
$_ =~ tr/*/*/ | $_.count('*') |
$_ =~ tr/0-9//d | $_.delete!('0-9') |
$_ =~ tr/A-Z/a-z/ | $_.downcase! |
$_ =~ tr/a-zA-Z//s | $_.squeeze!('a-zA-Z') |
$_ =~ tr/a-zA-Z/A-Za-z/ | $_.swapcase! |
$_ =~ tr[\200-\377][\000-\177] | $_.tr!("\200-\377", "\000-\177") |
($_ = 'foo') =~ tr/o/f/s | $_ = 'foo'.tr_s('o', 'f') |
$_ =~ tr/a-zA-Z/ /cs | $_.tr_s!('^a-zA-Z') |
$_ =~ tr/a-z/A-Z/ | $_.upcase! |
$_ =~ s/foo/bar/g | $_.gsub!(/foo/, 'bar') |
$_ =~ s/foo/bar/ | $_.sub!(/foo/, 'bar') |
RTのdelimiterを;
にしたら見出しのところのdelimiterを変え忘れてた。
delimiterを後から変更するときは変更漏れが無いかどうかちゃんと変換後もみた方がよさそう。
とりあえずtopics.htmlの生成を止めてしのいでます。
nifty:FPROGORG/MES/19/497
@ c:
@echo Just another make/batch hacker,
をみて、無理矢理JARHにしてみた。
makeで1行目がどう解釈されているのかがわからないけどエラー無しで動いているので気にしないことにする。
@rem = %qd
@rem make:
@echo Just another make/batch hacker,
@REM batch:
@echo off
@goto end
print 'Just another Ruby hacker,'
%qd
:end
同じマシンの中でのプロセス間通信にTCPってちょっと重いかも。
日本製のWin32用Java風言語って感じかな?
エイプリルフールネタとしてUvaRubyっていうのがあるし。
当日気づいてればリンクし返してたのに。
MiniBBS型 | 日付順でどんどん上に追加されていく。 | 変種たくさん。メッセージを1行に限定したものはWebチャットと呼ばれることが多い。 |
ツリー型 | ツリーとメッセージ毎のページに分かれている。 | ツリーが深くなるとツリー表示が破綻しやすいと思う。 |
2ch型(?) | 元メッセージとそれに対するメッセージ群がセットになったもの。 | つっこみ用掲示板付き日記もこれに分類可能。元メッセージは複数行でつっこみは主に1行というものも結構多い。 |
Tiki型 | 自由に編集可能なメッセージの集まり。 | 自由に編集できる以外の特徴は普通のWebページと同じかも。なれないとかなり参加しづらい。 |
追加はいつも特定のページだけど一定期間毎に古いものが別ページに移動するパターン | Phinloda's real underground page、日記。など | 更新チェックはしやすいが、リンクが一定期間後に切れるのが困る。 |
一定期間毎に分かれているがフレームでいつも同じURLで最新を見えるようにしているパターン | 過ぎ行く今は星の瞬きなど | 毎月チェックするURLを変えないといけないのが面倒。 |
一定期間毎に変わるパターン | NeXT STEP、(長いので略)やす師匠(略)日記など | |
最新のみしかないパターン | バカが征くなど | 見逃すとそれまで。 |
静的生成でrecentページと一定期間毎(月毎など)で分かれているパターン | nDiary、Sushi Diaryなど | 普通のページなので更新チェックしやすい。 |
最新だけ自動生成しているパターン | 偽偽夜食日記の部屋 | 外見はnDiaryなどと同じ。 |
CGIで最新も一定期間毎も対応しているパターン | HNS、tdsなど | CGIで更新チェックソフトを考えてくれているので更新チェックしやすい。リンクは&が入っていなければしやすい。 |
すべて動的なパターン | 晴空號航海日誌 | サイズが変わるのでサイズでチェックしていたらはまる。 |
最新のみURLが違うパターン | Nikki Engine 日記猿人など | 更新チェックはしやすいが、非常にリンクしにくい。 |
更新される毎にURLが変わるパターン | 結城浩の日記 | 特定の日付へのリンクは不可能? |
&が入ってたらエスケープ地獄。面倒なのはエンコードではなく編集中に確認しようと思ったときにそのままクリックではダメでデコードしないといけないこと。
RT楽。だけど今まで使ったこと無い機能(ConfigBlockとか)を使おうとすると魔道編をみないと使えないのがちょっと面倒。
CVSのログは基本的にASCII文字だけにしていたのにかなを入れてしまったので、cvs admin -mREV:MESSAGEで変更した。
nDiary用のRTフィルタって公開しわすれたかも。というわけでscript/filter/rt.rbとしておいてみた。
$stderr = $stdout
が入っているのはデバッグ用。
.
print begin;eval'Just another Ruby hacker,';rescue SyntaxError=>e;e.to_s[/J.+,/];end
ruby-1.6.4-20010416-i386-mingw32.tar.gzにしたらparse errorはでなくなった。
ruby diary allでindex.htmlが更新されないのが不思議。
1.6以降の機能です。(式1 rescue 式2)でifやunlessと同じように後置もできるようになったという感じ。
~/Mailでmv {,.}scheduleして(setq mhc-base-folder "+.schedule")を追加した。
これでSylpheedからみえなくなっていい感じ。
@remという変数に代入したことになるってことは変数名に@が使えるってことですが、他のmakeとかで問題が起こりそうであんまり使いたくない…。
括弧が2重になっている理由はRubyの落とし穴参照。
print(('Just another Ruby hacker,' rescue nil))
日付ごとに入ってるアンカーは、current.htmlじゃなくてYYYYMM.htmlを指すようになってましたか。以前はなってなかったことがあったような…。
「■ システムプログラミングも」参考にしてsys/syscall.hをみればいいとわかったので、zshの機能を利用したワンライナーで「gcc -x c -E -dD =(echo '#include <sys/syscall.h>') | less」として使いたかった関数を探してみた。が、こういうのってCで書いた方が楽かも。
というわけでhttp://www.ruby-lang.org/~kazu/ext/に適当に作ってみたResourceをおいてみた。まだ試作品というかLinuxにばりばり依存してます。
モジュール名を決めるのにPythonのresourceを参考にしたというのはちょっとだけ秘密。実行時間をFloatにしたのも同じ理由というのもちょっと内緒。
LinuxだとRUSAGE_BOTHはある(定数は定義されている)のに使えない。
"wrong second argument"というエラーメッセージはexecの"wrong first argument"を参考にしてみた。
「#ifdef .. #endif
」でくくったのはerror.cのErrno::E*の定義を参考にした。
INT2FIXではなくINT2NUMなのはFixnumに収まるかどうか確認してないから。その割にはintかどうかを確認せずにNUM2INTを使っていたり。
短くするのならMARK2LEVEL[mark_str] or raise ArgumentError, "#{mark_str} is irregular for Headline mark."
だと思うけどわかりにくいかも。
.xsessionでログをとるようにしているところに同じ問題があったのを思い出して修正。vncserverを実行するときのカレントディレクトリに気をつけていればいいだけだったんだけど、やっぱり根本的に直しておかないと。
-echo `date` `hostname` >> .xsession.log
+echo `date` `hostname` >> ~/.xsession.log
[ruby-cvs:00588](X-ML-Name: ruby-cvsのX-Mail-Count: 00588)ですが、m68mってm68kのtypo?
commit logが間違ってたときは-fで空commit?
昨日kernel-image-2.2.19_2.2.19-3_i386.debのバグにはまった。
grubが無かったら再インストールしないとダメだったかも、と思ったけど、image=/vmlinuz.old label=LinuxOLDがあったか。でも2つ以上前のkernelを起動したくなったらやっぱりデフォルトのliloだと無理そう。lilo.confを書き換えるのは面倒だし、grubの方が汎用性があるのでいざというときはやっぱりgrubを使ってしまう。
puts hoge if hoge = gets
はNameErrorになるけどhoge = gets and puts hoge
は大丈夫とかいうような問題も、っていうかこれはこんな書き方する方がダメなんだけど。
orを使ったideomってPerl5のopen or dieぐらいしかみたことないような気がするんですが、そうでもない?
PStoreの内容をみるためのワンライナー。-Ksとかは必要に応じて適当に。
これを使ってriのデータファイルをみてみようとしたら ClassModule が無いよってエラーになって見えなかった。そのあたりはPStoreの制限なのでどうしようもない。
ruby -Ks -rpstore -e "PStore.new(ARGV[0]).transaction{|s|p s.roots.collect{|k|[k,s[k]]};s.abort}"
できるだけsecureなCGIにするにはどうすればいいのか?
プログラミング言語を使えるようになるのに必要なのは、主にこんなことかもしれない。
世紀末に解散してたはず。大物の解散の方が目立ってたので結構知られてない気がする。ていうか元々有名なのが1,2曲ぐらいしかないという気も。
Baby modelでmakeできなかった。エラーメッセージから推測するとno menuがうまくいかない?
map.o: In function `follow_map_menu':
map.o(.text+0xec): undefined reference to `optionMenu'
collect2: ld returned 1 exit status
自動生成されるファイルがCVSから消えたので、makeできなくなったのでいつものように:-)、IRCで質問してみるとrubyのようにautoconf; ./configureではなく./autogen.shだと教えてもらった。
それでもpotatoには「libgdk-pixbuf-dev」というパッケージが無くて「aclocal: configure.in: 74: macro `AM_PATH_GDK_PIXBUF' not found in library」というエラーが残ってしまったので、gdk-pixbufのソースをとってきてgdk-pixbuf.m4をac/において(無理矢理)解決した。
SIGINTってmingwで問題が…、っていうのはWindowsがダメなのが原因らしいというのをFPROGで教えてもらった。
daemonを作るときに2段forkして子(*1)をexit!するのはSIGCHLDの問題を回避するためだったような気が。
File::basenameやFile::expand_pathがあるのに。DirではなくFileのメソッドだから見つけられなかったのかも。
#!/usr/bin/env rubyについては「FreeBSD, Linux, Solaris, Cygwin あたりだと /usr/bin/env はあるからかなりおすすめ度は高いと思います。-eban」ということでおすすめなのですが、「#!/usr/bin/env ruby -Ks」とかすると「ruby」を引数「-Ks」で実行ではなく「ruby -Ks」を実行されてしまって実行できない…。
いつの間にか1.11のバイナリもできてたらしい。
Cygwin版はなんか変だったので使っていないので、バージョンアップしてもいいかも。
パッチについてはChangeLogやcommit logに「thanks 誰々」って書いてあるものが多い気がする。
某ChangeLogにもう届かないメールアドレスが残っているのがちょっと気になったことがありますが、みんなそうなので、それはそういうものだと思うことにしてしまいました。
ローマ字かな変換CGIを作ってみた。
dRuby経由で別プロセスと通信してアレするようにしてみたけど、あんまり意味はなかったかも。
SylpheedのIMAP部分を作っている方のよわよわ留年日記。
Ruby/Romkanらしい。
romakanaはPerlのが見つからなかったから完全に自分で作ってみたけど以下のように目的が違うから無駄ではないはず。