kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Rubyist が学び合うカンファレンス「Rails Developers Meetup 2018 Day 4」に参加した

12/8 (土) に開催された「Rails Developers Meetup 2018 Day 4 Nouvelle Vague」に参加した.イベント名に「Rails」と付いているものの,トークテーマは多岐にわたり,エンジニアなら誰でも楽しめるように工夫されていた.また YouTube ライブ配信もあり,リモート参加者も大切にするホスピタリティを感じたし,イベント運営プロジェクトのクオリティの高さに驚かされた!参加したトークの中で印象的なものを抜粋して紹介したいと思う.

techplay.jp

今回は僕も登壇をして,既に資料を公開している.内容的に Non-Tech だからイベントの趣旨と合わなかったらどうしよう!と不安もあったけど,オーディエンスの反応を読みながら楽しく登壇できた!えーっと「プレゼン芸人感」は出てた?笑

kakakakakku.hatenablog.com

ZOZOTOWN のバッチデータ転送基盤の紹介

  • Embulk + Digdag
    • Digdag Ruby scripts Operators も併用している
  • 多くの集計ジョブがある
  • CircleCI : データアナリストが実装した SQL 構文を CI している

Embulk + Digdag を活用した集計基盤のアーキテクチャ事例だった.後半に紹介されていたジョブ依存図は圧倒的な複雑さで大変そうだけど,どこまで Digdag を使っているんだろう?という点は興味を持った.構成次第だけど Embulk も Digdag も Dockerized すると今より運用しやすくなる可能性もありそう.登壇中にちょこちょこと ZOZO に関係する時事ネタが出てきて,笑ってしまった!

(資料公開待ち)

Rails x パターン @junk0612

  • 単一テーブル継承 (STI : Single Table Inheritance)
    • 出典 : 書籍「エンタープライズ アプリケーション アーキテクチャパターン」
    • サブクラスの追加に柔軟に対応できる
    • ただし,サブクラスのカラムに NOT NULL が付けられない
  • フォームオブジェクト
    • 出典 : 不明
    • 複数のモデルにまたがった処理を1箇所にまとめることができる
    • ただし,app/forms に多くのファイルが置かれてしまう
  • 勘定
    • 出典 : 書籍「アナリシスパターン」
    • 「取引モデル」と「勘定科目モデル」に分割して,勘定科目の合計金額が 0 になるようにバリデーションを実装する
  • パターン中毒
    • 導入前に本当に必要なのか?を議論する

「パターン」に興味を惹かれるエンジニアは多いと思う.計3種類のパターンが紹介されていて,特に STI とフォームオブジェクトに関しては Twitter のハッシュタグが盛り上がっていたので,ツイートを見ながら登壇を聞くというリアルタイムな体験は良かった!あと「PofEAA」と呼ばれる書籍「エンタープライズ アプリケーション アーキテクチャパターン」は読んだことがなく,気になる!個人的には「登壇直前に資料が完成した」と冒頭で言っていた点が気になり,実際に資料にミスもあり,もう少し準備をするべきかも?と感じた.

エンタープライズ アプリケーションアーキテクチャパターン (Object Oriented SELECTION)

エンタープライズ アプリケーションアーキテクチャパターン (Object Oriented SELECTION)

  • 作者: マーチン・ファウラー,長瀬嘉秀,株式会社テクノロジックアート
  • 出版社/メーカー: 翔泳社
  • 発売日: 2005/04/21
  • メディア: 大型本
  • 購入: 10人 クリック: 635回
  • この商品を含むブログ (143件) を見る

FiNC での5年間に渡るマイクロサービスの育て方

  • 開始
    • 開発案件を受託する形からスタートした
    • 最初はローカル環境から cap deploy production を実行していた
    • FiNC に吸収される形で JOIN した
  • 成長期
    • 多くの機能が必要になり,モノリシックでは難しいと判断した
    • 「遺伝子検査の閲覧機能」を新規に Rails で実装した
      • これが FiNC のマイクロサービスのはじまり
  • 加速期
    • 一部のサービスに依存が強くなり「神サービス」になってしまった
      • BFF (Backend For Frontend) を導入する
  • グロース期
    • 積極的にマイクロサービス化とリアーキテクトを実施している
    • BFF は Kotlin で実装し直した

