clojureのシリアライズ系ライブラリを試した

要は、ゲームの進行状況を保存する為に、各変数の内容を文字列もしくはバイト列に読み書きしたい為。
今まではedn( http://clojure.github.io/clojure/clojure.edn-api.html )をそのまま使っていたが、これはjava arrayやatom, ref等をサポートしておらず、副作用バリバリに変数内容を変更する事が多いゲーム向きではなかったので。


チェック内容は以下の通り。

  • java arrayが読み書きできるか。特にobject-arrayの中身がS式だった場合でも正しく扱えているか
  • atom, refが読み書きできるか(ただし今回の調査では面倒なのでatomしか調べてない)
  • オブジェクトのトポロジカル構造が維持されるか
    • これは要するに、以下のようなオブジェクトをwrite/readした後に、carとcadrが同じオブジェクトとして再現されるか、という事。
(let [a (int-array [1 2])] (list a a))


以下を試した。

  • edn (org.clojure/clojure "1.5.1") http://clojure.github.io/clojure/clojure.edn-api.html
    • java array : △ (要カスタム指定)
    • atom, ref : △ (要カスタム指定)
    • topological : × (Schemeでの #0# 的な奴がないので絶望的)
    • 備考 : write時に自分で「#」でタグ付けし、readにオプションとして :readers を渡せば、一応java arrayやatom類を読み書きする事は可能。しかしwriterを書くのが面倒(これさえどうにかできれば、pr-strで一発dumpできるし標準付属なのでお手軽なのだが…)
  • carbonite (com.twitter/carbonite "1.3.2") https://github.com/sritchie/carbonite
    • java array : ×
    • atom, ref : ×
    • topological : ?
    • 備考 : これもカスタマイズ指定が可能なようだが面倒なので試してない。最近はあまりメンテされてない様子
  • Deep-Freeze (deep-freeze "1.2.2-SNAPSHOT") https://github.com/halgari/deep-freeze
    • java array : ×
    • atom, ref : ○
    • topological : ×
    • 備考 : java array以外に、symbolのシリアライズができないという問題もあり。今回試した中で、標準でatomを扱えたのはこれだけだった。最近はあまりメンテされていない様子
  • Cheshire (cheshire "5.3.1") https://github.com/dakrone/cheshire
    • java array : ×
    • atom, ref : ×
    • topological : ?
    • 備考 : dumpしたデータはjsonになる。これもカスタマイズ指定での変換は可能だが試してない


感想:

  • どのシリアライザもトポロジカル構造を再現してくれない!Common LispSchemeなら大体は標準完備なのに…
    • これはおそらく、clojureが「immutableなデータ構造」を前面に出している事が逆に悪い影響になっている気がする。トポロジカル構造を再現しないとまずいのは大半が破壊的更新時だと思うので。
    • atomとrefを標準でサポートしていないシリアライザがほとんどなのも、これらをサポートすると「トポロジカル構造の維持」が必須になってくるからでは、と思う。でもその割にはobject-arrayは平然とサポートしている。


セーブロードで利用したいという要望に対する結論:

  • どのシリアライザもトポロジカル構造を再現してくれない為、参照構造をそのままセーブデータとして書き込む事ができない。よって、マップ&キーワードもしくは配列&インデクス値を使い、間接的に参照を保持せざるをえない。超めんどい。
  • atom類については、Deep-Freezeは標準対応しているが、Deep-Freezeは他に問題が多いので却下したい。そして他には簡単に扱えるものはないので、atom類は使用しないで、参照を保持したい時はobject-arrayを使うようにすべき、という結論に。
    • とは言え、上記の通り、そもそも「参照を直に保存できない」という結論が出ている為、基本的にはインデクス値指定を多用すると思われるので、こっちについてはそれほど大きな影響はないと思う。
    • なお、変数そのものを更新したい場合は、alter-var-rootで直に更新する。
  • とりあえず「そのままjava arrayが扱える」グループの中でも、一番扱いやすかったnippyを採用しようと思う。


参考にしたリンク/関連リンク:

「タロットとループ、意志はどのようにして決まるか」参加

この前の「思考ツールとしてのタロット2013in京都(9/29)」( http://d.hatena.ne.jp/ranekov/20130930/1380539455 )に引き続き、「タロットとループ、意志はどのようにして決まるか」にも参加してきた。今回は15時〜17時の部と、18時〜20時の部の両方にフル参加。


これ一通りメモ取ってるけど、あんま公開しない方がよさそうだ。
とりあえず全体的な感想と、自分の相談内容とカードの結果と、その他の断片メモだけ書く事に。

続きを読む

偽物の世界と、その利用用途

「世界が偽物だという感覚」(の無料部分のみ)を読んだ。

自分の結論から言うと、このような感覚は完全に正しいものであり、それは我々の認識モデル構造に由来している。

  • ただし全く違う認識モデルを採用している人もいるようで、そのような人はこの感覚を全く持たなかったりするのではないか、とも考えている。

結論としては、我々は現実物理世界の中で暮らしているのではなく、デカルト劇場( http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%86%E3%82%B8%E3%82%A2%E3%83%B3%E5%8A%87%E5%A0%B4 )の中で暮らしており、デカルト劇場というのは現実物理世界の写像ではあるけれど、現実物理世界そのものではない、言わば「偽物の世界」なので、

どういうことかというと、この世界は全部どっきりカメラのセットのようなもので、この世界が本当だと思って生きているのは自分一人で、自分以外の人間は自分を騙すために役割を演じているだけで、自分の見ていないところではみんな役割を演じるのをやめて休憩したり、どこかに仕掛けられているカメラで僕のことを監視しながら「あいつうまく騙されてやがるな」とか喋ってるのだ、という妄想だ。

このテキストの前半部分は、前述のデカルト劇場の構造に丁度当てはまっているので、正しい認識である。
そして後半部分については、このように想像してしまった事により、デカルト劇場の内部にそれを再現した部分が生まれる可能性があり、もしそうであれば、後半部分についても、現実物理世界には沿っていないものの、ある種の正しい認識ではあるとは言える。



ところで、さっき書いた「我々は現実物理世界の中で暮らしているのではない」という点に反発される人も多いと思うので、少し解説しておく。
我々は五感を持っているので、現実物理世界の極一部の情報のみ取得できる(遠くの金庫の中身を直接認識したりはできない)。具体的に取得できる情報は、眼球で光を、耳で空気の振動を、等々。
しかし眼球に入ってくる光は、そのままでは単に「眩しい」「暗い」「赤い」「白い」程度しか判定できない情報であり、これを正しく画像変換処理を行わない限り、「目の前に誰それが立っている」というような「認識」を行う事はできない。この辺りはコンピュータでの画像処理と大体同じだろう。
耳に至っては、空気の振動という一次元情報をを鼓膜の振動として受け取り、それを「音」という形で認識するのみならず、その連続するパターンを「言葉」や「音楽」として認識してすらいる!熱心に音楽を聴いている最中に、自分の耳の中の鼓膜の振動を意識する人はいないだろう。しかし現実物理世界から得られる情報はその空気の振動だけであり、「現実物理世界には『感じる』事のできる『音楽』は存在していない」のだ。音楽が存在できるのは空気の振動が翻訳された後のデカルト劇場の中だけだ。そして勿論、その音楽を聴ける我々も、現実物理世界に存在してる方ではなくデカルト劇場の中の住人の方、という事となる。

  • とは言え勿論、現実物理世界にある身体がスピーカーの前にいるおかげで音楽が聴けているというのも間違いない。要は「現実物理世界は現実物理世界としてあるものの、我々はそこにある物を直に『感じる』事はできない。『感じる』事ができるのはデカルト劇場の中にあるものだけ」という事。これの応用として「前に聴いた音楽を思い浮かべる」というような事もできる。「泣いても叫んでも1mは1m」というのは現実物理世界では真だけれども、デカルト劇場の中では泣いたり叫んだりしたら1mが2mぐらいになったりし得るのだ。

で。
物理存在としての我々は現実物理世界から逃れる事はどうあがいてもできないけれど(たとえ宇宙服を着て宇宙に行ったとしても、二次元には到達できない!)、デカルト劇場の中の我々であれば、ある種の抜け道がある、と考えている。


(中略)


そういう訳で、自分は、理想的なマイ宇宙を作り出せるもの各種の開発を行っている。
もしなんかあった際には協力していただけると助かります。
(なんかよくわからない締めになってしまった)



最後に、これを意訳すると「人は、自分の思った通りの世界の中で生きていく事しかできない」という、すごく当たり前の結論になる。
とりあえず、自分のデカルト劇場の中ぐらいは、自分にとって過ごしやすい環境になるように色々と努力しても損はないだろう。

「おいしいClojure入門」を読んだ

最初にまとめ:この本は賞味期限が早いです。読むべき人が読む価値は大いにあるので積んでる人は早目に読んでおきましょう。自分には非常にこの本はありがたい!



本の感想:

  • プログラミングのクックブック、レシピ本は数多くあるけれど、その喩えで行くと、この本は「料理(既存パッケージ)のメニュー本」。ひたすら「leinの人(leiningenのサイトの画像の人)に注文したらすぐ食べれる」メニューとして、その料理の概要と食べ方が羅列されている。
    • 要は、クックブックやレシピ本よりも更に具象寄りの本と感じた。
    • 「あ、あれやりたい」と思った時に、この本の目次を見て、その用途に使えそうなパッケージを確認して、さらっと使う、みたいな感じ。
      • そんな事しなくても今clojure界隈で主流になってるパッケージの状況とか分かってる「既にclojureルネサンスの中に住んでる人」には不要の本。そうではない、田舎に住んでたり都会にやってきたばかりの人にとっては、「今clojureを日常的に使ってる人はこんなの使ってるのか、なるほど、これは便利」というのが分かり非常に役立つ。
    • 内容は非常に雑多。 ~/.lein/profiles.clj に入れとくべき常用プラグインから始まり、*.xlsx書き出し、arduinoandroidアプリ作成なども。「内緒でScalaのコードを走らせる」「jrubyruby gemをインストール」なんてのもちょっとだけある
  • パッケージの羅列という事で、この本自体の賞味期限は(clojure界隈の変化速度も早い事もあり)かなり短いと思われる。積んでたら価値が目減りするよ!
    • 結構誤植とか多いが、そういうのを気にするよりは一刻も早く出版する方を優先して正解の本だと思った。
    • 著者が外国の人という事で自分は最初、翻訳物だと勝手に思ってたが、そうではなかった。なので情報の鮮度は現時点では非常に高い。
  • フレーバーテキストとして、やたらと「ワインを注文する」「ビールを飲む」みたいなのが出てくるので酒飲みは注意(夜食テロ的な意味で)。
    • フレーバーテキストはやや鼻につくが(個人差あり)、勿論、この本にとって重要なファクターではない。
  • サブタイトルの「関数型脳を育てる」というのは完全に嘘。JAROに訴えられます。

その他、思った事:

  • おそらく海外のclojurianはみんなこんないい環境で開発してるのが既にデフォルトだったんだなあ、これは海外でclojure流行るの分かるわ…みたいに思った。
    • 日本でもclojureの求人増えろ!!!!!!
  • やっぱルネサンスのまっただ中に住むべき(住めるよう努力すべき)なんだろうなあ
  • やはりjava産廃
    • (註:この本では別にjavaを悪く書かれてはいない。自分が過去の経験より勝手にそう判断しているだけ)

イベント「思考ツールとしてのタロット2013in京都(9/29)」参加

これまで自作ゲーのストーリー等を作るのにかなりの困難を感じていたので、その助けになりそうだと考え、予約して行ってきた、そのメモ。
自分が重要だと思った事しかメモしてないので、イベント自体の紹介にはなってないです。イベント自体については以下等を参照。

続きを読む

第3回京都インディーズゲームセミナー行ってきた

いってきた。面白かった!参加された方おつかれさまでした。

メモ取ったのでここに写します。
ただし山田が興味を示した部分しかメモしてないです。部分だけなので講演者の意図とずれてたりするかも。
また内容も聞き間違いや山田の主観が入って不正確になってるかも、
間違ってたらごめんなさい。

続きを読む

paypalのdonateボタンを設置する方法

paypalのdonateボタンは、日本では設置できないようになっている。
日本の法律か何かで、銀行ではないpaypalでは個人から個人への送金が禁止されてるとか何とかだかららしい(詳細が気になる人はぐぐる)。
しかし海外の人が日本の人へpaypalを使って送金(寄付)するのは全く問題ない、という事だそうなので、色々と調べて試行錯誤した結果、どうにかdonateボタンを設置できた。
(主に、このWordPresspaypal寄付プラグインを参考にした→ https://github.com/artstorm/paypal-donations )
ただし、ボタン自体は設置できたものの、本当に最後の送金まで完遂できるかどうかはまだ未確認。


とりあえず、以下みたいな感じで設置すればok。

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
  <input type="hidden" name="cmd" value="_donations">
  <input type="hidden" name="business" value="*************">
  <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif"
    border="0" name="submit"
    alt="PayPal - The safer, easier way to pay online!">
</form>


businessのところの値には、paypalの自分自身の Merchant account ID を入れる。
paypal管理画面のマイアカウント→個人設定→一番下の「マーチャントアカウントID」に書いてある。具体的なURLは以下の通り(将来に移動したりしそうなので注意)。


あとは必要に応じて、さっきのformに色々足す。
具体的に何を足すかについては以下のあたりを参照。


具体的には以下がいじる候補か?

  • lcをen_USに固定
  • item_name(purpose)を適当に設定
    • ただしitem_nameが無指定だとpurposeは送り主が自由に入力可能になるので、設定しない方が簡易通信欄として使えて良いかも。
  • 尚、前述の通り、日本の人から日本の人への送金はできないので、currency_codeは下手にJPYにせずにUSDのままにしておいた方が親切だと思う。