Blogaomu

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

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

記事を書くのがご無沙汰。前回の#84でKanazawa.rbは7周年を迎えて、今月からは8年目に突入しています。

kzrb.doorkeeper.jp

GraphQL Frontend入門

How to GraphQLというチュートリアルサイトがあって、もくもく会ではこれのフロントエンド編(React + Apollo)を写経していました。実はバックエンド編は一度写経を終えています。

www.howtographql.com

GraphQLの基本的な概念はすでに学んでいたため、今回の写経ではReactのコンポーネントとは?とかそういうところで時間が取られてしまいました。ここ最近のフロントエンド事情は疎い限りなのですがVue.jsをちょろっと触ったぐらいなので、モジュール化するのはなんとなく分かるけど状態管理あたりはさっぱりです。。今回の題材はReactですが基礎は抑えておきたいと思いました。ひとまずMutations: Creating Linksまでは完了。

雑談

近くに @_kentaro_m さんが座っていて、「Gatsby.jsを触っているけど内部ではGraphQLを使ってて動作を知っておきたいので何かいい資料ありますか?」と相談があったので一旦上記のHow to GraphQLを薦めておきました。あとは、なんかの弾みでマイクロフロントエンドの話になって、なるほど最近はそういう設計パターンもあるんすね、あーそれってコンウェイの法則があてはまってるのかな?とかいろいろ話していました。最近読んだEffective DevOps本の影響もあって組織とソフトウエア設計、パターンの関連について興味が出てきていて食いついたのもありますね。

余談。楽しそうな飲み物があったので即購入!

懇親会

www.hotpepper.jp

www.hotpepper.jp

1件目はイタリアン大衆酒場のお店。よく通りすがるけど入ったことなかった。2件目はおなじみの手羽先のお店。

富山から参加されていた @kunitoo さんが隣の席だったので Toyama.rb の話とかリモートワークの話とか聞いてました。あとは、@yu_kgr さんの近況やキャンプ、台湾の屋台、酒は資産、山が安く売り出されているなどの話をしてました。

お知らせ

来たる11/3に富山Ruby会議が開催されます!!!私は諸々の都合で参加できないのですが、スピーカーも豪華な面々なのでぜひ参加してみてください〜。

toyamarb.github.io

また、11/20には金沢でAWS Community Day Kanazawaが開催されます!!!こっちは運営に携わってます。平日開催ではありますがぜひ参加してみてください〜。

awscommunityday2019.jaws-ug.jp

Algolia勉強会 in 金沢を開催しました

2019-07-20にDMM GAMESにてAlgolia勉強会 in 金沢が開催されました。

connpass.com

Algoliaより篠原さん(@shinodogg)をお招きし、昨今激アツな検索エンジン&APIサービスの Algolia について学びました。今回は開催に到った背景なんかをまとめておきたいと思います。

www.algolia.com

開催までの背景

www.instagram.com

私が東京にいたころ、Bracket(現ストアーズ・ドット・ジェーピー株式会社)という小さなスタートアップ企業に在籍しており、運用しているサービスでAWSを利用していたことからSA(Solutions Architect)によるアドバイスを受けたり相談してもらったりしていました。篠原さんはその時のSAとして技術相談やスタートアップを対象としたミートアップなど様々な場面でお世話になっていました。

私が金沢に戻ってからはお会いする場面はなくなっていたのですがSNSで近況を見ているとAlgoliaに転職したというのが流れてきました。しばらくしてKanazawa.rbのとある回で清原さん(@kiyohara)がAlgoliaについて調べていて、実はAlgoliaにこういう方がいるんですって言ってみたところ駄目元で金沢来て話してくれないかなーと盛り上がり、早速篠原さんにFacebookで連絡を取ってみることに。すると二つ返事でやりましょうと言っていただき、そこからトントン拍子で勉強会の内容やスケジュール等が決まっていきました。このスピード感はスタートアップさながらの雰囲気でしたねw

実務的なところは清原さんがゴリゴリ進めてもらって非常に助かりました。また、Kanazawa.rbやJAWS-UG金沢のメンバーそしてDMM GAMESさんにも協力いただいて開催までおよび当日もスムーズに運営できました。この場を借りて皆様にお礼申し上げます 🙇

実際に動かしてみて

www.slideshare.net

さて、勉強会ではハンズオンを行い、AlgoliaのInstantSearch.jsを利用した検索ページを作成しました。InstantSearch.jsはAlgoliaが提供しているオープンソースで、これによってsearch APIのクライアントおよびUIウィジェットを利用することができます。

github.com

ハンズオンでは、シンプルなhtml1ファイル、javascript1ファイル、CSS1ファイルで商品検索ができるページを作成しました。インストラクションの通りに実装してみると、検索結果が返ってくるまで速いこと速いこと。サーバーに通信しているのに平気で20msを切るようなレスポンスになっていてうわさ通りの爆速っぷりを見せてくれました。

