2001-04-01 (Sun)
Web検索フォームの強化の続き。All About Japanを追加など。
Web検索フォームの強化の続き。All About Japanを追加など。
打ち合わせのあと,証券会社の人と飲みに行く,というか接待か? 食事のあと新地のラウンジ。うーん,コストパフォーマンス悪そう。お酒はよいが,きれいな人が横に付く必然性が分からない。
昼からハービスへお出かけ。棚卸しの立ち会い。帰りにハービスの地下でケーキセットを食べたり。
Web掲示板の新版を公開。添付ファイル機能がセキュリティ・エラーになってた。なかなか厳しい。
仕事帰りに大阪城公園で花見。大阪城がえらくきれいになってる。その後鶴橋に出て焼き肉。服が焼き肉臭い。
来週から異動。経理室から経営戦略室ですって。実際には13年3月期の決算が終わってからかしら。なんか社長直属の部署ですが,はて,何する?
今週,えらく腰痛が痛かったので接骨院へ。伸ばしてもらう。
今日事業計画発表会があって,それで来てた拠点長を交えて飲みに行ったり。
2001.02.25/mailform メールフォーム の続き。
スクリプト自体は前のままでいいが,INJECTORは次のようになる。
INJECTOR = "/usr/sbin/sendmail -i #{MAILTO}"
qmailの場合はこう;
INJECTOR = '/var/qmail/bin/qmail-inject'
いずれもフルパスで指定する。
Webカレンダー/予定表を公開。この手のサービスは最近よくあるけど,一覧表示がほしかった。
v1.0までに次の機能を付けたい;
次はWebメモ帳の制作。手描き機能を付けたい。すなわち,poo siteにあるお絵かき掲示板のように,画像をサーバーに保存する。
ただ,用途としては絵よりも図なので,ベクトルデータとして保存したいところ。まぁ,使い勝手による。
2001.04.14/java ちょー手抜きお絵描きアプレット
仕事帰りに飲んだり。ゲーセンでボクシングゲーム。なかなか楽し。
NTTコミュニケーションズからマイラインの電話勧誘を受ける。NTTグループは104オペレーターを動員できてよいね。
こんなの。
普通の子として生まれる。だが後にあんなことになろうとはこの時だれも予測できなかった。
8歳の時のとあるテスト中に、銭形平次のテーマが頭から離れず、苦悩する。
堀川は15歳のときに、自分がシーマンであることに気づく。
22歳の夏、商店街の福引きで50万円分の目覚まし時計をゲット。とてもうるさい。
殺された親友「飛鳥 五郎」の仇を討つ為、さすらいの旅に出たのは26歳の時であった。
仮面ライダーに憧れ、改造手術を受けるがベンキーマンにされてしまう。
このころ、月にかわっておしおきされMに目覚める。
シーマン堀川の初恋は39歳の冬の日の事だったという。
46歳、光の届かない場所に住むことになり、光合成ができなくなる。
修行に修行を重ね、47歳にして念願の青汁のソムリエになる。このことは没後発見された彼の日記にも記されている。
シーマン堀川の遺言、「ああっ、たまらんっ」という言葉が宇治拾遺物語集にのこされている。
あるいはこんなの。
誕生するが、じつは3人目だった(何が?(^^;)。
ついに念願のテレフォンショッキングに登場。しかし友達がいなかったため、最終回となってしまった。
> 転送が中断されました! (注:これは伝説(の一部)です。)
素手で暴走SLを止めたのは20歳の頃。若かった・・・
21歳にしてついに悟りを開くものの、「またレベル1からは嫌だ」と言って結局、賢者になるのを断念。この模様は世界25ヶ国に衛星生中継された。
29歳のとき、非難勧告が出た為、韓国へ避難する。
36歳で株式会社堀川を設立し、世界的に有名になる。
37歳の時、念願のガンダムのパイロットになる。しかし実はニュータイプではなく、ニューハーフだった。
その件について後に本人は「ああ、そんなこともあったね」と引きつった笑顔で言った。(注:実際には僅差でダメだったようだ)
59歳、3本足打法を駆使してホームラン王に!
堀川62歳、鳩時計ならぬ「堀川時計」を作るも、当然のごとく売れなかった。
堀川が63歳の時、朝目覚めると「さなぎ」になっていた。このころ、アリンコを食べるようになる。
最後は「ゾーマを倒す」と言って旅に出たが、戻っては来なかった。
何がなんだか。
うゎ安!
守護天使を占ってみる。アニエル,ビズアですって。誰それ?
速攻で作った超手抜きお絵描きアプレット。というか未完成。
久々にForte for Java CEで作ってみた。フォームにコンポーネントを貼っていくだけなので,慣れればラクチン。Forte for Java
ポイントはサーバーにデータを送信するところ。アプレットは,ダウンロードしてきたサーバーにしか接続できないが,同じサーバーの異なるファイルにはアクセスできる。そこで,upload.cgiを同じサーバーに置いて,こちらにHTTPリクエストとともに絵のデータを送る。
サーバーに送信するところは次のようになっている。
167: // サーバーに送信 168: URL base = getCodeBase(); 169: String host = base.getHost(); 170: int port = base.getPort() == -1 ? 80 : base.getPort(); 171: String cgi = "/~hori/Scribble/upload.cgi"; 172: 173: Socket sock = new Socket(host, port); 174: BufferedReader from_serv = new BufferedReader( new InputStreamReader(sock.getInputStream())); 175: PrintWriter to_serv = new PrintWriter(sock.getOutputStream()); 176: 177: to_serv.print("POST " + cgi + " HTTP/1.1\r\n"); 178: to_serv.print("Host: " + host + ":" + port + "\r\n"); 179: to_serv.print("Content-Type: multipart/form-data; boundary=\"" + boundary + "\"\r\n"); 180: to_serv.print("Content-Length: " + sw.size() + "\r\n"); 181: to_serv.print("Connection: close\r\n"); 182: to_serv.print("\r\n"); 183: to_serv.flush(); 184: sock.getOutputStream().write(sw.toByteArray()); 185: sock.getOutputStream().flush(); 186: 187: // 結果を読む 188: String s = from_serv.readLine(); 189: 190: to_serv.close(); 191: from_serv.close(); 192: 193: Vector r = splitString(s, " "); 194: // if (new Integer((String) r.elementAt(1)).intValue() == 200) 195: // getAppletContext().showDocument(new URL("http://orange/~hori/"));
host, portはこのアプレットがあったWebサーバーとする。getCodeBase()から得られる。Javaではcharとbyteとが全く別物でバイト列を扱いたいとき少し面倒。データの中身はバイト列なので,Socket.getOutputStream()で得られるOutputStreamインスタンスを直接利用している。
Content-LengthヘッダーはApacheでは必須。このヘッダがないとCGIにデータが渡らない。
うーん,自分でこのまま作ってもいいけど,こんなのがある。
Javaなお子様的HP
えーっと,何? よく分かりませんが,とにかく,ここから入手できるPaintBBSがなかなかのもの。クライアントはこれを使って,サーバー側だけ作るのが早そう。
昨日は春物の服と時計でも物色しようかと昼から難波へ。心斎橋まで歩いたり。結局,梅田のユニクロでお買い物。何なんだ。
その後飲みに行って,日本酒とかワインとか。
今日,案の定お酒が残って,昼まで気持ち悪い。
土曜出勤の代休でお休み。
9時ぐらいに起きて,溜まってたメールを捌いたり,CDをMDにダビングしたり。
『金融工学のマネジメント』完読。管理職向けの本でテクニカルな話はあまり出てこない。事業などの評価にオプションの考え方が有効なのを示している。例えば,研究開発は,将来大規模投資を行うオブションを与えるので,その価値を考慮して評価しなければならない。
Web日記の表示を軽くしてみた。Web検索にシソーラスthesaurus辞典と郵便番号検索を追加。
2時過ぎぐらいからお出かけ。時計をゲット(喜) ブライトリングBreitlingが欲しかったけど,そういうのはもっと稼ぐようになってからにして,シチズンXCのクロノグラフモデルにしてみた。
レンタルビデオ屋でミッション:インポッシブル2/MISSION:IMPOSSIBLE 2,60セカンズ/GONE IN 60 SECONDSを借りたり。
トム・クルーズ (asイーサン・ハント) 素敵すぎ! ただ,この映画,漢(おとこ)対漢の死闘であって,ロマンスはあまり感じない。
今日はなんだかとっても充実。
固定IPアドレスをくれるプロバイダで安いところないかしら。
Ruby関連のソフトをいくつかインストール。
Webベースでデータを蓄積する(例えばアドレス帳とか)のに,Wikiクローンが使えるか。ちょっと触った感じだと,編集が簡単なのはいいけど,深い木を掘ろうとするとやや面倒。
ERbはJSP, PHPなどと同様,HTMLにRubyスクリプトを埋め込むためのソフトウェア。小さい埋め込みRubyスクリプトは書いたことあるけど,まだ実際に取り入れたことはないので,規模を大きくして試してみる必要がありそう。
PerlメモはRubyにも大いに応用が利く。
『60セカンズ』を観る。夕方からスノボークラブで焼き肉,ボーリング。
昼に起きる。Web日記を大幅に書き換え。カテゴリ別に一覧できるようにした。
SDBMはdbm.so, gdbm.soが使えない環境でも使えてポータビリティが高いが,値の長さが1,000バイトまでと非常に制約が大きい。
結局,Web日記ではPStoreを使うことにした。
スクロールバーに色を付けてるWebサイトがいくつかあって,なかなか面白い効果があるので,調べてみたり。
IE 5.5以降のみで有効な独自プロパティらしい。
トップページのソフト一覧表の見栄えをいじったり。あとWeb日記にバグがあったので,ちょい修正。
帰りにマクドを買って家で食べる夕ご飯。
複数のプロセスでPStoreデータベースを共有するときの排他処理はどうなっているか試してみる。
2: require 'pstore' 3: 4: def test_ps(db) 5: (1..1000).each {|i| 6: db.transaction do 7: db['x'] = db['x'] + 1 8: end 9: print i, "\n" if (i % 100) == 0 10: } 11: db.transaction do 12: print "result = #{db['x']}\n" 13: end 14: end 15: 16: db = PStore.new("pst") 17: db.transaction do 18: db['x'] = 0 19: end 20: fork 21: test_ps(db)
DBMを使う場合のネックは,値を書き換えるときに,データベースをロックする方法が提供されていないこと。そのため,ロックファイルを別に用意する必要がある。
PStoreではtransactionブロックで囲むと排他処理される。上記のサンプルの実行結果:
~/ruby$ ruby pst.rb 100 100 200 200 300 300 (中略) 800 800 900 900 1000 result = 1928 1000 result = 2000
二つのプロセスの書き換えが同時に起こっていないことが分かる。
退職給付会計の伝票を切ったり。年金資産が目減りしてる。最近の新しい会計基準は何でも時価だねぇ。
中長期経営計画の会議。なんか色々なのに出てますな。
帰りにラーメン。何でもだが,特に人を評価する行為は,評価する人間の能力の方が問われると思う。
ツールを効果的に使えば,かなりの部分は補えると思う。
関係会社間の債権債務照合表を作ったり。しかし決算を4月中に終わらせるのってなかなか厳しい。今回はゴールデンウィーク直後ぐらいまでかしら。
附属明細書の下準備。
Rubyスクリプトのキーワード,コメント,文字列に色を付けるスクリプト;rb2html.rb
2001.04.30/r rb2htmlを更新
昨日は夕方から難波。院の同じ講座の人間と3年ぶりに飲んだり。で,朝帰り。今日は5時半まで爆寝。
キャバクラこの年にして初体験。しかもハシゴ。
プロフィールの頁に略歴を追加してみたり。履歴書や職務経歴書を書くときにいちいち変換するのがめんどくさい。いや,書きませんが。
Rubyでは文字列をいろいろな記法で表すことができる。rb2htmlでは一部分のみ実装している。次のもの;
配列式は%w(foo bar hoge)と書いて,["foo", "bar", "hoge"]と同じ意味になる。定数を羅列するときに便利。
ところで,Rubyでは文字列に#{}で囲んで式を入れることができる。この中に文字列を書きたいときはどうするか。
print "foo #{1 ? "HOGE" : "hoge"} bar" # => parse error
#{}内も文字列としてパースされるので,エスケープしないといけない。
7: print "foo #{1 ? \"HOGE\" : \"hoge\"} bar\n"
#{}の入れ子もできる;
10: print "foo #{1 ? \"Hi #{3 * 2}\" : \"hoge #{5 * 10}\"} bar\n"
でもリテラルをこんなに複雑に書いても嬉しくない。