今日のCakePHP3

  • 初めてのfind()
  • logQuery(true) 良い。
<?php
    $conn = \Cake\Datasource\ConnectionManager::get('test');
    $conn->logQueries(true);
  • namespaceによるいい感じのクラスの差し替え良い。holiday_jp-php を使って、Timeクラスに isHoliday() メソッドを生やすなどした。
  • Collection良い。
    • HtmlHelper::tableCells() とかと合わせても活用できそう。
  • 早速、Validatorを拡張したくなっているのだけれども、どうしたものか。

遅れに遅れて今更CakePHP3を触りはじめた

まだまだ、全然わかっていない状況です。

社内では既にいろいろと地雷は踏み潰され、さらにPluginもいろいろできている状況からの最後尾スタート。

とりあえず、今日の感想は

  • ビルドインサーバ最高。Vagrantがいらない。Mac上でカジュアルに開発できるの面白い。
  • MigrationsはPhinxを既につかっていたので、面白みがない。使っていなければよかった(感動的な意味で)。
  • ルーティングされるURLが今までと違って焦った。DashedRoute がデフォルトで「なんだこのルーティング???」となってた(CakePHP2っぽいのは InflectedRoute)。ビルドインサーバのせいだと思って「ビルドインサーバ使えないのか。。」とか落ち込んでたらビルドインサーバのせいではなかった。

これから頑張る。

github.com

AWSなコマンドラインツールをつくるときにAWS CLIと同じようにAWSアクセスキーやリージョン情報を取得できるライブラリ awsecrets

を作って、awspeckumomeで使っています。

github.com

使い方

例えば、EC2インスタンスの情報をただ取得するコマンドラインツールを作るとき Awsecrets.load メソッドを利用して

#!/usr/bin/env ruby
require 'awsecrets'
Awsecrets.load
ec2_client = Aws::EC2::Client.new
puts ec2_client.describe_instances({ instance_ids: [ARGV.first] }).reservations.first.instances.first

というコマンドラインツール ec2sample を書いたら、

$ ec2sample i-1aa1aaaa --profile mycreds --region ap-northeast-1

$ AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX AWS_REGION=ap-northeast-1 ec2sample i-1aa1aaaa

$ cat <<EOF > secrets.yml
region: ap-northeast-1
aws_access_key_id: XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EOF
$ ec2sample i-1aa1aaaa

など、AWS CLIと同じような感じでAWSアクセスキーやリージョンを取得して Aws::config にセットしていい感じに aws-sdk を活用できます。中身はaws_config.gemとaws-sdk.gemでできています。

使いドコロは難しいですが、RubyAWSコマンドラインツールをつくるときには是非ご検討ください。

AWS CloudWatchのメトリクスをCLIからカジュアルに確認できるツールkumomeを作った

AWSのCloudWatchのメトリクスをCLIからカジュアルに確認したいと思ってツールを作り始めている - Copy/Cut/Paste/Hatena

の続きです。kumome という名前でリリースしました。

github.com

asciicast

これは何?

AWS CloudWatchのメトリクスをCLIから確認するためのツールです。特徴としてコマンドオプションをYAMLファイルで拡張できます。

インストールは

$ gem install kumome

デフォルトの設定では ec2 rds elb のメトリクスを取得可能になっています。

$ kumome --ec2=i-123ab45c,i-890ed12c --rds=my-rds --elb=my-elb --profile mycreds

デフォルトの設定は以下。kumome config で現在の設定を出力可能です。

---
resources:
  ec2:
    namespace: AWS/EC2 # required
    dimensions_name: InstanceId # required
    metrics:
      cpu:
        metric_name: CPUUtilization # required
        statistic: Average # required
        unit: Percent
        alarm: '>=50' # "metric alarm name" or "operator and number"
      netin:
        metric_name: NetworkIn
        statistic: Average
        unit: Bytes
      netout:
        metric_name: NetworkOut
        statistic: Average
        unit: Bytes
  rds:
    namespace: AWS/RDS
    dimensions_name: DBInstanceIdentifier
    metrics:
      cpu:
        metric_name: CPUUtilization
        statistic: Average
        unit: Percent
        alarm: '>=50'
      read:
        metric_name: ReadIOPS
        statistic: Average
        unit: Count/Second
      write:
        metric_name: WriteIOPS
        statistic: Average
      conn:
        metric_name: DatabaseConnections
        statistic: Average
        unit: Count
        alarm: '>=50'
  elb:
    namespace: AWS/ELB
    dimensions_name: LoadBalancerName
    metrics:
      req:
        metric_name: RequestCount
        statistic: Sum
      400:
        metric_name: HTTPCode_Backend_4XX
        statistic: Sum
      500:
        metric_name: HTTPCode_Backend_5XX
        statistic: Sum

例えばAWS Lambdaのメトリクスを取得したいときには、以下のようなコンフィグを記述します。

---
resources:
  lambda: # "command option name"
    namespace: AWS/Lambda # required
    dimensions_name: FunctionName # required
    metrics:
      count:
        metric_name: Invocations # required
        statistic: Sum # required
        unit: Count
        alarm: '>=100' # "metric alarm name" or "operator and number"
      error:
        metric_name: Errors
        statistic: Sum
        unit: Count
        alarm: '>=5'
      duration:
        metric_name: Duration
        statistic: Average

そうすれば新たに ---lambda オプションをつくることができます。

$ kumome --config=./custom.yml --lambda=my-lambda-func-name,hook-lambda-func-name --profile mycreds

カスタムメトリクス用のコマンドオプションも作り放題です。

