swampの忘備録

エンジニアが、情報系のイベント行ったときとかプログラミングなどの情報工学について忘備録として書くつもりです。

30日でできる自作OS入門 2日目

さて、自作OS入門の2日目をやります。

前回の投稿から何日たったでしょうか。(僕のさぼり癖が出ている)

まず、各種命令とCPUのレジスタ、メモリの説明がありました。

少し気になった記述
・64bitレジスタは省略されていたけど、64bitが主流なのでちょっと気になって調べてみました。
 RAX、RCX、RDX、RBX、RSP、RSI、RDIというレジスタが64bitの場合だそうです。先頭にRが付くようです。
 見た感じは、基本的な機能は、16bitでも32bitでも64bitでも同じっぽい。

>MOV命令ではビット数が同じもの同士でしか代入できない規則
 これ、学校でやったマイコンの実験ではまった所だからやけに共感できた。

・MOV AL, SI は、SI番地の番号をALに代入する(ただの数字)
 MOV AL, [SI] は、SI番地に入っている内容をALに代入する
 だそうで、少しだけ混乱した。

Makefileについても解説がありました。
Makefileは、何かすごい便利そう。ごちゃごちゃしないし。
今まで、OSを実行するまでの動作が多かったけど、それを全てまとめてくれたものって感じかなあ。

やっと3日目に突入することができる...

OCRを使ってみた。

後期末試験が近くなってきました。
本当は、こんなものを書かずに、勉強をしなければいけません。

さて、僕は、貴重な時間を無駄にして試験対策プリントを作るのが好きなので、今回は、国語の問題をつくっています。

国語といえば、長文読解問題があります。
今回は、2つも長文読解の問題が出るのです。もちろん問題を作ります。

1つ目の長文読解問題の文章はなんと1時間ぐらいかけて全部手打ちしました。(もっと時間がかかったかも)

2つ目の長文読解問題の文章を見たとき、思いました。

「超面倒くさい。なんとか手打ちしないで済む方法はないか」

というわけで、OCRという便利なものを使いましょう。

1.OCRとは?
 OCR(Optical character recognition)とは、日本語で光学文字認識のことです。
 
 画像を文字列のデータに変換してくれるものです。

 画像取り込み、レイアウト解析、行の切り出し、文字の切り出し、文字認識、フォーマット出力の順で行うようです。

 「特徴抽出」などが重要で機械学習とかパターン認識が大きく関係している技術です。

 参考ページ 文字の読み取り・認識技術 | OCR技術解説 | メディアドライブ


2.何を使うか。
 あまり時間がなかったので詳細な比較はできないことをご了承ください。

 今回は、Wordに出力したいので、「Online OCR」というものを使ってみました。

 もっと探したらもっと良いものがあるかもしれません。

3.実際に使用してみて
 スマホで撮影した写真をPCに送って処理したからかもしれないが、なんか微妙だった。
 
 大体できているものもあるけど、全く認識していないものもあった。

 f:id:swamptk:20180204122031p:plain

 ところどころに線を引いているのが悪いのか、撮影の仕方が悪いのかと思い画像を撮影しなおしました。

 1ページを一気に撮影したのがいけなかったのかと思い、分割して撮影しました。

 そうしてもやっぱり間違いが多い。

 試しにPDFファイルを突っ込んでみたらほとんど間違えずに認識をしてくれました。

 Online OCRは画像には向いてないのかなあと思い、別のものを使うことにしました。

4.再び何を使うのか。
 スマホカメラを使うので、スマホアプリがいいかなあと思い、「Textスキャナ」というものを使うことにしました。
 
play.google.com

 これを使って文字認識をしてみましょう。

5.実際に使ってみて
 これは、非常に高い認識をしてくれました。

 ほとんど間違いがありませんでした。素晴らしい!
 
 とてもよかったです。

6.まとめ
 とても雑になってしまいましたが、とても「Textスキャナ」は、気軽でとても使いやすいものでした。

 ぜひ、皆さんも使ってみてください。

30日でできる自作OS入門 1日目

これからゆっくりと『30日でできる自作OS入門』を進めていきたいと思います。

この本を進めていく中で、僕がやったこととか詰まったところとかを書いていこうと思います。
いつ終わるかは分かりませんが頑張ります。

