Shogo's Blog

Oct 22, 2012 - 1 minute read -

Twitter公式クライアントのコンシューマキー流出について考える

コンシューマキー流出? 朝のTLにTwitter公式クライアントのコンシューマキーなるものが流れてきたので, なにか面白いことに使えないか セキュリティ的に何か問題になるのか 考えてみました. コンシューマキーとは コンシューマキーとはクライアントの身分証眼書のようなものです. Twitterはコンシューマキーを使用してクライアントを識別します. このコンシューマキーがどのように使われるのかを知るために, Twitterの認証方式であるOAuthについて簡単なスライドを描いてみました. OAuthの認証は大きく分けて次の6ステップからなります. 認証開始 Twitterの使用を開始するためにユーザはクライアントに認証の開始を指示します 鍵の使用申請書の要求 開始指示を受けたクライアントは,コンシューマキーを利用して身分証明を行います 証明できたクライアントに対してTwitterは鍵の使用申請書を渡します ユーザの使用許可をもらう クライアントはユーザに使用申請書を渡し使用許可を求めます 使用申請書はウェブページのアドレスの形で渡されるので,多くの場合ここで自動的にブラウザが立ち上がります Twitter認証 ユーザはTwitterにパスワードを渡し,クライアントに使用許可することを伝えます ハンコを受け取る 使用許可の証としてPINコード(ハンコ)を受け取ります PINコードをクライアントに渡します 申請書を鍵を交換 クライアントは使用申請書とTwitterに渡し,鍵をもらいます 次回以降,クライアントは鍵を利用してTwitterにアクセスすることができます コンシューマキーが流出したということは, ステップ2のクライアントの身分証明の際に「自分は公式クライアントだ!」と名乗ることができてしまうという事です. 一般ユーザに対する影響 さて,これによる一般ユーザへの影響について考えてみましょう. 認証画面の偽装 ステップ4のTwitter認証の際,画面にはクライアント名が表示されます. 公式クライアントのコンシューマキーを使えばここに「Twitter for iPhone」「Twitter for Android」等, 公式クライアントの名前を表示することができてしまいます. これは間違えて認証してしまいそうですね! ・・・でも,ちょっと待ってください. ステップ4にたどり着くには,ユーザ自身が「ステップ1.認証開始」をする必要があります. これをするには,ユーザ自身がソフトをダウンロードして,解凍して,実行する必要があります. ** まともな ** な情報リテラシーを持ったユーザであれば,怪しいソフトは実行すらしませんよね? 偽装Webアプリ Webサイトであれば,アクセスしただけで「ステップ1.認証開始」をしたことにするのは技術的に難しくありません. ステップ1をクリアしてしまえば,流出したクライアントキーを使ってステップ4まで進むことができてしまいます. この時表示されるクライアント名は公式クライアントのものなので,悪意のあるサイトなのか本物なのか見分けが付きません. ここで間違えてパスワードを入力し,使用許可を出してしまったとしましょう. Twitterにはクライアントアプリ(自分のPCで実行するもの)と Webアプリ(ブラウザを使うもの)の2種類があり,この違いによってステップ5での動作が少し変わります. 公式クライアントアプリに偽装していた場合, ステップ5でPINコードが表示されます. ** まともな ** なTwitterユーザであればこの時点で気が付きますよね? 一般的なWebアプリではPINコードが表示されることはまずありません. WebアプリのくせにPINコードが表示されたら認証を中止しましょう. Webアプリに偽装していた場合, PINコードに当たるものが自動的にWebアプリに送られます. この送り先はアプリの作者にしか指定することができないため, 悪意のあるサイトの手にわたることはありません. 一般ユーザに対する影響まとめ コンシューマキーが漏れたからといって特別なことをする必要はありません. ** 怪しいアプリは実行しない ** ** 怪しいサイトでTwitterの認証をしない ** という,当たり前のことさえ気をつけていれば大丈夫です. このことさえ注意していれば鍵が盗まれることはありません. なんか最近犯罪予告の冤罪事件も発生しているので気を付けないといけませんね.

Oct 13, 2012 - 1 minute read - togetter bookmarklet

半自動トゥギャりスクリプトを書いてみた

