Successfully reported this slideshow.

ぼくとしりとりの約3.0*10^3日間戦争

1,568 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

ぼくとしりとりの約3.0*10^3日間戦争

  1. 1. ぼくとしりとりの 約 3.0×10 3 日間戦争 ~今日、ぼくがしりとりのすべてを語り尽くす~ えりっく さーとる 2010.12/12 第 23 回 SIProp 勉強会
  2. 2. 先に言っておかなければならないこと <ul><li>風邪をひいている可能性
  3. 3. タイトルは釣り
  4. 4. did2memo さん尊敬してます!
  5. 5. 参加しようとしたら何故か講師側に
  6. 6. そもそも P2P に見事に関係ない </li></ul>
  7. 7. じゃあきみなにしにきたの <ul>-> 言いたいことがある <ul><li>しりとりをナメるな
  8. 8. 東工大には 附属の高校があります
  9. 9. 高校生が研究をしようとする とこうなりますという例
  10. 10. えりっくとかいうやつが SIP とか DHT について知りたがっています←本来の目的 </li></ul></ul>
  11. 11. おしながき <ul>1.HOURDS D' OEUVRE ( 発表の前に ) <ul><li>自己紹介とか
  12. 12. 研究3テーマの概要 </li></ul>2.POTAGE ( ちょっとした研究 ) <ul><li>テーマ1:課題研究で つくったなんちゃって OS </li></ul>3.ENTHE'E ( 本日のメインディッシュ ) <ul><li>テーマ2:一番いいしりとりの研究とつくば AC </li></ul></ul><ul>4.SARADE ( 添え物 ) <ul><li>テーマ3:ゲーム用 自作インタプリタ </li></ul>5.DESSERT ( 締め ) <ul><li>まとめ
  13. 13. 質疑応答という名のフルボッコ </li></ul></ul>技術の フルコース!
  14. 14. 自己紹介とか <ul>えりっく さーとる <li>自称:なんちゃってプログラマ
  15. 15. 国立大学法人東京工業大学附属科学技術高等学校 科学技術科 情報・コンピュータサイエンス分野3年
  16. 16. PC 歴 10 年目だがしかしプログラミング歴 3 年目
  17. 17. Twitter やってます @siritori
  18. 18. セキュリティ&プログラミングキャンプ 2009 卒業
  19. 19. 言語 </li><ul><li>C, Java, Perl, Erlang, ActionScript あたり </li></ul><li>特技:しりとりとマッサージ
  20. 20. よろしくお願いします </li></ul>
  21. 21. 研究テーマの概要 <ul>3つあります <ul><li>課題研究でつくった なんちゃって OS
  22. 22. 一番いいしりとりの研究と つくば AC
  23. 23. ゲーム用自作インタプリタ </li></ul>Q. 時系列は? A. かなりぐちゃぐちゃ <ul>-> ざっとあらわすと右図 </ul>しりとりの研究は 本当に 3000 日 </ul>年齢 できごと 11( 小 5) しりとり研究開始  HP 公開 12( 小 6) 誕生日に広辞苑もらう 13( 中 1) ひたすら語彙の充実 14( 中 2) 戦法の考察 15( 中 3) ( 受験 ) 16( 高 1) プログラミングに出会う 17( 高 2) セプキャン←関係ない 18( 高 3) しりとり bot プロトタイプ実装 課題研究開始 最長しりとりの研究 受験終了 課題研究終了 スクリプト言語の開発開始
  24. 24. 研究テーマの概要 <ul>1. 課題研究でつくった なんちゃって OS <ul><li>学校の 課題研究 (≒ 卒業研究 )
  25. 25. 初めて他人とソースコードを共有
  26. 26. 共同研究初経験 </li></ul>目的 <ul>コンピュータってどうやって動いてるの? という疑問解決 </ul>内容 <ul>H8SX で動く OS を フルスクラッチでつくってみる </ul></ul><ul>結果-> 黒歴史 ほとんど中途半端 何がいけなかったか <ul><li>基本情報からやりなおしてこい
  27. 27. 班員にバリバリ書ける人が少ないのに なにもサポートをしてやれなかった </li></ul>そのかわり <ul><li>疑問はある程度解決
  28. 28. 進め方についてのいい反面教師 </li></ul></ul>
  29. 29. 研究テーマの概要 <ul>2. 一番いいしりとりの 研究とつくば AC <ul><li>総研究期間約 3000 日←若干誇張
  30. 30. いくつかあるけど2つアプローチ </li><ul><li>実戦から学ぶしりとりに 勝つ方法
  31. 31. シミュレーションによるしりとりが長く続くための単語の選び方の研究 </li></ul></ul>目的 <ul>最初:父さんに負けたくない いま:本格的な研究のプロセスを体験 </ul></ul><ul>内容 <ul>できるだけ長くしりとりを続けるようなしりとりの研究 </ul>結果-> 大学合格できました <ul><li>一応それなりの成果はでた
  32. 32. けどこれよくよく考えたら 当たり前じゃないの・・・ </li></ul><li>まだまだ研究は続く! </li></ul>
  33. 33. 研究テーマの概要 <ul>3. ゲーム用 自作インタプリタ <ul><li>とあるきっかけでゲームを作ることに
  34. 34. コードを書きながら、システムとコンテンツは分けたいよなぁとかぼんやりと </li></ul>目的 <ul><li>ゲーム制作のスクリプターの 負荷軽減
  35. 35. せっかくだし プログラミングスキル の腕試しをしたい </li></ul>内容 <ul>インタプリタの開発 </ul></ul><ul>※ 現在進行形。 力試しと銘打っている以上 <ul><li>あえて bision,flex の類は使いません
  36. 36. あえて C で書いてみる
  37. 37. あえて ドラゴンブックは読みません </li></ul>で、現状どうなのよ <ul><li>字句解析器できました
  38. 38. 変数表管理機能 (?) つけました
  39. 39. 途中で文法の変更を加えつつ構文解析器を書いている←イマココ </li></ul></ul>
  40. 40. 研究テーマの概要 ざっとそんな感じのことを これからお話します
  41. 41. POTAGE : ちょっとした研究 <ul>課題研究でつくった なんちゃって OS ~共同研究をしようとしたら~ 1. きっかけ 2. 実装したもの 3.( 困った | 悩んだ ) こと 4. 研究 () を振り返って </ul>
  42. 42. 1. きっかけ <ul><li>「磯野ー OS 作ろうぜー」
  43. 43. そういえば小学校のころからコンピュータの動くしくみ気になってたし、 OS 作れば理解ができるかも
  44. 44. 名前どうしよう-> MenTOS
  45. 45. 30 日でできる (ry はあえて使わない
  46. 46. そのころ話題になりだしていた トランジスタ技術 4 月増刊号 「今すぐ使える! H8 マイコン基板」
  47. 47. こ  れ  だ
  48. 48. 学校の予算で降りたので痛手なし </li></ul>
  49. 49. 2. 実装したもの <ul>全然数がない <li>マルチタスキング </li><ul><li>コンテキストスイッチ
  50. 50. 循環リストを使った簡単な物 </li></ul><li>ファイルシステム </li><ul><li>どうしても独自規格をつくってみたかった
  51. 51. ディレクトリの作成とかしか実装できてない </li></ul><li>シェル </li><ul><li>関数ポインタ無双
  52. 52. ローダができてないから内部コマンドのみ </li></ul></ul>
  53. 53. 2. 実装したもの <ul><li>マルチタスキング </li><ul><li>コンテキストスイッチ
  54. 54. アセンブリコード書くのは PIC マイコンの授業以来
  55. 55. えっ PIC マイコンと H8SX ってだいぶ仕様が違うのね
  56. 56. ふむふむ er7 レジスタがスタックポインタ、と。
  57. 57. デバッグ手段どうしよう-> RS232C によるシリアル通信 </li><ul><li>ちゃんと使えるかよく確かめずに使ったせいで1週間ほど無駄にしてしまったことがあった
  58. 58. Syuu さんに協力してもらいながらデバッグの日々 </li></ul></ul></ul>_switch_runnable_task: mov.l er6,@-er7 mov.l er7,er6 ; save general registers stm.l er0-er3,@-sp stm.l er4-er6,@-sp ; save SP mov.l er7,@er0 ; switch SP mov.l er1,er7 ; restore general registers ldm.l @sp+,er4-er6 ldm.l @sp+,er0-er3 rts/l er6 こういうの書いてみたりしました
  59. 59. 2. 実装したもの <ul><li>マルチタスキング </li><ul><li>タスク構造体を定義してみる
  60. 60. タスクの動的追加 / 削除には至らず ( コンパイル時にタスクリング構成 )
  61. 61. 今できてるタスクスイッチの流れは? </li></ul></ul>すべてのタスクに switch_created_taskでコンテキスト積む クロック割り込み開始 すべてのタスクに switch_created_taskでコンテキスト積む 定期的にswitch_runnable_task でタスクの切り替えをする おい、できて ねーじゃねえか!! struct mentos_task { int *sp; char state; unsigned taskID; function entry; int stack[STACK_SIZE]; struct mentos_task *next; };
  62. 62. 2. 実装したもの <ul>ファイルシステム <ul><li>普通なら FAT32 とかを実装するわけですが
  63. 63. なにを思ったかロクに調べずに独自で書いたみた。その名も「 HIJIKI 」
  64. 64. 何か専門用語あっても知らない可能性があります
  65. 65. root ディレクトリにおけるエントリ (?) の数が無限でも大丈夫 </li></ul><li>で、どういう実装なの </li><ul><li>データ構造が2つ  hijiki_block と data_block </li><ul><li>1ファイルや1ディレクトリにつき1 hijiki_block
  66. 66. 1つの hijiki_block は 1 つ以上の data_block へのリンクをもつ </li></ul></ul></ul>HIJIKI-BLOCK AREA DATA-BLOCK AREA 二次記憶装置上の空間をこんなふうに使う ROOT HIJIKI-BLOCK ファイルの表し方 ディレクトリの表し方
  67. 67. <ul>ファイルシステム <ul><li>で、どこまで実装できたの?
  68. 68. 前述のとおり「ディレクトリの追加」「ディレクトリ内一覧表示」くらい しかできていない
  69. 69. 何がいけなかったんだろう </li><ul><li>班員に作業をお願いしていない
  70. 70. お願い!難しくないからコード書こうよ!
  71. 71. 自分の問題( もっと簡単な構造体の定義できたんじゃないの ) </li></ul><li>そのころ班員には何を任せてたの </li><ul><li>ソフトウェアキーボードとかお願いしてた
  72. 72. シェルつくってもらうようにお願いしてた </li></ul></ul></ul>2. 実装したもの たしかによく考えると メンバを入れ子にしすぎた感が
  73. 73. <ul>シェル <ul><li>班員さんが実装してくれました
  74. 74. 簡単な字句解析と引数に分ける
  75. 75. 関数ポインタを教えるのからスタート </li><ul><li>「わかった!」っていったときがすごく嬉しそう
  76. 76. あぁもっと最初からこんなかんじでつくっていればよかった </li></ul></ul></ul>2. 実装したもの
  77. 77. <ul><li>コードをそこまで書ける人がいない </li><ul><li>「人のせいにするな」 </li></ul><li>時間がない </li><ul><li>夏休み中に違う研究(しりとり)やってた </li></ul><li>そもそもOSのしくみをあまりにも知らなさ過ぎる </li><ul><li>勉強しながらはやっぱり時間がかかった </li></ul></ul>3.( 困った | 悩んだ ) こと
  78. 78. <ul><li>syuuさん本当にありがとうございました
  79. 79. 今どの班員が何をやっているのか、どれくらい進んでいるのかを把握しなきゃいけない(googleカレンダー、掲示)
  80. 80. なんでもかんでも教えるんじゃなくて、「何を参照すればわかる/学習できるのか」を伝えるべきだった
  81. 81. Dropboxはこういうときかなり使える
  82. 82. 予定を立てずになんとかなるだろ精神はやっぱり良くなかった
  83. 83. 将来仕事するようになったときが心配になった </li></ul>4. 研究を振り返って
  84. 84. ENTHE' E: 本日のメインディッシュ <ul>一番いいしりとりの研究 とつくば AC ~研究をして論文を書こうとしたら~ 1. きっかけ 2. 高校入学前の実績 3. 長く続くしりとりに挑戦 4. 論文 () を書いてつくばに 凸してみた 5. 研究を振り返って </ul>
  85. 85. 1. きっかけ <ul><li>高校入学前の研究動機 </li><ul><li>小学校5年の夏休みに父と北海道へ
  86. 86. 北海道は広い->暇になる->Let's Shiritori
  87. 87. ぼろ負け->くやしい </li></ul><li>高校入学後の研究動機 </li><ul><li>しりとりbotを作ってみた←趣味
  88. 88. わりとアルゴリズムがひどい
  89. 89. できるだけ相手と一緒にしりとりを長く続ける ようにアルゴリズムを工夫したい </li></ul></ul>
  90. 90. 2. 高校入学前の研究実績 しりとりとかwwwww どうせ単語たくさん知ってるほうが勝つんでしょ 甘い。 単語の分布の把握 単語の頻出度 心理状態 単語の探しかた ここで説明 次で説明
  91. 91. 3. 長く続くしりとりに挑戦 <ul>Q.協力して長くしりとりを続けるためには? </ul><ul>既存の研究をCiNiiさんで探してみた <ul><li>大きく分けて2件ヒット </li><ul><li>しりとりゲームの数理的解析
  92. 92. 最長しりとり問題の解法 </li></ul><li>とりあえず読んでみる </li><ul><li>ぐらふりろん?いろいろ見てみたけどよくわからない
  93. 93. ->困ったときのTwitter </li></ul><li>問題点があった </li><ul><li>このアルゴリズムはしりとりbotに適用できない </li></ul></ul></ul>
  94. 94. 3. 長く続くしりとりに挑戦 <ul>ごちゃごちゃやる前にしりとりのルールの定義 </ul>お互いで共有する、ゲームに使っていい語彙の 辞書 をもつとする <ul><li>相手が言った最後の文字から始まる単語を辞書から選ぶ
  95. 95. 一回使った単語はもう使えない
  96. 96. 最初の文字はランダムとする
  97. 97. 最後の伸ばす記号「ー」は消す、拗音「ゃ」とかは大きく
  98. 98. 選べる単語がなくなった時点で終了
  99. 99. 「ん」で終わりはないものとする
  100. 100. やりとりをした回数を 「しりとり長」 とする
  101. 101. これを指定された辞書の単語をできるだけ使って 長くつづけるには?
  102. 102.               ->しりとりの数理モデル化をしてみる </li></ul>
  103. 103. 3. 長く続くしりとりに挑戦 あ す る ま 1 1 2 1  3  2  1 2
  104. 104. 3. 長く続くしりとりに挑戦 文字を頂点とし、 c とおく。 文字 c の集合 {c1, c2, c3, ...} を V とする C1 C2 C3 C4
  105. 105. 3. 長く続くしりとりに挑戦 頂点 a から b に伸びる 有向辺を Xab と定義し、 これを「 a から始まって b で終わる単語群」とする またこの集合を A とする Xab Xbc Xba Xac a c b
  106. 106. 3. 長く続くしりとりに挑戦 頂点 a から b に伸びる 有向辺を Xab の重みを Fab とし、これを「 a から始まって b で終わる単語の数」とする またこの集合を W とする Fab Fbc Fba Fac a c b
  107. 107. 3. 長く続くしりとりに挑戦 仮説とか立ててみた
  108. 108. 3. 長く続くしりとりに挑戦 <ul>ここでいうIterator αとは? <ul><li>現在の頂点 から 次の頂点 を見つける関数
  109. 109. 単語の分布から次に どの頂点に行くかを判断
  110. 110. アルゴリズムを2つ考えてみた </li></ul></ul>
  111. 111. 3. 長く続くしりとりに挑戦 <ul>Iteratorα 0 :Foolish method <ul><li>現在の頂点から伸びる有向辺のうち一番重い枝 をもつ頂点を次の頂点とする
  112. 112. 真っ先に思いついた </li></ul></ul>p Fpa Fpb Fpc
  113. 113. 3. 長く続くしりとりに挑戦 <ul>Iteratorα 1 :Method of valuing weight of next <ul><li>言葉にできない
  114. 114. パラメータnをとります </li></ul></ul>p
  115. 115. 3. 長く続くしりとりに挑戦 <ul>よし仮説が正しいか確かめてみよう -> 実験してみた! <li>実験の前にしなきゃいけないこと </li><ul><li>しりとりするのに必要な膨大な名詞のデータ
  116. 116. アルゴリズムを記述するためのプログラミング言語
  117. 117. 名詞のデータをプログラムで扱う形に変換 </li></ul></ul>
  118. 118. 3. 長く続くしりとりに挑戦 <ul>名詞データを探して <ul><li>参考文献では形態素解析によく使われたりする ICOT辞書を使っていた
  119. 119. とはいえこれは過去の話。もう手に入らなかった
  120. 120. ということで巷の形態素解析用辞書を捜し回る </li><ul><li>IPA-jdic 79610words
  121. 121. NAIST-jdic 130503words
  122. 122. UniDic 100588words </li></ul><li>規模は違うものの、単語の分布の割合は同じであろうとここで推測(規模が違うだけ)
  123. 123. これらをPerlで変形していく(結構時間がかかった) </li></ul></ul>
  124. 124. 3. 長く続くしりとりに挑戦 <ul>プログラミング言語どうするの <ul><li>結論からいうとErlangを選びました
  125. 125. なんでお前Erlang知ってるん->daikiくん・・・
  126. 126. なんでよりによってErlang </li><ul><li>アルゴリズムを簡潔に書きたいから関数型言語がいいな </li><ul><li>すでに知っている言語はErlangしかなかった </li></ul><li>AC 入試の締切りまで時間がない、複数の実験を CPU のコアいっぱいつかってできるだけ速く計算したい </li><ul><li>Erlangのプロセスがいいかもしれない </li></ul></ul><li>正直別にErlangである必要はなかったかもしれない けど、目的はかなり簡単に達せられたしいいかなと </li></ul></ul>
  127. 127. 3. 長く続くしりとりに挑戦 前置きいいからさっさと結果報告しろよ -> ( しりとり長 )/( 辞書単語数 )*100 でしりとられ率だしてみた Iterator0 Iterator1 IPA 8.23 48.40 NAIST 6.25 50.30 UniDic 5.93 50.06 半分を超えること ができた!!! ちなみに: 既存の研究とほぼ同じ成果
  128. 128. 4. 論文 () 書いてつくばに凸してみた <ul><li>せっかくここまでやってみたし報告書でも書くか
  129. 129. TeXで書いてたら論文っぽくしたくなったので フォーマットを論文のようにしてみた
  130. 130. 先生からダメだし 「お前は主語がない」
  131. 131. あぁなるほど、 主語を入れれば いいんですね
  132. 132. というわけで ぐちゃぐちゃな 英語で書いて みました </li></ul>
  133. 133. 4. 論文 () 書いてつくばに凸してみた <ul><li>どきどきしながら通知を待つ ->  一次審査通過 </li></ul><ul><li>いざ二次審査
  134. 134. 面接が30分 20分しりとりについて語ることができた
  135. 135. 話し足りない・・・ </li></ul><ul><li>結果->合格しました </li></ul>
  136. 136. 5. 研究を振り返って <ul><li>あぁ、これ Twitter なかったらうまくいかなかったな
  137. 137. ところでこれってよくよく考えると 当たり前な実験結果な気がしなくもない
  138. 138. 満足できない
  139. 139. 単語と単語の意味的な距離をつかって、もっと人間に優しく連想させるためのシステムが作れないだろうか
  140. 140. あ、ごめんなさいしりとり webAPI とか まだできてません </li></ul>
  141. 141. SARADE: 添え物 <ul>ゲーム用自作インタプリタ ~実装しながら仕様を確定していったら~ 1. きっかけ 2. どういう言語にしようか 3. 変わる変わる文法 4. 実装できた部分 5. これからどうしよう </ul>
  142. 142. 1. きっかけ <ul><li>「磯野ーゲームつくろうぜー」
  143. 143. ぼくはゲームシステム担当
  144. 144. シナリオ担当とかはまた別の人 </li><ul><li>->システムとコンテンツを分けたい </li></ul><li>イベント(宝箱見つけたとか)を外部に置いておいて実行時に読み込みたい
  145. 145. .dllはなんか負けた気がして
  146. 146. じゃあスクリプト言語作ろう </li></ul>
  147. 147. 2. どういう言語にしようか <ul><li>ほとんどは式にする(評価できる)
  148. 148. 構文解析の手間をできるだけ省くためにできるだけ前置記法を全面に採用していく感じで
  149. 149. 曖昧な文法はなんか難しい構文解析が必要になってくるのでパス!使えるようになればいい!
  150. 150. lambdaとかよくわからないので関数を式にするまでには至らなくていい </li></ul>
  151. 151. 3. 変わる変わる文法 <ul><li>作っている途中で「あっここの文法が曖昧だ」とか気づく
  152. 152. 無理やり実装しようとしないで(ここらへんがヘタレ)逆に文法の方を変更しちゃった
  153. 153. でも意外とこのやりかたはうまくいったようで、事前知識ほぼ0の状態から3日で字句解析・構文解析のところまで実装とかができた
  154. 154. 仕様の簡素化は大事なんだなぁと </li></ul>
  155. 155. 4. 実装できた部分 <ul><li>字句解析器 </li><ul><li>数値 予約語 演算子 文字列 を認識 </li></ul><li>構文解析器 </li><ul><li>If文とかlet文とかできてきてた </li></ul><li>変数管理表 </li><ul><li>チェインでつないでスコープの実現とかを </li></ul></ul>
  156. 156. 4. これからどうしよう <ul><li>構文解析器を早く完成させよう
  157. 157. 意味解析(簡単な型チェック) </li><ul><li>末尾再帰の検出ができたらいいなー </li></ul><li>ゲームシステムへのマージ
  158. 158. スクリプターに使ってもらってフィードバックをもらう
  159. 159. 早いうちからレビューもらったほうが いいかもしれない </li></ul>
  160. 160. DESSERT: 締め <ul><li>まとめ </li><ul><li>しりとりをナメるな
  161. 161. 東工大には 附属の高校があります
  162. 162. 高校生が研究をしようとする とこうなりますという例
  163. 163. えりっくとかいうやつが SIP とか DHT について知りたがっています </li></ul></ul>
  164. 164. DESSERT: 締め <ul>質疑応答という名のフルボッコ </ul>
  165. 165. DESSERT: 締め <ul>ご清聴ありがとうございました </ul>
  166. 166. <ul>お次は・・・ 中学生による 中学生でもわかる リーマン予想の最前線 </ul>

×