トップ «前の日記(2009-10-13) 最新 次の日記(2009-10-18)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|

ToDo:


2009-10-14

_ 検索がうまくないという話

なにか僕は絶望的にヘタな検索をするという話をよくする。 けど具体的にどんなヘタ検索だったか覚えてなかったので、 適当にログをあさってヘタそうな検索失敗例を探してきた。 たいてい単語が足りてなくて増やすのだけど、 増やす前の検索キーワードで目的のものが見つかるはずがない。

  • DS => カルドセプト DS
  • MT => MT mersenne
  • 永田 => 永田 赤軍
  • span => span style => span style height
  • NTT => NTT goo

あとは何が知りたかったのか見当もつかないようなクエリが たまにあるはず…と思ったのだけど、意外となかった。 不意に「はらへった」とかで検索してた気がするんだけどなぁ。 本気で意図がわからなかったのは、 「財布」「店主」などがあった。 「雪歩shinh」というのもあったが俺は一体何を期待していたのか。

あとはどんなの出てくるかなー的に検索してみたのがあるな。 「学会 エロゲ」「彼女ほしい」「エロ動画」など。 そうそう「プロフ 姫 闇」も。

(00:48)

_ YAML問題は

結局 JSON module が入ってれば JSON 使って落とすことによって解決することに。

http://github.com/shinh/caddy

rm ~/.golf/ag/Count\ diamonds\ level\ *.db

とかしてから caddy update すればたぶんうまくいきます。

しかしまぁ今回で YAML はやっぱ ムダに機能多すぎだよなーという思いを強くした。 まぁ手で書きやすいのはいいんだけど、 お手軽シリアライザとしては JSON の方がいいのかもねえ。

本当は inspect => eval でもいいんだろうけど、 まぁ eval はちょっと恐い気もしたので。

さてここで問題です。以下のコードがあって、

eval(s.inspect)
  • s を自由な文字列から選べる時、任意コード実行可能な抜け道はあるか
  • s を自由な ruby オブジェクトから選べる時、任意コード実行可能な抜け道はあるか

できなさそうな気がするけど、 できるとしたら kurimura さんとかが すぐに発見してくれそうな。

(01:16)

本日のツッコミ(全13件) [ツッコミを入れる]
_ naruse (2014-05-24 01:31)

inspectをevalするな!1.9ではUnicode以外では戻らない事もあるようにしてたり。
後者はinspectメソッド自分で定義したら終了ですね。
前者もあったような気がするんですが、どうやるんだっけ

_ shinh (2014-05-24 01:31)

ごごめんなさい。ただ s が任意のオブジェクトっていうのは組み込みオブジェクトの中で想定してました。例えば下記を思いつきました。

s=Exception.new("\nputs'hehehe...'#")
eval(s.inspect)

_ naruse (2014-05-24 01:31)

っと、そーいえば書き忘れてましたが、模範解答は String#dump です。str==eval(str.dump)は保証されています。

> Exception.new("\nputs'hehehe...'#")
うーん、なんかそれってバグな気もしないでもないんですがどうなんだろう

まぁ、
o=Object.new;o.define_singleton_method(:inspect,proc{"puts 1"});p o
とか、Ruby 1.9の場合出来ちゃいますからねぇ。

_ shinh (2014-05-24 01:31)

おお、 dump なんてあるんですね。 Numeric, Array, Hash, Symbol あたりに dump を定義してもらえると、今回の範囲くらいならシリアライズできるから助かりますね…

_ naruse (2014-05-24 01:31)

うーん、それはMarshal.dumpかJSON使ってくださいというのがRubyの見解なのです。

_ shinh (2014-05-24 01:31)

Marshal.dump はバージョン間の移動が保証されてませんし(ですよね?)、 JSON はインストールしないといけないのが…

_ naruse (2014-05-24 01:31)