togetterでたくさんツイートをまとめたい Twitterは手軽に情報収集ができ他人とのコミニュケーションができる楽しいSNSですが、 古いツイートはしばらく経つとタイムラインや検索結果からはたどれなくなってしまいます。 過去のイベントに関するつぶやきを後から見たい、といった場合に不便です。 そこで登場するのがtogetterというサービス。 Twitterのツイートを引用して、「まとめ」を作ることができます。 Twitter上での議論やイベントに対するみんなの反応がわかりやすく見れるので便利です。 僕もJO_RI_botのツイートをまとめたりといろいろとお世話になってます。 簡単なまとめを作るのには非常に便利なtogetter。 しかし、ツイート数が多くなると少し大変です。 例えば何かのイベントのハッシュタグのついたツイートをまとめたい場合、 検索に現れるツイートの数には上限があるので、 漏れ無くツイートを集めるにはイベントの最中にまとめを作る必要があります。 togetterには自動更新機能がないので、数分毎に「検索」ボタンを押さなければなりません。 これは面倒だ・・・ ブックマークレットを書いてみたよ 面倒なので、自動的に検索ボタンを押すブックマークレットを書いてみた。 ** ユーザスクリプトで書き直してみたよ! ** 上のリンクをブックマークに登録しておき、togetterのまとめ作成ページを開くと、 検索ボックスのしたにテキストボックスとボタンが追加されます。 テキストボックスに検索ボタンを押す間隔(秒単位)を入れ、開始ボタンを押すと、 自動的に検索・移動・重複ツイートの削除・ソートをしてくれます。 スクリプト 元のスクリプトをgistにあげておきます。 {% gist 3883841 %} ブラウザ拡張のほうが便利だろうけどブックマークレットとして実装しているのは、togetterのスクリプトやjQueryを自前のスクリプトから呼びたかったから。 ブラウザ拡張でも実現する方法はあるんだろうけど、調べるの面倒だからやってない。 DOMの操作だけでもなんとかなりそうだから、余力があれば書きなおすかも。 これ作るにあたって、togetterのソース見てたけど、重複削除やソートアルゴリズムがなんだか残念な感じ。 ツイート数に比例した回数だけjQueryのセレクタを呼び出している。 jQueryのセレクタって結構重い処理だし、オーダーが O( n^2 ) になるわけで・・・。 単なるソートにしては重すぎだろ、とは思ってはいたんだ。まさかこんな中身だとは。

Oct 12, 2012 - 1 minute read - 6さいカンファレンス

6さいカンファレンス 第6回「幼女を描いてみよう! ~原画から彩色まで~」まとめ

2012/10/11にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第6回は「幼女を描いてみよう! ~原画から彩色まで~」です。 勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 (カンファレンスの内容にはくいなちゃんライセンスが適用されるらしいです.怖!) ゆるふわ☆タイム くいなちゃん: 今日も、前回と引き続き、プログラミングのプの字も出てこない、ゆるふわ講義ですん☆ くいなちゃん: テーマは 「幼女を描いてみよう! ~原画から彩色まで~」 ということなので、今回描いてみた絵を、いきなり完成形からご覧いただくことにします。 3時間で描いたです。 http://kuina.tes.so/6saiconf_6/img0.jpg 構図を描いてみるです! くいなちゃん: では、順を追って、描いていくことにしましょう。 最初はもちろん、カンヴァスは白紙です。 そこに、まずは構図をテキトーに描いてみるです: http://kuina.tes.so/6saiconf_6/img1.jpg はい、ここまではみなさん描けますね。 まるで6さいが描いたようなテキトーな落書きです。 くいなちゃん: ここでのポイントは、脳内に立体をイメージすることです。 構図をイメージしやすいように、背景に線を引いていますが、無くてもイメージできるなら描く必要はありません。 注意してほしいのは、2D絵を描くからといって、2Dで捉えないことです。 アニメ絵でも同様ですん くいなちゃん: はい、キャラに、顔と髪を追加してみました。 http://kuina.tes.so/6saiconf_6/img2.jpg えっ、完成形と絵が違う? キニシナイ! あと、独りでは寂しいので、小鳥も追加しました。 色を塗っていくです! くいなちゃん: アニメ調の絵を描く場合は、ここからアニメ塗りをしていただけば完成しそうなんですが、せっかくなので、油彩画っぽく塗っていくことにします。 くいなちゃん: まずは、べた塗りです。 http://kuina.tes.so/6saiconf_6/img3.jpg くいなちゃん: なんてことはありません。 太いブラシで、テキトーに塗っただけです。 はみ出しまくってますね。 しかし、ブラシが太いので、細かな部分はそもそも塗れません。 このくらいテキトーでもキニシナイでok くいなちゃん: 人物に影が、若干付けられていますが、原画を描くときに立体を意識したならば、光源を意識すればある程度付けられると思います。 物理学的に考えるのです! 細部を塗っていくです! くいなちゃん: はい、次は、もう少し細いブラシで、細部を塗っていきます。http://kuina.tes.so/6saiconf_6/img4.jpg 基本的には、最初に太いブラシで大まかに塗り、徐々にブラシを細くしていき、細部を描きこんでいく流れですね。 ブラシの目安は、半々にしていくと良さそうです くいなちゃん: この時点で、服に謎の模様が描かれていますが、テキトーです。 その太さのブラシで表現できる粒度のものを塗ってください。 くいなちゃん: で、更に細いブラシで塗っていきます(3段階目) そして、このあたりまで塗ったら、試しに線画(原画)を外してみましょう。 http://kuina.tes.so/6saiconf_6/img5.jpg おや、線画が無くても 綺麗に見えますね! くいなちゃん: 目を描きこんでいなかったのは、意図的です。 最初のアニメ調の絵で完成させたい場合は、目も塗ってあげてください。 顔を描くです! くいなちゃん: はい、それでは、もう線画が無くても輪郭が解りますので、線画は非表示にしたまま塗っていきましょう。 更に細いブラシで塗ります。

