1.0になったVisualStudioCodeの強みと弱点

ついにVisualStudioCode(以下、VSCode)の1.0がリリースされました。ずっとVim以外の、人に勧められるエディタを探していた私にとって、VSCodeはまさにちょうど良いエディタでした。 このVSCodeで、エッジの振られている強みと、弱点を紹介します。

強み1 入力補完機能が優れている

VisualStudioの名を冠するだけあって、入力候補機能が標準で付いています。 C#やJSは文脈を読んで補完してくれます。文脈を読めない形式でも、同じファイル中に出てきた単語を補完候補として利用できます。 スニペットや言語対応の拡張フレームワークが用意されており、拡張機能をインストールすることで多くの形式に対応できるようになります。

強み2 デバッグ機能が整備されている

ブレイクポイントをつけたり、変数を見たりするデバッグ機能が、当然のように標準で付いています。4つの機能タブのうち、1つがデバッグになっています。 デバッグ機能の拡張フレームワークが提供されており、今後も拡張機能により様々な言語がサポートされていくと思われます。

強み3 カスタマイズしなくても使える

様々な言語が標準でシンタックスハイライト、入力補完が使えるようになっています。ShellScriptや、Dockerfileといった今までエディタがあるようでなかったものまで、標準で対応しています。 インストールして、作業ディレクトリさえ指定すれば、そこそこ良い感じの作業環境が手に入ります。

強み4 gitフレンドリーである

4つの機能タブのうち、1つがgitのためのタブになっています。初めてgitを使う人でも使えるように、マウス操作で、diffの確認、commit、push、pullができるようになっています。

強み5 Syntaxエラー、Lintエラーが表示できる

IDEでよくお世話になる、Syntaxエラーの表示、またLintエラーの表示ができるフレームワークが乗っています。Lint用の拡張フレームワークが提供されており、今後も拡張機能で様々な言語が対応していくと考えられます。

ほかの特徴

  • F1キーで呼び出す、全ての機能の起点となるコマンドパレットがあります。またコマンドは正確に覚えていなくても使えるように、候補の絞り込みがよく効くようになっています。
    • ただし、日本語設定では、検索する文字も日本語になってしまうため、言語設定を英語にするのがおすすめです。
  • WindowsMacLinuxマルチプラットフォーム対応。
  • 複数ファイルを同時に開いて、並べて表示できます。
  • jsonの設定ファイルにより、キーバインドや各種設定を行うことができる。
  • メソッド名の一括変換など、今までIDEでしか得られなかったリファクタリングの機能が利用できます。

弱点1 拡張機能で拡張できる範囲が限定的

Atomのようになんでも拡張できることはなく、拡張可能な部分は、デバッガーや、Linter、文章編集など限られた範囲でしか行うことができないようになっています。 例えば、拡張機能によって新たな画面や、ボタンを追加することはできません(DOMの操作はできない)。

弱点2 設定、デザインツールは含まれない

.NETのプロジェクトファイルを、mavenの設定を編集するためのGUI画面や、ASP.NET等の画面デザインツールは、今の拡張機能では作ることはできません。 それらはテキストベースで入力し、拡張機能によってあくまでテキストベースの入力支援や、Linterによって入力ミスを指摘する機能しかありません。

弱点3 デバッグやタスクの実行には専用の設定ファイルを用意する必要がある

.NETやJavaIDEのように、プロジェクトの作成と同時にデバッグを開始はできず、専用のjson形式の設定ファイルを記述する必要があります。

弱点4 ディレクトリの文脈を読まない

VSCodeを起動後、作業ディレクトリを指定すると、ディレクトリ下のファイルを全てをディレクトリツリーで表示します。例えば、ソースコードに関連する設定ファイルや生成ファイルがあったとしても、全てのファイルをそのまま表示を行います。VisualStudioやEclipseJavaのようにディレクトリの文脈に応じた表示はできません。

弱点5 起動に多少の時間がかかる

VSCodeは起動や、プロジェクトファイルディレクトリの変更には、早くとも2、3秒はかかります。よって、ちょっとした設定ファイルの編集には不向きと思っています。

以上

