NoahOrblog

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

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

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日目でお話します。

暇な人、また読んでね。

neovimプラグインをGolangで書いた話

Noahです

Golangでneovimプラグインを書いた話をします

そもそもなぜGolang

Pythonとかもっといいのあるんじゃないの?とか思うかもしれませんが、Pythonで書く場合は実行時にPython3の処理系が必要で、それを導入するのが最初すごくだるかった経験があり、

Golangならバイナリを渡すだけで(vimscriptを別途用意する必要があるが)さくっとプラグイン導入できちゃう(簡単!

さらに、個人的に静的型付け言語で書きたかったのもあります。

何作ったのか

gistの簡易なクライアントを作りました

github.com

gist上のファイルをLoad、編集してUpdate、さらに、単一ファイルのUploadも可能にしてあります

このプラグインのために別途、

github.com

以前作ったgilbertにGistにアクセスしてやる系のメソッドをまとめた。

開発に使ったライブラリ

neovim/go-client と言うものがあります

github.com

これは、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って何からやったら良いの?ってきいたら「ぱたとくかしー」って言われたので、よくわからないまま実装した。

この問題だった

www.cl.ecei.tohoku.ac.jp

Python10行くらいしか書いたことないけど、いい感じに一行で書いた。

gist.github.com

いや、importしてるから一行じゃない。

MashupAwards(会津)に出てきた

Noahです。

MashupAwardsというのの会津で行われたやつに参加してきました。

mashupawards.connpass.com

以下自分の役割ばかりの話なので最初に思ったことを書きますが、やっぱVRすごいって思いました(僕もやってみたくなった)

あとは、発想と、それをいかにして実現するか、というものが結構大事で、特に発想力を身に着けたいなと思った。

提供APIとかが結構あったのですが今回の自分のものではほとんど利用していなく、ヘルス管理にWatsonを利用してみようともおもったのですがいかんせんデータが少ないのと、活かす方法を考えている間に時間が溶けていったので、物事を柔軟に考える力も欲しいと思いました。

何作ったの

ずばり、赤べこによる健康管理的なモノ

@flying_hato_bus という僕の友人がいるんですけど、彼の赤べこ云々ネタが最近結構続いていて、それにあやかった感じです。はい。

ちなみに彼のエントリのほうに詳しいこと書いているので、自分は自分の所感を書いていくだけにします。

hatobus.hatenablog.jp

何したの

健康管理アプリのバックエンド担当しました。

やることとしては、SmartWatchから飛んでくる脈拍を逐次記録、クライアント(管理画面用)に管理用データを返す、赤べこの首振り制御用に心拍データをBPMに変換する処理して返す、等。

ユーザ認証つけたかった感がある(手抜きして付けてない)

ちなみに初めてハッカソンAWSのEC2を利用しました。

あと、別にやらなくて良かったのですがNginxを使ってプロキシなどなどの設定をゴテゴテしてました。

セキュリティグループの概念の存在がわかっていなくて前回の石巻ハッカソンでは利用できていなかったのですが(というかその時はAPIサーバーとクライアント接続の時間がなくAPIサーバーは作ったがつかわれなかった)、今回は事前に調査なりしたのでそこそこ有効活用できたと思います。

こぼれ話

やっているとかなりハプニングというか最高のイベントが起こりすぎました。

赤べことサーバー間通信、未実装問題

こればっかりはどうしようもないのですが、赤べこ&その制御用ラズパイの担当のはとバスくんがスライドを作り始めたので、担当箇所終わったのかなと思っていたら、

まさかのラズパイとサーバー間通信できていないという致命的な問題が、開発時間終了30分前に見つかる(ちなみにサーバーのエンドポイント自体は完成しているため、ラズパイ対応のみ)

スライド作成は僕にはセンスが壊滅的にないため無理なので、そこの部分をコーディングし始めたのですが、なんと15分前に自前のモバイルWifiが何故か圏外になるという最高のイベントが発生して軽く死にかけました

が、なんとか企業の方のWifiで持ちこたえることができました

エンドポイントの仕様とか明確になってない

これは完璧自分が悪いのですが、各エンドポイントの仕様が曖昧すぎてクライアントに迷惑をかけすぎました。

モックを早い段階で適当に書いてAWSのEC2上にデプロイしておいたのですが、そんなことするより先に仕様をすべてすぐに決めるべきでした。

というわけで知見

  • やっぱり深夜とかまでみんなで一箇所に固まって開発するのは楽しい
  • ハッカソン中に行く富士の湯は最高。
  • 注意すべきところ
    • 仕様ちゃんと決めよう
    • ちゃんとしたネット環境を準備しよう
    • 役割ちゃんと分担しよう

ちなみに、APIサーバーを完成させた後(最終日の昼前から未実装部分発覚まで)は完全にサーバーのLog監視マンになっていた。

Golangを使っている方は(ライブラリの違いはあれど)結構いたので、やっぱりGolangいいなって思った。

携帯の入力的なアレ

Noahです。

授業後に後輩と演習室で話し込んでたときに、ふと彼がAOJの問題をC++で解き始めたのでその隣で同じ問題をHaskellで実装してました

もともと競プロをやっていたとかではなくて、純粋にHaskellを書きたかっただけです。はい。

gist.github.com

Revisionを見ると分かるんですけど、最初は愚直な実装をしてて、

toChar :: Char -> Int -> Char
toChar x n = case x of
               '1' -> solve1 n
               '2' -> solve2 n
               '3' -> solve3 n
               '4' -> solve4 n
               '5' -> solve5 n
               '6' -> solve6 n
               '7' -> solve7 n
               '8' -> solve8 n
               '9' -> solve9 n

solve1 :: Int -> Char
solve1 1 = '.'
solve1 n = iSolve1 n '.'
    where iSolve1 1 s = s
          iSolve1 n s = case s of
                          '.' -> iSolve1 (n-1) ','
                          ',' -> iSolve1 (n-1) '!'
                          '!' -> iSolve1 (n-1) '?'
                          '?' -> iSolve1 (n-1) ' '
                          ' ' -> iSolve1 (n-1) '.'
solve2 ...

なんていうコードを solve9 までやるという愚直ぶりだったのですが、後に

preset :: []String
preset = [".,!? ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]

toChar :: Char -> Int -> Char
toChar x n = solveEx (n - 1) $ preset !! (ord x - ord '0' - 1)

solveEx :: Int -> [Char] -> Char
solveEx n xs = xs !! (n `mod` length xs)

とすることで、愚直な実装を回避することができました🎉

最近仕事でGolangしか書いていないので、他の言語を触る機会がほぼほぼなかったので新鮮な気分だった👀

加減乗除で10

Noahです。

数字を4つ出されて、加減乗除好きな演算子を使って10になるようにする、という診断メーカーのツイートを見て、深夜に好きな配信者のASMR生配信を聞きながら、つっと書いてみた。

gist.github.com

実行時: f:id:NoahOrberg:20171021025646p:plain

トリプルの一つ目が、演算子の順、二つ目が、数字の順、最後は演算結果。

この例だと(いいかんじに読み取れば)、出力されたリストの一番最初は (9 - 8) * 7 + 3 となるのが容易にわかる

半分寝て書いてるからあまり(というか多分全然)良くない。付けてる名前も適当すぎる。

そもそも乗除算が優先されるのがされない(infixrをうまく使うのか🤔)ので、出力からいいかんじに考えるくらいの思考力がほしいところ。


p.s. 頭悪い