CastingONE Tech Blogのフィード
https://zenn.dev/p/castingone_dev
CastingONE Tech Blogの投稿一覧
フィード

supercluster & Web Workerで地図クラスタリングしたら1000万件でも耐えられるようになった
CastingONE Tech Blogのフィード
こんにちは!CastingONEの大沼です。 始めに弊社ではお仕事検索でマップ上に勤務先をマーカーで表示する機能があります。マーカーが大量にある場合はクラスタリングすることで表示する数を絞られてパフォーマンスが良くなりますが、それでも数には限度があります。StackBlitzで検証した時ではreact-leafletをそのまま使った場合は5万件程度、pureなleafletをそのまま使って出来るだけマーカーが作り直されないように実装して50万件程度なら耐えられそうということを確認しました。しかし要件としてはmax 100万件にできると嬉しいとのことでもっとパフォーマンスを改善でき...
15日前

仮想スクロールで実装した一覧にブラウザバックした際に元の位置に戻す方法
CastingONE Tech Blogのフィード
こんにちは!CastingONEの大沼です。 始めにカードUIの一覧でスクロールしてからどれか選択して詳細に遷移した後、ブラウザバックした場合は選択した時の場所に戻ってくれると嬉しいと思います。スクロール位置の復元というのはルーティングのライブラリで大体scrollRestorationというオプションをONにすることで自動で復元してくれますが、これはあくまで画面全体のwindow.scrollに関するスクロール位置で、仮想スクロールなど中でスクロールする場合は復元することができません。こういったケースでは自前で状態を保存しておき、ブラウザバックなどで戻ってきた時に自前でスクロール...
1ヶ月前

フロントでロールバックを実装する
CastingONE Tech Blogのフィード
こんにちは!CastingONEの大沼です。 始めに弊社ではファイルのアップロードは事前にGCSに上げてからそのURLをPOSTしています。先に上げておくことで登録時にファイルアップロードの処理時間をスキップでき時間を短くすることができます。しかしこの事前アップロードを並列で行った際、途中でエラーが起きると困ったことが起きます。アップロード先のURLは数が決まっているのでアップロード済みかをフラグで管理していますが、途中で失敗した場合はこれまで成功していたファイルはフラグが立ったままになってしまいます。更にまだ通信中のものはPromise.allではスキップされますが処理そのもの...
2ヶ月前

ESLintはv9に上げてからFlat Configに移行した方がやりやすそう
CastingONE Tech Blogのフィード
こんにちは!CastingONEの大沼です。 始めにESLint v9がリリースされてから1年くらい経ちました。リリース直後はFlat Configに対応していなかったり、そもそもv9の破壊的変更に追従できていないプラグインがいくつかあり苦労して移行された記事が散見されていましたが、流石に落ち着いたと思うので重い腰を上げてESLint v9のバージョンアップとFlat Configの移行をやりました。段階的に移行する場合はv8の状態でFlat Configにしてからv9に上げるか、逆にv9に上げてからFlat Configに上げるというアプローチがありますが、どちらで進めるべきか...
4ヶ月前

各ホスティングサービスでNext.jsを静的ファイルとして配信できるか検証してみた
CastingONE Tech Blogのフィード
こんにちは!CastingONEの大沼です。 始めにNext.jsは基本SSRですが、サーバーの運用コストを考えて静的ファイルとして出力して配信することもできます。しかしこの静的ファイルは動的パラメータが入っている場合は厄介で、単純にoutput: 'export'を設定しただけだと[id].tsxというページファイルは[id]/index.htmlという形でHTMLファイルが出力され、このファイルを返すように適切にURLとマッピングする必要があります。こういったURLのマッピング設定をリライトと言いますが、各ホスティングサービスでこの設定ができればNext.jsでもSPAっぽく...
5ヶ月前

NotionのGitHubプルリクエスト連携機能をGitHub Actionsで代用してみた
CastingONE Tech Blogのフィード
こんにちは!CastingONEの大沼です。 始めにNotionのプロパティにはGitHubプルリクエストを設定することができ、そこにGitHubプルリクエストのURLを貼ったり、逆にGitHubプルリクエストのタイトルにTSK-123などNotionのIDプロパティの文字列をつけることでNotionに紐づけることができます。更にプルリクエストのレビューを出したりクローズしたら自動で紐づいたNotionのステータスを切り替えることができ、Notionでのタスク管理がやりやすいです。しかしながらこの機能は2025年8月13日からビジネスプラン以上でしか使えなくなります。詳細の説明で...
5ヶ月前

Reactでサイドピークを実装した
CastingONE Tech Blogのフィード
こんにちは!CastingONEの大沼です。 始めにNotionにはサイドピークという右側にページを表示するという便利な機能があります。これによって左側でテーブルの一覧を見ながら次々と詳細をサッと見ることができてUXがとても良いです。弊社でもこの機能で業務効率化を図れると思ったため、Notionを参考に実装しました。この記事では弊社ではどんな感じで実装したのか、簡易アプリを用いて説明したいと思います。 作ったもの今回検証用で作ったものは以下になります。HOME画面でボタンをクリックしたら該当するページがサイドピークで表示され、サイドピークのヘッダーではこれを閉じたり全画面表...
7ヶ月前

