Carpe Diem

備忘録

Angular2でのForm 〜Template Driven編〜

概要

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

完成品

今回の成果物はこちら

github.com

続きを読む

Angular2でComponentをまたがったデータのやり取り

概要

Angular2でComponent間でデータをやり取りしたい状況が出てくると思います。
例えば「このボタンを押したら外部APIを叩いて状態を更新したい。その状態を他のComponentでも使っているので更新を反映したい」ときなどです。

今回はServiceにデータを保持して、それを各コンポーネントで利用するやり方を紹介します。

環境

  • angular-cli 1.0.0-beta.25.5
  • Angular 2.4.3

完成形

今回の成果物はこちら

github.com

続きを読む

Homebrewで過去のバージョンを使いたい

概要

新しい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

こんな感じに一覧が表示されるので、変更したいバージョンを指定します。

続きを読む

Goでのstreamの扱い方を学ぶ

概要

結論から言うと、Streamで扱っているものはStreamのまま扱うです。

具体的にはio.Readerを毎回ioutil.ReadAll[]byteに変換せずにそのまま使いましょうです。

なぜStreamを使うべきか

Node.jsの例ですが、こちらで非常に分かりやすく説明されています。

yosuke-furukawa.hatenablog.com

それを踏まえて考えてみると、Goの場合以下の2つが大きいと思います。

1. メモリの効率化

ioutil.ReadAllなどで一旦全て[]byteに変換すると、その分メモリを消費しますし、アロケーションGCに依る速度低下が起きます。

一方io.Readerio.Writerは各chunkの処理に同じバイトを使いまわすので、メモリの効率が良いです。

続きを読む

負荷が低いのにアクセスを捌けきれない時の対応

概要

MongoDBでCPU使用率やロードアベレージが高くないのに処理が詰まっている現象が起きました。
その時間にbatchが動いていてアクセスが急に増えることが原因と言うのは分かっているのですが、負荷的には十分余裕があり不思議な状態でした。

そこでdstatで見るポイント - Carpe Diemでも述べたように、負荷の状態から判断する基準があります。

  1. ロードアベレージを確認する
  2. 1が高ければCPU、ディスクI/O、メモリにボトルネックがある
  3. 1が低ければTCPコネクションにボトルネックがある

今回の現象から判断するに、TCPコネクションに原因がありそうです。

続きを読む

Goでsync.Poolを使って省コスト&高速化

概要

Goにはsync.PoolというFreeListの仕組みがあります。
役割としては既に割り当てられたメモリが不要になった時、解放する代わりにListにとして保持しておいて、メモリが必要になったらそこから取るというものです。なのでGCコストやメモリのallocationコストを省くことが可能になります。
またgoroutine-safeであるので並列処理でも問題ありません。

環境

  • go 1.7.4

どんなところで使われている?

標準パッケージのfmtloggerライブラリなどでよく見ます。
一定の文字列を保持してから書き込む、という処理を何度も繰り返すので、毎回メモリを確保するより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が挿入されます。

続きを読む