Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

ECRのライフサイクルポリシーを試す

JAWS-UG金沢のもくもく会に参加してきました。で、最近ECRのコンソールにライフサイクルポリシーというメニューが追加されてたのが気になっていたので軽く触ってみました。

jawsug-kanazawa.doorkeeper.jp

Amazon ECRのライフサイクルポリシーでコンテナイメージのクリーンアップ | Amazon Web Services ブログ

ライフサイクルポリシーを使うことで、古い又は使われていないイメージを自動的に削除することで、コンテナイメージのレポジトリをきれいに保つことができるようになりました。

なるほど。たしかに、リポジトリ当たりのイメージ数制限がある(上限申請可)ので古くなったイメージを自動的に削除してほしい。今まではcron等でAPI叩いて行う感じのものが良い感じに自動化できるので良さそう。

Amazon ECR ライフサイクルポリシー - Amazon ECR

コンソールには Dry run of lifecycle rulesLifecycle policy というメニューが増えていた。ポリシーを作成して、dry runののち正式に適用することができる。

ルールの追加画面。キモとなるのは Match criteria という項目。ここでイメージの削除条件を決める。 条件は Image count more than もしくは Since image pushed を選択できる。前者は指定した数(=n)を超えてイメージが存在しているときに最新n個のイメージは残りその他のイメージは削除される。後者はpushされてからn日を超えたイメージは全て削除される。

この時点ではラベルの通り作成したルールは未保存状態なので、 Save and perform dry run をクリックする。

すると、ルールを適用する場合に削除されるイメージの一覧が表示される。この時点ではリポジトリに全部で4個のイメージが存在しており、その中でタグがついてないものは3個であった。このため、タグのない(=untagged)2個を超える分がここでは表示されている。dry runしてみて良さげであれば Apply as lifecycle policy をクリックして実際に適用することができる。

これは、クリック直後のリポジトリ内のイメージ一覧であるが変化はなかった。

ライフサイクルポリシーの作成後、影響を受けるイメージは 24 時間以内に有効期限切れになります。

ドキュメントを見ると即時削除されるわけではないので気長に待ちましょう。

時間が経ってからコンソールを確認すると設定したポリシーが実行されたログが残っていた。

リポジトリ内のイメージを見ると確かにタグの無いイメージは2個になっている。素晴らしい。

今回はお試しで簡易に確認するため制限数を少なくしたが、90日とか180日とかプロジェクトのライフサイクルに合わせて設定しておけば、docker pushしようとしたらリポジトリいっぱいでした〜みたいなトラブルを避けられるのでいいなと感じた。

kanazawa.rb meetup #62 に参加しました #kzrb

kzrb.doorkeeper.jp

前回はGitHub勉強会でしたが、今回は久しぶりのもくもく会

プログラミングElixir

プログラミングElixirですが前回読んだのがいつだったか覚えてないほど空いてしまいました(汗)。ブログを見返してみると5月が最後でしたw

www.blogaomu.com

10章「コレクションの処理ーーEnumとStream」の途中まで読んでたらしいので、10章始めから読み直すことにしました。ここからは読みながら取ってたざっくりメモ。

  • Enumはコレクション系の関数を提供するモジュール
  • Streamは遅延処理してくれる
  • Enumでできること
    • リストへの変換(to_list)
    • コレクションの結合(concat)
    • map
    • 位置による要素の選択、条件による要素の選択(at, filter, reject)
    • 要素のソート、比較(sort, max)
    • コレクションの分割(take, take_every, take_while, split, split_while)
    • 要素の連結(join)
    • 述語演算(all?, any?, member?, empty?)
    • コレクションのマージ(zip, with_index)
    • 畳み込み(reduce)
  • 練習問題
    • Enumモジュールの自前実装
    • 再帰を使って実装したが、splitやtakeでマイナス値に対応するのに難儀した
    • コレクションの末尾から処理する的な
    • 結局Enum.reverse関数を使った...汗
    • ガード節すっかり忘れていた
    • 解答例 The Pragmatic Bookshelf | Programming Elixir

練習問題解いてたら時間になってしまいました。Haskell本読んだりScalaやってるとパターンマッチと再帰にだいぶ慣れていたようで、難儀したところ以外はスルスルっと書くことができました。

プログラミングElixir

プログラミングElixir

ツイートまとめ

今回、meetupについてのツイートまとめを行いました。毎回 @kiyohara さんが担当していたのですが、meetup運営タスクが集中していたということで引き受けさせてもらいました。togetter、思ったより簡単にまとめられるのでいいですね。

togetter.com

懇親会

1件目はなんと手羽先が食べ放題!!!みんな貪り食ってました!ビールが進む進む。

2件目は立ち飲みイタリアン組とラーメン組に分かれて、飲み組は先に乾杯。

1杯目はスパークリングワインを注文。生ハム原木を買ったんだけど食べきれなくて大変だったという話を聞いてた。