非常に刺激的な内容だった!単純にマイクロサービス化を進めるという話ではなく,スタートアップの成長フェーズによって適切な技術選定をし,さらに組織的な改善も日々しているんだろうなという苦労が感じられた.プロダクション環境で稼働中のモノリシックサービスをマイクロサービスに切り出すのは「言うは易く行うは難し」なので,ここまでリアーキテクトを実践されているのは本当に素晴らしい!

二人チームにおけるバックエンド開発の効率化を求めて @okuramasafumi

まさにスタートアップ!という状況の中,ライブラリを適切に選定し,開発プロセスに組み込んでいる事例だった.個人的には2人だとプルリクエストのレビューが止まったりして,期待するほどリードタイムが上がらない場合もあるので,せめて3人だったら良いのに!とは思った.RuboCop の .rubocop.yml にオーディエンスの興味関心があったこともあり,お昼休憩中に .rubocop.yml を紹介する飛び込み LT をされていたのも素晴らしかった!

The Cacher in the Rye

  • GitHub - tsukasaoishi/bitzer_store: BitzerStore can treat multiple cache clusters in Rails.
    • bitzer_store を使うと複数のキャッシュストアに保存できる
  • キャッシュの目的
    • レスポンスタイムを短くしたい
    • サーバリソースを補いたい
  • 運用とコスト
    • キャッシュを意識した実装
    • 監視
  • リスク
    • 適切ではないキャッシュが使われる
    • ヒット率が低すぎる
  • あえて「使わない」

キャッシュを「使わない」という話だった.キャッシュは「諸刃の剣」であるという理解はあるものの,レスポンスタイムを短くするためにプロダクション環境で Memcached / Redis などを使っていた経験もあり,耳が痛い部分もあった.Memcached を使う場合は eviction をモニタリングするのもわかる.資料には「十分なリソースがあればキャッシュは不要」と書いてあったけど,例えば頻繁に実行されるクエリなど,実際にどのように対応しているんだろう?という点はもう少し聞きたかった.

複数のスタートアップを通して得た失敗と学び @threetreeslight

  • Repro 創業者
    • 現在 VPoE
  • 「失敗談」にフォーカスする
    • 失敗軸 : プロダクト / 組織 / 採用 / 技術
  • 0 → 1
  • 1 → 10
    • システム費を無理に削減せずに保守性を考える
  • 10 → 30
    • 採用に専念する
    • 平均以上なら採用する
  • 30 → 50
    • 要望に追われる
    • 雑な設計のスケール限界が見える
  • 50 → 100
    • リリースマネージャに権限委譲する
    • ミドルマネージャの数が組織規模の限界を決める
  • 100 → 300
    • Corporate Operations Engineer(≒ 社内 SE)を専任化する
      • できるなら「社内 SE」と呼ばない
  • 300 → ?

Ruby / Rails とは少し異なるテーマだけど,個人的にはベストトークだった!プレゼンスキルも圧倒的だった!そして「失敗談を楽しく語れる」ことの素晴らしさ(と強さ)を感じた.テクニカルサポートを当番制にしたり,サービスを伸ばすために個別要望に対応したら実装が破綻したり,アーキテクチャのスケール限界が見えたり,実体験とシンクロするあるある話もありつつ,ここまで言語化された資料も貴重なので,スタートアップ界隈は1度読むと良いのでは!

gitpitch.com

まとめ

  • 「Rails Developers Meetup 2018 Day 4 Nouvelle Vague」に参加した(計13トーク)
    • 僕も登壇した!
  • Ruby / Rails に限らず,トークテーマが多岐にわたり,エンジニアリング全般を学べるカンファレンスだった
  • イベント運営プロジェクトのクオリティが高かった
  • お疲れさまでした!

プログラミング初心者に教えるときは「身近な比喩」が重要なのだ!

今日は「Rails Developers Meetup 2018 Day 4 Nouvelle Vague」に参加し,教育関連のネタで登壇をしてきた!パブリックイベントに登壇するのは約半年振りで,やはり登壇するのは楽しいなぁー!という気持ちになった.あと登壇前に司会者から「ブロガーの吉田さん」と呼ばれて,あまりにダサすぎて吹いた!笑