Oct 11, 2012 - 1 minute read - 6さいカンファレンス

6さいカンファレンス 第5回「6さいからの作曲講座」まとめ

2012/10/04にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第5回は「6さいからの作曲講座」です。 勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 (カンファレンスの内容にはくいなちゃんライセンスが適用されるらしいです.怖!) THE END くいなちゃん: みなさん、楽譜は読めますね!(チラッ くいなちゃん: 今回は、作曲理論などの難しい講義というよりも、実際にどうすれば綺麗な曲が作れるのか、という実践的な内容になっています。 くいなちゃんの独自理論ですん くいなちゃん: では、さっそく、曲を作ってみましょうー コード くいなちゃん: はい、まず曲に必要なのは、 “コード” です。 「えっ、メロディじゃ?」 と言った あなたは素人です。 コードをしっかり押さえない曲は、聴くに堪えない感じになってしまいます。 くいなちゃんは、コードもメロディも全部同時に浮かぶことのできる天才肌ですが、とりあえず今回はコードを中心に創っていきましょう! くいなちゃん: コードのルール: ** 「あるコードには、移りやすい次のコードが ある程度決まっている」 ** です! たとえば、C(ド・ミ・ソ) のコードからは、G(ソ・シ・レ) や F(略) や Am(略) に移りやすいです。 逆に、G や F から、 C にも移りやすいです。 くいなちゃん: ということなので、C → G → C → G は移りやすいコードのルールで作ったので、自然なコードということになりますね。 このコードで曲を作っていきましょ! くいなちゃん: はい、この楽譜をご覧ください。 C(ドミソ) と G(ソシレ) が交互に来ているのが解るかと思います。 わからない人は、じっくり読んでね。 http://kuina.tes.so/6saiconf_5/img0.png(魚拓) くいなちゃん: はい、コード完成です! せっかくなので、これを鳴らしてみましょう。 http://kuina.tes.so/6saiconf_5/snd0.mp3 くいなちゃん: 自然ですね! メロディをのせる くいなちゃん: では、コードが完成したので、メロディを乗せて行きましょう。 メロディのルール: ** 「拍子の部分には、コードの音を使う」 ** です! さっきの、音が鳴っているタイミングの部分に、コードの音を使って、メロディを配置してみましょう。

Oct 4, 2012 - 8 minute read - 6さいカンファレンス

6さいカンファレンス 第3回「アルゴリズムを自力で生み出すプログラムを作ろう!」まとめ

2012/09/06にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第3回は「アルゴリズムを自力で生み出すプログラムを作ろう!」です。 勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 WELCOME TO HEAVEN!! くいなちゃん: ところでみなさん、次の( ) に入る数を当ててください 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ( ) くいなちゃん: はい、正解です! これは、フィボナッチ数列と呼ばれ、 前の2つの値の和が、次の値になっているという数列です くいなちゃん: これを、f(0) = 0, f(1) = 1, f(2) = 1, f(3) = 2, f(4) = 3, f(5) = 5, … と書いていくことにしましょう。 f(10) = 55 ですね! くいなちゃん: もっと汎用的に考えて、f(x) の x を与えると、フィボナッチ数が返ってくることを考えましょう。 x = 10 のとき、f(x) が 55 になる、といった感じです くいなちゃん: ではみなさん、この f(x) を、プログラムで書くことはできますでしょうか。 言語は何でも構いません。 くいなちゃん: やり方は、いくつかあります。 x = 100 と与えられれば、0, 1, 1, 2, 3, 5, … と 約100回繰り返して、x = 100 の値を求めるというものです。

Oct 3, 2012 - 1 minute read -

リアルタイムにテンションを上げてみた

昨日,Twitterで猫型さんのアイコンのテンションが上がっている話をしていたら, こんな無茶ぶりをされたんですよ. 明日には、いっちーがWebRTCでリアルタイムテンション上がってきたサービス作ってくれるだろうし、猫型さんがアプリの申請出してるだろう — Takashi Sasakiさん (@civic) 10月 2, 2012 いいだろう,その挑戦受けてやる! WebRTCって? WebRTCというのはブラウザ上で Real Time Communication を行うAPI群のことことです. ローカルデバイス(Webカメラとかマイクとか)へのアクセス ブラウザ同士が(サーバを介さずに)直接通信 なんてことができるようになるらしいです. つまり WebRTCを使えば Skype っぽいものをプラグインのインストールなしにブラウザ上で実現できるってわけですね. Chrome の最新安定版で、ウェブの最先端に触れてみようから いろいろなWebRTCを使ったデモを見ることができます. 僕も似顔絵描いてもらったりしてみました. getUserMedia API を使ってみる まだまだ仕様策定中で対応ブラウザがほとんどない状況ですが, 2012年10月現在,最新版の Chrome 21 で前者のローカルデバイスへアクセスするAPIである getUserMedia API が使えるようです. 早速遊んでみましょう. navigator.getUserMedia( {video: true}, // constrains: 接続先のデバイス function successCallback(stream) { // アクセス成功 // stream に LocalMediaStream オブジェクトが入ってる // <video id="video"></video> 要素を取ってくる var video = document.getElementById('video'); // BlobURLに変換してsrcに入れる video.src = URL.createObjectURL(stream); // 再生 video.

Oct 2, 2012 - 9 minute read - 6さいカンファレンス

6さいカンファレンス 第2回「数学の定理を自動で発見するAI を Haskellで作ろう!」まとめ

2012/09/13にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第2回は「数学の定理を自動で発見するAI を Haskellで作ろう!」です。 勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 WELCOME TO HELL!! くいなちゃん: それでは、まず、数学の「定理」とは何か、について説明したいと思います。 みなさん、日常的に「定理」という言葉を使っていると思いますが、「定理」とは何か、説明できますか くいなちゃん: 「教科書に載っている公式が、定理だ!」と思うかもしれませんね。 確かに、教科書にも定理は載っています。 くいなちゃん: では、曖昧な理解の方のために、厳密かつ ゆるふわに説明しましょう。 くいなちゃん: 定理とは、次のように定義できます。 公理であるならば、定理である。 定理を推論規則によって推論したものは、定理である。 以上。 くいなちゃん: はい、みなさんこれで定理が何かを理解したと思いますので、数学の定理を自動で発見するAIを作ろうと思います。 くいなちゃん: Haskellで。 Haskell! くいなちゃん: そもそも、Haskellって何? という方もおられるかと思いますので、まずは Haskell について簡単に説明しておきたいと思います。 くいなちゃん: Haskell は、関数型言語です。 宣言的プログラミングによって、プログラムしていくプログラミング言語です。「○○は××である!」というのを繰り返してプログラミングする感じですね。 「まずは○○して、次に××しろ!」という C言語(手続き型言語)とはかなり異なります。 くいなちゃん: では具体的に、今回定理を発見するための数学の体系を説明しながら、同時に Haskell で実装してみることにしましょう。 くいなちゃん: 最終的には 大規模な数学体系の定理を発見するとしても、まずは試しに小さな体系で定理を発見してみることを考えます。 今回は、命題論理を対象としてみます。 定義 くいなちゃん: では、今回対象とする命題論理を、厳密に定義していきましょう。 まず、この体系で用いられる記号は、P Q R ¬ ⇒ の5種類です。 この5種類をうまく並べると、この数学体系でのあらゆる式や命題が記述できます。 くいなちゃん: まあ、たとえば、 P⇒P (PならばPである) といった感じですん。 わかりますね。 くいなちゃん: ¬ は数学における否定によく使われる記号ですが、いまのところ、単なる記号にすぎず、意味は定義されていません くいなちゃん: ちなみに、くいなちゃんはポーランド記法が好きなので、 P⇒P を、 ⇒PP と書くことにしましょう

Sep 30, 2012 - 8 minute read - 6さいカンファレンス

6さいカンファレンス 第1回「C言語で作る、はじめてのDAW制作」まとめ

だいぶ時間がたってしまったけど、2012/09/06にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第1回は「C言語で作る、はじめてのDAWソフト制作」です。 勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 BATTLE START!! くいなちゃん: みなさんは、既にC言語の基本的なところはマスターしていると思いますが、念のために軽く復習しておきましょう。 まずは、このソースコードをご覧ください。 http://kuina.tes.so/6saiconf/a.png(魚拓) #include <stdio.h> #include <math.h> int main(void) { return 0; } くいなちゃん: 右下の100% は気にしなくてOKです。 このプログラムは、「何もせず終了するだけ」のプログラムとなっています。 ソースコードを順に解説しましょう。 くいなちゃん: まず、1行目と2行目に書かれている #include ですが、これはおまじないです。 プログラムの本質は、4行目からとなります。 くいなちゃん: int main(void) { } が、プログラムの本質となります。 コンピュータがこのプログラムを起動すると、int main(void) { } の { と } に囲まれた部分を上から順に実行していきます。 } に辿り着いたら終了です。 くいなちゃん: よって、このプログラムは、 return 0; を実行するだけのプログラムとなります。 return 0; とは、おまじないです。 えへへ☆ DAWを作ってみる くいなちゃん: はい、もう、C言語の基本的なところは全てマスターできましたね。 では、早速 DAWソフトを作ってみましょう。 くいなちゃん: DAWとは、簡単にいいますと、曲を作るソフトです。 それでは、int main(void) { } の中に、DAWっぽいプログラムを書いていきましょう。 とりあえず、int i, j; を書きます。

Sep 24, 2012 - 1 minute read - NDS

NDS28に参加してきた #nds28

先週土曜日は第28回NDS(長岡技術者勉強会)でした。 スーツ vs ギーク Togetterのまとめを見ながら、内容を頑張って思い出してみる。 (せっかくローカルでブログ書ける環境作ったんだから、ちゃんとメモっとくべきですね・・・と思いつつ毎回できない) プログラマは誰でもいい? 人に依存しないことはいいこと でも、本当にそれでいいの? 能力があれば誰もいいのかも 社長の方が誰でもいい (自称)ギークなスーツ 「これからはHadoopらしいよ」 ギークにもユーザの対応して欲しい 「技術的な制限で無理」なことを説明するときとか 浅い知識だけでは矛盾点を突かれて、Yesと言わざる負えない時も 「ときどき行く→ギーク行くといいじゃんってなる→ときどきが毎回になる」と困るよね 判断を全部ギークに丸投げしないで! 例えば、初期コストを取るか、拡張性を取るか、とか 技術的な利点・欠点は説明するけど、実際どっち使うかの判断はスーツな人にお願いしたい スーツを手玉に取るコミュ力 コミュ力の低いギークは技術力を生かせなくてもったいない! ギークもコミュ力を身につけるべき 名選手と名監督は両立しない 技術者からの叩き上げでマネージメントする側になった人は他人を上手く使えない マネージメント系は手足のように他人を使えなければならない 社会は怖いところです。 通常セッション マッチョ見積もり by @hiro55bsさん 「つまり、見積りは予想ではなく、帳尻をあわせるものなんだよ!」 見積もりはリスク管理、プロジェクト初期だけでなく随時やっていくもの プロジェクト初期では見積もりに幅があって当然 もる いろんな統計データからざっくり見積もれるんですね。勉強になります。 ワンライナーでノイズミュージック by @neko_gata_sさん Experimental music from very short C programsに触発されたというお話 RIFFヘッダつけるとこは Perl でやってます! 波といえば正弦波の組み合わせで・・・と思っていたので、ビット演算で音を出してみるというのはおもしろいです。ぜひやってみたいです。 LT SIの現場から感じた未来 by @nemuzukaさん 現在の契約形態に対する問題提起 皆さんで考えて行きましょう RubyMotionでiOSゲームを作るっきゃない by @jewel_x12さん Pythonが主人公のゲーム Android版はまだですか? Echigo Network Operators’ Group について by @yyasuyukiさん コイントスで決めよう お姉さんのコンピュータを高速化したお話 補足とか スライド上げようと思ったんですけど、よく考えたら半分他人さまの画像使ってるのであまりよろしくないですね。 検索アルゴリズムの紹介などは「おねえさんのコンピュータを作ってみた」を ご覧ください。

Sep 22, 2012 - 1 minute read -

おねえさんのコンピュータを作ってみた

まだやってたのか、と言われてしまいそうですが、おねえさんが計算にかけた時間と比べればまだまだです。 『フカシギの数え方』 おねえさんといっしょ! みんなで数えてみよう! この動画で出てくるおねえさんのコンピュータを作ってみた、というお話。 おねえさんのコンピュータからアクセスできます。 検索アルゴリズム HTML+CSSでコンピュータの画面を再現してみました。Javascriptを組むより、そっちの方に時間がかかった気がする。 経路の描画にはCanvasを使ってます。 この問題は自己回避歩行(Self-avoiding walk)と呼ばれるものらしいです。 単にグラフ上を移動するだけなので、小さいなサイズなら単純な深さ優先検索(DFS)で解けます(大きなサイズで何が起こるのか・・・それは動画で)。 実装では、DFSによる検索プログラムをWeb Workerを使って走らせ、スタートとゴールを結ぶ経路を見つけたらメッセージを飛ばしてます。 さすがに全部は表示できないので、実際に表示するのは50ms秒程度の間隔。 4×4以下ではそれだと速すぎて何が何だかわからないので、待ち時間を入れてある。 さあ、君も10×10にチャレンジだ!! おねえさんに教えて上げよう! しかしながらDFSだけだとなんだか負けた気がして悔しいので、高速化したアルゴリズムも試してみた。 「おねえさんに教えてあげる」のチェックボックスにチェックを入れると高速化したアルゴリズムで問題を解きます。 ゼロサプレス型二分決定グラフ 自分が色々試行錯誤している間に他の人が解いてしまった(「フカシギの数え方」の問題を解いてみた) ので、それを参考に実装してみた。 今回の問題は「グラフ上の経路問題」ですが、どの枝を通ってどの枝を通らないかという「枝の選択問題」として考えることができます。 その組み合わせを効率良く表すための方法が、ゼロサプレス型二分決定グラフ(ZDD; Zero-Suppressed Binary Decision Diagram)。 ZDDは数学の組み合わせでよく使う樹形図の一種で、 同じ結果になる枝を集めることで樹形図を効率良く表したものです。 概要はBDD/ZDDを基盤とする離散構造と処理演算系の最近の展望 を参照。 もっと詳しい説明はThe Art of Computer Programmingに書いてあるらしい(まだ読んでない)。 ZDDを考えた湊先生は最初の動画の企画・監修も努めている方なので、 動画中の数値もZDDを使って求めたものと思われます。 Simpath ZDDは単なる組み合わせの表現方法なので、別途グラフからZDDを求める手法が必要になります。 これに関する簡単な解説がZDDを用いたパスの列挙と索引生成 から見られます。 上のセミナー資料ではZDDの基本演算を使った列挙の方法が紹介されているけど、 今回はクヌース先生のSimpathを採用。 Simpathでは(既約でない)ZDDを作ることができます。 経路の両端にのみ着目し、この情報をmateという配列で管理。 frontierと呼ばれる頂点のmateを用いてZDD上のノードを共有することで簡略化を行います。 実際使ったアルゴリズム セミナー資料では幅優先でノードを作ってみるように見えるけど、今回の実装では深さ優先で経路数だけカウント。 ZDDのノードを作るのが面倒だったんです。 しかし、覚えなければならないmateが大量になってしまいメモリがああああ!! すべて覚えるのは諦め、一部のmateだけ覚えるようにしました。 「おねえさんに教えてあげる」のチェックを入れると、適当実装のSimpathで計算します。 計算中一部の枝が灰色になるのは、ZDD上でノードの共有化が行われたため、実際には枝が処理されなかったためです。 格子上の点に丸がついているのはfrontier。 この点の継続情報を用いて共有化を行います。 まとめ おねえさんのコンピュータの実装と高速化を行いました。 高速化の結果、処理に数分かかっていた6×6の計算が200msで終わるようになりました。 10×10も1分程度で終わります。 ただ、表示のためのオーバーヘッドがあるとはいえ、他の人と比べると少し遅いような。 なにか実装間違っているかも。 The Art of Computer Programmingを読んで勉強しないとかな。