Web システムの設計から本番運用まで、一貫して担当しています。
Rain Zhang です。サイモンフレーザー大学でコンピュータサイエンスを学ぶ4年生です。この1年は、セキュリティキーの会社と不動産管理会社で実際に運用されるシステムを、主に Python・TypeScript・Rust で開発し、運用してきました。
経歴
- 2026年8月 – 現在
MNT Realty · バンクーバー、BC州、カナダ
不動産・ストラータ管理会社で唯一のエンジニアです。社内業務の基盤となるシステムを開発・運用し、Microsoft 365 のアカウントやデータと連携させています。
担当した仕事- 社内プラットフォーム「MNT Control Center」を設計・開発し、それまで別々に使っていたツールを置き換えました。
- Microsoft Entra ID・Graph API・OAuth 2.0 を使い、組織アカウントでのサインインと権限管理を整えました。
- その土台となる社内 Web アプリケーションを Next.js・Node.js・PostgreSQL で構築しました。
- 繰り返しの事務作業を自動化しました。受信メールの振り分け、所有者情報の照会、社内文書をもとに社員の質問へ答える社内アシスタントです。
運用- ホスティング、デプロイ、ドメインと DNS、Vercel と GitHub Actions でのリリース手順を運用しています。
- いずれ引き継げるように、テストとドキュメントも自分で書いています。
使用技術PythonTypeScriptNext.jsReactNode.jsTailwind CSSPostgreSQLMicrosoft 365Microsoft Entra IDMicrosoft Graph APIOAuth 2.0DockerVercelGitHub Actions関連する制作物 - 2025年9月 – 12月
飛天ジャパン · 国際部 · 北京、中国
耐量子計算機暗号(PQC)対応の FIDO2 に向けて、3つのシステムを開発から運用まで担当しました。公開用の WebAuthn 開発者向けプラットフォーム、Rust によるソフトウェアセキュリティキー、顧客向けデモサイトです。
担当した仕事- 社内初となる WebAuthn/FIDO2 開発者向けプラットフォームを開発しました。それまで使っていた外部ツールの代わりに、登録・認証・確認・デバッグを一か所でできるようにしたものです。
- Rust で CTAP2 認証器を実装し、Linux 上で仮想 USB セキュリティキーとして見えるようにしました。ハードウェアが完成する前から、ブラウザや libfido2 で ML-DSA の資格情報を試せます。
- サポート窓口を通さずにパスワードレス認証とセキュリティキーを試せるデモサイトを作りました。
構築と運用- Linux サーバーと Google Cloud Run 上に Docker でデプロイし、テスト・ビルド・FIDO メタデータの日次更新は GitHub Actions で回しています。
- 社内のハードウェアエンジニアやセキュリティエンジニアと連携し、実機とその返すデータに合う形に仕上げました。
- インターンは12月に終わりましたが、3つとも今も自分で保守しています。
使用技術PythonFlaskJavaScriptHTMLRustTypeScriptReactTailwind CSSDockerGoogle CloudGitHub ActionsWebAuthn / FIDO2CTAP2.1ML-DSAliboqs関連する制作物
主な制作物
- 2026年8月 – 現在
不動産管理会社の3つのサイトを、1つの Next.js アプリケーションで提供しています。公開ウェブサイト、居住者向けのオーナーポータル、スタッフ向けの管理コンソールです。
Next.jsTypeScriptReactmntrealty.vercel.app概要MNT Realty の業務基盤です。見込み客が見るのは公開ウェブサイト。同社が管理するストラータの居住者は、オーナーポータルにサインインしてお知らせを読み、共用設備を予約し、書類を取得します。スタッフはそのすべてを管理コンソールから運用します。
仕組み3つのサイト、3つのサブドメイン、ビルドは1つです。プロキシがサブドメインごとに振り分け、admin はコンソールへ、owners はポータルへ送り、公開サイトでは同じパスを not-found にします。それぞれが独自のレイアウトと、ホスト限定のセッション Cookie を持ちます。公開ページは事前生成し、コンソールとポータルはリクエストごとに描画します。読み書きはすべて1つのストアインターフェースを通るため、スタッフの入力はそのまま居住者に届き、背後のストアは画面に触れずに、設計済みの PostgreSQL スキーマへ差し替えられます。
技術的な課題アクセス権限は1か所の表で定義し、ナビゲーション、ページのガード、ファイル配信がすべて同じ表を読みます。権限外のセクションは「禁止」ではなく「存在しない」として返すので、ポータルが他の権限の領域を知らせることはありません。ストラータは本当の境界で、あるストラータを開いている間は別のストラータの情報に一切たどり着けません。会社情報・書類手数料表・共用設備の枠テンプレートといった業務上の事実は、ソース中の値ではなく、管理者が設定画面で編集できるバージョン管理付きのデータとして持ち、保存したどの版にも戻せます。
技術構成Next.jsReactTypeScriptTailwind CSSNode.jsPostgreSQLVitestVercelGitHub Actions現在の状況3つとも構築・デプロイ済みで、次はクラウドのデータ層とバックエンドのワークフローです。ソースコードは MNT Realty に帰属し、公開していません。
- 2025年9月 – 現在
FIDO2/WebAuthn の動作を試すための公開ツール。耐量子計算機暗号 ML-DSA の資格情報にも対応しています。
概要FIDO2 を使って開発する人のための Flask アプリケーションです。実機または仮想の認証器で登録・サインインし、WebAuthn のリクエストを JSON のまま編集し、返ってきたデータを読み解き、FIDO Alliance のメタデータから任意の認証器を調べられます。飛天ジャパンでのインターン中に作り、今も保守しています。
仕組みタブは4つです。簡易サインイン、リクエストを直接編集できる詳細モード、attestation オブジェクトや CBOR/CTAP 構造のコーデック、ルート証明書を検証するメタデータ検索です。サーバーは Yubico の python-fido2 に手を入れたもので、liboqs 経由で ML-DSA-44・-65・-87 を追加しています。訪問者ごとにセッション用の保存領域(ローカルディスクまたは Google Cloud Storage)を分け、14日間使われなければ削除します。
技術的な課題python-fido2 には耐量子計算機暗号の対応がなかったため、従来の経路を壊さないまま ML-DSA の COSE 識別子・鍵の扱い・attestation の検証を追加しました。liboqs をイメージに同梱すると Cloud Run の起動が遅くなるので、起動時の準備を遅らせ、gunicorn を1ワーカー構成にしました。FIDO のメタデータは古くなるため、日次の GitHub Action が再検証してコミットします。誰も手を動かさずに最新のままです。
技術構成PythonFlaskJavaScriptDockerGoogle CloudGitHub Actionspython-fido2liboqsJinjapytestVitest現在の状況webauthnlab.tech で公開中。FeitianTech のもとで保守しています。サーバー側の約120のテストファイルに加え、フロントエンドと PQC のテストが CI で動きます。
- 2025年11月 – 12月
飛天ジャパンのパスワードレス認証と耐量子計算機暗号を試せる、顧客向けのサイトです。
ReactPythondemo.ftsafe.com概要飛天ジャパンの顧客と営業チームのためのデモです。開発者向けプラットフォームはエンジニア向け、こちらは製品を検討している人向けです。仕様書を読まなくても、セキュリティキーを登録し、サインインし、耐量子計算機暗号の資格情報が動く様子を確かめられます。
仕組み開発者向けプラットフォームと同じ認証の仕組みと ML-DSA 対応の上に、React のフロントエンドを載せています。生のリクエストや応答の代わりに、手順に沿った画面を用意しました。
技術構成ReactJavaScriptPythonFlaskWebAuthn / FIDO2ML-DSAliboqs現在の状況demo.ftsafe.com で公開中。ソースコードは飛天ジャパンのもので、公開されていません。
- 2025年10月 – 11月
ソフトウェアで動く CTAP2 セキュリティキー。Linux が USB 機器として見せるため、ハードウェアなしで耐量子計算機暗号の資格情報を試せます。
RustLinuxリポジトリ概要ソフトウェアで FIDO2 セキュリティキーとして振る舞う Rust のワークスペースです。社内のエンジニアや取引先が、ハードウェアが揃う前から ML-DSA の資格情報に対して開発できるようにするために作りました。自分のリポジトリから始まり、現在は FeitianTech のもとで保守されています。
仕組み認証器の中核は Trussed フレームワークと littlefs2 上に CTAP2.1 を実装しています。資格情報の管理、PIN/UV プロトコル1と2、リセットに対応します。ランナーが Linux の uhid で仮想 USB HID デバイスを登録し CTAPHID を話すため、Chrome・Firefox・libfido2 からは普通のキーとして見えます。ES256 と ML-DSA-44・-65・-87 を提示し、attach・detach・status・reset・pin を備えた小さなコマンドラインツール(常駐も可能)が付きます。
技術的な課題ブラウザは相手を厳しく選ぶので、Chrome や Firefox に受け入れられるまで HID 転送と CTAP のステートマシンを正確に作り込む必要がありました。CTAP と COSE の構造は従来の鍵を前提にしていて、耐量子計算機暗号の鍵はそのままでは収まりません。最初の版は C の FFI 経由で liboqs を呼んでいましたが、のちに純 Rust の fips204 に移し、秘密鍵は破棄時に消去しています。
技術構成RustLinux UHIDTrussedlittlefs2CTAP2.1fips204liboqsclap現在の状況Linux 上で動作し、開発者向けプラットフォームと合わせて使われています。CI では rustfmt・clippy・テストを実行しています。
その他の制作物
- 2025年2月 – 現在
英語と日本語の2言語で静的生成しているポートフォリオ。履歴書やカバーレターと共通の、小さなデザインシステムの上に作っています。
概要rainzhang.me で公開しているポートフォリオです。1ページを2言語で、小さな専用デザインシステムの上に作っています。書体は1つ、生成りの紙色、アクセント色は1色、枠線と影は使いません。履歴書とカバーレターも同じシステムで作っているので、3つがひと続きのものとして見えます。
仕組みNext.js App Router が、型付けした1つのコンテンツモデルから両言語をビルド時に静的生成します。/en と /ja は構造が完全に同じで、異なるのは文章だけです。Tailwind は生の値ではなくデザインシステムのトークンを読み、Albert Sans は next/font で自前配信し、ミドルウェアが日本からの初回訪問者を日本語ルートへ送ります(本人が選び直した場合を除きます)。
主な機能経歴と制作物の行はその場で開き、言語スイッチのピルは英語と日本語のあいだを滑り、最初の画面は CSS だけで立ち上がります。問い合わせフォームは honeypot とタイムアウトを備えて Formspree に送信し、メールアドレスはワンクリックでコピーできます。すべて JavaScript なしで描画され、動きはすべて prefers-reduced-motion に従います。
技術構成Next.jsTypeScriptReactTailwind CSSPlaywrightVitestVercelGitHub Actions現在の状況rainzhang.me で公開中。Vitest のユニットテストと、Chromium・Firefox・Safari・モバイルを横断する Playwright の E2E テストを CI で実行しています。
- 2025年1月 – 4月
同級生3人との授業課題。パスポートとビザから行き先を選び、ホテル・レストラン・日程まで組み立てる旅行プランナーです。
概要CMPT 276 のグループ課題です。簡単な質問に答えるか行き先を選び、日付を決めると、ホテル・レストラン・観光地と日ごとの計画が出てきます。追加の質問に答えるチャットも付いています。
担当した部分React と Tailwind のフロントエンド、OpenAI に行き先を尋ねるパスポート・ビザの質問フォーム、日付の入力とその検証、チャット機能を担当しました。Tripadvisor API を仲介する Express のサービスはチームメイトが書きました。
振り返りOpenAI の API キーをブラウザから呼んでいます。今ならバックエンド側に置きます。
技術構成ReactJavaScriptTailwind CSSViteOpenAI APITripadvisor APICypressVercel現在の状況2025年4月に完成し、現在も公開されています。
学歴と技術
サイモンフレーザー大学
コンピュータサイエンス学士 · バンクーバー、BC州、カナダ · 2027年4月卒業見込み
CGPA 3.44 / 4.33。2024年秋学期と2025年夏学期に Dean’s Honour Roll。
連絡先
採用のご連絡でも、ここにある仕事の話でも、お気軽にご連絡ください。
- linkedin.com/in/rainzhang05
- GitHub
- github.com/rainzhang05