お腹.ヘッタ。

関数型とかセキュリティとか勉強したい。進捗つらぽよ

セキュリティ・キャンプ全国大会2016の応募用紙を晒す(前編)

今年が本当に最初で最後かもしれないけど誰かのためになったらいいなと思って晒します。そしてブログ一年記念(?)をブログを始めた動機に関わるものでやれてよかったです。
以下本文〜〜><

【共通問題】

共通問題.1

(1)あなたが今まで作ってきたものにはどのようなものがありますか? いくつでもいいので、ありったけ自慢してください。

コンテストや大会に応募したもの。
・高校生プログラミングコンテストでの競技クライアント。
・仙台弁翻訳&辞書ソフト。
・アーチェリーのリアルタイム対戦システムのiosのクライアント。
倒立振子の機構を用いた杖。
その他の作品
・冷蔵庫の中をメモして賞味期限を通知してくれるアプリ(iosapp)
・パケット可視化ツール(pythonとQtとOpenGLで記述)
以上のものなどを作成しました。

(2)それをどのように作りましたか?ソフトウェアの場合にはどんな言語で作ったのか、どんなライブラリを使ったのかなども教えてください。

高校生プログラミングコンテストでの競技クライアント
 C++で記述した。幅優先探索などのアルゴリズムを使い最短距離を求めて移動する動作を組み込んだりその際効率化を求めて、巡回セールスマン問題と呼ばれるn以上の点における合計の最短路問題をを解いたりしました。

仙台弁翻訳&辞書ソフト
 C#で記述した、Linqなどのライブラリを使い文字列のマッチングなどをしました。

アーチェリーのリアルタイム対戦システムのiosのクライアント
 Swiftで記述した。socket.ioやcoreprotなどのライブラリを使いました。

倒立振子の機構を用いた杖(球の上に倒立するロボット)
 ハードウェアはarduinoやesp-wroom、加速度、ジャイロセンサー等を用いて作成しました。コードはC++で記述しました。倒立振子の制御はPD制御と呼ばれる古典制御で行い、角度を求めるためにはカルマンフィルタを使用しました。また杖には温湿度センサと大気圧センサを組み込み、体感温度や天気予報の機能を作成しました。
 その杖を制御するに当たっては、iOSアプリと連携した。通信はesp-wroomと呼ばれるwifiモジュールで行い、プロトコルはwebsocketで接続をしました。また杖を音声コマンドで動作をするためにOpenEarを用いて音声で動作させました。

冷蔵庫の中をメモして賞味期限を通知してくれるアプリ
 swiftとsqlite3を使って作りました。

パケット可視化ツール
 pythonでpypcapを動かしながらそこから拾いました。OpenGLレンダリングして表示しました。
 

(3)開発記のブログなどあれば、それも教えてください。コンテストなどに出品したことがあれば、それも教えてください。

ブログ:http://takeio.hatenablog.com/
出場大会および結果
高校生プログラミングコンテストでの競技クライアント→高校生プログラミングコンテスト:優勝
仙台弁翻訳&辞書ソフト→宮城県産業振興教育ソフトウェアコンテスト:最優秀賞
アーチェリーのリアルタイム対戦システム→U22プロコン(賞は頂けなかったが、高体連アーチェリー部から感謝状をいただき、インターハイでの活用が検討されている。)
倒立振子の機構を用いた杖→ナノマイクロアプリケーションコンテスト:奨励賞
サイバー甲子園→3位
SECCON intercollege 決勝大会(18チーム中17位)

共通問題.2

(1)あなたが経験した中で印象に残っている技術的な壁はなんでしょうか?(例えば、C言語プログラムを複数ファイルに分割する方法)

1:esp-wroomにiOSappでwebsocket通信をした際にsocket.ioを使って通信ができなかった。
2:iOSの画面レイアウトを作る際にオートレイアウトがとっつきにくくわかりにくかった。
3:iOSのナビゲーションコントローラのでの画面の順番を変えたかった。
4:倒立振子の機構を用いた杖を作る際にその倒立振子の機構は球乗りの機構を採用したかった。
5:高校生プログラミングコンテストで最短経路を求めるプログラムを実装するとき苦労した。
6:XSSとSQLiがよくわからなかった。(ブラインドSQLインジェクションとか表連結で叩くとか蓄積型XSSなど)
7:Q学習を学習する際用語や意味が理解できなかった。(マルコフ性など)