2杯目は白ワイン。なみなみ注いでくれるシステム。素敵。

GitHub勉強会 in Kanazawa に参加しました #kzrb #jawsug

connpass.com

GitHubのSolution Engineer @ikeike443 氏を迎えて GitHub とは何ぞやというところからCI/CD含めての利用方法、導入時の話までそれぞれお話頂くという勉強会でした。個人としては既にGitHubを使ってソースコードレビューやCircleCI連携など開発フローに組み込まれているという状態なので、他社はどういう感じで利用しているのかなとか実はこんな機能があるよみたいな話を期待して臨みました。

DMM.com Laboさんの南町オフィス。イベントスペースが広くて良い。

GitHubグッズをたくさん持ってきて頂きました。これらはジャンケン大会で生き残った人にプレゼント。ステッカーやGitHub Flavored Markdownチートシートは全員向けに配布されました。ありがとうございます。

私的気になりポイント

ikeike443さんのデモでPR時にCIサーバーと連携してテストが走るよっていう場面があって、masterブランチにマージした結果のテストを走らせているというので、なるほどそういうやり方もあるんだなと驚きました。他にも自分のところではまだやってないなというtweetが上がってました。

Deployments | GitHub Developer Guide

プルリクエストもしくはRefにデプロイイベントをひも付けできるとこの版がいついつデプロイされましたよって言う情報を後からでも参照できるので良さげだなと思いました。

Revertプルリクエスト使っている人意外に少なくてびっくり。あ、やらかしたってときに使ってます。いつも通りのレビュー/マージのフローに乗せられるのが良いですね。使うときはたいてい緊急時なので、いつも通りの手順っていうのがミス少なくできるのです。

やはり他の現場でも起きるものだなあと共感。DMM.com Laboでは毎朝30分のレビュータイムを導入したとのことです。

加藤さんの説明聞いた感じEBのデプロイ機能と同様なことができそうな雰囲気あるなあと思いました。ちゃんと触ってないので分からんけども。 aws.amazon.com

今度からデザイナーや初心者向けの導入ツールとしてGitHub Desktopという選択肢(今まではSourceTreeを推奨してた)も考えてみようかなと思いました。後で使ってみよう。

懇親会

wtnabe氏による乾杯の挨拶。GitHub Tシャツを着てきていました!

こちらはikeike443氏。遠いところありがとうございました!

安定のえん家さん。相変わらず海鮮が美味しいですね。

こちらは2次会。焼き餃子美味しい。

よだれ鶏も美味しい。辛いけど。

kanazawa.rb meetup #60 に参加しました #kzrb

kzrb.doorkeeper.jp

kanazawa.rb が5周年を迎えました!とのことで開幕でノベルティを配っていました。

#kzrb 5周年記念栓抜き

内容はいつも通りのもくもく会に加えて福井で開催の #ふくもく会 とLT発表をテレカンで共有するの二本立てでした。2拠点LTは割と突発的?だったようにも感じられましたがおおむねうまくいってました。(スライドが見えにくかったのは次に活かしたいですね)

もくもくの成果物

www.blogaomu.com

ふとtmux pluginのインストール済みバージョンを知りたいなあと思い、チュートリアルを参考にしながらもくもくと実装&ブログを書いてました。

もう一つ進めていたことは、関わっているプロジェクトでコミットメッセージの先頭に絵文字をつけようという試みが始まったのに伴い、git log コマンドの出力や tig 内での表示で絵文字部分がうまく表示されないことがありこれを解決したいなあといろいろ調べていました。これについては別の記事で解決編を書こうと思います。

LTが割と多かったのでこんな感じでタイムアップ。

懇親会

なぜこの角度で撮影したのかが不明な写真です。今回も割と早めに酔いが回って(あれはビールだったのだろうか?)次の日にも残ってましたw 他のビアガーデンも開拓したいですね〜〜。

次回

GitHubの方を招いての勉強会です!枠も埋まりつつあるので参加表明はお早めに〜 🙋 connpass.com

インストール済みtmux pluginのバージョンをリスト表示したい

手元のPCではtpmを使ってtmux pluginの管理を行っています。

github.com

そういえば各プラグインのバージョンを見たいなあと思ったので、チュートリアルにほんのちょろっと手を加えて各プラグインのHEAD Commitを表示する tmux plugin を作ってみました。

ディレクトリは以下の構成になります。

.
├── my_plugin.tmux
└── scripts
    └── tmux_list_plugins.sh

1 directory, 2 files

tmuxを起動した状態で ./my_plugin.tmux を実行した後に <Bindkey> T を打つと以下のようなリストが表示されます。

