SSブログ

wema twisted 0.2.0 [wema]

今年の 2月は 29日がありませんが、今日は 2/9 です。
wema twisted で、付箋を移動したときに、Ajax で処理するようにしました。

http://www005.upp.so-net.ne.jp/nakagami/Download/wema-twisted-0.2.0.tgz

本家 Ruby 版 wema 2.0.0 → 2.0.1 の時に実装された
http://lists.sourceforge.jp/mailman/archives/wema-users/2005-April/000000.html
>* Ajaxを使った付箋の位置自動保存
ぱくりました参考に相当する処理を追加しています。

Ajax と言っても、Request を投げる処理はしていますが、Response を非同期に受け取って、
何か処理するってことはしてないので(Response を受け取っておしまい)Ajax の「非同期」
たる部分の半分しか使ってませんが、wema twisted の 0.1.0 と 0.2.0 の差分を見比べて
ここ↓も見たりすると、何かの参考になるかもしれません。
http://allabout.co.jp/career/javascript/closeup/CU20050515A/index.htm


Windows で wema twisted の動作環境を用意する [wema]

http://blog.so-net.ne.jp/nakagami/2006-01-29 の続き・・・
気が付いたら、本家の てくのーと 2.0 からリンクされてました。
http://blog.kan.vc/1138633212.html

誤解の無いように書いておきますと、Python は CGI を書くプログラミング言語として
Perl/PHP/Ruby と並んで有名ではありますが wema twisted は、CGI としては動きません。
逆に、Apache 等の Web サーバーがなくても動くとも言えます。
せっかくなので、wema twisted を、デスクトップ・アプリケーションとして使ってもらえるとうれしいなぁ、と思っています。

そういえば、動作環境についてはさらっとしか説明してませんが、
twisted のインストールってちょっと良くわかりませんよねぇ(英語だし)
http://twistedmatrix.com/
実は、私も良く分かりません(ガクっ)

幸いにも Zope 3.2 をインストールすると twisted がもれなく付いてくるので
wema twisted を動かしてみるためには、Zope 3.2 をインストールすると良いでしょう。

以下、wema twisted を動かすための環境を作る手順(Windows版)

1.Python 2.4.2 のインストール
http://blog.so-net.ne.jp/nakagami/2006-01-15

2.Zope 3.2 のインストール
http://blog.so-net.ne.jp/nakagami/2006-01-15-1

3.pysqlite2 のインストール
http://initd.org/tracker/pysqlite の Downloads にある
2.1.2 の Python 2.4 用バイナリをダウンロードして実行
http://initd.org/pub/software/pysqlite/releases/2.1/2.1.2/pysqlite-2.1.2.win32-py2.4.exe

4.sqlite3 (sqlite version 3.x のデータを操作するコマンド)のインストール
http://www.sqlite.org/download.html の sqlite-3_2_8.zip をダウンロードして解凍。
http://www.sqlite.org/sqlite-3_2_8.zip
どっか、PATH の通ったところに置く

#4. は、最初に DB を作成するためにだけ必要


wema twisted 0.1.0 [wema]

JavaScript と twisted の勉強のために、 Wema 0.5.1 のソースから twisted で動くようにしてみました。

ちなみに、 Wema 0.5.1 のソースは、本家 http://wema.sourceforge.jp/ には
無かったのですが、(現行の 2.0.x のみ置いてある)
http://winds.under.jp/wema/ にある wema0.5.1 custom0.2 のアーカイブの中に
オリジナルの Wema 0.5.1 が同梱されていました。
一応↓にも置いておきます。
http://www005.upp.so-net.ne.jp/nakagami/Download/wema051.zip

オリジナルや、その派生はファイルとしてデータを保存してましたが、
SQLite3 に保存するようにしちゃいました。
動かすのに
・Python http://www.python.org/
・twisted http://twistedmatrix.com/
・pysqlite2 http://initd.org/tracker/pysqlite
が必要です。

以下、動かすまでの手順
wema-twisted 0.1.0
http://www005.upp.so-net.ne.jp/nakagami/Download/wema-twisted-0.1.0.tgz
をダウンロードして、アーカイブを解いた後

sqlite3 wema.db < wema.sql
として、wema.db を作ったあとに
python wema.py
を実行すると http://localhost:8080/ でアクセスできるようになります。 管理者用パスワードやポートを変更する場合は、ソースを修正してください。

wema 0.5.0 のソースを読む(Perl 版との比較とデータの構造) [wema]

http://blog.so-net.ne.jp/nakagami/2006-01-18-1 の続き
wema4perl のソースアーカイブの中に wema050.zip というファイル名で、オリジナルの
Ruby 版 Wema の version 0.5.0 のソースが入っている。

wema4perl のソースと比較してみる。
[wema.css]
[wema.js]
 まったく同じ。
[wema.tmpl]
 埋め込む変数の記法と、template に式が埋め込めるかどうかで書き方が微妙に異なるだけでほぼ同じ。
