http://www.spc.gr.jp/sho/diary/?date=200100で500 Internal Server Error。
「特にパラメタdateは正当な値は年月までという暗黙の了解もあるので、ここから年月日を取り出すのはヤバい。
」って外部からのそのまま使うのもヤバいです。
README.htmlやtdiary.conf.sampleのような例で使うドメインはRFC2606で予約されているドメインにするべき。
@referer_tableのデフォルトにはSushi日記が入っていればいいのに。
calender.rhtmlですか :-)
mail.rtxtに「MIME-Version: 1.0」が無い。
eval( File::readlines( 'tdiary.conf' ).join )
ってload 'tdiary.conf'
でいいのでは?
'anonymous@anywhere'だと受信側のサーバでドメインが付けられてしまうことがあるようなので、@auther_mailとかにしてもらった方がいいかも。
@cgi.remote_user
を使って複数名で書き込むようにしてみようかと思ったけど、再編集が誰でも出来るから簡単にはダメみたい。RWikiみたいにお互いを完全に信用してしまうというやり方もありかもしれないけど。
やってみたかったイメージとしては段落アンカーを誰が書いたかによって区別できるようにするとか、って感じ。
つっこみを使えば誰でも書き込めるという気はするけど、メインの部分を複数名で書きたい。
で結局update.rhtmlのtextareaの中の最後に「(<%= @cgi.remote_user %>)
」を付けるというのでやってみることにした。
cvsのloginfoで自動更新がうまくいってなくてtDiaryの0.9.9.5へのつっこみが1.0.0のリリースに間に合わなかったみたい。
ディレクトリをaddしたときの動作を試してなくてそれに対応できていなかったことが原因。
具体的には、ファイルをcommitしたときは「zn/homepage/nnikki/log/2001/07 20010701.diary 20010702.diary」って感じなのに、ディレクトリをaddしたときは「zn/homepage/nnikki/log/2001/07 - New directory」だった。これを「zn/homepage/nnikki/log/2001/07」というディレクトリの中の3つのファイルとして処理しようとしてしまっていて、「cvs up - New directory」となってディレクトリがちゃんと出来ていなかったのが原因。
obj.is_a? String
(またはNumeric)とか===
で以下のような感じとか。
case obj
when String
'文字列'
when Integer
'整数'
when Float
'実数'
when Numeric
'数値'
end
Thread.critical=true
Thread.critical=true
でもensure
は実行される。
f = open('/dev/zero')
Thread.new {
begin
loop {
f.read 1
}
rescue
STDERR.puts $!.inspect
ensure
STDERR.puts 'ensure'
end
}
Thread.critical = true
f.close
#sleep 1
Thread.new {
begin
sleep
rescue
STDERR.puts $!.inspect
ensure
STDERR.puts 'ensure'
end
}
Thread.critical = true
exec '/bin/echo', 'ok'
exec
していれば実行されないと思ったのにio.close
していると他のスレッドが動いてしまうので悩む。
tc = Thread.critical
Thread.critical = true
@child_pid = Process.fork {
if true
[TCPSocket, File].each {|c|
ObjectSpace.each_object(c) {|io|
begin
io.close
rescue SystemCallError,IOError => e
STDERR.puts e.inspect
end
}
}
end
exec([RUBY_EXE, __FILE__], *@arg)
}
Thread.critical = tc
Thread.critical=true
fcntlfcntlにしてみたら、子プロセスが一度終了して2度目にfork&execしようとしたときにうまくいかない。
VisualuRubyに再々挑戦。今度は元ネタがあるので楽々。
何もしないプログラムと,それに毛のはえたやつを移植してみたke.rbと作りかけのクリップボード履歴。
iso-2022-jpでは半角カナ用のエスケープシーケンスが定義されてないから、ということなのですが、結局、iso-2022-jpという嘘のcharsetを付けてメールを送るぐらいなら、(嘘のcharsetを付けるのと同じく)相手が読めない環境の可能性もあるのは同じなのだから、charsetはShift_JISやeuc-jpでBase64にするとかutf-8やutf-7でもいいんじゃないの?というような話。
100はFixnumなのでGCされるようなオブジェクトじゃないはず。
っていう話ではなさそう。
そういう問題もあるからmod_rubyは「一方、mod_rubyでは複数のスクリプトが一つのRubyインタプリタを利用するため、あるスクリプトがグローバルな状態を変更すると、他のスクリプトにも影響が及びます。したがって、ISPなどで信頼できない不特定多数のユーザにmod_rubyの使用を許すようなことは避けてください。
」という話がでてくるのだと思う。
それにしても「どうやら global variable は apache の child process ごとに存在するようです。
」というのはRubyインタプリタが1つではなく child process の数だけ存在すると言うことだと思うのですが。
FAQには「一つのRubyインタプリタ
」と書いてあるのに。
Barの方を先に初期化すれば別になりますが、1.4の頃のように配列またはハッシュを指す定数で代用するのがよさそうな気が。
class Foo;end
class Bar < Foo
@@cv = 'bar'
CONST = ['bar']
end
class Foo
@@cv = 'foo'
CONST = ['foo']
end
一番右の「nDiary Antennaにある日記は全部見よう」運動のhttp://www.geocities.com/eddplus/img/dbr_02b.pngがないのがずっと気になってるんですが…。
gettextの古いバージョンのバグでmake出来なくなっていたので、poディレクトリのja以外のpoとgmoを消して、configure.inのALL_LINGUASを「ALL_LINGUAS="ja"」とjaだけにして、次にintlディレクトリのMakefileの「all-no: all-no-@BUILD_INCLUDED_LIBINTL@」の行で止まったので、とりあえず「all-no:」にして依存を消したらmake出来た。
checkoutしなおしたらgdk-pixbuf-0.11.0.tar.bz2をとってきてgdk-pixbuf.m4をacディレクトリにコピーし直すことも最初に必要だった。
--- rw.cgi 2001/07/09 06:23:34 1.3
+++ rw.cgi 2001/07/09 06:38:12 1.4
@@ -352,7 +352,9 @@
raise RWInvalidRequest unless req.name
raise RWInvalidRequest unless req.src
page = @rwiki.page( req.name )
- page.set_src( req.src, req.rev )
+ page.set_src( req.src, req.rev,
+ "#{ @cgi.remote_user || 'anonymous' } at #{
+ @cgi.remote_host || @cgi.remote_addr || 'unknown' }")
header = Response::Header.new()
res = page.submit_html( getEnv ) { |key| @query[key] }
Response.new( header, Response::Body.new( res ))
--- rwiki.rb.orig Sun Jun 24 11:55:47 2001
+++ rwiki.rb Mon Jul 9 15:47:22 2001
@@ -31,7 +31,8 @@
v = arg.pop
rev = arg.shift
check_revision(k, rev)
- set(k, store(v))
+ commit_log = arg.shift
+ set(k, store(v), rev, commit_log)
end
def [](k)
@@ -69,15 +70,24 @@
end
private
- def set(k,v,rev=nil)
+ def set(k,v,rev=nil, commit_log=nil)
synchronize do
return if v.nil?
+ filename = fname(k)
+ already_exist = FileTest.exist? filename
begin
- fp = File.open(fname(k), 'w')
+ fp = File.open(filename, 'w')
fp.write(v)
ensure
fp.close if fp
end
+ if FileTest.exist? filename
+ system('/usr/bin/cvs', '-fQd', File.expand_path('~/cvsrepo'),
+ 'add', filename) unless already_exist
+ system('/usr/bin/cvs', '-fQd', File.expand_path('~/cvsrepo'),
+ 'commit', '-m', commit_log, filename)
+ nil
+ end
end
end
@@ -341,10 +351,10 @@
set_src(v, nil)
end
- def set_src(v, rev)
+ def set_src(v, rev, commit_log)
FW_MUTEX.synchronize do
@@dirty = true
- @@db[@name, rev] = v
+ @@db[@name, rev, commit_log] = v
@modified = Time.now
update_src(v)
end
a='1' || a*=2
p a #=> "1"
autolinkを実際にどこかで試してみた方がいいかなぁ。ふと思ったけどこれってhttpだけでhttpsとかに対応させるの忘れてた。こんな感じっていうだけで手を抜いてただけかな。
tDiaryの弱点はデフォルトのCSSがそれなりにかっこいいのでそのまま使われていると作者のページとの区別がしにくいこと。
クリップボードの方はCLCLみたいに出来ればいいなと思ったのですが、右上のリストビューの選択を変更したときに右下のところを更新するにはどうすればいいのかわからなかった。
複数選択できてしまうのも内容を右下に表示するのに都合が悪いけど、複数選択されているときは選択されている形式のリストでも表示しておけばいいか。
他には画像が入っているときは右下のVRTextをVRBitmapPanelに差し替えて表示したかったけど、入れ替え方と画像の扱い方がわからなかった。
CF_BITMAPって難しいんですか。クリップボードの中身ってよくわからないのでとりあえずdumpしてるっていうのが正直なところです。CF_TEXTの末尾(NUL文字以降)についてるのも何なのかよくわからないし。
差し替えはvisible/invisible切り替え程度でいいかと思ってたんですが、CLCLはどうやってるんだろう?
mod_rubyだと同じプロセスIDで複数動くので網道編のlockはまずい気がする。同じプロセスだとグローバル変数が共通らしいので、同じプロセスではグローバル変数のMutexで排他処理をするといいのかも。
IRCでURLをささやいてみたらLEGALが追加されたみたい。
(?:...)
ではなく(...)
だとegrepにも対応になってたのか。
*[foo,bar,]
postfixでaliasesが無視される件でかなり悩んでいたが原因が判明した。
mydestination = $myhostname, localhost.$mydomain
だとmyorigin = $mydomain
ではローカル配送されないからローカルのaliasesも参照されないと言うのが原因だった。
$mydomain
のサーバがqmailで拡張アドレスを使っているので、mydestination = $myhostname, localhost.$mydomain $mydomain
にするのではなくmyorigin = $myhostname
にして解決した。
2001/06/05の変更でMARSHAL_MINORが変わっているのでリリース版の1.6.4(2001-06-04)とCVS版はリリースの次の日でMarshalの互換性が…。
なんでかな?と思ったら、require 'mathn'をしていないと整数演算だかららしい。
irb(main):001:0> require 'matrix'
true
irb(main):002:0> Matrix[[2.0,5.0],[1.0,3.0]].inverse
Matrix[[3.0, -5.0], [-1.0, 2.0]]
irb(main):003:0>
他のプロセス経由で同じロックをしようとするとデッドロックになって困ったので、RWiki-devel MLできいてみることにした。
# p1.rb
require 'drb/drb'
require 'mutexm'
class P1
include MutexM
def a(p2)
p2.b(self)
end
def c
p :c
end
synchronized :a
synchronized :c
end
uri = ARGV.shift
DRb.start_service
P1.new.a(DRbObject.new(nil,uri))
# p2.rb
require 'drb/drb'
class P2
def b(p1)
p1.c
end
end
uri = ARGV.shift
DRb.start_service uri, P2.new
puts DRb.uri
puts '[return] to exit'
gets
??
perlで$`
だけに'abc'
が入っていて$&
や$'
が空なのがなぜかわからない。
% perl -v
This is perl, version 5.005_03 built for i386-linux
(略)
% perl
print ++$i," $` [ $& ] $' \n" while 'abc' =~ /.??/g
1 [ ] abc
2 [ a ] bc
3 a [ ] bc
4 a [ b ] c
5 ab [ ] c
6 ab [ c ]
7 abc [ ]
% ruby -v
ruby 1.6.4 (2001-07-16) [i386-linux]
% irb
irb(main):001:0> 'abc'.scan(/.??/){p [$`,$&,$']}
["", "", "abc"]
["a", "", "bc"]
["ab", "", "c"]
["abc", "", ""]
"abc"
irb(main):002:0>
C:\>perl -v
This is perl, v5.6.1 built for cygwin
(略)
C:\>perl -e "print ++$i,qq{ $` [ $& ] $' \n} while 'abc' =~ /.??/g"
1 [ ] abc
2 [ a ] bc
3 a [ ] bc
4 a [ b ] c
5 ab [ ] c
6 ab [ c ]
7 abc [ ]
whileを使うべきところで間違えてforを使ってしばらく悩んだが、IRCで質問してみたら解決した。
結局foreachだと先にリストに展開してしまうからだった。
ついでに5.005_03で4になるのはバグっぽいので5.6.1を使いましょう(大意)という話も。
whileとforeachは非常にはまりやすい気がする。while(<>)
みたいなイディオムやfor(@array)
だと間違えないんだけど。
% perl -v
This is perl, version 5.005_03 built for i386-linux
(略)
% perl
print ++$i," $` [ $& ] $' \n" for 'abc' =~ /.??/g
1 abc [ ]
2 abc [ ]
3 abc [ ]
4 abc [ ]
% perl -we "@a= 'abc'=~/.??/g;print scalar @a"
4
C:\>perl -v
This is perl, v5.6.1 built for cygwin
(略)
C:\>perl -e "print ++$i,qq{ $` [ $& ] $' \n} for 'abc' =~ /.??/g"
1 abc [ ]
2 abc [ ]
3 abc [ ]
4 abc [ ]
5 abc [ ]
6 abc [ ]
7 abc [ ]
C:\>perl -we "@a= 'abc'=~/.??/g;print scalar @a"
7
zshのコマンドラインで日本語の入力ができなかった原因はbindkey -m
だった。
必要なさそうだったので消して、bindkeyはbindkey -e
とbindkey ' ' magic-space
だけにしておいた。
長くしてみたら、深いディレクトリに入ったときに長すぎてRPROMPTが出て来なかったので、ちょっと長さ制限してみた。
setopt PROMPT_SUBST
PROMPTCOLOR=31
ESC=$(print -Pn '\e')
DEFAULTCODE=$(print -Pn '\e(B')
BELL=$(print -Pn '\a')
case $TERM in
vt100|[Exk]term*|rxvt)
XTITLE=$ESC']0;<%n@%m:%~>'$BELL
;;
screen)
XTITLE=$ESC'k<%n@%m:%~>'$ESC\\
;;
esac
PROMPT='%B%{'$DEFAULTCODE$XTITLE$ESC'[$[PROMPTCOLOR=31+($PROMPTCOLOR-30)%6]m%}%#%{'$ESC'[m%} %b'
RPROMPT='%B%{'$ESC'[${PROMPTCOLOR}m%}<%U%? %l %D %* %n@%m:%35<...<%d%u%{'$ESC'[${PROMPTCOLOR}m%}>%{'$ESC'[m%}%b'
#RPROMPT='<%U%n@%m:%~%u>'
unset XTITLE
unset ESC
unset BELL
READNULLCMD='less -E'
でうまくいかなくて長い間困っていたが、manを見ていたら、functionを使えばいいということがわかった。
if type jless >&/dev/null; then
export PAGER=jless
export LESS=-M
export JLESSCHARSET=japanese
function more () {
jless -E "$@"
}
READNULLCMD=more
elif type less >&/dev/null; then
export PAGER=less
export LESS=-M
export JLESSCHARSET=japanese
function more () {
less -E "$@"
}
READNULLCMD=more
elif type more >&/dev/null; then
export PAGER=more
READNULLCMD=more
else
echo NO PAGER
fi
[ruby-dev:14150]からnews:<3B61A8B4.2627FB93%40nifty.ne.jp>のあたりの話。
dir.batがdir *.batと同じだったというのを思い出しました。
拡張子をつけて優先的に実行しようとしても内部コマンドの方が優先されるので無理だったという。