NoahOrblog

某・福島にある大学のコンピュータ理工学部の大学生のお話。

おうち開発環境を整えた

Noahです。

おうちの開発環境を整えました🎉

今まで

2015年モデルのMacBookProのみで開発を行っていました。

外部ディスプレイとかなしで、キーボードとかマウスももちろん無し。

バイト先で初めてデュアルディスプレイで開発したとき、作業の効率がグンと上がったので感動してたくらい。

買ったもの

ディスプレイ一枚、トラックボールマウス、ThinkPadのキーボードを買いました。

ディスプレイ

予算が大してないので、クーポン適用で1万ちょっとで変えるディスプレイを購入。

スピーカーは付いていないが、別に使わないので構わない。

普通に画面大きくてめっちゃ良い。これで12kなら満々足。

ThinkPadキーボード

ThinkPadのキーボード。ThinkPad自体は使ったことがないですが、使ってる友人曰く最高らしいので購入。

ケーブルレスがいいので、Bluetoothモデルを購入。

一番届いたのが遅かったけど、打ち心地は普通に良い。

トラックポイントが感度難しい。慣れかも。

ラグもなくてストレスから解放されてる。

トラックボール

LOGICOOL ワイヤレストラックボール M570t

LOGICOOL ワイヤレストラックボール M570t

慣れない。でも便利。

トラックボールのおかげで移動させる必要がないので、めちゃ便利。でも慣れない。

2日触ってようやく少し慣れた。快適。

その他

HDMIケーブルとか買った。Thunderboltも。

不満点を言うなら、トラックボールは専用レシーバーが必要。あまりさしたくない。

ディスプレイのHDMIケーブルはしょうがないけど、元あったディスプレイ(HDMI入力があるなんて思っていなかった)含めてトリプルディスプレイにしているので、何箇所もケーブルをささねばならないのは面倒。

ThinkPadのDock Stationみたいなのほしい。

QC30を修理に出した話

Noahです。

かなり前の話ですが、QC30が調子が悪くて修理に出して返ってきました🎉

故障

3月のインターンの頃から、電源を切っても緑のライトが付いたままだったり、充電中にオレンジの点滅のはずが緑のまま点滅してたり挙動不審。

でも、操作も問題ないし、まともに再生できるしそんなに気にしていなかった。

(電源切れない、というわけではなかった。)

4月に入って、帰省をした頃に満充電でも電源をつけた数秒後に電源が切れる症状に陥った。

修理

挙動不審だった頃から同じQC30を使ってる先輩に相談とかしてたのだが、さすがに使い物にならなくなったのでBoseカスタマーサービスに連絡。

郵送すれば無償で新品交換してくれる話になった。

大体一週間くらいで返ってきた気がする。

手厚いサービスがあって最高。

終わりに

ちなみにだが2A出力で充電するのも駄目っぽい。

MBPのUSBポートから充電するようにしてる。

あと、3月中にはインターン先の社員さんにこんなこと言われた。

これはこれで怖い

CyberAgentのインターンに参加した話

自分は20卒ですが、3月の1ヶ月間CyberAgentで19卒向けのインターンに行ってきました。

www.cyberagent.co.jp

書類選考

書類選考では、何を作ったか、どんなことをやってきたか、とかそういうことを記述するのが多かった気がする。

自分はハッカソンにわりと出るけど、ネイティブやフロントも特段書けるわけでもないし、まぁつまりそんなに貢献しているわけではなかったりして。

むしろ一人で開発して作り上げたもののほうが多かった。

11月にWebで提出するフォームを書いたが、学祭中に引き篭もって2日である程度動くもの (gilbert.nvim) を作ったことを書いた。

その頃はGoしか書いてないのでGoの事ばかりかいたことを覚えている。

面談

一次選考では、社風や、どこでGoがつかわれているかなどをきいた。

二次選考では、現場のエンジニアの人と面談をした。Goの話はもちろん、(知識はそれほどなかったが興味があった)インフラ周り、MySQLやCockroachDBの話もした。

今は、Goでサーバーサイドで働いているけど、インフラの勉強もしたいこと、フロントにも興味があることなどを伝えた。 20分くらい面談したあと、エンジニアの方から結果はいつお知らせしたらいい?と聞かれて、あ、これは落ちたやつかなと身構えながらも『出来るだけ早いうちでお願いします』、とだけ伝えた。

