Blogaomu

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

Kanazawa.rb meetup #81 に参加しました #kzrb

今月も参加してきました。

kzrb.doorkeeper.jp

meetup.kzrb.org

会場は DMM.com のオフィスでした。毎度ありがとうございます!

CircleCIのインシデントレポートを読む

status.circleci.com

CircleCIで約2週間に渡って不安定な状態が続いていた障害についてレポートが公開されているので、これを読んで学びを得ようと思いました。

雑なメモ(雑な訳)

  • 2019-03-26から2019-04-10の間、CircleCIのプラットフォームは不安定になりダウンタイムも発生。これはビルドのキューを支えるデータストア(=MongoDB)の問題によるもの。
  • これにより、ジョブやワークフローが上手く処理できなくなった。また、パブリックAPIデグレードをももたらした。(デグレードっていい日本語無いですかね?)
  • 障害が発生した同時期にJVMのマイナーバージョンアップを行ったが、その中にDockerについての対応が含まれていた
  • 時間をおいて再びMongoDBに問題発生
    • このことより一連のインシデントにおいてJVMのバージョンアップは主な原因ではないと認識した

と、まだ全体の三分の一程度しかレポートを読めていませんが、長期に渡ってインシデントが続いたので問題が複雑そうな感じがします。

その他

他の参加者のもくもく内容を聞いて、某中の人と繋げられそう、ということで早速連絡を取ってみることに。来月辺りにお知らせができたら嬉しいです。

懇親会

GRAN NICK -グランニック-
〒920-0853 石川県金沢市本町2-374
4,500円(平均)1,200円(ランチ平均)
r.gnavi.co.jp

グランピング気分が味わえるということで女性客やデートのお客さんが多い中、Rubyおじさん御一行で一次会!料理は全般的に美味しかったです。席が隣になった @yu_kgr さんと結構喋ってた記憶。オフラインならではの内容が多かった気がしますw あとは恒例のキャンプ話とかポッドキャスト話とか。

Kanazawa.rb meetup #80 に参加しました #kzrb

79は先月のHashiCorp勉強会だったので、ブログとしては78から飛んで80になってます。

kzrb.doorkeeper.jp

テストをCIで実行

前回Buffbuffのテストコードを追加したので、今回はCIで実行するようにするのを目標に作業していました。

もくもく会での成果物としてはこちらのビルドです。Travis CIを利用してRuby 2.6系でテストを実行することができました。

travis-ci.com

私は今回初めてTravis CIを使ったのですが、驚いたのは設定ファイルの記述量の少なさ。上記リンクのビルド設定はたったの5行です。まじかよ。業務ではCircleCiを使っていてかつワークフローも使うので複雑な設定ファイルを見慣れているせいか、このシンプルさにはびっくりしました。

language: ruby
rvm:
  - 2.6
env:
  - BUFFER_ACCESS_TOKEN=test

どのCIサービスを使うかっていう観点ではsue445さんのこちらのブログ記事を参考にしました。

sue445.hatenablog.com

LT

以下の発表を行いました。当日はDropbox Paperのプレゼンモードを使いました。


個人的に興味深いtech系Podcastのご紹介

はじめに

  • 作業中にPodcast聞くことがある
  • ずっと同じ人のものを聞いても飽きてしまうので去年ぐらいから開拓し始めた
  • 聞いてきた中で興味深く感じたものをご紹介します

ajito.fm

  • https://ajito.fm/
  • 開幕で酒を飲むのが良い
  • 様々なゲストが登場して、話題も幅広い
  • 毎回楽しそう
  • お気に入り #35 #37 #40 #45

人生fm

  • https://kirimin.github.io/jinseifm/
  • バーチャル幼女プログラマーのきりみんちゃんがホストしている
  • 声が穏やかで聞きやすい
  • ゲストが今までの人生を語り続けるのが良い
  • いろいろな人生があるんだなあとしみじみする
  • お気に入り #3 #6

田舎.fm

  • https://komatatsu.github.io/inaka-fm/
  • こまたつさんという鳥取でリモートワークしているAndroidエンジニアの方がホスト
  • 地方や田舎の観点からの会話が多くて共感できる点が多い
  • リモートワークの話も多くてこれも共感できる点が多い
  • きりみんちゃんはこのpodcastで知った
  • 最近更新が止まってて悲しい
  • お気に入り #3 #6 #9 #12