Notionを使ってGood&Newを運用してみた
CastingONE Tech Blogのフィード
始めに弊社では週の始めにメンバーの誰か一人が最近のGood&Newを話す場を設けています。Good&Newについての詳細は以下の記事などに譲りますが、その人の好きなことだったり考えだったりを知る良い機会で今後も続けていきたいなと思っています。https://thanks-gift.net/column/communication/good-new/初めはSlackのカスタムレスポンスでランダムに選出された人が話すようにしていましたが、以下の点が個人的には気になりました。事前に誰が話すか決めてはいるが、そもそも誰が当たっていたかをわざわざSlackを遡る必要が...
7ヶ月前

同じ名前で分割代入する場合はショートハンドで強制するESLintルールをTypeScriptで作った
CastingONE Tech Blogのフィード
こんにちは!CastingONEの大沼です。!2025/05/12有識者から no-useless-rename というESLint本体に含まれているルールを紹介していただき、これでこと足りそうでした。この記事のカスタムルールの内容自体はほぼ意味のないものになってしまいましたが、カスタムルールを作っていく過程においては参考になるところもあると思うので引き続き残しておきたいと思います。 始めに弊社ではESLintルールのobject-shorthandを設定しており、ショートハンドで書けるものはショートハンドで強制されるようにしています。これによってコードがスッキリしたもの...
8ヶ月前

機能的負債にどう立ち向かうか?
CastingONE Tech Blogのフィード
はじめにこんにちは!株式会社CastingONEでHR領域のSaaSのPdM兼エンジニアをやっている@hiroakiです。よく技術的負債とかは話題に上がる気がするのですが、今回は機能的負債がテーマです。その機能がプロダクト全体としてみた時に、足枷になっていないか、なっている場合どのように立ち向かうか。このテーマはPdM Days 2025のOSTでも取り上げさせていただきました。僕の経験やそこで出た議論を元に書いてみようと思います!(OSTで一緒に議論してくださった方々ありがとうございました) そもそも機能的負債とは何なのか? 機能的負債とは?冒頭でも少し書きましたが、...
9ヶ月前

PostgreSQLでWITH RECURSIVE句を使って再帰的なクエリを書く
CastingONE Tech Blogのフィード
お疲れ様です!株式会社 CastingONEで働いてる岡本です!最近業務でバックエンド開発をやらせもらっているのですが、PostgreSQLでWITH RECURSIVE句を使って再帰的なクエリを書く機会があったので、何個か例を用いながら、自分の理解を深めるためにまとめてみたいと思います! WITH RECURSIVE句とは実世界のデータは組織図、フォルダ構造、商品カテゴリのような「親子関係」や「連鎖的な関係」を持つことがよくあります。こういった複雑な構造を単純なSQLで取り出そうとすると、クエリが何重にもネストしてしまって複雑になりがちです。そこで役立つのが WITH RECU...
9ヶ月前

ふりかえりを価値あるものにするために、「アジャイルなチームをつくる ふりかえりガイドブック」をチームで読んでみた
CastingONE Tech Blogのフィード
お疲れ様です!株式会社 CastingONEで働いているフロントエンドエンジニアの岡本です。今回は、チームで行うふりかえりの質を向上させるために、「アジャイルなチームをつくる ふりかえりガイドブック 始め方・ふりかえりの型・手法・マインドセット」をチームで読んでみた話について書いていきます!https://www.shoeisha.co.jp/book/detail/9784798168791https://speakerdeck.com/viva_tweet_x/a-retrospective-guide 読もうと思ったきっかけ弊社は開発体制にLeSSフレームワークを用いて...
1年前

GoのカスタムRoundTripperでリクエストとレスポンスをログ出力する
CastingONE Tech Blogのフィード
はじめにSaaS開発を行っていると、外部APIとの連携が必要になることが多いです。ここで外部APIとはパブリックに提供されているAPIはもちろん、パートナー企業が提供するAPIや、自社で運用している別のサービスのAPIも含みます。どのような種類のAPI連携であっても、意図しない挙動がありサポートに問い合わせるとき「自分たちのリクエストがどうだったか」を示すログを提供することで、問題の解決が早まることがあります。本記事では、http.RoundTripper を実装し、Observabilityを高める方法を紹介します。また本記事のサンプルコードは以下にあります。https:...
1年前

