EmotionからCSS Modulesへの移行!React Server ComponentsのCSS対応

こんにちは。エンジニアの佐藤(@t0m0h1r0x)です。

今回は、弊社で現在進めているEmotionからCSS Modulesへの移行について紹介します。
移行の背景、検討した代替ライブラリ、そして最終的な決定について話していきます。

移行の検討理由

弊社では現在、CSS-in-JSライブラリとしてEmotionを使用しています。ピュアなCSS記法を好むメンバーが多いので、EmotionのTagged Template Literal記法がチーム文化との相性も良く、これまで活用してきました。
一方で、フロントエンド開発フレームワークにNext.jsを採用しており、そちらではApp Routerへの移行を進めています。
App RouterのメリットはやはりReact Server Components(RSC)の活用だと思います。RSCはユーザー体験と開発者体験の向上につながる重要な機能ですが、2024年9月現在、その仕様上EmotionでRSCをスタイリングできません。

このような背景から、RSCに対応できる新たなCSSライブラリの検討を始めました。

代替ライブラリの検討

代替ライブラリの選定にあたっては、パフォーマンスやAPIの使い勝手といった要素も大切ですが、チームとの相性も重要な要件としました。特に、Tagged Template Literalをサポートしていて、Emotionとの書き心地に互換性があることをポイントとしました。

Panda CSS

Panda CSSChakra UIのチームが開発しています。CSSの記法としてObject LiteralかTagged Template Literalを選択できますが、後者には機能制限があるようです。 詳細については 公式ドキュメントを参照してください。

Pigment CSS

Pigment CSSMaterial UIのチームが開発しています。 こちらも要件と合致しそうなのですが、開発初期段階のためプロダクション利用には検討が必要です。 ちなみにPigment CSSは、最近リリースされたMaterial UI v6に、experimentalなopt-inとして組み込まれました。さらなる開発が期待できそうです。

CSS Modulesへの移行

上記の検討を踏まえ、弊社では一時的に信頼と実績があるCSS Modulesへの移行を決定しました。その理由は次の通りです。

  • プロダクトとチームの要件に合致
  • 他ライブラリへの将来的な移行が比較的容易

一方でCSS Modulesの採用にあたっては、特に次の点に留意しています。

  • TypeScriptによる型定義
  • 動的スタイリングの実装
  • 仕様がメンテナンスモード

型定義にはHappy CSS Modulesを使用して、自動生成することで対応しています。

動的スタイリングについては、コード中にpropsベースのスタイリング実装が多くなかったことや、コンポーネントのルールを整備していたことで不要なcomponent targetingを予め減らせていたため、現時点では大きな支障は出ていません。

仕様についてはメンテナンスモードであるものの、長らくこの状態が続いていながら今の所大きな問題は起きていないため安定しているのではないかと思っています。
参考:

今後の展望

CSSを取り巻く環境は日々進化しています。例えば、React v19からは<style>のホイスティングがサポートされる予定であり、それを活かしたRESTYLEというライブラリも登場しています。 このような状況を踏まえ、当面はCSS Modulesへの移行を進めつつ、新たなライブラリの登場にも注目していきたいと思います。

まとめ

EmotionからCSS Modulesへの移行は、弊社のフロントエンド開発環境を大きく変える重要な取り組みでした。 RSCとの互換性という課題はありましたが、暫定的な解決策を見つけつつ、より良い選択肢を模索し続けていきたいと思います。

弊社では一緒に働いてくれるメンバーを募集中です。興味を持っていただいた方は是非こちらのページからご応募お願いします。

herp.careers

Cloud DLPを使ってBigQuery上の個人情報をマスキング

はじめに

Findyでデータエンジニアとして働いている開(hiracky16)です。 この記事ではGoogle Cloudの製品であるCloud DLPを中心に弊社で取り組んでいるデータマスキングについて紹介します。

弊社はFindyやFindy Freelanceなど人材に関する事業を取り扱っているため個人データがより集まりやすい環境にあります。 ファインディの組織が日々拡大しサービス拡張していく中で、利用者の安全性を担保し、データにおけるリスクを低くするためのデータ基盤づくりが求められてきました。 データ基盤には事業部のデータを集約しているため、利用者にすべてを公開してしまうと運用を誤り、思わぬ事故につながる可能性が上がります。 ただ、閲覧できないと困る業務もあり、データの閲覧権限を絞りすぎてもリスクがあります。

今回は、個人データなどのセンシティブなデータを自動で検出・マスキングを行い、業務に必要な場合にのみ閲覧できる状態にする取り組みについてご紹介します。

権限周りの基本設計

マスキングの前に権限周りの基本設計を説明します。 データセットにはレイヤーを設けており、それぞれ次のようになっています。

  • source ... ローデータが入っているテーブル
  • staging ... ローデータをBigQuery用に加工したテーブル
  • intermediate ... CTEなどのテーブル
  • mart ... 利用用途ごとに用意したテーブル

