ブログ

RSS

技術やプロダクト開発に関する知見を発信しています

Web

100件超の用語を正規表現でマッチングしていたら遅くなったのでAho-Corasickに変えた

Astroのremarkプラグインで実装した用語自動リンク機能を、正規表現ベースからAho-Corasickアルゴリズムに変更した経緯を解説します。なぜ形態素解析を使わなかったのか、日本語と英語の混在テキストでの単語境界の扱いについても紹介します。

Web

ビルドのたびにOGPを取りに行くリンクカード、CIからDoSになりかけた話

Astroのremarkプラグインでリンクカードを自作しました。ビルド時にOGPメタデータを毎回fetchする設計にしたところ、GitHub ActionsからのビルドがDoS的な負荷になりかけたため、キャッシュをリポジトリにコミットする方式に切り替えた経緯を紹介します。

Web

labee.devは48時間で段階移行し、labee.jpは一括でAstroへ移した

ラビー合同会社のコーポレートサイト(labee.jp)と開発者ツールサイト(labee.dev)をNext.jsからAstroへ移行しました。labee.devは48時間で3段階の段階移行、labee.jpはその経験を踏まえた一括移行です。Tailwind CSSの廃止とCSSカスタムプロパティへの移行についても紹介します。

Apple

テストがアプリ本体の設定を書き換えていたので、UserDefaultsとDateを外から渡すようにした

iOS や macOS のアプリで単体テストを書くなら、UserDefaults.standard と Date() を直接呼んでいる箇所を先に外しておきます。そのままだとテストがアプリ本体の設定を書き換えますし、アサーションが1度も実行されないまま通るテストもできてしまいます。

Web

パスワードに大文字と記号、まだ必要?

パスワードに大文字・小文字・数字・記号を混ぜろという要件について、公的なガイドラインの原文を読みました。文字種を混ぜさせるかどうかは、その文書が誰に向けて書かれているかで分かれます。最低文字数は、資料によって8から15まで開きがあります。定期変更を求めるなという点だけは、読んだ資料が一致していました。

Apple

String.countをNSRangeに渡していた箇所を直しても、文字は消えたままだった

自前のテキストエディターで文字が消える問題を追ったところ、行に属性を付けるNSRangeをString.countで作っている箇所が見つかりました。ただしそこを直しても文字は消えたままで、実際に消していたのはNSTextStorageがNSLayoutManagerへ渡すchangeInLengthでした。最小の再現コードを書いて2つを切り分けた記録です。

Apple

Chimrのメニューバーでカレンダーを開かずに予定を把握する

Chimrのメニューバー表示機能を詳しく解説。3つの表示モード、動的表示の4パターン、更新間隔、右クリックメニューなど、限られたスペースで情報を表示する仕組みを紹介します。

Apple

Chimrのフルスクリーン通知を極める - 絶対に会議を見逃さない設定術

Chimrのフルスクリーン通知機能を詳しく解説。通知タイミング、スヌーズ、出席状態フィルタリング、ビデオ会議モードなど、自分好みにカスタマイズする設定方法を紹介します。

Web

ログイン失敗、何回でロックアウト?

ログイン失敗が続いたらアカウントをロックする定番の対策について、何回でロックするのかを公的なガイドラインに探しました。回数を書いている資料と書いていない資料に分かれ、書いてある数字も3回から100回までばらついています。

Web

ハッシュの使い分けは、値のエントロピーで決まる

Argon2はソルトが呼び出しごとに変わり、メモリーと時間を意図的に食うハッシュです。SHA3-256は決定的で、速く終わります。どちらを選ぶかは、ハッシュ化する値が乱数で作られているかどうかで決まります。

AI

「埋まっているか」だけ知りたいこともあるので、ChimrのMCPが返す情報を4段階にした

MCPで予定を返すとき、呼び出し元がどこまで詳しい情報を必要とするかは、用途で違います。Chimrでは最初に3段階を用意し、2日後に時刻と出席ステータスだけを返す「厳格」を足して4段階にしました。各段階が何を返して何を落とすか、そして段階に分けた判断を書きます。

Apple

会議に遅れないためにChimrへ全画面通知とMCPを載せた

macOS向け会議通知アプリ「Chimr」の紹介。全画面通知、ワンクリックでのビデオ会議参加、MCP対応など、Chimrの主要機能と既存アプリとの違いを解説します。

Web

Labee Dev Toolbox 公開しました

ラビー合同会社が公開したWebツール集「Labee Dev Toolbox」の紹介。Color Picker、Cron Expression Tester、DNS Records Checker、Sitemap Viewerなど主要機能と今後の展望について。

コーポレート

Apple法人アカウント開設の流れ

Apple法人アカウントの開設手順を解説します。DUNS Numberの申請から法人アカウントの承認まで、大まかな流れと注意点について紹介します。

Web

Tailwind CSSでカラーテーマの切り替えを簡単に実装する

CSSカスタムプロパティとTailwind CSSを組み合わせて、data-theme属性の切り替えだけでカラーテーマを変更できる実装方法を紹介します。

コーポレート

会社ロゴを商標登録する

会社ロゴの商標登録をToreruで行った流れを紹介します。商標の基礎知識、区分の選び方、出願手順について解説します。

コーポレート

iOSアプリを譲渡する

iOSアプリの所有権をApp Store Connect上で譲渡する手順を解説します。譲渡条件の確認からリクエスト、承認までの流れについて紹介します。

コーポレート

ラビーのロゴができるまで

起業準備の一環として行ったロゴ制作の依頼について。事前準備、依頼先の選定、デザイナーとのコミュニケーションのポイントを紹介します。

Web

DartでUDP通信の結果を同期的に待つ方法

DartでUDP通信の結果を同期的に待つために、FutureとCompleterを組み合わせる方法を紹介します。

DevOps

GitHub Organizationのプロフィールページを設定する

GitHub Organizationの公開・非公開プロフィールページの設定方法を紹介します。.githubリポジトリと.github-privateリポジトリの使い分けについて解説します。