その後、普段の仕事中に、面談から2時間もしないくらいで人事の方から合格という報せが届いて、オフィスで(迷惑にならない程度に)軽く飛び上がった。

番外編: LT

その後、うちの大学でCyberAgentとのLT会が開かれたので、その時、生まれて初めてLTに登壇した。ちなみに、その時にはAOJ(Aizu Online Judge)のNeoVimクライアントプラグインを作った話をした。(最近はNeoVimプラグインしか書いてないため必然とこのネタになる)

www.slideshare.net

(注: このスライドの最後のdiesirae.nvimの未実装問題はいくつかは修正済だったりする)

50p以上あるスライドだったにも関わらず当初予定していた10分よりかなり早めに終わってしまったから残念だった。

いざインターンに行ってきた

AmebaOwndというサービスのサーバーサイドエンジニアとして1ヶ月間インターンしてました。

www.amebaownd.com

具体的に何をしたかまではNDAがあるので書けないのですが、以前から興味があったクラウドサービスを少し触らせていただいたりした。

最初は軽めのタスクを複数任され、それぞれその日のうちに実装を終わらせてPRを出した(Goで、そのパッケージを使ったことがなかったためかなり楽しかったw

特に、実際に運用されているコードを読むのはとても良い経験だった。

前半はそのように過ごしつつ、全体の構成や、機能追加するところについての説明を受け、インターン後半に担当するタスクについても事前知識として色々教わった。

さらに、コードを書くことばかりではなく、デザインスプリントというものにも参加した。

www.slideshare.net

コーディングする開発だけではなく、このような開発プロセス的なことをも学べたのは自分の中でもとても良い経験になった。

ユーザーテストの準備では、自分はネイティブは書けないので社員の方と一緒に表示する文言を考えることになったが、日本語は難しいことを改めて知るなどした。(途中、類義語などを調べ始めてエンジニアではなくて言語学者みたいになってたw

後半は、割りと重いタスクを複数日かけてやる感じになったが、メンターさんにレビューをしてもらい、フィードバックをもらいながらもなんとか最終日の前日にマージをして開発環境にデプロイが出来た。

最終日は退社手続きがあって結構暇するという話を聞いていたけど、午前中にあらかた書類関係を終わらせて、午後は既知のバグの調査をするなどした。(最終日で時間がなく、半分程度しか調査できなかった&&自分で修正までできなかったのが心残り…

環境について

希望により、US配列のMacBookPro(それも見た感じ新品)を貸与された。

予め貸与PCがあることは把握していたので、インターンの前から自分の .zshrc をmacOSなら読み込むだけでfzfなどのインストールを終わらせてくれる君を書いたりして環境構築をスムーズに💪💪

github.com

ディスプレイやIntellijなども貸与され、開発に困ることはほぼほぼなかった。

終わってみて

とても充実した一ヶ月でした!

最終日はお世話になったOwndチームの方々とシュラスコしに行きました🍖

しこたま食べた後、メンターさんから、

www.oreilly.co.jp

を頂き、これからももっと精進していきたいと思いました!!!

最後に

このようなインターンシップ自体、初めてだったけど、一ヶ月で大きく成長できたと思います。

短い期間ではありましたが、本当にありがとうございました!!!

これからも自分の腕を磨き、成長していきたいなと思います

おまけ

会津から東京への道中、@flying_hato_bus という僕の友達と一緒に行ったんですけど、彼は時間を間違える天才です(彼のせいで一時間郡山で暇な時間が出来てしまった

QC30買った件

Noahです。

QC30買いました。

バイト先の先輩が常時つけてて、軽そうだし、何より付けてても付けてない感じがすると評判だったのでずっと悩んでた。

ワイヤレスはヘッドホンだけどMDR1000x持ってるし、果たしているのかいらないのか。

作業中つけるだけなら事足りるのではないか?

結局、10分後には買ってました。

ただ、結果としては買って大正解。バッテリも普通に一日もつ。

あと、どうでもいいけどパーカー着てるとこういう悩みもでる

まだ購入から一月も経ってないけど、めっちゃいい。

neovim/go-clientにcontributionした話

Noahです。

この記事は

qiita.com

↑の23日目の記事です。


f:id:NoahOrberg:20171127084334j:plain
NeoVim

言わずと知れたNeoVim、その中の機能にRemotePluginがあります。

簡単に言ってしまうとNeoVimのプラグインを別プロセスで動かすもので、原理的にMsgpack-RPCを使えばどんな言語でもプラグインが書けてしまう素晴らしいものです。

自分はVim(ないしはNeoVim)歴4年位なのですが、Vim好きが高じて最近は趣味でNeoVimプラグインGolangで書いています。

最近自分のメイン言語になっているGolangで書く際は、neovim/go-clientを利用しています。

github.com

そして今回は、このライブラリにコントリビューションした ~かった~ 話

何したのか

vim、NeoVim、Golangにコントリビュートしたい!という気持ちは以前からあり、ちょうどIssueが立っていたneovim/go-clientの機能追加を行いました

github.com

といっても、メインで開発をしている方が立てたIssueでしかも一年以上放置されていたので、ちょっとためらいましたが、PRを作成しました。

やったこと

Golangプラグインを作成する際は、ビルドして $PATH 上に置いたあと、NeoVimと通信するために以下のようなmanifestと呼ばれるコードをvimscriptで記述しないといけません。

" 公式READMEから拝借
call remote#host#RegisterPlugin('hello', '0', [
    \ {'type': 'function', 'name': 'Hello', 'sync': 1, 'opts': {}},
    \ ])

これは自動生成でき、実行形式にしたファイルを helloworld.nvim --manifest=hello のように実行すると内部で処理し、標準出力に吐いてくれます。

しかし、標準出力で吐いた後、コピペやリダイレクトでVimscriptに貼り付けねばなりません。

自動生成できるなら、自動で書き換えりゃええやん、というのが大筋の流れです。

使い方としては、manifestオプションと併用し --location=/path/to/init.vim のように、init.vimの場所を指定することで標準出力ではなくinit.vimへ自動でmanifestが追記・修正されるようになります。


自分は最初、PRを作成した際に正規表現を使わず文字列としてマッチした部分を取り除き、そこに挿入するイメージでPRを作成しました。

が、メインで開発を行っている人に、「フラグ、ちょっと重複しとる部分あるから直しといて」「単純に正規表現使うといいで」「テストも追加しといてな」というようなことをツッコまれ、さらにシュッとこんな感じとコードまで提示していただき、すごく勉強になりました。

ひとことと宣伝

vimconf2017、自分も行きましたが最高でした!

vim界隈のあんな人やこんな人のお話を聞けて幸せ過ぎました…。ありがとうございます。

あと、10日ほど前の記事になりますが、AizuAdventCalendar 13日目のこの記事もNeoVimプラグインに関することなので、よろしければどうぞ

noahorberg.hatenablog.com

ちなみにこの記事冒頭でもうすぐgithub contributionが4桁行きそうだと言いましたが、

f:id:NoahOrberg:20171223163405p:plain

4桁行きました🎉(感動)


今年買ったもの、読んだもの、借りたもの

Noahです。

今年買ったもの、読んだもの、借りたものについて書いておく。

記憶にないものもあるけど、覚えてるものだけ。

機器系

MDR-1000X

言わずと知れたモノ。35kくらいするけど、現在バイト先の先輩、同期が総勢5, 6人持ってる。 自分もちょうどBluetoothヘッドホンが欲しかったので購入。

ノイキャンが素晴らしく、うちの大学の学食で着けてると別世界になる。

ErgoDox

これは先輩に借りてるもの。バイト先で使ってる。

Twitterで使いたいとつぶやいていたのを先輩が捕捉してくれていたらしい。

最初全く慣れなくて、作業効率が1/10くらいになってた。

実は今もまだ慣れてなくって、作業効率が3/4くらいになるので、考える作業が多いときのみ使っている。

使わないときと使ったときの差は(不慣れによる作業効率低下を無視すれば)歴然だった。最高すぎた。慣れたい。

本の類

ゼロから作るDeepLearning

いうてそこまで読めてない。春休み中、機械学習、深層学習をやるモチベーションがあり、(謎の)インターンとか参加したけどそこでは全くディープラーニング関係のことをやらなかったのでしばらく積んでいる。

(ちなみにその(謎の)インターンではIoT関係のゴニョゴニョをした。)

そのうち読みたい。

おいしいClojure入門

おいしいClojure入門 (Software Design plus)

おいしいClojure入門 (Software Design plus)

先輩がClojureの本を図書館から借りて読んでいて、興味出たので図書館で手頃に読んだ。

WEB関係のところしか未だ読んでいないけど、面白い。Golangとは違って面白い。

Real World HTTP

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

某氏から誕生日に贈られたもの。GoでHTTPの実装をするのでなかなか良かった。しかも標準パッケージ。

たまに読み返す。

Webを支える技術

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

これ、本当は去年の大学の授業でやっていた。

今のバイト先に決まったときに、Web系の予習復習するため読んだ。授業でAPIサーバーとクライアントを作成していて、それを元に読み返して復習した。

Web API: The Good Parts

Web API: The Good Parts

Web API: The Good Parts

これは、買ったけど未だに読めていない本。REST API の勉強用と思ったが、買ったその頃からgRPCを扱い始めたので未だ読めてない。

冬休み読もう。

みんなのGo言語

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

今のバイト先に入る際、買って読んだ。Golangで書くことは事前に知らされてて知っていたけど、それまでHaskellばっか書いてたので不安だったが、下の本と共に読んでなんとかなってる。

プログラミング言語Go

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

これは会社で読んだ本。コードレビューの際に参照したりしていた。みんなのGo言語よりも最初に読むべきだったと思っている。

Goならわかるシステムプログラミング

Goならわかるシステムプログラミング

Goならわかるシステムプログラミング

これは秋葉原で行われた技術書店で早い目に発売されてて、偶然会ったバイト先の先輩にオススメされたので買ってみた。著者がReal World HTTPと同じ方で、Goの実装が書かれているので読みやすい。

グッド・マス

グッド・マス ギークのための数・論理・計算機科学

グッド・マス ギークのための数・論理・計算機科学

今年入って(多分)最初に読んだ。最初はモロ数学だけど、徐々に論理型言語Prologとか関数型言語とかの話になってきて面白かった。読んだほうが良い。

入門vi

入門vi 第6版

入門vi 第6版

これは今年買ったものではなくて、Linuxでプログラミング始めた頃から持っていた(WindowsPerlスクリプトで遊んでた頃はNoEditorを使っていた)。

以前からリファレンス的(というよりかなり大雑把に)に読んでたが、今年からまともに読み始めた。

普段はNeoVimを使っているけど、やっぱvi系は最高ですわ。

DUO 3.0

DUO 3.0

DUO 3.0

DUO 3.0 / CD復習用

DUO 3.0 / CD復習用

英語勉強用。同期と比べると絶望的壊滅的に英語ができないのでCDと合わせて聞く&&読んでる。

例文が面白いので良い。


本以外の大きな買い物はMDRしか買ってないことに気づいた。

neovim/go-client入門

Noahです。

この記事は

adventar.org

↑の、13日目の記事です。

どうでもいいですが、GithubのContributionが4桁行きそうです

f:id:NoahOrberg:20171213222509p:plain

結構ひとりで感動してる


本題

Vim(ないしはNeoVim)のプラグインを書きたい人、いますよね???

Vimが好きなら誰しもが一度は作りたいと思ったことがあるはず。

標準で搭載のVimscriptを駆使してもいいですが、Goで書けると結構いいよ、というお話

前提としてGolangがチョットかけるのと、環境整備はしてあること、あとは .vimrcないしはinit.vimを設定したりしたことあるひとなら多分大丈夫です。

github.com

公式READMEの内容が(自分の英語力不足で)ちょっと最初理解できなかったのでそこら辺の敷居を低くする名目も兼ねて、READMEの内容をちょっとやります。


HelloWorldに相当するであろうものが以下です(一応、公式READMEにsampleとしてあるが、ファイル構造ガン無視だったりして最初戸惑ったのでいっそまとめました。)

github.com

ちなみに自分のNeovimのバージョンはv0.2.1ですが、多分どのバージョンでも出来ます。

あと、依存パッケージの管理にglideを使用してます

取り敢えず動かす

まずGOPATH以下に落として移動しましょう

$ go get NoahOrberg/helloworld.nvim
$ cd $GOPATH/src/github.com/NoahOrberg/helloworld.nvim

移動できたところで、中身を確認します。

$ ls
README.md   glide.lock  glide.yaml  main.go     plugin/

こんな感じになってるはず。

依存パッケージを落とすのとビルドをします

$ glide install
$ go install

そしたら、各自のinit.vimプラグインを追記します。

ここいらは各自のプラグイン管理ツール(NeoBundle, deinなど)によった書き方をしてください。

" deinの例
call dein#add("NoahOrberg/helloworld.nvim")

そしたらあとは、nvimを起動して、:echo Hello("world") と関数を呼び出してみてください

Exコマンドを打つところに Hello world と、こんな感じに出てくれば成功です。

f:id:NoahOrberg:20171213213621p:plain

これでVimscriptからアクセスできるHello関数を定義できました🎉

内部でやってることはそんなに難しくなくて、

  1. Golangで関数の定義をする。

  2. ちょっとvimscriptを書いてRegisterする

ことをやっているだけです

Golangで関数の定義をする

gist.github.com

9-11行目で関数をかいて、15行目で関数をOption付きでRPCで通信できるように登録してるだけです

ここの plugin.FunctionOptions{...} っていうのが肝で、これでArgsの数とか制限しないと、後述しますがスライス外参照でpanicしたりします。(関数内で引数の数見ればいいんですが、こっちのほうがよりスマートです)

例でやっていたのはただの関数なので、(string, error) を返す感じになっており、error が nil じゃなければNeoVim側でエラー返すようになっています。

ちょっとvimscriptをかいてRegisterする

gist.github.com

さすがになんでもGolangでは書けなかった様で、RPCをRegisterするあたりはvimscriptで書きます。

自動で読まれるplugin/ディレクトリに.vimファイルを置いてあります

10行目くらいまではだいたいお決まりなのですが、12行目からで関数、コマンドをRegisterします。

ここの 'name'Golangの方のコードで &plugin.FunctionOptions{Name: "Hello"} で指定した Name から引っ張ります。

ちなみに、このあたりはmanifestというのですが、Golangでビルドした後にバイナリを実行して、helloworld.nvim --manifest=hostname とやると、自動で作成できたりします(ちなみに、--manifest=hostname を付けて、さらに --location=file/path/.vim もつけると、Goコードから勝手に解析されて自動で.vimファイルが更新されます)

msg-packで書ける利点とか、いいところ

多分pythonや他の言語でもそうですが、REST APIと通信する際に非常にやりやすい点がまずひとつです

普段から触ってる言語なら、NeoVimとの通信部分以外はほぼほぼ気を取られることなく開発できます

あとは、他言語もそうですがNeoVimが起動中はデーモンのように後ろに張り付いて動いてるので、中で変数をもたせることも可能です。( GitHub - NoahOrberg/gilbert.nvim: gist client for NeoVim はそれを知らなかったのでvimscriptの変数へ無理やり出し入れしているため気持ち悪い)

構造体とか定義して、中で値をもたせるといいかもしれません。

ちなみに、GolangでExコマンドを定義することは出来ますが、キーにマッピングする際はvimscriptでやります

あと前回からの進展

開発しているなかで一番しんどいのは、以前も書きましたがmsg-packのchが謎にcloseする時です。

しかも、panicした旨(どこでしくじったか、等)が来なく、ただ chがcloseしたよ! と、お知らせが来るのみで NeoVim側に来ない

だいたいはスライスの範囲を超えて参照したりしてpanicしていたり、ライブラリがpanicしてるので、defer, recover 辺りを使っていい感じにいい感じするくらいしか対策がないですが、いい方法があったら教えて欲しい次第です。

最後に

リポジトリは前に作ってたのですが、記事は時間がなくかなり適当に書いているので、ちょっと端折ってるところとかあるかもですが許してください

ちなみにAizu Advent Calendarのコメントに書いてたお話は急遽

qiita.com

の 23日目でお話します。

暇な人、また読んでね。