まずはデータ基盤を利用するにあたり用途ごとにロールを定義しようと考えました。 用途以外のことができてしまうと誤操作によってデータを書き換えたり、消してしまったりするおそれがあるためです。 データの用途は大きく3つに分けることができ、特定のデータを定期的に見ることやBigQueryコンソールやDataformで自分のほしいデータを作ること、外部ツールにデータを連携することになります。

これらの利用用途ごとに権限を付与するためのロールを作りました。 また1ユーザーごとにロールを付与するのは大変なので、Googleグループを用意しあらかじめ付与しています。 こうすることでグループへの追加・削除によりロールの管理が比較的簡単な操作で可能になります。 更にデータマートに相当するデータセットは用途ごとに作りGoogleグループのメールアドレスをデータセットのIAMメンバーとして追加しておきます。

ロール できること Google Cloudプロジェクト上のIAMロール 対応するGoogleグループ
管理者 全てのデータセットに対して編集 プロジェクトレベルのオーナー -
編集者 source以外のデータセットへの編集、またDataformなどの周辺サービスの利用 プロジェクトレベルの「BigQueryユーザー」と「BigQueryデータ編集者」 editor
(各データセットの)閲覧者 特定のmart_で始まるデータセットの閲覧 プロジェクトレベルの「BigQueryユーザー」とデータセットレベルの「BigQueryデータ閲覧者」 mart_sales, mart_external_system

上記のようにデータセットごとにIAMロールを付与するためのTerraform Moduleを公開しているのでよかったらお使いください。 registry.terraform.io

ポリシータグによる動的マスキング

基本的に個人データはsourceからstagingへの伝搬時にセンシティブなデータを省いています。 また上記の通り権限が絞れているので一見問題なさそうに見えますが、martデータセットの中には業務システムに使うものもあり個人データが含まれます。 そういったデータをグループに属する全員が閲覧できる状態というのは望ましくありません。

このような場合には、カラムレベルでポリシータグを付与し、許可されたユーザーには通常のデータを、許可されていないユーザーにはマスキングされたデータを表示させています。

タグの付与はDataformのconfigで行っています。 次のように書くとテーブルが作られる際にタグを付与してくれます。

config {
    type: "table",
    "schema": "stg_hoge",
    "description": "ユーザーテーブル",
    "columns": {
        "id": "ユーザーのID",
        "email": {
            description: "メールアドレス",
            bigqueryPolicyTags: ["projects/project-hoge/locations/asia-northeast1/taxonomies/fuga/policyTags/piyo"]
        },
        "tel": {
            description: "電話番号",
            bigqueryPolicyTags: ["projects/project-hoge/locations/asia-northeast1/taxonomies/fuga/policyTags/piyo"]
        }
    },
}
...

マスキングのルールもいろいろなものがあります。 なお今回は試していませんが、BigQuery UDFをルールに追加できます。

cloud.google.com

動的マスキングの方法はわかりました。 ただ、個人データに対して曖昧な理解のまま運用してしまうと付与忘れや、付与しすぎて情報量が落ちてしまうおそれがあります。 そこで役立つのがCloud DLPです。

Cloud DLPによる個人データ検出

Cloud DLP(Data Loss Prevention)は、機密性の高いデータを検出、分類、保護するために設計されたGoogle Cloudのサービスです。

Cloud DLPにはBigQueryのデータをスキャンして個人データに該当するテーブル、カラムを検出してくれる機能が備わっています。

この検出を定期的に実行することによりポリシータグを付与する候補となるカラムを特定できます。 テーブルはサンプルですが、検査するとデータリスクが中程度〜高のカラムに個人データが含まれていそうなことが一目でわかるようになります。

以下は公式ドキュメントに載っていたイメージになります。

cloud.google.com

DLP APIを用いてテキスト内の情報をマスキング

ポリシータグを使ったマスキングは値全体をマスクしてしまいますが、ロングテキストの場合一部だけマスクしたいといったニーズが存在します。 例えば、商品レビューのテキストデータをポジネガ判定したい場合、テキスト全てをマスクしてしまうとポジネガ判定に使う情報が落ちてしまいます。

DLP APIを使うとテキスト中の個人情報をマスクできます。 DLP APIによるマスクの手順は「個人データの検出」と「データの匿名化」の2ステップがあります。

「個人データの検出」では事前に用意された検出器(INFO TYPE)を使い検出できます。 INFO TYPEは特定したい情報、例えば名前や電話番号、住所など情報の種類ごとに違います。 INFO TYPEはGCSに置いた辞書から自作でき、固有名詞にも対応できます。 下記が事前に用意されたINFO TYPEのリファレンスです。

cloud.google.com

「データの匿名化」は検出したINFO TYPEごとにどのように情報をマスクするかを定義します。

DLP APIにはPython ClientがあるのでこれをCloud RunにデプロイしてBigQueryからリモート関数で呼び出せるようにしています。

