Visual Studio Code で編集中のテストコードを実行する

TL;DR

Visual Studio Codeではエディタからのコマンド実行がTasksという仕組みでできてとても便利。

背景

最近エディタをVisual Studio Codeに変えた。エディタのこだわりはそんなになくて、Vim → Emacs → Atom といった順番で2年に一度くらい乗り換えている。だいたいどのエディタにもVimキーバーインドエクステンションがあるのでなんとかなる。

Visual Studio CodeはAtomと同じElectronベースだけど、なぜかAtomよりサクサク動くので気に入っている。Microsoftのリソースパワーに感謝するしかない。

テストの話に移ると、テストを書くのはもちろんソフトウェア品質の担保やリグレッションの防止が目的だけれども、TDD的な文脈では開発のリズムを作るのも目的の一つだ。リズムよくテスト実行しつつ開発するには、エディタで開いているテストをさくさく実行できるのが重要になる。いちいちテストのためにターミナルにもどったりしてまごつきたくない。

仕事でPerlを書いている自分は、がんばってエディタからPerlのテストを実行できるようにしている。EmacsVimでも設定してたし、Atomでも拡張書いたりしていた(参考:
AtomからPerlのテストを直接実行するくん)。

Visual Studio Codeに乗り換えるにあたっても、エディタからテスト実行できるのかが重要なポイントだったのだけど、ちょっと調べたら実現することができた。他のエディタに比べて簡単で、ちょっとうれしくなったので紹介してみる。Perlのテストを実行するという話題だけど、エディタからコマンド実行したいならなんでも適用できる。

やりたいこと

  • エディタで編集中のテストコードをエディタの画面内で直接実行して結果を確かめたい
  • Perlでよく使うTest::Class形式のテストの場合、個別のテストメソッドだけを実行する機能がある。その機能を利用して、エディタ内のカーソル場所付近に書いてあるテストのみを実行したい

できたもの

コマンドパレットから "タスク: テスト タスクの実行" を選んで、自分で定義した"run Perl test here" を実行すれば、カーソルのある場所のテストが実行される。以下のスクリーンキャプチャの例ではmultiplyという名前のテストだけを実行してる。

f:id:hakobe932:20171109223909g:plain

やりかた

標準機能として用意されているTasksを使えばできる。カスタムタスクを自分で定義すれば、任意のコマンドをエディタから直接実行できる。

tasks.json

プロジェクトのディレクトリ直下に .vscodeというディレクトリを作成し、その中にtasks.jsonという設定ファイルを作成する。開いているPerlのテストファイルを実行するのでよければ以下のように書く。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "run Perl test all",
            "type": "shell",
            "command": "carton exec -- prove -v ${relativeFile}",
            "group": "test",
            "presentation": {
                "reveal": "always",
                "panel": "shared"
            }
        }
    ]
}

各項目の意味はドキュメントを参照していただくのが良い。

大事なのはcommandで設定されている内容で、文字通りここに実行したいコマンドを書く。設定内ではいくつか変数が使えて $relativeFile は現在エディタで開いているファイルのプロジェクト内の相対パスが入っている。変数の一覧を見れば使える変数がわかる。

この段階では、開いているテストファイル全体を実行することはできるけど、特定のテストのみを選択して実行することはできないので、工夫をする。

カーソル位置になるテストを実行するためのwrapperスクリプト

ここは少しPerlの事情になるのだけど、PerlのTest::Class形式のテストでは、メソッドごとにテストを書くようになっており、以下のように環境変数を設定することでテスト全体ではなく、特定のテストメソッドのみを実行することができる。

# multiply という名前のテストのみを実行する
$ TEST_METHOD=multiply cartone exec -- prove -v t/Calc.t 

エディタから特定のテストメソッドのみを実行したい場合、エディタのカーソル付近のテストメソッドの名前を取得し、上記の様なコマンドを実行できれば良いということになる。

tasks.jsonの定義ではあまり複雑なことはできないので、wrapperスクリプトを用いて実現する。つまり、tasks.jsonはからは以下のようなコマンドを呼び出すことにし

carton exec -- \
  perl .vscode/exec/run_test_at.pl ${relativeFile} ${lineNumber}

このコマンドの中で、${relativeFile}から得られるファイル名と${lineNumber}から得られるエディタのカーソル位置の行番号をもとに、実行すべきテストメソッド名を見つける。その後、見つけたテストメソッド名を用いてテストを実行する。

wrapperスクリプトは、こういう感じの実装になる。泥臭い感じだけど、特別遅かったりすることもないしちゃんと動く。

