PrAhaのフィード
https://zenn.dev/p/praha
株式会社PrAhaでは、株式会社アガルートのサービス「アガルートアカデミー」の開発、自社サービス「PrAha Challenge」の運営、スタートアップに特化したデザインと受託開発を行なっています。一緒に働いてくれる方を血眼になって探しています。
フィード

TestcontainersでRDBを使ったテストを快適にする仕組み
4
PrAhaのフィード
なぜSQLのテストが必要なのかユニットテストでDBアクセスをモックするのは一般的なプラクティスです。テストの高速化に有効ですが、SQLロジック自体はテストされないという課題があります。複雑なJOINや集計処理、サブクエリを含むSQLは、意図通りに動作しているか実際にRDBで実行してみないとわかりません。また、パフォーマンスチューニングのためにSQLを書き換えたとき、テストがなければ「最適化によって挙動が壊れていないか」を確認するのが困難です。「シンプルなSQLだけ書いて、複雑な処理はアプリケーション側で行えばよいのでは」という考え方もあるでしょう。しかし、大量のデータをアプリケ...
8日前

なぜResult型ライブラリを再発明したのか
PrAhaのフィード
はじめにTypeScriptでエラーハンドリングを型安全に行いたいと考えたとき、皆さんはどのようなアプローチを取るでしょうか。JavaScript/TypeScriptの標準的なエラーハンドリング手法であるtry/catchは、型安全性に欠け、エラーが発生する可能性のあるコードを追跡するのが難しいという問題があります。そんな課題を解決するために、よく用いられるのがResult型を用いたエラーハンドリングです。Result型とは、成功時の値と失敗時のエラーを明示的に表現する型です。TypeScriptにおけるResult型ライブラリといえば、neverthrowが最も有名で広...
1ヶ月前

TypeScriptにResult型を導入するための妥協点はどこか?
PrAhaのフィード
現実のアプリケーションで発生するすべてのエラー・例外をResult型に変換するのは非現実的エラーハンドリングが不要なものはUnexpectedErrorとしてまとめてしまうという現実的な落とし所を提案する記事です。!記事内で使用されているResult型は@praha/byethrowが提供しているものです。カスタムエラーの定義には@praha/error-factoryを使用しています。ライブラリ固有の知識がなくても理解できるように、最小限のAPIのみを使用しています。 TypeScriptにResult型を導入したくなる理由TypeScriptのエラーハンド...
1ヶ月前

【TypeScript】カスタムエラーのすすめ
PrAhaのフィード
TypeScriptで開発をしていると、APIエラーやバリデーションエラーなど、さまざまなエラーを扱う場面があります。そんなときに、標準のErrorクラスだけで対応していませんか。この記事では、カスタムエラーを導入するメリットと、ボイラープレートを減らしてカスタムエラーを楽に定義出来るライブラリを紹介します。 カスタムエラーを作る理由標準のErrorクラスを使用することで楽にエラーを作成できますが、次のような問題があります。エラーの種類を区別しづらい追加の情報(HTTPステータスやエラーコードなど)を持たせづらいメッセージが一貫しないたとえば次のような例を考えてみま...
1ヶ月前

【170GB削減】Flutter開発でストレージ空き容量がパンパンになったときの対処法
PrAhaのフィード
「私の場合はこうすると空き容量を増やせました」を書きます。▲こんな感じで容量がいっぱいになってしまった時の対処法 先に結論結論から書くと、以下をすると合計170GBほど減らせました。miseを使ってる場合:mise pruneする(110GB→10GB)iOSシミュレーターを使ってる場合XCodeの「Window → Devices and Simulators」から不要なシミュレーターを手動でポチポチ消す(たぶん100GB→50GBくらい)dockerを使ってる場合:以下を実行する(40GB→30GB)docker image prune -...
3ヶ月前

Reactで作るアニメ付きドリルダウンUI ─ 状態設計から実装まで
PrAhaのフィード
業務でドリルダウン(UIパターン)を実現するコンポーネントを実装する機会がありました。状態管理やアニメーションの実装に関していろいろ考えることが多かったので、実装中何を考えていたのかをトレースして記事にまとめました。ドリルダウンに関する説明はソシオメディアさんの記事がわかりやすいので、そちらを参照してください。 実装したいコンポーネントのゴールを考えるドリルダウンを実装するにあたり、どのようなデータをどのようなAPIのコンポーネントで扱いたいかを考えます。扱うデータは、大分類>中分類>小分類のように階層的になっているデータを想定します。たとえば次のような部署>...
5ヶ月前

