2001-08-03
λ. Ruby Relaxer
あれは感想ではないと思われ。まあ、そのうち試してみたいなぁとは思うけど。
ふむふむ、RELAXで定義されたXMLモデルに従ったXMLドキュメントを操作するためのクラスを自動生成する
のか。確かに便利そう。あらかじめ定義されたモデルに従った文章だけを扱うなら、DOMなんかいらなくなるわけか。こいつはいいや!
λ. 15000 hit
気が付いたら越えてた。
λ. Scheme(というかScript-Fu)でオクテット列から文字列に変換するには?
いっちーさんに訊かれて色々考えてみたけど、良い方法が思い付かない。たとえば、こんな関数が考えられるけど、オクテットにinteger->charを適用するのは正しい結果を得られる保証が無いばかりか、マルチバイト文字を考慮しないことになる。まあ、SIODじゃ動かないからどうでも良いんだけど。
(define bytes->string (lambda (bytes) (list->string (mapcar integer->char (vector->list bytes)))))
λ. 結局、以下のようなプラグインを書いて使うというのが一番ましな方法かもしれない。しかしアレだよな〜
#include <libgimp/gimp.h> #include <string.h> static void query(void); static void run(char* name, int nparams, GimpParam* param, int* nreturn_vals, GimpParam** return_vals); GimpPlugInInfo PLUG_IN_INFO = { NULL, /* init_proc */ NULL, /* quit_proc */ &query, /* query_proc */ &run, /* run_proc */ }; MAIN() static void query() { static GimpParamDef args[] = { {GIMP_PDB_INT32, "length", "array length"}, {GIMP_PDB_INT8ARRAY, "bytes", "Input bytes"}, }; static GimpParamDef return_vals[] = { {GIMP_PDB_STRING, "string", "Output string)"}, }; static int nargs = sizeof(args) / sizeof(args[0]); static int nreturn_vals = sizeof(return_vals) / sizeof(return_vals[0]); gimp_install_procedure("int8array_to_string", "Convert INT8ARRAY to STRING", "Convert INT8ARRAY to STRING", "Masahiro SAKAI", "Copyright (c) 2000 Masahiro SAKAI", "Fri Aug 3 17:35:49 JST 2001", NULL, "", GIMP_EXTENSION, nargs, nreturn_vals, args, return_vals); } static void run(char* name, int nparams, GimpParam* param, int* nreturn_vals, GimpParam** return_vals) { static GimpParam values[2]; gint32 length = param[0].data.d_int32; gint8* array = param[1].data.d_int8array; guchar* result; result = g_new(guchar, length + 1); result[length] = 0; memcpy(result, array, length); *nreturn_vals = 2; *return_vals = values; values[0].type = GIMP_PDB_STATUS; values[0].data.d_status = GIMP_PDB_SUCCESS; values[1].type = GIMP_PDB_STRING; values[1].data.d_string = result; }
λ. このプラグインを使って、
(define parasite (car (gimp-image-parasite-find 0 "gimp-comment"))) => ("gimp-comment" 1 #22"437265617465642077697468205468652047494d5000") (define hoge (caddr parasite)) => #22"437265617465642077697468205468652047494d5000" (car (int8array-to-string (length hoge) hoge)) => "Created with The GIMP"
λ. ところで
今日も起きたのは昼だし、最近は寝た時間に関係なく起きるのが昼ごろだな〜。さて、せっかく救済措置を取ってもらった体育のレポートを仕上げなくちゃ。これが仕上らないと明日の呑み会も行けなくなるし。
λ. それにしても
「A∨¬A」で検索されるとは…
λ. ルパン3世 アルカトラズ・コネクション
アルカトラズの閉鎖とJFKの暗殺を関連づけるというアイディアは面白かったけど、それだけ。
2003-08-03
λ. 筑波山
家族で筑波山の方へ遊びに行ってきた。なんか妙に人がたくさんいると思ったら、ガマ祭りというお祭りをやっていた。ガマの油売り口上とか、ガマール銀行とか、ガマ神輿(?)とか、変わったものが沢山あって楽しかった。で、筑波山に登る予定だったのだけど、むちゃくちゃ暑かったので、ケーブルカーで頂上(?)まで登って、そこから男体山にだけ登った(ちなみに女体山とゆーのもあるのです)。頂上で昼食をとって、それから適当に時間をつぶして降りてくる。汗をかきまくったので、青木屋という所で温泉に入った。眺めがむちゃくちゃ良かった。
そーいえば、takotセソセイに筑波のことをいろいろ聞いておけばよかったなぁ。
2004-08-03
λ. WASH (2)
練習に「フリーソフトウェアライセンス診断」をWASHで書いてみた。ただ、現在のところソースコード中のマルチバイト文字はUnicode対応版Hugs以外では正しく解釈されないので、それ以外の処理系ではエスケープしておく必要がある(エスケープ版)。
module Main where import Prelude hiding (head, span, div, map) import CGI main :: IO () main = run (f questions) f :: [(String, Maybe String, Maybe String)] -> CGI () f [] = ask $ standardPage qtitle (p (text "Error")) f ((question, yes, no) : xs) = standardQuery qtitle $ do p (text question) submit0 (g yes) (fieldVALUE "Yes") submit0 (g no) (fieldVALUE "No") where g (Just licence) = ask $ standardPage (qtitle ++ "結果") $ p $ text (licence ++ "がおすすめ") g Nothing = f xs qtitle = "フリーソフトウェアライセンス診断" questions = [ ( "あなたのコードを商用ソフトウェアに組み込まれて販売されてもかまわないか?" , Nothing, Just "GPLライセンス" ) , ( "あなたはストールマンのフリーソフトウェア運動に心から賛同しているか?" , Just "GPLライセンス", Nothing ) , ( "あなたはそのソフトウェアを将来Rubyの一部として配布したいか?" , Just "Rubyライセンス", Just "BSDまたはMITライセンス" ) ]
λ. Re: wxHaskell (その3)
コンソールを消すには、PEのヘッダを編集しなくても、リンカに-mwindows
を渡せばよいので、ghcの場合-optl -mwindows
を渡せば良いです。
あと、Char
は「単なる0..255なデータ」ではなくUnicodeの文字です。手元のghciだと「maxBound :: Char
」は「'\x10ffff'
」になります。
とはいっても、ghcのIO周りやForeign.C.String辺りはUnicodeとローカルなエンコーディングの変換をしてくれない(FFI 1.0 非準拠)ので、現在のghcでwxHaskellを使う場合、結局Stringをローカルなエンコーディングのバイト列として扱わないと日本語出ませんが(泣)。
HugsのForeign.C.Stringに関しては4月12日に一度パッチを作ったのですが、Hugsで使えるライブラリでこの辺りの結果を確認できるものが思いつかなかったので、ちと放置中。