銀色うつ時間

思い出すたび何か胸につっかえてるだけ

複数行ある文字列に重複がないかチェックする

テキスト操作のメモ。とあるファイルが以下のようであったとする。

foo
bar
baz

これに重複がないかチェックしたい。 以下のコマンドでチェックできる。

cat foo.txt | sort | wc -l
cat foo.txt | sort | uniq | wc -l

結果

3
3

上記コマンドで出力が同じであれば重複なしと判断できる。

テキストを変更する。

foo
bar
baz
bar

結果

4
3

重複があることが分かる。

Webアプリケーションの脆弱性、攻撃手法とその対策

今回はWebアプリケーションにおける脆弱性についてまとめる。フレームワークが当たり前の時代とはいえ、脆弱性を生む場面を理解し、正しい処理をしておかなければ必ずウィークポイントを産んでしまう。脆弱性を突かれる突かれない以前に、これは普通に恥ずかしいことである。恥ずかしいことなので、IPAの「セキュア・プログラミング講座」や「安全なウェブサイトの作り方」には一度目を通しておくべき。

http://www.ipa.go.jp/security/awareness/vendor/programmingv2/index.html
http://www.ipa.go.jp/security/vuln/documents/website_security.pdf

Webアプリケーションの主たる脆弱性

どのような脆弱性が存在するのか列挙していく。基本的にはこんなものだと思う。

攻撃と対策

主要な脆弱性の概要、具体的な攻撃手法とその対策についてまとめる。

SQLインジェクション
  • 概要

説明するまでもないと思うけど、SQLインジェクションはフォームやパラメータを通じてSQL文やその一部を入力することで、DBに意図しないクエリを投げられ得る脆弱性

  • 攻撃手法

こんな感じのシーンが考えられる

// 件数設定
var lim = $('input#text').attr('value');
var sql = "SELECT * FROM table ORDER BY id LIMIT lim";

ユーザーの入力値およびSQLクエリに対してvalidationが掛けられていない場合にSQLインジェクションが起こる。もしそのようだとここで仮定したとして、変数limにこんな値を入れてみたい。

var lim = 100000000000000000000000000000000000000;
とか
var lim = "1'; DROP TABLE table";
など

上はレコードの上限をとにかく増やして負荷をかけることが可能になる。したはクエリを一度切ってしまうことでまた新しく任意のクエリをユーザーが入力できてしまう。最悪データベースが吹っ飛ばされる。「このサイト怪しいなー」とか思ったら、シングルクオートやセミコロンなどで挙動を確認...けど犯罪なのでやめましょう。

  • 対策

SQL注入攻撃の対策には、次の4つがある。validation,特殊記号のエスケープ,プレースホルダ採用,ストアドプロシジャによる実装である。採用を考慮する順序は、ストアドプロシジャ、プレースホルダ、特殊記号エスケープの順である。validationは常に行う。

XSS攻撃
CSRF攻撃

未完。徐々にまとめてきます。

金色のMacProが手元に届くという夢を見た

Introduction

夢の話をしようと思う。

MacOSXは僕が過去6年にわたって慣れ親しんできたOSだ。システムは隅から隅まで直感的だし、シンプルかつ必要十分な機能が実現されている。比較的短い期間でアップデートされることで数百もの新機能が追加され、Macはより理想的なコンピューティングに近づく。それはユーザーにとって革新の連続。MountainLionにおいても、OSレベルでソーシャルメディアとのシームレスな連携が実現しているし、細部まで行き届いたジェスチャーの滑らかさ、通知センターというユーザーフレンドリーな機能などが追加されている。MountainLionは、iPhoneで培ったAppleの美学がMacOSXに結実した瞬間だ。それは他の追随を許さない快適さをもたらし、私達の生産性を高めているのだ。アップデートされる度にまったく新しい体験をもたらしてくれるAppleに心を奪われるのは当然のことのように思う。MacOSXは生活を極彩色へと導く強さと美しさを兼ね備えたOSだ。それはまるで、魔法のような存在なのだ。とはいえ、Macは高い。高性能なマシンを買えば20万程度にはなってしまう。すこしばかり貧しい私達も、スターバックスでドヤ顔くらいしたいものだ。

