[ Date: 2007年07月15日 / Modified: 2007年07月15日 ]

Rubyでソースコードの自動生成

Rubyでソースコードを自動生成する方法を考えている。
もとは「日経ソフトウェア」06/10月号にRubyを使ってJavaのコードを書き出すという記事があって、やってみたのがきっかけ。トップダウンパーサを自動生成するのに使えないだろうか? Rubyで、再帰下降解析(recursive descent parsing)を行うパーサを動的に作成するためのライブラリとして、tdp4r または syntax.rb というのに注目している。ソースコードの自動生成の機構を使って、BNFから Ruby版のトップダウンパーサのコードを自動的に書き出すってのはどうかなー? Racc を使うほどのものじゃないちょっとしたパーサが必要な場合、そういうのを生成する目的に合ったツールにできたらなぁ...

投稿者 jgb : 03:11 | コメント (0)

[ Date: 2007年02月24日 / Modified: 2007年02月24日 ]

Ruby版 Blogツール作成

「自分で作るblogツール PHP騙」という書籍がある。
データベースを使わないファイル保存形式のblogツールを、自分で一から作ってみようという趣旨の内容だ。データベースを使わない点については、賛否が分れるところだが、その分素朴にコツコツとツールを作るという方向なので、文法書では得られないようなWebアプリを作る際の細かなノウハウが理解できる良書だと思う。最近は Ruby on Rails などのフレームワークがもっぱらの話題なので、こういう細かな基礎知識が必要な部分はツールがやってくれる的な風潮だが、実際には基礎知識がないとフレームワークも深くは理解できないだろう。 "PHP騙"とあるので"Perl騙"とか"Ruby騙"とかもそのうち出るのかと思ったが、そのウワサもない。ならいっそのことこの本のPHPコードをRubyに翻訳してしまおうと思って始めた。

投稿者 jgb : 01:03

[ Date: 2006年02月09日 / Modified: 2006年12月17日 ]

クラス間の通信

オブジェクト指向では、クラスから作られたインスタンスどうしがメッセージを送りあってデータを操作するというイメージがある。
私の場合は、実際コードを書いていく際、なんでもかんでも継承を使うというのはいやだし、実際その必要がないケースも多いので、あるクラスのフィールドに別のクラスのインスタンスを渡しておいて、そのフィールドとなった部品クラスからメソッドを呼び合うというやりかたをとることが多い。これはオブジェクト指向的には、関連とか集約とよばれる手法だと思うが、この方法でも Data::Dumper なんぞで表示してみる時、部品クラスのよけいなデータ構造まで見えてしまうので結構うざったく感じる(Data::DumperのMaxdepthをその都度変えるのもメンドイし)。
実際クラスどうしに渡されるのは、オブジェクトのアドレスなので、見ためほどデータが重くなっているわけではないのだが、あまりシンプルとも言えない場合がある。
そもそもあるクラスから利用される部品クラスの部分が、一つやふたつのフィールド値であるような場合、そもそも部品クラスとして埋め込む必要があるのかとも思えるケースがある。

もうひとつ問題は、ファイルやネットごしのデータを読む場合、あるタイミング(例えばその読み込み過程である種のデータに出会った時などに)、何らかのコールバックをクラスどうしで呼び合えないと、全く同じような分岐処理を複数のクラスに書くはめになる。そういうのはいかにも無駄と思える。対象となるデータに遭遇した時に、うまくインスタンスどうしがメッセージ通信してくれれば、もっともっとコードをシンプルに、かつ独立性を高めて書けるのにと思うのである。

こういう場合に、特定のクラスフィールドを作って、そのフィールド変数を内側に含んだクロージャを使ってインスタンスどうしを通信させるというような方法をもっと考えるべきだろう。最低限必要なフィールド値だけを、必要なタイミングで操作変更してくれるような、コールバックメソッドとしてのクロージャ。こういうのがうまく書ければ、なんでもかんでも部品クラスに埋め込まなくてもよいはずだ。

投稿者 jgb : 00:57

[ Date: 2005年12月04日 / Modified: 2006年12月17日 ]

来年に向けてのメモ

