19番目の日記

情報系よわよわ高専生がやったことや思ったことをつらつらと.

2021 岡山大学 工学部 情報系学科 編入体験記(推薦)

はじめに

この記事は苫小牧高専 Advent Calendar 2021 - Adventar,17日目の記事です.

adventar.org

卒研の話やら僕的今一番アツい言語Rustの話やら色々迷ったのですが,12日目にあや(fairy)豊橋技科大の編入体験記を書いてたので高専の延長な大学ではなく, 一般的な大学の編入の話もしておこうかと.

受験舐め腐りヒューマンだったのであまり記憶がありません.だいたいで書きます.

自己紹介

成績:だいたいいつも可もなく不可もなく,良が1つくらい.平均でいうと4.9/5くらい
席次:3年→5位か4位
  :4年→5位か4位(ワンチャン3位?)
TOEIC:最高点は565点
併願:専攻科(合格),東北大学(受験行きませんでした)
部活:ロボットテクノロジー
資格:Iパス,eco検

動機

 3年生ごろからセキュリティに興味があり,漠然と東北大で良いかな〜〜〜とか思ってました.enPiTセキュリティ分野の拠点校だし.旧帝大でそれなりにネームバリューあるし.  4年生から5年生に進級する際,人生を変える出来事がありました.もともとプレ卒で某ラスボスだった先生の研究室でWEB系のセキュリティを題材で研究をしていたのですが,4年生から5年生に進級する春休みに,研究室slackで目を疑う投稿が.
某shigyo先生「来年度からはタイに赴任なのです」

 5年生に進級した僕はまた研究室選びです.今は新しく着任してきた先生のもとで,テーマを少し変え組込みをRustで書いてセキュリティはどうだろう?みたいなテーマでやってます.また,OSなどシステムソフトウェアにも興味を持ち始めたので,OSのセキュリティや組込みのセキュリティの研究をしている研究室が岡山大にあって良さげだなとなった次第です.

勉強したこととか

 岡山大学は推薦(3,4年次の席次が上位25%以内が条件)で受験しましたが,一般受験と同じ問題,ほぼ同じ面接を受けます.科目は数学,英語,専門でした.

数学

 大日本図書の『大学編入のための数学問題集』という,授業で使っている教科書と同じ出版社の問題集を軽く解いたのと,専攻科の数学の過去問を解きました.岡山大の過去問は学科は違いますが機械系システム学科が公開している過去問と,何度か問題の解き方を聞きに行った数学の先生がいろいろな大学の過去問の類似問題をくれたので,それを軽く解きました.正直そこまでガチではやってません.詳しくは後述しますが,試験問題はvery very easyでした.正直専攻科数学の方がマジでむずかった.

英語

 ほとんど勉強してません.金フレ読んでTOEICの点数270→565まで伸ばしたくらいです.

専門

 こちらもほぼほぼ勉強していません.論理回路,計算機システムのノートを見返したくらいです.

以上のようにほとんど勉強してません.受験舐め腐りヒューマンなので.

出題された問題

数学

問1

2次正方行列の固有値固有値ベクトルを求める問題.とても簡単.

問2

(1)

 \frac{1}{\sqrt{1+Z}} マクローリン展開.Zは確か実数.簡単

(2)

 \frac{1}{\sqrt{1- 2xt + {t}^2} } = \sum_{n=0}^{\infty} P_{n} (x) t^n

において P_0, P_1, P_2を求める問題.最初は見慣れない形でアレ?ってなったが,落ち着いて式を見れば結局マクローリン展開なので変数にさえ気をつければ簡単.

問3

(1)は指数関数の重積分,(2)は積分範囲が楕円のときに直交座標での重積分に変換できるかどうかみたいな問題.ヤコビアンとか覚えてれば簡単.

英語

A4半分ほどの長文が一つあり,()に入る前置詞を答える問題が3つと日本語訳する問題が3つ.簡単なはずだけど僕は英語がほぼできないので出来は少し低めな気がする

専門

問1

7セグを光らせる論理回路を真理値表を書いて積和系とか最簡系で求めたり,回路図からどのセグメントかを求める問題とか.論理回路をきちんと受けてればなんてことなく解けます.very easy

問2

(1)

色々な色の玉があってその平均情報量を求める問題.ソフトウェアデザイン演習でさらっとやったなって感じ.覚えていたので簡単だった.

(2)

二つのサイコロを振ったときに出た目の和が9なのは覚えているけど出た目は忘れた.このとき失われた情報量はという問題.これだけは授業でやったことがなかったので少し焦りましたね.ただ落ち着いて少し考えれば解けました.

問3