また、インクリメンタルサーチや範囲検索(例えば、¥10,000〜20,000のような価格の範囲)、typo-tolerance(打ち間違えてもそれっぽい結果が返ってくる)なども利用できて感心しました。こういうのは自前でフロントエンド含めて一から実装しようとするとかなり手間がかかるものだと思っているので、シュッと実装できてしまうのはAlgoliaのおすすめポイントだと感じています。

懇親会

アーキテクチャの話からキャンプは最高、体を動かすことについて、自転車を買った、金沢人の酒の飲み方などなど篠原さんを交えて楽しい時間を過ごせました。だいぶ飲んでしまいましたがw

感想

この勉強会開けてよかったなと思うのは、Algoliaというサービスを知ることができて、あーこういう解決方法が存在するんだーという学びを得たことです。私自身恥ずかしながらこの勉強会まではAlgoliaというサービスを知らず、検索機能を実装するにはElasticsearchやCloudSearchを使って良い感じにやるという解をぼんやり思い浮かべていたのですが、他の選択肢としてAlgoliaもあるよねと知れたのは大きいです。

togetter.com

また、参加者の皆さんにも概ね好評(と受け取れる)だったようでなによりです。継続的に学習する場、学んだことをアウトプットできる場というのを今後もお手伝いできればいいなと思った次第です。

最後に宣伝になりますが、次回のKanazawa.rbは7周年記念のLT大会なので、こちらもご参加いただければと!!

kzrb.doorkeeper.jp

ScalaMatsuri 2019に参加しました #ScalaMatsuri

2019年6月28日、29日に東京で開催されたScalaMatsuri 2019に参加してきました。2016年に参加して以来2度目の参加でした。以下聴講したセッション+αについてメモや感想を書いていきたいと思います。

2019.scalamatsuri.org

関数型オブジェクト指向命令型 Scala

  • Scala.jsのAuthor @sjrdoeraene さん
  • 関数型、オブジェクト指向、命令型(手続き型)、さまざまなパラダイムScalaでは使うことができる
    • Scala.js のコードを例に出しながら解説していた。
    • apiの中で、アルゴリズムによっては関数型で書くと読みづらいまたは複雑になる場合、varを使うことも考えてよい。
    • sometimes, builders are better in readability というケースもある。
    • mutableな状態をクラス内に持っているけど、privateになってるので外からは見えない。(encapsulation)
    • いろいろなパラダイムを局所化(クラスの中に隠蔽しておく等)しておくというのがポイントだと思った。
  • こういう点はScalaの良いところだと思う

Scala における型クラス入門

speakerdeck.com

  • @phenan さん
  • 型クラスを、型システムにより支援されたストラテジパターンとみなすと理解しやすい
    • 少し理解が進んだ
    • Scalaでは型システムとimplicitパラメーターのおかげで良い感じに実装できる
  • 拡張メソッドの話
    • implicit classで既存のクラスにメソッドを追加できる
    • 型制約(implicitパラメーター)をつければ型クラスインスタンスでのみ使えるようにもできる
  • Scala3での型クラス利用法の紹介
    • implicitの用途がいろいろあって混乱しがちなので、Scala3ではキーワードが個別に定められていて良いと感じた
  • 型クラスを理解して実装できるようになるとScalaレベルが一段あがるような気がする

Spotify での Scio を使ったデータ処理

spotify.github.io

  • @skaalf さん
  • big data is big money
    • 大量のデータを扱うにはコスト管理(ストレージ、ネットワーク、コンピューティング)も大変というのは確かになあと思った。いかに効率的に行うかもビジネスに関わってきますよね。
  • Kryo to Typesafe coder. runtime black magic から compile time black magicになったという説明が面白かった
  • 巨大なデータを分割(シャード?)してマージするというjoinの仕方(SMB join)があるのを初めて知った
  • データ処理分野でもScalaが利用されているんだなあというのは今回の発見だった

休憩スペース

休憩スペースでは、freeなコーヒーとお菓子が提供されていました。私は一人でコーヒー飲みながら休憩してましたが、複数人で雑談してる人も多かったです。

Scala Driven Management

speakerdeck.com

  • @hiraiva さん
  • レビューとして型安全性と仕様的に正しいかに注力したというのも興味深いポイント
    • プロジェクトで使える時間も限られているため、スコープを絞るのは重要だなあと思う
  • 型安全性、ケースクラス、エコシステム(Java資産含めて)のおかげで最小のマネジメントコストで実装できたとのこと

プロジェクトで引き回す型をEffにするメリット

speakerdeck.com

  • @wing_007 さん
  • for糖衣構文を利用するに当たってどの型を使うか問題
    • 型合わせ問題…
  • 発表者は Eff[R, A] という型を利用しているとのこと
    • 銀の弾丸ではないと思うが、調べてみても良さそうだなと思った

お昼ご飯