techplay.jp

登壇資料

伝えたかったこと

  • プログラミング初心者に教えるときに「身近な比喩」を使うと良い
    • プログラミング講師に限らず,誰でも「教える(伝える)機会」はある
  • 教えるときに重要なのは「生徒さんと同じ目線で考えられること」
    • そして「粘り強く何度でも伝え,常に笑顔でいること」
  • 「身近な比喩」の引き出しを増やそう!

関連書籍

「チェリー本」は初心者を対象にした本ではないものの「第11章 : Ruby のデバッグ技法を身につける」の内容が素晴らしく,プログラミング初心者は「第11章」のために「チェリー本」を買っても良いと思う.

2週間前に発売された「超入門本」は本当に初心者でも理解できるように工夫されていて素晴らしかった.今後はプログラミング初心者に「超入門本」を紹介しようと思う.今月中に書評を書く予定!

ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)

ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)

まとめ

  • Rails Developers Meetup 最高!
  • 登壇依頼は @yoshi_hirano さんに頂いた!ありがとうございました!

関連記事

今回のネタは今年1月に「表参道.rb」で登壇した内容をベースにブラッシュアップした.

kakakakakku.hatenablog.com

「チェリー本」は今年1月に書評を書いている.

kakakakakku.hatenablog.com

多くの CircleCI ファンが集まった「CircleCI Japan User Community Kickoff」に参加した

12/3 (月) にサイボウズ様オフィスで開催された「CircleCI Japan User Community Kickoff」に参加した.今回は招待制のプライベートイベントで,CircleCI を日頃から圧倒的に活用している人たちが集まっていたので,有名人多すぎでは?という感じだった.僕は CircleCI 関連のブログを多く書いているということで招待して頂いた.ありがとうございます!

f:id:kakku22:20181203233933j:plain

(参加者に配られたノベルティ!)

CircleCI User Community @kemorimo & @kimhirokuni

  • CircleCI User Community
    • 「CircleCI ファンのためのコミュニティ」を作る
    • 今後使うハッシュタグ「#circlecijp」
  • 最近のリリース情報
    • Orbs リリース
    • Config v2.1
    • Xcode 10.1 対応
    • Workflow レベルでの通知
    • ビルドパフォーマンス 33% Up
      • インスタンスタイプを C5 系に移行した
    • サポートナレッジベース日本語化完了
    • 公式ドキュメント日本語化開始

サイボウズを支える CircleCI @miyajan

  • 今までは Jenkins + Drone を使っていた
  • CircleCI 導入開始
    • 1.0 → 2.0 になり,使えるようになった
  • CircleCI Server (Enterprise) 導入
  • 事例
    • 1日1回 CicleCI 経由で VPC を再構築する(常に自動化を試す)
  • Performance Pricing Plan
    • コンテナ数課金ではなく,必要なときに従量課金で使える
  • CircleCI Config 2.1
    • config.yml : 1462行 → 923行 に削減
    • Orbs 未導入

Workflow の並列度が高く,大規模に CircleCI を活用している事例だった.さらに Config 2.1 に移行して config.yml を削減できたとのこと.発表にもあった通り,Orbs を導入すればもっと削減できそう.VPC を1日1回再構築する運用も Infrastructure as Code のお手本として素晴らしかった.

www.slideshare.net

Mercari Frontend の CircleCI 活用事例 @urahiroshi

  • フロントエンドデプロイ
    • 今までは CircleCI でテストだけを実施して,サーバでビルドをしていた
    • CircleCI でビルドをして,Amazon S3 に保存するようにした
    • サーバで Amazon S3 から .tar をダウンロードすれば動くようになった
  • Storybook デプロイ
    • プルリクエスト単位に Storybook を見れるように
    • CircleCI で Amazon S3 に保存して,Amazon CloudFront からアクセスできるように
    • プルリクエスト番号を取得するために ${CIRCLE_PULL_REQUEST} を使う
  • 脆弱性検知

