読者です 読者をやめる 読者になる 読者になる

botchy hack note

TypeScript、Ruby、Golang とか Macとかの備忘録です.間違いがあるとご指摘くださると嬉しいです.

Visual Studio Code で統合端末を毎回起動し直してしまう問題の解法

結論

早く解法を知りたい方のために、結論を最初に書くと、”新しい統合端末の作成” と ”統合端末の切り替え” のキーボードショートカットがバッティングしているのでキーボードショートカットを変更しましょう。

以下になんで起こってるのか、具体的にどうやってキーボードショートカットを変更するのか紹介していきます。

問題の内容

Mac 環境において、 Visual Studio Code で端末ペインを開こうと ⌘ + ` を押すたびに新しい端末を起動してしまいます。

下記の図にある統合ターミナルをショートカットキー*1で開くと、一度目は下図のようにデフォルト動作をして端末のペイン(下部のピンクの枠)を起動します。

f:id:bokken31:20170413234811p:plain

しかし、二度目に ⌘ + ` を押すとターミナルがもう一つ起動されてしまいます。(枠内の番号が2になりました)

f:id:bokken31:20170413235137p:plain

これでは、端末起動の時間がかかりますし、無駄なプロセスを起動してしまうことになります。

問題の解法

これは、⌘ + ⇧ + ` が ”新しい統合端末の作成” のショートカットキーだから起こっている問題です。

JIS キーボードは ` を入力するために シフト(⇧)を押す必要があって ⌘ + ` を入力しているつもりが、 ⌘ + ⇧ + ` が入力されていた。つまり、デフォルトでキーバインディングがバッティングしている状態だったということです。

US キーボード的にはバッティングしていないので、US キーボード使いの人たちには問題なく使えていたようです。

