CAKE(6)                      FreeBSD Games Manual                      CAKE(6)



NAME

     ふりぽけ日記 - 2001年07月



SYNOPSIS

     cake [-vd] [garbage-in garbage-out]



DESCRIPTION

     Cakeは駄文製造プログラムです。一般に、ゴミを入力するとゴミを出力す

     る、とされています。



OPTIONS

     なにも指定をせずに立ち上げると、標準入力(/dev/ear)から読んで標準出

     力(/dev/mouth) に書こうとします。(放っておくと、ずっとそのままで入力を

     待っています。)入力ファイルと出力ファイルを指定すると、それらを読み書き

     します。



     -v オプションを指定すると、何をやっているのか細かく報告します。

     -d オプションはデバッグモードです。





2001.07.02 Mon :

   memo :



     UMLリファレンス(http://www.ogis-uml-university.com/reference/index.htm)





   画餅はいいものだ。 :



     画餅さえあえばあと10年は…(ごきゅ)



     リクエスト⇒レスポンスという単位で画面が遷移していく(和訳:ダサい)Webベ

     ースのアプリを作るに当たって、問題領域外のクラスをどういう考え方で設計し

     ていくかが自分的な課題だった。



     それが今日、

     UMLチュートリアル(http://www.ogis-uml-university.com/tutorial/index.htm)

     を読んでいたら、ひとつのユースケースについてひとつのコントローラーを配置

     すればいいと書いてあり、目からウロコ。



     そうすると、クライアントとアプリケーションの間でやりとりされるリクエスト

     ⇔レスポンスを、アクターからアプリケーションへ投げられるメッセージとその

     返り値という風に捉えて、ひとつの業務の流れについて、一つのコントローラが

     状態(=画面)の遷移をコントロールするという考え方になる。



     基底クラスWebAppControlerとかいうのを一つ作って、派生させてくるくる切替え

     るのがよさそう。:D





   WebAppControlerに必要とされる機能は… :



     クライアントからのリクエストデータを受け取る



     パラメータを解釈し、必要に応じてエンティティクラスのオブジェクトにデータ

     の処理メッセージを投げる。



     リクエストのパラメータと内部状態から、次の状態に遷移する。



     必要に応じてバウンダリクラス(各エンティティに対応したHTML生成用クラス)

     に依頼して具体的な表示内容を生成してもらい、クライアントにレスポンスを返

     す。



     …という感じ?

      うまく設計しないとゴチャゴチャ(和訳:手続き指向への世界にようこそ)にな

     りそうだな。



2001.07.06 Fri :

   うーむ :



     現在設計中の歌詞映写システムが、教会で毎週毎週の礼拝に使われ、末永く活用

     されることを考えると、使い勝手を中心にちょこちょこ手が入ることは間違いな

     い。



     そしてそのメンテナンスを担当するのは、確実に作った本人(つまり僕)。お気

     楽にスパゲッティなものを作ってしまえばツケは自分に跳ね返ってくるというわ

     けだ。



     現在テストコードをぼちぼち書いている。



     昨日までの作業で、Stateパターンを使って画面遷移をコントロールするところま

     では一応できた。





     <?php



     class Context {

       var $state;



       function Context() {

         $this->state = new State();

       }

       function request($fParm) {

         $this->state->handle($this, $fParm);

       }

       function setState($st) {

         $this->state = $st;

       }

     }



     class State { /* ABSTRUCT */ }



     /* ------------------------------------------------------------ */



     class TheApplication extends Context {

       var $userID;

       var $passwd;



       function TheApplication() {

         $this->state = new SystemStart();

       }



       function drawScreen($screen){

         require($screen);

       }



       function setuser($usr, $pass) {

         $this->userID = $usr;

         $this->passwd = $pass;

       }

       function unsetuser() {

         $this->userID = "";

         $this->passwd = "";

       }

       function isVaridUser() {

         if ($this->userID == "yama" && $this->passwd == "kawa")

           return true;

         else

           return false;

       }

     }



     // ユーザー情報を初期化し、ログイン画面を表示

     class SystemStart extends State {

       function handle($context, $fParm) {

         $context->unsetUser();

         $context->drawScreen("UserLogin.php");

         $context->setState(new UserLogin());

       }

     }



     // 入力されたユーザー名、パスワードが合っているかチェック

     // 合っていればシステムメニュー画面

     // 間違っていればエラー再ログイン画面を表示

     class UserLogin extends State {

       function handle($context, $fParm) {

         $context->setUser($fParm[0], $fParm[1]);

         if ($context->isVaridUser()) {

           $context->drawScreen("SystemMenu.php"); // 実際のページを呼び出す

           $context->setState(new SystemMenu());

         }

         else {

           $context->drawScreen("LoginInvalid.php"); // 実際のページを呼び出す

           $context->setState(new SystemStart());

         }

       }

     }



     // 押されたボタンによって、それぞれの業務画面を表示

     class SystemMenu extends State {

       function handle($context, $fParm) {

         :

         :

       }

     }



     /* ------------------------------------------------------------ */



     session_start();

     if (!isset($context)) {

       $context = new TheApplication();

       session_register("context");

     }

     $context->request($fParm);



     exit;



     ?>



     コンテキストオブジェクトをセッション変数に保存することで、一つのURLにアク

     セスするたびに画面は切り替わる。



2001.07.12 Thu :

   memo :



     PhpUnit(http://phpunit.sourceforge.net/)

     JUnitを元にしているらしい。



     なーんか「作った」というだけで、ドキュメントもサンプルも全くないくさい。



     どーやって使うのだ〜。





2001.07.13 Fri :

   PhpUnit :



     間違えて古いバージョンをダウンロードしていたらしい。最新の版にはサンプル

     はあった。



     それを見ると使い方はおおむね JUnit と同じのようだ。





   今日、目に留まった聖句 :





     ピリピ 4:6-7



      何も思い煩わないで、あらゆるばあいに、感謝をもってささげる祈りと願いに

     よって、あなたがたの願い事を神に知っていただきなさい。



      そうすれば、人のすべての考えにまさる神の平安が、あなたがたの心と思いをキ

     リスト・イエスにあって守ってくれます。



     ピリピ 4:8



      最後に、兄弟たち。すべての真実なこと、すべての誉れあること、すべての正し

     いこと、すべての清いこと、すべての愛すべきこと、すべての評判の良いこと、

     そのほか徳と言われること、称賛に値することがあるならば、そのようなことに

     心を留めなさい。





2001.07.14 Sat :

   IIOSS :



     Linux Japan で見た、UML ベースでの設計やインターフェースの構築などが行え

     る Java 統合開発環境。

     IIOSS(http://www.iioss.org/)

     ROSEの7〜8割方の機能をカバーするらしい。



     UMLとJavaのコードを相互に変換できるとのこと。





2001.07.17 Tue :

   ぐるぐる :



     けっぴさんのWatchingシリーズを最初から全部読む。



     くぅ。





   JScript(WSH) :



     で、ワードの機械的な作業を自動化するスクリプトを書いた。



     機械的な作業というのは、ワードの文書をHTML形式で保存しなおすというもの。

     数が膨大なので、とてもじゃないがやってられないっす。



     作業したい文書のあるフォルダに置き、ダブルクリックするとあとは全部やって

     くれる。





     var fs = WScript.CreateObject("Scripting.FileSystemObject");

     var cwd = fs.GetFolder(".");



     var wordApp = WScript.CreateObject("Word.Application");

     wordApp.Visible = true;



     for(var i = new Enumerator(cwd.Files); !i.atEnd(); i.moveNext()) {

       var path = i.item().Path;

       if(path.match(/\.doc$/i))

         ProccesFile(path);

     }



     function ProccesFile(path) {

       var nameAsHTML = path.replace(/\.doc$/i, ".html");

       var aDocument = wordApp.Documents.Open(path);

       aDocument.SaveAs(nameAsHTML, 8); //wdFormatHTML

       aDocument.Close();

     }



      …知らなかったよ。JavaScriptって、イテレータや正規表現が使えるんだね。カ

     コイイ!



     本当はこの後、Msxmlオブジェクトを使って HTML化したファイルから必要なタグ

     だけ抽出してやろうと思ったんだけど、





     var doc = WScript.CreateObject("MSXML.DOMDocument");

     doc.async = false;

     doc.load('sample.html');



     var error = doc.parseError;

     if (error.errorCode != 0) {

       var errMsg = error.line + ":" + error.linepos + ": " + error.reason;

       WScript.Echo(errMsg);

     }



     としてテストしてみると。



           「リテラル文字列が必要ですが、開始の引用符が見つかりません」





     Σ( ̄□ ̄;) XHTML準拠じゃなかったのか。<中身を見れば分かります。



     これができたら、Windowsの標準的なツールだけで処理が全部完結したのに〜。

     ユーザーの環境にスクリプトだけコピーしてダブルクリック、という夢が〜。



     あ、もしかして外部のスクリプトからCOM経由でIEのDOMをいじれるたりするか

     な?

     今度やってみよ。





2001.07.19 Thu :

   PHPrequireinclude :



     requireを使うと(http://www.pjam.jpweb.net/ishida/another/200107.html#10)

     require元がメソッドならば $this が使えるというちょっとうれしい副作用があ

     ります。



     僕は自分自身へフォームデータを送る時、



     <form method="post" action="<?php $this->printURL() ?>">



     としています。



     何も考えずにrequire()使ってたけど、今考えると、なんかinclude()の方が安

     全っぽい気がするなあ。





   ページ共通のヘッダ、フッタ :



     こんなやつでいいのかな。



     class Context {

       var $_header;

       var $_footer;

        :

       function getHeader() { return $this->_header; }

       function getFooter() { return $this->_footer; }

        :

       function drawScreen($body) {

         include($this->getHeader());

         include($body);

         include($this->getFooter());

       }

        :

     }





   RDBMS :



     データベースのエンジンを、PostgreSQLとMySQLのどちらにしようか迷っている。



     PostgreSQLって、機能は充実してるんだけど、たくさん UPDATE すると vacuum

     する必要があるらしいので、メンテナンスフリーというわけにはいかないのが

     ちょっといやん。



     気が付くと、MySQLのほうも

     トランザクション(http://www.mysql.gr.jp/jpdoc/3.23/manual.ja_Reference.html#COMMIT)

     をサポートするようになってるし。



     知らなかった。でも BDB ってバークレイDBMそのものらしい。 RDBMSの更にバッ

     クエンドにDBMが使われるとは…。





2001.07.21 Sat :

   少年ナイフ :



     いつも Referer: 統計の上位に少年ナイフのサイトが入っていたので、誰だろう

     と思っていたら、

     ここ(http://www.st.ryukoku.ac.jp/~kjm/security/memo/referer.html)

     から

     Proxomitron-J(http://www.pluto.dti.ne.jp/~tengu/proxomitron/)

     だと判明。なんか紛らわしいなあ。





   gmake :



     「入ります ディレクトリ」「出ます ディレクトリ」



     「に対して行うべき事はありません」



     実際自分のマシンで表示されると、なんかムカつく。





   ports :



     cvsupで最新のを持って来ているのに、どうもmakeするとバージョン古いよエラー

     が出る。



     思い切ってエラーの出た /usr/ports/devel をディレクトリごと削除したら

     makeできるようになった。



     古いファイルがのこっていたらしい。





2001.07.23 Mon :

   ルビとローマ字読み :



     賛美歌詞映写システムで、漢字のふりがなをルビ表示し、日本語の読みをローマ

     字表示するという要件があった。



     最初はXMLで本文、ふりがな、ローマ字読みを構造化してDBに登録しようかとも

     思ったんだけど、下記のような簡単なアプローチでも充分効果的であることが分

     かったのでXMLはヤメ。



     初期移行データがWordのDOCファイル(ルビつき)で大量にあるので、

     (Word -> HTML形式で保存 -> IEで読み込み -> テキスト形式で保存)

     …という手順で整形してから移行する。



     DBに格納する文字列のイメージ。



       $str = "こんな漢字(かんじ)仮名(かな)入(い)り交(ま)じった文章(ぶんしょう)を処理(しょり)する。";



     マルチバイト正規表現関数でRUBYタグに変換



       $ruby_str = mbereg_replace( "([亜-熙]+)\(([ぁ-ん]+)\)","<RUBY>\\1<RT>\\2</RT></RUBY>", $str);



     同じく仮名だけ抽出



       $kana_str = mbereg_replace( "([亜-熙]+)\(([ぁ-ん]+)\)", "\\2", $str);



     これをphp4用kakashiモジュール(*)で処理すればローマ字読みもバッチリ



       $roman_str = kakasi($kana_str, array("-Ha", "-Ka", "-Ja", "-Ea", "-ka"));



       (*)  http://katayama-www.cs.titech.ac.jp/~horikawa/php3/php4_install.html



     更に、登録時にkakasiを使って自動で「漢字」⇒「漢字(かんじ)」と読みを付加

     させることも結構簡単だと思う。



     結果の質はkakasiの辞書に依存するけどね。語彙がキリスト教に偏っているの

     で、辞書のチューニングとか必要かも。





   myWiki :



     以前、PalmWiki と連係できる小さな Wiki を作ろうと書いたもの。



     構想では Windows で動き、Outlook のメモ帳と同期がとれ、自力で http を話す

     というものを作る予定だったのが、なぜか http-server の機能を作り込む前の段

     階で放置してしまっていた。



     もともとは「petitt wiki」という意味で pwiki という名前にしようと思ってた

     んだけど、某所で先を越されてしまったので(笑い)、別の名前を考えなく

     ちゃ。とりあえずmyWiki(仮称)とでもしておこう。



     myWiki(http://www.ops.dti.ne.jp/~cake-smd/prog/mywiki-0.0.tar.gz)



     フォーマッター、リポジトリ、CGI の3つのパーツに分かれていて、それぞれ交

     換可能。



     フォーマッターは、今のところYukiWikiMini 程度の簡単なもののみ。WikiName

     は [ ] で囲む。(PalmWikiに合わせて)



     リポジトリは、ファイルとディレクトリを使うもの、DBM を使うもの、それから

     アウトルックのメモ帳をデータベースとして使うものの3種類。



     CGI は普通の httpd から呼び出されるもののみ。





2001.07.24 Wed :

   Test First :



     PhpUnit を使って、ドメインクラスの実装を始めた。



     テスト・ファーストでリファクタリングしながら進めてみるつもり。



     PhpUnit は、やはり JUnit とおおむね同じ使い方ができるようだ。ちびっとい

     じってはテストする、というサイクルは、やっぱり楽。

     あと、先日 mod_php4-4.0.6_3 にバージョンを上げてみたところ、PEAR ライブラ

     リが以前より充実している。ざっと挙げると、



        Cache

        Mail

        Cache/Error

        Console/Getopt

        Crypt/CBC

        DB

        DB/common

        DB/storage

        File/Find

        Net/Curl

        Net/Dig

        Net/SMTP

        Net/Socket

        Numbers/Roman

        Payment/Verisign

        Schedule/At

        XML/Parser



     直接 extends PEAR しているクラスだけでもこれだけある。孫も入れるともう

     ちょっと多いかな。



     DB/mysql を使ってみたけど、接続時の文字列だけ入れ換えればほぼそのまま

     PostgreSQL に切替えられる。これは楽だ。





2001.07.30 Mon :

   間があいたけど :



     コードを書くのに没頭していると、日記が滞るのは仕方ないものだろうか。





   Java IDE初体験 :



     Forte for Java と VisualAge for Java をインストールして、チュートリアルを

     やってみた。



     チュートリアルは Forte についてきていたので、こちらで一通りやったあと、同

     じものを VA でも作ってみるというアプローチ。



     例題は、ラベルとボタンがひとつづつある JFrame が一枚あって、ボタンを押す

     たびにラベルの背景色が変わるというプログラム。



     Forte だと、 jButton1_on_click() なんていうメソッドの中で、



     jLabel1.setBackground(this.currentColor);

     とかやればいいだけなのが、VA だとJPanelとJButton, JLabel がBeanで接続(と

     いうのか?) されているので、アクセスするのにも一苦労。 Beanというものがよ

     くわかってないのでいまだにちゃんと動かない。 (色が変わらないのです。)



     それにメンバフィールドを追加するダイアログに、get/setメソッド追加というオ

     プションまであるし。あくまで大規模用のツールであってゴミプロ(hello

     worldとか)には向かないようだ。



     IDE内に履歴管理もあるし、使い方さえ覚えれば頼りにはなりそう。





   リファクタリング :



     この本、目から鱗がいっぱい落ちる。



     手順を真似しながら自前のコードをいじりはじめるとますます(鱗が)落ちる。



     で、感動の薄れぬうちにtodo/Tiki のリファクタリング頁を書き書き。

     調べてみるとJavaにもリファクタリングツールが出始めているようだ。

     jFactor(http://www.instantiations.com/jfactor/)

     IDEA(http://www.intellij.com/idea/)



     まだJUnitもインストールしていないのに…。





   IDEA :



     ダウンロード可能ということで早速試して見た。試用版ということで、8/20 まで

     しか使えないらしい。…くぅ。



     Forte for java で作った ColorSwitch.java を開いていろいろいじってみること

     にする。



     まず第一印象として、画面まわりはすっきりしていて使いやすい。画面全体がエ

     ディタとしてコードをばーんと表示していて、各ファイルはタブで切替えられ

     る。



     それに、プロジェクトなどのツリーは画面端のボーダーに埋め込まれた細いボタ

     ンを押すと、そのときだけポップアップする。邪魔にならず使う時は使いやす

     い。



     GUIのRADモードがないのは残念。



     しかしそのへんのメソッドをひょいと選んで、右クリックから簡単に javadoc を

     開いたり、 sun.com のリファレンスを開いたり、スーパークラスのメソッドに飛

     んだりと、かなり快適な感じ。



     目玉のリファクタリング機能ということで、試しに Extract Method を実行して

     みたら、抽出する部分が単純すぎたのか、渡す引数も返す値もないメソッドに

     なってしまった。つまり、抽出して作る新しいメソッドの名前を聞かれて答えた

     らそれで終り。



     あれ? もう終ったの? という感じ。すごいね。









SEE ALSO

     Top(1), PocketBSD(1), シュミプロ(1),

     ぽめれちょう掲示板(3),

     きまたま日記(6), 過去日記インデックス(1)



AUTHOR

     Cake(SHIMADA Keiki)



BUGS

     IE 4.0 以降や Netscape Navigator 6 以降などよりも、単純な VT 端末やライン

     プリンタからの出力のほうが見やすいかも知れません。



     この日記に書かれた内容が客観的に正しいという保証はありません。また、内容

     が予告なく変更されることもあります。



     Sorry, This page is English free.



nroff nikki system 0.01         August 6, 2001                               9