私が見た夢について

今から話すことは、すべて夢の話だ。Macのボディカラーは美しい銀色であり、断じて金色であってはならない。私は日常的に虚言癖があり、しばしば人の迷惑となっているようなので、今回もそのつもりで聞いて頂きたい。

 深い霧の中を、一頭の獅子が歩く。

 鬣は薄く禿げ上り、痩せこけた姿は幾分みすぼらしくも見えるが、当の本人は存外なんとも思っていないらしい。霧の中を静かに、しかし重々しく進んでいくその様子は、誇り高き山獅子として貫禄を存分に感じさせていた。山獅子とはいえども獅子であることに変わりなく、どうやら百獣の王としてこの里山に君臨しているようだ。

 ここで私は一度夢から醒める。そして考えるのだ。「果たして鬣すらないようなただの獅子が、本当に百獣の王として相応しいのか?」と。ましてや山獅子。何度も反芻しても返ってくる答えは「否」であった。また、こうも思う。「あの貫禄と霧の中を歩くその造形の美しさ、これだけは確かである。あれは山獅子などではなく、私の見当違いだったのではないか。」などと考えているうちに、私はまた夢の中へと誘われていく。

 時に残月、光冷ややかに、山獅子が岩壁に姿を見せる。荒涼とした岩壁には野草一つ茂ることもなく、周囲にはこの禿げ上がった獣がいるのみである。獣は、東の空に向かって吠える。

東雲も終わりの刻である。やがて地平線より朝の光が里山を照らし始め、照らされるのはこの山獅子とて同様である。山獅子の痩せこけた体を覆う体毛に、一気に光が差し込んでいく。反射した体毛の眩しさに、思わず顔を背ける。

 気がつくと、私が先日組み上げた金色の機械に獅子が鎮座していた。私は驚きながらも、その状況を驚くほど自然に受け入れており、このようなことを考えていた。「そうか、この獅子は山獅子であると同時に、実のところ金獅子でもあったのだ。光りに照らされたその毛は、鬣の有無に関わらず何よりも美しい。金獅子こそが百獣の王たりえる存在なのだ。」

私はどうやら未だ夢の中にいるようだ。夢のなかに登場する山獅子について、具体的に語ろうと思う。

OSx86

さて、山獅子は如何にして私の元にやってきたか。OSx86については以下の通りだ。

wikipedia http://ja.wikipedia.org/wiki/OSx86

OSx86を実践するためにお世話になったサイトがこちら。日本語の資料もなくはないが、ここが圧倒的に充実してる。Tonyさんの存在なくして山獅子を手懐けることは難しい。

http://tonymacx86.blogspot.jp/

Hardware

OSXを走らせるためには、特定のハードウェア構成が必要となる。インストール可能な構成や相性については英語ドキュメントになるがTonyさんのブログに任せるとして、私の環境では以下の通りである。

ここで重要なのは、CPUとグラフィックボード、マザーボードである。逆に言えば、この3つさえ対応するものを揃えれば基本的にインストール不可、ということはない。このあたりもTonyさんの記事を熟読のこと。

MountainLionのインストール

