「デコード」を含む日記 RSS

はてなキーワード: デコードとは

2012-01-31

http://anond.hatelabo.jp/20120130145610

PCでの複数コアの主な使い方というのは、まるで違う用途のタスクをそれぞれのコアに割り振って、一番負荷のかかるメインのタスクを停止させないことでキャッシュメモリフラッシュ回数を激減させることにより、システム全体のスループットを若干上げるためにあるのだと考えてた。

たとえばにAコアでメイングラフィック、Bコアで音声処理/ネットワークOS(ディスク入力I/O)みたいな。

セマフォだの同期処理だのまったく考えずにマルチコア恩恵をそれなりに受けることができる手法って、ほかにないですよね。



ちょっと前に話題になったヘテロジニアスマルチコアなんて、モロ的にそういう発想ですよね。

動画デコードに特化したコアとか、アフィン変換に特化した不動少数SIMDコアとか、AESなど暗号専用のコアとか、それらをまとめる一般整数コアなどまとめて、今までより速いのを安く低消費電力で作って、車載ナビで地デジネットゲームもokにしちまおうぜみたいな。



最近PCは、それとはまた違うアプローチで、CPUコア同様のGPUコアももうすこし自由に使えるような仕組みを増やして、性能稼ごうって方向みたいですが。

2012-01-30

http://anond.hatelabo.jp/20120130145129

具体的に言えば、JPEGの伸縮みたいに、同時期に大量に固まりやすいタスクを 最大瞬間風速を乗り切るためにマルチコアを使うことはあると思うよ。

別に100%使い切る必要性はないし。

そもそも論として、単純動作だけならシングルコアで十分で、瞬間的に訪れるバーストを並列化して軽減するってのが使い方じゃね?

米1枚のJPEGを並列化するんじゃなく、複数枚のJPEGデコードな。

2011-06-27

jQuery.fileTree と 日本語ファイル名 (IIS & PHP)

IIS+PHP(つまりWindows環境)で

