年末の振り返り
どうもみなさまこんばんは、はとバスです。
今私は川崎にある友人宅でRAIZINと無人島生活をローテーションしながら、紅白で椎名林檎とユーミンを見ていたら堀口がベラトールの首を取っていたのを見逃してしまい身悶えしています。
なんかみんな年末の振り返りをしているので、かるーく振り返ります。
インターン関連
春と夏の二回行きました。
春はネオス株式会社さんにお邪魔させて頂き、機械学習系のインターンに参加。
夏は株式会社リクルートさんにお邪魔させていただきました、こちらはGolangによるサーバーサイドのインターンに参加しました。
最近年収が一つの単位になった方に「安定の飯インターン」と言われましたが、それ以外にもGolangの大量の知見を得られ、今に至っています。
技術力の低い私をインターンに受け入れていただいた関係者の方々には厚くお礼を申し上げます。
今後の学生生活の中で幅広く使えるような様々な知識を学ぶことができ、最高のインターンでした!
賞を受賞
夏に作った農業とITを繋げるシステム、「SmartAgri」というシステムがあります。
ビニールハウスや農場にESP32で作成したデバイスを設置、温度や湿度をサーバーに送り、AmazonのAlexaを使い情報を取得できるようなシステムです。
の3つのOSSによってこのシステムは動いています。
サーバーとスキルは全てGolangで作成、これも夏インターンで学んだことの復習も兼ねて作成したものでした。
この度、私と農家の方、そして会津にあるIT企業の方の三人で作成したシステムが
というとても栄誉のある2つの賞をいただける運びとなりました。
ICTスタートアップ支援センター | 会津産IT技術認定会議 〜 募集案内 | NICT-情報通信研究機構
一年生の時からずっとtwitterなどに投稿してきた謎の電子工作の花が開いた瞬間かなと思います。
自分の作ったシステムを実際に農家の方に使って頂き「今までのスマホアプリやデバイスにはない利便性」「無限の可能性を感じる」などのお言葉を頂き、とても嬉しかったですし、自分の持てる力をもってして、農家の方々の問題を解決することができるということを知れ、とても有意義なものとなりました。
もう少し細かく知りたい場合は公式サイトがありますのでこちらをどうぞ。
色々なものを考えるのが増えた
いよいよ大学三年生にもなり、必然的に考え事や思うことが多くなりました。
後輩や自分の進退について考える1年になったかなと思います。
自分の進退
自分の進退としては、学部で就職することを決めました。
自分は進学したいという気持ちがやまやまですが、親の意向 「それ以上勉強して何になるんだというジジババのコメント」 シンプルにお金がない! も相まって就職という形を取らせていただきました。
どうしてももっと勉強したいという気持ちがあるならば、そういうサポートをしていただけるような企業に入り、大学院のほうで勉強しながら働くという道もありますし、自分で勉強ということもできます。
幸いにも、就活の方でいくつかの内定を頂くことができたので最悪の結果は避けられるかなと言う感じです。
個人的には大学で計算機科学を学ぶことができたので、この時代のIT企業のトップクラスのGoogleとかをダメ元で受けてみようかなと思います。
あとGSoCに応募もしたいです。
後輩
後輩のことについては、一年生と一緒に行ったハッカソンが大きいです。
今年の夏の石巻ハッカソンで、今年はマヤミトくんと一ノ瀬くんとで参加しました。
一ノ瀬くんは去年も一緒に参戦した現役高校生です。一方で大学に入ったばかりのマヤミトくんは今回でハッカソン初参戦という感じでした。
ここでなんとマヤミトくんが所属していたチームが「ヤバイで賞」を受賞、彼自身初めてのハッカソンで、それも技術的に素晴らしいと認められての入賞です。お知り合いのフィッシュさんとの一緒のチームでの受賞でした。
この後のマヤミトくんは外部のLTへの登壇や勉強会への参加というように、怒涛の勢いで成長をしています。
彼のこのような成長や行動を見ていると
「やっぱりハッカソンに連れてきてよかったな」
と心の底から思うことができました。
このような経験や体験により「後輩のためになるような行動をしよう」「後輩に憧れられるような先輩になろう」という気持ちが生まれました。
来年入ってくる学生や、今いる学生の模範となるようなことや、後輩などのサポートをしていけたらなと思います。
改めて 来年の目標
- 後輩のためになるようなことをする
- GSoCに応募
- 日々のアウトプットも忘れない
この3つを念頭に置いて行きていきたいと思います。
最後に
最近Thinkpadを買いました。お金が無いけど頑張って働きます。
Thinkpad買ったわ https://t.co/H0LOuc8vbq
— 飛ばすはとバス (@flying_hato_bus) December 26, 2018
それでは、良いお年を。
AzureのFace APIを使って提供目を自動生成
本日の記事はAizu Advent Calendarの15日目の記事になっています。
- 14日目 うじまるくん
- 15日目 たくぼくくん
記事を書いてほしい問題
このアドベントカレンダーを作ったのは僕なんですが
みなさん
記事書いてなさすぎじゃないですか!?!?!?!???
この問題割と深刻で、半数近くの人がきちんと書いてないです。
ちゃんと
書いて
本題
最初に飛ばしまくりまくりましたがどうもこんにちは、はとバスです。
この画像見飽きましたよね、これ以上は使わないので勘弁してください。
こんにちは、はとバス(twitter: @flying_hato_bus)と申します。
普段僕は意味のわからないツイートをする傍ら、朝と昼と夜にご飯を食べたり、赤べこの首を振らせたりしています。 普段はGolangやPythonを使ってサーバーの作成や、研究として機械学習をやったりしています。
赤べこの首を振らせる以外にも、ビニールハウス内の情報をセンサーで取得してAlexaスキルで取ってこれるようなもので新聞社から賞を頂いたりしています。
会津大で出会ったヘドバン赤べこ pic.twitter.com/SkwdDcDu5b
— 池澤あやか / いけあや (@ikeay) 2017年12月17日
提供目について
みなさん、"提供目"ってご存知でしょうか?
提供目とはアニメやドラマなどがCMに入る際、アイキャッチと共に表示される『提 供』の文字が人物の目と被っている現象を指す。
提供目というのは、上にもあるように、色々なシチュエーションと出来事が重なり、目の部分に「提供」の文字が重なるということです。
例です
今回はこのように、目の部分にちょうど「提供」の文字が覆いかぶさるような画像を生成してくれるくんを作りました。
使い方
使い方ですが、必要なのはGolangの実行環境とAzureのFaceAPIキー。Golangのインストールは各自の課題だとして、Azure FaceAPIの有効化について説明します。
Azure FaceAPIの有効化
まず必要なのはAzureのアカウント登録、みなさんが持っているメールアドレスで登録できるので登録しちゃいましょう。ちなみに、今メールアドレスを登録すると20000円分のクレジットが付いてくるので、これを使って有料のプランも自分のおサイフを痛めないで使用することができます。
次にFaceAPIの有効化、アカウント登録した後にAzureのポータルで有効化できます。
AI + machinelearning
をクリックして、Face
を選びます。
必要な情報を色々入れればデプロイが開始されます。デプロイが終わると、FaceAPIが使えるようになります。
ここでサブスクリプションキーが生成されているので、FaceAPIのコンソールからKey
をクリックし、サブスクリプションキーを確認します。このキーが後々必要になります。
githubからレポジトリを持ってくる
go getを使おう
コードの方はgithubで管理しているんですが、git clone
で持ってくるよりはgo get
で取得してくる方を推奨しています。
理由なんですが、git clone
は、任意の場所にレポジトリを持ってくることができる一方でgo get
ではある程度決まった位置にレポジトリを持ってくるという性質からです。
go get
をしてレポジトリを持ってきたときには、よっぽどで無い限り
GOPATH/src/github.com/hatobus/Teikyo
に僕のレポジトリがクローンされてきます。git clone
では、任意の場所にクローンされるので、画像までのパスなどを解決する必要になります。go get
を使えば一定の場所にインストールされるのでその心配はいらず、パスの設定などをせずにそのままで動かすことができます。
.envファイルの設定
クローンしてきたファイルの中には.env.sample
というファイルがあると思います。これはサブスクリプションキーなどを管理するためのファイルで、このファイルを.env
というファイル名でコピーして、その中に先ほど取得したサブスクリプションキーを記載していきます。
URL= KEY1= KEY2=
ファイルの中身はこのようになっていますが、KEY1,2には、さきほど取得したサブスクリプションキーを入れます、URLはリソースを作成した場所で微妙に違いますが以下のようにすればいいでしょう。
URL=https://[location].api.cognitive.microsoft.com/face/v1.0/ KEY1=XXXXXXXXXXXXXXXXXXXX KEY2=YYYYYYYYYYYYYYYYYYYY
実際に動かしてみる
.envファイルを書き終えればとりあえずできるはずです。
go run server.go
で動かしてみましょう。何もなければサーバーがlocalhostの8080番ポートで動いてくれるはずです。
もし8080が別プロセスなどで使用されているときには、server.goの r.Run(":8080")
の部分を任意のポートに置き換えてください。
ポートが使われているかどうかを調べるには
lsof -i:[ポート番号]
で調べられます。
きちんと動いたことを確認してから、リクエストを投げます。リクエストの例です。
curl http://localhost:8080/detect -F "upload[]=@/path/to/picture1.jpg" -F "upload[]=@/path/to/picture2.jpg" -H "multipart/form-data"
このAPIでは複数の画像に対応するためにヘッダをmultipart/form-data
で処理をしています。(このためにちょっとしためんどくさいことになったりしたけど)また、jpeg画像でなければ弾かれてしまうので注意。
処理がきちんとされればpicture/output/output[n].png
に画像が生成されています。
プログラムの解説
ここからは今回のプログラムを解説していきます。とは言っても本当に必要な部分のみになりますが。
画像フォーマットを取得する
画像のフォーマットはjpegのみを受け付けている、ファイルの終わりが.jpg
になっているかなどで考えてもいいが、これだと.png
ファイルの拡張子だけを.jpg
に変更しただけのファイルなどの場合に死んだりする。ちゃんとやるときには、ファイルのバイナリを解析したりするのが良いみたいですが、それをよしなにしてくれるのが image.DecodeConfig
。
image.DecodeConfigは写真のカラータイプ、フォーマットを返すメソッド。これを使えば画像がjpeg
なのか、またはそれ以外のフォーマットなのかがわかります。
f, err := file.Open() defer f.Close() // 一回DecodeConfigでファイルをいじるとファイルが壊れるために // 別のbufにコピーをして回避しておく io.Copy(b, f) _, format, err := image.DecodeConfig(b) if err != nil { errch[file.Filename] = err.Error() b.Reset() break } else if format != "jpeg" { errch[file.Filename] = "Filetype must be jpeg" b.Reset() break }
画像のフォーマットを取得する部分はここ。ちなみになぜ別のbufにコピーをしているかと言うと、image.DecodeConfigの内部実装にファイルを読み込む部分があるため。一回ファイルが読み込まれているので、あとでファイルの中身を扱おうとした時にEOF error
で落ちてしまう。そのために一度バッファにコピーしておくことでそれを回避しています。
画像をデコードする
FaceAPIに画像を投げるときには、画像をデコードしないといけない、そのためにデコードする処理を挟む。
buf := new(bytes.Buffer) // どうやらファイルの先頭までシークをしなければいけなかったっぽい // https://stackoverflow.com/questions/32193395/golang-io-reader-issue-with-jpeg-decode-returning-eof fstream.Seek(0, 0) img, err := jpeg.Decode(fstream) if err != nil { // シークしないとunexpected EOFで落ちる return buf.Bytes(), err } if err = jpeg.Encode(buf, img, nil); err != nil { return buf.Bytes(), err }
ファイルのシーク操作ですが、画像のデータをバッファにコピーした時に、先頭の位置からずれるようです。 そのために、Seek関数を用いてファイルの先頭まで持ってきます。
提供をかぶせる部分の座標を作成
Face APIのレスポンスには、顔のパーツの座標を返してきます。目、口、鼻のみならず、眉などの情報を持っています。 Golangは構造体を定義し、それを元にjsonをパースします。返ってくる情報は膨大な量があるのですが、本当に必要な情報だけに変換する処理を噛ませています。
func (fp FaceParts) ToLandmark() *Landmark { LM := &Landmark{} LM.EyeRight.TopX = fp.FaceLandmarks.EyebrowRightInner.X LM.EyeRight.TopY = fp.FaceLandmarks.EyebrowRightInner.Y LM.EyeRight.BottomX = fp.FaceLandmarks.EyebrowRightOuter.X LM.EyeRight.BottomY = fp.FaceLandmarks.EyeRightBottom.Y LM.EyeLeft.TopX = fp.FaceLandmarks.EyebrowLeftOuter.X LM.EyeLeft.TopY = fp.FaceLandmarks.EyebrowLeftOuter.Y LM.EyeLeft.BottomX = fp.FaceLandmarks.EyebrowLeftInner.X LM.EyeLeft.BottomY = fp.FaceLandmarks.EyeLeftBottom.Y return LM }
見て分かると思うんですが、実は提供の字をかぶせているのは眉の情報を元にしています。 これから説明していくんですが、文字だけではわかりづらいと思うので
千鳥のノブで説明します。
まず、やりたいこととしてはこういうことにしたい。 目の上にいい感じに乗せてあげたいです。
しかし、Face APIは賢いんで、目に関してはこんな感じで情報を返してきます。
賢すぎるんじゃあ!!!!!
このまま提供を重ねてしまうと、
まあ、うん... 間違いとは言えないけどちょっと違うよね... もっとこう... 目の全体を覆うように...
どうしようかと思った時に、返ってくるのは目の情報だけではないことに気づきました。
そう、眉の情報も使えば良い
こう考えれば良いんです。
そういうわけで
提の字の始まり(左上の点) = (左眉の外側の点, 左眉の一番低い点) 提の時の終わり(右下の点) = (左目の内側の点, 左目の一番下の点) 供の字の始まり(左上の点) = (右眉の内側の点, 右眉の一番低い点) 供の時の終わり(右下の点) = (右目の外側の点, 右目の一番下の点)
という4つの点で「提供」の字をかぶせています。
図で示すとこんな感じ
さらにこれで画像を書き出すとこんな感じになります。
アルゴリズム的にはこんな感じで目のところにかぶせているというものでした。
最後に
これを作ったのが今週の頭くらいで、「作ったよ〜」みたいなノリでtwitterにあげてみました。
提供目を自動生成するツールを作りました。https://t.co/DUljb7HVIP pic.twitter.com/fRIJpKeGcg
— 飛ばすはとバス (@flying_hato_bus) 2018年12月10日
ちょっとバズった。
中には僕のガバガバ英文がお気に召してくれた方がおり
ウケる。“"提供目"(Teikyo-me) is japanese traditional funny picture for TV captured things.” / “GitHub - hatobus/Teikyo” https://t.co/oWx1DdVLrk
— uenot (@braitom) 2018年12月12日
みんなの心温めるコンテンツレーベルになれたかなと思います。
ちなみにこれのライセンスは SUSHI-WARE なので、何か使いたいときがあれば僕に寿司をおごってください。
参考にさせていただいたサイト
画像をリサイズする
[http://dempatow.hatenablog.com/entry/2016/11/17/画像をリサイズしてDBへ保存する/golang:embed:cite]
Seekしないと落ちる問題
デコードした後にファイルがぶっ壊れる問題
以上です、悪ふざけにお付き合い頂きありがとうございました。
go-xormを使ってスキーマからstructの自動生成
Golangは静的型付け言語なのでjsonをパースするときとかにはけっこう骨が折れる。
何行もstructを書かなくてはいけないのは結構めんどくさくて、JSON-to-Goとかでjson用のstructを自動生成して書きがち。
DBとかのスキーマも同じで、structの後ろの属性等で色々と設定しなくてはいけないことが多々ある。
別に 俺は全部手書きでやってやらあ!!! という人はいいんですが、僕はめんどくさがり屋なので色々と自動生成してくれる君を使うことが多い。
今回は、そのようなスキーマからstructを自動生成してくれるものの使い方を自分のメモ代わりに書く。
使うもの
go-xormのコマンドラインツールを使う。
xormはGolangのORMモデルの一つで、エウレカさんが作った、マッチングアプリのペアーズなどでも実際に使われているある程度メジャーなもの。
今回はコマンドラインツールの方を使う。
インストール
$ go get github.com/go-xorm/cmd/xorm
これで基本はOK。
もし以前にgo-xormを入れていて、
cannot use "github.com/go-xorm/cmd/xorm/vendor/github.com/go-xorm/core".LOG_UNKNOWN (type "github.com/go-xorm/cmd/xorm/vendor/github.com/go-xorm/core".LogLevel) as type "github.com/go-xorm/core".LogLevel in argument to engine.Logger().SetLevel
みたいなエラーが出た際には、
cmd/xorm/vendor/github.com/go-xorm/
を消して、またインストールしなおせば行けるはず。
入ったら後はやるだけ。
なお、対応しているDBは
の5種類のみ、個人的に使っているのはmysqlのみなのでいいかなという感じ。
実際に使う。
使う際にはテンプレートファイルをコピーしてくる。
プロジェクトルートとかで
$ cp -r $GOPATH/src/github.com/go-xorm/cmd/xorm/templates/goxorm/ ./xorm-template
上記のコマンドを打ち、テンプレートファイルを手元に持ってくる。
テンプレートファイルから自動生成してくれるっぽい。
mysqlでの例
mysqlをローカルホストの3306で動かしていて、ユーザー名 root
パスワードpassword
にしている時に、hogedbのスキーマのモデルを得るは以下のようにする。
xorm reverse mysql "root:password@tcp(localhost:3306)/hogedb" xorm-template
これでディレクトリ直下に models/hogedb.go
というファイルが生成されているはず。
リクルートさんのインターンシップに参加してきて圧倒的成長をしたのか?という話
こんにちは、はとバスです。
学部三年生でみんながインターンインターン!と言っていて「今年こそは企業のインターンに行って名実ともに最強のプログラマーになるぞ!」と言う意気込みでインターンのESを書いていました。
今回はその中で実際に行くことになった株式会社リクルートさんのインターンについてお話をしようと思います。
行くきっかけ
上の方で 今年こそは企業のインターンに行って名実ともに最強のプログラマーになるぞ!とかほざいていましたが、 大体のインターンでお祈りを食らってました。
仲のいい友人たちがインターンに決まっているところを見て、日に日に貯まるお祈りメールの山を見てとても焦っていました。
しかし、その中で「ぜひともこの夏のインターンに参加して、私達と一緒にプロダクトを作って欲しい」と言われたときにはとても嬉しかったですし、とてもモチベーションのアップになりました。
その企業さんこそが、今回のインターンシップを受け入れてくれた、株式会社リクルートさんでした。
それはそうとこれは銀座の中華料理店で食べた小籠包です。
実際に参加するまで
コーディングテスト
応募する時にしたのはコーディングテストと面談が2,3回。
コーディングテストはSQL、プログラミングのいろいろな知識、数学的知識など色々聞かれましたがAPIしか叩けませんでした。
面談
面談の方ですが、最初は大学での生活や普段しているプログラミングの内容を聞かれたり、今回どこらへんのタームで参加できるかの旨を聞かれました。
面談らしい面談です。一般人を装いながら面談をすればだいたい通るはずです。(ほんとか?)
最初の面談はある程度人間性を兼ね備えた人間ならば通ると思います。
鬼門は最終面談。
サービスを新たに作るとして、そのサービスに必要なものを全て列挙、またそれを使ってどういう流れでサービスが提供されるか
という実務経験やそれなりにしっかりと勉強をしていないと速攻で詰む問題だと思いました。
応募する時にマイケルさん@mic_psmが「エントリーシートに僕の名前書いていいよ」と言ってくださり、しっかりと記名。
面談のときなどにマイケルさんの名前に何度か助けられた部分もありました。
最終結果が出るのは7月下旬から8月上旬にかけて、僕は大学の授業の真っ只中である7月下旬の論理回路の授業中に決定の連絡が来ました。
いろいろな会社と面談をして、来るメールがお祈りメールばかりで自己肯定感のNASAというところでこの決定の連絡が来たので本当に嬉しかった。
それはそうと、これは銀座で食べた海鮮丼です。
実際にインターンに参加するまで
実際にインターンに行くのは9/3から。
その前に、メンターさんたちと実際に会って面談をしました。内容的にはインターン内容について。
インターン内容はある程度エントリーシートには書いていましたが、この面談で実際の内容を決めました。
実際に会って話をしないと何がしたいのか分からないしね。しょうがないよね。
エントリーシートには「サーバーサイドに関することをしたい」という旨を書いていたので、インターンはサーバーサイドの内容をすることになりました。
コレ以外にもネイティブアプリなどの内容があったので、人それぞれやりたいことをやらせてくれる感じでした。
メンターさんたちと面談をしたのはヒューリック銀座7丁目ビル。
道行く車が黒塗りのAMGやレクサス(4桁万円)ばっかりで「コレが勝ち組か...」という感じです。業務する場所は人それぞれ、東京駅のサウスタワー、目黒、ここヒューリック銀座など人や業務によって様々。
それはそうと、これは銀座の蕎麦屋で食べたもりそばのカレーセットです。
インターン内容
インターン内容は NDA の NDA を NDA するためのツールの NDA に関する部分のサーバーサイドをGolangで実装しました。
詳しい内容はNDAなので言えないです。仕方ないね。
NDAに触れない部分を言うと、メンターさんたちがとてもすごかったことです。Golangの知識はHello Worldとのあくんのコードを「ワカラナイ...ワカラナイ...」と言いながら書いてただけの僕に対し、 何がわからないか、何を学ぶべきかということをしっかりと見つけ、それを達成するために最短でタスクを割り振ってくれたり、わからないところを教えてくれたりと、圧倒的な情報量とともに教えてくれていただきました。
それはそうと、これは亀戸で食べた亀戸ホルモンです。
社内の雰囲気について
社内にいるエンジニアの方は優秀な方が多い印象です。優秀な方が多くとも怖い人がいっぱいいるわけではなく、分からないことを気軽に聞けたり、自分がやりたいことをやらせてくれたりと和やかな雰囲気がありました。
リクルートさん独特の文化として よもやま というものがあります。
よもやま
よもやまとは「よもやま話」のことです。どうでもよいことを話す、他愛もない話という内容ですが、これをメンターさんと毎日しました。今日は何をしたか、今後何をするかなどを話ししていました。もちろん場所は自由で、オフィスでやる以外にも、近くのコーヒーショップでやったりもできます。また、週に一回人事の方ともよもやまをし、インターンの進捗やいろいろな話などをしていました。
自由な場所で自由な話をするというのは発想が生まれたり、何をしたかという確認ができてとても良かったです。
リクルートさんのエンジニアはけっこうな頻度でやっているらしく、直接関わりがない人などでもどんどんよもまやすることができます。その道で有名な人にコードレビューを頼むためによもやまを入れたり、どのように開発をするか聞くためによもやまを入れているそうです。
実際に、エンジニアの方々が集うよもやまにいくつか参加させていただきました。
Node.jsのコミッターである古川さん(Twitter)とのよもやまのときには、サロゲートペアの話をしていただいたりしたなど、一端の大学生ができないような体験もできました。
イベント
技術共有会
所属部署を問わず、エンジニアが自分の取り組みや技術的に困っていることについて気軽に、オープンに共有・相談出来る場として隔週で実施されている会です。 これまで各部のそれぞれで勉強会などを行ってきましたが、日常の仕事の文脈に関係ある・なしを問わず、エンジニアが自分の興味関心あるテーマについて自由闊達に語る/相談する/共有することで、エンジニア間の技術を介した関係性の構築や、最新の技術動向に対する組織としての感度や視座を高めることを目的としています。
技術共有会にも参加しました。また、一部のインターン生はこの中で実際にLTをし、僕も実際にこの場でLTしました。
LT以外にも、リクルートさんで働くトップのエンジニア数名の方に、インターン生が質問をぶつけることができ、インターン生からの質問にtakesakoさんやt_wadaさんがいろいろと答えていました。今後のエンジニアの形や、セキュリティの話などが
LTの内容ですが、技術共有会の前におりさのさんが話をしていた「文字」についてLTをしました。
https://speakerdeck.com/hatobus/unicodefalsean-huo-yong-fa-karasheng-cheng-made
リンクを踏むとLTのスライドが見られます。
インターン生LT会
技術共有会でのLT以外にも、インターン生とそのメンターさんのみでのLT会もありました。自動微分とかXRの話とか、自分が興味を持っている分野以外にも自分があまり触れたことのない技術の話も聞けてとても勉強になった気がします。人事の方が作った「パソコンチョットデキル」Tシャツももらえたりします。
リーナスみのあるTシャツをもらいましあ pic.twitter.com/GZf1N8NIcr
— 飛ばすはとバス (@flying_hato_bus) September 12, 2018
ちなみに、インターン生LT会にはお寿司が出ます。
インターン生について
インターンに参加した学生は自分を含めて10名、他の大学の人は某東京大学とか、某京都大学などの旧帝や筑波大学、関関同立の方などが多く、勉強では間違っても勝てないような人たちばかりでした。また、B3も僕を含め2,3人程度、他の方は総じて院生の方でした。最初に自己紹介をしたとき、自分がとんでもなく場違いなところに来たなあと感じました。実際のところ、インターン生はいろいろなところに散らばるので一緒に作業をしたりはしません、技術で殴ればいいんです。(殴るような技術もないけれど)
インターン生の方とは業務中に一緒に食事に行ったり、ホテルに泊まっている方とともに亀戸で餃子を食べたりといろいろなことができました。個性的な人たちが多く、やっていることが様々なので、いろいろな話を聞くことも勉強になりました。
ランチ
最高でした。毎日お昼が楽しみでした。
ここからはうじまるくんのツイートと、ご飯の写真をお楽しみください。
思い出した pic.twitter.com/pGsDFvx6AH
— うじまる🐣 (@uzimaru0601) September 4, 2018
#今日の中指 pic.twitter.com/uqjcxGV9WU
— うじまる🐣 (@uzimaru0601) 2018年9月6日
#今日の中指 pic.twitter.com/U4tD6DpVZB
— うじまる🐣 (@uzimaru0601) 2018年9月12日
#今日の中指 pic.twitter.com/y4H5NGYFdS
— うじまる🐣 (@uzimaru0601) 2018年9月10日
忘れるところだった#今日の中指 pic.twitter.com/7VF3inI1dk
— うじまる🐣 (@uzimaru0601) 2018年9月13日
#今日の中指 pic.twitter.com/YUC90QU5uy
— うじまる🐣 (@uzimaru0601) 2018年9月18日
#今日の中指 pic.twitter.com/70BsQi6SNT
— うじまる🐣 (@uzimaru0601) 2018年9月20日
#今日の中指 pic.twitter.com/hrRTwcMT62
— うじまる🐣 (@uzimaru0601) 2018年9月21日
ここまできたらなぜかうじまるくんが #今日の中指 の自動化をしていました。
今日の中指、できるところまで自動化 pic.twitter.com/kLPMT5KSvv
— うじまる🐣 (@uzimaru0601) 2018年9月20日
#今日の中指 pic.twitter.com/DYiPdcc7wW
— うじまる🐣 (@uzimaru0601) September 5, 2018
最終日はお寿司の名店 久兵衛 に行きました。メンターさんと一緒に大興奮のお寿司です。
大学生の舌には高級すぎました😇😇😇。
やっぱりお寿司は最高で、リクルートさんの凄まじき金銭的パワーで毎日素敵なランチにありつけました。
圧倒的感謝です🙏🙏🙏🙏🙏🙏🙏🙏🙏。
インターンを終えて
今回のインターンは大学に入ってから二回目のインターンでしたが、実際に現場で働いている人たちのそばに参加して一緒に業務をするのはやはり勉強になります。今回、サーバーサイドというあまり触れたことのない技術を学ぶという部分が多かったですが、メンターさんのタスクの振り分けや教え方がバッチリハマり、力をつけることができました。最初のほうで 自分が何を学ぶべきかということを明確にして、それを補う形でインターンできたことが要因かなと思います。
前までは、サーバーサイドというのをあまり分からず、雰囲気で話を合わせていたりしました。今現在は、まだわからない部分も結構ありますが、ある程度なら話を理解することができるようになった気がします。(だと言っても本業としている人には全然かなわないけど)
個人的にこのリクルートさんのインターンは、自分が一ヶ月で劇的に変わることができるインターンだと思います。
圧倒的当事者意識を持つというのは大きいと思います。このインターンに参加しているのは自分だ、このインターンでどう変わるかという意識を持つのは大きいと思います。
結局自分を育てるためには自分で知識を入れなければいけず、最後は自分がやるかどうかです。
意識高い感じでまとめましたが、成長するためのインターンとしてはとてもいいものだと思いました。
タイトルにもあるように、今回のインターンシップで圧倒的成長をしたのかと聞かれると、圧倒的成長をしました。
今後の糧にできるような知識を多数学べ、実に有意義なインターンでした。
暮らし
朝10時出勤だからまだマシなんですが、通勤通学に中央総武線は使うものじゃないと思いました。
人間が乗るものじゃないです。
朝は9時頃に乗るのでまだ大丈夫ですが、問題は帰り。
夜7時近くに有楽町駅から乗ると、サラリーマンの人に囲まれて死ぬかと思いました。
ちなみに、私服の大学生が満員電車に乗ると、この世の全てに嫌気が差しているようなサラリーマンの方に
「遊んでいる大学生風情が電車に乗るもんじゃねえんだよ」
とか言われますが、そういう悲しい人は結構いるので心を強く持ちましょう。
だいたいそういう人は家庭とか、会社がうまく行ってません。温かい目で見守ってあげましょう。
最後に
今回、私に技術的な指導をしていただいたメンターのお二方、生活の支援やイベントの主催をしていただいた人事のお三方。その他私がお世話になった大勢の方に深くお礼を申し上げます。
一ヶ月という短い間でしたが多くの知識を蓄えることができ、感謝したくも感謝しきれません。
本当にありがとうございました。
ESP32の書き込みサイズを変更する
いろんなことに使われているESP32ですが、先日のハッカソンで渡されたサンプルプログラムがデフォルトで92%もメモリを使用するということで、何に使えるんだコレと海原雄山みたいなこと言いました。
ということで今回はそんな時に使えるESP32の書き込みができるファイルサイズを変更する方法です。
やること
ESP32の書き込みメモリのサイズを変更する
工程
- 設定ファイルの場所を特定する
- 電卓とかで増やすサイズを割り出す
- 設定ファイルを書き換え
- テストとして実際に書き込みしてみる
実際に変更してみる
設定ファイルを見つける
まずは設定ファイルの場所を特定する必要がある。
ちなみに、今回使用したOSはLinux(xubuntu)です。他のOSを使用している方とはファイルの場所などに違いがある場合があるので注意してください。
僕の場合、設定ファイルは
~/Arduino/hardware/espressif/esp32/tools/partitions/default.csv
に存在しました。
このcsvファイルに色々と情報が書き込まれていて、実際にプログラムが書き込まれるときなどにコレが参照されるそうです。
# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x140000, app1, app, ota_1, 0x150000,0x140000, eeprom, data, 0x99, 0x290000,0x1000, spiffs, data, spiffs, 0x291000,0x16F000,
初期の値はこうなっていて、0x140000 = 1310720
bytesだけ書き込めるようになっている。
nvsとotadataをいじってしまうと、動作が不安定になるので、よっぽどのことがなければotadata下の4行分データを変更します。
ちなみに、サイズを変更する時は 0x10000
ごとに変更をしないと怒られます。コンパイルエラーが出たときにも言われるので注意しましょう。
変更するサイズを決める
1310720 bytes ~ 1.3MB
になるので、今回は1.5MBくらいまで増やすとこにしようと思います。
1500000 = 0x16E360
になるので、1.5MBにするにはサイズを0x140000
から0x1700000
にすれば良さそうというのがわかります。
ちなみに 0x170000 = 1507328 > 1500000
なので多分あってます。
というわけで変更していきます。
実際に設定ファイルを変更する
windowsのメモ帳でやる人はまさかいないと思うんですが、文字コードの影響とかでバグが起きそうなのでできるだけやめてください。
変更するときにはoffsetやsizeを逐次計算していったほうがいいです。
offsetはたぶんメモリ番地、sizeはその場所が専有しているサイズになります。
サイズを0x170000にする時はこうなります。
# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x170000, app1, app, ota_1, 0x180000,0x170000, eeprom, data, 0x99, 0x2F0000,0x1000, spiffs, data, spiffs, 0x2F1000,0x0DF900,
ポイントとしてはoffsetの値にsizeを加えた数が次の場所のoffsetの番地になることです。
このブログを見ている皆さんは16進数同士の掛け算も秒でできる hexadecimal native な方も多いでしょう、しかし僕は普通の人なのでPCに搭載されている電卓を叩きました。
ちなみに、ESP32自体のメモリサイズは4MBなので、最後のspiffsの行にあるOffsetとSizeの値の和が 0x3D900 = 4000000
になれば成功です。
もしそうでなかったらどこか間違っている場所があるのでよく確認してください。
ちなみに、appの部分を変更したためにspiffs
の値が減っていますが動作に問題はありません。戦争のための致し方ない犠牲だ。
boards.txtの変更
実際に書き込めたら、もう一つファイルを変更します。
変更するのはesp32のルートにある boards.txt
場所としては~/Arduino/hardware/espressif/esp32
にありました。
このファイルの esp32.upload.maximum_size
の部分を変更します。今回は0x30000増やしたので
esp32.upload.maximum_size = 1507328
に変更します。
実際に確認してみる
適当に何かファイルを書き込みます。
簡単にLチカなどでも大丈夫です。
#define LEDPIN 13 void setup{ pinMode(LEDPIN, OUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
あとは書き込むと、書き込んだ後に出るメッセージが変わると思います。
変わればきちんと変更がされたので終わり、お疲れ様でした。
Maker Faire Tokyo 2018に行ってきた
めちゃくちゃ遅くなったけどMaker Faire Tokyo 2018に参加してきたので書く。
最初に感想を言っておくと めちゃくちゃいいイベントだった。
あくまで個人の感想ですが今回のMFTの日程や感想を書いていきます。
会津出発
会津を高速バス出発したのは7/3の14:30ごろ。この日は午前中まで大学のテストがあったので、テストが終わってから色々と準備をして出発した。
論回のテストのための勝負服 pic.twitter.com/8MHWE1Isyr
— 飛ばすはとバス (@flying_hato_bus) 2018年8月3日
俺(黒)やん pic.twitter.com/LVlvlUB95y
— 飛ばすはとバス (@flying_hato_bus) 2018年8月3日
バスタ新宿に着いたのは19:15ぐらい、途中何もなくスイスイ来られたのでほぼ時間通り。今回お手伝いする ウズキさん と合流した。MFTで使うテープなどを調達するために新宿の東急ハンズで買い出し&チケットや次の日の事を話すために飲みに行った。
— 飛ばすはとバス (@flying_hato_bus) 2018年8月3日
Maker Faire に出展するのは去年シリコンバレーで出た mini Maker Faire 以来でほぼ一年ぶり、というかちゃんと出るのは今回が初めてだった。ウズキさんと会ったのもシリコンバレーで、日本に帰ってきてもちょくちょくお世話になっている(とてもありがたいです)。
ご飯を食べながら次の日の動きを確認し、ウズキさんに「初めて組んだPCのCPUはA10-5800K」という話をして一通り時代の流れを感じさせるなどして解散。川崎にある友人宅に11時過ぎくらいに帰った。
MFT1日目
🔜 国際展示場
ウズキさんと9:30分ごろに大崎駅で待ち合わせ、湘南新宿ラインで一本なので湘南新宿ラインは神。9:10くらいに着いたので飲み物とか塩分補給のThingsを調達。麦茶 ∧ 塩
という意見がtwitterで強かったので麦茶1Lと酸っぱいタイプの梅を買った。少ししたらウズキさんが来たので合流。そのままりんかい線で国際展示場へ。
気分はコミケで国際展示場へ着く。オタクは少ないかと思ったら同時に三次元空間でスクフェスのイベが開催されていたらしく、ほぼコミケと同じくらいのオタク密度でりんかい線にオタクが乗ってた。
夏コミ-6日目参戦します! pic.twitter.com/lAnU2WXB40
— 飛ばすはとバス (@flying_hato_bus) 2018年8月4日
— 飛ばすはとバス (@flying_hato_bus) 2018年8月4日
↪️ 国際展示場
MFT自体は西ホールで開催されてた。僕やウズキさんがブースを構えていた場所的には西1のゆ-18くらいのところ。ここでtomorrowさんと合流する。tomorrowさんはウズキさんと同じブースでM5stackを主に展示している方。
今回出展した内容的にはクラッピー鬼ごっこロボとM5Stackの展示。
#MFToky02018 今回は出展というよりもお手伝いをしてます。H/11-04でお待ちしてます pic.twitter.com/4Rb7FhvB0E
— 飛ばすはとバス (@flying_hato_bus) 2018年8月4日
ウズキさんはカムロボにiPhoneXを搭載、ESP32とwebBluetoothを使いYOLOを使って学習したものをCoreMLで動かし、クラッピーを認識して追いかけるロボットを展示。1日目の朝、前日に作ってきた止まれの標識も追加して、止まれの標識を見せたら停止するようにその場で改造していた。
iPhone で tiny YOLO でロボットだ! モデルも自前で。#NT金沢 pic.twitter.com/kgi7uyczGa
— ミクミンP/Kazuhiro Sasao (@ksasao) 2018年7月8日
tomorrowさんはM5stackの展示、自作の基板を8月下旬にswitch scienceで売り出すらしく、そのサンプル基板を展示、また、M5stackを使ったホワイトボードに自動で書いてくれるマシーンやwebBluetoothを使ったラジコンなどを展示していた。
PlotClockの移植完了!
— tomorrow56@M5Stack修行中 (@tomorrow56) 2018年8月2日
MFTへ持ってくよ〜#M5Stack #MFTokyo2018 pic.twitter.com/4gd1RFpRKF
今回ボクはウズキさんの「お手伝いして〜」という声に「ぜひ行きたいです」と志願して(拉致られて)ウズキさんやtomorrowさんのお手伝いに来ました。
初日に設営を終え、ちょっとブラブラ。
いろいろなものがあって、何がどこにあるのかも分からなかった。
とりあえずMFTが始まる。コミケじゃないのに開始のアナウンスとともに拍手が生まれるのは国際展示場名物。
1日目に見たもの
Superdiy
少し前にTwitterで話題になった Superdiy の原作者の方にお会いした。
お話をしたところステッカーを頂いた。すぐにThinkPadに貼り付けた。
めちゃくちゃ欲しいステッカーいただいた pic.twitter.com/zCqVraTIo2
— 飛ばすはとバス (@flying_hato_bus) 2018年8月4日
早速付けました pic.twitter.com/XsBfCTxsfu
— 飛ばすはとバス (@flying_hato_bus) 2018年8月4日
Idein社
実在した。
Raspberry piで機械学習+ボーン検知のデモを展示してた。
ラズパイで動かすとすると良くて3~4FPSのものを30くらい普通に出しててやばい。
社員の方に話をお聞きすると
「Raspberry piのGPUを使用しています。ちなみに、標準だと動作をしないのでGPGPUを使用できるようにアセンブリとか使って一から実装しました」
と、さも当然かのようにお話をされていた。
卍邪悪卍
Idein社での卓球の様子 pic.twitter.com/jL8xYLhfAo
— Koichi Nakamura (@9_ties) 2018年7月27日
これをデモとして展示されてました。
SONYのspresenseのコスプレ
最近SONYさんから発売されたspresenseの広報として展示場内を歩いていたコスプレ衣装をまとった方。
ナンバーワンコスプレ説ある pic.twitter.com/3LbfqelJK1
— 飛ばすはとバス (@flying_hato_bus) 2018年8月4日
超低消費電力、マルチGNSS測位機能、音がありえん良いらしい、この大きさでこの性能はやばいと思うので皆さん購入してIoTを始めてほしい。
そんなこんなで1日目が終了、個人的には白井さんの serial experiments lain に出てくるあの人みたいな風貌が一番性癖に突き刺さった。
完全に一致 pic.twitter.com/6TbhPFkhkG
— 飛ばすはとバス (@flying_hato_bus) 2018年8月4日
その後はアキバのMograに言ってAkiparty、今までネット上でしか見たことのないギャル電さんにお会いすることができた。憧れの人の一人だったのでとても良かった。
(LEDビカビカさせてたら話しかけていただけた、最高)
MFT2日目
現地集合ということでウズキさんたちのブースに集合、2日目が始まる。
ブースについてお話をすると、 子供に大人気だった。ブースにクラッピーが置いてあって、それ目当てに来る子が多かった気がする。
「取っ手を握ったら拍手をする」という単純明快で音のなるおもちゃはやはり子供受けがすごい。
— 飛ばすはとバス (@flying_hato_bus) 2018年8月4日
机に置いていたのはこれ、大きさ的には手のひらサイズで握るとパチパチ音がする。
ピンクや青とカラーバリエーションも多く、女の子が
「ピンクかわいい!」
とか、両手にクラッピーを持った子が延々と
「パチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチ」
と無心で遊んでいたことが心に残った。
研究室に欲しすぎるな pic.twitter.com/F2gHx8XGC4
— 飛ばすはとバス (@flying_hato_bus) 2018年8月5日
会場にはデカイクラッピーがいて、お話しながらパチパチしていた。
これを見た子供なのか、他のところで遊んできた子供なのか、ブースに来る時に
「どうか売っていますように」
とお祈りしながら来る子まで来た。
ちなみに、このクラッピーはAmazonで500円くらいで売っているので皆さん買いましょう。
2日目に起きたこと
クラッピー夢の共演
クラッピーを見つけると追いかけていくロボットを作成していたのですが、なんと クラッピーをラジコンに改造していた人がいた。
何が起きるかと言うと
追いかけっこ
クラッピーのラジコンとクラッピーを追いかけるラジコンの夢の共演 #クラッピーチャレンジ pic.twitter.com/CqxXHzbPpx
— 飛ばすはとバス (@flying_hato_bus) 2018年8月5日
というわけで、夢の共演を果たしました。
Aizu IoTLTの開催
個人的にIoTが好きで、ArduinoやESPを使って色々動かしています。
IoTLTというものが開催されているというのは知っていました。しかし、開催される場所が会津から遠くどうしても行くことが難しかったりします。
今回のMFTでIoTLTに参加されている方々のブースに行き、代表ののびすけさんとお話をした。
IoTLTについて少し話をしていると
まさかのIoTLT Aizuの開催が決定した
まさかの僕が主催ということでIoTLT AIZUが開催されることになりました。10月の13日土曜日、13時から16:00までLT会、それからの懇親会も予定しています。会津大学生以外でもどなたでも発表可能なので会津大学生も、社会人の方でもどなたでもLT待ってます!!!https://t.co/1FM0AAIEBH
— 飛ばすはとバス (@flying_hato_bus) August 6, 2018
僕とのびすけさんが主催ということで会津大学を舞台に実際にLTが開催されることに、
MFTで少し話をしただけでいろいろな方の力をもらい、実際に開催にこぎつけることができました。
今回初めて参加して思ったこと
MFTはtwitterなどで存在していることは知っていて、今回初めての参加でした。
今回紹介したのはごく一部で、国際展示場にはもっともっとありました。
そういえばこの前のMFTで見た自動演奏ロボ投稿してなかった pic.twitter.com/jH7Qmd3Xp4
— 飛ばすはとバス (@flying_hato_bus) August 8, 2018
控えめに言って最高だった。
まじでこの世の全てのMaker Faire好きに教えてあげたいんだが東京の国際展示場には全ての人間を虜にする禁断のイベントがある。 これが色んな人の作ったもので超絶面白いからぜひ全国のMaker Faire好き、Maker Faireを愛する者たち、Maker Faireを憎む者たち、全てのMaker Faire関係者に伝われ
Opencv 3.4.0のインストール(darknetでエラーの出まくっている方へ)
研究室で自分が使っているマシンで、darknetによるリアルタイム推論をしようとしたら全く動かなかった。
普通の推論(画像中の特徴にバウンディングボックスを設置する)だと、動いてくれる。
PCのスペック等
- CPU ... Intel(R) Core(TM) i7-4771 CPU @ 3.50GHz
- RAM ... 32GB
- GPU ... GTX1080ti
OS ... Ubuntu 16.04 LTS
OpenCV ... version 3.4.1
- CUDA ... 8.0
コレと言って変なところはなく、公式がサポートしてると謳っていたバージョンをすべて入れているはずだった。
ちなみに、使用しているレポジトリは公式ではなく、AlexeyAB氏の開発している方のdarknet。
これで、darknetを使用すると
- 画像認識
./darknet detector test path/todata.data path/to_DLcfg.cfg yolov3-tiny.conv.15 path/want_to_detect_picture.jpg
出力例
- リアルタイム認識
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
出力 https://github.com/AlexeyAB/darknet/issues/932
Couldn't connect to webcam. : Invalid argument darknet: ./src/utils.c:193: error: Assertion `0' failed.
こんなのが出て落ちる。
色々と試してみたがうまく行かずにいると。フォーラムで、「最近新しいバージョンにしたからpullヨロ」のような文字が発見できたので git pull で最新バージョンにした。
新たにバージョンアップしたのでまた一からmakeをしようとした。
$ git pull $ make
ここまで来たところでエラーが出た。
In file included from /usr/local/include/opencv2/core/types_c.h:59:0, from /usr/local/include/opencv2/core/core_c.h:48, from /usr/local/include/opencv2/highgui/highgui_c.h:45, from ./src/image.c:14: /usr/local/include/opencv2/core/cvdef.h:485:1: error: unknown type name ‘namespace’ namespace cv { ^ compilation terminated due to -Wfatal-errors. gcc -DOPENCV pkg-config --cflags opencv -DGPU -I/usr/local/cuda/include/ -DCUDNN -DCUDNN_HALF -Wall -Wfatal-errors -Wno-unused-result -Wno-unknown-pragmas -Ofast -DOPENCV -DGPU -DCUDNN -I/usr/local/cudnn/include -DCUDNN_HALF -c ./src/blas.c -o obj/blas.o Makefile:130: recipe for target 'obj/image.o' failed make: *** [obj/image.o] Error 1 make: *** Waiting for unfinished jobs....
エラーメッセージから読み取れるに、opencvのエラーっぽい。
opencvで何か必要なのかとissueを漁っていたらこのような投稿を発見。
Can't compile with opnecv=1 · Issue #932 · AlexeyAB/darknet · GitHub
作成者本人曰く。
「今回のバージョンアップでなぜか知らんけど OpenCVの3.4.1だと動かなくなっちゃった。もし3.4.1入れてるんだったら、それ以前のモノ入れてね、というかREADMEにも書いてあるよ。」
This repository supports:
both Windows and Linux both OpenCV 2.x.x and OpenCV <= 3.4.0 (3.4.1 and higher isn't supported) both cuDNN v5-v7 CUDA >= 7.5 also create SO-library on Linux and DLL-library on Windows
らしい。最近更新された時に追加されたようで、昔の情報で全てを完結させていたのでコレに気づかなかった。
というわけで深夜1時ごろからOpenCV3.4.0のインストールを開始した。
公式を見ればわかるが、個人的にやったことを書いていく。
pkg-config --modversion opencv
3.4.1
$ cd ~/ $ mkdir src $ cd src
インストールに使用するフォルダを作成
$ wget https://github.com/opencv/opencv/archive/3.4.0.tar.gz $ tar xvzf 3.4.0.tar.gz $ ln -s opencv-3.4.0 opencv $ wget https://github.com/opencv/opencv_contrib/archive/3.4.0.tar.gz $ mv 3.4.0.tar.gz.1 opencv_contrib-3.4.0.tar.gz $ tar xvzf opencv_contrib-3.4.0.tar.gz $ ln -s opencv_contrib-3.4.0 opencv_contrib
OpenCV 3.4.0のファイルとcontribパッケージをダウンロードして、リンクをしておく。
$ cd ~/src/opencv $ mkdir build $ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. $ make -j8 $ make install
makeなどをしてインストール、ちなみにmakeにはめちゃくちゃ時間がかかるので心して待ちましょう。
インストールが終わって、pkg-config --modversion opencv
を打ち、3.4.0
が出力されればインストールは成功。
これでdarknetをmakeして動かすと。
ヤッターdarknetウゴイタヨー pic.twitter.com/yrJG4qm9ed
— 飛ばすはとバス@金曜日西も11a (@flying_hato_bus) July 4, 2018
こうなれば全てが終わり、お疲れ様でした。