どらめも

なんでもないことをかきます

Fixstarsインターン参加記

事務的なこととか概要

この夏に3週間ほどフィックスターズさんで機会があり、インターンシップに参加させていただきました。私は組み込みOS入門というテーマで横浜オフィスでインターンシップに参加しました。(本社は大崎です。)ちなみに横浜勤務は10数名いた同期の中で私一人でした。(ええっ...)大崎オフィスでは知り合い同士が隣同士とかもあったみたいでウラヤマ〜でした。他のタームには横浜勤務の人もいたらしいので少し残念でした。インターンシップの概要についてはそんな感じです。

参加するまでの流れ

OSとかに興味があってそういうのやってそうなインターンないかなーと例のスプレットシートみてたら発見したので募集始まったらすぐさま応募しました。(AtCoderjobsに水色とか書いてあったので緑だった私は普通に応募しました)すると、面接しましょうのメールが来たので面接と、ライブコーディングの試験をして通過という感じです。インターンの面接はほとんどしたことがなかったのですが、雰囲気も良く話しやすい感じでした。

インターンシップの内容

私の行ったことは特に業務機密に関わるようなことでもなく、メンターの方から許可をいただけたので書いています。横浜オフィスは業務の契約上開発に直接触るような人のみの部屋を設ける必要があるらしく、事務やインターン、アルバイトの人は部屋が分かれていました。(残念)そのため、直接疑問点などを聞くというよりは、slackで質問を投げたりgitlabでレビューしてもらったりするのが中心でインターンシップを行なっていました。私個人的には集中しやすくて良い環境だったと思いました。レスのスピードも十分早かったです。 そんな中で具体的な話をしたいと思います。私がしていたのはbeagleboneとよばれるハードの強いラズパイのようなものにQNXと呼ばれる組み込み向けOSを搭載し、そこにカメラを接続し、そのカメラのドライバのようなプログラムを書いたりすることでした。 実際企業に貢献するようなことは何もしていません()

QNXについて