[data フォルダの中のデータ形式]
 同じっぽい。

となっていて、違うのは wema.cgi の中身だけ。

しかも、違いは、perl 版では
1. SWEEP の処理がある
2. 関数 sub include_template() がある
3. 関数 sub escHTML() がある
というところを除くと、関数名からローカル変数やロジックまで、言語の相違による違い以外は、ほとんど同じ。

1. については、Ruby 版 0.5.1 で追加された機能のようでそれに Perl 版が追随した模様。
wema.cgi には、sweep の処理が追加されてるけど、wema.tmpl には反映されてないような・・・
2.3. は、Ruby では組み込みで含まれている機能の同等なものを Perl で書いたもの。

処理はびっくりするほど同じだった。これほど同じにする必要はないだろうに、と思うくらい。
perl4wema の readme.txt の中で「翻訳」とある意味がよく分かった。

・・・というわけで、私のように Perl は少し読めるけど Ruby は全然分からないとか、その逆の人は、両者を見比べてみると、式とか制御文とか変数名の使い方を知るのにいいかも。

・・・ところで、改めてデータ構造について真剣に見てみる
write_check(), disp_content() あたりを見ると分かるけど、ちょっと勘違いしてた。

.namemap で ID ->名前の対応の入っている(TAB区切り)ファイルのは、以前書いたとおり。

で、ページを作ると、その ID のディレクトリを data ディレクトリに作る
アイテムを追加すると、対応したファイルが1つできる。
ページとアイテムの ID (=ファイル名)は YYYYMMDDHHMMSS っていう感じで付くけど、
FrontPage と DustBox は特別扱いで、FrontPage と DustBox は 「ID = 名前 = 内部的なファイル名」になっている。

アイテムのファイルは、拡張子 [.txt] が付けられ、LOCK すると[.txf] に rename される。

アイテムのファイルの中身は
$id($pg) ページ名
$ln($links) ライン属性
$left X 座標
$top Y 座標
$color 色
$bgcolor 背景色
$zindex Z order
$body 内容
が、改行で区切られている(みたい)。$body は、改行で区切られててもテキストファイルの残り全部が入ってる。


Wema for perl のソースを読んでみた [wema]

前々から wema ってすごいなぁ、なんとか python でも動くように出来んのか?
・・・と思っていたのだけれど、最新の Wema 2.0.1 は
1.Ruby で書かれている
2.たいそうなフレームワーク上に書かれている
3.アプリ自体の機能が豊富なため、ややこしい
の三重苦で、とても私の手に負えるものではない。

ということで、しばらく放置していたのだが、
WEMA Watch http://labs.yagi.tc/wema/ に紹介されている
Wema for perl http://mujin.parfait.ne.jp/wema/wema.cgi は
1.Perlで書かれている
2.普通の CGI で、Perl の高度な機能( pm とかクラスとか)を使ってない
3.本家(Ruby版)の 0.5.1 から派生したもので機能的にシンプル
で、これなら何とか移植できそうか・・・という気がしてきた。

というわけで、以下は私だけにしか意味の分からない(かもしれない)メモ。

[wema.cgi 以外のデータファイル等]
wema.js
wema.css
 そのまま使う Static なファイル。

data ディレクトリの中(data/.namemap とか)
 書き込まれたデータは、data ディレクトリの中に 1 ページ 1ファイルで、どかどか入る
 data/.namemap は ID(URLの一部)とページに表示する名前の map の入ったデータ(TAB区切り)

wema.tmpl
 テンプレートファイル。wema.cgi の中にも HTML がいっぱい埋め込まれているので、wema.cgi と一緒でもいいかも。

[wema.cgi の処理]
initialize
 ... という関数はないけど、7 ~ 29 行をいつも通過して、ここで変数の初期化処理
 include_template() を呼び出してのテンプレートの展開も、この最初の段階でやってる。

disp
 一番最初に呼ばれる・・・というか initialize の次にこれだけが呼ばれてる大元の関数。
 write_check(), disp_list(), disp_content() を呼び出す。
 テンプレートの部分(head, edit, tail)はこの関数内で出力しているので、呼び出している関数の中では、たいやきのあんこの部分だけ出力している。
 disp と write_check は役割分担が不明瞭なので、ソースを読むときは両方を同時に読むと良い。

disp_list
 一覧表示の処理(LIST をクリックした時の表示)。

disp_content
 特定のページの表示。

writeNameMap
data/.namemap の書き出し

readNameMap
 data/.namemap の読み込み。名前 -> ID のハッシュを返す

get_id
 名前からIDを取得

get_name
 ID から名前の取得

convert_body
 BODY 部分の HTML への変換。
 2つ目の引数の文字列の WikiName っぽいところとかを、アンカー付きの HTML に変換する処理。
 一つ目の引数は ファイルの更新時刻を知るためのものなのであまり重要でない。

