2001年9月のn日記


過去のn日記


Generated by nDiary version 0.9.3.beta6

2001年9月1日(土)

chroot 環境による woody

  参考にしてVine Linux 2.1.5上でやってみた。失敗した点はこんな感じ。


2001年9月4日(火)

prc-tools-2.0.92

  prc-tools-2.0.92を入れてみた。
インストールに使ったMakefileはこんな感じ。


ROOT=~/ROOT
PREFIX=$(ROOT)/usr/local
PATH=$(PREFIX)/bin:/usr/bin:/bin:/usr/local/bin
EXEC_PREFIX=$(PREFIX)
PALMDEV=$(PREFIX)/palmdev
PALMDEV_PREFIX=$(ROOT)/opt/palmdev
EXEEXT=
SDKDIR=$(PALMDEV)/sdk
SDK35=~/sdk35.tar.gz
WORK=$(ROOT)/tmp
BUILD=$(WORK)/build
PRCTOOLSVER=2.0.92
PRCTOOLSDIR=$(WORK)/prc-tools-$(PRCTOOLSVER)
PRCTOOLSTAR=~/got/prc/prc-tools-$(PRCTOOLSVER).tar.gz
GNUDIR=~/gnu
BINUTILSVER=2.9.1
GCCVER=2.95.3
GDBVER=5.0
MAKEVER=3.77
PATCHED=$(WORK)/gcc-$(GCCVER)/gcc/cstamp-h.in
 
all-install: $(BUILD)/Makefile
        cd $(BUILD) && make all-install
 
explicitly: $(BUILD)/Makefile
        cd $(BUILD) && make all-host
        cd $(BUILD) && make install-host
        cd $(BUILD) && make all-gcc
        cd $(BUILD) && make install-gcc
        cd $(BUILD) && make install-palmdev
        cd $(BUILD) && make all-target
        cd $(BUILD) && make install-target
 
doc: $(BUILD)/Makefile
        cd $(BUILD)/doc && make html
        cd $(BUILD)/doc && make install-html
 
clean:
        rm -rf $(WORK)
 
purge:
        rm -rf $(WORK) $(PALMDEV) $(PALMDEV_PREFIX)
 
config: $(BUILD)/Makefile
$(BUILD)/Makefile: install-sdk $(PRCTOOLSDIR)/symlink
        mkdir -p $(BUILD)/empty
        cd $(BUILD) && ../prc-tools-$(PRCTOOLSVER)/configure \
          --target=m68k-palmos \
          --enable-languages=c,c++ \
          --with-headers=`pwd`/empty \
          --prefix=$(PREFIX) --exec-prefix=$(EXEC_PREFIX) \
          --without-shared-libstdcxx-for-tools \
          --with-build-sdk=-palmos \
          --with-palmdev-prefix=$(PALMDEV_PREFIX) \
          --with-palmdev-extra-path=$(PALMDEV)
 
symlink: $(PRCTOOLSDIR)
$(PRCTOOLSDIR)/symlink: $(PATCHED)
        rm -f $(PRCTOOLSDIR)/{binutils,gdb,gcc,make}
        ln -s ../binutils-$(BINUTILSVER) $(PRCTOOLSDIR)/binutils
        ln -s ../gdb-$(GDBVER) $(PRCTOOLSDIR)/gdb
        ln -s ../gcc-$(GCCVER) $(PRCTOOLSDIR)/gcc
        ln -s ../make-$(MAKEVER) $(PRCTOOLSDIR)/make
        touch $@
 