大まかなフローとしては、普通にappstoreで山獅子を購入、USBメモリにUniBeastおよびMultiBeastというアプリケーションを入れ、MountainLionをUSBに入れる。BIOS設定でUSBブートを行い、MountainLionをインストールする、といった流れになる。とはいえ、ご察しの通りそんなにうまくいくはずがない。UniBeastがbootdiscの用意を、MultiBeastがドライバの用意をしてくれる。

  • Purchase the OS X Mountain Lion Application from the Mac App Store
    • 適当なMacを用意するか誰かから借りるかしてappstoreにログイン、普通に買いましょう
  • Prepare a UniBeast USB flash drive
    • USBメモリは8GBか16GBが望ましい。UniBeastはtonyさんのところにいってもらってくる
      • Tonyさんのサイトで会員登録が必要
    • UniBeastを起動するとよしなにやってくれる
  • Install OS X Mountain Lion
    • BIOSのSATAmodeをAHCIに変更
    • USBブートローダから起動
      • 新しくインストールしたいコンピュータでUSB起動をすることで、対応するハードウェアであればOSXのインストール画面が表示される
      • 対応しないハードウェアであれば、OSカーネルを読んで自分で書き換える必要があるだろう。とにかくググって英語のドキュメントを探し、自分と同じハードウェア構成の人間を探すしかない
  • Install the bootloader and drivers using MultiBeast
    • UniBeastおよび山獅子を入れたUSBには、同時にMultiBeastというアプリケーションも入れておく必要がある。これもTonyさんのところから頂いておく
ハマりどころ

さて、無事OSXのインストールが終了したと思いきや、戦いはこれからである。そもそもハードウェアが謹製のマシンと全然違うのだから、サウンドやネットワークなど、とにかくデバイスにまつわる機能が使えない。そこで役に立つのがMultiBeastなのだが、こいつが厄介だった。奨励されるドライバを入れて再起動しても、WhiteScreenになってしまいOSXが起動しない、諦めてOSを一から再インストールという手順を10回近く行った。とはいえ、MultiBeastのお陰でサウンド、ネットワーク、グラフィクスに関わるドライバは問題なくインストールできたことは併記しておく。

問題になったのはスリープである。デバイスをインストールしても、スリープをしたら最後、二度と目覚めない状態だったのだ。

スリープを実現する

起動やスリープは、OSがBIOSに含まれるDSDTテーブルを読むことで実現している。OSXの場合、特定のハードウェア構成で起動することを前提としているので問題ないのだが、今回行うOSx86では大問題である。OSが読むハードウェア情報が間違っているためにWhiteScreenや起動失敗といったことが起こる。Linuxでも起きそうだと思っていたら、案の定あるらしい。

DSDTテーブルの取得方法はMacのコマンドやUbuntuのLiveCDを使う方法などがあるが、今回はDSDTSEというツールを用いた。正常起動、デバイスの認識、スリープの実現を目指すためには、結局のところ以下の手順が正解だった。

  • スリープをめざす順序
    • multibeastでドライバをいくつか入れる
      • サウンド、ネットワーク、ブートローダ
      • 最後にDSDTSEをつかってextractしたDSDTテーブルをインストール明示的に示す
      • multibeastのuserDSDTが間違っているため
    • ブート時のconfigファイルである/Extra/org.chameleon.Boot.plitを変更
<key>GraphicsEnabler</key>
<string>no</string>
    • ここまでの間に再起動してはいけない

一連の手順を踏まえた上で再起動を行い、正常起動ができたらほとんど安心していい。ドライバの名称や画面などは以下に貼ったスクリーンショットを参照のこと。

f:id:arerreee:20121113030442p:image:w360

f:id:arerreee:20121113030435p:image:w360

f:id:arerreee:20121113030427p:image:w360

終わり

これで私は獅子を手懐けることに成功した。備忘録およびこれを読むどなたかの参考になれば幸いだが、あくまで夢の話であって、私の妄言に拠っていることだけは留意していただきたい。

PCを新調しました