入力補完、Git、デバッグにエッジを向けた、テキストエディタ以上、IDE未満のエディタと言えます。私はSIerでアーキテクトとして開発技術の選定を仕事にしており、IDEにさほで期待できないプラットフォームの場合に、多くの開発者に勧められる良いエディタを探していました。私一人であればVimを拡張すれば済みますが、多くの開発者にVimを強要するわけにはいきません。そんな位置付けにちょうど良いエディタ出してきたのは、さすがMicrosoftだと思います。私自身、VisualStudioCodeをgolangの開発に日々利用しています。

あと、私はVisualStudioCode上でVimの入力をエミュレートする拡張機能を作成しています。最近、他のVimプラグインにダウンロード数を抜かれましたが、私の拡張機能が一番イケてると思っているので、Vimerの皆さん良ければ使ってやってください。

auのiPhone6SをSIMフリー化して、テザリング可能なDMMモバイルを使う

f:id:j74th:20160406214219j:plain

auでiPhone6Sを発売日に購入。世の中は格安MVNOのSIMの世の中になったので、そちらに乗り換えたいと思った。auの端末は購入から半年たつと、SIMロック解除可能とのこと。

audocomoとは利用電波が異なるため、auのMVNOを使う必要があると思っていた。しかし、auのMVNOではiPhoneテザリングできない可能性があるとあり、踏み切れなかった。ところが、iPhoneauでもdocomoでも同じ機種を使っている事がわかった。そのため、SIMフリー化さえすれば、auiPhoneでもdocomoのMVNOが利用できるらしい。

実際やっている人が見つからなくて不安だったが、最近やっている人が現れた。

SIMロック解除したauのiPhone6sで、格安SIMのFREETELにMNPしたぞ! | むねさだブログ

そして、自分でもやってみることにした。

まず、auSIMロック解除は、以下のURLからできる。まずiPhoneSIMロック可能かどうかの判定を行い、その後SIMロック解除のリンクが現れる。

https://au-cs0.kddi.com/au-support/sui/SUI001W001/SUI0010001BL.do

必要な情報であるIMEIは、設定→一般→情報から、確認できる。長押しするとコピーもできるが、スペースが入ってしまい、貼付け時にはスペースを削除して、切れてしまった末尾の番号を入れる必要がある。

SIMロック解除を受け付けましたと表示されて、実際にいつ解除されたのかはわからなかった。とりあえず解除されたらしい。

いかのサイトにある電話番号に電話をかけてMNP予約番号を発番してもらう。スマホでは、電話するしか方法がないらしい。なお、この時に契約時の暗証番号が必要だった。

www.au.kddi.com

私は、北陸出身のため、DMM mobileにMNPで契約することにした。

mvno.dmm.com

MNP予約番号を入れて申し込むと、2日ほどでSIMが送られてきた。マイページから、「手続きを開始」ボタンを押すと、家にいながらauからDMM mobileへのMNPが行われる。

一度iPhoneの電源を切り、SIMを入れ替えて、再起動する。一度wifiにつなぎ、APN構成プロファイルをダウンロードしてインストールする。案内にはAPN設定を手入力する方法も書かれているが、私のiPhoneでは入力することができず、wifiに繋げてAPN構成プロファイルをダウンロードする必要があった。

iOS端末 | SIM挿入手順・APN設定 - DMM mobile

1時間ほどでdocomoのネットワークが表示されるようになるが、実際にネットに繋がるまでに3時間ほどかかった。SIMロック解除に失敗していたのかと、どぎどきしたが、開通が終わっていないだけだった。なお、DMM mobileは手続きの開始と完了時にちゃんとメールで連絡が来る。完了のお知らせが来るまでは、docomo表示は現れてもネットワークに繋がらないので注意。

金額を計算したところ、このままauで契約解除可能月までの残り17ヶ月分払い続けているよりも、MVNOの方が8万円も安くなることが分かった。時代は変わったものだ。

golangでlogを標準出力とテキストファイルの2箇所の出力する

2箇所に出力したい場合、io.MultiWriterが便利。

logfile, err := os.OpenFile("./test.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
    panic("cannnot open test.log:" + err.Error())
}
defer logfile.Close()

// io.MultiWriteで、
// 標準出力とファイルの両方を束ねて、
// logの出力先に設定する
log.SetOutput(io.MultiWriter(logfile, os.Stdout))

log.SetFlags(log.Ldate | log.Ltime)
log.Println("Log!!")