マイクロマウス関西地区大会(観戦)
タイトルの通り関西地区大会の観戦に行ってきました。例によって観戦のみです。
前日の試走会では懇親会もあったりと、マイクロマウスに関係なくとも楽しめる良い会だったかと思います。マウスやってたほうが話に入り込めるんだろうなあと疎外感を覚えなくもないですが仕方ありませんね。
ところで一部の方にはお見せしたのですが、実は去年のこの時期には既に新トレーサーのハードだけはほぼできていたりしました。
が、LCDが壊れたりそもそもLCDが邪魔だとか他にも今になって見返してみると気に入らない点が出てきていたりします。また製作時のミスでプログラムを書くだけではまともに走れず、今の大学の設備では修正できないこともあり、あまりこの機体に対するモチベーションが高くないという問題点があったりします…
AtCoderに参加してみた
相変わらず久しぶり更新。ネタが無い
AtCoderなる、日本語のプログラミングコンテストを以前からTwitterで見かけていたので参加してみました。今回が第2回コンテストでしたが、第1回はサーバーダウンだったため実質1回目です。
指定の形式の標準入出力に則ってソースコード(言語いろいろ)を書き、それを送信するとサーバーが実行して採点、という感じです。
結果は下の通り。
- 問題A 5:36
- 問題B WA(Wrong Answer)
- 問題C 1:34:12(時間切れ)
- 問題D 手付かず
すべてC++です。提出時に言語選択を間違えてひたすらCompilation Errorになってたりとかしました。C/C++の標準ライブラリを使う習慣がほとんど無い上に文字列や日時を扱うことも殆ど無かったせいか、この手の問題は苦手ですね。コーディング時間に思いっきり影響してます。
もっとお手軽に文字列とか処理したい...
※追記(5/6)
以下ソースコードへのリンク。色々ひどい
A: http://arc002.contest.atcoder.jp/submissions/7035 GO FOR IT用のメンバ関数からコピペ
B: http://arc002.contest.atcoder.jp/submissions/9151 time.hとか使ったことない
C: http://arc002.contest.atcoder.jp/submissions/9157 何故置換しなかったのか
コマンドライン引数
もはやマイコンからも離れた記事を書いてみるテスト。
ライブラリにやらせてしまえ
コマンドライン引数ありますよね。端末からプログラムを実行するときにつけるヤツ。ls -laとか、sleep 10とか。当然ながらC/C++では
int main(int argc, char** argv)
と書くだけで引数を簡単に取得できるわけですが、これをそこらのソフトのようにオプションを使えるようにして、オプションにも引数を付けて、と考え始めると途端に実装が面倒になります。
そこで何かライブラリがないかと探していたところ、C++ではboostにprogram_optionsというそのものズバリなものがありました。基本的にadd_options()を使ってオプション名と引数の型を指定するだけで、引数処理をしてくれます。
また、C言語ではgetoptというものがあるようです。
実行例
ヘルプ表示がお手軽なのが特に素晴らしいと思います。
$ ./program_options -h Allowed options: --int arg intオプション --char arg (=a) charオプション --string arg stringオプション --vector arg vectorオプション -h [ --help ] show help
この使い方以外にも、設定ファイルからの読み取り結果と組み合わせたり、cpコマンドのような順序が重要だったりオプション文字列の無い引数を扱うこともできます。詳しくはboostのドキュメントを参照するなりググるなりしてください。
サンプルコード
https://gist.github.com/1893249
コンパイル
コンパイル時(、というかリンク時?)に、-lboost_program_optionsを指定してやります。環境毎の手順は適当に調べてください。
ドキュメンテーションとバージョン管理と
今年最後のアウトプットということで、マウス合宿をもとに最近便利だったツールを幾つか紹介します。各ツールの使い方は適当にググッてください(雑)。
ドキュメンテーション
昔書いたソースコードを読みなおすのは意外にしんどいものです。こんな時にこそ、きちんとコメントを書くことの重要性を認識するのですが、具体的にどうすればよいかというと、よくわからなかったりします。
そこでDoxygenというツールを利用することを考えます。何かというと、ソースコードを解析することで、コメントからプログラムに関するドキュメントを生成するツールです。
具体的な作業としては、Javadocなどの書式に則ってコメントを書いていくことで、各関数の説明を記述していくだけです。
/** 関数の説明. * @note これはサンプルです * @param[out] a 出力引数の説明 * @param[in] b 入力引数の説明 * @return 戻り値の説明 * @see related_function() * @todo ToDo */ type function(type a, type b);
実際にはドキュメント化しないとしても、書式が固定されるためコメントを書きやすくなるのが利点だと思います。コメントをきちんと書いておくことは後からソースコードを読む際に重要ですし。
実際どんな感じになるのかは、例としてMRPT(私が研究で使っている、移動ロボット向けライブラリ)のドキュメントなどを見てもらうといいと思います。クラスの依存関係を図示したり、関数の引数にまで説明を加えることができます。
私に近いところでの用途だと、例えばサークル内でソースコードを共有するといった際に便利そうです。コメントの書き方が統一されますから。もちろん個人で使う分にも十分に便利でしょう。
バージョン管理
なにか大きな更新をするたびにプログラムをフォルダごとコピーし、「安定版」だの「大会用」だの、挙句「安定版2」「最新版1」とかなってしまっていませんか。こうなるともうどれが正しいプログラムかわかりません。これは困ります。
そんなときに便利なのがバージョン管理ツールです。「コミット」という作業をすることで更新を記録し、いつでも前の版に戻ったり、差分を確認することができます。
バージョン管理ツールとしてはSubversionとGitが有名で、マウス合宿ではTortoiseSVNというSubversionクライアントが紹介されていました。が、私はGitを使っています。単に研究室のファイルサーバーにインストールされていただけという理由なので、どちらか好きな方を使えばいいと思います。
ソースコードの管理だけでなく、PCで使用するファイルなら何にでも使えると思います。差分確認は無理かもしれませんし、リポジトリ(管理場所)の容量がひどい事になるかもしれませんが。
マイクロマウス合宿
なんとか1週間以内の更新。
マイクロマウス合宿に参加してきました。
当日の様子は関西支部のページを見てもらうとして、1日目はマウサーの方によるマウス講座と、夜には飲み会となりました。
特にKさんの発表では、ソフトウェア開発について非常に良い話を聞くことができました。 システムのブラックボックス化などは、やろうとは思っても具体的にどうしていいかわからず放置していた部分でしたし、「攻めと守り」の考え方はこれまでに随分と欠けていた考え方でした。
自分の場合、毎年のように新規設計をして大幅にハード構成が変わり、それに対応するプログラムで手一杯になっていた感じがありました。それでも、すぐにデバッグ出来る環境があったので何とか走るものになっていたのだと思います。今年から、そういった環境が一切なくなったことで守りの要素が欠けているのが露呈したのだろうな、と感じました。
2日目のプチ大会。自分はマウスを作ったこともなく、当然のことながら自分のマウスを持っていません。そこで、株式会社アールティ様から用意していただいたレンタルマウスで大会に参加しました。
ノートPCのOS入れ替えの後に開発環境を全く触っておらず、ドライバ類が足りないなどのトラブルがありましたが、非常に簡単なパラメータ調整のみで完走することができました。プログラムも用意されたものですが、やはり実際にロボットが動くのは楽しいものです。
合宿の少し前あたりからマウスやりたい欲が高まってきていますが、さてどうしましょうかね。
マイクロマウス関西地区大会
観戦しただけなんですけどね。マウス作ったことないですし。
会場の京都まで電車で一時間ちょっとと、そこそこ近いこともあり関西地区大会を見学してきました。
中部地区以外の地区大会に行くのは初めてなんですが、なんというか中部地区大会って地区大会じゃないよなあと改めて思いました。また、マウスも作ってみたくなったりしましたがトレーサーがおろそかになるのは…
ブログ記事が全く更新されないのと同じようにトレーサーにも全く触れていなかったのですが、走り回るマウスや参加者の皆さんを見ていて作業を再開する気がわいてきました。とはいえ、本格的に動けるのは9月以降になりそうな気がしていますが。走らせる環境がないのもつらいところです。
つまり、今年も初級者大会には出れなさそうです。
Nokia5110
引っ越してからアレコレと物を揃えたりしていて作業環境を後回しにしている今日この頃です。
そろそろ何も作業していないのもどうかと思ってきたので、以前購入したsparkfunのNokia5110 LCDボードを動かしてみました。モノクロのグラフィックLCDで、SPIで接続できます。
マイコンボードはSTBee Mini。全然使っていないマイコンでいきなりSPIなんて使えないので、通信部分をGPIOで実装してコマンド類はsparkfunの商品ページにあるサンプルコードを移植。ほとんどデータシート読んでません。
ジャンパワイヤが切れかかっていて画像にノイズが乗るというアクシデントがありましたが無事動作しました。
これがトレーサーに載ると思うと楽しみです。内部の状態がわかりやすいですし。