TECH PLAY

フォルシア

フォルシア の技術ブログ

223

まえがき エンジニアの恒川です。 この記事では Async generators support for server actions で紹介されている「非同期ジェネレータを使った Server Actions でストリーミング通信」する方法を紹介します。 開発中の Web アプリケーションにおいて、レスポンスに時間がかかるサーバー処理の進捗状況をクライアントにフィードバックしたいという課題があり、上記 Issue で紹介されている方法を使ってクライアントの画面上に進捗状況を表すプログレスバーを表示しました。 本記事で紹介する簡易プログレスバー画面 Streams API にとっつ
アバター
これは PostgreSQL Advent Calendar 2025 12月13日の記事です。 まえがき エンジニアの吉田です。 フォルシアではPostgreSQLを分析寄りの用途で活用する機会が多いのですが、OLAP寄りの機能は3rd party拡張で補完されるものが多いため、しばしば拡張ジャンキーと化して情報収集や検証を行っています。 昨今では分析系DBの名前として真っ先に DuckDB の名前が挙がります。 DuckDBは組み込みデータベース、かつ様々なデータをソースとして読み込むことができるため、活用の可能性が非常に広いのが特徴です。 一方でPostgreSQLもまた、拡張
アバター
はじめに こんにちは。エンジニアの瀬沼です。 ECサイトなどで商品検索をするとき、ユーザーが知っている言葉と実際の商品名が一致しないことはよくあります。たとえば「ランニングシューズ」で検索したいのに商品名が「マラソン用スニーカー」だったり、「工場で引く白い線」と検索したいのに実際の商品名は「ラインテープ」だったり。このような意味検索を実現できるのが、ベクトル検索です。 一般的なデータベース検索ではLIKE '%keyword%'や全文検索インデックスを使ったキーワードマッチングが主流ですが、ベクトル検索では文章の「意味」を数値ベクトルとして表現し、類似度で検索結果をソートします。 本
アバター
はじめに こんにちは、エンジニアの長谷です。 フォルシアではPostgreSQL拡張の一つであるpostgres_fdwを使ってDB間の連携をとっているのですが、最近その処理が非常に遅くなっていることがわかりました。 ボトルネックとなっている部分は非常にシンプルなSQLながらちょっとした実装の違いでパフォーマンスに大きな差が出る興味深いものであり、実際チューニングすると22時間かかっていた処理を1分にできました。 本記事では簡単な例を用いて、得られる結果は同じだが表現の異なる4つのSQLでパフォーマンス比較をし、fdwでのjoin高速化についてご紹介します。 fdwとは fdw
アバター
はじめに フォルシア株式会社エンジニアの山本です。未経験で転職して以来、チーム開発の中でコミットを取り消す機会が増えてきました。 個人開発ではやり直しも自由ですが、チーム開発では履歴の整合性が重要です。誤ってコミットを消したり、force pushで混乱を招いたりしないためには、正しい知識が欠かせません。 この記事は、Gitを日常的に使う初中級者ITエンジニアが、状況に応じて安全にコミットを取り消せるようになることを目的としています。 Gitには複数の取り消し方がありますが、仕組みを理解して使い分ければ怖くありません。 概要(記事のまとめ) 結論から言えば、状況に合わせて以下のコ
アバター
概要 こんにちは、エンジニアの籏野です。 昨今AIを用いた開発が非常に盛んになってきました。 弊社でもClaude Codeによる開発支援を中心として、ChatGPT/Google Agentspace等々の導入検討・および利用推進が進んでいます。 そんなAI活用において、もっとも重要なのが人間からの指示をAIに伝えるための「プロンプト」です。 今回の記事ではAIに意図した動作をさせるためにどのようにプロンプトを育てるべきか?を自分なりに実践した内容を共有したいと思います。 お題 なんらかの開発を行った後に「PRを作成する」という作業をAIに任せていきます。 AIエージェントとし
アバター
はじめに 定期実行するバッチ処理というのは大小様々ありつつ至るところで見られるものだと思います。 実際にフォルシアでも、主にデータの取り込み・加工・出力の処理を中心にいろいろなプロダクトの"重要な機能"として存在しています。 そんな大事なバッチ処理ですが「毎日ちゃんと回って当たり前」と思っていると、いざ止まった時に大きな障害につながりかねません。 しかも、単に「エラーが出てないか」「終わったかどうか」だけ見ていても安心できないのがバッチ監視の難しいところです。 本記事では、フォルシアのバッチ処理の監視の観点を整理しつつ、どのように実践しているかをご紹介します。 以下では、定期実行する
アバター
こんにちは、エンジニアの澤田です。 普段の業務で、Pythonのプログラムで外部のAPIへリクエストを送り、そのレスポンスを加工してデータベースへ保存する処理を行っています。 その際、リクエスト数が多いため、リクエストを送って結果を受け取る処理を並列(マルチプロセス)で行っています。 ここで 1つのリクエストを「サブプロセス」と呼ばれる子プロセスが担当していますが、以下のような問題が起こることがあります。 サブプロセスが処理の途中でハングする APIのレスポンスが巨大でメモリを大量に使用する場合に、OSの「OOM Killer(Out of Memory Killer)」によってサブプ
アバター
はじめに こんにちは、新卒2年目エンジニアの紺谷です。 私はここ1年ほどSaaSプロダクトの運用保守チームで働いています。 普段は顧客や非エンジニアの社員からの問い合わせ対応(プロダクトの仕様の確認やバグ発生時の調査など)や、プロダクトや業務フローを改善していくための開発などをしています。 こういった仕事をやっていくにはプロダクトに使われている技術スタックについての理解はもちろん、プロダクトそのものの使い方や日々刻々と変わっていく仕様を把握したり、その業界特有の複雑なビジネスロジックを理解していくことが欠かせません。 そういったノウハウはドキュメントにまとめ、他のメンバーやこれからチ
アバター
まえがき PostgreSQLでは頻繁にクエリプランが改善されており、メジャーバージョンが上がる度に何かしらの変更が加わっています。 ひとくちにクエリプランの改善と言ってもその内容はさまざまで、新しいプランの追加、同じプランの処理の改善、他のプランへの暗黙的な置換などがあります。 本稿ではその中でも、プランナ制御用に新しく追加されたパラメータ[1]に関連する機能に絞って紹介をしたのち、簡単な検証を実施します。 連載について 本連載はPostgreSQLの比較的新しいバージョンで導入、改善された機能に注目し、その紹介と簡単な検証をする連載です。 RDBは枯れた技術と評されることが多いで
アバター
はじめに こんにちは。フォルシア株式会社エンジニアの宮本です。 社員全員が見られるWikiにナレッジを蓄積していくことは業務の効率化のために重要です。しかし、その運用を継続し全体に浸透させるのは簡単ではありません。 私の所属するフォルシアでは情報共有サービスのesaを利用しており、知見共有が比較的うまくいっている方だとは思いますが、一方で私は「記事を書くのが億劫だな。みんな書いていてすごいな。」と思うことが多々あります。このブログでは、そんな記事を書きたくない私が頑張って記事を書くために工夫していることを紹介します。 ! 以下の内容は客観的なベストプラクティスは示しておらず、個人的レ
アバター
はじめに Webアプリケーションの開発者の方であれば、自身の開発したアプリのパフォーマンスを気にしたことがあるのではないかと思います。 実際にChromeに同梱されている「Lighthouse」やオンラインサービスの「PageSpeedInsights」、「webpagetest」といったツールを使って計測したことがある方も多いのではないでしょうか。 ただ、単発で計測するのが簡単ですが、長期的な動向を見たいという場合これらのツールだけで測るのは難しいかと思います。 そこで、Webアプリのパフォーマンスを長期的に「定点観測」する取り組みを行ったのでご紹介したいと思います。 ! 「RUM
アバター
こんにちは、エンジニアの山下です。フォルシアは第3回Zenn記事投稿コンテスト「TypeScriptでやってみた挑戦・学び・工夫」に協賛しました。この記事では企業賞決定の経緯や授賞式の様子をレポートします。 zenn記事投稿コンテストとは Zenn記事投稿コンテストは、技術情報共有プラットフォーム「Zenn」を運営するクラスメソッド株式会社様主催の、エンジニア向けの技術記事投稿コンテストです。第3回となる今回のテーマは「TypeScriptでやってみた挑戦・学び・工夫」となっており、TypeScriptにまつわる技術的な試行錯誤や発見、実装の工夫などを広く共有する場となりました。 h
アバター
こんにちは、エンジニアの籏野です。 今回はPGliteとPrismaを用いて、実際にデータベースに接続して行うリポジトリ層のテストについて紹介します。 作成したサンプルプロジェクトは以下のリポジトリに置いていますので、合わせてご確認ください。 https://github.com/taku-hatano/pglite-prisma-test リポジトリ層におけるテストの課題 クリーンアーキテクチャのようなデザインパターンを利用する場合、リポジトリ層を利用してビジネスロジックとデータアクセス層を分離することはよくあるかと思います。 これにより、ビジネスロジック層においてはリポジトリ層を
アバター
こんにちは、エンジニアの齊藤です。 私が携わっているプロダクトでは、複数の旅行会社向けにSaaSサービスを提供しており、Kubernetes(k8s)でWebアプリケーションやバッチジョブを運用しています。嬉しいことに導入してくださるお客様が増えてきたのですが、各顧客に要求されるリソース量や細かな設定値が異なっているため、顧客数の増加に伴い運用負荷が高まってきていたという側面がありました。 具体的には、k8sマニフェストの管理が問題となっていました。k8sを用いてアプリをデプロイするためにはk8sマニフェストを用意する必要がありますが、我々のプロダクトでは細かな設定値の異なる複数の顧客に
アバター
こんにちは、エンジニアの籏野です。 最近、ESLintカスタムルールの開発において、AST(抽象構文木)から特定のノードをすべて抽出してルールを作成したいという要望がありました。 その際に、generatorを活用することで、非常に効率的かつ可読性の高い実装を行うことができたので、その方法を紹介したいと思います。 generatorの基本については既に多くの記事が存在するため、本記事では実際のコード例を通じて、generatorを用いてどのように探索を行うのかを中心に解説します。 最終形 以下のようなコードで、ASTを再帰的に探索し特定のノードを抽出することができます。 const
アバター
こんにちは。フォルシア株式会社エンジニアの宮本です。 ChatGPTやコーディングエージェントなどの生成AIがエンジニアリング現場に浸透し、業務効率化に活用する動きが広がっています。しかし「全社的に浸透しているか?」と問われると、まだまだ個人やチームのノウハウに依存しているのが一般的な現状かと思います。 フォルシアでも「AIの活用を前提とした業務変革の仕組みが必要」という問題意識から、今年4月に社内有志で『AIエージェントワーキンググループ』を立ち上げました。 まだ始まったばかりの組織ですが、背景と取り組み内容についてご紹介します。 AI活用に向けての課題と、ワーキンググループでの取
アバター
こんにちは、エンジニアの籏野です。 この度、Next.jsのApp Routerを利用したアプリケーションへのi18nの導入方法を調査することになりました。 Pages Routerを利用した場合の導入方法はイメージがつくのですがApp Routerを利用した場合は初めてとなりますので、その方法を調査・比較しました。 なお今回の調査は主に、Localizationの方法に焦点を当てています。 言語毎の出し分けのためのルーティング方法についてはそこまで解説しないのでご了承ください。 Next.jsの公式ドキュメントのinternationalizationページでは、いくつかLocaliz
アバター
概要 ベクトル検索データベースを利用するにあたり、 PostgreSQL + pgvector は有力な選択肢の1つに挙げられると思います。 pgvectorがサポートするインデックスアルゴリズムは一般的で信頼性の高いものですが、近似最近傍探索アルゴリズムは近年でも新しい手法の提案が頻繁に行われている分野であり、そういった新手法をPostgreSQL向けに実装した野心的な拡張機能も存在します。 本稿は、新しいベクトル検索用拡張のひとつである VectorChord の紹介と、簡単な性能検証を試みるものです。 PostgreSQLのベクトル検索拡張 ! 本項の内容は筆者の見聞による
アバター
こんにちは、エンジニアの籏野です。 先日、とある開発中の思い付きでTypeScriptの型でビット演算ができるようにしてみました。 残念ながらその型はアプリで採用されることはなかったのですが、何かしらに活かしてみたいなと思い、TypeScriptの型レベルプログラミングだけで○×ゲームを作ってみました。 ! 今回の型を作ろうとしたきっかけは、ある選択肢の中からいくつか選び出す際に、選び取った組み合わせと選んだもの以外の組み合わせが同じ状態を示すというルールがあったためです。 例: 1~5の選択肢がある場合に、「1, 3」と「2, 4, 5」は同じ状態を示すことを型で表現する ビット演算で
アバター