tmux-better-mouse-mode        4c686e5 Fixed quotes in bind-key WheelDownPane causing #23.
tmux-continuum                499b6a7 Merge pull request #17 from jarosser06/rm_hardcoded_home
tmux-resurrect                3a31bfb Use 'xargs rm' instead of 'find -delete'
tmux-sessionist               7218406 Accept strings with spaces in a prompt
tmux-yank                     feb9611 Add @override_copy_command to force copy command.
tpm                           c8ac32a Update README.md (#66)

いい感じですね 😄 tpmで管理するならばこれをGitレポジトリにpushして、.tmux.confに定義してあげれば良いです。tmux pluginがどこにインストールされているかというのを今まで知らなかったのですが、 デフォルトでは $HOME/.tmux/plugins/ もしくは .tmux.conf で TMUX_PLUGIN_MANAGER_PATH という変数にセットしたパスになります。 で、tpmプラグインをインストールすると先ほどのパスに各プラグインがgit cloneされます。作ったプラグインでは愚直に(?)プラグインごとに git log を叩いて先頭のコミットを抽出するという作業を行っています。

シェルスクリプトでお手軽に書けるのがいいですね。

kanazawa.rb meetup #59 に参加しました #kzrb

kzrb.doorkeeper.jp

いつもの感じでもくもくしていました。いつもと違うのはメインのメンバーが揃って不在なことで、 @cotton_desu さんが準備や司会業や会計業などもろもろ頑張っていました。ありがとうございます!

今回は特定用途のCSVファイルを取り込んでそれをいい感じにフィルタリングするというようなスクリプトを書いていました。Rubyで。

気付き

CSV converterという仕組みがあり、ファイルを読み込んでCSVフォーマットの文字列をパースするときに特定のルールにマッチしていれば得られた値をNumericやDateの型にしてくれるという便利なものです。ドキュメント見ていて今回初めて気付きました。くわしい記事を見つけたので参照してみてください。

tech-kazuhisa.hatenablog.com

ドキュメントはこちらです。

class CSV (Ruby 2.4.0)

自分のケースではカンマを含む金額のフィールドがありそれを数値として扱いたかったため自作converterを作って処理しました。

require 'csv'

filename = 'foo.csv'
converter = -> (f) { 
  begin
    e = f.encode(CSV::ConverterEncoding)
    e =~ /[\d,]+/ ? Integer(e.gsub(/,/, '')) : f
  rescue
    f
  end
}

CSV.foreach(filename, converters: [converter]) do |row|
  # ...
end

銀行口座の明細CSVファイルを取り込んで項目などでフィルター掛けて畳み込むみたいなことが一応できました。(CSVファイル読み込みさえすればあとはRuby組み込みのメソッドを使ってるだけですが…w) 進捗出せたので良かったです。

# 電気料金の引き落とし額の合計値を求める例
bank_account.parsed_data.select {|d| d.summary =~ /電気/ }.reduce(0) {|sum, d| sum + d.payment }
=> 7291

懇親会

いわゆる昔ながらのビアガーデンという雰囲気。この日は相当暑い日でしたのでビールが進みました😆 食べ放題だったのですが、最初のバッチ(3枚目の写真)で割と満腹になったのは少々誤算ではありましたねw

次回はkzrb 5周年。

kanazawa.rb meetup #58 に参加しました #kzrb #ふくもく会

kzrb.doorkeeper.jp

今回は「開発環境自慢」というテーマでLTする回でした。でもって福井で開催されている「ふくもく会」とのコラボレーション。

fukumoku.connpass.com

テレカンでお互い接続してLTし合うスタイルでした。綿密な設計と準備があって大きなトラブル無くできたのは素晴らしかったです。皆様ありがとうございました。

左側でお互いのLT資料を映し、右側でふくもく会の様子を映す。

Tmuxの話をしました

docs.google.com

開発環境って範囲の大きなものでなかなかテーマを絞り込むのに苦労しましたが、普段から使ってるものであったり自分の事例なんかを話せればいいなと思ったときにTmuxが一番適しているなと思いました。人によって使い方も様々だろうなあ〜ということで、ありきたりかもしれませんがこんな風に使って日々やってるよと言うのが少しでも伝われば嬉しいです。

5分だったのでふわっとした感じですが、プラグインやステータスバーの話は深堀りできそう(やるとは言ってない)。

興味深かったことで、デモをgifにしていたのが良かったという感想をもらいました。画面の切り替え等、動きのあるものを表現したいときってキャプチャを撮ってgifにエクスポートして貼っておくのがお手軽で良いです。GitHubのPull Requestやブログの記事でたまにデモのgif使うのですが、スライドに貼り付けるのは私も初めての試みでした。

感想

エディタ、PC内環境から物理的な作業空間(机、職場環境、カフェなど)、そして道具、筋肉にいたるまで、様々なテーマのLTを聞けてとても有意義でした。質問も飛んだり、わちゃわちゃしたりでふくもく会の皆さんとも楽しく時間を過ごせたのではと思います。あと、meetupページに初コミットしました😆。

懇親会