<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>React on hdknr blog</title><link>https://hdknr.github.io/blogs/tags/react/</link><description>Recent content in React on hdknr blog</description><generator>Hugo -- 0.157.0</generator><language>ja</language><lastBuildDate>Thu, 26 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hdknr.github.io/blogs/tags/react/index.xml" rel="self" type="application/rss+xml"/><item><title>Dexter: 約200行で動く自律型金融リサーチエージェント</title><link>https://hdknr.github.io/blogs/posts/2026/03/dexter-%E7%B4%84200%E8%A1%8C%E3%81%A7%E5%8B%95%E3%81%8F%E8%87%AA%E5%BE%8B%E5%9E%8B%E9%87%91%E8%9E%8D%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/dexter-%E7%B4%84200%E8%A1%8C%E3%81%A7%E5%8B%95%E3%81%8F%E8%87%AA%E5%BE%8B%E5%9E%8B%E9%87%91%E8%9E%8D%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%81%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88/</guid><description>約200行のTypeScriptで動くオープンソースの金融リサーチAIエージェント Dexter の仕組み、アーキテクチャ、始め方を解説</description></item><item><title>Claude Codeをメインのデザインツールに：Tailwind CSSデザイナーSteve Schogerの1時間解説動画</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%82%92%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB%E3%81%ABtailwind-css%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BCsteve-schoger%E3%81%AE1%E6%99%82%E9%96%93%E8%A7%A3%E8%AA%AC%E5%8B%95%E7%94%BB/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%82%92%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB%E3%81%ABtailwind-css%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BCsteve-schoger%E3%81%AE1%E6%99%82%E9%96%93%E8%A7%A3%E8%AA%AC%E5%8B%95%E7%94%BB/</guid><description>&lt;p&gt;Tailwind CSSチームのデザイナー Steve Schoger が、「Claude Codeをメインのデザインツールにした」という1時間の解説動画を公開した。Figmaを使わず、Claude Codeだけで金融アプリのランディングページをゼロから構築する過程を全公開している。&lt;/p&gt;
&lt;h2 id="steve-schoger-とは"&gt;Steve Schoger とは&lt;/h2&gt;
&lt;p&gt;Steve Schoger は Tailwind Labs のデザイナーで、Adam Wathan と共に「&lt;a href="https://refactoringui.com/"&gt;Refactoring UI&lt;/a&gt;」の著者としても知られている。開発者向けにデザインスキルを体系的に教える活動で広く認知されており、X（Twitter）でのデザインTipsや YouTube でのUI改善動画でも人気が高い。&lt;/p&gt;
&lt;h2 id="動画の内容"&gt;動画の内容&lt;/h2&gt;
&lt;p&gt;動画では、約50回の対話を通じて初期出力をプロ級の品質に仕上げていく過程が公開されている。&lt;/p&gt;
&lt;p&gt;注目すべきは、Schoger 本人が「コマンドラインはディレクトリ移動と Claude 起動しかできない」と語っている点だ。プログラミングの深い知識がなくても、Claude Code との対話だけでプロ品質のLPを作り上げている。&lt;/p&gt;
&lt;h3 id="ワークフロー"&gt;ワークフロー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;左画面&lt;/strong&gt;: ブラウザ（localhost 表示）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右画面&lt;/strong&gt;: Claude Code のターミナル&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これだけのシンプルな構成で、Figma は一切使っていない。&lt;/p&gt;
&lt;h3 id="技術スタック"&gt;技術スタック&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt; — ビルドツール&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt; — ユーティリティファーストCSS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React&lt;/strong&gt; — UIライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="デザイナーがcliに移行する時代"&gt;デザイナーがCLIに移行する時代&lt;/h2&gt;
&lt;p&gt;「デザイナーがCLIに移行する」というのは、一見ありえない話に思える。しかし、この動画を見ると、AIコーディングツールがデザインワークフローを根本的に変えつつあることが実感できる。&lt;/p&gt;
&lt;p&gt;従来のデザインワークフローでは、Figma などのビジュアルツールでモックアップを作成し、それをエンジニアが実装するという流れが一般的だった。しかし Claude Code を使えば、デザイナーが自然言語で指示を出すだけで、直接コードとして実装されたUIを確認・修正できる。&lt;/p&gt;
&lt;h2 id="uish--デザインスキルをaiに組み込むツール"&gt;ui.sh — デザインスキルをAIに組み込むツール&lt;/h2&gt;
&lt;p&gt;Schoger と Adam Wathan は &lt;a href="https://ui.sh"&gt;ui.sh&lt;/a&gt; というツールも開発している。これは Claude Code や Cursor などのAIコーディングエージェントに、プロレベルのデザイン基準を適用させるスキルツールキットだ。ターミナルを「デザインエンジニア」に変えるというコンセプトで、AIが生成するUIの品質を大幅に向上させることを目指している。&lt;/p&gt;</description></item><item><title>Claude Desktop Preview: 画面クリックでDOM要素を直接指定してUI修正できる新機能</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-desktop-preview-%E7%94%BB%E9%9D%A2%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7dom%E8%A6%81%E7%B4%A0%E3%82%92%E7%9B%B4%E6%8E%A5%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6ui%E4%BF%AE%E6%AD%A3%E3%81%A7%E3%81%8D%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-desktop-preview-%E7%94%BB%E9%9D%A2%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7dom%E8%A6%81%E7%B4%A0%E3%82%92%E7%9B%B4%E6%8E%A5%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6ui%E4%BF%AE%E6%AD%A3%E3%81%A7%E3%81%8D%E3%82%8B%E6%96%B0%E6%A9%9F%E8%83%BD/</guid><description>Claude Desktop Preview に追加された DOM 要素クリック機能の使い方と仕組み、CLI 版 Claude Code との違い、Chrome DevTools MCP による代替手段を解説します。</description></item><item><title>Vercelを使えばインフラエンジニア不要？ Framework-defined Infrastructureが変えるWebアプリ開発</title><link>https://hdknr.github.io/blogs/posts/2026/03/vercel%E3%82%92%E4%BD%BF%E3%81%88%E3%81%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E4%B8%8D%E8%A6%81-framework-defined-infrastructure%E3%81%8C%E5%A4%89%E3%81%88%E3%82%8Bweb%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/vercel%E3%82%92%E4%BD%BF%E3%81%88%E3%81%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E4%B8%8D%E8%A6%81-framework-defined-infrastructure%E3%81%8C%E5%A4%89%E3%81%88%E3%82%8Bweb%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/</guid><description>&lt;p&gt;「Vercelを使えばそこそこ大規模なアプリケーションまでインフラエンジニア要らずにいけるのよな」——元Yahoo!エンジニアで YouTuber のしまぶー氏（&lt;a href="https://x.com/shimabu_it"&gt;@shimabu_it&lt;/a&gt;）のポストが話題になった。Vercel CEO の Guillermo Rauch 氏の投稿に対するコメントで、「しかも大抵の場合インフラエンジニアがAWSやGCPで構築したものより高機能、高可用性、高パフォーマンス」と踏み込んだ発言をしている。&lt;/p&gt;
&lt;h2 id="vercelが実現するインフラレス開発"&gt;Vercelが実現する「インフラレス」開発&lt;/h2&gt;
&lt;p&gt;Vercelは Next.js の開発元として知られるが、プラットフォームとしての本質は&lt;strong&gt;開発者からインフラの複雑さを隠蔽すること&lt;/strong&gt;にある。&lt;/p&gt;
&lt;h3 id="framework-defined-infrastructurefdi"&gt;Framework-defined Infrastructure（FdI）&lt;/h3&gt;
&lt;p&gt;Vercelが推進する &lt;a href="https://vercel.com/blog/framework-defined-infrastructure"&gt;Framework-defined Infrastructure&lt;/a&gt; は、Infrastructure as Code（IaC）の進化形だ。&lt;/p&gt;
&lt;p&gt;従来のIaCでは、開発者がTerraformやCloudFormationでインフラを明示的に定義する必要があった。FdIでは、&lt;strong&gt;フレームワークのコードからインフラ構成が自動的に導出される&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビルド時にソースコードを解析し、開発者の意図を理解&lt;/li&gt;
&lt;li&gt;必要なインフラ構成（Edge Functions、Serverless Functions、Static Assets、ISR設定など）を自動生成&lt;/li&gt;
&lt;li&gt;開発者は「何を作るか」に集中し、「どこにデプロイするか」を考える必要がない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="self-driving-infrastructure"&gt;Self-driving Infrastructure&lt;/h3&gt;
&lt;p&gt;Vercelは &lt;a href="https://vercel.com/blog/self-driving-infrastructure"&gt;Self-driving Infrastructure&lt;/a&gt; というコンセプトも掲げている。本番環境の運用を自律的に管理し、実世界のインサイトを基にアプリケーションコードの改善まで行うというビジョンだ。&lt;/p&gt;
&lt;h2 id="6人のエンジニアで年間360億トークンを処理"&gt;6人のエンジニアで年間360億トークンを処理&lt;/h2&gt;
&lt;p&gt;Vercelの「インフラ不要」の主張を裏付ける事例として、&lt;a href="https://vercel.com/blog/360-billion-tokens-3-million-customers-6-engineers"&gt;Durable社のケース&lt;/a&gt;が象徴的だ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;6名のエンジニアチーム&lt;/strong&gt;で300万ビジネスをサポート&lt;/li&gt;
&lt;li&gt;年間&lt;strong&gt;360億トークン&lt;/strong&gt;（日次1.1億トークン）を処理&lt;/li&gt;
&lt;li&gt;新しいAIエージェントを&lt;strong&gt;1日で本番環境に展開&lt;/strong&gt;可能&lt;/li&gt;
&lt;li&gt;自社ホスティング比で&lt;strong&gt;3〜4倍のコスト削減&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;創業者は「インフラ構築ではなくエージェント開発に注力できるようになった」と評価している。&lt;/p&gt;
&lt;h2 id="インフラエンジニアは本当に不要になるのか"&gt;インフラエンジニアは本当に不要になるのか？&lt;/h2&gt;
&lt;p&gt;しまぶー氏は以前から「インフラエンジニアは二極化する」と指摘している:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高待遇化&lt;/strong&gt;: クラウドサービスの基盤自体を作れるエンジニア&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;活躍の場が減少&lt;/strong&gt;: アプリケーションのインフラを構築する程度のエンジニア&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「基盤自体を作れるエンジニア」とは、VercelやAWSのサービスそのものを開発・運用する側のスキルセットを指す。具体的には以下のような領域だ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分散システム設計&lt;/strong&gt;: AWS LambdaやVercel Edge Functionsの実行基盤を設計・構築するスキル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンテナランタイム/オーケストレーション&lt;/strong&gt;: Kubernetesを「使う」のではなく「作る・拡張する」レベル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ネットワーク基盤&lt;/strong&gt;: CDN、ロードバランサ、DNSを大規模に設計・運用するスキル&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ストレージエンジン&lt;/strong&gt;: 分散データベースやオブジェクトストレージの内部実装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンパイラ/ランタイム&lt;/strong&gt;: サーバーレスプラットフォームのビルドパイプラインや実行環境の開発&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり「AWS上にアプリをデプロイする」のではなく「AWSのようなサービスを作る」側の人材であり、このレベルのエンジニアはプラットフォームの進化によってむしろ需要が高まっている。&lt;/p&gt;
&lt;h3 id="vercelの基盤は何で動いているのか"&gt;Vercelの基盤は何で動いているのか&lt;/h3&gt;
&lt;p&gt;「基盤を作る」とは具体的にどのレベルなのか。Vercel自身の技術スタックを見ると、その深さがわかる。&lt;/p&gt;
&lt;p&gt;Vercelは当初 AWS Fargate でビルド処理を実行していたが、プロビジョニングに90秒かかる問題があった。そこで2023年に独自のコンピュート基盤「&lt;a href="https://www.infoq.com/news/2025/01/vercel-hive/"&gt;Hive&lt;/a&gt;」を構築し、起動時間を5秒に短縮した。&lt;/p&gt;
&lt;p&gt;Hiveの技術スタックは以下の通りだ:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;レイヤー&lt;/th&gt;
&lt;th&gt;技術&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;物理基盤&lt;/td&gt;
&lt;td&gt;ベアメタルサーバー（&amp;ldquo;Boxes&amp;rdquo;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VM隔離&lt;/td&gt;
&lt;td&gt;Firecracker microVM + KVM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ビルド基盤&lt;/td&gt;
&lt;td&gt;Hive（独自コントロールプレーン）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;関数実行&lt;/td&gt;
&lt;td&gt;AWS Lambda、Edge Functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;オーケストレーション&lt;/td&gt;
&lt;td&gt;Amazon EKS（一部）+ 独自制御&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ストレージ/キュー&lt;/td&gt;
&lt;td&gt;Amazon S3、SQS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ネットワーク&lt;/td&gt;
&lt;td&gt;Amazon Global Accelerator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注目すべきは、&lt;strong&gt;OpenShiftのような既存のKubernetesディストリビューションは使われていない&lt;/strong&gt;点だ。Firecracker はAWSがLambdaとFargateのために開発したオープンソースのmicroVMで、約300ミリ秒でVMを起動できる。Vercelはこの Firecracker + KVM の上に独自のオーケストレーション層を構築している。&lt;/p&gt;</description></item><item><title>awesome-claws × OpenClawエコシステム28エージェント完全マップと設計思想5分類</title><link>https://hdknr.github.io/blogs/posts/2026/03/awesome-claws-openclaw%E3%82%A8%E3%82%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A028%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%8C%E5%85%A8%E3%83%9E%E3%83%83%E3%83%97%E3%81%A8%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B35%E5%88%86%E9%A1%9E/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/awesome-claws-openclaw%E3%82%A8%E3%82%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A028%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E5%AE%8C%E5%85%A8%E3%83%9E%E3%83%83%E3%83%97%E3%81%A8%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B35%E5%88%86%E9%A1%9E/</guid><description>&lt;h1 id="awesome-claws--openclaw-エコシステム-28-エージェント完全マップ"&gt;awesome-claws &amp;mdash; OpenClaw エコシステム 28 エージェント完全マップ&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/tom_doerr/status/2029305907193016670"&gt;@tom_doerr 氏が X で紹介&lt;/a&gt;した、OpenClaw インスパイアのエージェントキュレーションリストが注目されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;List of agents for OpenClaw&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/machinae/awesome-claws"&gt;machinae/awesome-claws&lt;/a&gt; は、OpenClaw にインスパイアされた &lt;strong&gt;28 の AI エージェントプロジェクト&lt;/strong&gt;をキュレーションしたリストです。Rust、TypeScript、Python、Go、C、Zig まで、&lt;strong&gt;8 言語&lt;/strong&gt;にまたがるエコシステムが形成されています。&lt;/p&gt;
&lt;p&gt;本記事では、GitHub 史上最速で最多スターを獲得した OpenClaw の背景と、そこから派生した 28 エージェントを設計思想別に分類して解説します。&lt;/p&gt;
&lt;h2 id="openclaw-とは何か"&gt;OpenClaw とは何か&lt;/h2&gt;
&lt;h3 id="github-史上最速の成長"&gt;GitHub 史上最速の成長&lt;/h3&gt;
&lt;p&gt;OpenClaw は、オーストリアの開発者 Peter Steinberger 氏が開発した&lt;strong&gt;オープンソースの自律型 AI エージェント&lt;/strong&gt;です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指標&lt;/th&gt;
&lt;th&gt;数値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub スター&lt;/td&gt;
&lt;td&gt;247,000+（2026 年 3 月時点）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14 日間での獲得スター&lt;/td&gt;
&lt;td&gt;190,000（GitHub 史上最速）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フォーク数&lt;/td&gt;
&lt;td&gt;47,700+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対応チャネル&lt;/td&gt;
&lt;td&gt;20+（WhatsApp、Telegram、Slack 等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AgentSkills&lt;/td&gt;
&lt;td&gt;5,700+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;比較として、Kubernetes は約 10 年で 120,000 スター、Linux カーネルは 30 年以上で 195,000 スターです。OpenClaw は &lt;strong&gt;14 日で 190,000 スター&lt;/strong&gt;を達成し、React を抜いて GitHub 最多スターのソフトウェアプロジェクトになりました。&lt;/p&gt;</description></item><item><title>「Claude Codeが無料で使える最強AIエージェント」は本当か — Accomplish の実態とAI煽りの再来</title><link>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E6%9C%80%E5%BC%B7ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%8B-accomplish-%E3%81%AE%E5%AE%9F%E6%85%8B%E3%81%A8ai%E7%85%BD%E3%82%8A%E3%81%AE%E5%86%8D%E6%9D%A5/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/claude-code%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E6%9C%80%E5%BC%B7ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%8B-accomplish-%E3%81%AE%E5%AE%9F%E6%85%8B%E3%81%A8ai%E7%85%BD%E3%82%8A%E3%81%AE%E5%86%8D%E6%9D%A5/</guid><description>&lt;h1 id="claude-codeが無料で使える最強aiエージェントは本当か--accomplish-の実態とai煽りの再来"&gt;「Claude Codeが無料で使える最強AIエージェント」は本当か — Accomplish の実態とAI煽りの再来&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/gagarotai200/status/2028675974834110472"&gt;ガガロットAI(@gagarotai200)氏のポスト&lt;/a&gt;が604いいね、764ブックマーク、約42,000表示と大きな反響を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;『Claude Code』が無料で使える最強AIエージェントが登場したww Accomplishっていうローカルで動くAIエージェントがGitHubに上がってたから共有する。これ入れれば、Claude Codeレベルの AIエージェントがサブスク購入なしで永遠に使えるwww
— ガガロットAI(@gagarotai200)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この投稿者は、以前「&lt;a href="https://gist.github.com/hdknr/1ddcd07ed2cfe5a9510119208b4376e2"&gt;OpenClawで5人解雇&lt;/a&gt;」という根拠不明の煽りポストでも注目を集めた人物で、AIスクールを運営しています。今回も「最強」「無料」「永遠に使える」というキーワードが並んでいますが、主張はどこまで正確なのでしょうか。&lt;a href="https://accomplish.ai/"&gt;Accomplish&lt;/a&gt; の実態を公式情報から検証します。&lt;/p&gt;
&lt;h2 id="accomplish-とは何か"&gt;Accomplish とは何か&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/accomplish-ai/accomplish"&gt;Accomplish&lt;/a&gt; は2026年1月13日に公開されたオープンソース（MITライセンス）のデスクトップ AI エージェントです。GitHub Stars 9.6k、Forks 1k、コントリビューター31名と、一定の支持を集めています。&lt;/p&gt;
&lt;h3 id="基本情報"&gt;基本情報&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;開発元&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;accomplish-ai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;技術スタック&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Electron + React + TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;対応OS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;macOS（Apple Silicon / Intel）、Windows 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;最新バージョン&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.3.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;内部構造&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://opencode.ai/"&gt;OpenCode CLI&lt;/a&gt; を node-pty 経由で起動&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="主要機能"&gt;主要機能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ブラウザ自動化&lt;/strong&gt;: Web検索、フォーム入力、データ抽出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ファイル管理&lt;/strong&gt;: フォルダ整理、ファイル名変更、コンテンツベースの分類&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ドキュメント作成&lt;/strong&gt;: レポート作成、要約、メール下書き&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ワークフロー自動化&lt;/strong&gt;: 反復タスクの自動化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="対応-ai-モデル"&gt;対応 AI モデル&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;カテゴリ&lt;/th&gt;
&lt;th&gt;プロバイダー&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;クラウドAPI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic（Claude）、OpenAI、Google AI、xAI、DeepSeek、Moonshot AI 等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;クラウドインフラ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon Bedrock、Azure Foundry、OpenRouter、LiteLLM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ローカル&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ollama、LM Studio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="主張の検証"&gt;主張の検証&lt;/h2&gt;
&lt;h3 id="主張1-claude-codeレベルの-aiエージェント"&gt;主張1: 「Claude Codeレベルの AIエージェント」&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;検証結果: 大幅に誇張&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Theatre.js — GUI でWebアニメーションを直感的に作れるモーションデザインエディタ</title><link>https://hdknr.github.io/blogs/posts/2026/03/theatre.js-gui-%E3%81%A7web%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AB%E4%BD%9C%E3%82%8C%E3%82%8B%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/theatre.js-gui-%E3%81%A7web%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AB%E4%BD%9C%E3%82%8C%E3%82%8B%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/</guid><description>&lt;h1 id="theatrejs--gui-でwebアニメーションを直感的に作れるモーションデザインエディタ"&gt;Theatre.js — GUI でWebアニメーションを直感的に作れるモーションデザインエディタ&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/shiba_program/status/2028787478908502388"&gt;しば（@shiba_program）氏のポスト&lt;/a&gt;が、GUI でWebアニメーションを作成できる JavaScript ライブラリ「Theatre.js」を紹介しています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GUIで直感的にWebアニメーションが作れる「theatre.js」すごいな。編集した内容が即座に反映されるので、これは微調整捗る。GUIで編集できるから、デザイナーに調整任せることもできそう。デモにある高度なものだけでなく、Webサイトで使うシンプルなアニメーションの作成もかなり楽にしてくれるはず
— しば（@shiba_program）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;投稿が注目している「デザイナーに調整を任せられる」という点は、Theatre.js の設計思想の核心です。コードでアニメーション対象を定義し、ブラウザ上の GUI エディタで動きを調整する。このワークフローにより、エンジニアとデザイナーの協業が自然に成立します。&lt;/p&gt;
&lt;h2 id="theatrejs-とは何か"&gt;Theatre.js とは何か&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.theatrejs.com/"&gt;Theatre.js&lt;/a&gt; はフィンランド・ヘルシンキの Theatre.js Oy が開発するオープンソースの Web モーションデザインライブラリです。GitHub Stars 12.2k、1,600以上のプロジェクトが依存しており、Web アニメーション領域で確固たる地位を築いています。&lt;/p&gt;
&lt;h3 id="基本情報"&gt;基本情報&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;開発元&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Theatre.js Oy（ヘルシンキ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apache 2.0（@theatre/core）/ AGPL 3.0（@theatre/studio）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;言語&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript 82.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12.2k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;現バージョン&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.5（1.0 開発中）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;対応技術&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Three.js、React Three Fiber、HTML/SVG、任意のJSライブラリ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="2つのパッケージ構成"&gt;2つのパッケージ構成&lt;/h3&gt;
&lt;p&gt;Theatre.js は2つの独立したパッケージで構成されます。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;パッケージ&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;th&gt;使用場面&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;@theatre/core&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;アニメーション再生エンジン&lt;/td&gt;
&lt;td&gt;開発・本番の両方&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;@theatre/studio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GUI エディタ（シーケンスエディタ、グラフエディタ、プロパティパネル）&lt;/td&gt;
&lt;td&gt;開発時のみ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この分離設計が重要です。Studio は開発時にのみ使い、本番ビルドには core だけを含めます。エディタのコードが本番バンドルに入らないため、パフォーマンスへの影響はありません。&lt;/p&gt;
&lt;h2 id="4つの基本概念"&gt;4つの基本概念&lt;/h2&gt;
&lt;p&gt;Theatre.js には、理解すべき4つの概念があります。&lt;/p&gt;</description></item><item><title>オープンソース AI は「無料」でも「民主化」でもない --- 重みの公開と推論コストの間にある物理法則の壁</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%81%AF%E7%84%A1%E6%96%99%E3%81%A7%E3%82%82%E6%B0%91%E4%B8%BB%E5%8C%96%E3%81%A7%E3%82%82%E3%81%AA%E3%81%84---%E9%87%8D%E3%81%BF%E3%81%AE%E5%85%AC%E9%96%8B%E3%81%A8%E6%8E%A8%E8%AB%96%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E9%96%93%E3%81%AB%E3%81%82%E3%82%8B%E7%89%A9%E7%90%86%E6%B3%95%E5%89%87%E3%81%AE%E5%A3%81/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9-ai-%E3%81%AF%E7%84%A1%E6%96%99%E3%81%A7%E3%82%82%E6%B0%91%E4%B8%BB%E5%8C%96%E3%81%A7%E3%82%82%E3%81%AA%E3%81%84---%E9%87%8D%E3%81%BF%E3%81%AE%E5%85%AC%E9%96%8B%E3%81%A8%E6%8E%A8%E8%AB%96%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E9%96%93%E3%81%AB%E3%81%82%E3%82%8B%E7%89%A9%E7%90%86%E6%B3%95%E5%89%87%E3%81%AE%E5%A3%81/</guid><description>&lt;h1 id="オープンソース-ai-は無料でも民主化でもない--重みの公開と推論コストの間にある物理法則の壁"&gt;オープンソース AI は「無料」でも「民主化」でもない &amp;mdash; 重みの公開と推論コストの間にある物理法則の壁&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/kubotamas/status/2028221922279055737"&gt;@kubotamas 氏が X で共有&lt;/a&gt;した、Anthropic CEO Dario Amodei の発言が議論を呼んでいます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AIのオープンソース化は無料でも民主化でもない。モデルの重みをダウンロードすることは出来ても、実際に推論するのにコストがかかる。AIは従来のオープンソースとは本質的に異なる。重みを手に入れても計算資源がなければ、解釈・改変することはできない。オープン化という約束は物理法則の壁で制限されている&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この投稿は、&lt;a href="https://x.com/r0ck3t23/status/2028182717301493777"&gt;@r0ck3t23 氏（Dustin）のツイート&lt;/a&gt;を引用しています。Dustin 氏は Amodei の動画インタビューから「オープンソース AI は無料ではなかった。一度もそうだったことはない」とまとめ、1,200 以上のいいねを集めました。&lt;/p&gt;
&lt;p&gt;本記事では、この「オープンソース AI の幻想」の構造を掘り下げます。&lt;/p&gt;
&lt;h2 id="amodei-の主張--これは-linux-ではない"&gt;Amodei の主張 &amp;mdash; 「これは Linux ではない」&lt;/h2&gt;
&lt;p&gt;Dario Amodei はインタビューの中で明確に述べています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;It&amp;rsquo;s not free. You have to run it on inference and someone has to make it fast on inference.&amp;rdquo;
（無料ではない。推論を実行する必要があり、誰かがそれを推論で高速にする必要がある）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;This is not Linux. You can&amp;rsquo;t see inside.&amp;rdquo;
（これは Linux ではない。中身は見えない）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;従来のオープンソースソフトウェア &amp;mdash; Linux、PostgreSQL、React &amp;mdash; は、ソースコードを読み、理解し、フォークし、改変できます。ノートパソコン 1 台で動かせます。しかし AI モデルの「重み」は、数百ギガバイトの数値の羅列です。ソースコードのように「読んで理解する」ことはできません。&lt;/p&gt;</description></item><item><title>リクルート新卒研修の React 資料が「無料で最高の教材」と言われる理由</title><link>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AA%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%88%E6%96%B0%E5%8D%92%E7%A0%94%E4%BF%AE%E3%81%AE-react-%E8%B3%87%E6%96%99%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E6%9C%80%E9%AB%98%E3%81%AE%E6%95%99%E6%9D%90%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B%E7%90%86%E7%94%B1/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/%E3%83%AA%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%88%E6%96%B0%E5%8D%92%E7%A0%94%E4%BF%AE%E3%81%AE-react-%E8%B3%87%E6%96%99%E3%81%8C%E7%84%A1%E6%96%99%E3%81%A7%E6%9C%80%E9%AB%98%E3%81%AE%E6%95%99%E6%9D%90%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B%E7%90%86%E7%94%B1/</guid><description>&lt;h1 id="リクルート新卒研修の-react-資料が無料で最高の教材と言われる理由"&gt;リクルート新卒研修の React 資料が「無料で最高の教材」と言われる理由&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://x.com/sigumataityouda/status/2028111546975760640"&gt;sigumataityouda 氏のポスト&lt;/a&gt;が、リクルートの新卒研修資料を「React を語る上で欠かせないもの」「完成度が非常に高い」と紹介しています。リクルートは 2017 年から毎年、新卒エンジニア向け研修資料を無料公開しており、React 研修資料は特に業界で高く評価されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;React語る上で欠かせないものとしてリクルートの新卒研修資料というのもがある。完成度が非常に高い。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="リクルートの-react-研修資料とは"&gt;リクルートの React 研修資料とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://speakerdeck.com/recruitengineers/react-yan-xiu-2024"&gt;React 研修 (2024)&lt;/a&gt; は、リクルートのエンジニアコース新卒研修「BootCamp」で使われている講義資料です。約 170 スライド以上で構成され、Speaker Deck で無料公開されています。&lt;/p&gt;
&lt;h3 id="研修の位置づけ"&gt;研修の位置づけ&lt;/h3&gt;
&lt;p&gt;リクルートの新卒エンジニアは配属前に約 3 ヶ月間の BootCamp を受講します。&lt;a href="https://techblog.recruit.co.jp/article-4635/"&gt;2024 年度は 24 講座以上&lt;/a&gt;が開講されており、React 研修はフロントエンド技術スタックの中核として位置づけられています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;研修カテゴリ&lt;/th&gt;
&lt;th&gt;主な講座&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;フロントエンド&lt;/td&gt;
&lt;td&gt;JavaScript、TypeScript、&lt;strong&gt;React&lt;/strong&gt;、Next.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;バックエンド&lt;/td&gt;
&lt;td&gt;データベース設計、API 設計&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;品質・テスト&lt;/td&gt;
&lt;td&gt;テスト駆動開発（講師: t_wada 氏）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;セキュリティ&lt;/td&gt;
&lt;td&gt;セキュリティ演習&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;テキスト生成 AI 活用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;マインドセット&lt;/td&gt;
&lt;td&gt;ソフトウェアエンジニアとしての姿勢と心構え&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最初の講座「ソフトウェアエンジニアとしての姿勢と心構え」は、技術顧問の t_wada 氏が担当し、「技術の学び方を学ぶ」ことに重点を置いています。&lt;/p&gt;
&lt;h2 id="資料の構成"&gt;資料の構成&lt;/h2&gt;
&lt;p&gt;React 研修資料は 5 つのセクションで構成されています。&lt;/p&gt;
&lt;h3 id="1-web-アプリ開発の変遷"&gt;1. Web アプリ開発の変遷&lt;/h3&gt;
&lt;p&gt;React を学ぶ前に、Web アプリケーション開発がどう進化してきたかを整理します。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;世代&lt;/th&gt;
&lt;th&gt;アーキテクチャ&lt;/th&gt;
&lt;th&gt;特徴&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;第 1 世代&lt;/td&gt;
&lt;td&gt;MPA（クラシック SSR）&lt;/td&gt;
&lt;td&gt;サーバーが HTML を生成、ページ遷移ごとにリロード&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 2 世代&lt;/td&gt;
&lt;td&gt;MPA + jQuery&lt;/td&gt;
&lt;td&gt;DOM 操作で部分的な動的 UI を実現&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 3 世代&lt;/td&gt;
&lt;td&gt;SPA（CSR のみ）&lt;/td&gt;
&lt;td&gt;クライアントで描画、リッチな UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第 4 世代&lt;/td&gt;
&lt;td&gt;SPA（CSR + 事前レンダリング）&lt;/td&gt;
&lt;td&gt;SSR / SSG で初期表示を高速化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この変遷を理解することで、「なぜ React が必要になったのか」という文脈が掴めます。jQuery 時代の命令的 UI と React の宣言的 UI の違いを、歴史的な流れの中で説明しているのが特徴です。&lt;/p&gt;</description></item><item><title>ローカルの開発モックを ngrok で公開し、Backlog Wiki を自動更新するシェルスクリプト</title><link>https://hdknr.github.io/blogs/posts/2026/02/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E9%96%8B%E7%99%BA%E3%83%A2%E3%83%83%E3%82%AF%E3%82%92-ngrok-%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%97backlog-wiki-%E3%82%92%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/02/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E9%96%8B%E7%99%BA%E3%83%A2%E3%83%83%E3%82%AF%E3%82%92-ngrok-%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%97backlog-wiki-%E3%82%92%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/</guid><description>&lt;h1 id="ローカルの開発モックを-ngrok-で公開しbacklog-wiki-を自動更新するシェルスクリプト"&gt;ローカルの開発モックを ngrok で公開し、Backlog Wiki を自動更新するシェルスクリプト&lt;/h1&gt;
&lt;p&gt;レビュー担当者にモックアプリを見せたいとき、毎回「URL 変わりました」と連絡するのが面倒になったので、&lt;strong&gt;ngrok 起動 → Backlog Wiki 自動更新&lt;/strong&gt;を1コマンドで済ませるスクリプトを作りました。&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;社内プロジェクトで React のモックアプリを開発しています。レビュー担当者（非エンジニア）にモック画面を確認してもらう際、以下のような手順を毎回踏んでいました：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;npm run dev&lt;/code&gt; でローカルサーバーを起動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ngrok http 3000&lt;/code&gt; でトンネルを張る&lt;/li&gt;
&lt;li&gt;発行された URL をコピー&lt;/li&gt;
&lt;li&gt;Backlog の Wiki ページを開いて URL を貼り替える&lt;/li&gt;
&lt;li&gt;レビュー担当者に連絡&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ngrok の無料プランでは URL が起動ごとに変わるため、&lt;strong&gt;毎回 Wiki を手動更新する必要がありました&lt;/strong&gt;。これを自動化します。&lt;/p&gt;
&lt;h2 id="スクリプトの全体像"&gt;スクリプトの全体像&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./scripts/serve-public.sh [user:password]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;1コマンドで以下が実行されます：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Vite dev server 起動
↓
ngrok トンネル開通（Basic認証付き）
↓
Backlog Wiki に URL を自動反映
↓
Ctrl+C で全プロセス停止
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="実装のポイント"&gt;実装のポイント&lt;/h2&gt;
&lt;h3 id="1-vite-の起動待ち"&gt;1. Vite の起動待ち&lt;/h3&gt;
&lt;p&gt;Vite dev server はバックグラウンドで起動しますが、すぐには HTTP リクエストを受け付けません。ポーリングで起動完了を待ちます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i in &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;seq &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; 15&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; curl -s -o /dev/null http://localhost:$PORT 2&amp;gt;/dev/null; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; break
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;15秒以内に応答がなければエラーとして終了します。&lt;/p&gt;</description></item><item><title>JAMStack</title><link>https://hdknr.github.io/blogs/posts/2024/09/jamstack/</link><pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/jamstack/</guid><description>&lt;h1 id="jamstack"&gt;JAMStack&lt;/h1&gt;
&lt;h2 id="記事"&gt;記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gini.co.jp/blog/jamstack-vs-wordpress#index_1LgVpQeO"&gt;【徹底比較】Jamstack vs WordPress｜これからのWebはJamstack！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackshare.io/stackups/netlify-vs-wix"&gt;Netlify vs Wix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kinsta.com/jp/blog/react-static-site-generator/"&gt;【2024年版】おすすめのReactベース静的サイトジェネレーター6選&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unicorn-blog.jp/archives/26894"&gt;静的サイトジェネレータについて初心者向けに分かりやすく解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kazuki_tachikawa/items/5a04de1174d30e7b5c0e"&gt;【2024年】Webデザインのトレンド・参考サイトまとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudflare.com/ja-jp/the-net/jamstack-websites/"&gt;JamstackによりWebサイト構築のあり方が一変する可能性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://re-cd.com/blog/2024%E5%B9%B4%E3%81%AEweb%E9%96%8B%E7%99%BA%E6%A5%AD%E7%95%8C%E3%83%88%E3%83%AC%E3%83%B3%E3%83%89%E3%81%A8%E6%9C%80%E6%96%B0%E6%8A%80%E8%A1%93/"&gt;2024年のWeb開発業界トレンドと最新技術&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webdesigning.book.mynavi.jp/cms/100027/"&gt;Jamstackで制作はどう変わる？ 「削減できるもの」と「必要になるもの」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.commte.co.jp/blog/What-is-the-Jamstack"&gt;Jamstack とは何なの？メリットとデメリットはあるの？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.issoh.co.jp/column/details/3121/"&gt;Jamstackとは何か？その意味と重要性について詳しく解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/rsi_dev/articles/0347be46270f90"&gt;JamStack簡単まとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.issoh.co.jp/tech/details/1889/"&gt;Jamstack入門：次世代ウェブ開発のための革新的なアーキテクチャとは何か？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://appmaster.io/ja/blog/2023-uebukai-fa-reda-totsupu10torendo"&gt;2024 年の Web 開発トレンド トップ 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.torat.jp/what-is-jamstack/"&gt;Jamstackとは？パフォーマンスの高いフロントエンド構築&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hakoreco.com/2024/06/11/hakoreco-jamstack/"&gt;Jamstackによるサイト構築について&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://annai.co.jp/article/new-old-jamstack-and-mach-journey-towards-traditional-cms-concepts"&gt;新しい古典：Jamstack と MACH が従来の CMS の概念に向け進化する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codezine.jp/article/detail/15054"&gt;今話題の「ヘッドレスCMS」とは？ Jamstack、マルチデバイスにも対応したCMSの新潮流&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;セキュリティ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cybersecurity-jp.com/column/3928"&gt;【2024年】サイバーセキュリティの現状と今後の方向性&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wordpress"&gt;Wordpress&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=urG5ITacmYU"&gt;Jamstack、ノーコード vs WordPress？　2024年のWeb制作トレンドを予想しよう【おすすめUdemy講座紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ブロックエディタ&lt;/li&gt;
&lt;li&gt;FSE&lt;/li&gt;
&lt;li&gt;Snow Monkey, SWell&lt;/li&gt;
&lt;li&gt;Wordpress + Snow Monkey, Wordpress + Astro&lt;/li&gt;
&lt;li&gt;データ主権&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="マーケットシェア"&gt;マーケットシェア&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Wordpressは 60% (40%など調査主体による)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://w3techs.com/technologies/details/cm-gatsby"&gt;シェア&lt;/a&gt; 0.2% 高トラフィックサイトで利用されている。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="netlify対wix違いは何ですか"&gt;Netlify対Wix:違いは何ですか？&lt;/h2&gt;
&lt;p&gt;はじめに:&lt;/p&gt;
&lt;p&gt;この記事では、NetlifyとWixの主な違いについて説明します。
これらのプラットフォームはさまざまな目的を果たし、Netlifyは人気のあるWeb開発およびホスティングプラットフォームですが、WixはWebサイトビルダーおよびホスティングプラットフォームです。
それらの違いを理解することは、個人や企業がWeb関連のニーズに合った適切なプラットフォームを選択するときに、情報に基づいた決定を行うのに役立ちます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;導入プロセス&lt;/strong&gt;:Netlifyは、開発者がGitを使用してWebサイトを簡単に構築、テスト、および展開できるようにする、最新の合理化された展開プロセスを提供します。
継続的な展開、バージョン管理、ワンクリック展開を提供し、高速で効率的なワークフローを求める開発者に最適です。
一方、Wixは、Webサイトを作成するためのよりユーザーフレンドリーなドラッグアンドドロップインターフェイスを提供します。
これは、技術的な専門知識のない個人に対応する簡略化されたWebサイト構築エクスペリエンスを提供します。&lt;/p&gt;</description></item><item><title>Gatsby レイアウト</title><link>https://hdknr.github.io/blogs/posts/2024/09/gatsby-%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88/</link><pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/gatsby-%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88/</guid><description>&lt;h1 id="gastby-レイアウト"&gt;Gastby レイアウト&lt;/h1&gt;
&lt;h2 id="wrapperjs"&gt;&lt;code&gt;wrapper.js&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Gatsbyの&lt;code&gt;wrapper.js&lt;/code&gt;ファイルは、ページ全体をラップするために使用されるファイルです。
このファイルを使用することで、特定のHTML要素やReactプロバイダーでページをラップすることができます。
これにより、ページ全体に共通のレイアウトや機能を簡単に適用できます。&lt;/p&gt;
&lt;p&gt;例えば、以下のように&lt;code&gt;wrapper.js&lt;/code&gt;ファイルを作成し、ページを特定のコンポーネントでラップすることができます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Layout&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./src/components/Layout&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wrapPageElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ({ &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;props&lt;/span&gt; }) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Layout&lt;/span&gt; {...&lt;span style="color:#a6e22e"&gt;props&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/Layout&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;この例では、&lt;code&gt;Layout&lt;/code&gt;コンポーネントでページ全体をラップしています。これにより、すべてのページに共通のレイアウトが適用されます。&lt;/p&gt;
&lt;p&gt;さらに詳しい情報や具体的な使用例については、&lt;a href="https://www.gatsbyjs.com/plugins/gatsby-plugin-wrap-pages/"&gt;Gatsbyの公式ドキュメント&lt;/a&gt;を参考にすると良いでしょう¹。&lt;/p&gt;
&lt;p&gt;他に知りたいことがあれば教えてくださいね！&lt;/p&gt;
&lt;p&gt;ソース: Copilot との会話、 2024/9/4
(1) gatsby-plugin-wrap-pages | Gatsby. &lt;a href="https://www.gatsbyjs.com/plugins/gatsby-plugin-wrap-pages/"&gt;https://www.gatsbyjs.com/plugins/gatsby-plugin-wrap-pages/&lt;/a&gt;.
(2) Gatsby公式チュートリアルやったよ #JavaScript - Qiita. &lt;a href="https://qiita.com/irico/items/cf87eb29ecaf7e135fcd"&gt;https://qiita.com/irico/items/cf87eb29ecaf7e135fcd&lt;/a&gt;.
(3) Gatsby.js 入門 - Zenn. &lt;a href="https://zenn.dev/dev8/articles/gatsby_tutorial"&gt;https://zenn.dev/dev8/articles/gatsby_tutorial&lt;/a&gt;.
(5) en.wikipedia.org. &lt;a href="https://en.wikipedia.org/wiki/Gatsby_(software)"&gt;https://en.wikipedia.org/wiki/Gatsby_(software)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;wrapper.js:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Layout&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;./layout&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wrapPageElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ({ &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt; }) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Layout&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/Layout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;layout.js:&lt;/p&gt;</description></item><item><title>React</title><link>https://hdknr.github.io/blogs/posts/2024/09/react/</link><pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2024/09/react/</guid><description>&lt;h1 id="react"&gt;React&lt;/h1&gt;
&lt;h2 id="reactdomrender"&gt;&lt;code&gt;ReactDOM.render&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;React 18以降では、&lt;code&gt;ReactDOM.render&lt;/code&gt;は非推奨となり、代わりに&lt;code&gt;createRoot&lt;/code&gt;を使用することが推奨されています。以下に新しい方法の例を示します。&lt;/p&gt;
&lt;p&gt;まず、&lt;code&gt;react-dom/client&lt;/code&gt;から&lt;code&gt;createRoot&lt;/code&gt;をインポートします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;createRoot&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;react-dom/client&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;App&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./App&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createRoot&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;StrictMode&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;App&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/React.StrictMode&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;このコードでは、&lt;code&gt;createRoot&lt;/code&gt;を使用してルートを作成し、そのルートに対して&lt;code&gt;render&lt;/code&gt;メソッドを呼び出しています。これにより、React 18の新しいレンダリングAPIを利用することができます¹²。&lt;/p&gt;</description></item><item><title>Puppeteer</title><link>https://hdknr.github.io/blogs/posts/2023/05/puppeteer/</link><pubDate>Tue, 23 May 2023 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2023/05/puppeteer/</guid><description>&lt;h2 id="puppeteer"&gt;Puppeteer&lt;/h2&gt;
&lt;p&gt;Puppeteer とヘッドレス Chrome を使って React の SPA サイトをクロールするためのスクリプトを記述するには、以下のようなコードを記述することができます ¹。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;puppeteer&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;puppeteer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;launch&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;newPage&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// SPA のページ遷移を待つ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;waitForNavigation&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;waitUntil&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;networkidle0&amp;#34;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// スクリーンショットを撮る
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;screenshot&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;example.png&amp;#34;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上記のコードでは、Puppeteer を使ってブラウザを起動し、指定した URL にアクセスしています。その後、SPA のページ遷移が完了するまで待機し、スクリーンショットを撮影しています。必要に応じて、このコードを改良していただければと思います。&lt;/p&gt;</description></item></channel></rss>