CircleCI と Amazon S3 を組み合わせてうまく CI / CD を実現している事例だった.場合によっては CircleCI Build Artifacts も使えるかも?と感じた.さらに npm audit を Orbs 化して公開されているのも素晴らしかった.npm を使ってるリポジトリにさっそく導入してみる予定!

How Quipper Works with CircleCI

  • アプリケーションもインフラも,ほぼ全てのリポジトリで CircleCI を CI / CD に使っている
  • monorepo 構成
    • 2000行を超える config.yml
    • サブディレクトリごとに変更を検知するシェルを実装して,全てのジョブが実行されないようにしている
  • CircleCI 関連ツール

monorepo だと全体的なビルド時間が長くなる点が大変そうだなと感じたけど,サブディレクトリごとに変更を検知する仕組みがあるのは良かった.CircleCI 関連ツールは興味深くて,さっそく circle-gh-tee を導入してみる.ここまで Infrastructure as Code 化できていると運用も安心してできそう.

CircleCI の Job 突然死と戦った話 @0gajun

  • Performance Pricing Plan 最高
  • 1ヶ月に 533,881分 = 1å¹´ もビルドを実行している
  • resource_class を medium → small に変更したら多くのジョブが落ちるようになった
    • 具体的には attach_workspace が落ちるようになった
    • 原因は OOM Killer
    • cgroup の memory.max_usage_in_bytes などを調査した
    • attach_workspace を実行しているときに page cache の増加が確認できた
    • コンテナだと page cache を削除する権限がなかった
  • 現在まだ根本解決になってなく medium を使っている

Performance Pricing Plan の resource_class を変更したときに発生したエラー調査報告だった.活用事例だけではなく,調査事例も非常に参考になる.CircleCI サポートと連携して原因特定に奮闘しているプロセスも素晴らしく,さらに page cache の増加が確認できた段階に至るステップバイステップの調査内容も参考になった.根本解決になることを期待している!

(資料公開待ち)

CircleCI Orbsの紹介 @ks888sk

  • Orbs 機能紹介
  • Explore Orbs で Orbs を検索できる
  • Good Practices
    • 1 : 実行時間を見積もる
      • 実行時間が長くなる場合に回避策を用意する
      • max-wait オプションを実装した
    • 2 : メッセージ部分を強調する
      • 文字色を付ける
      • 絵文字を付ける
    • 3 : CI / CD
      • Orbs を公開するためにも CircleCI を使う
      • テスト用設定ファイルを使う

そろそろ Orbs を使おうと思っていたため,Good Practices を聞けたのは良かった.特に OSS だから使う側のシチュエーションを想定して max-wait オプションを実装したという話は素晴らしい.紹介されていた h-matsuo/github-release はさっそく導入してみる.

CircleCI オンプレ版 Builder インスタンスのスケールインの話

  • CircleCI Server (Enterprise) では Builder インスタンスで Hashicorp Nomad が動いている
  • Builder インスタンスを Auto Scaling するときに「減らすテクニック」が必要になる
  • Auto Scaling Lifecycle Hooks / SQS / Lambda を組み合わせて,Builder インスタンスを安全に停止している

個人的に CircleCI Server (Enterprise) の経験がなく,運用関連の話を聞けて良かった.実行中のプロセスに影響なくスケールインするためにはドレイニング機能が必須で,Nomad の API を使って実現しているのは CircleCI に限らず参考になる.

(資料公開待ち)

まとめ

  • プライベートイベント「CircleCI Japan User Community Kickoff」に招待して頂いた
  • 圧倒的に活用している人たちが集まっていたので,どの発表も素晴らしかった
    • たまに「CircleCI Workflows ビューティフル選手権」に参加しているのかな?という気持ちになった(笑)
  • 今後 CircleCI Japan User Community を盛り上げていくとのことで,応援!僕もできる限り参加したいと思う

ポッドキャスト

CircleCI のアーキテクチャ / 開発プロセスの話が聞けるポッドキャストもある!オススメ!

fukabori.fm

CircleCI Orbs ミニハッカソン

12/15 に Orbs リリースを記念したイベントが開催される.まだ参加できるので Orbs に興味がある人は参加すると良いのでは!