1日目
まずは、バイナリエディタBzでひたすら16進数を入力していきます。

やっとのことで、0000082まで入力したら、あとは168000まで00が続く…気が遠くなります。

手で打つような時間はないので、もちろんプログラムを使います。

javaで、バイナリで、00を任意の回数書き込むプログラムを作成しました。

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class WriteBinaryFile {

	public static void main(String[] args) {

		FileOutputStream fileout = null;
		BufferedOutputStream buffout = null;
		
		try {
			
			buffout = new BufferedOutputStream(new FileOutputStream("helloos.img",true));
			
			byte tmp = 00;
			
			for(int i = 0;i<1474560-100;i++) // まだ若干の調整が必要
			buffout.write(tmp);
			
			buffout.flush();
			

		} catch (Exception e){
			e.printStackTrace();

		} finally {

			try {
				buffout.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
	}
}

参考:
バイナリデータ書き込み FileOutputStream,BufferedOutputStream,DataOutputStream | Java入門~bituse~

ちょっと00の数が多すぎたので168000まで減らさなければいけません。

あとは、書籍に書いてある通りに進める。

すると、

f:id:swamptk:20180127135652p:plain

Hello, worldと表示するOSができる。

訳も分からず文字を打っていっただけなので感動した。

その後、CPUは、0と1しか扱えないよという話が書いてあった。

その後は、今書いたのをアセンブラで書こうという話。

かなりそれっぽいプログラムだけ書いてみました。(ちょっと大変だったけど)

3年になってアセンブラを扱う授業がないので久々にアセンブラに触れたので楽しかった。

書籍に記載されている「asm.bat」はCD-ROMの中のprojects\01_day\helloos2の中にありました。
(どこにあるのかだいぶ探しました。)

いざ実行
f:id:swamptk:20180127153106p:plain

あれ、hello, worldが表示されない。

一体、何を間違えていたのか小一時間迷う。

プログラム中で、0xebなのに0xedにしてたという人為的ミスだった。
成功しない人は、何らかの記述を間違えてるから確認を怠らないように!

成功
f:id:swamptk:20180127154035p:plain


メッセージ部分を変えれば任意の文字列がOSに表示される。
f:id:swamptk:20180127154314p:plain

というわけで、だいぶ時間がかかって1日目が終了。

次は、2日目です。

UnityWiimoteを利用して複数台のWiiリモコンを制御する。

 去年の8月~11月にかけて、学園祭の出し物でWiiリモコンをUnityで複数台制御してゲームを作りました。

 今回はそのゲームのコア技術であったWiiリモコンの複数台制御の方法について解説します。

 結論から言ってしまうとUnity-Wiimoteとものを使えば簡単にできます。

 日本語能力がないので長いわりによく分かりませんがお付き合いください。

 

1.なぜ今頃になってこの記事を書こうと思ったのか。

 このツイートが今になって同じことで悩んでいらっしゃる方にリツイートされたので、少しブログを書くモチベーションができました。(ずっと書こう書こうと後回しにし続けてきた)

 僕にモチベーションを与えてくださり、ありがとうございます。

 

2.準備

Wiiリモコン(複数台)

Windows7(推奨)のPC

 僕の環境ならば、何度やってもWindows7以降ではうまくいきません。

 アダプタの相性が悪かったのかもしれません。

 Windows8、10でももしかしたらできるかもしれません。

 ※ 以下、都合上Windows10の画面が出てきますが動作確認はしてません。

Wiiリモコンのセンサーバー

 Wiiの上についてるあれです。あれがないとWiiリモコンを動かすことはできません。

以下のページなどを参考に自分で作ることもできます。「Wiiリモコン センサーバー 自作」で検索したら結構でてきます。

tarukosu.hatenablog.com

Bluetoothのアダプタまたは内蔵PC

 BluetoothがないとWiiリモコンの制御はできません。

 

・Unity-Wiimote

 海外の方が作ってくださったソフトウェアです。

 Unity-Wiimoteのおかげで学園祭の出し物は成功したので感謝しても感謝しきれません。

 この場を借りてお礼申し上げます。

 以下のページからダウンロードしてください。

github.com

 UnityPackageのみのものでもよいですが、動作確認用のデモもあるほうがよいと思います。したがって「Sorce code(zip)」と書かれているほうを勧めます。以降はUnity-Wiimoteのデモのプログラムを参考にして複数台制御の方法を説明します。


3.Wiiリモコンの接続

 WiiリモコンをPCに接続してください。

 Wiiリモコンの電池カバーをはがしたところにあるボタンを押して接続すればできると思います。

 詳細な方法は省略しますが、質問があればコメントしてください。

 

4.Unity-Wiimoteの起動

 さて、Unity-Wiimoteを起動しましょう。

 まず、ダウンロードした「Unity-Wiimote-1.1.zip」を展開します。

 そして、展開したファイルを開き、Assetフォルダの中にあるSceneという名前のUnity scene fileを開く。

f:id:swamptk:20180120204424p:plain

 すると、以下のような画面が表示される。

f:id:swamptk:20180120215601p:plain

 開いたときにこのような状態になる場合は、Blenderをインストールしましょう。

f:id:swamptk:20180120211804p:plain


5 Scriptを追加する

 今開いているSceneはAsset>Scriptの中にあるWiimoteDemo.csをScriptとして動いています。

 このSceneを実行すると1つのWiiリモコンを制御することができます。

 このプログラムを参考に複数台制御に拡張していきます。

 この記事では、以下の動画の4番「IR Camera Saport」を複数台で行う方法を説明します。

 
www.youtube.com


 今回は、2台制御として話を進めていきます。

 Asset>Scriptの中に新たにWiimoteTest.csを追加します。
 
 Asset>Scriptに移動し、左クリック→Create→C# Scriptをクリックし、Scriptを作成する。
 
 名前は、WiimoteTestにする。
 
 f:id:swamptk:20180121004948p:plain

 以下に示すWiimoteTest.csというプログラムは、実行すると2台のWiiリモコンでポインタの操作が可能になります。

 ※注意 今回は簡単のため、ボタン等の制御の説明はしません。ExtDataDemo.csなどを参考に同じ理論で考えてみてください。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Text;
using WiimoteApi;

public class WiimoteTest : MonoBehaviour {

    public RectTransform[] ir_dots0;
    public RectTransform[] ir_dots1;
    public RectTransform[] ir_bb0;
    public RectTransform[] ir_bb1;
    public RectTransform ir_pointer0;
    public RectTransform ir_pointer1;

    private Wiimote wiimote0;
    private Wiimote wiimote1;

    private int flag = 0;

    void Start() {
	WiimoteManager.FindWiimotes();
    }

	void Update () {
        if (!WiimoteManager.HasWiimote()) { return; }

        wiimote0 = WiimoteManager.Wiimotes[0];
	wiimote1 = WiimoteManager.Wiimotes[1];

        int ret0;
	int ret1;
        do
        {
            ret0 = wiimote0.ReadWiimoteData();
            ret1 = wiimote1.ReadWiimoteData();

        } while (ret0 > 0 || ret1 > 0);

        if (ir_dots0.Length < 4 || ir_dots1.Length <4) return;

        float[,] ir0 = wiimote0.Ir.GetProbableSensorBarIR();
	float[,] ir1 = wiimote1.Ir.GetProbableSensorBarIR();
	
        for (int i = 0; i < 2; i++)
        {
            float x0 = (float)ir0[i, 0] / 1023f;
            float y0 = (float)ir0[i, 1] / 767f;
	    float x1 = (float)ir1[i, 0] / 1023f;
            float y1 = (float)ir1[i, 1] / 767f;

            if (x0 == -1 || y0 == -1) {
                ir_dots0[i].anchorMin = new Vector2(0, 0);
                ir_dots0[i].anchorMax = new Vector2(0, 0);
            }

	    
            if (x1 == -1 || y1 == -1) {
                ir_dots1[i].anchorMin = new Vector2(0, 0);
                ir_dots1[i].anchorMax = new Vector2(0, 0);
            }

	    

            ir_dots0[i].anchorMin = new Vector2(x0, y0);
            ir_dots0[i].anchorMax = new Vector2(x0, y0);

	    ir_dots1[i].anchorMin = new Vector2(x1, y1);
            ir_dots1[i].anchorMax = new Vector2(x1, y1);

            if (ir0[i, 2] != -1)
            {
                int index = (int)ir0[i,2];
                float xmin0 = (float)wiimote0.Ir.ir[index,3] / 127f;
                float ymin0 = (float)wiimote0.Ir.ir[index,4] / 127f;
                float xmax0 = (float)wiimote0.Ir.ir[index,5] / 127f;
                float ymax0 = (float)wiimote0.Ir.ir[index,6] / 127f;
                ir_bb0[i].anchorMin = new Vector2(xmin0, ymin0);
                ir_bb0[i].anchorMax = new Vector2(xmax0, ymax0);
            }

	    if (ir1[i, 2] != -1)
            {
                int index = (int)ir1[i,2];
                float xmin1 = (float)wiimote1.Ir.ir[index,3] / 127f;
                float ymin1 = (float)wiimote1.Ir.ir[index,4] / 127f;
                float xmax1 = (float)wiimote1.Ir.ir[index,5] / 127f;
                float ymax1 = (float)wiimote1.Ir.ir[index,6] / 127f;
                ir_bb1[i].anchorMin = new Vector2(xmin1, ymin1);
                ir_bb1[i].anchorMax = new Vector2(xmax1, ymax1);
            }


        }

        float[] pointer0 = wiimote0.Ir.GetPointingPosition();
	float[] pointer1 = wiimote1.Ir.GetPointingPosition();

        ir_pointer0.anchorMin = new Vector2(pointer0[0], pointer0[1]);
        ir_pointer0.anchorMax = new Vector2(pointer0[0], pointer0[1]);

	ir_pointer1.anchorMin = new Vector2(pointer1[0], pointer1[1]);
		ir_pointer1.anchorMax = new Vector2 (pointer1 [0], pointer1 [1]);


	if(flag ==0){
		wiimote0.SetupIRCamera(IRDataType.BASIC);
		wiimote1.SetupIRCamera(IRDataType.BASIC);
		flag++;
	}


	}

    private void OnApplicationQuit(){
	WiimoteManager.Cleanup(wiimote0);
	WiimoteManager.Cleanup(wiimote1);
	wiimote0 = null;
	wiimote1 = null;
    }

}

 思ったより書くのが大変だったので詳細なプログラムの解説はしません。頑張って解読してください。

 簡単に言えば、WiimoteDemo.csからポインタ制御の部分だけ抜き取ってきて、

 Wiimote型の変数wiimote0とwiimote1を作成し、それぞれに変数名だけ変更してWiimoteDemo.csと同じプログラムを書いてあげればいい。

 要は、Wiiリモコンやポインタ関係の処理をひたすら複製していくという作業をします。

 下部のLEDやボタンの操作もこのようなやり方で簡単にできます。
 
 質問がありましたら、コメント等でお願いします。

 気が向いたら追記します。


6 IR Dot Canvasの追加
 
 このプログラムでは、複数のIR Dot Canvasを用意してそれぞれのWiiリモコンに対応させます。
 
 1つのWiiリモコンのポインタを表示させるためには、1つのIR Dot Canvasが必要です。

 IR Dot Canvasをコピー&ペーストして以下の状態にします。

 f:id:swamptk:20180121014509p:plain

 あとで、分からなくならないように「IR Dot Canvas (1)」とその中の「Panel」や「BB」の名前を以下のように変えておきます。
f:id:swamptk:20180121170224p:plain

  
7 スクリプトの追加

 InspecterタブのAdd Component→Scriptを押し、WiimoteTest.csをスクリプトに追加します。

 WiimoteDemo.csに入っている☑は外しましょう。

f:id:swamptk:20180121165611p:plain

f:id:swamptk:20180121165702p:plain

 詳細を設定していきます。

 複数台使用するので、Ir_dots、Ir_pointer、Ir_bbをそれぞれ複数設定する必要があります。

 このプログラムでは、Ir_dots0、Ir_pointer0、Ir_bb0とIr_dots1、Ir_pointer1、Ir_bb1を用意しています。

 3台、4台で制御するのであれば、これらをもっと増やしていけばできます。

 この変数に先ほど追加したIR Dot Canvas2の要素を追加していきます。

 0と書かれた変数には、もとからあったIR Dot Canvasの要素を、

 1と書かれた変数には、追加したIR Dot Canvas2の要素を追加します。

 f:id:swamptk:20180121172236p:plain


8 実行

 実行ボタンを押せば、2台でのポインタ制御ができているはずです。

 僕は、ソースコード理解能力がないのでたったこれだけのことをやるのに2か月もかかってしまいました。

(他にもいろいろな方法を試したがどれもうまくいかなかった)


9 最後に

 Wiiリモコンなんてオワコンという人もいるとは思いますがまだまだ可能性は無限大です。

 いろいろなことができます。 

 ボタンも使えるし、ジャイロセンサーにもなるし。
 
 弊学校の学園祭の出し物ではWiiリモコンを4台利用したシューティングゲームを作成しました。

 こんな感じ。(画像があらくて分かりにくいけど)

f:id:swamptk:20180121191335p:plain

f:id:swamptk:20180121191406p:plain

f:id:swamptk:20180121191414p:plain

 
(これに関しては今度記事を書くかもしれないです。)

 皆さんも是非、Wiiリモコンの複数台制御を試してUnityでゲームを作ってみてください!



参考ページ
kamera25の座敷部屋 Unity から Wiiリモコン を使ってみる ~その1~

Wii のセンサーバーを自作する - たるこすの日記

Wiimote API for C# and Unity - YouTube

セキュリティ・キャンプ九州 in 福岡 2017に参加した。

 とてもとても遅くなってしまいましたが(何か月前なんだよ)、セキュリティ・キャンプ九州in福岡2017に参加したのでブログ書きます。

 下手な日本語でダラダラと書くのは許してください。

 

 1日目(9月1日)

 1週間ぶりに博多まで新幹線で行く。(東京に行くよりはるかに楽ではやい)

 卵かけごはんの店で卵かけご飯2杯食べてから会場に向かう。

 会場は、LINE Fukuokaさん。(1週間ぶりだなあ)

 大きなサリーとセキュキャンの看板が迎えてくれる

 

f:id:swamptk:20170913203259p:plain

 

 少し早めにオープニングが開始!

 

 『セキュリティ・キャンプ九州 オープニング』は、はせがわ先生から。

 なんでセキュリティキャンプをやるのかとか、

 このキャンプでは「つなげる」ことを意識してキャンプに臨んでくださいという話。

 

 『情報セキュリティ技術の使い方をケースで考えよう』は、吉井先生から。

 倫理的な話で、情報セキュリティに関する法律とか事件の解説が主だった。

 LibraHack事件について僕は知らなかったのですが、とても印象的でした。

 自分は悪意がないと思って技術を使っていても罪になることはある。

 慎重に技術を使わないといけないなと感じました。

 (あとでいろいろ調べてみたらこの事件はいろいろ物議を醸しているらしいが)

 先生の言われているように、技術を持っていることを過信してはならず、自分なりの正義をもってそれを使うことを肝に銘じておきたいと強く思いました。

 

 続いて、『そうだ!セキュリティ・キャンプ全国大会に行こう!』は上野先生から。

 今年は、いろいろ忙しくて応募しなかったけど、来年は何が何でも応募するぞ!

 というぐらいどれも楽しそうなのが紹介と写真から伝わってきました。

 今回もすごい楽しかったけど、来年こそは、全国大会行きたいなあ。

 

 『いじって壊して遊んでハッカーになろうーWebサーバ編ー』は、小出先生から。

 急きょ順番が入れ替わったこの講義。

 Raspberry Pi ほしいってひたすら思った。(誰か買ってほしい)

 で、演習開始。

 bottleとpeeweeとSQLiteだけでWebアプリの脆弱性に関する実験をしようという話

 セッションハイジャックとかXSSとかCSRFとかSQLインジェクションとかやった。

 教科書で見たような攻撃を実際に手を動かしてやるのは初めてだったので、

 とても難しかったけど楽しかった。

 初めの方からいろいろと手こずってしまって勉強不足だなあと感じた。

 

 夜は、会場のLINE Fukuokaさんで開催された

 LINE Developer Meetup in Fukuoka #20に参加しました。

 「情報セキュリティの考古学」という藤井昭人さんの講演でした。

 「情報セキュリティの歴史」っていうものを触れてきたことは今まで一度としてなかったのでとても勉強になりました。

 でも途中、疲れててウトウトしてしまったのは内緒です。ごめんなさい。

 (ちなみに講演の資料は探したら『UNIX考古学』のGithubページにありました)

 (復習してるとやっぱり難しいけどおもしろい内容でした。)

 あと、もうちょっと交流したかった。ごはん食べたかった。

 

 その後、ホテルまで歩いて、コンビニツアーをし、ホテルへ。

 本当は次の日の予習したかったけど、いつの間にか寝てしまっていた。

 

 2日目(9月2日)

 朝ごはん食べて、ホテルから歩いて会場へ。9時30ぐらいから講義開始!

 『Webセキュリティ基礎講座』は、はせがわ先生から。

 セキュリティの基礎に関する講義。

 「脆弱性はただのバグ」いろいろ難しい定義も習ったけどこれは腑に落ちた。

 その後、脆弱性だらけのWebサイトで脆弱性探しの演習。

 全然わかんなかったけど、解説聞いてなるほどって思った。

 これぐらい分かるようにしないとなあ。勉強しなければ。

 

 『ログ解析基礎講座』は、濱本先生から。

 はじめは、標的型メール訓練のログ解析をしました。

 実際に行われた標的型メール訓練のログを集計するという内容。

 ログというものに触れて、解析するのは初めてだったので、全く前に進みませんでした。

 皆、器用に解析していてすごいなあという感じだった。

 次は、これ。

 何が起きているのか自分では、全く分からなかったが、

 解説を聞く中で、ログの見方というのが少しは分かったのでよかったのではないかと思う。

 (あまり内容は話してはいけないのだと思う)

 後半は、ハニーポッドCowrieを触ってみるというお話。

 ハニーポッドのことは全然わからなかった。復習しなければ!

 

 『Game Security Hands-on』は志賀先生から。

 Unityで作られた解析対象のAndoroidアプリゲームをチートするという内容。

 環境構築にとても手間取ってしまいましたが何とか解析ができるようになった。

 メモリ改ざんとか通信改ざんとかDLL改ざんをしようと試みました。

 今までチートとか考えたこともなかったが、割と楽しいなあという感じでした。

 様々なツールを使った改ざんの方法なども初めて知れたので勉強になりました。

 

 その後は、ホテルまで歩き、コンビニツアーし、ホテルへ。

 この日も疲れてしまってチートの続きをしようと思ったけどいつの間にか寝てしまっていた。

 

 3日目(9月3日)

 最終日! 朝ごはん食べて、ホテルから歩いて会場へ。9時30ぐらいから講義開始!

  前日に引き続き、『Game Security Hands-on』

 途中までHands-onの続きでそれから解説と攻撃の対策についての講義

 いろいろな対策方法が考えられるが、どれも完璧ではなくて多層防御が必要だということがよく理解できた。

 

 『攻撃の検知と防御』は服部先生、占部先生から。

  前半は、攻撃と検知の仕組み、攻撃と検知の関係、監視の仕組みについての講義を受けました。知っているようであまり意識していなかったことが多かったので非常に勉強になりました。

 昼ご飯を挟んで、後半は、いよいよ演習です。

 Firewalldの設定を確認したり、Webページに攻撃して、それを検知したり防御したりしました。

 Firewallの設定を手動でやったことなど今までになかったので、非常に楽しく、参考になりました。

 

 その後、閉講式があり、集合写真を撮って解散。

 

 新幹線までまだまだ時間があったので、15人?ぐらいでもつ鍋を食べにいきました。

 

 まとめと反省点

 3日間もセキュリティに関する講義を受けたのは初めてだったのでとても楽しい反面、自分の知識や技術のなさを痛感しました。

 今回学んだ内容の多くは、僕が全く学んだことのない分野だったので、自分の興味をより広げることができたと思います。

 そして、強く思ったのは、ラズパイがほしいっていうことです。

 あと、事前課題をきちんとこなすということはとても重要です。イベント参加続きで忙しく時間がなかったなどと言い訳をしてはいけません。(ごめんなさい)

 ブログは、復習がてら早く書かないと忘れてしまいます。いつまでも先延ばしにしてはいきません。(ごめんなさい)

 今回得た経験や知識をもとにこれまで以上にセキュリティに関心をもってCTFなどいろいろなことにチャレンジしていきたいです。

 講師の方々、事務局の方々、チューターの方々、そして参加者の方々、今回は貴重な機会をありがとうございました。

 

JOI夏季セミナー2017に参加した。

 なんかずいぶん前の話のような気がしますが、日本情報オリンピック委員会が開催する夏季セミナーに参加したのでなんか書きます。

 ダラダラとどうでもいいこと書くのは許してください。

 

 なんか5日間ずっと体調がすぐれなかったような思い出がします。

 

 1日目(8月26日)

 家を出る。

 自宅近くのローカル線遅延しててあせる。

 やっとのことで新幹線の発着する駅に来るが特急券の日にちが間違っててまたあせる。

 というわけで教訓

  富士山また見えないなあとか思いながら、新幹線と電車に5時間ぐらいゆられて八王子まで行く。

  そんな中、駅でふと気が付いた。

  貸してくださった@pazzle1230さん本当にありがとうございました。

  まだ集合時間まで余裕があったので駅にあったデパートでドリアを食べる。

  バスで大学セミナーセンターまで行く。

  しばらく待って、4時ぐらいに始まる。

  参加者とチューターの自己紹介(スーツケースで盛大にこけた人が僕)のあと本選び。

  他の本もおもしろそうだったけど、僕は深層学習と決めていたので迷わずホワイトボードに名前を書く。

 人数が多かったけどじゃんけんに勝てたのでこの本を学ぶことになった。 

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

 

  (すごく難しかったのは言うまでもない)

 各部屋に分かれてセミナーが開始。

 第1章を読む。深層学習すごいなあって感じ。

 夜ご飯食べる。この辺から体調が悪いなあって感じだった。

 第2章を読み始める。なるほどおもしろいなあって感じ。

 この日は、AGCがあるのでセミナーが早く終わった。

 僕は、競プロ勢じゃないし、前日まで某で福岡に3日間いたこともあり、

 連日の疲れで本当に早々に寝ていた。

 (某Hackのことは、気が向いたら書くかもしれません)

 

 2日目(8月27日)

 朝ごはん食べて、本読んで、昼ごはん食べて、講義があって、本読んで、夜ご飯食べて、本読んで、寝るという流れ。

 本は、2章と3章の途中まで読んだ。

 二値分類とか多クラス分類で確率でるんだけど、こんなことを思ったり、

 習ったことが身についてないことが判明する。(教科書復習しないとなあ)

 講義は、ランダムサンプリングの話。

 すごい難しい話でなんだそりゃってなってた。

 でも、マルコフ過程とかモンテカルロとかおもしろそうではあった。

 これを機会に勉強してみたい。

 この日も、すごい体調が悪かったのでさっさと寝る。

 

 3日目(8月28日) 

 この日は、常時おそってくる腹痛に耐えながら、

 朝ごはん食べて、本読んで、昼ごはん食べて、本読んで、夜ご飯食べて、カードゲームして、寝るという流れ。

 本は、3章の終わりと4章を読む。

 誤差逆伝播法のアルゴリズム楽しい。

 4章の微分計算は、分かればすごい面白いしすごい感動したし気持ちがよかった。

 はじめて微分をやって感動したと思う。

 でも、理解するのに時間かかったし第一難しかった。

 夜は、交流の時間ということで、コードネームピクチャーズというカードゲームをする。

 チューターの皆さんを含め、みんなでわいわいできてすごい楽しかった。

 @maroon_kuriさん理不尽な負け方ですごいかわいそうだった。

 

 4日目(8月29日) 

  この日も常時襲ってくる腹痛に耐えながら、

 朝ごはん食べて、プレゼン資料を作り、昼ごはん食べて、講義があって、引き続き作り、夜ご飯食べて、また作り、やっとのことで寝るという流れ。

 5章からも読みたかったけど、4章までをまとめることにした。(悔しい)

 というわけで、いろいろなWebページを参照しながら誰でも書けるコードを少しだけ書いたりしながら、プレゼン資料を作っていくという日だった。

 講義は、とてもおもしろい話だった。

 コンピューターグラフィックスと折り紙とプラレール

 どれも全く関係がなさそうで実は結びついてると意外に思った。

 日頃からあちこちに目を配っていくいき、いろいろなことに興味をもってそれを全力で探求してみるっていうことは大変そうだけで大切なことなのだろう。

  それが「プログラムの楽しさと可能性」につながるのだろうなあ。

 そんなことを思う講義でした。

 (ぜひスライドをもう1度見直してみたいと強く思っています。)

  

 その後はひたすらスライドづくり。

 パワーポイントの数式機能を使ってひたすら数式書いてたら、

 チューターさんが「latex2png」http://latex2png.com/

 を教えてくださり、式書くのがすごい楽になった。

 本当にありがとうございます。

 初めてLatexに愛着を持った。(言い過ぎかもしれないが)

 

 5日目(8月30日)

 朝ごはん食べて、発表聞いて、発表して、発表聞いて、昼ご飯食べて、発表聞いて、帰るという一日。

 発表をひたすら聞く。

 ① 組み合わせゲーム理論 

 全然わかんなかった。強そうだった。

 ゲーム理論、触れたこともないから勉強しなければ!

組合せゲーム理論入門 ?勝利の方程式?

組合せゲーム理論入門 ?勝利の方程式?

 

 ② 劣モジュラ最適化と機械学習 

  機械学習だから少しは分かるかなあと思ったら機械学習の話してなかった。

 劣モジュラっておもしろそうだけど難しそう。

劣モジュラ最適化と機械学習 (機械学習プロフェッショナルシリーズ)

劣モジュラ最適化と機械学習 (機械学習プロフェッショナルシリーズ)

 

  ③ 深層学習

 みんなすごい進捗出てて発表もうまくて、僕みたいな雑魚は恥ずかしくなる。

 3番目に発表した。「深層学習入門」という雑魚な内容。

 スライドはこちら。

www.slideshare.net

 プレゼンなれしてなくて、練習不足で、時々つまってしまい全発表者の中で最も分かりにくい発表になってしまった。(反省しなければ)

 誤差逆伝播法はすばらしいということを覚えておいてください。

 (もちろん弱点もあるが…)

 

 ④ HTML5 Canvas

 ゲームとかすごーい。楽しいー

 5日間でこんなクオリティのもの作れるってホントすごい。

 どの作品もやりがいがあって楽しかった。

 僕も時間があったらCanvasやってみたいなあ。

HTML5 Canvas

HTML5 Canvas

 

  ⑤ 純粋関数型データ構造

 Haskellの話。Javaとかと全く書き方違って驚いた。

 芸術だそうだ… 時間があればやってみたい。

純粋関数型データ構造

純粋関数型データ構造

 

  

 発表聞いたらチューター、理事長から講評があって解散。

 バス停で雨に打たれながら夏季セミ勢でいっぱいのバスに乗り、

 八王子駅まで行く。そこから新横浜まで行って…

 

 いくらのおにぎり探してた。

 すごいおいしかった。

 

 感想

 僕みたいな競技プログラミングやってない人でも応募用紙を書けば、夏季セミナーには参加できます。(競プロ勢でなくてもチャンスはある!)

 学習した本は、持ち帰ることができてビックリ。(ありがとうございます)

 そして、体調管理をちゃんとしないと十分な力が発揮できません。

 あと、もっとプレゼン能力を鍛えなければいけないですね。はい。

 

 こんな高度な「理論」を学ぶのは初めてで大変ではあったが、とても良い経験になりました。

 初めて数式がたくさんある本をきちんと理解しながら読みました。

 (数式がたくさんある本から逃げていた節もある)

 自分の興味のあることを学ぶって数式があっても楽しいんだなあと思いました。

 ここでの学習を基礎にして更に学習していきたいです。

 

 夏季セミナーに関わってくださった全ての方々、今回は貴重な機会をありがとうございました。 

 

ブログはじめました。

名刺にブログのアドレス書きたかったからブログはじめました!

まだ、空っぽだけどこれからいろいろ書いていくつもりです。

情報系のイベント行ったときとか、プログラミングとかブロックチェーンとか機械学習などの情報工学について書いていくつもりです。

明日からの怒涛の日々に向けての準備中なので初回は雑になってしまいましたが、

どうぞよろしくお願いします。