ようへいの日々精進XP

よかろうもん

俺のツールズ

俺が

俺の為に AWS の EC2 インスタンスや AMI, タグ等を操作する作ったツールをいくつかリリースしている.

start.oreno.tools

ほとんどを

見よう見まねの Go 言語で作っているので, なかなか Go 言語の雰囲気 (ディレクトリ構成やパッケージ管理とかも) に慣れないし, ちゃんとテストも書けていないのでずーっと修行が必要である.

直近で作ったやつは

SSM パラメータストアを操作するやつ

github.com

業務でパラメータストアを操作する必要があったので, これまでのノウハウを最大限に活かすことで二時間位でリリース出来た. この手をツールを作ると必ず公式のドキュメントを斜め読みし, AWS CLI のドキュメントのパラメータに寄せようとするので, 地味にそのサービスの勉強にもなることに気付いた. さらに, 単純な API のラッパーでしかないので, わざわざ Go 言語で書く必要は無いのかなーと思うことがあるが, MacOSLinux, Windows 環境で動かすことが出来たり, インストールの手順も簡素化出来るという点では Go 言語で書くメリットは十分にあると考えている.

今回作った pStore については, まだまだ改修の余地はあるが, 以下のようにパラメータストアに登録しているパラメータの一覧, パラメータの追加, 削除がいい感じで行えるはず.

# パラメータの一覧取得
$ pStore
+-------------------------------------+--------------------------+--------------+---------------------+
|                NAME                 |          VALUE           |     TYPE     |  LASTMODIFIEDDATE   |
+-------------------------------------+--------------------------+--------------+---------------------+
| /123456/88888                       | kawahara-test            | StringList   | 2018-09-29 08:09:43 |
| test.test1                          | ******************       | SecureString | 2018-09-28 22:42:23 |
+-------------------------------------+--------------------------+--------------+---------------------+

# パラメータの追加
$ pStore -put -name="foooooon" -value="baaaaaaarn"

$ pStore
+-------------------------------------+--------------------------+--------------+---------------------+
|                NAME                 |          VALUE           |     TYPE     |  LASTMODIFIEDDATE   |
+-------------------------------------+--------------------------+--------------+---------------------+
| /123456/88888                       | kawahara-test            | StringList   | 2018-09-29 08:09:43 |
| foooooon                            | baaaaaaarn               | String       | 2018-09-29 08:37:53 |
| test.test1                          | ******************       | SecureString | 2018-09-28 22:42:23 |
+-------------------------------------+--------------------------+--------------+---------------------+

# パラメータの削除
$ pStore -del -name="foooooon"
$ pStore
+-------------------------------------+--------------------------+--------------+---------------------+
|                NAME                 |          VALUE           |     TYPE     |  LASTMODIFIEDDATE   |
+-------------------------------------+--------------------------+--------------+---------------------+
| /123456/88888                       | kawahara-test            | StringList   | 2018-09-29 08:09:43 |
| test.test1                          | ******************       | SecureString | 2018-09-28 22:42:23 |
+-------------------------------------+--------------------------+--------------+---------------------+

詳しくは README を見てねとなる.

コマンドラインツールのテストをどうするか

AWS のリソースをどうやって用意するか

AWS のリソースに対してどのようにテストするか. いくつか参考になる記事を既に書かれている方がいらっしゃってとても参考になった.

medium.com

aws.amazon.com

有難うございます.

特に冒頭の記事に紹介されていた dockertest というモジュールは次のタイミングで利用してみたい. (今回は docker-compose を利用している)

github.com

ということで, 今回のテストについては AWS 環境は moto を利用することにした.

github.com

moto には moto_server というサーバーモードが用意されているので, このサーバーモードを利用して擬似的に API レスポンスを返す環境を用意した. また, moto_server は docker-compose を利用して起動するようにしてみた.

コマンドの出力結果をテストする

コマンドラインツールの出力をテストする場合, どのような方法が良いのかは以下の記事やスライドがとても参考になった.

