トップ 最新 追記

3 日坊主日記


2003-01-01 まったり ことよろ [長年日記]

_ Div

咳さんのDivおもしろ〜い。調べていくとDelphi6のWebBroker, WebSnapアーキテクチャにかなり近い。Div::DivはTPageProducerでTofu::SessionはTWebModule + TSession(Delphi用語でSessionはデータベースのセッションなのである。WebでもこのSessionを使いまわすのでデータベースと関係ない文脈でも『データベースセッション』が出てきて話をややこしくする)。

WebBrokerぽいDivクローンを書いてみた。てゆうかDivそのまんま。

http://www.moriq.com/ruby/archive/app.1.tgz

個人でこのフレームワークをさくっと作っちゃうとこが咳さんの(そしてRubyの)すごいとこだよなあ。


2003-01-02 [長年日記]

_ Div

日程表 + 名簿 + 出欠表 という感じで考え中。

http://www.moriq.com/ruby/archive/app.5.tgz

本日のツッコミ(全1件) [ツッコミを入れる]

# daxofplzgv [Hello! Good Site! Thanks you! cfkkopihupmqp]


2003-01-03 [長年日記]

_ Div

おもしろくなってきた。

app app-010.tgz

_ selector

selector は任意の field name で絞り込める。SQL の select 。

_ field_ref

field_ref は参照先をあたかも自分の field のように扱える。

出欠は日程と名簿を参照している。SQL の view 。

_ DB

DB どうしよ。 DBI には対応することにして…。

サンプル的に TextDB を用意しよう。やっぱ固定長が楽かな…。

_ delegator, forwardable

やっと使い方が解ったよ。便利だ。

_ image05.gif


本日のツッコミ(全2件) [ツッコミを入れる]

#  [おお。 Divを発見してくれてうれしいです。 なかなか受けないのはなぜだろう。> Div]

# moriq [どもです〜。 手元にサーバのある環境でないと考えにくいからかなあ。]


2003-01-06 [長年日記]

_ Div

app app-011.tgz 固定長テキストDBにしてみました。 運用実験 お暇な方はいじってみてくださいな。なおE-mailの送信は行いません。 ご意見ご感想はつっこみでよろしく。

_ 日程の追加がしにくい。

メールが飛ばないので出欠入力の例が見られない。 出欠入力 なお SessionID は Cookie に残ります。

_ TextDB

テキストDBファイルはこんな感じ。

#key             todo            #person          #value   #note                    #
#2125930d69032e83f96498d146e32fdb#fc50c43c9852d1a1#出席#    yoro#                    
#52fba1d3d3c279cc071cd35e0ad29df9#fc50c43c9852d1a1##        #                        
#7386978fe8ebf5c7cd40ee3a5086a52a#fc50c43c9852d1a1#欠席#    hmm#                     
#acd9fcffa5005cc4cd40ee3a5086a52a#350b3dfaf6d745a2#出席#    aiueo#                   
 7f2c7e8a2a8ca1220adb09f4ea405fbe#53cfd8534f573032#欠席#    test#                    
#e27a3ab6d63004900adb09f4ea405fbe#8c56f11d736ea3c9#欠席#    #                        
#8be1690c2c39c3560adb09f4ea405fbe#a8cf5ad3a1cd731c#出席#    よろしく#                
 0f99d95956dce0a60adb09f4ea405fbe#3d5abdbcf1b86ce0##        #                        
 533dc31e993fc09e51db8f8df2ba8fed#53cfd8534f573032#欠席#    test#                    
 0866e7cce7d8703e51db8f8df2ba8fed#3d5abdbcf1b86ce0##        #                        
 ee7eeaf197c7b4c947b8d04d18dfac66#53cfd8534f573032#出席#    yoro#                    
 2cbb3767e6abdc4547b8d04d18dfac66#3d5abdbcf1b86ce0##        #                        

そこそこ見やすい。

_ ニプロン

