vscode-digdag

Visual Studio CodeDigdag 向け拡張機能を作成している。名前はvscode-digdag

一番初めのバージョンの公開は 2016年7月19日。すでにおよそ2か月が経過しているので、「作成した」というよりは「作成している」の方がしっくりくる。

開発も、当初はシンタックスハイライトのみを考えていたけれど、オートコンプリート機能をつけたバージョンを今日公開した。

作りはじめたきっかけは

ちょうどDigdagのことに興味が湧き、色々と調べていたところ、Atom, Vim, Emacs にはシンタックスハイライトの拡張機能(など?)があるのに、vscode にはなかったので、いっちょやったろうかと思ったのがきっかけ。

作者の古橋さんは、設定ファイルをYAMLにすることのメリットの一つとして、シンタックスハイライトができること、と言われている(参考)。が、それは見なかったことにして作ってしまった。

最初の頃はDigdagの調査よりも、vscode の調査をしていいる時間の方が長かったような。。。

tokyo.ex #5 に参加した

beam-lang.connpass.com

に参加してきた。19:00 に会社を出て 19:20 分に到着。ギリギリ。

細かいことは置いておいて、印象に残った部分を残しておく。

Phoenix について

@ohrdev さんのお話。

Elixir の公開されているライブラリの数は 3000くらい。他の言語 (Go, node など) は 10万 Over。みんな頑張ろう!

Logger

@tuvistavie さんのお話。Logger は Elixir の特徴を活かして作られてるとのこと。その中でも一番面白いと思ったのは、ログレベルでの出力制御の話。

Logger.debugLogger.error は実はマクロ。ログレベルを info にしてコンパイルすると、Logger.debug はなかったことにされバイトコードに出力されない。コスト 0。

セッショントーク

(トークセッション?)

ユースケースについて

Q. 仕事で使える?
A.
  • apiサーバで使ってる. 1台あたり 300req/sec.
  • HTTP, JSON を OTP に置き換えてる
  • チャットで
Q. Elixir の不得意なところ
A.

全員一致。

Q. Phoenix の不得意なところ
A.
  • ライブラリ
Q. Elang の知識は必要か
A.
  • Erlang を知らないとプロダクションで扱うのは怖い。Elixirよりも重要だった。
  • トラブル対応などに必要。Erlangというより OTP が重要
Q. エコシステムについて
A.
  • 少ない。足りないものは自分で作る。
  • mix に publish 機能があるので、公開は簡単。
  • 名前が ex_{GEMの名前} は要注意。
Q. 生産性 (Rails と比べて)
A.
  • ライブラリ豊富だから Rails の方が作るのは早いんだけど、その後パフォーマンスチューニングの日々が続く。逆に Phoenix は作るのは遅いが、その後のメンテナンスコスト低いので、長い目で見るといいことがあるかも。
  • (メンテナンス性には)関数型とかはあまり関係ない。
  • Rails はソースを追うのがきついな (長年の積み重ねで)
    • Phoenix もいづれは。。。?
Q. 言語の移行. 関数型
A.
Q. 言語の移行. 並列処理
A.
  • Elixir は安定している。Go は Segmentation fault を出す.
Q. マクロは必要か?
A.
  • アプリを作る分には不要。ライブラリを作る時に。
  • ソース読む場合に必要。でも書かない。
Q. スクリプティングに向いてる?
A.

Yes => 1名, No => 3名.

私も No 派。

感想

  • OTP 重要
  • ライブラリ不足
  • 使いどころを間違えなければ、プロダクションで導入可能。

生活環境の変化より2年ほど勉強会には参加できてなかった。久々にこういう場に参加できて楽しかった。

VSCode に Integrated terminal という機能が追加されていた

VSCode 1.2.0 で Integrated terminal という機能が追加されていた。

大雑把にいうと、エディタのウィンドウの一部にターミナルを追加させる機能。

mix コマンドをコマンドパレットから実行できるように拡張機能を書こうとしてたんだけれど、Integrated terminal でいいじゃんって感じ。フォーカスを移動させるショートカットがまだわからないけど、拡張機能を書く意欲は下降気味。というか消失。

Visual Studio Code をコマンドラインから起動させる

問題

コマンドラインから Visual Studio Code を起動したいが、どう設定すればいいか不明。

環境

解決

コマンドパレットから shell Command: Install 'code' command in PATH を実行する。アンインストールも同じ感じ。

参考

Running Visual Studio Code on OS X

Ueberauth: (FunctionClauseError) no function clause matching in Keyword.merge/2

問題

phoenixueberauth_identity を組み込もうとしたところ、コンパイル時に (FunctionClauseError) no function clause matching in Keyword.merge/2 というエラーが発生する。

環境

  • Elixir 1.2.6
  • Phoenix 1.1.4
  • ueberauth_identity 0.2.3

解決

config.exs に設定を追加する。

config :ueberauth, Ueberauth,
  providers: [
    identity: {Ueberauth.Strategy.Identity, [
      callback_methods: ["POST"]
    ]}
  ]

感想

エラーメッセージ・スタックトレースからでは原因の予想が全然つかなかった。 ドキュメントには、設定ファイルに追加しろって書いてある。。。

(PHPUnit 5 未満では)データプロバイダでモックオブジェクトを作成しないほうがいい

前提

PHPUnit 5 未満を使用している(問題の確認をしたのは PHPUnit 4.8.21)。

問題

指定したメソッドが一回だけコールされることを確かめるテストで、指定したメソッドが一回も呼ばれていないのにテストが成功してしまう。

モックオブジェクトはデータプロバイダで生成している。

具体的には

以下のコード(some.php)がある。このテストを実行すると失敗するはず。。。

なのだが、PHPUnit を実行すると成功してしまう。

$ ./phpunit-4.8.21.phar some.php
PHPUnit 4.8.21 by Sebastian Bergmann and contributors.

.

Time: 141 ms, Memory: 12.00Mb

OK (1 test, 0 assertions)

解決

  • モックオブジェクトをデータプロバイダではなくテストメソッド内で生成するようにする。

or

  • テストケース内で $mock->__phpunit_verify() を呼ぶ。

前者のほうがお行儀がよさそう。

参考

この修正でデータプロバイダで生成したモックオブジェクトでもテストが期待通り実行されるようになった(issue はデータプロバイダではなく、依存関係の上流のテストケースで生成したモックオブジェクトだけれども)。

PHPUnit 5.1.3 では期待通りの結果。

./phpunit-5.1.3.phar some.php
PHPUnit 5.1.3 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 111 ms, Memory: 10.25Mb

There was 1 failure:

1) SomeTest::testStubWithProvider with data set #0 (Mock_SomeClass_0cfc834a Object (...))
Expectation failed for method name is equal to <string:doSomething> when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

はてなブログでElixirのコードにシンタックスハイライトを適用する方法

2015/11/18 時点で、ここを見る限りElixir のシンタックスハイライトは未対応。

でも、大丈夫 Elixir と Ruby は見た目が似ていると言われている。ruby を指定しておけばそれっぽくハイライトされる。

defmodule, defmacro などなど Elixir にしかないキーワードも多いけれど、ないよりかはマシな気がする。