Marshal.dumpは、Marshalのマイナーバージョンが変わると下位バージョンに持って行けなくなり、メジャーバージョンが変わると行き来が出来なくなります。もっとも、1.9でも結局バージョンは変わりませんでしたし、せいぜい変わってもマイナーじゃないかな。一応Marshalの仕様は文書があるので最悪自力で何とかするという技もありつつ、そこまでするなら古いバージョンで他の形式にダンプしなおすのが楽です。
JSONはPureRubyバージョンがあるので、そちらを使うとビルド必要ありませんね。Numeric,Array,Hash,Symbol,String程度で、SymbolとStringを区別しなくていいならJSONが可搬性的にはベストではないかと。1.9では標準添付だし。まぁ、こっちも自分で書くって技はあります。

_ shinh (2014-05-24 01:31)

Marshal.dump はそいう versioning がされてたんですね。でもうーんデータ配布的な用途としては、マイナー増えるだけでも十分問題かなぁと思います。サーバのアップデートができないことを意味するので。

JSON は 1.9 では標準なんですね。これはありがたいです。あと私は貧乏症という不治の病にかかっていまして、 pure ruby のほげほげパーサは生理的に使用できないことになっていて、21世紀になって10年もたとうかというのに、困ったものです…

_ ku-ma-me (2014-05-24 01:31)

「Marshal.dump か JSON 使ってくださいというのが Ruby の見解」ってそうなんですか?
「Numeric, Array, Hash, Symbol あたりに dump を定義」するのは便利そうだと思うし、みんなリテラル持ってるものなので合理的に実装もできそうだと思うのですが、提案され議論された上で否決されたことがあるんでしょうか。されてなければ提案してみる価値はあったりして。

「便利」というのが具体的にどう便利か、というところが説得のポイントかなあ。String#dump はどういう時に使われているんだろう。

_ shinh (2014-05-24 01:31)

説得力があるかはわかりませんが、僕が便利だと思うのは、何かを集計するツールを二段階で作ってる場合なんかかなぁと思います。データを集めてくる段階のプログラム(以下前者)と統計情報を計算するプログラム(以下後者)があって、前者は時間がかかるとすると、後者のバグ修正ごとに前者を動かすのはだるいので、前者の持ってる中間データはダンプしておきたいわけです。でそいう時はまぁ Marshal.dump でもいいのですけど、本当にちゃんと集められてるのかなーとチェックしたい時はテキストフォーマットの方がやはりありがたくて…というような。うーん JSON や YAML でいいじゃんという気がする…

JSON よりちょっといい点としては自前で dump 定義すれば組み込み型以外も dump できるというのがあるか…

_ naruse (2014-05-24 01:31)

> 「Marshal.dump か JSON 使ってくださいというのが Ruby の見解」ってそうなんですか?
前に開発者会議だったかでその話題になった時の結論が、Marshal.dumpかYAML使え、でした。

> 「Numeric, Array, Hash, Symbol あたりに dump を定義」するのは便利そうだと思うし、みんなリテラル持ってるものなので合理的に実装もできそうだと思うのですが
いやいや、NumericやSymbolは比較的簡単ですが、コンテナ系のオブジェクトについては、リテラルでさっくり書けるのはその一部です。
例えば、a=[];a<<aとか、s="";[s,s]とか。dumpの場合はこれらを全てevalで戻るようにしないといけません。もちろん不可能ではないんですが、evalを使うというセキュリティ的な欠点を抱えつつ実装しきるのはなかなか楽じゃないと思います。

> JSON よりちょっといい点としては自前で dump 定義すれば組み込み型以外も dump できるというのがあるか…
実は gems の JSON は他のものも dump できます。to_json と self.json_create(o) を定義すればそれを使うのです。
http://flori.github.com/json/

_ ku-ma-me (2014-05-24 01:31)

そうか、グラフ構造は確かに手間ですね。考えると面白そうなネタです。

_ なひ (2014-05-24 01:31)

たいていの道はakrさんが通過済みであります: http://raa.ruby-lang.org/project/amarshal/
ちなみに1.8にはsoap/marshalもありますが誰も使ってませんかそうですか。

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

2009年
10月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1.shinh(2014-05-24 01:31) 2.ょゎ(2014-05-24 01:31) 3.shinh(2014-05-24 01:31)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h