合計7つ挙げた

(2)また、その壁を乗り越えるために取った解決法を具体的に教えてください。(例えば、知人に勧められた「○○」という書籍を読んだ)

上に対応するやつ
1:リファレンス読んでもわからず自力で治そうとパケットキャプチャをしました。通信パケットを読むとただGETをしているだけだったので純粋にwebsocketだけのライブラリに変えました。また仕様書を読み、”Sec-Websocket-Version:13”ではなく古い”Sec-Websocket-Version:8”だったのでそこを変えて通信を行いました。

2:オートレイアウトは”SwiftではじめるUI設計&プログラミング「操作性」と「デザイン性」を兼ね備えたアプリの開発手法”という本を読み、ある程度オブジェクト間の間隔を作るときはViewを噛ませるなどをして対応しました。

3:質問サイトで質問してその答えをもとにナビゲーションコントローラの仕様書を読みこれのスタック構造を理解したのでそれを入れ替えるなどをして対応しました。

4:自分のやりたい球乗りのことをしている大学の先生の論文を読み、その際数学がわからなかったので線形代数解析学ラグランジュ方程式を学びながら論文を読み進めました。しかしそれでもわからなかったところがあり、例えばPD制御をなぜ採用したかなどその数式やゲインの同定試験がわかりませんでした。なので大学の先生にアポイントメントを取り、実際に実機を触らせてもらい同定試験のコツをお聞きしました。

5:手法として幅優先探索を実装して行いました。

6:XSSはXSSchallengeで理解しました。SQLiはハリネズミ本と呼ばれるCTFチャレンジブックスで理解し、深いところを知ったのはSQLmapというオープンソースのSQLinjectionの脆弱性診断のソースを読んで理解しました。また他の手法ということでwriteupを見ながら学んだ(SECCONの箱庭XSSや0CTFのwriteupなど)

7:機械学習の本を読み他にスライド等を読みセミマルコフ決定過程を理解し、ε-greedy手法とQ学習を用いエージェントを学習させました。

(3)その壁を今経験しているであろう初心者にアドバイスをするとしたら、あなたはどんなアドバイスをしますか?