MCPサーバーでTSDocを参照出来るようにする
PrAhaのフィード
はじめに近年、ClaudeをはじめとしたLLMの進化はめざましく、日々の開発補助や設計検討など、ソフトウェアエンジニアリングのあらゆる場面で利用されるようになってきました。しかし、LLMの持つ知識は訓練データのカットオフ時点までのものに限られているという制約があります。これにより、比較的新しいOSSライブラリを使用する際、LLMがそのライブラリを正しく理解・活用できないという問題が発生します。例えば、弊社で最近公開した@praha/byethrowというResult型ライブラリがあります。これはneverthrowなどにインスパイアされた軽量・シンプルなAPIを提供するType...
5ヶ月前

@praha/byethrowの全機能リファレンス
PrAhaのフィード
はじめに前回の記事で@praha/byethrowについて紹介しましたが、本記事ではこのライブラリの全機能についてより詳しく紹介したいと思います。@praha/byethrowは、JavaScript/TypeScript向けの軽量でシンプルなエラーハンドリングライブラリです。Result型を用いることで、関数の成功と失敗を明示的に表現し、try/catchに頼らない型安全なエラーハンドリングを実現できます。以下では、Resultモジュールに含まれる全ての関数について、用途 (何をする関数か)、引数, 戻り値, 使用例コードの順で解説します。まだこのライブラリを知らない方でも分...
5ヶ月前

TreeShakableなResultライブラリを作りました
PrAhaのフィード
はじめにJavaScriptでは、throwを使ってエラーを明示的に投げることで、処理を中断する「大域脱出」が可能です。しかし、TypeScriptではこのthrowによって発生するエラーの型を記述できないため、型安全性が損なわれてしまいます。この問題を解決するために、関数の成功・失敗を明示的に扱えるResult型が有用です。TypeScriptでResult型を利用する場合、neverthrowやeffect-ts、fp-tsなどのライブラリがよく挙げられます。しかし、それぞれ一長一短があり、neverthrowは比較的シンプルで使いやすいものの、現在は活発なメンテナンスが...
5ヶ月前

Flutter初心者にflutter_hooksは必要ないかもしれない
PrAhaのフィード
2024年5月頃から社内でモバイルアプリを開発するチームが立ち上がりました。チーム全員がReactには慣れている一方でほとんどのメンバーがFlutter未経験という状態で、以下のような期待からflutter_hooksの導入を決めました。Widgetからロジックを切り出せるため、Widgetの見通しが良くなる・コードの記述量が減るのではないか慣れているReactHooksのように書けるため、Flutterの学習コストを下げることができるのではないかriverpod・graphql_flutterなど他に採用したライブラリのドキュメントにflutter_hooksと統合するため...
6ヶ月前