write_check
 REQUEST_METHOD が POST だったら
  REQUEST のパラメータに従ったデータの追加・変更・削除の処理
  Location ヘッダーを付けて、次ページへ飛ばす
 REQUEST_METHOD が GET だったら
  mode が make でページが作成されてないときはページを作成
   Location ヘッダーを付けて次ページへ飛ばす。
  mode が js の時はjavascript を出力(*mode=js となる条件は不明だが*)
 何らかの出力をしたら関数自体は 0 を返す
 この関数では出力してなくて、呼び出し側(sub disp())で HTML を出力して欲しいときは 1 を返す

js_out
 パラメータの文字列を JavaScript で出力する HTML(document.writeln())を出力する。

include_template
 テンプレートファイル wema.tmpl を読み込み変数 $head, $edit, $tail に入れる。
 <!--???--> という部分を Perl の変数で置き換えてる。
 <!--editbox-->lt;!--sweep--> は、表示・非表示を切り替えしてるだけ。(DustBox なら表示しないとか)

 
escHTML
 HTML クォートしてるだけ

-------------------------------------------------------------------
mode のとりうる値
[(ブランク)] 304~334行目で処理。 どういうタイミングでここに入るか、未だ不明。
[set] (仮の値)wema.tmpl では初期値として設定してるけど、Perl でこの値は参照してない。
JavaScript の setpos () が呼ばれたときに CGI に渡るが
mode が、'',del,lock,unlock,recover,sweep じゃないときは、378~409行目を通って(mode の値には関係なく)ポジションを設定してる。
[list] LIST(一覧)
[make] 新規作成
[js] Perl のコード上では判定してるけど、どこで設定してるか不明
[del] 削除(ゴミ箱へ移動、もしくはゴミ箱のファイルを削除)
[sweep] ゴミ箱を空にする
[lock] LOCK
[unlock] UNLOCK
[recover] ゴミ箱から復旧


wema をインストールしてみた [wema]

wema とは、これ↓
http://wema.sourceforge.jp/
まえから、面白そうだと思っていたのでインストールしてみることにする。

でも、その前に、Ruby が入っていないので、

# emerge ruby 


を実行。
ruby 1.8.3 preview1 っていうのがダウンロードしてインストールされた

wema は http://wema.sourceforge.jp/download.html から 2.0.1 をダウンロード。
http://wema.sourceforge.jp/ の インストールの項の説明にあるように
tarball を解いて、index.cgi に実行のパーミッションを与えればよい。



ちなみに、拡張子.cgi で CGI を実行の httpd.conf の記述例

AddHandler cgi-script .cgi


っていう行を追加して、wema のスクリプトをおいた Directory ディレクティブの所に

Option ExecCGI


の指定をする。



以下は、おまけ。
wema が mod_ruby で動かないそうなので、チャンレンジしてみる。
まず、mod_ruby のインストール。このとき USE フラグに apache2 が追加されている。

# emerge mod_ruby

mod_ruby 1.2.4-r2 っていうのがインストールされたみたい。
上にある「ちなみに、拡張子.cgi で CGI を実行の httpd.conf の記述例」の部分をやめ、
代わりに http://www.nslabs.jp/mod_ruby.rhtml を参考に、

LoadModule ruby_module modules/mod_ruby.so

  RubyRequire apache/ruby-run
  
    SetHandler ruby-object
    RubyHandler Apache::RubyRun.instance
  
  RubyRequire auto-reload


と書く。これで、拡張子.cgi で mod_ruby のハンドラが実行されるようになる。
しかし、この状態で、index.cgi を呼ぶと Internal Server Error になる。
エラーログを見ると

/usr/lib/ruby/1.8/auto-reload.rb:55:in `require': no such file to load -- cgikit (LoadError)


なんて出ている。
wema のアーカイブの lib ディレクトリの中にあるファイルを全部
/usr/lib/ruby/site_ruby/1.8 にコピーして、
もう1回 index.cgi を呼んでみると、今度は、wemaapp.rb 67行目の exist? が
Insecure operation だと言われる。
なんせ、Ruby は全然わからないので、このメッセージの正しい対処はわからないが、
要は、データファイルをおくディレクトリの存在チェックのようなので、
67~ 69 行目をコメントアウトしてみたら、一応 index.cgi (パラメータなし)の呼び出しは表示できた。
・・・が、Menu を選択していろいろやろうとすると、すぐ Internal Server Error になる。
エラーログを見ると、また別のエラーが出ているのでそれを追っていけば良さそうだが、
まだまだ、いくつかハードルがありそう・・・っつーか、Ruby では手も足もでない。

CGI は、そのスクリプトが存在しているディレクトリがカレントディレクトリになるが、
mod_ruby では、Apache プロセスのカレントディレクトリが、
スクリプト実行時のカレントディレクトリのため
wema/lib ディレクトリの中のスクリプトが require できないっていうのが理由みたい。
そして、まだまだ多くのハードルがありそうなので、私にはこれ以上無理・・・終了。