QC30買った件
Noahです。
QC30買いました。
バイト先の先輩が常時つけてて、軽そうだし、何より付けてても付けてない感じがすると評判だったのでずっと悩んでた。
ワイヤレスはヘッドホンだけどMDR1000x持ってるし、果たしているのかいらないのか。
作業中つけるだけなら事足りるのではないか?
QC30、買うか悩んでる
— のあ (@noah_orberg) 2018年1月6日
結局、10分後には買ってました。
買ってしまった pic.twitter.com/ENR1Rj7MBq
— のあ (@noah_orberg) 2018年1月6日
ただ、結果としては買って大正解。バッテリも普通に一日もつ。
QC30、ヤベェわ。
— のあ (@noah_orberg) 2018年1月6日
あと、どうでもいいけどパーカー着てるとこういう悩みもでる
パーカー着てると、QC30の耳にかける部分がちょうどフードのそれみたいになる
— のあ (@noah_orberg) 2018年1月11日
計4本生えてる
— のあ (@noah_orberg) 2018年1月11日
まだ購入から一月も経ってないけど、めっちゃいい。
neovim/go-clientにcontributionした話
Noahです。
この記事は
↑の23日目の記事です。
言わずと知れたNeoVim、その中の機能にRemotePluginがあります。
簡単に言ってしまうとNeoVimのプラグインを別プロセスで動かすもので、原理的にMsgpack-RPCを使えばどんな言語でもプラグインが書けてしまう素晴らしいものです。
自分はVim(ないしはNeoVim)歴4年位なのですが、Vim好きが高じて最近は趣味でNeoVimプラグインをGolangで書いています。
最近自分のメイン言語になっているGolangで書く際は、neovim/go-clientを利用しています。
そして今回は、このライブラリにコントリビューションした ~かった~ 話
何したのか
vim、NeoVim、Golangにコントリビュートしたい!という気持ちは以前からあり、ちょうどIssueが立っていたneovim/go-clientの機能追加を行いました
といっても、メインで開発をしている方が立てた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プラグインに関することなので、よろしければどうぞ
ちなみにこの記事冒頭でもうすぐgithub contributionが4桁行きそうだと言いましたが、
4桁行きました🎉(感動)
今年買ったもの、読んだもの、借りたもの
Noahです。
今年買ったもの、読んだもの、借りたものについて書いておく。
記憶にないものもあるけど、覚えてるものだけ。
機器系
MDR-1000X
言わずと知れたモノ。35kくらいするけど、現在バイト先の先輩、同期が総勢5, 6人持ってる。 自分もちょうどBluetoothヘッドホンが欲しかったので購入。
ノイキャンが素晴らしく、うちの大学の学食で着けてると別世界になる。
ErgoDox
これは先輩に借りてるもの。バイト先で使ってる。
Twitterで使いたいとつぶやいていたのを先輩が捕捉してくれていたらしい。
最初全く慣れなくて、作業効率が1/10くらいになってた。
実は今もまだ慣れてなくって、作業効率が3/4くらいになるので、考える作業が多いときのみ使っている。
使わないときと使ったときの差は(不慣れによる作業効率低下を無視すれば)歴然だった。最高すぎた。慣れたい。
本の類
ゼロから作るDeepLearning
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る
いうてそこまで読めてない。春休み中、機械学習、深層学習をやるモチベーションがあり、(謎の)インターンとか参加したけどそこでは全くディープラーニング関係のことをやらなかったのでしばらく積んでいる。
(ちなみにその(謎の)インターンではIoT関係のゴニョゴニョをした。)
そのうち読みたい。
おいしいClojure入門
おいしいClojure入門 (Software Design plus)
- 作者: ニコラ・モドリック,安部重成
- 出版社/メーカー: 技術評論社
- 発売日: 2013/09/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
先輩がClojureの本を図書館から借りて読んでいて、興味出たので図書館で手頃に読んだ。
WEB関係のところしか未だ読んでいないけど、面白い。Golangとは違って面白い。
Real World HTTP
Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術
- 作者: 渋川よしき
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
某氏から誕生日に贈られたもの。GoでHTTPの実装をするのでなかなか良かった。しかも標準パッケージ。
たまに読み返す。
Webを支える技術
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- 作者: 山本陽平
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/08
- メディア: 単行本(ソフトカバー)
- 購入: 143人 クリック: 4,320回
- この商品を含むブログ (183件) を見る
これ、本当は去年の大学の授業でやっていた。
今のバイト先に決まったときに、Web系の予習復習するため読んだ。授業でAPIサーバーとクライアントを作成していて、それを元に読み返して復習した。
Web API: The Good Parts
- 作者: 水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/11/21
- メディア: 大型本
- この商品を含むブログ (7件) を見る
これは、買ったけど未だに読めていない本。REST API の勉強用と思ったが、買ったその頃からgRPCを扱い始めたので未だ読めてない。
冬休み読もう。
みんなのGo言語
- 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太,稲葉貴洋
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/09
- メディア: 大型本
- この商品を含むブログ (4件) を見る
今のバイト先に入る際、買って読んだ。Golangで書くことは事前に知らされてて知っていたけど、それまでHaskellばっか書いてたので不安だったが、下の本と共に読んでなんとかなってる。
プログラミング言語Go
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者: Alan A.A. Donovan,Brian W. Kernighan,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2016/06/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
これは会社で読んだ本。コードレビューの際に参照したりしていた。みんなのGo言語よりも最初に読むべきだったと思っている。
Goならわかるシステムプログラミング
- 作者: 渋川よしき
- 出版社/メーカー: Lambda Note
- 発売日: 2017/10/19
- メディア: テキスト
- この商品を含むブログを見る
これは秋葉原で行われた技術書店で早い目に発売されてて、偶然会ったバイト先の先輩にオススメされたので買ってみた。著者がReal World HTTPと同じ方で、Goの実装が書かれているので読みやすい。
グッド・マス
- 作者: MarkC.Chu?Carroll
- 出版社/メーカー: オーム社
- 発売日: 2017/07/14
- メディア: Kindle版
- この商品を含むブログを見る
今年入って(多分)最初に読んだ。最初はモロ数学だけど、徐々に論理型言語Prologとか関数型言語とかの話になってきて面白かった。読んだほうが良い。
入門vi
- 作者: リンダラム,アーノルドロビンス,Linda Lamb,Arnold Robbins,福崎俊博
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2002/05/01
- メディア: 単行本
- 購入: 14人 クリック: 193回
- この商品を含むブログ (75件) を見る
これは今年買ったものではなくて、Linuxでプログラミング始めた頃から持っていた(WindowsでPerlスクリプトで遊んでた頃はNoEditorを使っていた)。
以前からリファレンス的(というよりかなり大雑把に)に読んでたが、今年からまともに読み始めた。
普段はNeoVimを使っているけど、やっぱvi系は最高ですわ。
DUO 3.0
- 作者: 鈴木陽一
- 出版社/メーカー: アイシーピー
- 発売日: 2000/03/15
- メディア: 単行本(ソフトカバー)
- 購入: 197人 クリック: 3,012回
- この商品を含むブログ (723件) を見る
- 作者: 鈴木陽一
- 出版社/メーカー: アイシーピー
- 発売日: 2000/03
- メディア: 単行本
- 購入: 152人 クリック: 474回
- この商品を含むブログ (421件) を見る
英語勉強用。同期と比べると絶望的壊滅的に英語ができないのでCDと合わせて聞く&&読んでる。
例文が面白いので良い。
本以外の大きな買い物はMDRしか買ってないことに気づいた。
neovim/go-client入門
Noahです。
この記事は
↑の、13日目の記事です。
どうでもいいですが、GithubのContributionが4桁行きそうです
結構ひとりで感動してる
本題
Vim(ないしはNeoVim)のプラグインを書きたい人、いますよね???
Vimが好きなら誰しもが一度は作りたいと思ったことがあるはず。
標準で搭載のVimscriptを駆使してもいいですが、Goで書けると結構いいよ、というお話
前提としてGolangがチョットかけるのと、環境整備はしてあること、あとは .vimrc
ないしはinit.vim
を設定したりしたことあるひとなら多分大丈夫です。
公式READMEの内容が(自分の英語力不足で)ちょっと最初理解できなかったのでそこら辺の敷居を低くする名目も兼ねて、READMEの内容をちょっとやります。
HelloWorldに相当するであろうものが以下です(一応、公式READMEにsampleとしてあるが、ファイル構造ガン無視だったりして最初戸惑ったのでいっそまとめました。)
ちなみに自分の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
ここいらは各自のプラグイン管理ツール(NeoBundle, deinなど)によった書き方をしてください。
" deinの例 call dein#add("NoahOrberg/helloworld.nvim")
そしたらあとは、nvimを起動して、:echo Hello("world")
と関数を呼び出してみてください
Exコマンドを打つところに Hello world
と、こんな感じに出てくれば成功です。
これでVimscriptからアクセスできるHello関数を定義できました🎉
内部でやってることはそんなに難しくなくて、
Golangで関数の定義をする。
ちょっとvimscriptを書いてRegisterする
ことをやっているだけです
Golangで関数の定義をする
9-11行目で関数をかいて、15行目で関数をOption付きでRPCで通信できるように登録してるだけです
ここの plugin.FunctionOptions{...}
っていうのが肝で、これでArgsの数とか制限しないと、後述しますがスライス外参照でpanicしたりします。(関数内で引数の数見ればいいんですが、こっちのほうがよりスマートです)
例でやっていたのはただの関数なので、(string, error)
を返す感じになっており、error が nil じゃなければNeoVim側でエラー返すようになっています。
ちょっとvimscriptをかいてRegisterする
さすがになんでも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のコメントに書いてたお話は急遽
の 23日目でお話します。
暇な人、また読んでね。
neovimプラグインをGolangで書いた話
Noahです
そもそもなぜGolang?
Pythonとかもっといいのあるんじゃないの?とか思うかもしれませんが、Pythonで書く場合は実行時にPython3の処理系が必要で、それを導入するのが最初すごくだるかった経験があり、
Golangならバイナリを渡すだけで(vimscriptを別途用意する必要があるが)さくっとプラグイン導入できちゃう(簡単!
さらに、個人的に静的型付け言語で書きたかったのもあります。
何作ったのか
gistの簡易なクライアントを作りました
gist上のファイルをLoad、編集してUpdate、さらに、単一ファイルのUploadも可能にしてあります
このプラグインのために別途、
以前作ったgilbertにGistにアクセスしてやる系のメソッドをまとめた。
開発に使ったライブラリ
neovim/go-client と言うものがあります
これは、neovimとmsgpackで通信するためのライブラリです
開発中に思ったこと
dein.vimで導入する場合にはMakefileを作って、
call dein#add('NoahOrberg/gilbert.nvim', {'build', 'make'})
とすると、実行ファイルも生成してパス上に置くようにするなどすれば全自動でできるけど、ベンダリングがこの場合確かできなかったので注意が必要。
さらに、Golang側で スライスのRangeOutでパニックしても、nvim側で知る術はないため要注意です。chがcloseとかしてると結構気づく(反応がなかったりすると、 Exコマンドの:echo
で通過しているかデバッグしている際に気づくことが多い)
デバッグの際に、いつものクセでpp.Println("1")
などのように標準出力に吐こうとすると、msgpackのchがcloseしたりしたので要注意です(そりゃそうなんだけど、これでかなり時間溶かした)。
後日談
実はこれ、思い立ったが吉日で、うちの大学の学祭中に部屋にこもりっきりでガンガン書いて、
学祭が終わる頃の花火の打ち上げが行われる際には、ある程度の形にはなってました。
あと、個人的にはゲストの大橋彩香さんに会えなかったのがすごく残念です。
今度バンドリのライブ、チケット取れたら行きます。
しばらくはnvimのプラグイン作成であそべそうです。
Pythonでワンライナーぱとかーたくしー
Noahです。
友人に@flying_hato_bus って言う人がいるんですが、その人にPythonって何からやったら良いの?ってきいたら「ぱたとくかしー」って言われたので、よくわからないまま実装した。
この問題だった
Python10行くらいしか書いたことないけど、いい感じに一行で書いた。
いや、importしてるから一行じゃない。
MashupAwards(会津)に出てきた
Noahです。
MashupAwardsというのの会津で行われたやつに参加してきました。
以下自分の役割ばかりの話なので最初に思ったことを書きますが、やっぱVRすごいって思いました(僕もやってみたくなった)
あとは、発想と、それをいかにして実現するか、というものが結構大事で、特に発想力を身に着けたいなと思った。
提供APIとかが結構あったのですが今回の自分のものではほとんど利用していなく、ヘルス管理にWatsonを利用してみようともおもったのですがいかんせんデータが少ないのと、活かす方法を考えている間に時間が溶けていったので、物事を柔軟に考える力も欲しいと思いました。
何作ったの
ずばり、赤べこによる健康管理的なモノ
@flying_hato_bus という僕の友人がいるんですけど、彼の赤べこ云々ネタが最近結構続いていて、それにあやかった感じです。はい。
ちなみに彼のエントリのほうに詳しいこと書いているので、自分は自分の所感を書いていくだけにします。
何したの
健康管理アプリのバックエンド担当しました。
やることとしては、SmartWatchから飛んでくる脈拍を逐次記録、クライアント(管理画面用)に管理用データを返す、赤べこの首振り制御用に心拍データをBPMに変換する処理して返す、等。
ユーザ認証つけたかった感がある(手抜きして付けてない)
あと、別にやらなくて良かったのですがNginxを使ってプロキシなどなどの設定をゴテゴテしてました。
セキュリティグループの概念の存在がわかっていなくて前回の石巻ハッカソンでは利用できていなかったのですが(というかその時はAPIサーバーとクライアント接続の時間がなくAPIサーバーは作ったがつかわれなかった)、今回は事前に調査なりしたのでそこそこ有効活用できたと思います。
こぼれ話
やっているとかなりハプニングというか最高のイベントが起こりすぎました。
赤べことサーバー間通信、未実装問題
こればっかりはどうしようもないのですが、赤べこ&その制御用ラズパイの担当のはとバスくんがスライドを作り始めたので、担当箇所終わったのかなと思っていたら、
まさかのラズパイとサーバー間通信できていないという致命的な問題が、開発時間終了30分前に見つかる(ちなみにサーバーのエンドポイント自体は完成しているため、ラズパイ対応のみ)
スライド作成は僕にはセンスが壊滅的にないため無理なので、そこの部分をコーディングし始めたのですが、なんと15分前に自前のモバイルWifiが何故か圏外になるという最高のイベントが発生して軽く死にかけました
が、なんとか企業の方のWifiで持ちこたえることができました
エンドポイントの仕様とか明確になってない
これは完璧自分が悪いのですが、各エンドポイントの仕様が曖昧すぎてクライアントに迷惑をかけすぎました。
モックを早い段階で適当に書いてAWSのEC2上にデプロイしておいたのですが、そんなことするより先に仕様をすべてすぐに決めるべきでした。
というわけで知見
- やっぱり深夜とかまでみんなで一箇所に固まって開発するのは楽しい
- ハッカソン中に行く富士の湯は最高。
- 注意すべきところ
- 仕様ちゃんと決めよう
- ちゃんとしたネット環境を準備しよう
- 役割ちゃんと分担しよう
ちなみに、APIサーバーを完成させた後(最終日の昼前から未実装部分発覚まで)は完全にサーバーのLog監視マンになっていた。