A Beautiful Site (http://abeautifulsite.net/)さんの

jquery.fileTreeを利用させてもらった。

以下、留意点...



script:

パスを指定しないと、もとのhtmlがあるパス(ディレクトリ)にあるもの解釈する。

(/jqueryFileTree.php と指定すると、公開しているルートディレクトリにあるjqueryFileTree.phpを探しにいく)

http://...と指定して他のサーバへ問い合わせるのも可能な模様(だが、試していない)。



root:

Windows場合は、最後に/または¥が必要。

d:/

d:/temp/

など



日本語文字化け対策:

hemlentries -> htmlspecialchars は必須。

 http://treatment-head.blogspot.com/2008/11/jquery-file-tree_21.html

 ただし、UTF-8EUC-JPでページを記述している場合は、さらに処理が必要。



phpではscandirなどのファイル処理において

windowsでは、mbstringの設定にかかわらず、引数SJIS渡し、戻り値SJIS返しの模様。

したがってUTF-8EUC-JPでページを記述している場合は、

その点を考慮してconnectorsフォルダにあるjqueryFileTree.phpを書き換える必要がある。

(きれいなソースでないので公開はちょっと控えます)


このphpファイルの先頭に

$_POST['dir'] = urldecode($_POST['dir']);

という行があるが(スーパーグローバル変数デコード済みで、さらにデコードするのは危険phpマニュアルに記載されている)

どのみちUnicode文字列URLデコードはこの関数では無理なようなので、phpマニュアルのUserNoteから拝借。

http://php.net/manual/en/function.urldecode.php



こちらにズバリが掲載されているか...と試してみたが、どうも動作がうまくいかなかった

http://ameblo.jp/pushurinko/entry-10287161493.html



他、ご参考

 http://life-hack.jp/blog/charly/151

2010-04-19

須江岳史が東せつなに叫ぶ

「ワタクシの友人が言っていましたよ」突然、裏声めいた声で須江岳史くんが始めた。須江岳史くんが、ワタクシという言葉を使うと、説明不能の寒気がした。男の人でも、大人になって仕事をするようになったら使うだろうし、むしろ使うべきだと理屈ではわかるのだけれど、須江岳史くんが使っているのを聞くと、端的に言って気持ち悪かった。「どの人も、ゲームの策定者になれてしまうらしいのです。東せつなさんのような、凡庸な人ですら。ワタクシは東せつなさんが作ったゲーム自分から巻き込まれていった人間ですから、友人の言うことはとてもよくわかります」私を見ずに、正面にある鏡に映る自分の顔だけを彼は見ていた。彼の細かく揺れる光彩が不気味で、私はそこから目が離せなかった。「タイムライン上で偶然に出くわした、それをデコードするための適切な文脈のわからない言葉にも、人は一喜一憂するわけです。馬鹿にもわかる言葉で言えば、人は、彼が馬鹿にしている人物から馬鹿にされても馬鹿みたいに傷つく」私は体重を後ろに下げて、すぐにでも立ち去ろうとした。けれど、須江岳史くんの言葉は途切れ目がなくて、精一杯がんばっても、そのタイミングを掴めなかった。「せいこうという語を、ワタクシはセックス意味で発話しても、無垢な東せつなさんはサクセス意味で受け取ることはままあるでしょう。それと全く同じように、ポルノ禁止と叫ぶ声を、ある者は表現の自由侵害解釈し、ある者はそれを、日本治安の向上と読み解く。前者は表現の自由のために後者を叩き、後者治安のために前者を罵る。言葉のやりとりをしても、それぞれの心が持つ辞書で各々が勝手翻訳するため、意味のやりとりはできないわけでした。心の辞書翻訳した際に、それが快として響くか不快として響くかの違いしかない、無意味な音声のやりとりなわけでした」須江岳史くんは揺れる瞳で鏡を見つめたまま、話をやめようとしない。「正しくデコードできないので、無意味だが、しかし、無価値ではない。意味は伝わらなくても、罵りは罵りとして、賞賛は賞賛として、それだけは掛け値なしに伝わるのでした。だからこそ人は、彼が馬鹿にしている人物から馬鹿にされても馬鹿みたいに傷つく。意味はなくても、感情という価値はある。感情のやりとりにより、不快言葉を言った者には罰を与えそれをやめさせ、心地よい言葉を言う者には心地よい言葉をかけ、それを推奨させるのが、会話の本質なのです。歴史を振り返ってみれば、意味のやりとりができない者に対しては、ゲーム論的な賞罰のやりとりが唯一のコミュニケート手段になるのは、バベルの塔が崩れてからの通例なのでした。無意味ではあるが無価値ではない言葉により、どの人も、小さなゲームの策定者になれる。小さなゲームの策定者に振り回されるせいで、たとえどれだけ信じて祈っても、完璧幸せなどゲットできない。だからこそワタクシは、ゲーム的かつ誤配的な言葉を聞かないように、完全に隔絶された言論の管理国家を私は作りたいわけです。東せつなさんなんかに、会わないように」

2010-04-01

メイドいんジャパン」からぶっこ抜いた構造http://anond.hatelabo.jp/20100328131122#tb)に、この前映画館で見た、『誰かが私にキスをした』から連想したものをぶち込んだらこうなった。男一人で恋愛映画を見に行くのは正直キツかった。不自然なところをこれから直していっている途中なんだけど、無理がでてきた。出てきた無理を直していく作業に苦労している。「どんな言葉をぶちこむのが適当か」を判断するもの(思考ツール?)を用意しないまま思いつくままに言葉をぶち込んだのが敗因か。ぶち込まれる空欄(=以前に増田に貼り付けたもの(http://anond.hatelabo.jp/20100328131122#tb)のアルファベット)間の関連性をもっと意識すべきだった。というか、それさえ意識すれば何とかなるんじゃないだろうか。というか、それを意識して、いま思いついているものをぶち込みなおしたら、すんなり物語の形になるのではないだろうか? アルファベット間の関連性について今週の土曜日までに考えてみる。ぶちこみ直しの作業は土曜日に始めて土曜日に終わらせる。


 神酒薫(ミキ カオリ)が視点浮動者として存在する。高校二年生の女子。視点浮動者は、自分がどの視点から物事を見るか、どの記憶から物事をデコードするかを決められないでいる。

 視点を決定すると、通常ならば、その視点向けのコマーシャル(=企業が配給する良質のドラマ)を見ることができるのだが、県から支給されたモバイルを使っている神酒薫は、コマーシャルを見ることができない。だから、視点を決定するインセンティブがない。

 モバイルによる拡張現実は、学校での授業に必要になる。モバイルから発せられる電界が、それを身につけている者のコンタクトレンズ眼鏡に像を映す。神酒薫の父親は特別に教育に厳しい人なので、薫に個人向けのモバイルを買ってくれない。

 津島の神酒との思い出が存在する。

 時間の一回性が存在する。

 他人のTL上の自分を気にすることが存在する。

 神酒薫は他人からの視点を気にせずに生きることを求める。タイムラインに、他人が発言した自分の振るまいが蓄積されるので、自分の振るまいが正しいかどうかがひどく気になる。視点を決定している人たちは、自分の視界内の発言しか見る余裕がないので、他人の視点というものを気にしない。というか、視点を決定すると、カーソルの初期位置から一番近いのが返信欄になり、それから遠く離れたところに検索欄が移動するので、他人を検索すると言うことが少なくなる

 神酒には、勉強ばかりしているというイメージが、他者のタイムラインの中では固定化されている。高校一年学校祭の準備のとき、神酒はキキに励まされながら土砂降りの雨の中を自転車木材を運んだ。それをきっかけに、ポジティブアクティブ自分に変われそうな気がした。しかし、学校に戻ると、

「このときの神酒さんとイメージが変わった」

 と、クラスメート過去タイムラインを見せられる。クラスメートは肯定的な意味合いでそれを言ったのだが、神酒はとても恥ずかしくなる。もう、自分イメージからはずれた行動はしないようにしようと決めた。

 視点を決定しなければならないという切迫感が存在する。

 神酒薫は視点を決定しなければならないという切迫感を取り除くことを求める。

 電子アシスタント存在する。電子アシスタントはキキを含む。キキは、白いウォンバット。常に神酒の近くを付いてまわり、神酒を常に必要としてくれる。

 電子アシスタントは、その所有者が設定したように、その所有者を誉めたり注意したりしてくれる。モバイル勝手ソフトインストールすることを父は怒るのではないかと神酒は思ったが、キキの機能を見て、彼はキキを気に入る。

 キキを持っていることで、神酒薫は視点浮動者であることを隠す。電子デバイスに興味があるんだというフリができる。

 津島修一は、神酒と同じ中学校・同じクラスだった男子。神酒薫にキキをくれたのは、津島修一だった。

 津島は、男子からはハナコと呼ばれていた。というか、誰かに対して陰口で使っているハナコという呼び名を、津島に当てはめると、無矛盾なのだった。だから、津島=ハナコは憶測。

 ハナコの良いところは顔だけ。ハナコは男なのに生理がある(精神が安定していない)。ハナコは……。

 ハナコがハナコと呼ばれるようになったのは、ハナコが男子トイレの個室で泣きながら、ボールペンの先端を彼の腕にぶつぶつと刺していたから。

 卒業式に、津島修一に呼び出される。呼び出されたその瞬間まで、会話をしたことは一度としてなかった。卒業式の日に、神酒薫を好きだと言って、その贈り物だとしてキキをくれた。津島修一が勝手に、神酒薫のモバイルインストールしてしまったので、神酒薫はキキをアンインストールする方法を知らない。それに、日本語を喋る存在アンインストールすることは、殺しと同じことに思えてしまい、できない。

「ヒメ! ヒメ!」と、キキは神酒の足にすり寄る。

「うざかったら、ワンス・ア・ウィークって言えば、彼はしばらく動きを止める。週に一回くらい、電子アシスタントですらうざくなるときがあるでしょう?」と、津島は言う。「今日の夜八時に、キキが指定する場所に来て」とも。

 そのとき神酒は、「うん、行く」と答えてしまう。

 神酒は、クラスの中核をなす声の大きい集団からはジミーズと呼ばれていた。仕返しに、神酒は心の中で、声の大きい集団を、彼らの化粧のけばけばしさを由来にケバブと呼んでいた。ジミーズはジミーズなりに地味な人同士で集まっていたので、ケバブが思っているように友達がいないわけではない。卒業式の帰り、仲の良かった友達とカラオケに行く。神酒の視界の中には、まだその存在になれられないキキがいた。キキは、友達に見えないようにしてあった。

 カラオケからの帰り道、道の関係で一人になった。信号待ちをしていると、ラブホテル横断歩道を隔てた向かいに建っている。

 ラブホテルの裏道から、高校生カップルが、自転車の二人乗りをしてでてくる。

 ラブホテルの電光掲示が目に入る。

『まだまだ寒い夜 あつあつのラーメンを! プレミア価格5○○円(会員様)』

ラーメンって、おいしい?」キキが訊いてくる。

ワンス・ア・ウィーク」キキを黙らせる。

 給食で食べたソフト麺のベチャベチャした味が、舌の上で思い出された。その味をかき消すために、津島からもらった連絡先のメモを、小さく、小さく畳んで、制服スカートのポケットに入れた。ポケットに紙を入れたまま、洗濯機スカートを入れ、スイッチを押した。

 キキがしゃべり始めるたびに、「ワンス・ア・ウィーク」をした。そして約束の八時が過ぎ去るのを待った。

 津島タイムライン卒業式前後のものを見ないようにしようと決めた。見ないために、神酒は視点浮動者になることを選んだのだ。

 自分に自信を持てていない神酒薫は、彼からの告白を何かの悪いいたずらだと思い、津島修一とは連絡を取っていない。しかし、津島修一と神酒薫は同じ高校に通っているのだ。ときどき廊下ですれ違うと、気まずい。

 ほかの人は、タイムライン上に友人との約束記憶させる。神酒はキキに約束を覚えさせる。どちらも、モバイルを使って約束管理しているので、他者は神酒がすでに視点を決定しているのだと勘違いしている。

 神酒薫は、他人のタイムライン自分がどう記録されているかを気にすることを取り除きたい。

 電子アシスタントは他人のTL上の自分を気にすることを取り除く手段になるように見受けられる。神酒はキキに、神酒が他人のTLを気にしたらキキが神酒を注意するようにコマンドする。

 神酒薫が他人のTL上の自分を気にすることを取り除くことは失敗する。キキの注意が煩わしくて、神酒はイヤフォンと眼鏡を外してしまう。ワンス・ワ・ウィークしなかったのは、キキに自分を注意するようにコマンドしたのに、注意を理由にキキを黙らせるのはかわいそうだと思ったから。

 友人との会話:「モバイルを忘れたら、記憶が不確かになって約束の1日前に待ち合わせの場所にいることになって、困った」

 イヤフォンも眼鏡もつけずに図書室に行く。

 そこには、一人の女性がいる。上靴のいろは赤なので、一つ学年が上の三年生の先輩。神酒が一年生のころ、彼女は貸し出しカウンターの内側にいたことを神酒は覚えている。彼女ノートには、たくさんの三角形が書かれている。また、たくさんの三角形が書かれているページの反対のページには、三角関数表がセロハンテープで貼り付けられている。

 図書室の端に行くと、先輩が突然、「私のアシスタントを動かさないで」と言う。神酒はあわてて、拡張現実を身につける。

 キキがしきりに神酒の足下で、「ヒメあぶない! ヒメあぶない!」と言っていた。先輩のアシスタントは、天使の羽。神酒がぶつかった勢いで、空中を漂っていた。

アシスタント自分のことをヒメって呼ばせているの?」

 五時間目の授業から、モバイルオープンにしたままだったことを思い出す。(授業中はオーソリティが先生に移るため、電子アシスタントオフになる。)

「痛い男が、彼女を呼ぶみたい」と先輩は言う。「彼氏からプレゼントされたの?」

 神酒は、終わった、と思った。誰か男にキキをプレゼントされたとタイムライン上に記憶されたら、全てが終わってしまう、と神酒は思う。

 神酒は先輩のタイムラインを展開しようとする。彼女が、伊庭瑠璃という名前の三年生であることが表示される。偶数組だから、文系クラスだとわかる。ローディングを示す輪がくるくるまわり続けるだけで、タイムラインが表示されない。

「私の知ってる男も、彼女をヒメって呼んでいて、痛々しい」と伊庭は言う。

彼氏からもらったわけじゃなく!」と神酒。

「ヒメ! ヒメ!」とキキ。

「キキ! ワンス・ア・ウィーク(黙れ)!」

 キキはぴたっと止まる。

「そのアシスタント津島修一からもらったわけだ」と伊庭。

「え」

「だって、ワンス・ア・ウィークって、シュウイチってことでしょ?」

「そうだったのか!」

 キキをもらってから二年間、ずっと気づかなかった!

 納得したことで、もう隠しようがないことに気づき、神酒は硬直する。

「いや、でも、気のせいかもしれない。津島修一なんて人が私の知り合いにいたかは、タイムラインを確認してみないとわからないな……」と、苦しいとりつくろいをする。

 伊庭は、ふっと笑いを漏らす。

「そういえば、私の知り合いに津島なんていないかもしれない。私はタイムラインを持ってないから、確かめようがないや。名前なんて忘れちゃった」

「伊庭先輩は、視点浮動者なんですか?」

 伊庭はうなずく。「私とあなたの間には、一年の学年の違いが横たわっている。だから、私は視点浮動者というよりも、視点を持たないものと言った方が正しいかもしれない。県が私に貸し出したモバイルは、タイムラインを見る機能を持たない」

「伊庭先輩の親も、個人用のモバイルを持つことに反対なんですか?」

「ううん。中学受験のために塾に通わされたときに、安全のためのモバイルは持たされた。私は親に反発して、モバイルを川に投げ捨て、塾にも行かなかった。それ以来、親は私にモバイルを与えようとしない。そして中学受験をしなかったから、私はいま、公立高校であるこの学校にいる」

 図書館で話していても大丈夫か、すごく気になる。遠くで、溶けた雪がどさっと落ちる音が聞こえたから。それに、伊庭のアシスタントがあまりに寡黙だから。しかし、三月の土曜登校日の放課後なので、二人のほかに誰もいない。

「私は前の図書局局長だから、私がルールみたいなものだ。大丈夫」と伊庭は言う。「私と貴方の関係は、少し長いものになると思う。私が名前を忘れた誰かのせいで。貴方の呼び方を決めていい?」

 先輩は手を振る。視界上に、私の情報を展開したのだと思う。

「神酒さんって呼ぶのは、距離が遠くて好かないな」

「呼び捨てで、いいですよ」

「呼び捨てと、さん付けの間をとって、ミキクンっていうのはどうかな」言った伊庭先輩が、ひとりで笑う。「変だな」

「慣れれば、慣れますよ」

 伊庭先輩は、ミキクン、と十回繰り返した。「やっぱり、変だよ」自分が言い出したのに、くすくすと笑っていた。

「土曜登校日の放課後図書館でなにをしてたんですか?」と神酒。

「私の彼氏ーー名前は忘れちゃったーーは、一つ下の学年にいるんだけどーーつまりミキクンとおなじ学年なんだけどーーその、名前を忘れちゃった彼氏は、精神的に不安定なところがある。だから図書館にいる」

彼氏さんとの関係に、疲れてしまったの?」と神酒。

「ううん。疲れていないから、ここにいる。臨戦待機中」

「それと、その三角形とどういう関係が?」

「ただ待っているだけだと、頭が暇になる。かといって、彼から連絡があったときに何かに没頭していると、すぐには動けない。だから、私と私のアシスタントと彼のアシスタント三角形の頂点に見立てて、彼のアシスタントと私との間の距離を求めていた。彼のアシスタントは、彼の近くにいるから。彼を意識しながら、頭に作業をさせることができるから。そして彼が「死にたい」って言ったら、すぐにでも私は駆け出す。死にたい気分を、逸らしに行く」

死にたい気分って、そんなに簡単にそらせられるものなんですか」

「なんたって私は、彼より一年年上のお姉さんだから」

「どうやって?」

「その」伊庭は、一瞬迷う。「一緒にラーメン食べに行こう、とか」

「へ!?」

「え……」

「……」

「……」

 給食ソフト麺のべちゃべちゃした味を神酒は舌の上で思い出す。二人の間にすごく微妙空気が流れる。訊いたことを、神酒はすごく後悔する。

 伊庭先輩は、タイムラインを持たないので、神酒は、自分タイムライン上でどういうキャラクターであるかを気にせずに、勇気を持った行動をできる。津島と伊庭先輩を引き離そうと決める。伊庭先輩のために。

「伊庭先輩が津島くんを支えようとすることは、よいことだとは思わない。きっと、彼の負の力に引きずられてしまう。彼の行動をタイムライン記憶してる友達を、何人か紹介するよ。それを見たら、伊庭先輩はきっと津島くんから離れようと決心してくれる」

「私はタイムラインを持たないから、複数の他者の発言を根拠に、いますでに読みとっている彼からの愛の意味を変更することはできない。それに、彼の愛から読みとった意味は、私の内部にある。タイムライン上の外部化された記憶のように、消しされるものではない。そして私は、私がもう津島を助けられないという言葉を私のタイムライン上に蓄積することができないので、津島を助け続けなければならない」


 デスクトップから書き込んだタイムラインはないかと、伊庭瑠璃名前検索する。伊庭瑠璃から見える津島を知りたかった。しかし、伊庭瑠璃デスクトップ上のタイムラインも所有していない。

 検索ワード「図書局局長」でサーチをかける。彼女についての噂を書いているタイムラインが、いくつかある。図書室だより、生徒会だより、男性からの、そして女性からの、あこがれのまなざし。「どうしてハナコが、図書局局長と付き合っているんだ」という、いらだちの声。図書局局長は、自分の身を削って他者に尽くす、素晴らしい人間だということになっている。「八方美人だ」と言って、彼女を攻撃する人間にすらも。

 視点浮動者である神酒薫は、津島修一のタイムラインを見ることができる。見ないと決めたものを見ていることに、罪悪感がある。しかし、彼女が見ないと決めたものは卒業式前後記憶だったので、決めたことをやぶっていることにはならないのだ(と、神酒は自分をだます)。 

 津島修一は精神不安定なので、膨大な数の書き込みがタイムライン上に堆積している。津島修一は過度に記憶を外部化している。それを読む限りでは、津島修一は伊庭瑠璃からの自立を求めているらしい。伊庭に依存してばかりいる自分の弱々しさを嫌っているらしい。

 津島タイムライン上で、他人の反応を待ち続ける。しかし、他人がこない。反応がくるまで、じっとうずくまる。しかし、どれだけ待ってもこない。死にたい気分になる。その気持ちを消したいがために、他人の反応を待ち続ける……。他人の気持ちを引くために、自虐を繰り返す。そして、自傷をする。アップロードされた自傷画像には、ハナコがそうしていたのと同じ、ボールペンを腕に突き刺したものもあった。傷が治癒していく経時変化もアップロードされている。「そういうことをやめろ」という声が、彼には心地よい。しかし、心地よいのだが、しかられたダメージはしっかりと受けている。スパイラルは、次第に破滅的な方向へと落ちていく……。

 津島の頭の中では、津島タイムライン上に書き込まれた、伊庭瑠璃からの「愛してる」がリフレインしている。だから、伊庭瑠璃から離れることができずにいる。「愛してるから、なんでもできる」と伊庭瑠璃過去において言ったことを口実に、津島は伊庭に依存している。いや、その言葉自分に言い聞かせることで、伊庭が自分をいやしてくれるという現実から、抜け出さなくてもいいのだと自分をだましている……。

 伊庭の都合の良さは、まるで電子アシスタントみたいだ。そして電子アシスタント的な伊庭に依存している津島生き方は、独りよがりで弱々しくて、気持ち悪い、と神酒は思う。

「伊庭が記憶を外部化していないことを理由に、津島記憶の外部化をやめさせられるのでは。ペアルック的な感覚で」と神酒は思う。

 津島の神酒との思い出が存在する。神酒は津島タイムライン遡行していると、自分のことについては外部化されていないことに気づく。

 廊下の端。普段なら、カップルがそこにいるような場所。そこで神酒と伊庭は待ち合わせる。

 伊庭は、天使の羽を背中につけて待っている。それは、伊庭の茶目っ気でもある。伊庭のねらい通り、それをしている伊庭を神酒はかわいいと思う。伊庭のアシスタント天使ではなく天使の羽なのは、伊庭は天使ではなく天使になることを求めているから。

 人が少ない場所。伊庭はタイムラインを、モバイルではなくデスクトップ上でしか見られない。伊庭と神酒の二人で津島について話をするため、電界通信をオープンにして、伊庭と神酒は手をつなぐ。二人の拡張現実が共有される。

「伊庭の都合の良さは、まるで電子アシスタントみたいだ。そして電子アシスタント的な伊庭に依存している津島生き方は、独りよがりで弱々しくて、気持ち悪い」と神酒は言う。伊庭は表情変えずに、「そうね」と言った。

「伊庭が記憶を外部化していないことは津島修一が津島記憶の外部化を取り除く手段に、きっとなるよ」と、神酒は伊庭に言う。「だって、たとえば、私に告白したことを津島くんはタイムラインに載せていない。全ての記憶タイムラインにゆだねているわけではない」

 津島が、二人のいる廊下の端に現れる。三角測量で、伊庭の位置を知っていたのだ。文系の伊庭が三角測量で津島の居場所を求めていたのは津島の影響をうけていたからだったのだ。

 津島が現れたとき、伊庭はびくりとして、手を引く。

大丈夫だよ」

 神酒は伊庭の手を押さえる。

 知らない、大人の女性の声が聞こえる。

「他者のために尽くす貴方は素晴らしいわ……」

 声のするほうを見ると、伊庭のアシスタントがいた。

 伊庭は、彼女電子アシスタントの声を聞かせたくなかった。だから、彼女電界クローズドにしたかった。しかし、神酒が手を押さえたために、それができなかったのだ。

 津島三角測量は、伊庭のとは比べものにならないほど優れている。伊庭が緊張のためにかすかに肩を膨らませると、津島三角測量の、小数点以下の数字の変動としてインディケートされる。

「君たちは、僕について語っているのだろう?」と津島。「君たちは、悪である僕について語る。そうして、善であることを偽装したいんだ。そうだろう? 二人で語るだけで、実際には善の振る舞いをしないにも関わらず。僕は来てやったよ。善をなし得ない、君たちふたりの為に。どうだ、潔いだろう」

(ここから)

 津島が、タイムラインに載せていない記憶を持っていることは、津島タイムライン依存していることを取り除き得ない。高校時代における津島精神脆弱さのきっかけは、ほかならぬ、神酒による津島の拒絶だったのだ。津島タイムライン依存しているのは、タイムラインに載せることのできない記憶存在しているからこそなのだった。神酒が津島を振ったトラウマは伊庭瑠璃津島修一からの自由を得ることを阻む。

 神酒薫は神酒が津島を振ったトラウマを取り除くことを求める。

 時間の一回性(=神酒が津島との約束をやぶったこと)は、神酒薫が神酒が津島を振ったトラウマを取り除くことを阻む。

 神酒は、津島を振ったことを謝ろうとする。

 津島は、神酒がどれだけひどいことをしたかを伊庭に語る。タイムラインを持たない伊庭は、津島視点の神酒の行為を、疑わずに信じてしまう。

「貴方は、津島にそんなひどいことをしたの? 見損なう」と、伊庭は神酒に言う。

「まって。津島くんは、私を好きだったんじゃなかったの?」と神酒は言う。

 「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言は神酒薫が神酒が津島を振ったトラウマを取り除くことを助ける。

 神酒薫は時間の一回性を取り除くことを求める。

 「愛してる」ではどうにもならないことが存在する。

 「愛してる」ではどうにもならないことは神酒薫が時間の一回性を取り除くことの手段となる。

 「おまえの視点は確定的じゃなかったのか」と、津島は神酒に対して言う。

 天使の翼が「愛してる」ではどうにもならないことを取り除くことを求める。

 「おまえの視点は確定的じゃなかったのか」は天使の翼が「愛してる」ではどうにもならないことを取り除く手段となる

 天使の翼が「愛してる」ではどうにもならないことを取り除くことは成功する。

「私のアシスタントの声を聞かれて恥ずかしい」と伊庭は言う。

アシスタントに誉めてもらうなんて、みんなやってること。恥ずかしくないよ」と神酒。

「恥ずかしいよ! 恥ずかしくて、弱々しくて、気持ち悪い! アシスタントに頼っていないと自分を保てないなんて、一人の独立した人間として恥ずかしい! しかも、そんな恥ずかしい生き方は、私のアシスタントが求める生き方じゃない!」

 電子アシスタントは、神酒薫が時間の一回性を取り除く手段になる。

 天使の翼は電子アシスタントを取り除くことを求める。

 電子アシスタントに含まれるキキは、天使の翼が電子アシスタントを取り除く手段になる。

 伊庭瑠璃は、「神酒薫が他人からの視点を気にせずに生きることを得たこと」を求める。(どこかで神酒が、他人からの視点をとても気にして生きている描写が必要になる。そしてそれを伊庭が見たという描写も。)

 「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言は、伊庭瑠璃が「神酒薫が他人からの視点を気にせずに生きることを得たこと」を得ることを阻む。

 伊庭瑠璃は「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除くことを求める。

 神酒薫が視点浮動者として存在することは、伊庭瑠璃が「津島くんは、私を好

2010-03-31

メイドいんジャパン」からぶっこ抜いた構造に、この前映画館で見た、「誰かが私にキスをした」から連想したものをぶち込んだらこうなった。不自然なところをこれから直していっている途中なんだけど、無理がでてきた。


 神酒薫(ミキ カオリ)が視点浮動者として存在する。高校二年生の女子。視点浮動者は、自分がどの視点から物事を見るか、どの記憶から物事をデコードするかを決められないでいる。

 視点を決定すると、通常ならば、その視点向けのコマーシャル(=企業が配給する良質のドラマ)を見ることができるのだが、県から支給されたモバイルを使っている神酒薫は、コマーシャルを見ることができない。だから、視点を決定するインセンティブがない。

 モバイルによる拡張現実は、学校での授業に必要になる。モバイルから発せられる電界が、それを身につけている者のコンタクトレンズ眼鏡に像を映す。神酒薫の父親は特別に教育に厳しい人なので、薫に個人向けのモバイルを買ってくれない。

 津島の神酒との思い出が存在する。

 時間の一回性が存在する。

 他人のTL上の自分を気にすることが存在する。

 神酒薫は他人からの視点を気にせずに生きることを求める。タイムラインに、他人が発言した自分の振るまいが蓄積されるので、自分の振るまいが正しいかどうかがひどく気になる。視点を決定している人たちは、自分の視界内の発言しか見る余裕がないので、他人の視点というものを気にしない。というか、視点を決定すると、カーソルの初期位置から一番近いのが返信欄になり、それから遠く離れたところに検索欄が移動するので、他人を検索すると言うことが少なくなる

 神酒には、勉強ばかりしているというイメージが、他者のタイムラインの中では固定化されている。高校一年学校祭の準備のとき、神酒はキキに励まされながら土砂降りの雨の中を自転車木材を運んだ。それをきっかけに、ポジティブアクティブ自分に変われそうな気がした。しかし、学校に戻ると、

「このときの神酒さんとイメージが変わった」

 と、クラスメート過去タイムラインを見せられる。クラスメートは肯定的な意味合いでそれを言ったのだが、神酒はとても恥ずかしくなる。もう、自分イメージからはずれた行動はしないようにしようと決めた。

 視点を決定しなければならないという切迫感が存在する。

 神酒薫は視点を決定しなければならないという切迫感を取り除くことを求める。

 電子アシスタント存在する。電子アシスタントはキキを含む。キキは、白いウォンバット。常に神酒の近くを付いてまわり、神酒を常に必要としてくれる。

 電子アシスタントは、その所有者が設定したように、その所有者を誉めたり注意したりしてくれる。モバイル勝手ソフトインストールすることを父は怒るのではないかと神酒は思ったが、キキの機能を見て、彼はキキを気に入る。

 キキを持っていることで、神酒薫は視点浮動者であることを隠す。電子デバイスに興味があるんだというフリができる。

 津島修一は、神酒と同じ中学校・同じクラスだった男子。神酒薫にキキをくれたのは、津島修一だった。

 津島は、男子からはハナコと呼ばれていた。というか、誰かに対して陰口で使っているハナコという呼び名を、津島に当てはめると、無矛盾なのだった。だから、津島=ハナコは憶測。

 ハナコの良いところは顔だけ。ハナコは男なのに生理がある(精神が安定していない)。ハナコは……。

 ハナコがハナコと呼ばれるようになったのは、ハナコが男子トイレの個室で泣きながら、ボールペンの先端を彼の腕にぶつぶつと刺していたから。

 卒業式に、津島修一に呼び出される。呼び出されたその瞬間まで、会話をしたことは一度としてなかった。卒業式の日に、神酒薫を好きだと言って、その贈り物だとしてキキをくれた。津島修一が勝手に、神酒薫のモバイルインストールしてしまったので、神酒薫はキキをアンインストールする方法を知らない。それに、日本語を喋る存在アンインストールすることは、殺しと同じことに思えてしまい、できない。

「ヒメ! ヒメ!」と、キキは神酒の足にすり寄る。

「うざかったら、ワンス・ア・ウィークって言えば、彼はしばらく動きを止める。週に一回くらい、電子アシスタントですらうざくなるときがあるでしょう?」と、津島は言う。

 神酒は、クラスの中核をなす声の大きい集団からはジミーズと呼ばれていた。仕返しに、神酒は心の中で、声の大きい集団を、彼らの化粧のけばけばしさを由来にケバブと呼んでいた。ジミーズはジミーズなりに地味な人同士で集まっていたので、ケバブが思っているように友達がいないわけではない。卒業式の帰り、仲の良かった友達とカラオケに行く。神酒の視界の中には、まだその存在になれられないキキがいた。キキは、友達に見えないようにしてあった。

 カラオケからの帰り道、道の関係で一人になった。信号待ちをしていると、ラブホテル横断歩道を隔てた向かいに建っている。

 ラブホテルの裏道から、高校生カップルが、自転車の二人乗りをしてでてくる。

 ラブホテルの電光掲示が目に入る。

『まだまだ寒い夜 あつあつのラーメンを! プレミア価格5○○円(会員様)』

ラーメンって、おいしい?」キキが訊いてくる。

ワンス・ア・ウィーク」キキを黙らせる。

 給食で食べたソフト麺のベチャベチャした味が、舌の上で思い出された。その味をかき消すために、津島からもらった連絡先のメモを、小さく、小さく畳んで、制服スカートのポケットに入れた。ポケットに紙を入れたまま、洗濯機スカートを入れ、スイッチを押した。

 津島タイムライン卒業式前後のものを見ないようにしようと決めた。見ないために、神酒は視点浮動者になることを選んだのだ。

 自分に自信を持てていない神酒薫は、彼からの告白を何かの悪いいたずらだと思い、津島修一とは連絡を取っていない。しかし、津島修一と神酒薫は同じ高校に通っているのだ。ときどき廊下ですれ違うと、気まずい。

 ほかの人は、タイムライン上に友人との約束記憶させる。神酒はキキに約束を覚えさせる。どちらも、モバイルを使って約束管理しているので、他者は神酒がすでに視点を決定しているのだと勘違いしている。

 神酒薫は、他人のタイムライン自分がどう記録されているかを気にすることを取り除きたい。

 電子アシスタントは他人のTL上の自分を気にすることを取り除く手段になるように見受けられる。神酒はキキに、神酒が他人のTLを気にしたらキキが神酒を注意するようにコマンドする。

 神酒薫が他人のTL上の自分を気にすることを取り除くことは失敗する。キキの注意が煩わしくて、神酒はイヤフォンと眼鏡を外してしまう。ワンス・ワ・ウィークしなかったのは、キキに自分を注意するようにコマンドしたのに、注意を理由にキキを黙らせるのはかわいそうだと思ったから。

 友人との会話:「モバイルを忘れたら、記憶が不確かになって約束の1日前に待ち合わせの場所にいることになって、困った」

 イヤフォンも眼鏡もつけずに図書室に行く。

 そこには、一人の女性がいる。上靴のいろは赤なので、一つ学年が上の三年生の先輩。神酒が一年生のころ、彼女は貸し出しカウンターの内側にいたことを神酒は覚えている。彼女ノートには、たくさんの三角形が書かれている。また、たくさんの三角形が書かれているページの反対のページには、三角関数表がセロハンテープで貼り付けられている。

 図書室の端に行くと、先輩が突然、「私のアシスタントを動かさないで」と言う。神酒はあわてて、拡張現実を身につける。

 キキがしきりに神酒の足下で、「ヒメあぶない! ヒメあぶない!」と言っていた。先輩のアシスタントは、天使の羽。神酒がぶつかった勢いで、空中を漂っていた。

アシスタント自分のことをヒメって呼ばせているの?」

 五時間目の授業から、モバイルオープンにしたままだったことを思い出す。(授業中はオーソリティが先生に移るため、電子アシスタントオフになる。)

「痛い男が、彼女を呼ぶみたい」と先輩は言う。「彼氏からプレゼントされたの?」

 神酒は、終わった、と思った。誰か男にキキをプレゼントされたとタイムライン上に記憶されたら、全てが終わってしまう、と神酒は思う。

 神酒は先輩のタイムラインを展開しようとする。彼女が、伊庭瑠璃という名前の三年生であることが表示される。偶数組だから、文系クラスだとわかる。ローディングを示す輪がくるくるまわり続けるだけで、タイムラインが表示されない。

「私の知ってる男も、彼女をヒメって呼んでいて、痛々しい」と伊庭は言う。

彼氏からもらったわけじゃなく!」と神酒。

「ヒメ! ヒメ!」とキキ。

「キキ! ワンス・ア・ウィーク(黙れ)!」

 キキはぴたっと止まる。

「そのアシスタント津島修一からもらったわけだ」と伊庭。

「え」

「だって、ワンス・ア・ウィークって、シュウイチってことでしょ?」

「そうだったのか!」

 キキをもらってから二年間、ずっと気づかなかった!

 納得したことで、もう隠しようがないことに気づき、神酒は硬直する。

「いや、でも、気のせいかもしれない。津島修一なんて人が私の知り合いにいたかは、タイムラインを確認してみないとわからないな……」と、苦しいとりつくろいをする。

 伊庭は、ふっと笑いを漏らす。

「そういえば、私の知り合いに津島なんていないかもしれない。私はタイムラインを持ってないから、確かめようがないや。名前なんて忘れちゃった」

「伊庭先輩は、視点浮動者なんですか?」

 伊庭はうなずく。「私とあなたの間には、一年の学年の違いが横たわっている。だから、私は視点浮動者というよりも、視点を持たないものと言った方が正しいかもしれない。県が私に貸し出したモバイルは、タイムラインを見る機能を持たない」

「伊庭先輩の親も、個人用のモバイルを持つことに反対なんですか?」

「ううん。中学受験のために塾に通わされたときに、安全のためのモバイルは持たされた。私は親に反発して、モバイルを川に投げ捨て、塾にも行かなかった。それ以来、親は私にモバイルを与えようとしない。そして中学受験をしなかったから、私はいま、公立高校であるこの学校にいる」

 図書館で話していても大丈夫か、すごく気になる。しかし、三月の土曜登校日の放課後なので、二人のほかに誰もいない。

「私は前の図書局局長だから、私がルールみたいなものだ。大丈夫」と伊庭は言う。「私と貴方の関係は、少し長いものになると思う。私が名前を忘れた誰かのせいで。貴方の呼び方を決めていい?」

 先輩は手を振る。視界上に、私の情報を展開したのだと思う。

「神酒さんって呼ぶのは、距離が遠くて好かないな」

「呼び捨てで、いいですよ」

「呼び捨てと、さん付けの間をとって、ミキクンっていうのはどうかな」言った伊庭先輩が、ひとりで笑う。「変だな」

「慣れれば、慣れますよ」

 伊庭先輩は、ミキクン、と十回繰り返した。「やっぱり、変だよ」自分が言い出したのに、くすくすと笑っていた。

「土曜登校日の放課後図書館でなにをしてたんですか?」と神酒。

「私の彼氏ーー名前は忘れちゃったーーは、一つ下の学年にいるんだけどーーつまりミキクンとおなじ学年なんだけどーーその、名前を忘れちゃった彼氏は、精神的に不安定なところがある。だから図書館にいる」

彼氏さんとの関係に、疲れてしまったの?」と神酒。

「ううん。疲れていないから、ここにいる。臨戦待機中」

「それと、その三角形とどういう関係が?」

「ただ待っているだけだと、頭が暇になる。かといって、彼から連絡があったときに何かに没頭していると、すぐには動けない。だから、私と私のアシスタントと彼のアシスタント三角形の頂点に見立てて、彼のアシスタントと私との間の距離を求めていた。彼のアシスタントは、彼の近くにいるから。彼を意識しながら、頭に作業をさせることができるから。そして彼が「死にたい」って言ったら、すぐにでも私は駆け出す。死にたい気分を、逸らしに行く」

死にたい気分って、そんなに簡単にそらせられるものなんですか」

「なんたって私は、彼より一年年上のお姉さんだから」

「どうやって?」

「その」伊庭は、一瞬迷う。「一緒にラーメン食べに行こう、とか」

「へ!?」

「え……」

「……」

「……」

 給食ソフト麺のべちゃべちゃした味を神酒は舌の上で思い出す。二人の間にすごく微妙空気が流れる。訊いたことを、神酒はすごく後悔する。

 伊庭先輩は、タイムラインを持たないので、神酒は、自分タイムライン上でどういうキャラクターであるかを気にせずに、勇気を持った行動をできる。津島と伊庭先輩を引き離そうと決める。伊庭先輩のために。

「伊庭先輩が津島くんを支えようとすることは、よいことだとは思わない。きっと、彼の負の力に引きずられてしまう。彼の行動をタイムライン記憶してる友達を、何人か紹介するよ。それを見たら、伊庭先輩はきっと津島くんから離れようと決心してくれる」

「私はタイムラインを持たないから、複数の他者の発言を根拠に、いますでに読みとっている彼からの愛の意味を変更することはできない。それに、彼の愛から読みとった意味は、私の内部にある。タイムライン上の外部化された記憶のように、消しされるものではない。そして私は、私がもう津島を助けられないという言葉を私のタイムライン上に蓄積することができないので、津島を助け続けなければならない」


 視点浮動者である神酒薫は、津島修一のタイムラインを見ることができる。見ないと決めたものを見ていることに、罪悪感がある。しかし、彼女が見ないと決めたものは卒業式前後記憶だったので、決めたことをやぶっていることにはならないのだ(と、神酒は自分をだます)。

 

 津島修一は精神不安定なので、膨大な数の書き込みがタイムライン上に堆積している。津島修一は過度に記憶を外部化している。それを読む限りでは、津島修一は伊庭瑠璃からの自立を求めているらしい。伊庭に依存してばかりいる自分の弱々しさを嫌っているらしい。

 津島の頭の中では、津島タイムライン上に書き込まれた、伊庭瑠璃からの「愛してる」がリフレインしている。だから、伊庭瑠璃から離れることができずにいる。「愛してるから、なんでもできる」と伊庭瑠璃過去において言ったことを口実に、津島は伊庭に依存している。

「伊庭が記憶を外部化していないことを理由に、津島記憶の外部化をやめさせられるのでは。ペアルック的な感覚で」と神酒は思う。

 津島の神酒との思い出が存在する。神酒は津島タイムライン遡行していると、自分のことについては外部化されていないことに気づく。

 廊下の端。普段なら、カップルがそこにいるような場所。人が少ない場所。伊庭はタイムラインを、モバイルではなくデスクトップ上でしか見られない。伊庭と神酒の二人で津島について話をするため、電界通信をオープンにして、伊庭と神酒は手をつなぐ。二人の拡張現実が共有される。

「伊庭が記憶を外部化していないことは津島修一が津島記憶の外部化を取り除く手段に、きっとなるよ」と、神酒は伊庭に言う。「だって、たとえば、私に告白したことを津島くんはタイムラインに載せていない。全ての記憶タイムラインにゆだねているわけではない」

 津島の神酒との思い出が存在することがきっかけとなり、津島が忘れられない「弱点」が存在する。

 津島が忘れられない「弱点」が存在することがきっかけとなり、読解の文脈を変えられないことが存在する。

 津島が、二人のいる廊下の端に現れる。三角測量で、伊庭の位置を知っていたのだ。文系の伊庭が三角測量で津島の居場所を求めていたのは津島の影響をうけていたからだったのだ。

 読解の文脈を変えられないことは伊庭瑠璃津島修一からの自由を得ることを阻む。高校時代における津島精神脆弱さのきっかけは、ほかならぬ、神酒による津島の拒絶だったのだ。神酒が津島を振ったトラウマは伊庭瑠璃津島修一からの自由を得ることを阻む。

 神酒薫は神酒が津島を振ったトラウマを取り除くことを求める。

 時間の一回性は、神酒薫が神酒が津島を振ったトラウマを取り除くことを阻む。

 神酒は、津島を振ったことを謝ろうとする。

 津島は、神酒がどれだけひどいことをしたかを伊庭に語る。タイムラインを持たない伊庭は、津島視点の神酒の行為を、疑わずに信じてしまう。

「貴方は、津島にそんなひどいことをしたの? 見損なう」と、伊庭は神酒に言う。

「まって。津島くんは、私を好きだったんじゃなかったの?」と神酒は言う。

 「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言は神酒薫が神酒が津島を振ったトラウマを取り除くことを助ける。

 神酒薫は時間の一回性を取り除くことを求める。

 「愛してる」ではどうにもならないことが存在する。

 「愛してる」ではどうにもならないことは神酒薫が時間の一回性を取り除くことの手段となる。

 「おまえの視点は確定的じゃなかったのか」と、津島は神酒に対して言う。

 天使の翼が「愛してる」ではどうにもならないことを取り除くことを求める。

 「おまえの視点は確定的じゃなかったのか」は天使の翼が「愛してる」ではどうにもならないことを取り除く手段となる

 天使の翼が「愛してる」ではどうにもならないことを取り除くことは成功する。

 電子アシスタントは、神酒薫が時間の一回性を取り除く手段になる。

 天使の翼は電子アシスタントを取り除くことを求める。

 電子アシスタントに含まれるキキは、天使の翼が電子アシスタントを取り除く手段になる。

 伊庭瑠璃は、「神酒薫が他人からの視点を気にせずに生きることを得たこと」を求める。

 「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言は、伊庭瑠璃が「神酒薫が他人からの視点を気にせずに生きることを得たこと」を得ることを阻む。

 伊庭瑠璃は「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除くことを求める。

 神酒薫が視点浮動者として存在することは、伊庭瑠璃が「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除くことを阻む。

 天使の翼は「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除くことを求める。

津島修一が伊庭瑠璃からの自立を求めることは、天使の翼が「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除く手段になる」らしい。

 津島修一が伊庭瑠璃からの自立を求めることは、天使の翼が「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除く手段になるように見受けられる。

 「俺を忘れろ」という津島の発言が存在する。

 「俺を忘れろ」という津島の発言は、神酒薫が神酒が津島を振ったトラウマを取り除く手段になるように見受けられる。

 「俺を忘れろ」という津島の発言と伊庭が記憶を外部化していないことがともに存在していることが原因となり、神酒薫が神酒が津島を振ったトラウマを取り除くことは失敗する。「俺を忘れろ」という津島の発言は神酒薫が神酒が津島を振ったトラウマを取り除く手段とはならなかった。

 伊庭瑠璃津島修一からの自由を得ることは失敗する。

 「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言が存在することがきっかけとなり、モバイルがなくても覚えていることと神酒がすでに過去を振り切っていることが存在する。

 モバイルがなくても覚えていることは、神酒薫が視点を決定しなければならないという切迫感を取り除く手段となる。

 神酒がすでに過去を振り切っていることは、神酒薫が他人からの視点を気にせずに生きることを得る手段となる。

2010-03-28

メイドいんジャパンからぶっこ抜いた構造に、昨日映画館で見た、「誰かが私にキスをした」から連想したものをぶち込んだらこうなった。不自然なところをこれから直していく。



(身体的な前提)



 償いが存在する。

 神酒薫(ミキ カオリ)が視点浮動者として存在する。高校二年生の女子。視点浮動者は、自分がどの視点から物事を見るか、どの記憶から物事をデコードするかを決められないでいる。

 視点を決定すると、通常ならば、その視点向けのコマーシャル(=企業が配給する良質のドラマ)を見ることができるのだが、学校から支給されたモバイルを使っている神酒薫は、コマーシャルを見ることができない。だから、視点を決定するインセンティブがない。

 曖昧記憶存在する。

 時間の一回性が存在する。

 他人からの視線を気にすることが存在する。



(本編)



 神酒薫は他人からの視点を気にせずに生きることを求める。タイムラインに、他人が発言した自分の振るまいが蓄積されるので、自分の振るまいが正しいかどうかがひどく気になる。視点を決定している人たちは、自分の視界内の発言しか見る余裕がないので、他人の視点というものを気にしない。

 視点を決定しなければならないという切迫感が存在する。

 神酒薫は視点を決定しなければならないという切迫感を取り除くことを求める。

 電子アシスタント存在する。電子アシスタントはキキを含む。

 キキを持っていることで、神酒薫は視点浮動者であることを隠す。電子デバイスに興味があるんだというフリができる。

 津島修一は、同じ中学校だった男の子。神酒薫にキキをくれたのは、津島修一だった。卒業式の日に、神酒薫を好きだと言って、その贈り物だとしてキキをくれた。津島修一が勝手に、神酒薫のモバイルインストールしてしまったので、神酒薫はキキをアンインストールする方法を知らない。それに、日本語を喋る存在アンインストールすることは、殺しと同じことに思えてしまい、できない。自分に自信を持てていない神酒薫は、彼からの告白を何かの悪いいたずらだと思い、津島修一とは連絡を取っていない。しかし、津島修一と神酒薫は同じ高校に通っているのだ。ときどき廊下ですれ違うと、気まずい。

 神酒薫は他人からの視線を気にすることを取り除くことを求める。

 電子アシスタントは他人からの視線を気にすることを取り除く手段になるように見受けられる。

 神酒薫が他人からの視線を気にすることを取り除くことは失敗する。電子アシスタントは他人からの視線を気にすることを取り除く手段たりえなかった。

曖昧記憶は、記憶は不確かなものだという認識を視点浮動者が得る手段になる」

 伊庭瑠璃アシスタント(=天使の羽)が存在する。それがきっかけとなり、伊庭瑠璃存在する。それがきっかけとなり、キキに刻まれた津島記憶存在する。それがきっかけとなり、神酒が津島と付き合っていたという噂が存在する。

 神酒が津島と付き合っていたという噂は、神酒薫が他人からの視点を気にせずに生きることを得ることを阻む。

 神酒薫は神酒が津島と付き合っていたという噂を取り除くことを求める。

 キキに刻まれた津島記憶は神酒薫が神酒が津島と付き合っていたという噂を取り除くことを阻む。

 キキへのコマンドパスワード存在する。

 神酒薫はキキに刻まれた津島記憶を取り除くことを求める。

 キキへのコマンドパスワードは神酒薫がキキに刻まれた津島記憶を取り除く手段になるように見受けられる。

 神酒薫がキキに刻まれた津島記憶を取り除くことは失敗する。キキへのコマンドパスワードは、神酒薫がキキに刻まれた津島記憶を取り除く手段にはならず、むしろそれを阻んだ。

記憶は不確かなものだという認識は神酒薫が神酒が津島と付き合っていたという噂を取り除く手段になる」

 神酒薫は記憶は不確かなものだという認識を得ることを求める。

 伊庭瑠璃(イバ ルリ)は視点浮動者として存在する。

 視点浮動者として存在する神酒薫は、記憶は不確かなものだという認識を求める。

 曖昧記憶は、神酒薫が記憶は不確かなものだという認識を得る手段となる。

 神酒薫は曖昧記憶によって、記憶は不確かなものだという認識を得た。

 記憶は不確かなものだという認識は神酒薫が神酒が津島と付き合っていたという噂を取り除く手段となる。

 神酒薫は記憶は不確かなものだという認識によって、神酒が津島と付き合っていたという噂を取り除く。

 伊庭瑠璃津島修一からの自由を求める。

「読解の文脈を変えられないことは伊庭瑠璃津島修一からの自由を得ることを阻む」

 津島修一は伊庭瑠璃からの自立を求める。

 津島記憶の外部化が存在する。

 津島記憶の外部化は津島修一が伊庭瑠璃からの自立を得ることを阻む。

「伊庭が記憶を外部化していないことは津島修一が津島記憶の外部化を取り除くことを助ける」らしい。

 曖昧記憶存在する。それがきっかけとなり、伊庭が記憶を外部化していないことが存在する。

 伊庭が記憶を外部化していないことは津島修一が津島記憶の外部化を取り除く手段になるように見受けられる。

 曖昧記憶存在することがきっかけとなり、記憶流動性の低さが存在する。

 記憶流動性の低さが存在することがきっかけとなり、読解の文脈を変えられないことが存在する。

 読解の文脈を変えられないことは伊庭瑠璃津島修一からの自由を得ることを阻む。それがきっかけとなり、変えられない事実存在する。

 変えられない事実は伊庭瑠璃津島修一からの自由を得ることを阻む。

 神酒薫は変えられない事実を取り除くことを求める。

 時間の一回性は、神酒薫が変えられない事実を取り除くことを阻む。

 償いは神酒薫が変えられない事実を取り除くことの手段となる。

 変えられない事実存在し、伊庭瑠璃が視点浮動者として存在することがきっかけとなり、記憶がないと、全てを信じざるを得ないことが存在する。

 記憶がないと、全てを信じざるを得ないことが存在することがきっかけとなり、神酒薫が変えられない事実を取り除く手段であった償いは取り除かれる。

 記憶がないと、全てを信じざるを得ないことがきっかけとなり、「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言が存在する。

 「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言は神酒薫が変えられない事実を取り除くことを助ける。

 神酒薫は時間の一回性を取り除くことを求める。

 「愛してる」ではどうにもならないことが存在する。

 「愛してる」ではどうにもならないことは神酒薫が時間の一回性を取り除くことの手段となる。

 「おまえの視点は確定的じゃなかったのか」が存在する。

 天使の翼が「愛してる」ではどうにもならないことを取り除くことを求める。

 「おまえの視点は確定的じゃなかったのか」は天使の翼が「愛してる」ではどうにもならないことを取り除く手段となる

 天使の翼が「愛してる」ではどうにもならないことを取り除くことは成功する。

 電子アシスタントは、神酒薫が時間の一回性を取り除く手段になる。

 天使の翼は電子アシスタントを取り除くことを求める。

 電子アシスタントに含まれるキキは、天使の翼が電子アシスタントを取り除く手段になる。

 伊庭瑠璃は、「神酒薫が他人からの視点を気にせずに生きることを得たこと」を求める。

 「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言は、伊庭瑠璃が「神酒薫が他人からの視点を気にせずに生きることを得たこと」を得ることを阻む。

 伊庭瑠璃は「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除くことを求める。

 神酒薫が視点浮動者として存在することは、伊庭瑠璃が「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除くことを阻む。

 天使の翼は「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除くことを求める。

津島修一が伊庭瑠璃からの自立を求めることは、天使の翼が「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除く手段になる」らしい。

 津島修一が伊庭瑠璃からの自立を求めることは、天使の翼が「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言を取り除く手段になるように見受けられる。

 「俺を忘れろ」という津島の発言が存在する。

 「俺を忘れろ」という津島の発言は、神酒薫が変えられない事実を取り除く手段になるように見受けられる。

 「俺を忘れろ」という津島の発言と伊庭が記憶を外部化していないことがともに存在していることが原因となり、神酒薫が変えられない事実を取り除くことは失敗する。「俺を忘れろ」という津島の発言は神酒薫が変えられない事実を取り除く手段とはならなかった。

 伊庭瑠璃津島修一からの自由を得ることは失敗する。

 「津島くんは、私を好きだったんじゃなかったの?」という神酒薫の発言が存在することがきっかけとなり、モバイルがなくても覚えていることと神酒がすでに過去を振り切っていることが存在する。

 モバイルがなくても覚えていることは、神酒薫が視点を決定しなければならないという切迫感を取り除く手段となる。

 神酒がすでに過去を振り切っていることは、神酒薫が他人からの視点を気にせずに生きることを得る手段となる。

2010-03-17

http://anond.hatelabo.jp/20100317232059

地デジは無理だろ。

というか、地デジすら普及にこんだけ手間隙かかってるのに、3D対応地デジとか無理だろ。

考えると、3D対応地デジに最初からしとけば良いのにいまさら無理かもな。古い地デジ対応テレビデコードできないんじゃね。

2009-08-06

http://anond.hatelabo.jp/20090806152216

マジレス

自動→オート→A

外部→エクステリアとかexter-~→E

除細動→細動じゃなくす→デコードとかデフラグとかde-~→D

2009-04-04

所詮“自称”普通人なんてこんな程度。

↓あのさぁ、「自分がされて嫌な事は、他の人にもしてはいけません」と教えられてこなかったか?

http://anond.hatelabo.jp/20090403234837

俺達だって別に読みたくて読んでるわけじゃないのに

それとも、先人たちが繰り返し訴え続けてきた“それ”は実の伴わない「ただのキャッチフレーズ」なのか?

「薄馬鹿」と罵倒すれば“ダメージを与えられる”とか、追い詰め追い込んで言う事を聞かせられるなどと思っている時点で、品性下劣である事を宣言しているようなものだ。馬鹿で何が悪いのよ?

 正しく、「薄馬鹿言うものが薄馬鹿」。

別に「普通の人」でも、「迎合してヘラヘラ笑ったり、納得のいかないことで謝罪を要求され続けて」いるのは、ものすごく嫌なのだということです。でもそうしないと生きていけなかったりするので仕方なくしているのです。

「ものすごく嫌なのだ」というなら、しないで済む様に頭を使ったほうがよほど健康的で建設的ではないのかね?

http://anond.hatelabo.jp/20090404045713の↓には激しく同意

大体空気嫁というフレーズデコードしたら9割方が「うまい言い方が思いつかないが、とにかくお前の態度が気にくわない」

加藤諦三早稲田大学名誉教授によれば、

何事につけ完璧を求めたり、他者には他者の都合も事情もあることが受け入れられなかったりするのは、心理的に不健全な証拠

なんである。http://www.katotaizo.com/ぐらいは読了しておこうぜ?もっとも、この人の語り口はどっかネガティブな匂いがするので、耐性がない人にはおススメでないかも知れん。

http://anond.hatelabo.jp/20090401235551

折角の匿名日記なので普段口にしたら社会的に死にかねないようなことを言わせてもらえば、あなたがいじめられた原因はあなたが嫌われやすい人だから、というひどいトートロージーが答えになるでしょうか。あなたが悪いと言うのではなくて、恐らく生得的に嫌われやすい体質をしているのです(それは見た目だったり、話し方だったり、性格だったり時々によります)。三つ目の段落の話は内容から推察して小学校時代のことだと思いますが、そもそも小学生では普通の人でも「空気読む」能力はあんまりついてないものなので、あなたの対人スキルが原因ではないでしょう。原因を突き詰めれば単に生理的キモいという以上の理由はないかと。

#本来ならそういった「なんとなく」による差別を見つけたらしばき倒して自身の差別心との向き合い方を見つけるのが教育というもののはずですが・・・まあ日本の公立小学校の教師程度にそれを期待するのは無理な相談なんでしょうね。

学生時代サークルの面々に小学校時代の話を語った時の反応も、どうも既に鬱陶しがられているという感じがしますね。その時どのように話したのかは知りませんが、エントリにある通りの内容を話したとしたら同情されるのが一般的な反応だと思います。普通いじめられてる人に味方しないのはマズいですからね。空気を読めるようにするにはどうしたらいい?とアドバイスを求めたことに対するサークルの面子の反応もかなりひどいですし。これらの諸々をあなたは「空気を読むスキル」の欠如が原因だとしていますが、そもそも嫌われているので空気を読む権利すら与えられていないように見えます。大体空気嫁というフレーズデコードしたら9割方が「うまい言い方が思いつかないが、とにかくお前の態度が気にくわない」なので、空気を読む能力を身につけたい!と思ったとしてもどうにもならないというか解決になりません。

#その場で取るべき態度を取れという意味空気嫁と言う場合も確かにありますが、あなたのエントリを読む限りは関係なさそうです。

ではどうすればいいのよって話になりますが、プライベートでは差別心の薄い連中を捜して付き合うのが次善の策でしょうか。あるいは、同じことですがあなたの性質を嫌わない人と付き合うか。嫌われない体質になりたい!というのは挑戦的に過ぎると思います。人間持って生まれた性質はそうそう変えられませんからね。

2009-02-18

それよりキーワードになってる単語含む文字列使ったリンク記述に骨ぼきぼきってなったよ。増田さんちょっと来ない間にどうしたの。あ、まずっぱい。

http://anond.hatelabo.jp/20090218084729

これねー、色々大人の事情があるらしんだわ。

発端はhttp://anond.hatelabo.jp/20090119011950とか、タグを閉じないで遊ぶ増田ちゃんがいて、

それをどうにも腹に据えかねた増田様がhttp://anond.hatelabo.jp/20090120165220なるエントリを挙げたもんだから、http://b.hatena.ne.jp/naoya/20090120#bookmark-11744130とかって対策されたんだけど、

たぶん使ったHTMLを正規化するライブラリASCII以外を数値文字参照にするようで、http://anond.hatelabo.jp/20090121091528の様に携帯からみれなくなったり、キーワードを含むページが化けたりした。

それで、その流れと関係あるかは分からないけれど、おそらく文字実体参照を含むキーワードに関するバグを直すためか、

http://anond.hatelabo.jp/20090126170135みたいに文字化けするバグトラックバックツリーの欄に痕跡あり)を経て、

キーワードリンク関係の処理機構が変わり、http://anond.hatelabo.jp/20090128194522のような状態となり、

更に、http://anond.hatelabo.jp/20090204012513の指摘を受けて、数値文字参照デコードされるようになって、

http://anond.hatelabo.jp/20090205205616の状態に落ち着く事となったらしい。

2009-02-16

アンカーテキストエンコードされてたらデコードするgreasemonkeyほしい

ついでに長かったら省略もする奴。

  • %が規程数(3つくらい?)以上だったらデコードする。HTMLエスケープは忘れない。
  • 長いときは真ん中あたりを省略したいところ。前n文字後m文字を残すなら単純。
    • 問題は文字種で長さが変わる事。そのへん良きに計らってくれるライブラリはないだろうか。

2009-02-05

[]リンク

おそらく「なんで携帯から見る増田はおかしいままなの?」を受けてのことだと思われるが、数値文字参照デコードされるようになった。しかし、キーワードがアンカー文字列にあるとそこからキーワードリンクにされてしまう問題は解決されていないため、さらに状況は悪くなった。たとえば、

[http://www.hatena.ne.jp/:title]

としても

はてな

となってしまう。何とかしていただきたい。せっかくタグの閉じ忘れに対応したのに、アンカーテキスト内でリンクを作らないで頂きたい。

というか、プレビューで元の入力テキスト数値文字参照デコードしないで頂きたい。大きなお世話である。

2008-10-17

http://anond.hatelabo.jp/20081006220009

YourFileHostのCAPTCHA画像をなんとかするの続き。

その後、適当にいじったら、手元環境で1枚あたり25秒くらい→だいたい2.5秒くらいで判別できるようになった。このくらいなら使えるかな。

速度向上に一番効いたのは、Token#importで画像を比較しているところの修正。他は細かい手直し。

使い方は前のやつと変わってません。

あと、テストに100枚くらいCAPTCHA画像食わせてみたけど、とりあえず全部正しく判定できた。

動作確認用のスクリプト (run.rb)

カレントディレクトリ以下にある*.gifCAPTCHA画像ファイル適当に判別するスクリプト。動作確認用にどうぞ。

後述のdecaptcha.rbと同じディレクトリ適当に置いてchmod +xしてね。

#!/usr/local/bin/ruby
$LOAD_PATH << File::dirname(File::expand_path($0))
require 'decaptcha'

STDOUT.sync = true

Dir.glob('*.gif').sort.each do |file|
  correct = File::basename(file, '.*')
  puts "Processing file: #{file}"
  start_time = Time.now
  ret = DeCAPTCHA.decode(file)
  elapsed = Time.now - start_time

  puts "  Result: #{ret} (=> #{(correct == ret) ? "Ok" : "Fail"})"
  puts "  Elapsed time: #{elapsed}"
  puts
end

コード (decaptcha.rb)

#!/usr/local/bin/ruby
require 'rubygems'
require 'gd2'
require 'pp'

#
#= CAPTCHA画像解析モジュール
# CAPTCHA画像ファイルを食わすとあら不思議Stringが出てくるよ。
# YourFileHostのやつに対応。
#
#== Usage
# decoded_str = DeCAPTCHA.decode("some_captcha_image.gif")  #=> String
# 失敗したらnilが返る。
#
module DeCAPTCHA
  DEBUG = false

  #=== CAPTCHA画像デコード
  # file::    画像ファイル名のパス
  # method::  未指定でよい。男は細かい事を気にするな。
  # returns:: CAPTCHA画像解析結果(String) or nil (デコード失敗時)
  def self.decode(file, method = DeCAPTCHA::Site::YourFileHost)
    return method.new(file).decode
  end



  #= CAPTCHA画像デコードクラス
  # このクラスサブクラスはimport, tokenize, stream_parseメソッドの
  # 実装を含む必要がある。
  class Site
    def initialize(file = nil)
      @pix = nil
      self.import(file) unless file.nil?
    end
    def decode
      return stream_parse(tokenize())
    end
  end

  #= YourFileHostのCAPTCHA画像を解析するクラス
  class Site::YourFileHost < Site
    def import(file)
      @pix = PixelMatrix.new.import(file)
      return self
    end

    # importしたイメージ(PixelMatrix)から、文字と思わしきパターンを
    # 抽出して上下マージンを切り取ってArrayにして返す。
    # returns:: Array of PixelMatrix
    def tokenize
      ret = []
      state = :initial
      for x in 0...@pix.width
        case state
        when :initial
          if !@pix.vline_blank?(x) then
            state = :tokenize
            pixel = PixelMatrix.new(0, 0, true)
            ret << pixel
            redo
          end
        when :tokenize
          if @pix.vline_blank?(x) then
            state = :initial
            next
          end
          x0 = pixel.width
          for y in 0...@pix.height
            pixel[x0, y] = @pix[x, y]
          end
        else
          raise 'NOTREACHED'
        end
      end

      ret.map! {|token| Token.new.import(token.cutoff_vmargin!) }
    end


    # PixelMatrixのArrayを受け取り、数字を判別。
    # tokens:: Array of PixelMatrix
    # returns:: String (判別結果)
    def stream_parse(tokens)
      rs = tokens.map {|x| x.guess.to_s }.join('')
      if rs.length != 4 then
        rs = nil
        if DEBUG then
          puts '- guess failed. dumping guess result of each token:'
          tokens.each_index do |i|
            print "##{i}:#{tokens[i].guess} "
            pp tokens[i].candidate
          end
          puts
        end
      end
      return rs
    end

    class Token
      @@digits = nil
      attr_accessor :candidate

      def initialize
        if @@digits.nil? then
          # 文字画像サンプルを作っておく
          @@digits = DIGITS_ASSOC.map {|digit|
            PixelMatrix.new(0, 0, true).import_array(digit) }
        end

        @candidate = Hash.new
      end

      # PixelMatrixを受け取り、文字画像サンプルと比較して
      # 一致率を計算しておく。
      # pixel:: PixelMatrix
      # returns:: self
      def import(pixel)
        @@digits.each_index do |i|
          digit = @@digits[i]

          if (digit.width - pixel.width).abs   > 4 or
             (digit.height - pixel.height).abs > 4 then
            @candidate[i] = -1  # サイズが違いすぎな場合、一致させない
            next
          end

          correct_bits = 0
          enlarged_width  = [digit.width,  pixel.width ].max
          enlarged_height = [digit.height, pixel.height].max
          for y in 0...enlarged_height
            dy = (y.to_f / digit.height * enlarged_height).to_i
            py = (y.to_f / pixel.height * enlarged_height).to_i
            for x in 0...enlarged_width
              dx = (x.to_f / digit.width * enlarged_width).to_i
              px = (x.to_f / pixel.width * enlarged_width).to_i
              correct_bits += 1 if digit[dx, dy] == pixel[px, py]
            end
          end

          @candidate[i] = correct_bits * 100 /
                          (enlarged_width * enlarged_height)
        end

        return self
      end

      # importのときの比較結果をもとに文字を推測
      # returns:: Fixnum or nil(失敗時)
      def guess
        digit, ratio = @candidate.sort {|a, b| a.last <=> b.last}.last
        digit = nil if ratio < 0 or ratio < 65
        return digit
      end
    end
  end


  #= 画素マトリックスクラス
  # 画像ファイルを食わせると、各ピクセル(画素)を2値(black(1) or white(0))に
  # 変換して、内部で保持する。
  # 以後、Matrixクラスのような感じで個々の画素アクセスできる。
  class PixelMatrix
    BLACK = 1
    WHITE = 0

    attr_accessor :width
    attr_accessor :height

    # width::  幅
    # height:: 高さ
    # is_flexible:: 自動的に伸張するか
    def initialize(width = 0, height = 0, is_flexible = false)
      @matrix = Hash.new {|hash, key| hash[key] = Hash.new(WHITE)}
      @width, @height, @flexible = width, height, is_flexible
    end

    # file:: 画像ファイル名のパス
    # brightness_threshold:: 画素を黒とみなす閾値 (0 - 255, default: 0x40)
    # returns:: self (DeCAPTCHA::PixelMatrix)
    def import(file, brightness_threshold = 0x40)
      gd = GD2::Image.import(file)
      @width, @height = gd.width, gd.height

      self.each_with_axis do |x, y|
        color = gd[x, y]
        greyscale = (color.red + color.green + color.blue) / 3
        self[x, y] = (greyscale > brightness_threshold) ?
          WHITE :
          BLACK
      end
      return self
    end

    def import_array(array)
      array.each_with_index do |str, y|
        str.split('').each_with_index do |c, x|
          self[x, y] = c.to_i
        end
      end
      return self
    end

    # PixelMatrixを画像ファイルとしてexport
    # file:: 新たに作る画像ファイル名のパス
    def export(file)
      gd = GD2::Image::IndexedColor.new(@width, @height)
      gd.palette << GD2::Color::WHITE
      gd.palette << GD2::Color::BLACK
      self.each_with_axis do |x, y|
        gd[x, y] = {
          WHITE => GD2::Color::WHITE,
          BLACK => GD2::Color::BLACK,
        }[self[x, y]]
      end
      gd.export(file)
      return self
    end

    # 指定された位置の画素を返す。
    # returns:: PixelMatrix::BLACK(1) or WHITE(0)
    def [](x, y)
      if !@flexible and !in_range?(x, y) then
        raise RangeError
      end
      return WHITE if !@matrix.has_key?(y)  # XXX: for optimize
      return @matrix[y][x]
    end

    # 画素に値を設定。
    # returns:: PixelMatrix::BLACK(1) or WHITE(0)
    def []=(x, y, val)
      unless in_range?(x, y) then
        raise RangeError unless @flexible
        @width  = (x >= @width)  ? x + 1 : @width
        @height = (y >= @height) ? y + 1 : @height
      end

      @matrix[y][x] = val
    end

    def in_range?(x, y)
      ((0...@width) === x and (0...@height) === y)
    end

    # 指定された軸をもとに画素を走査し、Arrayに変換。
    # 例えば、to_a(:vertical, 10) とすると、x == 10 な列を取り出して
    # Arrayにして返す。
    #
    # axis:: 軸を指定 (:vertical または :horizontal)
    # pos:: 位置を指定。_axis_で指定した軸と直交する軸における位置を指定。
    def to_a(axis, pos)
      {:vertical => lambda {
        (0...@height).map {|y| self[pos, y]}
       },
       :horizontal => lambda {
        (0...@width).map  {|x| self[x, pos]}
       },
      }[axis].call
    end

    # returns:: Array
    def hline(y)
      self.to_a(:horizontal, y)
    end

    # returns:: Array
    def vline(x)
      self.to_a(:vertical, x)
    end

    # X軸方向に画素を走査。
    # y:: どの位置で走査するか
    # returns:: 指定された軸の上にドットが存在: false, 無い: true
    def hline_blank?(y)
      return true if @matrix.has_key?(y) == false # XXX: for optimize
      for x in 0...@width
        return false if self[x, y] == BLACK
      end
      return true
    end

    # Y軸方向に画素を走査。
    # x:: どの位置で走査するか
    # returns:: 指定された軸の上にドットが存在: false, 無い: true
    def vline_blank?(x)
      for y in 0...@height
        return false if self[x, y] == BLACK
      end
      return true
    end

    # 上下のマージン削除した新しいPixelMatrixを返す。
    # returns:: PixelMatrix
    def cutoff_vmargin
      pixel = PixelMatrix.new(0, 0, true)
      head = 0
      tail = self.height - 1

      head.upto(tail) do |y|
        if !self.hline_blank?(y) then
          head = y
          break
        end
      end
      tail.downto(head) do |y|
        if !self.hline_blank?(y) then
          tail = y
          break
        end
      end

      head.upto(tail) do |y|
        0.upto(self.width - 1) do |x|
          pixel[x, y - head] = self[x, y]
        end
      end

      return pixel
    end
    
    # 自身の上下のマージン削除する。cutoff_vmarginの破壊版。
    # 速度稼ぎのために直接@matrixを触ったり、すこしずるをしている。
    # 効率は、ほんの少しだけ速くなったような誤差の範囲のような感じ。
    # returns:: self (PixelMatrix)
    def cutoff_vmargin!
      head = 0
      tail = self.height - 1

      head.upto(tail) do |y|
        if !self.hline_blank?(y) then
          head = y
          break
        end
      end
      tail.downto(head) do |y|
        if !self.hline_blank?(y) then
          tail = y
          break
        end
        @matrix.delete(y) if @matrix.has_key?(y)  # XXX
      end

      if head > 0 then
        head.upto(tail) do |y|
          next if !@matrix.has_key?(y)            # XXX
          @matrix[y - head] = @matrix.delete(y)   # XXX
        end
      end
      self.height = tail - head + 1

      return self
    end
    
    def each_with_axis
      for x in 0...@width
        for y in 0...@height
          yield(x, y)
        end
      end
    end
  end
end

class DeCAPTCHA::Site::YourFileHost::Token
DIGITS_ASSOC = [
  # 0
  ["00000000011111110000000000",
   "00000001111111111110000000",
   "00000011111000001111000000",
   "00001111111100010011110000",
   "00011111100000110000111000",
   "00111111000000100001111000",
   "00111111110001000001111100",
   "01111111000010000011111110",
   "01111100000110000111111110",
   "01111111000100000111111110",
   "11111100001000001111111111",
   "11100000001000011111111111",
   "11111000010000011111111111",
   "11111000110000111111111111",
   "10000000100001111111111111",
   "01100001000001111111111110",
   "01100010000011111111111110",
   "01100010000111111111111110",
   "00111100000111111111111100",
   "00011100001111111111111000",
   "00001100011111111111111000",
   "00001111111111111111100000",
   "00000011111111111111000000",
   "00000000111111111100000000"],
  # 1
  ["00001",
   "00111",
   "11111",
   "11111",
   "10001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001"],
  # 2
  ["0000011111111110000000",
   "0001111111111111000000",
   "0011110000000010000000",
   "0110000000000100000000",
   "1100000000001100011110",
   "1000000000001000001111",
   "1000000000010000000111",
   "1000000000110001111111",
   "1000000000100001111111",
   "1000000001000000011111",
   "0100000011000001111111",
   "0011000010000111111110",
   "0011000110000001111110",
   "0000001100000111111100",
   "0000001000011111110000",
   "0000011000000111100000",
   "0000110000000000000000",
   "0000111111111111111111",
   "0001111111111111111110",
   "0011111111111111111100",
   "0011111111111111111100",
   "0111111111111111111000",
   "0111111111111111110000"],
  # 3
  ["000000011111111110000000",
   "000001111111111111100000",
   "000011100000011111111000",
   "000111000000111111111000",
   "000110000001111111111100",
   "000100000001111111111100",
   "000100000011111111111100",
   "000110000111111111111000",
   "000010000111111111111000",
   "000000001111111111100000",
   "000000011111111111000000",
   "000000011111111110000000",
   "000000000000001100000000",
   "000000000000011100011100",
   "000000000000111000111110",
   "000000000000110000001110",
   "000000000001110001111111",
   "110000000011100011111111",
   "111000000111000000111110",
   "011100000110001111111100",
   "001111001110000111111000",
   "000011111100000011100000",
   "000000011000111000000000"],
  # 4
  ["0000000000011",
   "0000000000011",
   "0000000000111",
   "0000000001111",
   "0000000001111",
   "0000000011111",
   "0000000111111",
   "0000000110111",
   "0000001100111",
   "0000011100111",
   "0000011000111",
   "0000110000111",
   "0001110000111",
   "0001100000111",
   "0011000000111",
   "0111000000111",
   "0111111111111",
   "1111111111111",
   "0000000000111",
   "0000000000111",
   "0000000000111",
   "0000000000111",
   "0000000000111"],
  # 5
  ["000000001111111111111110",
   "000000011111111111111100",
   "000000111111111111111100",
   "000000111111111111111000",
   "000001111111111111110000",
   "000011100000000000000000",
   "000011011111111110000000",
   "000111111111111111000000",
   "001111100000000111000000",
   "001110000000000110001100",
   "000000000000000100011110",
   "000000000000001100000110",
   "000000000000011000011111",
   "000000000000011001111111",
   "000000000000110000011111",
   "000000000001100000111111",
   "110000000001100111111110",
   "011000000011000001111110",
   "011100000110000011111100",
   "001111000110011111111000",
   "000111111100001111110000",
   "000001111100000011000000",
   "000000001000011000000000"],
  # 6
  ["000000000000000110000000",
   "000000010001111111111000",
   "000001110000011100111100",
   "000011100000011000001000",
   "000111000011111000000000",
   "001111000001110000000000",
   "001110000000111100000000",
   "011110001111111111100000",
   "011100000111000011110000",
   "011000000010000001111000",
   "011000011110000011111100",
   "010000111100000111111110",
   "100000001000000111111110",
   "100001111000001111111111",
   "000011110000011111111111",
   "000000100000011111111111",
   "000011100000111111111111",
   "001111000001111111111110",
   "000010000001111111111110",
   "001110000011111111111100",
   "000111000111111111111000",
   "000011111111111111110000",
   "000000111111111111000000",
   "000000000111111000000000"],
  # 7
  ["0011111111111110001111",
   "0011111111111100000011",
   "0111111111111000000110",
   "1111111111111000111100",
   "1111111111110000001100",
   "0000000000000000011000",
   "0000000000000011111000",
   "0000000011000000110000",
   "0000001110000011100000",
   "0000011110001111100000",
   "0000111100000011000000",
   "0001111000000110000000",
   "0001111000111110000000",
   "0011110000001100000000",
   "0011110000001000000000",
   "0011100011111000000000",
   "0011000001110000000000",
   "0001000000110000000000",
   "0000000111100000000000",
   "0000000111000000000000",
   "0000000011000000000000",
   "0000001110000000000000",
   "0000001100000000000000"],
  # 8
  ["0000000111111111110000000",
   "0000011111111111111100000",
   "0000001111100000011110000",
   "0000000001110000000111000",
   "0011000011111000000011100",
   "0011100001111100000011100",
   "0011110000001110000011100",
   "0001111000011111000111000",
   "0000111100000111101110000",
   "0000011110000001111100000",
   "0000001111000011111110000",
   "0000111111110000011111000",
   "0011110011111000001111100",
   "0111100001111100011111100",
   "0111000000111110000111110",
   "1111000000011111000000111",
   "1111000000001111100011111",
   "1111000000000011111000010",
   "0111100000000001111100000",
   "0011110000000000111110000",
   "0001111110000001111110000",
   "0000011111111111111000000",
   "0000000011111110000000000"],
  # 9
  ["000000111111111110000000",
   "000001111111111111100000",
   "000111111111111001111000",
   "001111111111110000010000",
   "011111111111110000010000",
   "011111111111100000100000",
   "011111111111000001100000",
   "111111111110000001000111",
   "111111111110000010000001",
   "111111111100000110000111",
   "011111111000000100011111",
   "011111111000001000001111",
   "001111110000011000011111",
   "001111100000010001111110",
   "000111110000100000011110",
   "000001111111100000111110",
   "000000011111000111111100",
   "000000000010000001111100",
   "000000000110000001111000",
   "000100001100011111110000",
   "000111001100001111100000",
   "000011111000001111000000",
   "000000010000110000000000"],
]
end
__END__

2008-10-11

PS3ノンリニア編集ソフトを出してはどうか

ノンリニア編集 - Wikipedia

ノンリニア編集ノンリニアへんしゅう、Non-linear editing)はコンピュータ使用した非直線的(ノンリニア)な映像編集方式のこと。2台以上のデッキを使いテープからテープ映像コピーするリニア編集に比べ、編集箇所を自由に選択でき、映像データを即座に追加・削除・修正・並べ替えることができる利点がある。1990年代に登場し、PCと共に急速に普及した。

編集システムしてAvidAdobe Premiere、Corel Ulead VideoStudio、Final Cut Pro、flameKino、Canopus CWSシリーズ、Canopus HDWSシリーズなどが代表的である。

(1)プロセッサの性能

PS3CPUであるCell B.E.は浮動小数点演算処理能力が飛び抜けており、動画エンコード/デコード能力現在市販されているハイエンドCPUよりも十分に高い。

(2)価格

仮に年月が経過して一般的なPCの性能が向上し、相対的にPS3の処理能力が陳腐化したとしてコストパフォーマンスの面で断然有利。PS3本体とソフト価格の合計5万円弱で、同等の環境PCで揃えるのは至難。時間が経てば本体価格も下がっていくだろうし。

(3)ストレージインターフェース

全てのパッケージHDDが標準搭載で、今月からは80GBが標準になり、しかもその気になればさらに大容量の市販のHDD換装可能。よって素材となるファイルストレージしては容量面も拡張性も十分。また「PLAYSTATION Eye」といったUSBカメラで直接の素材取り込み手段もある。

(4)対応形式

一般的なMPEG1、2のみならずh.264DivX再生に対応しているので、出力形式の対応も敷居は低いのでは。

(5)動画共有サイトとの連携

PS3ソフトまいにちいっしょ」には、ゲーム内を録画してYouTubeアップロードする機能があり、他のメーカーに提供されている開発環境にもこの機能は含まれていると聞く。よって制作した動画や音声をシームレスYouTubeアップロードする事も可能なのでは。

(6)PlayStation Homeとの連携

制作した動画をフレンドに送ったり、制作者のhomeでフレンドを呼んで上映するといった機能も実現可能なはず。もしくは、ソフトそのものにストリーミングサーバの機能を付加するというのもアリかも。

(7)オンラインアップデート

当然ながら可能だろう。

(8)競合ハードが参入不可能な分野

大容量ストレージと高性能CPUが必須のソフトなのでWiiにはまず不可能だろう。可能性があるとすればXbox360だが、(3)は専用HDDしか選択肢がなく価格も高価。(5)は今のところ実績は無く、PS3に十分なアドバンテージが見込める。


YouTubeニコニコ動画など、ユーザが作成する動画コンテンツ(CGMとか言うんだっけ)の隆盛は今後も続くと思われるので、その分野で一定の地位を確立するのも将来的にも有益ではないかと思うが、いかがだろうか。

2008-10-06

YourFileHostのCAPTCHA画像をなんとかする

破ろうぜ!CAPTCHA画像♪(うっうーん)

そんなわけで、みんな大好きなYourFileHostだけども、最近みてみたら、なんかCAPTCHA認証がついているわけじゃないですか。

でもこれってさーCAPTCHAといっても見るからに危ういというか、見れば見るほど簡単に破れてしまいそうな気がして、どうにもむずがゆいアンニュイな気分になってしまうわけです。

そんで、このたび適当にいじってみたところ、それなりに推測できるコードが書けたので、ここに張ってみますね。

やってることは単純で、こんな感じ

  1. CAPTCHA画像ファイルをよみこむ
  2. ピクセルごとにグレイスケールにして、それで2値にする
  3. この時点でじゃまな背景が消えて、文字の形がわかってしまうわけです
  4. 縦軸に点がないところで切って、文字ごとにばらばらにする
  5. 文字画像のサンプルと比較して、一致率が高いものを採用

使い方は、こんな感じで

require 'decaptcha.rb'
captcha_string = DeCAPTCHA.decode(filename)
if !captcha_string.nil? then
  # 判別成功時の処理
else
  # 判別失敗時の処理。失敗することもあるのでよしなに。
end

あ、Ruby/GD2入れといてね。sudo gem install gd2とかで入ります。多分。

判別率はそこそこ良い感じになったんだけども、富豪プログラミングがたたってか、いかんせん遅いです。

手元だと1枚判別するのに20秒くらいかかることもある。

そんなわけで誰かチューニングしてくれるとうれしい。

追記

実行速度を上げた改良版はこっちにうpしました。以下のコードは参考程度に。

コード (decaptcha.rb)

#!/usr/local/bin/ruby
require 'rubygems'
require 'gd2'
require 'pp'

#
#= CAPTCHA画像解析モジュール
# CAPTCHA画像ファイルを食わすとあら不思議Stringが出てくるよ。
# YourFileHostのやつに対応。
#
#== Usage
# decoded_str = DeCAPTCHA.decode("some_captcha_image.gif")  #=> String
# 失敗したらnilが返る。
#
module DeCAPTCHA
  DEBUG = false

  #=== CAPTCHA画像デコード
  # file::    画像ファイル名のパス
  # method::  未指定でよい。男は細かい事を気にするな。
  # returns:: CAPTCHA画像解析結果(String) or nil (デコード失敗時)
  def self.decode(file, method = DeCAPTCHA::Site::YourFileHost)
    return method.new(file).decode
  end



  #= CAPTCHA画像デコードクラス
  # このクラスサブクラスはimport, tokenize, stream_parseメソッドの
  # 実装を含む必要がある。
  class Site
    def initialize(file = nil)
      @pix = nil
      self.import(file) unless file.nil?
    end
    def decode
      return stream_parse(tokenize())
    end
  end

  #= YourFileHostのCAPTCHA画像を解析するクラス
  class Site::YourFileHost < Site
    def import(file)
      @pix = PixelMatrix.new.import(file)
      return self
    end

    # importしたイメージ(PixelMatrix)から、文字と思わしきパターンを
    # 抽出して上下マージンを切り取ってArrayにして返す。
    # returns:: Array of PixelMatrix
    def tokenize
      getter, tokenizer = lambda {|queue|
        [ lambda { return queue },
          lambda {|x, pixel|
            if pixel.nil? then
              x, pixel = tokenizer.call(x, PixelMatrix.new(0, 0, true))
              queue << pixel
              return x
            end
  
            if !@pix.in_range?(x, 0) or @pix.vline_blank?(x) then
              return [x, pixel]
            end
            x0 = pixel.width
            @pix.vline(x).inject(0) do |y, color|
              pixel[x0, y] = color
              y + 1
            end
            return tokenizer.call(x + 1, pixel)
          }
        ]
      }.call([])

      x = 0
      while (x < @pix.width)
        x = @pix.vline_blank?(x) ?
          x + 1 :
          tokenizer.call(x, nil)
      end

      getter.call.map do |token|
        # Token.new.import(token.cutoff_vmargin.shrink)
        Token.new.import(token.cutoff_vmargin)
      end
    end

    # PixelMatrixのArrayを受け取り、数字を判別。
    # tokens:: Array of PixelMatrix
    # returns:: String (判別結果)
    def stream_parse(tokens)
      r = []
      tokens.inject(nil) do |prev, cur|
        r << cur.guess
      end

      rs = r.map {|x| x.to_s}.join('')
      if rs.length != 4 then
        if DEBUG then
          puts '- guess failed. dumping guess result of each token:'
          tokens.each_index do |i|
            print "##{i}: "
            pp tokens[i].candidate
          end
          puts
        end
        return nil
      end
      return rs
    end

    class Token
      @@digits = nil
      attr_accessor :candidate

      def initialize
        if @@digits.nil? then
          # 文字画像サンプルを作っておく
          @@digits = DIGITS_ASSOC.map {|assoc|
            PixelMatrix.new(0, 0, true).import_assoc(assoc) }
        end

        @candidate = Hash.new
      end

      # PixelMatrixを受け取り、文字画像サンプルと比較して
      # 一致率を計算しておく。
      # pixel:: PixelMatrix
      # returns:: self
      def import(pixel)
        gcd = lambda {|a, b|
          a, b = [b, a] if a < b
          return a if b == 0
          r = a % b
          return gcd.call(b, r)
        }
        lcm = lambda {|a, b| a * b / gcd.call(a, b) }
        mul_to_lcm = lambda {|a, b|
          g = gcd.call(a, b)
          [b / g, a / g]
        }

        0.upto(@@digits.size - 1) do |i|
          if (@@digits[i].width - pixel.width).abs   > 4 or
             (@@digits[i].height - pixel.height).abs > 4 then
            @candidate[i] = -1  # 比較対象とサイズが違いすぎ
            next
          end

          mul_ax, mul_bx = mul_to_lcm.call(@@digits[i].width,  pixel.width)
          mul_ay, mul_by = mul_to_lcm.call(@@digits[i].height, pixel.height)
          enlarged_width  = @@digits[i].width  * mul_ax
          enlarged_height = @@digits[i].height * mul_ay

          # 文字画像サンプルと比較対象画像のサイズをあわせる
          # 幅・高さをそれぞれ適当整数倍して、最小公倍数に合わせて比較
          # (めんどうだから)
          correct_bits = 0
          (0...enlarged_width).each do |x|
            (0...enlarged_height).each do |y|
              if @@digits[i][x/mul_ax, y/mul_ay] ==
                 pixel[x/mul_bx, y/mul_by] then
                correct_bits += 1
              end
            end
          end
          
          @candidate[i] = correct_bits * 100 /
                          (enlarged_width * enlarged_height)
        end

        return self
      end

      # importのときの比較結果をもとに文字を推測
      # returns:: Fixnum or nil(失敗時)
      def guess
        digit, ratio = @candidate.sort {|a, b| a.last <=> b.last}.last
        digit = nil if ratio < 0 or ratio < 80
        return digit
      end
    end
  end


  #= 画素マトリックスクラス
  # 画像ファイルを食わせると、各ピクセル(画素)を2値(black(1) or white(0))に
  # 変換して、内部で保持する。
  # 以後、Matrixクラスのような感じで個々の画素アクセスできる。
  class PixelMatrix
    BLACK = 1
    WHITE = 0

    attr_accessor :width
    attr_accessor :height

    # width::  幅
    # height:: 高さ
    # is_flexible:: 自動的に伸張するか
    def initialize(width = 0, height = 0, is_flexible = false)
      @matrix = Hash.new {|hash, key| hash[key] = Hash.new(WHITE)}
      @width, @height, @flexible = width, height, is_flexible
    end

    # file:: 画像ファイル名のパス
    # brightness_threshold:: 画素を黒とみなす閾値 (0 - 255, default: 0x40)
    # returns:: self (DeCAPTCHA::PixelMatrix)
    def import(file, brightness_threshold = 0x40)
      gd = GD2::Image.import(file)
      @width, @height = gd.width, gd.height

      self.each_with_axis do |x, y|
        color = gd[x, y]
        greyscale = (color.red + color.green + color.blue) / 3
        self[x, y] = (greyscale > brightness_threshold) ?
          WHITE :
          BLACK
      end
      return self
    end

    # reverse function of to_assoc
    def import_assoc(assoc)
      assoc.inject(0) do |y, columns|
        columns.inject(0) do |x, color|
          self[x, y] = color
          x + 1
        end
        y + 1
      end
      return self
    end

    # PixelMatrixを画像ファイルとしてexport
    # file:: 新たに作る画像ファイル名のパス
    def export(file)
      gd = GD2::Image::IndexedColor.new(@width, @height)
      gd.palette << GD2::Color::WHITE
      gd.palette << GD2::Color::BLACK
      self.each_with_axis do |x, y|
        gd[x, y] = {
          WHITE => GD2::Color::WHITE,
          BLACK => GD2::Color::BLACK,
        }[self[x, y]]
      end
      gd.export(file)
      return self
    end

    def to_assoc
      (0...@height).map do |y|
        (0...@width).map do |x|
          self[x, y]
        end
      end
    end

    # 指定された位置の画素を返す。
    # returns:: PixelMatrix::BLACK(1) or WHITE(0)
    def [](x, y)
      if !@flexible and !in_range?(x, y) then
        raise RangeError
      end
      return @matrix[y][x]
    end

    # 画素に値を設定。
    # returns:: PixelMatrix::BLACK(1) or WHITE(0)
    def []=(x, y, val)
      unless in_range?(x, y) then
        raise RangeError unless @flexible
        @width  = (x >= @width)  ? x + 1 : @width
        @height = (y >= @height) ? y + 1 : @height
      end

      @matrix[y][x] = val
    end

    def in_range?(x, y)
      ((0...@width) === x and (0...@height) === y)
    end

    # 指定された軸をもとに画素を走査し、Arrayに変換。
    # 例えば、to_a(:vertical, 10) とすると、x == 10 な列を取り出して
    # Arrayにして返す。
    #
    # axis:: 軸を指定 (:vertical または :horizontal)
    # pos:: 位置を指定。_axis_で指定した軸と直交する軸における位置を指定。
    def to_a(axis, pos)
      {:vertical => lambda {
        (0...@height).map {|y| self[pos, y]}
       },
       :horizontal => lambda {
        (0...@width).map  {|x| self[x, pos]}
       },
      }[axis].call
    end

    # returns:: Array
    def hline(y)
      self.to_a(:horizontal, y)
    end

    # returns:: Array
    def vline(x)
      self.to_a(:vertical, x)
    end

    # X軸方向に画素を走査。
    # y:: どの位置で走査するか
    # returns:: 指定された軸の上にドットが存在: false, 無い: true
    def hline_blank?(y)
      hline(y).find {|color| color == BLACK }.nil? ?
        true : false
    end

    # Y軸方向に画素を走査。
    # x:: どの位置で走査するか
    # returns:: 指定された軸の上にドットが存在: false, 無い: true
    def vline_blank?(x)
      vline(x).find {|color| color == BLACK }.nil? ?
        true : false
    end

    # 上下のマージン削除した新しいPixelMatrixを返す。
    # returns:: PixelMatrix
    def cutoff_vmargin
      pixel = PixelMatrix.new(0, 0, true)
      head = 0.upto(self.height - 1) do |y|
        break(y) if !self.hline_blank?(y)
      end
      tail = (self.height - 1).downto(0) do |y|
        break(y) if !self.hline_blank?(y)
      end

      head.upto(tail) do |y|
        y0 = pixel.height
        self.hline(y).inject(0) do |x, color|
          pixel[x, y0] = color
          x + 1
        end
      end

      return pixel
    end
    
    def each_with_axis
      (0...@width).each {|x|
        (0...@height).each {|y|
          yield(x, y)}}
    end
  end
end

class DeCAPTCHA::Site::YourFileHost::Token
DIGITS_ASSOC = [
# 0
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
],
# 1
[[0, 0, 0, 0, 1],
 [0, 0, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1]],
# 2
[[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
 [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0],
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
 [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
 [0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]],
# 3
[[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0],
 [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
# 4
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
 [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1]],
# 5
[[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
 [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
# 6
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
 [0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
# 7
[[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1],
 [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
# 8
[[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
 [0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
 [0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
 [0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0],
 [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1],
 [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0],
 [0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
# 9
[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1],
 [0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
 [0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1],
 [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0],
 [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0],
 [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
 [0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
]
end


__END__
Dir.glob('*.gif').each do |file|
  puts "Processing file: #{file}"
  p DeCAPTCHA.decode(file)
end

__END__

2008-01-08

言語を共有するということ

考えてみたら、いまこの文章を読んでいるあなたと私は、たぶん一度も会ったことがないわけで。

それなのに、ディスプレイ見て文字を切り出していくだけで

「文章の意味が理解できる」んだからすごい。


赤ん坊にモノの名前を教えるレベルのことは、別に不思議じゃないよ。

手と手をとりあって「これ、りんご」「これ、パパ」とかやるんだから、

名前とモノとの対応が付けられるのは分かる。


そうじゃなくて、定義を一度も確認しあったことがないのに、

分かる、って、なんでそんなことができちゃうの?


動画ファイルエンコードに例えてみるとそのすごさがわかる。

まわりの人が作ってる動画ファイルを調べたりとかして、

私がなんとかして同じようにエンコードするプログラムを作り上げる。

あなたも同じように、でも別の場所で別の人たちをみつつ、

なんとかしてデコードするプログラムを作り上げる。

そしたら、私の作ったファイルを、あなたが再生できるようになってるってこと。


どういう仕組みでそうなってるの?

なんで伝言ゲーム状態にならないの?


テレビとか本とかがあるからかとも思ったけど、

言語自体はもっと昔からあるよね。


教えてえらいひと。

2007-10-11

http://anond.hatelabo.jp/20071011071758

>仮に知識を共有してもそれを理解するスキルがないと共有してもしょうがない。

>結局のところ局所的な共有で、自分達の理解できる難易度の範囲で解せる(心理的に快適にその情報を受け入れることができる。)ことを共有するのが精神衛生上良いのだろうと思う。

超高圧縮な動画のコーデックがあったとしてだ

ということはありそうに思う。

難しすぎる科学の共有が進まないのはこれと同じメカニズムだよね。

2007-08-07

燃料が悪いと、ぜんぜん燃えないって話さ。

いきなり横からレスだけど。

人の心ってのを少し深く考えられない、こういうのをドラマ小説漫画アニメと同次元に考えるような人は理解できないんじゃないかな。

当事者じゃないって言い換えたほうがいいんだろうけど。

 

http://anond.hatelabo.jp/20070807160846

根元増田以外の(元増田を含む)全ての読者にとって、

エントリードラマ小説と同次元なんだよ。

言葉どおり、文字の羅列なんだし。しかも一人称小説

 

ここから「人の心を少し深く考える」のは困難だよ。

読者はエントリ内の「設定テキスト」を読んで、

それをデコードして、自分の脳内に展開しただけ。

 

だから設定に齟齬があるのも当然。

ゲームマスター」さんが設定を出してくれないし、

行動ごとの結果もまだまだぜんぜん出てきてないんだから。

 

状況がどう変化していくのかもわからない。

「登場キャラクター」の性格も真意もぜんぜん分からないし、

空気だって読めやしない。

 

ゲームマスター自身が「吐き出せる場所が欲しかっただけ。」

なんて言ってるから仕方ないんだけどね。

2007-04-20

あれ?これって

base64の文字列ですよね?と思ってデコードしてみたけど、文字化けしたのしか出てこなかった。

もう一度よく見るとただの16進数でしたね。ごめんごめん。圧縮してるのかな?

- 転職ならen
- 派遣ならen
 
1ページ中1ページ目を表示(合計:21件)