このごろ少しコーディングにイキズマリを感じてきた。オブジェクト指向的な構文を使ったからといってオブジェクト指向なコードには必ずしもならないということを、実感として分かってきた。
もう一度Javaの学習もしている。Perlに関しては、最近 Damian Conway の「オブジェクト指向Perlマスターコース」で、再学習をしている。この本のすごさがこの頃よく分かってきた感がある。JavaやRubyのようなオブジェクト指向の機構をはじめから備えた言語になれた人から見ると、何もわざわざPerlでやらなくても...と言われるかもしれないが、言語にネイティブなOOPの機構が不足しているPerlだから、逆に根本的なOOPの原理を理解して作りこんでいかざるえない、というところがあるように思える。OOPとしてPerlが劣っているのかどうかわからないが、確かにPerlにはとてつもない柔軟性があり、だいいちいい例として、MTはPerlのOOPで書かれているのである。

開発中の Txt2dbx の次のヴァージョンは、完全な Perl OOP で書く。これは、他言語版を作るためにも必要と思われる。Txt2dbxは、ひょっとしたらもっと汎用的な Text->XML 変換器にするかもしれない。今考えていることの中で、これから注目して学習していきたいことをいくつかメモっておこう。
  • 正規表現をオブジェクトとして扱うクラスの作成と、そうすることのメリット
  • クロージャによって、特定のアクションをクラス間で受け渡す仕組み
  • Damian Conway の言う「総称性」の研究。継承ではなく、「何らかの情報(たとえばある特定の種類の検索ツリーのノードに格納すべきデータ型)が欠如している場合に、それを入力するだけで一連の別個の(無関係な!)クラスを生成できる」ような仕組み

3番目のはいかにも、複雑なパーサーツールを作るDamianのような人が考えそうなテーマではないだろうか。

投稿者 jgb : 22:21

[ Date: 2005年10月14日 / Modified: 2006年12月17日 ]

Cygwin 困ったときの備忘録:

まあ家ではほとんどLinuxだが、たまにWindowsNT+Cygwinなんて環境で作業することもある。いろいろととまどうことも多いので、気付いたことをメモっておこう。

1.chmodでチェンジできない!