Perlにかぎらず同様のテクニックを使えば、カーソル位置の情報を使ってコマンドの実行ができる。

最終的な形

こういう感じ になる。以下のリポジトリに、設定例をまとめてあるので参考にされたい。

github.com

さらなる工夫

Taskはメニューから選ばなくても直接キーボードショートカットに登録できる

.vscode/tasks.json はプロジェクトディレクトリ内に設定するので、リポジトリにコミットして共有してしまえばチーム内で設定を共有できて便利。

これはまだ自分でもやっていないのだけれども、Probrem matcherという仕組みがあって、コマンドの出力結果から問題箇所をエディタ上でハイライトできるような仕組みがある。これを利用すれば、テストが落ちたときに落ちた箇所をハイライトできてかっこいいはず。

感想

Atomで同じことをしようとしたときは拡張を書いたりする必要があってたいへんだったけど、標準機能で達成できたのは手軽でよかった。Visual Studio Codeはターミナルが内蔵されていて、こういうサポートが発展しやすいのだと思う。

Visual Studio Code は TypeScript を書いている人に人気という印象だけど、普通に開発環境としても良くできているし、なぜかさくさく動いていいので、試してみると意外と気にいるかもしれずオススメです。

Java SE 8 実践プログラミングを読んだ

Java9がリリースされた昨今、今更だけど、Kindleで安くなってたので読んだ。

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Java SE8 for the Really Impatientの翻訳本で、Java 8からの新機能であるラムダ式をはじめ、ストリームAPIや新しい日付クラスなどについて詳しく紹介されている。

新機能の紹介おいては、単に記法やライブラリの紹介をしてくれるだけでなく、言語の設計の方針や過去のバージョンのJavaとの互換性などを踏まえた説明がなされていて読み応えがある。例えば、ラムダ式をJavaという言語で表現するために、汎用的な関数型はほとんど使われておらず、用途ごとに関数のように扱えるinterface(= FunctionalInterfaceで注釈される)が定義されていて、そのinterfaceに合致するようにラムダ式を与えるというふうになっている。この方法では既存のJavaのプログラミングの方法を変えずに新しくラムダ式を採用できる……といった内容。

新機能の紹介以外では、9.4章 セキュリティ案件でコラム的に語られている、Java アプレットやJava Web Start がなぜうまくいかなかったかについて著者があれこれ分析しているところが興味深かった。Write once, run anywhereなんてなかったんや……。

あと、この本の特徴としては、章ごとにある練習問題がやたら充実しているというのがある。本に書かれている範囲を超えて自分で考えなければ解けないような難易度で、良い練習になる。僕も1章と2章の練習問題をためしに解いてみた。

github.com

一応問題ごとにテストを書いて動きを確かめられるようにしている。回答のコードはこういう調子。コードを書かないような問もあるので、抜けている番号もある。

3章以降の問題も気が向いたらやりたいけど、JavaFXに依存してる問題があったりしてなんかちょっとテストしずらいなーとなってあんまり気がすすまない。この練習問題は全体的には良い問題が揃ってるんだけど、仕様がはっきりしなかったり、妙に込み入ったことをする必要があったりする。やりやすい問題だけやるくらいでも良いと思う。

結構この練習問題にチャレンジしている人もいて、"Java SE 8 実践プログラミング 練習問題" とかで検索するといくつか見つかって、眺めると面白い。原著のタイトルで検索してもいくつか見つかる。

総じてJava 8の新機能をしっかり学べるし、特にJavaプログラミングの題材がなくても練習問題とかやって楽しめるので良い本だと思う。コレで僕も、「ラムダ式くらいかけますしね!」って言ってもよいはず。あとJava FXの章は読んでないです。すいません。

研究もJavaでやったし、2,3年前はAndroidアプリ書いてたりもしてたので、基本的なJavaは一応書けるというつもりだったけど、だいたい忘れているということもわかった。

ざっとわかるPythonの紹介

普段Perlを書いている自分がざっくりPythonについて調べて発表した時の資料が手元に転がっていたので、せっかくなので公開した。

普段、別の言語でWeb開発している人が、自分の言語のアレはPythonだとコレなのねって雰囲気わかるようになっているといいなと思って作ったけど、見返すとそうでもない気がする。

自分もPython初心者なので、「おいおいまったくまちがっているぜ! 」といったことがあったら教えてほしいです。京都に住んでいるのだけど、関西のPythonコミュニティの雰囲気もよく知らないので情報募集です。

あと資料で紹介しているブログのコードは以下においてある。自分がよくやる感じの薄い設計でかんたんなブログシステムをPythonで書いたらこんな感じかな~ってコードになっている。

