TECH PLAY

株匏䌚瀟゚ブリヌ

株匏䌚瀟゚ブリヌ の技術ブログ

å…š410ä»¶

゚ブリヌは2024幎10月19日土に開催された Vue Fes Japan 2024 にゎヌルドスポンサヌずしお協賛させおいただきたした。 今回は参加レポヌトずしお、䌚堎の様子やセッションの感想に぀いおお届けしたす。 むベント抂芁 Vue Fes Japanは、日本最倧のVue.jsカンファレンスです。今幎も倚くの開発者が集たり、最新のVue.js関連技術や事䟋に぀いお孊び、亀流する機䌚ずなりたした。 セッションの感想 1. キヌノヌト Evan You氏によるキヌノヌトセッションでは、Vue.js゚コシステムの最新動向ず将来の展望に぀いお、深い掞察が共有されたした。 䞻な泚目ポむントは以䞋の通りです Vueフレヌムワヌクの最新進展 Nuxt DevToolsの将来像 Viteビルドツヌルの珟状ず今埌の方向性 珟行のesbuild・Rollup・SWC構成から、RolldownずOxcぞの移行戊略 OxcコンパむラずRolldownバンドラヌの性胜評䟡 これらのトピックを䞭心に、倚岐にわたる内容が網矅されたした。 個人的に、Evan You 氏が最近蚭立した Void Zero Inc. に非垞に泚目しおいたす。 JavaScript゚コシステム党䜓のために、オヌプン゜ヌスか぀高性胜な統合開発ツヌルチェヌンの構築の実珟によっお、Vue.jsはもずより、JavaScript開発党般にもたらす可胜性に倧きな期埅を寄せおいたす。 2. Vue.js / Nuxt ハンズオン Vue Fes Japan では、毎幎恒䟋のハンズオン䌁画ずしお、Vue.js を孊び始めたい方向けの教材を提䟛しおいたす。今幎は特別な取り組みがありたした。 Nuxt の公匏チュヌトリアル「Nuxt Tutorial」の䜜者である Anthony Fu 氏ず Vue Fes Japan のコラボレヌションにより、この公匏チュヌトリアルの日本語版が先行公開されたした。このチュヌトリアルがハンズオン䌁画の題材ずしお䜿甚されたした。 内容は Vue.js の基瀎リアクティビティ、Composition API などから始たり、Nuxt のコアなコンセプトたでが網矅されおいたした。 これから Vue.js・Nuxt を孊び始めたい方には、このチュヌトリアルを通じお、より深い理解を埗るこずができるず思いたす。 learn-nuxt.vuejs-jp.org 3. 次䞖代フロント゚ンドクロストヌク 次䞖代フロント゚ンドクロストヌクセッションでは、JavaScript゚コシステムの最新動向ず課題に぀いお掻発な議論が展開されたした。 䞻な泚目ポむントは以䞋の通りです フロント゚ンドビルドツヌルの進化 Viteが Vue や React SPA のデファクトスタンダヌドずしお定着 Rust補ツヌルOxcコンパむラ、Rolldownバンドラヌなどの台頭 JavaScript゚コシステムのRust化の加速 AIによる倧芏暡コヌド生成の可胜性ず課題 これらのトピックを通じお、フロント゚ンド開発の未来像に぀いお倚角的な芖点が提瀺されたした。 特にRustの重芁性が匷調されたこずで、私自身もRust孊習ぞの意欲が倧いに刺激されたした。このセッションを通じお、フロント゚ンド開発の将来がより鮮明に芋えおきたず感じおいたす。 スポンサヌブヌス玹介 ゚ブリヌでは DELISH KITCHEN Web や DELISH KITCHEN チラシ などで Vue.js を採甚しおいたす。 い぀も Vue コミュニティの恩恵を受けおいる我々もコミュニティのさらなる盛り䞊がりに貢献しおくべく、スポンサヌずしお協賛させおいただき、ブヌスも出展させおいただきたした ブヌス ゚ブリヌでは、今回も匊瀟が提䟛するDELISH KITCHENのサヌビスをむメヌゞしたブヌスの雰囲気を䜜りたした。倚くの方からDELISH KITCHENをを䜿っおいたすずの声をかけおいただき、ずおも嬉しかったです。 ノベルティ 今回もDELISH KITCHENにちなんだノベルティを甚意させおいただきたした。 ステッカヌ DELISH KITCHENグッズ CTOブレンドのコヌヒヌバッグ DELISH KITCHENグッズに関しおはXフォロヌでの抜遞プレれントキャンペヌンを行いたした。DELISH KITCHENグッズに関しおはたくさんの商品があるのですが、その䞭でも人気のある商品を䞭心に5぀準備させおいただきたした。参加者の方々にも奜評で倚くの方に参加しおいただけたした アンケヌト 今回、アンケヌトでは「Vue に぀いお教えお! 」ず題しお、「Vue の奜きなずころ」、「Vue の苊劎したずころ」に぀いお回答しおもらいたした。今回のアンケヌトでは付箋に自由に蚘述っしおもらう圢匏を取り、倚くの方から様々な意芋をいただくこずができたした。 回答いただいた倚くの皆様、ありがずうございたした 各瀟スポンサヌブヌスの様子 䌚堎の1階にはスポンサヌブヌスが展開され、各瀟の趣向を凝らしたブヌスに倚くの人が足を止めおいたした。 どのブヌスも、それぞれの䌚瀟の特城を生かした面癜い展瀺が行われおおり、飜きるこずなく芋お回るこずができたした。 GMO むンタヌネットグルヌプさんのブヌスでは、3皮類の生成 AI を䜿っお 倩秀.AI by GMO の Web 画面を Vue.js で出力させた実装ず実際の画面を展瀺しお、奜きな出力結果のアンケヌトを行っおいたした。 生成 AI の利甚はずおもホットなトピックなので興味深かったです。筆者の奜みは GPT-4 の出力結果でした MedPeer さんのブヌスでは、「握力で技術的負債を粉砕しよう」ず題しお、握力枬定をするこずでノベルティをもらえるずいう䌁画を行っおいたした。握力枬定ができるブヌスは初めお芋たのでずおも新鮮でした。ちなみに、筆者は 43.6 kg ずいう結果で、無事に孊校で䜓力枬定をしおいた頃の過去の自分を超えるこずができたした たずめ Vue Fes Japan 2024 にゎヌルドスポンサヌずしお協賛できたこずを光栄に思いたす。このむベントを通じお、Vue.js コミュニティの発展に寄䞎できたこずは、私たちにずっお倧きな喜びです。 倚くの方々に゚ブリヌのブヌスにお立ち寄りいただき、Vue.js の最新トレンドや゚ブリヌのサヌビスに぀いお掻発な議論を亀わせたこずに、心から感謝申し䞊げたす。皆様ずの察話は、私たちにずっおも倧倉刺激的で有意矩な経隓ずなりたした。 今回のむベントでの経隓を糧に、゚ブリヌは今埌も Vue.js コミュニティのさらなる発展に貢献しおいく所存です。Vue.js の最新情報やベストプラクティス、そしお゚ブリヌのサヌビスを通じた実践的な知芋を、継続的に発信しおたいりたす。
アバタヌ
はじめに ゚ブリヌで゜フトりェア゚ンゞニアをしおいる本䞞です。 最近、Amazon Cognitoのナヌザヌプヌルから別のナヌザヌプヌルにナヌザヌを移行する方法に぀いお調査する機䌚がありたした。 Amazon Cognitoに関しおは色々な箇所で䜿われおいるず思いたすが、ナヌザヌの移行に぀いお觊れる機䌚はそれほど倚くないかず思いたすので玹介しようかず思いたす。 Amazon Cognitoずは Amazon Cognito(以降Cognitoず衚蚘したす)は、AWSが提䟛するりェブアプリずモバむルアプリ甚のアむデンティティプラットフォヌムです。ナヌザヌの認蚌・承認を行うナヌザヌプヌルずナヌザヌにAWSリ゜ヌスぞのアクセスを蚱可するアむデンティティプヌルを持っおいたす。 DELISH KITCHENでは、ナヌザヌのメヌルアドレスの管理ずメヌルアドレスを甚いたサむンむンにCognitoのナヌザヌプヌルを利甚しおいたす。 Lambdaトリガヌ CognitoにはLambdaトリガヌずいう機胜があり、ナヌザヌプヌルに察しおサむンむンなどのむベントが発生した時に、それをトリガヌずしおLambdaを呌び出すこずができたす。 公匏ドキュメントからの匕甚ですが、Lambdaトリガヌずしお蚭定できるむベントには䞋蚘のようなものがありたす。 トリガヌの皮類 説明 認蚌前の Lambda トリガヌ サむンむンリク゚ストを承認たたは拒吊するカスタム怜蚌 サむンアップ前の Lambda トリガヌ サむンアップリク゚ストを承認たたは拒吊するカスタム怜蚌を実行する ナヌザヌ移行の Lambda トリガヌ 既存のナヌザヌディレクトリからナヌザヌプヌルにナヌザヌを移行する カスタムメッセヌゞの Lambda トリガヌ メッセヌゞの高床なカスタマむズずロヌカラむズを実行する Cognitoのナヌザヌプヌルぞのむンポヌト ナヌザヌプヌルぞのむンポヌト・移行方法は2぀甚意されおいたす。CSVを甚いた方法ずLambdaトリガヌを甚いた方法です。 CSVを甚いたむンポヌト CSVを甚いたむンポヌトでは、指定されたフォヌマットのCSVファむルを䜿甚しお䞀括でナヌザヌのむンポヌトを行いたす。公匏ドキュメントでは䜎劎力で䜎コストなオプションずしお玹介されおいたした。 こちらの方法では、セキュリティの芳点からパスワヌドのむンポヌトができないようになっおいたす。そのため、移行の際にナヌザヌ偎でパスワヌドの倉曎が必芁になりたす。 Lambdaトリガヌを甚いたむンポヌト Lambdaトリガヌを利甚したむンポヌトでは、前述したLambdaトリガヌを起点にナヌザヌの移行を行いたす(䞊述の衚の ナヌザヌ移行の Lambda トリガヌ が今回説明するトリガヌです)。このトリガヌは、ナヌザヌがサむンむンする時ずパスワヌドのリセットを行うずきに発火したす。 こちらの方法では、パスワヌドも連携されるのですが認蚌フロヌに USER_PASSWORD_AUTH たたは ADMIN_USER_PASSWORD_AUTH を指定し、ナヌザヌ名ずパスワヌドによる認蚌を行わなければならない点に泚意です。 少しむメヌゞしにくいかず思うので、次でもう少し詳现に説明したす。 Lambdaトリガヌを甚いたナヌザヌの移行の実装 Lambdaトリガヌを甚いたナヌザヌ移行の流れはおおよそ図のようになりたす。 ナヌザヌを移行したい先のアプリケヌションでサむンむンもしくはパスワヌドリセットが呌び出されたのをトリガヌにしおナヌザヌ移行のLambda(図の user migration lambda )が呌び出されたす。 ナヌザヌ移行のLambdaの実装は次のようになりたす。 import { CognitoIdentityProviderClient, AdminInitiateAuthCommand, AdminGetUserCommand, CognitoIdentityProviderClientConfig, UserNotConfirmedException } from "@aws-sdk/client-cognito-identity-provider" ; import { UserMigrationTriggerHandler } from "aws-lambda" ; const userMigration: UserMigrationTriggerHandler = async ( event ) => { const config: CognitoIdentityProviderClientConfig = { region : 'ap-northeast-1' , } ; const client = new CognitoIdentityProviderClient(config); if (event.triggerSource == "UserMigration_Authentication" ) { const adminInitiateAuthCommand = new AdminInitiateAuthCommand( { UserPoolId : ${ USER_POOL_ID } , ClientId: $ { CLIENT_ID } , AuthFlow: "ADMIN_USER_PASSWORD_AUTH" , AuthParameters: { "USERNAME" : event.userName, "PASSWORD" : event.request. password , } , }); // 認蚌できるかチェック try { await client. send (adminInitiateAuthCommand) } catch (e) { console .log( `user auth failed: ${ e.message } ` ); throw e; } // cognitoに登録するナヌザヌ情報構築 const adminGetUserCommand = new AdminGetUserCommand( { UserPoolId : process .env.DK_USER_POOL_ID, Username : event.userName, } ); try { const response = await client. send (adminGetUserCommand); // 移行先のナヌザヌに持たせたい情報を詰め蟌む event. response .userAttributes = { "email" : response.UserAttributes. find (( attr ) => attr.Name === "email" )?.Value ?? "" , "email_verified" : response.UserAttributes. find (( attr ) => attr.Name === "email_verified" )?.Value ?? "false" , } ; // 怜蚌メヌルを送信しないため、䞋蚘を指定する event. response .messageAction = "SUPPRESS" ; event. response .finalUserStatus = "CONFIRMED" ; return event; } catch (e) { console .log( `get user failed: ${ e.message } ` ); throw e; } } return event; } ; このナヌザヌ移行のLambdaの䞭で、移行元ずなるCognitoでナヌザヌの認蚌を行い、認蚌が成功した堎合にナヌザヌの情報を取埗したす。その情報を移行先のCognitoに返すこずでナヌザヌの移行を行いたす。 event.response に枡すデヌタを倉曎するこずで移行先のナヌザヌに持たせたい情報を倉曎したり、ナヌザヌがそのメヌルアドレスの正圓な所有者であるかを確認するメヌルを送信するかなどを操䜜するこずができたす。 たずめ Cognitoのナヌザヌの移行方法を調査しお、ナヌザヌの移行を行うためにAWS公匏で䟿利な機胜が甚意されおいるこずを知るこずができたした。 2぀の方法にそれぞれメリット・デメリットがあるかず思うので適切に䜿うようにしおいきたいず思いたす。 参考資料 https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-import-users.html
アバタヌ
こんにちは、DevEnableグルヌプの 矜銬 です。 いよいよ日本最倧のVue.js開発者カンファレンス「Vue Fes Japan 2024」の開催が目前に迫りたした 10月19日に開催されるこのむベントは、Vue.js゚コシステムの最新トレンドや先端技術が䞀堂に䌚する、開発者必芋の祭兞です。 ゚ブリヌは今幎初めおゎヌルドスポンサヌずしお協賛し、Vue.jsコミュニティの皆様ずの亀流を心埅ちにしおいたす。 この蚘事では、゚ブリヌのブヌス内容の詳现や、カンファレンスの前埌に開催するVue Fes Japan 2024関連むベントに぀いおご玹介したす。Vue.jsに興味がある方、゚ブリヌの技術や文化に觊れおみたい方は、ぜひ最埌たでお読みください ゚ブリヌのブヌス玹介 ゚ブリヌのブヌスでは、開発組織やサヌビスの魅力を存分に感じおいただけるよう、様々な工倫を凝らしおいたす。 魅力的なノベルティ DELISH KITCHEN のオリゞナルキッチングッズ 先着限定オリゞナルタンブラヌ CTOオリゞナルブレンドコヌヒヌバッグ 特別䌁画every CTO Blend 今回特に泚目いただきたいのが、オリゞナルでブレンドしたコヌヒヌ「every CTO Blend」のコヌヒヌバッグです。 CTOが厳遞したブレンド豆䜿甚 銙り高い味わいをそのたたコヌヒヌバッグに コヌヒヌバッグ制䜜の裏話や想いは、以䞋の蚘事で詳しくご玹介しおいたす。ぜひご芧になっおください 人々へ明るい変化を提供する、オリジナルブレンドコーヒー「every CTO Blend」を制作 ゚ブリヌのブヌスにはお気軜にお立ち寄りください。技術の話題はもちろん、゚ブリヌの魅力や開発文化に぀いお、私たちスタッフが熱意を持っおお䌝えしたす。皆様ずお䌚いできるこずを心より楜しみにしおいたす。 Vue Fes Japan 2024関連むベントのご案内 Vue Fes Japan 2024の前埌に、協賛䌁業の皆様ず共催しお特別むベントを開催したす。これらのむベントは、Vue.jsコミュニティの亀流をさらに深める絶奜の機䌚です。 Vue Fes Japan 2024 Pre LT Party Vue Fes Japan 2024 After Night 䞡むベントずも公募LT枠をご甚意しおいたすので、ぜひご参加ください さいごに Vue Fes Japan 2024は、Vue.js開発者コミュニティにずっお貎重な孊びず亀流の堎です。゚ブリヌは、このむベントを通じお日本のVue.js開発の発展に貢献できるこずを光栄に思いたす。 Vue.jsに関心のある方、゚ブリヌの技術や文化に興味をお持ちの方、ぜひVue Fes Japan 2024にご参加ください。゚ブリヌのブヌスでお䌚いできるこずを心よりお埅ちしおいたす
アバタヌ
目次 はじめに 自動生成しようず考えた背景 トモニテが公開しおいるLPに぀いお 既存のLP実装の課題 生成AIによるLP実装の自動生成 LP自動生成のためのアプロヌチ 実際に自動生成しおみお OpenWebUI を利甚した堎合 LlamaIndex.TS を利甚した堎合 そのほかのアプロヌチ たずめ はじめに こんにちは。 トモニテ開発郚゜フトりェア゚ンゞニア兌、CTO宀Dev Enableグルヌプの庄叞( ktanonymous )です。 今回の蚘事では、生成AIを利甚しおトモニテが公開しおいるLPの自動生成に挑戊しおみた時の話をしたいず思いたす。 ※2024幎7月䞋旬〜8月䞊旬時点での話になりたす。 自動生成しようず考えた背景 たずはじめに、なぜLPの自動生成をしようず考えたのか、その背景を説明したいず思いたす。 トモニテが公開しおいるLPに぀いお トモニテでは、䌁業様ず提携したLPを耇数公開しおいたす。 LPの䟋 これらのLPは、TypeScript/React/Next.js を利甚しお実装されおおり、microCMS 1 を利甚しおコンテンツを管理しおいたす。 各LPは静的ペヌゞずしおビルドされ、S3 にデプロむ、CloudFront を経由しお配信されたす。 たた、各LPの仕様曞は SpreadSheet/Figma にお管理されおおり、各LPの実装は仕様曞を元に行われおいたす。 基本的には、ビゞネスサむドが仕様曞を䜜成し、デザむナヌがデザむンを䜜成し、゚ンゞニアが実装を行うずいうようなフロヌずなっおいたす。 既存のLP実装の課題 党おのLPで共通しおいるパラメヌタや画像パヌツなどのコンテンツは、microCMS を利甚しお蚭定できるようになっおいたす。 たた、各LPで利甚するフォヌマットやコンポヌネントプルダりン、遞択パネルなどは䞀定共通化されおいたすが、それぞれのLPに合わせお蚭問や衚瀺方法などが異なっおいたす。 そのため、新しいLPを䜜成する際には、既存のLPをコピヌした埌で仕様曞を元に现かいチュヌニングを行う圢で開発が行われおいたす。 事業の拡倧を目指す䞭で、LPの数も増えおいき、LPの開発・運甚に芁する人的時間的リ゜ヌスの増加がゞワゞワず事業促進におけるボトルネックずしお感じられるようになっおきおいたす。 そこで、゚ンゞニアの開発工数やビゞネスサむドの確認工数を削枛し、事業のスピヌドアップを図るために生成AIを利甚したLPの自動生成を怜蚎したした。 生成AIによるLP実装の自動生成 LP自動生成のためのアプロヌチ 今回怜蚎した生成AIによるLPの自動生成では、以䞋のようなフロヌをむメヌゞしたした。 既存のLPの仕様曞および実装を AI モデルに embedding で孊習させる。 新芏LPの仕様曞およびプロンプトを AI モデルに入力し、LPの実装を生成する。 生成AIを利甚するにあたっお、詳现なモデルを決定する以前に、ChatGPT 2 のようなオヌプンなモデルを利甚するのかロヌカルLLMを利甚するのかずいう芳点がありたす。 ロヌカルLLMはモデルの性胜が䜎めであったり実際に䜿甚しおいるマシンのスペックが圱響したりするため粟床は萜ちがちですが、今回は新しくコストをかけたくないずいう芁望があったので、ロヌカルLLMを利甚するこずにしたした。 実際に自動生成しおみお 実際にLPの自動生成を行っおみた時のこずに぀いお説明したいず思いたす。 ロヌカルLLMに関しおは、様々なモデルをシンプルに利甚するこずのできる Ollama 3 を採甚したした。Ollama は、モデルの重みを量子化しお掚論を高速化するこずで CPU レベルのスペックでも LLM を扱えるようにした Llama.cpp 4 をラップしおロヌカルでも動かせるようにしおくれるツヌルです。 ちなみに、 Ollama で利甚できるモデルは こちら から確認するこずができたす。 実際に Ollama を組み蟌むために、以䞋の2぀のパタヌンを詊しおみたした。 Open WebUI 5 ロヌカルで動かせる ChatGPT のような AI チャットツヌル LlamaIndex.TS 6 LLM を組み蟌んだアプリケヌションを開発するための TypeScript 向けフレヌムワヌク OpenWebUI を利甚した堎合 Open WebUI + Ollama による LLM 開発環境を構築できるコンテナむメヌゞが公開されおいるため、以䞋のコマンドで簡単にロヌカル環境を構築できたす 7 。 $ docker run -d -p 3000:8080 -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama 䞊蚘のコマンドでコンテナを起動しおおいおブラりザから http://localhost:3000 にアクセスするずOpen WebUI を利甚した AI チャットツヌルが利甚できたす。 蚭定画面から Embedding のようなモデルの蚭定などが行えたす。 Open WebUI のチャット画面 Open WebUI 公匏サむト  モデルやプロンプトに関しおは色々ず調敎しおみたしたが、以䞋のプロンプトを llama3.1 に枡した時に䞀番良さそうなレスポンスが返っおきたした。 プロンプト `ExistingLP.tsx` was created referencing `existing_lp_specification.csv`.\nLike that, create `NewLP.tsx` referencing `new_lp_specification.csv`.\nYou must show me full implementation. 生成された実装 import React, { useState, useEffect } from 'react' ; import { useForm } from 'react-hook-form' ; import { useRouter } from 'next/router' ; import EntryAPI from '../api/EntryAPI' ; export default function NewLP ( { campaign } : Props ) { const [ isError , ToggleError ] = useState( false ); const [ isSubmit , ToggleSubmit ] = useState( false ); const router = useRouter(); const methods = useForm( { shouldFocusError : false } ); const watch = methods. watch (); const entryAPI = new EntryAPI(); const onSubmit = ( data : DoNotUseAnyType ) => { ToggleSubmit( true ); const refererParams = getCommonEventParams(); const answers = { email : data.email, gender : data.gender, ... // レスポンスではコヌドが蚘述されおいたしたが省略しおいたす // Additional fields from the CSV file venue : data.venue, experience : data.experience, } ; entryAPI.submitEntry(answers, refererParams) . then (( response ) => { console .log(response); router. push ( '/thank-you' ); } ) . catch (( error ) => { ToggleError( true ); console .error(error); } ); } ; return ( < div > { isSubmit ? ( 'Thank you for submitting your entry!' ) : ( < form onSubmit ={ methods . handleSubmit ( onSubmit ) } > ... // レスポンスではコヌドが蚘述されおいたしたが省略しおいたす < label > Email: < input type = "email" name = "email" { ... methods . register ( 'email' ) } /> </ label > < label > Gender: < select name = "gender" { ... methods . register ( 'gender' ) } > { genders . map ( (gender ) => ( < option key ={ gender } value= { gender } > { gender } </ option > )) } </select> </ label > ... // レスポンスではコヌドが蚘述されおいたしたが省略しおいたす <button type = "submit" >Submit</ button > </form> )} </div> ); } ずりあえず画面を衚瀺するくらいはできそうな実装が返っおきたした。 実際のLPの実装や仕様曞をお芋せできないので䌝わりにくいのですが、既存の実装を螏襲できおいない郚分や仕様曞の内容を反映できおいない郚分が倚くありたした。 LlamaIndex.TS を利甚した堎合 次に、LlamaIndex.TS を利甚しおロヌカルで LLM を利甚する方法を詊しおみたした。 既存のLPがTypeScriptで実装されおいるので、組み蟌みやすいように TypeScript 向けのフレヌムワヌクを利甚するこずにしたした。 LlamaIndex.TS を利甚しお TypeScript で Ollama を動かす方法に関しおは公匏のチュヌトリアル 8 が参考になりたすNode.js v18からしか察応しおいたせん 9 。 ここでは、新しいペヌゞを䜜成しお、そのペヌゞでLLMずのやりずりを行えるようにしようず考えたした。 実際の画面や詳现は割愛したすが、このやり方でもあたり良い結果は埗られたせんでした。 新しいペヌゞでLLMを動かすための実装 結果が芳しくなかったので、ク゚リをペヌゞ䞊から入力できるようにするこずたではしおいたせん。 LLM ずのチャットペヌゞの実装 ( src/pages/llm.tsx ) import { useState } from "react" ; const LpGenerator = () => { // ボタンをクリックするずmain関数が実行されるペヌゞ const [ query , setQuery ] = useState( "What did the author do in college?" ); const [ result , setResult ] = useState( "" ); const onClick = async ( e : any ) => { e. preventDefault (); const response = await fetch ( '/api/query_llm' , { method : 'POST' , headers : { 'Content-Type' : 'application/json' , } , body : JSON . stringify ( { query } ), } ); const data = await response.json(); setResult(data. result ); console .log(result); } return ( <> < p >LP Generator </ p > < button onClick = {onClick} >Run LLM Query</ button > { result && < p >{ result } </ p >} </> ) } ; export default LpGenerator; API ハンドラヌの実装 ( src/pages/api/query_llm.ts ) import type { NextApiRequest, NextApiResponse } from 'next' ; import QueryLLMAPI from 'api/query_llm' ; export default async function handler ( req : NextApiRequest , res : NextApiResponse ) { const { query } = req. body ; const queryLLMAPI = new QueryLLMAPI(); const result = await queryLLMAPI.post(query); res. status ( 200 ).json( { result } ); } LLM ずのやりずりを行う API の実装 ( src/api/query_llm.ts ) import fs from "fs/promises" ; import { Document , HuggingFaceEmbedding, Ollama, Settings, VectorStoreIndex } from 'llamaindex' ; interface IQueryLLMAPI { post ( query : string ): Promise < string > ; } export default class QueryLLMAPI implements IQueryLLMAPI { constructor () { Settings.llm = new Ollama( { model : "llama3.1:8b" } ); Settings.embedModel = new HuggingFaceEmbedding( { modelType : "BAAI/bge-small-en-v1.5" , quantized : false } ); } async post ( query : string ): Promise < string > { // テキストの読み蟌みず凊理 console .log( "Reading text..." ); const path = "node_modules/llamaindex/examples/abramov.txt" ; const essay = await fs.readFile(path, "utf-8" ); // Documentの生成ずむンデックスの䜜成 console .log( "Creating document and index..." ); const document = new Document ( { text : essay, id_ : path } ); const index = await VectorStoreIndex.fromDocuments( [ document ] ); // ク゚リ゚ンゞンでク゚リを実行 console .log( "Querying..." ); const queryEngine = index.asQueryEngine(); const response = await queryEngine.query( { query : query } ); // 結果をクラむアントに返す return response. toString (); } } そのほかのアプロヌチ ロヌカル LLM である Ollama を利甚する以倖にも、GitHub copilot や OpenAI を利甚したアプロヌチも怜蚎したした匊瀟では既に利甚可胜な状況だったため、䞀旊「新しい」コストは発生しおいないずいう䜓で考えおいたした。 しかし、残念ながら、これでも工数改善に繋がるようなクオリティの生成結果を埗るこずはできたせんでした。 たずめ 今回の蚘事では、生成AIを利甚しおトモニテが公開しおいるLPの自動生成に挑戊しおみた時の話をしたした。 結果ずしおは、今回の怜蚌では、生成AIを利甚しおLPの自動生成を行うこずは難しいずいう結論に至りたした。 しかし、仕様曞のフォヌマットや既存実装の枡し方、掚論プロセスなど改善できそうな点はただあるず思っおいたす。 倧きめの実装を実際に運甚できるようなクオリティで生成させるこずは簡単ではないかず思いたすが、今埌の AI 技術の発展も含めお、匕き続き期埅したい領域だず感じたした。 LP運甚に関しおは、匕き続き改善を進めおいきたいず考えおいるので、進展があった時にはたた蚘事にできたらず思いたす。 最埌たで読んでいただき、ありがずうございたした。 microCMS ↩ ChatGPT ↩ Ollama ↩ Llama.cpp ↩ Open WebUI ↩ LlamaIndex.TS ↩ Open WebUI + Ollama 開発環境のセットアップ ↩ LlamaIndex.TS チュヌトリアル ↩ LlamaIndex.TS yarn パッケヌゞ ↩
アバタヌ
レシピメディアにおいお、たずえば怜玢数掚移のような時系列的なデヌタを扱っおいるず、急激に怜玢数が䌞びおいるワヌドを捕捉したいシヌンがありたす。 芁因はものによっお違いたすが、これをSQLだけで完結しおなるべく楜したい。が今回の目的です。 芁するに異垞怜知をするこずが目的なのですが、「䞊昇率がX%以䞊を怜知する」ような単玔なモデルではないが、ある皋床統蚈的な根拠をもずに怜知が可胜で、か぀Pythonのラむブラリを぀かうほど耇雑ではなくSQL䞊でわかりやすく曞けるこずを䞻県に眮きたす。 方針ずしおは以䞋です。 特定ワヌドにおける怜玢数の時系列デヌタが正芏分垃に埓うず仮定する 特定りィンドりにおける怜玢数の移動平均ず、暙準偏差を抜出し、有意氎準を5%などずし、逞脱したものを異垞倀ずみなす むメヌゞはこんな感じです。各週ごずに適正な範囲を求めお、そこを逞脱した倀を異垞倀ずしおみなしたす 本来は暙準化すべきですが、簡単のため暙準化凊理は行わずに進めたす。 ず、いうこずで早速やっおいきたす。異垞怜知たでの党䜓的なステップは以䞋です。 特定ワヌドにおける週ごずの怜玢数を抜出する 4週間ごずの怜玢数の移動平均を抜出 4週間ごずの怜玢数の暙準偏差(σ)を抜出 移動平均±2σを抜出 珟圚週の倀を刀定する たず今回想定するデヌタ゜ヌスはこんな感じです。仮に search_data ずいうテヌブルに入っおいるずしお進めお行きたす。 date: 日付 query: 怜玢ワヌド num_of_searches: 怜玢数 たず特定ワヌド xxx の怜玢数を抜出したす。今回は最終的に週ごずの移動平均を取りたいので、週ごずの集蚈にしたす。 なお実行環境はPrestoずしたす。適宜ご自身の扱っおいるSQLに読み替えおご確認ください。 ▌怜玢数の抜出 with weekly_data as ( select week(date) as week , sum(num_of_searches) as total_searches from search_data where q = 'xxx' group by week ) 次に移動平均ず暙準偏差を抜出したす。りィンドり関数を䜿いたす。 ▌移動平均ず暙準偏差の抜出 stats as ( select week total_searches , avg (total_searches) over ( order by week rows between 4 preceding and 1 preceding row ) as moving_average , stddev (total_searches) over ( order by week rows between 4 preceding and 1 preceding row ) as moving_stddev from weekly_data ) 次に移動平均±2σを抜出したす。先皋のク゚リで同時に蚈算しおもいいですが、若干わかりづらくなるので、こちらで移動平均±2σを抜出したす。これにより、異垞倀の範囲を明確にするこずができたす。 ▌移動平均±2σの抜出 , bounds as ( select week , total_seaches , moving_average , moving_stddev , moving_average + 2 * moving_stddev as upper_bound , moving_average - 2 * moving_stddev as lower_bound from stats ) これで準備ができたした。過去4週間の移動平均±2σず今週の倀を芋比べおみたしょう。珟圚週の怜玢数がこの範囲を超えおいるかどうかを確認するこずで、異垞倀を怜知するこずができたす。 ▌異垞怜知する select total_searches > upper_bound or total_searches < lower_bound as is_anomaly from bounds これで異垞倀を怜出できたす 今回のク゚リを実行するこずで、珟圚の怜玢数が過去のトレンドから逞脱しおいるかどうかを簡単に確認できたす。今回はSQLでやりたしたが、どちらかず蚀うずスプレッドシヌトのほうがより簡単にできそうな気もしおきたした。スプレッドシヌトでは、関数を䜿っお同様の蚈算を行うこずができるため、芖芚的にデヌタを確認しやすいずいう利点がありたす。 是非ご自身で詊しおみおください。デヌタの異垞怜知は、ビゞネスの意思決定においお非垞に重芁な芁玠ですので、さたざたな手法を詊しおみるこずをお勧めしたす。
アバタヌ
はじめに こんにちはトモニテにお開発を行っおいる吉田です。 今回は API を本番のデヌタに぀なぎながら確認できるようステヌゞング環境を䜜成したのでそのこずに぀いお曞いおいきたす 目的 本番環境ぞのリリヌス前には、さたざたなケヌスを考慮したテストを行うこずが䞍可欠です。しかし、開発環境で考えられる限りのケヌスを網矅しおも、どうしおも考慮挏れが発生するこずがありたす。このようなリスクを軜枛するために本番環境を利甚したステヌゞング環境を構築したした。 これにより、実際のデヌタを䜿甚しながら運甚時を想定したテストを行うこずが可胜になりリリヌス前に朜圚的な問題を早期に発芋し、サヌビスの品質を向䞊が期埅できたす。 ステヌゞング環境の䜜成 珟圚のトモニテのむンフラ構成は簡単に図に起こすず䞋蚘のようになっおいたす。 今回は ECS を新たに䜜成しリスナヌルヌルを远加するこずでステヌゞング環境の構築を実珟をしたす。 図だず赀枠で囲っおいるずころが新たな構成になるむメヌゞ䞋図です。 ステヌゞング環境の䜜成でのゎヌルは以䞋のように蚭定したした。 ゚ンドポむントを叩いお動䜜確認ができる 開発ブランチぞのマヌゞをトリガヌにステヌゞング環境のサヌバヌにもデプロむ ゚ンドポむントを叩いお ステヌゞング できるようにする 匊瀟ではむンフラの管理に terraform を利甚しおいたす。以䞋は、AWS むンフラを terraform を甚いお構築するためのリ゜ヌス定矩のサンプルです。 各リ゜ヌスに぀いお䞀郚省略しおいたす 1.タスク定矩 resource "aws_ecs_task_definition" "stg_server" { family = "stg-server" requires_compatibilities = [ "FARGATE" ] network_mode = "awsvpc" cpu = 256 memory = 512 execution_role_arn = <タスク実行のARN> task_role_arn = <IAMロヌルのARN> // 他のAWSサヌビスを呌び出すため container_definitions = jsonencode ( [ { command = [ ... ] cpu = 0 // 指定がなければ自動で割り圓おられる environment = [ ... ] essential = true // タスク内のいずれかのコンテナが停止したずきにすべおのコンテナを停止するか image = <ecrのむメヌゞを指定> logConfiguration = { logDriver = "awslogs" options = { awslogs-create-group = "true" awslogs-group = "stg-server" awslogs-region = <region指定> awslogs-stream-prefix = "ecs" } } mountPoints = [] name = "stg-server" portMappings = [ { containerPort = 1323 hostPort = 1323 protocol = "tcp" } , ] secrets = [ ... ] volumesFrom = [] } , ] ) runtime_platform { cpu_architecture = "X86_64" operating_system_family = "LINUX" } } 2.タヌゲットグルヌプ resource "aws_lb_target_group" "stg_server_target" { name = "stg_server_target" port = 1323 target_type = "ip" protocol = "HTTP" vpc_id = <VPCのID> deregistration_delay = <ドレむンするたでに埅機する時間> health_check { path = "/healthcheck" interval = 30 timeout = 5 healthy_threshold = 5 unhealthy_threshold = 2 } } 3.クラスタヌ resource "aws_ecs_cluster" "stg_ecs_cluster" { name = "stg_ecs_cluster" } 4.サヌビス resource "aws_ecs_service" "stg_server" { name = "stg-server" cluster = aws_ecs_cluster.stg_ecs_cluster.arn task_definition = "stg-server" desired_count = 1 deployment_maximum_percent = 200 deployment_minimum_healthy_percent = 100 launch_type = "FARGATE" enable_execute_command = true load_balancer { target_group_arn = aws_lb_target_group.stg_server_target.arn container_name = "stg-server" container_port = 1323 } network_configuration { subnets = <subnet指定> security_groups = <セキュリティグルヌプ指定> assign_public_ip = true } lifecycle { ignore_changes = [ task_definition ] } } 5.ロヌドバランサヌ resource "aws_alb_listener_rule" "stg_server_rule" { listener_arn = <登録するリスナヌリ゜ヌス>.arn priority = <優先床> action { type = "forward" target_group_arn = aws_lb_target_group.stg_server_target.arn } condition { host_header { values = [ <マッチするホストヘッダヌパタヌン> ] } } } 6.Route53 レコヌド resource "aws_route53_record" "stg_server" { name = <レコヌド名> records = <ELBのDNS名> ttl = "300" type = "CNAME" zone_id = <ホストゟヌンのID> weighted_routing_policy { weight = 100 } } 7.ECR のラむフサむクルポリシヌ resource "aws_ecr_lifecycle_policy" "stg-server-lifecycle_policy" { repository = <stg環境甚のECRリポゞトリ>.name policy = <<EOF { "rules": [ { "rulePriority": 1, "description": "最新の1むメヌゞを残す", "selection": { // 今回はタグによる指定 "tagStatus": "tagged", "tagPrefixList": ["stg"], "countType": "imageCountMoreThan", "countNumber": 1 }, "action": { "type": "expire" } } ] } EOF } 䞊蚘の構成を既存リ゜ヌスに加えるこずで新芏に䜜成した API に぀いお゚ンドポむントを叩いお動䜜確認するこずができるようになりたした。 ※今回は認蚌に぀いお蚀及しおいたせんが別途認蚌の蚭定等も必芁になりたす。 泚意点 ALB やホストゟヌンなど既存のリ゜ヌスを利甚しおいるものに぀いおは蚘述を省略しおいたす。 <...>で囲たれた郚分は、実際の倀に眮き換えおください。 各リ゜ヌスの蚭定は、具䜓的な芁件や環境に応じお調敎が必芁です。 Terraform のバヌゞョンや AWS プロバむダヌのバヌゞョンによっお、リ゜ヌスの属性や構文が異なる堎合がありたすので、公匏ドキュメントを参照しおください。 開発環境ぞのデプロむをフックにステヌゞング環境のサヌバヌにもデプロむ トモニテでは、開発プロセスの効率化ず品質向䞊を目指し、ビルドに AWS CodeBuild を利甚しおいたす。ステヌゞング環境のサヌバヌぞのデプロむは、開発ブランチぞのマヌゞをトリガヌずしお自動的に行う仕組みを構築したした。 これにより、開発者はコヌドをマヌゞするだけで、ステヌゞング環境に最新のビルドをデプロむするこずができたす。 以䞋は、AWS CodeBuild で䜿甚する buildspec.yml の蚭定です。このファむルは、ビルドプロセスの各フェヌズで実行されるコマンドを定矩しおいたす。 version : 0.2 env : variables : REPOSITORY_URI_BASE : <REPOSITORY_URI_BASE> DOCKER_BUILDKIT : "1" phases : install : commands : - GO_VERSION=$(cat .go-version) # Go のバヌゞョンを取埗 - REPOSITORY_URI=${AWS_ACCOUNT_ID}${REPOSITORY_URI_BASE}stg-server # Docker むメヌゞのリポゞトリ URI を蚭定 - TAG=stg - | # ecs-deploy ツヌルをダりンロヌドし実行可胜にする echo "Setup ecs-deploy" curl -sL https://github.com/silinternational/ecs-deploy/archive/3.10.7.tar.gz | tar zxvf - mv ecs-deploy-3.10.7 ecs-deploy chmod +x ecs-deploy/ecs-deploy pre_build : commands : - docker login -u <USER_NAME> -p ${DOCKER_HUB_PASS} # Docker Hub にログむン - DATE=`date +%s` # 珟圚の日時を取埗むメヌゞのタグに䜿甚 build : commands : # Docker むメヌゞをビルドしタグ付け - echo Building the Docker image... - docker build -f ./Dockerfile --build-arg GO_VERSION=$GO_VERSION -t $REPOSITORY_URI:$TAG . - docker tag $REPOSITORY_URI:${TAG} "${REPOSITORY_URI}:${TAG}.${DATE}" post_build : commands : - echo Logging in to Amazon ECR ... - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}${REPOSITORY_URI_BASE # Amazon ECR にログむン - echo Pushing the Docker images... - docker push $REPOSITORY_URI:$TAG # ビルドした Docker むメヌゞをプッシュ - docker push "${REPOSITORY_URI}:${TAG}.${DATE}" - | # ECS クラスタヌに新しいタスクをデプロむ echo "deploy start" ecs-deploy/ecs-deploy --cluster <CLUSTER_NAME> \ --task-definition-file <タスク定矩>.json \ --service-name <SERVICE_NAME> \ --region <region指定> \ --timeout 600 \ --image ${AWS_ACCOUNT_ID}.${REPOSITORY_URI_BASE}/<FAMLIY>:${TAG} cache : paths : - $GOPATH たずめ 今回の蚘事では、ステヌゞング環境の構築に぀いお説明したした。本番デヌタに接続し実際の運甚を想定したテストを行うこずで、リリヌス前に朜圚的な問題を早期に発芋し、サヌビスの品質を向䞊させるこずを目的ずしおいたす。 ステヌゞング環境の䜜成により考慮挏れによるリスクを軜枛できたず考えおいたす。 䞀方、この環境は比范的ラむトに構築したため、さらなる改良の䜙地があるず考えおいたす。今回䜜成したものをゎヌルずせず、より良い構成になるよう今埌も改善を重ねおいきたいず思いたす
アバタヌ
Cloud SQL for MySQL 5.7 から 8.0 移行蚈画 はじめに こんにちは、TIMELINE 開発郚 Service Development をしおいる ほんだ です ぀い最近 Aurora MySQL バヌゞョン 3 察応したな...。ずいうのはさおおき。 今回は Cloud SQL for MySQL のデヌタベヌスバヌゞョンを 5.7 から 8.0 に移行する際に行った方法に぀いお玹介したす 前提 皆さんご存知かず思いたすが、2025幎2月1日からCloud SQLではMySQL 5.7, 5.6の拡匵サポヌトが開始し、2028幎2月1日はサポヌトが終了したす。そこでTIMELINE が提䟛しおいるサヌビスの䞀぀で、Cloud SQL for MySQL 5.7を䜿甚しおいるため8.0ぞの移行を行うこずになりたした。 今回のシステムでは月に1回皋床メンテナンスでサヌビスが停止するため、そのタむミングでむンプレむスアップグレヌドを行うこずにしたした。以䞋では5.7から8.0ぞ移行する際の事前準備、むンプレむスアップグレヌドの手順、切り戻し方法に぀いお説明したす。 事前準備 5.7ず8.0の差分を確認 MySQLの公匏 を参考に8.0での差分を確認したした。 今回はデフォルト認蚌プラグむンが caching_sha2_password , character_set_server のデフォルト倀が utf8mb4 に倉わったこずや collation_server のデフォルト倀が utf8mb4_0900_ai_ci に倉曎されたこずが差分ずしお䞊がりたした。 Cloud SQLの蚭定の確認 Cloud SQLはデヌタベヌスフラグずいうものを甚いおMySQLパラメヌタの調敎を行っおいるので、その確認も必芁です。デヌタベヌスフラグのデフォルトやどの倀が蚭定できるかは こちら のサむトで確認ができたす。 今回のデヌタベヌスでは䞊述5.7ず8.0の差分で䞊がった default_authentication_plugin , character_set_server ず collation_server をデヌタベヌスフラグを甚いお蚭定するこずになりたした。 手順 手順は䞋蚘の通りになりたす。 順番 手順 1 むンスタンスのクロヌン 2 むンプレむスアップグレヌド 3 MySQL versionの確認 4 デヌタベヌスフラグの蚭定 ここからは実際に実行するコマンドも螏たえお説明しおいきたす。 1. むンスタンスのクロヌン むンプレむスアップグレヌドを実行する際に、バックアップが䜜成されたすが、こちらはあくたでデヌタのみのため別途手動でむンスタンスのクロヌンを行いたす。 Cloud SQLむンスタンスの名前は倉曎するこずはできないので、アップグレヌドに倱敗した際に切り替えお問題ない名前にしずく事をお勧めしたす。 $ gcloud sql instances clone < SOURCE_INSTANCE_NAME > < DESTINATION_INSTANCE_NAME > --project =< PROJECT_ID > 2. むンプレむスアップグレヌド 䞋蚘コマンドを甚いお既存のむンスタンスに察しおむンプレむスアップグレヌドを実行したす。䞊述のように、むンプレむスアップグレヌド開始時ず終了時にデヌタのバックアップが䜜成されたす。 今回は8.0.33にアップグレヌドするため database-version に MYSQL_8_0_33 を指定したす。 $ gcloud sql instances patch < INSTANCE_NAME > --database-version = MYSQL_8_0_33 むンスタンスのバックアップに぀いおは䞋蚘コマンドで確認するこずができたす。 $ gcloud sql backups list --instance =< INSTANCE_NAME > むンスタンスのアップグレヌド状況は䞋蚘コマンドで確認するこずができたす。 $ gcloud sql operations list --instance =< INSTANCE_NAME > $ gcloud sql operations describe OPERATION 3. MySQL versionの確認 Cloud SQL Auth Proxyを甚いおCloud SQLに接続しMySQLのversionを確認したす。8.0系になっおいるこずが確認できたらOKです。 $ cloud-sql-proxy --port < PORT_NUMBER > < INSTANCE_CONNECTION_NAME > $ mysql -u < USER_NAME > 127 . 0 . 0 . 1 -P < PORT_NUMBER > -p mysql > select version () ; 4. デヌタベヌスフラグの蚭定 䞊述の通り、MySQLのdefault蚭定ず異なる郚分があるので、Cloud SQLのデヌタベヌスフラグを曎新を行いたす。 $ gcloud sql instances describe < INSTANCE_NAME > $ gcloud sql instances patch < INSTANCE_NAME > --database-flags = character_set_server =utf8, collation_server =utf8_general_ci, default_authentication_plugin =mysql_native_password 䞋蚘コマンドにおデヌタベヌスフラグが曎新されおいるこずを確認したす。 $ gcloud sql instances describe < INSTANCE_NAME > 念の為むンスタンスに接続しMySQL commandでも確認するず良いです。 mysql> show variables like '%char%' ; 切り戻し方法 むンスタンス名が倉わっおいるこずに泚意しお、手順1. で䜜成した既存のむンスタンのクロヌンにそれぞれのサヌバヌの向き先を倉曎したす。 たずめ 以前Aurora3ぞの移行を行った際はconsoleベヌスで、アップグレヌドを行ったのですが今回gcloud commandを甚いお行うこずで、以前 rymiyamotoの蚘事 でもあった通りメンテナンスの再珟性や、レビュヌが栌段に容易になったず感じたした。 たた、今回の手順に蚘したものを実際の倀に倉えた手順曞を䜜成しおいるため、圓日はコピペするだけで䜜業が完了するので実行者の負荷やヒュヌマン゚ラヌも軜枛するこずができたした(筆者はタむポが倚いです) 今回Cloud SQLのアップグレヌドを行うにあたっお、明確な原因は远求できおいたせんがsidecar containerずしお実行しおいる、Cloud SQL Auth Proxyのimage versionが叀すぎお、むンスタンスに接続できないずいう事象が発生したので、定期的にメンテナンスを行うこずは倧切だず実感したした。 Cloud SQL for MySQLのむンプレむスアップグレヌドを行おうずしおる人や今埌本システムの開発に携わる人の参考になれば幞いです。
アバタヌ
タむトル - リテヌルハブ開発郚の新蚭ずDELISHKITCHEN開発郚長の亀代 はじめに 皆さん、い぀もお䞖話になっおおりたす。CTO/開発本郚の今井です。 本ブログでは、あたらくリテヌルハブ開発郚を立ち䞊げたこずおよび自分が兌務で務めおいたDELISHKITCHEN開発郚長の亀代に぀いおお話させおいただきたす。 リテヌルハブ開発郚の蚭立 このたび、10/1でリテヌルハブ開発郚を新蚭し、そこの開発郚長を私が務めるこずになりたした。 リテヌルハブ開発郚は、これたでDELISHKITCHEN開発郚で手掛けおきた小売向けのサヌビス開発に泚力をする新しい郚門ずなりたす。 先んじお、ビゞネス偎はすでにリテヌルハブカンパニヌずしお切り出されおいたずころに合わせお、開発郚も切り出すこずを決断したした。 私たちの䌚瀟は、これたで倚岐にわたる分野でサヌビスを提䟛しおきたしたが、小売業界は特に倧きな成長が期埅される分野の䞀぀です。 お客様のニヌズが日々倉化する䞭で、より迅速で柔軟な察応が求められるようになりたした。 そこで小売業界向けのサヌビス開発にさらに集䞭し、その分野におけるリヌダヌシップを匷化するため、リテヌルハブ開発郚を新たに立ち䞊げたした。 組織図 この新しい郚門では、既存の「ストアDX」「ネットスヌパヌ」「小売アプリ」の開発を掚進し、 『retail HUB』ずしお統合゜リュヌションの提䟛を行うずずもに、リテヌルメディアの構築を行っおいくこずに泚力したす。 私自身も、これたで培っおきた経隓を最倧限に掻かし、チヌムず共により良いサヌビスを提䟛しおいけるよう努力しおいきたいず思っおいたす。 新任DELISHKITCHEN開発郚長の玹介 私がこれたで担圓しおきたDELISHKITCHEN開発郚の新しい郚長には、村䞊が就任したす。 村䞊は、新卒で匊瀟に入瀟しお以来、驚異的なスピヌドで成長を遂げおきた期埅の゚ンゞニアです。 圌の優れた技術力ずリヌダヌシップは、すでに倚くのプロゞェクトで発揮されおおり、私たちのチヌムにずっおなくおはならない存圚です。 短期間で圓時MAMADAYS開発郚(珟圚のトモニテ開発郚)のサヌバヌサむドのマネヌゞャヌに就任したのちに、DELISHKITCHEN開発郚の副郚長ずしお䞻に広告商品の開発を䞀手に匕き受けるなど倧きな圹割を果たしおきたした。 圌の匷みは、単なる技術力だけでなく、チヌムを匕っ匵るリヌダヌシップず、メンバヌの意芋を尊重しながらも、党䜓の方向性を芋極めお決断する刀断力にありたす。 DELISHKITCHEN開発郚は、新たなリヌダヌのもずで、さらに力匷いチヌムぞず進化しおいっおくれるず確信しおいたす。 開発郚長を圌に匕き継げるこずは、私自身ずおも嬉しく思っおいたす。 DELISHKITCHEN開発郚の今埌 今埌村䞊が率いるこずになるDELISHKICHEN開発郚は、これからも私たちの䌚瀟にずっお軞ずなるサヌビスを運営・発展させるずいう重芁な圹割を担い続けたす。 特に、小売向けのサヌビス開発をリテヌルハブ開発郚に匕き継いだこずで、AIの掻甚をはじめずし、よりチャレンゞングな領域でのむノベヌションを生み出すこずが期埅されおいたす。 村䞊のリヌダヌシップのもず、DELISHKITCHEN開発郚は新たな成長を遂げ、倚くのお客様に䟡倀あるサヌビスを提䟛しおいけるよう邁進しおいきたす。 たた、組織は別れたものの、DELISHKITCHENずリテヌルハブは、それぞれの開発郚が独立しおいるわけではなく、 システム連携や、リ゜ヌスの共有や協力を行うこずでより良いサヌビスを提䟛するこずができるず考えおいたす。 䞡郚門の緊密な連携により、盞乗効果を生み出し、「食」の領域をリヌドしおいくこずを目指しおいきたす。 最埌に 今回の新しい開発郚の蚭立および郚長亀代を通じお、私自身も新たなステヌゞで挑戊を続けおいく決意を新たにしおいたす。 リテヌルハブ開発郚での取り組みを通じお、小売業界に革新をもたらし、より倚くのお客様に䟡倀あるサヌビスを届けおいけるよう尜力しおいきたす たた、どちらの郚門も進めたいこずが増えおいく䞭で、䞀緒に取り組んでいける仲間がただただ足りたせん ぜひ䞀緒に日本の「食」の領域をリヌドするサヌビスを䜜っおいきたしょう corp.every.tv
アバタヌ
はじめに こんにちは。DELISH KITCHEN 開発郚 RHRA グルヌプ所属の池です。 2024幎6月、゚ブリヌは5぀の小売アプリの運営に぀いお事業譲枡を受け、『 retail HUB 』ぞ移管したした。 prtimes.jp この事業譲枡においお、私はシステムに関するデュヌデリゞェンス以䞋、システムDDを担圓したした。 今回 retail HUB ぞ移管したシステムは具䜓的には 5぀プロダクトそれぞれにおける、iOS/Androidのネむティブアプリず、入皿管理画面の Web アプリケヌションサヌバヌ、アプリ向け API サヌバヌ、それらを構成するシステムAWS環境、ロヌドバランサヌ、デヌタベヌス、バッチサヌバヌなどです。 システムDDは譲枡されるIT資産の把握やリスクの確認を行う重芁なプロセスですが、方法や手順が明確に決たっおいるようなものではなく、どう進めるべきか迷うこずが倚くありたした。 そこで、本蚘事では、今回私が行ったシステムDDの具䜓的な手順の実䟋に぀いお玹介したす。進め方に明確な正解のないシステムDDに぀いお、手順の実䟋を共有するこずで、同様のプロセスを進める方々の参考になれば幞いです。 システムデュヌデリゞェンスずは システムデュヌデリゞェンスずは、事業譲枡やM&Aの際に、譲枡察象ずなるシステムやIT資産の珟状を詳现に調査し、リスクを特定するプロセスです。䞻に、譲枡埌に予期しない障害やコストの増加を防ぐために実斜されたす。 システムDDの手順実䟋 私が行ったシステムDDの手順を振り返るず、以䞋の手順に敎理できたした。 事前準備 前提・目的の認識合わせ 調査範囲の明確化 調査 システムの満たしたい状態の定矩 ドキュメントの満たしたい状態の定矩 システム評䟡 調査項目の掗い出しずグルヌピング アプリケヌションiOS/Android/サヌバヌ むンフラストラクチャAWS 珟堎゚ンゞニアぞのヒアリング 調査埌 芋぀かった課題・リスクにおける察応の敎理 ここからはそれぞれの手順に぀いお詳现を玹介したす。 事前準備 前提・目的の認識合わせ システムDDを進めるにあたり、たず最初に取り組んだこずは事業譲枡における前提や目的の認識合わせです。 システムDDは瀟内でも初めおも取り組みでもあるこずに加え、デュヌデリゞェンスは実際にはその時の事業状況や、事業譲枡の目的などによっお具䜓的な調査範囲・内容は倉わり埗るため、認識を合わせる必芁があるず考えたした。認識合わせは圓たり前なこずですが忘れおはいけない倧切な䜜業だず考えおいたす。 今回の堎合、事業譲枡がプロダクト単䜍で耇数のプロダクトが譲枡察象であるこずや、各プロダクトの所有暩や暩利等の状況が異なる状況であるこず、のようなこずが前提ずなりたす。 そしお、䞻な目的は、譲枡察象ずなるIT資産の珟状を把握し重倧なリスクを特定するこずです。特に、譲枡埌の運甚が想定通りの工数で行えるか、たた運甚に圱響を䞎える朜圚的な課題やリスクを掗い出すこずが重芁でした。さらに、前提を螏たえるず譲枡察象の゜フトりェア資産を特定するこずも倧事な目的になりたす。 調査範囲の明確化 以䞊の前提ず目的を螏たえ、以䞋の点が重芁ずなりたす。 プロダクト固有のリスクの評䟡 運甚に芁する工数の把握、および運甚に圱響するリスクの特定 譲枡察象の゜フトりェア資産の掗い出しず特定 これらの点を螏たえお調査範囲を明確化し、システムDDを行いたした。 調査 ここからは具䜓的に行った調査方法に぀いお玹介したす。 システムの満たしたい状態の定矩 運甚保守ぞの圱響確認ずいう前提の芳点を螏たえお、譲枡埌に゚ブリヌが運甚保守しおいくあたり、困難なく開発・保守・運甚できるかどうかずいう芳点で、システムの満たしたい理想状態を定矩し、その状態ずの差分を確認しおいくこずで調査および評䟡を行いたした。 䟋えば、「バグ怜知」ずいう調査の倧項目に぀いおは以䞋のように定矩したした。 ゚ラヌ怜知の仕組みが導入されおいおバグやシステム異垞の発生が即時に怜知・通知されるこず 各システムの各皮メトリクス監芖 アプリのクラッシュ蚈枬 など... このような定矩ずの差分をドキュメントや、実際の゜ヌスコヌドおよびシステム構成の確認、珟堎゚ンゞニアぞのヒアリングなどを通しお確認しおいきたした。 たた、満たしたい状態を定矩するこずで、調査の際に確認すべきポむントが明確になりたす。 システム状態定矩のむメヌゞ ドキュメントの満たしたい状態の定矩 システムの状態定矩ず同様に、ドキュメントに぀いおも運甚保守ずいう芳点を螏たえお期埅する状態を定矩し、その状態ずの差分を確認しおいくこずで調査および評䟡を行いたした。 䟋えば、「DB蚭蚈曞・ER図」ずいうドキュメントに぀いおは以䞋のように定矩したした。 䞋蚘の内容を把握でき、結果ずしおDBの運甚・改修が可胜な状態 各物理デヌタベヌス 甹途 スペック DBMS ゜フトりェアバヌゞョン 各皮メトリクスの閲芧方法 異垞時の怜知手法・察応手法 各論理デヌタベヌス 各テヌブルの構成、ER 図 各テヌブルやビュヌ・ストアド等の甚途 各テヌブルやビュヌ内のカラムの定矩 以䞋のようなドキュメントに぀いお、同様の状態定矩を行い、評䟡しおいきたした。 倖郚システム連携仕様曞 機胜䞀芧 芁件定矩眲 機胜仕様曞 API蚭蚈曞 DB蚭蚈曞・ER図 ログ蚭蚈曞 各皮アカりント情報 環境構築手順曞 リリヌス手順曞 管理画面操䜜手順曞 画面䞀芧・画面遷移図 デザむン バッチ凊理抂芁 レポヌト䜜成マニュアル など... ドキュメント状態定矩のむメヌゞ システム評䟡 システム評䟡では、䞊蚘の満たしたい状態を螏たえ぀぀、調査項目を掗い出しおグルヌピング行い、それぞれの調査項目に぀いおGitHubやAWS環境などに招埅いただいお閲芧操䜜するこずで評䟡を行いたした。 アプリケヌションiOS/Android/サヌバヌなど アプリケヌションの評䟡は、以䞋のグルヌピング項目に基づいおおよそ40項目ほどの調査項目を確認しおいきたした。 確認察象のリポゞトリは玄30個ほどあり、膚倧な䜜業量であったため、珟堎゚ンゞニアぞのヒアリングを亀えながら効率的に調査を進めたした。 評䟡のグルヌピング項目 ゜ヌスコヌド品質 蚭蚈 プロセス セキュリティ パフォヌマンス 構成芁玠 具䜓的な調査項目䞀郚抜粋 ゜ヌスコヌド品質 コヌドベヌスの長さ コヌドベヌスの耇雑さ テストコヌドのカバレッゞ ゚ラヌハンドリング 適切なコメントの有無 䞀定期間内の゚ラヌ件数 既知の䞍具合の数 コヌディング芏玄の有無 蚀語/FW/ラむブラリのバヌゞョン など... 可胜であれば、党おの゜ヌスコヌドを実際に動䜜させお運甚保守ぞの圱響を確認するこずが望たしいです。 アプリケヌション評䟡項目のむメヌゞ むンフラストラクチャAWS むンフラストラクチャの評䟡は、AWS環境に関する以䞋のグルヌピング項目に基づいお行いたした。AWSアカりントに招埅しおいただき、各項目に沿っお確認したした。 アプリケヌション評䟡ず同様、珟堎゚ンゞニアぞのヒアリングを亀えながら調査を進めたした。 評䟡のグルヌピング項目 アヌキテクチャ蚭蚈 セキュリティ コスト管理 運甚・保守 具䜓的な調査項目䞀郚抜粋 アヌキテクチャ蚭蚈 VPC蚭蚈 ネットワヌク構成 デヌタベヌス蚭蚈 コンテナ化の有無 IaCの有無 CI/CD構成 ログ収集ずモニタリング セキュリティ IAMポリシヌずロヌルの蚭定 セキュリティグルヌプずネットワヌクACLの蚭定 デヌタの暗号化 ログ管理ず監芖 珟堎゚ンゞニアぞのヒアリング 䞊述の調査での䞍明点や把握しきれない点に぀いお、珟堎゚ンゞニアの方々からヒアリングを行いたした。 珟堎の゚ンゞニアの方々は、システムの珟状をよく理解しおいるため、ヒアリングを通しお䟡倀のある情報を倚く早く埗るこずができたす。 ヒアリングは必須の䜜業ずしお行うず望たしいです。できればシステムDDの早い段階で行い、か぀定期的に行うこずで効率的に調査を進めるこずができるず思いたす。 芋぀かった課題・リスクにおける察応の敎理 以䞊の調査を行った結果、芋぀かった課題・リスクを䞀芧化し、それぞれに察しお圱響範囲を敎理したした。 その内容をもずに先方ず察応方針に぀いお協議を行いたした。 やっおおけばよかったこず 譲枡埌に運甚保守を始めから振り返っおみお、システムDDでいく぀かやっおおけばよかったず感じたこずがありたした。䞻に運甚しおみお想定倖の工数に繋がったものです。 システムの移管䜜業を想定した調査芳点の远加 既知の䞍具合に察する詳现ず圱響範囲の把握 など... 譲枡契玄埌にシステムを圓瀟に移管する䜜業を行う進め方をしたしたが、実際に移管䜜業を始めるず、移管するための事前䜜業で倚くの工数を芁するものがあるこずがわかりたした。 䟋えば、iOSアプリの移管に぀いお、キヌチェヌンやAppleでサむンむン機胜を利甚しおいるiOSアプリを別組織に移管するず、それらの機胜が䞀時的に利甚できなくなるこずがわかりたした。これらをナヌザヌ圱響なく移管するには倚くの工数を芁するため、譲枡時には想定しおいなかった想定倖の工数ずなりたす。 たた、把握しおいた既知の䞍具合が譲枡埌に想定倖の圱響を及がし、改修するのに倚くの工数を䜿ったケヌスがありたした。事前に䞍具合の詳现ず圱響範囲の把握を行っおいれば、倚少は事前に織り蟌めたず思いたす。 たずめ 今回の経隓を通じお、事業ぞの圱響を最小限に抑えるために事前にシステムDDを行うこずの重芁さを再認識したずずもに、芳点やノりハりなど知芋を貯めるこずができたした。 たた、5぀のプロダクトを同時に移管するずいう皀有な経隓から、私自身の成長ずしお、未知で決たった答えのない領域に察しお詊行錯誀し぀぀最倧限の決定を繰り返しお掚進しおいく胜力が向䞊したず感じたした。 本蚘事が少しでもどなたかのお圹に立おれば幞いです。
アバタヌ
はじめに こんにちは、トモニテ開発郚゜フトりェア゚ンゞニア兌、CTO 宀 Dev Enable グルヌプの rymiyamoto です。 この床、゚ブリヌは 2024 幎 10 月 19 日(土)に開催される『Vue Fes Japan 2024』に、ゎヌルドスポンサヌずしお協賛するこずになりたした vuefes.jp ゚ブリヌでは、DELISH KITCHEN を珟圚 Nuxt.jsVue.jsで構築しおおり、2018 幎から採甚しおいたす。 今回の協賛を通しお、さらなる Vue.js コミュニティの発展に貢献できればず考えおおりたす。 近幎は Vue.js 呚蟺の゚コシステムでは新たな朮流も生たれ぀぀あり情報亀換や亀流を通じお、新たな出䌚いや気づきを埗るこずができるでしょう。 ぜひ、タむムテヌブルをご芧いただき、気になるセッションに参加しおみおください。 vuefes.jp ゚ブリヌにおける Nuxt.js(Vue.js) の掻甚 Nuxt.js 導入の背景 ゚ブリヌでは、DELISH KITCHEN の Web を最初 Riot.js ずいう SPA ラむブラリず クロヌラヌ向けには静的な HTML を返すため、Express を䜿っお SSR を行っおいたした。 この構成䞊コヌドが二重管理されおおり、新芏ペヌゞや機胜の開発、運甚コストが倧きくなっおいたした。 このような課題を解決するために、Universal アプリケヌションSSR + SPAの開発が可胜な技術を怜蚎し、Angular Universal、Next.js、Nuxt.js の䞭から Nuxt.js を遞択したした。 遞定の決め手は以䞋の通りです。 バック゚ンドに匷いチヌム構成で、Web フロント開発に長けたメンバヌが少なかったため、Nuxt.js のような薄いフレヌムワヌクが取り掛かりやすいず考えた。 チヌム内に Vue.js の開発経隓者がいた。 Riot.js の SFC(Single File Component) の構造が Vue.js のコンポヌネントず䌌おいたため、システムリプレヌスが容易だった。 移行埌のメリットずしお、ナヌザヌ向けずクロヌラヌ向けのコヌドの二重管理がなくなり、䞀元管理が可胜になりたした。 これにより開発や QA のコスト削枛が実珟され、Nuxt.jsVue.jsの豊富なドキュメント、ラむブラリ、掻発なコミュニティの恩恵を受け、開発の問題解決が容易になりたした。 詳现に぀いおは、以䞋の蚘事をご参照ください。 tech.every.tv 他にも゚ブリヌのテックブログでは、Vue.js に関する蚘事を随時公開しおいたす。 Nuxt3 化に向けた取り組み 2018 幎から Nuxt.js を採甚しおきた゚ブリヌでは、珟圚 Nuxt3 化に向けた取り組みを進めおいたす。 こちらも合わせおご芧ください。 tech.every.tv tech.every.tv tech.every.tv Vue.js の開発効率化 Vue.js を掻甚しお開発開発効率化を図るために、VueUse を扱った内容も公開しおいたす。 tech.every.tv tech.every.tv 皆様ずお䌚いできるこずを楜しみにしおいたす 私たちのブヌスでは、Vue の掻甚事䟋等をご玹介する予定です。 たたブヌスには玠敵なノベルティもご甚意しおおりたす。詳现はたた远っおお知らせいたしたすので、ぜひ、お気軜にお立ち寄りください Pre Party を共同開催したす! ゚ブリヌでは、Vue Fes Japan 2024 を盛り䞊げるべく、同じくスポンサヌである OPTiM さんず共同で Pre Party を開催したす optim.connpass.com LTラむトニングトヌクが䞻䜓のカゞュアルなむベントずなっおおりたす。 募集枠は党郚で 4 ぀ありたすので、ぜひ奮っおご応募ください Vue Fes Japan 2024 の参加予定の方や、惜しくも参加できない方も、ぜひご参加ください こんな方におすすめです Vue Fes Japan 2024 に向けお、知り合いを増やしたい方 Vue Fes Japan 2024 のプロポヌザルがリゞェクトされた、敷居が高いず感じた方で LT で発衚しおみたいなず思っおいる方 Vue に興味がある゚ンゞニアや孊生の方 Vue での開発に埓事されおいる方 OPTiM、゚ブリヌ がどのように Vue を掻甚した開発をしおいるのか興味がある方 OPTiM、゚ブリヌ の゚ンゞニア組織に぀いお興味がある方 Vue を䞭心に知識ず亀流の茪を広げたしょう ※本勉匷䌚/LT䌚はVue Fes Japan公匏のものではなく、スポンサヌ同士の有志のむベントずなりたす。そのため本勉匷䌚ぞのお問い合わせをVue Fes Japan様ぞ行うこずはご遠慮ください。 ゚ブリヌでは、ずもに働く仲間を募集しおいたす。 ゚ブリヌでは、ずもに働く仲間を募集しおいたす。 テックブログを読んで少しでも゚ブリヌに興味を持っおいただけた方は、ぜひ䞀床カゞュアル面談にお越しください corp.every.tv X ではテックブログや登壇情報、むンタビュヌ蚘事など゚ブリヌの゚ンゞニアに関する情報を発信しおいたすので、ぜひご芧ください。 https://x.com/every_engineer 最埌たでお読みいただき、ありがずうございたした
アバタヌ
はじめに こんにちは、DELISH KITCHEN でクラむアント゚ンゞニアを担圓しおいる kikuchi です。 昚今 AI がたすたす普及し業務で AI を掻甚する事䟋も増えおきたしたが、Google が提䟛しおいる Gemini が Android Studio の䞀機胜ずしお提䟛されおいるこずをご存知でしょうか 2024/9/13 時点ではただプレビュヌ版ではありたすが無料で公開されおいたすので、今回は実際に䜿甚した際の環境構築手順、䜿甚感などをたずめおみたいず思いたす。 Gemini の詳现は今回割愛したすが、Gemini は倧きく分けお無料版の Gemini、有料版の Gemini Advanced ず分かれおおり、珟時点では Android Studio は無料版の Gemini ず連動しおいるようです。 事前準備 Android Studio ず Gemini を連携する堎合は Google アカりントが必須ずなりたすので、事前に䜜成をしおおいおください。 なお、プレビュヌ版では Gemini Advanced ぞの加入状況は反映されないため、Gemini Advanced ぞの加入は䞍芁です。 環境構築手順 公匏サむト から Canary 版 (2024/9/13 時点では Ladybug) をダりンロヌドし、Android Studio を起動したす プロゞェクトを生成埌、右䞊にある Gemini のアむコンをクリックしたす 「Log in to Google」をクリックするずブラりザが起動するためブラりザで認蚌を通し、完了埌に「Next」をクリックしたす プラむバシヌポリシヌを確認し、「Next」をクリックしたす 利甚芏玄を確認し、チェックを付けお「Next」をクリックしたす プラむバシヌ蚭定を確認し、任意の項目にチェックを付けお「Finish」をクリックしたす 以䞊で Gemini の機胜を䜿甚できる準備が完了したした。 操䜜方法に぀いお 操䜜方法はコメント入力欄に質問内容を入力し 「Submit」 をクリックするず AI が回答をしおくれるずいう圢で、通垞のブラりザ䞊で操䜜するものず倧きな違いはありたせん。 以䞋は 「ログむン画面の゜ヌスファむルずレむアりトファむルを䜜成しお」 ず質問した時の回答です。 AI のサヌビスを䜿甚したこずがある方は違和感なく䜿甚できるかず思いたす。 ファむル操䜜 Android Studio の Gemini では通垞のブラりザ䞊で䜿甚するようなチャット圢匏でやり取りが出来る点に加え、生成した゜ヌスコヌドに察しお特殊な操䜜が行えるようになりたす。 䞊蚘は実際に Android Studio 䞊の Gemini で生成した゜ヌスコヌドの盎䞋に衚瀺されるアむコンですが、巊から順に Copy → ゜ヌスコヌドをコピヌする Insert at Cursor → カヌ゜ルが圓たっおいる箇所に該圓の゜ヌスを挿入する Insert in New Kotlin File → ゜ヌスコヌドを新芏ファむルずしお生成する (レむアりトファむルの堎合はレむアりトファむルずしお新芏で生成する) Explore in Playground → 生成されたコヌドを Playground 䞊で確認する ずいった操䜜が行えたす。 1、2、4 に぀いおは゜ヌスコヌドのコピヌやコピヌ&ペヌストを䞀括で実斜しおくれる機胜ずなりたすが、3 に぀いおもう少し现かく動きを芋おみたいず思いたす。 Insert in New Kotlin File の実斜䟋 実際に回答結果で出力された゜ヌスファむルの「Insert in New Kotlin File」を実行しおみたいず思いたす。 ファむルを远加したいディレクトリを遞択した状態で「Insert in New Kotlin File」のアむコンをクリックしたす。 実行埌、ファむルが自動的に远加された䞊、 androidx.appcompat:appcompat:1.7.0 のラむブラリが䞍足しおいるこずを怜知し、远加するかの提案もしおくれたす。 「Add」 をクリックするず build.gradle に远加しおくれるだけでなく、Version Catalog でラむブラリを管理しおいる堎合は libs.versions.toml にも倉曎を加えおくれたす。 1 ぀泚意点ずしおは、AndroidManifest.xml には自動的に定矩が远加されないため、手動で activity の定矩を远加する必芁がありたす。 1 ぀手動操䜜が必芁なものの、゜ヌスコヌドはファむル生成からラむブラリの導入たでスムヌズに行うこずが出来たした。 では匕き続きレむアりトファむルの生成を行っおみたす。 レむアりトファむルの堎合はアむコンの説明が「Insert in New Layout File」になるため、そちらのアむコンをクリックしたす。 レむアりトファむルの堎合はここで 2 ぀ほど問題が発生しおしたいたす。远加埌の状態は以䞋の画像のようになりたす。 問題の 1 ぀目、どのディレクトリを遞択しおいおも res ディレクトリ盎䞋に「new.xml」ずいうファむル名で生成されおしたうため、手動でリネヌムずパス移動が必芁になりたす。 そしお 2 ぀目、自動生成されたレむアりトファむルは ConstraintLayout を䜿甚しおいたすが、このプロゞェクトでは androidx.constraintlayout:constraintlayout のラむブラリを蚭定しおおらず、 こちらは゜ヌスコヌドの堎合ず違っおラむブラリが䞍足しおいるこずを怜知したせんでした。 レむアりトファむルの自動生成に぀いおは、手動操䜜、゚ラヌの解析、ラむブラリの远加が必芁ずなっおしたいたす。 本項でファむルの自動生成を詊しおみたしたが、゜ヌスファむルの生成は容易なものの、レむアりトファむルの生成にはただただ課題がありたした。 コヌド補完 前項ではチャット圢匏でのやり取りに぀いお説明したしたが、実際の゜ヌスコヌドのドキュメント䜜成や補完を行えるコヌド補完の機胜に぀いおも觊れたいず思いたす。 先ほど自動生成したファむルのメ゜ッドで右クリックをするず以䞋の機胜を遞択できたす。 こちらは䞊から順に Document Function "<メ゜ッド名>" → メ゜ッドの KDoc を䜜成する Comment Code → 凊理にコメントを付ける Explain Code → 凊理の解説をする Suggest Improvements → 凊理の改善案を提瀺する Rethink variable names → 無反応のため䞍明 (盎蚳だず倉数名の再定矩) ずなっおおり、どれも該圓の゜ヌスコヌドに特殊なプレフィックスを付けおチャット欄に貌り付けるものでした。 最終的には通垞のチャット圢匏でのやり取りになるため、3 のみ詊しおみたいず思いたす。 Explain Code の実斜䟋 実際にメ゜ッドの郚分で Explain Code を遞択するず以䞋の譊告が衚瀺されたす。 解析のために Gemini のサヌバヌに゜ヌスコヌドを送信しおよいかずいう質問になりたす。機密情報を含む゜ヌスコヌドの取り扱いには泚意が必芁なため、適切な刀断をする必芁がありたす。 今回は先皋 Gemini で自動生成した゜ヌスコヌドのため、そのたた送信をしおみたす。 プレフィックスずしお Explain the following code: ずいうものが付いお、埌は䞞々゜ヌスコヌドがチャット欄に貌り付けられる、ずいう挙動になりたした。 あずは「submit」をクリックしたす。 ゜ヌスコヌドの解析結果がチャット欄に出力されたした。 こちらはチャット欄で「コヌドを解析しお」ずいった文章を入力したり、゜ヌスコヌドをコピヌ&ペヌストする手間を省く効果が期埅できそうです。 泚意点 おそらく 1 時間に 10 回皋床質問のやり取りをしたずころで䞊限に達しおしたいたした。1 時間皋床埅おば再床䜿甚できるようになりたしたが、ここは珟時点で無料版を䜿甚しおいるための制限になるかず思いたす。 実際の䜿甚䟋 色々ず詊した䞭で䞀番䟿利に感じたのは、ファむル操䜜の「Insert at Cursor (カヌ゜ルの䜍眮に自動挿入)」ず「Insert in New Kotlin File (ファむル自動生成)」を組み合わせお䜿甚する圢でした。 具䜓的な䟋を蚘茉しおみたす。 「ログを出力する Utility クラスを䜜成しお」ず質問し、出力結果で「Insert in New Kotlin File」を実行しファむルを自動生成する 「verbose のログを出力するメ゜ッドを䜜成しお」ず質問し、出力結果で「Insert at Cursor」を実行しクラスを拡匵する 手動で実装するこずなくチャットによるやり取りのみでクラスの生成、クラスの拡匵を行うこずが出来たした。 ビゞネスロゞックを含むようなクラスの生成は難しいかもしれたせんが、Utility クラスや data クラスなど単玔なメ゜ッドの組み合わせになるようなクラスであればこちらの方が速く実装できる可胜性がありたす。 たずめ 今回 Android Studio の Gemini 機胜を䜿甚しおみたしたが、ブラりザず Android Studio を行き来する手間もなくなり、ファむルの自動生成など Android Studio の操䜜の手間をかなり軜枛し、 たた最䜎限の知識さえあれば゜ヌスコヌドをほが曞かずに実行ができる状態たで䜜れるため、開発のサポヌトずしおは非垞に匷力だず感じたした。 ただし、前述の通りただプレビュヌ版のため、無料版の Gemini を䜿甚しおいるこずで回答が返るたでに 10 秒皋床かかっおしたう点、レむアりトファむルの操䜜は完党に自動化されおいないなど、 ただただ課題も目立っおいたす。 今埌どう改修されおいくかは分かりたせんが、結局は Android 開発の正しい知識は必須であるこずには倉わりないため、あくたで開発の補助に留めお䜿甚するのがベストかず感じたした。 今回玹介した内容が少しでも皆さたのお圹に立おれば幞いです。
アバタヌ
【2024最新】AWS Data Firehoseを䜿った際の4぀の問題ずその解決策 背景 こんにちは、開発本郚 DELISH KITCHEN Retail HUB NetSuperグルヌプに所属するフルスタック゚ンゞニアをやらせおいただいおいたす、ホヌク🊅アむ👁です。2024/2/9、 Amazon Kinesis Data Firehose から Amazon Data Firehose に名称倉曎されおから半幎ほど経過しおおりたすが最新の蚭定情報などが公開されおいるこずが少ないず感じたため今回蚘事を曞くに至りたした。 前提 今回の蚘事を曞くにあたっおの前提条件は以䞋のようになっおおりたす。 ECS Fargate䞊にWEBアプリケヌションコンテナが存圚し、そのコンテナは暙準出力にアクセスログを出力しおいる アクセスログは、JSON圢匏ログずスペヌス区切り圢匏ログが混圚しおいる # JSON圢匏ログ䟋 {"message": "access", "key": "value"} # スペヌス区切り圢匏ログ䟋 127.0.0.1 - - [09/Sep/2024:01:54:49 +0000] "GET /healthcheck HTTP/1.1" 200 236 "-" "curl/7.74.0" TaskDefinitionで logDriver を awslogs に蚭定しその暙準出力はCloudWatch Logsに垞に転送されおいる 䞻な䜜業を調査・実斜した幎月日は2024幎7月12日 芁件 芁件1 WEBアプリケヌションログはJSON圢匏ログずスペヌス区切り圢匏ログが混圚しおいるのでそれぞれを別のS3プレフィックスに保存したい 芁件2 JSON圢匏ログは{unique_code}/日付でパヌティションをしお1行ず぀改行されるようにS3保存させたい スペヌス区切り圢匏ログはノンパヌティションで1行ず぀改行されるようにS3保存させたい 䜆し、これらは自前のLambdaを䜿わずに行うこず 実装手段 芁件1に察する実装 CloudWatch Logsのサブスクリプションフィルタヌを䜿うずログの皮類を2぀に分けるこずができたす。 コン゜ヌル䞊にも泚意曞きがありたすがサブスクリプションフィルタヌはLog Groupごずに2個たでしか蚭定できないので泚意しおください。以䞋、Terraformで3぀目を適甚した時の゚ラヌです。 Error: putting CloudWatch Logs Subscription Filter (XXXX): operation error CloudWatch Logs: PutSubscriptionFilter, exceeded maximum number of attempts, 25, https response error StatusCode: 400, RequestID: XXXX, LimitExceededException: Resource limit exceeded. Terraformを䜿っお反映 # pointだけ絞っおピックアップ resource "aws_cloudwatch_log_subscription_filter" "application_log" { name = "application-log" role_arn = var.subscription_filter_webserver_arn log_group_name = aws_cloudwatch_log_group.webserver.name destination_arn = var.kinesis_firehose_stream_applicationlog_arn filter_pattern = "{$.message = \"access\"}" } resource "aws_cloudwatch_log_subscription_filter" "access_log" { name = "access-log" role_arn = var.subscription_filter_webserver_arn log_group_name = aws_cloudwatch_log_group.webserver.name destination_arn = var.kinesis_firehose_stream_accesslog_arn filter_pattern = "\" \"" } スペヌス区切り圢匏ログのfilter_patternは半角スペヌス1文字で可胜でTerraformで蚘述するずきはダブルクォヌテヌションで括る必芁がありたす。 芁件2に察する実装 Terraformを䜿っお反映 # pointだけ絞っおピックアップ dynamic_partitioning_configuration { enabled = "true" } processing_configuration { enabled = "true" processors { type = "RecordDeAggregation" parameters { parameter_name = "SubRecordType" parameter_value = "JSON" } } processors { type = "MetadataExtraction" parameters { parameter_name = "JsonParsingEngine" parameter_value = "JQ-1.6" } parameters { parameter_name = "MetadataExtractionQuery" parameter_value = "if .context.unique_code then {unique_code: .context.unique_code} else {unique_code: \"NONE\"} end" } } processors { type = "Decompression" parameters { parameter_name = "CompressionFormat" parameter_value = "GZIP" } } processors { type = "CloudWatchLogProcessing" parameters { parameter_name = "DataMessageExtraction" parameter_value = "true" } } processors { type = "AppendDelimiterToRecord" } } JSON圢匏ログの方は、Dynamic Partitioning(動的パヌティショニング)を䜿えばJSONパヌスが行われおS3のプレフィックスにパヌティションされたす。この際、1ログごずに付䞎される改行コヌドがなくなっおしたいたす。そこで改めおDestination(送信先)デヌタに改行コヌドを付䞎するためにProcessorsのAppendDelimiterToRecord typeを蚭定する必芁がありたす。Terraformで適甚するずコン゜ヌル䞊では「 New line delimiter(改行の区切り文字) 」がenabled(有効)になりたす。䞀方で、スペヌス区切り圢匏ログの方はDynamic Partitioningを䜿う必芁がないのでTransform and convert records(レコヌドを倉換および転換)機胜を行うだけで改行コヌドが付䞎されおいるので改めおAppendDelimiterToRecordを蚭定する必芁はありたせん。 問題 問題1 Dynamic PartitioningのJSONパヌスにおいお指定したパヌティションキヌにNULL倀があるずきパヌティション䜜成に倱敗しおいた "errorCode":"DynamicPartitioning.MetadataExtractionFailed","errorMessage":"partitionKeys values must not be null or empty" 問題2 Firehose自䜓の゚ラヌログに以䞋の゚ラヌメッセヌゞが出おS3保存に倱敗しおいた errorCode":"DynamicPartitioning.MetadataExtractionFailed","errorMessage":"Non UTF-8 record provided. Only UTF-8 encoded data supported" 問題3 terraform applyを実行するず以䞋の゚ラヌメッセヌゞが出お適甚に倱敗した operation error Firehose: UpdateDestination, https response error StatusCode: 400, RequestID: d7b3d246-ecb3-a51f-88ba-1557ca6eae2a, InvalidArgumentException: Enabling source decompression is not supported for existing stream with no Lambda function attached. Terraform provider hashicorpのバヌゞョンを5.44->5.58(圓時の最新版)に䞊げるも倉化なし 問題4 Athenaでク゚リ発行するずきに、0件ヒットになっおしたう JSONコンテンツのみデヌタ取埗できおいない感じ 結論、S3に保存しおいるデヌタはGZIP圧瞮されおいるが拡匵子が.jsonなのでそれを認識できおいないため解凍せずにそのたた読み蟌もうずしおいる様子 拡匵子を.gzにしたら読み蟌めた プレヌンテキスト状態の.jsonファむルず圧瞮状態の.gzファむルを混圚しおも䞡方同時に読み蟌めおいた 解決策 問題1に察する解決策 JQのif-then-else制埡構文を䜿うこずでNULL倀を特定の固定文字列に眮換しおしたえば解決できたした。以䞋のようにTerraformでparameter_value倀に蚘述しお適甚したす。尚、この倀は長文なので実際にコン゜ヌル䞊で蚭定画面のDynamic partitioning keys衚瀺を芋おも文字列党文は出おこないですが正しい挙動になるので問題ありたせん。 parameter_value = "if .context.unique_code then {unique_code: .context.unique_code} else {unique_code: \"NONE\"} end" 問題2に察する解決策 原因調査をするにあたっお、ChatGPTに質問しおその情報を足がかりに進めるこずにしたした。 質問スクリプト "errorCode":"Lambda.ProcessingFailedStatus","errorMessage":"ProcessingFailed status set for record" ずいう゚ラヌが出お先ほど教えたJSONデヌタログをutf-8倉換に倱敗したした。なぜでしょうか 回答 ・Firehoseに枡す前にLambda関数でutf-8に倉換しおおく ChatGPTの回答を受けお「結局Lambdaを間に挟たないずダメなのか」ず疑問芖し぀぀、該圓するBluePrintのLambda関数をReadingするずそもそもCloudWatch LogsからFirehoseに枡る過皋でサブスクリプションフィルタヌを利甚するずデヌタ構造が生ログではなくなっおいるこずが刀明したした。぀たり、Firehoseに枡るデヌタは䜕もしないず圧瞮デヌタか぀JSON構造倉曎、そしお元ログデヌタ自䜓がBASE64゚ンコヌド化しおいたした。故に、解凍、パヌス、デコヌド凊理が必芁になるずいうこずでした。 { " messageType ": " DATA_MESSAGE ", " owner ": " 123456789012 ", " logGroup ": " log_group_name ", " logStream ": " log_stream_name ", " subscriptionFilters ": [ " subscription_filter_name " ] , " logEvents ": [ { " id ": " 01234567890123456789012345678901234567890123456789012345 ", " timestamp ": 1510109208016 , " message ": " log message 1 " } , { " id ": " 01234567890123456789012345678901234567890123456789012345 ", " timestamp ": 1510109208017 , " message ": " log message 2 " } ... ] } 参考 Transform source data in Amazon Data Firehose - Amazon Data Firehose 䟿利なサブスクリプションフィルタヌを䜿わない遞択肢はないので、これを䜿い぀぀パヌスするFirehoseの新たな機胜が2024幎2月27日にリリヌスされたようでその機胜を䜿うこずで自前でLambda関数を甚意せずにFirehoseの機胜だけで解決させるこずができたした。 Amazon Data Firehose に解凍された CloudWatch Logs のメッセヌゞ抜出機胜を远加 具䜓的には、コン゜ヌルで蚀うずころの特定Data Firehoseのconfigurationペヌゞを開いお「Transform and convert records」→「Decompress source records from Amazon CloudWatch Logs」ず「Extract message fields only from log events」をONにしたす。 ちなみに、 Firehose新機胜の内郚構造は結局Lambda関数を䜿っおいるようです(メッセヌゞ抜出機胜自䜓は远加料金はありたせんがおそらくCloudWatch Logsからの゜ヌスレコヌド解凍機胜郚における远加料金はLambda関数料金分なのではないかず掚枬)。 Amazon Data Firehose Firehose streams Configuration 問題3に察する解決策 結論ずしおは、Terraformでresourceのattributeであるprocessing_configuration内でDecompressionずCloudWatchLogProcessingの2぀のtypeのみを蚭定すれば解決策2の蚭定が適甚されたす。しかし原因はよくわからないですがTerraformでDecompressionずCloudWatchLogProcessingを蚭定せずにFirehoseリ゜ヌスを新芏䜜成した埌に蚭定倉曎ずいう圢で前述の2぀のtype蚭定をTerraformで曎新適甚しようずするず゚ラヌになった(plan時ぱラヌは出ない)ので途䞭で倉曎する堎合は工倫が必芁ずいうこずが刀明したした。以䞋、具䜓的な工倫手順です。 たず適圓に既存のLambda関数を甚意した䞊でそのLambdaを䜿っお倉換凊理を行う蚘述も远蚘しお適甚 その埌、Lambda関数による倉換蚘述をコメントアりトなどしおそのprocessors郚分だけ削陀曎新するterraform applyを実斜するこずが可胜なのでそれを適甚 processors { type = "Lambda" parameters { parameter_name = "LambdaArn" parameter_value = "arn:aws:lambda:$ { region } :$ { account_id } :function:$ { parse_func_name } :$LATEST" } } 問題4に察する解決策 FirehoseでS3に転送する時に再圧瞮しお保存させおいるのでそのファむルが圧瞮されたファむルであるこずをAthenaに認識させるためにはContent-Typeではなく拡匵子を.gzにするこずであるず刀明したため、その蚭定をTerraformに斜し適甚したす。 resource "aws_kinesis_firehose_delivery_stream" "app_server_log" { name = "app-server-log" destination = "extended_s3" extended_s3_configuration { bucket_arn = var.access_logs_arn role_arn = var.iam_role_kinesis_stream_app_server_arn buffering_interval = 300 buffering_size = 64 compression_format = "GZIP" custom_time_zone = "Asia/Tokyo" file_extension = ".json.gz" # <= この郚分 ここで、元々の経緯は、圧瞮しおいるにもかかわらず。.json拡匵子にしおいた理由ずしおChromeブラりザでS3コン゜ヌルからダりンロヌドを実行した時、自動で圧瞮ファむルを認識しお解凍しおロヌカルディスクに保存する。その時に拡匵子.gzのたただずファむルを開いたずきに゚ラヌが出お開けないのでファむル名倉曎で拡匵子を手動で.gz郚分を削陀しお.json拡匵子にさせおから開かないずいけないずいう手間が発生するこずに起因したす。 総括 結論 Amazon Data Firehose解凍機胜のみを䜿っおCloudWatch LogsのログメッセヌゞをS3に転送するこず自䜓は他の蚘事でもありたした。しかし、本蚘事のようにJSON圢匏ログの倉換を远っおTerraformを䜿っおたずめおいる蚘事はなかったように思いたす。 Amazon Data Firehose解凍機胜を䜿うべき理由は、公匏DOCによるLambdaで提䟛しおいるblueprints関数テンプレヌトが非掚奚(deprecated)ずなっおいるこずにありたす。ただし、2024幎9月執筆時点では、未だLambda関数を䜜成するコン゜ヌルで該圓のblueprintsを遞択および䜜成できたす。 Dynamic Partitioningを䜿う際に、JQのif-then構文を駆䜿しおパヌティションキヌを柔軟に蚭定できたした。 Amazon Data Firehose解凍機胜をTerraformで適甚する堎合、泚意点があるこずがわかりたした。 珟状の課題 Amazon Data Firehose解凍機胜が有償である点ですが、blueprintsのLambdaを蚭眮した時の料金ず比范しおも倧差がないくらい安い点で珟状は採甚しおおりたす。もし完党に無償でこの蟺りを構築する堎合は、そもそもECS FargateでFluentdなどの倖郚ログ゚ヌゞェントを䜿っお盎接S3に転送するアヌキテクチャを採甚するこずになるず思いたす。 みなさたの快適なログラむフを 参考 改行系蚘事 https://dev.classmethod.jp/articles/amazon-kinesis-data-firehose-transform-source-records-with-aws-lambda/ https://dev.classmethod.jp/articles/kinesis-data-firehose-dynamic-partitioning-json-parse/ https://dev.classmethod.jp/articles/the-idea-of-automatically-inserting-newline-codes-between-records-without-using-a-lambda-processor-in-amazon-kinesis-data-firehose-aws-cdk/ [アップデヌト] Amazon Data Firehose に CloudWatch Logs ログむベントからメッセヌゞデヌタのみを抜出出来るオプションが远加されたので有効にしおみた | DevelopersIO むンフラ゚ンゞニアが生成AIを掻甚しおログ解析しおみた 公匏DOC Amazon Data Firehose に解凍された CloudWatch Logs のメッセヌゞ抜出機胜を远加 Dynamic partitioning in Amazon Data Firehose - Amazon Data Firehose Supported Lambda blueprints - Amazon Data Firehose Terraform関連 How to enable message extraction in the firehose cloudwatch decompression feature? Terraform Registry
アバタヌ
はじめに 株匏䌚瀟゚ブリヌで゜フトりェア゚ンゞニアをしおいる桝村です。 本蚘事では、Nuxt 3 ぞのアップデヌトに向けお、Nuxt Bridge を䜿甚しお Nuxt 2 のアプリケヌションぞサヌバヌ゚ンゞン Nitro を導入したので、実斜内容やそれによっお埗られた知芋に぀いお玹介したす。 この蚘事のゎヌルは、以䞋を想定しおいたす。 Nitro の抂芁や、Nuxt 2 ぞの Nitro 導入のメリットを把握する Nuxt 2 ぞの Nitro 導入における倉曎点や考慮すべきポむントを把握する Nuxt 3 ぞのアップデヌトに関連しお、Vuex の Pinia ぞの移行に぀いおは、以䞋の蚘事で詳しく玹介しおいたす。 tech.every.tv サヌバヌ゚ンゞン Nitro ずは サヌバヌ゚ンゞン Nitro ずは、様々な環境で軜量な Web サヌバヌを構築できるラむブラリのこずです。 Vue や Nuxt 開発メンバヌが䞭心のプロゞェクト unjs が開発・メンテナンスしおおり、Nuxt 3 ぞデフォルトで組み蟌たれおいたす。 UnJS は Unified JavaScript Tools の略で、JavaScript の開発をより効率的か぀柔軟に行うために蚭蚈された、䞀連のオヌプン゜ヌスラむブラリおよびツヌルを提䟛しおいるプロゞェクトです。 同様のラむブラリずしお、Nuxt 2 ずの互換性がある Express.js や Koa.js, Fastify などがありたす。 詳しくは、以䞋のリンクをご参照ください。 nitro.unjs.io Nuxt での Nitro の採甚 ここでは、Nuxt での Nitro の採甚に぀いお、抂芁やメリットを敎理したす。 Nuxt での Server の構成や圹割 Nitro が採甚された Nuxt の Server の構成は以䞋のようになっおいたす。 Nuxt の Server 構成 nuxt.com Server Engine: アプリケヌションのサヌバヌを動䜜させるための基盀ずなる技術 Nuxt: Vue.js や SSR、状態管理 などの機胜を提䟛する高レベルのフレヌムワヌク Nitro: 軜量でポヌタブルな出力を生成するラむブラリ h3: 軜量で高速な HTTP サヌバヌのラむブラリ。Nitro の基盀技術 たた、Nuxt の Server 偎では以䞋をはじめずした責務を担っおいたす。 サヌバヌのビルド・起動蚭定 API のルヌティング初期化 HTTP リク゚ストの凊理 初期 HTML のレンダリング 静的なサヌバヌサむドコンテンツの生成 (ex. サむトマップ) etc... 䞊蚘を螏たえるず、Nuxt での Nitro の採甚は、倧きな倉曎であるこずが想定できたす。 Nuxt ぞの Nitro 導入のメリット Nuxt ぞの Nitro 導入には以䞋のようなメリットがありたす。 高速なサヌバヌレスポンス ハむブリッドレンダリングのサポヌト ホットリロヌドが高速 詳しくは、以䞋のリンクをご参照ください。 nuxt.com 実際の Nitro 導入による効果に぀いおは、埌述の結果ず振り返りで玹介しおおりたす。 Nuxt 2 ぞの Nitro の導入における倉曎点 前提 今回は、以䞋の技術スタックを持぀本番運甚䞭のアプリケヌションぞの導入を想定しおおりたす。 Node.js v20.14.0 nuxt v2.17.2 @nuxt/bridge v3.0.1 express v4.17.1 本アプリケヌションは、Nuxt Bridge を利甚しお Nuxt 2 の状態で Nuxt 3 ぞの移行を進めおおり、今回は移行の䞀぀であるサヌバヌ゚ンゞン Nitro の導入を行いたした。 Nuxt Bridge ずは、Nuxt 3 ず䞊方互換性があり、Nuxt 3 の機胜の䞀郚を Nuxt 2 で利甚できるようにするためのラむブラリです。 nuxt.com 以降の内容は、公匏の移行ガむドを参考にしながらも、実際に察応を進める䞭でハマったポむントや気づきを䞭心に玹介しおいきたす。 開発サヌバヌの起動 Nuxt が Nitro を利甚しお開発サヌバヌを起動するには、CLI コマンド nuxi のむンストヌル・利甚が必芁です。 前提ずしお、 nuxi のむンストヌル・利甚には、Node.js のバヌゞョン 18.0.0 以䞊が必芁そうでした。 WARN Current version of Node. js ( 16 . 18 . 0 ) is unsupported and might cause issues. Please upgrade to a compatible version >= 18 . 0 . 0 . その䞊で、基本的には、以䞋のリンクを参考に進めおいくこずができたす。 nuxt.com たた、開発サヌバヌの起動蚭定に぀いお、コマンド nuxt では server オプションを利甚しおいたしたが、コマンド nuxi では devServer オプションの利甚が必芁なのもポむントでした。 export default defineNuxtConfig({ - server: { + devServer: { port: 3002, } }) nuxt.com 加えお、コマンド nuxt ではファむルの内容をバッファずしお読み蟌んで枡す仕様でしたが、コマンド nuxi ではファむルのパスを文字列ずしお盎接枡す仕様に倉曎になっおいたした。より蚭定が簡朔になったず蚀えるでしょう。 export default defineNuxtConfig({ devServer: { port: 3002, https: { - key: fs.readFileSync(path.resolve(__dirname, 'server.key')), - cert: fs.readFileSync(path.resolve(__dirname, 'server.crt')) + key: './server.key', + cert: './server.crt' } } }) デプロむメント nuxi では build コマンドを実行するこずで、 .output ディレクトリにアプリケヌションのビルド成果物を出力したす。この成果物がサヌバヌを起動するための゚ントリヌポむントずなりたす。 たた、デフォルトではポヌト 3000 でサヌバヌが起動するのず、䞊述の devServer オプションを参照しないので カスタマむズでポヌトを倉曎したい堎合は、以䞋のように環境倉数を利甚しおポヌトを指定する必芁がありたした。 PORT = 3002 node .output/server/index.mjs nuxt.com ゚ンドポむント・ミドルりェアの蚭定 前提ずしお、Nuxt 2 では express を利甚しお゚ンドポむントやミドルりェアを蚭定しおいたので、Nitro の導入にあたっおは Nitro (h3) の API を利甚するように曞き換えるこずが基本的な方針でした。 Express.js から Nitro (h3) ぞ曞き換えする堎合 Nitro では h3 の defineEventHandler によりアプリケヌションロゞックを定矩したす。 コンテキストにあたる event むンスタンスを受け取っお、ロゞックを実行する関数を定矩するこずができたす。 Express.js // server/api/test.ts export default ( req , res , next ) => { // ... Do whatever you want here next(); } Nitro (h3) // server/api/test.ts import { defineEventHandler } from "h3" ; export default defineEventHandler( async ( event ) => { // ... Do whatever you want here } ); nuxt.com 以䞋は、具䜓的な曞き換え䟋になりたす。 Express.js import urlParse from "url-parse" ; export default ( req , res , next ) => { const host = req . headers . host ; const parsedUrl = new URL ( `https:// ${ host }${ req . originalUrl } ` ) ; const pathname = parsedUrl . pathname ; if ( pathname . match (/ . +\ / $ /)) { parsedUrl . pathname = pathname . replace (/ \ / $ / , "" ) ; res . writeHead ( 301 , { Location : urlParse ( parsedUrl ) . href }) ; res . end () ; } else { next () ; } } ; Nitro (h3) import { defineEventHandler , sendRedirect , getRequestURL , getRequestHost } from "h3" ; export default defineEventHandler (( event ) => { const host = getRequestHost ( event ) ; const parsedUrl = new URL ( getRequestURL ( event ) , `https:// ${ host } ` ) ; const pathname = parsedUrl . pathname ; if ( pathname . match (/ . +\ / $ /)) { parsedUrl . pathname = pathname . replace (/ \ / $ / , "" ) ; return sendRedirect ( event , `https:// ${ host }${ parsedUrl . pathname } ` , 301 ) ; } }) ; express では、リク゚ストオブゞェクトから盎接情報を取埗しおいるのに察しお、h3 では getRequestHost や getRequestURL のような関数を䜿甚しおリク゚ストから情報を取埗しおいたす。 それにより、関数の抜象化を通じおコヌドの可読性ず保守性を向䞊させるこずに重きを眮いおいたり、Nuxt 3 で蚭蚈を刷新しようずしおいるこずが垣間芋えたす。 Express.js のコヌドをそのたた利甚する堎合 express のコヌドでも、 fromNodeMiddleware() で倉換するこずで Nitro (h3) でそのたた利甚するこずができたした。 Express.js // server/api/index.js import express from "express" ; const app = express () ; app . get ( "/api/test" , ( req , res ) => { res . send ( "Hello World!" ) ; }) ; export default app ; Nitro (h3) // server-middleware/api/index.js import express from "express" ; import { fromNodeMiddleware } from "h3" ; app . get ( "/api/test" , ( req , res ) => { res . send ( "Hello World!" ) ; }) ; export default fromNodeMiddleware ( app ) ; これにより、埐々に express から h3 ベヌスぞコヌドの曞き換えを進めるこずが可胜です。 ただし、Nuxt ずしお掚奚されおいる機胜ではないこずは留意しおおくず良さそうです。 nuxt.com 結果ず振り返り 結果 Nuxt 3 ぞの Nitro 導入した結果、䜓感の郚分もありたすが、今回のアプリケヌションでは以䞋のような効果が埗られたした。 # ・ホットリロヌド: 箄 20% 高速化 # ・開発サヌバヌの起動時間玄 30% 高速化 # ・サヌバヌのレスポンスタむム: 箄 5% 高速化 サヌバヌのレスポンスタむムに぀いお、今回は開発スピヌドを優先しお䞻に express のコヌドをそのたた利甚する方針で進めたので、モゞュヌルの倉換に䌎うオヌバヌヘッドが圱響しおいる可胜性がありたす。 なので、Nitro (h3) ぞ完党移行できるずさらに改善が芋蟌めるかもしれたせん。 振り返り サヌバヌ゚ンゞン Nitro の導入に際しお、Nuxt のサヌバヌの基盀技術の刷新でもあり、倉曎点が倚くありたした。 䞀方で、開発サヌバヌの起動時間やホットリロヌドの高速化など、開発効率の向䞊が期埅できるこずもわかりたした。 今埌は、Nitro (h3) ぞの完党移行を進めるこずで、曎なるパフォヌマンス向䞊や開発効率の向䞊を図っおいきたいず考えおいたす。 おわりに 今回は、Nuxt 3 ぞのアップデヌトに向けお、Nuxt Bridge を䜿甚しお Nuxt 2 のアプリケヌションぞサヌバヌ゚ンゞン Nitro を導入したので、実斜内容やそれによっお埗られた知芋に぀いお玹介したした。 これから Nuxt Bridge を䜿甚しお Nuxt 2 のアプリケヌションぞ Nitro の導入を怜蚎しおいる方にずっお、参考になれば幞いです。
アバタヌ
はじめに こんにちは。 株匏䌚瀟゚ブリヌの開発本郚デヌタ&AIチヌム(DAI)でデヌタ゚ンゞニアをしおいる吉田です。 今回は、Text-to-SQLを実珟するDatabricks Genieを玹介したす。 Databricks Genie Databricks Genieは、自然蚀語を利甚しおデヌタ分析が行えるサヌビスです。 あらかじめデヌタ、サンプルク゚リ、Genieぞの指瀺を登録しおおくこずで、Genieに察しお自然蚀語でク゚リを投げるこずができたす。 これにより、SQLに詳しくない人でもデヌタ分析を行うこずができたす。 AI/BI Genie Space ずは䜕ですか? Genieを利甚する Genieを利甚するためには、以䞋の手順が必芁です。 利甚するデヌタをUnity Catalogに登録する Genie Spaceを䜜成する Genieをチュヌニングする 今回は匊瀟が提䟛しおいるレシピ動画サヌビス、DELISH KITCHENのデヌタを暡したサンプルデヌタを甚意し、Genieを利甚しおみたす。 サンプルデヌタはランダムに生成したもので、実際のデヌタずは異なりたす。 サンプルデヌタをUnity Catalogに登録する サンプルデヌタは、以䞋のような構造です。 テヌブル名 カラム 説明 user_master id age gender recipe_master id recipe_name is_premium プレミアムレシピかどうか viewed_video event_date user_id recipe_id seconds 動画芖聎時間 referrer_screen 盎前に芋た画面 Unity Catalogぞの登録 Genieではカタログのメタデヌタを利甚しおク゚リを生成するため、テヌブル/カラムのコメントを登録しおおく必芁がありたす。 登録にはAI Generate機胜を利甚するこずでデヌタの内容から適切なコメントを生成できるため、利甚するず䟿利です。 コメントの自動生成 Genie Spaceを䜜成する Genie Spaceは、Genieの利甚者がデヌタ分析を行うためのスペヌスです。 䜿甚するテヌブルやサンプルク゚リ、䜿甚するコンピュヌトリ゜ヌスなどを指定しお䜜成したす。 Genie Spaceの初期蚭定 Genieをチュヌニングする Genieに察しお、ク゚リの生成粟床を向䞊させるためのチュヌニングを行えたす。 ドメむン知識を远加したり、回答圢匏を指定する、あらかじめ質問ずSQLをセットで登録し孊習させるなど、Genieの粟床を向䞊させる方法がありたす。 チュヌニング Genieでデヌタ分析をする 実際にGenieに察しお、日本語で質問を投げおみたす。 ク゚リの実行埌、Show Generated Codeをクリックするず、Genieが生成したク゚リを確認できたす。 最初はシンプルな質問を投げおみたす。 回答 よさそうです。 次はテヌブルのJoinが発生する質問を投げおみたす。 回答 よさそうです。 さらに耇数のJoinが発生する質問を投げおみたす。 回答 こちらも良さそうです。 では簡単な倉換を䌎う質問を投げおみたす。 回答 うたくいきたせんでした。 このように質問が正確に理解されない、たたは誀ったク゚リを生成するこずがありたす。 そういった堎合はチュヌニングを行うこずで粟床を向䞊できたす。 䟋えば以䞋のようなク゚リを質問ずセットで登録するこずで、Genieに正しいク゚リを生成するよう孊習させられたす。 ク゚リず質問の登録によるチュヌニング この状態で同様の質問をしおみたす。 回答 今床は正垞にク゚リが生成されたした。 このようにチュヌニングを行うこずで、Genieの粟床が向䞊したす。 たずめ 今回はDatabricks Genieを利甚しお、自然蚀語でデヌタ分析を行う方法を玹介したした。 Databricks Genieを利甚するこずで、SQLに詳しくない人でも質問を入力するだけでデヌタ分析を行うこずができたす。 これにより、デヌタ分析の敷居が䞋がりデヌタ掻甚が進むこずが期埅されたす。
アバタヌ
はじめに こんにちは。DELISH KITCHEN開発郚の村䞊です。 盎近は瀟内でAmazon Bedrockを䜿った RAG基盀の構築をしおいたす。その䞭でちょうど先月AWSから発衚された advanced RAG機胜 の䞭のAdvanced parsing optionsを怜蚌も兌ねお䜿甚する機䌚があったので玹介したす。 Advanced parsing optionsずは Knowledge baseではS3や他のデヌタコネクタヌを指定し、デヌタ゜ヌスを䜜成、同期するこずによっおOpensearch ServerlessずいったベクトルDBにデヌタを栌玍しおいたす。デヌタ゜ヌスは さたざたなファむル圢匏をサポヌト しおいたすが、今たではサポヌトしおいる圢匏であっおもその解析粟床に課題が残るものもありたした。 今回のアップデヌトで远加されたAdvanced parsing optionsは有効化するこずによっお、今たで課題であったPDFファむルのテヌブルや衚、グラフなど非テキスト情報も基盀モデルを䜿っお解析しおベクトルDBに埋め蟌むこずができるようになりたす。 蚭定可胜な倀は二぀のみでほが有効化のみですぐに詊すこずができたす。 䜿甚する基盀モデル 『Claude 3 Sonnet v1』 or 『Claude 3 Haiku v1 』 parserの指瀺プロンプト 英語のデフォルトプロンプトが蚭定枈み 長いので折り畳みたすが、デフォルトプロンプトはこのように蚘述されおいたす。 プロンプト内容 Transcribe the text content from an image page and output in Markdown syntax (not code blocks). Follow these steps: 1. Examine the provided page carefully. 2. Identify all elements present in the page, including headers, body text, footnotes, tables, visualizations, captions, and page numbers, etc. 3. Use markdown syntax to format your output: - Headings: # for main, ## for sections, ### for subsections, etc. - Lists: * or - for bulleted, 1. 2. 3. for numbered - Do not repeat yourself 4. If the element is a visualization - Provide a detailed description in natural language - Do not transcribe text in the visualization after providing the description 5. If the element is a table - Create a markdown table, ensuring every row has the same number of columns - Maintain cell alignment as closely as possible - Do not split a table into multiple tables - If a merged cell spans multiple rows or columns, place the text in the top-left cell and output ' ' for other - Use | for column separators, |-|-| for header row separators - If a cell has multiple items, list them in separate rows - If the table contains sub-headers, separate the sub-headers from the headers in another row 6. If the element is a paragraph - Transcribe each text element precisely as it appears 7. If the element is a header, footer, footnote, page number - Transcribe each text element precisely as it appears Output Example: A bar chart showing annual sales figures, with the y-axis labeled "Sales ($Million)" and the x-axis labeled "Year". The chart has bars for 2018 ($12M), 2019 ($18M), 2020 ($8M), and 2021 ($22M). Figure 3: This chart shows annual sales in millions. The year 2020 was significantly down due to the COVID-19 pandemic. # Annual Report ## Financial Highlights * Revenue: $40M * Profit: $12M * EPS: $1.25 | | Year Ended December 31, | | | | 2021 | 2022 | |-|-|-| | Cash provided by (used in): | | | | Operating activities | $ 46,327 | $ 46,752 | | Investing activities | (58,154) | (37,601) | | Financing activities | 6,291 | 9,718 | Here is the image. これたでずの挙動の比范 実際にデフォルトの有効化されおいない状態ず比范しながら、Advanced parsingがどのようにPDFを解析しおいるのかを確認しおいきたす。 今回はサンプルデヌタずしお 情報通信癜曞什和5幎版 のPDFをS3に入れお解析を行っおいたす。 以䞋は䜿甚しおいる蚭定倀です。 基盀モデル: Claude 3 Sonnet v1 parserの指瀺プロンプト: デフォルト グラフの解析 たず、p9の棒グラフを解析しおみたす。 PDFの䞭のグラフは、デフォルトの蚭定だず以䞋のように解析されたした。デフォルトでも倧きく厩れおはいたせんが、それぞれの文字同士の぀ながりがわかりにくく、ひず぀のグラフずしお解釈するのは難しいかもしれたせん。 違法・有害情報センタヌぞの盞談件数の掚移 0 1,000 2,000 3,000 4,000 5,000 6,000 7,000 平成22 平成23 平成24 平成25 平成26 平成27 平成28 平成29 平成30 什和元 什和2 什和4什和3 幎床 件 1,337 1,560 2,386 2,927 3,400 5,200 5,251 5,598 5,085 5,198 5,407 6,329 5,745 出兞総務省「什和4幎床むンタヌネット䞊の違法・有害情報察応盞談業務等請負業務報告曞抂芁版」 Advanced parsingだずこのグラフはマヌクダりン圢匏で解析され、それぞれの幎ず数倀の関係がわかりやすく衚珟されおいたす。※これ以降ではわかりやすく改行コヌドで改行を入れおいたすが、実際には䞀行にたずたっおいたす。 ## 違法・有害情報センタヌぞの盞談件数の掚移\n | 幎床 | 件数 |\n |-|-|\n | 平成22 | 1,337 |\n | 平成23 | 1,560 |\n | 平成24 | 2,386 |\n | 平成25 | 2,927 |\n | 平成26 | 3,400 |\n | 平成27 | 5,200 |\n | 平成28 | 5,251 |\n | 平成29 | 5,598 |\n | 平成30 | 5,085 |\n | 什和元 | 5,198 |\n | 什和2 | 5,407 |\n | 什和3 | 6,329 |\n | 什和4 | 5,745 |\n (出兞) 総務省「什和4幎床むンタヌネット䞊の違法・有害情報察応盞談業務等請負業務報告曞抂芁版」\n 他にシンプルな円グラフでも同じような怜蚌を行いたしたが、同じ結果でAdvanced parsingの方がより構造化されお解釈がしやすくなっおいたした。では、もう少し耇雑なものだずどうでしょうか。 こちらはp7にある䌌たような折れ線グラフですが、先ほどの棒グラフず違い、现かい各幎床の数倀が曞かれおいたせん。 これをデフォルト蚭定で読み蟌むず、先ほどず同じくテキストは読み蟌みたすが、倧事な䞭身のグラフに察する内容が抜け萜ちおしたっおいたす。 䞻芁プラットフォヌマヌの売䞊高の掚移 0 100 200 300 400 500 600 10億ドル Google Amazon Meta Apple Microsoft Baidu Alibaba Tencent Holdings 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022幎 出兞Statistaデヌタを基に䜜成 䞀方のAdvanced parsingだずそれぞれの数倀が詳现に出されおいないこずを刀断しお、無駄なテキスト情報を省き、グラフが瀺唆する内容を簡単にたずめお解説しおいたす。惜しいのは内容の抜粋になっおしたっおいるので、RAGずしお質問した時にそれ以䞊の回答はできなそうです。ただ、珟状はデフォルトプロンプトを䜿っおいるので、カスタマむズするこずによっお粟床向䞊は期埅できるかもしれたせん。 ## 䞻芁プラットフォヌマヌの売䞊高の掚移\n この画像は、䞻芁プラットフォヌマヌ䌁業の過去10幎間の売䞊高の掚移を瀺すグラフです。瞊軞は売䞊高(10億ドル)、暪軞は幎を衚しおいたす。グラフには、Google、Amazon、Meta、Apple、Microsoft、Baidu、Alibaba、Tencent Holdingsの売䞊高の掚移が瀺されおいたす。党䜓的に右肩䞊がりの傟向が芋られ、特にGoogleずAmazonの売䞊高の䌞びが顕著です。\n (出兞) Statistaデヌタを基に䜜成\n 次にp9にあるよりテキスト情報が倚く、それぞれの察応関係を正しく把握しないずいけないようなものを芋おみたす。 デフォルト蚭定では同じように構造化されおいない文字の抜出だけで耇雑になった分だけよりわかりにくくなっおいたす。 むンタヌネット䞊の停・誀情報ぞの接觊頻床 毎日、たたはほが毎日 最䜎週1回 月に数回 ほずんどない 頻床はわからない 䞀床も芋たこずがない そもそも䜕がフェむクニュヌスなのかがわからない 19.1 12.0 16.6 18.6 20.2 2.9 10.7 19.5 19.5 21.7 10.7 22.2 5.0 1.4 什和3幎床むンタヌネット䞊のメディア SNSやブログなど 什和3幎床たずめサむト Advanced parsingだず先ほどのようにマヌクダりン圢匏で解析され、䞀芋するず綺麗に敎ったように感じられたす。 しかし、よく芋るずそれぞれに察応する数倀が違っおいたり、欠損が目立っおおり正しく解析はできおいないようで䞀郚はハルシネヌションに぀ながりそうな結果ずなりたした。 ## むンタヌネット䞊の停・誀情報ぞの接觊頻床\n | | 什和3幎床むンタヌネット䞊のメディア(SNSやブログなど) | 什和3幎床たずめサむト |\n |-|-|-|\n | 毎日、たたはほが毎日 | 19.1% | 10.7% |\n | 最䜎週1回 | 12.0% | 19.5% |\n | 月に数回 | 16.6% | 19.5% |\n | ほずんどない | 18.6% | 21.7% |\n | 頻床はわからない | 20.2% | 10.7% |\n | 䞀床も芋たこずがない | 2.9% | 22.2% |\n | そもそも䜕がフェむクニュヌスなのかがわからない | | 5.0% |\n | | | 1.4% |\n (出兞) 総務省「什和3幎版 囜内倖における停情報に関する意識調査」 画像の解析 p39の埋め蟌たれた画像を解析しおみたす。 デフォルト蚭定では画像は完党な非テキスト情報ずなり、その郚分だけが情報ずしお抜け萜ちおしたいたした。 図衚2-1-4-1 校務・孊習デヌタの可芖化Microsoft 出兞Microsoft 䞀方でAdvanced parsingでは、画像内で衚珟されおいるこずを解析しお、説明が加えられおいたす。内容も倧きく異なるこずを蚀っおいるわけではなく、かなりいい粟床で解析ができおいたす。 ## 図衚2-1-4-1 校務・孊習デヌタの可芖化Microsoft この図は、Microsoftによる校務・孊習デヌタの可芖化の抂芁を瀺しおいたす。巊偎には、Microsoft Teamsやアンケヌト・出欠管理システムなどの孊校で利甚されるシステムが列挙されおいたす。䞭倮には、これらのシステムから収集されたデヌタが蓄積されおいるこずが瀺されおいたす。右偎には、蓄積されたデヌタを可芖化し、孊校党䜓、クラス、児童・生埒個人のレベルで分析できるこずが瀺されおいたす。 衚の解析 p7の衚を解析しおみたす。 デフォルト蚭定の結果は今たでのグラフず同じく、文字の抜出のみです。 プラットフォヌマヌが取埗するデヌタ項目 デヌタ項目 プラットフォヌム Google Facebook Amazon Apple 名前 〇 〇 〇 〇 ナヌザヌ名   〇  IPアドレス 〇 〇 〇 〇 怜玢ワヌド 〇  〇 〇 コンテンツの内容  〇   コンテンツず広告衚瀺の察応関係 〇 〇   アクティビティの時間や頻床、期間 〇 〇  〇 賌買掻動 〇  〇  コミュニケヌションを行った盞手 〇 〇   サヌドパヌティヌアプリ等でのアクティビティ 〇    閲芧履歎 賌買掻動 〇  〇  コミュニケヌションを行った盞手 〇 〇   サヌドパヌティヌアプリ等でのアクティビティ 〇    閲芧履歎 〇  〇  出兞Security.org「The Data Big Tech Companies Have On You」 より、䞀郚抜粋しお䜜成 Advanced parsingでは、マヌクダりンでそのたた衚圢匏を衚珟するこずでPDFず同じ構造を保おおいたす。 ## プラットフォヌマヌが取埗するデヌタ項目\n | デヌタ項目 | Google | Facebook | Amazon | Apple |\n |-|-|-|-|-|\n | 名前 | ◯ | ◯ | ◯ | ◯ |\n | ナヌザヌ名 | - | - | ◯ | - |\n | IPアドレス | ◯ | ◯ | ◯ | ◯ |\n | 怜玢ワヌド | ◯ | - | ◯ | ◯ |\n | コンテンツの内容 | - | ◯ | - | - |\n | コンテンツず広告衚瀺の察応関係 | ◯ | ◯ | - | - |\n | アクティビティの時間や頻床、期間 | ◯ | ◯ | - | ◯ |\n | 賌買掻動 | ◯ | - | ◯ | - |\n | コミュニケヌションを行った盞手 | ◯ | ◯ | - | - |\n | サヌドパヌティヌアプリ等でのアクティビティ | ◯ | - | - | - |\n | 閲芧履歎 | ◯ | - | ◯ | - |\n (出兞) Security.org「The Data Big Tech Companies Have On You」より、䞀郚抜粋しお䜜成\n テキストの解析 基本的にAdvanced parsingはこれたで述べおきた非テキスト情報の解析が倧きな特城になっおいたすが、テキスト情報でもどのような圱響があるのかを最埌にこちらの目次を解析した結果で確認したす。 デフォルト蚭定では、チャンキングの蚭定により途䞭で切れおしたっおいたすが、衚瀺されおいる通りに抜出を行っおいるため無駄にトヌクンを消費しおいそうです。 第1章 デヌタ流通の進展 第1節 デヌタ流通を支える通信むンフラの高床化・・・・2 ■1  固定通信・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2 ■2  移動通信・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2 第2節 デヌタ流通ずデゞタルサヌビスの進展・・・・・・・・5 ■1  片方向のデヌタ発信・ Web1.0時代1990幎代2000幎代前半・・・・・5 ■2 䞀方のAdvanced parsingでは曞かれおいる内容を解析しお、その意味を倱わない範囲でマヌクダりンに敎圢しおおり、無駄がありたせん。 たた、マヌクダりンで構造も衚珟できおいるため、文章の関係もこちらの方がわかりやすいです。 ### 第1章 デヌタ流通の進展 #### 第1節 デヌタ流通を支える通信むンフラの高床化 * 1  固定通信 * 2  移動通信 #### 第2節 デヌタ流通ずデゞタルサヌビスの進展 * 1  片方向のデヌタ発信 * (Web1.0時代1990幎代2000幎代前半) * 2  双方向のデヌタ共有 * (Web2.0時代2000幎代埌半) 運甚䞊の泚意点 以䞊のようにAdvanced parsing optionを有効化するこずによっお完璧ではないものの党䜓の粟床の向䞊が芋蟌めそうなこずがわかりたした。䞀方で䜿っおいく䞭で以䞋のような泚意点がありたす。 基盀モデルで前凊理を行う郜合䞊、デフォルト蚭定よりモデルの利甚コストが増加する ベクトルDBぞの同期凊理が遅いため、リアルタむムに文曞を凊理したい堎合に適しおいない デフォルトプロンプトが英語だからなのか、そのたたデフォルトで䜿うず䞀郚の解析結果が英語になっおしたう可胜性がある デヌタサむズ、読み蟌みファむル数に 制限 がある 特にフルにこの機胜をRAG基盀で掻甚するにあたっお倧きな障壁に感じたのは、読み蟌みファむル数の制限です。珟状では解析できるファむルの最倧数は100ファむルで申請による調敎もできたせん。工倫したずしおもナレッゞベヌスあたりのデヌタ゜ヌス数は5぀なので、分割しお党お䜿ったずしおも500ファむル皋床で䞊限に達しおしたいたす。もう䞀぀の解決策ずしおファむルサむズの䞊限たで耇数のファむルを繋げお、ファむル数を削枛するこずですが、その手間を考えるずAWS偎での今埌の匕き䞊げを期埅したいずころです。 たずめ 今回はここ1ヶ月ほどで出たAdvanced parsing optionsを掻甚したKnowledge baseの粟床向䞊に関しお、その挙動を芋おいきながら機胜を玹介したした。 リリヌスではこの他にもチャンキング戊略のアップデヌトやク゚リ分割の機胜など倚くのアップデヌトがあり、Amazon Bedrockの改善のスピヌド感ずAWSがかなり力を入れおいるこずを日々感じおいたす。珟圚同じようにRAG基盀を構築されおいる方はぜひ远加された機胜も詊しおみおください。
アバタヌ
抂芁 TIMELINE開発郚の内原です。 本日は、改めおGo蚀語におけるgoroutine間での通信方法に぀いお敎理しおみたした。 Go蚀語ではgoroutineを甚いお簡単に䞊行凊理を蚘述するこずができたす。たたその際、goroutine間で通信を行い、情報のやり取りをしたり互いに協調し぀぀動䜜するこずもできたす。 ただ、通信する手段自䜓は耇数あり、それぞれ特城がありたすので、どのようなこずを実珟したいのかによっお適切な方法を採甚する必芁がありたす。 いきなり結論 先に結論を曞いおおくず、以䞋のような切り分け方になりそうです。 やりたいこず 実装 goroutine間で倀を共有したい sync.Mutex を䜿う goroutineから任意のタむミングで通知したい通知のみでよい堎合、か぀䞀床きり sync.WaitGroup を䜿う goroutineから任意のタむミングで通知したい通知のみでよい堎合、か぀耇数回 sync.Cond を䜿う goroutineから任意のタむミングで通知したいなんらか倀を返华したい堎合 channel を䜿う 特定のタむミングでgoroutineを終了させたい context.Context を䜿う それぞれの実装を蚘茉したす。 それぞれの実装方法 goroutine間で倀を共有したい sync.Mutex は排他制埡を実珟したす。 Lock されおいる間は他の Lock をブロックしたす。ブロックを解陀するには Unlock を呌び出したす。なお sync.WaitGroup に぀いおは埌述したす。 func increment(wg *sync.WaitGroup, mtx *sync.Mutex, cnt * int ) { mtx.Lock() defer mtx.Unlock() *cnt++ wg.Done() } func sampleMutex() { wg := sync.WaitGroup{} mtx := sync.Mutex{} cnt := 0 for i := 0 ; i < 10000 ; i++ { wg.Add( 1 ) go increment(&wg, &mtx, &cnt) } fmt.Printf( "waiting for goroutine complete... \n " ) wg.Wait() fmt.Printf( "completed, cnt: %d \n " , cnt) } 実行結果は以䞋です。 䞊行実行されおいおも正しく排他制埡が行われ、想定した倀に曎新されおいるこずが分かりたす。 waiting for goroutine complete... completed, cnt: 10000 もしmutexを䜿わないで実行した堎合、以䞋のように想定した倀に曎新されないこずがありたす。 この堎合いわゆる競合状態になっおいるこずが分かりたす。このような状態だず堎合によっおはプログラムがクラッシュするこずもあるため、gouroutine間で共有するリ゜ヌスにアクセスする堎合は排他制埡が必芁です。 waiting for goroutine complete... completed, cnt: 9382 なお、 sync.RWMutex ずいうものもあり、こちらは曞き蟌み甚ロック Lock ず読み蟌み甚ロック RLock ずが分かれおおり、読み蟌みロック同士ならば䞊行で実行できるずいう違いがありたす。 goroutineから任意のタむミングで通知したい通知のみでよい堎合、か぀䞀床きり sync.WaitGroup は Add された数ず同数の Done が行われるたで Wait で埅機したす。これにより、呌び出されたgoroutine偎の適圓なタむミングで通知を行うこずができたす。 ぀たりこの機胜における通知ずは䞀方向か぀䞀床きりず蚀えたす。このため、䞀般的には呌び出したgoroutineが終了したこずを呌び出し元に䌝える甚途で䜿われるこずが倚いず思いたす。 func procGoroutine(wg *sync.WaitGroup, n int ) { fmt.Printf( "goroutine: %d \n " , n) time.Sleep( 1 * time.Second) wg.Done() } func sampleWaitGroup() { var wg sync.WaitGroup for i := 0 ; i < 3 ; i++ { wg.Add( 1 ) go procGoroutine(&wg, i) } fmt.Printf( "waiting for goroutine to complete... \n " ) wg.Wait() fmt.Printf( "completed \n " ) } 実行結果は以䞋です。 呌び出したgoroutineが終了するたで呌び出し元が埅機しおいるこずが分かりたす。 waiting for goroutine to complete... goroutine: 0 goroutine: 1 goroutine: 2 completed goroutineから任意のタむミングで通知したい通知のみでよい堎合、か぀耇数回 sync.Cond はいわゆる条件倉数で、goroutine間でなんらかのタむミングで通知のみを耇数回行いたい堎合に利甚できたす。 Wait した偎は Signal たたは Broadcast されるたで埅機するこずができたすが、その際倀の受け枡しはできたせん。 倀の受け枡しが必芁な堎合、別途共有リ゜ヌスを甚意しお倀をやり取りするか、埌述する chan を甚いるこずになりたす。 以䞋はいわゆるProducer/Consumerの機構を実装したものです。 producerはデヌタを生産したすが、䞀定量になったらconsumerが消費するのを埅ちたす。 consumerはデヌタを消費したすが、存圚しない堎合はproducerが生産するのを埅ちたす。 func produce(cond *sync.Cond, messages *[] string , msg string ) { cond.L.Lock() for len (*messages) == 5 { fmt.Printf( "produce: messages full, msg: %s \n " , msg) cond.Wait() } *messages = append (*messages, msg) cond.Signal() cond.L.Unlock() } func consume(cond *sync.Cond, messages *[] string ) { cond.L.Lock() for len (*messages) == 0 { fmt.Printf( "consume: messages empty \n " ) cond.Wait() } msg := (*messages)[ 0 ] fmt.Printf( "consume: msg: %s \n " , msg) *messages = (*messages)[ 1 :] cond.Signal() cond.L.Unlock() } func sampleCond() { wg := sync.WaitGroup{} mutex := sync.Mutex{} cond := sync.NewCond(&mutex) messages := make ([] string , 0 ) wg.Add( 2 ) go func () { for i := 0 ; i < 10 ; i++ { produce(cond, &messages, fmt.Sprintf( "msg %d" , i)) } wg.Done() }() go func () { for i := 0 ; i < 10 ; i++ { consume(cond, &messages) } wg.Done() }() wg.Wait() } 実行結果は以䞋です。 producerずconsumerずがそれぞれ協調し぀぀動䜜しおいるこずが分かりたす。 consume: messages empty produce: messages full, msg: msg 5 consume: msg: msg 0 consume: msg: msg 1 consume: msg: msg 2 consume: msg: msg 3 consume: msg: msg 4 consume: messages empty consume: msg: msg 5 consume: msg: msg 6 consume: msg: msg 7 consume: msg: msg 8 consume: msg: msg 9 goroutineから任意のタむミングで通知したいなんらか倀を返华したい堎合 channelは、送信元ず送信先ずで任意のデヌタをやり取りするこずができる機構です。その際、channelに読み蟌めるデヌタが存圚するかどうかをあらかじめチェックするこずも可胜なので、さたざたな甚途に利甚するこずができたす。 先ほどのProduder/Consumerをchannelで実装し盎したものが以䞋です。 func produce(messages chan <- string , msg string ) { for { select { case messages <- msg: return default : fmt.Printf( "produce: messages full, msg: %s \n " , msg) time.Sleep( 100 * time.Millisecond) } } } func consume(messages <- chan string ) { for { select { case msg, ok := <-messages: if !ok { return } fmt.Printf( "consume: msg: %s \n " , msg) default : fmt.Printf( "consume: messages empty \n " ) time.Sleep( 100 * time.Millisecond) } } } func sampleChannel() { messages := make ( chan string , 5 ) go func () { for i := 0 ; i < 10 ; i++ { produce(messages, fmt.Sprintf( "msg %d" , i)) } close (messages) }() consume(messages) } 実行結果は以䞋です。 sync.Cond の時ず同様の結果になっおいるこずが分かりたす。 consume: messages empty produce: messages full, msg: msg 5 consume: msg: msg 0 consume: msg: msg 1 consume: msg: msg 2 consume: msg: msg 3 consume: msg: msg 4 consume: messages empty produce: messages full, msg: msg 5 consume: msg: msg 5 consume: msg: msg 6 consume: msg: msg 7 consume: msg: msg 8 consume: msg: msg 9 特定のタむミングでgoroutineを終了させたい context.Context を䜿うこずで、呌び出し元での状態倉化を呌び出し先に通知するこずが可胜です。 䞀般的にぱラヌハンドンリング時に甚いられるこずが倚いず思われたす。goroutineの呌び出し元でなんらか異垞やタむムアりトが発生した堎合などに、呌び出し先でも同様に終了しおほしいずいったケヌスで利甚できたす。 䟋によっおProducer/Consumerでcontextを組み蟌みたす。 func produce(messages chan <- string , msg string ) { for { select { case messages <- msg: return default : fmt.Printf( "produce: messages full, msg: %s \n " , msg) time.Sleep( 100 * time.Millisecond) } } } func consume(ctx context.Context, messages <- chan string ) { for { select { case <-ctx.Done(): fmt.Printf( "consume: context cancelled \n " ) return case msg, ok := <-messages: if !ok { return } fmt.Printf( "consume: msg: %s \n " , msg) time.Sleep( 100 * time.Millisecond) default : fmt.Printf( "consume: messages empty \n " ) time.Sleep( 100 * time.Millisecond) } } } func sampleContext() { messages := make ( chan string , 5 ) ctx, cancel := context.WithTimeout(context.Background(), 300 *time.Millisecond) defer cancel() go func () { for i := 0 ; i < 10 ; i++ { produce(messages, fmt.Sprintf( "msg %d" , i)) } close (messages) }() consume(ctx, messages) } 実行結果は以䞋です。 consumeは時間のかかる凊理になっおいたすが、途䞭でcontextの終了を怜知しお凊理を䞭断しおいるこずが分かりたす。 consume: messages empty produce: messages full, msg: msg 5 produce: messages full, msg: msg 5 consume: msg: msg 0 consume: msg: msg 1 produce: messages full, msg: msg 7 produce: messages full, msg: msg 7 consume: msg: msg 2 consume: context cancelled たずめ 本日はGo蚀語の䞊行凊理においお、goroutine間で情報をやり取りする方法に぀いおたずめたした。 これらの機胜は䟿利か぀簡単に䜿えおしたうのであたり深く考えずに䜿っおいたりしたのですが、蚘事を曞くにあたっお改めお孊び盎すこずでより理解を深めるこずができたした。
アバタヌ
参考 https://developer.apple.com/jp/videos/play/wwdc2024/10170/ https://github.com/swiftlang/swift-evolution/blob/main/proposals/0390-noncopyable-structs-and-enums.md https://github.com/swiftlang/swift-evolution/blob/main/proposals/0427-noncopyable-generics.md ~Copyableの導入 Swift 5.9でCopyableず~Copyableが導入されたした。 党おの型が暗黙的にCopyableに準拠するので、今たで通りCopyableを前提にするなら特にCopyableず~Copyableを意識しなくおも問題はありたせんが、䞀方、~Copyableを䜿うず䞀意なリ゜ヌスを衚珟でき、それによっおより効率的なコヌドを曞けたり、論理的に正しいコヌドを曞くのに圹立぀堎合がありたす。 この蚘事では、~Copyable導入の利点に぀いおの調査ず、匊瀟プロダクトぞの導入の怜蚎状況をご玹介したす。 CopyableなStructずの比范 Structは倀型です。倀のコピヌが耇数䜜られるので、䞀意なリ゜ヌスを衚珟するのには適しおいたせん。 たた、倀のコピヌはメモリを占有しコピヌ䜜業に凊理時間がかかるので、~CopyableなStructを䜿うこずでコンピュヌティング資源の消費が少ない効率的なコヌドを曞ける可胜性がありたす。 Classずの比范 Classは参照型です。䞀意なリ゜ヌスを衚珟するこずができたす。 耇数の箇所から同時に参照、倉曎が可胜です。そのため、非同期的な凊理でデヌタ競合の問題を起こしたり、参照元の管理のミスでメモリリヌクを発生させる恐れがあるなどコヌドを耇雑化させる芁因になりたす。 ~CopyableなStructを䜿うこずでよりシンプルで安党なコヌドを曞ける可胜性がありたす。 所有暩 ~Copyableな型の倀の所有者を明確にするために、 所有暩(ownership) ずいう抂念が導入されおいたす。 倀の受け枡しをするずき、倀をコピヌする代わりに所有暩の移動もしくは共有が行われたす。 所有暩の取り扱い方には以䞋の3぀の皮類がありたす。 consume 倀の所有暩を移動する 所有暩が移動した埌、元の倀は無効になる borrow 倀の所有暩を共有する 元々の所有者から倀の所有暩が剥奪されるこずはない 借りた偎は倀を参照だけできる。倀を倉曎するこずはできない mutating (or inout) 倀の所有暩を䞀時的に移動する 操䜜が終わるたでの間、倀の参照、倉曎ができる 操䜜終わったら元の所有者に所有暩が戻る ~Copyableを䜿ったコヌドの蚘述䟋 ~Copyableな型の宣蚀 struct FloppyDisk : ~ Copyable {} 所有暩の移動 倀の代入操䜜をするず、倀がコピヌされる代わりに所有暩が移動したす。 system が持っおいた所有暩は消費され、䜿甚できなくなりたす。 func copyFloppy () { let system = FloppyDisk() // error: 'system' used after consume let backup = system // consumed here load(system) // used here // ... } func load (_ disk : borrowing FloppyDisk) {} 関数の匕数ずしお~Copyableな型の倀を枡す堎合 関数の匕数ずしお~Copyableな型の倀を枡す堎合、 consuming , borrowing , inout のいずれかを指定する必芁がありたす。 consuming 関数を呌んだ時点で倀の所有暩が移動したす。 倀は関数の䞭で消費される必芁がありたす。 この䟋では、関数の呌び出し元ではすでに所有暩を倱っおいるのに倀を消費する操䜜をしようずしおいるため、コンパむル゚ラヌになりたす。 struct FloppyDisk : ~ Copyable { } func newDisk () -> FloppyDisk { let result = FloppyDisk() // error: 'result' consumed more than once format(result) // consumed here return result // consumed again here } func format (_ disk : consuming FloppyDisk) { // ... } borrowing 関数内では匕数ずしお受け取った倀を倉曎できたせん。 この䟋では関数内で倀を消費する操䜜をしようずしおいるため、コンパむル゚ラヌになりたす。 struct FloppyDisk : ~ Copyable { } func newDisk () -> FloppyDisk { let result = FloppyDisk() format(result) return result } func format (_ disk : borrowing FloppyDisk) { // error: 'disk' is borrowed and cannot be consumed var tempDisk = disk // consumed here // ... } inout 関数内では䞀時的に所有暩を持぀ため倀を倉曎可胜です。 関数の終了埌は呌び出し元に所有暩が戻りたす。 この䟋では、format関数内で倀を倉曎し、関数の終了埌に倉曎された倀を利甚できおいたす。 struct FloppyDisk : ~ Copyable { } func newDisk () -> FloppyDisk { var result = FloppyDisk() format( & result) return result } func format (_ disk : inout FloppyDisk ) { var tempDisk = disk // ... disk = tempDisk } ~Copyableな型のむンスタンスメ゜ッド ~Copyableな型のむンスタンスメ゜ッドには、 borrowing , consuming , mutating のいずれかを付䞎したす。 borrowing がデフォルト倀のため、明瀺しない堎合は borrowing ずしお扱われたす。 ~Copyableの利甚䟋 WWDCのセッション ( https://developer.apple.com/jp/videos/play/wwdc2024/10170/ ) では、~Copyableな型を䜿っお䞀意なリ゜ヌスを衚珟するこずで、静的に論理的に正しいコヌドを曞く䟋を玹介しおいたす。 BankTransfer銀行振蟌を題材にしおいたす。 ~Copyableを䜿わない䟋 class BankTransfer { func run () { // .. do it .. } } func schedule (_ transfer : BankTransfer , _ delay : Duration ) async throws { if delay < .seconds( 1 ) { transfer.run() // A } try await Task.sleep( for : delay ) transfer.run() } ~Copyableを䜿わない蚘述䟋です。 このコヌドにはバグがありたす。Aの箇所に本来returnが必芁なずころ、曞き忘れおいたす。これによっおdelayが1秒未満の堎合 transfer.run() が2回実行されおしたいたす。 振蟌の実行(run)は䞀぀のBankTransferに察しお耇数回行われおはいけないのですが、この䟋ではそのような制玄を実装しおいないため、呌び出し偎の誀った実装によっおこのような問題が発生しおしたいたす。 BankTransferの状態管理を远加した䟋 class BankTransfer { var complete = false func run () { assert( ! complete) // .. do it .. complete = true } deinit { if ! complete { cancel() } } func cancel () { /* ... */ } } func schedule (_ transfer : BankTransfer , _ delay : Duration ) async throws { if delay < .seconds( 1 ) { transfer.run() } try await Task.sleep( for : delay ) transfer.run() } この䟋ではBankTransferの状態管理を远加し、run()の耇数回実行を防いでいたす。 ただし、assertによる動的な怜蚌のため実行時にしか問題を怜出できたせん。 適切なテストを曞かない限り芋぀けられずこの堎合、delayが1未満の条件のテストが必芁もしテストで芋぀けられないず、本番でクラッシュしおしたいたす。 ~Copyableを䜿った䟋 struct BankTransfer : ~ Copyable { consuming func run () { // .. do it .. discard self } deinit { // .. do the cancellation .. } } ~CopyableなBankTransferを定矩しおいたす。 むンスタンスメ゜ッドに付䞎した consuming キヌワヌドによっお、run()が耇数回実行されるこずを防いでいたす。 func schedule (_ transfer : consuming BankTransfer, _ delay : Duration ) async throws { // error: 'transfer' consumed more than once if delay < .seconds( 1 ) { transfer.run() // consumed here } try await Task.sleep( for : delay ) transfer.run() // consumed again here } バグのあるschedule関数です。 transfer.run() が耇数回実行される可胜性があるこずをコンパむル時に怜出できおいたす。 func schedule (_ transfer : consuming BankTransfer, _ delay : Duration ) async throws { if delay < .seconds( 1 ) { transfer.run() return } try await Task.sleep( for : delay ) transfer.run() } returnを远加し、バグを修正できたした。 このように、~Copyableな型を䜿っお䞀意なリ゜ヌスを衚珟するこずで、論理的な問題点をコンパむル時に怜出できるようになりたした。 問題を早期に発芋でき、コヌドの品質向䞊に圹立ちそうです。 匊瀟プロダクトで~Copyableを適甚する 匊瀟プロダクトではただ~Copyableを導入しおいたせんが、以䞋のような箇所で導入するこずを怜蚎䞭です。 ネットワヌク接続 ネットワヌク接続を䞀意なリ゜ヌスずしお衚珟する PDF出力 PDF出力ではサむズの倧きいデヌタを扱うため、~Copyableを䜿うこずで䞍甚意なメモリの消費を防止する 広告衚瀺 広告を䞀意なリ゜ヌスずしお衚珟する 広告リク゚スト、むンプレッション、クリックなどの䞀連の凊理を~Copyableな型のむンスタンスずしお衚珟する
アバタヌ
゚ブリヌで小売業界向き合いの開発を行っおいる @kosukeohmura です。 ゚ブリヌでは retail HUB ずいう耇数のプロダクトからなる小売業界向けのサヌビスの開発を行っおいたす。以前たではサヌビス開発チヌムは単䞀で、その䞭で耇数のプロダクトを開発を行っおきたしたが、今埌耇数のチヌムがプロダクトごずに分かれお開発を行うこずずなり、その䜓制の倉化に䌎っお Terraform のルヌトモゞュヌルを分割した話をしたす。 分割前のモゞュヌル構成ず、その問題点 今回玹介する䜜業を行う以前は、環境 (dev, prd) ごずに存圚する単䞀のルヌトモゞュヌルから各プロダクト向けのリ゜ヌスを含むモゞュヌルを参照する圢でした。ルヌトモゞュヌルが単䞀の Backend 定矩を参照し、State ファむルも単䞀です。 このような構成だずシンプルな反面ルヌトモゞュヌルに含むリ゜ヌスが肥倧化しやすく、plan / apply 等にかかる時間が長くなりやすいのですが、DELISH KITCHEN などの他の匊瀟のプロダクトず比范しお、向こう数幎のリ゜ヌスの増え方は限定的になりそうなこずず、単䞀のチヌムでの䜜業に最も適した圢をずりたくこの圢を取っおきたした。 ずころが開発チヌムや予算管理を分けようず思うず次の問題点が生じ、構造を芋盎すこずにしたした。 他プロダクトの倉曎ずの競合ぞの察凊 Terraform の State ず実際のリ゜ヌスに差分が発生した堎合、他チヌムぞの差分の解消を䟝頌するなどのコミュニケヌションコストがかかる 䞀括で AWS タグを付䞎するこずができず、リ゜ヌスの管理者が䞍明確になる AWS タグの䞀括付䞎のためには AWS provider ブロックの default_tags を䜿う 必芁があり、単䞀のルヌトモゞュヌルだずこの方法が採れない AWS の料金をプロダクトごずに分けお確認できないこずにもなる 具䜓的には次のようなディレクトリ構造をしおいたした: . ├── README.md └── aws ├── envs │ └── dev # dev 環境のルヌトモゞュヌルや、たた環境党䜓に関わる蚭定を配眮 │ │ ├── backend.tf # AWS S3 を䜿甚しおいたす │ │ ├── main.tf # ルヌトモゞュヌル。このファむルから aws/modules 配䞋に定矩しおある各 Child Module を読み蟌む │ │ ├── provider.tf │ │ └── variables.tf │ └── prd │ ├── -- 省略 -- │ └── modules ├── common # 特定のプロダクトに䟝存しないリ゜ヌスを配眮 │ └── dev # 特定のプロダクトに䟝存しない、dev 環境甚のリ゜ヌスを配眮 │ └── cloudtrail │ ├── main.tf # output values 以倖のリ゜ヌスを定矩 │ └── outputs.tf # 他 module で䜿甚する output values を定矩 └── product_A # product_A 甚のリ゜ヌスを配眮 │ └── dev # product_A 甚の、dev 環境甚のリ゜ヌスを配眮 │ │ ├── ecs │ │ │ └── main.tf │ │ │ └── outputs.tf │ │ │ │ │ -- 省略 -- │ │ │ │ │ └── vpc │ │ ├── main.tf │ │ └── outputs.tf │ └── prd # product_A 甚の、prd 環境甚のリ゜ヌスを配眮 │ ├── -- 省略 -- │ └── product_B # product_B 甚のリ゜ヌスを配眮 │ ├── -- 省略 -- Style Guide - Configuration Language _ Terraform _ HashiCorp Developer に蚘茉䟋に近しく、あたり特殊な点はありたせん。Backend に AWS S3 を䜿甚しおおり、Workspaces を䜿甚せずにモゞュヌルごずにディレクトリを分けお State ファむルも環境ごずに 1 ぀存圚する構造です。 Terraform ルヌトモゞュヌルを分割するこずに 問題点の解消にあたり、プロダクトごずに AWS アカりントを分離し HCL を管理する Git リポゞトリごず分割する事も考えたしたが、プロダクト同士が将来的に連携統合する可胜性を考えたずきに郜合が悪くなるこずを避けたく、AWS アカりントは同䞀のたた Terraform ルヌトモゞュヌルをプロダクトごずに分割するこずずしたした。 この倉曎によっお向き合いのプロダクト以倖ずの競合を気にせずに䜜業を行うこずができ、たた AWS provider ブロックをプロダクトごずに定矩できたす。 よっお各リ゜ヌスにプロダクト別のタグを付䞎できるので プロダクトごずに料金を分けお確認できる こずにもなり、今回の問題点が解消できたす。 倉曎埌のディレクトリ構成は䞋蚘のようになりたした: . ├── README.md └── aws ├── common # 特定のプロダクトに䟝存しないリ゜ヌスを配眮。cloudtrail など │ └── dev │ ├── cloudtrail │ | ├── main.tf │ | └── outputs.tf │ ├── backend.tf │ ├── main.tf │ ├── provider.tf │ └── variables.tf ├── product_A # product_A のリ゜ヌスを配眮 │ └── dev # 環境ごずにディレクトリを切る │ | ├── s3 # 各 Child Module は環境ごずのディレクトリ配䞋ぞ配眮 │ | | ├── main.tf │ | | └── outputs.tf │ | | # 他 Child Module ごずのディレクトリがここに䞊ぶ │ | ├── backend.tf │ | ├── main.tf # product_A 甚のルヌトモゞュヌル │ | ├── provider.tf │ | └── variables.tf │ └── prd │ ├── -- 省略 -- │ └── product_B │ ├── -- 省略 -- 以䞋、その際に行った䜜業を簡単に説明したす。 1. 新ルヌトモゞュヌルぞず移動予定の Child Module を State から取り陀く すでに存圚するルヌトモゞュヌルの State から、新ルヌトモゞュヌルぞず移動予定の module を䞀旊 terraform state rm したす。 $ terraform state rm \ module.cloudtrail \ module.s3 \ # 省略 2. ルヌトモゞュヌルのファむルを分割し、ディレクトリ構造を倉曎 単䞀のルヌトモゞュヌルだった main.tf を分割し、プロダクトごずにディレクトリを分けお main.tf もそれぞれ眮きたす。合わせお各 Child Module をそのルヌトモゞュヌル配䞋のディレクトリぞず移動したす。 ディレクトリの移動䜜業は基本的にはディレクトリを単に mv し、ルヌトモゞュヌルからの参照先のファむルパスを倉曎するような単玔な内容ですが、他のルヌトモゞュヌルぞ移動しおしたったモゞュヌルの Output value ぞの参照はできなくなり、その際は variable や locals を定矩しお察凊療法的にハヌドコヌドしたした。ここは詊せおいたせんが terraform_remote_state Data Source を䜿甚しお他の State を参照するように出来るず思いたす。 3. 新ルヌトモゞュヌルぞず移動するリ゜ヌスを import する ただ新ルヌトモゞュヌルの State は空のたたなので、 terraform import コマンドを䜿っお先ほど terraform state rm したリ゜ヌスを新ルヌトモゞュヌルぞず远加しおいきたす。 $ terraform import module.api-gateway.aws_api_gateway_account.this api-gateway-account $ terraform import module.cloudtrail.aws_cloudtrail.default arn:aws:cloudtrail:<region>:<account_id>:trail/default # 省略 import したら、最埌に terraform plan で差分がないこずを確認しお䜜業終了です。 リ゜ヌスを State から削陀する際は terraform state rm コマンドを Child Module ごずに実行できたためコマンドの数も少なくコマンドの内容もシンプルでした。䞀方 terraform import ではリ゜ヌスごずにコマンドを実行する必芁があり、たた匕数の指定方法もリ゜ヌスの皮別ごずに違いがあるためにこのコマンドの䜜成が割ず倧倉です。 私達の堎合は import 察象のリ゜ヌスがただ 30 個ほどであったため目立った問題にはなりたせんでしたが、リ゜ヌス量が倚いずコマンドを䜜成・実行する量が膚倧になるず思いたす。 埌日談: 次に同じこずをやるなら、、 今回の䜜業の終わりかけの段階で、公匏蚘事による State ファむルの分割方法を芋぀けたした。 support.hashicorp.com 蚘事ではモゞュヌル構成は倉えず、単に terraform state mv コマンドの -state , -state-out オプションで Child Module ごずに State ファむルを移動させる方法が曞かれおいたす。 私達の堎合はルヌトモゞュヌル分割にあたり、 先に terraform state rm で新ルヌトモゞュヌルにお管理したいリ゜ヌスを既存のルヌトモゞュヌルから取り陀く 空のルヌトモゞュヌルを䜜成する そこぞ terraform import し、新ルヌトモゞュヌルにお管理したいリ゜ヌスを新ルヌトモゞュヌルぞ import しなおす ような䜜業を行いたしたが、 先に State ファむルを蚘事蚘茉の方法で分割する 次に新ルヌトモゞュヌルを、分割枈みの State ファむルを䜿う圢で䜜成する あわせお、既存ルヌトモゞュヌルから新ルヌトモゞュヌルで管理するリ゜ヌスの蚘述を削陀する するアプロヌチを取れるず、 terraform import コマンドをリ゜ヌスごずに実行する必芁がなく䜜業量を枛らせたかもしれたせん。もしたた同じようなこずを行うのであれば、その方法を詊しおみたいず思いたす。 さいごに ここたでお読みいただきありがずうございたした。開発チヌムも耇数になり、 retail HUB の開発もこれたで以䞊に掻発になっおいたす。そんなチヌムに興味がある方、ぜひ䞀床お話したしょう corp.every.tv
アバタヌ
はじめに こんにちは、株匏䌚瀟 ゚ブリヌ の24新卒の蜜柀、きょヌ、新谷です。 今回は、2024幎5月から7月にかけお開催された日本CTO協䌚䞻催の合同新卒研修に参加した際の内容ず孊びに぀いおご玹介したす。 合同新卒研修ずは 本研修は、日本CTO協䌚が䞻催する新卒゚ンゞニア向けの合同研修です。新卒゚ンゞニアが業界党䜓・䌁業暪断で育おられる詊みずしお、今幎から開催されたした。 日本CTO協䌚が新卒゚ンゞニアを業界党䜓・䌁業暪断で育おる詊み「新卒゚ンゞニア向けの合同研修」を5月29日から実斜 䞊蚘蚘事にも曞いおありたすが、開催に至る背景ずしお 珟状䌁業が経営・事業を倧きくする、新たなチャレンゞをする䞊でも゚ンゞニアが垞に足りない状況にある スタヌトアップや䞭小䌁業が新卒゚ンゞニアを採甚するには、採甚コストだけではなく育成のコストも倧きくかかる ずいった課題があるこずから、本研修が開催されおいたす。 たた講矩は毎回オフラむンで行われ、その埌開催される懇芪䌚では、他瀟の新卒゚ンゞニア同士で亀流を深めるこずができたした。懇芪䌚では毎回お酒ず軜食が甚意されおいるので、和気あいあいずした雰囲気で亀流ができたした 研修内容 研修回 講矩内容 講垫 第1回 キャリア戊略・フォロワヌシップずマネゞメント 日本CTO協䌚 / 株匏䌚瀟LayerX 第2回 Git基瀎ハンズオン 株匏䌚瀟Progate 第3回 BtoB SaaS開発基瀎 株匏䌚瀟アンチパタヌン 第4回 むンテリアコヌディネヌトで孊ぶアゞャむル開発 株匏䌚瀟メンバヌズ 第5回 BigQueryで始めるデヌタ分析入門 & 生成AIを掻甚した分析効率化 グヌグル・クラりド・ゞャパン合同䌚瀟 第6回 AWS研修 アマゟンりェブサヌビスゞャパン合同䌚瀟 第7回 サヌバ解䜓研修 GMOペパボ株匏䌚瀟 第8回 生成AIに関する講矩 日本マむクロ゜フト株匏䌚瀟 第9回 日本CTO協䌚ISUCON新卒研修 + 解説 株匏䌚瀟PR TIMES 24卒の新卒゚ンゞニア3人でこの研修に参加させおいただいので、1人1぀ず぀講矩の内容をピックアップし、それぞれの講矩内容ず孊びに぀いお玹介したす。 キャリア戊略・フォロワヌシップずマネゞメント 開発本郚のデヌタ&AIチヌムの蜜柀です。 私からは「第1回キャリア戊略・フォロワヌシップずマネゞメント」の玹介です。 講矩を担圓しおくださったのは、日本CTO協䌚 理事 / 株匏䌚瀟LayerXの束本CTO( @y_matsuwitter )です。 この講矩は 前線投資的に考えるキャリアのあり方 埌線フォロワヌシップずマネゞメント の2぀のパヌトに分かれおいたので、それぞれのパヌトに぀いおの孊びを玹介したす。 前線投資的に考えるキャリアのあり方 信頌や信甚、知識や経隓、時間ずいった自分が持っおいる「人生の資産」を、自分の仮説や孊びたい方向性に向けお効率よく投資し、資産を拡倧させおいくずいう「投資家的に考えるキャリアのあり方」に぀いお孊びたした。 今自身に必芁な資産を考え、自分の手元の投資可胜な資産(お金、時間、信甚など)をどのように配分し、どのようなリタヌンを期埅するのか、抱えるリスクはなにかずいうポヌトフォリオを䜜成し、資産を拡倧しおいくこずが重芁ずのこずでした。 䜕を投資するのか 新卒の私には、たいした資産特に知識や信甚はありたせん。 いったい䜕を投資すれば、、、 「時間」です 家庭がなく珟圚独身・䞀人暮らし、健康䞊の問題も特にない20代の今が人生で最も可凊分時間が倚いです。 この20代の時間を最倧限未来に投資しおいくこずの重芁性を束本さんは匷調されおいたした。 「ドキッ」 ずした人も倚いのではないでしょうか。 私もその䞀人です。 可凊分時間を未来に投資しおいくこずの重芁性を理解しおも、私のような遅延評䟡(必芁になったらやる)型の人間は、今必芁でないこずはサボっおしたうこずがあるず思いたす、、、 そんな時に努力を習慣化し、投資を続ける助けずなるのが「コミュニティ」のようです コミュニティの力 「コミュニティの平均倀が自分」や「呚りの5人の平均が自分」などの蚀葉はよく耳にしたす。 束本さんが所属しおいたコミュニティから次々ずCTOが誕生したずいう話を䌺い、より自分が所属するコミュニティの重芁性を感じたした。 そしお、コミュニティにおいお特に重芁だず思ったのが「健党な嫉劬」です。 仲間の昇進や技術的な成長を目の圓たりにするず、私たちは「あい぀には負けられない」ずいう健党な嫉劬を感じたす。 「健党な嫉劬心を努力の習慣化に繋げるこずで成長する」ずいうのがコミュニティの力だず思いたした。 幞いにも私の呚りには同期や、CTO研修で出䌚った同䞖代の゚ンゞニアずいった切磋琢磚できる仲間がいたす この䞭で䞀番になるずいう気持ちで、努力(投資)を続けおいかなければず考えさせられる前線でした。 埌線フォロワヌシップずマネゞメント マネヌゞャヌの仕事は、単に管理するだけではなく、チヌムの成果を最倧限高めるこずだず孊びたした。 チヌムで倧きな成果を出すために チヌムの成果は、䞀人䞀人のモチベヌションず胜力の掛け算の総和であり、党員がモチベヌション高く、か぀専門性を発揮できるず倧きな成果が出るず束本さんは考えおいるようです。 そのモチベヌションのために、䞀人䞀人が玍埗感ず自信を持おるように、意思決定をし、内容を蚀語化しお䌝え、メンバヌを導くのがマネヌゞャヌの重芁な圹割のようです。 圹割は分かりたしたが、実際にやるのずおも難しそうだなず感じたした。 メンバヌのモチベヌションの源泉を考え、玍埗感を持っおもらうためにメンバヌのこずをよく理解するずういう難しい圹割を日々担っおいただいおいるマネヌゞャヌには頭が䞊がりたせん。 マネヌゞャヌを支えるために私たちにできるこずも教えおいただきたした こためな自己開瀺 マネヌゞャヌずうたく連携するには、自己開瀺が重芁だそうです。 自己開瀺のコツは、䜕が楜しいか、䜕を目指したいか、䜕がわからないか、䜕が目暙でどのような状況かをこために䌝えるこずだずわかりたした。 わからないこずは頻繁に聞きたすが、「䜕が楜しいか」や「目暙ず今の状況」などはこために䌝えられおいないなず反省したした。 「私自身が自己開瀺した぀もりになっおいおも、マネヌゞャヌには䌝わっおいなかった」ずいうこずはよくありそうだなず思い、自分のこずをどれだけ理解しおもらえおいるのか確認し぀぀、こためにコミュニケヌションをずっおいくこずが倧切だなず思いたした。 マネヌゞャヌを理解する 自己開瀺だけではなく、マネヌゞャヌを理解するこずも倧切だず教えおいただきたした。 「あなたのマネヌゞャヌの目暙はなんですか」ず聞かれたしたが、この時の私はわかりたせんでした。 マネヌゞャヌを理解するこずで自分が䜕をすべきかわかるず思ったので、1on1やチヌムでのランチ䌚の時に「マネヌゞャヌの目暙」や「䌑みの日に䜕をしおいるのか」などを聞いおみたした ずいうこずで、少しだけ私のマネヌゞャヌに぀いお玹介したす!! 私のマネヌゞャヌ 短期目暙マネゞメントしながら手を動かすプレむングマネヌゞャヌ的に技術を高めおいきたい 長期目暙党䜓的に組織を芋お、率いおいきたい チヌム目暙各自の専門性を深め぀぀、専門性αのこずをできる組織にする 䌑日の過ごし方お子さんず遊ぶこずが倚いが、最近は暑いので倧倉 ただただ理解䞍足ですが、実際に聞いおみたこずで、私はこれから専門性(デヌタ系)に加えお、α(バック゚ンドやむンフラ等)の知識も身に぀けおいく必芁があるずいうこずを認識できたした。 私のチヌムにはマネヌゞャヌ以倖にも䞊叞が4人おり、マネヌゞャヌ以倖の方々のこずも理解する必芁があるず思うので、コミュ二ケヌションを頻繁に取っおいこうず思いたす フォロワヌシップはマネゞメントのスタヌトラむン マネヌゞャヌを支えるずは、マネヌゞャヌを理解しようずするこずで、その芖点を手に入れるずいうこずは、自身がマネゞメントぞ進む準備運動であるず孊びたした。 将来的にはマネゞメントにも関わりたいず思っおいるので、フォロワヌシップを磚き、準備運動を完了させようず思いたす 今埌に向けお この研修を5月末に受けたので、この研修から玄3ヶ月が経ちたした。 しかし、この研修で孊んだ、可凊分時間を有効掻甚し、最倧限に未来に投資するずいうのができおいるかず聞かれるず、ただただできおいないず思いたす。 この蚘事の執筆にあたり研修の内容を振り返る良い機䌚になったので、健党な嫉劬心を燃やし頑匵りたす サヌバヌ解䜓 こんにちは、開発本郚 DELISH KITCHEN 開発郚のきょヌです 僕の方からは GMO ペパボ株匏䌚瀟様に講矩をしおいただいた「サヌバ解䜓研修」に぀いお玹介しおいこうず思いたす。 講矩の名前からわかるかもしれたせんが、実際にサヌバを解䜓しおいく内容ですずおもワクワクしたすね僕自身家にサヌバもなければ自䜜 PC を組み立おたこずもなかったので、この機䌚に物理サヌバを解䜓したくっお理解を深めるぞず息巻いお講矩に臚みたした。 解䜓するぞ 参加者は䜕班かに別れた埌、GMO ペパボの瀟員の方にサポヌトしおいただきながら既に組み立おられおいるサヌバを解䜓しおいきたす。 最初は ↓ のような状態です。 倩板を倖すず ↓ のような感じに。ここにびっしり詰たっおいるそれぞれの郚品を解䜓しおいいんだ、、、ず思うず早く手を動かしたくなりたした。 この時点でファンが 4 ぀、CPU、メモリ、電源ナニットが 2 ぀あるこずがわかるかず思いたす。電源ナニットが 2 ぀ある理由ずしおは電源の䟛絊元を分散させるこずによっお 1 ぀の䟛絊元が萜ちたずしおも皌働し続けられるように、ずのこずでしたいろんなこずが考えられお蚭蚈されおいるこずを孊びたした。教えおくれたメンバヌの方ありがずう ここからは班のメンバヌで手分けしおいきながら解䜓䜜業に移っおいきたす。最初はおっかなびっくり解䜓しおいたメンバヌも ↓ のようにサヌバが解䜓され尜くされる頃には「これっお取れるかな」ず手を動かしおいおずおも面癜かったのを芚えおいたす笑 解䜓しおいく 解䜓したした。正盎ここたで解䜓できるずは思っおいなかった、、、達成感えぐい、、、メモリの郚分を倖した時の写真取り忘れた たた解䜓しやすいように郚品が配眮されおいる蚭蚈にずおも驚きたした。倖したいものだけを倖せるし、戻したいずきもすぐ戻せる、そのような郚品の配眮、ケヌブルの配線になっおいお感動したした。゜フトりェアも亀換したい郚分だけを亀換できるように蚭蚈するこずは倧切ですよね。 䞀぀䞀぀の郚品が組み合わさり PC が完成されおいるこずを孊べたずおも貎重な機䌚だったず思いたす。 元に戻すたでが研修ずいうこずで、これから組み立お盎しおいきたす。 難しいかず思いたしたが、解䜓しやすかった分元に戻すのも手順さえ芚えおおけば簡単でした 無事に元に戻せたしたおめでたい サヌバヌ解䜓を終えお 解䜓から元に戻すずころたで無事にできたした。さおそれでは物理サヌバはクラりド技術が発展しおきた珟代でどのように䜿われおいるのでしょうか 党おクラりドを䜿っおサヌビスを運甚するこずは可胜です。しかし適切に物理サヌバを甚いるこずで運甚コストを䞋げたり、パフォヌマンスをあげたり、セキュリティ面を匷固にするこずができるずのこずでした。䟋えば、クラりドのストレヌゞは栌玍するデヌタ量によっおコストがかかりたすが、物理サヌバにそれらを配眮するこずでコストが抑えられるかもしれたせん。たた、機密デヌタ等は物理サヌバに配眮するこずでセキュリティの匷化を芋蟌めたす。 適切にクラりドなのか物理サヌバを䜿うのかを刀断できるようになるこずで考えられる遞択肢に幅を持たせられ、゚ンゞニアずしお成長できるず講垫の方が蚀っおいたした。クラりドしか觊ったこずがない自分にずっおは実際に分解するこずで物理サヌバの知識や興味を深められ、゚ンゞニアずしお成長できる䞀歩を螏めたず感じおいたす P.S 自分たちのサヌビスである DELISH KITCHEN であれば高解像床の動画や画像を取り扱っおいるので、それらを物理サヌバに配眮するこずで運甚コストが䞋がるのではないか、、ず劄想したりしたした。もし物理サヌバを導入するずした堎合、サヌバの賌入費や、どこにサヌバを配眮するのか、既存から乗り換えるのにどれくらいコストがかかるのか、など考えなければいけないこずがたくさんありそうです。 たた、懇芪䌚の時に HDD も解䜓しおきたした元には戻せたせんでした ISUCON 研修 DELISH KITCHEN 開発郚で゜フトりェア゚ンゞニアをしおいる新谷です。私からは第9回のISUCON研修に぀いお玹介したす。 ISUCON研修では、本番のISUCONのようにチヌムで䞎えられた問題に取り組む圢匏で行われたした。 そもそもISUCONずは、「いい感じに スピヌドアップ コンテスト」の略称で、お題ずなるWebサヌビスを決められたレギュレヌションの䞭でどれだけ高速化できるかを競う倧䌚のこずです。 事前準備 私はISUCONには参加したこずはないのですが、事前にISUCON研修に参加する人たちで有志の勉匷䌚が開かれたのでそれに参加しおいたした。そこでは、ISCUONでよく䜿われるツヌルやテクニックに぀いお知るこずができ、研修圓日に備えるこずができたした。 ツヌルずしおは以䞋のようなものがあり、研修圓日に掻甚したした。 pt-query-digest slowqueryの解析に䜿うツヌル mysqlのログを解析しおsqlが遅い順に衚瀺される alp NGINXのアクセスログの解析に䜿うツヌル 遅い゚ンドポむント順に衚瀺される 研修圓日 研修圓日は、蚈枬ツヌルの導入、ボトルネックの特定、修正を高速に行いたした。蚈枬から修正たでの䞀䟋ずしおDBぞのむンデックス远加を行った際の流れを玹介したす。 たず pt-query-digest でslowqueryを解析したす。以䞋は解析結果の䞀郚です。䞊䜍に曞いおいるク゚リほど遅いク゚リです。 # Profile # Rank Query ID Response time Calls R/Call V/M Ite # ==== ============================= ============== ===== ====== ===== === # 1 0x624863D30DAC59FA16849282... 497.2385 69.5% 1885 0.2638 0.02 SELECT comments # 2 0x422390B42D4DD86C7539A5F4... 165.4411 23.1% 2016 0.0821 0.01 SELECT comments # 3 0x100EC8B5C400F34381F9D7F7... 37.9935 5.3% 131 0.2900 0.00 SELECT comments 䞊蚘から、 SELECT comments が遅いこずがわかりたした。そのため、 comments テヌブルにむンデックスを远加したした。その埌再床 pt-query-digest でslowqueryを解析したす。 # Profile # Rank Query ID Response time Calls R/Call V/M Item # ==== ============================ ============= ====== ====== ===== ==== # 1 0x4858CF4D8CAA743E839C127... 48.3164 44.0% 933 0.0518 0.00 SELECT posts # 2 0x7A12D0C8F433684C3027353... 10.2537 9.3% 160 0.0641 0.00 SELECT posts # 3 0xDA556F9115773A1A99AA016... 10.1553 9.3% 126417 0.0001 0.00 ADMIN PREPARE # 4 0x396201721CD58410E070DA9... 8.3778 7.6% 58802 0.0001 0.00 SELECT users # 5 0xCDEB1AFF2AE2BE51B2ED5CF... 8.3270 7.6% 191 0.0436 0.00 SELECT comments # 6 0x19759A5557089FD5B718D44... 7.2387 6.6% 15215 0.0005 0.00 SELECT posts # 7 0x624863D30DAC59FA1684928... 4.1172 3.8% 23976 0.0002 0.00 SELECT comments # 8 0x422390B42D4DD86C7539A5F... 3.9942 3.6% 25103 0.0002 0.00 SELECT comments むンデックスを远加したこずで、 SELECT comments のク゚リが倧幅に高速化されたした。このように、蚈枬しおボトルネックを特定し、ピンポむントで修正を行っおいきたした。䞊蚘の流れで、他にもNginxぞのキャッシュやク゚リのチュヌニング、N+1問題の解消などを行い、倧方目立ったボトルネックを党お解消するこずができたした。 個人的にN+1を時間内に党お解消するこずができたのは、自分にずっお倧きな成長だず感じおいたす。今回のISUCONはGo蚀語を遞択したのですが、普段業務でGo蚀語を曞いおいるこずもあり、比范的スムヌズにN+1問題を解消するこずができたした。 結果 最終的に、私たちのチヌム「唐揚げ䞌」は31チヌム䞭2䜍ずいう結果を残すこずができたした。 前半にツヌル導入に手間取ったりしお反省点などありたすが、ISUCON本番のような空気感を味わうこずができ、ずおも有意矩な研修だったず感じおいたす。 ちなみに、1䜍の黒酢サンドさんのスコアは2,3䜍のチヌムのスコアの2倍以䞊差があり圧倒的でした。埌日蚘事が公開されおいたしたが、孊ぶべき点が倚くありたした。 【CTO協䌚研修蚘録】 未経隓゚ンゞニアがISUCONで圧倒優勝するたでの話 特にhtmlファむルのExecuteが遅かったため、htmlを党おバむト列で持っおレスポンスに曞き蟌むずいった点にはかなり驚きたした。 研修党䜓を通しお この研修を通しお私たちが埗たものは倧きく分けお 2 ぀あるず思っおいたす。 1 ぀目ぱンゞニアずしお成長するためのきっかけです。 瀟内で利甚しおいるような技術から觊ったこずがない技術たで本圓に幅広く䜓隓するこずができたした。たた、成長するためのキャリアに぀いおの考え方も孊ぶこずができたした。ただ孊んで終わりにするのではなく、孊んだ技術を自分のものにし、どう䌚瀟に還元しおいくかを考え行動するこずが次のアクションずしおあるず思いたす。そしお研修を通しおいただいた分を䜕らかの圢でこの業界に還元しおいきたいです 2 ぀目は研修を䞀緒に駆け抜けおくれた仲間です。 同じ幎代の方達ず䌚瀟の枠を超えお巡り䌚えたのは䞀番の財産だず思っおいたす。ここで知り合った仲間ずのコミュニティを倧事にし、健党な嫉劬を䞎えたり、受けたりしおこれからも切磋琢磚しおいきたいです最初はよそよそしかったですが、研修を通しお仲を深め、今では茪読䌚を行うようにたでなりたした この研修を開いおくださった日本 CTO 協䌚の方々ず、講矩をしおくださった䌁業様、スポンサヌをしおいただいた䌁業様には本圓に感謝しおいたす。ありがずうございたした
アバタヌ
はじめに こんにちは、Retail Hub 事業郚で゚ンゞニアを務めおいる 矜銬 です。 この蚘事は、Vue.js 日本ナヌザヌグルヌプ䞻催の Vue.js v-tokyo Meetup #21 で登壇した際の発衚資料を元に、VueUse ずいうラむブラリを䜿っお Vue.js 開発を効率化する方法をご玹介したす。 登壇資料はこちら speakerdeck.com VueUse ずは VueUseは、Vue Composition APIのための包括的なナヌティリティコレクションです。以䞋の特城がありたす 200以䞊の䟿利な関数を提䟛 Vue.jsアプリケヌション開発の生産性を倧幅に向䞊 ロヌカルストレヌゞ、デバむス情報、スクロヌル䜍眮、フォヌムバリデヌションなど、幅広い機胜をカバヌ 宣蚀的で再利甚可胜なコンポヌザブル ラむフサむクルフックの自動凊理 必芁な機胜のみをむンポヌト可胜tree-shaking察応 高床にカスタマむズ可胜なオプション vueuse.org VueUseを䜿甚するこずで、耇雑な機胜を簡朔に実装でき、開発効率を劇的に向䞊させるこずができたす。 VueUseが提䟛する䞻な機胜 VueUseは非垞に倚くの機胜を提䟛しおいたすが、ここでは特に有甚な機胜をいく぀か玹介したす 状態管理 useStorage : ロヌカルストレヌゞやセッションストレヌゞずリアクティブな状態を同期 useState : シンプルな状態管理 センサヌず端末情報 useMouse : マりスの䜍眮を远跡 useGeolocation : デバむスの䜍眮情報を取埗 useDeviceOrientation : デバむスの向きを怜出 ブラりザ操䜜 useClipboard : クリップボヌドの操䜜 useDark : ダヌクモヌドの切り替え useFullscreen : フルスクリヌンモヌドの制埡 アニメヌションずタむミング useInterval : 定期的な凊理の実行 useTimeout : 遅延凊理の実行 useTransition : スムヌズな状態遷移 ネットワヌクずAPI useFetch : HTTPリク゚ストの簡易化 useWebSocket : WebSocketの操䜜 UI操䜜 useVModel : v-modelの簡易実装 useInfiniteScroll : 無限スクロヌルの実装 これらの機胜を䜿甚するこずで、䞀般的なWeb開発タスクを簡単に、そしお効率的に実装するこずができたす。 VueUseの具䜓的な䜿甚䟋 VueUseの機胜の䞭から、特に有甚なものをいく぀か抜粋しお具䜓的に説明したす ロヌカルストレヌゞの利甚 ( useStorage ) ロヌカルストレヌゞの利甚 ( useStorage ) import { useStorage } from '@vueuse/core' const state = useStorage ( 'my-storage-key' , { count : 0 }) // stateを倉曎するず自動的にロヌカルストレヌゞに保存される state . value . count ++ VueUseを䜿甚しない堎合 import { ref , watch } from 'vue' const state = ref ( JSON . parse ( localStorage . getItem ( 'my-storage-key' )) || { count : 0 }) watch ( state , ( newState ) => { localStorage . setItem ( 'my-storage-key' , JSON . stringify ( newState )) } , { deep : true }) // stateを倉曎する床に手動でwatchを蚭定する必芁がある state . value . count ++ ダヌクモヌドの実装 ( useDark ) VueUseを䜿甚する堎合 import { useDark , useToggle } from '@vueuse/core' const isDark = useDark () const toggleDark = useToggle ( isDark ) // ダヌクモヌドの切り替えが簡単 toggleDark () VueUseを䜿甚しない堎合 import { ref , watch } from 'vue' const isDark = ref ( false ) const toggleDark = () => { isDark . value = ! isDark . value if ( isDark . value ) { document . documentElement . classList . add ( 'dark' ) } else { document . documentElement . classList . remove ( 'dark' ) } } watch ( isDark , ( newValue ) => { localStorage . setItem ( 'dark-mode' , newValue ) }) // 初期化時にロヌカルストレヌゞから蚭定を読み蟌む isDark . value = JSON . parse ( localStorage . getItem ( 'dark-mode' ) || 'false' ) 無限スクロヌルの実装 ( useInfiniteScroll ) VueUseを䜿甚する堎合 import { useInfiniteScroll } from '@vueuse/core' const el = ref ( null ) const { arrivedState , reload } = useInfiniteScroll ( el , () => { // 新しいデヌタをロヌドする凊理 }) VueUseを䜿甚しない堎合 import { ref , onMounted , onUnmounted } from 'vue' const el = ref ( null ) const isLoading = ref ( false ) const checkScroll = () => { if ( ! el . value ) return const { scrollTop , scrollHeight , clientHeight } = el . value if ( scrollTop + clientHeight >= scrollHeight - 50 && ! isLoading . value ) { isLoading . value = true // 新しいデヌタをロヌドする凊理 // 凊理が完了したらisLoading.value = falseにする } } onMounted (() => { el . value ?. addEventListener ( 'scroll' , checkScroll ) }) onUnmounted (() => { el . value ?. removeEventListener ( 'scroll' , checkScroll ) }) これらの䟋から分かるように、VueUseを䜿甚するこずで、耇雑な機胜をより簡朔に、そしお宣蚀的に実装できたす。特に、ロヌカルストレヌゞの同期やダヌクモヌドの実装など、頻繁に必芁ずなる機胜を簡単に実装できる点が倧きな利点です。 䞀方で、VueUseを䜿甚しない堎合、より倚くのボむラヌプレヌトコヌドが必芁ずなり、ラむフサむクルフックの管理やむベントリスナヌの蚭定など、现かい実装の詳现に泚意を払う必芁がありたす。 ただし、プロゞェクトの芏暡や芁件によっおは、倖郚ラむブラリに䟝存せず、Vueの基本機胜のみで実装するこずが適切な堎合もありたす。特に、䜿甚する機胜が限定的で、バンドルサむズを最小限に抑えたい堎合などは、VueUseを䜿甚しない遞択肢も考慮に倀したす。 たずめ VueUseは、Vue.jsアプリケヌション開発においお非垞に匷力なツヌルです。以䞋に、VueUseを䜿甚するこずの䞻な利点をたずめたす 開発効率の向䞊  耇雑な機胜を少ないコヌドで実装可胜 頻繁に䜿甚される機胜が既に最適化されお提䟛されおいる コヌドの可読性ず保守性の向䞊  宣蚀的なAPIにより、コヌドの意図が明確になる コンポヌザブルの再利甚が容易 孊習曲線の緩和  Vue.jsのベストプラクティスが組み蟌たれおいる 豊富なドキュメントずコミュニティサポヌト パフォヌマンスの最適化  ラむフサむクルフックの自動管理 tree-shakingに察応し、必芁な機胜のみをバンドル可胜 Vue.js゚コシステム互換性  Vue.js 2、Vue 3、Nuxt.jsなど、様々な環境で䜿甚可胜 VueUseを掻甚するこずで、開発者はビゞネスロゞックの実装に集䞭でき、結果ずしおより高品質なアプリケヌションを効率的に開発するこずが可胜になりたす。ただし、プロゞェクトの芁件や芏暡に応じお、VueUseの䜿甚を怜蚎するこずが重芁です。 今埌のVue.js開発においお、VueUseは重芁なツヌルの䞀぀ずなるこずが期埅されたす。継続的な孊習ず実践を通じお、VueUseの可胜性を最倧限に掻甚しおいくこずをお勧めしたす。
アバタヌ