少数を有効桁n桁で表せという問題と16進を符号あり,なしそれぞれで10進へ変換.まぁできない人はいないでしょう.

面接

志望動機とかなんで高専に入ったのかとか聞かれました.僕は小さい頃から電子工作してただとか北見工大のオーキャンでプログラミング体験してたとか話したらかなり面白がられました.ROSを知っているかと問われ知っていると言ったら好き者だねとも言われました.なかなか好感触な面接でしたね.ただ,最近科学雑誌を読んだか,なにか記憶に残っている記事はあるかと聞かれたのはちょっと予想外でしたね.そんなものほとんど読んでいないので答えられませんでした.

あとは大学卒業後の進路を聞かれました.まぁ院に行きたいしできることなら博士まで行きたいと言ったらなかなか好感触でしたね.大学編入する人は基本院に進むことが前提な気はしますが院に行くって言うのが一番正解だと思います.

結果

試験の出来としては数学9.5割,英語8割,専門9割といったところですかね.結果は合格でした.情報系学科の受験者数はだいたい30人ちょいくらい,そのうち推薦は僕含め2人.合格者は推薦は2人とも合格,一般では8人ほどの合格者数だった気がします.ネットで調べた感じ推薦の中でも合格者0だった年があるとかないとかという情報を見たのでビビってましたが蓋を開けてみると意外とあっけなかったです.東北大は一応志願しましたが第1志望であり推薦の岡山大が合格したので東北大受験は出ませんでした.高専受験もそうですが僕は滑り止めが第1志望よりも偏差値が高いという奇特な傾向を持つようです.

おわりに

僕は受験をマジで舐め腐り,勉強をほぼせずともなんか上手くいきましたが,大学編入は将来を決める大事なイベントであり悔いのないよう全力で取り組むべきであると思います.過去問なんかはキャリアセンターに色々保存されてますし,最新年のものでまだ無い場合などは職員の方に話せば問い合わせてくれます.また,色々な先生に相談すると僕のように問題をもらえる場合もあるようですので,情報収集や過去問収集を怠らないようにしましょう.また,『大学編入のための数学問題集』は解いてて楽しかったので僕的にはおすすめの数学参考書です.

また,授業をきちんと聞くのが前提です.席次が良いと推薦もいろいろなところが取りやすくなりますし,授業で学んだことさえきちんと理解していていれば見たことのない問題でも解けます.これから大学編入を考えている人は入念に準備をして編入試験に臨むようにしましょう.

ここまでとても長い怪文書となりましたが,少しでも参考になれば幸いです.

苫小牧高専 Advent Calendar 2021 - Adventar,明日はやまもと先生です.僕の卒研の指導教員ですし,本日卒論の梗概を先生に提出しましたので,その添削がアドベントカレンダーにならないことを祈ります.

それではこの辺で.

enPiTスプリングスクールに参加してきた

 SIGMAです.2月25日〜27日に名古屋の南山大学で行われたenPiTスプリングスクールに参加してきました.

きっかけ

 高知のK-SECとほとんど同じです.はい.交通費支給で名古屋行って勉強できるとか得しかないです.

enPiTとは

 実のところ僕もよくわからないと言うのが本音なのですが,課題解決型学習(PBL)など実践的な教育を全国に広めようっていう事業っぽいですね.

  • ビッグデータ,AI分野
  • セキュリティ分野
  • 組込システム分野
  • ビジネスシステムデザイン分野

の4つがあり,今回のスプリングスクールは組込システム分野にあたります. ちなみに情報系3年の実験でArduinoを使ってキッチンタイマーを作ったのですがそれもenPiTの取組のようですね.まぁArduinoにenPiTシールド載ってたしね

1日目(25日)

 テクニカルライティング演習という技術文書の読み書きに関する演習をやっていたらしいのですが北海道→名古屋の移動のため不参加です.ホントはこっちが一番気になってたんですけどね

2日目(26日)

 この日からの参加です.パーソナルAVCテクノロジーの方による講義と演習が行われました.講義ではUARTというシリアル通信について教わり,演習では仕様定義〜実戦までの設計プロセスの実践ということで,前半はペアで2台のArduinoを使ってモグラ叩きゲームの作成,後半はグループでそのモグラ叩きゲームの機能を拡張したり,別のゲームを作成したりなど,割と自由な開発でした.この開発の成果を3日目に成果発表会という形で発表します.
  前半のペア演習では

  • 仕様定義の手順の説明
  • 通信と7セグLEDの点灯の機能の実装
  • 一定時間毎にランダムな位置の7セグの点灯の実装
  • シリアル通信を使って他のAruduinoへのメッセージの送信の実装
  • 状態遷移図と状態遷移表の説明

