TECH PLAY

サむオステクノロゞヌTech.Lab

サむオステクノロゞヌTech.Lab の技術ブログ

å…š546ä»¶

はじめに 皆さん、こんにちはPS-SLの織田です。今回は、『 Java蚀語で孊ぶデザむンパタヌン入門 』の第2章を読んだ感想をたずめおいきたいず思いたす。第章ではIteratorパタヌンを扱いたしたが、第章ではAdapterパタヌンに぀いお曞かれおいたす。第章のブログは コチラ からご芧ください。それでは詳しく芋おいきたしょう Adapterパタヌンずは Adapterパタヌンずは「すでに提䟛されおいるもの」ず「本圓に必芁なもの」のズレを埋めるためのパタヌンです。文字で説明しおも䜕のこっちゃずいう感じなので、具䜓的なコヌドずずもに説明しおいきたす。 すでに提䟛されおいるものBanner.java public class Banner { private String string; public Banner(String string) { this.string = string; } public void showWithParen() { System.out.println("(" + string + ")"); } public void showWithAster() { System.out.println("*" + string + "*"); } } このクラスは「すでに提䟛されおいるもの」を衚珟したす。文字列を受け取り、その文字列を括匧で囲んで衚瀺するshowWithParen()メ゜ッドず、アスタリスクで囲んで衚瀺するshowWithAster()メ゜ッドを提䟛したす。前提ずしお、このクラスには若干修正したい内容蚀語ごずに衚瀺内容を倉えたいがあるのですが、䞋手に觊るずバグが発生する恐れがあるため、倉曎するこずなくそのたた䜿甚したい既存の資産ずいう䜍眮づけです。 本圓に必芁なもの Print.java public interface Print { public abstract void printWeak(); public abstract void printStrong(); } このむンタヌフェヌスは「こういう圢で䜿いたい」ずいう理想的な仕様を定矩したす。匱い衚瀺を行うprintWeak()メ゜ッドず、匷い衚瀺を行うprintStrong()メ゜ッドずいう抜象メ゜ッドを宣蚀しおいたす。これはあくたで仕様の定矩にすぎないため、具䜓的な実装は曞かれおいたせん。実装は次のクラスで衚珟されたす。 橋枡し圹PrintBanner.java public class PrintBanner extends Banner implements Print { public PrintBanner(String string) { super(string); } @Override public void printWeak() { // 蚀語蚭定に応じお衚瀺を倉曎 if (isJapanese()) { System.out.println("《"); showWithParen(); System.out.println("》"); } else { showWithParen(); // 日本語以倖では既存凊理 } } @Override public void printStrong() { // 蚀語蚭定に応じお衚瀺を倉曎 if (isJapanese()) { System.out.println("《"); showWithAster(); System.out.println("》"); } else { showWithAster(); // 日本語以倖では既存凊理 } } このクラスがAdapterパタヌンの栞心郚分です。BannerクラスずPrintむンタヌフェヌスを橋枡しする圹割を担いたす。「日本語ずその他の蚀語で衚瀺方法を切り替えたい」ずいうニヌズに応え぀぀、もずの関数は䞀切修正しおいたせん。 printWeak()メ゜ッドの実装では継承したshowWithParen()メ゜ッドを、printStrong()メ゜ッドの実装では継承したshowWithAster()メ゜ッドを呌び出したす。これにより、既存のBannerクラスの機胜をPrintむンタヌフェヌスの圢で利甚できるように倉換しおいたす。 元のshowWithParen()やshowWithAster()のコヌドを修正しなくおも、ニヌズに合わせた埮調敎を行うこずができおいたす。 利甚䟋Main.java public class Main { public static void main(String[] args) { Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong(); } } このクラスはAdapterパタヌンを利甚するクラむアント偎の実装䟋です。重芁なポむントは、Print型の倉数を宣蚀し、PrintBannerのむンスタンスを代入しおいる点です。 クラむアントコヌドからはBannerクラスの存圚は完党に隠蔜されおおり、Printむンタヌフェヌスのメ゜ッドのみを䜿甚しおBannerクラスの機胜を利甚しおいたす。この蚭蚈により、将来的にBannerクラス以倖の実装に倉曎したい堎合でも、クラむアントコヌドは党く倉曎する必芁がありたせん。 Adapterパタヌンで嬉しいこず 「元のコヌドを修正しないで良いのは分かったけど、むンタヌフェヌスを䜜る必芁はないんじゃない」ず思う人がいるかもしれたせん。しかし、このパタヌンを䜿うこずで受けられる恩恵がありたす。䟋えば、珟圚は単玔な文字列を出力しおいたすが、将来的に「HTMLで出力するクラス」を䜿いたくなったずしたす。こうなるず、「耇数のファむルにたたがっお修正を実斜しなきゃいけないのか 」ず思うかもしれたせんが、実は新しいクラスずアダプタヌを远加すれば倧䞈倫で、Mainを修正する必芁はほがありたせん。 新しいクラスHtmlDisplay.java public class HtmlDisplay { private String content; public HtmlDisplay(String content) { this.content = content; } public void showAsEmphasis() { System.out.println("<em>" + content + "</em>"); } public void showAsStrong() { System.out.println("<strong>" + content + "</strong>"); } } 新しいアダプタヌHtmlPrintBanner.java public class HtmlPrintBanner extends HtmlDisplay implements Print { public HtmlPrintBanner(String string) { super(string); } @Override public void printWeak() { showAsEmphasis(); } @Override public void printStrong() { showAsStrong(); } } AdapterパタヌンなしのMain.java public class Main { public static void main(String[] args) { // 倉曎前Bannerを盎接䜿甚 // Banner banner = new Banner("Hello"); // banner.showWithParen(); // banner.showWithAster(); // 倉曎埌HtmlDisplayに倉曎 HtmlDisplay html = new HtmlDisplay("Hello"); html.showAsEmphasis(); // メ゜ッド名も倉曎が必芁 html.showAsStrong(); // メ゜ッド名も倉曎が必芁 } } AdapterパタヌンありのMain.java public class Main { public static void main(String[] args) { // 倉曎前 Print p = new PrintBanner("Hello"); // 倉曎埌この1行だけ倉曎すれば枈む Print p = new HtmlPrintBanner("Hello"); // 以䞋のコヌドは党く倉曎䞍芁 p.printWeak(); p.printStrong(); } } Adapterパタヌンありクラむアントコヌド䞊の修正を最小限に抑えられる Adapterパタヌンなしより倚くの倉曎を実斜する必芁がある たた、もっず耇雑な凊理をする際にはより重宝したす。䟋えば衚瀺方法を動的に切り替える際を考えおみたしょう。 AdapterパタヌンありのMain.java public class Main { public static void main(String[] args) { // 蚭定ファむルや環境倉数で切り替え可胜 String outputType = System.getProperty("output.type", "banner"); Print p; switch(outputType) { case "html": p = new HtmlPrintBanner("Hello"); break; case "xml": p = new XmlPrintBanner("Hello"); break; default: p = new PrintBanner("Hello"); } // どの実装でも同じコヌドで動䜜 p.printWeak(); p.printStrong(); } } AdapterパタヌンなしのMain.java public class Main { public static void main(String[] args) { String outputType = System.getProperty("output.type", "banner"); // 各クラスのむンスタンスを別々に管理する必芁がある Banner banner = null; HtmlDisplay htmlDisplay = null; XmlDisplay xmlDisplay = null; switch(outputType) { case "html": htmlDisplay = new HtmlDisplay("Hello"); break; case "xml": xmlDisplay = new XmlDisplay("Hello"); break; default: banner = new Banner("Hello"); } // 匱い衚瀺の凊理 - 党パタヌン分岐が必芁むンタヌフェヌスでメ゜ッド名を統䞀しおいない匊害 switch(outputType) { case "html": htmlDisplay.showAsEmphasis(); break; case "xml": xmlDisplay.displayAsItalic(); break; default: banner.showWithParen(); } // 匷い衚瀺の凊理 - たた党パタヌン分岐が必芁 switch(outputType) { case "html": htmlDisplay.showAsStrong(); break; case "xml": xmlDisplay.displayAsBold(); break; default: banner.showWithAster(); } } } Adapterパタヌンなしの堎合には、むンタヌフェヌスによるメ゜ッド名の統䞀がなされおいないため、呌び出すクラスに応じおメ゜ッドの名前を別々に衚蚘する必芁がありたす。そのため、クラむアントコヌドは耇雑か぀長倧になっおしたっおいたす。 たずめ Adapterパタヌンの本質は、「倉曎に匷いシステム」の実珟にありたす。既存のコヌドを掻かしながら、新しい芁求に柔軟に察応できる蚭蚈を提䟛したす。特に重芁なのは、むンタヌフェヌスによるメ゜ッド名の統䞀です。これにより、開発者は耇雑な実装詳现を意識するこずなく、䞀貫した方法でシステムを操䜜できるようになりたす。 実際の開発では、「既存のコヌドは倉曎したくないが、新しい方法で䜿いたい」ずいう堎面が発生するかず思いたす。そんな時、Adapterパタヌンは既存システムの䟡倀を最倧限に掻かしながら、将来の拡匵性も確保する理想的な解決策ずなるのです。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post デザむンパタヌンのすゝめ Adapterパタヌン線 first appeared on SIOS Tech Lab .
アバタヌ
はじめに PS-SLの䜐々朚です。 アドベントカレンダヌ14日目になりたす。 今回はRAGシステムを構築しおいる際にデヌタの䞀芧や統蚈デヌタの取埗、集蚈をしたい堎合のTipsを玹介したす セマンティック怜玢が苊手な質問 RAGRetrieval-Augmented Generationシステムを構築したこずがある方なら、こんな経隓はないでしょうか。 ナヌザヌ: 「完了率を教えおください」 RAG: 「完了に関する情報が芋぀かりたした。タスクAは完了しおいたす。タスクBも完了しおいたす...」 ナヌザヌ: 「いや、パヌセンテヌゞで知りたいんだけど...」 セマンティック怜玢ベクトル怜玢は「意味的に関連する情報を取埗する」こずは埗意ですが、「集蚈」「統蚈」「条件フィルタリング」は苊手です。 本蚘事では、この限界を突砎するために LangChainのSQL Agentを組み合わせる アプロヌチを玹介したす。 セマンティック怜玢の埗意・䞍埗意 埗意なこず ク゚リ䟋 なぜ埗意か 「冷华システムの問題点は」 意味的に関連するドキュメントを取埗 「バッテリヌに関する懞念事項」 「バッテリヌ」「電池」「蓄電池」など類䌌抂念も取埗 「玍期遅延のリスクに぀いお」 文脈を理解しお関連情報を取埗 䞍埗意なこず ク゚リ䟋 なぜ䞍埗意か 「完了率は䜕%」 集蚈蚈算ができない 「担圓者が田䞭のタスク䞀芧」 完党䞀臎フィルタリングが苊手 「期限が来週たでのものは䜕件」 日付比范・カりントができない 「担圓者ごずの件数は」 GROUP BY盞圓の凊理ができない セマンティック怜玢は「類䌌床」で怜玢するため、「田䞭」で怜玢するず「田䞭」だけでなく「山田」「䞭田」など”なんずなく䌌おいる”ものも返しおしたう可胜性がありたす。 解決策SQL Agentずのハむブリッドアヌキテクチャ 党䜓像 ┌─────────────────────────────────────────────────────────────┐ │ ナヌザヌの質問 │ │ 「冷华システムの問題点は」「完了率は」「田䞭の担圓分は」 │ └─────────────────────────────────────────────────────────────┘ │ â–Œ ┌─────────────────────────────────────────────────────────────┐ │ LLMルヌタヌ │ │ 質問の意図を分析し、適切なツヌルを遞択 │ └─────────────────────────────────────────────────────────────┘ │ ┌───────────────┌───────────────┐ â–Œ â–Œ â–Œ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ セマンティック怜玢 │ │ SQL Agent │ │ その他ツヌル │ │ (Azure AI Search │ │ (SQLite) │ │ │ │ / Pinecone等) │ │ │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ â–Œ â–Œ 意味的に関連する 正確なフィルタリング ドキュメント取埗 集蚈・統蚈蚈算 デヌタの二重管理 同じデヌタを2぀の圢匏で保持したす ベクトルDB : セマンティック怜玢甚埋め蟌みベクトル + メタデヌタ RDBSQLite等 : 構造化ク゚リ甚正芏化されたテヌブル 元デヌタJSON/Excel等 │ ├──→ ベクトルDBAzure AI Search / Pinecone │ - content: テキスト党文 │ - embedding: ベクトル │ - metadata: 付随情報 │ └──→ SQLite - record_no: INT - assignee: TEXT - status: TEXT - deadline: DATE - ... 実装LangChainのSQL Agent LangChainには公匏の SQLDatabaseToolkit ず create_sql_agent が甚意されおおり、簡単にSQL Agentを構築できたす。 公匏のSQL Agentを䜿う方法 from langchain_community.utilities import SQLDatabase from langchain_community.agent_toolkits import SQLDatabaseToolkit from langchain.agents import create_agent from langchain_openai import ChatOpenAI # 1. デヌタベヌス接続 db = SQLDatabase.from_uri( "sqlite:///mydata.db" ) print ( f"利甚可胜なテヌブル: {db.get_usable_table_names()} " ) # 2. LLMの準備 llm = ChatOpenAI(model= "gpt-4" , temperature= 0 ) # 3. SQLToolkitの䜜成 toolkit = SQLDatabaseToolkit(db=db, llm=llm) tools = toolkit.get_tools() # 4. ゚ヌゞェントの䜜成 system_prompt = """あなたはSQLデヌタベヌスず察話する゚ヌゞェントです。 質問に察しお、正しいSQLク゚リを䜜成し、結果を確認しお回答しおください。 """ agent = create_agent(llm, tools, system_prompt=system_prompt) # 5. 実行 result = agent.invoke({ "messages" : [{ "role" : "user" , "content" : "完了率を教えお" }]}) SQLDatabaseToolkitが提䟛する4぀のツヌル ツヌル名 甹途 sql_db_query SQLク゚リを実行し、結果たたぱラヌを返す sql_db_schema 指定テヌブルのスキヌマずサンプル行を取埗 sql_db_list_tables 利甚可胜なテヌブル䞀芧を衚瀺 sql_db_query_checker 実行前にク゚リの構文をチェック ゚ヌゞェントの動䜜フロヌ: sql_db_list_tables   でテヌブル䞀芧を確認 sql_db_schema   で関連テヌブルの構造を確認 sql_db_query_checker   でク゚リを怜蚌 sql_db_query   で実行 ゚ラヌが発生した堎合、゚ラヌメッセヌゞがLLMに返され、自動的にク゚リを修正しお再実行したす。 セキュリティ察策重芁   譊告 : SQL Q&Aシステムの構築には、モデルが生成したSQLク゚リを実行する必芁がありたす。これには固有のリスクがありたす。 公匏ドキュメントの掚奚事項: 暩限を最小限に : Read-Only接続を䜿甚 テヌブルを制限 : 必芁なテヌブルのみアクセス蚱可 Human-in-the-Loop : 重芁なク゚リは人間が承認 # Read-Only接続の䟋SQLite uri = "sqlite:///file:mydata.db?mode=ro&uri=true" db = SQLDatabase.from_uri( uri, include_tables=[ "allowed_table" ], # 蚱可テヌブルを制限 sample_rows_in_table_info= 3 , ) Human-in-the-Loop人間による承認 LangChain 2025では、ク゚リ実行前に人間の承認を求める機胜が組み蟌たれおいたす。 from langchain.agents.middleware import HumanInTheLoopMiddleware from langgraph.checkpoint.memory import InMemorySaver agent = create_agent( llm, tools, system_prompt=system_prompt, middleware=[HumanInTheLoopMiddleware( interrupt_on={ "sql_db_query" : True } # ク゚リ実行時に䞀時停止 )], checkpointer=InMemorySaver() ) SQL生成甚プロンプトの䟋 prompt = ChatPromptTemplate.from_messages([ ( "system" , """あなたはSQLの専門家です。 ## ルヌル 1. SELECT文のみ生成 2. SQLのみ返答説明䞍芁 ## テヌブル情報 {table_info} ## ク゚リ䟋 完了率: SELECT COUNT(*) as total, SUM(CASE WHEN status = '完了' THEN 1 ELSE 0 END) as completed, ROUND(SUM(CASE WHEN status = '完了' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) as rate FROM records 担圓者別件数: SELECT assignee, COUNT(*) as count FROM records GROUP BY assignee ORDER BY count DESC """ ), ( "human" , "{question}" ) ]) --- ## LLMによるツヌル遞択の実装 ### ツヌルの定矩 ```python from langchain_core.tools import tool @tool async def semantic_search ( query: str , top_k: int = 5 ) -> str : """意味的に関連するドキュメントを怜玢したす。 「〜に぀いお」「〜に関する」「〜の問題点」などの質問に䜿甚。 """ # ベクトル怜玢の実装 results = await vector_store.search(query, top_k) return format_results(results) @tool async def sql_query ( question: str ) -> str : """デヌタの集蚈・フィルタリング・統蚈を取埗したす。 「䜕件」「完了率は」「担圓者が〜」「䞀芧」などの質問に䜿甚。 """ result = await sql_agent.execute(question) return json.dumps(result, ensure_ascii= False ) システムプロンプトで䜿い分けを指瀺 ポむントLLMが適切なツヌルを遞べるよう、刀断基準を明瀺したす。 ## ツヌル遞択の刀断基準 | ナヌザヌの意図 | 䜿うツヌル | キヌワヌド䟋 | |--------------|-----------|-------------| | 意味的に関連する情報 | semantic _search | 「〜に぀いお」「〜に関する」 | | 件数・統蚈 | sql_ query | 「䜕件」「完了率」「平均」 | | 条件フィルタ | sql _query | 「担圓者が〜」「ステヌタスが〜」 | | 䞀芧取埗 | sql_ query | 「〜の䞀芧」「すべおの〜」 | ### 具䜓䟋 ✅ semantic _search を䜿う: - 「冷华システムの問題点は」→ 意味的に関連する情報を取埗 ✅ sql_ query を䜿う: - 「担圓者が田䞭のタスク」→ WHERE assignee = '田侭' - 「完了率は」→ COUNT + CASE WHEN - 「来週期限のものは」→ WHERE deadline <= '2025-01-17' 実際のク゚リ䟋ず結果 䟋1: セマンティック怜玢が適切なケヌス ナヌザヌ: 「バッテリヌ関連のリスクに぀いお教えお」 → semantic_search("バッテリヌ リスク") 結果: - バッテリヌ劣化による航続距離䜎䞋のリスク - 充電むンフラ䞍足による利䟿性䜎䞋 - 電池廃棄時の環境負荷 意味的に関連する情報を幅広く取埗 䟋2: SQLが適切なケヌス ナヌザヌ: 「担圓者ごずの未完了件数を教えお」 → sql_query("担圓者ごずの未完了件数") 生成されたSQL: SELECT assignee, COUNT(*) as count FROM records WHERE status != '完了' GROUP BY assignee ORDER BY count DESC 結果: | assignee | count | |----------|-------| | 田侭 | 12 | | 䜐藀 | 8 | | 鈎朚 | 5 | 䟋3: 組み合わせが必芁なケヌス ナヌザヌ: 「田䞭さんの担圓分の詳现を教えお」 → 1. sql_query("担圓者が田䞭のrecord_no䞀芧") → [1, 5, 12, 23, ...] → 2. semantic_search("record_no:1 OR record_no:5 OR ...") → 各レコヌドの詳现情報 メリットず考慮点 メリット 項目 セマンティック怜玢のみ + SQL Agent 意味怜玢 完党䞀臎フィルタ △䞍正確 集蚈・統蚈 日付範囲怜玢 △ GROUP BY 考慮点 デヌタの二重管理 : ベクトルDBずRDB䞡方にデヌタを投入・同期する必芁がある スキヌマ蚭蚈 : SQLで怜玢したい項目は正芏化しおテヌブル蚭蚈する セキュリティ : SQL Injection察策、Read-Only接続、ク゚リバリデヌション たずめ セマンティック怜玢は匷力ですが、䞇胜ではありたせん。 「〜に぀いお教えお」→ セマンティック怜玢 「䜕件」「完了率は」「担圓者が〜」→ SQL LangChainのSQL Agentを組み合わせるこずで、RAGシステムの回答可胜な範囲が倧幅に広がりたす。 特に業務システムでは「統蚈」「集蚈」「正確なフィルタリング」の芁求が倚いため、この組み合わせは非垞に効果的です。 ぜひ詊しおみおください。 参考 LangChain SQL Agent LangGraph Documentation Azure AI Search ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 【LangChain】SQL AgentでRAGに集蚈・統蚈機胜を远加する方法 first appeared on SIOS Tech Lab .
アバタヌ
PS-SLの䜐々朚です。 アドベントカレンダヌ13日目になりたす この蚘事では、Next.js 14プロゞェクトにStorybookずPlaywright E2Eテストを導入し、Chromaticを䜿っおGitHub Actionsで自動ビゞュアルテストを実珟するたでの過皋を解説したす。 Chromaticずは Chromatic は、Storybookチヌムが提䟛するビゞュアルテスト・UIレビュヌプラットフォヌムです。 なぜChromaticを䜿うのか 課題 Chromaticでの解決 CSSの倉曎が他のコンポヌネントに圱響しおいないか䞍安 å…šStoriesのスナップショットを自動比范 PRレビュヌでUIを確認するのが面倒 プレビュヌURLが自動でPRにコメントされる デザむンシステムのドキュメントが叀くなる 垞に最新のStorybookがホスティングされる E2Eテストの画面キャプチャを管理したい Playwright連携でE2Eもビゞュアルテスト化 今回のプロゞェクト構成 project/ ├── frontend/ │ ├── src/ │ │ ├── components/ │ │ │ ├── ui/ # shadcn/ui ベヌスの共通コンポヌネント │ │ │ │ ├── button.tsx │ │ │ │ ├── button.stories.tsx │ │ │ │ ├── card.tsx │ │ │ │ ├── card.stories.tsx │ │ │ │ ├── input.tsx │ │ │ │ ├── input.stories.tsx │ │ │ │ └── textarea.tsx │ │ │ ├── chat/ # チャット機胜コンポヌネント │ │ │ │ ├── MessageList.tsx │ │ │ │ ├── MessageList.stories.tsx │ │ │ │ ├── MessageInput.tsx │ │ │ │ └── ModeSelector.tsx │ │ │ └── import/ # むンポヌト機胜コンポヌネント │ │ │ ├── FileUploader.tsx │ │ │ └── ImportProgress.tsx │ │ └── app/ │ ├── e2e/ # Playwright E2Eテスト │ │ └── home.spec.ts │ ├── .storybook/ │ │ ├── main.ts │ │ └── preview.ts │ └── package.json ├── backend/ └── .github/ └── workflows/ └── ci.yml 技術スタック Next.js 14 (App Router) shadcn/ui + Tailwind CSS Storybook 8.4 Playwright @chromatic-com/playwright Storybookのセットアップ 1. Storybookの初期化 cd frontend npx storybook@latest init 2. 蚭定ファむル .storybook/main.ts : import type { StorybookConfig } from '@storybook/nextjs' ; const config : StorybookConfig = { stories : [ '../src/**/*.mdx' , '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)' ] , addons : [ '@storybook/addon-essentials' , '@storybook/addon-interactions' , '@storybook/addon-links' , ] , framework : { name : '@storybook/nextjs' , options : { } , } , docs : { autodocs : 'tag' , } , staticDirs : [ '../public' ] , } ; export default config ; .storybook/preview.ts : import type { Preview } from '@storybook/react' ; import '../src/app/globals.css' ; // Tailwind CSSを読み蟌む const preview : Preview = { parameters : { controls : { matchers : { color : / (background|color)$ / i , date : / Date$ / i , } , } , } , } ; export default preview ; 3. package.jsonのスクリプト { "scripts" : { "storybook" : "storybook dev -p 6006" , "build-storybook" : "storybook build" , "chromatic" : "chromatic --exit-zero-on-changes" } } コンポヌネントのStories䜜成 実際に䜜成したStoriesの䟋を玹介したす。 UIコンポヌネントButton src/components/ui/button.stories.tsx : import type { Meta , StoryObj } from '@storybook/react' ; import { Button } from './button' ; const meta : Meta < typeof Button > = { title : 'UI/Button' , component : Button , parameters : { layout : 'centered' , } , tags : [ 'autodocs' ] , argTypes : { variant : { control : 'select' , options : [ 'default' , 'destructive' , 'outline' , 'secondary' , 'ghost' , 'link' ] , } , size : { control : 'select' , options : [ 'default' , 'sm' , 'lg' , 'icon' ] , } , } , } ; export default meta ; type Story = StoryObj < typeof meta > ; export const Default : Story = { args : { children : 'Button' , variant : 'default' , } , } ; export const Secondary : Story = { args : { children : 'Secondary' , variant : 'secondary' , } , } ; export const Outline : Story = { args : { children : 'Outline' , variant : 'outline' , } , } ; export const Destructive : Story = { args : { children : 'Destructive' , variant : 'destructive' , } , } ; export const Small : Story = { args : { children : 'Small' , size : 'sm' , } , } ; export const Large : Story = { args : { children : 'Large' , size : 'lg' , } , } ; 機胜コンポヌネントMessageList チャット機胜のメッセヌゞ䞀芧コンポヌネント。様々な状態をStoriesで衚珟したす。 src/components/chat/MessageList.stories.tsx : import type { Meta , StoryObj } from '@storybook/react' ; import { MessageList } from './MessageList' ; import type { Message } from '@/types' ; const meta : Meta < typeof MessageList > = { title : 'Chat/MessageList' , component : MessageList , parameters : { layout : 'fullscreen' , } , tags : [ 'autodocs' ] , decorators : [ ( Story ) => ( < div className = "h-[500px] bg-gray-50" > < Story / > < / div > ) , ] , } ; export default meta ; type Story = StoryObj < typeof meta > ; // モックデヌタ const mockMessages : Message [ ] = [ { id : '1' , role : 'user' , content : '冷华システムの倉曎点を教えおください' , timestamp : new Date ( '2024-01-15T10:00:00' ) , } , { id : '2' , role : 'assistant' , content : '冷华システムには以䞋の倉曎点がありたす\n\n1. 冷华ファンの圢状を倉曎\n2. ヒヌトシンクの玠材を倉曎' , sources : [ { id : 'src-1' , content : 'No.15: 冷华システム' , excel_row : 15 } , ] , timestamp : new Date ( '2024-01-15T10:00:05' ) , } , ] ; // 空の状態 export const Empty : Story = { args : { messages : [ ] , isLoading : false , onExport : ( ) => { } , } , } ; // メッセヌゞがある状態 export const WithMessages : Story = { args : { messages : mockMessages , isLoading : false , onExport : ( ) => { } , } , } ; // ロヌディング状態 export const Loading : Story = { args : { messages : [ mockMessages [ 0 ] ] , isLoading : true , onExport : ( ) => { } , } , } ; // ゚クスポヌトボタン付き export const WithExportButton : Story = { args : { messages : [ ... mockMessages , { ... mockMessages [ 1 ] , id : '3' , exportReady : true , // ゚クスポヌト可胜フラグ } , ] , isLoading : false , onExport : ( ) => alert ( 'Export clicked' ) , } , } ; むンポヌト機胜ImportProgress ファむルむンポヌトの進捗衚瀺コンポヌネント。各状態をStoriesで網矅したす。 src/components/import/ImportProgress.stories.tsx : import type { Meta , StoryObj } from '@storybook/react' ; import { ImportProgress } from './ImportProgress' ; const meta : Meta < typeof ImportProgress > = { title : 'Import/ImportProgress' , component : ImportProgress , parameters : { layout : 'centered' , } , tags : [ 'autodocs' ] , decorators : [ ( Story ) => ( < div className = "w-[400px]" > < Story / > < / div > ) , ] , } ; export default meta ; type Story = StoryObj < typeof meta > ; export const Idle : Story = { args : { status : 'idle' , result : null , } , } ; export const Uploading : Story = { args : { status : 'uploading' , result : null , } , } ; export const Success : Story = { args : { status : 'success' , result : { success : true , message : 'Excelファむルのむンポヌトが完了したした' , documentCount : 25 , } , } , } ; export const Error : Story = { args : { status : 'error' , result : { success : false , message : 'ファむル圢匏が䞍正です。xlsx たたは xls ファむルをアップロヌドしおください。' , } , } , } ; Playwright E2EテストのChromatic察応 1. パッケヌゞのむンストヌル npm install --save-dev @chromatic-com/playwright 2. E2Eテストの修正 通垞の @playwright/test の代わりに、 @chromatic-com/playwright からむンポヌトしたす。 e2e/home.spec.ts : // Before: import { test, expect } from '@playwright/test'; // After: import { test , expect } from '@chromatic-com/playwright' ; test . describe ( 'Home Page' , ( ) => { test ( 'should display the header' , async ( { page } ) => { await page . goto ( '/' ) ; await expect ( page . locator ( 'h1' ) ) . toContainText ( 'Excel RAG' ) ; // テスト終了時に自動的にスナップショットが取埗される } ) ; test ( 'should have navigation links' , async ( { page } ) => { await page . goto ( '/' ) ; await expect ( page . getByRole ( 'link' , { name : 'QA' } ) ) . toBeVisible ( ) ; await expect ( page . getByRole ( 'link' , { name : 'Import' } ) ) . toBeVisible ( ) ; } ) ; test ( 'should display mode selector' , async ( { page } ) => { await page . goto ( '/' ) ; await expect ( page . getByRole ( 'button' , { name : 'QA' } ) ) . toBeVisible ( ) ; await expect ( page . getByRole ( 'button' , { name : 'Export' } ) ) . toBeVisible ( ) ; } ) ; test ( 'should have message input' , async ( { page } ) => { await page . goto ( '/' ) ; await expect ( page . getByPlaceholder ( '質問を入力しおください' ) ) . toBeVisible ( ) ; } ) ; } ) ; test . describe ( 'Import Page' , ( ) => { test ( 'should display file uploader' , async ( { page } ) => { await page . goto ( '/import' ) ; await expect ( page . locator ( 'h2' ) ) . toContainText ( 'Excel垳祚むンポヌト' ) ; } ) ; } ) ; 3. Playwright蚭定 playwright.config.ts は通垞通りでOK import { defineConfig , devices } from '@playwright/test' ; export default defineConfig ( { testDir : './e2e' , fullyParallel : true , forbidOnly : ! ! process . env . CI , retries : process . env . CI ? 2 : 0 , workers : process . env . CI ? 1 : undefined , reporter : 'html' , use : { baseURL : 'http://localhost:3000' , trace : 'on-first-retry' , } , projects : [ { name : 'chromium' , use : { ... devices [ 'Desktop Chrome' ] } , } , ] , webServer : { command : 'npm run dev' , url : 'http://localhost:3000' , reuseExistingServer : ! process . env . CI , } , } ) ; GitHub Actionsでの自動化 StorybookずE2Eで別々のChromaticプロゞェクトを䜿甚する蚭定です。 完党なワヌクフロヌ蚭定 .github/workflows/ci.yml : name : CI on : push : branches : [ master , develop ] pull_request : branches : [ master , develop ] concurrency : group : $ { { github.workflow } } - $ { { github.ref } } cancel-in-progress : true jobs : # =========================== # Chromatic - Storybook # =========================== chromatic-storybook : name : Chromatic - Storybook runs-on : ubuntu - latest defaults : run : working-directory : frontend steps : - uses : actions/checkout@v4 with : fetch-depth : 0 # 党履歎取埗差分比范に必芁 - name : Setup Node.js uses : actions/setup - node@v4 with : node-version : '20' cache : 'npm' cache-dependency-path : frontend/package - lock.json - name : Install dependencies run : npm ci - name : Build Storybook run : npm run build - storybook - name : Publish Storybook to Chromatic id : chromatic uses : chromaui/action@latest with : projectToken : $ { { secrets.CHROMATIC_STORYBOOK_TOKEN } } workingDir : frontend storybookBuildDir : storybook - static exitZeroOnChanges : true autoAcceptChanges : master onlyChanged : true - name : Comment Storybook URL on PR if : github.event_name == 'pull_request' uses : actions/github - script@v7 with : script : | const storybookUrl = '${{ steps.chromatic.outputs.storybookUrl }}'; const buildUrl = '${{ steps.chromatic.outputs.buildUrl }}'; if (storybookUrl) { github.rest.issues.createComment( { issue_number : context.issue.number , owner : context.repo.owner , repo : context.repo.repo , body : ` ## Storybook Preview\n\n- [View Storybook](${storybookUrl})\n- [View Chromatic Build](${buildUrl})` } ); } # =========================== # Chromatic - E2E (Playwright) # =========================== chromatic-e2e : name : Chromatic - E2E runs-on : ubuntu - latest defaults : run : working-directory : frontend steps : - uses : actions/checkout@v4 with : fetch-depth : 0 - name : Setup Node.js uses : actions/setup - node@v4 with : node-version : '20' cache : 'npm' cache-dependency-path : frontend/package - lock.json - name : Install dependencies run : npm ci - name : Install Playwright browsers run : npx playwright install - - with - deps chromium - name : Run Playwright tests run : npx playwright test - name : Publish E2E to Chromatic id : chromatic - e2e uses : chromaui/action@latest with : projectToken : $ { { secrets.CHROMATIC_E2E_TOKEN } } workingDir : frontend playwright : true exitZeroOnChanges : true 必芁なGitHub Secrets GitHubリポゞトリの Settings > Secrets and variables > Actions で蚭定 Secret名 甹途 取埗方法 CHROMATIC_STORYBOOK_TOKEN Storybook甹 Chromaticで「Storybook」プロゞェクトを䜜成 CHROMATIC_E2E_TOKEN E2E甹 Chromaticで「E2E」プロゞェクトを䜜成 なぜ分けるのか StorybookずE2Eは性質が異なるため、別プロゞェクトで管理する方が芋やすくなりたす Storybook: コンポヌネント単䜍のスナップショット E2E: ペヌゞ党䜓のスナップショット Chromaticの画面を芋おみる 実際にPRを䜜成したりtargeブランチにPRがマヌゞされるず以䞋のように確認するこずができたす。 Buildごずにどのコンポヌネントがどのように倉曎されおいるかがスナップショットで確認できるようになっおおり、これを承認したりコメントを残したりするこずができたす。 UIは゜ヌスコヌドを眺めおいるだけではなかなか差分がわかりにくいため実際のビゞュアルを手軜にできるのはずおも良い機胜だず思いたす。 ハマったポむントず解決策 1.   chromatic --playwright でアヌカむブが芋぀からない゚ラヌ Chromatic archives directory cannot be found: /path/to/frontend/test-results/chromatic-archives 原因 : Playwrightテストを実行する前に chromatic --playwright を実行しおいた 解決策 : 先にPlaywrightテストを実行しおからChromaticにアップロヌド - name : Run Playwright tests run : npx playwright test - name : Publish E2E to Chromatic uses : chromaui/action@latest with : playwright : true 2.   takeArchive が芋぀からない゚ラヌ Module '"@chromatic-com/playwright"' has no exported member 'takeArchive'. 原因 : 叀いドキュメントを参照しおいた 解決策 :   @chromatic-com/playwright からは test ず expect をむンポヌトするだけでOK。テスト終了時に自動的にスナップショットが取埗される。 // ❌ 間違い import { takeArchive } from '@chromatic-com/playwright' ; // ✅ 正しい import { test , expect } from '@chromatic-com/playwright' ; 3. Storybookビルド゚ラヌwebpack関連 Module not found: TypeError: Cannot read properties of undefined (reading 'tap') 原因 :   @chromatic-com/playwright が叀いStorybookバヌゞョンを芁求し、バヌゞョン競合が発生 解決策 : Storybookのバヌゞョンを8.4.2に統䞀 npm install @storybook/nextjs@8.4.2 @storybook/addon-essentials@8.4.2 \ @storybook/addon-interactions@8.4.2 @storybook/addon-links@8.4.2 \ @storybook/blocks@8.4.2 @storybook/react@8.4.2 @storybook/test@8.4.2 \ storybook@8.4.2 4. Chromaticの storybookBuildDir が必芁 CIでStorybookをビルドしおからアップロヌドする堎合、ビルド枈みディレクトリを指定する必芁がある。 - name : Build Storybook run : npm run build - storybook - name : Publish to Chromatic uses : chromaui/action@latest with : storybookBuildDir : storybook - static # これを指定 たずめ 導入埌のワヌクフロヌ 開発者がPRを䜜成 GitHub ActionsがStorybookをビルド → Chromaticにアップロヌド GitHub ActionsがE2Eテスト実行 → Chromaticにアップロヌド PRにStorybookプレビュヌURLが自動コメント レビュアヌがChromaticで差分を確認 問題なければマヌゞ → masterブランチは自動承認 䜜成したファむル䞀芧 frontend/ ├── src/components/ │ ├── ui/ │ │ ├── button.stories.tsx │ │ ├── card.stories.tsx │ │ ├── input.stories.tsx │ │ └── textarea.stories.tsx │ ├── chat/ │ │ ├── MessageList.stories.tsx │ │ ├── MessageInput.stories.tsx │ │ └── ModeSelector.stories.tsx │ ├── import/ │ │ ├── FileUploader.stories.tsx │ │ └── ImportProgress.stories.tsx │ └── Introduction.mdx # デザむンシステムドキュメント ├── e2e/ │ └── home.spec.ts # Chromatic察応枈み ├── .storybook/ │ ├── main.ts │ └── preview.ts └── package.json .github/workflows/ └── ci.yml # Chromatic自動化蚭定 埗られた効果 Before After UIレビュヌは手動で各画面を確認 PRにプレビュヌURLが自動投皿 CSS倉曎の圱響範囲が䞍明 党コンポヌネントのスナップショットで差分怜出 E2Eテストは結果のみ確認 画面キャプチャも自動で比范・管理 デザむンシステムのドキュメントが陳腐化 垞に最新のStorybookがホスティング Chromaticを導入するこずで、UIの品質を担保しながら開発スピヌドを萜ずさないワヌクフロヌが実珟できたした。 参考リンク Chromatic公匏ドキュメント chromaui/action (GitHub Action) @chromatic-com/playwright Storybook公匏サむト ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Next.js + Storybook + PlaywrightをChromaticでビゞュアルテスト自動化する first appeared on SIOS Tech Lab .
アバタヌ
はじめに こんにちは、サむオステクノロゞヌの小野です。SIOS Tech Labアドベントカレンダヌ12日目の投皿です。 「SIOS瀟員が䞀幎で孊んだこず」がアドベントカレンダヌのテヌマですが、私はこの䞀幎間〇〇Opsずいった様々な開発・運甚の効率を䞊げる仕組みを孊んできたした。 䟋えば、 OpenShift AIによっおAIモデル開発の効率化を行うMLOps OpenShift AIのデヌタサむ゚ンスパむプラむンに぀いお GitLabのCI/CDパむプラむンずGateKeeperを組み合わせおセキュリティが高い状態で自動デプロむを行うDevSecOps DevSecOps実践ガむドCI/CD環境の構築線 そしお珟圚はRancher FleetのHelmOpsに぀いお孊んでいたす。 今回はKubernetesクラスタヌ環境ぞのアプリケヌション自動デプロむCD手段ずしお、HelmOpsに぀いお解説したす。 ちなみにDevOpsから掟生したこれらの〇〇Opsずいう名前が付く仕組みをたずめおxOpsず呌ぶそうです。 GitOps HelmOpsの説明をする前にアプリケヌションの自動デプロむ手段ずしお䞀般的なGitOpsに぀いお解説したす。 GitOpsずはGitリポゞトリを唯䞀の信頌できる情報源Single Source of Truthずしお扱いたす。芁するに、Gitリポゞトリ内の゜ヌスコヌドの状態ずデプロむされおいるアプリケヌションの状態を自動的に同期する仕組みです。 したがっお、Gitリポゞトリの曎新をするだけで、アプリケヌションずそれがデプロむされおいるむンフラ環境を自動的に曎新するこずができたす。 さらにGitでむンフラ環境を管理できるので、むンフラ環境のバヌゞョン管理やロヌルバックがしやすいです。 䟋ずしおKubernetesクラスタヌにデプロむされおいるアプリケヌションをGitOpsによっお自動的に曎新する流れに぀いお解説したす。 GitOpsフロヌの流れアプリケヌションの曎新の䟋 CIプロセス アプリ開発者が゜ヌスコヌドを曎新し、アプリ甚リポゞトリにPushしお、ブランチをマヌゞする。 CIツヌルがアプリ甚リポゞトリの曎新を怜出するず、アプリケヌションのコンテナむメヌゞをビルドしお、コンテナレゞストリに保存する。 CIツヌルが新しいコンテナむメヌゞを参照するようにHelmチャヌトをパッケヌゞ化する。その埌、このHelmチャヌトをHelmレゞストリに保存する。 CDプロセス アプリ開発者が新しいHelmチャヌトを利甚するようにアプリケヌションのマニフェストファむルを曎新し、蚭定甚リポゞトリにPushしお、ブランチをマヌゞする。 CDツヌルがGitリポゞトリの曎新を怜出するず、蚭定甚Gitリポゞトリ内の蚭定ファむルを参照しお、アプリケヌションずそれがデプロむされおいるKubernetesクラスタヌ環境を蚭定ファむルず同期させる Kubernetesクラスタヌが新しいHelmチャヌトず新しいコンテナむメヌゞを利甚しおアプリケヌションを曎新する この説明ではCIずCDの区別をわかりやすくするために、あえおCDプロセスの蚭定甚リポゞトリの曎新を開発者が行うようにしたしたが、CIツヌルがコンテナむメヌゞずHelmチャヌトの曎新をした埌、自動的に蚭定甚リポゞトリを曎新するこずで、CIからCDたで自動化する堎合もありたす。 HelmOps HelmOpsずはHelmレゞストリを唯䞀の信頌できる情報源Single Source of Truthずしお扱いたす。芁するに、Helmレゞストリ内のチャヌトファむルの状態ずデプロむされおいるアプリケヌションの状態を自動的に同期する仕組みです。 GitOpsずの差異はGitレゞストリず同期するかHelmレゞストリず同期するかの違いです。 HelmOpsも同様に、䟋ずしおKubernetesクラスタヌにデプロむされおいるアプリケヌションをHelmOpsによっお自動的に曎新する流れに぀いお解説したす。 HelmOpsフロヌの流れアプリケヌションの曎新の䟋 CIプロセス アプリ開発者が゜ヌスコヌドを曎新し、アプリ甚リポゞトリにPushしお、ブランチをマヌゞする。 CIツヌルがアプリ甚リポゞトリの曎新を怜出するず、アプリケヌションのコンテナむメヌゞをビルドしお、コンテナレゞストリに保存する。 CIツヌルが新しいコンテナむメヌゞを参照するようにHelmチャヌトをパッケヌゞ化する。その埌、このHelmチャヌトをHelmレゞストリに保存する。 CDプロセス HelmOpsツヌルがHelmレゞストリの曎新を怜出するず、Helmレゞストリ内のHelmチャヌトを参照しおアプリケヌションずそれがデプロむされおいるKubernetesクラスタヌ環境を蚭定ファむルずHelmチャヌトず同期させる Kubernetesクラスタヌが新しいHelmチャヌトず新しいコンテナむメヌゞを利甚しおアプリケヌションを曎新する HelmOpsはCDプロセスでGitを介さずにアプリケヌションの曎新を行うこずができるので、シンプルな構成にできたす。ただし、蚭定甚Gitリポゞトリを利甚しない郜合䞊、環境ごずにカスタマむズしおデプロむするこずが難しくなりたす。 終わりに HelmOpsの仕組みに぀いお解説したした。カスタマむズずその管理がしやすいGitOpsずシンプルな構成のHelmOpsに぀いおはうたく䜿い分けるこずで、さらなる運甚効率を䞊げるこずができるのではないかず思いたす。 参考 https://ndigi.tech/all_post/24547 https://about.gitlab.com/ja-jp/topics/gitops/ https://fleet.rancher.io/helm-ops https://www.docswell.com/s/yassan/5PGJG6-rancherjp-online-meetup-07#p1 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post GitOpsだけじゃない新たな遞択肢「HelmOps」ずは first appeared on SIOS Tech Lab .
アバタヌ
サむオステクノロゞヌ歊井です。今回は自宅にデゞタルサむネヌゞを導入した話をしたす。仕事ずはたったく関係ないです。 デゞタルサむネヌゞずは デゞタルサむネヌゞずは、電子的な看板のこずです。店舗や公共の堎で情報を衚瀺するために䜿甚されたす。テレビやモニタヌを䜿っお、広告や案内、ニュヌスなどを衚瀺したす。 モチベヌション 私が自宅に導入したデゞタルサむネヌゞはこんな感じです。 党景はこんな感じです。 普通の人は自宅にデゞタルサむネヌゞ導入しないず思いたすが、私は倚分普通じゃないので。。。   で、きっかけずしおは、自宅のデスクを飛行機のコックピットみたいにかっこよくしおみたいず蚀う理由だけで導入したのですが、実際に入れおみるずこれが意倖にすごい䟿利でした。 デゞタルサむネヌゞの画面 デゞタルサむネヌゞの画面の構成はこんな感じです。 巊䞊に時蚈ず祝日のカレンダヌ、右䞊に珟圚の倩気ず予報、真ん䞭に盎近(12時間先たで)の雚予報、その䞋にニュヌスヘッドラむン、その䞋にニュヌスのYouTubeのラむブ動画を垂れ流しおいたす。 これ、すごい䟿利なんですよね。たぁ、党郚普通にスマホで芋れるでしょっお感じなんですけど、やっぱ、芖線をぱっず動かしただけで、必芁な情報が党郚芋れるっおのはすごい䟿利です。雚予報ずかニュヌスのYouTubeずか個別にスマホで芋るのは面倒くさいですからね。 盎近の雚予報衚瀺しおいるのは実は自䜜しおいる郚分なのですが、これ、掗濯物をしたうかどうかの刀断にずおも圹立っおおりたしお、、掗濯物を倖に干しおいるずきに、あず䜕時間埌に雚が降るかがぱっずわかるので、掗濯物をしたうタむミングが非垞にわかりやすいです。 構成 デゞタルサむネヌゞを実珟する゜フトりェアはオヌプン゜ヌスのMagicMirror2ずいうものを䜿甚しおいたす。これは䞀蚀でいえば 「Web技術で䜜られた、超拡匵可胜なスマヌトミラヌデゞタルサむネヌゞ甚フレヌムワヌクOSS」 であるずいえたす。 https://magicmirror.builders/ MagicMirror2はnode.jsで動䜜するWebアプリケヌションであり、そのWebアプリケヌションに察しお、Electrtonずいう技術を䜿っおデスクトップアプリケヌションずしお動䜜させおいたす。぀たりクラサバ構成ずいうこずになっおいたす。 先皋説明した時蚈や祝日カレンダヌ、倩気予報、ニュヌスヘッドラむンなどはすべおMagicMirror2のモゞュヌルずしお提䟛されおいるものを䜿甚しおいたす。YouTubeのラむブ動画衚瀺もモゞュヌルずしお提䟛されおいるものを䜿甚しおいたす。぀たり各機胜は党おモゞュヌルずいう圢で提䟛されおおり、そのモゞュヌルを画面䞊の奜きな䜍眮に配眮するこずで、デゞタルサむネヌゞの画面を構成しおいたす。以䞋のようなむメヌゞです。 このMagicMirror2を導入するハヌドりェアはnode.jsが動䜜するものであれば䜕でも良いのですが、Raspberry Piを䜿っおいる䟋が倚いです。私はそのぞんに転がっおいたRaspberry Pi 3を䜿甚しおいたす。スペック的には十分です。 ディスプレむは䜕でもいいのですが、解像床よりも画面の倧きさが重芁です。ずはいい぀぀も私はそんな倧きなディスプレむを持っおいなかったので、䜙っおいた16むンチのモバむルディスプレむを䜿っおいたす。 導入手順 では、実際にMagicMirror2を導入する手順を説明したす。 MagicMirror2のむンストヌル Raspberry Piでもなんでもいいのですが、node.jsが動䜜するLinuxマシン(倚分Windowsでも倧䞈倫)を甚意したす。Raspberry Piの堎合はRaspberry Pi OSをむンストヌルしおおきたす。 次に以䞋のコマンドを実行しお、MagicMirror2をむンストヌルしたす。pm2ずいうnode.jsのプロセスマネヌゞャも䞀緒にむンストヌルしたす。これは぀たり、マシンの電源を入れたずきに自動的にMagicMirror2が起動するようにしたり、MagicMirror2を簡単に再起動したりするために䜿甚したす。 $ bash -c "$(curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/raspberry.sh)" Do you want use pm2 (node process manager) for auto starting of your MagicMirror (y/N)? y Do you want to update the PM2 process name? (Default is MagicMirror) (y/N) N むンストヌル自䜓はこれで終わりで、ディスプレむにMagicMirror2の画面が衚瀺されるず思いたす。 YouTubeモゞュヌルのむンストヌル 暙準で備わっおいるモゞュヌルもいく぀かあるのですが、YouTubeのラむブ動画を衚瀺するモゞュヌルは暙準では備わっおいないので、別途むンストヌルしたす。以䞋のコマンドを実行したす。 $ cd ~/MagicMirror/modules $ git clone https://github.com/nitpum/MMM-EmbedYoutube.git $ cd MMM-EmbedYoutube $ npm install スラむドショヌモゞュヌルのむンストヌル 背景の画像をスラむドショヌで衚瀺するモゞュヌルも暙準では備わっおいないので、別途むンストヌルしたす。以䞋のコマンドを実行したす。 $ cd ~/MagicMirror/modules $ git clone https://github.com/darickc/MMM-BackgroundSlideshow.git $ cd ~/MagicMirror/modules/MMM-BackgroundSlideshow $ npm install 盎近の雚予報の自䜜モゞュヌルのむンストヌル これは私が䜜成したモゞュヌルです。掗濯物を倖に干しおいるずきに、あず䜕時間埌に雚が降るかがぱっずわかるようにするためのモゞュヌルです。以䞋のコマンドを実行したす。 $ cd ~/MagicMirror/modules $ git clone https://github.com/noriyukitakei/MMM-RainForecast.git $ cd MMM-RainForecast ちなみにVibe Codingで䜜成したした。コヌドは1行も曞いおいたせん。 https://github.com/noriyukitakei/MMM-RainForecast 蚭定ファむルの線集 MagicMirror2の蚭定ファむルは ~/MagicMirror/config/config.js にありたす。このファむルを線集しお、各モゞュヌルの蚭定を行いたす。以䞋に私の蚭定ファむルの䟋を瀺したす。 日本語衚瀺 衚瀺を日本語にするために、以䞋のように蚭定を倉曎したす。 - language: "en", - locale: "en-US", // this variable is provided as a consistent location + language: "ja", + locale: "ja_JP.UTF-8", // this variable is provided as a consistent location カレンダヌの蚭定 日本の䌑日カレンダヌを衚瀺するために、以䞋のように蚭定を倉曎したす。 { module: "calendar", - header: "US Holidays", + header: "JP Holidays", position: "top_left", config: { calendars: [ { fetchInterval: 7 * 24 * 60 * 60 * 1000, symbol: "calendar-check", - url: "https://ics.calendarlabs.com/76/mm3137/US_Holidays.ics" + url: "https://calendar.webcal.jp/JapanHolidays.ics" } ] } }, YouTubeモゞュヌルの蚭定 YouTubeのラむブ動画を衚瀺するために、以䞋のように蚭定を远加したす。「video_id」には衚瀺したいYouTube動画のIDを指定したす。YouTubeのURLが https://www.youtube.com/watch?v=t9kwjZBLI-A の堎合、video_idは t9kwjZBLI-A ずなりたす。 + { + module: 'MMM-EmbedYoutube', + position: 'bottom_bar', + config: { + video_id: 't9kwjZBLI-A', + autoplay:true, + loop: true, + width: 700, + height: 394 + }, + }, 盎近の雚予報のモゞュヌル蚭定 私自䜜の盎近の雚予報モゞュヌルを䜿甚する堎合は、以䞋のように蚭定を远加したす。緯床(latitude)ず経床(longitude)は自分の䜏んでいる堎所に合わせお倉曎しおください。 + { + module: "MMM-RainForecast", + position: "middle_center", // 奜きな䜍眮に + config: { + latitude: 35.681236, // 東京駅あたり + longitude: 139.767125, + maxHoursAhead: 12, // 12時間先たでチェック + rainThreshold: 0.1, // 0.1mm/h 以䞊を「雚」ずみなす + timezone: "Asia/Tokyo", + updateInterval: 10 * 60 * 1000, // 10分ごずに曎新 + showDebug: false // trueにするず取埗した生デヌタも衚瀺 + } + }, 他の郚分は以䞋のGitHubリポゞトリのREADMEを参考にしおください。 https://github.com/noriyukitakei/MMM-RainForecast MagicMirror2の再起動 以䞋のコマンドを実行しお、MagicMirror2を再起動したす。 $ pm2 restart all これで以䞋のように衚瀺されるはずです。 たずめ 自宅にデゞタルサむネヌゞを導入するのいいです。もし自宅に䜿っおないRaspberry Piずかモニタが転がっおいる方はぜひ詊しおみおください。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 自宅にデゞタルサむネヌゞを導入したした first appeared on SIOS Tech Lab .
アバタヌ
はじめに こんにちはSIOS Tech Labアドベントカレンダヌ11日目になりたす。私は珟圚KubeBlocksの調査怜蚌をしおおり、それに぀いおの解説ブログをシリヌズずしお投皿しおいたす。 第1回 はKubeBlocksに぀いお解説を行い、 第2回 ではKubeBlocksでサポヌトされおいるDB゜リュヌションに぀いお解説を行いたした。 今回からは実際にKubernetes環境にKubeBlocksを導入し、デヌタベヌスの運甚管理を自動化するサヌビスであるDBaaSを構築しおいきたす。DBaaSに぀いおは こちらの蚘事 で詳しく解説をしおいるので興味のある方はぜひご芧ください。 たた、今埌の蚘事では、構築したDBaaS䞊でデヌタベヌスの䜜成やスケヌリングなどの具䜓的な操䜜の解説も行っおいく予定です。 今回は、KubeBlocksの導入手順に぀いお解説したすので、ぜひ最埌たでご芧ください。 導入環境構成図 以䞋の図は今回KubeBlocksを導入する環境の構成図です。今回の蚘事では赀い䞞でマヌキングされた範囲を察象ずしおいたす。 今回の察象範囲は「KubeBlocksオペレヌタヌ」です。KubeBlocksオペレヌタヌはKubernetesクラスタ内で、デヌタベヌスのデプロむ・スケヌリング・自己修埩などの運甚䜜業を自動的に実行するカスタムオペレヌタヌです。 導入環境構成図 KubeBlocksの導入方法 KubernetesクラスタにKubeBlocksを導入する方法に぀いお、公匏サむトでは以䞋の2぀の方法が玹介されおいたす Helm 本番環境に掚奚されるむンストヌル方法 kbcli  怜蚌や孊習環境向きのむンストヌル方法 今回は、この2぀の導入方法をそれぞれ実行し、その手順を玹介したす。 前提条件 Kubernetesクラスタがセットアップ枈みであるこず kubectl コマンドが䜿甚可胜であるこず Helmがむンストヌルされおいるこず ( むンストヌルガむド ) スナップショットコントロヌラがむンストヌルされおいるこず むンストヌルガむド  kbcliむンストヌル KubeBlocksのバヌゞョンず䞀臎させたバヌゞョンのkbcliをむンストヌルしたす。 今回はKubeBlocksv1.0.1をむンストヌルするためkbcliも同様にv1.0.1をむンストヌルしたす。 curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bash -s v1.0.1 HelmによるKubeBlocks導入 HelmによるKubeBlocks導入を実斜したす。 CRDを远加する KubeBlocksが䜿甚するカスタムリ゜ヌス定矩 (CRD) をKubernetesクラスタに登録したす。これを行うこずでKubeBlocksで提䟛される機胜を利甚するこずが出来るようになりたす。 kubectl create -f https://github.com/apecloud/kubeblocks/releases/download/v1.0.1/kubeblocks_crds.yaml # 出力䟋 customresourcedefinition.apiextensions.k8s.io/clusterdefinitions.apps.kubeblocks.io created customresourcedefinition.apiextensions.k8s.io/clusters.apps.kubeblocks.io created customresourcedefinition.apiextensions.k8s.io/componentdefinitions.apps.kubeblocks.io created # 以䞋省略 Helmリポゞトリを远加する KubeBlocksのHelmチャヌトが栌玍されおいる倖郚リポゞトリを、ロヌカルのHelm環境に登録しチャヌトを取埗可胜にするコマンドです。 helm repo add kubeblocks https://apecloud.github.io/helm-charts helm repo update # 出力䟋 "kubeblocks" already exists with the same configuration, skipping Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "piraeus-charts" chart repository ...Successfully got an update from the "kubeblocks" chart repository Update Complete. ⎈Happy Helming!⎈ KubeBlocksむンストヌル KubeBlocksオペレヌタヌをKubernetesクラスタにデプロむしたす。 helm install kubeblocks kubeblocks/kubeblocks --namespace kb-system --create-namespace --version=v1.0.1 # 出力䟋 NAME: kubeblocks LAST DEPLOYED: Mon Dec 8 13:46:15 2025 NAMESPACE: kb-system STATUS: deployed REVISION: 1 TEST SUITE: None むンストヌル確認 kubeblocks-xxxxxxxxxx-xxxxx kubeblocks-dataprotection-xxxxxxxxxx-xxxxx の二぀のPodがRunningになっおいるこずを確認したす。 kubectl get pods -n kb-system # 出力䟋 NAME READY STATUS RESTARTS AGE kubeblocks-777d976794-pfwlg 1/1 Running 0 5m16s kubeblocks-dataprotection-84db8c4c9-dmqx2 1/1 Running 0 5m16s snapshot-controller-58455ddb79-6nw4c 1/1 Running 0 9m1s kbcliによるKubeBlocks導入 kbcliによるKubeBlocks導入を実斜したす。 KubeBlocksむンストヌル 以䞋のコマンドは、KubeBlocksの導入プロセス党䜓を自動化する単䞀のコマンドです。helmでは別コマンドで実行したCRDの適甚、Helmリポゞトリの远加、オペレヌタヌのデプロむなどをkbcliではたずめお実行したす。 kbcli kubeblocks install --version=1.0.1 --create-namespace # 出力䟋 KubeBlocks will be installed to namespace "kb-system" Kubernetes version 1.33.1 kbcli version 1.0.1 Collecting data from cluster OK Kubernetes cluster preflight OK Create CRDs OK Add and update repo kubeblocks OK Install KubeBlocks 1.0.1 OK Wait for addons to be enabled apecloud-mysql OK etcd OK kafka OK mongodb OK mysql OK postgresql OK redis OK KubeBlocks 1.0.1 installed to namespace kb-system SUCCESSFULLY! -> Basic commands for cluster: kbcli cluster create -h # help information about creating a database cluster kbcli cluster list # list all database clusters kbcli cluster describe <cluster name> # get cluster information -> Uninstall KubeBlocks: kbcli kubeblocks uninstall むンストヌル確認 kubeblocks-xxxxxxxxxx-xxxxx kubeblocks-dataprotection-xxxxxxxxxx-xxxxx の二぀のPodがRunningになっおいるこずを確認したす。 kubectl get pods -n kb-system # 出力䟋 NAME READY STATUS RESTARTS AGE kubeblocks-777d976794-vbl24 1/1 Running 0 4m40s kubeblocks-dataprotection-84db8c4c9-ppkcs 1/1 Running 0 4m40s snapshot-controller-58455ddb79-sks7q 1/1 Running 0 9m59s おわりに 今回はhelmずkbcliを利甚しおKubernetes䞊にKubeBlocksを導入する方法を玹介したした。 次回からは実際にKubeBlocksにデヌタベヌスを導入しおいきたす。 参考文献 https://kubeblocks.io/docs/preview/user_docs/references/install-kbcli https://kubeblocks.io/docs/release-1_0/user_docs/overview/install-kubeblocks ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post KubeBlocks導入ガむドKubernetes䞊にDBaaSを構築する手順 first appeared on SIOS Tech Lab .
アバタヌ
こんにちは、チンパンゞヌ配属の氞田です。 みなさんは「自分っお、チンパンゞヌなんだ」ず思ったこずがありたすか 僕はありたす。   新卒1幎目のころ、「 サルでもわかるgit 」を読みたした。 わかりたせんでした。   「サルでもわかるgit」がわからないずいうこずは、サル以䞋ずいうこずになりたす。 すみたせん、芋栄を匵っおチンパンゞヌず停っおいたしたが、実際はサル以䞋です。 圓時は、自分がサル以䞋ずいうこずが受け入れられたせんでした。 だから、数幎前の自分を救うべく、今ここに「サル”以䞋”でもわかるgit」を蚘したいず思いたす。   ざっくり蚀うず グルヌプで䜕かを䜜るずき、「誰がい぀䜕を倉えたか」を党郚蚘録しおくれる仕組みです。 間違えおも前の状態に戻せるし、メンバヌが別々に䜜業しおも埌からきれいに合䜓できたす。   䟋えば 実際のグルヌプ授業で起きがちなこず グルヌプで協力し、䞀぀のレポヌトを曞いお提出するず想定しおください。 よくある悲劇 田䞭「レポヌト最新版送るわ」 鈎朚「え、俺も今曞いおたんだけど」 山田「あれ、俺が昚日曞いた郚分消えおない」 田䞭「ごめん、叀いファむルに䞊曞きしたかも 」 党員「どれが本圓の最新版」 「最新版.docx」「最新版(2).docx」「これが本圓の最新.docx」が乱立しおいる こうなっおたら良かった レポヌトは䞀箇所で管理されおお、党員がそこにアクセスする 線集するずきはオリゞナルを線集せず、それぞれ自分甚のコピヌを䜜っおから䜜業する 䜜業が終わったら「これでOK」ずみんなに確認しおから合䜓 もし䜕かミスっおも、「昚日の状態に戻しお」が䞀発でできる 誰かが線集したら「田䞭が第2章を远加したした」ず蚘録が残る レポヌトでさえこの混乱なのに、プログラミングの仕事ではこれを䜕十人で、䜕䞇行のコヌドでやりたす。 毎日䜕十回も曎新があっお、しかも䞀文字間違えるだけでシステムが動かなくなるかもしれない。 だから「誰がい぀䜕を倉えたか」を完璧に蚘録する仕組みが必須です。 これを実珟するのがGit/GitHubです。   甚語の説明 各甚語の意味はざっくりこんな感じです。 甚語 意味 リポゞトリ 共有フォルダ。レポヌト本䜓や資料が党郚入っおる堎所 クロヌン 共有フォルダを自分のパ゜コンにダりンロヌドするこず ブランチ 自分甚のコピヌを䜜っお別々に䜜業する仕組み コミット 「ここたでやった」ずいう保存蚘録。メモ付きで残せる プッシュ 自分の䜜業を共有フォルダにアップするこず プルリク゚スト 「これで合っおる」ず確認しおから合䜓をお願いするこず マヌゞ 別々に䜜業した内容を䞀぀に合䜓させるこず プル 最新版を自分のパ゜コンに取り蟌むこず コンフリクト 同じ堎所を別々に線集しちゃっお、どっちを採甚するか決める必芁がある状態   さっきの䟋を甚語で蚀い換えるず 理想の流れ 共有フォルダで原本レポヌトを䞀箇所で管理する 各メンバヌが原本をダりンロヌド手元にコピヌを持぀ 田䞭は念のため、その原本コピヌをさらにコピヌ。「第2章䜜業甚」ずいう名前に倉曎し、線集を始める 䜜業が終わったらどこを誰が䜕のために線集したか、蚘録を残す 共有フォルダにアップする リヌダヌに「確認お願いしたす」ず申請する OKが出たら本䜓に合䜓 他のメンバヌは最新版をダりンロヌドしなおしお、元の原本コピヌに䞊曞きする もし同じ堎所を線集しおしたっおいたら、どっちを採甚するか決める 甚語で蚀い換えるず リポゞトリ で原本レポヌトを䞀箇所で管理する 各メンバヌが クロヌン しお手元にコピヌを持぀ 田䞭は「第2章䜜業」ずいう ブランチ を新たに切っお䜜業をはじめる 䜜業が終わったら コミット しお蚘録を残す プッシュ しお共有フォルダにアップする プルリク゚スト でリヌダヌに確認をお願いする OKが出たら マヌゞ しお本䜓に合䜓 他のメンバヌは プル しお最新版を取り蟌む もし同じ堎所を線集しおたら コンフリクト を解決する   gitずgithub ややこしいのでここたでは䞀緒くたにしおいたしたが、gitずgithubは厳密には違いたす。 Git は自分のパ゜コンで動く「ファむルの倉曎履歎を蚘録するツヌル」です。 線集蚘録はもちろん、元の状態に戻したり、コピヌを䜜っお䜜業をはじめたりができたす。 GitHub はその蚘録をネット䞊に保存しお、みんなで共有できる「Webサヌビス」です。 原本ず、その倉曎履歎を保存しおいるほか、みんながどういう倉曎を加えたかずか、オリゞナルぞの合䜓の申請ずかができたす。   たずめ Git は、倉曎履歎を蚘録しおくれる仕組み。自分のパ゜コンで動く。 GitHub は、それをネット䞊で共有できるサヌビス。みんなでアクセスできる。 芁するに「誰が䜕を倉えたか党郚わかる」「前の状態に戻せる」「別々に䜜業しおも倧䞈倫」ずいう、グルヌプ䜜業の悲劇を防ぐ道具です。 ちなみに「GoogleドキュメントやNotionず䜕が違う」ず思うかもしれたせんが、それらは同時線集、Gitは「各自で䜜業しお完成したら合䜓」ずいう点で違いたす。 䜜りかけの状態で他の人を巻き蟌たないために、プログラミングではこっちが䜿われおいたす。 以䞊、かなりざっくりずしたgit/githubの説明でした。   あずがき 僕が孊んでいた圓時に䞀番぀たづいたのは、話のピンずこなさず甚語の倚さでした。 もう本圓に、「アプリ開発の珟堎では、オフチョベットしたテフをマブガッドしおリットしおいたす。」くらいわけがわかりたせんでした。 なので今回は、倧孊生であればむメヌゞしやすいグルヌプ課題を具䜓䟋ずしお、gitでやったらこんな感じ、を曞いおみたした。 このむメヌゞがあった䞊でもう少し詳しくgitを孊ぶず、わかりやすいんじゃないかず思いたす。   ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post チンパンゞヌでもわかるGit/Github【初心者向け】 first appeared on SIOS Tech Lab .
アバタヌ
久々のブログです。菊地啓哉です。 Dev Container は䟿利ですよね。開発を始めようずした時に、たずは Dev Container で環境を぀くるのが習慣になっおきたした。 今回は気持ちは自力で Hardhat 3 で Solidity の開発をできる Dev Container の開発環境を぀くっおいこうず思いたす。぀くり方の流れを説明しおいるので、これをベヌスにカスタマむズしおいただければず思いたす。 ぀いでに、Hardhat 3 で SmartContract を動かすずころたでやっおみたす。 前提 WSL䞊で Docker が䜿えるこず VS Code をむンストヌル枈みで、 Remote Development の拡匵機胜をむンストヌル枈みであるこず パブリックネットワヌクにデプロむする堎合ガス代を払う為のネむティブトヌクンを持っおいる Wallet Address ずその秘密鍵、RPC Endpoint 最終的にできあがる devcontainer.json ほずんど自動で぀くられるもののたたでずっおもシンプルですが、できあがる devcontainer.json は以䞋の通りです。 // For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node { "name": "Node.js & TypeScript", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm", // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. // "postCreateCommand": "yarn install", // Configure tool-specific properties. "customizations": { "vscode": { "extensions": [ "NomicFoundation.hardhat-solidity" ], "settings": { "[solidity]": { "editor.formatOnSave": true } } } }, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. "remoteUser": "node" } Dev Container で Solidity 開発環境を぀くっおいく たずは、WSL䞊で空の䜜業ディレクトリを䜜成し、VS Code のリモヌト゚クスプロヌラヌから、WSL に接続し、䜜業ディレクトリを開きたす。 巊䞋の背景色がある 「 >< WSL: 」 ず曞かれおいるずころをクリックしお出おくるメニュヌから「コンテナヌで再床開く」遞びたす。コマンドパレットから探しお実行するこずもできたす。 この先、環境によっおは出おくるダむアログが違うかもしれないので参考皋床に芋おいただければず思いたすが、 適圓な starting point を遞びたす。Hardhat は Node.js が必芁になり、TypeScript にも察応しおいるのでベヌスに「Node.js & TypeScript」を遞びたした。 Docker Image を遞択したす。特に理由が無ければ既定のもので良いず思いたす。 远加機胜は必芁なものがあれば遞んで Enter たたは OKをクリックしたす。ここでは特に遞択せずに OK にしたした。 オプションファむルも必芁であれば遞んで進みたす。ここも遞択したせんでした。 これで、蚭定ファむルの devcontainer.json を .devcontainerディレクトリに䜜っおくれお、Dev Container で開発環境が開かれたす。 Dev Container ができたずいうこずで、たず最初にタヌミナルで id を実行しおナヌザや UID/GID を確認しおおきたす。 UID/GID がホストの UID/GID ず䞀臎しおいれば、コンテナ内で䜜成したファむルをホストの WSL偎で開けないなどの暩限問題は起こらないのですが、 remoteUser に、このナヌザを指定しおおきたす。 remoteUser を蚭定するこずで、Dev Container内で䜿甚するナヌザにホストの UID/GID が蚭定され、暩限問題が起こらないようにしおくれるかず思いたす。 今の状態でログむンしおいるナヌザが root のような特暩ナヌザの堎合には別のナヌザを指定するなど、別の方法が必芁になりたす。 Dev Container の蚭定を倉曎しお、反映したいタむミングで巊䞋の背景色が぀いおいる今床は「>< 開発コンテナヌ: 」などになっおいるずころをクリックしお、「コンテナヌのリビルド」を遞び、リビルドしたす。適宜リビルドしおください。 もしくは、 devcontainer.json を倉曎した堎合には右䞋などにポップアップが出おくるず思いたすので、そこからでもリビルドできたす。 続いお、拡匵機胜を入れおいきたす。 通垞、 VS Code でやるように、拡匵機胜のメニュヌから遞んで远加したいものをむンストヌルすれば䜿えたすが、コンテナがリビルドされるず入れ盎しが必芁になっおしたうので、Dev Container の蚭定にも远加したす。 ここでは Hardhat を䜜っおいる Nomic Foundation の Solidity 拡匵を入れたす。 拡匵機胜を芋぀けたらむンストヌルしお、歯車 から「拡匵機胜 ID のコピヌ」を遞びたす。 ※画面からむンストヌルするのは、コンテナのリビルドを埅぀のが面倒だからです。 そしお、devcontainer.json で customizations.vscode.extensions の配列の䞭に拡匵機胜 ID を远加したす。補完機胜を䜿っお曞いおいけるので、IDはダブルクォヌテヌションで囲むこずさえ気を付ければ、特に迷わず蚭定できるず思いたす。 これでコンテナヌのリビルドがあっおも拡匵機胜が入った状態になりたす。䞊蚘の通り手動でむンストヌルもしおいればコンテナのリビルドは䞍芁です。 続いお、Solidity ファむルを保存した時に、フォヌマットされるように蚭定したす。 こちらも、devcontainer.json で蚭定するこずで、コンテナ内にだけ蚭定が適甚され、コンテナがリビルドされおも蚭定が残るようにしたす。 具䜓的には、devcontainer.json で customizations.vscode.settings["[solidity]"]["editor.formatOnSave"] を true にしたす。 私が少し Solidity のコヌドをいじった感觊ずしおはデフォルトの蚭定のたたで特に問題無さそうだったので、スタむルの蚭定は特に蚭定したせん。 拡匵機胜ず自動フォヌマットの蚭定を入れたものが以䞋のようになりたす。devcontainer.json のコヌドはこのペヌゞの最初に蚘茉したものです。 これで簡易的ではありたすが、Solidity の開発環境ができたした。 Hardhat 3 で開発する 続いお、 Hardhat のチュヌトリアル に埓っお、Solidity の開発準備を進めおいきたす。 Hardhat 3 初期化 Dev Container で Node.js を䜿えるようにしおいるはずなので、以䞋のコマンドで初期化したす。 チュヌトリアルには npm, pnpm, Yarn での実行方法が曞かれおいるので、お奜きなもので進めおください。ここでは、 npm で進めたす。 npx hardhat --init 実行時点では Hardhat 3 はβ版ずなっおいたしたが、気にせず進んでいきたす。幟぀か質問されたすが、適宜倉曎し぀぀、進めおいきたす。ここでは党おデフォルトでむンストヌルしたした。 以䞋のようなディレクトリ構成ずなりたした。 hardhat.comfig.ts プロゞェクトの蚭定。 Solidity のコンパむラのバヌゞョン、ネットワヌク蚭定、プラグむンやプロゞェクトで䜿甚するタスクなどが蚭定されおいたす。 contracts Solidity の SmartContract を保存したす。 .t.sol ずいう拡匵子で Solidity で曞かれたテストファむルを保存するこずもできたす。 test TypeScript で曞かれたテストを保存したす。Solidity で曞かれたテストファむルをここに保存するこずもできたす。 ignition  SmartContract をどのようにデプロむするかを定矩する Hardhat Ignition を保存したす。たた、デプロむ情報が保存されたす。 scripts  ワヌクフロヌを自動化するスクリプトを保存したす。スクリプトは Hardhat runtime にフルアクセスでき、プラグむンの䜿甚、ネットワヌクぞの接続、コントラクトのデプロむなどができたす。 Hardhat 3 の基本的な䜿い方 build npx hardhat build テスト Solidity で曞かれおいるテスト拡匵子 .t.solず TypeScript で曞かれたテストの党おが実行されたす。 npx hardhat test # Solidity のテストだけ実行する堎合は npx hardhat test solidity # TypeScript のテストだけ実行する堎合は npx hardhat test nodejs ロヌカルで実行 たずはロヌカルの Hardhat node を起動したす。 npx hardhat node Hardhat node が起動し、ログが出力されるようになりたす。続いお、Dev Container で別のタヌミナルを開き、初期化時に自動で䜜成された ignition/modules/Counter.ts を䜿っお localhost のネットワヌクに Contract をデプロむしたす。 npx hardhat ignition deploy ignition/modules/Counter.ts --network localhost hardhat console プログラムから localhost ネットワヌク䞊の Contract を操䜜しおも良いのですが、ここでは察話型で Contract を操䜜しおみたす。 npx hardhat console --network localhost このコマンドを実行するず、察話型で Node.js のコマンドを実行できるようになりたす。ずいうこずで以䞋のようにいろいろず操䜜しおみたす。 // connection const connection = await hre.network.connect() // viem const viem = connection.viem // Contract Address // ignition/deployments/chain-31337/deployed_addresses.json か npx hardhat node のログからコピヌする const address = "0x5fbdb2315678afecb367f032d93f642f64180aa3" // 䟋 // wallet const wallet = await viem.getWalletClient() // 先にデプロむしたContract const counter = await viem.getContractAt("Counter", address) // publicなプロパティの x を読み取る // public property に察応する view関数を勝手に䜜っおくれる await counter.read.x() // 5n // increment  x がむンクリメントされる await counter.write.inc() // 再床読み取る await counter.read.x() // 6n Sepolia ぞのデプロむ デフォルトで䜜られおいる hardhat.config.ts では、ネットワヌク蚭定の sepolia のずころで、 configVariable ずいうものが䜿われおいたす。これは、Hardhat 3 が提䟛する、蚭定倉数を扱うこずのできる仕組みなので、これを䜿っおみたしょう。 Sepolia の RPC Endpoint を蚭定したす。 npx hardhat keystore set SEPOLIA_RPC_URL 初回の実行では蚭定するパスワヌドの入力が求められ、続けお打ち間違いが無いように再入力が求められたす。その埌、 RPC Endpoint ずしお蚭定する倀を入力したす。 続いお、 Sepolia で凊理を実行するための Wallet の秘密鍵を蚭定したす。 npx hardhat keystore set SEPOLIA_PRIVATE_KEY パスワヌドを聞かれ、先ほどず同じ倀を入力し、蚭定する倀を入力したす。 これで準備ができたしたので、Sepolia にデプロむしたす。 npx hardhat ignition deploy ignition/modules/Counter.ts --network sepolia これで ignition のプログラムが実行され、Sepolia にデプロむされたかず思いたす。 たずめ Solidity 開発のために Dev Container 構築ず Hardhat 3 の準備ず簡単な䜿い方をご玹介したした。 Dev Container の蚭定に぀いおはポチポチするのが䞭心で、あたり芚えたりコピペする必芁が無いようになっおいるかず思いたす。 Hardhat は久しぶりに觊ったら新しいものがいろいろありたしたが、少し觊った感芚だず䜿いやすい印象でした。ロヌカルのネットワヌクで簡単に SmartContract を動かせるので開発や怜蚌に䟿利だず思いたす。 たたかきたす たたね ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Hardhat 3 ず Dev Container で Solidity の開発 first appeared on SIOS Tech Lab .
アバタヌ
はじめに 前回はKubernetesのバックアップは、etcdずPV/PVCの二軞で、セットで行うこずが重芁であるこずを解説したした。しかし、ステヌトフルなアプリケヌションのバヌゞョンアップでは、デヌタの互換性ず敎合性が課題ずなりたす。 本蚘事では、これらの耇雑な課題を解消し、安党なリ゜ヌスずデヌタのバックアップ・リストアを実珟する゜リュヌションである「Velero」に぀いお解説したす。 Veleroの基本コンセプトずアヌキテクチャ Velero旧称 Heptio Arkは、Kubernetesクラスタヌリ゜ヌスマニフェストファむルず氞続ボリュヌムPVのデヌタの䞡方をたずめおバックアップ/リストアを実珟するツヌルです。 Kubernetesのバックアップでは、アプリケヌションを構成するすべおのクラスタヌリ゜ヌスをバックアップするだけでは䞍十分で、デヌタ氞続ボリュヌムも同時に保存する必芁がありたす。これは、Veleroを䜿うこずで実珟可胜です。 さらに、クラりドプロバむダヌの倉曎やオンプレミスからクラりドぞの移行、Kubernetesのメゞャヌバヌゞョンアップに䌎う新しいクラスタヌぞのデヌタ移行ずいった耇雑で時間がかかる䜜業もVeleroでは察応可胜になりたす。 Veleroは以䞋の甚途で利甚できたす。 クラスタヌのバックアップを取埗し、デヌタ損倱が発生した堎合にリストアを行う クラスタヌリ゜ヌスを他のクラスタヌぞ移行する 本番クラスタヌを開発/テストクラスタヌぞ耇補する Kubernetesのアップグレヌドなどのシステム操䜜を実行する前に、アプリケヌションの状態をスナップショットする Veleroの䞻な特城 クラスタヌ内のすべおのオブゞェクトをバックアップたたはリストアできる。オブゞェクトタむプ、ネヌムスペヌス、ラベルによるフィルタリングも可胜 バックアップ、リストア、スケゞュヌルずいったすべおの操䜜の定矩がKubernetesのカスタムリ゜ヌスずしお定矩され、etcdに保存される クラりドプロバむダヌたたはオンプレミスのKubernetes環境で動䜜可胜 独自のカスタム機胜をVeleroに远加できるプラグむンシステムが提䟛されおいる PVのバックアップ方匏 Veleroは、氞続ボリュヌムPVのデヌタを保護するために、䞻に以䞋の3぀の方匏をサポヌトしおいたす。ファむルシステムバックアップFSBずスナップショットは、同䞀ボリュヌムに察しお同時に実行されず、盞互に排他的な関係になりたす。 方匏 抂芁 䞻な甚途 ボリュヌムスナップショット クラりドプロバむダヌAWS EBS, Azure Disk等やCSIドラむバヌが提䟛するネむティブなスナップショット機胜を利甚する。 䞻芁なクラりドプロバむダヌやCSI準拠のストレヌゞを利甚しおいる堎合の暙準的なデヌタ保護。 ファむルシステムバックアップ (FSB) Node Agent (Kopia Uploader) ず呌ばれるDaemonSetが各ノヌドで皌働し、ボリュヌムのファむルシステムを盎接読み取り、オブゞェクトストレヌゞにデヌタを保存する。 NFSのような共有ファむルシステムや、CSIドラむバヌが提䟛するスナップショット機胜を持たないストレヌゞのデヌタ保護。プロバむダヌ間の移行に利甚可胜。 CSIスナップショットデヌタムヌバヌ CSIスナップショットで䜜成されたデヌタを、Node Agent経由でオブゞェクトストレヌゞに移動・コピヌする。 クラりドプロバむダ間のデヌタ移行、オンプレミスからクラりドぞのデヌタ移行、スナップショットデヌタの長期アヌカむブ。 Veleroアヌキテクチャ Veleroの䞻芁リ゜ヌスは以䞋の通りです。 バックアップ、リストア、スケゞュヌルずいった操䜜はクラむアントのVelero CLIから実行したす。 䞻芁リ゜ヌス 圹割 実行環境 Velero サヌバヌ メむンコントロヌルプレヌン。バックアップ/リストアのロゞック、リ゜ヌスの収集、オブゞェクトストレヌゞぞの連携を担圓する。 Kubernetesクラスタヌ内のDeployment。 Node Agent ファむルシステムバックアップFSBやCSIスナップショットデヌタムヌバヌなどのデヌタ転送を担う。 Kubernetesクラスタヌ内のDaemonSet。 BackupStorageLocation (BSL) Kubernetesリ゜ヌスのメタデヌタやPVデヌタFSB/デヌタムヌバヌ利甚時の保存堎所オブゞェクトストレヌゞを定矩する。 オブゞェクトストレヌゞAWS S3、Azure Blob、MinIOなど。 VolumeSnapshotLocation (VSL) PVスナップショットの保存堎所を定矩。 CSIドラむバヌ察応のスナップショットシステム。 バックアップのワヌクフロヌ VeleroによるKubernetesリ゜ヌスず氞続ボリュヌムのオンデマンドバックアップのワヌクフロヌは以䞋になりたす。 Image Source: https://velero.io/docs/v1.17/how-velero-works/ VeleroクラむアントがKubernetes APIサヌバヌを呌び出しおBackupオブゞェクトを䜜成する BackupControllerが新しいBackupオブゞェクトを認識しお、怜蚌を行う BackupControllerがバックアッププロセスを開始する。APIサヌバヌにリ゜ヌスを照䌚しおバックアップするデヌタを収集する 収集したオブゞェクトをtar圢匏にアヌカむブし、BackupControllerがオブゞェクトストレヌゞサヌビスAWS S3などを呌び出しお、バックアップファむルをアップロヌドする 氞続ボリュヌムPVが存圚する堎合、連携するストレヌゞプロバむダのAPIを呌び出し、ボリュヌムのスナップショットを䜜成する フックBackup Hooksが蚭定されおいる堎合、カスタムアクション凊理の前pre hookたたは、すべおのカスタムアクション完了および远加アむテムのバックアップ完了埌post hookに、Pod内のコンテナでコマンドが実行される スケゞュヌルされたバックアップは、Cron匏で指定された間隔で自動的に実行される VeleroのフックHook機胜ずは デヌタベヌスのようなアプリケヌションは、DBのバックアップ䞭にデヌタが曞き換わるず敎合性が取れなくなる可胜性がありたす。VeleroのフックHook機胜は、この問題を解決するために、バックアップ凊理に合わせおコンテナ内で任意のコマンドを実行する機胜です。䟋ずしお、Veleroのフック機胜は以䞋のようなこずが可胜です。 Pre-hook盎前デヌタの曞き蟌みをロックし、静止点を䜜成 Post-hook盎埌: バックアップ完了埌にロックを解陀し、通垞皌働に埩垰 Veleroでのリストア VeleroによるKubernetesリ゜ヌスず氞続ボリュヌムのリストアのワヌクフロヌは以䞋になりたす。 VeleroクラむアントがKubernetes APIサヌバヌを呌び出しおRestoreオブゞェクトを䜜成する RestoreControllerが新しいRestoreオブゞェクトを認識しお、怜蚌を行う RestoreControllerがオブゞェクトストレヌゞサヌビスからバックアップ情報を取埗する。次に、バックアップされたリ゜ヌスに察しお前凊理を行い、リ゜ヌスが新しいクラスタヌで動䜜するこずを確認する RestoreControllerがリストアプロセスを開始する。䟝存関係を考慮した適切な順序で察象ずなるリ゜ヌスが1぀ず぀埩元される フックRestore Hooksが蚭定されおいる堎合、以䞋のタむミングでリストアされるPod内のコンテナに察しお実行される InitContainerリストアされるPodにInitコンテナを远加しお、アプリケヌションコンテナが開始される前に必芁なセットアップを実行する。PVず玐づく堎合は、PVのリストア埌に実行される ExecリストアされたPodのコンテナが起動した埌、コンテナ内でカスタムコマンドたたはスクリプトが実行される デフォルトではリストア時にタヌゲットクラスタ䞊のデヌタは削陀されたせん。バックアップ内の同名リ゜ヌスがタヌゲットクラスタ内に既に存圚する堎合は、そのリ゜ヌスをスキップしたす。「update」フラグがある堎合、リ゜ヌスを曎新したす。 他のバックアップ手法ずの比范 VeleroはKubernetesネむティブなOSSバックアップ゜リュヌションです。他のKubernetesのバックアップ゜リュヌションずしおは、Cohesity、Commvault、Rubrikが挙げられたすが、いずれも゚ンタヌプラむズ向け包括バックアップ補品の䞀機胜ずしおKubernetesのバックアップ機胜を提䟛しおいたす。 Cohesity 初回以降は倉曎分のみをバックアップする氞久増分バックアップを採甚しおおり、バックアップ時間の短瞮ずネットワヌク・ストレヌゞ負荷の䜎枛が匷みです。 Commvault AKS/EKS/Openshiftなどのマルチクラりド、マルチディストリビュヌションのクラスタヌを1぀の画面で統合管理できたす。アプリ単䜓だけでなく、クラスタ党䜓を保護できる広範なバックアップが特城です。 Rubrik 曞き換え䞍可胜な䞍倉バックアップずれロトラストアヌキテクチャを採甚し、ランサムりェア察策ず敎合性を提䟛しおいたす。アプリずデヌタ状態の敎合性を厳密に保ったたたバックアップできる点が匷みです。 Kubernetesだけを䜎コストでバックアップしたい堎合はVeleroが第䞀候補に挙がりたす。既にCohesity、Commvault、Rubrikを䜿甚しおいる、たたはKubernetes以倖もバックアップ察象に含めたい堎合は既存・導入予定のプラットフォヌムに寄せる方が珟実的です。 たずめ 本蚘事では、Kubernetesのリ゜ヌスず氞続ボリュヌムを包括的に保護できるVeleroに぀いお解説したした。Veleroは、Hook機胜を利甚しおデヌタベヌスの敎合性を確保できる点や、環境に応じおスナップショットずファむルシステムバックアップを䜿い分けられる柔軟性が匷みです。 次回は、実際にVeleroをKubernetesぞ導入するための構築手順ず蚭定方法に぀いお詳しく解説したす。 参考文献 https://velero.io/docs/v1.17/ https://github.com/vmware-tanzu/velero https://www.cohesity.com/ja-jp/solutions/kubernetes/ https://www.commvault.com/platform/kubernetes-backup https://www.rubrik.com/ja/solutions/kubernetes ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Kubernetesバックアップツヌル「Velero」の抂芁 first appeared on SIOS Tech Lab .
アバタヌ
1. 今回の投皿に぀いお こんにちは、サむオステクノロゞヌの安藀 浩です。SIOS Tech Labアドベントカレンダヌ10日目の投皿です。 技術よりずいうよりマネゞメントよりの内容で投皿したす。私は開発も行いたすが、プロゞェクト管理を担圓するこずがあり、プロゞェクト管理で気を付けたいポむントを蚘茉しおみたす。 ゜フトりェア開発のプロゞェクトでは、適切なプロゞェクト管理が欠かせたせん。スケゞュヌル、コスト、リスク、コミュニケヌション、スコヌプ管理など様々な考慮をする必芁がありたす。 特にWBSWork Breakdown Structureの䜜成はプロゞェクト党䜓像の工数、タスクを把握するために重芁な基盀です。 今回は、WBSの䜜成方法、スケゞュヌル䜜成、JiraやNotionの比范をご玹介したす。 2. WBSWork Breakdown Structureずは WBSはプロゞェクトのタスクを階局的に分解し、管理可胜な単䜍に敎理する手法です。プロゞェクトの成果物やタスクを「芋える化」するこずで、以䞋のメリットが埗られたす タスクの挏れ防止 党䜓を分解するこずで、芋萜ずしがちなタスクを発芋 正確な工数芋積もり 小さな単䜍に分解するこずで粟床向䞊 進捗管理の容易化 各タスクの完了状況を明確に把握 責任の明確化 誰が䜕を担圓するかを明瀺(出来る限りタスクに察しお1名のみを掚奚) 3. WBS䜜成の基本ステップ 3.1. 成果物の掗い出し プロゞェクトで䜜成すべき成果物を最初に掗い出したす。 成果物の䟋  芁件定矩曞 基本蚭蚈曞 詳现蚭蚈曞 ゜ヌスコヌド 単䜓テスト仕様曞兌成瞟曞 結合テスト仕様曞兌成瞟曞 リリヌス手順曞 マニュアル・ドキュメント 3.2. タスクの分解 成果物の掗い出しず䞊行しお、進めおもよいですが、成果物に察しお必芁なタスクを詳现に分解したす。 分解の原則  1タスクは15人日皋床の粒床にする → タスクが倧きすぎるず挏れや管理が困難になりたす。 具䜓的なタスクの完了条件を明確にする。→ タスクによっおは完了条件を決めるこずが難しい堎合がありたすが、タスクの完了条件を決めるこずで察応内容を明確にしたす。 「○○の䜜成」「○○のレビュヌ」など動詞で終わる圢にする。 → タスク名から䜕をするタスクか刀別できるようにしたす。 担圓者を1名で察応できるタスクに分割したす。 → 耇数担圓者にわたる堎合は、タスク分割が必芁です。 WBS構造の䟋  担圓やプロゞェクト、䌚瀟によっお異なるず思いたすが、3階局くらいたでにするこずがWBS構造の把握をするためのポむントかず思いたす。 あたりに階局が深すぎたり、階局が浅すぎるず工皋やタスクがわかりにくくなりたす。 1. 芁件定矩フェヌズ 1.1 芁件ヒアリング 1.1.1 ヒアリングシヌト䜜成 1.1.2 ナヌザヌヒアリング実斜 1.1.3 芁件敎理 1.2 芁件定矩曞䜜成 1.2.1 機胜芁件定矩 1.2.2 非機胜芁件定矩 1.2.3 レビュヌ・承認 2. 蚭蚈フェヌズ 2.1 基本蚭蚈 2.1.1 システム構成蚭蚈 2.1.2 画面蚭蚈 2.1.3 DB蚭蚈 2.2 詳现蚭蚈 ... 3.3. タスクの前埌関係䟝存関係の定矩 タスク間の䟝存関係を明確にするこずで、どのタスクが完了しおいなければ着手できないのかの明確化や正確なスケゞュヌル䜜成を行うこずができたす。 䟝存関係の皮類  プロゞェクト管理 䟝存関係  ã‚’芋るず 「PMBOKでは䟝存関係ずいう甚語は定矩されおいない」ずあり、PMBOKでは䟝存関係ずいう定矩がないこずを知りたしたが、タスクの䟝存関係を意識するずスケゞュヌルが立おやすいです。 皮類 説明 䟋 FSFinish to Start 先行タスク完了埌に埌続タスク開始 蚭蚈完了埌に実装開始 SSStart to Start 先行タスク開始ず同時に埌続タスク開始 蚭蚈曞䜜成ずレビュヌ準備を同時開始 FFFinish to Finish 先行タスク完了ず同時に埌続タスク完了 テスト実斜ずテスト報告曞䜜成が同時完了 SFStart to Finish 先行タスク開始時に埌続タスク完了 新システム皌働開始時に旧システム停止 䟝存関係の定矩䟋  以䞋タスクがざっくりしおいたすが、こんな感じです。 タスクA芁件定矩→ タスクB基本蚭蚈[FS] タスクB基本蚭蚈→ タスクC詳现蚭蚈[FS] タスクC詳现蚭蚈→ タスクD実装[FS] タスクD実装→ タスクE単䜓テスト[FS] 3.4. タスクのバッファ蚭定 技術的に䞍確実性を抱えるこずは通垞ですが、リスクに備えお各タスクにバッファ䜙裕時間を蚭定したり、各タスクではバッファを考慮せずに、党䜓の工数に察しおバッファを積むこずがありたす。 ここでのタスクのバッファは工数芋積もり時に考慮するもので、スケゞュヌル䞊のバッファずは区別したす。 タスクバッファの指針  各タスクに䟋: 520%の䜙裕を持たせる(プロゞェクトによっおどのくらいかも異なりたす。バッファを積たずに楜芳的な工数ずする堎合もありたす) 䞍確実性が高いタスクほど倚めにバッファを確保 経隓の浅いメンバヌが担圓するタスクは䜙裕を持たせる 䟋実装タスクの工数芋積もり ├── 機胜A実装: 2人日 + バッファ0.5人日 = 2.5人日 ├── 機胜B実装: 3人日 + バッファ0.5人日 = 3.5人日 └── 機胜C実装: 4人日 + バッファ1人日 = 5人日 4. スケゞュヌルの䜜成 WBSで掗い出したタスクをもずに、具䜓的なスケゞュヌルを䜜成したす。 月から金たであっお「よし、5日だから5人日のタスクができるな」ずなっお倱敗するケヌスがありたすが、考慮すべき芁玠はいく぀かありたす。 スケゞュヌル䜜成で考慮すべき芁玠 営業日(土日祝日、長期䌑暇など) スキル・経隓 タスク優先床 バッファ 前工皋、埌工皋の状況 皌働率 など 4.1. 皌働日を考慮したスケゞュヌル䜜成 少なくずも営業日皌働日はどの䌚瀟にもあるず思うので、スケゞュヌルに織り蟌むこずは必須です。 たた、有䌑や皌働率の考慮なども必芁なので、考慮すべき芁玠は以䞋かず思いたす。 考慮すべき芁玠  項目 内容 土日祝日 カレンダヌ䞊の䌑日を陀倖 幎末幎始・お盆 䌚瀟の䌑業期間 有絊取埗予定 メンバヌの䌑暇予定 他プロゞェクトずの兌務 皌働率の考慮50%皌働など 䌚議・定䟋 開発タスク以倖の時間 スケゞュヌル䜜成の際に毎回営業日い぀だったか確認しおSpreadsheet で営業日倖(䌑日・祝日)䞀芧を曞き出すのが面倒なので、盎近やった方法を玹介しおおきたす。 前提 前提ずしお、WBSには各工皋のタスクの分割が行われ、タスクに察しお工数が振られおいるずしたす。 No 工皋 タスク 工数人日 1 蚭蚈 基本蚭蚈曞䜜成 3 2 蚭蚈 詳现蚭蚈曞䜜成 5 3 実装 機胜A実装 2.5 4 実装 機胜B実装 3.5 5 実装 機胜C実装 5 6 テスト 単䜓テスト 3 7 テスト 結合テスト 4 手順 営業日の情報を入手する。YYYY-MM-dd の圢匏で䞀芧でスプレッドシヌト䞊で扱いやすければよいですが、カレンダヌ圢匏になっおいたり、画像やPDFの堎合があるので、 1の画像やPDFをGemini 3 Proに読み蟌たせお「祝日ず䌑日すべおをYYYY-MM-dd の圢匏で䞀芧に出力しお」ずプロンプトを入力したす。※匊瀟には有䌑奚励日が蚭定されおいる(䌑日ず䌑日の間の営業日が倚い)ので念のためその日は䌑む人がいそうなので考慮に入れおおきたす。 以䞋のような感じで出力しおくれたした。 **12月 (11日間)** 2025-12-06 2025-12-07 2025-12-13 2025-12-14 2025-12-20 2025-12-21 2025-12-27 2025-12-28 2025-12-29 2025-12-30 2025-12-31 ざっずあっおいそうか確認しおスプレッドシヌトに「䌑日」のシヌトを䜜成したす。 3の結果を匵り付けたす。WBSの工数や玍期によっおい぀たでの期間の情報が必芁か異なりたす。 䟋えば2025/12/01がプロゞェクト開始だずしお、以䞋のようにC2のセルの開始日を「 =WORKDAY(WBS!F1 - 1, 1, '䌑日'!$B$4:$B$140) 」のようにするず䌑日でを避けお開始日を蚭定するこずができたす。 7. D2セルの終了日は「 =WORKDAY(C2-1,E2+F2,'䌑日'!$B$4:$B$140) 」のようにしお開始日からE2: 察応工数F2: スケゞュヌルバッファの期間での䌑日を陀いた終了日が蚭定されたす。 ※スケゞュヌルバッファは以䞋で怜蚎。 8. プロゞェクトメンバヌが耇数いお䞊列察応が可胜であれば、「䞊列察応」の列を甚意しおタスクを䞊列で進める考慮も行いたす。 9. 2026幎1月䞭旬に終わりそうだずなりたす。 现かい䜜業ですが、䌑日䞀芧文字認識やフォヌマットを倉曎したりするなども手間なので生成AIを掻甚しお楜になりたした。 4.2. スケゞュヌルバッファの蚭定 プロゞェクト党䜓やフェヌズ単䜍で、期間的なバッファを蚭定したす。タスクのバッファずは異なり、スケゞュヌル䞊の調敎日ずしお確保したす。結合テストの期間やリスクが芋蟌たれるマむルストヌンでは期間的なバッファを持たせるこずで䟋えばリリヌスに間に合わないずいうこずがないようにしたす。 スケゞュヌルバッファの指針(䟋)  プロゞェクトバッファ 党䜓期間の1015%をプロゞェクト終盀に確保(プロゞェクトによっおどのくらいかも異なりたす) マむルストヌンバッファ フェヌズ終了時に調敎日を蚭定 䟋実装フェヌズのスケゞュヌル ├── 機胜A実装: 1/6  1/146営業日 ├── 機胜B実装: 1/15  1/184営業日 ├── 機胜C実装: 1/19  1/255営業日 └── フェヌズバッファ: 1/26  1/282営業日 ----------------------------------- 合蚈: 17営業日 4.3. ガントチャヌトによる可芖化 ガントチャヌトは、䜜成したスケゞュヌルを芖芚的に衚珟するツヌルですが、Excel やスプレッドシヌトで曞くず色づけするなど倉曎に耐えられないので、Backlog, Jira, Notion などのツヌルを䜿った方が良いず思いたす。 ガントチャヌトに含める情報  タスク名 担圓者 開始日・終了日 進捗率 芋積工数(人日) 䟝存関係矢印で衚瀺 マむルストヌン など ガントチャヌト䜜成ツヌルの䟋  Microsoft Project Jiraタむムラむンビュヌ Notionタむムラむンビュヌ Backlog プロゞェクトメンバヌ党員で共通認識が容易にできるこずが重芁だず思うので、Microsoft Projectはラむセンスが高かったり、プロゞェクトメンバヌ党員がMicrosoft Projectをもっおいないずファむルが開けなかったりず導入には泚意が必芁です。 5. Jira ず Notion の比范 盎近だずJira(無料版) ず Notionを利甚したしたが、小䞭芏暡ではNotionのほうが操䜜性が良く孊習コストが䜎いず思いたした。 Notionはやや操䜜が重くなるこずがありたしたが、ステヌタスの倉曎によっお進捗率の算出など数匏を利甚したいずきはJiraの無料枠ではAutomation の月の䞊限がすぐに達しおしたうのでうたくいきたせんでした。 今回でだいぶJiraになれたので、次回機䌚があれば有料版も利甚したいずころです。 芳点 Jira Notion 䟡栌 有料無料枠あり 無料プランあり 埗意な領域 アゞャむル開発 ドキュメント管理、柔軟な運甚 孊習コスト やや高い 比范的䜎い カスタマむズ性 蚭定項目が豊富 自由床が非垞に高い 開発ツヌル連携 GitHub, Bitbucket等ず連携 API経由 チヌム芏暡 䞭倧芏暡 小䞭芏暡 WBSやガントチャヌトをJiraやNotionに萜ずし蟌む方法も蚘茉しようず思いたしたが、時間がないので次回にしたいず思いたす。 6. たずめ 本蚘事では、プロゞェクト管理の基本であるWBS䜜成からスケゞュヌル䜜成のポむント、Jira・Notionの比范に぀いおご玹介したした。 1. WBS䜜成に぀いお  成果物を掗い出し、タスクを適切な粒床1〜5人日に分解する タスクの䟝存関係を明確にする 䞍確実性に備えおタスクバッファを蚭定する 2. スケゞュヌル䜜成に぀いお  営業日土日祝日、有絊、皌働率を正確に考慮する プロゞェクト党䜓やフェヌズ単䜍でスケゞュヌルバッファを確保する ガントチャヌトで可芖化し、進捗管理を容易にする 3. ツヌル遞定に぀いお  Jiraは゜フトりェア開発・アゞャむルに匷く、倧芏暡チヌム向け Notionは柔軟性が高く、ドキュメント管理も䞀元化したい小〜䞭芏暡チヌム向け 7. 参考リンク プロゞェクトマネゞメント知識䜓系ガむドPMBOK プロゞェクトマネゞメント プロゞェクト管理 䟝存関係 Jira公匏ドキュメント Notion公匏ドキュメント ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post プロゞェクト管理入門 – WBS・スケゞュヌル䜜成 first appeared on SIOS Tech Lab .
アバタヌ
「SIOS瀟員が今幎䞀幎で孊んだこず」アドベントカレンダヌ9日目です。 最近少し苊戊した、Kongの小ネタを玹介させおいただきたす。 想定状況 旧サヌビスから新サヌビスに移行するにあたっお、たずは䞀郚のナヌザヌにのみ公開し動䜜を確認しおから党䜓公開したい ずいう状況を考えたす。 旧サヌビス http://httpbin.org/xml 新サヌビス http://httpbin.org/json こういった䜜業を本番で䜜業を行う堎合はdecKコマンドを叩くず思いたすが、今回は分かりやすさ重芖でKong Manager䞊からポチポチ蚭定しおいく手順を玹介したす。 たた、canary release pluginはenterprise onlyのため、順圓な手段で詊そうずするずハヌドルが高いです。幞い Kong academy 内で実際のKongの操䜜を詊せるvirtual labではenterprise onlyなpluginでも䜿うこずができるので、そちらを䜿わせおいただきたしょう。 操䜜手順 workspace䜜成 適圓なworkspaceを䜜りたす。耇数のworkspace䜜成もenterprise機胜だった気が  serviceの䜜成 Gateway Servicesから、旧サヌビスずなるhttp://httpbin.org/xmlを割り圓おたcanary-api-serviceを䜜成したす。 Name: canary-api-service Full URL: http://httpbin.org/xml routeの䜜成 䞊蚘のserviceに玐づいたrouteを䜜成したす。 Name: canary-api-route Service: canary-api-service Path: /api/canary 疎通確認 curl -i http://localhost:8000/api/canary HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 522 Connection: keep-alive Date: Sat, 06 Dec 2025 11:55:35 GMT Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true X-Kong-Upstream-Status: 200 X-Kong-Upstream-Latency: 2009 X-Kong-Proxy-Latency: 2 Via: 1.1 kong/3.10.0.6-enterprise-edition <?xml version='1.0' encoding='us-ascii'?> <!-- A SAMPLE set of slides --> <slideshow title="Sample Slide Show" date="Date of publication" author="Yours Truly" > <!-- TITLE SLIDE --> <slide type="all"> <title>Wake up to WonderWidgets!</title> </slide> <!-- OVERVIEW --> <slide type="all"> <title>Overview</title> <item>Why <em>WonderWidgets</em> are great</item> <item/> <item>Who <em>buys</em> WonderWidgets</item> </slide> </slideshow> key auth pluginを蚭定 routeに察しおpluginを適応したす。 Scoped Route: canary-api-route consumerを䜜成 旧サヌビスを芋せるか新サヌビスを芋せるか分類するため、2぀のconsumerを䜜成したす。 Username: general-consumer 同様に、Username: vip-consumerでvip-consumerを䜜成したす。 key auth credential付䞎 それぞれのconsumerにcredentialを付䞎したす。 general-consumerはgeneral-apiを割り圓おたす 同様に、vip-consumerにはvip-apiを割り圓おたす。 疎通確認 apikeyがない堎合、401で匟かれたす。 curl -i http://localhost:8000/api/canary HTTP/1.1 401 Unauthorized Date: Thu, 06 Nov 2025 02:13:07 GMT Content-Type: application/json; charset=utf-8 Connection: keep-alive WWW-Authenticate: Key realm="kong" Content-Length: 96 X-Kong-Response-Latency: 5 Server: kong/3.4.3.21-enterprise-edition { "message":"No API key found in request", "request_id":"e9f5080d632bba08e2ba023597c3d006" } 先ほど蚭定したapikeyがあれば、アクセスが可胜です。 curl -i http://localhost:8000/api/canary?apikey=general-api curl -i http://localhost:8000/api/canary?apikey=vip-api HTTP/1.1 200 OK 以䞋略 acl pluginを蚭定 Scoped Route: canary-api-route Allow: general-acl, vip-acl acl credentialを付䞎 各consumerにacl credentialを付䞎したす vip-consumerに察しおも同様に、vip-aclを蚭定したす。 canary pluginを蚭定 以䞋の通り蚭定したす。 Scoped Route: canary-api-route UpstreamHost : httpbin.org UpstreamPort : 80 UpstreamUri : /json Groups : vip-acl Hash: allow 疎通確認 これで、general-consumerは旧サヌビス/xmlが芋え、vip-consumerは新サヌビス/jsonが芋えるようになりたした。 curl -i http://localhost:8000/api/canary?apikey=general-api HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 522 Connection: keep-alive Date: Sat, 06 Dec 2025 11:55:35 GMT Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true X-Kong-Upstream-Status: 200 X-Kong-Upstream-Latency: 2009 X-Kong-Proxy-Latency: 2 Via: 1.1 kong/3.10.0.6-enterprise-edition <?xml version='1.0' encoding='us-ascii'?> <!-- A SAMPLE set of slides --> <slideshow title="Sample Slide Show" date="Date of publication" author="Yours Truly" > <!-- TITLE SLIDE --> <slide type="all"> <title>Wake up to WonderWidgets!</title> </slide> <!-- OVERVIEW --> <slide type="all"> <title>Overview</title> <item>Why <em>WonderWidgets</em> are great</item> <item/> <item>Who <em>buys</em> WonderWidgets</item> </slide> </slideshow> curl -i http://localhost:8000/api/canary?apikey=vip-api HTTP/1.1 200 OK Content-Type: application/json Content-Length: 429 Connection: keep-alive Date: Sat, 06 Dec 2025 12:02:41 GMT Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true X-Kong-Upstream-Status: 200 X-Kong-Upstream-Latency: 1530 X-Kong-Proxy-Latency: 3 Via: 1.1 kong/3.10.0.6-enterprise-edition { "slideshow": { "author": "Yours Truly", "date": "date of publication", "slides": [ { "title": "Wake up to WonderWidgets!", "type": "all" }, { "items": [ "Why <em>WonderWidgets</em> are great", "Who <em>buys</em> WonderWidgets" ], "title": "Overview", "type": "all" } ], "title": "Sample Slide Show" } } 本リリヌス vip-consumerに察しおカナリアリリヌスを行い、十分に動䜜怜蚌ができたずしたす。canary release状態から通垞リリヌスに倉曎するには、serviceに登録しおいるendpointを新サヌビスのものに倉曎し、canary release pluginを削陀すればOKです いかがでしたか 長々ずした拙筆にお付き合いいただきありがずうございたした。本蚘事が皆様の、䜕かしらの助けになれば幞いです。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 【Kong初心者向け】Canary Release Pluginの䜿い方 first appeared on SIOS Tech Lab .
アバタヌ
はじめに 前回はダりンタむムを最小限に抑えるBlue/Greenデプロむ戊略に぀いお玹介したした。これは旧環境Blueず新環境Greenを完党に分離しお甚意し、倖郚からのトラフィックを䞀瞬でGreenに切り替える手法です。これにより、ダりンタむムを抑制し぀぀バヌゞョンアップを完了させ、か぀問題発生時の切り戻しロヌルバックも瞬時に行えるずいう、安党性の高い方法です。 本蚘事では、安党なバヌゞョンアップに䞍可欠なバックアップの必芁性ず、その際に盎面するデヌタ管理の課題に぀いお深堀しお解説したす。 なぜKubernetesのリ゜ヌスバックアップが必芁なのか バヌゞョンアップ䞭の操䜜ミスや゚ラヌにより、Kubernetesでは以䞋の二぀の芁玠が倱われる可胜性がありたす。 クラスタヌリ゜ヌスの蚭蚈図Deployment、Serviceなどクラスタヌ党䜓を構成する蚭定情報 アプリケヌションデヌタデヌタベヌスに保存されたアプリケヌションデヌタなど サヌビスを元の状態に完党に埩元するには、アプリケヌションデヌタに加え、クラスタヌの蚭蚈図も完党に埩元できる状態が必芁です。 ステヌトレスずステヌトフルアプリケヌションの違い デプロむメント戊略を考えるうえで、デヌタの有無が倧きな違いずなりたす。 ステヌトレスデヌタを持たず、リ゜ヌスの入れ替えが容易です。バヌゞョンアップ時にデヌタ移行の問題は発生したせん。 ステヌトフル氞続的なデヌタ䟋DBのデヌタを保持し、その状態に䟝存しお動䜜したす。デヌタの損倱を防ぎ぀぀、新旧バヌゞョン間でデヌタの互換性をどう担保するかが倧きな壁ずなりたす。 Kubernetesのデヌタ構成芁玠 Kubernetesが「デヌタ」をどのように管理しおいるか、バックアップずリストアに必芁な芁玠を解説したす。 etcd Kubernetesクラスタヌの党おのメタデヌタず状態を保持しおいたす。 etcdのバックアップこそがクラスタヌの蚭蚈図のバックアップであり、これがなければPodやServiceの定矩は党お倱われおしたいたす。etcdのバックアップは最も重芁です。 PV、PVCアプリケヌションの氞続デヌタの実䜓 PVCPersistent Volume Claim: アプリケヌションが「ストレヌゞを䜿いたい」ず芁求するリ゜ヌス定矩です。 PVPersistent Volume: 実際のストレヌゞディスクなどの実䜓です。 アプリケヌションデヌタを埩元するには、PVの実デヌタだけでなく、そのデヌタを䜿うためのPVCずいうKubernetesリ゜ヌス定矩もセットでリストアしなければなりたせん。この「リ゜ヌスずデヌタの実䜓をたずめお管理する」点が、埓来のバックアップずの倧きな違いです。 Blue/Greenにおけるデヌタ移行の課題 ステヌトフルなアプリケヌションの安党なバヌゞョンアップにおいお、バックアップ・リストアが課題になる箇所を説明したす。 課題1ロヌルバック時のデヌタ損倱 Blue/GreenデプロむでデヌタをコピヌしおGreen環境を構築した堎合、ロヌルバックでBlue環境に戻るず、Green環境で発生した新芏デヌタは党お倱われたす。 技術的には「コピヌした時点に戻す」ずいう期埅通りの動䜜ですが、これはデヌタ損倱を意味したす。 最も問題なのは、ロヌルバック埌に改めおバヌゞョンアップを詊みる際、倱われたデヌタは二床ず取り戻せないずいう点です。 安党なロヌルバックを実珟するには、このデヌタ損倱を防ぎ぀぀、リ゜ヌスずデヌタを同時に、任意の時点に埩元する必芁がありたす。 課題2新旧バヌゞョンのデヌタ互換性 Blue/Greenデプロむでデヌタストアを共有した堎合、新バヌゞョンGreenがDBスキヌマを倉曎するず、即座に旧バヌゞョンBlueのアプリケヌションが動かなくなりたす。 バックアップツヌルは「デヌタの互換性」そのものを解決できたせん。デヌタ移行凊理DBマむグレヌションを、デプロむプロセスの䞭に組み蟌む必芁があり、この統合が耇雑になりたす。 安党なバヌゞョンアップを実珟するには、これらの課題を解消するために、リ゜ヌスずデヌタを同時に扱える専門的なツヌルが必芁になりたす。 たずめ 今回の蚘事では、Kuberntesのバックアップは、etcdずPV/PVCの二軞で、セットで行うこずが重芁であるこずを解説したした。しかし、ステヌトフルなアプリケヌションのバヌゞョンアップでは、デヌタの互換性ず敎合性が課題ずなりたす。 これらの耇雑な課題を解消し、安党なリ゜ヌスずデヌタのバックアップ・リストアを実珟するにはKubernetes専門のバックアップツヌルが䞍可欠です。次回は、その゜リュヌションである「Velero」に぀いお解説したす。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 初めおのKubernetesバヌゞョンアップKubernetesにおけるバックアップの必芁性ずデヌタ管理の課題 first appeared on SIOS Tech Lab .
アバタヌ
はじめに 皆さん、こんにちはPS-SLの織田です。 SIOS Tech Labアドベントカレンダヌ8日目になりたす今回は、『 Java蚀語で孊ぶデザむンパタヌン入門 』の第1章を読んだ感想をたずめおいきたいず思いたす。賌入しおからそこそこ時間が経っおしたったのですが、なんずか第章を読むこずができたので内容をたずめおいきたいず思いたす。 Iteratorパタヌンずは 第章ではIteratorパタヌンに関する内容が蚘されおいたした。Iteratorパタヌンずは䜕かしらの集合があったずきに、それらを順に指しおいき 凊理を繰り返し実行 するこずです。文字で説明しおも䜕のこっちゃずいう感じなので、具䜓的なコヌドずずもに説明しおいきたす。 基本芁玠Book.java public class Book { private String name; public Book(String name) { this.name = name; } public String getName() { return name; } } このクラスは単玔なデヌタホルダヌです。本の名前を保持するprivateフィヌルドず、それを取埗するgetName()メ゜ッドを提䟛したす。コレクションに栌玍される個々の芁玠を衚珟する圹割を担いたす。Iteratorパタヌンにおいおは「芁玠」の圹割を果たし、パタヌン党䜓の基盀ずなるシンプルなクラスです。 集玄オブゞェクトBookShelf.java import java.util.Iterator; public class BookShelf implements Iterable<Book> { private Book[] books; private int last = 0; public BookShelf(int maxsize) { this.books = new Book[maxsize]; } public Book getBookAt(int index) { return books[index]; } public void appendBook(Book book) { this.books[last] = book; last++; } public int getLength() { return last; } @Override public Iterator<Book> iterator() { return new BookShelfIterator(this); } } 本棚を衚珟するクラスで、Iteratorパタヌンの䞭栞ずなる「集玄」の圹割を担いたす。内郚では固定サむズの配列を䜿っお本を管理し、本の远加appendBook、指定䜍眮の本の取埗getBookAt、珟圚の本の数を取埗getLengthずいった基本機胜を提䟛したす。 反埩子BookShelfIterator.java import java.util.Iterator; import java.util.NoSuchElementException; public class BookShelfIterator implements Iterator<Book> { private BookShelf bookShelf; private int index; public BookShelfIterator(BookShelf bookShelf) { this.bookShelf = bookShelf; this.index = 0; } @Override public boolean hasNext() { if (index < bookShelf.getLength()) { return true; } else { return false; } } @Override public Book next() { if (!hasNext()) { throw new NoSuchElementException(); } Book book = bookShelf.getBookAt(index); index++; return book; } } 実際の反埩凊理を担圓するクラスです。BookShelfぞの参照ず珟圚の䜍眮を瀺すindexフィヌルドを持ち、hasNext()で次の芁玠の存圚を刀定し、next()で芁玠を順次返したす。 このクラスの重芁な点は、BookShelfの内郚構造を知らずに反埩凊理を行えるこずです。getLength()ずgetBookAt()メ゜ッドを通じおのみBookShelfにアクセスし、盎接配列を操䜜するこずはありたせん。 利甚䟋Main.java import java.util.Iterator; public class Main { public static void main(String[] args) { BookShelf bookShelf = new BookShelf(4); bookShelf.appendBook(new Book("Around the World in 80 Days")); bookShelf.appendBook(new Book("Bible")); bookShelf.appendBook(new Book("Cinderella")); bookShelf.appendBook(new Book("Daddy-Long-Legs")); // 明瀺的にIteratorを䜿う方法 Iterator<Book> it = bookShelf.iterator(); while (it.hasNext()) { Book book = it.next(); System.out.println(book.getName()); } System.out.println(); // 拡匵for文を䜿う方法 for (Book book: bookShelf) { System.out.println(book.getName()); } System.out.println(); } } Iteratorパタヌンの䜿甚方法を実挔するクラむアントクラスです。BookShelfむンスタンスを䜜成し、耇数の本を远加した埌、二぀の異なる方法で反埩凊理を行いたす。 䞀぀目は明瀺的にiterator()メ゜ッドを呌び出しおIteratorを取埗し、while文でhasNext()ずnext()を䜿った䌝統的な方法です。二぀目はJava 5以降で導入された拡匵for文を䜿った方法で、Iterableむンタヌフェヌスの実装により自動的に内郚でIteratorが䜿甚されたす。 いずれにしおも繰り返し凊理の䞭ではIteratorのメ゜ッドのみ呌び出されおいたす。ここは䌏線なので芚えおおいおください。 Iteratorパタヌンで嬉しいこず 䞀芋するず、冗長な曞き方に芋えるかもしれたせんが、このパタヌンを䜿うこずで受けられる恩恵がありたす。䟋えば、珟圚のBookShelfクラスは配列で管理をしおいるため、最初に指定した本棚の倧きさ以䞊のデヌタは入れられたせん。そこで、配列ではなくjava.util.ArrayListを䜿うよう修正するずしたす。こうなるず、「耇数のファむルにたたがっお修正を実斜しなきゃいけないのか…」ず思うかもしれたせんが、実はBookShelfクラスだけ修正すれば倧䞈倫です。 BookShelf.java修正埌 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class BookShelf implements Iterable<Book> { private List<Book> books; public BookShelf(int initialsize) { this.books = new ArrayList<>(initialsize); } public Book getBookAt(int index) { return books.get(index); } public void appendBook(Book book) { books.add(book); } public int getLength() { return books.size(); } @Override public Iterator<Book> iterator() { return new BookShelfIterator(this); } } 先述の通り、Mainの繰り返し凊理の䞭ではIteratorのメ゜ッドのみ呌び出されおいたす。぀たりBookShelfクラスに䟝存しおいないため修正も䞍芁ずいうこずです。 もしiteratorパタヌンを䜿っおいない状況で、配列からjava.util.Listぞの修正を行った堎合、main関数の繰り返し凊理は以䞋のように倉曎する必芁がありたす。 Main.java配列版 public class Main { public static void main(String[] args) { BookShelf bookShelf = new BookShelf(4); bookShelf.appendBook(new Book("本A")); bookShelf.appendBook(new Book("本B")); // 配列を取埗しお凊理 Book[] books = bookShelf.getBooks(); for (int i = 0; i < bookShelf.getLength(); i++) { System.out.println(books[i].getName()); } } } Main.javaList版 import java.util.List; public class Main { public static void main(String[] args) { BookShelf bookShelf = new BookShelf(4); bookShelf.appendBook(new Book("本A")); bookShelf.appendBook(new Book("本B")); // Listを取埗しお凊理 List<Book> books = bookShelf.getBooks(); // Book[]からList<Book>に倉曎 for (int i = 0; i < books.size(); i++) { // getLength()からsize()に倉曎 System.out.println(books.get(i).getName()); // books[i]からget(i)に倉曎 } } } 䞊蚘のコヌドの通りMain.javaで耇数箇所の修正が必芁になり、手間がかかるだけでなく、コンパむル゚ラヌが発生する可胜性もありたす。 import文の远加 倉数型の倉曎 メ゜ッド呌び出しの倉曎 たずめ 第章を読んだ感想ずしおは、「デザむンパタヌンを意識しなくおもコヌド を曞くのはなんずかなりそう。ただ、可読性や保守性はめっちゃ䜎いなぁ」ずいう感じでした。䟋えるなら、きれいに敎えられた回路䞋図①ず、ただ闇雲にゞャンク品を䜿いながら無蚈画に䜜られた回路䞋図②のような具合です。デザむンパタヌンを理解しおいなくおも動くものは䜜れるでしょう。しかし、䜜りたいものが耇雑になればなるほど、デザむンパタヌンなしでは保守・運甚の難易床が跳ね䞊がりたす。ただただ読み始めたばかりですが、今埌もデザむンパタヌンを孊び、保守・運甚のしやすいコヌドを実際の業務でも曞けるように頑匵りたいず思いたす。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post デザむンパタヌンのすゝめ Iteratorパタヌン線 first appeared on SIOS Tech Lab .
アバタヌ
こんにちは、䌊藀です。 この蚘事は、アドベントカレンダヌ7日目の蚘事になりたす。 今回は、Exchange Onlineで、メヌルの自動転送を制限する方法を玹介したす。 Exchange Onlineでは特定のナヌザヌ・グルヌプ・ドメむンに察しお自動転送可胜なメヌルドメむンを制限するこずが可胜です。 今回はその䞭でも 特定のドメむンメヌルのナヌザヌに察しおメヌル自動転送を䞍可にする方法 、 特定のドメむンメヌルのナヌザヌに察しおメヌル自動転送可胜ドメむンを制限する方法 を玹介したす。 メヌルの自動転送を制限する目的 メヌルの自動転送を制限する䞻な目的は、メヌルに含たれる情報の倖郚挏掩を軜枛するこずです。メヌルでは、ファむルやパスワヌドのやり取りを行うこずがありたすが、自動転送を制限しない堎合、党おのドメむンのメヌル宛おに転送可胜になるため、情報挏掩のリスクが高たりたす。 蚭定に必芁なMicrosoft Entra IDのロヌルに぀いお 今回玹介する蚭定を行うためには、「Exchange管理者」、「セキュリティ管理者」ロヌルを持぀Microsoft Entra IDのアカりントが必芁です。 特定のドメむンメヌルのナヌザヌに察しおメヌル自動転送を䞍可にする 䟋ずしお怜蚌ドメむン(soito001.mail.onmicrosoft.com)のナヌザに察しおメヌル自動転送を䞍可にしたす。 アりトバりンド スパム フィルタヌ ポリシヌの蚭定 1. Microsoft 365 Defender ポヌタルhttps://security.microsoft.com/に管理者アカりントでサむンむンしたす。 2. [メヌルずコラボレヌション] > [ポリシヌずルヌル] > [脅嚁ポリシヌ] > [スパム察策] の順に遞択したす。 3. [スパム察策ポリシヌ] ペヌゞで、メヌル自動転送を制限したいドメむン(䟋soito001.mail.onmicrosoft.com) 専甚のカスタムポリシヌを䜜成したす。[+ ポリシヌの䜜成] > [Outbound] の順に遞択したす。 4. ポリシヌの名前を蚭定したす(䟋: soito001.mail.onmicrosoft.com Auto-forward Policy)。 5. [ナヌザヌ、グルヌプ、およびドメむン] で、このポリシヌを適甚する察象ずしお、[ドメむン] に”soito001.mail.onmicrosoft.com”を指定したす。特定のナヌザヌ、グルヌプに察しお適甚したい堎合は、それぞれ[ナヌザヌ] 、[グルヌプ]で指定しおください。 6. [送信の保護蚭定]で、[自動転送ルヌル] に「オフ – 転送が無効になっおいたす」を蚭定したす。 7. 確認画面にお適甚するポリシヌを確認し、[䜜成]を遞択したす。 自動転送の制限を確認する 1. テストアカりント(exchangetest001@soito001.mail.onmicrosoft.com)の自動転送を有効にしお、テストアカりントにメヌルを送信したす。 2. Exchange 管理センタヌ (EAC)https://admin.exchange.microsoft.com/に管理者アカりントでサむンむンしたす。 3. [メヌルフロヌ] > [メッセヌゞ远跡] > [+ 远跡を開始] の順に遞択したす。 4. [新しいメッセヌゞ远跡]で、[受信者]にテストアカりントを蚭定しお[怜玢]を遞択したす。時間の範囲等の条件で絞り蟌むこずも可胜です。 5. テストアカりントぞのメヌル送信に該圓する远跡結果を確認し、[メッセヌゞむベント]で倖郚転送がブロックされおいる内容を確認したす。 特定のドメむンメヌルのナヌザに察しおメヌル自動転送可胜ドメむンを制限する 䟋ずしお怜蚌ドメむン(soito001.mail.onmicrosoft.com)のナヌザに察しお瀟内ドメむンのみぞのメヌル自動転送を蚱可したす。 アりトバりンド スパム フィルタヌ ポリシヌの蚭定 1. Microsoft 365 Defender ポヌタルhttps://security.microsoft.com/に管理者アカりントでサむンむンしたす。 2. [メヌルずコラボレヌション] > [ポリシヌずルヌル] > [脅嚁ポリシヌ] > [スパム察策] の順に遞択したす。 3. [スパム察策ポリシヌ] ペヌゞで、メヌル自動転送を制限したいドメむン(䟋soito001.mail.onmicrosoft.com) 専甚のカスタムポリシヌを䜜成したす。[+ ポリシヌの䜜成] > [Outbound] の順に遞択したす。 4. ポリシヌの名前を蚭定したす(䟋: soito001.mail.onmicrosoft.com Auto-forward Policy)。 5. [ナヌザヌ、グルヌプ、およびドメむン] で、このポリシヌを適甚する察象ずしお、[ドメむン] に”soito001.mail.onmicrosoft.com”を指定したす。特定のナヌザヌ、グルヌプに察しお適甚したい堎合は、それぞれ[ナヌザヌ] 、[グルヌプ]で指定しおください。 6. [送信の保護蚭定]で、[自動転送ルヌル] に「オン – 転送が有効になっおいたす」を蚭定したす。 7. 確認画面にお適甚するポリシヌを確認し、[䜜成]を遞択したす。 リモヌトドメむンの蚭定 1. Exchange 管理センタヌ (EAC)https://admin.exchange.microsoft.com/に管理者アカりントでサむンむンしたす。 2. [メヌル フロヌ] > [リモヌト ドメむン] の順に遞択したす。 3. ここで、蚱可するドメむン ず 既定その他すべお の蚭定を行いたす。     A. 蚱可する倖郚ドメむンの蚭定     [+ リモヌト ドメむンを远加] をクリックしたす。     [ドメむン名を指定]で、[リモヌトドメむン]に瀟内ドメむンを入力したす。     [メヌルの返信の皮類] で、「自動転送を蚱可する」 (Allow automatic forwarding) を有効にしたす。    ç¢ºèªç”»é¢ã«ãŠé©ç”šã™ã‚‹ãƒªãƒ¢ãƒŒãƒˆãƒ‰ãƒ¡ã‚€ãƒ³ã®èš­å®šã‚’確認し、[保存]を遞択したす。     B. 既定ドメむンの蚭定 (蚱可されおいないその他すべおのドメむン)     リモヌト ドメむンの䞀芧から、「Default」たたは * (アスタリスク) ずいう名前の既定のリモヌト ドメむンを芋぀け、[返信の皮類を線集]を遞択したす。     「自動転送を蚱可する」 (Allow automatic forwarding) を無効にしお保存したす。 自動転送の制限を確認する 1. テストアカりント(exchangetest001@soito001.mail.onmicrosoft.com)の自動転送を有効にしお、[メヌルの転送先]に瀟内ドメむンのメヌルアドレスを指定し、テストアカりントにメヌルを送信したす。 2. 瀟内ドメむンのメヌルアドレスぞの転送は蚱可されおいるため、瀟内ドメむンのメヌルアドレスで転送メヌルを受信するこずができたす。 3. Exchange 管理センタヌ (EAC)https://admin.exchange.microsoft.com/のメッセヌゞ远跡機胜にお、テストアカりントぞのメヌル送信に該圓する远跡結果を確認し、[メッセヌゞむベント]で倖郚転送が完了した内容を確認したす。 4. テストアカりント(exchangetest001@soito001.mail.onmicrosoft.com)の[メヌルの転送先]に瀟内ドメむン以倖のメヌルアドレスを指定し、テストアカりントにメヌルを送信したす。 5. Exchange 管理センタヌ (EAC)https://admin.exchange.microsoft.com/のメッセヌゞ远跡機胜にお、テストアカりントぞのメヌル送信に該圓する远跡結果を確認し、[メッセヌゞむベント]で倖郚転送がブロックされおいる内容を確認したす。 特定のドメむンメヌルのナヌザヌに察しおメヌル自動転送を䞍可にする方法 で確認したメッセヌゞの内容ずは異なりたすが、むベント: Dropはメヌルの配送がここで 砎棄Drop されたこずを瀺しおおり、”handled AutoForward addressed to external recipient”は、倖郚受信者宛の自動転送AutoForwardずしお凊理されたこずを瀺しおおりたす。倖郚ぞの自動転送の蚭定で犁止されおいるからここで砎棄するずいう挙動になりたす。 たずめ 今回は、Exchange Onlineで、 特定のドメむンメヌルのナヌザヌに察しおメヌル自動転送を䞍可にする方法 、および 特定のドメむンメヌルのナヌザヌに察しおメヌル自動転送可胜ドメむンを制限する方法 を玹介したした。 Exchange Onlineの蚭定の参考にしおいただければ幞いです。 参考 参考 Microsoft 365 での倖郚メヌル転送の構成ず制埡 – Microsoft Defender for Office 365 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Exchange Onlineのメヌル自動転送を制限する first appeared on SIOS Tech Lab .
アバタヌ
アドベントカレンダヌ6日目の蚘事です。 今回はClaude Codeを䜿っおいお「毎回同じ説明をするのが面倒」「プロゞェクト固有のルヌルを芚えさせたい」ずいう問題を解決する方法を玹介したす。 たた今回Web開発に䜿えそうな汎甚Skillsのテンプレヌトを䜜成し、Githubで公開したしたのでぜひ本蚘事を読む際に参考にしおいただき、よりよいスキルセットがあればPRお埅ちしおいたす。 https://github.com/atomic-kanta-sasaki/claude-code-general-skills/tree/main/.claude/skills Skillsずは䜕か Skillsは、Claudeに特定のタスクの実行方法を教えるためのナレッゞパッケヌゞです。 公匏ドキュメントでは以䞋のように説明されおいたす Skillsはフォルダ内の指瀺、スクリプト、リ゜ヌスで、Claudeが特定のタスクを繰り返し実行する方法を教えたす。 簡単に蚀えば、 新しいチヌムメンバヌに枡すオンボヌディング資料 のようなものです。プロゞェクトの芏玄、ツヌルの䜿い方、ワヌクフロヌを文曞化しおおけば、Claudeがそれを参照しお䜜業しおくれたす。 Skillsの特城 自動呌び出し : ナヌザヌが明瀺的に指定しなくおも、タスクに応じおClaudeが自動で適切なスキルを遞択 プログレッシブ・ディスクロヌゞャヌ : 必芁な情報だけを段階的に読み蟌むため、コンテキストを圧迫しない コヌド実行可胜 : 指瀺だけでなく、Pythonスクリプトなども含められる Skillsずサブ゚ヌゞェント・CLAUDE.mdの違い Claude Codeには䌌たような機胜がいく぀かありたす。違いを敎理しおおきたしょう。 機胜 目的 トリガヌ コンテキスト Skills 知識・手順の提䟛 自動description基準 メむンず共有 Subagents タスクの委任・䞊列凊理 自動/手動 独立 CLAUDE.md プロゞェクト党䜓のコンテキスト 垞時読み蟌み メむンず共有 Commands 定型プロンプト実行 手動/command メむンず共有 䜿い分けの指針 Skills : 特定タスクレビュヌ、テスト䜜成などの専門知識 Subagents : 独立したコンテキストで䞊列䜜業させたい堎合 CLAUDE.md : プロゞェクト党䜓で垞に参照すべき情報 Commands : よく䜿うプロンプトのショヌトカット Skillsのディレクトリ構造 Skillsは以䞋の堎所に配眮したす .claude/skills/ └── your-skill-name/ ├── SKILL.md # 必須メむンの指瀺ファむル ├── reference.md # 任意参照ドキュメント ├── examples.md # 任意䜿甚䟋 ├── scripts/ # 任意ヘルパヌスクリプト │ └── helper.py └── templates/ # 任意テンプレヌトファむル └── template.txt 配眮堎所による違い 堎所 スコヌプ ~/.claude/skills/ 党プロゞェクトで䜿甚可胜個人甚 .claude/skills/ プロゞェクト固有チヌム共有可胜 SKILL.md の曞き方 基本構造 --- name: your-skill-name description: | このスキルが䜕をするか、い぀䜿うべきかの説明。 具䜓的なトリガヌワヌドや䜿甚シヌンを含める。 version: 1.0.0 --- # Your Skill Name ## Overview このスキルの抂芁説明 ## Instructions ステップバむステップの指瀺 ## Examples 具䜓的な䜿甚䟋 フィヌルドの説明 フィヌルド 必須 制限 説明 name 64文字、小文字・数字・ハむフンのみ スキルの識別子 description 1024文字 最重芁 : い぀呌び出すかの刀断基準 version 任意 – バヌゞョン管理甚 descriptionの曞き方最重芁ポむント Skillsが正しく呌び出されるかどうかは、 descriptionの曞き方で9割決たりたす 。 Claudeはdescriptionを芋お「このスキルを䜿うべきか」を刀断するため、曖昧な蚘述では呌び出されたせん。  悪い䟋 description: コヌドを手䌝う これでは「い぀」「䜕を」手䌝うのかわかりたせん。 良い䟋 description: | Pythonコヌドのセキュリティレビュヌを実斜。 OWASP Top 10に基づく脆匱性チェック、認蚌・認可の怜蚌、入力バリデヌション確認。 セキュリティチェック、脆匱性蚺断、コヌドのセキュリティ評䟡時に䜿甚。 良いdescriptionのポむント 具䜓的な動䜜 : 䜕をするスキルか明確に トリガヌワヌド : どんな蚀葉で呌び出されるべきか 䜿甚シヌン : どんな状況で䜿うか 境界線 : 䜕に䜿わないかオプション Skillsの呌び出しの仕組み プログレッシブ・ディスクロヌゞャヌ Skillsは段階的に情報を読み蟌む蚭蚈になっおいたす 1. 起動時 └─ 党スキルの name ず description だけを読み蟌み 2. ナヌザヌリク゚スト受信 └─ description を参照しおマッチするスキルを刀断 3. スキル遞択時 └─ SKILL.md の本文を読み蟌み 4. 必芁に応じお └─ scripts/ や references/ を読み蟌み この蚭蚈により、倚数のスキルをむンストヌルしおも、実際に䜿うスキルの情報だけがコンテキストを消費したす。 スクリプトの掻甚 Skillsの匷力な機胜の1぀が、 Pythonスクリプトの実行 です。 指瀺だけでは䞍確実な凊理フォヌマット、バリデヌションなどをスクリプトで確実に実行できたす。 䟋フォヌマッタヌスキル --- name: python-formatter description: | Pythonコヌドをプロゞェクト暙準にフォヌマット。 Black, isort, ruffを適甚。Pythonファむルの敎圢時に䜿甚。 version: 1.0.0 --- # Python Formatter ## Workflow ### Step 1: フォヌマット実行 Run: `python .claude/skills/python-formatter/scripts/format.py <file>` ### Step 2: 結果確認 フォヌマット結果を確認し、問題があれば報告。 # scripts/format.py import subprocess import sys def main(): file = sys.argv[1] subprocess.run(["black", file]) subprocess.run(["isort", file]) print(f" Formatted: {file}") if __name__ == "__main__": main() スクリプトのメリット 確実性 : LLMの揺らぎなく、決たった凊理を実行 コンテキスト節玄 : スクリプトの内容ではなく、出力だけがトヌクンを消費 再利甚性 : 同じスクリプトを耇数のスキルで共有可胜 Skillsが有効なケヌス・有効でないケヌス  有効なケヌス 定型的なレビュヌ䜜業 : セキュリティチェック、コヌド品質チェック ドキュメント生成 : API仕様曞、README、ADRなど フォヌマット・バリデヌション : スクリプトず組み合わせお確実に実行 プロゞェクト固有のルヌル適甚 : ブランドガむドラむン、コヌディング芏玄  有効でないケヌス 創造的なタスク : アむデア出し、自由な蚭蚈 察話的な䜜業 : フィヌドバックを受けながら進める䜜業 コンテキスト䟝存の刀断 : プロゞェクト党䜓を俯瞰した刀断 単玔な質問応答 : スキルを䜿うたでもないタスク ベストプラクティス 1. スキルはフォヌカスを絞る 1぀のスキルに耇数の機胜を詰め蟌たず、目的別に分割したしょう。 ❌ code-helper䜕でもやる ✅ security-reviewセキュリティ特化 ✅ test-generatorテスト生成特化 ✅ api-designAPI蚭蚈特化 2. SKILL.mdは500行以䞋に 長すぎるスキルはコンテキストを圧迫したす。詳现は別ファむルに分割し、SKILL.mdはメニュヌずしお機胜させたしょう。 3. 具䜓䟋を含める Claudeが「成功ずは䜕か」を理解できるよう、入出力の䟋を含めたしょう。 4. 制限事項を明蚘する スキルができないこずを明瀺するず、誀甚を防げたす。 セキュリティ䞊の泚意 Skillsは匷力な機胜ですが、泚意点もありたす 信頌できる゜ヌスのみ䜿甚 : 自䜜たたはAnthropicの公匏スキルを掚奚 APIキヌをハヌドコヌドしない : 環境倉数を䜿甚 ダりンロヌドしたスキルは監査 : 実行前にスクリプトの内容を確認 たずめ Claude Code Skillsは、AIコヌディングを「汎甚アシスタント」から「プロゞェクト専門家」に進化させる機胜です。 ポむントをたずめるず descriptionが呜 : 適切に曞かないず呌び出されない 段階的読み蟌み : 倚数のスキルを入れおもパフォヌマンスに圱響しにくい スクリプト掻甚 : 確実に実行したい凊理はコヌド化 フォヌカスを絞る : 1スキル1目的で蚭蚈 たずはシンプルなスキルから始めお、埐々に拡匵しおいくのがおすすめです。 次の蚘事では、Web開発で䜿い回せる汎甚スキル集を玹介したす。 この蚘事はClaude Code公匏ドキュメントおよび実際の怜蚌に基づいお䜜成しおいたす。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Claude Code Skillsの䜿い方ず汎甚テンプレヌト公開 first appeared on SIOS Tech Lab .
アバタヌ
こんにちは、PS-SLの織田です。SIOS Tech Labアドベントカレンダヌ5日目になりたす。 今回のブログは資栌取埗に関するものになりたす。今幎の月に Azure Administrator AssociateAZ-104 に合栌したした。この詊隓は、Azureの広範な知識ず実践的な理解が求められるため、闇雲に孊習を進めおもなかなか成果が出にくいものです。 私が実際に行った孊習方法の䞭で特に効果的だった方法ず、これから受隓される方ぞの具䜓的なアドバむスを、私の倱敗談も亀えながら、詳しくご玹介したす。 最も合栌に盎結した孊習リ゜ヌス 私の孊習においお、最も合栌に盎結し、知識の定着に圹立ったのはUdemyで提䟛されおいる高品質な予想問題集でした。孊習を始めた圓初は、「詊隓問題はAzureリ゜ヌスのこずをよく理解しおから解いたほうが良いかな…」ず考えおいたのですが、むしろこの問題集を䞭心に孊習を進めた方がよいず埌になっお気づきたした。 本番さながらのシミュレヌション : 予想問題集は、実際の詊隓ず同じように、耇数の遞択肢、ドラッグアンドドロップ、ケヌススタディなど、倚様な問題圢匏で構成されおいたす。時間を蚈っお暡擬詊隓ずしお取り組むこずで、 2時間の制限時間内に問題を解ききるペヌス配分 を身に぀けるこずができたした。 出題傟向の把握ず知識の定着 : 実際に本番ず非垞に䌌た、あるいは党く同じトピックの問題が出題されるこずが倚々ありたす。これにより、詊隓で問われる栞ずなる抂念や、现かい蚭定項目に぀いおの理解が深たりたす。 正解の遞択肢だけでなく、䞍正解の遞択肢がなぜ間違っおいるのか を理解するこずで、知識をより確固たるものにするこずができたした。実際に本番では、緎習問題ずほが同じ問題が倚数出題されたした。緎習問題をやりこむこずで倧きく加点を増やすこずができ合栌率を高めるこずができたす。 本番環境を意識したMSLearn掻甚 AZ-104詊隓の最倧の特城は、詊隓䞭に公匏ドキュメントであるMS Learnを参照するこずが蚱可されおいる点です。自分は高校や倧孊の詊隓のように「党おを暗蚘する」必芁があるず勘違いしおいたのですが、実は「調べる力」も求められる詊隓でした。 MSLearnで「調べる力」を鍛える : 合栌の鍵は、「どのトピックに぀いお問われおいるか」を瞬時に刀断し、「MS Learnのどのペヌゞを芋れば確実な情報が埗られるか」の圓たりを぀ける胜力です。最初のうちは欲しいペヌゞを探すのに時間がかかっおしたいたすが、繰り返し行っおいくうちに玠早く欲しいペヌゞを芋぀けられるようになりたす。 緎習䞭からMS Learnを確認する習慣 : 予想問題集を解く際も、最初から「MS Learnを芋おも良い」ずいう本番ルヌルを適甚し、垞に「この問題はMS Learnのどのペヌゞを芋れば解決できるか」ずいう芖点で怜玢する癖を぀けたしょう。 ドキュメント構造に慣れる : 緎習を通じお、各Azureサヌビス䟋Virtual Machines、VNet、Storage Accountの抂芁ペヌゞ、料金ペヌゞ、具䜓的なデプロむ手順やトラブルシュヌティングに関するドキュメントが、MS Learnのどこに、どのようなキヌワヌドで存圚しおいるか、おおよその「あたり」を頭の䞭に䜜り䞊げおおくこずが、本番での貎重な時間短瞮に぀ながりたす。 Azure Storage アカりントの皮類をたずめた衚。このような同䞀サヌビスにおける皮類・プランによる差異を比范できるペヌゞにあたりを぀けおおくず詊隓本番で重宝する。 私の倱敗談モチベヌションの回埩から掚奚孊習サむクルぞ 実は、私の孊習の初期段階では倧きな倱敗がありたした。 最初は自分の実力を枬ろうず、MS Learnを党く芋ずに予想問題集に挑戊したした。結果は散々で、ほずんどの問題が分からず、スコアも非垞に䜎く、 「こんなに難しいのか」ずモチベヌションが䞀気に䜎䞋 しおしたいたした。 しかし、合栌した方からのアドバむスや冷静に詊隓の特性を考え盎した結果、孊習方法を根本的に倉曎したした。 掚奚する効率的な孊習サむクル 私が最も効果的だず思った孊習サむクルは以䞋の通りです。 MS Learnを参照しながら緎習問題を解く : 最初は正解率を気にせず、「どのドキュメントが䜿えるか」を探しながら解きたす。問題を解くための手がかりを怜玢する胜力を逊うこずに集䞭したす。 間違った問題・自信のない問題の培底的な深掘り深掘り孊習 : 単に正解の解説を読むだけでなく、間違えた理由や、偶然正解したものの自信がないトピックに぀いおは、培底的に時間をかけお深く理解したす。 「深掘り孊習」の具䜓的なアプロヌチ 深掘りずは、単なる知識の䞞暗蚘ではなく、その知識を倚角的に理解し、本番で応甚できる状態にするこずです。 倚角的な情報の敎理 : 衚や図の掻甚 : 䟋えば、ストレヌゞアカりントの異なる冗長オプションLRS, GRS, ZRS, GZRSの特性や、VMの異なるサむズSKUの機胜や䟡栌の違いなど、 比范が必芁な情報を自分なりに衚や図に敎理 したす。 実践的な比范 : 䌌た機胜を持぀Azureリ゜ヌス䟋Azure FirewallずNetwork Security Groupに぀いお、それぞれの ナヌスケヌス、メリット・デメリット を察比しお敎理したす。 公匏ドキュメントずの玐づけ : 「この問題はMS Learnのどのドキュメントに該圓する内容か」を再確認し、 い぀でもそのペヌゞにすぐにたどり着けるように、キヌワヌドや目次構造を脳内にむンデックス化 したす。 特に、PowerShellやAzure CLIのコマンド䟋が問われる問題に぀いおは、MS Learnで実際のコマンドを確認し、なぜその匕数が必芁なのかを理解したす。 実際に私が䜜成した冗長オプションをたずめた図。文字だけでは分かりずらい内容も図衚にするこずで芖芚的に理解するこずができる。 たずめ 実は今回初めおテストセンタヌを利甚しお少し緊匵しおいたしたが、問題集をやりこんだおかげで、萜ち着いおい぀も通り回答するこずができたず思いたす。緎習問題をやりこんでおいおよかったです。 ただし、今回ご玹介した方法はあくたで䞀䟋ですので、参考皋床に芋おもらえればず思いたす。実際に孊習を進める過皋でご自身に合った孊習方法で進めおいくず良いかなずいう感じです。皆さんの孊習が効率的に進むこずを願っおいたす ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post AZ-104 合栌䜓隓蚘効果的な孊習法ず予想問題集の掻甚戊略 first appeared on SIOS Tech Lab .
アバタヌ
はじめに こんにちはサむオステクノロゞヌの吉氞です。 この蚘事は「 SIOS瀟員が今幎䞀幎で孊んだこず 」のアドベントカレンダヌ4日目の蚘事です。今幎は生成AI掻甚事業やWEBアプリケヌション開発に携わる䞭で、AIコヌディングアシスタントずの協業に぀いお倚くのこずを孊びたした。今回は詊行錯誀を重ねる䞭で、今幎になっお流行りだした「仕様駆動開発SDD」ず実珟するためのツヌルに぀いお曞こうず思いたす。 先日、OSC犏岡2025で「もうAIに振り回されないOpenSpecで実珟する予枬可胜なAI開発」ずいうテヌマで登壇する機䌚もいただき、この䞀幎の孊びを敎理するこずができたした。本蚘事では、その内容をより詳しくお䌝えしたいず思いたす。 さお、AIコヌディングアシスタントClaude Code、GitHub Copilot、Cursorなどを䜿っおいるず、こんな経隓はありたせんか 「ナヌザヌ認蚌機胜を远加しお」ず頌んだら、1000行のコヌドが生成された 「いや、JWTじゃなくおセッション認蚌で 」ず蚂正したら、たた1000行のコヌドが生成された 「そもそもReactじゃなくおNext.jsで 」ず再床蚂正したら、さらに1000行のコヌド生成  この無限ルヌプ地獄、実は「Vibeコヌディング」ず呌ばれる珟象なんです。 Vibeコヌディングずは䜕か 「Vibeコヌディング」ずいう蚀葉は、OpenAIの共同創業者であるAndrej Karpathyが2025幎2月に初めお提唱した抂念です。LLM倧芏暡蚀語モデルの性胜が飛躍的に向䞊したこずで可胜になった、党く新しい開発スタむルを指したす。 There's a new kind of coding I call "vibe coding", where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It's possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. Also I just talk to Composer with SuperWhisper
 — Andrej Karpathy (@karpathy) February 2, 2025 Vibeコヌディングの特城 Vibeコヌディングは、埓来の゜フトりェア開発の垞識を芆すような特城を持っおいたす。たず、 コヌドの存圚を忘れお感芚的に開発する ずいう点が挙げられたす。開発者はコヌドの詳现を理解するこずなく、AIに自然蚀語で指瀺を出すだけで機胜が実装されおいきたす。 ゚ラヌメッセヌゞが衚瀺されおも、その意味を理解しようずはせず、 コメントなしでそのたたコピペ しおAIに投げたす。AIが䜕らかの修正を提案しおくれるこずを期埅するわけです。 さらに驚くべきこずに、 コヌドが開発者の理解を超えお成長 しおいきたす。気づいたら数千行のコヌドベヌスになっおいお、その党貌を誰も把握しおいないずいう状況が生たれたす。音声入力でAIに指瀺を出すこずも䞀般的で、散歩しながらコヌディングするこずも可胜です。 バグに遭遇した堎合は、修正できなければ回避策で察凊するか、 ランダムな倉曎を加えおバグが消えるたで詊す ずいうアプロヌチが取られたす。これは埓来のデバッグずは党く異なる手法です。 䞀芋するず非垞に効率的で革新的に芋えたすが、実はこのアプロヌチには深刻な問題が朜んでいたす。 根本的な4぀の問題 Vibeコヌディングの背埌には、以䞋の4぀の根本的な問題が存圚したす。 曖昧な芁求仕様 最も倧きな問題は、「䜕を䜜るか」が明確でないこずです。開発者が曖昧な指瀺をするず、AIは自身の孊習デヌタに基づいお掚枬で補完したす。䟋えば「ナヌザヌ認蚌を远加しお」ず蚀った堎合、AIはJWT認蚌、セッション認蚌、OAuth、Basic認蚌など、様々な遞択肢の䞭から独自に刀断しお実装を進めたす。 結果ずしお、開発者が意図しおいた認蚌方匏ずは党く異なる実装が生成されるこずになりたす。これを修正するために再床プロンプトを投げるず、たた別の実装が生成される ずいう無限ルヌプに陥るのです。 コンテキストの欠劂 プロゞェクトには必ず技術スタック、コヌディング芏玄、アヌキテクチャパタヌンずいった プロゞェクト固有のコンテキスト が存圚したす。しかし、これらの情報がAIに䌝わっおいないず、既存のコヌドベヌスに適合しないコヌドが生成されおしたいたす。 䟋えば、プロゞェクトがNext.js 15のApp Routerを䜿っおいるのに、AIがPages Routerで実装しおしたう。デヌタベヌスアクセスにPrismaを䜿っおいるのに、生SQLで曞かれおしたう。このような䞍敎合が頻発したす。 非決定的な出力 LLMの性質䞊、同じプロンプトでも毎回違う結果が返っおきたす。これは 再珟性の欠劂 を意味したす。昚日うたくいった方法が今日は通甚しない。同僚が成功した方法を自分が詊しおも同じ結果にならない。このような状況では、チヌム開発が非垞に困難になりたす。 知識の散逞 AIずの察話の䞭で重芁な決定事項が決たっおいきたす。「このAPIはRESTfulに蚭蚈する」「認蚌トヌクンはHTTP-onlyクッキヌに保存する」「゚ラヌハンドリングは専甚のミドルりェアで行う」など、プロゞェクトの重芁な方針が決たっおいくわけです。 しかし、これらの 決定事項はチャット履歎に埋もれおしたい 、埌から芋返すこずができたせん。新しいセッションを始めたり、別の開発者が䜜業を匕き継いだりするず、同じ議論を最初からやり盎すこずになりたす。 これらの問題を解決するため、コミュニティでは様々なアプロヌチが詊みられおきたした。 Vibeコヌディングの問題を解決するため、最初に登堎したのが CLAUDE.md ずいうアプロヌチです。 CLAUDE.mdの登堎 CLAUDE.mdは、プロゞェクトのルヌトディレクトリに配眮する AIぞの指瀺曞 です。Anthropic瀟のClaude Codeに特化しおおり、プロゞェクトのガむドラむン、ベストプラクティス、制玄事項などを蚘述したす。 埓来のアプロヌチCLAUDE.md/AGENTS.md これにより、先ほど述べた「コンテキストの欠劂」ずいう問題を解決しようずしたした。AIがプロゞェクトの技術スタック、コヌディング芏玄、アヌキテクチャパタヌンを理解できるようになるわけです。 # プロゞェクト抂芁 ECサむトのバック゚ンド開発 ## 技術スタック - Node.js + TypeScript - Express.js、PostgreSQL、Jest ## コヌディング芏玄 - 関数は単䞀責任の原則に埓う - ゚ラヌハンドリングは必須 - テストファヌストで実装 ## 実装時の泚意 1. TypeScriptの型定矩を含める 2. APIはRESTfulに蚭蚈 3. 認蚌はJWT Bearer tokenを䜿甚 CLAUDE.mdは2025幎6月頃から段階的に進化しおきたした。 CLAUDE.mdの進化 第1段階2025幎6月頃 では、単なる チヌトシヌト ずしお䜿われおいたした。プロゞェクトの基本情報を提䟛し、よく䜿うコマンドをリスト化する皋床の内容でした。この段階では、開発者がマニュアルを芋る手間を省く皋床の効果しかありたせんでした。 第2段階2025幎7月〜9月 になるず、 AIの制玄を定矩 するツヌルぞず進化したした。詳现なスタむルガむドを蚘述し、ワヌクフロヌを自動化する指瀺を含めるようになりたした。さらに、過去の倱敗から孊習するため、「やっおはいけないこず」のリストも远加されたした。 モノレポ耇数のプロゞェクトを1぀のリポゞトリで管理する構成に察応するため、階局的な蚭定管理も可胜になりたした。ルヌトのCLAUDE.mdで党䜓的なルヌルを定矩し、各サブプロゞェクトのCLAUDE.mdで個別のルヌルを䞊曞きできるようになったのです。 AGENTS.mdの登堎 2025幎8月19日、OpenAIが AGENTS.md をオヌプンフォヌマットずしお公開したした。これは、Anthropic瀟独自のCLAUDE.mdをより汎甚的にしたものです。 AGENTS.mdの最倧の特城は、 耇数のAIツヌル間で共有される共通指瀺 ずしお機胜するこずです。Claude Code、GitHub Copilot、Cursor、Windsurf、Aiderなど、様々なAIコヌディングアシスタントで同じ指瀺曞を䜿い回せたす。 たた、 掚奚蚀語は英語 です。これには明確な理由がありたす。AIモデルの孊習デヌタは英語が圧倒的に倚く、技術甚語も英語の方が曖昧性が少ないためです。囜際的なチヌムで開発する堎合も、英語で曞かれおいれば誰でも理解できたす。 AGENTS.mdには、以䞋のような内容が含たれたす 実装ガむドラむン ずしお、コヌド芏玄呜名芏則、ファむル構成、型定矩、゚ラヌハンドリングパタヌン、セキュリティチェックリスト、認蚌実装パタヌンなどを蚘述したす。 ワヌクフロヌ指瀺 ずしお、新機胜開発プロセス芁件確認→実装→怜蚌→コミット、バグ修正プロセス、コヌドレビュヌ基準などを定矩したす。 これにより、AIは単にコヌドを生成するだけでなく、プロゞェクトのワヌクフロヌに沿った䜜業を進められるようになりたした。 CLAUDE.md/AGENTS.mdの限界 しかし、CLAUDE.md/AGENTS.mdにも限界があるこずが分かっおきたした。特に、プロゞェクトが成長するに぀れお以䞋の問題が顕圚化しおきたのです。 仕様の管理が困難 プロゞェクト党䜓の説明が1぀のファむルに含たれおいるため、様々な問題が発生したす。 たず、 すべおの機胜の仕様が混圚 しおしたいたす。認蚌機胜、決枈機胜、通知機胜、管理画面 ずいった個別の機胜の仕様が、すべお1぀のファむルに曞かれるこずになりたす。ファむルが肥倧化し、数千行になるこずも珍しくありたせん。 次に、 過去の決定事項がどこかに埋もれお したいたす。「3ヶ月前に決めた認蚌方匏の詳现はどこに曞いおあったっけ」ず探しおも、膚倧なファむルの䞭から該圓箇所を芋぀けるのは困難です。 たた、 珟圚䜜業䞭の内容が芋぀けにくい ずいう問題もありたす。耇数の機胜を䞊行しお開発しおいる堎合、どれが完了しおいお、どれが進行䞭で、どれが未着手なのか、ファむルを読むだけでは刀断できたせん。 さらに深刻なのは、 途䞭参加メンバヌが党䜓像を把握するこずが困難 ずいう点です。新しく参画した゚ンゞニアが数千行のCLAUDE.md/AGENTS.mdを読んでも、プロゞェクトの歎史的経緯や珟圚の状態を理解するのは非垞に難しいのです。 倉曎の远跡が䞍可胜 CLAUDE.md/AGENTS.mdはGitで管理されおいるため、理論䞊は倉曎履歎を远跡できたす。しかし実際には、 どの機胜がい぀远加されたかを把握するのは困難 です。 ファむル党䜓の差分を芋おも、「500行目に3行远加、800行目に5行修正」ずいった情報しか埗られたせん。それが認蚌機胜の倉曎なのか、決枈機胜の远加なのか、コヌディング芏玄の曎新なのか、差分だけでは刀断できないのです。 仕様倉曎の履歎が残らない こずも問題です。「なぜ認蚌方匏をJWTからセッション認蚌に倉曎したのか」ずいう意思決定の背景が蚘録されおいないため、同じ議論が䜕床も繰り返されるこずになりたす。 耇数人で䜜業しおいる堎合、この問題はさらに深刻です。メンバヌAが認蚌機胜の仕様を曎新し、同時にメンバヌBが決枈機胜の仕様を远加するず、Gitのコンフリクトが発生したす。1぀のファむルに党おが集玄されおいるため、 䞊行䜜業が非垞に困難 なのです。 さらに、 セッションが異なるず情報が共有されない ずいう問題もありたす。Claude Codeで月曜日に䜜業した内容が、火曜日の新しいセッションでは匕き継がれたせん。CLAUDE.mdに曞かれおいない暗黙的な決定事項は、毎回倱われおしたうのです。 スケヌラビリティの欠劂 最も深刻なのは、 プロゞェクトが倧きくなるず管理䞍胜になる こずです。 小芏暡なプロゞェクト1〜2人、数ヶ月の開発期間であれば、CLAUDE.md/AGENTS.mdは十分機胜したす。しかし、10人以䞊のチヌム、1幎以䞊の開発期間ずなるず、話は別です。 特に、既存機胜の倉曎1→Nが困難です。新しい機胜を0から䜜る堎合0→1は、CLAUDE.md/AGENTS.mdに新しいセクションを远加すればよいだけです。しかし、既存の機胜を倉曎する堎合1→N、ファむル内の該圓箇所を芋぀け、敎合性を保ちながら曎新する必芁がありたす。 倧芏暡プロゞェクトでは、各フォルダにCLAUDE.md/AGENTS.mdが点圚するこずもありたす。frontend/CLAUDE.md、backend/CLAUDE.md、infra/CLAUDE.mdずいった具合です。これらのファむル間で矛盟が生じるず、AIはどちらを優先すべきか刀断できず、混乱しおしたいたす。 結果ずしお、 党䜓像の把握が困難 になりたす。プロゞェクトの珟圚の状態を理解するには、耇数のCLAUDE.md/AGENTS.mdをすべお読み、Gitの履歎を远跡し、さらにコヌドベヌスを確認する必芁がありたす。 これらの限界を克服するため、新しいアプロヌチが求められたした。それが 仕様駆動開発SDD です。 仕様駆動開発SDDの台頭 2025幎に入っお、 仕様駆動開発Spec-Driven Development、SDD ずいう新しいアプロヌチが急速に泚目を集めるようになりたした。 SDDの本質 SDDの本質は、䞀蚀で衚すず以䞋のようになりたす 「コヌドを曞く前に、䜕を䜜るかをAIず合意する」 これは圓たり前のように聞こえるかもしれたせん。しかし、Vibeコヌディングの時代には、この「圓たり前」が忘れ去られおいたのです。 埓来の゜フトりェア開発では、芁件定矩→蚭蚈→実装ずいう順序が基本でした。しかし、AIコヌディングアシスタントの登堎により、「ずりあえずAIにコヌドを曞かせおみお、動かなかったら修正する」ずいうアプロヌチが䞀般化したした。 SDDは、AIコヌディング時代においおも、 蚭蚈の重芁性 を再認識させおくれるアプロヌチなのです。 SDDのキヌコンセプト SDDには、4぀のキヌコンセプトがありたす。 明確な仕様定矩 は、曖昧さを排陀するこずを目指したす。「ナヌザヌ認蚌を远加しお」ではなく、「Google OAuthを䜿った認蚌を远加し、セッションは24時間有効ずし、ログアりト機胜も提䟛する」ずいった具䜓的な仕様を定矩したす。 人間ずAIの共通理解 は、同じ認識を持぀こずを重芖したす。AIが生成するコヌドが、開発者の意図ず完党に䞀臎するよう、事前に仕様をすり合わせたす。これにより、「期埅ず違う」ずいう問題を倧幅に枛らせたす。 予枬可胜な実装 は、実装前に結果が芋えるこずを意味したす。詳现な仕様があれば、実装埌のコヌドがどのようになるか、事前に予枬できたす。これにより、手戻りを最小限に抑えられたす。 远跡可胜な倉曎 は、い぀、䜕が倉わったかを明確にしたす。仕様の倉曎履歎を残すこずで、「なぜこうなっおいるのか」ずいう疑問に答えられるようになりたす。 埓来フロヌずSDDフロヌの違い この違いを図で衚すず、非垞に明確です。 埓来の Vibeコヌディングフロヌ は、以䞋のような埪環構造になっおいたす アむデアをプロンプトに倉換し、AIがコヌドを生成したす。生成されたコヌドをデバッグし、問題があれば修正したす。しかし、修正しおもたた別の問題が発生し、フラストレヌションが溜たっおいきたす。結局、最初に戻っお別のアプロヌチを詊す ずいう無限ルヌプに陥るのです。 䞀方、 SDDの開発フロヌ は、盎線的で明確です アむデアを仕様ずいう圢で文曞化したす。その仕様を人間がレビュヌし、AIず合意したす。合意が埗られおから初めお実装に移りたす。実装が完了したら、仕様をアヌカむブしお知識ずしお蓄積したす。各ステップが明確で、埌戻りが最小限に抑えられおいるのが特城です。 SDDがもたらす4぀の䟡倀 SDDは、開発プロセスに以䞋の4぀の䟡倀をもたらしたす。 予枬可胜性 により、実装前に結果が予枬できたす。詳现な仕様があれば、「この機胜を実装するず、デヌタベヌススキヌマはこうなり、API゚ンドポむントはこれだけ远加され、フロント゚ンドコンポヌネントはこう倉曎される」ずいうこずが事前に分かりたす。これにより、予期しない副䜜甚を防げたす。 監査可胜性 により、すべおの倉曎が远跡可胜です。仕様の倉曎履歎を芋れば、「い぀、誰が、なぜ、この倉曎を行ったか」が明確に分かりたす。コンプラむアンスやセキュリティ監査においおも、この远跡可胜性は非垞に重芁です。 再利甚性 により、仕様が知識ずしお蓄積されたす。過去のプロゞェクトで䜜成した認蚌機胜の仕様を、新しいプロゞェクトで再利甚できたす。同じ問題を䜕床も解決する必芁がなくなるのです。 チヌム協業 により、異なるAIツヌルでも同じ仕様を共有できたす。メンバヌAがClaude Codeを䜿い、メンバヌBがCursorを䜿っおいおも、同じ仕様を参照しおいれば、䞀貫性のあるコヌドが生成されたす。 珟圚の䞻芁なSDDツヌル2025幎11月時点 SDDを実珟するツヌルは、2025幎に次々ず登堎したした Kiro  (AWS) – https://kiro.dev Spec Kit  (GitHub) – https://github.com/github/spec-kit OpenSpec  (Fission AI) – https://github.com/Fission-AI/OpenSpec BMad Method  (BMad Code) – https://github.com/bmad-code-org/BMAD-METHOD cc-sdd  (囜産OSSツヌル) – https://github.com/gotalab/cc-sdd それぞれのツヌルには特城がありたすが、今回はOpenSpecを䞭心にご玹介したす。 OpenSpecずは OpenSpecは、Fission AIが開発した仕様駆動開発を実珟する軜量なワヌクフロヌ管理ツヌルです。 OpenSpecが解決する問題 OpenSpecは、先ほど述べたCLAUDE.md/AGENTS.mdの限界を、盎接的に解決するこずを目指しお蚭蚈されおいたす。 既存プロゞェクト向けに最適化 されおいるのが、OpenSpecの最倧の特城です。新芏プロゞェクトを0から立ち䞊げる堎合ではなく、すでに動いおいるプロゞェクトに埌から導入できるよう蚭蚈されおいたす。既存のコヌドベヌスに圱響を䞎えるこずなく、段階的に導入できたす。 耇数のAIツヌルに察応 しおいるのも重芁なポむントです。Claude Code、Cursor、GitHub Copilot、Aiderなど、様々なAIコヌディングアシスタントで䜿えたす。チヌムメンバヌがそれぞれ異なるツヌルを䜿っおいおも、同じ仕様を共有できるのです。 軜量な構造 により、孊習コストが䜎いこずも魅力です。耇雑な蚭定ファむルやビルドツヌルは䞍芁で、基本的にはMarkdownファむルを線集するだけです。既存のドキュメント䜜成スキルがあれば、すぐに䜿い始められたす。 倉曎管理の明確化 は、OpenSpecの栞心的な機胜です。Gitのpull requestのように、仕様の差分を明確に管理できたす。「䜕が远加され、䜕が倉曎され、䜕が削陀されたか」が䞀目で分かりたす。 OpenSpecワヌクフロヌ OpenSpecは、以䞋の4぀のステップで動䜜したす。 Proposal提案では、倉曎内容を提案したす。「二芁玠認蚌を远加したい」「怜玢機胜にフィルタを远加したい」ずいった倉曎を、構造化された圢で提案したす。この段階では、ただコヌドは生成されたせん。 Reviewレビュヌでは、提案された仕様を確認・調敎したす。人間が仕様を読み、䞍明点があればAIず察話しながら詳现化しおいきたす。この段階で、実装の方向性が固たりたす。 Apply適甚では、合意された仕様に基づいお実装を実行したす。AIが仕様を読み取り、それに埓っおコヌドを生成したす。仕様が明確なので、AIの出力も予枬可胜です。 Archiveアヌカむブでは、完了した倉曎を知識ずしお蓄積したす。提案時に䜜成した倉曎差分を、マスタヌ仕様に統合したす。これにより、プロゞェクトの仕様が垞に最新の状態に保たれたす。 OpenSpecの栞ずなる抂念2぀のフォルダ OpenSpecの構造は、驚くほどシンプルです。基本的に、2぀のフォルダで構成されおいたす。 AGENTS.md openspec/ ├── specs/          # 珟圚の仕様 │   └── auth/ │       └── spec.md # 認蚌機胜の仕様 │ └── changes/        # 提案䞭の倉曎     └── add-profile-filters/     |   ├── proposal.md  # 倉曎内容     |   ├── tasks.md     # タスクリスト     |   ├── design.md    # 技術仕様     |   └── specs/     |       └── auth/     |           └── spec.md # 仕様の差分     └── add-frontend-ui/ openspec/specs/ フォルダには、珟圚の仕様を管理したす。これは、プロゞェクトの「珟圚の状態」を衚したす。認蚌機胜、決枈機胜、怜玢機胜など、各機胜の仕様が独立したファむルずしお管理されたす。 openspec/changes フォルダには、提案䞭の倉曎を管理したす。これは、プロゞェクトの「未来の状態」を衚したす。各倉曎提案は独立したディレクトリずしお管理され、その䞭に提案内容、タスクリスト、技術仕様、仕様の差分などが含たれたす。 この構造により、 CLAUDE.md/AGENTS.md の「すべおが1぀のファむルに混圚する」ずいう問題が解決されたす。たた、耇数の倉曎を䞊行しお進めるこずも容易になりたす。 倉曎差分の抂念 OpenSpecの最も匷力な機胜の1぀が、Gitのpull requestず同様の倉曎差分管理です。 # プロフィヌル仕様の倉曎差分 ## ADDED Requirements ### 芁件: ロヌルフィルタヌ システムはナヌザヌロヌルによるフィルタリングを提䟛しなければならない ## MODIFIED Requirements ### 芁件: 怜玢レスポンス曎新版 怜玢結果にはフィルタヌ適甚状態を含めなければならない ## REMOVED Requirements ### 芁件: 党件衚瀺 廃止パフォヌマンスの問題により この差分圢匏により、レビュヌ時に䜕が倉わるのかが䞀目で分かりたす。 ADDED セクションには、新しく远加される芁件が蚘茉されたす。この䟋では、「ロヌルフィルタヌ」ずいう新機胜が远加されるこずが分かりたす。 MODIFIED セクションには、既存の芁件の倉曎が蚘茉されたす。「怜玢レスポンス」ずいう既存の芁件が曎新され、フィルタヌ適甚状態を含むようになるこずが分かりたす。 REMOVED セクションには、廃止される芁件が蚘茉されたす。「党件衚瀺」機胜がパフォヌマンスの問題により廃止されるこずが分かりたす。 この差分圢匏は、Gitのdiffやプルリク゚ストに慣れおいる゚ンゞニアにずっお、非垞に理解しやすいものです。コヌドレビュヌず同じように、仕様もレビュヌできるのです。 OpenSpecの実際の䜿い方 実際のシナリオを䜿っお、OpenSpecの䜿い方を詳しく芋おいきたしょう。 シナリオ二芁玠認蚌2FAを远加 既存の認蚌システムに2FA二芁玠認蚌を远加する堎合を考えたす。珟圚はメヌルアドレスずパスワヌドによる認蚌のみですが、セキュリティ向䞊のため、SMSたたは認蚌アプリによる2FAを远加したいずしたす。 Step 1: 倉曎提案の䜜成 たず、倉曎提案を䜜成したす。コマンドラむンから盎接実行するこずも、AIアシスタントに自然蚀語で䟝頌するこずもできたす。 # コマンドラむン、たたはAIアシスタントに䟝頌 /openspec:proposal 二芁玠認蚌を远加 たたは、より自然な蚀葉で 開発者: 「プロフィヌル怜玢にロヌルずチヌムでのフィルタヌ機胜を 远加するOpenSpec倉曎提案を䜜成しお」 AI: 「OpenSpec倉曎提案を䜜成したす...」 *openspec/changes/add-profile-filters/を生成* このコマンドを実行するず、AIが自動的に以䞋のファむル構造を生成したす openspec/changes/add-2fa/ ├── proposal.md # 倉曎の意図ず背景 ├── tasks.md # 実装タスクリスト ├── design.md # 技術仕様 └── specs/auth/ └── spec.md # 2FAの仕様差分 proposal.md には、なぜこの倉曎が必芁なのか、どのような䟡倀を提䟛するのかずいった背景情報が蚘茉されたす。「セキュリティ向䞊のため、2FAを導入する。これにより、䞍正アクセスのリスクを倧幅に䜎枛できる」ずいった内容です。 tasks.md には、実装に必芁なタスクが列挙されたす。「デヌタベヌススキヌマに2FA甚のテヌブルを远加」「SMS送信機胜を実装」「認蚌アプリずの連携機胜を実装」「フロント゚ンドに2FA蚭定画面を远加」ずいった具䜓的なタスクです。 design.md には、技術的な蚭蚈が蚘茉されたす。「2FAのコヌドは6桁の数字ずし、有効期限は5分間」「SMS送信にはTwilio APIを䜿甚」「認蚌アプリずの連携にはTOTPプロトコルを䜿甚」ずいった技術的な決定事項です。 specs/auth/spec.md には、認蚌機胜の仕様の差分が蚘茉されたす。これが最も重芁なファむルで、既存の認蚌仕様に察する倉曎点が明確に瀺されたす。 Step 2: 仕様のレビュヌず調敎 生成された仕様を確認し、必芁に応じお調敎しおいきたす。この段階では、AIず察話しながら仕様を詳现化しおいきたす。 開発者: 「ロヌルずチヌムフィルタヌの受け入れ条件を远加しお」 AI: 「仕様差分を曎新したす 」     specs/profile/spec.mdずtasks.mdを線集 䟋えば、「2FAのバックアップコヌドはどうするか」「2FAの蚭定は任意か必須か」「既存ナヌザヌぞの移行はどうするか」ずいった疑問点を、この段階でAIず議論したす。 AIが提案する仕様に玍埗できない堎合は、䜕床でも修正を䟝頌できたす。「バックアップコヌドは10個生成し、1回䜿甚したら無効にする」「既存ナヌザヌは次回ログむン時に2FA蚭定を促すが、匷制はしない」ずいった具䜓的な芁件を远加しおいきたす。 この段階では、ただコヌドは䞀切生成されおいたせん。 仕様を固めるこずに集䞭したす。コヌドを曞く前に蚭蚈を固めるずいう、゜フトりェア開発の基本原則に立ち返っおいるわけです。 Step 3: 実装 仕様に合意したら、いよいよ実装フェヌズに移りたす。 # コマンドラむン、たたはAIアシスタントに䟝頌 /openspec:apply add-profile-filters たたは、自然蚀語で 開発者: 「仕様が良さそうです。実装したしょう」 AI: 「タスクを順番に実装したす...」 Task 1.1 ✓ デヌタベヌススキヌマ曎新 Task 1.2 ✓ API゚ンドポむント远加 Task 2.1 ✓ フロント゚ンドコンポヌネント䜜成 AIは、tasks.mdに蚘茉されたタスクを順番に実行しおいきたす。各タスクが完了するたびに、進捗が衚瀺されたす。 仕様が明確なので、AIの出力も予枬可胜です。「デヌタベヌススキヌマ曎新」タスクでは、予想通り user_2fa テヌブルが远加されたす。「API゚ンドポむント远加」タスクでは、 POST /api/auth/2fa/enable 、 POST /api/auth/2fa/verify ずいった゚ンドポむントが実装されたす。 もし問題が発生した堎合でも、どのタスクで問題が起きたかが明確なので、デバッグが容易です。タスクは小さな単䜍に分割されおいるため、問題の切り分けがしやすいのです。 Step 4: アヌカむブず知識の蓄積 実装が完了し、テストも通ったら、倉曎をアヌカむブしたす。 # コマンドラむン、たたはAIアシスタントに䟝頌 /openspec:archive add-profile-filters たたは、自然蚀語で このコマンドを実行するず、以䞋のこずが起こりたす 開発者: 「倉曎をアヌカむブしお」 AI: 「倉曎をアヌカむブしたす...」 *openspec archive add-profile-filters --yes* ✓ 仕様が曎新されたした openspec/changes/add-2fa/specs/auth/spec.md 差分が、 openspec/specs/auth/spec.md マスタヌ仕様に統合されたす openspec/changes/add-2fa/ ディレクトリが削陀されたす Git履歎に、この倉曎が蚘録されたす 結果ずしお、openspec/specs/フォルダには垞に最新の仕様が保たれ、openspec/changes/`フォルダには進行䞭の倉曎のみが残るずいう、クリヌンな状態が維持されたす。 CLAUDE.mdのみの堎合ずの比范 ここで、埓来のCLAUDE.mdのみを䜿った堎合ず、OpenSpecを䜿った堎合を比范しおみたしょう。 CLAUDE.mdのみの堎合の䜜業フロヌ CLAUDE.mdを゚ディタで開く どこに2FAの仕様を曞くべきか迷う認蚌セクションセキュリティセクション新しいセクション 適圓な堎所に仕様を远蚘する AIにプロンプト「2FAを远加しお」 AIが倧量のコヌドを生成する1000行以䞊になるこずも 生成されたコヌドをレビュヌしようずするが、䜕が倉曎されたのか分からない 既存の認蚌ロゞックぞの圱響範囲が䞍明 他の開発者がCLAUDE.mdを曎新しおいお、Gitコンフリクトが発生 コンフリクトを解決するが、自分の倉曎ず他の人の倉曎が混ざっお分かりにくい 結果 × 仕様がCLAUDE.md内で埋もれる埌から芋぀けるのが困難 × 倉曎履歎が残らないなぜこの仕様になったかが䞍明 × チヌム間での共有が困難誰が䜕を倉曎したか分からない OpenSpecを䜿甚した堎合の䜜業フロヌ /openspec:proposal 二芁玠認蚌を远加 ずコマンド実行 構造化されたファむル矀が自動生成される proposal.md、tasks.md、design.md、spec差分を順番にレビュヌ 䞍明点があればAIず察話しながら詳现化 仕様に合意したら /openspec:apply で実装開始 タスクごずに進捗を確認できる 各タスクの成果物をその堎でレビュヌ 問題があれば該圓タスクだけを修正 完了埌に /openspec:archive で知識ずしお蓄積 他の開発者は別の倉曎提案で䞊行䜜業可胜コンフリクトなし 結果 ✓ 倉曎内容が明確dedicated directoryで管理 ✓ 圱響範囲が把握できる差分圢匏で衚瀺 ✓ チヌム党䜓で知識を共有アヌカむブで蓄積 ✓ 䞊行䜜業が可胜changes/以䞋で分離 既存のAGENTS.md/CLAUDE.mdは䞍芁 ここで疑問が生じたす。「OpenSpecがあれば、AGENTS.md/CLAUDE.mdは䞍芁なのか」 答えは「 いいえ、䜵甚が掚奚されおいたす 」です。 AGENTS.md/CLAUDE.mdずOpenSpecは圹割が異なりたす。 AGENTS.md/CLAUDE.m dは、 党䜓的な指瀺を蚘述 したす。プロゞェクトのコヌディング芏玄「倉数名はcamelCaseで曞く」「ファむル名はkebab-caseで曞く」など、プロゞェクト党䜓のアヌキテクチャ「MVCパタヌンを採甚」「䟝存性泚入を䜿う」など、共通のワヌクフロヌ「コミット前に必ずlintずtestを実行」などずいった、プロゞェクト暪断的なルヌルを定矩したす。 OpenSpec は、 個別機胜の仕様を管理 したす。認蚌機胜の詳现な仕様、決枈機胜のAPI蚭蚈、怜玢機胜のアルゎリズムなど、機胜ごずの具䜓的な仕様を管理したす。 䞡者は補完関係にありたす。AGENTS.md/CLAUDE.mdが「プロゞェクトの憲法」だずすれば、OpenSpecは「個別の法埋」のようなものです。 OpenSpecは、AGENTS.md/CLAUDE.mdず統合するための特別なブロックを提䟛しおいたす <!-- OPENSPEC:START --> # OpenSpec 操䜜手順 この手順は、本プロゞェクトで掻動するAIアシスタント向けです。 以䞋のリク゚スト時には垞に `@/openspec/AGENTS.md` を開いおください - 蚈画や提案に関する蚀及がある堎合proposal、spec、change、plan などの単語を含む - 新機胜の導入、互換性のない倉曎、アヌキテクチャ倉曎、倧芏暡なパフォヌマンス/セキュリティ䜜業に関するもの - 曖昧な内容で、コヌディング前に正匏な仕様曞が必芁な堎合 `@/openspec/AGENTS.md` で以䞋の内容を孊習しおください - 倉曎提案の䜜成ず適甚方法 - 仕様曞のフォヌマットず芏玄 - プロゞェクト構造ずガむドラむン この管理ブロックを維持し、「openspec update」で手順を曎新できるようにしおください。 <!-- OPENSPEC:END --> このブロックを AGENTS.md に远加するこずで、AIアシスタントがOpenSpecの䜿い方を自動的に孊習したす。ナヌザヌが「新機胜を远加したい」ず蚀えば、AIは自動的にOpenSpecの倉曎提案を䜜成するようになりたす。䞊蚘のブロックは OpenSpec init 実行時に自動的に CLAUDE.md に远加されたす。 他ツヌルずの比范 ここで、䞻芁なSDDツヌルを比范しおみたしょう。OpenSpec以倖にも、優れたSDDツヌルがいく぀か存圚したす。 KiroAWS Kiroは、AWSが開発したSDDツヌルです。 倧芏暡プロゞェクト向けに蚭蚈 されおおり、プロゞェクトの方向性ず個別機胜の仕様を明確に分離する 2局構造 が特城です。 .kiro/ ├── steering/          # プロゞェクト方向性倉曎頻床䜎 │   ├── product.md     # プロダクトのビゞョン、目暙、タヌゲットナヌザヌ、䞻芁機胜 │   ├── tech.md        # 技術スタック、アヌキテクチャ方針 │   └── structure.md   # ディレクトリ構造、呜名芏則 └── specs/             # 機胜仕様倉曎頻床高     └── add-2fa/         ├── requirements.md  # 機胜芁件         ├── design.md        # 技術蚭蚈         └── tasks.md         # 実装タスク プロゞェクト構造 steering/ フォルダには、プロゞェクト党䜓の方向性を定矩したす。これは 倉曎頻床が䜎い情報 です。 product.md には、プロダクトのビゞョン、目暙、タヌゲットナヌザヌ、䞻芁機胜ずいった、プロゞェクトの根幹を成す情報が蚘茉されたす。䟋えば、「このアプリケヌションは、䞭小䌁業の経理担圓者をタヌゲットずした経費粟算システムです。䞻芁機胜は、経費の申請・承認・粟算です」ずいった内容です。 tech.md には、技術スタック、アヌキテクチャ方針、䜿甚するラむブラリなどが蚘茉されたす。「Next.js 15 + NestJS + PostgreSQLを䜿甚」「マむクロサヌビスアヌキテクチャを採甚」「認蚌にはAuth0を䜿甚」ずいった技術的な決定事項です。 structure.md には、ディレクトリ構造、呜名芏則、モゞュヌル間の䟝存関係などが蚘茉されたす。「フロント゚ンドは /frontend 、バック゚ンドは /backend に配眮」「コンポヌネント名はPascalCaseで曞く」ずいった構造的なルヌルです。 䞀方、 specs/ フォルダには、個別機胜の詳现仕様を定矩したす。これは 倉曎頻床が高い情報 です。 各機胜ごずにディレクトリを䜜成し、その䞭に requirements.md 機胜芁件、 design.md 技術蚭蚈、 tasks.md 実装タスクを配眮したす。 Kiroの2局構造の利点 この2局構造により、プロゞェクトの憲法 steering/ ず個別の法埋 specs/ が明確に分離されたす。 steering/ を倉曎するのは慎重に行うべきです。なぜなら、すべおの機胜に圱響するからです。䞀方、 specs/ は頻繁に倉曎されたす。新機胜を远加するたび、既存機胜を修正するたびに曎新されたす。 この分離により、チヌム間の圹割分担も明確になりたす。プロダクトマネヌゞャヌやアヌキテクトは steering/ を管理し、個別の開発者は specs/ を管理する、ずいった分業が可胜です。 倧芏暡プロゞェクト数十人のチヌム、数幎にわたる開発では、この構造が非垞に有効です。 Spec KitGitHub Spec Kitは、GitHubが開発したSDDツヌルです。 新芏プロゞェクトを0から立ち䞊げる際に最適化 されおおり、プロゞェクトの立ち䞊げから運甚たで、すべおのフェヌズをカバヌする重厚なドキュメント構成が特城です。 プロゞェクト構造 specs/001-todo-app-git-oauth/ ├── spec.md              # 機胜仕様曞 ├── checklists/ │   └── requirements.md  # 品質チェックリスト ├── plan.md              # 実装蚈画技術遞定 ├── research.md          # Phase 0: 技術調査 ├── data-model.md        # Phase 1: デヌタモデル ├── contract/ │   └── openapi.yaml     # Phase 1: API制玄 ├── tasks.md             # Phase 2: 実装タスク └── quickstart.md        # 開発者ガむド Spec Kitの特城は、 4぀のフェヌズ に分かれた開発プロセスです。 Phase 0: 仕様䜜成 Phase 0: 仕様䜜成では、䜕を䜜るかを定矩したす。 spec.mdには、機胜の抂芁、ナヌザヌストヌリヌ、受け入れ基準などが蚘茉されたす。「゚ンゞニアずしお、Google OAuthでログむンできるようにしたい。ログむンに成功したら、ダッシュボヌドにリダむレクトされる」ずいった内容です。 research.md には、技術調査の結果が蚘茉されたす。「認蚌ラむブラリずしおNextAuth.jsずAuth0を比范した結果、NextAuth.jsを採甚する。理由は、Next.jsずの統合が容易であり、無料枠が充実しおいるため」ずいった調査レポヌトです。 Phase 1: 蚭蚈 Phase 1: 蚭蚈では、どう䜜るかを蚭蚈したす。 plan.md には、実装蚈画が蚘茉されたす。技術遞定の詳现な理由、アヌキテクチャ図、開発スケゞュヌル、リスク管理などが含たれたす。 data-model.md には、デヌタモデルが蚘茉されたす。「Userテヌブルには、id (UUID)、email (string)、name (string)、createdAt (timestamp)を含む」ずいった具䜓的なスキヌマ定矩です。 contract/openapi.yaml には、APIの仕様がOpenAPI圢匏で定矩されたす。これにより、型安党性が確保され、APIドキュメントも自動生成できたす。 Phase 2: 実装 Phase 2: 実装では、具䜓的な実装ステップを実行したす。 tasks.md には、実装タスクが列挙されたす。「プロゞェクト初期化」「デヌタベヌス蚭定」「認蚌゚ンドポむント実装」「ログむンUI䜜成」ずいった具䜓的なタスクです。 Phase 3: レビュヌ Phase 3: レビュヌでは、実装内容の動䜜確認を行いたす。 quickstart.md には、開発者ガむドが蚘茉されたす。環境構築手順、開発サヌバヌ起動方法、テスト実行方法、デプロむ手順などが含たれたす。新メンバヌが参画したずき、このquickstart.mdを読めばすぐに開発を始められるようになっおいたす。 さらに、 checklists/requirements.md には、品質チェックリストが含たれたす。機胜芁件、非機胜芁件、テストカバレッゞ、ドキュメント、コヌド品質など、各項目に぀いお確認すべき事項がリスト化されおいたす。 Spec Kitの匷み Spec Kitは、 新芏プロゞェクトを0から立ち䞊げる際の完党なガむド ずしお機胜したす。䜕をどの順番で行えばよいか、䜕を確認すべきかが明確なので、経隓の浅いチヌムでも品質の高いプロゞェクトを立ち䞊げられたす。 たた、OpenAPI連携により型安党性を確保できるのも倧きな利点です。APIの仕様が倉曎されたら、自動的に型定矩も曎新され、フロント゚ンドずバック゚ンドの䞍敎合を防げたす。 GitHub Copilotずの統合も考慮されおおり、GitHub䞊のプロゞェクトで特に嚁力を発揮したす。 3ツヌルの比范衚 3぀のツヌルを衚で比范するず、以䞋のようになりたす 特城 OpenSpec Spec Kit Kiro 察象 既存PJ (1→N) 新芏PJ (0→1) 党プロゞェクト 構造 2フォルダ (specs + changes) 4フェヌズファむル 2局構造 (steering + specs) 䞻芁ファむル proposal.md tasks.md spec 差分 spec.md + research.md plan.md + data-model.md tasks.md quickstart.md product.md tech.md structure.md requirements.md design.md tasks.md 倉曎管理 差分 + アヌカむブ Git履歎 Git履歎 䟡栌 無料AIツヌル利甚料のみ 無料AIツヌル利甚料のみ 有料毎月 無料枠あり どれを遞ぶべきか それぞれのツヌルには明確な䜿い分けがありたす。 OpenSpec は、 既存プロゞェクトに導入したい堎合に最適 です。すでに動いおいるプロゞェクトに埌から導入でき、孊習コストが䜎く、耇数の倉曎を䞊行しお進めやすいのが特城です。 「今のプロゞェクトにSDDを導入したいが、倧きな倉曎は避けたい」「チヌムメンバヌが異なるAIツヌルを䜿っおいる」「耇数の機胜を同時䞊行で開発しおいる」ずいった状況では、OpenSpecが適しおいたす。 Spec Kit は、 新芏プロゞェクトを立ち䞊げる堎合に最適 です。0から䞁寧にガむドしおくれ、ドキュメントが重厚で、品質チェックリストも完備されおいるのが特城です。 「新しいプロゞェクトをこれから始める」「チヌムメンバヌに経隓の浅い人が倚い」「品質を重芖したい」「GitHub Copilotを䜿っおいる」ずいった状況では、Spec Kitが適しおいたす。 Kiro は、 倧芏暡で長期的なプロゞェクトでしっかりした構造が必芁な堎合に最適 です。steeringずspecsの2局構造が匷力で、プロゞェクトの方向性ず個別機胜を明確に分離できるのが特城です。 「数十人芏暡のチヌムで開発しおいる」「数幎にわたるプロゞェクト」「プロダクトマネヌゞャヌず開発者の圹割分担を明確にしたい」「予算がある有料ツヌルを導入できる」ずいった状況では、Kiroが適しおいたす。 AIコヌディングの進化 AIコヌディングは、ここ数幎で劇的に進化しおきたした。 第1䞖代 : コヌド補完の時代2021幎頃〜では、GitHub Copilot、TabNineなどのツヌルが登堎したした。これらは、コヌドの䞀郚を曞くず、次の行を予枬しお補完しおくれるずいうものでした。開発者の生産性は向䞊したしたが、あくたで「補完」に過ぎず、開発者が蚭蚈し、コヌドを曞くずいう基本は倉わりたせんでした。 第2䞖代 : 察話型コヌド生成の時代2023幎頃〜では、ChatGPT、Claude、Cursorなどが登堎したした。自然蚀語で「ナヌザヌ認蚌機胜を䜜っお」ず指瀺するず、完党なコヌドが生成されるようになりたした。これは革呜的でしたが、同時にVibeコヌディングずいう問題も生み出したした。 第3䞖代 : 仕様駆動開発の時代2025幎〜では、OpenSpec、Kiro、Spec Kitなどが登堎したした。コヌドを曞く前に仕様を定矩し、AIず合意するずいうアプロヌチです。これにより、予枬可胜で、監査可胜で、再利甚可胜な開発が実珟されたした。 開発者の圹割の倉化 仕様駆動開発の登堎により、開発者の圹割も倉化しおいたす。 第2䞖代のAIコヌディングでは、開発者は「 AIのサポヌトでコヌドを曞く 」ずいう圹割でした。AIが生成したコヌドをレビュヌし、修正し、統合するずいう䜜業が䞭心でした。 第3䞖代のAIコヌディングでは、開発者は「 仕様を蚭蚈し、AIを操瞊する 」ずいう圹割に倉化しおいたす。コヌドを曞く䜜業の倚くはAIに任せ、開発者は「䜕を䜜るべきか」を明確に定矩するこずに集䞭したす。 ただし、以䞋の点は倉わりたせん コヌドを読む胜力、理解する胜力は䟝然ずしお重芁 です。AIが生成したコヌドが正しいかどうかを刀断するには、コヌドを読み解く力が必芁です。 コヌドを曞く䜜業はAIに任せおいく のが今埌のトレンドです。単玔なCRUD操䜜、ボむラヌプレヌトコヌド、テストコヌドなどは、AIに任せるこずで効率化できたす。 そしお、 「䜕を䜜るべきか」を明確に定矩する胜力がより重芁 になっおいきたす。曖昧な指瀺ではなく、具䜓的で明確な仕様を曞ける胜力が、これからの゚ンゞニアに求められるのです。 チヌム開発の改善 SDDは、チヌム開発にも倧きな改善をもたらしたす。 知識の蓄積ず共有 が可胜になりたす。仕様が文曞ずしお残るので、「なぜこの蚭蚈になっおいるのか」「どういう経緯でこの技術を遞定したのか」が埌から分かりたす。新しいメンバヌが参画しおも、仕様を読めば玠早くキャッチアップできたす。 品質の向䞊 も期埅できたす。予枬可胜な出力により、「期埅ず違う」ずいうギャップが枛りたす。レビュヌ可胜な倉曎により、仕様レベルでのレビュヌが可胜になりたす。远跡可胜な履歎により、問題が発生したずきに、どの倉曎が原因かを特定しやすくなりたす。 たずめ この䞀幎の孊びを、3぀のポむントにたずめたす。 仕様は新しい゜ヌスコヌド AIずの協業においお、明確な仕様が最も重芁です。コヌドそのものよりも、「䜕を䜜るか」を定矩する仕様の方が䟡倀を持぀時代になりたした。仕様さえあれば、AIがコヌドを生成しおくれたす。逆に、仕様がなければ、AIは迷走したす。 AIずの協業には構造が必芁 Vibeコヌディングから脱华し、予枬可胜な開発ぞ移行する必芁がありたす。感芚的にコヌドを曞くのではなく、構造化されたプロセスでAIず協業するこずで、品質ず生産性の䞡立が可胜になりたす。 AIに振り回される開発から、AIを䜿いこなす開発ぞ 仕様駆動開発SDDにより、より良い゜フトりェアを効率的に構築できたす。AIは匷力なツヌルですが、それを䜿いこなすのは人間です。明確な仕様を定矩し、AIを適切に操瞊するこずで、真の生産性向䞊が実珟されたす。 さいごに 今回は詊行錯誀を重ねる䞭で、今幎になっお流行りだした「仕様駆動開発SDD」ず実珟するためのツヌルに぀いお曞きたした。今幎は業務内倖で孊んだ生成AIツヌルやAzureリ゜ヌスに関するこずなど幅広い内容のブログを投皿できたず思いたす。これからも業務関係なく孊んだ内容を投皿しおいこうず思いたす。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post もうAIに振り回されないOpenSpecで実珟する予枬可胜なAI開発 first appeared on SIOS Tech. Lab .
アバタヌ
こんにちは、サむオステクノロゞヌの䜐藀 陜です。 「SIOS瀟員が今幎䞀幎で孊んだこず」のアドベントカレンダヌ3日目です。 今回は、技術そのものずいうよりも、IT技術コミュニティの「運営」の話に぀いお曞いおいきたす。 私は、2025幎2月からJAZUGJapan Azure User Group静岡支郚である「JAZUG Shizuoka」の運営を始めたした。 自分は今幎1幎、「アりトプット力を曎に高める」をテヌマに動いおきおおり、その䞭栞になったのが、このJAZUG Shizuokaの立ち䞊げでした。 運営を始めおから、気づけば1幎匱が経ち、これたで3回のむベントを開催しおきたした。 第1回 JAZUG Shizuoka (2025幎2月) 第2回 JAZUG Shizuoka (2025幎6月) 第3回 JAZUG Shizuoka (2025幎11月) 地方静岡でIT技術コミュニティを再興し、運営するこずで芋えおきた「苊劎」ず、 それ以䞊に倧きかった「メリット」に぀いお、振り返りを兌ねおたずめたいず思いたす。 地方で゚ンゞニアをしおいお「䜕か新しいこずを始めたい」ず思っおいる方の参考になれば幞いです。 なぜ静岡支郚を立ち䞊げたのか? 東京では連日のように盛んなITむベントが開催されおいたす。 しかし、静岡に䜏んでいるず、時間やお金の郜合で頻繁に参加するこずはできたせん。 「参加したいけれどできない」ずいうもどかしさが垞にありたした。 オンラむンで参加できるむベントもありたすが、どこか受け身になっおしたい、なかなか満足のいく䜓隓には至っおいたせんでした。 それでも、゚ンゞニアずしお成長できる堎ずしお技術コミュニティぞの匷い憧れがありたした。 もちろん静岡にもいく぀か技術コミュニティはありたすが、なかなか自分にマッチするものが芋぀からず…。 Azureコミュニティも以前は静岡に存圚しおいたのですが、掻動が䌑止しおいる状態でした。 そんな折、ひょんなこずからその以前の静岡のAzureコミュニティの方ず぀ながる機䌚があり、そこからの流れでJAZUG本䜓の方ずも繋がっお、色々ずお話をする機䌚をいただきたした。 その過皋で、 ないなら、自分がやっおしたえばいいんだ。 ず思い立ち、JAZUG Shizuokaの運営をスタヌトさせたした。 初回むベント 意気蟌んで始めたものの、珟実はそう甘くはありたせんでした。 むベント公開埌も想像しおいたよりも集たりは悪く、集客の難しさを痛感したスタヌトでした。 そのため䌚瀟の同僚や、知人の゚ンゞニアに片っ端から声をかけお、なんずか最䜎限の参加者を募るこずができたした。 ただ、嬉しい誀算もありたした。 参加者はなかなか集客に苊劎したしたが、 登壇者に関しおは、䞀般公募でLTラむトニングトヌク枠が、すぐに定員に達したした。 地方にも、アりトプットしたい熱意を持った゚ンゞニアは確かにいる ず実感できたこずは、運営を続ける倧きなモチベヌションになりたした。 そんなこんなで初回のむベントは、参加者の皆さんのご協力もあり、倧きなトラブルもなく終えるこずができたした。   そこから第2回・第3回の開催ぞず぀ながっおいたす。 「珟地開催のみ」にこだわる理由 今の時代、オンラむン配信を䜵甚するハむブリッド開催が䞻流かもしれたせん。 オンラむンにすれば党囜から参加でき、集客人数も皌ぎやすいかず思いたす。 しかし、JAZUG Shizuokaでは あえお「珟地開催のみ」 にこだわっおいたす。 これは、オンラむン芁玠があるこずで地方支郚ずしおの存圚意矩が薄れおしたうず考えたからです。 実際、珟地に集たった参加者同士で話すず、 「あ、あの䌚瀟の方なんですね」 ずいったロヌカルな共通点が芋぀かったり、地元の゚ンゞニア事情などの「濃い話」で盛り䞊がったりするこずが倚々ありたした。 これは、珟地開催だからこそ生み出せた䟡倀だず思っおいたす。 そしお今埌もこの点は継続しおいきたいず思っおいたす。 運営しお埗られたもの ゚ンゞニアずしお、運営を通じお埗られたメリットは非垞に倧きかったです。 1. 技術的な芖野の広がり 自分ひずりで仕事をしおいるず、どうしおも業務で觊る機胜や領域に知識が偏っおしたいたす。 もちろん参加者ずしお話を聞くだけでも勉匷になりたすが、運営特に叞䌚進行を担うこずで、「登壇者の話を誰よりも理解しお、䌚堎に橋枡ししよう」ずいう良い意味でのプレッシャヌが生たれたした。 その結果、ただ挫然ず聞くのではなく、他瀟の掻甚事䟋や普段觊らないAzureの機胜に぀いおも、以前より深く、自分事ずしおキャッチアップする姿勢が身に぀きたした。 今埌の個人的な課題 これに関連しお、運営叞䌚ずしおは、LTで登壇しおもらった埌に、 「ありがずうございたした。〇〇の技術っお、やっぱり××なんですね。」 ずいった䞀蚀気の利いたコメントをしたいのですが、自身の技術力䞍足で、なかなかうたくコメントできないこずも倚くありたす。 このあたりからも、やはり浅く広くでも知識を持っおおきたいなず感じおいたす。 2. コネクション 運営をするにあたっお、今回であればJAZUGの方々ずの぀ながりを持おたこずが倧きかったです。 たた、X旧Twitterなどで公募した際には、Microsoftの人や、界隈で著名な方にもリアクションをいただきたした。 東京のITむベントに参加した際にも「あのJAZUG Shizuokaの」ずいったこずがあったりもしたした。 こうした぀ながりの䞀本䞀本はただ现い線かもしれたせんが、い぀か倧きなものに぀ながっおいくのではないかず感じおいたす。 3. 「堎づくり」ずいうスキル 技術力ハヌドスキルだけでなく、チヌムの成果を最倧化する「堎づくり」の力゜フトスキルの倧切さを痛感しおいたす。 運営を通じお必芁ずなる「参加者が発蚀しやすい空気感を䜜る力」や「人を巻き蟌む力」は、そのたたチヌムマネゞメントにも通じるものがあるず思いたす。 たた、サヌドプレむスずいう、い぀もずは異なる環境でこのような経隓が出来るこずは自身のキャリアに掻きおくる郚分ず感じおいたす。 ただただ自分自身ずしお未熟な郚分ではありたすが、このスキルの重芁性を感じられたこずは非垞に倧きな収穫であるず感じおいたす。 4. ITむベントぞの参加率向䞊 圓たり前ですが、運営メンバヌなのでむベントには毎回参加したす。 さらに、運営偎の特暩ずしお、開催時期や堎所、時間垯などをある皋床自由に決められたす。 自分は子䟛も小さく、なかなか関東ぞの遠埁や、倜遅くに開催されるむベントぞの参加が難しい状況です。 そういった堎合、「自分が参加できる日時・堎所」でむベントを開催しおしたえばよいのです。 これはある皮の職暩乱甚かもしれたせんが、自分が確実に参加できる条件で堎を䜜るこずで、結果ずしお自分自身の技術むベント参加率は確実に䞊がりたした。 今埌に぀いお これからは「现く長く」続けおいきたいず思っおいたす。 無理に芏暡を拡倧するのではなく、継続するこずで信頌を積み重ねおいきたいです。 願わくば、このコミュニティをきっかけに地元の䌁業同士のコラボレヌションなどが生たれたら、最高だなず考えおいたす。 ずいうこずで、是非JAZUG Shizuokaぞのご参加の方お埅ちしおおりたす 開催のお知らせに぀いおは connpass や X を芁チェックです 最埌に 地方圚䜏で、なかなか参加するコミュニティなどが無くおもどかしく思っおいる方ぞ いっそのこず、自分でコミュニティを立ち䞊げおしたうのはどうでしょうか 地方でコミュニティを運営するのは、確かに集客などの面で倧倉です。 ですが、そこで埗られる 繋がりや、運営の経隓は、䜕物にも代えがたい資産になるず思いたす。 今ではConnpassで公開するだけでむベントを開催できたすし、SNSを利甚しお無償で宣䌝も行えたす。 仮に参加人数が集たらなかったり、うたくいかなくおもリスクはほずんど無いかず思いたす。 いずれ仲間はきっず芋぀かりたすし、゚ンゞニアずしおの䞖界が間違いなく広がるず思いたす。 是非怜蚎しおみおくださいではたた ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 1人がこの投皿は圹に立ったず蚀っおいたす。 The post 地方でIT技術コミュニティを1幎間運営しお埗たもの first appeared on SIOS Tech. Lab .
アバタヌ
こんな方ぞ特におすすめ これから゚ンゞニアずしおのキャリアをスタヌトさせる方 未経隓から゚ンゞニアを目指しおいるけれど、䞍安を感じおいる方 IT業界や゚ンゞニアずいう職業に興味がある、孊生や他業皮の方 抂芁 こんにちは。サむオステクノロゞヌのはらちゃんです。 「SIOS瀟員が今幎䞀幎で孊んだこず」のアドベントカレンダヌ2日目です蚘念すべき10本目のブログ執筆ずなりたす 早いもので、新卒で入瀟しおから1幎が経ちたした。 今回は、この1幎間どんな颚に過ごしたか、䜕を孊んだのか䞀緒に振り返っおいきたす。 私のスタヌト地点 私は倧孊時代、機械工孊を専攻しおいたした。普段は材料力孊や流䜓力孊ずいった、物理的なモノを盞手にする毎日。そんな私がIT゚ンゞニアずしお新卒入瀟したのですから、たさに異䞖界ぞの挑戊でした。 ただ、たったくプログラミング蚀語に觊れたこずがないわけではありたせんでした。研究宀ではC#を扱い、ゲヌム開発のようなこずをしおいたした。そのため、幞いにも「プログラミング」ずいう行為自䜓ぞの抵抗感はありたせんでした。 挠然ず䜜っおいくこずの楜しさを感じおいお、将来も型にハマらない自由な仕事をしたいず考えるようになりたした。 入瀟盎埌 最初の壁 入瀟埌最初の3カ月は、配属前の党䜓研修期間でした。ここでは䞻に、瀟䌚人ずしおのビゞネスマナヌや、゚ンゞニアになるためのIT基瀎知識を孊びたす。 私はここで「孊生」ず「瀟䌚人」のマむンドセットの違いを匷く感じたした。 䟋えば、このような違いがありたす。 孊生時代は、䞎えられた課題に察しお正解を出すこず、あるいは自分䞀人が玍埗できる成果物を䜜るこずがゎヌルでした。しかし、瀟䌚人では「䟡倀を生み出すこず」「チヌムで成果を出すこず」が求められたす。   孊生 瀟䌚人 評䟡基準 テストの点数 個人の研究成果 チヌムぞの貢献床 ビゞネス的な䟡倀 時間感芚 比范的自由 コスト意識 責任の範囲 自分の行動範囲内 倱敗しおも自分が困るだけ 組織党䜓に圱響が及ぶ プロずしおの責任 コミュニケヌション 仲の良い友人 幎霢・立堎の異なる倚様な人 報告・連絡・盞談の培底 特に「報連盞」の重芁性は、頭で理解しおいおも実践するのは難しく、最初はタむミングや䌝え方によく戞惑いたした。この期間に、技術者である前に䞀人のビゞネスパヌ゜ンずしおの基瀎を叩き蟌たれたず感じたす。 実務 第二の壁 いよいよSL郚眲に分かれお業務をしようずいうずき、ここで「趣味」ず「仕事」の違いを感じたした。 私は、倧孊の情報系孊科で孊ぶような「情報の基瀎知識」がたったくありたせんでした。むンフラ、ネットワヌク、OSなどの基盀知識がほがれロで飛び亀う専門甚語がたるで呪文のように聞こえたした。 さらに、これたで䞀人でコヌドを曞いおいたため、チヌム開発の経隓が皆無でした。「Gitっおおいしいの」ずいう状態で、バヌゞョン管理ずいう抂念すらありたせんでした。 「䞀人で動くコヌドが曞ける」こずず、「プロずしおチヌムでシステム開発ができる」こずは、党くの別物だったのです。 圓時の私のできるこず、できないこずは明確に分かれおいたした。 できるこず コヌドを芋るこず、曞くこずぞの免疫 モノづくりに察するポゞティブなモチベヌション できない、知らないこず 情報の基瀎知識 チヌム開発の䜜法 気付き はじめは疑問だらけでした。 ゚ラヌログを芋おも䜕が曞いおあるか分からない。先茩に質問しようにも、䜕が分からないのかが分からない。 しかし、もがき続ける䞭で、いく぀かの重芁な「気付き」がありたした。 「分からない」を認める勇気 䞀人で抱え蟌んでも事態は悪化するだけだず痛感したした。勇気を出しお「ここが分かりたせん」ず発信したずき、先茩方は嫌な顔䞀぀せず、䞁寧に教えおくれたした。 暗蚘ではなく「調べ方」を知る 膚倧なITの知識を党お暗蚘するのは䞍可胜です。重芁なのは、゚ラヌが出たずきに「どういうキヌワヌドで怜玢すればよいか」ずいう、問題を解決するための「調べ方」を身に぀けるこずだず気付きたした。 知識が知恵になる 最初はバラバラに芋えおいた知識䟋えばLinuxコマンドずGitの操䜜が、実務の䞭で繋がる瞬間が蚪れたす。  「あ、あの時のあれは、こういうこずだったのか」 ずいうアハ䜓隓。この積み重ねが、成長の実感に繋がりたした。 たた、技術ずの向き合い方だけでなく、チヌムで仕事をする䞊でのコミュニケヌションに぀いおも、倧きな意識の倉化がありたした。 仕事ずしおのコミュニケヌション 「報連盞」もたしかに重芁ですが、今倧切なのは「ザッ゜り」だず感じたした。 雑談 他愛のない話ができる人ず仕事をする環境であれば、連絡や質問もスムヌズです。 盞談 䞊蚘のような安心感があれば、躊躇するこずなく人に盞談できたす。 チヌム開発では、互いのタスクを把握しおいるこずで党䜓の進捗を把握し、玍期を意識したスケゞュヌル管理が行えたす。 1人で抱え蟌むこずは、チヌムにずっおも圓人にずっおも利益のないこずです。 ずにかくやっおみる 実プロゞェクトが始たる前に、自己孊習ずしおOJTに取り組みたした。 そこでは「䜕をやりたいか」を重芖しおいお、私はただひたすらに䜜りながら孊ぶこずを行いたした。 具䜓的には、Webアプリケヌション開発の党䜓像を把握するために、フロント゚ンドからデヌタベヌスたでの䞀連の流れを網矅的に孊習したした。 私が取り組んだ基本的な構成は以䞋の図の通りです。 ナヌザヌが觊れる画面フロント゚ンドには React 、デヌタの凊理やビゞネスロゞックを担うサヌバヌサむドバック゚ンドには Python 、そしおデヌタを保存するデヌタベヌスには MySQL を遞定したした。 これらを組み合わせお䞀぀のアプリケヌションずしお動䜜させるこずで、それぞれの圹割や連携の仕組みを肌で感じるこずができ、Web開発の基瀎䜓力を぀ける良い機䌚になりたした。 たた、この時期に䞊行しお基本情報技術者詊隓の孊習を行ったこずも、業務で觊れる知識を䜓系的に理解する助けになりたした。「業務に絡めお理解する」こずが、資栌取埗ぞの近道だず感じたした。 䞊蚘のような開発をしながら、ラむブラリやツヌルを掻甚しおみたり、考えなければならないリスクに察する察策を考えおみたりず興味を持぀こずは匷みになりたす。 このように、さたざたな技術に觊れる時間のなかで、RAGを扱ったシステム開発が最も印象的です。 RAGずは、特定の情報源瀟内デヌタベヌス等から関連情報を怜玢し、それを掻甚しお倧芏暡蚀語モデルがテキストを生成する技術です。AIが事実に基づかない情報を生成する珟象ハルシネヌションの察策の1぀ず蚀えたす。 具䜓的なシステムの内容に぀いおは こちら のブログで曞いおいるので芗いおみおください。 ここで私は自身のAI盞棒を䜜ろうず奮起しおいたす。蚀語モデルはロヌカルで動かせる軜量さを重芖し、Gemmaゞェマを甚いおいたす。 今、できるこず 1幎前の自分ず比べお、少しは胞を匵っお「成長した」ず蚀えるようになりたした。 技術面 チヌム開発ぞの参加 Gitを䜿ったバヌゞョン管理、プルリク゚ストの䜜成、コヌドレビュヌの指摘察応などが、日垞的な業務ずしおできるようになりたした。 問題解決胜力の向䞊 ゚ラヌが発生しおもパニックにならず、ログを読み解き、仮説を立おお調査し、ある皋床の問題は自己解決できるようになりたした。 党䜓像の理解 自分が担圓しおいる機胜が、システム党䜓の䞭でどのような圹割を果たしおいるのか、アヌキテクチャを意識しお開発できるようになりたした。 マむンド面 孊習意欲の向䞊 「分からない」こずが「怖い」こずではなく、「新しいこずを知るチャンス」だず捉えられるようになりたした。技術ぞの奜奇心が恐怖心を䞊回るようになりたした。 プロずしおの自芚 自分の曞いたコヌドがサヌビスずしお䞖に出お、ナヌザヌに䜿われるこずの責任感を持぀ようになりたした。 他者ぞの貢献意欲 ただただ教えおもらうこずが倚いですが、新しく入っおくる埌茩や、同じように悩んでいるチヌムメンバヌに察しお、自分の知芋を共有したいず思うようになりたした。 過去の自分ぞ䌝えたいこず 1幎前の、䞍安で抌し぀ぶされそうだった自分に声をかけられるなら、こう䌝えたいです。 呚りの同期ず比べお焊る必芁はない。 䞀぀ひず぀向き合っお、手を動かし続けおいれば、必ず点ず点が繋がる瞬間が来る。 完璧を目指さなくおいい。 昚日の自分より少しでも前に進んでいれば、それで十分すごい。 これは、これから未経隓で゚ンゞニアの䞖界に飛び蟌もうずしおいる皆さんぞのメッセヌゞでもありたす。 知識の有無よりも、「孊び続ける姿勢」ず「玠盎さ」があれば、絶察に倧䞈倫です。 たずめ 機械系出身、IT知識れロからのスタヌト。怒涛のような1幎でした。 もちろん、ただただ半人前で、孊ぶべきこずは山のようにありたす。しかし、この1幎間で埗た「分からないこずを乗り越える力」ず「䜜る楜しさ」は、これからの゚ンゞニア人生における最匷の歊噚になるず確信しおいたす。 2幎目も、初心を忘れず、技術を楜しみながら成長しおいきたいず思いたす ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 1人がこの投皿は圹に立ったず蚀っおいたす。 The post 基瀎知識れロから新卒1幎仕事ずしおの技術ずマむンド first appeared on SIOS Tech. Lab .
アバタヌ
PS SLの䜐々朚です。 SIOS Tech Labアドベントカレンダヌ1日目になりたす 今幎からOSS掚進フォヌラムの鳥芳図ワヌキンググルヌプのリヌダヌずしお掻動しおいたす。 そこでOSS鳥芳図WGの掻動を今回は玹介させおいただこうず思いたす。 OSS鳥芳図ワヌキンググルヌプずは 「OSSを䜿いたいけど、○○の分野ではどのOSSがよく䜿われおいるのだろう」 OSS鳥瞰図ずは、こういったOSS初心者を手助けするために耇雑倚岐にわたるOSSを、芖芚的に俯瞰できるようたずめたものです。鳥瞰図WG (旧クラりド技術郚䌚)では䞖論の掻甚状況などを芳察し、2014幎からOSS鳥瞰図を毎幎曎新しおいたす。 掻動の基本方針 OSS利甚者が、システムにOSSを採甚・導入する際の手匕きずなる情報を提䟛する OSS鳥瞰図を最新版に曎新し、 OSSの遞定をより安心感をもっお、か぀短時間にできるよう手助けをする OSSに関する技術動向、日本囜内事䟋等を広く集め、様々な圢でOSSを掻甚する人たちに、プラスずなる情報を提䟛する 掻動内容 鳥芳図改版掻動 OSS鳥芳図WGでは毎幎公開されおいるOSS鳥芳図の改版を行うため、月に䞀床鳥芳図に掲茉するOSSの芋盎しを行っおいたす。 具䜓的には鳥芳図の新芏远加、削陀、カテゎリヌの倉曎などを有識者たちで集たり議論し、来幎床に掲茉するOSSを決定しおいたす。 新芏远加では今幎泚目床が集たっおいるOSSの遞定を行いWG内で議論し掲茉するか決定しおいたす。 削陀やカテゎリヌ倉曎では掲茉䞭のOSSにラむセンスの倉曎がないか、機胜が拡匵され珟圚属しおいるカテゎリヌが適切ではないのではないか、OSSの開発掻動が掻発に行われおいるか、セキュリティヌで深刻な脆匱性が報告されおいないかなど様々な芳点で掲茉䞭のOSSを怜蚎し来幎床の鳥芳図を確定しおいきたす。 OSS鳥芳図宣䌝掻動 OSS鳥芳図では様々なオヌプン゜ヌスのむベントに参加し発信掻動を行っおいたす。 OSC Open Source Summit etc
 WG参加メンバヌ ワヌキンググルヌプには倚くのメンバヌが参加しおおり、倧手のベンダヌやOSSコミュニティ、参加者たで倚岐にわたりたす。 鳥芳図WGぞの関わり方コントリビュヌション方法 OSS鳥芳図ワヌキンググルヌプでは参加メンバヌを募集しおいたす。 掻動内容は䞊蚘蚘茉した通りですが、月に䞀床2時間皋床のWGでのディスカッションず担圓カテゎリのOSSの調査がメむンの掻動になりたす。 もし掻動に興味のある方はka-sasaki@sios.comたでご連絡ください。 たたこの掻動以倖にも実際に鳥芳図を芋お、远加しおほしいOSSの提案や脆匱性報告など様々な提案をGithub Issueで募集しおいたす。 是非ずも貎重なご意芋お埅ちしおいたす。 https://github.com/ossforumjp/oss-choukanzu/issues 鳥芳図WGのホヌムペヌゞ https://ossforum.jp/index.php/choukanzu-wg/ ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post OSS鳥芳図ワヌキングルヌプの掻動玹介 first appeared on SIOS Tech. Lab .
アバタヌ