お。ニプロンで検索された方が居る。さすが tDiary 。

本日のツッコミ(全1件) [ツッコミを入れる]

# かねみつ [Divさっぱりわかりまへん。面白そうなので、ドキュメント書いてください。本にしましょう。]


2003-01-07 [長年日記]

_ Div

Divの考え方はシンプルですよ。 ずっと生きてる App, SessionDB, Model の部分。 お客さんごとに作られる Session, Div, View の部分。 HTTP request, response をまとめた Context の部分。 ずっと生きてる奴 - お客さんごとの奴 - HTTPの奴 をつなぐのが Cookie に入れる SessionID と Hint 。

Session は MVC のうち Control を持っている。この C が Div::Div 。 Div は App の中の Model, View との関連をもつ。M, V は普通 Singleton 。 Div は def_erb_method を使って V を出力するメソッドを持つ。 また Div は子供の Div を持つ。

_ Tofu

よく見るとこれは今の Div の説明ではないなあ。 Tofu に移った機能が多い。

私版 web.rb の説明 ( ただし Div::Div => Web::Producer ) と考えてください。

本日のツッコミ(全11件) [ツッコミを入れる]

Before...

# moriq [はい。DivはWEBrickに依存していないことは存じてます。 dRuby本では確かdiv-1.0.0以前でTofu..]

# かねみつ [c.cgiを実行させるだけではだめらしい。Time Outになる。]

# moriq [うひ。もちろんあらかじめサーバ(app.rb)は回しておかないとだめですよ〜。]

# かねみつ [ありゃ? ./list.rb:24:in `field_size=': undefined method `inje..]

# moriq [すみません。今日書いたとおりinjectは1.7以降ですね。私は1.8.0で動かしてます。]


2003-01-08 [長年日記]

_ mod_ruby

mod_rubyを入れなければ。Divならapache側Rubyプロセスへの影響は最小限に抑えられる。

_ 可変長文字列

DBの可変長文字列って普通どのように実装されるものなのでしょう。

_ mod_ruby

導入完了。 c.rbx 体感速度がかなり違います。 CGIContext が毎回作り直されることを確認できる。 CGI ではたまたま object_id が一緒だったようだ。

_ はじめ ruby を --enable-shared で作らずに mod_ruby を入れようとしたのですが mod_ruby の configure.rb に失敗しました。 @MODULE_LIB@ の展開がおかしい。 libruby.module が $(hdrdir)/-lrubylib こんなふうに。 調べていくとどうやら configure.rb の $LIBRUBYARG = "$(hdrdir)" + $LIBRUBYARG がまずいようです。

_ --enable-shared

結局 ruby を --enable-shared で作り直しました。mod_ruby は ruby.so で使えってことですかね。

ldconfig することを忘れて悩んだり。たまには Linux も触らないと全然だめです。 RPM の使い方がわからんし。

_ version

  • ruby-1.8.0-preview1.tar.gz
  • drb-1.3.8.tar.gz
  • apache-devel-1.3.27-2.i386.rpm
  • mod_ruby-1.0.2.tar.gz

2003-01-10 [長年日記]

_ Div

今度はDBMを使ってみた。RuBBSのまねっこ。 ruby archive app-013.tgz ファイル形式をいろいろ変えてみているが、オンメモリでの運用では、実際ファイルにどのような形式で保存するのかということはあまり問題ではなくなる。 そのかわり重要になる問題がある。
  • どの時点でファイルに書き込むのか
  • どの時点でファイルから読み込むのか
  • どの時点でメモリから消去するのか

_ データ書き込み時に常にファイルに書き込み、データ読み込み時に常にファイルから読み込むのであれば、メモリ上にデータを載せる意味は、検索と繰り返し処理の速度改善にしかない。繰り返し処理はデータ全体に対して行うので、処理開始直前にメモリ上にないデータはファイルから読み出さなければならない。