一般ユーザでCGIファイルのパーミッションを実行OKに変えようとして、何度「chmod 755」とかやっても、ちっとも変更されない場合がある。これは、ユーザー環境変数の「CYGWIN」の値が問題なようだ.もし「CYGWIN = nontsec」となっていたら、「ntsec」に変える。ただしこれはファイルシステムがNTFSだから関係あること.
ネットで調べると各変数値の意味はこうらしい(http://pcweb.mycom.co.jp/special/2002/cygwin/004.html).

[ ntsec ] Windows NT/2000/XPのセキュリティモデルを利用してUNIX風のファイルとプロセスに対するパーミッション設定を実現するもの.ただしファイルセキュリティはNTFS上でしか動作しないので、FAT32上でCygwinを使う場合やWindows 9x系の場合は必要ない.

[ smbntsec ] 共有フォルダ(Sambaドライブも含む)でも「ntsec」を有効にする設定.

[ glob ] UNIXスタイルのファイルワイルドカード文字をコマンドプロンプトからでも有効にするというもの.

ちなみに、私んとこのユーザ環境変数ではこうなってる。
CYGWIN = binmode ntsec smbntsec glob tty

2.Active Perl のPPMは、administrator権限でWindowsのコマンドプロンプトからでないと使えない.


そうじゃない方法はあるんだろうが、これが基本であって、まあ考えてみたらあたりまえのこと.CygwinのPerlはCygwin環境へのInstall権限さえあれば一般ユーザでもできるので、ついとまどってしまう.

3.だからCygwinのPerlとWindows版のApache2でCGIのテスト環境にしたい!

...と思うんだが、実際やってみるとCGIファイル先頭の「#!...」のパス表現が分からない。しかたなくActivePerlのパスにもどしてやってたが、やっとしくみが分かった. cygwinのshellで「which perl」すると、「/usr/local/bin/perl」である.

nt:~$ which perl
/usr/local/bin/perl
nt:~$ ls -lF /usr/local/bin/perl
lrwxrwxrwx 1 jgb admins 17 Apr 26 17:10 /usr/local/bin/perl -> /usr/bin/perl.exe*

これは「/usr/bin/perl.exe」へのSリンクだと知っていたので、Windows側がCygwinのSリンクを理解できないのかと思い、CGIファイルの先頭に「#!D:/cygwin/usr/bin/perl.exe」などと書いていたが、ことごとくエラーになる.

そこでフォルダを開いてみると分かるのだが、Cygwinの/usr/binなどはWindows側からは見えないしくみになっている.そこで(どっかのサイトを読んでいて分かったのだが...)、実は「/bin/perl.exe」というのがあり、こちらは可視ファイルになっており、CGIファイルの先頭に「#!D:/cygwin/bin/Perl.exe」などと書くとあっさりうまくいった。

CygwinのプログラムをWindows側から利用する場合は、フォルダを開いてアイコンが見えるものを使わなければならない...ということだろう。

投稿者 jgb : 16:34

[ Date: 2005年07月25日 / Modified: 2006年12月17日 ]

PHPNOTE 第6回終了

たまには日記も書かんとね。PHPNOTEの第6回が書けた。だいぶサボっていたので、あらためてコードまわりを見直してみると、OOPのかけらもないのにうんざりするが、一応完結させておかんとね。
僕自身はこの間Javaの学習と、PHPでMVCするための勉強を進めてみた。それからtxt2dbxのVer.2を作る作業に入っている。こちらもPerlのOOPで書いている。全体的にオブジェクト指向でコーディングしないと、耐えられない状況になりつつある。カプセル化とか再利用性とか言う以前に、OOPなコードでないと、後で書いた本人である自分が(ちょっと大袈裟な表現だが)読めなくなったりする。コードリーディングの面でもOOPは有利なのだと実感する今日このごろである。

投稿者 jgb : 00:10

[ Date: 2005年05月05日 / Modified: 2006年12月17日 ]

やっとこさBフレッツ

うちは公団5階建ての比較的古い分譲住宅なんだけど、このたびやっとこさBフレッツが通った。
もともと市がなぜかケーブルTVの環境づくりを公費で援助してて、NTTにしたらこのままでは先を越されちまうという焦りもあったと思う。しかし、公団分譲って自治会といろんな話をまとめていかないと話が進まないし、自治会やってる人には50才以上の年配が多いので、先にケーブルTVが来てたから、変にそちらに義理立てしてたりとかあって、数年前にNTTは話に来てたのに先送りになってたようだ。 この間近所の人と多少の話はしたけど、マンションタイプを導入することの難しさを実感した。結局技術的な問題以前のいろんなしがらみが多過ぎるのだ。いずれマンションタイプでも個別世帯で導入できるタイプが現れつつあるらしいが...。 まあ、とは言え、待ったかいあってマンションタイプでも100Mタイプになっている。子供のオンラインゲームもある程度さくさく動くし、ソフトのダウンロードも格段に速くなった。某ブロードバンドスピードテストで計ると、ADSL24Mだった以前に比べ、最大22倍の速度がでてる。(...っていうか、これは前のが遅すぎたんじゃねえの?局から4.5Kmだったからな〜。)

投稿者 jgb : 11:17

[ Date: 2005年03月31日 / Modified: 2006年12月17日 ]

もう3月も終わりかい!

3月は一個もエントリの追加をしなかったんで、このままではさみしいってことで、書いとく。今月はRubyもんのマニュアルを書きはじめた。書けば書くほどPerlとの類似は見かけだけで、実際似て非なる言語だと実感している。また、裏でCのおべんきょを再開。やっぱこれなしに上級者にはなれないな〜。

投稿者 jgb : 22:35

[ Date: 2005年02月24日 / Modified: 2006年12月17日 ]

PHPのSESSION変数でファイル名を渡す

Smartyのテンプレートから別のPHPスクリプトを読み込むには

{include_php file="$server_root/blog/scripts/include_file.php"}

などとするが、そのスクリプトに読み込みたい(その都度違った)ファイル名を渡したいときはどうすればいいのだろう。普通に考えれば、ファイル名をSmarty側で読める変数名にassignしてテンプレート側で読めばできそうなのだが、いろいろやってもうまくいかなかった。

...ということで、結局SESSION変数で値のファイル名をグローバルなスコープにしてしまうことで、うまくいった。

index.php(テンプレート呼び出し側)

 session_start();
 ..............................
 if (isset($file_path)) {
    $_SESSION["incfile"] = $file_path;
 }

テンプレート側

 {include_php file="$server_root/blog/scripts/include_contents.php"}

include_contents.php側で

  $file = $_SESSION["incfile"];
  include("$file");

投稿者 jgb : 08:53

[ Date: 2005年02月13日 / Modified: 2006年12月17日 ]

miniDNSからお引越

12月6日の夕方頃、外から自分の自宅サーバのサイトをメンテ中に、突然交信不能になった。いろいろ調べたら、 ちょうどその時刻に、ダイナミックDNSをお願いしてた miniDNSから自分の登録情報が抹消されたらしい。

ログインしてみたら実際そうなっていた。下記のサイトでのメールで、みなさんおこまりの様子や解決方が相談されている。

「DynamicDNS情報交換室」

: miniDNSから下記のメールが届きました。

つたない英語で、miniDNSにサポートお願いメールしたら僕んとこにも同様のメールが送られてきた。

実は僕は子どもとメールアドレスを共用していたので、子どものパソコンの方で先にminiDNSからのメールを受けてしま い気づかなかっただけなのだった。(やっぱりアドレスはちゃんと別にしよう!)それにしても、メールの発行日が11月末なので、これでは期間が短過ぎて、みんな対策遅れになった人多いんじゃないだろうか。 ....で、

独自の更新用スクリプトなどを利用されている方は、更新するサーバを、 minidns.net から 3domain.hk に、または www.minidns.net から update.3domain.hk に変更してください。

とあるわけだが、実際利用したことない 3domain.hk に行って、miniDNSで使ってたログインネームで入ると、 確かに自分の登録情報があった。

問題は、自動更新のPerlスクリプトをどうするかだが、単純に wget で更新する次の部分を、www.3domain.hk に変更するだけでうまくいった。($UpdateURL 等は実際はそれぞれ1行で書く)

[ 次のもともとのminiDNS用のを ]

# old update string : for miniDNS # $UpdateURL = "'http://www.minidns.net/areg.php?opcode=ADD \&username='$UserName'\&password='$Password' \&host='$Host'\&ip='$CurrentIP";

[ 3domain用に書き換える ]

# 3domain へログインしてIPアドレスを更新するサブルーチン sub updatedns { ## 3domain $UpdateURL = "'http://www.3domain.hk/areg.php?opcode=ADD \&username='$UserName'\&password='$Password' \&host='$Host'\&ip='$CurrentIP"; system("/usr/bin/wget -v -O 3domain.log $UpdateURL >> ipupdate.log.tmp 2>> ipupdate.log.tmp"); ## Inform new IP &message(); }

詳しくは、www.3domain.hk のメニューから -> ダウンロード のページへ行っ て「IP更新用クライアントソフト」のページの下の方にある、

IP更新インターフェイス仕様 --> 1. 標準HTTPプロトコル

のところにヒントが書いてある。実際は、これは古い仕様なのでその下にある 「2. 3Updateプロトコル (推奨)」 がすいショーなんだそうだが、動いてるし今のスクリプトは中身がよく理解できてるのでこのままでいいでしょう。

投稿者 jgb : 14:43

Blosxom 始めました

今日からBlosxomをやってみようと思う。
超軽量で普通のテキストファイルをエントリにでき、ディレクトリを掘ればそこがカテゴリやサブカテゴリになるという、そのお手軽さが自分の目的にあっていると思う。また、そのお手軽さとは裏腹な奥の深さがとても興味の引かれるところ。インストールから改造まで、利用記録を取っていこうと思っている。(参考にしたサイト-> blosxom::日本語訳)

投稿者 jgb : 14:39

[ Date: 2004年11月03日 / Modified: 2006年12月17日 ]

GNOME 起動せず!

子供と部屋で暴れていて、うっかりサーバの電源がつながっているコンセントのスイッチを切ってしまった。その時は、Linuxマシンがサーバともう一台クライアント機が稼働していて、両方ともやっちゃった。再稼働するとサーバは問題なかったが、クライアントに使っているVineLinux3.0が、起動するもののグラフィカルログインできない。startx でもGnomeが立ち上がらない。 ネットや本でいろいろ調べたが、結局次のようにして回復させた。

.xsession-errors を確認

デスクトップ・ファイル applications:///nautilus.desktop
(パネル・ランチャ : ファイル 'applications:///nautilus.desktop'
読み込み中にエラー: ファイルがありません) が開けません

といった文があるが、今回の直接の原因かどうかはわからず。次にとりあえず setup を実行。

# kon
# setup

クライアント機のビデオカードは非常に古くて、RivaTNT2 16MB。ビデオカードの認識は(古いんで)うまくいくが、次にこんなメッセージが!

「以下のファイルの設定に誤りがあります
    /usr/X11R6/lib/X11/xorg.conf
このファイルは通常、以下にリンクする必要があります
    /usr/X11/xorg.conf
今すぐリンクしますか?」

「はい」で進むとモニターの検出。検出結果の機種名は I-O DATA の「LCD-A15H」と正しく表示しているのに、そのまま自動検出に進むと失敗する。しかたなく手動で 16MBビデオメモリーなどなど選んでXのテストに進むと、みごとGNOMEの画面が表れて設定ファイルが /etc/X11/xorg.conf として書き込まれた。 xorg.conf は、前のXF86Config に変わるものらしい。(XF86Configも一応残されている) 「このファイルは、Xサーバによって検出されるディレクトリ内に保存される必要がある。(詳細は /usr/X11R6/lib/X11/doc/README.Config)」と書いてある。README.Config、これは「Configuring XFree86: A Step-By-Step Guide」、どっかに翻訳があるだろう。 ちなみに、xorg.conf のパーミッションは、644 の root:root であるらしい。 これでセッションファイルを削除せずに、前の設定のままGNOMEが立ち上がった。よかった!!!!

投稿者 jgb : 13:41

[ Date: 2004年10月30日 / Modified: 2006年12月17日 ]

Fedora2でこけた!

自宅サーバの FedoraCore1 を Core2 にアップグレードしようと思って、先週から悪戦苦闘。GRUBは出るが起動しない!! あきらめてCore1に戻すと shutdown できなくなってる!!
アップグレードインストールはあきらめて、腹くくって /home 以外を新規インスト。が、それでもダメ。PC切替器に問題ありとみてモニターやキーボードやマウスを直接つないでやってみたが、今度はインストーラが起動と異常終了を延々と繰り返す。ネットでググってみたら同じような症状で困っている人が沢山いた。
agpgartの読み込みの後はシリアルバスまわりの設定に進んでいるようだが、どうもそのへんで止まってしまう。うちのサーバは特殊事情で、作った時にAGPカード経由でモニタが写らなくて、PCIバス版のRADEON7000を使っている。なぜそうなったかは、マザーのせいなのかその時買ったGeForceMX4000のカードが初期不良だったのかはわからずじまいで、みごとに玄人志向の人柱になったのだったが、まあ、PCIバスのカードのほうが安定して写るようになったのでそのまま今日まできていた。ひょっとしたらPCIのビデオカードじゃだめなんじゃ?なんて思ったりしたが、無駄な出費も控えたいので、ここはひとつ考えなおすことにした。
サーバは、Vine Linux3 で立て直すことにした。今までノートで使ってきたけど、Perlで XML::Parser が入らなかったりといろいろ収録ソフトが古めだったのでちょっとやる気が起きなかった。何でもアップグレードすりゃいいんだが、それなりのスキルが求められてくるし、思わぬところで足をすくわれたりする。始めから用意されているってことは、それなりの安心感につながるもんなのだ。
しかしVineも3.0になってかなりそのへんもよくなった感じ。もともとサーバOSのアップグレードは、PHP5が使いたかったからなのだが、PHP5のパッケージ自体はFedora より Vine のほうが用意が早かった。また apt によるアップグレードの簡単さはとても気に入っていた。なんせ2.6rの後のマイナーバージョンは aptしてれば勝手に上がっていった。
このアップグレードのしやすさという点で、サーバとして運用するにはVineはかなり使いやすいのではないかと思う。FedoraはOSのバージョンアップの期間が9ヶ月と素人にとっては結構早くて、そのたびにトラブっていたのではちょとキツイ。たとえインストールがうまくいったとしても(うまくいった場合のインストールはとても楽なんだけど)、使いこなすのにかなりスキルが求められる感じがした。
で、...Fedora2はクライアント機で後日ためすことにした。まあサーバだめでもFC1で味わったあの先進性と美しさはやめれまへんので....。 あ、それとちなみに今回 SSH と rsync が使えるようにべんきょして、バックアップは完璧にとった上で作業したので、それだけは非常によかったです、うん。

投稿者 jgb : 15:27

[ Date: 2004年08月02日 / Modified: 2006年12月17日 ]

Update to FC2 どうするかな〜

現在自宅サーバで稼働中の Fedora Core 1 。 FC2 にアップデートするかどうか思案中。
ベータ版の頃から日本語環境は改善されるって言ってたけど、SlashDotとか見ると、いろいろ問題ありそうなのでもう少し待ってみよう。そもそもアップデートインストールがどこまでできるのかわからないし、まずはバックアップの方法を調べておいたほうがよさそう。こういう時のために、サーバの中で、インスト後に変更するファイルは、限られた場所にすべきだと思う。日本語環境については、FC1の時もいろいろ苦労した。この機会にあのときのTipsをまとめておけば、FC2 のインスト後にも役にたつだろう。

投稿者 jgb : 14:08