CastingONE開発振り返り2024
CastingONE Tech Blogのフィード
はじめにこんにちは、CastingONE岡崎です。2024年は会社としてもプロダクトとしても難しい意思決定が多い1年でしたが、今年の開発チームの1年を振り返ってみようと思います。 プロダクトCastingONEは非正規雇用の採用を行う企業向けのSaaSプロダクトです。非正規雇用の採用担当者が手間なく人材を採用できる世界を目指しており、現在特に力を入れているのが派遣会社の採用担当者が過去の派遣スタッフや応募者の中から効率よく掘り起こし応募を獲得するための機能群です。プロダクトとして今年も多くの意思決定をしてきましたが、その中でも1つ特に大きなものとして「ATS(採用管理)機...
1年前

最強のドッグフーディング「代行作業」で、機能が「使える状態」になかったことに気づいた話
CastingONE Tech Blogのフィード
はじめにこんにちは!株式会社CastingONEでHR領域のSaaSのPdM兼エンジニアをやっている@hiroakiです。今回のお話はドッグフーディング。ドッグフーディングとは、自社プロダクトを自分たちで使ってみることで、ユーザー視点で改善点や課題を見つけ出す取り組みのことをいいます。しかし、単に「使ってみる」だけでは見えてこない部分も多いもの。本当にユーザーの視点に立つって想像以上に難しいものですよね。今回社内のPdMで実施した「代行作業」、これは想像以上にユーザー視点でドッグフーディングできるものでした。この記事では、代行作業をやることになった背景や、その取り組みを通じて得ら...
1年前

集計テーブルの設計で「◯◯しておいて良かった😄」と「◯◯しておけば良かった😢」点を振り返る
CastingONE Tech Blogのフィード
はじめに株式会社CastingONEでバックエンドエンジニアをしている村上です。弊社では派遣会社向けのCRMを開発しており、求職者の情報を管理したり、メールやLINEで求人の紹介ができる配信機能を提供しています。先日、この配信機能の効果を測る「アナリティクス」という機能を追加することになり、それに必要な集計テーブルを設計しました。今回は、そのときのことを振り返って「◯◯しておいて良かった」と「◯◯しておけば良かった」点をまとめます。 作った機能の概要一例として、アナリティクスでは下記のようなことを分析できます。何人に求人紹介のメールを配信したか何人がそのメールを開...
1年前

CodecovのSelf Hosted版を(物凄く苦労して)セットアップしました
CastingONE Tech Blogのフィード
こんにちは、バックエンドエンジニアの永田です。以前、コードカバレッジの可視化ツールであるCodecov を導入した話を投稿しましたが、今回は有料版ではなく Self Hosted 版(OSS 版)をセットアップした話をしようと思います。インフラ基盤として Google Cloud を使用し、terraform で管理しています。情報が非常に少なく物凄く苦労したので、誰かの参考になれば幸いです。コンソール画面が表示されカバレッジレポートが正常に処理されていることを確認できた時、今年一番脳汁が出ました。機能開発と並行していたため、作業には 1 ヶ月以上かかりました... インフ...
1年前

Goで書かれたプロジェクトの混沌としたエラーハンドリングを改善した話
CastingONE Tech Blogのフィード
こんにちは、バックエンドエンジニアの永田です。今回は、Go で書かれている CastingONE のバックエンドの、エラーハンドリングの改善に取り組んだ話しをします。非推奨のパッケージを使っていたり、エラーにスタックトレースがついていないことがあるなど、元々混沌とした状況でした。同じような状況を抱えているプロジェクトもあるかと思うので、何らか参考になれば幸いです。 Beforeエラーにスタックトレースをつけるためのパッケージとして github.com/pkg/errors と golang.org/x/xerrors の二つが導入されており、混在している。しかも両方現在は非...
1年前

バックエンドエンジニアがフロントエンドに挑戦して得た学び
CastingONE Tech Blogのフィード
株式会社CastingONEの清水です。自分は元々バックエンドとしてやっていたのですが、去年の12月頃からフロントエンドをやり始めてからもうすぐ1年が経ちます。バックエンドエンジニアがフロントエンドを1年弱やっていく過程で起こったこと、役立ったことをまとめてみました。 各時期における経験と学び 1. React・TypeScriptについて何もわからない時期この時期の特徴できることフロントは何もない課題React・TypeScriptについて何もわからない効果的だった取り組み一般的なReact・TypeScriptの入門記事などを読んで基本的な...
1年前

Nginx内でLaunchDarklyのフラグを使って、アプリケーションのメンテナンスモードを切り分ける
CastingONE Tech Blogのフィード
お疲れ様です!株式会社 CastingONEで働いているフロントエンドエンジニアの岡本です。今回はNginx内でFeature FlagのLaunchDarklyを使って、アプリケーションのメンテナンスモードを切り分ける方法について書いていきます! はじめに弊社のフロントのアプリケーションはNetlifyにデプロイされており、今までのメンテナンスモードの切り分けは、NetlifyのSplit Testingの機能を活用し、メンテナンスブランチの比率を100%にすることで実現していました。通常時メンテナンス時ただ、この方法のメンテナンスモードの切り分...
1年前