declare text string;
set text = """
私は山田太郎です。
本日はよろしくお願いします。
山田
090-0000-0000
tensyoku.taro@gmail.com
""";

select text, `function_dataset.dlp_api`(text) as masked_text;

まとめ

Cloud DLPの機能を使うことでマスキングする術をまとめてみました。 データ利活用が増えることは喜ばしいことですが、常にデータの扱いを気にしながらデータ抽出や分析するのにも限界があります。 これからもデータエンジニアとして安全に意思決定をサポートするデータ基盤を作っていきたいと思っています。

弊社ではデータ基盤を共に育てていくメンバーを募集しています。少しでも興味が湧いた方はカジュアル面談お待ちしております🙏

herp.careers

herp.careers

コントリビューション・オブ・ザ・イヤー あの名物企画の仕組みと裏側を大公開!

Findyでエンジニアをしている栁沢(@nipe0324)です。

今回は、Findyの名物企画である「コントリビューション・オブ・ザ・イヤー2024中間発表」の裏側を公開します。裏側を知り、キャンペーンをより楽しんでもらえたら嬉しいです。

キャンペーン期間中にXでシェア後にフォームから応募することで「Anker充電器(Findyオリジナルデザイン入り)」が抽選で当たるかも!?

ぜひお申し込みください。

👇👇👇

コントリビューション・オブ・ザ・イヤー2024中間発表を試してみる

続きを読む

フルリモート第1号の自分が、働く上で大切にしている5つのこと

こんにちは。

Findy で Tech Lead をやらせてもらってる戸田です。

弊社では遠隔地フルリモートで働いているメンバーが多数おり、北は北海道から南は福岡まで、全国各地に点在しています。

本社は東京にあって関東在住のエンジニアも多数おり、遠隔地フルリモートの人数の比率で言うと半々くらいでしょうか。

実を言うと、弊社のフルタイム勤務でのエンジニアの遠隔地フルリモート勤務の第一号は私なのです。

2020年7月にJOINしてから4年以上、ずっと福岡から遠隔地フルリモートで働いていますが、第一号の私が結果を出すことで「出社・フルリモート関係なく成果が出るよね」と思ってもらうために、当初は本当に頑張りましたw

結果として弊社では、「ハイスキルなエンジニアであればフルリモートでも問題ない」という認識になり、遠隔地フルリモートで働くエンジニアが増えていきました。

そこで今回は、私がフルリモート勤務をする上で心がけていることを公開しようと思います。

それでは見ていきましょう!

心がけてることリスト

とりあえず自分のtimesになんか書く

弊社ではエンジニアを中心にSlackで自分自身のtimesチャンネルを持つようにしています。

timesチャンネルは一般的に使われている運用方法ですが、「開始します」「終了します」だけの書き込みになってしまっている人はいませんか?

このtimesチャンネルの使い方というのが重要で、とりあえず自分のtimesになんか書く ということを心がけています。

つぶやく内容は何でもいいです。無言よりは数万倍マシです。

フルリモート勤務だと出社メンバーの顔も、他のフルリモートメンバー同士の顔も見えないので、お互いに存在感を出すことが重要です。

そのため、自分自身に割り当てられたtimesチャンネルで好きなようにつぶやくことが、フルリモート勤務でのコミュニケーションの1つの形だと思っています。

作業ログ的に自分の作業をtimesに記録することもオススメです。作業途中に詰まった時などに、timesを見てくれた他のメンバーが助け舟を出してくれることがあります。

timesが無言なのはダメゼッタイ。

わからないこと。上手くいったことは全力でアピールする

自分が何に困ってるのか、何に苦しんでいるのかは、自分から発信します。

先ほど紹介した自分のtimesチャンネルに書いてもいいですし、そこから直接メンションして誰かに助けを求めるのもいいでしょう。

作業に詰まって1人でずっと悩んで結果的に1日潰しました。はオフィス出社でもそうですが、フルリモート勤務においては特に信頼を大きく失ってしまいます。

わからないことだけじゃなくて、解決したこと、上手くいったことは特に全力でアピールします。

嬉しいことは形に残ったほうがいいので、timesにガンガン書き込みます。

周りのみんなも全力で祝福しましょう。

わからないこと、上手くいったことといったような作業の進捗に関わる発信は都度行うようにしています。

メンションには最優先で反応する

何かしらの作業をしていても、自分へのメンションを優先してチェックします。

今の作業に集中したいなら、「あとで確認する」旨を相手に伝えたり、リアクションアイコンを付けます。

「メンション送ったのに反応が何もない」ということは、相手からしたら「無視されてる」のか「忙しくて見れてない」のかが分かりません。

まずは「あなたのメンションを見てますよ」ということを伝えます。

テキストと通話の使い分け

テキスト、通話でのコミュニケーションを適切に使い分けることを心がけています。

テキストでのコミュニケーションだけではどこかしらで必ず限界がきますが、テキストにも形に残る、非同期でコミュニケーションできるといったメリットもあります。