というわけで

自分は、プロジェクトごとにconfig.ymlを作成しておいて、何かあったときは、Amazon Management Consoleにログインして確認するのではなく、まず kumome でざっと確認するようにしています。

カジュアルに確認できるので、心理的に良いです。

まだ、作り始めたばかりですので機能も少ないですが是非お試し下さい。 Pull Requestお待ちしています。

KickstarterでサポートしていたRoost Laptop Standが届いた

届いた!

www.kickstarter.com

出資から届くまで

Roostの存在をRebuildで知る

rebuild.fm

おお、2014/10。。。

2015/05 ふとポチる

Kickstarter経由でRoostから経過報告をもらう

大体1ヶ月に1〜2回メールが届いていました。

途中に送付先住所の登録とか、別の商品の紹介とかもありました。

で、その瞬間だけ思い出して、メールを眺めて、あとは忘れていました。

2015/12/30 Roostから出荷の連絡が

DHL Expressという配達会社経由で送付したのこと、出荷追跡もできるようになっていました。

ここから楽しみになってきました。

無事受け取り

ずっと、不在通知がきている状況でしたが、なんとか今日受け取ることができました!

届くまで結構長かったので、予想外のプレゼントみたいでうれしい。

開けてみて

f:id:k1LoW:20160109151207j:plain

意外に小さめ。専用ポーチ付き。

f:id:k1LoW:20160109210004j:plain

15inchもしっかりホールドできています。ホールドする部分のギミックがとても良い

f:id:k1LoW:20160109210109j:plain

軽い。丈夫そうですが、とりあえずこれから使ってみてみようと思います。

AWSのCloudWatchのメトリクスをCLIからカジュアルに確認したいと思ってツールを作り始めている

asciicast

やりたいこと

  • 何か問題が発生した時に、手元のターミナルでAWSリソースの状況をカジュアルに確認したい
    • 初動を早くしたい
    • プロジェクトが多すぎて「ディスプレイで常に見える化」みたいなのは無理

現状

  • インスタンスIDとかRDSのIDを指定したらCloudWatchのメトリクス情報を *stat ライクに表示する
  • YAMLファイルでCloudWatchで取得するメトリクス情報を実質的にいくらでも拡張可能(YAMLファイルでオプションを拡張する実装)

ちなみにデフォルトのYAMLファイルは以下のような感じ。

---
resources:
  ec2:
    namespace: AWS/EC2
    dimensions_name: InstanceId
    metrics:
      cpu:
        metric_name: CPUUtilization
        statistic: Average
      netin:
        metric_name: NetworkIn
        statistic: Average
      netout:
        metric_name: NetworkOut
        statistic: Average
  rds:
    namespace: AWS/RDS
    dimensions_name: DBInstanceIdentifier
    metrics:
      cpu:
        metric_name: CPUUtilization
        statistic: Average
      read:
        metric_name: ReadIOPS
        statistic: Average
      write:
        metric_name: WriteIOPS
        statistic: Average
  elb:
    namespace: AWS/ELB
    dimensions_name: LoadBalancerName
    metrics:
      req:
        metric_name: RequestCount
        statistic: Sum
      400:
        metric_name: HTTPCode_Backend_4XX
        statistic: Sum
      500:
        metric_name: HTTPCode_Backend_5XX
        statistic: Sum

TODO / 検討事項

  • *stat ライクに定期間隔で追記出力(最短で1分間隔だけど。。。)
  • どれくらい行を出すかの設定(時間?最大行?)
  • CloudWatchアラームの状態で数値の色を変える?それともYAMLで設定?
  • テーブル表示がちょっと冗長なのでなんとかしたい。現在は tj/terminal-table · GitHub を利用
  • awstat という名前で作っているけれどもAWStatsとレーベンシュタイン距離が1

git-gsubがライフチェンジングだったのでgit-gsub-filesを作った

Gitで何かの仕方を検索していて、いまさらながら git-gsub を知りました。

fujimura.hatenablog.com

gemとして公開されており、カジュアルにインストールできてめちゃくちゃ便利です。

となると気になるのが git-rename 。おそらく想像するにファイル名の便利置換コマンド。ファイル名の置換もよくあるので、こちらも是非使いたいなと思いました。

が、gemとして公開されていなかったので、git-gsub を参考に git-gsub-files を作ってみました。

github.com

簡単にいうと、Gitで管理されているファイルのリネーム( mv )を gsub ライクにするためのGitサブコマンドです。

インストール

$ git install git-gsub-files

使い方

Gitの管理下のファイルに対して、ファイル名をgsubライクに置換して mv します。 置換対象はファイル名だけでディレクトリ名には影響しません。

$ git gsub-files READ WRITE
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

deleted:    README.md

Untracked files:
(use "git add <file>..." to include in what will be committed)

WRITEME.md

no changes added to commit (use "git add" and/or "git commit -a")

せっかくGitなので、mv ではなくて git mv したいこともあります。そのときは --add オプションを使います。

$ git gsub-files READ WRITE --add
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

renamed:    README.md -> WRITEME.md

no changes added to commit (use "git add" and/or "git commit -a")

と、ここまで作って本家が公開されていました。。。

想像していた動きとは少し違っていたので、まあgit-gsub-filesを作った意味はあったかもです。

Thor人間だったのに、Thor使わないでコマンド作ったり、Rspecの書き方を git-gsub のテストを見ながら学んだり、俺得でした。

最後に

git-gsubという便利コマンドを公開してくださった fujimura さんありがとうございます!