出力結果をテストするということは, I/O に依存するテストということになるらしい.

I/O に依存するテストの例として, Ruby の場合だと StringIO クラスを利用してテストを書くと良いようだ.

require "rspec"

describe "stdout をテストする." do
  it "hello が出力されること." do
    $stdout = StringIO.new
    puts "hello"
    output = $stdout.string
    expect(output).to eq("hello\n")
    $stdout = STDOUT
  end
end

これを実行すると, 以下のように出力される.

$ rspec test_spec.rb --format documentation

stdout をテストする.
  hello が出力されること.

Finished in 0.00374 seconds (files took 0.18315 seconds to load)
1 example, 0 failures

Go 言語だと bytes.Buffer を利用すると良いとのこと.

package main

import (
    "bytes"
    "os/exec"
    "testing"
)

func TestCommand(t *testing.T) {
    cmd := exec.Command("echo", "hoge")
    stdout := new(bytes.Buffer)
    cmd.Stdout = stdout

    _ = cmd.Run()

    if stdout.String() != "hoge\n" {
        t.Fatal("Not matched")
    }
}

これを実行すると, 以下のように出力される.

$ go test -v
=== RUN   TestCommand
--- PASS: TestCommand (0.01s)
PASS
ok      go-test 0.016s

ということで, pStore のテストは

実行してみると, 以下のような出力になる.

$ make test
Creating network "tests_default" with the default driver
Creating moto-server ... done
=== RUN   TestVersionFlag
--- PASS: TestVersionFlag (1.54s)
=== RUN   TestStdoutList
--- PASS: TestStdoutList (1.60s)
=== RUN   TestStdoutPut
--- PASS: TestStdoutPut (3.33s)
=== RUN   TestStdoutDel
--- PASS: TestStdoutDel (3.33s)
=== RUN   TestStdoutPutSecure
--- PASS: TestStdoutPutSecure (4.43s)
=== RUN   TestStdoutPutList
--- PASS: TestStdoutPutList (4.93s)
=== RUN   TestConvertDate
--- PASS: TestConvertDate (0.00s)
PASS
ok      pStore  19.186s
Stopping moto-server ... done
Removing moto-server ... done
Removing network tests_default

ただ, これだけなんだけど.

以上

永遠の初心者が「俺のツールス」を通して, 少しでもプログラミングのスキルが上がると嬉しいなと思っている.

2018 年 09 月 29 日 (土)

ジョギング

  • おやすみ
  • 右足が張りまくっている感じは引き続きなので, 強めにストレッチをしておいた

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

買い出し

  • 久しぶりにダイレックスに買い出し
  • 東比恵あたりがめっちゃ混むので夕方の時間帯は止めておこうと思った

SSM パラメータストア

Golang の勉強の為, SSM パラメータストアをちょこっと操作するツールを作った.

github.com

ツールを作るからにはテストも書くべきということで, テストも少しだけ書いてみた. Go 製の CLI ツールのテストについて言及されている以下のブログ記事が勉強になった.

Go言語でテストしやすいコマンドラインツールをつくる | SOTA

また, 以下のスライドも勉強になった.

Unit-testing programs depend on I/O in Go

2018 年 09 月 28 日 (金)

ジョギング

  • 自宅〜山王公園〜自宅
  • 右足が張りまくっている感じ

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

マッサージ

  • お昼休みに近所のマッサージ屋さんに
  • 45 分コース
  • やっぱり右半身に強い張り

今日のトゥウィート

そんな気持ち.

2018 年 09 月 27 日 (木)

ジョギング

  • 自宅から博多駅を経由して呉服町まで
  • 信号が多すぎて走りづらかった

日課

  • おやすみ

JAWS-UG 福岡もくもく会

10 回目ということで. 焼き鳥屋さんでもくもく. 楽しかった.

今日のトゥウィート

もくもく会, 盛り上がりました.

2018 年 09 月 26 日 (水)

