はてなキーワード: 直交とは
第1章 有限オートマトン D.Perrin:橋口攻三郎 1. 序論 2. 有限オートマトンと認識可能集合 3. 有理表現 4. Kleeneの定理 5. 星の高さ 6. 星自由集合 7. 特殊なオートマトン 8. 数の認識可能集合 第2章 文脈自由言語 J.Berstel and L.Boasson:富田 悦次 1. 序論 2. 言語 2.1 記法と例 2.2 Hotz 群 2.3 曖昧性と超越性 3. 反復 3.1 反復補題 3.2 交換補題 3.3 退化 4. 非生成元の探求 4.1 準備 4.2 生成元 4.3 非生成元と代入 4.4 非生成元と決定性 4.5 主錐の共通部分 5. 文脈自由群 5.1 文脈自由群 5.2 Cayleyグラフ 5.3 終端 第3章 形式言語とべき級数 A.Salomaa:河原 康雄 1. 序論 2. 準備 3. 書換え系と文法 4. Post正準系 5. Markov系 6. 並列書換え系 7. 射と言語 8. 有理べき級数 9. 代数的べき級数 10. べき級数の応用 第4章 無限の対象上のオートマトン W.Thomas:山崎 秀記 序論 Ⅰ部 無限語上のオートマトン 記法 1. Buchiオートマトン 2. 合同関係と補集合演算 3. 列計算 4. 決定性とMcNaughtonの定理 5. 受理条件とBorelクラス 6. スター自由ω言語と時制論理 7. 文脈自由ω言語 Ⅱ部 無限木上のオートマトン 記法 8. 木オートマトン 9. 空問題と正則木 10. 補集合演算とゲームの決定性 11. 木の単項理論と決定問題 12. Rabin認識可能な集合の分類 12.1 制限された単項2階論理 12.2 Rabin木オートマトンにおける制限 12.3 不動点計算 第5章 グラフ書換え:代数的・論理的アプローチ B.Courcelle:會澤 邦夫 1. 序論 2. 論理言語とグラフの性質 2.1 単純有向グラフの類S 2.2 グラフの類D(A) 2.3 グラフの性質 2.4 1階のグラフの性質 2.5 単項2階のグラフの性質 2.6 2階のグラフの性質 2.7 定理 3. グラフ演算とグラフの表現 3.1 源点付きグラフ 3.2 源点付き超グラフ 3.3 超グラフ上の演算 3.4 超グラフの幅 3.5 導来演算 3.6 超辺置換 3.7 圏における書換え規則 3.8 超グラフ書換え規則 4. 超グラフの文脈自由集合 4.1 超辺置換文法 4.2 HR文法に伴う正規木文法 4.3 超グラフの等式集合 4.4 超グラフの文脈自由集合の性質 5. 超グラフの文脈自由集合の論理的性質 5.1 述語の帰納的集合 5.2 論理構造としての超グラフ 5.3 有限超グラフの可認識集合 6. 禁止小グラフで定義される有限グラフの集合 6.1 小グラフ包含 6.2 木幅と木分解 6.3 比較図 7. 計算量の問題 8. 無限超グラフ 8.1 無限超グラフ表現 8.2 無限超グラフの単項性質 8.3 超グラフにおける等式系 8.4 関手の初期不動点 8.5 超グラフにおける等式系の初期解 8.6 等式的超グラフの単項性質 第6章 書換え系 N.Dershowitz and J.-P.Jouannaud:稲垣 康善,直井 徹 1. 序論 2. 構文論 2.1 項 2.2 等式 2.3 書換え規則 2.4 決定手続き 2.5 書換え系の拡張 3. 意味論 3.1 代数 3.2 始代数 3.3 計算可能代数 4. Church-Rosser性 4.1 合流性 4.2 調和性 5. 停止性 5.1 簡約順序 5.2 単純化順序 5.3 経路順序 5.4 書換え系の組合せ 6. 充足可能性 6.1 構文論的単一化 6.2 意味論的単一化 6.3 ナローイング 7. 危険対 7.1 項書換え 7.2 直交書換え系 7.3 類書換え 7.4 順序付き書換え 7.5 既約な書換え系 8. 完備化 8.1 抽象完備化 8.2 公平性 8.3 完備化の拡張 8.4 順序付き書換え 8.5 機能的定理証明 8.6 1階述語論理の定理証明 9. 書換え概念の拡張 9.1 順序ソート書換え 9.2 条件付き書換え 9.3 優先度付き書換え 9.4 グラフ書換え 第7章 関数型プログラミングとラムダ計算 H.P.Barendregt:横内 寛文 1. 関数型計算モデル 2. ラムダ計算 2.1 変換 2.2 計算可能関数の表現 3. 意味論 3.1 操作的意味論:簡約と戦略 3.2 表示的意味論:ラムダモデル 4. 言語の拡張 4.1 デルタ規則 4.2 型 5. 組合せ子論理と実装手法 5.1 組合せ子論理 5.2 実装の問題 第8章 プログラミング言語における型理論 J.C.Mitchell:林 晋 1. 序論 1.1 概論 1.2 純粋および応用ラムダ計算 2. 関数の型をもつ型付きラムダ計算 2.1 型 2.2 項 2.3 証明系 2.4 意味論と健全性 2.5 再帰的関数論的モデル 2.6 領域理論的モデル 2.7 カルテシアン閉圏 2.8 Kripkeラムダモデル 3. 論理的関係 3.1 はじめに 3.2 作用的構造上の論理的関係 3.3 論理的部分関数と論理的同値関係 3.4 証明論的応用 3.5 表現独立性 3.6 論理的関係の変種 4. 多相型入門 4.1 引数としての型 4.2 可述的な多相的計算系 4.3 非可述的な多相型 4.4 データ抽象と存在型 4.5 型推論入門 4.6 型変数をもつλ→の型推論 4.7 多相的宣言の型推論 4.8 他の型概念 第9章 帰納的な関数型プログラム図式 B.Courcelle:深澤 良彰 1. 序論 2. 準備としての例 3. 基本的な定義 3.1 多ソート代数 3.2 帰納的な関数型プログラム図式 3.3 同値な図式 4. 離散的解釈における操作的意味論 4.1 部分関数と平板な半順序 4.2 離散的解釈 4.3 書換えによる評価 4.4 意味写像 4.5 計算規則 5. 連続的解釈における操作的意味論 5.1 連続代数としての解釈 5.2 有限の極大要素と停止した計算 6. 解釈のクラス 6.1 汎用の解釈 6.2 代表解釈 6.3 解釈の方程式的クラス 6.4 解釈の代数的クラス 7. 最小不動点意味論 7.1 最小で唯一の解を得る不動点理論 7.2 Scottの帰納原理 7.3 Kleeneの列と打切り帰納法 8. プログラム図式の変換 8.1 プログラム図式における同値性の推論 8.2 畳込み,展開,書換え 8.3 制限された畳込み展開 9. 研究の歴史,他の形式のプログラム図式,文献ガイド 9.1 流れ図 9.2 固定された条件をもつ一様な帰納的関数型プログラム図式 9.3 多様な帰納的関数型プログラム図式 9.4 代数的理論 9.5 プログラムの生成と検証に対する応用 第10章 論理プログラミング K.R.Apt:筧 捷彦 1. 序論 1.1 背景 1.2 論文の構成 2. 構文と証明論 2.1 1階言語 2.2 論理プログラム 2.3 代入 2.4 単一化子 2.5 計算過程―SLD溶融 2.6 例 2.7 SLD導出の特性 2.8 反駁手続き―SLD木 3. 意味論 3.1 1階論理の意味論 3.2 SLD溶融の安全性 3.3 Herbrand模型 3.4 直接帰結演算子 3.5 演算子とその不動点 3.6 最小Herbrand模型 3.7 SLD溶融の完全性 3.8 正解代入 3.9 SLD溶融の強安全性 3.10 手続き的解釈と宣言的解釈 4. 計算力 4.1 計算力と定義力 4.2 ULの枚挙可能性 4.3 帰納的関数 4.4 帰納的関数の計算力 4.5 TFの閉包順序数 5. 否定情報 5.1 非単調推論 5.2 閉世界仮説 5.3 失敗即否定規則 5.4 有限的失敗の特徴付け 5.5 プログラムの完備化 5.6 完備化の模型 5.7 失敗即否定規則の安全性 5.8 失敗即否定規則の完全性 5.9 等号公理と恒等 5.10 まとめ 6. 一般目標 6.1 SLDNF-溶融 6.2 SLDNF-導出の安全性 6.3 はまり 6.4 SLDNF-溶融の限定的な完全性 6.5 許容性 7. 層状プログラム 7.1 準備 7.2 層別 7.3 非単調演算子とその不動点 7.4 層状プログラムの意味論 7.5 完全模型意味論 8. 関連事項 8.1 一般プログラム 8.2 他の方法 8.3 演繹的データベース 8.4 PROLOG 8.5 論理プログラミングと関数プログラミングの統合 8.6 人工知能への応用 第11章 表示的意味論 P.D.Mosses:山田 眞市 1. 序論 2. 構文論 2.1 具象構文論 2.2 抽象構文 2.3 文脈依存構文 3. 意味論 3.1 表示的意味論 3.2 意味関数 3.3 記法の慣例 4. 領域 4.1 領域の構造 4.2 領域の記法 4.3 記法上の約束事 5. 意味の記述法 5.1 リテラル 5.2 式 5.3 定数宣言 5.4 関数の抽象 5.5 変数宣言 5.6 文 5.7 手続き抽象 5.8 プログラム 5.9 非決定性 5.10 並行性 6. 文献ノート 6.1 発展 6.2 解説 6.3 変形 第12章 意味領域 C.A.Gunter and D.S.Scott:山田 眞市 1. 序論 2. 関数の帰納的定義 2.1 cpoと不動点定理 2.2 不動点定理の応用 2.3 一様性 3. エフェクティブに表現した領域 3.1 正規部分posetと射影 3.2 エフェクティブに表現した領域 4. 作用素と関数 4.1 積 4.2 Churchのラムダ記法 4.3 破砕積 4.4 和と引上げ 4.5 同形と閉包性 5. べき領域 5.1 直観的説明 5.2 形式的定義 5.3 普遍性と閉包性 6. 双有限領域 6.1 Poltkin順序 6.2 閉包性 7. 領域の帰納的定義 7.1 閉包を使う領域方程式の解法 7.2 無型ラムダ記法のモデル 7.3 射影を使う領域方程式の解法 7.4 双有限領域上の作用素の表現 第13章 代数的仕様 M.Wirsing:稲垣 康善,坂部 俊樹 1. 序論 2. 抽象データ型 2.1 シグニチャと項 2.2 代数と計算構造 2.3 抽象データ型 2.4 抽象データ型の計算可能性 3. 代数的仕様 3.1 論理式と理論 3.2 代数的仕様とその意味論 3.3 他の意味論的理解 4. 単純仕様 4.1 束と存在定理 4.2 単純仕様の表現能力 5. 隠蔽関数と構成子をもつ仕様 5.1 構文と意味論 5.2 束と存在定理 5.3 隠蔽記号と構成子をもつ仕様の表現能力 5.4 階層的仕様 6. 構造化仕様 6.1 構造化仕様の意味論 6.2 隠蔽関数のない構造化仕様 6.3 構成演算 6.4 拡張 6.5 観測的抽象化 6.6 構造化仕様の代数 7. パラメータ化仕様 7.1 型付きラムダ計算によるアプローチ 7.2 プッシュアウトアプローチ 8. 実現 8.1 詳細化による実現 8.2 他の実現概念 8.3 パラメータ化された構成子実現と抽象化子実現 8.4 実行可能仕様 9. 仕様記述言語 9.1 CLEAR 9.2 OBJ2 9.3 ASL 9.4 Larch 9.5 その他の仕様記述言語 第14章 プログラムの論理 D.Kozen and J.Tiuryn:西村 泰一,近藤 通朗 1. 序論 1.1 状態,入出力関係,軌跡 1.2 外的論理,内的論理 1.3 歴史ノート 2. 命題動的論理 2.1 基本的定義 2.2 PDLに対する演繹体系 2.3 基本的性質 2.4 有限モデル特性 2.5 演繹的完全性 2.6 PDLの充足可能性問題の計算量 2.7 PDLの変形種 3. 1階の動的論理 3.1 構文論 3.2 意味論 3.3 計算量 3.4 演繹体系 3.5 表現力 3.6 操作的vs.公理的意味論 3.7 他のプログラミング言語 4. 他のアプローチ 4.1 超準動的論理 4.2 アルゴリズム的論理 4.3 有効的定義の論理 4.4 時制論理 第15章 プログラム証明のための手法と論理 P.Cousot:細野 千春,富田 康治 1. 序論 1.1 Hoareの萌芽的な論文の解説 1.2 C.A.R.HoareによるHoare論理のその後の研究 1.3 プログラムに関する推論を行うための手法に関するC.A.R.Hoareによるその後の研究 1.4 Hoare論理の概観 1.5 要約 1.6 この概観を読むためのヒント 2. 論理的,集合論的,順序論的記法 3. プログラミング言語の構文論と意味論 3.1 構文論 3.2 操作的意味論 3.3 関係的意味論 4. 命令の部分正当性 5. Floyd-Naurの部分正当性証明手法とその同値な変形 5.1 Floyd-Naurの手法による部分正当性の証明の例 5.2 段階的なFloyd-Naurの部分正当性証明手法 5.3 合成的なFloyd-Naurの部分正当性証明手法 5.4 Floyd-Naurの部分正当性の段階的な証明と合成的な証明の同値性 5.5 Floyd-Naurの部分正当性証明手法の変形 6. ライブネスの証明手法 6.1 実行トレース 6.2 全正当性 6.3 整礎関係,整列集合,順序数 6.4 Floydの整礎集合法による停止性の証明 6.5 ライブネス 6.6 Floydの全正当性の証明手法からライブネスへの一般化 6.7 Burstallの全正当性証明手法とその一般化 7. Hoare論理 7.1 意味論的な観点から見たHoare論理 7.2 構文論的な観点から見たHoare論理 7.3 Hoare論理の意味論 7.4 構文論と意味論の間の関係:Hoare論理の健全性と完全性の問題 8. Hoare論理の補足 8.1 データ構造 8.2 手続き 8.3 未定義 8.4 別名と副作用 8.5 ブロック構造の局所変数 8.6 goto文 8.7 (副作用のある)関数と式 8.8 コルーチン 8.9 並行プログラム 8.10 全正当性 8.11 プログラム検証の例 8.12 プログラムに対して1階論理を拡張した他の論理 第16章 様相論理と時間論理 E.A.Emerson:志村 立矢 1. 序論 2. 時間論理の分類 2.1 命題論理 対 1階述語論理 2.2 大域的と合成的 2.3 分岐的 対 線形 2.4 時点と時区間 2.5 離散 対 連続 2.6 過去時制 対 未来時制 3. 線形時間論理の技術的基礎 3.1 タイムライン 3.2 命題線形時間論理 3.3 1階の線形時間論理 4. 分岐的時間論理の技術的基礎 4.1 樹状構造 4.2 命題分岐的時間論理 4.3 1階の分岐的時間論理 5. 並行計算:その基礎 5.1 非決定性と公平性による並列性のモデル化 5.2 並列計算の抽象モデル 5.3 並列計算の具体的なモデル 5.4 並列計算の枠組みと時間論理の結び付き 6. 理論的見地からの時間論理 6.1 表現可能性 6.2 命題時間論理の決定手続き 6.3 演繹体系 6.4 モデル性の判定 6.5 無限の対象の上のオートマトン 7. 時間論理のプログラムの検証への応用 7.1 並行プログラムの正当性に関する性質 7.2 並行プログラムの検証:証明論的方法 7.3 時間論理による仕様からの並行プログラムの機械合成 7.4 有限状態並行システムの自動検証 8. 計算機科学における他の様相論理と時間論理 8.1 古典様相論理 8.2 命題動的論理 8.3 確率論理 8.4 不動点論理 8.5 知識 第17章 関係データベース理論の構成要素 P.C.Kanellakis:鈴木 晋 1. 序論 1.1 動機と歴史 1.2 内容についての案内 2. 関係データモデル 2.1 関係代数と関係従属性 2.2 なぜ関係代数か 2.3 なぜ関係従属性か 2.4 超グラフとデータベーススキーマの構文について 2.5 論理とデータベースの意味について 3. 従属性とデータベーススキーマ設計 3.1 従属性の分類 3.2 データベーススキーマ設計 4. 問合わせデータベース論理プログラム 4.1 問合わせの分類 4.2 データベース論理プログラム 4.3 問合わせ言語と複合オブジェクトデータモデル 5. 議論:関係データベース理論のその他の話題 5.1 不完全情報の問題 5.2 データベース更新の問題 6. 結論 第18章 分散計算:モデルと手法 L.Lamport and N.Lynch:山下 雅史 1. 分散計算とは何か 2. 分散システムのモデル 2.1 メッセージ伝達モデル 2.2 それ以外のモデル 2.3 基礎的概念 3. 分散アルゴリズムの理解 3.1 挙動の集合としてのシステム 3.2 安全性と活性 3.3 システムの記述 3.4 主張に基づく理解 3.5 アルゴリズムの導出 3.6 仕様記述 4. 典型的な分散アルゴリズム 4.1 共有変数アルゴリズム 4.2 分散合意 4.3 ネットワークアルゴリズム 4.4 データベースにおける並行性制御 第19章 並行プロセスの操作的および代数的意味論 R.Milner:稲垣 康善,結縁 祥治 1. 序論 2. 基本言語 2.1 構文および記法 2.2 操作的意味論 2.3 導出木と遷移グラフ 2.4 ソート 2.5 フローグラフ 2.6 拡張言語 2.7 その他の動作式の構成 3. プロセスの強合同関係 3.1 議論 3.2 強双模倣関係 3.3 等式による強合同関係の性質 3.4 強合同関係における置換え可能性 3.5 強等価関係上での不動点の唯一性 4. プロセスの観測合同関係 4.1 観測等価性 4.2 双模倣関係 4.3 観測合同関係 4.4 プロセス等価性上での不動点の唯一性 4.5 等式規則の完全性 4.6 プロセスの等価性に対するその他の概念 5. 双模倣等価関係の解析 5.1 等価性の階層構造 5.2 階層構造の論理的特性化 6. 合流性をもつプロセス 6.1 決定性 6.2 合流性 6.3 合流性を保存する構成子 7. 関連する重要な文献
あらゆる漫画作品を、何らかの直交する二変数の平面上に置くことを考える。方眼紙に目盛りをうったものを考えてもらえるとありがたい。方眼紙の端が、あなたの想像しうる作品の限界。
このとき、「頭おかしい作品」というのは、方眼紙の外にある作品。あなたの想像の埒外にあるもの。
たとえば「ケンペーくん」。
内容はいちいち書かない。ググッてください。
その一方で、「作品自体は方眼紙の中にあるけど、とにかく『すごい』作品」というものもある。これは主観的に二つに分けられる。つまり、「理解できる」か「できない」か。
理解できる作品というのは、フォロワーがでやすい作品と言ってもいいかも知れない。アイデアが模倣可能で、しかも商業ベースでいけると判断されたもの。たとえば、個人的には「ヒカルの碁」がそう。
もちろん「マイナージャンルの競技を取り扱った作品」というのは昔からあったけど、特に現代的な少年漫画の範疇では、ヒカ碁で一気に火がついた感がある。同時期にライジングインパクトがあったのも大きかった。両者ともテーマがマイナーであるということに甘えず、また「ぶっとんだ」、言い換えれば「マニア向けの」面白さを求めず、純粋にストーリー漫画として面白かったのが良かったのだと思う。
…という夢をここ数年、年に数回の頻度で見ている事に気づいた。
「あなたが他の研究者より優れた発見をして,なんになるというのか.その理論がつくれなかったらダメなのか.」と言われたらどうする?
そりゃどういうリスクヘッジ戦略を持ってるのかを言えばいいだろ。
そもそもその「優れた」の尺度が不明過ぎて、いくら仕分け人が馬鹿だと言ってもそこまで馬鹿な質問はしないだろうけど。
その「優れた理論」とやらを作ろうとする過程で複数の問題が発生して、それぞれを解決するために色々な手法を考えることになるだろうがよ。
その手法は「優れた理論」が作れなかった時点で無に帰するのか?そんなわけねーだろ。
知的興味でやるのはいいけどよ、何がどう嬉しいのかくらいしっかり考えろよ。
しっかり考えてそれを適切に伝えれば理解してくれるかもしんねーだろうがよ。
要するに薄っぺらいんだよ。それで許されるのは天才だけだっつーの。
何でもかんでも「国民のメリット」とかほざく馬鹿仕分け人の問題とは別次元(直交空間)だよ。
専門以外何もわからないようなやつは天才以外いらない。
ブクマのやつは何でそう思うのか述べろ。全く否定になってない。
YourFileHostのCAPTCHA画像をなんとかするの続き。
その後、適当にいじったら、手元環境で1枚あたり25秒くらい→だいたい2.5秒くらいで判別できるようになった。このくらいなら使えるかな。
速度向上に一番効いたのは、Token#importで画像を比較しているところの修正。他は細かい手直し。
使い方は前のやつと変わってません。
あと、テストに100枚くらいCAPTCHA画像食わせてみたけど、とりあえず全部正しく判定できた。
カレントディレクトリ以下にある*.gifなCAPTCHA画像ファイルを適当に判別するスクリプト。動作確認用にどうぞ。
後述の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
#!/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__
そんなわけで、みんな大好きなYourFileHostだけども、最近みてみたら、なんかCAPTCHA認証がついているわけじゃないですか。
でもこれってさーCAPTCHAといっても見るからに危ういというか、見れば見るほど簡単に破れてしまいそうな気がして、どうにもむずがゆいアンニュイな気分になってしまうわけです。
そんで、このたび適当にいじってみたところ、それなりに推測できるコードが書けたので、ここに張ってみますね。
やってることは単純で、こんな感じ
使い方は、こんな感じで
require 'decaptcha.rb' captcha_string = DeCAPTCHA.decode(filename) if !captcha_string.nil? then # 判別成功時の処理 else # 判別失敗時の処理。失敗することもあるのでよしなに。 end
あ、Ruby/GD2入れといてね。sudo gem install gd2とかで入ります。多分。
判別率はそこそこ良い感じになったんだけども、富豪プログラミングがたたってか、いかんせん遅いです。
手元だと1枚判別するのに20秒くらいかかることもある。
そんなわけで誰かチューニングしてくれるとうれしい。
実行速度を上げた改良版はこっちにうpしました。以下のコードは参考程度に。
#!/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__
いろいろお返事いただいたようで、それについて。まずはブクマ。
b:id:kennak 増田 極論気味だが内面は外に滲み出るものだと思う いわば外への自分の表現方法のひとつ それも解りやすく汎用化されたもの それに興味がないと言う事は他人にも興味のない自分の内面を外に出そうともしないって事に
内面を表現しないといけない理由がありません。どこかの「実名ブログで自分を『見える化』しよう!」なんて言ってたなんちゃってコンサルじゃないんだから。自分の心の繊細な部分は信頼する相手にだけ見せるという考え方もあって然るべきだし、ましてそれを服飾で表現しないといけない理由なんてどこにもありません。
b:id:b_say_so 変わる気があってだけどできません><だったらまぁやってみとはいうが…/受験勉強が面白いならファッションも同軸上だと思うけどねぇ
むしろ俺計量によればファッションと受験勉強はほぼ完全に直交しております。受験勉強は最先端の科学技術あるいは文化芸術へのアクセス手段を与えてくれますし、勉強の過程でその片鱗を垣間見て胸をときめかせることもできますが、ファッションからそのようなものが得られるわけがあるとも思えません。これほど水と油なものはないでしょう。
b:id:mirrorperson >なぜなら、漏れなく彼氏彼女という御利益がついてくるからです ←んなことない というかおしゃれとかじゃなくケミカルウォッシュはやめておくとかいうマナーレベルはこなしておこう。
「ケミカルウォッシュ」って何ですか?「ぐぐれカス」とか言われそうなのでぐぐってみましたが全然わかりません。ですがまあ、普通の人が普通に出入りする店で売っているようなものを買って着ることが「マナー違反」であるというのはどう考えても常識外れでしょう。そういう私は"Levi=Strauss"を「レヴィ・ストロース」と読んだところ人に馬鹿にされましたYO!
次に、d:id:hrkt0115311氏のこの記事。
いや、それを宗教だと言ってるんじゃありません。自分が好感を持ったものを「いい」と信じるのは単なる「趣味」でしょう。しかし、その趣味に同調しない他人を「お前は愚かだ」だの「悔い改めよ」だの「地獄に堕ちるぞ」だのと脅かし、「キモい」「ウザい」「死ねばいいのに」と差別・弾圧するのであればこれは宗教です。それもかなりたちの悪い宗教です。それを私は批判しているわけです。
俺にとっちゃ丸暗記ですなあ。正直、ITの世界は次から次へと新しい言語だの仕様だのが出てきて辟易する。プログラミングだのデザインだなんてのは俺の仕事にとっては非本質的なので、そんなことに時間を使われたくないです。
当然ですよ。むしろ、その自覚を持って欲しいと私は思います。自分が頭がよいという自覚のある人は、「俺がこれだけできるのだからお前もそれだけできて当然、できないのは努力が足りないサボりなのだから自己責任」なんて無茶なことは言いません。
頭がいいから丸暗記できたのか、試行錯誤しているうちに頭も磨かれたのか、あるいは別の理由なのか。
好きな人にとっては知識を身に付けていくことが至福の過程、興味のない人間にとっては丸暗記はまさに「苦悶式」そのもの、それは普通のことだとおもいます。
その他。
俺もジーパン派。
ジーンズもありえないだろうJK
「ジーンズ」と「ジーパン」は区別される語だったのか。「フィレンツェ」と「フローレンス」が同じ街だということを知ったとき以上の衝撃です。
2009.05.08 長すぎて1つの記事では全てを表示できないようなので、2分割しました。
「爆発音がした」まとめ 下 - http://anond.hatelabo.jp/20090508095607
「後ろで大きな爆発音がした。俺は驚いて振り返った。」
「ドカーン!俺は振り返った。」
「背後から強烈な爆発音がしたので、俺はまためんどうなことになったなぁ、とかそういや昼飯も食っていないなぁとか色々な思いを巡らせつつも振り返ることにしたのである。」
「ふー、びっくりした」
「サイレントマジョリティーを考慮に入れて振り返るかどうか決めさせていただきます」
「あたしの後ろで、大きな音がしたんです。あたし、もう、ビックリしちゃって、振り向いた。」
「後ろから大きな爆発音が聞こえた。女の膣がこすれるような音だった。こいつは、勃起させる!」
「爆発したのかしらん」
背後で爆発音。ラテル、即座に対衝撃姿勢。ラジェンドラが衝撃回避の機動を取る。ショートΩドライブでは間に合わない。衝撃回避機動と同時に無照準でCDSバラージ。目標は沈黙。
アプロ、舌なめずり。「うまそうな爆弾キャンディ」
「振り返るんじゃない」
「なぜだ」
「君は何かを感じたようだが、わたしは違う。わたしにとっては、今のところ、何も起こってはいない」
「ばかな。確かに後ろで爆発が──」
「その目で見たわけではないだろう。背後の風景とは、非連続的なものだ。振り向くよりも先に何らかの方法で破壊痕を見せつける、などの欺瞞工作も考えられる」
「おれ一人の視覚や聴覚を騙すことに意味があるとは、思えない」
「可能性はある、ということだ。それに君一人とも限らん。君かわたし、あるいは両方とも、この状態に陥っているんだ。人為的なものではないかも知れない」
「空間が、おれの、あんたの、認識を撹乱しているというのか」
「もっと単純に、病気の一種かもな」
「あんたはもっと真面目に自分の病気を疑うべきだ」
「健康な人間にしても、自分の感覚しか信じていないものさ。みな異なる主観に生きているんだ。認識のずれなどは、どこにでもある」
「フムン」
「問題は、今回のそれが些か極端ということだ。空間の例えはよかったな。このままずれが進めば、我々は互いの姿を見失うかも知れん。だから、振り返るな。この先に集中しろ」
「轟音がアルタ前に響いた。続いて爆風が彼の白衣を撫でた。
だが、轟音や爆風ですら、彼の前では礼節を弁えて静寂を保っているかのように見えた。
それが彼――メフィストなのだから。
彼は振り返らなかった。その背中を、月が照らしていた。」
どーかついでがあったらアルジャーノンのおはかに爆発をそなえてやてください。
「アタシ
爆発?
しない訳ないじゃん
みたいな」
「不意に、背後から、爆音が轟いた。俺はまだ、死んでいない。足を懸命に、動かした。天地が、ひっくり返った。何も、聞こえなくなった。」
「後ろ。爆発。振り返った。風。」
「後ろで、大きな、爆発音が、した。
振り返る。
刃が、せまって、いた。皮膚が、粟立つ」
「音。振り返る。爆発。今ではそう、思い定めている。
そんなことより、童貞ども、ソープに行け。」
「凄まじい音とともに地面が揺れる。
――爆発、ですか?
私が問うと、彼は白湯とさして変わらぬ出涸らしをすすり、
――だから何だと言うのか。
と答えた。
――何だ、と言うが、あの爆発が君に何の関わりがあるのかね。
――危険じゃないのか?
言いながら私は、その問いに彼がどう答えるかを予測していた。
予測していながらそれを問う。あまりにも愚かだ。
――危険などと言うが、あんな爆発などなくても、危険などは市井のそこらに転がっている。
――不発弾など何処に埋もれているか知れたものではない。
――車に轢かれる事も、誰かに刺される事もあるかも知れない。
――体の何処かが遣い物にならなくなる事だってある。
――特に君のような不摂生は、危険の塊ではないか。
りん、と、何処かで風鈴の音がした。」
「爆發音がしたので、中禅寺は逃げた方が良いと云った。」
そのとき背後でとてつもない音がした。いや、単に音がしたなどという生易しいものではなかった。それは西海岸に住む者なら誰もが「いつか来るでかいやつ」と恐れるあの巨大地震がついに来たのかと思わせるほどの圧倒的な音量で炸裂した。そして音そのものがまるでコミックブックに出てくる大げさな擬音の書き文字のような存在感を持って背中にぶち当たり、打ちのめし、気がつけば私は埃っぽい床に額をこすりつけたまま伸びていたのだった。
一体どのくらい気を失っていたのだろうか。世界を覆いつくす大惨事の予感から最早どうとでもなれという諦めに囚われかけた刹那、しばらく前に買出しに出たまま戻らない妻と幼い娘の顔が私の心をよぎった。その顔は、娘を抱いた妻がポンコツのビュイックに乗り込む直前、あなたは疲れているんだから家で休んでいなさいと言って譲らなかったときの -そのときの妻の顔は眩いばかりの春の陽光に金色に縁取られてまるで世界中のあらゆるものを祝福しているかのように見えた -どこかいたずらっぽい小娘めいた笑顔だった。
私はまだくらくらする頭を抱えながらゆっくりと立ち上がり、何事もなかったかのように静まり返った部屋の中央で馬鹿のように突っ立ったまましばらく考えた。そしてようやく先ほど背後から聞こえた凄まじい音の正体が、自分のひり出した屁に過ぎないことに思い至った。
「高名だが年配の科学者が爆発であると言った場合、その主張はほぼ間違いない。また不発であると言った場合には、その主張はまず間違っている。」
「後ろからインチキ臭い爆発音が聞こえたんだよ。僕は振り返ろうとしたんだけど、そんなことをしたら僕はげえげえ吐いてしまうよ。爆発音の十中八、九は反吐が出るようなカスなんだぜ、本当に。」
ドアのでどん、と大きな音がした気がした。しかし先ほどのやりとりの疲れで休息に酒がまわっていたおれはまあいいや、どうだって…と思うだけで、さっさとベッドにもぐりこんだ。
テントの外でどーん、と大きな音がした。どうせ酔ったサーノが焚き火になにか放り込んだのだろう。「うるさいぞウスラバカ!」とおれはどなり、寝袋を頭からかぶった。
「つまりワタクシが背すじをただして言いたいのは、先程後ろのほうから破壊衝撃的大盛りべらんめえ的なナニモノかがどおんどおおんと音を立ててバクハツした! ということなのであります。」
「背後で轟音が鳴った。自分は振り返った。」
「(爆発--)
であった。
余談だが、日本に初めて兵器としての火薬がもたらされたのは元寇の頃である…」
「きれいに終わったわね~」
「事件も全部解決したし、今度という今度は誰にも文句言わせないよね~」
「………」
「そういえばさ、発進の時、なんか紐みたいなの燃えてなかった?」
「ああ、なんかあったね。ロープじゃない?」
「あたし、聞いたことあるんだけど…。あの星って地核が爆薬でできてるじゃない」
「うん。前の大戦が終わって不要になったのを全部あそこに集めたんだよね~」
「そんな星あぶないから誰も住まないだろうと思っていたら、ならず者たちが集まってきて、そういう人目当てに商売する人もやってきていつの間にかそこそこ大きな星になっちゃったんだって。」
「ふーん。それで誰も管理してなかったんだ。連邦の人、私たち以外には1人しかいなかったもんね。あれだけ人住んでるのに。」
「でね、連邦も考えたらしいのよ。住民が住民だからよからぬことを考えかねないじゃん」
「そっか。連邦もバカじゃないからね。だから私たちみたいなスターを送り込んだんだ!」
「そうじゃなくてさ、あの星でおとなしくしているぶんにはいいけれど、ひとたび事が起こったら星ごと爆発させられるように地核の最深部につながっている導火線作ったらしいのよ。」
「ふーん…」
「…………」
「ま、まさか、その導火線に火を付けちゃったなんて都合のいい展開あるわけないよね」
「そ、そうだよね。そんな偶然あるわけないわよ…」
「ねー」
「ねー」
次の瞬間、惑星コリプトは683万3582人の住民とともに宇宙から消えた。
「赤外反応、新たな爆雷の爆散円、後方の輸送船団に直交します」
増田少尉がうわずった声で言った。CRTの一箇所に固まっていた輝点が徐々に分散しはじめた。輸送船団が退避行動に入ったようだ。しかし最大加速度0.1G程度の鈍足の輸送船では、これだけ近距離で爆発した爆雷の破片から逃れることは不可能だろう。
後ろで大きな爆発音がした。そう思った瞬間、増田は体が宙に浮いたような感覚を覚えた。そして次の瞬間にザックに衝撃が来た。増田の体は振り回され、雪崩に巻き込まれたと気づいたときには、不自然な体勢で凍りついた斜面を滑落していた。
「あっ。爆発した。今爆発しました。
私がここであなたとこうしている間に爆発しました。爆発。
きっとこれから火がでます。げほっ。出ます。火が出ます。
さあ逃げましょう。逃げなくてはなりません。げほごほ。げほ。」
おれは彼女の手を引くと半裸のまま髪を振り乱して走った。
歩道の通行人どもが白い目をしておれたちを見た。
「そしたら、後ろで大きな爆発音がしたんですよ、ヘ!へ!」
マドンナB「ねえ、この爆発……まだ温かいわ」
「後ろで、大きな、爆発音が、した。十津川は、驚いて、振り返った。」
「事実ではない」オリベッティが言い切った。「外部の人間が爆発に近づくことは、絶対に不可能だ。」
「もし万が一、この爆発が事実で」ロシェは繰り返した。「爆発がほんとうに行われたのだとしたら、捜索のあり方も根本から見直さなければなりません。そういった爆発行為が行われたのであれば、われわれの想像よりはるかに奥まで侵入されたことになります。ホワイトゾーンだけの捜索だけでは不十分でしょう。もしそこまで深く侵入されているとなると、時間内に見つからない可能性が出てきます」
オリベッティは冷ややかな視線を大尉にぶつけた。「大尉、今後どうするかはわたしが指示を出す」
「いいえ」カメルレンゴが急に振り返って言った。「指示を出すのはわたくしです」まっすぐにオリベッティを見つめる。
「おめでとうございますまことにけっこうなことで」
エヌ氏が振り返ると愛想笑いを浮かべた小柄な老人が立っていた。その声を聞きエヌ氏はため息をついた。
「やれやれ、なんてことだ。あれほど苦労したあげく手に入れたのが、のろわれた爆弾とは」
「きみが街を歩いていると背後で爆発音がする。でもきみはすぐには振り返らない。コカインの過剰摂取でイカレてしまったきみの頭には、それが現実の音なのか幻聴なのか判断できないからだ」
その時ふたりの後ろの方でどぉと烈しい音がしました。ジョバンニが驚いて振り返ると地面の一部が空にすいこまれるように抛り出されて煙が柱のように立つのが見えました。目をこらすとその柱のようになった煙はひとつひとつが黒々とした金剛石の粒なのでした。「発破だよ、発破だよ。」カムパネルラはこおどりしました。
「やれやれ、そして僕は爆発した。」
「後ろで大きな爆発音がした。あるいは気のせいかもしれない。とりあえず今は驚いて振り返る前に、まずパスタをゆでようと思った。」
「後ろでシュワルツシルト・アルフィエーリの文章を思わせるような繊細な爆発がした。ステンレス・スティールの上にあるライト・スタンドとペーパー・クリップをクローゼットにしまいガソリンの味がするコーヒーを飲み干し後ろを振り返った。やれやれ、と僕は思った。」
「家の周りの道を歩いていると、後ろから大きな爆発音が聞こえてきた。
僕はウォークマンから流れる『泥棒かささぎ』の序曲を口笛で吹いていた。道を歩きながら聴くにはまずうってつけの音楽だった。
爆発の音が聞こえたとき、無視しようかとも思った。散歩の歩調はリズムに乗り、クラウディオ・アバドは今まさにロンドン交響楽団をその音楽的ピークに持ちあげようとしていたのだ。しかしやはり僕は足を止め、振り返ってそちらをみた。なにか言い知れない大きなものが、漸進的に僕の方へと近づいてくるのを感じたからだ。」
「後ろで爆発音がした、汚い猫が逃げる、乞食の老婆が嘔吐して吐瀉物が足にかかる、俺はその中のトマトを思い切り踏み潰し、振り返った。」
「その時、後ろで大きな爆発音が聞こえ、俺はハシシを吸いながら女のビラビラを手で弄くっていたのだが驚いて女をぶちながら振り向いた。」
「後ろからの爆発音がした。俺は驚きながら爆発音に振り返った。それは、結局爆発音だった。」
「"ドカーン"遥か後ろで不意に爆発音がした。俺は後ろを振り返った。別にどうでもよいが…」
一瞬の光の後、ごう、という音と共に周りの空間が歪んだ。
「爆発か」
「そのようだな」
「確かめなければなるまいよ」
「うむ」
「行くか」
「行こう」
そういうことになった。
「どぉん。
爆発した。
しなやかな獣のような肉体が、振り向く。
みしり、と音を立てる体に、ふふ、と笑った。」
閃光が夜を切り裂いた。
緋と橙と臙脂色の炎が噴きあがり、轟音と衝撃派が街角を吹きぬけた。唐突に爆発
したそれはなおも炎上を続け、焦げ臭い熱風が頬を叩く。火の粉を散らして舞踊る火柱のなか、爆発に巻き込まれた車の骨格や人間の影が揺らめいていた。
「…誰か生きていると思うか?」
「あの業火の中で生身の人間が生きていられるなら、辞書から焼死という単語が消えるな」
相棒が呟き、俺は退屈な感想を返すしかなかった。二人そろって炎の照り返しで顔を血色に染めていた。
「エクスプロージョン。燃焼などで気体が急激に熱膨張を起こす現象で、僕のエンジン内部でも起きてる奴だよ。托鉢ってやつさ」
「……爆発?」
「そうそれ」
――鈍、という炸裂音が、私の頭を掴み、後ろへと捻じ枉げる。
「――突如、背後から爆発音が鳴り響いた。その刹那、俺はダレよりも疾く振り返る―――ッ!」
鈍という爆音
轟たる爆風
背後から襲い来る圧倒的な大気の奔流に体が軋みをあげる
ケ イ
嫌な予感がする
リ テハ ケ イ
逃げようとする意識とは裏腹に、身体はゆっくりと反転していく
フリ イテハイケ イ
振り向くまいと必死に力を入れた首まで難なく回され
フリムイテハイケナイ
体が反転しきった瞬間
イケナイイケナイイケナイイケナイイケナイイケナイイケナイイケナイイケナイイケ
意識までが反転した
「―――――――――」
閃光、爆発、衝撃―――。
消える視界、音を超え無音、予測し得る破滅。
走る石塊、破裂する風。混沌と矛盾、破壊と再生。目の前にある絶望。
気付くな。忘れろ。振り向くな振り向くなふりむくなフリムクナ―――!
――――――ああ。
それでも振り向かなくてはならない。
元よりそれは、永劫不変に定められた因果なのだから―――
ドカァァン!!!後ろで大きな爆発音がした…!
瞬間的に頭の中に冷たい液体が満ち…俺のまわりの風景は動作をやめ凍りつく………………
ッッ!!!!
俺は自分の置かれた状況を整理した…。
一人…だだっ広い道…後方で爆発………ッ!!
爆発物の正体は分からないが…音は遠くから聞こえていた…。
炸裂した破片の危険はないだろう。
脳内に満ちた液体が取り除かれ、時間が動き出す…………ッッ!
即座に俺は後ろを振り向く…ッ!
「俺の左耳が爆発音を聞いたと同時に俺は可能な限り素早く体を回し回し回るその合間にに黒煙を視認する大爆発じゃないか俺は振り返った」
「まるで手榴弾が半ダースまとめて爆発したような轟音が背後から聞こえた。俺はここが中東の紛争地域でもチェチェンの地雷原でもない、平凡で退屈な県立高校の二階にある、教室棟と特別棟をむすぶ渡り廊下であることを確認すると、どうして俺みたいな善良な一般生徒がこんな目に遭わなければいけないんだと信じてもいない神様に悪態をついた。いっそこのまま振り返らずに立ち去ってしまおうかと思ったが、そんなことをすると後でどんな目に遭うかわからないため、自らの不運を呪いながらも視線を背後に向けないわけにはいかなかった。」
ばーーーん (ひだまり荘爆破)
「なーんてねっ!」
コナン「ペロ…これは硝酸カリ!!」
「…つまり、物質の燃焼には可燃物と酸素が必要だということです。それでは爆発、つまり急激な燃焼を起こすにはどうしたらいいでしょうか?」
「簡単よ! 後ろを振り向けばいいのよ!」
ズバゥゥウン!!
5 月 8 日 <何かよくわからないことが起こる>
「………」
「あなた爆弾の前で何してるんですか?」
「………」
「……こうしていると……」
「……そのうち爆発するものですから……」
「どっかーん」「ほへ!?」「あー燃える男が爆発しただけよ」「でっかいそれだけですね」「あー…やっぱりショックでしたんですね…」
「この素敵な爆発に逢えたのもアクアが奇跡でできているからなんですね」
「ギャース!爆発禁止!」
灯里「あわわあわわわわ、藍華ちゃんなんだかすごい音がしたよー。」
アリス「でっかい爆発です。」
「僕は仰天した…
普通、背後で音がすれば振り向こうとする!!
爆発音のような大きなものなら、なおのことだ!
その振り向こうとする一瞬の隙に攻撃を仕掛けるはずだった!
しかし!奴は……
逆におもいっきり駆け出した!!
SYAAYAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHA!!!!!」
「背後から『爆発』だアァァァッ!これを待っていたっ!
振り返ると同時にッ!すかさず叩きこむ!」
「ドギュゥーーーゥウン」
「爆発だと!」
「バカな!”ありえない”!!」
「”爆弾”はここにあるのだ、後ろはいったいどうなっている!!!」┣”┣”┣”┣”┣”┣”┣”┣”┣”┣”┣”
『エコーズACT3! 振り返ったお前の負けだ』
あ、ありのままのことをいうぜ・・・!
背後で凄まじい爆音が聞こえて振り向いたらそこには爆破でオシャカになった戦車が無残にも大破していた・・・!
急展開過ぎる、だとか、話が見えない。とか、そんなチャチャなもんじゃ断じてねぇ…!
これは、なんだかヤバイ事になったッ…!
「ちがうそこじゃない。」
「ドワオ!!」
「爆発音がしたら振り返る、そんなふうに考えていた時期が俺にもありました」
「もう少しで全身の毛が陰毛になるところでしたね」
「ここは…一丁爆発の中にとびこんでゆくほうこうで!!!」
「 ド ン ! 」
「立派だった!」
「当然爆発」
「トシちゃん感激ーっ!」「もういやっ!こんなせーかつ!」
ぼくトシちゃん25歳後ろで爆発が起きる男
海原雄山「この爆発を作ったのは誰だっ!」
山岡士郎「やれやれ、この程度で爆発だなんてほんとうにあなたが振り返ったのかさえ疑わしい。
明日もう一度ここに来て下さい、これよりうまい爆発をご覧に入れますよ」
中二階堂「いやー、友達居ないから暇してたら丁度よく後ろが爆発したんだ。振り返ってみたんだけど危なかったぜ。眼鏡がクッションになったよ」
「これほどの爆発とは…たいした奴だ」
「爆発…だと…?」
糸色望「爆発・・・・爆発ねえ・・・・。この程度で爆発ですか!世の中には、もっと恐ろしい爆発が存在するのです!
CDの爆発的売上のあとの、ブ●クオフでの買い取り値の値崩れとか!
火山の爆発で吹き出した粉じんで起こる、世界的冷夏とか!
とあるゲームなど129人以上に爆発増殖させたら一人しぬだけでゲームオーバーになる始末!
そう、恐ろしいのは爆発そのものでなく、二次災害のほうなのです!」
「爆発出来るだけ良いじゃないですか、17年間の漫画家生活で一度も爆発どころか燃焼すらできない漫画家もいるのです。誰かが言いました、業界の安打製造機。イチローとの扱いの差はなんですか?」
糸色望「世の中にはもっと恐ろしい爆発が存在しているのです!勝手に正義漢ぶって大見得切った挙句爆発しちゃったジャーナリストとか! 新解釈を爆発させてしまった所為で一審よりも重い刑になった弁護団とか!! 国民性が爆発してしまったマラソンとか!!!この世には自分の行動の所為でさらに悪循環に陥る、そう、自縄自爆が溢れているのです!」
「くっ悔しい、こんな爆発に振り返っちゃうなんて・・・」ビクッビクッ
BACOOOOOOM
「なっ、なにィーーーーーーーーーーーーーーー!!」
「ば、ばかなァーーーーーーーーーーーーーーー!!」
「あ、あの爆発はァーーーーーーーーーーーーーッ!?」
「ま、まさか、あの……」
~未完~
BACOOOOOOM
「う、うぬぅーーーーーーーーーーーーーーー!!」
「ば、ばかなァーーーーーーーーーーーーーーー!!」
「あ、あの爆発はァーーーーーーーーーーーーーッ!?」
「ま、まさか、あの……
「知っているのかレイ!?」
BACOOOOOOM
「なっ、なにィーーーーーーーーーーーーーーー!!」
「ば、ばかなァーーーーーーーーーーーーーーー!!」
「あ、あの爆発はァーーーーーーーーーーーーーッ!?」
「ま、まさか、あの……」
「知っているのか雷電!?」
BACOOOOOOM
「ゲ、ゲゲィーーーーーーーーーーーーーーー!!」
「ば、ばかなァーーーーーーーーーーーーーーー!!」
「あ、あの爆発はァーーーーーーーーーーーーーッ!?」
「ま、まさか、あの……
「知っているのかロビン!?」
「ワシの爆発は108式まであるぞ」
「ば…爆発!?いや…あれはボールにかかる回転が生み出す驚異的なパワーが俺達に爆発の幻影(イメージ)を見せているにすぎない!!」
「後ろで爆発してたぜ」(黒い粒はバニラビーンズです)
「おぃぃぃぃぃ!!やべぇ、やべぇよ絶対これ!後ろで爆発?あ、あれだ、多分アバレンジャーの撮影かなんかだ!そうに違いない。」
「なんか爆発したんですけどォォォ!!!」
「ああ、アレ俺の母ちゃんだから。別に爆発とかじゃないから」
「んなわけあるか!お前の母ちゃんどんだけアグレッシブだよ!!!」
………
「まったくもう最近毎日爆発ばかりでいやになりますわね」
「ほんと、お洗濯物がほこりっぽくなっちゃって…」
「ドカァン☆」「ドン★」 「ドカァン★なぁんて!」
「ドルガハー」熊犬の血がたぎった。
「どっかーん」「爆発?」「俺のがな」「おや俺だ」「黙れ変態ども!!」
「どかーん」
「ゲホゲホ、一体何やってるんですかー!」
「…いや、そこにも自爆ボタンがあったのでつい」
「変だぜ」
ゴーン
(どかーん)
「え?なに?なに?」
「ゲホッ、ゲホ。あんた、そこのボタン押したでしょ」
「えーと、えーと」
「押すなと書いてあるのにわざわざ押すのは他にいないわよ」
「あははは…(汗) なんか気になっちゃって」
「そんな理由で押すな~っ!」
「ひえ~、ごめんなさい~」
井之頭五郎「こういうの好きだなシンプルで、爆発って男のコだよな」
「作者の急病のため、今週の爆発はお休みです。」
「後方で爆発したという認識は概ね正しい。誤算があるとすれば・・・・」
カズマ「俺はこの爆発に反逆するっ!!!」
「ち・・地球が壊れちまう!」
「この星の爆発まであと3分しかねぇ・・(3週くらい続く)」
「あの爆発は陰謀じゃよ!ぎゃわー」
ドーン
「どうなさいました?」
「違うのだ!紅茶を入れようとしていただけなのだ!なのになぜか爆発して…」
「それよりお怪我はありませんか?」
「い、いや…。私は大丈夫だ…。」
「(このあといったい誰が片づけると思っているのかしら)」
「どっかーん!」「また爆発したよ」「またですか」「まただよね…」「またか…」
「諸君 私は爆発が好きだ
諸君 私は爆発が好きだ
諸君 私は爆発が大好きだ
平原で 街道で
塹壕で 草原で
凍土で 砂漠で
海上で 空中で
泥中で 湿原で
この地上で行われる ありとあらゆる爆発行動が大好きだ」
「関係ねえ 爆発なんか関係ねえんだよ‥‥‥‥‥!
オレだっ‥‥!オレだっ‥‥‥!オレなんだっ‥‥‥!肝心なのはいつも‥‥!
(ざわ‥‥ざわ‥‥)」
ドラえもん「爆発するなんてきみはじつにばかだな。」
ブルル…
ドラ「わーなんだなんだ!のび太のしわざだな!やめろ!おろして!キャーヒー!」
バササ ガサガサ ガツン ドッガーーン
のび「…意外にばくはつがちいさいね」
喪黒福造「ドーーーン!m9」
(爆発音、そして爆炎)
「な…ば、爆発だと?!」
(瓦礫が降ってくる)
「う…うぉおおおおおおおおおおおおお!!」
「お。ししおどしか。」
「すしは、うみあ。」
「ちょっと足りないかな?」
なりはら博士「私は爆発するモノが大好きなんだー」
「自爆は男のロマンだぞ」
「爆発音がした」まとめ 下 -> http://anond.hatelabo.jp/20090508095607
くわしくはトラックバック先の記事やはてなブックマーク等をご覧ください。
はてなブックマーク⇒http://b.hatena.ne.jp/entry/http://anond.hatelabo.jp/20080506041614
ついかもときどきしていきます。
どうもあなたのバックグラウンドがよくわからない。
まぁ基本的な線形(偏)微分方程式をフーリエ級数等の直交系で展開して解析するくらいなら余裕だけど、それだけじゃどうにもならないんですよ。統計的予測だってパラメトリック分布で最尤推定するくらいならいいけど、隠れマルコフモデルを変分ベイズ法で扱うなんて話まで半年でできるほど頭良くないんです。
それだけわかってるなら変分ベイズ法なんて難しいことは少しもないように思うけれど。所詮、統計的モデルを推定してるだけの話だし、変分法ってのはパラメータが無限次元になっただけだと思えばいい(実際そうだが)んだから。
そんなのは管理職になって技術上の第一線を離れてからでいいと思うけれど。
資金の流れがわからなければ投資はできないし、
投資なんてする必要ないでしょう。せいぜい国債でも買っておけばいい。金融工学の入門書を読んでみた感想としていうのだけれど、理論にぶち込むべきデータを収集するだけでも大変だし、あの理論はだいぶ仮定が乱暴なので現実に合わせようと思えばその都度の手修正が必要だし、いずれにしても素人が下手に手出しをすると火傷するだけだと思った。あんまりそんなに何でもかんでも手を出して器用貧乏にならない方がいいと思いますよ。
敢えてマジレスするなら、最適化とか微分方程式とか統計的予測とかプログラミングとかアルゴリズムなんてのは大学学部半期分ぐらいの内容だからすぐマスターできるはずだし
いやあ、それをすぐマスターできるほど俺頭良くないんですよ。まぁ基本的な線形(偏)微分方程式をフーリエ級数等の直交系で展開して解析するくらいなら余裕だけど、それだけじゃどうにもならないんですよ。統計的予測だってパラメトリック分布で最尤推定するくらいならいいけど、隠れマルコフモデルを変分ベイズ法で扱うなんて話まで半年でできるほど頭良くないんです。プログラムやアルゴリズムはごく最近始めたばかりなんでやってるんですが。
経済と金融は勉強すべきだと思いますがね。財務諸表を読めないようじゃビジネスする上で話にならないし、仮に証券会社がまともになったとしても、学生に毛が生えた程度のイケイケドンドンの営業マンのコンサルティング(笑)に手数料払うなんて馬鹿げてますよ。資金の流れがわからなければ投資はできないし、産業の動向が読めなければ自分の仕事をどういう方向に進めていくかを決める際に支障がでます(例えば、現状で半導体産業に手を出してしまったりしかねない)。まぁそれらを全てフォローした上で、数理経済学の専門的な部分までは勉強する必要は無い、と言うのであればその通りだと思います。
つうか、事故起こしたんだから叩かれるのはしょうがないだろう。
事態はもっと簡単なんじゃないの。そんな判断すらなかったとおもうよ。
よくみてなかったら事故っちゃった。原因はそれ以上の何者でもないでないのかな。
・漁船の乗組員は直前までもしかしたらうたたねしていた。(他の船からの無線に答えていない)
・イージス艦の乗組員はすくなくとも船団に直前まで気がついていなかった。(自動航行のまま)
・イージス艦の乗組員は事故前後当直交代で事態をよく把握していなかった。(朝の4時が交代の時間。)
朝だから視界も悪いし、見えないよね。
べたなぎだから気も緩んでる。
で、目の前に船、
漁船「よけろ! うわーーーー!!」
イージス艦「どかーん! いまの何!?」
ぶつかるまえに気が付いていたとはあまり思えないな。
漁船の船団に突っ込んでるのに警笛もならしてないんでしょ?
この時期の朝の4時に相手がどれくらい大きい船なのかなんて漁船の肉眼から見えるわきゃないじゃんか。
暗黙のルールだかなんだかしらないけど「事故」はすでにおきちゃってるんだから、
悪者として扱うなという主張はいささか肩入れしすぎじゃございませんかね。
イージス艦と漁船が海洋でぶつかって漁船が沈んだ。
これだけでおなか一杯です。
国際的にも笑いものもいいところじゃないか。
円の中心Cとし、円の外にある任意の点Aを考える。Aにもっとも近い円周上の点をBとする。このとき、線分ABはBに於ける円周の接線と直交する(仮に直交しない場合、Aを中心とし半径ABであるような円と元の円Cは、2点で交わる。これは「Aにもっとも近い円周上の点」という条件を満たさない)。したがって、A,B,Cは一直線上に並ぶ。
このことから、出題されている放物線上の任意の点Pと、それにもっとも近い円周上の点Q、および円の中心Cは一直線上にならぶ。CQの長さは一定であることから、PQを最短にするQは、PCをも最短にする。よって、この問題は「放物線上の点Pと点Cの最短距離」を求める問題に還元できる。
この線分の長さは円の中心座標と放物線の式が与えられることから、簡単に求められる。その長さの計算には平方根の計算が含まれるが、我々が必要とする長さは、求める点で最小かつ常に正であることから平方根の計算は省略していい。平方根の中の式を展開するとxに関する4次の多項式となる。
求める点Pでこの多項式の値が最小になることを思い出せば、多項式の導関数が0になる点を求めることによってPの座標を計算できる。
だが問題なのは、タバコに消費していたもの、タバコが与えていたものが減っていると言うことは、何かが増えているはずだと言うことだ。
しょっぱなから理解不能な仮定です><
「医療費」がどのカテゴリを指すのかわからないのですが、1人あたりの平均医療支出は現に喫煙者のほうが高いです。国全体としては高齢化やら物価やらありますし、なかなか減らないでしょう。
心の病気とタバコの関係(http://am.tea-nifty.com/ep/2005/01/smoking.html)
癌患者は減ったか
早くからタバコ規制をした国々では肺がんの年齢調整死亡率が減少しています。こんな感じで(http://ganjoho.ncc.go.jp/professional/statistics/digest/digest03.html)。ここのグラフは縦軸の取り方が意味不明ですが、禁煙運動発祥の国・イギリスの男性などは半減してますね。喫煙→肺がんの因果関係がないと主張する人は、最低でもこの半減の理由を説明しなければならないでしょう(他の国のことも考え合わせると答えはひとつだと思うのですが、ねえ)。
日本もご覧のように減少にさしかかったところ。高齢化で絶対数は増えてますけど(念のため、年齢構成の違いという要因を除去するツールが「年齢調整」です。詳しくはぐぐってもらって)。まあ、現実に救われている命はたくさんあるわけです。
喫煙と、麻薬や飲酒は直交する問題だと思いますが……。とりあえず飲酒は減っていると聞いています。麻薬は守備範囲外なので知りません。
今まであった物をなくすと言うことは代用品がないままになくすと言うことはどういう事か。
ニコチンの代用品なんてありませんよ。特定の依存性薬物ですから。禁煙した人はただタバコをやめるだけ。ニコチンを常時摂取する必要のない身体に改造される(というか正常化する?)だけ。
屁「理屈」とすら思えないなあ。最初に書いたけど前提からして謎なので。