github.com

子供が生まれたし運転免許もとった

タイトルの字面がめちゃくちゃ所帯じみているけど、所帯があるのでしかたない。

先日子供が生まれました。子供も奥さんも元気でほっとしています。子供はながめているだけでニコニコできて最高。

子供を連れて移動するのが大変そうっていう心配もあり、運転免許の取得にも取り組んでました。運転免許取得の一週間後に子供が生まれてくれたので、大変タイミングをわきまえている。くわしくはkarimen日記を見てくれ!

現実に子供が生まれると、今後の人生どうやっていくのが良いのかを、あらためて考え始めてしまったりして、自分のことながらおもしろい。とりいそぎ生命保険の勉強をしたりした。健康に働くのが一番得らしい(そりゃそう)。

なおウィッシュはこちらになります。

Kyoto.なんか #3 は明日です!発表者リストも更新

先日ご紹介したKyoto.なんか#3 は明日 8/19(土)に開催です!

kyoto-nanka.connpass.com

イカす発表者のみなさまにも集まって頂きました。

  • moznion さん 続・そして物語は何度目かのアプリ内通知再実装を迎える
  • daaaaaai さん ビジネスプロセスリエンジニアリングの現場
  • t_kyt さん 5分でわかるHTTPキャッシュ
  • sugyan さん 機械学習によるアイドル顔識別について もしくはプログラミングに関する何か (仮)
  • jp_pancake さん Dangerを使ってPRを自動的にチェックする
  • y_uuki さん Redisの負荷対策の話(仮)
  • shokai さん HerokuでSocket.IOをやっていく話
  • side_tana さん Goとエラーと私
  • papix さん 2017年データベースマイグレーションの旅 〜Perl編〜 (仮)
  • pastak さん 夏休みの自由研究 〜React VR編〜
  • ichirin さん MySQL freeze の巻

めちゃくちゃおもしろそうな発表が目白押しですね!まだ若干名参加枠があるのでどうぞご参加下さい

Kyoto.なんか #3 を開催することになりました

みなさん暑いですね。京都はとても暑いです。暑い京都をもりあげるKyoto.なんかというイベントの第三回を開催することになりました。

Kyoto.なんかは、Kyoto.rbやKyoto.jsのような言語ごとの勉強会ではなく Kyoto.* 、つまりプログラミングや技術に関する発表ならなんでもOKの技術勉強会です。

かつての様子はこちら。

そんなKyoto.なんか#は来たる8/19(土)、京都はてなオフィスで開催いたします。現在、発表者を募集中です。ぜひ発表にチャレンジしてみてください。

kyoto-nanka.connpass.com

Rによるやさしい統計学を読んだ

統計勉強してる っていう記事で、途中まで読んでた"Rによるやさしい統計学"を読み終えた。

Rによるやさしい統計学

Rによるやさしい統計学

この本は心理学関連領域の研究者の著者たちが学生向けに、統計ツールのRの使い方を教えてくれるという内容。第I部では基本的なRの使い方と統計学の考え方について、第II部では、実際のデータ処理をする上で必要になる考え方や手法について具体的に紹介してくれる。

数学的理論を学ぶことに主眼をおいた本ではないので、難しい証明は省かれているものの、統計の考え方の直感的な解説がとてもわかりやすい。自分は理論よりの大学の教科書から統計の勉強をはじめたのだけど、この本の解説に触れることで理解があやふやな部分がしっかり理解できたように思う。逆にあまり理論的な手法の根拠などの説明はないので、別の本を参照するのが良さそう。

統計分析を行う課題がたくさん載っているので、実際に手を動かして、統計分析の間隔を掴んでみるのにもこの本は良いと思う。データの入力を手でちまちまやらないといけないので、そこはちょっと面倒。

また、この本の冒頭にあるように、研究のデータを分析する文系の学生を読者として想定している。そのため、取り上げられているテーマは、ある程度そちらに寄っているところはある。特に第II部にはそういったイメージを持った。基礎的な考え方は変わらないはずなので、適宜頭のなかで自分が解決したい問題に対応させて読んでいくと良い。

Rの使い方については、エンジニアであれば読めば簡単に理解できると思う。Rの機能については利用するものを最低限紹介してくれているという感じなので、R言語自体をじっくり学ぶのには向いていない。自分のやろうとしていることがRのどのツールに対応しているかといったことはよく分かる。

全体的には、具体例をふんだんに使って、わかりやすく概念を伝えてくれるし、手を動かして学ぶこともできて、評価が高いのもうなずけた。理論を学べるほんと合わせて読むのが良いと思う。