2019/02/05


現在は設定ファイルを読み込む仕様に変更しました。詳細はリポジトリの README.md を参照下さい。

Language Server はとても便利なので最近ではコーディングの時は常に Language Server を有効にしているけど、全く要望が無い訳ではないです。

  • 好みの Lint でコードをチェックしたい
  • 特定言語の Language Server が無い
  • そもそも編集中のファイルがソースコードではない

例えば Vim script には現状、Language Server がありません。これは言語の特性上、パースし辛らかったり、型情報が全くないので補完候補を作り出せない等の理由もあります。でも補完よりもまず Language Server の Diagnostic が欲しいと思う訳です。

そこで、どんな言語であろうとも Lint ツールが grep と同様の形式で結果を出力してくれさえすれば Language Server にしてしまうコマンド efm-langserver を作りました。

GitHub - mattn/efm-langserver

efm-langserver General purpose Language Server that can use specified error message format generated...

https://github.com/mattn/efm-langserver

以下でインストール出来ます。

go get github.com/mattn/efm-langserver/cmd/efm-langserver

仕組みは haya14busa さんが reviewdog の Vim script 対応の際に Vim のオプション、errorformat をパースするライブラリ errorformat を作っておられたので、各 Lint コマンドが出力する行番号、列番号、メッセージをパース、その情報を Language Server Protocol でテキストエディタに教えてあげようという物です。なので

grep 形式の出力をする Lint ツールであれば Language Server になれてしまう訳です。

設定には若干、シェルスクリプト等の知識が必要になります。例えば ERB のファイルを編集するのであれば以下のコマンドでシンタックスチェックを行い grep 形式で出力出来ます。

$ cat foo.erb | erb -x -T - | ruby -c

ですので vim-lsp (Vim の Language Server Client) から使うには以下の様に設定します。(offsetを1にしているのはshebangを除ける為です)

augroup LspERB
  au!
  autocmd User lsp_setup call lsp#register_server({
      \ 'name''efm-langserver-erb',
      \ 'cmd'{server_info->['efm-langserver''-offset=1''-stdin', &shell, &shellcmdflag, 'erb -x -T - | ruby -c']},
      \ 'whitelist': ['eruby'],
      \ })
augroup END

動かすとこんな感じになります。

erb

また Vim script には vint という Lint ツールがあるので vim-lsp の設定は以下になります。

augroup LspVim
  au!
  autocmd User lsp_setup call lsp#register_server({
      \ 'name''efm-langserver-vim',
      \ 'cmd'{server_info->['efm-langserver''-stdin', &shell, &shellcmdflag, 'vint -']},
      \ 'whitelist': ['vim'],
      \ })
augroup END

エラーの出力形式が grep と少し違う場合には -efm というオプションで調整出来ます。詳しくは errorformat のページを参照して下さい。また Lint ツールが標準入力を読み込んでくれる場合は上記の様に -stdin オプションを付けますが、例えば make コマンドの様に標準入力を読んでくれないコマンドを使う場合はこのオプションを外して下さい。

Go言語による並行処理 Go言語による並行処理
Katherine Cox-Buday
オライリージャパン / ¥ 3,080 (2018-10-26)
 
発送可能時間:在庫あり。

Posted at by



2019/01/02


正月、皆が寝静まった後の時間を使ってリアルタイム物体認識を2本作ってみた。

TensorFlow Lite 版

GitHub - mattn/webcam-detect-tflite
https://github.com/mattn/webcam-detect-tflite

TensorFlow Lite は Google が開発している TensorFlow のモバイル環境向開発環境およびランタイムで今回は C++ で書いた。モデルファイルは toco 等で変換して使用します。本来 TensorFlow Lite は Linux 向けにだけ提供されているけど僕の環境は Windows なので匠の技によりポーティングされている。パフォーマンスはそれほど良くない。

mobilenet ssd というモデルの、座標情報を出力しないモデルを使うと Intel Core i5 なノートPC(メモリ16G)で 4~5fps くらい出る。

スマホ等では自分から物体にカメラを向けるはずなので用途によっては座標情報は必要ないかも。

menoh 版

GitHub - mattn/webcam-detect-menoh
https://github.com/mattn/webcam-detect-menoh

PFN (Preferred Networks) 社が GitHub 上で開発している menoh という DNN 推論ライブラリがあり、これの Go 言語バインディング go-menoh を使ってリアルタイム物体認識を作ってみた。こちらは Go 言語なので以下の3つの goroutine を使って平行処理を行っている。

  • カメラからの画像キャプチャ
  • リサイズと推論
  • 画面描画(メインgroutine)

Intel Core i5 なノートPC 上で vgg16 というモデルを使うと 3fps 程度。resnet50 というもう少し軽いモデルを使うと 6~7fps くらい出る。

Posted at by



2018/12/25


先日、Go Advent Calendar の記事の中で Language Server について書きました。

Big Sky :: gocode やめます(そして Language Server へ)

はじめに まず始めに言っておかなければなりません。 gocode 今まで本当にありがとう この記事は、Go 言語歴10年になる僕がこれまで愛用してきた Go 言語のコード補完ソフトウェア gocode...

https://mattn.kaoriya.net/software/lang/go/20181217000056.htm

僕は Vim を使っていて、幾らかの言語の開発環境は vim-lsp に移行できたのですが C/C++ を扱うケースだけ vim-lsp に移行できず vim-clang を使ってきました。C/C++ は clangd という Language Server を使うのだけど何故か clangd サーバがうまく補完候補を出してくれませんでした。調べてみると clangd は vim-clang の様に .clang ファイルを読み取ってくれず、compile_commands.json というファイルを読み取っているらしいのです。フォーマットは以下の様になっています。

[
 {
  "directory": "C:/dev/foo",
  "arguments": [
   "gcc",
   "-c",
   "-I.",
   "-DWIN32",
   "-s",
   "foo.c",
   "-o",
   "foo.o"
  ],
  "file": "foo.c"
 }
]

一つ二つなら自分で書く事も出来るのですが、ソースファイルが沢山ある場合にこんなの作ってられません。cmake を使っているプロジェクトであればこれを自動で生成してくれる方法があるらしいのですが、Makefile からは作ってくれません。これを自動で作る方法無いかなと調べていたら compiledb というコマンドがある事に気付きました。

GitHub - nickdiego/compiledb: Tool for generating Clang's JSON Compilation Database files for make-based build systems.

Compilation Database Generator Tool for generating Clang's JSON Compilation Database file for GNU ma...

https://github.com/nickdiego/compiledb

このコマンドを以下の様にインストールします。

pip3 install compiledb

インストールしたらいつもの make の手順に compiledb を付けて以下の様に実行します。

compiledb make

すると全てのビルドが終わったタイミングで compile_commands.json が生成されます。後は vim-lsp から補完を行えば vim-clang よりも高速に入力補完が行える様になります。

快適~

Posted at by