まず最初に私の扱ったQNXやその内部の仕組みについて説明しておきます。QNXときいて馴染みがあった人はすごいのでぜひ組み込み界隈で頑張ってください。私は知りませんでした。気になる人はwikipediaとか(https://ja.wikipedia.org/wiki/QNX)で詳しく調べてみてもらえると幸いです、簡単にいうと組み込み向けのリアルタイムOSです。ライセンスが必要ですが、学生ライセンスがあるみたいな話も聞きました。特徴としてマイクロカーネルOSと呼ばれる仕組みを採用していて、OSの機能が小さく、OSの機能だったものがそれぞれ小さなタスクとして独立に動いています。(下記の図を参照)そのため、例えばDevice Driverに変更を加えたい、となった場合OS全体に変更を加える必要がなく、あくまでDevice Driverのみに変更を加えれば良いので保守性なども高いと言えます。

f:id:doradorasuki:20190911194437p:plain
wikipediaより引用
そして、この仕組みを制御しているのがQNXではリソースマネージャという仕組みです。これについて少し説明します。
リソースマネージャというのはデータの受け渡しを制御するサーバープログラムのことでこれを用いるとディレクトリに仮想の設定フォルダ的なものを出現させてそこに命令を送ることで様々な動作をさせることが可能です。例として私のやったことでいうと、

cat /dev/Camera/satsuei >sample.jpg  

でカメラを用いて写真を撮れるようにし、

echo 1600X1200 > /dev/Camera/kaizoudo   

でカメラの解像度を変更できるようにしました。リソースマネージャを駆使することで、システム内のread,write命令などによって様々な動作が可能になります。QNXでは通常のファイルシステムなどもこの仕組みによって構築されているそうです。

f:id:doradorasuki:20190911200615p:plain
リソースマネージャについて

実際にやったこと

・ドキュメントを読んだ
・接続したカメラと頑張ってデータの受け渡しをした
・リソースマネージャの実装とその応用
簡単に書くとこの3つに私の3週間は集約されます。まず初めにドキュメントについてですが、QNXというOSには基本的にドキュメント以外に参照できるものが存在しません。日本語の記事は当然ながらほとんどないですし(Qiitaの記事は1人の人が少し書いた2件のみ...)英語の記事も全然ないです。そのため基本的にドキュメントと戦うかどうしようもなくなったらメンターの人に聞いてみるかどちらかしかないです。Qiitaとかはてブしか日常的に読んでいなかった私にとってこのことはとても辛く、かなり時間のかかる作業でした。話に聞くところによると企業の人はどうしようもなくなったら契約してるQNXサポートに聞くので問題ないらしいです。(ええ...)カメラのユーザーガイドなんかも初めて読みました。次にカメラとの接続に関してですが、spiやi2cとよばれるシリアル通信の規格を用いてデータの受け渡しを行いました。実際のコーディングについてですが、もちろんpythonとかでimportするだけで終わる話じゃないのでデータの通信を行うべきレジスタを指定したり、タイミングチャート読んだり、データの読み飛ばしをしたりと普段は意識しないことをたくさんしました。ポインタ辛いよ〜とか言っている場合じゃないくらいポインタを多用したのでふえええってなってました。最後にリソースマネージャの実装ですがこれもドキュメントとの格闘でした。リソースマネージャはある程度決まった仕組みなので仕組みの上に乗る感じで謎の関数などを使うわけなのですが、それについての情報などがドキュメント上でかなり分散していてふえええってなってました。(n回目)しかも動かないくせにコンパイルはすぐ通るのでデバッグが大変でした。あとドキュメントに乗ってない情報もあり、ヘッダファイルを読みにいったりもしました。ドキュメント読んで実装するってとても難しいですね。そして最後に残った時間で解像度のコマンドの実装やtcp通信を使った写真データの受け渡しの実装などをしました。

感想

今回コードを書いていく中でメンターの方から大量のコードレビューをいただきました。今回の実装は全てCで行ったのですが、エラー処理をはじめとした、実装方法などのレビューを大量にいただき、すごく勉強になりました。(職場の方に聞くとそのメンターの方は特に厳しい方だったそう)プログラミングをしていてこんなに自分のコードに対して指摘を受けたのは初めてだったのですごく新鮮でかつありがたかったです。(大学の実習などは基本的に動けば何も言われないので)これからは日常的に指摘されたことなどを注意していきたいと思いました。あとは日常的にドキュメントとかもっと読もうと感じました。
あとハードウェアを扱う上でのデバッグの難しさも感じました。いつもは基本ターミナルが全てなのでデバッグもまあまあという感じですが(ほんまか)、今回の場合プログラムはもちろんのことハードウェアの繋ぎミスやQNXとしては関数が実装されていてもその関数がbeaglebone上では非対応であるために動かないということなどがありました。その場合はもうどうしようもないので他の方法で書き直しました...ハードウェアを扱うって難しいですね。
またオフィスについてですが、作業環境は16gメモリのubuntuデュアルディスプレイでライセンス的にokなら好きに環境構築していいって感じだったのでとても作業しやすい環境でした。先ほどにも触れましたが、コミュニケーションツールもslackとgitlabが基本で扱いやすかったです。あと個人的に好きだったのが10円でドリンクが飲めるところでした。コーヒーだけじゃなくココアとかジュースとかもあって嬉しかったです。

最後に

今回のインターンシップは業務に触れるという感じではありませんでしたが、色々と学びも多くとても良いインターンシップでした。フィックスターズ社にはとても感謝しています。ありがとうございました!
また、私の参加したものは横浜でしかも組み込みに関するもので結構フィックスターズでも特殊なインターンシップだと思うので、高速化とかに興味あるよって人は是非他の人の体験記なども読むのもいいと思います。

enjapma.hatenablog.com

ysugiyama.hatenablog.com

ここまで読んでくださり、ありがとうございました。