Blogaomu

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

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

kzrb.doorkeeper.jp

#63 は参加したけどブログ書き損ねてました。#64 は年末恒例のLT大会!参加者はまあなんでもいいので5分喋ろうって感じです。

ちなみに去年のやつ。 www.blogaomu.com

私の発表

今回発表したのはこの2つです。

docs.google.com

docs.google.com

両方とも前半に喋りすぎて後半飛ばし飛ばしになってしまい、思うように伝えられなかったのが残念でした。もともとゆっくり喋るというか言葉が出てくるまで時間がかかることがあるので内容を絞ってもいいのかもしれないなあ。

振り返りの方は、個人で作っていたものとその他インプットアウトプットについて話しました。普段業務ではサーバーサイドの開発やAWSでの環境構築・運用を行うことが多いのでクライアントアプリを作ってみたいという欲求があるのかもしれません。Twitterクライアントは自分の求めるものを作りたいなあというモチベーションはありますが。読書はどれも読み切れないという1年でした。読むか〜っていう感じになかなかならなかったし、まとまった時間が作れなかったというのもあるかもしれないですね。その中でもElixir本はkzrbのもくもく会を使って少しづつ進んでいるので来年も継続していきたいです。

新幹線tipsはなんかネタないかなーと考えていて、そういえば出張まあまあ行ってるなということを思い出し5分くらいでちょうどいい感じになりそうと思いまとめました。強く言いたかったスライドが最後になってバタバタしてしまったのは構成としてあれだったなあ。ビール情報は今後も開拓していきたいです。

全体的に

他の人の発表は、今年はこういうもの買ったで〜とかこんなの作ったで〜とかいう感じでした(雑)。買ったもの発表は物欲を刺激されますね...w

懇親会

今年最後ってことで肉を食らいました。肉美味しい。肉最高。

二次会はワインのお店。2017年のボジョレーヌーボーを頂きました。ワイングラスの話になって、他のお酒(日本酒やウィスキーなど)を入れても香りを楽しめていいよねっていう話になりました。この日は雨風が強かったのですが、突撃したお店が軒並み満席でしばらく放浪してましたw 年末感出てきてます。

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関数を使った...汗
    • ガード節すっかり忘れていた
    • 解答例 Topics tagged pragprog

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

ツイートまとめ

今回、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が上がってました。

Repositories - GitHub Docs

プルリクエストもしくは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周年。