がありました.2台のArduino間の通信の方法などは普通に知らなかったので面白かったです.ただ個人的な不満というか愚痴が少々ありまして,7セグの点灯をこの演習のために用意されていたクラスを用いて行っていたのですが,そのクラスがすごく扱いづらかったと言うのが一つ.普通にwireのwriteとかでよくねってなりました.また,状態遷移図から状態遷移表を作成する問題があったのですが,図ではイベントが7個あるのに,表ではイベントを書く枠が6個しかないんですよね.解答でもイベントが一つ足りないままの表が解答として出されました.とか思っちゃいましたが二つ目はともかく,一つ目の方はただ7セグで数字を表示するだけならそのクラス使った方が普通は楽なのかなーと思ったり(僕がマイノリティ説ですね)

後半のグループ演習では,あらかじめ振り分けられた班ごとにリーダを決め,何を作るかアイデアを出し,設計から開発まで行います.
僕のいた班ではHit&Blowゲームを作ることになりました.簡単に言えば数字当てゲームです.Arduino3台をそれぞれ,正解の数字を設定する機種,推測した数字を入力する機種,HitとBlowの数を表示する機種と役割を決めて,通信させようとしました.結構仕様もガッチリ考えて,役割分担してコードを書いたのですが,この日のうちには終わらず...ホテルにArduino持ち帰って担当部分書いてました.f:id:sigma1425:20200226233529j:plain

3日目(27日)

 この日は成果発表です.といっても成果発表の前になんとかプログラムは書けたのですが思うように動かず,結局未完成のまま成果発表を迎えることに. 最初はenPiT1(大学院生向け)の方の発表があり,自動車の遠隔運転など,3名の方の取組をスライドとパネルで聞くことができました.次にenPiT2(学部生向け)の方の発表がありました.一緒に行った同じクラスの人が3年前期にやった実験の内容の発表をしていて,それで初めてあれもenPiTの取組だったんだなーって知りました←

 いよいよ成果発表です.他の班の発表を見ると,モグラ叩きの拡張をしてる班もいましたが,新しくゲームを作ってるところが多いかなーって印象でした.ちなみに僕の班は完成しなかったので頑張ったと言うことだけは発表しました()結構仕様はしっかり書いてたのでその説明が主でしたね.

まとめなど

 かなりテキトーな文章で申し訳ありませんがこんな感じのことを名古屋でやってきました.グループ演習でやったことは学校の授業でも二回ほど同じことはやってるのですが,クラスの人ではなく会ったばかりの人とコミュニケーションを取りながら役割分担して開発などするのはまた違った感覚で面白かったですね.また,enPiT1の方の発表を聞いて思ったんですが,やっぱり組み込みの分野ではROSを使ってるのが多いですね.そのうちROSについても勉強してみたいものです.今回はここまでにしておきます.読んでくれた方ありがとうございます.

K-SEC 和歌山大セキュリティ演習に参加してきた

 お久しぶりです。SIGMAです。毎日ブログ書くと言う意気込みはどこへいったのやら、いつの間にか年が明けましたね。おめでとうございました。 さて、今回は、高知高専で行われた和歌山大セキュリティ演習に参加してきました。  「和歌山大」セキュリティ演習ですが高知です。何故ですかね。

きっかけ

 僕のクラスの教室には、前と後ろに二つ黒板があるのですが、ある日、後ろの黒板にこんな文が。
「K-SEC講習会 @高知 交通費でます」

行くしかない

 え?だって講習会に参加して学べるうえに観光できるんですよ?交通費と宿泊費を使わずに。 最高じゃないですか。秒でそれ担当の先生にメールしましたよ。 実は石川のウインターキャンプも募集しててそれも申し込んだんですけどそっちは落ちちゃいました。 と言うわけで1月10日(金)、授業は特欠で新千歳空港から羽田で乗り継ぎ高知へ。 先生が一人と先輩が一人の三人での移動です。

金曜日と土曜日の午前はせっかくの高知ですので観光してました。それにしても高知あったかいですね。冬は氷点下の北海道民からすれば、この季節に10度超えとか信じられません。

 セキュリティ演習は土曜の午後からのスタートでした。高知高専は空港の近くにあるとのことなのでまずは連絡バスではりやま橋から高知龍馬空港に行き、少し歩けばつきました。

f:id:sigma1425:20200113195909j:plainf:id:sigma1425:20200113195915j:plain

 受付をして名札を受け取り、会場となる教室へ。演習はA~Eの5グループに別れてて、僕はEグループでしたのでEグループの机へ、同じグループの人が来るたびに軽く挨拶して少々雑談をしていると演習が始まりました。みんな話しやすい方々でよかったです。

