botchy hack note

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

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という暗黒空間に出力を捨てさってくれます.

lsコマンドの出力に色を付ける

lsコマンドの出力結果に色を付ける方法について調べてみました. manコマンドでlsの説明を見ると,どうやらls -Gとすれば色が付くみたいです.

ls -G


と実行した結果がこちら.


f:id:bokken31:20130923163054p:plain


ただ,そのままだと見づらい.... 自分の好きな色にしたいときは環境変数LSCOLORSを変更すれば良いようです. デフォルトは以下のような設定になってます.

LSCOLORS=exfxcxdxbxegedabagacad


順番とアルファベットによってそれぞれの場所に色を設定します. 順番と場所の対応はそれぞれ以下のようになっていて,文字の色,文字の背景の順番に指定します.

順番

順番 場所
1,2 ディレクトリ
3,4 シンボリックリンク
5,6 ソケット
7,8 パイプ
9,10 実行形式
11,12 ブロックスペシャル
13,14 キャラクタスペシャル
15,16 setuid ビットが設定された実行形式
17,18 setgid ビットが設定された実行形式
19,20 他者 が書き込み可能なディレクトリ,スティッキービットが設定あり
21,22 他者 が書き込み可能なディレクトリ,スティッキービットが設定なし


色は次のような対応になってます.

それぞれ,大文字にすると太字になります.

  • a:ブラック
  • b:レッド
  • c:グリーン
  • d:ブラウン
  • e:ブルー
  • f:マゼンタ
  • g:シアン
  • h:ライトグレイ
  • x : デフォルト



例えば,ディレクトリの文字をシアンの太字, 実行可能ファイルをマゼンタの太字にしたければ次のように設定すれば行けます.

export LSCOLORS=GxfxcxdxFxegedabagacad

結果が次のようになります.

f:id:bokken31:20130923171710p:plain

自分好みに改変していくのは楽しそうですね.



起動時から設定する方法

自分のホームディレクトリの.bashrcに以下の二行を追加するだけでOKです.

alias ls='ls -G'
export LSCOLORS=GxfxcxdxFxegedabagacad

すると,起動時にも設定が反映されることになります.