circleci.connpass.com

関連資料

builderscon 2018 の資料を見ると CircleCI / Nomad の詳細を知ることができる.合わせて読むと良さそう!

HTML の Lint ツール「htmllint」を CircleCI で実行する

HTML を実装しながら Lint を実行するため「htmllint」を使うことにした.類似ライブラリに「HTMLHint」もある.

github.com

htmllint と htmllint-cli

「htmllint」を CLI で実行する場合は「htmllint-cli」を使う.

github.com

以下のように npm で htmllint-cli をインストールして,プロジェクトのルートディレクトリで htmllint init を実行すると,設定ファイルの .htmllintrc がデフォルトルールで自動生成される.Lint ルールをカスタマイズする場合は .htmllintrc を変更する.

$ npm install -g htmllint-cli

$ htmllint --version
0.0.7

$ htmllint init

$ htmllint sample.html

検証

検証用にサンプル HTML を実装しながら,適宜 htmllint を実行したところ,以下を確認できた.

  • the tag must contain a title
    • head タグに title タグを下記忘れていると検出される
    • カスタマイズする場合は .htmllintrc で head-req-title の設定を変更する
  • indenting spaces must be used in groups of 4
    • 4 スペース以外のインデントがあると検出される
    • カスタマイズする場合は .htmllintrc で indent-width の設定を変更する
  • id value must match the format: underscore
    • id 名にハイフンがあると検出される
    • カスタマイズする場合は .htmllintrc で id-class-style の設定を変更する
  • class value must match the format: underscore
    • class 名にハイフンがあると検出される
    • カスタマイズする場合は .htmllintrc で id-class-style の設定を変更する
  • the id attribute is not double quoted
    • id 名にクォートを忘れていると検出される
    • カスタマイズする場合は .htmllintrc で attr-quote-style の設定を変更する
  • the class attribute is not double quoted
    • class 名にクォートを忘れていると検出される
    • カスタマイズする場合は .htmllintrc で attr-quote-style の設定を変更する
  • the id "wrapper" is already in use
    • id 名が重複していると検出される
    • カスタマイズする場合は .htmllintrc で id-no-dup の設定を変更する

Lint として基本的なルールは揃っている.デフォルト OFF になっているルールも多く,全ルールを確認するには公式 Wiki を見る.

github.com

Dockerized

次に HTML を GitHub に push したら自動的に CI で htmllint を実行するため,事前準備として htmllint を Dockerized した.Docker Hub から kakakakakku/htmllint-cli イメージを落とせば使える.

$ docker pull kakakakakku/htmllint-cli
$ docker run kakakakakku/htmllint-cli --version
$ docker run -v ${PWD}:/assets kakakakakku/htmllint-cli --cwd /assets

CircleCI で htmllint を実行する

次は CircleCI で .circleci/config.yml を以下のように書く.

version: 2

jobs:
  htmllint:
    docker:
      - image: kakakakakku/htmllint-cli
    steps:
      - checkout
      - run: htmllint --cwd .

workflows:
  version: 2
  ci:
    jobs:
      - htmllint

試しにサンプル HTML を push すると,期待通りにエラーになった.

f:id:kakku22:20181130104707p:plain

まとめ

  • 「htmllint」を使うと HTML に Lint を実行できる
    • CLI で実行する場合は「htmllint-cli」を使う
  • CircleCI で htmllint を実行するために Dockerized した
  • HTML も CI しよう!

CSV に SELECT / UPDATE クエリを実行できる VS Code の拡張機能「Rainbow CSV」

定期的に CSV からデータを抽出する機会があり,抽出条件によって,今までは以下のような方法を使っていた.

  • CSV を Excel で開いてフィルターを使う方法
  • CSV を grep / egrep などの Linux コマンドで絞り込む方法
  • CSV をAmazon S3 にアップロードして Amazon S3 Select でクエリを実行する方法

Rainbow CSV

新しい方法として VS Code の拡張機能「Rainbow CSV」を試すことにした.Rainbow CSV には多くの機能があり,例えば「ハイライト」や「CSVLint」や「RBQL (RainBow Query Language)」がある.データを抽出する用途だけでなく,CSV を確認するときにも便利で,普段から使える最高の拡張機能だった.以下からインストールできる.