セキュリティ演習の開始

 まずは高知高専校長のお話、演習内容の説明と和歌山大の先生のお話があり、演習内容を簡単にまとめると

  • 自分たちはホスティングサービスの会社の社員
  • 2台のサーバが稼働している。
  • お客様などからサイトの異常などインシデントの報告を受けるのでその原因究明や修正、対策を行う。
  • 勝手に修正してはいけない。設定の変更やファイルの削除などを行う時はお客様やCEO(今回の演習ではDEOはセオさんという名前)に電話してその操作を行って良いか確認しなければいけない。

といった内容でした。  その後自己紹介タイムがありました。Eグループには苫小牧高専の僕の他、香川高専詫間キャンパス、米子高専、長野高専、そして開催地である高知高専の方の5人でした。

1つ目の問題(不正ログイン)

 演習が始まると、早速電話がきました。
「イノウエさんと言う方のサイトにアクセスすると登録完了と書かれたページに飛ばされる」
というものでした。サーバ内のイノウエさんのディレクトリのドキュメントルートを見てみると、なにやらindex.phpが最近書き換えているらしいことがわかり、本来のサイトの内容らしいHTMLの記述と共に、header関数でリダイレクトして登録完了ページに飛ばすコードが書かれていました。CEOのセオさんにイノウエさんの連絡先を聞き、イノウエさんに最近index.phpを変更したかどうかを確認したところ、最近変更はしてないしそんなコードが書いた覚えがないとのことでしたので、問題のコードを削除して良いか確認をとり、index.phpのheader関数を削除しました。再びイノウエさんのページにアクセスすると、正常にページが表示されて一件落着...ではありません。

 確かにイノウエさんのページは元に戻りましたが、なぜindex.phpが書き換えられていたのかはわかっていません。このままでは再び同じことが起こる可能性があります。誰かが不正にログインしたかもしれないのでauth.logでsshの認証記録を確認したところ、 

Failed password for inoue 

という文が短時間に大量に記録されいるんですね。しかも同じIPアドレスから。そうです。ブルートフォースです。イノウエさんの設定していたパスワードがブルートフォースによって突破され不正にログインされていたのです。そこで、イノウエさんにパスワードを変更するよう伝えたところ、今手が離せないのでパスワードを変更できないと。そこでセオさんにも確認をとりルートユーザーに切り替えpasswdコマンドでパスワードを変更し変更後のパスワードをイノウエさんに伝えログインの確認をしてもらって終了。なんやかんやあって最終的に超簡単なパスワードになりました。
これイノウエさんの突破されたパスワードより簡単なのではと思ったり
 ログインの確認がとれ、この問題は終了しました。

 問題が解決して一息ついたのも束の間、すぐに次の電話が...
 ここで1日目が終了しました。この問題は2日目(僕の高知遠征というくくりでは3日目ですが)にやることになります。その日の最後はJPCERTの説明がEmotetなどの被害についてのお話がありました。