もはや1年以上「PCがほしい、PCがほしい」とツイートし続けてきたが、今回ついに新しいPCを新調する運びとなった。今までMacBook(late 2006)という化石のようなPCで戦ってきたわけだけれど、開発者の端くれとしていつまでも貧弱なハードウェア構成のマシンを使うわけにはいかない(白目 加えて、学生時代と異なりPCを外に持っていく機会もほとんどないので、大きなディスプレイに見合ったパワフルなデスクトップPCを1から構築することにした。私が出す要件は以下の通りである。

基本方針

高性能なモデルがほしい
  • CPU
    • 私のMacBookは、一時代を築いたintel Core 2 duoだった。当時はあまりの速さに感動していたが(その前はamdの廉価モデルの何かを使っていた記憶)、時代の進歩とは残酷なもので、Sandy世代のCPUを搭載した職場のMacBookProを常用するようになってからは不満が募るようになってしまった。どうせ買い換えるのならばIvy世代の最新CPUにしようと思う。
  • メモリ
    • 私のMacBookは、6年の歳月をかけて少しずつカスタマイズされいった。当然メモリも最大までカスタマイズしてあったわけだが、それでも限界は3GBである。現在のモダンブラウザやIDEを同時に立ち上げたら最後、「空きメモリ容量:ほげMB」などという苦しみを味わうしかなかった。今回はふんだんにメモリを搭載したい。
  • グラフィクス
    • 私のMacBookは、Intel GMA95というグラフィクスプロセッサであった。これはメインメモリと共有型のもので、64MB DDR2 SDRAMメモリ搭載とある。フルHDの外部ディスプレイを利用していたのだが、たびたび画面にちらつきがあったり、スクロールがカクつく現象が起きていた。貧弱なリソースを更に切迫していわけだ。私自身オンラインゲームを利用することはないが、フルHDのディスプレイ2枚程度は問題なく処理できるGPUがほしい。
  • ストレージ
    • 私のMacBookは、6年の歳月をかけて少しずつカスタマイズされていった。ストレージも例外ではなく、過去2度ものデータ損失事故を引き起こしている(1度は100GB近い音楽データを失った)。現在は当然SSD化もされており、更に光学ドライブの場所に500GBのHDDをマウントしている。とはいえ現在は保有するデータも少ないので、SSDとバックアップ用のHDDさえ用意されていればよいと判断した。
極端な大型化を避ける
  • 「なんなんだ、これは...」
    • 先日まで、自作PCを組むべきか、MacMiniの上位モデルを買うべきか悩んでいた程度には小型のマシンがほしいと考えていた(しかも新型のMacMiniなら2.6GHzのクアッドcore-i7が78000円とMacにしてはそれほど高くない)。多少の大きさは構わないのだが、秋葉原電気街諸店舗における自作PCのケースコーナーに溢れているような、独特のカルチャーをもった、厨二病というか、「これが俺のマシンや!どやぁ!(LEDで光を帯びたファン「ファンファン」)」みたいなセンスには我慢ならなかったし、何よりあの灯油ケースみたいなサイズが許せない。僕の家は狭いし、ものが多い。自作するのなら、大きさはそこそこに、値段は多少かかってもいいので圧倒的にハイセンスなケースを探すべきだと判断した。
FYI : http://blog-imgs-46.fc2.com/m/o/t/motobuyer45/cosmos22.jpg
  • 拡張性や排熱
    • とはいえ、mini-ATXのような小型マザーに高性能CPUを載せ、かつケースも小さくとなると、電力供給や排熱の問題がボトルネックになることは確定的に明らかだ。また、拡張性に関しても不安が残る。そこでマザーボードはmini-ATXではなくmicro-ATXとし、micro-ATX規格が搭載可能という条件で比較的小型の、私の眼鏡に叶うセンスを有したケースを探すこととした。
予算はできれば10万以下
  • 悪くないスペックのMacMiniが8万(カスタマイズ入れて10万)で買えるのにわざわざ自作するとなったら、それを超えるスペックで10万以下に抑えたい。とはいえ、今回はコンピュータの勉強的側面もあったのでそこまで気にしない。

ハードウェア構成

お待ちかね、今回このようなわがままな要望を満たす運びとなったハードウェア構成が以下のとおりだ。費用も合わせて明記しておく

  • CPU : i7 3770k
  • GPU : nvidia GEFORCE GT640
  • RAM : 32GB
    • Patriot Memory DDR3 PC3-12800 8GB × 4 \9,940
  • Storage : SSD240GB + HDD300GB
    • Intel SSD 335SEROES 24GB \14,780
    • HDDは自宅で使っていないものをマウント
  • OS : windows8 + fuckOSX
    • windows 8(dsp) home premium \10,800
    • fuckintoshな夢は次のエントリで解説する
  • Motherboard : GIGABYTE micro-ATX
  • PowerSupplyUnit : 玄人志向
    • KRPW-P2-650W/85+ \6,480
  • ODD
  • Case
    • abee AS Enclosure ASE-LP210 \19,980
  • Trackpad
    • Apple MagicTrackpad \6,800
  • その他

f:id:arerreee:20121110172436j:image:w360

合計して11~12万程度になるかと思う。ケースが2番目に高い買い物になっている。無駄にケースにお金をかけているし、windowsOSやtrackpadまで購入しているので少し足がでてしまったが、全く問題ない。

ちなみに、これが今まで使ってきたMacBookの技術仕様だ。
http://support.apple.com/kb/SP23?viewlocale=ja_JP&locale=ja_JP

知人の世話になりつつ、実際に組んでみる。マシンとして組む過程や、何度もBIOSを確かめることでコンピュータがどのように動いているのか少なからず理解できたように思う。問題なく起動することができたが、今回windows8はHDDにインストールした。HDDだから多少の遅さがあるとはいえ、動作している。今のところ、音や熱が問題になっている感覚はない。非常に静かで、安定した様子を見せている。

出来上がり

ケース

これが私の探し求めていた、自作PC界隈の文化とは一線を画すセンスフルなケース。黒やシルバーの先行く、ゴールド。金は上質の象徴だ。ケースから黄金の金が鳴っているのが写真で伝えられないのが遺憾である。

f:id:arerreee:20121110170254j:image:w360

全容。完成されたボックスの造形である。これがほんとの、黄金比や!

f:id:arerreee:20121111234437j:image:w360

オーディオ機器としての存在感もばっちりである。これを使うユーザーはまったく新しいGoldExperienceに打ちのめされること請け合いだ。

音・映像
  • オーディオ機器に関しては、ソニーの標準サイズのコンポを出力として利用している。音質に関しては既に10年以上前からあるものなのでなんともいえないが、そのあたりの数千円程度のPCステレオよりはよいと思われる。
  • 映像に関しては、DELLの23インチフルHDをそのまま利用している。補助ディスプレイとして、32インチの東芝REGZAHDMIで繋いでいる。以外と問題なく表示できており、GPUのお陰か動画も美しく描画されるので満足である。
スコア

さて、今回組んだPCがどれ程のパフォーマンスを持つのか、試しにテストしてみようと思う。Geekbench2というアプリケーションを用いて測定してみた。測定結果は以下の通りだが、これは32bit版として測っているので、実際にはもっとスコアが高く出るような気もする。

f:id:arerreee:20121111233009p:image:w360

ちなみに往年のMacBookのスコアはこちら

f:id:arerreee:20121112002742p:image:w360

新しいPCが64bitであることを加味すると、ほとんど5倍かそれ以上の速度にはなっているようです。メモリが32GBある安心感が素晴らしい。動画を見ながらIDEどころか、動画を見ながら動画が見れるのではないでしょうか!これでHuluドリブンな開発ができますね!(白

f:id:arerreee:20121112002503j:image:w360

まとめ

  • ぱそこん組むって楽しいですね
    • 積極的に厨二病になろう!
    • 黄金のケースこそ至高
  • OSまわりの設定は次エントリ
  • 時代の進歩とは
    • 6年間使った黒いMacBookには愛着がある

”To be C or not to be C. That is the question.”

半年くらい経ったのでそこそこにまとめる

身につけたこと/今後の展望

身につけたこと、とはいえどれも中途半端だし、自信を持って「できます」といえるレベルは程遠い。上限が見えないからこそ面白くはあるんだけど、みんなどこまでやって「できます」って言えるようになるんだろう...

  • UNIX/Linux基本的な操作
    • 簡単なシェルスクリプトくらいなら
    • コンピュータに対する理解が甘いので、もっといじる
  • Webアプリケーションへの理解
    • HTTPとか、TCP/IPとか
      • request/responseモデルの基本的な通信は学んだ
      • サーバー間通信の問題などつい最近まで知らなかったので、今後もヒマな時に本を読んだりして補いたい
      • WebSocketあたりはほとんど触れてない
    • セキュリティ
      • XSSCSRFなど対策すべき攻撃手法の基本は学んだ
      • とはいえワンタイムトークンの実装など曖昧な認識がある
    • CMSの利用
      • 個人でwordpressを利用したサイトを構築した
      • 使い方のイメージはつかめたけど、プログラミングじゃない感が激しいのであまりモチベーションがない
      • nginxもとりあえず導入してみただけで、まだ仕様についてちゃんと理解できていない
  • テスト
    • あまり学べていない
    • JavaでSelenium2を使った自動テストをやった程度
  • HTML/CSS
    • 卒なく組めるようにはなった
    • classやname,idの付け方が下手くそ
    • CSSの修正にめちゃくちゃ時間がかかる
    • floatやalign属性への理解不足
  • PHP/template engine
    • まあまあ書けるようにはなった
    • オブジェクト指向関連の処理系についてまだ良くわかっていない点が多いので、1つずつ潰していく
  • javascript
    • フリーダム言語なのでとりあえず動くようにはできるけど、まだ全然言語仕様についての理解が足りない
    • 言語仕様だけでなく、DOM操作、ライブラリについても学ぶ必要がある
    • これらを切り分けて理解していくのが大事
  • Database
    • MySQLだけ。一応クエリ最適化なども経験した
    • 今はフレームワークがほとんど吸収してくれているので自分でSQL文を投げることもない
    • 自分で設計する機会もほとんどないので、これはプライベートで理解を深めるしかない
    • MongoDBとかどうなんでしょう

超ざっくりかつカテゴライズ適当過ぎるけど、こんなものだろうか。んで、次。

今後身につけたいこと

今まで学んできたことの理解を更に深めることに加え、いわゆるスクリプト言語とは別のものをちゃんと学んでおきたいな、と思っている。なぜなら実際にプログラムを実行するコンピュータについてや、プログラムが動く仕組みなどへの理解が足りていないからだ。限られたリソースの中で厳格なコードによって処理が行われる一連の動作、ミニマルな形で学ぶことができる低級言語がいいと思っている(これとは別だが、関数型言語も学びたい)。あと、普段使っているフレームワークの内部実装などを積極的に調べて、コードをちゃんと読む機会を増やしたい。というわけで、今は「新しいサービスを世の中に出したい!」みたいな意識が全然なくて、こんなに意識が低くてよいものかと若干不安ではある。

  • 今までの理解を更に深める
    • コンピュータ・ネットワーク・セキュリティ全般
      • 「なぜ動くのか」シリーズを片っ端から読むといいかもしれない
    • 「効率的なWebアプリ~」とかっていう本とか
    • UNIX/Linux
    • PHP/HTML/CSS/javascript
      • 今後も経験積んでいきましょう
      • 公式ドキュメントに目を通すようにしましょう
      • パーフェクトjavascript読みましょう
  • 新しく勉強したいこと
    • なにか言語1つ
    • 低級言語
      • 型宣言やメモリ管理、ポインタなど厳格なプログラミング
      • アルゴリズムやデータ構造などが学べるもの
      • 候補1 C言語
        • Cを学んでおいて今後の人生で役に立たないことはないと思う
        • Cを使って独自のプログラミング言語を作ってみるのはいい経験になるかもしれない
      • 候補2 C++
      • C++であれば低級言語を学びたいという要件を満たしつつ、オブジェクト指向についても学べる、実践で使う機会もある
        • 一石三鳥
    • 関数型言語
      • ある程度実践的でありつつも、全く別の概念を持ったプログラミング言語を学んでみたいという欲求
      • 候補3 Scala
        • 関数型でありながら、殆ど無いとはいえJavaの知識が活かせる(というかJavaも一緒に学べるのではという期待)
        • 並行性プログラミングなどが楽しそうでありつつ、Android開発もできるのではないかという期待
        • まあ同時に複数の概念が学べるはずもない
  • コードを読む機会を増やす
    • 今使っているフレームワーク
      • 職場のもの
      • jQueryの内部実装をがんばって読んでみる
    • github
      • 気になるコードを舐めるように読む
  • その他
    • 開発環境
      • zsh関連もっと充実させる
      • vim関連もっと充実させる(便利な使い方覚える)
        • vimgrep課題
      • まともに使えるIDEを用意する
      • 家では基本IDE使うようにする
    • バージョン管理
      • とりあえず個人で開発管理しているものは積極的にgitで管理する
    • 記録
      • とりあえずなんでもいいからブログ書け

だらだら羅列したものの、今はこれに尽きる。

C言語を学ぶべきか、死ぬべきか。それが問題だ。」

『フカシギの数え方』 おねえさんといっしょ! PHPで数えてみよう!

おねぇさぁぁぁぁぁん! 日本科学未来館のアニメに狂気が宿っていると話題に

http://nlab.itmedia.co.jp/nl/articles/1209/11/news104.html -ねとらぼ

日本科学未来館のアニメがあまりにも面白かったので触発されて書いてみました。間違ってる可能性も大いにありますので、その辺生暖かい目で見てください。英語で探せばもっといいコードが出てくると思います。

class Explode {

    private $x      = 0;
    private $y      = 0;
    private $size   = 0;
    private $dest   = 0;
    private $line = array();

    function __construct($arg) {
        $this->size = (int)$arg;
        $this->x = (int)$arg - 1;
        $this->y = (int)$arg - 1;
        for ($i = 0; $i < $this->size; $i++) {
            for ($j = 0; $j < $this->size; $j++) {
                $this->line[$i][$j] = 0;
            }
        }
    }
        
    function setGoOn($x, $y) {
        $this->line[$x][$y] = 1;
    }

    function walk($x, $y) {
        $this->line[$x][$y] = 1;
        if ($x == $this->x && $y == $this->y) {
            $this->dest++;
        } else {
            if ($x < $this->size -1 && $this->line[$x + 1][$y] === 0) {
                $this->walk($x + 1, $y);
            }
            if ($x > 0 && $y < $this->size -1 && $y != 0 && $this->line[$x - 1][$y] === 0) {
                $this->walk($x - 1, $y);
            }
            if ($y < $this->size - 1 && $this->line[$x][$y + 1] == 0) {
                $this->walk($x, $y + 1);
            }
            if ($y > 0 && $x > 0 && $x < $this->size - 1 && $this->line[$x][$y - 1] === 0) {
                $this->walk($x, $y - 1);
            }
        }
        $this->line[$x][$y] = 0;
    }

    function getCount() {
        return $this->dest;
    }
}  
$arg  = intval($argv[1]) + 1;
$oneisan = new Explode($arg);
$oneisan->setGoOn(0, 0);
$oneisan->walk(1, 0);
echo $oneisan->getCount() * 2;

実行してみる。

f:id:arerreee:20120914023259p:image

ちゃんとおねえさんの数えた通りの数字になっていますね!

ただ、おねえさんと違って私たちは手近なところにスーパーコンピューターなんてあるはずがないので5x5か6x6が限界だと思います(5マスのときは20秒くらいかかりました)。

さもないと「あれから25万年がたった・・・」なんて話になるので、実行はお気をつけて!


githubに置いときます

https://github.com/sisidovski/CombinationalExplosion