_ ファイルからデータを読み出しても、普通は、直接Controllerには渡さない。いったんItemオブジェクトに変換する。Itemオブジェクトがメモリ上のデータの格納形態となる。ControllerにItemオブジェクトそのものを渡すと、Itemオブジェクトの情報を書き換えてしまう恐れがある(あるいはdRubyのようにControllerがItem classを知らない場合もある)ので、普通はHashに変換して渡す。つまり String on File - Item on Memory - Hash on Controller という変換の流れがある。

_ さて、繰り返し処理はファイルが持つデータ全体に対して行うとは限らない。例えば、ひとつのファイルが複数のユーザに対するデータを持ち、各ユーザ間のデータは排他的である場合(各ユーザは自分のデータだけ扱う場合)、繰り返し処理は指定されたユーザに対するデータの集合に対して行えばよい。このような場合、単純な解決策としては、各ユーザがそれぞれ個別のファイルを持つという構造にする方法がある。

_ /*

この方法の短所は、複数のファイルを開く必要があること、メモリ構造が一段階複雑になることである。※そうでもない。単一ファイルでも、ユーザごとの切り分け処理を行う際には、メモリ構造は同程度の複雑さとなる。

*/

_ この方法の長所は、検索速度を稼げること、ユーザごとのデータの切り分けをファイルレベルで容易に行えることである。

単一ファイルでは、検索速度を稼ぐために index を張る必要が出てくる。

_ どの時点でファイルに書き込むのか

データを永続的に保存するためには、最終的にはファイルに保存しなければならない。

最も楽(効率的)で最も危険なのは、アプリケーションの終了時にのみファイルに書き込むという方法である。

最も安全で非効率なのは、メモリへ書き込む時に常にファイルに書き込む方法である。

その間を採るなら、ある時点(ほかの処理が行われていない時点が望ましい)でこれまでの変更の累積をファイルに書き出すという方法がある。

あるいはファイルを開きっぱなしにしておき、ファイルポインタの操作でやり繰りすれば、IOの速度が稼げる。

_ どの時点でファイルから読み込むのか

最初のロード時にファイル上の全てのデータをメモリに載せるなら問題ない。最も速度の効率がよく、最もメモリの効率が悪い。

最初のロード時にはメモリに載せず、必要になったときだけファイルから読み込みメモリに載せる方法がある。この方法では、繰り返し処理をどうするかという問題がある。繰り返し処理の直前に全てのデータを読み込むとして、その後どうすればよいだろうか。繰り返し処理が連続するのであればそのままメモリ上に載せておくべきであるし、用が済んだなら、以前のレベルまでメモリを解放したほうがよい。

つまり、メモリ上に遊んでいる(長い間アクセスされない)データを減らしたいわけである。

繰り返し処理でも、必ずしも全てのデータを一度にメモリに載せる必要はない。あるまとまりごとに処理してControllerにその都度返せばよい。メモリ使用のピークを抑えた転送方法が望まれる。

_ どの時点でメモリから消去するのか

これは、どの時点でファイルから読み込むのか、の裏返しの問題である。全てのデータをメモリに載せるなら消去する必要はない。メモリに載っていないデータを必要な時にロードするというのが先の問題であった。今回は不要なメモリ上のデータをいつファイルに書き出していつ消去するのかという問題である。どのように不要なデータを見つけるのかと言い換えてもよい。

まず思いつくのは、データに更新時刻情報を持たせ、古いデータを見つけ出せるようにするという方法である。この方法は長い間放置されているデータをファイルに戻すのに使える。

/*

しかし、繰り返し処理の際には全てのデータに触ることになるから、更新時刻情報は役に立たない。※そんなことはない。

*/

_ 結局

PStore, DBM, DBI, TextFile,... どれも一長一短のようだ。

_ なげーよ

_ Div on CGI

誤解を解いておこう。咳さんのDivはWebrickに対応しているが独立している。 div/sample/first を CGI で動かすには次のように