これは誰が相手でも、自分がどれほどテキストコミュニケーションが上手いと思ってても、必ず限界があります。

あ、これ伝わってないなと察したり、認識が一致していないと感じたらハドルやZoomで繋いで通話をします。

その際、議事録的なものを書いて対面で話した内容のサマリを議事録として形に残します。その議事録を後で相手に送り、認識が合ってるかどうかを確認します。

議事録は必要があれば他メンバーが見える場所にも共有します。そうすることで何の話をしていたのか、何で困っていたのかを他のメンバーが把握できるようになります。

また、テキストは後々まで形に残るので、相手への感謝や称賛はテキスト、リアクションで送ります。

逆に文脈を口頭で伝えたほうがよい話、ネガティブな話は対面で、ハドルやZoomを使います。自分が言及されているのを他の人に見られたり、後々まで形に残るのは良い気分ではないです。

あと自分の場合は、不定期に自分のtimesチャンネルのハドルを開いて雑談をする「お茶会」を開いています。

なんか話したい、雑談したい、相談したいことがあるなど、動機は何でもOKです。エンジニア以外の職種の子が参加してくれることもあります。

とはいえ出社も大事だよね?

ここまでフルリモート勤務での話を書いていましたが、やはり出社しての対面コミュニケーションに勝るものはありません。

遠隔地フルリモートで勤務していたとしても、1年に数回は出社して対面コミュニケーションを取るようにしています。

自分の場合は4ヶ月に1回程度、費用は会社持ちで1週間程度出社しています。

その期間は自分の作業よりも出社メンバーとの対面コミュニケーションを重視しています。

この期間での対面コミュニケーションにより、帰宅後のお互いのコミュニケーションのハードルが下がり、結果的に意思疎通がスムーズになります。

まとめ

いかがでしたでしょうか?

今回の記事が、フルリモート勤務での悩み事に少しでも役に立てれば幸いです。

現在、ファインディでは一緒に働くメンバーを募集中です。

興味がある方はこちらから ↓ herp.careers

【2024年上半期】Findy Tech Blogの人気記事まとめ

こんにちは。

Findy で Tech Lead をやらせてもらってる戸田です。

2024年の2月末に弊社テックブログを開設してから半年が過ぎようとしています。

今年は上半期だけで31個の記事を投稿しており、テックブログを開設してから6月いっぱいまでで週に1~2記事のペースで投稿できています。

また総PV数は10万PV、はてブ数は1200を超え、多くの方に読んでいただいているようです。いつもありがとうございます!

イベントでお会いした方や、弊社に応募していただき面接でお会いした方からも「テックブログ読んでます!」と言っていただけることが増えてきており、改めて技術広報の重要性を感じています。

そこで今回は、2024年上半期の弊社テックブログの振り返りと称しまして、2024年上半期の人気記事達を紹介します。

それでは見ていきましょう!

2024年上半期の人気記事

【エンジニアの日常】エンジニア達の自慢の作業環境を大公開シリーズ

tech.findy.co.jp

弊社テックブログの最初のターニングポイントとなった記事です。おそらくこのシリーズが出ていなかったら、総PV数が10万を超えることはなかったでしょう。

2月末にテックブログを開設してから1ヶ月程度が経った頃にPart1が公開され、想定以上の反響があったため、Part2、Part3と続けてシリーズ化された人気シリーズの1つです。

もともとテックブログを開設した理由の1つに、エンジニア採用を強化したいという狙いがありました。

採用を強化する上で技術的な発信は重要ですが、それと同じくらい文化の発信も重要だと考えており、まずはどんなエンジニア達が働いているのかを知ってもらいたいという思いからこのシリーズを企画しました。

おかげさまで多くの方に読んでいただき、上半期のPV数の3割はこのシリーズが占めています。

内容としましては、弊社エンジニアたちの自宅での作業環境を写真付きで紹介しており、ガジェットやキーボード、デスク周りのアイテムなどが紹介されています。

ちなみに記事のタイトルですが、タイトルを考えるのに行き詰まった私がChatGPTにタイトル案をいくつか生成してもらい、その中から選んだものですw いや〜生成AIって便利ですね!

開発生産性指標を向上させるためにやってはいけないアンチパターン

tech.findy.co.jp

記事単体のPV数としては上半期1位の記事です。

開発生産性を向上するためにやったほうがいいことは多くの記事が発信していますが、こちらはその逆でアンチパターンを紹介しています。

一見、「そんなの当たり前やろ」と思うかもしれませんが、その当たり前をきちんと明記したことに価値があると思います。

やってはいけないことを理由付きできちんと説明できるからこそ、正しい方法を理解、実行できるのです。

開発生産性に興味関心がある方には是非一読していただきたい記事となっています。

開発生産性を上げるために開発をする前に考えていること

tech.findy.co.jp

記事単体のはてブ数としては上半期1位の記事です。

こちらも開発生産性に関する記事で、実際にコードを書く前にやるべきこと、準備すること、考えることを紹介しています。