1:やはり通信周りがあるのものは基本的にWiresharkなどでパケットを読むのは基本と考えます。また困ったときは仕様書を読むのも良いかと思っています。
 2:オートレイアウトは今のiOSアプリ作成には鬼門なので本を買い読むのが良いと考えます。また実際にQiitaがオートレイアウトの記事が多いので記事を読むのが良いと思います。
 3:質問サイトで聞くのも煮詰まった場合は有効だと思います。ただし自分でやりこみ今どんな過程を踏んで今どういう状態と言えるぐらいまでにやり込んでから聞く方が自分のためにもなり、自分の質問したいことが明確になると考えています。
 4:やはり自分でやり込んでこれでもかというほど煮詰まるまでやるべきだと思う。また論文等があればその先生にお願いをしてメールを出し、それでも理解できないのであれば研究室まで行かせてもらうのも手だと思います。自分の熱意があればお願いは伝わると思っています。私は嬉しいことにそれが伝わり、何度か研究室の見学をさせていただけました。実際に技術としては古典制御をしっかり学ぶべきだと思います。PIDこれらの要素はどんな動きをするのかを理解するべき、また制御の指令をトルクではなく加速度制御にするとかなりロバストな動きになりました。
 5:実際に紙に書くとわかりやすくできました。煮詰まった際や理解できないときは紙に書くが良いと思います。
 6:writeupを読んでみて実際に頭にイメージを作って問題を解いてみることや、またSQLiであればSQLmapのソースコードを読んでみるのが一番良いと思います。
 7:”強化学習”(http://www.amazon.co.jp/exec/obidos/ASIN/4627826613/kivantium-22/)という本がおすすめで、大変詳しく載っているのでしっかり読み込むのがおすすめです。またある程度理解できたと感じたら一度書いてみると良いと思います。また何度か試行を増やしたり割合を変えることで動作が変わるので作ったら何度も起動をしてε-greedyと呼ばれる確率手法の値を何度も確認するとどんなものなのか掴めると思います。

共通問題.3

(1)あなたが今年のセキュリティ・キャンプで受講したいと思っている講義は何ですか?(複数可)

そこで、どのようなことを学びたいですか?なぜそれを学びたいのですか?
私がセキュリティを学びたいと思った動機は、自分の普段使ってるウイルス対策ソフトの期限がが切れて仕方がなくフリーのものに変える際、親から勧められた”comodo”というものを使い始めました。しかしフリーのものということでその対策ソフトは大丈夫なのかと調べたところホワイトリスト制でのチェックを行っているという記述をネットで読みました、では他のウイルス対策ソフトはどんなことをしているのだろうという疑問から私はセキュリティについて興味を持ち学び始めました。そこから私は去年の夏頃の終わりごろからCTFを通じてセキュリティについて学んできた。
 勉強を進めていく中で”サイバー甲子園”というものに出場した際にもっと高度なこと、セキュアコーディング、ファジングなどをしたいとチューターの方に相談をしたところセキュリティキャンプを勧められたので今回応募しました。
 今回私がセキュキャンで受けたいと思っている講義はDAY2:TLS徹底演習、DAY3:Webアプリケーションの脆弱性の評価と発見、オンラインゲームアタック&ディフェンスチャレンジ、みんなでクールなROPガジェットを探そうぜ、DAY4:リバースエンジニアリングを自動化せよ、組込みリアルタイムOSとIoTシステム演習の講義を受けたいと思っています。
DAY2:TLS徹底演習:あまりSSL/TLSの通常証明書周りは触れることが少なく、あまり知識がないです。私は普段使っているものを是非知見を深めたいと思っています。また今回の暗号方式はChaChaというGoogleが推奨してるもので現在時点でTLS1.3のドラフトに出てるものを使うので最新の知識を揃えたいという意味でも是非実装してみたいです。
DAY3:Webアプリケーションの脆弱性の評価と発見:Webアプリケーションは基本的にXSSやSQLi、セッションの書き換えぐらいしか触ったことしかないので実際の脆弱性を探す時の着眼点や具体的な方法、考え方を生でプロの力に触れて力を是非養いたいと考えています。
 オンラインゲームアタック&ディフェンスチャレンジ:ここでは運営として体験してみたいと思っています。理由は例えば通信の際に間に何か噛ませてそこで通信した攻撃力データを変えるとかバイナリエディタでセーブデータ弄って00をFFなどにするなど攻撃側はあまり何も考えずとも案は出るが、運営側というのは方法が思いつかず、それらを知れると考えるとワクワクするので是非体験してみたいと考えています。
 みんなでクールなROPガジェットを探そうぜ:私はあまり命令を使った周りのことはGOTで使う簡単な知識ぐらいしかわからなく、アセンブラも各種の命令もあまり得意ではないです。だからこそみんなでクールなROPガジェットを探そうぜを受けてこの講義を受けて知見を深めたいと考えています。
DAY4:リバースエンジニアリングを自動化せよ:あまりデコンパイルは苦手でいまだによく分からない分野です。ですがそれを自動化というのは大変心惹かれるものだと感じています。今時のマルウェアは複雑であったりRing0上で動いたりとかなり多岐にに分かれるので知見を得たいです。

組込みリアルタイムOSとIoTシステム演習:私は非常にIoTには興味があってかつリアルタイムOSにも興味がありますこれは受けるしかありません笑。実際にesp-wroomというwifiのモジュールを扱って触ったりなどをしたこともあります。ですがこれはハード中心でこれの説明にはソフトウェア中心と書いてあるので是非参加して違う角度から知見を得たいと思っています。

(2)あなたがセキュリティ・キャンプでやりたいことは何ですか?身につけたいものは何ですか?(複数可)

自由に答えてください。
私は共通問題3の(1)で行いたい講義を述べましたがそれらはすべてここでなければ私には身につかないであろうものだと思っています。私はこのセキュリティ・キャンプで多くの人と繋がり、多くのこと最新の知識、知らなかったを学びたいです。例えばインフラであれば今のクラウドが最新のトレンドで、様々なところで事業展開が行なわれています。今さくらインターネットでは売り上げの一位がさくらのクラウドというサービスだが以前はクラウドではありませんでした。むしろクラウド事業を展開する際は他の売り上げが減るだけでコストがかさむのではないかなど反対の声があったそうです。しかし社長が展開すると決めて5年で売り上げ一番の部分がクラウド事業だそうです。このように情報分野は成長が早く考え方が刻々と変化し、そのときによってベストが変わります。しかしトレンドの流れをつかんでいる今だから実践を持って学べることがベストだと思っています。
 私はセキュリティ・キャンプは飽くまで情報科学に携わる若年者の後押ししてくれる場所であり、本質的にはキャンプへ参加し、何をつかみたいかということを見ているのだと思っています。キャンプに参加しただけで、飛躍的に技術力は上がるわけではなく、自分で行動しなければ何も得られないと私は感じています。それ故にセキュリティキャンプで一人では身につかない生きた知識を身に付け、吸収したことを昇華して私自身の血肉としたいと考えています。また私は工業高校生で、大半が就職の進路を考える学校でもあるので、家庭の事情もあるが進路は就職になる可能性もあると考えています。そうなれば来年からは学生ではなくなってしまうので最後のチャンスになんとしてでも参加したいと思っています。


(改変しました。本当に落ちそうなので。。。やけくそです)
後編へ続く

ブログ始めて一年らしい。

こんにちは。お久しぶりです。忙しくて本当にエントリ書いてませんね最近。(やる気の問題)

Haskell早くとか言われそう。。。そのうちラムダ計算も書くから許して。。。書きたいこと溜まっているのに書く暇がない。。。

ブログ始めて一年らしい。

さっきメールを見たら
”1年以上の長きにわたってブログを継続いただいているユーザー様を対象に、 過去の同じ時期に投稿した記事を振り返るメールをお送りします。 ”
と着てて少し感じたものがありました。

まぁなので今回立てたのは少し自分を振り返りたかったからです。

そもそも私がブログを始めたのは1年前に私の先輩がセキュキャン応募落ちたの見ていて嗚呼セキュキャン私も応募したかった(別大会のせいで顧問に止められた)というのがあり、私自身自分の甘々だったしコミュニティも知らなかった。なのでアウトプットしようということで始めました。

そしてタイミングがいいのかセキュキャン締め切りが今日でした。なるほど確かに一年だ。この一年たくさんのことがあった。たくさんの強い人たちと出会えた。もっと上がいて井の中の蛙大海を知らずという自分を見てしまった。さて私はこれから何を残せるのか。何に向かうのか。

私は一つ理念に持っているのは技術は人を幸せにすべきだと思っています。私は多くの人にお世話になっています。この一年で交換した名刺が100枚以上であるあたりが物語っていると思います。ぜひ私は自分が受けた恩恵を返していきながら新しい技術を身につけていきたいと思います。

色々辛いこともありますが優しくしてくだされば嬉しいです。

MPU-6050よお前のDMPは何様だ(2)

愚痴です。

MPU-6050 は InvenSense 製のI2C接続のジャイロ・加速度センサICで、 DMP (Digital Motion Processor) という機能を使うことで、補正済みのデータを簡単に利用できるのが特徴。

内部情報がない!使わせる気ないでしょこれ(半ギレ)


なのでざっとまとめた(私が触った限りで)

まとめ

//使うときの初期化
/*
その際内部では 
setXGyroOffset();、setYGyroOffset();、setZGyroOffset();(初めのズレを直すオフセットを読みだす関数)
やsetFIFOEnabled等のオーバーフロー周りが動く。*/
dmpInitialize();
// DMPで使う6軸のバッファーオーバーフローしてないかどうかの判定(Xは0〜5まで6ある)
bool getDMPIntXStatus()
//DMPを使うかどうか
setDMPEnabled(bool)
//オーバーフロー時の割り込みで通知してくる関数
getIntStatus()
//  DMP パケット サイズを取得します。
 mpu.dmpGetFIFOPacketSize()


使いづらいなぁ。。。サンプルなかったらみんな触らないと思うぞ。。。

MPU-6050よお前のDMPは何様だ(1)

こんにちは。エントリ書いてます。
MPU-6050についてずっと調べてました。

MPU-6050の概要。すごい安くて高性能な6軸ジャイロ加速度センサ。 InvenSense 製のI2C接続のジャイロ・加速度センサICです。 DMP (Digital Motion Processor) という機能を使うことで、補正済みのデータを簡単に利用できるのが特徴。ただしこれがひどい後述する。
アマゾンで買う時は日本在庫指定すると早く来るゾ。某林檎の会社の携帯端末に入ってる三軸加速度センサーと同系とも言われてるらしい(リーク情報重ねると)とあとはググって。

まず備忘録。
MPU-6050 6-axis accelerometer/gyroscope | I2C Device Library
ここからライブラリ持って行ってください。じゃないと動きません。もう一度言います。動かないんです。
何でうごかないかというと動かない方のライブラリは作ったときのarduinoバージョンが古くて型の名前が違うだとかそういうのでダメなのです。(詳しく知りたい方は古〜いライブラリを使ってみてね⭐️)
InvenSense のジャイロ・加速度センサ MPU-6050 を使うとか古くなってるから体験できる。(mainの部分は参考にするといい)



あとはやるだけペチペチ。

github.com


やっつけMPU6050(角度と生データ表示する)を置いておいたんでライブラリincludeして遊んでください。コメント振ってるんで読みやすいと思います

後で第二弾愚痴書きます()

Arduinoでのスレッドのお話。(pt.h)

こんにちわ。備忘録も兼ねてArudinoのスレッドのお話です。

別々のスピードでステッピングモーターの動作をやらせたいってことがあって、それ故Arudino上でスレッドを立ててみました。

github.com


以上今回のやっつけソースです。

そもそもArudinoにはスレッドの機構は存在はしないのですが、組み込み機器の考えの中にはRTOS(リアルタイムオペレーションシステム)を使うスレッドの組み込み機器とRTOSを使わない(ポーリング型(いわゆるイベント駆動型)プログラミング)の組み込み機器があります。その後者を簡単にするために"protothreads"というライブラリがあります。
protothreads
要参照。

要は今回のはprotothreadsをarudino向けにラップしたやつの紹介ということになります。



さてここからがこのエントリの本題で備忘録です(遠い目)

pt.hのinclude

Arduino Playground - TutorialList
から
build hardware and write code for it: protothread, a powerfull library
へ行って
Google Code Archive - Long-term storage for Google Code Project Hosting.
pt.hをダウンロードしてください。

その際includeすると

#include <lc-addrlabels.h>
#include <lc-switch.h>
#include <lc.h>
#include <pt-sem.h>
#include <pt.h>

ってでてくるので
削って

#include <pt.h>

に変えてコードを書く。やるだけ。




さてこいつの困ったのは意外に日本語情報あまり多くないんですね。。。
そしてぶっちゃけ二番煎じなんでオレオレメモ書きリファレンスも残しておきたいと思います。

(オレオレ)リファレンス

struct pt {
  lc_t lc;
};

構造体型pt。それだけ

PT_INIT(pt);
/*実態は
#define PT_INIT(pt)   LC_INIT((pt)->lc)
ってなっておりlc.hでincludeされている"LC_INIT(lc)"でその使用するスコープ変数の状態を初期化している
*/

Protothread を初期化する。

 PT_THREAD(name_args);
/*実態は
#define PT_THREAD(name_args) char name_args

名前を引数として呼ぶって感じですね。
*/

protothread (ちなみにCで記述されてる)の宣言部分らしい。

PT_BEGIN(pt)
/*実体は
#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
"LC_RESUME(lc)"はlc.hで記述されてて意味どおりスレッドの再開をするってこと。つまるところスレッドの開始ということになる。
*/

protothread の開始の宣言。

PT_END(pt)
/*実体は
#define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \
                   PT_INIT(pt); return PT_ENDED; }
"LC_END(lc);"はlc.hで記述されててそのスコープでの使用の終了をマークしてる関数。
*/

Protothread の終了を宣言。

PT_END(pt)
/*実体は
#define PT_WAIT_UNTIL(pt, condition)	        
  do {						
    LC_SET((pt)->lc);				
    if(!(condition)) {				
      return PT_WAITING;			
    }						
  } while(0)
" LC_SET(lc);"はlc.hで記述されててそのスコープでの使用を設定する関数。正確に言うとその状態に保存をかける関数。
*/

protothread の宣言したスコープのスレッドで止まる。つまり機能的にはwait関数。

PT_EXIT(pt)
/*実体は
#define PT_EXIT(pt)				
  do {						
    PT_INIT(pt);				
    return PT_EXITED;			
  } while(0)
*/

protothread の宣言したスコープを終了させる。

PT_SCHEDULE(f)
/*実体は
#define PT_SCHEDULE(f) ((f) < PT_EXITED)
*/

protothreadをスケジュールをするために使うぽい。具体的にはprotothread が終了した場合0を返す。

PT_YIELD(pt)	
/*実体は
#define PT_YIELD(pt)				
  do {						
    PT_YIELD_FLAG = 0;				
    LC_SET((pt)->lc);				
    if(PT_YIELD_FLAG == 0) {			
      return PT_YIELDED;			
    }						
  } while(0)
*/

このprotothread(スレッド)が終わるまで待つ。
片方でデータ通信しててそのデータをもう一つのスレッドで仕事したい時に使うとでも言えばイメージがつく。

PT_YIELD_UNTIL(pt, cond)
/*実体は
#define PT_YIELD_UNTIL(pt, cond)		
  do {						
    PT_YIELD_FLAG = 0;				
    LC_SET((pt)->lc);				
    if((PT_YIELD_FLAG == 0) || !(cond)) {	
      return PT_YIELDED;			
    }						
  } while(0)
*/

このprotothread(スレッド)の指定した条件が true に評価されるまで待つ。

以上おまけでした。間違えがあったら教えてくれると助かります。

今年の抱負とか

こんにちは。竹です。最近忙しくて(本当かよ)更新できなくてすいません。

今年一年始まるので抱負とかを書き綴ろうと思います。(遅い)

せっかくなので再度自己紹介から。

自己紹介

私は某工業高等学校の2年生です。高校では情報系の部活をしていて私の代では、(一応)部長をしています。
得意なことは寝ること。好きな言語はswifthaskell、時々C#。(書けるといってない)最近は深層学習やCTF、計算論理。暗号も興味あるけど暗号はまだ手を出せてない。プログラミング寄りなこと以外にも古典制御、現代制御などの機械制御にも興味があります。

今年一年の抱負・やりたいこと

  • 大学受験受かる:8月下旬までに自己推薦書を出すそして秋に面接の入試。嗚呼。評定が足りない。工業で今現在4.0無いので人権無い。
  • 大会入賞:キーワードは”倒立振子”、”CTF”、”枝狩り”、”UI/UX”。
  • 技術向上:いい加減アルゴリズム力つけたい。CTF精進。デザパタ覚えたい。リーダブルコード読もうな(他の読んででスタックに溜まってる)
  • 人間力の向上:去年の年末は改めて自分の惨めさやいろいろなものを考えさせられました。ありがとう。
  • コミュニティ作る。:私の身近な人々で中高生カンファもどきでもしたいなって思うこの頃。先輩や知り合いがいいネタ持ってるんで吐かせたい。

締め

今年一年より一層精進(自戒)