# app.rb
if __FILE__ == $0
  require 'drb/drb'
  require 'tofu/proxy'
  require 'yourapp'
  
  tofu = Tofu::Bartender.new(YourTofuSession)
  DRb.start_service('druby://localhost:7642', tofu)
  DRb.thread.join
end

用意して

ruby -vd app.rb

で起動しておく。 div/sample/app/div-cgi.rb を CGI プログラムとして動かせば(環境によってはファイル名を変更する必要があるかもしれない) YourTofuSession にアクセスできる。

_ TofuのうちWebrickに依存するのはTofuletのみである。TofuはDivから独立している。Tofu::ContextMixinを元にContext classを作る。配布されているContext classのうちCGI向けがCGIContextでWebrick向けがTofuletである。

_ (これで合ってるかな?)

理解を難しくしているのはたぶん Tofu という名前です。^^;

本日のツッコミ(全2件) [ツッコミを入れる]

# たむら [Tofu の名前自体が、WEBrick の Brick(レンガ)のやわらかいのから来てますからね。Div(Tofu)..]

#  [読んだのを忘れるにはWeakRefとかどうかなあ。 そういえばRWikiは毎回ファイルに書くけど、読むのは一度です..]


2003-01-11 [長年日記]

_ 究極インストーラ

なひさんのチュートリアル(あチュートリアルでは決してないのですね^^;)を読みながらSOAP4Rを試す。日本語で書いてもらえるありがたさ。

SOAP4Rを試す場合に問題なのはいろいろなライブラリをインストールしないといけないこと。LoadErrorを関知感知して勝手にRAAを見に行って勝手にパッケージを落としてきて(もちろんソースパッケージとバイナリパッケージは選べてwin32だったらebanさんとことかうささんとこから取ってきてくれるに違いない)勝手にインストールしてくれて勝手に実行をリトライしてくれてついでにObject#id,typeの警告を元に警告が出ないように修正してくれるインストーラを切にきぼー。

あとバージョン管理もしてくれたほうが良いね。

あとついでに Google Web APIs license key も勝手に取得してくれると…

_ Ruby/MySQL on ruby 1.8.0 (2002-12-25) [i386-mswin32]

用意したもの。

  • http://www.softagency.co.jp/MySQL/Downloads/MySQL-3.23/mysql-3.23.54-win.zip
  • http://www.tmtm.org/ja/mysql/ruby/mysql-ruby-2.4.3b.tar.gz

展開しておく。 extconf.rb の修正。find_library では header を指定できないし have_func では lib を指定できない($libs が使われる)。どうなってるのかよくわからん。

#find_library('mysqlclient', 'mysql_query', lib, "#{lib}/mysql") or exit 1
have_library('libmySQL') # assign $libs
have_func('mysql_query', inc+'/mysql.h') or exit 1

あと

create_makefile("mysql")

以降のごにょごにょした部分は eMysql の定数定義を自動化したもので、私の環境ではうまく動かなかったので削除。代わりに mysql/include 上で作るようにした。

# errsym.rb
error_syms = []
 
f = open('errmsg.h')
while line = f.gets
  if /^#define\s+(CR_[A-Z_]+)/ =~ line
    error_syms.push $1
  end
end
 
f = open('mysqld_error.h')
while line = f.gets
  if /^#define\s+(ER_[A-Z_]+)/ =~ line
    error_syms.push $1
  end
end
 