いかに速く、シンプルに、効率よくリリースしてユーザーに価値提供をするか、という視点で書かれており、開発において重要なポイントがまとめられています。

Findyの爆速開発を支えるテクニック

tech.findy.co.jp

弊社は開発生産性、とりわけ開発スピードには非常に拘っています。

この開発スピードを継続し、更に速くするために弊社で実践しているテクニックをいくつか紹介しているのがこの記事です。

タスクの分解の仕方やPull requestの粒度、テストコードの考え方などをシンプルにまとめている記事となっています。

開発生産性の向上に着手したいけど何から着手したらいいのかわからない。という方には是非読んでいただきたい記事です。

Findyの爆速開発を支える「システムを守るテストコード」の実例3選

tech.findy.co.jp

先ほど紹介した「Findyの爆速開発を支えるテクニック」の記事で紹介したテストコードに関する内容を更に掘り下げた記事となっています。

実際のテストコードを交えて、具体的にどのようなテストコードでシステムを守るのかを説明しています。

実際に読んでみると、抜け落ちていた視点などもあるかと思いますので、ジュニアエンジニアの方にもシニアエンジニアの方にも是非1度読んでいただきたい記事です。

Wallaby.jsを使ってフロントエンド開発のテストを効率化しよう

tech.findy.co.jp

Wallaby.jsはフロントエンド開発において非常に便利なツールです。

多数のIDEに対応しており、ほぼリアルタイムに修正内容を反映しつつテストコードの実行結果を表示してくます。

この記事では、Wallaby.jsの使い方や設定方法、実際にどのように活用しているかを紹介しています。

フロントエンドのテストコードを書くのが苦手だったり、テストコードをもっと効率的に書きたい!と思ってる方にオススメの記事です。

ファインディにエンジニアとして入社していいなと思ったこと3選

tech.findy.co.jp

実際に弊社にJOINしてくれたエンジニアが、入社して1ヶ月程度経ってから感じたことをまとめた記事です。

JOIN直後のエンジニアが弊社の開発環境をどのように感じているのか、どのような点が良かったのかなど、長年弊社に在籍している自分からは気づかない視点もありました。

弊社に興味を持ってくれている方には是非読んでいただきたい記事となってます。

まとめ

いかがでしたでしょうか?

ここでは紹介しきれなかった記事も多数ありますので、それらも是非読んでみてください。

全体的に見て、開発生産性やフロントエンド関連の記事に対しての反響が大きかったように感じます。

下半期も引き続き、これらのトレンドを追いつつも技術的な挑戦を続け、社内の文化、雰囲気なども含めてテックブログを通じて発信できればと思います。

今後とも弊社テックブログをよろしくお願いします。

現在、ファインディでは一緒に働くメンバーを募集中です。

興味がある方はこちらから ↓ herp.careers

ファインディの爆速開発を支えるモノレポ管理ツール「Nx」について

ファインディ株式会社でフロントエンドのリードをしております 新福(@puku0x)です。

この記事では、ファインディで導入しているモノレポ管理ツール「 Nx 」について紹介します。

モノレポとは

モノレポは全てのコードベースを単一のリポジトリで管理する手法です。

monorepo.tools

コードの共通化や可視化、ツール・ライブラリの標準化、一貫性のあるCI/CDパイプラインを構築できるといったメリットがあります。また、マイクロサービスと相性が良いとも言われています。

circleci.com

ファインディでは主にフロントエンド系のリポジトリをモノレポとして運用しています。

アプリケーションとそれに関連するフィーチャー、UIライブラリがひとつにまとまっているため、複数のリポジトリを移動することなくコードを参照できます。

Nxとは

Nxはモノレポ管理やアプリケーションのビルド、テストの実行、コード生成などの機能を備えた統合的なツールです。

nx.dev

モノレポ管理ツールは他にもLernaTurborepoなどがあります。アプリケーション開発において有用な機能が多くあることや、コミュニティが活発で継続的なメンテナンスが見込めること、前職で導入実績があったことなどがNxを選んだ理由です。

後述する「変更検知」や「キャッシュ機構」といった機能は、Pull Requestの粒度を細かくするファインディの開発スタイルと高い親和性があり、導入当初から私達の開発を支える頼もしいツールとなっています。

大手企業でも採用事例が増えており、Nxはモノレポ管理ツールとして有力な選択肢といえるでしょう。

https://npmtrends.com/lerna-vs-nx-vs-turbo

(個人的に推していたOSSがここまで有名になったことには感慨深いものがありますね!)

Nxワークスペースの作成

create-nx-workspace を実行するとワークスペースを作成できます。

Reactをはじめ、メジャーなフレームワーク用のプリセットもあるためすぐに開発を始められます。

npx create-nx-workspace@latest <ワークスペース名> --preset=react-monorepo --appName=<アプリケーション名> --bundler=webpack --e2eTestRunner=playwright --style=scss --nxCloud=skip