yancan.fm

  • https://www.yancan.tech/
  • りほやんさんとりさきゃんさんのRubyエンジニア二人による配信
  • テンション高い
  • 今どきの若者だな〜〜という気持ちになれて良い
  • 女性視点でのエンジニア界隈の話は興味深い(RubyConf)
    • RailsGirlsやTokyoGirls.rb meetupなど積極的に関わっている
  • りほやんさんは金沢出身とのことなので、kzrbにも来てほしい
  • お気に入り #4

yome.fm

  • https://yomefm.github.io/
  • konifarさん(Androidエンジニア)と奥様(非エンジニア)による配信
  • 仕事でこんなことを考えてるんだよとか同僚にこんなスゴイやつがいてさ〜とか奥様に分かりやすく話すスタイルが微笑ましくて良い
  • 声が穏やか
  • ゆるいんだけど本質を捉える話も多い
  • お気に入り #14 #7 #9

EM.FM

  • https://anchor.fm/em-fm
  • Engineering ManagerによるEngineering ManagerのためのPodcast
  • 最近Engineering Managerってよく耳にするようになったので興味が湧いた
  • 難しい話もあるけど、こんな風に考えてるんだなーって言うのを知れて面白い
  • ホスト二人の知識量と話を掘り下げる力がすごい
  • 最近だとあんちぽさん回(#21)、松本さん(#18, #19)回が面白かった

OIMO.fm

  • https://podcast.kglabo.com/
  • 最近始まった個人的期待枠
  • 自分はこう思ったっす、っていうのは聞いていて面白い
  • 詐欺師症候群のくだりはあるあると思った

おわりに

  • ゆるい系を気に入る傾向がある
  • 他人の好きなことや思ったことを聞くのは面白い
  • ハッシュタグつけてツイートするとリアクションあったりするので、非同期的双方向感がある
  • 皆さんもお気に入りのPodcastがあったら教えてください

おもしろかったのは、作業中に日本語の会話が耳に入ってくると集中できなくなるという話があって、これは完全に人によるのかなと思いました。私は大丈夫な方なのかもしれません。

懇親会

おでん美味しかった、日本酒も良かった。カメラ沼、カスタマイズ性とデータ設計、Effectiveシリーズ、液体調味料を秒で計る、人生再設計などの話をしました。

HashiCorp Terraform & Vault Enterprise 勉強会 in 金沢に参加しました

こちらの勉強会に参加してきました。HashiCorp Japanより伊藤さんをお招きしての開催。ありがたい。

connpass.com

Terraformは実戦投入したことないのですが、個人で触ったことがあるレベル(入門中)。Vaultの方は名前だけ聞いたことあるけど触ったことはないという前提で話を聞いてきました。

ここからはメモです。

  • インフラの理想状態をコードで表してTerraformによって実際に適用されるイメージ
  • TerraformのEnterprise版があるの知らなかった
    • SaaSとして提供されている(Private install版もある)
    • GitHubの特定ブランチに対してpush or mergeされるとフックしてtfファイルが適用される。CI/CDのワークフローが完成されている状態
    • 複数ユーザーが操作してもStateの共有を良い感じにしてくれる
    • ガバナンス(Policy as code)
    • 適用時のログが残るので監査的にも良さそう
  • Terraformはコミュニティベースのモジュールレジストリがあって、良い文化だと思った
  • Vaultの主な機能: シークレットの一元管理、アイデンティティベースのアクセス、暗号化
  • 動的なシークレット(クレデンシャル)の発行はアツい
  • Encrypt as a Serviceとしての側面も持っている
  • AWSのサービスで言うと、VaultはSecretsManagerとKMSとACMが全て含まれているようなイメージ

インフラの構成の潮流としてオンプレ→クラウド→マルチクラウドという風になっていて、自分の携わっているところではAWS内で完結しているのでマルチクラウドのイメージはあまりないけど、基本はAWSで構築して特定のサービスはGCPまたはPaaSでみたいな構成は選択肢としてはありえると。そうなったときに、インフラを管理するのにTerraformを使うと便利な場面がでてきて、シークレットおよびクレデンシャルの管理にVaultが力を発揮する場面がでてくるのだなー、とHashiCorp伊藤さんの説明を聞いて思いました。また、HashiCorpが提供しているプロダクトとしてはNomadとConsulというものもあって、これらもマルチクラウドという文脈に沿っていて思想がプロダクトとして体現されていて良いなあと感じました。トップページに軽くこの辺の思想が載っていました。 https://www.hashicorp.com

Hashicorp様よりステッカー頂きました(TerraformとConsul)。

懇親会

懇親会は丸奄。お魚美味しかった。HashiCorp伊藤さんと経験のあるエンジニア達がいる席になって、ディスカッションが盛り上がっていて楽しかったです。自分はあまり発言できなかったけど、素振りも業務も経験を増やしていろいろ自分はこう思うって言う話ができるようになっていきたいですね。

Consulの役割からマイクロサービスの話になり、昔SOAPというのがあったけど今で言うとgRPCがあってこれはうまくできてるし使われてるよね、マイクロサービスが現実的なソリューションになっていてやっと時代が追いついてきたよねっていうような話が面白かったです。歴史は繰り返す、というのは良く言われることですが、こういうところからも歴史を学ぶのは意義があることだなあと思います。

これはブリを燻したやつ。香りもよくめちゃくちゃ美味しかった。

二次会は串カツ田中。一次会で結構お腹パンパンだったはずなのに、串カツならなぜか食べられてしまう不思議...。

Rubyで確定申告楽したい2019

今年も無事に確定申告が終わりました。昨年3月のkzrbで確定申告用のスクリプトを作った話をしたのですが、その続き。

www.blogaomu.com

去年の時点では以下の機能が実装されていました。

  • 金融機関からダウンロード済みのCSVファイルを読み込む
  • 金融機関毎にCSVデータをパースしてオブジェクトの配列にする

特定の支払いを抽出するのはできていたのですが、経費としてfreeeに登録するのは手動で行っていたのでfreeeにインポートできる形式でファイル出力する機能を実装しました。今回実装したのは以下になります。

  • 金融機関毎のデータオブジェクトをfreeeインポート用データオブジェクトに変換する
  • freeeデータオブジェクトの配列をCSVファイルに出力する
  • 一連の処理を rake タスク化

freeeの取引インポート機能についてはこちらを参照。 support.freee.co.jp

処理の詳細

こんな感じでデータを表すクラスと処理(=今回はCSV出力)を扱うクラスを作成。属性の名前はfreeeさんのhtmlから拝借しました🙇 Freee#export の datas には FreeeData の配列が渡ってくる想定。

require 'csv'

class FreeeData
  attr_reader :deal_type # 収支区分
  attr_reader :admin_number # 管理番号
  attr_reader :date # 発生日
  attr_reader :settlement_date # 決済期日
  attr_reader :partner # 取引先
  attr_reader :account_item # 勘定科目
  attr_reader :tax # 税区分
  attr_reader :amount # 金額
  attr_reader :tax_calculate_type # 税計算区分
  attr_reader :tax_amount # 税額
  attr_reader :description # 備考
  attr_reader :item # 品目
  attr_reader :section # 部門
  attr_reader :default # メモタグ
  attr_reader :transaction_date # 決済日
  attr_reader :walletable_name # 決済口座
  attr_reader :settlement_amount # 決済金額

  def initialize(**params)
    params
      .select {|k,v| self.methods.include?(k) }
      .each {|k,v| self.instance_variable_set("@#{k}".to_sym, v)}
  end
end

class Freee
  def export(datas, filename)
    option = {
      encoding: 'Shift_JIS'
    }
    CSV.open(filename, 'wb', option) do |csv|
      csv << ['収支区分','管理番号','発生日','決済期日','取引先','勘定科目','税区分','金額','税計算区分','税額','備考','品目','部門','メモタグ(複数指定可、カンマ区切り)','決済日','決済口座','決済金額']
      datas.each do |d|
        csv << [d.deal_type, d.admin_number, d.date, d.settlement_date, d.partner, d.account_item, d.tax, d.amount, d.tax_calculate_type, d.tax_amount, d.description, d.item, d.section, d.default, d.transaction_date, d.walletable_name, d.settlement_amount]
      end
    end
  end
end

初期化処理はこちらを参考にしました。ありがとうございます。

tex2e.github.io

そして、もともと実装済みの金融機関毎の処理に FreeeData オブジェクトへ変換する処理を実装。なんかデータ変換ロジックって誰が知っていると都合が良いのか分からず、いったん金融機関データクラスに実装してしまった。ここで時間を使うよりも確定申告処理に時間を使いたかったので雑になったのは言い訳です。

# 実装イメージ(なんかしっくりこない)
# 金融機関のデータを表すクラス
class HogeBankData
  attr_reader :date
  # ...

  def convert_to_free
    # 銀行データは FreeeData について知っている必要がある???
    FreeData.new(
      date: date.strftime('%Y/%m/%d'),
      # ...
    )
  end
end

# 処理クラス
class HogeBank
  def import(filename)
    # ...
  end
end

ともかく、金融機関のデータリストからfreeeインポート用のデータに変換してファイルに出力するという処理の流れを作る準備ができました。今までどおりreplでポチポチやってもいいのですが、さすがにだるいので rake タスクにしてコマンド一発でファイル出力できるようにしておきました。

# これも実装イメージ
$LOAD_PATH.push('lib')

require 'hoge_bank'
require 'fuga_card'
require 'freee'

task :export do
  hoge = HogeBank.new
  hoge.import('data/hoge_bank/data.csv')
  f_data = hoge.parsed_data.select {|d| d.is_transaction_for_freee? }.map {|d| d.convert_to_freee }
  fuga = FugaCard.new
  Dir.glob('data/fuga_card/*.csv') do |csv| # 月別にCSVファイルがあるパターン
    fuga.import(csv)
  end
  f_data += fuga.parsed_data.select {|d| d.is_transaction_for_freee? }.map {|d| d.convert_to_freee }
  
  freee = Freee.new
  freee.export(f_data, 'freee.csv')
end

感想

  • 目視確認して手入力していた去年に比べて自動化が進み楽になった
  • とはいいつつ申告期限もあったので、雑に作った節は否めない
  • マッピングのところは泥臭くなってしまう
  • 何年か振りに Rakefile 触った
  • 来年は金融機関のサイトからCSVファイルをダウンロードするところを自動化したい(スクレイピング行けるんだろうか)

Kanazawa.rb meetup #78 に参加しました #kzrb

実は77にも参加していたけどブログ書くの飛ばしてしまった...。なので2019年初のkzrb参加日記になります。

kzrb.doorkeeper.jp

buffbuffのテストコードを書く

github.com

ひとまずgem化するところまではできて落ち着いたのですが、今後メンテナンスしていくときにはテストコードが必要だろうと思い、もくもく会で書いていました。しかし Buffbuff::Command のspecを書いている途中で時間切れ。 主に以下の点でハマっていました。

あまり記事も見当たらなかったので、ベースとしているライブラリのthorのテストコードから同じようなことやってないかなーと調べるのに時間を費やしていました。

懇親会

MJダイニング
〒920-0853 石川県金沢市本町2-12-4 ステーションタウン小森1F
4,000円(平均)
r.gnavi.co.jp

www.hotpepper.jp

冬キャン、組織の文化と採用、勉強会やカンファレンスの会場問題、インシデントとどう向き合うか、その他オフレコトークについて話していました。珍しく日本酒を多く飲んでた記憶。

おわりに

来月はHashiCorpプロダクトのTerraform, Vaultについての勉強会です!ぜひご参加を。

connpass.com

JAWS-UG金沢 #38 に参加しました #jawsug

jawsug-kanazawa.doorkeeper.jp

re:Invent 2018の振り返りがメインの会でした。私は以前から要望のあったDockerコンテナ運用の話をしてきました。

発表

以前からJAWS-UG金沢の中でDockerコンテナの運用について話してほしいと言われていて、満を持して今回発表ということになりました。お手伝いしている zozo.com の構成をほんのり紹介しながら Elastic Beanstalk を使ったDockerコンテナ運用についてまとめました。Webアプリケーションの実行基盤っていろいろ選択肢があって、さらにDockerを使うにしても今なら Kubernetes を使う選択肢もあるし Heroku も選択肢に含まれるのではと思います。今思うと、スライド内で紹介したEBを選んだ理由は後付けの部分が少しあったりしますが実際使ってみて感じたところです。

re:Invent 2018 振り返り

www.slideshare.net

なんと自費で re:Invent に参加した方がおられて発表していただきました。すごい。。

あとは re:Invent で発表された新サービスや新機能についてお互いに発表し合うというコーナーも設けられました。DynamoDB TransactionやLambdaのCustom runtime サポートについて注目している人が多かった印象です。

docs.aws.amazon.com

docs.aws.amazon.com

機械学習勉強会レポート

www.icloud.com

昨年福井で行われた機械学習勉強会について発表していただきました。Amazon SageMaker を使ったハンズオンが行われて簡単に画像分類(手書き数字)できるよという内容だったそうです。

感想

仕事でお世話になっている cozima さんが東京から参加してきてくれ、北陸で一緒に酒を飲めたのが感慨深かったです。 2月はJAWS DAYSに行くぞー。

2018年個人的振り返り

毎年やってるやつです。年が明けてから振り返るのも悪くはないでしょう。

www.blogaomu.com

仕事

2018年も引き続きZOZOのお仕事を手伝っておりました。

zozo.com

立ち上げ→リリース→運用というフェーズに変わって、(マイクロサービスの)チームのリーダーから1メンバー、そして技術課題を解決するチームの1メンバーと自分の役割も変わった1年でもありました。その傍らでインフラとPythonサーバーチームのお手伝いをしていて、相変わらずいろんなところに顔を出す人として動き回っていました。

チームのリーダーとしてやっていた頃はコミュニケーションの質・量ともに課題があり行き詰まってしまったので、自分からこれ以上リーダーの役割はできないと相談し、実際に1メンバーとしての役割に移してもらいました。自分の設計スキルやそれを言葉にして伝えるスキルが足りなかった、という要因も少なくはないのですが、オフィス勤務のメンバーがマジョリティでリモート側がマイノリティになってしまう環境的要因もあったのかなーと感じています。

1メンバーとしての役割に戻った後は、実装、レビューのサイクルをひたすら回すという感じでリリースまで走り抜け、運用段階に入ってくると技術課題を解決するチームに移りました。(チームといっても2人ですがw) ここでは日々の開発で困っていることを解決したり技術的方向性を決めたりするのが役割で、具体的なタスクを一つ上げるとCI/CDを速くするというのに取り組んでいるところです。ここの部分って地味ではあるんですが、関わってるメンバーに最も見られる部分でもあるので今まで以上にやっていかないとなという気持ちになっています。

いろんなところに顔を出す人としては、どうしてもあれもやらなきゃこれもやらなきゃと考えてしまって時間が足りなくなってしまうのですが、2018年はScalaとDockerに重点を置いたのかなと思います。2019年はマイクロサービスやKubernetesの思想とパターンを身に付けたいです。

コミュニティ活動

定期的な活動としては、Kanazawa.rb 11回、JAWS-UG金沢 5回に参加しました。2018年の裏目標としては、発表(1回の質・量にこだわらず)をたくさんする、というのがありまして Kanazawa.rb ではそこそこできたかなと思います。発表の準備をする中でも特にこの2つに気付けたのはよかったのかなと思いました。

  • 資料をディスプレイに映して声を出して練習する
  • だいたい時間オーバーするので削る作業を行う(何を大事にして話すか決める)

発表はまだまだ慣れてはいないので、2019年も継続してやっていきたいです。

大きなカンファレンスとしては、Japan Container Days v18.04、Scala関西Summit 2018の2つに参加しました。カンファレンス参加はかなり久しぶりでしたが、やはり刺激になるし普段は一人でやっているので情報を仕入れるという点でも良いですね。

www.blogaomu.com

www.blogaomu.com

また上記とは毛色が異なるところでは、ホクリク魅力ソンというアイデアソンに参加しました。ブログ記事はまだ書けてないのですが💦 アイデアソンには初めて参加し難しさも覚えながらも自分の感心のあるスポーツというトピックで技術の観点からアイデアへの貢献はできたのかなと思います。

riac.nict.go.jp

Uターンして2年過ぎましたが、こうして技術的なコミュニティ、さらにフットサルやサッカー観戦などでも知り合いが増えてきて、拠り所が複数できているのはありがたいなあと思います。普段はSlackやzoomでは繋がってるけど一人で作業していることがほとんどなので、雑談したり相談したりそういうことができる場は大切だなと感じています。

個人開発

Kanazawa.rb の運営から派生して以下のツールを作りました。なんかこんなのあったら良さげ?という会話ベースのところから始まったのですが、何とか形にできたのはとても良かったです。自分の作ってるプロジェクトはだいたい途中で挫折しがちなので💦

github.com

2019年は MH-Z19 というCO2センサーを手に入れたので、これを使ってお部屋のCO2濃度検知くんを作りたいなーと考えています。これも無事に形にするところまで持っていきたい。

上手い酒を飲めるように生きていきます。