ジョギング

  • 山王公園まで往復 35 分程
  • 改めて懸垂してみたら 1 回だけ上げれた, 明日は 2 回上げれると嬉しい

日課

  • おやすみ

とんとん

  • 刺盛り 1 人前, すごく鮮度が良くて美味しんだけど, 意外に高価ということが判ったので, 刺盛り頼む時はお祝いごとの時だけにしたい
  • 色々とこれからの事を考えながら, キープしている焼酎をチビチビ

放送大学

印刷教材が届いたのでやっていく. 今回は「アルゴリズムとプログラミング」.

今日のトゥウィート

輸入物で良いので分厚いやつ食べたい. ミディアムレアで.

2018 年 09 月 25 日 (火)

ジョギング

  • 山王公園まで往復 35 分程
  • しばらくはこんな感じで毎朝走れればいいかな
  • 山王公園に鉄棒があったので懸垂をしようとしたら, 一回も自分の体を上げることが出来なかった...

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

今日のトゥウィート

休み明けから刺激になるような記事を読んで俺も頑張るしかないなと思った.

2018 年 09 月 24 日 (月)

ジョギング

  • おやすみ

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

色々と買い出し

  • ほぼ家具一式をお買い上げ
  • 自宅の雰囲気もだいぶん変わりそうだ

X1 Extream の購入はだいぶん先送りになりそうだ...

www.lenovo.com

今日のトゥウィート

論文を読んでこの記事くらい纏められるようになりたい. とても良いブログ記事だった.

本当に「変態望遠鏡」って聞こえたんです.

家具屋さんめぐりの帰りに立ち寄って買い物. 現在, 住んでいる場所の近隣スーパーよりだいぶんお安くモノも良い.

今回は焼き鳥を頂きつつ, AWS についてワイワイ語る会. 楽しみなんだけど, 現時点で参加者が自分だけというのがウケる.

2018 年 09 月 23 日 (日)

ジョギング

  • 自宅から福岡空港をぐるっと一周, だいたい 14 キロくらい
  • 想定よりも距離が長くてビビった
  • 簡単に足にきてしまった感じで, 福岡マラソン大丈夫かって気分

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

引越し片付け進捗

  • 蔵書をクローゼットに押し込んだ
  • 古い書類等は徹底的に破棄, 整理しなければと思っていた各種書類をクリアファイルに整理したので少しすっきりした

奥さんが出演している DVD

  • アダルト DVD ではない
  • 奥さんが過去に所属していたボーカルチームのライブ DVD を見る
  • DVD の中の奥さんはイキイキと歌っていて輝いていたので, 今後も歌は続けて欲しいな

2018 年 09 月 22 日 (土)

ジョギング

  • 山王公園と自宅往復で 40 分くらい
  • 意外にランナーが多くてテンション上がった
  • そろそろランニングシューズを変えたい

日課

  • おやすみ

麺処かわべ

  • 昨日, ランチでごぼ天うどん食べた麺処かわべで今日もごぼ天うどんを食べた
  • 常連さんもいるらしく, 肉うどんの肉だけ単品で頼んで, おあげさんも単品で頼んでトッピングしながら食べているお婆ちゃんにはびっくりした

いろいろ買い出し

  • 家具やら日用品を見に行く
  • コーナンがめちゃ安で驚いた

俺の tools

AWS WAF のデフォルトアクションだけをコマンドラインでいじりたくて作った.

github.com

ちなみに, 以下のようなサイトを作ってみた.

start.oreno.tools

2018 年 09 月 21 日 (金)

ジョギング

  • 山王公園を 20 分程
  • 右腰から股関節にかけてつっぱるような痛み

山王公園, 走る分にはいい感じな公園. これからはココを拠点に頑張ろう.

goo.gl

日課

  • (腕立て x 50 + 腹筋 x 50) x3

ランチ

新オフィスの近くで。博多のソウルフード、ごぼ天うどんと天むすを頂きます。550 円也。