詳細は公式のチュートリアルをぜひご覧ください。

nx.dev

Nxの機能

コード生成

nx generate コマンドでプロジェクト(アプリケーションやライブラリ)を作成できます。

npx nx generate @nx/react:application --name=<アプリケーション名> --directory=<ディレクトリ> --routing=false --e2eTestRunner=playwright --projectNameAndRootFormat=as-provided
npx nx generate @nx/react:library --name=<ライブラリ名> --directory=<ディレクトリ> --bundler=rollup --unitTestRunner=jest --projectNameAndRootFormat=as-provided

nx generate で実行できるGeneratorは自分で作ることもできます。

nx.dev

ファインディではフィーチャー用のファイル一式を生成するGeneratorを作って開発を効率化しているチームもあります。また別の機会に紹介できればと思います。

変更検知

Nxはプロジェクト間の依存関係を自動的に算出する機能を備えています。

npx nx affected --graph を実行すると次のように依存関係を可視化できます。

npx nx affected --target=build のように指定すると、変更のあったプロジェクトとそれに依存する他のプロジェクトを全てビルドしてくれます。

nx affected は変更されたコードに関するプロジェクトのみ実行する

個人的なおすすめは、npm-scriptsやCI上で実行するコマンドを nx affected ベースにすることです。

"scripts": {
  "build": "nx affected --target=build",
  "test": "nx affected --target=test",
  "lint": "nx affected --target=lint",
  ...
},

必要なタスクのみ実行されるためスピーディーに開発できます。

依存関係の管理

Nxが持つプロジェクト間の依存関係はLintルールにも応用されます。

ファインディでは、@nx/enforce-module-boundaries ルールを適用し、意図しない依存関係の逆転が起こらないように制御しています。

nx.dev

具体的には、各プロジェクトに次のようなタグを設定し、

{
  "name": "utils",
  "sourceRoot": "libs/utils/src",
  "projectType": "library",
  "tags": ["scope:shared", "type:util"],
  ...
}
- apps/
  - app1                (scope:app1)
  - app2                (scope:app2)
- libs/
  - app1/
    - feature-dashboard (scope:app1, type:feature)
    - ui                (scope:app1, type:ui)
  - app2/
    - feature-user      (scope:app2, type:feature)
    - ui                (scope:app2, type:ui)
  - utils               (scope:shared, type:util)

.eslintrc.json に対応するルールを設定しています。

"@nx/enforce-module-boundaries": [
  "error",
  {
    "allow": [],
    "depConstraints": [
      {
        "sourceTag": "scope:shared",
        "onlyDependOnLibsWithTags": ["scope:shared"]
      },
      {
        "sourceTag": "scope:app1",
        "onlyDependOnLibsWithTags": ["scope:shared", "scope:app1"]
      },
      {
        "sourceTag": "scope:app2",
        "onlyDependOnLibsWithTags": ["scope:shared", "scope:app2"]
      },
      {
        "sourceTag": "type:feature",
        "onlyDependOnLibsWithTags": ["type:ui", "type:util"]
      },
      {
        "sourceTag": "type:ui",
        "onlyDependOnLibsWithTags": ["type:ui", "type:util"]
      },
      {
        "sourceTag": "type:util",
        "onlyDependOnLibsWithTags": ["type:util"]
      }
    ]
  }
]

設定したルールを図にするとこのようになります。scope がプロジェクト間の依存関係、type が内部のレイヤーの依存関係を表します。

@nx/enforce-module-boundaries ルールが設定されたプロジェクトでは依存してはいけないモジュールに対してエラーが表示されます。

大規模なコードベースの管理においては、モジュール同士の依存関係の制御が非常に重要であり、こういった「かゆいところに手が届く」機能を持っていることがNxの魅力でもあります。

キャッシュ機構

Nxは一度実行されたコマンドのキャッシュを保持しており、同じコマンドが実行された場合にキャッシュから結果を再現する機能を持っています。

nx.dev

また、関連サービスである「 Nx Cloud」のリモートキャッシュ機能を有効にすると大幅なCI高速化が可能です。

実際にファインディでは、キャッシュの活用で毎月1,000時間以上のCI時間を削減できました。

自動マイグレーション

NxにはCodemodAngular CLIng update と似たコマンドが備わっています。

nx.dev

npx nx migrate latest
npx nx migrate --run-migrations

nx migrate を実行すると、Nx本体と各種プラグイン、reacteslinttypescript などの依存ライブラリ・ツールがまとめて更新されます。

バージョンアップに伴うマイグレーションは手動で対応すると大変ですが、Nxでは自動化されています。メンテナンスの手間が省けると同時に属人化も抑えられるため重宝しています。

まとめ

この記事では、Nxの概要と基本的な機能について紹介しました。

Nxは単なるモノレポ管理ツールに留まらず、「開発者体験の改善」や「開発生産性の向上」といったポテンシャルを秘めています。

✨✨✨ Nxはいいぞ! ✨✨✨