marketplace.visualstudio.com

実装は GitHub に公開されていた.

github.com

サンプルデータ

今回はサンプルデータとして,よく使われる郵便番号データ KEN_ALL.CSV を使う.事前にエンコードを Shift JIS から UTF-8 に変換しておく必要がある.

$ nkf -w --overwrite KEN_ALL.CSV

KEN_ALL.CSV は日本郵便のサイトからダウンロードできる.

www.post.japanpost.jp

ハイライト機能

Rainbow CSV には「ハイライト機能」があり,CSV を VS Code で開くと,自動的にカラムごとに色分けされる.さらに各データにマウスを合わせるとカラム名を確認できるので,もしヘッダー行が存在する CSV の場合は便利.

f:id:kakku22:20181129104930p:plain

CSVLint 機能

Rainbow CSV には「CSVLint 機能」もあり,例えば,カラム数が異なるレコードがあるとエラーになる.大量のデータの中からフォーマットエラーを探すときに使える.

f:id:kakku22:20181129105029p:plain

RBQL (RainBow Query Language) 機能

なんと言っても Rainbow CSV で1番便利な機能は「RBQL (RainBow Query Language) 機能」で,RBQL という SQL-like なクエリ言語でデータを抽出することができる.RBQL の仕様は以下のドキュメントにまとまっている.SELECT だけだと思ったら UPDATE もサポートされていた!CSV を UPDATE で更新できるのはスゴイ!

  • SELECT [ TOP N ] [ DISTINCT [ COUNT ] ]
  • UPDATE [ SET ]
  • WHERE
  • ORDER BY ... [ DESC | ASC ]
  • [ [ STRICT ] LEFT | INNER ] JOIN
  • GROUP BY
  • LIMIT N

github.com

SELECT を試す

実際に以下のクエリを実行した.単純な SELECT だけじゃなく WHERE と GROUP BY も使えた.

SELECT * LIMIT 5
SELECT * WHERE a1 == '01101' LIMIT 20
SELECT a7, COUNT(*) GROUP BY a7

f:id:kakku22:20181129105108p:plain

(RBQL 実行画面)

UPDATE を試す

1行 UPDATE も複数行 UPDATE も実行できた.なお SELECT も UPDATE も「別ファイルとして」結果が出るため,直接ベースファイルを書き換えることはなく,誤った RBQL を実行しても影響なしという安心感も良かった.

UPDATE SET a4 = 'aaaaa' WHERE a3 == '0600000'
UPDATE SET a4 = 'aaaaa' WHERE a1 == '01101'

RBQL backend language を試す

RBQL backend language を使うと RBQL を拡張できる.現状だと JavaScript と Python がサポートされている.

  • JavaScript – RBQL backend language
  • Python – RBQL backend language

今回は JavaScript を使って RBQL を拡張してみた.

-- 郵便番号が "15060" で始まるデータを抽出する
SELECT * WHERE a3.indexOf("15060") == 0
-- データとは関係なく乱数を10件出力する
SELECT Math.random() * 100 LIMIT 10
-- データとは関係なく文字列を結合して出力する
SELECT 'ka'.repeat(3) + 'kakku' LIMIT 5

クエリを実行したら「恵比寿ガーデンプレイスって階ごとに郵便番号が違うんだー」ということを発見した.今まで知らなかった!

f:id:kakku22:20181129105130p:plain

Rainbow CSV : Vim Plugin

github.com

Rainbow CSV は Vim Plugin もあり,以下のように ~/.vimrc を設定するとインストールできた.VS Code と同じく「ハイライト機能」があり,さらに F5 を押して Vim から RBQL を実行することもできた.インストールしておくべき Vim Plugin だと思う.

NeoBundle 'mechatroner/rainbow_csv'

f:id:kakku22:20181129105217p:plain

まとめ

  • VS Code の拡張機能「Rainbow CSV」は便利!
    • ハイライト機能
    • CSVLint 機能
    • RBQL (RainBow Query Language) 機能
  • Rainbow CSV には Vim Plugin もある