Hatena::ブログ(Diary)

mizchi log

@mizchiの雑記帳

2013-07-27

小物エンジニアの会でオブザーバーパターンのアンチパターンについて発表してきた



小物エンジニア年収780万円以下だそうです
小物エンジニアの会 : ATND http://atnd.org/events/41091

発表資料は面倒くさかったのでGistです

hanabi.md https://gist.github.com/mizchi/6081622

西新宿のありふれた公園で酒飲みながら屋外発表会、破滅的でした

2013-07-19

JavaScriptで型が書けるDSLを提供するdeftypes.js作った



こじらせJavaScriptシリーズです。
mizchi/deftypes.js https://github.com/mizchi/deftypes.js

主にcoffee-script用のDSLです。以下すべてcoffee。

ブラウザ

<script src="https://raw.github.com/mizchi/deftypes.js/master/deftypes.js"></script>

Deftypes(); //provide DSL

Node

npm install deftypes

概要


型が書けます。残念ながら動的チェックです。

Point = {x: Number, y: Number}
p1 = def Point, {x:1, y:2} #=> {x: 1, y:2}
p2 = def Point, {x:1, z:2} #=> type error

defとTがDSLです。オプションで何もせずにインスタンスを返却するだけするモードもあります。これによってパフォーマンスを落とすことなく、型を明示的に宣言しながら開発することができます。(その際のオーバーヘッドは型情報の宣言のみで、ほぼ無視出来るでしょう)

Nullable型

NullableNumber = {n: T.Nullable(Number)}
p1 = def NullableNumber, n:1
p2 = def NullableNumber, n:null

配列

number_list = def [Number], [1,2,3]

関数型

f1 = def T.Func([Number, Number], String), (m, n) -> "#{m}, #{n}"
f1(1,2) #=> "1, 2"
f1("",2) #=> argument error

引数と返り値の型を動的にチェックします。違反が検出されたら例外をthrowします。


型宣言されたインスタンスを変更するとき、専用の高階関数の中で副作用をだすようにすれば、高階関数を抜けた時にも型チェックをすることができます。

p = def Point, {x:1, y:2}
def Point, p, ->
  @x = 3

# Type Error
def Point, p, -> @y = "not number"

やや面倒ですが、副作用を出すという危険な行為は面倒臭くしておきたいのです。
これを無視してブロック外で行われた変更は検出しません。実装上は検出できるけど、このライブラリ専用の挙動が増えすぎるのでまだ避けてます。


それ以上の詳しくはREADMEとテストコードをみてください。


用途


静的解析ではないので、テストコードを書いたりしてカバレッジあげないとあまり意味がありません。むしろテストコードでの型チェックに使うといいかもしれません。
型をコード中に定義して文芸的プログラミングな文脈で可読性をあげる目的もあります。これは個人的な目的です。

TODO


typescriptのd.tsから型情報を読み込めるようにする
実装例としてテトリスか何かをつくる
可能ならば型推論する(難度が高い…)

2013-05-23

1つの流儀を持つこと


流儀を知らないということは、何者にも縛られていない、ということではない。自分の癖に振り回されていることに、無自覚なだけだ。


ってのは、中学時代の部活の恩師の受け売りなんだけど、大人になるにつれ、特にインターネットを眺めるにつれ、無自覚に自分の癖に振り回されている人を見る機会が増えている気がする。


インターネットには反知性主義・反権威主義の皮を被った「怠惰の言い訳」があまりにも多い。
わかり易い例として、2chの哲学系のまとめを見るといいと思う。必ず導入かオチにキャッチーでわかりやすい反知性主義の言い訳があるはずだ。


それはまとめ人の程度を示しているだけとも言えるが、傾向として2chは反知性主義が支配している場であると思う。2chは嫌いではないけど相手の弁をそれによって封殺している流れをみると、僕はイライラする。で、はてブにもそういうのが増えてきた。


何かの視点を獲得することは、自分自身を捉えていた檻を自覚するようになることだ。檻を破壊するも、あるいは居心地の良い檻の中の生活を志向するにも、必ずその檻を自覚することからはじまる。


反知性主義の弁は、ほとんどの人の耳に心地よく、また伝搬しやすい。それを理解するのに必要なものは、なにもないからだ。なにも知らないでいいことの根拠になる。


何かに熱くなることはかっこわるい、みたいな風潮は、真摯に向き合っている人に対して失礼だと思う。専門性の獲得はそこからは生まれない。僕は誰もが何かに精通していて、お互いに何らかの価値を交換しあえたら楽しいなと思っているし、そうであってほしい。