Nxはいいぞおじさんから伝えたいことは以上です。

より詳細な活用法やNx Cloudの高度な機能については、今後の記事で取り上げる予定ですのでご期待ください。

ファインディでは一緒に会社を盛り上げてくれるメンバーを募集中です。興味を持っていただいた方はこちらのページからご応募お願いします。

herp.careers

【エンジニアの日常】これが私の推しツール!〜日々の開発を豊かにするおすすめツール〜 Part1

こんにちは。

Findy で Tech Lead をやらせてもらってる戸田です。

突然ですが皆さんは、開発をするうえで欠かせないツールやOSSはありますか?

キーボードやマウス、マイクといった物理的なツールは机を見ればわかりますが、他のエンジニアがどういったツールを使って効率化しているかは、その人の画面を見ないとわかりません。

そのため、他のエンジニアがどういったツールを使って効率化しているのか、実は意外と知らないということが多いのではないでしょうか?

そこで今回は 推しツール紹介 と題して、弊社エンジニア達が日々の開発業務で愛用しているツールやOSSを紹介していきます。

それでは見ていきましょう!

推しツール紹介

戸田

git-cz

まず紹介したいのがgit-czというツールです。

github.com

このツールはnpmのパッケージで、ステップに沿って選択、入力を行うことでコミットメッセージのフォーマットを統一することが可能になります。

パッケージをインストールしてコマンドを実行すると、cliで次のような出力が表示されます。

hoge@fuga Piyo % npx git-cz
cz-cli@4.3.0, @commitlint/cz-commitlint@19.2.0

? Select the type of change that you're committing: (Use arrow keys)
❯ feat:       A new feature 
  fix:        A bug fix 
  docs:       Documentation only changes 
  style:      Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) 
  refactor:   A code change that neither fixes a bug nor adds a feature 
  perf:       A code change that improves performance 
  test:       Adding missing tests or correcting existing tests 

ここでコミットの種類を選択します。

機能追加、バグfix、ドキュメント修正などの選択肢を選び、その後にコミットメッセージを入力すると、自動的にコミットメッセージが作成されます。

選択肢だけではなく、コミットメッセージの内容を入力するステップもあり、全部のステップを通ると自動的にコミットメッセージが作成されコミットを実行します。

hoge@fuga Piyo % npx git-cz
cz-cli@4.3.0, @commitlint/cz-commitlint@19.2.0

? Select the type of change that you're committing: docs
? What is the scope of this change? (See README for more details; e.g. project name): piyo
? Write a short, imperative tense description of the change: (max 188 chars)
 (13) update readme
? Provide a longer description of the change (press enter to skip):
 
? Are there any breaking changes?: No
? Does this change affect any open issues?: No
✔ Preparing lint-staged...
✔ Running tasks for staged files...
✔ Applying modifications from tasks...
✔ Cleaning up temporary files...
[test-git-cz aaaaaaa] docs(piyo): update readme
 1 file changed, 1 insertion(+), 1 deletion(-)

弊社では各リポジトリに導入しており、コミット時に実行することでコミットメッセージのフォーマットの統一を行っています。

フォーマットが統一されているため、リリース時のリリースノートを自動生成したり、リリース内容の分類を自動で行ったりすることが容易になります。

git-cz-for-api-developer

git-czをForkして、API開発者向けにカスタマイズしたものもあります。

github.com

こっちのツールを利用してコミットメッセージを作成することで、SemanticVersionに対応したコミットメッセージを作成できます。

hoge@fuga Piyo % npx git-cz-api
? Select the release type of change that you're committing: patch:      patch update
? Select the type of change that you're committing: ✏️ docs:       Documentation only changes
? Write a short, imperative mood description of the change: 
  [-------------------------------------------------------------] 49 chars left
   patch-docs: update readme
? Provide a longer description of the change:
  fix hoge fuga
? List any breaking changes
  BREAKING CHANGE: 
? Issues this commit closes: 
[git-cz-test aaaaaaaaa] patch-docs: ✏️ update readme
 1 file changed, 1 insertion(+), 1 deletion(-)
hoge@fuga Piyo % git log
commit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (HEAD -> git-cz-test)
Author: test <example@gmail.com>
Date:   Wed Jun 26 17:27:10 2024 +0900

    patch-docs: ✏️ update readme
    
    fix hoge fuga

弊社ではAPIを提供しているリポジトリで導入しています。

コミットメッセージのフォーマットが統一されているため、SemanticVersionに対応したリリースノートを自動で作成し。major updateがある場合に一目でわかるように仕組み化しています。

興味がある方は是非試してみてください。

新福

フロントエンドTech Leadの新福(@puku0x)です。好きなツールを発表します。

Nx

一番は何と言っても「Nx」です。社内のフロントエンド系のリポジトリのほぼ全てに導入しました。Nxのコア機能自体はフレームワーク非依存であるため、バックエンド系のリポジトリに導入される日もそう遠くないでしょう。

