531 Views
March 12, 25
スライド概要
2025/03/14開催のtoranoana.deno#20発表資料です
https://yumenosora.connpass.com/event/342361/
虎の穴ラボ株式会社は、主にとらのあな関連サービスのシステム開発を専門に担う、エンジニアの会社です。
Denoの実プロダクト採用へ向けた取り組み toranoana.deno#20 虎の穴ラボ株式会社 藤原佳顕 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 1
目次 1. 自己紹介 2. 概要 3. 課題点 4. やっていること紹介 5. 良かったこと 6. 今後の展望や期待 7. まとめ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 2
自己紹介ページ (藤原) 藤原 佳顕(ふじわら よしあき) : yoshiaki fujiwara、6年目 ‣ ‣ 新規事業担当( Fantia、Creatia)、アーキテクトチーム (新規技術導入、セキュリティ、 etc) 出身 ‣ 大学:情報系(メイン数学) ‣ 前職:独立系ソフトウェア会社、主に GISとWeb、ライブラリ開発 ‣ TypeScript、Ruby on Rails、C#、C++、React、Vue、Angular ‣ 入社理由 ‣ ‣ 自分がスキルアップできそうな場所に行きたい オタク系の話ができるところに行きたい 好きなモノ ‣ ‣ ‣ シューティングゲーム、格闘ゲーム、アトラスのゲーム SF小説 プログラミング Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 3
概要 ● ● ● ● ● なぜDenoをプロダクトに採用できていないかなどについての考察をした後、Denoを社内で採用 するために実施していることなどを紹介します 活動内容の紹介 ○ 本イベントであるtoranoana.deno ○ 社内のペアプロ 作っているものの紹介 ○ 具体的に作っているもの紹介 どうやって作ってる/やっているのかの紹介 ○ 何つかっているかなどの紹介 Deno使いたいけどどう持っていくか…など悩んでる人の参考になればと思います Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 4
課題点 ● 一般的な技術導入の検討/課題項目 ○ プロダクトの目的、機能に見合っているか ■ 言語、ランタイムの機能が十分か ■ 十分じゃないにしても周辺ライブラリや最悪自作でカバーできるか ○ 世の中的な知見の豊富さ ■ 学習コストがどのくらいか ■ 採用実績がどのくらいありそうか ○ 社内の知見の豊富さ ■ 問題が起きたときに自社内で解決可能か ○ 使いたい技術か ■ 自分の趣味、興味 ■ キャリア的にプラスになるか Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 5
課題点 ● Deno採用までのハードル ○ プロダクトの目的、機能に見合っているか ■ 通常のWebアプリを作るにはDeno一通りの機能があるので問題なさそう ■ Nodeの資産も使えるのでなんとでもなりそう ○ 世の中的な知見の豊富さ ■ 採用実績がでてきているので実際に問題にはならなそう ● https://speakerdeck.com/lycorptech_ jp/why-we-chose-deno-for-product ion ○ 使いたい技術か ■ TypeScript、JavaScriptの知見になるので問題ない ○ 社内の知見の豊富さ ■ つかったことがある人いないのでメンテやノウハウに不安はある ■ 今回の発表ではこちらにフォーカス ■ ないなら作ろう! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 6
やっていること紹介 ● 前提 ○ 虎の穴の工数管理ツールが内製されている(藤原管理) ■ 以下書籍の記事参照 ■ https://techbookfest.org/product/266250003?productVariantID=513225270073 7536 ○ 一方で出席予定とかはスプレッドシート(+ Googleカレンダー)で管理されている(藤原管理) ○ 工数入力したかどうかとその日休みだったかを照らし合わせたいが上記により割と面倒 ○ 出席予定表が手作りで面倒くさい(+ミスりがち) ■ 元々GASだったがGASのコードがカオスになりがち + 上記システム連携は加味できない ○ 出席予定表を工数管理ツールの派生として作ってしまえばよいのでは? ■ どっちも藤原管理なのでDenoで作ってみよう! ■ 社内アプリなのでログインとかも不要で細かいこと無視して採用しやすい Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 7
やっていること紹介 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 8
やっていること紹介 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 9
やっていること紹介 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 10
やっていること紹介 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 11
やっていること紹介 ● アプリ構成 ○ 元々のアプリ:Ruby on Rails + Vue ○ 出席予定表の構成 ■ バックエンド:Deno ● DB操作:MySQLのライブラリ使って直接クエリ発行 ○ ORMに決定版がないのと、誰でも管理可能なように ● API:Oak→Honoに変更を試みている ■ フロントエンド:React ● 作り始めたときはFresh等なかったので素のReact ● ただし、元々将来的にNext.js等に載せ替えたかったので素のReactにしたが、結果 的にFreshとかに載せ替えやすくなっているかも ○ DBマイグレーション:そのままRailsで実行 ○ デプロイ ■ cliツールとしてバイナリ化してsystemdで管理 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 12
1からのプロジェクト作成
export async function index(context: RouterContext<"/attend/:monthId">) {
const sections = context.request.url.searchParams
.getAll(QUERY_KEY)
.map((val: string) => Number.parseInt(val))
.filter((val: number) => val);
const valid = isMonthIdValid(context.params.monthId);
if (!valid) {
if (sections.length <= 0) {
context.response.status = 400;
context.response.status = 404;
return;
context.response.body = {};
}
return;
}
const res = await attendIndexUserRepository.findBySections(
sections,
Number.parseInt(context.params.monthId),
);
context.response.body = res;
}
Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
13
1からのプロジェクト作成
export async function findBySections(sectionIds: number[], monthId: number) {
const client = getClient();
const users = await client.query(SECTION_USERS, [sectionIds]) as {
id: number;
name: string;
employeeNumber: number;
}[];
const userIds = users.map((u) => u.id);
const weeklyShifts = await usersWeeklyShifts(monthId, userIds);
return { users, weeklyShifts };
}
Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
14
良かったこと ● ● ● デプロイ簡単 ○ ワンバイナリにできるので、オンプレサーバーでデプロイが楽 API作るのにそんなに困らなかった ○ 今回はセッション管理のようなことを考えなくてよかったのもあるが 楽だった 元々あったアプリのサブアプリとして作ったのが良かった ○ Denoで物足りないとか悩むとかそういった機能をメインアプリの方に おまかせできる ○ 今回はマイグレーションと管理画面周り Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 15
今後の展望や期待 ● ● ● ● ● とりあえずアップデート ○ 割とDenoのリリースが早いので随時アップデート メインアプリもDenoにしたい ○ 将来的にはRailsは管理画面とマイグレーションだけとかに APIをHonoにしたり、フロントをFreshにしたりなどしたい ○ AI先生にお願いするとできそう? コーディングエージェントとの相性が良さそうなので活用したい ○ 上記の置き換えなど ○ パーミッションシステムとの相性が良さそうなので検討 フルスタックのFWが欲しくなる ○ ORMとかマイグレーションツールとかセッションの管理方法で悩みたくない Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 16
まとめ ● 今回はDeno採用に向けて社内での実績作りについての話をしました。 ● 実は他にも細かく使ってたりします ○ 今日の奥谷の発表 ○ 以前の自分の発表 :https://speakerdeck.com/toranoana/toranoana-dot-deno-n umber-17-denodegithubnobatukuatupu-with-chatgpt ● 完成したらまた社内外にアピールしていきたいと思います Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. 17