海外からの参加者も多く、宗教等に配慮してお弁当にもいくつか種類があるようでした。これは恐らくハンバーグ弁当。1階にも休憩&充電スペースがあり、ここでゆっくり食べられて良かったです。

Scala における関数型並行処理入門

slides.com

  • 昼ご飯食べて会場に着いたら立ち見だったので聞くのを諦めました…

ハイパフォーマンスScala

speakerdeck.com

  • 発表者の経験からすると、パフォーマンスの問題が起きるのはI/OとGC
    • その理論を知っておくことが問題の解決につながる
  • プロファイリングツール使ってスレッドの監視すると良い
  • ノンブロッキングをサポートするライブラリはいくつかある。Slick, ScalikeJDBC-Async, quill-async, akka-http, finagle
  • ブロッキング処理用のスレッドプールを用意すべき。
    • Scalaやり始めた当初は何でもかんでも global な ExecutionContext を利用してハマった思い出がある
  • 大きなコレクションオブジェクトはGCボトルネックになる傾向がある
    • 計算するのに適切なコレクションクラスを利用しよう
    • 並列コレクション知らなかった
  • HashMapに対してWeakHashMapのkeyは弱参照
    • 参照に強さという概念を持つことを初めて知った
    • ということはkeyは独自のオブジェクトの方がよかったりするのか?(例では UserId 型のオブジェクトをkeyにしている)

Scala ♥ Graal

  • @flaviowbrasil さん
  • JITコンパイラをGraalに移行して、JVMJavaで実装できるようになったと言っていたような
    • 解釈あってる?
  • JVMの最適化でパフォーマンス改善できたっていう結論。しかし、詳細はついていけなかったw
    • 自分はまだJVMの理解は浅いのだなと再認識できた

継続とDI

gakuzzzz.github.io

  • @gakuzzzz さん
  • 再利用可能なモジュールを合成する方法について
    • 複雑な問題に対しては分割して解を合成するアプローチが必要
    • 継続渡しスタイル(CPS)と依存性注入(DI)の2つの手法を解説
  • 関数型プログラミングではCPSを使うことで再利用の粒度を変えられるようになった
    • すなわち、依存する関数を引数で渡す方法
    • これまでのプログラミングの歴史を追って再利用の粒度というのを解説しているのが良かった。
    • 構造化プログラミング→オブジェクト指向プログラミング→関数型プログラミング
  • CPSは素直に書くとネストが多重になるので、継続自体をクラスにしてmap/flatMapを定義することでforを使ってすっきり書くことができるようになる
    • このあたりはScalaらしいやり方だなと思った
  • アドホックな合成を行いたいときはCSPを使うとやりやすい

2日目

2日目の始まりは、前日までに書き込まれたアンカンファレンスで話したいことから反響の多かったものを中心に実際に行うセッションを決める「朝会」からスタート。書き込んだ人がセッション内容の概要を説明し、興味ある人が手を上げて、司会のお二人がその人数に応じて会場とコマを割り当てるというやり方。ゆるっとした空気感で良かったです。

Scala and SRE

  • アンカンファレンスで当日決まったセッション
  • 参加者みんなでテーマに沿って議論するというスタイルでした
    • モニタリング、分散トレーシング、パフォーマンスチューニング、Scalaならではのハマりポイント、etc.
  • 各社のSREが集まっていて、弊社ではこうやっているとかこういう場合ってみんなどうしてる?っていう感じでした
    • なので詳細はここには書くことができないw (これもアンカンファレンスの醍醐味ですね)
  • Javaパフォーマンス』をまずは読めと薦められた

Scala酒場

Scala関西Summitのアンカンファレンスで生まれたScala酒場がScalaMatsuriでも登場しました。Chatworkさんのブースに有志持ち込みの酒がどーんと設置されており、Scalaやその他雑談しながら飲んでました。なぜか方言の話になって面白かったですw

ハウツー・テストproper{t,l}y

speakerdeck.com

  • @larsr_h さん
  • プロパティテスティングについては興味はあるけど、まだ使えていないため知見が得られればいいなと思い聴講
  • テストの入力をどう生成するかというところの技術について解説されていた印象
  • Cogen/perturb当たりでよく分からなくなったのでつぶやいたところ、たまたま出席されていた @xuwei_k さんから解説いただいた(ありがとうございます)

感想

  • 国際カンファレンスとあって普段聞けないような話をたくさん聞けた
  • セッションによって同時通訳無しで半分程度理解できたものと、全然理解できなかったものがあった
    • 技術的な背景をどの程度知っているかにも依存しそう
  • 2016年のScalaMatsuriにも参加していたが、その頃よりも経験や知識を身に付けたのでより楽しめたと思う
    • 自分の中でこの部分は理解できてる、できていないというのが認識できてよかった
  • 写真もっと上手く撮りたい

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ファイルをダウンロードするところを自動化したい(スクレイピング行けるんだろうか)