github.com

元々は前職でCRAに代わるツールを探していたことがきっかけで触れるようになりました。今ではCI高速化に欠かせない存在となっています。Nxはいいぞ。

余談ですが、Nxで作成したプロジェクトには、VS Code拡張として「vscode-jest-runner」が推奨されています。

github.com

ファイル単位でテストを実行できるので、Wallaby.jsと同じぐらい重宝しています。

Wallaby.jsをどのように活用しているか気になった方はこちらの記事もご覧ください。

tech.findy.co.jp

vscode-spell-checker

VS Code拡張については他にも「vscode-spell-checker」がオススメです。タイポの検出に一役買ってくれます。

github.com

設定を変更すれば、よくある英単語の他にも技術用語や固有名詞などもチェックできます。企業名やサービス名を登録しておけば早い段階でミスに気付けるため便利です。

{
  "version": "0.2",
  "language": "en",
  "ignorePaths": [],
  "dictionaries": [
    "en_US",
    "project-words",
    "softwareTerms",
    "misc",
    "companies",
    "typescript",
    "node",
    "html",
    "css",
    "bash",
    "npm",
    "powershell"
  ],
  "dictionaryDefinitions": [
    {
      "name": "project-words",
      "path": "./.cspell-project-words.txt",
      "description": "Project Words Dictionary",
      "addWords": true
    }
  ]
}

直近のPRでのタイポに心当たりのある方はぜひ導入しましょう。

2024年6月に入社しました森 @jiskanulo です。

できるだけキーボードから手を離さずに作業を続ける、という観点で私が利用しているツールをご紹介します。

Rectangle

Rectangle はウィンドウの移動、リサイズをキーボードショートカットやドラッグ移動で行うことができるMacOS用のアプリケーションです。

操作しているウィンドウをモニター左半分や右半分にリサイズする、最大化最小化をする、複数ディスプレイを接続している場合に別ディスプレイへ送る、ということができます。

私の場合は次のようにショートカットを設定しています。

ショートカット ふるまい
Ctrl + Shift + Alt + h ウィンドウをモニター左半分にリサイズ
Ctrl + Shift + Alt + l ウィンドウをモニター右半分にリサイズ
Ctrl + Shift + Alt + j ウィンドウをモニター中央半分にリサイズ
Ctrl + Shift + Alt + s ウィンドウをモニター中央に配置
Ctrl + Shift + Alt + k ウィンドウを最大化
Ctrl + Shift + Alt + ← ウィンドウをモニター左上にリサイズ
Ctrl + Shift + Alt + → ウィンドウをモニター右下にリサイズ
Ctrl + Shift + Alt + ↓ ウィンドウをモニター左下にリサイズ
Ctrl + Shift + Alt + ↑ ウィンドウをモニター右上にリサイズ
Ctrl + Shift + Alt + n ウィンドウを次のディスプレイに移動する
Ctrl + Shift + Alt + p ウィンドウを前のディスプレイに移動する

Hammerspoon

Hammerspoon はツール操作を自動化するためのMacOS用のアプリケーションです。

キーボードショートカットの組み合わせでアプリケーションを操作、alertの実行などをLuaを記載して定義できます。

主に ターミナル Alacritty とメモツールの Obsidian を起動、最小化、最大化するショートカットを登録しています。

Gitの操作やコマンド実行したいときにAlacrittyを画面最大化しコマンドを実行終えたら最小化、メモを残しておきたいことがあればObsidianを起動してメモを記述し元の作業に戻る、というように使っています。

ショートカット ふるまい
Ctrl + Command + 6 Alacrittyを全画面に表示、もう一度押すことで最小化
Ctrl + Command + 7 Obsidianを全画面に表示、もう一度押すことで最小化

Vimium

最後に Vimium です。これは名前の通りにViのキーバインドのようにキーボードだけでブラウザを操作するGoogle Chrome拡張機能です。

ページ上のリンク要素を表示してキー入力で開く、ブラウザ履歴の戻る進む、前後のタブに表示を切り替える、ブックマークを検索してタブを開くなどの操作が行えます。 ブラウザ履歴の操作は標準のショートカットでも可能なのですが、Vimiumの設定で右手だけで無理なく操作が行えるようにしているのでインターネット閲覧が快適になります。 とくにリンク要素の表示機能はマウスカーソルを細かく操作せずにリンク要素を開くことができるので重宝しています。

ショートカット ふるまい
f リンク要素の一覧を表示、さらに表示されたキーを押してリンク先に遷移
Shift + f リンク要素の一覧を表示、さらに表示されたキーを押してリンク先を別タブで開く
Shift + h ブラウザ履歴を戻る
Shift + l 前のタブを表示する
Shift + j 次のタブを表示する
Shift + k ブラウザ履歴を進む

まとめ

いかがでしたでしょうか?

現在、ファインディでは一緒に働くメンバーを募集中です。

興味がある方はこちらから ↓ herp.careers