概要
AngularのFormの書き方は主に2つあります。
1つはTemplate Drivenなやり方。
もう1つはModel Driven(Reactive Form)なやり方。
フォームの作り方を調べた時にどっちがどっちの情報なのか分からず混乱したのでまとめてみました。
今回はTemplate Drivenの方を紹介します。
環境
- angular-cli 1.0.0-beta.25.5
- Angular 2.4.3
完成品
今回の成果物はこちら
続きを読む新しいMacBookを使い始めたところ以前利用していた古いバージョンのツールを使う必要が出てきたのですが、意外と手間だったので忘れないようにまとめ。
brew switch
で古いバージョンに変更できます。どんなバージョンがインストール済みかはbrew info
で確認できます。
$ brew info terraform terraform: stable 0.8.2 (bottled), HEAD Tool to build, change, and version infrastructure https://www.terraform.io/ /usr/local/Cellar/terraform/0.7.2 (3 files, 121.5M) Poured from bottle on 2016-09-05 at 21:50:16 /usr/local/Cellar/terraform/0.7.3 (3 files, 122.4M) Poured from bottle on 2016-09-08 at 01:50:24 /usr/local/Cellar/terraform/0.7.4 (3 files, 123.6M) Poured from bottle on 2016-09-22 at 09:43:38 /usr/local/Cellar/terraform/0.7.5 (4 files, 123.3M) Poured from bottle on 2016-10-10 at 10:49:37 /usr/local/Cellar/terraform/0.7.6 (4 files, 76.3M) Poured from bottle on 2016-10-18 at 00:01:42 /usr/local/Cellar/terraform/0.7.7 (4 files, 76.3M) Poured from bottle on 2016-10-23 at 21:51:09 /usr/local/Cellar/terraform/0.7.8 (4 files, 78.5M) Poured from bottle on 2016-11-02 at 21:32:15 /usr/local/Cellar/terraform/0.7.9 (4 files, 78.7M) Poured from bottle on 2016-11-09 at 22:16:13 /usr/local/Cellar/terraform/0.7.10 (4 files, 78.9M) Poured from bottle on 2016-11-14 at 23:13:43 /usr/local/Cellar/terraform/0.7.13 (4 files, 87M) Poured from bottle on 2016-11-29 at 21:54:18 /usr/local/Cellar/terraform/0.8.0 (4 files, 95.5M) Poured from bottle on 2016-12-15 at 23:40:08 /usr/local/Cellar/terraform/0.8.1 (4 files, 95.5M) Poured from bottle on 2016-12-17 at 10:01:35 /usr/local/Cellar/terraform/0.8.2 (4 files, 96.8M) * Poured from bottle on 2016-12-22 at 21:49:28
こんな感じに一覧が表示されるので、変更したいバージョンを指定します。
続きを読む結論から言うと、Streamで扱っているものはStreamのまま扱うです。
具体的にはio.Reader
を毎回ioutil.ReadAll
で[]byte
に変換せずにそのまま使いましょうです。
Node.jsの例ですが、こちらで非常に分かりやすく説明されています。
yosuke-furukawa.hatenablog.com
それを踏まえて考えてみると、Goの場合以下の2つが大きいと思います。
ioutil.ReadAll
などで一旦全て[]byte
に変換すると、その分メモリを消費しますし、アロケーションやGCに依る速度低下が起きます。
一方io.Reader
やio.Writer
は各chunkの処理に同じバイトを使いまわすので、メモリの効率が良いです。
Goにはsync.PoolというFreeListの仕組みがあります。
役割としては既に割り当てられたメモリが不要になった時、解放する代わりにListにとして保持しておいて、メモリが必要になったらそこから取るというものです。なのでGCコストやメモリのallocationコストを省くことが可能になります。
またgoroutine-safeであるので並列処理でも問題ありません。
標準パッケージのfmtやloggerライブラリなどでよく見ます。
一定の文字列を保持してから書き込む、という処理を何度も繰り返すので、毎回メモリを確保するよりFreeListを持って再利用することでGCコストやメモリのallocationコストを省いているのが分かります。
2017/01/01 09:00:00(JST)にうるう秒が挿入されますが、ちゃんと問題点や対応方法を理解してなかったのでまとめ。
ntpを入れているか、tzdataが更新されているかによって動作が異なります。
JST | ntp (stepモード) |
tzdata | 未対応 |
---|---|---|---|
08:59:59 | 08:59:59 | 08:59:59 | 08:59:59 |
08:59:60 うるう秒発生 |
08:59:59 | 08:59:60 | 09:00:00 |
09:00:00 | 09:00:00 | 09:00:00 | 09:00:01 |
09:00:01 | 09:00:01 | 09:00:01 | 09:00:02 |
このようにntpであれば08:59:59が2回、tzdataであれば08:59:60が挿入されます。
続きを読む