patched: $(PATCHED)
$(PATCHED): $(PRCTOOLSDIR)/README \
  $(WORK)/binutils-$(BINUTILSVER)/README $(WORK)/gcc-$(GCCVER)/README \
  $(WORK)/gdb-$(GDBVER)/README $(WORK)/make-$(MAKEVER)/README
        cd $(WORK) && for diff in $(wildcard $(WORK)/prc-tools-$(PRCTOOLSVER)/*.palmos.diff); do patch -fp0 < $$diff; done
        touch $@
 
$(PRCTOOLSDIR)/README: $(WORK)
        cd $(WORK) && tar zxf $(PRCTOOLSTAR)
 
$(WORK)/binutils-$(BINUTILSVER)/README $(WORK)/make-$(MAKEVER)/README: $(WORK)
        cd $(WORK) && tar zxf $(GNUDIR)/`echo '$@'|sed -e 's:$(WORK)::' -e 's:/README::'`.tar.gz
 
$(WORK)/gcc-$(GCCVER)/README $(WORK)/gdb-$(GDBVER)/README: $(WORK)
        cd $(WORK) && tar --bzip2 -xf $(GNUDIR)/`echo '$@'|sed -e 's:$(WORK)::' -e 's:/README::'`.tar.bz2
 
 
install-sdk: $(SDKDIR) $(SDKDIR)/include $(SDKDIR)/lib
 
$(SDKDIR)/include: $(SDKDIR)
        ln -s Incs $(SDKDIR)/include
 
$(SDKDIR)/lib: $(SDKDIR)
        ln -s 'GCC Libraries' $(SDKDIR)/lib
 
$(SDKDIR): $(PALMDEV) $(PALMDEV_PREFIX)
        cd $(PALMDEV) && tar zxf $(SDK35)
        ln -s 'Palm OS 3.5 Support' $(PALMDEV)/sdk35
        ln -s sdk35 $(SDKDIR)
 
$(WORK) $(PALMDEV) $(PALMDEV_PREFIX):
        mkdir -p $@

2001年9月5日(水)

POBox Emacs

  saryを使う設定で/home/pobox/ROOTに入れてみた。saryは./configure --prefix=/home/pobox/ROOTで問題無く入った。
POBox Serverは./configure --prefix=/home/pobox/ROOT --enable-saryだけではうまくいかず、OpenPOBox/server/MakefileのCFLAGSに-I/usr/lib/glib/include-I~/ROOT/includeを追加して、さらにpbserverのルールの-lsary-L/home/pobox/ROOT/lib -lsaryにして-lglibをsaryのMakefileを参考にして-L/usr/lib -lgthread -lglib -lpthreadにしたらmakeできた。

  skkservが1178を使っているので、chmod +x pbserver.cしてからPOBOXSERVERPORTを変更してmakeし直した。
そしてインストールに書いてあるようにnkf -e ../dict/data/fugodic > staticdic ; ~/ROOT/bin/mksary -l staticdic ; touch learndicをしてから起動した。

  telnetで動作確認した後、Emacs版から使ってみたらskkservにつながってなんか変だったので、pobox.elを見て(setq pobox-port 11178)と設定したらちゃんと使えるようになった。

fetch-rwiki.rb

  RWikiのsrcをとってくる。ただしとってこれるのはrecentに出てくるページのみ。


2001年9月6日(木)

static SingletonImpl *_instance(NULL);

  staticだから問題無いのかな。

ruby method_added

  preservedEachDelegatorのようにmethod_addedを再定義するものを2つ以上使ったらまずいような気がした。

ruby glob 空白

  Dir['foo\ bar']のようにエスケープすれば大丈夫です。FAQに追加?

ruby Dir.chdir{}

  ブロック付きのchdirはruby 1.7 featureです。

escape a regexp

  rubyだとRegexp.quoteでperlだとquotemeta。

  正規表現のquoteって忘れられてることが結構あるような気が。
fetch-rwiki.rbscan(%r<<li><a href="#{Regexp.quote @path}\?cmd=view;name=([^\"]+)">([^<>]+)</a>\((\d+\w)\)>)のようなquoteって普通は必要なさそうなので。

ssh-agent

  今は~/.zshrcでこうやってます。
ssh-add -lで既にssh-add済みかどうかを判断するところをもうちょっとどうにかしたいですが。


if [ -z "$PROMPT" ]; then
  return
elif [ -n "$ZDOTDIR" -a ! -O "$ZDOTDIR" ]; then
  :
elif [ -x /usr/bin/ssh-agent -a -z "$SSH_AUTH_SOCK" ]; then
  exec /usr/bin/ssh-agent zsh
elif [ -x /usr/bin/ssh-add -a ${$(/usr/bin/ssh-add -l)[0]} != 1024 ]; then
  ssh-add
fi
Apollo

  Apolloでチャットクライアント再び。
RubyのThreadやTCPSocketはうまくいかないようだったので、require 'internet'で使えるClientSocketを使ってみた。
後はいろいろと調整中。


2001年9月7日(金)

HTML 大文字小文字をそろえる

  HTMLの要素等の文字ケースをそろえたいという話。

  前提としてちゃんとしたHTMLだとして、要素だけならs/(<\/?)(\w+)/$1.uc($2)/eg。属性はsplit(/(<[^>]+>)/)しておいてs/\b(\w+)(=(?:(["'].*?\3|\S+))?/uc($1).$2/egとか。属性値はquoteしてしまいたいというのならs/\b(\w+)(=(?:(["'].*?\3|(\S+)))?/uc($1).($4 ne '' ? qq(="$4") : $2)/egとかいうのを思い付きました。
動作は未確認。

chat_apollo.rb

  今のところ、思いっきり自分の環境専用のチャットクライアント。
これを作るときにap-listでいろいろお世話になりました。


2001年9月8日(土)

Apollo

  Phi::Edit#textで取得したStringにconcatしてもEditの内容は変わらない。
変更した後Phi::Edit#text=で書き戻す方がRubyレベルの文字列操作を一気にできるのでよさそう。

  普通のformの他にeval用のフォームも用意しておくとデバッグなどに便利。
タスクバーにたくさん並ぶのさえなんとかなればなぁ。


form_eval = Phi::Form.new
form_eval.caption = 'eval'
btn_eval = Phi::Button.new(form_eval, :btn_eval, 'e&val')
btn_eval.align = Phi::AL_BOTTOM
memo_eval = Phi::Memo.new(form_eval)
memo_eval.align = Phi::AL_CLIENT
memo_eval.text = 'puts Marshal.dump(form)'
btn_eval.on_click = proc do |sender|
  text = memo_eval.text
  break if text.empty?
  eval text
end
form_eval.show

2001年9月9日(日)

ruby glob 空白

  1.6で確認したつもりだったのに1.7だったのかも。
ruby-devって書いてあるのにリンク先はruby-listになってる。

tDiaryを使ったzt diaryに移転。

  ツッコミをしやすいようにとか、リンクされたときにわかりやすいようにtDiaryに移転することにした。
nDiaryと同じで空行が入れられないという問題がありますが…。

  フリーのサーバということで消えたらいやだなぁ。

  「■」のところはtDiaryで書いたもののバックアップコピーということでこっちもたまに更新する予定ですが、ツッコミ機能があるtDiaryの方をメインにする予定。

インストールメモ

  .htaccessや.htpasswdはother権限で読み込めないと効かない。
ディレクトリ(t,t/erb,t/theme)のパーミッションは705。
index.cgiとupdate.cgiは*.cgiは700。.htaccessが効かない問題で悩んでいたときに*.rbから*.cgiに変えてしまったのでそのまま。
erb/*とtdiary.rb、つまり*.rbは600。cgiが実行時に読み出すだけだから。+xは必要ない。
その他のtdiary.confや*.rhtmlなども600。cgiが実行時に読み出すだけなので。
t/theme/*のパーミッションは604。ブラウザで普通に読み出せるようにするため。
README.htmlHOWTO-write-tDiary.htmlも置くのなら604。

2001-09-23追記

  public_html/t/.htaccessの内容は以下の通りでパーミッションは604。データ用ディレクトリtdiaryはパーミッション701で、その中のtdiary/.htpasswdのパーミッションは604。


<Files "*.rhtml">
deny from all
</Files>
<Files "tdiary.*">
deny from all
</Files>
<Files update.cgi>
AuthName      tDiary
AuthType      Basic
AuthUserFile  /virtual/znz/tdiary/.htpasswd
Require user  znz
</Files>

  ツリーで書くとこんな感じ。もう少し厳しくするのならpublic_htmlのotherのr(ディレクトリ一覧を見る権限)とかtディレクトリ以下のすべてのファイルのw(自分の書き込み権限)をはずしてもいいのですが、自分の書き込み権限をはずすのは不便になるだけという気がするのでお勧めしません。


705(drwx---r-x) ~/
701(drwx-----x)  +--tdiary/
604(-rw----r--)  |  +--.htpasswd
644(-rw-r--r--)  |  +--200109などの後から生成されるファイル
705(drwx---r-x)  +--public_html/
701(drwx-----x)           +--t/
604(-rw----r--)              +--.htaccess
700(-rwx------)              +--*.cgi (index.cgi,update.cgiなど)
                             |   (オリジナルのままならindex.rbとupdate.rb)
600(-rw-------)              +--tdiary.rb (requireで読み込まれるだけなので
                             |             実行権限はいらない)
600(-rw-------)              +--*.rhtml
600(-rw-------)              +--*.rtxt
600(-rw-------)              +--*.conf (ちゃんと設定しておくこと)
604(-rw----r--)              +--*.html (なくてもいい)
700(drwx------)              +--erb/  (公開しないのでotherの権限はいらない)
600(-rw-------)              |  +--*.rb (tdiary.rbと同じでrequireで読み
                             |           込まれるので実行権限はいらない)
701(drwx-----x)              +--theme/  (公開用なのでotherのxが必要)
604(-rw----r--)                 +--*.css, *.png
                                   (すべて公開用なのでotherのrが必要)

2001年9月10日(月)

早速捕獲されまくり?

  nonsense talkが更新されてなくてもnAntennaの情報がこっちになってるのはたんぽぽ ひとりごと。から情報をもらってるから?

  入れるときに信頼性の高い「実験的日記」(2001-08-31)を参考にしたんですが、参考に仕返されたようで。

CGIで更新

  やはりCGIで更新できるというのは楽でいいです。

  問題点はサーバが落ちてると更新できないとか、途中でブラウザが落ちたら消えるとか。

リンク元置換リスト

  リンク元置換リストを追加してみた。

Time.at(1000000000) #=> Sun Sep 09 10:46:40 JST 2001

  2001年9月9日問題はWindowsMEやCVSupにあったらしい。

単なるリンク

2001年9月11日(火)

Apollo

  リファレンスはRuby GUI センターからリンクされているPhiが一番詳しいみたい。ComboBoxがないみたいだけど。

  apollo.exeだと自動でinclude Phiされているらしくruby_ap.exeで実行したときにPhi::の付け忘れが発覚した。

www.dm4lab.toにつながらない

  今、うさにっきとかhttp://www.dm4lab.to/~kjana/ruby/ruby.htmlにつながりません。

META ROBOTS

  最新のページには<meta name="ROBOTS" content="NOINDEX">をつけた方がいいような気がするんですが、tDiary(のデフォルト)ではつけないんでしょうか?

tDiaryがRubyのキラーアプリ

  RWikiはrwiki.rbというバックエンドが必要という条件が厳しいからキラーアプリになれなかったのかな。


2001年9月12日(水)

リンク元

  たんぽぽ ひとりごと。が置換リストに入れたはずなのにURLのままになっていたのでなぜ?と思ったら、ドメインに大文字が混ざっているのが別URLとみなされていたらしい。

  今は^http://(?i:hachi.haun.org)/tp/.* たんぽぽ ひとりごと。
にして置換はされるようになったけど。

  別々にカウントされるのはindex.htmlの有無と同じで気にしないというのが一番よさそう。

2001年9月9日問題

  実は2通りあったらしい。

  9桁で処理していたら破綻する(した)というパターンは結構少ない気がする。

  もう1つは数値で比較すべきところを文字列で比較してしまっていたというもの。perlのCGIでありがちらしい。

courier-imap

  フォルダの名前をfooからbarに変えたような時にfoo/hogebar/hogeにならずにfoo/hogeのままだったので、for d in .foo.*; do mv $d `echo $d|sed -e 's/foo/bar/'`;doneで無理矢理変更。

LaTeXとtgif

  画像を取り込む方法はepsboxとかepsfとかいろいろあるみたいですが、どう違うのかよくわかりません。

linux-users

  2001年9月6日(木) 9:00 〜2001年9月11日(月) 9:00の間停止というメールが停止が終わってから1日以上経ってから(JSTで今日の20時に)届いた。終わってから届いても遅いって。こういう連絡メールだけは停止前に配送してしまうということはできなかったのかなぁ。


2001年9月13日(木)

.xsession-errors

  Vine Linux 2.1.5やVineSeedのwdmで修復モードでさえログインできなかった原因は、.Xdefaultsか.Xresources(シンボリックリンクにしているのでどっちなのかは不明)がsyntax errorだったかららしい。

  と思ったらそうでもなかったらしい。syntax errorを直したら.xsession-errorsができなくなって、setime noneをしたら、.xwm.msgsもできなくなったので、てがかりがさっぱりなくなってしまった。

dRuby

  dRubyで呼び出し中にThread#raiseで呼び出し側に例外があがったらどうなるんだろう?

Kondara Mary

  Kondara Maryに直接ログインすると、.profileでexec zsh -lした後でプロンプトが出てこない。rootで入ってsuでも駄目だった。execの行をコメントアウトして、sh(実体はbash 2.04?)のプロンプトからexec zsh -lすると問題無くzshのプロンプトが出てきた。謎。ssh-addのパスフレーズ入力までいかないということはどこで止まってるんだろう…。


#! /bin/sh
SHELL=`${HOME}/etc/shell.sh`
if [ -n "$SHELL" ]; then
  export SHELL
  exec $SHELL -l
fi

  ちなみに~/etc/shell.shはこんな感じ。zshもtcshもない環境ではbash -lはだめでbash --loginとしないといけなくて残念な思いをする予定。


#! /bin/sh
for SH in zsh tcsh bash csh; do
  for BIN in /bin /usr/bin /usr/local/bin; do
    [ -x ${BIN}/${SH} ] && echo "${BIN}/${SH}" && exit 0
  done
done
exit 1
apt-line(deb)

  Debianのapt-lineはdeb http://deb.ruby-lang.org/debian potato main contrib non-freeを例にするとこんな感じなのでしょうか?


2001年9月14日(金)

qmail tips

  メールを捨てるには/dev/nullに送るのではなく"#"だけ書いておくのがいいらしい。


2001年9月15日(土)

Cygwin

  全部いれるとでかいけど、だからといってどれが不必要なのかが初めていれる場合にはわからないという話が。

<->

  gsub(/<(?!\w)/, '&lt;')とかすればいいのかも、と思いましたがどうでしょうか?>tDiary,nDiary

/<!-- PiloWeb_Begin -->/ .. /<!-- PiloWeb_End -->/

  というのがついてるところが最近多い?
tDiaryってツッコミを考えると単純な1ページのみをダウンロードする巡回ソフトと相性が悪そう。

Known-Working RPM Platforms

  Project HeavyMoon(重月計画)は入ってないみたい。

押しても反応しないボタン

  yamk 日記のアンテナボタンで思い出しましたが、悲しいのでscript必須ならdocument.writeで動的に出してほしいです。noscriptに代わりのa要素があればもっとうれしいです。
例としてはAutoSaveとか。そういえばこれって</がそのまま書いてあるというのが別ファイル専用という感じ。

/var/tmp tmpreaper tmpwatch

  Debian(potato)のtmpreaperだと/tmpだけ処理されて/var/tmpはそのままなのに、Vineではtmpwatchによってしばらく使われていないファイルは消されてしまう。

rpm-python-3.0.6-0vl2

  rpm.labelCompare((None,None,None),(None,None,None))でsegmentation fault。


2001年9月16日(日)

OutlookExpress5

  IMAPのアカウントで使ってみようかと思ったら、CRAM-MD5の認証に対応してなくて使えず。

CGIで更新

  サーバが落ちてなくても重ければ更新できないという罠が。

非 JavaScript 対応

  問題の本質としては鳩丸ご意見番 - 残念な思いを致しました(2) - 謎のアンカーには残念な思いを致しました。と同じです。
ちなみにこういう「大分類 - 中分類 - 小分類」という並びでtitleが書いてあると複数のページを一気に開いたときにタスクバーなどで頭の何文字かしかわからないので、区別しにくくて残念な思いをします。
日記ページで順番を変えて数字だけ見えてたらそれはそれでもっと残念な思いをしそうですが。

Cygwin 1.3.3

  やっぱまずいらしい。

courierimap

  mkdirでフォルダを追加しようとしたら、MUAから見ても追加されてなかったのでなぜ?と思ったら、maildirmakeで作らないとだめだったみたい。

トレンドマイクロ、セキュリティ初心者向けWebサイト・メールサービスを無償提供開始

  サンプルが読めません。
SSLで送った情報を確認のためメールで送ってくるのはセキュリティ的に問題あり。

sync;sync;sync

  書いたのが23時以降だったらこっちを先に更新になってしまうこともあるかも。


2001年9月17日(月)

Python script

  Vine専用ではないけど置く場所に悩んだのでvineディレクトリにrpmVersionCompare.pyrpmLabelCompare.pyをおいてみた。
rpm-pythonが必要。

  rpmVersionCompare.pyは*.rpmかrpmdb(インストールされているrpmの情報のデータベース)から情報を取り出してバージョンの比較をするスクリプト。引数の末尾が.rpmならファイルとみなしてそこから情報をとりだし、そうでなければrpmdbから。rpmdbに複数あった場合は見つかったものを全部出力して一番最初のと最後のを比較します。


% rpmVersionCompare.py kernelcfg kernelcfg_0.6-9vl1_i386.rpm
kernelcfg 0.6 9vl1 == kernelcfg 0.6 9vl1 # 0 0
% rpmVersionCompare.py libruby_1.6.4-0vl2_i386.rpm libruby_1.6.4-0vl8_i386.rpm
libruby 1.6.4 0vl2 << libruby 1.6.4 0vl8 # -6 6

  rpmLabelCompare.pyはあらかじめname version releaseに分割しておいてから引数に渡すとrpm.labelCompareを呼び出して比較した結果を標準出力にprintするだけというかなり不便な手抜きスクリプト。rpmVersionCompare.pyでrpmdbから複数見つかったときの比較には使えるかも。


% rpmLabelCompare.py man 1.5i 10vl1.2 man 1.5i 10vl1
1
Refererチェック

  機能があっても気づかなければ意味がない対策としてリンク元置換リストにないURLからのリンクがあったときはツッコミと同じようにメールで通知するというのを思い付きました。

<のエスケープの話

  普段はブラウザがエラー処理としてやってくれることをCGIの方で代わりにやっておいて少しでもvalidなHTMLにしようというつもりなので、最後の出力の直前でいいと思います。
HNSのように閲覧者に警告が見えるシステムはなんか間違ってる気がするので、警告するなら更新の時に。


2001年9月18日(火)

RWiki+CVS

  RWikiのRDをそのままCVSで管理しようとすると、CVSというページがあるとまずいというのは.rdをつけてからCVSにいれることで回避していたが、CVSのキーワード($Date$など)があるとまずいかもしれないというのを気にせず放置していたら、CGIで見事に罠にはまってしまったので、cvs admin -ko *.rd; cvs upした後、$Date$を消しておいた。

tDiary

  Refererチェックメールって本日のリンク元が0から1になるときだけということにすれば専用のステートは持たなくていいと思ったんですが、書き忘れてたかも。
閲覧者に警告が見えるのって適切なclassがついててユーザスタイルシートで隠蔽できればなんとか。HNSのも自分で隠す設定にしておけばいいのか。調べておこう。

<>の置換 [nDiary]

  コメントや閉じタグは思いっきり忘れてました…。コメントタグってIE独自拡張の<comment>のことですか?っていうわかりにくいぼけはおいといて、<!-- これ -->注釈宣言っていうのが正式名称のようです。とりあえずタグじゃないというのは覚えておいた方がいいいと思います。


2001年9月19日(水)

perl -e'puts join("\n", @INC)'

  perlにputsはないはずなのに。

footnote

  をゐなり日誌のように脚注をtitleでつけてみるのはどうだろうと思って、某所のRWikiにapply_to_Footnote%Q[<a name="footnote:#{num}" href="#foottext:#{num}" title="#{CGI.escapeHTML content.to_s.gsub(/<[^>]+>/, '')}"><sup><small>] +という感じでtitle属性をつけてみた。タグは問答無用で消すのでいいのかどうかが悩ましい。


2001年9月20日(木)

qmail links

2001年9月21日(金)

RWiki orphan

  orphanは簡単にできたけどorphanのページからリンクを開くと、リンクされてなかったから読み込まれてなかったファイルが読み込まれてしまう。
許可が出たので幹にcommit。ということは次にRWikiがリリースされるときには入るはず。

<->の話

  &gt;に関してはXML 1.0 日本語版の2.4 キャラクタデータ・マークアップによると「大なり不等号 (>) は,"&gt;" という文字列を使って表わされてもよく」と書かれていて(原文では「Theright angle bracket (>) may be represented using the string "&gt;"」)となっているので「>」のままでも構わないと思います。互換性のため (for compatibility)というのはSGMLとの互換性なので、HTMLやXHTMLではこだわる必要はないと思います。

Ruby 1.6.5

  ここはいつ1.6.5になるんだろう?


2001年9月22日(土)

OmitableMatch

  コマンドを省略可能にするのにこんな感じで逆にマッチするようにすれば(?:...)?の入れ子でややこしくならなくて済みそうだけど、引数までまとめてチェックするのは無理という弱点が。これを使うのならあらかじめsplitしてからになりそう。


module OmitableMatch
  def ===(o)
    /^#{Regexp.quote o.to_s[0, self.size]}/.match self
  end
  module IgnoreCase
    def ===(o)
      /^#{Regexp.quote o.to_s[0, self.size]}/i.match self
    end
  end
end
# 使用例
hoge = 'hoge'
hoge.extend OmitableMatch
hoge === 'hoe' #=> nil
hoge === 'hog' #=> MatchData
hoge.extend OmitableMatch::IgnoreCase
hoge === 'Hoge' #=> MatchData
State

  状態をあらわすのにこんなのを思いついた。st.foo!とかst.bar!で状態変更でst.foo?:foo === stで状態のチェックができる。===を定義しているので、case ... whenで使うのが便利。


class State
  def initialize(*arg)
    @states = arg.collect{|s|
      case s
      when Symbol
        s
      when String
        s.intern
      else
        raise ArgumentError, "#{s} is not a symbol or a string"
      end
    }
    @states.each do |i|
      eval %Q{
        def #{i}!
          @state = :#{i}
          self
        end
        def #{i}?
          @state == :#{i}
        end
      }
    end
    __send__ "#{@states[0]}!"
  end
  attr_reader :states, :state
  def ===(state)
    @state == state or @state == state.intern
  end
  def ==(o)
    @states == o.states and @state == o.state
  end
  def to_s
    @state.to_s
  end
  def _dump(lv)
    "#{@state} " << @states.join(' ')
  end
  def State._load(s)
    state, *states = s.split
    State.new(*states).__send__ "#{state}!"
  end
end
if __FILE__ == $0
  st = State.new(:a,:b,:c)
  st.b!
  st.c? #=> false
  case st
  when :a
    # a
  when :b
    # b
  when :c
    # c
  end
end

2001年9月23日(日)

HNSの日記システム警告

  <font color="red">だった…。ユーザスタイルシートで何とかするのは無理そう。

Ruby 1.6.5

  いつの間にかxreaも1.6.5になっていたようです。

インストールメモ強化

  結構参照されているようなので、2001-09-23追記として全ファイルのパーミッションをまとめ直してみました。

sync

  n日記にバックアップしていなかった日記もバックアップした。


上へ indexへ
copyright © 2000 ZnZ