[US キーボード配列参考:http://blog.jnito.com/entry/2012/10/10/074739]

回避策

そのため、“新しい統合端末の作成” か ”統合端末の切り替え” のキーボードショートカットを変更すれば回避可能です。

Mac の場合だと、⌘ + K をおした後に ⌘ + S を押せば下図のようにキーボードショートカットの画面に遷移できるので、その後に"統合端末"で検索。 鉛筆のマークが出てくるので、そこからショートカットキーを設定しなおせば OK です。

f:id:bokken31:20170414000156p:plain

以降はもう ⌘ + ` を押しても新しい端末が起動しなくなっているはずです。

これでコーディングしつつ、キーボードショートカットで素早く端末へ移動することができますね。

それでは、良い Visual Studio Code ライフをお送りください!

*1:図ではメニューバーを出してますが

AWS Lambda のファンクションを TypeScript で作る! 入門編

f:id:bokken31:20170201224015p:plain

今回は TypeScript シリーズ第2弾。 AWS Lambda のファンクションを TypeScript 作成する方法について。

最近、サーバーレス化、Micro Services 化の流れで、AWS Lambda を使用する機会が増えてきてるように思います。

煩わしいサーバの管理から解放されてサービスのみに注力できるのはかなり魅力的。今回は Node.js と TypeScript を使って、Lambda ファンクションを作成する方法について解説していきます。

目標は AWS Lambda を使って CloudWatch Logs (ログ) に 天気予報を出力するところまで。

天気予報の取得には お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報 を利用します。実際に取ってくるのはサンプルにある福岡県久留米の天気情報です。(http://weather.livedoor.com/forecast/webservice/json/v1?city=400040)

続きを読む

5 分で少し分かった気になる TypeScript 入門

TypeScript について簡単にまとめてみる。

TypeScript とは

Microsoft 社が開発した JavaScript に静的型付けを付与した言語。 JavaScript として実行するには TypeScript をコンパイル(トランスパイル) する。

TypeScript は基本的に JavaScript と同じような構文だが、微妙に違う。 JavaScript の構文は以下のような感じ。

'use strict';
function putStrNum(str, num) {
  console.log(str, num);
}

var str = 'hello world';
var num = 10;
putStrNum(str, num);

TypeScript は下記のように書ける。

'use strict';
function putStrNum(str: string, num: number): void {
  console.log(str, num);
}

var str: string = 'hello world';
var num: number = 10;
putStrNum(str, num);

TypeScript の方にはstringnumbervoid などの型が変数宣言、引数や戻り値として記述されている。

一見すると手間が増えてしまっただけのように見える。実際、型を定義していく作業は大変だったりする。*1

どうして我々には型が必要か

よく言われるのは静的チェックが可能だということ。

実際に TypeScript を Visual Studio Code など*2で記述していると引数として与える変数が違っていると下線を引いて警告を出してくれる。

f:id:bokken31:20170118224159p:plain

さらには強力な補完機能も型定義があることによって実現されている。

下記の3行目のように自前の型 TestType を定義して、print という Function型を持っているオブジェクトだと定義しておけば、実際に testTestType型だと宣言すると補完機能が使えるようになる。

f:id:bokken31:20170118223501p:plain

これは test の型を明確に定義していない any などでは下図のように補完候補は表示されない。*3

f:id:bokken31:20170118223840p:plain

これらは大規模なアプリーケーション開発においては極めて大きなメリットになる。実装作業やデバッグ作業が遥かに楽になることは間違いない。 もちろん小規模なアプリーケーションにおいても有効。

まとめ

  • TypeScript は JavaScript に静的型付けを付与した言語

  • 今回紹介した TypeScript の利点は下記の2つ

    • 静的型チェックによるバグの防止
    • 補完候補の表示による効率化

*1:ライブラリには型定義ファイルが提供されている事が多い

*2:もちろんプラグインを使えば vimAtom などでも

*3:もし表示する方法があったら教えて欲しえてください…!

Flow を導入してみる

f:id:bokken31:20161201230354p:plain

最近話題になっている FacebookJavaScript の静的型チェックツール Flow を導入して使います。

ついでに Facebook 製の JavaScript パッケージ管理のアプリケーション yarn を使って進めていきます。

今回実施したのは下記の環境で。

  • 実施した環境
    • Mac OS X El Capitan 10.11.6
    • Homebrew 1.1.2
続きを読む

Rのファイル読み込み速度比較 csvとrds

Rを使っているときにファイルの読み込み速度はボトルネックになることが多い。 同じスクリプトを何度も繰り返し実行するとき、ファイルの読み込みに膨大な時間がかかると、とてもストレスフルです。

できればデータなんてさっさと読み込んでデータと戯れたい…

そんなあなたにおすすめできるのがrdsというファイル形式でデータを扱うことです。

rdsはRのオブジェクトを保存しておくためのファイル形式。 Rに最適化されているためか、読み込みが早いらしい。

今回はこのrdsとcsvの読み込み速度にどれだけ差があるのか実験します。

実験方法

csvファイルを一度Rで読み込みrdsとして保存したファイル*1 と生のcsvの読み込み速度を比較します。

rdsはreadRDS、csvはfread関数を使って読み込む。

それぞれのファイルサイズは以下のとおり。

ファイル形式 ファイルサイズ
csv 839MB
rds 155MB

なんかもうすでに結果が見えてる感じがしてますが、このまま続けます。

読み込みだけなのでスクリプトは非常に単純。

# csvファイル読み込み速度確認用
start  = proc.time()
system.time(r_data<-fread("csv_file.csv"))
end = proc.time()
print(end - start)
# rdsファイル読み込み速度確認用
start  = proc.time()
system.time(r_data<-readRDS("rds_file.rds"))
end = proc.time()
print(end - start)

実験結果

上記のスクリプトを実行した結果を次の表に示します。

ファイル形式 user system elapsed
csv 21.128 0.448 21.579
rds 5.060 0.369 5.431

表のuser,elapsedを見るとだいたい4倍速くなっていることが分かります。

今までなんとなくで使っていましたが、rds形式を使うのは有効みたいです。 みなさんもぜひお試しあれ。

*1:csvを一度読み込んでオブジェクトにし、saveRDS関数でオブジェクトをrds形式で書き出す。

VCSのtimescaleに関するエラーを消したいとき

Synopsys社のVCSで回路の動作検証をしようとしていたときに以下のエラーがでてきて困った.

Error-[ITSFM] Illegal `timescale for module
tb_dcstped_b01.v, 2
  Module "tb_b01" has `timescale but previous module(s) do not.
  Please refer LRM 1364-2001 section 19.8.

このエラー,どうやら回路記述の読み込みの順番が問題らしい.

エラーがでているときは,テストベンチ記述(tb_dcstped_b02.v)を後ろから二番目に読み込むようにしていた.

vcs -full64  -v ~/Scripts/Libraries/nangate.v tb_dcstped_b02.v dcstped_b02.v -R

これを以下のように一番最初に読み込むようにしてあげると,上手いことシミュレーションできた.

vcs -full64 tb_dcstped_b02.v -v ~/Scripts/Libraries/nangate.v dcstped_b02.v -R

追記1

.vファイルにtimescaleの指定がない場合にも同様のエラーが出た. その時は.vファイルに`timescale 1ns/1ns などとするとエラーが回避できた.

追記2

サブモジュールをインクルードしてる場合,timescaleを先に書かなければ同様のエラーが出る. 以下が間違った例.

`include "aaa.v"
`timescale 1ns/1ns

以下のようにするとエラー回避できる.

`timescale 1ns/1ns
`include "aaa.v"

findでPermission deniedを消したいとき

LinuxUnixで作業するときにfindコマンドを使うことがある.

findコマンドの出力結果でしばしば目にするのが Permission denied である.

目的の結果を見つけなければいけないこともあり,非常に迷惑この上ない.

そんな時は2> /dev/nullでエラー出力を捨ててしまえば良いらしい.

find / -name * 2> /dev/null

とすると Permission denied のときは/dev/nullという暗黒空間に出力を捨てさってくれます.