Gauche > Archives > 2010/01/27

2010/01/27 01:52:50 UTCとおる。
#
コードバトンできました。 http://gist.github.com/287148 たいしたことしてないけど。
#
辞書ファイルのファイル名をパラメタで渡せるようにしました。これで複数の辞書を使い分けるとかできるかな。
#
parameter を使ってみましたが、あんまりうまく使えてないです。「ある値が定義されているときだけ parameterize する」という動作をもうちょいスマートにかく方法はないですかね。
2010/01/27 01:56:59 UTCshiro
#
>とおる。 それpath traversal対策しないとやばくない? scheme-baton.scm?../../../etc/passwd とかやられたりすると…
#
「ある値が定義されてるときだけ」の「定義」ga
#
「定義」ga
2010/01/27 01:57:31 UTCとおる。
#
あ、やられますけど、S 式じゃないので読めないかなと思って。
2010/01/27 01:57:34 UTCshiro
#
あれ
#
「定義」がdefined?の意味ならちょっと厄介だけど、
2010/01/27 01:58:15 UTCとおる。
#
あ、えっと、この場合は、CGI のクエリストリングで渡されたかどうか、です。
2010/01/27 01:58:42 UTCshiro
#
cgiパラメータに渡されたかどうかって話なら (parameterize ([parameter-name (cgi-get-parameter "x" params :default (parameter-name)...
#
とかかなあ。
#
ちょっと不細工だけど。
2010/01/27 01:59:17 UTCとおる。
#
ですよねぇ。(parameter-name) をもういちどよぶのが、なんとなく抵抗があったんですが。
2010/01/27 02:00:04 UTCshiro
#
性能の問題で呼びたくないなら (or (cgi-get-parameter ...) (parameter-name)) とする手もあるけど、コード上はごちゃごちゃするね。
#
ちなみにcgi-get-parameterのデフォルトは (:list #t を指定しなければ) #f なので、 :default #f はいらない。
2010/01/27 02:02:11 UTCとおる。
#
あー、何も考えずにコピペしましたが、せっかくなので直しておきますかね。
#
:convert x->string もいらないような気が。
2010/01/27 02:04:12 UTCshiro
#
path-traversalについては、たまたまvalidなS式として読めちゃうケースとかもあり得るし、このスクリプトは書き込みもやるみたいだからちょっと気持ち悪いなあ。
#
って、ここで色々言うくらいならワシがバトン引き受ければいいのか?
2010/01/27 02:05:14 UTCとおる。
#
つぎ(び)さんがうけとってくれるそうなので、そのつぎでも。
2010/01/27 02:06:24 UTCshiro
#
gauche決め打ちで、細かいところ直すだけならできるかな。
2010/01/27 02:06:31 UTCnaoya_t
#
shiroさんはゴール、らしいですがw
2010/01/27 02:06:36 UTCshiro
#
e,
2010/01/27 02:06:52 UTCnaoya_t
#
いや、いつでも参加して頂いて構わないかと
2010/01/27 02:09:28 UTCとおる。
#
ちょこっとなおして git push しました。
2010/01/27 02:24:31 UTCとおる。
#
どうせならプレインテキストじゃなくて DBM とかのほうが軽くできそう。
2010/01/27 02:31:01 UTC(び)
#
晩遅くに受け取りますので、それまではなんぼ直してもらってもひろえまっす >とおる。
#
fdbmならどんな環境でも一応使えるのかな? >DBM
2010/01/27 02:38:15 UTCshiro
#
性能はいいから手軽にポータブルなdbmが欲しい、fsdbmだとファイルがいっぱいできるので面倒、という時のために、単にハッシュテーブルをS式にしてread/writeするようなdbmを考えたこともあるんだけど、需要あるかなあ。
2010/01/27 02:39:22 UTC(び)
#
Kahua的には欲しいかな
#
現状のKahuaのfsdbは1.0リリース時に書き直したものですが、今見るとあまりイケてないので
#
Gaucheに標準でいいのが入るのであれば、独自のfsdbを捨ててそちらに乗り換えたい
#
でも、RDBMSバックエンドと統合する為にsqlite3を同梱しちゃえという乱暴なアイディアも持っているので、なかなか微妙なところです
2010/01/27 02:45:16 UTCshiro
#
いいっていうか、上のアイディアはopen時にファイルをがっと読んでテーブル作って、close時とか適当なタイミングでがっと書き出すってことなので、データ量が増えるにつれopenとcloseのコストがどんどん増えるという欠点があります。利点はポータブルなこととファイル一つで持ち運べること。
#
現状でもfsdbmで一応ポータブルなkey-value storeというのは実現されてるわけですが。
2010/01/27 02:46:18 UTC(び)
#
はい
2010/01/27 02:46:27 UTCshiro
#
単純なkey-value store以上のものが必要ならdbmは考えない方がいいでしょうね。
2010/01/27 02:46:39 UTC(び)
#
なるほど
#
kahua.efsdbを書いた一番の理由は、インデックスロットを実装したかったからなのです
#
fsdbmって、keyがpathでvalueがファイルの中身なわけですが
#
そのファイルへのシンボリックリンクをインデックスにしてるんですね
#
実体がひとつでkeyがいっぱい、みたいなのが欲しかった/欲しい
#
最近のBerkeley DBって、そういうのができたと思う
2010/01/27 02:50:51 UTCshiro
#
はい。でもその時点でkey-value storeのパラダイムからははみ出しているので、ちゃんとしたrdbmに移行するか、あくまでkey-value storeは下請けのブラックボックスとして扱って (例えばgdbmなどにすげかえても動く形で) その上に複数インデックスのdbを作るか、というのがたぶん順当な方向ですね。
2010/01/27 02:51:39 UTC(び)
#
ちなみに、shiroさんの最初に言ってたアイディアって、fsdbmにdump/undump機能を追加するだけじゃだめなのかしら
#
dbmにインタフェースとしてそれを用意しとくと、バックエンドを替える時便利かも
2010/01/27 02:52:58 UTCshiro
#
別コマンドを通すならtarでもいいわけで。それさえも面倒だし、どうせエントリ数も大したことないのわかってるし、ってな場合向けです。
2010/01/27 02:53:07 UTC(び)
#
なるほど
#
ちょっとしたセッション情報の管理とかには便利そう
2010/01/27 02:55:11 UTCshiro
#
そうそう。あとファイルを直接編集できるしね。オプションファイルとかちょっとしたユーザ管理なんかでいちいち読み書きを書くのも何だなあという気がしてるので。
2010/01/27 02:56:40 UTC(び)
#
でも、たとえば最初にdbm.fsdbmで運用してて、性能が足りなくなったからdbm.gdbmに移行したくなった時なんかに、標準でdump/undump欲しいと思うことがあります
#
まぁ、毎回ちょろっと移行ツール書けば済むからいいんですが
#
ああ、設定ファイルは確かにあるな
2010/01/27 02:58:04 UTCshiro
#
そっか。wilikiの移行スクリプトは書いたけど、dbm汎用のは書いてないなあ。
2010/01/27 02:59:03 UTC(び)
#
標準のdump形式があると、便利かなぁと思うことはあります
2010/01/27 03:00:44 UTCshiro
#
S式dbmを標準のピボット形式にして相互変換できればいいのか。
2010/01/27 03:01:22 UTC(び)
#
そういえば、<hash-table>がwritableじゃないのは、object-hashメソッドがカスタマイズされてると困るから、という話がありませんでしたっけ?
#
確かshiroさんから聞いたようなかすかな記憶が
2010/01/27 03:03:02 UTCshiro
#
そうです。でもeq, eqv, string=については決まってるので読み書き可能でも構わないとは言えます。
#
「ハッシュリテラル」がある言語(正確には「マップリテラル」の方がいいか)って、ハッシュ関数と比較関数は決め打ちなんですよね。利便性はいいんだけれど、柔軟性を失うのが怖いのはLisperの臆病さか… Clojureは割り切っちゃってますけど。
2010/01/27 03:07:03 UTC(び)
#
CLはどうしてるんでしたっけ?
#
って、CLtL2を見ろ >俺
2010/01/27 03:07:47 UTCshiro
#
cl-user> (make-hash-table)
#<eql hash-table with 0 entries @ #x10009a31d2>
#
比較関数とハッシュ関数は自由に与えられます。
#
リテラル形式は無し。
2010/01/27 03:08:50 UTC(び)
#
なるほど
#
Gaucheの場合はobject-hashとobject-equal?でカスタマイズ、と
2010/01/27 03:11:24 UTCshiro
#
そういうデザインだったんだけど、いまいち使いにくいということがわかってきたので、もっといいデザインを考え中。
#
object-hashとobject-equal?によるカスタマイズも残すけど。
2010/01/27 03:34:10 UTCnaoya_t
#
Bignumを大量に放り込むことがよくあるのですが、そういう場合はじゅうらいどori
#
キーとしてBignumな値を放り込むことがよくあるのですが、そういう場合は従来通りeqvですかね >hash
2010/01/27 04:05:53 UTCshiro
#
bignumならeqvでいいと思います。eq?比較は保証されませんから。
2010/01/27 04:13:57 UTCnaoya_t@twitter
#
有難うございます
2010/01/27 04:36:27 UTCとおる。
#
この単語帳ソフトは中で単語のリストを成績順にソートしたりする必要があるみたいなんですが、そういうのに適したストレージってどんなのがあるでしょうか?
2010/01/27 04:37:51 UTCshiro
#
うーん、ディスク上でソートされててほしいの? そしたらインデックスにB treeとか使う真っ当なdbみたいなものになるかなあ。
#
単にメモリ上でソートされてて欲しいなら、読んだ辞書をtree-mapに入れてけば順番に取り出せるけど。
2010/01/27 04:47:47 UTCとおる。
#
やっぱりディスクにしまっておく場合は、まっとうな DB になっちゃいますかね。
2010/01/27 04:50:03 UTCshiro
#
ケースバイケースでしょう。毎回必ず全部読み、全部書き直すってことがわかってればソートした順で書いとけばいいだろうし。必要なとこだけ読み書きして、挿入があり得るのなら、自分で書いても結局普通のdbがやってるようなことを自前でやるだけになりそうな。
2010/01/27 05:06:26 UTCとおる。
#
ですよねぇ。
2010/01/27 05:45:05 UTChigepon
#
当初の想定では単語は登録されても 10^3 のオーダーだから、毎回全読み、全書きでいけるだろうというものでした。あとは human readable/writable であって欲しかったので S 式のままにしてあります。
2010/01/27 06:53:09 UTCとおる。
#
えぇ、まぁ、ひとりしか使わないならいいんですけど、ウェブサーバで一般に向けて公開する場合は、パフォーマンス向上のハックもありかなぁと思いました。逆に言うと、サーバサイドでやれる事ってそのくらいしかないような。
2010/01/27 07:03:21 UTChigepon
#
なるほど。自分ならRDBMSに入れてしまいますね。
#
サーバーサイドでやるなら、地味ですがファイルの競合も考えないといけないですね。
2010/01/27 07:22:48 UTC(び)
#
あったなぁ、ロックもかけないでカウンタファイルを更新していた某K_h_a(笑)
2010/01/27 07:46:07 UTChigepon
#
えw > 某K_h_a(笑)
2010/01/27 09:07:38 UTCnobsun
#
コードバトン。たのしそうだなぁ。
2010/01/27 10:30:49 UTCayato
#
>higeponさん RDBMS入れるとき、問い合わせはどうされてますか?。直接SQLなどを叩くんですか?
2010/01/27 10:36:56 UTCayato
#
自分はKahuaの場合、付属の永続化が諸事情でダメで、直接SQL -> S式SQL -> エセORマッパ という遍歴があるのですが、Schemeでの永続化は皆さんどうされてるんでしょうか。
2010/01/27 10:46:41 UTCshiro
#
私はS式を直接ファイルに書き出し、dbm、Kahuaのefsdb、ごくたまにdbiからdbd.mysql、って感じです。dbiが使いたい時っていうのは定型的なデータの出し入れが頻繁な時なんで、SQLのprepared statementで用が足りちゃってる感じです。
#
出し入れが頻繁でなければ、write-objectとread-ctorを書けばGaucheのオブジェクトはそのままread/write出来るので、オンメモリで持っといて適当にファイルにS式でダンプする感じ。
2010/01/27 10:59:30 UTChigepon
#
自分は環境に合わせる感じです、Gauche/Mosh なら prepared statement かな。Rails とかなら ActiveRecord ですませてしまiます。
2010/01/27 11:18:18 UTCayato
#
なるほど。勉強になります。いろいろい作っていて思った理想は、[オンメモリ <-> 外部表現] 且つ、それ自体ほかの機能を持たないプロセスで、ACIDを確保しつつ、どんなgoshからでも違いなく、メモリにアクセスする感覚で使えるものなんですよね。Common Lisp界隈にはそういったものがあるような匂いがするのですが。
2010/01/27 11:27:14 UTCshiro
#
Allegro CLについてるAllegroCacheはそんな感じですね。Kahuaの永続オブジェクトもそっちの方向を目指してはいるんですが、ちゃんと実装するのはかなりパワーが要ります。
#
あと、GaucheではRuiさんがobject prevalenceを実装したことがあります http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3AObjectPrevalence
#
あれ、t-code.orgにアクセスできないなあ。
2010/01/27 12:16:53 UTC(び)
#
さてと
#
バトン受け取ります
#
次はnobsunかな(笑)
2010/01/27 12:21:34 UTC(び)
#
ちなみに、差し支えなければKahuaの永続化がダメだった諸事情を教えてもらえるとありがたいです >ayato
2010/01/27 12:35:25 UTCayato
#
多分ハックすれば問題ない事なんでしょうけど(自分の力不足)、単純に外部のスクリプトからアクセスする必要があったんです。自分でOR map書く労力とKahuaをハックする労力を天秤にかけたときに前者を選びました。
2010/01/27 12:51:33 UTC(び)
#
あーなるほどわかります
2010/01/27 12:51:58 UTCayato
#
あ、文脈的に紛らわしかったので捕捉です。Kahuaの永続化が"ダメ"なのではなくて、自分の使い方が"ダメ"なのです。Kahuaの永続化は素晴らしいと思います。
2010/01/27 12:52:05 UTC(び)
#
ライブラリとしてのKahuaは整備が圧倒的に足りてないですからね
#
例えば、efsdbに保存していたものをmysqlに移行する時、毎度アドホックなツールを書かなきゃならない(現に何度か書いた)
#
あと、cronから叩くツールを書いたりとか
2010/01/27 13:01:30 UTC(び)
#
あー、やっぱScheme(Gauche)は読みやすい
#
というか読み慣れているから、すっと頭に入ってくる
2010/01/27 13:57:30 UTCRui
#
すいません、そういえばt-code.org放置してドメイン失効させてしまいました。
#
http://www.geocities.jp/rui3141592/prevalence.scm.html 最新か不明ですが。
2010/01/27 14:47:59 UTC(び)
#
Delhi bellyという表現を教わった
#
考えてみたら、かなり失礼な表現だな...
#
「スペイン風邪」に近いものを感じる
2010/01/27 20:44:04 UTCとおる。
#
豚インフルも豚に失礼。