2つ目の問題(DoS攻撃

 セキュリティ演習2日目です。この日は朝からのスタートです。再び前日の最後にかかってきた電話と同じ内容の電話がかかってきました。
ホスティングページが見れない」
ホスティングページにアクセスしたところ、ずっとくるくるしたままページが読み込まれませんでした。グループに一台与えられているレッツノートルーターを接続し、ワイヤーシャークでパケットをキャプチャし、フィルタをかけたところ何者か攻撃を受けていることがわかりました。その時和歌山大の先生からのヒントタイムがありました。この攻撃はSlow HTTP DoSというそうです。また、サーバでnetstatコマンドどwcコマンドを用いると同一ユーザーからの通信が256行出てるんですよね。この256というのはapacheの最大プロセス数だそうです。apacheの設定で攻撃者のIPからの通信を遮断しようと試みましたが失敗。ヤマハルーターtelnetで接続するなどしてipfilterを使って攻撃者のIPアドレスを遮断しました。

実はこのインシデント、なんとなくはわかったのですがワイヤーシャークやらルーターやら初見の知識が多すぎて充分に理解できてない感が一番強いんですよね...

3つ目の問題(権限不備)

はい、またお電話です。
 「ヒラタさんという方のサイトにアクセスすると、不審なサイトに飛ばされる」
1日目のイノウエさんの件と似てますね。ちなみになのですがヒラタさんのページにアクセスすと和歌山大のサイトに飛ばされました。僕は不審なページじゃなくね?と思ってたのですが、ファシリテーターさんが、「これは不審ですねぇ〜」などと言うものですから不審なのでしょう。イノウエさんの件と同様indexの書き換えを疑いましたが今回はHTMLファイルでしたし特に不審なコードなどありませんでした。僕は見落としてたのですがドキュメントルートに所有者がyamashitaとなっている.htaccessファイルを発見。そこにはリダイレクトの記述がありました。また、ドキュメントルートの権限がなんと777、つまり誰でもなんでもできるようになっていたわけですね。ヒラタさんに確認すると友達も編集できるように権限を変更したらしいです。この電話は僕がしたのですが超コミュ障発揮しました。グループのみなさん、お見苦しいところを見せてごめんなさい。というわけで権限を変更し.htaccessを削除して解決です。

 .htaccessというディレクトリ単位で適用される設定ファイルがあるんですね。初めて知りました。まだまだ勉強不足だなと。

4つ目の問題(memcachedリフレクション、IPスプーフィング)

 はいまたまたお電話です。
「管理用サーバに大量のトラフィックが発生している」
だそうです。今までは顧客用サーバでのトラブルでしたが今回は管理用サーバに問題発生です。nloadコマンドでネットワークをモニタリングしてみると、管理サーバから顧客サーバにパケットが送られているようです。ワイヤーシャークで確認すると、顧客サーバから管理サーバのmemcachedに「get test test test test test test test test test test 」という問い合わせが1パケットで2つ送られていることが確認できました。管理サーバのmemcachedtelnetで接続し、「get test (ry」を打ち込むと、なんとtest1つあたりに2万文字の文字列が返されているではありませんか。問い合わせ43文字に対し40万文字返ってくることになりそりゃトラフィックが発生しますねという感じです。memcachedリフレクションと言うらしいです。
 また、そのパケットはルーターで監視したわけですが、顧客サーバと管理サーバで通信するのであればルーターを通らなくても良いのですよね。ではなぜルーターで監視できるかですが、UDPだと送信元が偽装できるようで、外から送信元を偽装し、顧客サーバとして問い合わせを送ることで管理サーバは勘違いして顧客サーバに返すそうです。IPスプーフィングというそうです。
 解決法としては、testに対応付けられている2万文字の文字列を削除することで解決しました。これは一時的な解決法でしかなく、永続的な解決法としてはUDPを無効化すれば良いようです。UDPの無効化の方法を見つけた頃には時間がほとんどなく、セオさんに確認する暇も無かったため、終了時間をすぎてからこっそりやることに。無事トラフィックがなくなりました。

 これで演習がすべて終了しました。最後は解説があったり写真撮影などがあった後、高知高専を後にしました。すごく楽しかったです。

まとめ

 文章をまとめる力が足りなく、かなり長々と書いてしまいました。今回の演習で対処した攻撃をまとめると、

 僕の知識が及んだのがブルートフォースと権限の不備くらいしかなく、ほとんどが新しく知ったものでした。それでも、なんとか吸収しようとひたすらメモをとりまくってたので今回の演習で学んだことをこれからの学習に活かせていけたらなと思いました。高知という、北海道民からすれば遥か遠くの地でしたが、交通費宿泊費支給でこのような演習に参加できたのはすごく貴重な体験でしたし、グループのみなさんやファシリテーターさんがとても話しやすい方達で、とても楽しく学ぶことができました。このように楽しく学ぶことができる演習は、楽しい思い出としてかなり記憶に残りやすいので、これからもこのようなイベントには積極的に参加していきたいものです。

 かなり拙い文章になってしまいましたが、読んでくれた方ありがとうございました。これからも気の向くままにブログを書いていこうと思いますので、暇な時にでも読んで戴けたらなとおもいます。それでは!

PythonとOpenCVで画像解析②

 おはようこんにちはこんばんは。SIGMAです。今回はPythonOpenCVで画像解析、第二回です。前回1は前置きが長くなってしまってあまり書けなかったので今回からちょっと詳しく書いていこうかと!

 今回から僕が普段使っているこの画像を使いながらやっていきます。

f:id:sigma1425:20191226153815p:plain
ロボットにカメラをつけたらこれくらいかなといった角度でとった写真

 今のところの目標は、中央下にある白線をライントレースできるようにしたいなと。

画像の表示、保存

画像の表示

 画像の読み込みは前回の記事で書きましたがimread()を使います。では読み込んだ画像をどうやって表示するのかと言いますと、imshow()を使います。

import cv2

img_path = "./img/sample.png"
img = cv2.imread(img_path, -1)
cv2.imshow("image", img)
cv2.waitKey(0)

cv2.destroyAllWindows()

実行結果 f:id:sigma1425:20191226160156p:plain

 imshow()の第一引数にウインドウの名前、第二引数に表示したい画像のndarrayを渡します。ただimshowで表示するだけではすぐにプログラムが終了してしまうので、waitKey(0)でなにかキーが押されるまで待機します。2また、プログラムが終了すればウインドウは勝手に閉じるのですが、念のためdestroyAllWindows()で全てのウインドウを閉じてからプログラムを終了します。

画像の保存

 なにか画像をいじってその画像を新たに保存したいといった時にはimwrite()を使います。

import cv2

img_path = "./img/sample.png"
img = cv2.imread(img_path, -1)

gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("./img/gry.png", gry)

実行結果 f:id:sigma1425:20191226162810p:plain  ここでは詳しく書きませんがcvtColor()で読み込んだ画像をグレースケールに変換して保存しました。imwrite()は第一引数に保存したい画像のパス、第二引数に保存したい画像のndarrayを渡します。imgというフォルダにgry.pngができていますね。

 ここまでが画像解析をする上でよく使うであろう基本的な処理です。
まとめると、

  • imread() - 画像の読み込み
  • imshow() - 画像の表示
  • imwrite() - 画像の保存
  • waitKey(0) - キーが入力されるまで待機

の4点です。基本的にimshow()とwaitKey(0)はセットで使うことが多いです。

画像の輪郭を抽出

 ここまでは画像解析というよりはPythonで画像を扱うための準備でした。ここから少し画像解析っぽいことをしていきます。まずは輪郭の抽出です。というのも、ライントレースを行うためには白線の輪郭を抽出し、その回帰直線の傾きを求める必要があるからです。
 輪郭の抽出にはCanny()を使います。次のコードをみてください。

import cv2

img_path = "./img/sample.png"
img_gry = cv2.imread(img_path, 0)

canny = cv2.Canny(img_gry, 100, 200)

cv2.imshow("canny", canny)
cv2.waitKey(0)

cv2.destroyAllWindows()

実行結果

f:id:sigma1425:20191226171727p:plain
なんか色々と輪郭が検出できてますね

 Canny()の第一引数に輪郭を抽出したい画像のndarray、第二第三引数には閾値を渡します。
 Cannyのアルゴリズムは詳しく話すと記事1つ2つ書けそうなのでまたの機会にしようかと思います。とりあえず今は閾値は小さい方をより小さくすると抽出する輪郭が増え、大きくすると減るんだなぁぐらいで覚えといてください。

まとめ

今回までにやったこととしては、

  • 画像の読み込み
  • 画像の表示
  • 画像の保存
  • 輪郭の抽出

の4点です。ただ輪郭を抽出するだけでは必要のない情報も含んでいますのでここからは必要な情報だけを抜き出すなどする必要があります。まだまだやることは多いですね。

 今回はここまでにしようかと!当面はライントレースができるようになることを目標にしますが、最終的な目標はライントレースと物体(ボトルフリップの時のテーブルやランランランドリーの時の物干し竿)を検知してロボットの自動制御が満足にできるようになることです。まだまだ道のりは遠いですね。果たしてオフシーズンの間に実現できるのでしょうか。
 ここまで読んでくれた方ありがとうございました。


  1. PythonとOpenCVで画像解析① - 19番目の日記

  2. waitKey()は引数に待機したい秒数をミリ秒単位で渡しますが、0を渡すことでなにかキーが押されるまで待機します。また、ここでは説明しませんが特定のキー入力のみを待つこともできます。

Rustの勉強を始めた

おはこんばんにちは。SIGMAです。今回は僕的一番キテるプログラミング言語、Rustについてやっていこうかと!

今回の記事の内容

Rustってなんぞや?

 RustというのはMozillaが中心となって開発されているオープンソースの汎用プログラミング言語です。C++に匹敵する実行速度や詳細なメモリ管理が実現でき、その一方で不正なメモリ領域をサスポインタを許容しないメモリ安全性を保証したりマルチスレッドによる並列実行時のデータ競合をコンパイル時に排除したりするなど安全性を重視しています。1

 簡単にまとめると、

こんな感じですかね。また、RustはStack Overflowの「最も愛されている言語」というアンケートで2016,2017,2018年と3年連続1位に輝いています。

特徴

 3点目のガーベジコレクションを行わないという点についてですが、Rustでは変数の寿命がわかり、自動でメモリを開放するようです。
 とりあえず速くて安全な言語らしいです。他にもたくさん特徴があるのですが僕には説明できるほどの理解がありませんでした。いつかRustの特徴を詳しく書けるようになりたい。

Rustのインストール

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

このコマンドを打てば完了します。

Rustで Hello World

 Rustをインストールするとrustup,rustc,cargoと3つのコマンドを使えるようになりますが、基本的にcargoしか使いません。(VScodeのCode Runnnerだとrustcを使っているが。)

プロジェクトの生成と実行

cargo new プロジェクト名

これでプロジェクト(ディレクトリ)が生成されます。cdコマンドで生成されたプロジェクトの中に入り、

cargo run

と打つことでプログラムが実行されます。2cargo newでプロジェクトを作った直後に実行すると画面にHello Worldが出力されます。これでHello Worldができたよ。やったね!
...
...

プログラムの説明

え?なにもコードを書いていない?そうです。Rustはなんとプロジェクトを作ると勝手にHello Worldのプログラムを生成してくれるのです。ではプロジェクト内のsrc/main.rsを見てみましょう。

fn main() {
    println!("Hello, world!");
}

 これがRustのHello Worldです。Rustのプログラムの拡張子は.rsです。ではプログラムの説明です。

関数定義

 Rustの関数定義の基本構文は以下のようになります。

 fn 関数名(引数1: 引数1の型, 引数2: 引数2の型) -> 返り値の型{
    関数の内容
}

引数や返り値は省略することができます。main関数は引数も返り値もありません。C言語などと同様に、Rustでもmain関数がエントリポイントとなります。
 次にprintln!ですが、これは関数ではなくマクロです。Rustでは' ! 'がついたものはマクロです。3

println!("フォーマット文字列");

このように使います。

 以上がRustのHello Worldのプログラムでした。

終わりに

 長くなってきましたので今回はここらで終わりにしておきます。拙くテキトーな文章で申し訳ないのですが少しでもRustに興味を持っていただければ幸いです。ここまで読んでいただいた方、ありがとうございました。  


  1. Keen・河野達也・小松礼人(2019)『実践Rust入門』株式会社技術評社.

  2. 実行せずにビルドだけしたい場合はcargo buildと打ちます。

  3. println!では任意の個数の引数を渡せるのですがRustでは可変個の引数はサポートしていないのでマクロで定義されています。

PythonとOpenCVで画像解析①

始めに

 おはようございます。もしくはこんにちは。SIGMAです。最後に記事を書き始めてから今日で100日目となりました。ツイッター上で突然こんなことを言われたので、今日から極力毎日ブログを更新していこうかと。

 僕は記事を書くのが絶望的に遅いので最初は2~3日に一回くらいのペースで更新していこうかと。 というわけで最初に何書こうかなーとか思ってちょっと考えたのですが今僕がやっていることとしては、

  • 画像解析
  • 授業変更botのメンテなど
  • Rust(なおほぼ手を付けてない模様)

の3つですのでこれらをまあ気のむくままに書いていこうかなと。 今回は画像解析をちょっとだけやっていこうかと。

なぜ画像解析をやっているのか

 なぜ僕が画像解析を試みているのかといいますと、まず僕はロボットテクノロジー部(以下ロボテク)という、いわゆるロボコン部に所属しています。昨今のロボコンでは自動操縦のロボットを作らないといけないわけですよ。今年のロボコンの時期には僕はロボテクにいなかったので(?)わからないのですが去年の僕の記憶では自作のロータリーエンコーダなどを使っていた記憶があります。そこで、今季のオフシーズンの技術開発で画像解析を用いてライントレースや、カメラをつかって物体(去年でいう移動テーブルや今年でいう物干し竿)を検出できるようにできるようになったらいいなーという感じで画像解析をすることになりました。
 もし画像解析を自動操縦につかうとなった場合、ロボットにラズパイを積んで制御することになるのでしょうけど、僕に画像解析の知識がなさすぎるのでまずは使い慣れているMacである程度できるようにしてからラズパイに積んでいこうかなと思っています。

OpenCVのインストール

 今回、画像解析をするにあたって、OpenCVというライブラリを使いました。OpenCVとは、まぁ簡単にいうと画像を色々と簡単に弄れたり機械学習なんかもできるらしいなんかすごそうなライブラリです。今回僕はconda4.8.0をつかっています。OpenCVのインストールは単純で、

conda install opencv

これだけです。

pythonプログラム上で使う時は以下の文でインポートします。

import cv2

画像の読み込み

 画像の読み込みにはimread()を使います。

import cv2

image = cv2.imread("./img/sample.png", 0)

このように使います。

第一引数には読み込みたい画像のパス、第二引数には画像の読み込み方法を指定します。-1は無変換、0はグレー、1はカラー、これくらい覚えとけばいい気がする。 返り値としては読み込んだ画像をndarrayとして返します。ndarrayとはその名の通りn次元配列です。例えば、カラー画像の場合は3次元配列です。そのため、OpenCVの他にNumPyなども使って数値的な画像処理ができるようになります。 

 すごく中途半端なのですが長くなりそうなので今回はここで終わろうかなと思います。次は画像の表示と保存、輪郭の検出ぐらいまで書こうかな。 ここまで読んでくれた方ありがとうございました。

東京でハンズオンに参加してきた

 こんにちは、SIGMAです。ブログを始めたは良いけど書くネタが思いつきません()
 9月10日から9月13日までの4日間、VOYAGE GROUPさんの、VagrantとDockerを使ったローカル開発環境構築ハンズオンに参加するべく東京に行ってきました。
voyagegroup.connpass.com

いざ東京へ!

f:id:sigma1425:20190915121332j:plain:w250

 写真撮り忘れました。朝9時半出発の飛行機で東京へ。時期も時期ですしスプリングジャパンで値段は割と安かったですね。

1日目

 成田空港に着き、始めに感じたこと。
あ゛つ゛い゛
確か最高気温36度とかでしたかね。北海道以外に住んだことが無い僕からすれば30度超え?ふぇぇ?って感じです。死にかけました。

 バスで東京駅に向かい八重洲で昼食を食べ宿がある渋谷へ。本当に人が多いですね。なんやかんや宿に到着、荷物を置きアキバへGO。秋月電子やら千石電商やらをさらっと見てからゲーセンをハシゴしその日は終了。次はちゃんと作るものと欲しい部品決めてから行きたいですね。

2日目

 ハンズオンは昼過ぎからなので午前中は池袋へ。SEGAに行った後、今更感ありますがゴンチャでタピオカ買いました。美味しかった(小並感)
f:id:sigma1425:20190915172224j:plain:w250
その後渋谷に戻り昼食。結構お高めのパンケーキ食べました。こういうのってどうやって食べるのが正解なんですかね?結構食べるのに苦労しました。
f:id:sigma1425:20190915173752j:plain:w500

ハンズオンに参加

 ここからが本題です。昼食後、少し道に迷いつつもVOYAGE GROUPさんのオフィスがある渋谷ソラスタに到着。もう緊張でビビりまくってましたね、汗ダラッダラで髪酷いことになってるし。
 ハンズオンはVOYAGE GROUPさんのオフィスの会議室で、step1~step3の3つに分けて休憩が入りつつ行われました。


step1

 step1ではVagrantVirtualBoxを用いて仮想環境を構築しました。CentOSの仮想サーバーを起動してssh接続し、設定やCPU数などの確認、タイムゾーンの設定、エディタのインストールを行いました。
 ここまでは結構すんなり理解できました。

休憩

 step1の後10分ほど休憩がありました。オフィスを自由に見て回って写真など撮ってSNSにupしても良いとのことでしたので早速ツイートしました(笑)

すっごくオシャレなんですよね。感動しました。

f:id:sigma1425:20190915193149j:plainf:id:sigma1425:20190915193158j:plain


しかも15階となかなかの高さなので眺めが良いですよね。こんな眺めを見ながら仕事したら捗りそうです。
f:id:sigma1425:20190915193240j:plain:w450

step2

 step2では仮想環境にLAMP環境を構築しました。はい、ここからちょっと怪しいです。LAMP環境ってあれでしょ?MySQLとかでしょ?知ってる知ってる(汗)ぐらいの知識なんで。それでもなんとかがんばりました。何やってるかは何となくわかるけど...うーん...って感じです。
 step2が終わったあたりで普段使わない頭をずっとフル回転してたのでだいぶ疲れでヘロヘロになってましたね。

step3

 step3ではstep2で構築したLAMP環境のMySQLをDockerコンテナに置き換えました。このコマンド打ってー、こうしてー、ってただPCを弄るだけではなくホワイトボードをつかっての説明も交えて教えてくれましたのですごくわかりやすかったです。なんとなくDockerというものがわかった気はします。ただほとんど知識ゼロからのスタートですので、わかってないことの方が多いです。これから頑張って勉強して行こうと思います。

懇親会

 ハンズオンが終わり懇親会です。ピザを食べ酒を飲みつつ楽しい時間を過ごさせていただきました。
...嘘です。僕は未成年なんでもちろん酒じゃなくてジュースですよ?楽しかったのは本当ですし、為になるお話をたくさん聞くことができました。

振り返り

 このハンズオンでは僕が知らなかった知識をたくさん吸収できましたし、懇親会でも今後に活かせそうな為になる話をたくさん聞くことができました。約5時間と長いようで短かった時間をとても有意義に過ごすことができ、東京に来てよかったなーと思います。今回学んだ知識を活かし、もっと勉強してもっともっと色々な知識を吸収していきたいです。

 ここまで読んでくれた方、ありがとうございました。東京3日目4日目はまた次に書こうと思います。