2001年7月のn日記


過去のn日記


Generated by nDiary version 0.9.3.beta6

2001年7月1日(日)

tDiary bug

  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 %>)」を付けるというのでやってみることにした。

tab stop

  lessは-x 2でviだと:set ts=2


2001年7月2日(月)

cvs loginfo

  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」となってディレクトリがちゃんと出来ていなかったのが原因。

ruby; string or num

  obj.is_a? String(またはNumeric)とか===で以下のような感じとか。


case obj
when String
  '文字列'
when Integer
  '整数'
when Float
  '実数'
when Numeric
  '数値'
end
ruby 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

  execすれば実行されない。


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

2001年7月5日(木)

ruby Thread.critical=true fcntl

  fcntlにしてみたら、子プロセスが一度終了して2度目にfork&execしようとしたときにうまくいかない。

VisualuRuby

  VisualuRubyに再々挑戦。今度は元ネタがあるので楽々。
何もしないプログラムと,それに毛のはえたやつを移植してみたke.rbと作りかけのクリップボード履歴


2001年7月6日(金)

iso-2022-jp 半角カナ

  iso-2022-jpでは半角カナ用のエスケープシーケンスが定義されてないから、ということなのですが、結局、iso-2022-jpという嘘のcharsetを付けてメールを送るぐらいなら、(嘘のcharsetを付けるのと同じく)相手が読めない環境の可能性もあるのは同じなのだから、charsetはShift_JISやeuc-jpでBase64にするとかutf-8やutf-7でもいいんじゃないの?というような話。


2001年7月7日(土)

[ruby] global variable vs GC

  100はFixnumなのでGCされるようなオブジェクトじゃないはず。
っていう話ではなさそう。
そういう問題もあるからmod_rubyは「一方、mod_rubyでは複数のスクリプトが一つのRubyインタプリタを利用するため、あるスクリプトがグローバルな状態を変更すると、他のスクリプトにも影響が及びます。したがって、ISPなどで信頼できない不特定多数のユーザにmod_rubyの使用を許すようなことは避けてください。」という話がでてくるのだと思う。

  それにしても「どうやら global variable は apache の child process ごとに存在するようです。」というのはRubyインタプリタが1つではなく child process の数だけ存在すると言うことだと思うのですが。
FAQには「一つのRubyインタプリタ」と書いてあるのに。

[ruby] class variable

  Barの方を先に初期化すれば別になりますが、1.4の頃のように配列またはハッシュを指す定数で代用するのがよさそうな気が。


class Foo;end
class Bar < Foo
  @@cv = 'bar'
  CONST = ['bar']
end
class Foo
  @@cv = 'foo'
  CONST = ['foo']
end
nonsense talk

  一番右の「nDiary Antennaにある日記は全部見よう」運動のhttp://www.geocities.com/eddplus/img/dbr_02b.pngがないのがずっと気になってるんですが…。


2001年7月8日(日)

sylpheed 0.5.0 potato

  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ディレクトリにコピーし直すことも最初に必要だった。


2001年7月9日(月)

RWiki CVS

  書き込みと同時にcommitされるようにしてみた。


--- 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

2001年7月10日(火)

Ruby ショートサーキット論理評価

  こんな感じ?


a='1' || a*=2
p a #=> "1"
autolink

  autolinkを実際にどこかで試してみた方がいいかなぁふと思ったけどこれってhttpだけでhttpsとかに対応させるの忘れてた。こんな感じっていうだけで手を抜いてただけかな。

tDiary

  tDiaryの弱点はデフォルトのCSSがそれなりにかっこいいのでそのまま使われていると作者のページとの区別がしにくいこと。


2001年7月11日(水)

VisualuRuby計画(仮称)

  クリップボードの方はCLCLみたいに出来ればいいなと思ったのですが、右上のリストビューの選択を変更したときに右下のところを更新するにはどうすればいいのかわからなかった。
複数選択できてしまうのも内容を右下に表示するのに都合が悪いけど、複数選択されているときは選択されている形式のリストでも表示しておけばいいか。
他には画像が入っているときは右下のVRTextをVRBitmapPanelに差し替えて表示したかったけど、入れ替え方と画像の扱い方がわからなかった。


2001年7月12日(木)

VisualuRuby

  CF_BITMAPって難しいんですか。クリップボードの中身ってよくわからないのでとりあえずdumpしてるっていうのが正直なところです。CF_TEXTの末尾(NUL文字以降)についてるのも何なのかよくわからないし。
差し替えはvisible/invisible切り替え程度でいいかと思ってたんですが、CLCLはどうやってるんだろう?

mod_ruby 網道編のlock

  mod_rubyだと同じプロセスIDで複数動くので網道編のlockはまずい気がする。同じプロセスだとグローバル変数が共通らしいので、同じプロセスではグローバル変数のMutexで排他処理をするといいのかも。


2001年7月13日(金)

某日記 Ruby

  IRCでURLをささやいてみたらLEGALが追加されたみたい。

migemo

  (?:...)ではなく(...)だとegrepにも対応になってたのか。

[ap-list:1848] ruby *[foo,bar,]

  ,)がダメだったので,]にしたという話。


2001年7月14日(土)

postfix aliases

  postfixでaliasesが無視される件でかなり悩んでいたが原因が判明した。

  mydestination = $myhostname, localhost.$mydomainだとmyorigin = $mydomainではローカル配送されないからローカルのaliasesも参照されないと言うのが原因だった。
$mydomainのサーバがqmailで拡張アドレスを使っているので、mydestination = $myhostname, localhost.$mydomain $mydomainにするのではなくmyorigin = $myhostnameにして解決した。


2001年7月16日(月)

Ruby 1.6.4 Marshal

  2001/06/05の変更でMARSHAL_MINORが変わっているのでリリース版の1.6.4(2001-06-04)とCVS版はリリースの次の日でMarshalの互換性が…。

RWiki dRuby

  RWikiのdRubyのページは内容が古いままのところが結構ある…。


2001年7月20日(金)

ruby 落とし穴

  なんでかな?と思ったら、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>

2001年7月27日(金)

dRuby deadlock

  他のプロセス経由で同じロックをしようとするとデッドロックになって困ったので、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 [  ]
perl foreach while

  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

2001年7月29日(日)

zsh bindkey

  zshのコマンドラインで日本語の入力ができなかった原因はbindkey -mだった。
必要なさそうだったので消して、bindkeyはbindkey -ebindkey ' ' magic-spaceだけにしておいた。

zsh 長いPROMPT

  長くしてみたら、深いディレクトリに入ったときに長すぎて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
zsh READNULLCMD

  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

2001年7月30日(月)

DOS wildcard

  [ruby-dev:14150]からnews:<3B61A8B4.2627FB93%40nifty.ne.jp>のあたりの話。

  dir.batdir *.batと同じだったというのを思い出しました。
拡張子をつけて優先的に実行しようとしても内部コマンドの方が優先されるので無理だったという。


上へ indexへ
copyright © 2000 ZnZ