セキュリティ キャンプ参加 できそうです 

セキュリティ・キャンプに無事に受かりました. わーい.
私はDのフィジカルトラックに参加します. 基本的にロボット作るのをメインにやっているので, セキュリティはよくわからないですが頑張っていこうと思います.

書いた課題 

何か自分の書いた応募用紙を公開するという話を聞いたのでおいておきます.
ご参考程度にどうぞ.
注意

  • 一部, 個人情報などはオブラートにカモフラージュしています.
  • 日本語が怪しいところはありますが, 原文ママなのでお許しを.
  • 課題はよく分からないまま提出しているものもあるので, ご注意ください.
  • 熱意をガーと書くのがいいという話をよく聞くので来年度受ける人は頑張ってください.

本文 

フィジカルトラック応募課題
スキルを問う課題Aとあなたの興味や意気込みを問う課題Bを用意しました.
それぞれ2問以上選択して答えてください.ただし回答はテキストのみとします.図版や動画で表現したい場合はURLを記してください.また回答に際し、あなたの著作物、ソースコード、動画等があればURLを示してください.

課題A.スキルを問う問題

A1.あなたのプログラミングのスキルを推し量るエピソードがあれば書いてください. 

私は中学生の頃から, 電子工作をしていて高校生の頃から本格的にLinuxでマイコンプログラミングをしていました.
PICというマイコンにC言語でプログラムを組み, 知能ロボットコンテストやロボカップジュニアといったロボットの大会に参加してました.
大学生になってからはサークルでマイクロマウスというロボット競技に取り組むチームを作ってC++を使いながらCortex-M4のCPUを使ってロボット制作をしています. ソースコードは全部ここに乗っています.(https://github.com/dangorogoro/Dangoromouse)

バイトでは大学の研究室のRAを勤めていて, Pythonを使ってスクリプトを書いてます. このバイトの一環でROSにも触ったことがあります.
また始めたばかりですが, 別のバイトでベンチャー企業でもアルバイトをしていて, そちらの方ではマイコンがプログラムを動作させるのに必要な知識を身に着けながら低レイヤーのプログラミングをしています.
他のプログラミング言語としてシェルスクリプトを書きます. すべての処理をワンライナーで書く"シェル芸"に興味があって本や勉強会資料を読んで読んで勉強しています.
AWSにサーバーを借りてブログをPelicanというPythonで書かれた静的サイトジェネレータでブログを作っています.

A2.linux(unix)に関するあなたのスキルを推し量るエピソードがあれば書いてください. 

高校生の頃, 使ってるノートPCにRAMが5GB入ってたのに32BitのWindowsVistaが動かしたので不便を感じて, 初めてUbuntuをインストールしました. マイコン開発をUbuntuの上でやっていく中でシェルスクリプトなどの書き方やLinuxの動作などについて色々学びました.
それから趣味の開発などは全てLinuxの方で行ってます. 大学生になってからはArch LinuxというOSを使うようになり, 自分で開発環境などを構築して作業を行ってます. 最初の方こそ慣れませんでしたが基本的にコマンドライン上で作業しており, Awesomeのようなタイル型ウィンドウマネージャが好きです. 研究室のRA業務ではUbuntuの上で開発を行っていて, プログラムの作成や組み込みLinuxを動かして信号処理を行ったりしています.
最近はLinuxの内部での動作に興味を持っていて, この本でシステムコールなどについて勉強しています.

A3.電子回路、ハードウエア、HDL等のあなたのスキルを推し量るエピソードがあれば書いてください. 

マイクロマウスというロボット競技に参加していて, そのロボットの電子回路は基本的に全て自分で設計し, 部品を発注して作っています.
マイクロマウスでは赤外線LEDと, フォトトランジスタを使って迷路の壁を調べていくものになっていて, 私はもっと外乱に強いセンサーを作りたいと思って最近はアナログ回路などについて勉強しています.
昨年の大会で出場したロボットについてブログにまとめていってるところです.
だんごろまうす2weiの紹介 Part1
また, ハードウェアについてもロボットの機械的設計を1から全部1人でやっています. Linuxで動く3DCADソフトがあまりなくて, Onshapeというウェブサービスを使って開発を行っています. 以前, このような記事も書きました.
Linuxで動く3DCAD Onshapeのお話

HDLについてはVerilog-HDLを通してFPGAの制御を勉強しています. 学割でXilinxからPYNQというFPGAを買ったので, そのFPGA部分(一緒に入っているARM CPU上で動作するLinuxではなく)について勉強しようと思っていろいろ調べています.
最低限のLチカはできたので, マイコンでは実現できない動きを同様に再現するのかとても興味あります.

ここまでは自己紹介を交えながら色々書いてたと思います.

A4.CPUにおける割り込みの果たす役割は何ですか. 

割り込み処理はCPU内において複数の処理を並列に行うために必要な機能です.
例えば, CPUが動作している際にCPUに比べて処理の遅い周辺機器からの応答を受け取ったときのみ, 周辺機器に関する処理を行えば常に他の機器のためにCPUリソースを割いて待機するよりも効率的にCPUを動かすことができます.
また, 割り込み処理は例外処理にも使うことができます.
例えば, マイコン制御などにおいてCPUが何らかの異常で暴走をしてしまったときにウォッチドッグタイマーを動作させておけばCPUが暴走したときでも異常を検知して, ウォッチドッグが0になればCPUに対してリセット処理をかけることができます.
私はロボットの制御で割り込み処理を使っていますが, そちらではロボットの制御周期として割り込みを使っています. 物理量を用いた計算を行うため, 1kHzでタイマを動作させることで1msごとにデータをサンプリングし, 制御に活かしています. タイマを使わなかった場合, 取得した離散データがどれぐらいのサンプリングレートの物か分からなくなってしまい, 得られた信号の処理をするのが困難になります.

制御的視点とウォッチドッグ・タイマーとかのことを書きました.

A5.Lチカのサンプルプログラムを示し、実際に発光ダイオードが点滅するまでの経緯を詳しく書いてください. 

プログラム的には

int main(){
        GPIO_setting();
        Timer_setting();
    while(1){
        GPIO_Toggle(GPIOB,11); //toggle gpio output
        delay_ms(1000); // wait 1sec
    }
    return 0;
}

といったプログラムで動作します. 次にこのプログラムが動作する仕組みを低レイヤーの方から私の理解の及ぶ範囲で説明していくと, まず, マイコンが通電するとマイコンが起動し, リンカスクリプトで書かれたとおりにメモリにバイナリが配置されたあと, スタックやポートが正しく設定され, txt領域に書かれたプログラムが定周期で動作するタイマや出力のピンを正しく動作させた上で, メインループ内でウォッチドッグのリフレッシュ動作が行われている事だと思います.

ココらへんから怪しい事が書いてると思います. お許しを

A6.Cの関数longjmp setjmpを用いてプログラムを書いてください. 

以下のようなプログラムを書いた.

#include "stdio.h"
#include "setjmp.h"
int po = 0;
jmp_buf jbuf;
void func(){
	po++;
	longjmp(jbuf,1);
	po++;
}
int main(){
	po = 10;
	if(setjmp(jbuf) == 0){
		po = 0;
		printf("call func\n");
		printf("po is %d \n",po);
		func();
	}
	else{
		printf("po is %d \n",po);
		printf("in else\n");
	}

	return 0;
}

出力結果は以下のとおりになった. 実行環境はgcc (version 8.1.0) on Archlinux です.

gcc sample1.c -o sample.out
./sample.out
call func
po is 0 
po is 1 
in else

となりました. 予めsetjmpをしておいてlongjmpをするとそこに処理が移るようだということが分かりました. 動作はgoto文と似ていますが, goto文との最大の違いはgoto文では同一関数内へのジャンプしか認められていませんが, setjumpとlongjmpを使えば関数外へのジャンプも可能だということです. 内部での実装がどのようになっているのか興味を持ったので調べてみました. まずは bits/setjmp.hを見るとこのようになっています.

# if __WORDSIZE == 64
typedef long int __jmp_buf[8];
# elif defined  __x86_64__
__extension__ typedef long long int __jmp_buf[8];
# else
typedef int __jmp_buf[6];
# endif

この__jmp_buf[8], もしくは__jmp_buf[6]にそれぞれのレジスタの状態を保存していると考えられます.
状態を再現させるためにはレジスタやスタックの状態, 現在の実行している場所などの情報を再現する必要があります. つまり, 動作としてはsetjmpをした段階でレジスタの状態やスタックの状態を__jmp_bufの中に保存してlongjmpがcallされたタイミングでレジスタなどを__jmp_bufの中身で上書きしているのだと思います.
このとき, data領域を変更することはないので上のプログラムではset_jumpをしたときはpoは0でしたが, longjmpを実行したときは0に戻ることはなく, 1になったままです.

この機能は状態を保存するのでPythonなどにおけるtry-catch文として使えるのではないかと思いました.

こちらのページを参考に書きました.
http://www.nurs.or.jp/~sug/soft/super/longjmp.htm

たしかこれは試験前に入ってテンパりながら書いたと思います. もう少し, ちゃんと書きたかったなという気持ちですね

A7.高級言語のみでOSを記述することは可能だと思いますか.いずれの場合もその理由も書いてください. 

私はできると思います. 私自身, OSを書いたことはないですが, 最終的にはアセンブリ言語のようにレジスタにデータやアドレスを格納したりして, 与えられた命令を実行していくことがOSに要求されていると思うので, 低レイヤーのレジスタの設定などを言語側からできるのであれば, OSをかけると思います.

まるで分からなかったので適当に書きました

課題B.興味や意気込みを問う問題

B1.いままで作ったもの(ソフトウエア、電子字辞書、燻製、陶芸、パズル、その他なんでも)で自慢したいものがあれば教えてください. 

中学生の頃からPICというマイコンを使ってマイコン開発をしていました. 高校生の頃にロボットの大会にも出てロボコンにも参加しました. こちらが知能ロボットコンテストというロボットコンテストで私が高校三年生のときに作ったロボットです. ベスト8に残り, メカトロで遊ぶ会賞を受賞しました.(http://www.inrof.org/2015/irc/prize.html 赤巻き紙青巻き紙黄巻き紙というロボットです.)
ただ, 中学生や高校生の頃はあまりお金がなかったので, 家ではもっぱらプログラミングをしてみたり, Linuxの使い方を学んだりしていました.

大学生になってからはマイクロマウスというロボット競技に取り組んでいます. こちらは私がB2のときに作ったロボットの記事です. だんごろまうす2weiは初年度ながら全日本大会のフレッシュマン競技で迷路を無事に完走できました.
http://utcb.ikiu.me/Dangoromouse2weiPart1.html
これの1人目の走行が私のロボットです.
!embed
ブログはAWSにサーバーを借りて自前でPelicanという静的サイトジェネレータでブログを作っています.
ブログやマイクロマウスのソースコードはすべてGitHubの方に上げてます.
(https://github.com/dangorogoro)

他にもバイトで研究室のRAを行っていて, 情報を視覚化するスクリプトなどを書いていました.

B2.自由に使える半導体製造装置が手元にあるとしたら、それで作りたいものを具体的に書いてください. 

まずは電子工作に使うマイコンなどのチップを作って財布を助けたいです. また, 最近はARMのCortex-MシリーズのCPU設計に関する本を少しずつ読み始めてて, 読んだ知識を活かして自分だけのマイコンなども作れたら面白いなと思いました.
また, 高周波回路は配線に非常に工夫がなされているという話を聞きましたので, 様々な配線の高周波回路を半導体として製造してその違いをオシロスコープで見てみたいです.

ちょうどTwitterで高周波回路が魔法陣になってるという話を聞いていたのでえいっと書きました.
#高周波回路は魔法陣

B3.ロボットに期待するところと危惧するところは何ですか. 

ロボットは同じ動きを正確に行うという点で人に比べて優れています. また, 被災地での危険な環境における救助も人間にはできないことが多くあるのでロボットの活躍を期待しています.
一方でロボットに危惧することは安全管理です. 人前で動くとなると, 内部に大容量のリチウムポリマーバッテリーを積むことになります. リチウムポリマーバッテリーは放電能力は優秀ですが, これは回路内で短絡を起こすと非常に大きな火災になりとても危険です.
また, ロボットが大型化していくにつれて消費する電流が増えるのでこれも安全面について考慮しなければなりません.

B4.ドローンに期待するところと危惧するところは何ですか. 

ドローンによる物資の運搬に期待しています. 今の所, 地上は自動車が大いに活用していますが, 空中はまだまだ活用の余地が大いになると思います.
反面ドローンは空を飛ぶため墜落したときのリスクが大きく, 火災の原因にもなりえます. ドローンの安定制御をするための理論やロバスト制御について知見を増やしていく必要があります.

B5.自律走行車両に期待するところと危惧するところは何ですか. 

最近, 教習を受けて自動車運転をすることができるようになりましたが, やってみて思ったことはあまりにも複雑すぎるということです. 常に周囲の状況を判断し, 素早く適切な行動を取らなければならないので, 疲れているときに到底できるものではないなと思いました.
自立走行車両はそういった問題を解決して乗る人がどんな状態でも安心して車に乗ることができると思います.
また, 自立走行車両は高速道路での渋滞の緩和にもつながると考えています. 以前, 大学の制御工学の授業で高速道路における渋滞の原因は運転者の速度制御の仕方やタイミングの違いによって起きるのだと聞きました.
これを自動走行制御を使って行うと, 同じタイミングや制御の方法を複数の車に同時に対応させることができるのではないかと考えました.
一方で, 不安要素としては車がクラッキングされたときの被害が大きいというものです. 現状, 車は内部の様々なところが電子化されていて, 自動制御はその傾向を強めると思います.
そうなった際に, クラッキングされた際に1台だけでなく, 複数台が同時に操縦を乗っ取られた場合大きな事故につながりかねないので, セキュリティ面について十分によく考える必要があると思います.

免許合宿でヒーヒー言ってたのを思い出して書きました.
後, 渋滞の話を授業で聞いていたのでそれも入れました.

B6.IoTに期待するところと危惧するところは何ですか. 

IoTは物をインターネットを通して制御したり, インターネットを通してデータを取得したりすることができるので, 今までの生活で人の手で行ってきたことや行えなかったことをインターネットを通してコントロールすることができるのがとても興味深いところだと個人的に思っています.
例えば, 大学のサークルに3Dプリンターがあってプリントするには3Dプリンターに挿入されているSDカードに一々データを入れなくてはいけないですが, これをFlashAirという無線LAN付きのSDカードを使うことで, SDカードを抜き差しすることなく外部からデータを送ることができます. これはIoTのいい例だと思います.
ただ, 個人的に日常生活に見受けられるIoTはあまり良い印象がありません. というのもIoTをしようとする際にあまりハードウェアに対する知識がないままIoTを行って逆に不便になるというケースを見受けます.
例えば, RaspberryPiにSDカードを刺したあまり長期的な利用が望めない構成で常時画像処理やDeep LearningをしてSDカードの書き込み上限を超えて書き込みをしてしまい, SDカードを壊していくケースやBluetoothを飛ばせるマイコンを消費電力を考えずにPCのUSBポートから使用してPCにダメージを与える, といった事例を見聞きします.
こういったIoTは効率が悪く, 被害をもたらす上に脆弱性をつかれるとデータが悪利用されてしまうので, IoTをする際はハードウェアとソフトウェアの両方の知識が必要だと考えています.

ESP32とかをポリスイッチ挟まずに使って500mA以上流してPCのUSBポートを壊す人やラズパイにSDカード入れてIoTしてSDカードを壊していった人のことを想いながら書きました.

B7.ロボットをよりセキュアーにするためのあなたなりのアイデアを聞かせてください. 

ソースコードや回路をオープンに公開することで様々な人からアドバイスをもらって開発に活かすことがセキュアなロボット作りに必要だと思います.
ロボットは回路や機械, プログラムについての幅広い知識が必要であるからこそ, 様々な人と知識をシェアすることが大事だと信じてます.

以下のセキュアーにするシリーズは良く分からんと言いながら書きました.

B8.ドローンをよりセキュアーにするためのあなたなりのアイデアを聞かせてください. 

一般的なドローンは4枚のプロペラで動作するものが多いですが, これはノンホロノミック拘束という性質を持っています. すなわち, 4自由度の入力に対して, 求めるべき内部の状態は絶対座標(x,y,z)と角度(theta,psi,phi)の6つになるので制御が安定しないということです.
そこでプロペラの数を増やして安定な制御を行ったり, 制御理論について研究していく必要があります.

B9.自律走行車両をよりセキュアーにするためのあなたなりのアイデアを聞かせてください. 

自律走行のシステムを広くオープンに公開することで活発に開発を行うことが大事だと思います.

B10.IoT機器をよりセキュアーにするためのあなたなりのアイデアを聞かせてください. 

IoT機器は人の生活についてのデータを活かす反面, 漏洩した場合に本人に危害が及ぶ可能性があるので, 回路についての知識とプログラムについての知識のそれぞれを身に着けていくことが必要だと思います.

B11.半導体デバイスをよりセキュアーにするためのあなたなりのアイデアを聞かせてください. 

まず過電流からICを守る保護回路の実装が大事だと思います. 不意の誤動作からICを守る事でシステムをセキュアに保つことができます.
また, STmicroelectronicsの作るSTM32シリーズのマイコンではマイコンをつける向きを間違えてもVDDとGNDが干渉しないようなピン配置を取っています. こういった配慮がICを守ってくれると思います.

マイコンの向きを間違えて火入れしてもギリギリ壊れなかったときのことを思い出して書きました.

B12.あなたの情報セキュリティに対し思うところを自由に書いてください. 

年々, 情報化社会へと世界が加速していく中で, 様々な情報がインターネットには出回っています. そのためモノを作る側はセキュリティについて意識をしていかなくてはいけないと思います. 私のブログは静的サイトジェネレータで作っているので直接の影響は今のところないですが, Apacheのログを見てみると毎日のようにPHPの古いバージョンのファイルに対してアクセスしようという動きが見られます. 便利なものを使う反面, 依存するものが増えれば増えるほど, 脆弱性が多くなる可能性は増えていくばかりなので常に様々な情報にアンテナを貼っていく必要があります.
また, 消費者の立場から考えるとインターネットに発信した情報は取り消せないので, SNSやブログの利用には最大限の注意を払うべきだと考えました.

大学がインターネットリテラシーに熱い大学だったのでそれを思いながら書きました.

B13.あなたの作りたいものは何ですか。それは世の中をどの様に変えますか. 

人間はロボットと比較した際, “物を運ぶこと"という能力が大変抜きん出てます. というのも物を運ぶには「物を認識し」,「つかみ取り」,「指定の場所まで運ぶ」というそれぞれの動作が合わさって初めて物を運ぶことができるのです. これをロボットにやらせようとするととても一筋縄ではいきません.
私は大学で制御理論について学んでいて, いつの日か学んだことを活かして人間の代わりに安定して物を運び, 動いてくれるロボットを作りたいです. そうすることで人間の作業の負担を大きく減らし, 労働を減らしていきたいです.
そうすることで人が余った時間を労働以外の有意義な時間に使えたら幸福だなと私は信じてます.
そのために今はセキュリティキャンプで様々な技術をロボット以外の視点から学んでいき, 将来に活かしていきたいです.

ほんまか?

感想 

ポエムっぽくてあれですが, ありがとうございました.
ちなみに現物はHackMDでお家や電車の中でほそぼそと書いていました. HackMDはいいぞ.
HackMD