error_syms.each do |s|
  puts %Q(    rb_define_const(eMysql, "#{s}", INT2NUM(#{s}));)
end

これで作った定義を mysql.c の /* MysqlError constant */ 以降に貼り付け。

$ ruby extconf.rb --with-mysql-include=c:/mysql/include --with-mysql-lib=c:/mysql/lib/opt

Makefile ができた。 nmake 。 まだだめ。

#ifndef str2cstr
	TypeError("invalid type, required true or false.");
#else
        rb_raise(rb_eTypeError, "invalid type, required true or false.");
#endif
 
#ifndef str2cstr
        Raise(eMysql, "%d: out of range (max: %d)", n, max-1);
#else
        rb_raise(eMysql, "%d: out of range (max: %d)", n, max-1);
#endif

この謎な処理の #ifndef str2cstr 側を削除。 これで mysql.so が作れた。 mysql/bin/winmysqladmin.exe を起動しておく。ユーザ名とパスワードを確認。

$ ruby -I. ./test.rb localhost user password
connect.............ok
create_db...........ok
create_table........ok
insert..............ok
select..............ok
update..............ok
drop_table..........ok
drop_db.............ok
close...............ok

動くようだ。

_ Ruby/MySQL on ruby 1.8.0 (2002-12-24) [i686-linux]

やはり extconf.rb でこける。

CPPOUTFILE.replace '-o confout'
try_cpp(src)

try_cpp の仕様が変わったのだろうか?

_ mkmf.rb

mkmf.rb は --enable-shared であっても -lruby-static でチェックする。 libruby-static.a を消去していたのではまった。

本日のツッコミ(全3件) [ツッコミを入れる]

# たむら [ぬぅ〜。Ruby/MySQL for Winも久しぶりにリリースしなきゃかな。]

# moriq [最初たむらさんのパッチを参考にしようと思ったのですが今mingw入ってないんすよね。 むしろRuby APIの変化に..]

# たむら [なかたさんとか、わたなべさんの頭の中には入ってる気が(^^; 後、むとぽん氏が日記にいつかまとめてた気がして検索した..]


2003-01-12 [長年日記]

_ SOAP4R tut

RRRWiki - NaHi::SOAP4R で発見。 YARPC SOAP.pdf

_ 日曜

くっ。もう日曜か。早すぎる…

_ bRuby

bRubyを使ったらProcをMarshal.dumpできるようにならないだろうか?

できたらイベントハンドラもdumpできて嬉しい。構文木をコードに戻すこともできるようになるかもしれない。nodedumpを見る限りでは変数名も保持しているようだし…。

JavaScriptの関数オブジェクトがコードを表示できるのは単にソースをコピーしているからなのか?

Yuyaさんに期待。

_ Delphi:73894 TurboPower 社買収と OpenSource計画

: ここ数日米BorlandのNewsGroupで話題になっているようなのですが
: XMLPartnerなどのDelphi/C++Builderコンポーネントを販売している
: TurboPower社が、ゲーム会社の傘下に入り、その結果コンポーネントと
: 開発ツールの販売から撤退し、それらをOpenSource化するとのことです。

TurboPower

_ Proc dump

ちょっと試してみた。

class Object
  alias object_id id
end
require 'bruby'
class Proc
  def initialize
    @source = []
    @filename = "#{__FILE__}.#{self.object_id}.rbb"
  end
  def _dump(limit)
    source = @source.join
    filename = @filename
  p [source, filename] if $DEBUG
    raise unless BRb.verify(source, filename)
    BRb.dump(source, filename)
  end
  def cut_source(nline)
    lineno = caller(1)[0].split(/:/)[1].to_i
    lineno_range = (lineno-nline...lineno)
    @source.clear
    open(__FILE__) do |f|
      while line = f.gets
        @source.push line if lineno_range === f.lineno
      end
    end
    self
  end
  def self._load(str)
    BRb.load(str)
  end
end
p :outer
proc = Proc.new { |msg|
p :inner
  p(msg)
}
proc.cut_source 5
str = Marshal.dump(proc)
proc = nil
GC.start
obj = Marshal.load(str)
p obj
obj.call('ok')

BRb.loadがnilを返していたのでbruby.soをちょっと修正。Marshal.loadに合わせて、作ったオブジェクトを返したほうが使いやすいと思う。

--- BRb.cpp.orig	Mon Dec 23 15:59:30 2002
+++ BRb.cpp	Sun Jan 12 09:04:56 2003
@@ -160,9 +160,7 @@ rb_brb_s_load(VALUE obj, VALUE bytecode)
 
 	NODE* node = ::bruby_loadnode(bytecode);
 	VALUE self = ::rb_eval_string("self");
-	::rb_eval(self, node);
-
-	return Qnil;
+	return ::rb_eval(self, node);
 }
 
 static VALUE
@@ -171,9 +169,7 @@ rb_brb_s_loadfile(VALUE obj, VALUE filen
 	Check_Type(filename, T_STRING);
 
 	VALUE bytecode = ::bruby_read_file(filename);
-	::rb_brb_s_load(obj, bytecode);
-
-	return Qnil;
+	return ::rb_brb_s_load(obj, bytecode);
 }
 
 #endif

ソースを参照するこの方法はbRubyでなくてもできることに気づいた。

class Object
  alias object_id id
end
class Proc
  def initialize
    @source = []
    @lineno = caller(1)[0].split(/:/)[1].to_i
    @linend = nil
  end
  def _dump(limit)
    raise if @linend.nil?
    source = @source.join
  p source if $DEBUG
    source
  end
  def cut_source
    @linend = caller(1)[0].split(/:/)[1].to_i
    lineno_range = (@lineno ... @linend)
  p lineno_range if $DEBUG
    @source.clear
    open(__FILE__) do |f|
      while line = f.gets
        @source.push line if lineno_range === f.lineno
      end
    end
    self
  end
  def self._load(source)
    eval(source)
  end
end
p :outer
proc1 = Proc.new { |msg|
p :inner
  p(msg)
}
proc1.cut_source
str = Marshal.dump(proc1)
proc1 = nil
GC.start
obj = Marshal.load(str)
p obj
obj.call('ok')

Proc#cut_sourceを自動化できれば…。bindingは考えていない。

_ _dump_data

$ ruby -v
ruby 1.8.0 (2002-12-25) [i386-mswin32]
$ type proc1.rb
str = Marshal.dump(proc {})
p str
$ ruby proc1.rb
proc1.rb:1:in `dump': class Proc needs to have instance method `_dump_data' (TypeError)
        from proc1.rb:1
$ type bind1.rb
str = Marshal.dump(binding)
p str
$ ruby bind1.rb
bind1.rb:1:in `dump': class Binding needs to have instance method `_dump_data' (TypeError)
        from bind1.rb:1

T_DATAのときは_dump_data _load_dataということらしい。よくわからん。 ruby-man Marshal#dump のファイルに書き出せないオブジェクトには Binding が抜けてる。「など」に含まれるのかも。

本日のツッコミ(全2件) [ツッコミを入れる]

# Yuya [BRb.loadがQnilを返すのには何か理由があったような気がするのですが、思い出せないのでevalの結果を返すよ..]

# moriq [私の方法はload, requireと本質的に一緒なのであんまり役に立たないことに気づいた。^^;]


2003-01-13 [長年日記]

_ inject

Enumerable#inject は1.7以降ですかな。raa.rbに従って

unless Enumerable.instance_methods.include?('inject')
  module Enumerable
    def inject(init)
      result = init
      each do |item|
        result = yield(result, item)
      end
      result
    end
  
    def all?
      each do |item|
	return false unless yield(item)
      end
      true
    end
  end
end

とすればok。

_ つっこみmail

つっこみ時に教えてくれる機能を有効にした。

_ Apollo

# [ap-list:3045] リリース予定
: リリースが滞っておりまして申し訳ありません。
: 今週末には出すぞ! と気合だけ書いてみる。
: なお、リリース直後は確実に不安定です…

と書いてしまったのだが、全然追いつかない。難題は後回しにしよう…。

_ Perl2Ruby

ちょっと進んだ。人に伝えるための文章を書く能力が私には欠けている。

目次は書く前にきちんと決めないといけない。

実装の前にインターフェイス。ってことだな。

本日のツッコミ(全9件) [ツッコミを入れる]

Before...

# moriq [cgi.rbを読むとわかりますがENV['REQUEST_METHOD']が"GET", "HEAD", "POST..]

# moriq [以下をCGIとして実行してみていただけますか。普通なら (GET) と出るはずです。(Get) (get) とかなら..]

# かねみつ [なぜCtrl-Zが必要なんですか? CGIとして動かしても、そこで止まっていると思われます。]

# かねみつ [e.cgiでひとつ自分のおばかがわかりました。;*.cgiを実行するrubyに引数を渡してなかったのです。ばかばか。..]

# かねみつ [動きました。RubyLibもおかしかったです。 http://www.masao-k.net/app/c.cgi で..]


2003-01-14 [長年日記]

_ the Ruby Way (日本語版) errata

この正誤表に追加してもらうにはどうすればよいのだろう。

p.438
- # 暗号に対応する記事が...
+ # 番号に対応する記事が...
p.518
- rb(interactive Ruby)
+ irb(interactive Ruby)
p.530
- IO.rea
+ IO.read

rea て何をするものだろう? と悩んでしまった。 ruby-talk:9460

_ いいことありますぜ!

やた。まだ半日ある。期待しよう。

本日のツッコミ(全2件) [ツッコミを入れる]

# やまだあきら [errataのことを関係者に連絡しておきました。]

# moriq [ありがとうございます。]


2003-01-16 [長年日記]

_ the Ruby Way

p.151
- キューの基本的な操作はshiftとunshiftです。
+ キューの基本的な操作はpushとshiftです。

じゃないのかなあ。 原書でもshiftとunshiftになってるけど。

p.168 キューの基本的な2つの操作は、データを「キューに入れる(enqueue)」ことと「キューから取り出す(dequeue)」ことです。これらの操作に対応するArrayクラスのインスタンスメソッドは、それぞれpushとshiftまたはunshiftとpopという名前です。

この記述からすると

p.151
+ キューの基本的な操作はpushとshiftあるいはunshiftとpopの組で表現できます。

という感じかなあ。どうでしょ。


2003-01-18 [長年日記]

_ Apollo ap-636a

出した。余裕なし。 [ap-dev:0942]

_ 鯖管

Webサーバの管理って大変な仕事ですよねぇ。私がやったら穴だらけになるに違いない。


2003-01-19 [長年日記]

_ 第28期名人戦最終予選 観戦記

むう。これは生きてるのか。わからん。


2003-01-20 [長年日記]

_ 高松市内循環バス時刻表

やっと見つけた。でも画像(泣)。ばかやろー

と思ったが、時間間隔が一定なので簡単に作れることに気づいた。


2003-01-23 [長年日記]

_ 終わんねえ

仕事が終わらなくても福岡には行っちゃうよ〜

本日のツッコミ(全2件) [ツッコミを入れる]

# たむら [いぇ〜い♪]

# Yuya [いぇ〜い☆]


2003-01-27 [長年日記]

_ ゆんこむ

http://www.moriq.com/ は http://www.users.yun.co.jp/~moriq/ へ転送しているのだが、電源工事のためサーバが停止いたしておるそうじゃ。

サービス停止期間
平成15年1月24日(金) 19:00〜
平成15年1月27日(月) 10:00

むう。長い…

_ ふくらぐ

報告はたむらさんにお任せするとして。^^;

和んでお話できて楽しかった。お酒も飲めたし。

Yuyaさんの若さが羨ましい…。

永井さんに Ruby/Tk でリソースファイルを読むところを見せてもらった。 ruby-list:35326 あたりの話かな。なかなかしっくりくる感じ。私の WindowsME 環境では使う機会がないだろうけど…。

酔った頭で型ありRubyを妄想した。

_ UDP 1434

朝日新聞にもちょろっと載ってた。

http://www.microsoft.com/japan/technet/security/virus/sqlslam.asp

ということらしい。