beforeAll,afterAll,beforeEach,afterEachの順番を永遠に覚えられないので図解した
PrAhaのフィード
これってどういう順番になるんだっけ?って毎回なるので図解しました。 describeが2個の場合たとえば、以下の場合を考えます。describe('外側のdescribe', () => { beforeAll(() => console.log('🐔 beforeAll')); afterAll(() => console.log('🐔 afterAll')); beforeEach(() => console.log('🐔 beforeEach')); afterEach(() => console.log('🐔 afterEac...
8ヶ月前

Drizzle ORMでテストデータの生成を簡単にする
PrAhaのフィード
はじめに弊社では、テスト実行時にデータベースをモックせず、Testcontainers を用いて実際のデータベースを使用したテストを行っています。このようなテストを行うためには、事前にテストデータを準備する必要があります。しかし、テストデータの作成は煩雑になりがちで、可読性の低下やメンテナンスの手間が増える原因となります。そこで、テストデータの生成をより簡単にするために、Drizzle ORMを活用したテストデータ生成パッケージ@praha/drizzle-factory を開発しました。本記事では、@praha/drizzle-factoryの基本的な使い方について紹介し...
8ヶ月前

【MySQL】手を動かして学ぶトランザクション入門
PrAhaのフィード
「これを見たらトランザクション周りがざっくり分かる」を目指します。MySQLを前提に解説しますが、他のDBMSでもベースとなる部分は同じだと思います。 トランザクションとは?ざっくり言うと「ここからここまでワンセットです」な処理のことです。たとえば、以下のようなSQLが2つあったとします。在庫を減らすSQL;発送処理をするSQL;この2つは絶対にセットで実行したいとします。ですが、この2つを実行した結果「1つ目は成功したけど2つ目は失敗した」となった場合、「在庫だけ減ってしまった!」になってしまいます。こういうときにトランザクションが使えます。この2つをトランザクシ...
9ヶ月前

PullRequestのマージ待ちの管理を自動化した
PrAhaのフィード
Renovateという自動ライブラリ更新botを利用し始めたのですが,マージの順番管理をする時間が増えてしまったので,その自動化をしました.短く言うとこうです.Renovate(またはDependabot)を利用していてGitHubのマージ前にブランチを最新にするルールを利用していると(Renovate以外の)PullRequestがなかなかマージできなくて困るのでマージ順を管理するGitHub ActionsであるMerge Masterを作りましたついでに,Enable auto-mergeを押すだけでいい感じにマージされるようになって便利になりました Reno...
9ヶ月前

ライブラリ選定のときに使えるツールあれこれ
PrAhaのフィード
自分が使ってるやつを紹介します。 GitHub Star History指定したGitHubリポジトリのスターの増加数をグラフで見れるサイトです。たとえば、👇の3つのReactのUIライブラリを例に見てみます。muichakra-uishadcn-ui▲https://star-history.com/#shadcn-ui/ui&chakra-ui/chakra-ui&mui/material-ui&Dateこんな感じで、一目でライブラリの人気度合いをざっくり比較できます。 使い方テキストボックスに、比較したいライブラリのGitHubリ...
10ヶ月前

DrizzleORMのGoldスポンサーになりました
PrAhaのフィード
はじめに私たちは最近、DrizzleORMのGoldスポンサー($1,000/月)になりました。本記事では、DrizzleORMについての簡単な紹介と、OSSスポンサーになるメリットについてご紹介します。 DrizzleORMとはDrizzleORMとは、TypeScript製のORMライブラリです。シンプルなAPIを提供し、SQLに似たインターフェースでデータベースを操作できる点が特徴です。テーブル定義をTypeScriptで記述でき、TypeScriptの型システムを活用することで、型安全なSQLを作成することができます。例えば、SELECT文は次のように記述でき...
10ヶ月前

モバイルアプリをリーダーアプリとして実装してアプリ内購入の実装を回避する
PrAhaのフィード
リーダーアプリとはリーダーアプリとは雑誌、新聞、書籍、オーディオ、音楽、ビデオなどのデジタルコンテンツの閲覧をアプリの主な機能として提供するアプリです。通常、モバイルアプリ内で有料コンテンツを利用する場合はアプリ内購入を実装してアプリ内から有料コンテンツを購入できるようにする必要があります。リーダーアプリとして実装されたアプリはその限りではなく、アプリ外で作成されたアカウントにアプリからサインイン => そのアカウントで購入したコンテンツをアプリで閲覧することができます。今回は他のウェブサイトでアカウント作成とコンテンツの購入をする前提で、そのコンテンツを閲覧するアプリ...
10ヶ月前

データベースを止めずにテーブル設計を変更したい
PrAhaのフィード
プラハチャレンジにて、受講生チームから次のような質問がありました。データベース(RDB)のテーブル設計を変更したいテーブル設計を変更する作業中にアプリケーションからデータベースへのアクセスが発生すると困るメンテナンス期間を設けアプリケーションを一時的に停止することで、データベースへのアクセスを防ぐことはできるデータベースを止めることなくテーブル設計を変更する方法はないかこの質問に対して、Expand and Contract patternを紹介しました。この記事では、Expand and Contract patternを用いてテーブル設計を移行する方法を例を交えて紹介...
1年前

ウミガメのスープを1人で遊べるアプリを作りました
PrAhaのフィード
1人でウミガメのスープを遊べるiOSアプリを作りました。https://apps.apple.com/jp/app/1人でウミガメのスープ/id6544801645 アプリの概要「ウミガメのスープ」は以下のようなゲームです。出題者が問題を出し、他の人は「はい」または「いいえ」で答えられる質問を出す。質問者は、出題者が考えているストーリー、あるいは物を推測して語る。それがすべての謎を説明できたとき、このパズルは解けたことになる。(Wikipedia - シチュエーションパズルより引用)通常は複数人でプレイするゲームですが、このアプリでは出題者をChatGPTに担当してもら...
1年前

【懺悔】Chu!雑にチケット切ってごめん
PrAhaのフィード
むかしむかしあるところに※おおむね嘘です めでたくリリース!までは幸せだったボス🧔♂️ < 今日から新規プロジェクトを立ち上げる!ボス🧔♂️ < まず、君には基幹システムからのデータ連携システムの構築を任せる。ボス🧔♂️ < 連携元システムの担当者はxxxさんだ。詳細は彼と詰めてくれたまえ。私👨🏻💻 < ラジャ!...私👨🏻💻 < でけたっす!ボス🧔♂️ < よくやってくれた。では次のタスクを~...。...ボス🧔♂️ < 無事リリースだ!お疲れ様!ボス🧔♂️ < 早速次のプロジェクトに移っても...
1年前