[{"data":1,"prerenderedAt":629},["ShallowReactive",2],{"article-2026-my-app-stack":3,"articles-[]":456,"article-toc:\u002Farticles\u002F2026\u002Fmy-app-stack\u002F":596,"article:\u002Farticles\u002F2025\u002Fcloudflare-workers-cache-layer\u002F":621,"article:\u002Farticles\u002F2025\u002Fcapacitor\u002F":623,"article:\u002Farticles\u002F2025\u002Fmy-oss-projects\u002F":625,"article:\u002Farticles\u002F2025\u002Fhosting-storybook\u002F":627},{"id":4,"title":5,"alt":5,"body":6,"category":441,"cover":442,"createDate":443,"description":444,"extension":445,"homepage":446,"meta":447,"navigation":446,"path":449,"recommend":446,"seo":450,"showCover":446,"slug":451,"stem":452,"tag":453,"updated":454,"__hash__":455},"articles\u002Farticles\u002F2026\u002Fmy-app-stack.md","2年半のフルプラットフォーム開発について全部書く",{"type":7,"value":8,"toc":413},"minimark",[9,18,21,24,29,32,40,44,52,59,62,68,71,74,77,80,83,86,89,92,95,98,104,108,114,118,121,125,128,141,144,147,161,164,170,173,176,179,182,193,196,200,203,206,209,212,215,218,221,224,231,234,240,243,247,250,253,257,260,263,266,269,289,292,295,298,301,304,307,311,314,317,320,323,326,329,333,336,339,343,347,350,358,361,365,368,371,374,377,380,383,386,389,392,395,398,401,404,407,410],[10,11,12,13,17],"p",{},"2年半前、人生で一番大変だった ",[14,15,16],"del",{},"追い詰められた"," プロジェクトが終わりました。",[10,19,20],{},"少しだけ時間に余裕ができたので、個人で運用していたWebアプリをリプレイスすることにしました。",[10,22,23],{},"そしてあれこれ試行錯誤していたら、2年半経っていました。",[25,26,28],"h2",{"id":27},"なにを作った","なにを作った?",[10,30,31],{},"Webアプリをたくさん作り、見込みがありそうなものをスマホ・デスクトップと、別のプラットフォームに移植していきました。",[10,33,34,35,39],{},"例えば、",[36,37,38],"strong",{},"ポモドーロツリー"," というアプリを作ったのですが、これはWeb、スマホ、デスクトップ全てのプラットフォームでリリースしています。",[41,42],"link-card-content",{"title":38,"url":43},"https:\u002F\u002Fpomodorotree.com\u002Fja",[10,45,46],{},[47,48],"img",{"src":49,"alt":50,"loading":51},"https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fv1712091289\u002Fmy-web-app-stack_0040_ilnjir.webp","my-web-app-stack_0040","lazy",[10,53,54,55,58],{},"他にも ",[36,56,57],{},"ひらめき開発"," というサイトを運用しています。",[41,60],{"title":57,"url":61},"https:\u002F\u002Fhirameki.dev",[10,63,64],{},[47,65],{"src":66,"alt":67,"loading":51},"https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fv1712091289\u002Fmy-web-app-stack_0050_smyn2r.webp","my-web-app-stack_0050",[10,69,70],{},"当時、興味のあった心理学(ひらめき)と、プログラミング(開発)のツールを配信するサイトとして始めました。",[10,72,73],{},"今思うと小っ恥ずかしいネーミングです。笑",[10,75,76],{},"しかも心理学のツールは全く伸びなかったので全部削除してしまいました。月間のPVはピーク時で8万PVくらいでした。",[25,78,79],{"id":79},"知見をまとめた",[10,81,82],{},"2年半経ってノウハウが貯まってきたので、一度まとめることにしました。",[10,84,85],{},"以下、目次です。とても長いです。興味のあるところから読んでもらって大丈夫です。",[87,88],"article-toc-content",{},[25,90,91],{"id":91},"アーキテクチャ",[10,93,94],{},"アプリをたくさん作るために、アプリを柔軟に開発・配信できる基盤をゼロから作りました。",[10,96,97],{},"以下はメイン部分の大まかな構成図です。",[10,99,100],{},[47,101],{"src":102,"alt":103,"loading":51},"https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fv1712091289\u002Fmy-web-app-stack_0020_r6biiy.webp","my-web-app-stack_0020",[105,106,107],"h3",{"id":107},"キャッシュ戦略",[109,110],"article-card-content",{"align":111,"maxWidthClass":112,"path":113},"left","max-w-xs","\u002Farticles\u002F2025\u002Fcloudflare-workers-cache-layer\u002F",[105,115,117],{"id":116},"github-packagesでプライベートコードの共通化","GitHub Packagesでプライベートコードの共通化",[10,119,120],{},"公開したくないけど、共通化したいコードはGitHub Packagesから配信しています。npmでプライベートパッケージを配信しようとすると課金する必要があります。GitHub Packagesは無料で始められるのでオススメです。",[105,122,124],{"id":123},"バックエンドにhonoを使ってみる","バックエンドにHonoを使ってみる",[10,126,127],{},"バックエンドのAPIは用途によって、いくつかのサービスを使って構築しています。",[129,130,131,135,138],"ul",{},[132,133,134],"li",{},"Cloudflare Workers",[132,136,137],{},"Firebase Functions",[132,139,140],{},"AWS Lambda",[10,142,143],{},"そんな中、「NextのバックエンドにHonoを使う」という記事を読みました。Nextで出来るのであれば、Nuxtでもできるのでは?と思いやってみました。",[10,145,146],{},"HonoでAPIを作っておけば、かなり簡単にインフラサービスを移動できるので安心ですね。",[129,148,149,151,153,155],{},[132,150,134],{},[132,152,137],{},[132,154,140],{},[132,156,157,158],{},"Nuxt(Cloud Run) ",[36,159,160],{},"←New!",[25,162,163],{"id":163},"開発フロー",[10,165,166],{},[47,167],{"src":168,"alt":169,"loading":51},"https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fv1712091289\u002Fmy-web-app-stack_0010_haxrx4.webp","my-web-app-stack_0010",[105,171,172],{"id":172},"モノレポで全コードを一つのリポジトリで管理",[10,174,175],{},"基本的にコードをモノレポで管理しています。",[10,177,178],{},"モノレポとはプロジェクトに関するコードを全て一つのGitリポジトリで管理する方法です。",[10,180,181],{},"例えば、フロントエンド、バックエンドの両コードと一つのGitベースで管理しています。モノレポで管理するとそのアプリに関するコードが一つにまとまっているのでコードが迷子になることがなくて便利でした。",[183,184,189],"pre",{"className":185,"code":187,"language":188},[186],"language-text","repository\n├── backend\n├── desktop\n├── frontend\n└── mobile\n","text",[190,191,187],"code",{"__ignoreMap":192},"",[10,194,195],{},"こんな感じのディレクトリ構成になります。",[197,198,199],"h4",{"id":199},"モノレポとバイブコーディングは相性が良い",[10,201,202],{},"また、2025年ごろからバイブコーディングが広まっていくにつれて、モノレポにしていて良かったと思うことが増えました。",[10,204,205],{},"例えば、フロントエンドからバックエンドのAPIを呼び出す時に、バックエンドのコードを直接確認してもらいながらAIにコーディングをお願いできます。",[10,207,208],{},"仕様を別途伝える必要がないので楽でした。",[105,210,211],{"id":211},"ステージング環境で確認してから本番環境へ",[10,213,214],{},"変更したコードはまず、stagingブランチにコミットします。その後、pushするとGitHub Actionsでステージング環境にデプロイされます。",[10,216,217],{},"ステージング環境で確認して問題なければ、mainブランチにマージします。そうするとまたGitHub Actionsが走って本番環境にデプロイされます。",[10,219,220],{},"必ずステージング環境を経てから本番環境にデプロイすることでバグが入り込むのをできるだけ防いでいました。",[105,222,223],{"id":223},"コードは小さく変更する",[10,225,226,227,230],{},"Gitのブランチ戦略である ",[36,228,229],{},"トランクベース開発"," を参考に、コードを小さい単位で変更しています。GitHub Actionsで自動デプロイを組むことですぐに本番環境に変更を反映します。",[10,232,233],{},"コミット履歴を確認してみると2年半で3,600回コミットしていました。モノレポなのも相まってとてもたくさんコミットしていました。",[10,235,236],{},[47,237],{"src":238,"alt":239,"loading":51},"https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fv1712091289\u002Fmy-web-app-stack_0030_k8euuu.webp","my-web-app-stack_0030",[10,241,242],{},"私は今回の開発で、このコードデリバリーの仕組みを考えるのがとても好きになりました。",[41,244],{"title":245,"url":246},"DORA | Capabilities: Trunk-based development","https:\u002F\u002Fdora.dev\u002Fcapabilities\u002Ftrunk-based-development\u002F",[10,248,249],{},"ソフトウェア開発の生産性について研究しているDORAのサイトには他にもたくさん、生産性向上のヒントが載っているのでオススメです。DORAはGoogle Cloudが母体みたいですね。",[25,251,252],{"id":252},"改善活動",[105,254,256],{"id":255},"lighthouseのスコア改善","Lighthouseのスコア改善",[10,258,259],{},"ある程度、アクセス数が増えてきてから、Lighthouseのスコア改善に取り組みました。",[10,261,262],{},"アクセス数の多いページから改善していくことでコスパ良く改善していきます。その甲斐あって、アクセス数の多いページはさらに大きなキーワードで1位を取れるようになりました。",[10,264,265],{},"Lighthouseのスコア自体は検索順位に影響しないらしいので、体験が良くなった結果検索順位も向上したのだと思います。",[267,268],"twitter-widget-loader-content",{},[270,271,274,284,285],"blockquote",{"className":272},[273],"twitter-tweet",[10,275,278,279],{"lang":276,"dir":277},"ja","ltr","最近はNuxtのパフォーマンスのチューニングを頑張っています ",[280,281,283],"a",{"href":282},"https:\u002F\u002Ft.co\u002Fqw9S6AAt7L","pic.twitter.com\u002Fqw9S6AAt7L","— かい (@takasqr) ",[280,286,288],{"href":287},"https:\u002F\u002Ftwitter.com\u002Ftakasqr\u002Fstatus\u002F1976935807836357088?ref_src=twsrc%5Etfw","October 11, 2025",[105,290,291],{"id":291},"スマホアプリ化",[10,293,294],{},"Webサイトのアプリ部分をコンポーネントに切り出して、スマホアプリにしてリリースしました。iOS、Android両方のプラットフォームでリリースしています。",[10,296,297],{},"Capacitorという、WebViewを使うタイプのフレームワークを使っています。Vueコンポーネントがスマホアプリとして動いているのは面白かったです。",[10,299,300],{},"詳しくはこっちの記事に書きました。",[109,302],{"align":111,"maxWidthClass":112,"path":303},"\u002Farticles\u002F2025\u002Fcapacitor\u002F",[25,305,306],{"id":306},"おまけ",[105,308,310],{"id":309},"便利ツールをossプロジェクトに","便利ツールをOSSプロジェクトに",[10,312,313],{},"開発していく中で作った便利ツールや共通化できるコードはOSSプロジェクトとして切り出していきました。",[10,315,316],{},"詳しくはこっちの記事に書いています。",[109,318],{"align":111,"maxWidthClass":112,"path":319},"\u002Farticles\u002F2025\u002Fmy-oss-projects\u002F",[10,321,322],{},"こっちはVueのUIライブラリのStorybookダッシュボードを公開した時の記事です。",[109,324],{"align":111,"maxWidthClass":112,"path":325},"\u002Farticles\u002F2025\u002Fhosting-storybook\u002F",[10,327,328],{},"UIライブラリを開発するにあたっては、以前Vuetifyを使い込んでいた経験がとても役に立ちました。使いやすい汎用的なインターフェースを考えて実装しました。",[105,330,332],{"id":331},"開発知識はzennに","開発知識はZennに",[10,334,335],{},"他にも開発する中で溜まった知見はZennに書いています。よかったら覗いてみてください。",[10,337,338],{},"確認したら記事が178本ありました。",[41,340],{"title":341,"url":342},"takasqrさんの記事一覧 | Zenn","https:\u002F\u002Fzenn.dev\u002Ftakasqr",[105,344,346],{"id":345},"うまくいかなったことやらなかったこと","うまくいかなったこと・やらなかったこと",[10,348,349],{},"うまくいかなったこと、やらなかったことも書いておきます。",[129,351,352,355],{},[132,353,354],{},"多言語対応",[132,356,357],{},"ダークモード対応",[10,359,360],{},"この2つはうまくいきませんでした。",[197,362,364],{"id":363},"_20もの言語に対応させたけどうまくいかなかった多言語対応","20もの言語に対応させたけどうまくいかなかった多言語対応",[10,366,367],{},"多言語対応は「作ってるアプリはツールアプリが大半だし、生成AIも登場して精度もすごく良くなってきているから行けるんじゃないか」と思ってやり始めました。",[10,369,370],{},"ちょうどGhatGPTが出てきて、その翻訳精度の高さが騒がれている時です。",[10,372,373],{},"日本語から英語に翻訳して、英語からその他の言語に変換するという方法でWebアプリの多言語対応を進めていきました。",[10,375,376],{},"対応させた言語は、日本語も含めてなんと20言語。世界中のかなりの人をカバーできる数です。",[10,378,379],{},"ですが、ほとんどアクセスを集めることができずに日本語のみに戻してしまいました。定かではありませんが、やっぱり微妙に違和感がある翻訳になってしまっていたのではないかと思います。",[10,381,382],{},"また、英語以外の言語は全く読めないので、日本語に逆翻訳してチェックしていたのですが、調子に乗って20言語にも対応させてしまったので作業負担が大き過ぎました。",[10,384,385],{},"ただ、今ならClaude Codeなどのバイブコーディングツールもあるし、生成AIの翻訳精度もさらに向上しているのでまた違った結果になるかも知れません。",[197,387,388],{"id":388},"労力の割にメリットが少ないダークモード対応",[10,390,391],{},"ダークモード対応もうまくいきませんでした。",[10,393,394],{},"これも多言語対応と同じく、労力にメリットが見合わないと感じてしまい断念しました。",[10,396,397],{},"かなりたくさん作ってしまた後に作業を始めたのが失敗でした。",[10,399,400],{},"ダークモード対応させるなら初めから対応させるべきだったと学びました。",[25,402,403],{"id":403},"さいごに",[105,405,406],{"id":406},"色々やってみることでスキルアップに繋がる",[10,408,409],{},"2年半、完全に独学、自力でここまで色々できたことは自分の中で自信につながりました。これからも手を動かしていきたいと思います。",[10,411,412],{},"私は普段から仕事で使う技術をプライベートで遊んでみるようにしています。そうすることで躓きポイントや全体的な雰囲気を事前に知っておくことができるのでオススメです。",{"title":192,"searchDepth":414,"depth":414,"links":415},2,[416,417,418,424,429,433,438],{"id":27,"depth":414,"text":28},{"id":79,"depth":414,"text":79},{"id":91,"depth":414,"text":91,"children":419},[420,422,423],{"id":107,"depth":421,"text":107},3,{"id":116,"depth":421,"text":117},{"id":123,"depth":421,"text":124},{"id":163,"depth":414,"text":163,"children":425},[426,427,428],{"id":172,"depth":421,"text":172},{"id":211,"depth":421,"text":211},{"id":223,"depth":421,"text":223},{"id":252,"depth":414,"text":252,"children":430},[431,432],{"id":255,"depth":421,"text":256},{"id":291,"depth":421,"text":291},{"id":306,"depth":414,"text":306,"children":434},[435,436,437],{"id":309,"depth":421,"text":310},{"id":331,"depth":421,"text":332},{"id":345,"depth":421,"text":346},{"id":403,"depth":414,"text":403,"children":439},[440],{"id":406,"depth":421,"text":406},"other","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_72_bold:フルプラットフォーム開発について全部書く,co_rgb:fff,w_720,c_fit\u002Fv1712091289\u002Fogp_my-web-app-stack_ztafxo.webp","2026\u002F04\u002F08","2年半前、人生で一番追い詰められたプロジェクトが終わりました。少しだけ時間に余裕ができたので、個人で運用していたWebアプリをリプレイスすることにしました。そしてあれこれ試行錯誤していたら、2年半経っていました。やりたかった事を一通りやり切ることができたので、こだわり部分を紹介します。","md",true,{"draft":448},"実績PV数\n\nサイトの前身はWordPress + Vue\n\n## 毎日コミット\n\n## 段階的に価値を届ける\n\n## GitHub Actionsで自動デプロイ\n\n## アプリのアイデアの拾い方\n\n## アナリティクス\n\n## OGPデザイン\n\n## 開発環境 AIとの付き合い方\n\n## Nuxt\n\n## Cloud Run\n\nhttps:\u002F\u002Fdora.dev\u002F\n\n## 検索流入\n\n## SEOでわかったこと\n\n## Nuxt Contentマークダウンでコンテンツ管理\n\n## Tailwind UI\n\n> アクセス数の多いページから改善していくことでコスパ良く改善していきます。その甲斐あって、アクセス数の多いページはさらに大きなキーワードで1位を取れるようになりました。\n本当か調べる\n\nデザインシステム\n\nタイポグラフィ\nnoteなどを参考にした\n\n他にも __スマホアプリ化したり__ 、UIキットや便利ツールを __OSSに切り出したり__ しました。\n","\u002Farticles\u002F2026\u002Fmy-app-stack",{"title":5,"description":444},"my-app-stack","articles\u002F2026\u002Fmy-app-stack",[],null,"fJh32DsJtWJYUl1bPXtZzDZdD8lEuz5kExoCbVaY4Ts",{"items":457,"total":595},[458,462,470,476,483,491,498,506,513,523,533,540,547,556,563,571,581,588],{"_path":459,"title":5,"description":444,"cover":442,"alt":5,"category":441,"categoryBasePath":460,"tags":461,"createDate":443,"homepage":446,"recommend":446,"showCover":446,"lang":276},"\u002Farticles\u002F2026\u002Fmy-app-stack\u002F","\u002Farticles\u002Fcategory\u002Fother\u002F",[],{"_path":463,"title":464,"description":465,"cover":454,"alt":454,"category":192,"categoryBasePath":466,"tags":467,"createDate":468,"homepage":469,"recommend":469,"showCover":469,"lang":276},"\u002Farticles\u002F2026\u002Fthe-goal\u002F","『ザ・ゴール ― 企業の究極の目的とは何か』を読んだ","「ザ・ゴール ― 企業の究極の目的とは何か」を読みました。","\u002Farticles\u002Fcategory\u002F",[],"2026\u002F02\u002F10",false,{"_path":471,"title":472,"description":473,"cover":454,"alt":454,"category":192,"categoryBasePath":466,"tags":474,"createDate":475,"homepage":469,"recommend":469,"showCover":469,"lang":276},"\u002Farticles\u002F2026\u002Ftidy-first\u002F","『Tidy First? ―個人で実践する経験主義的ソフトウェア設計』を読んだ","「Tidy First? ―個人で実践する経験主義的ソフトウェア設計」を読んだ。",[],"2026\u002F01\u002F31",{"_path":303,"title":477,"description":192,"cover":478,"alt":477,"category":479,"categoryBasePath":480,"tags":481,"createDate":482,"homepage":446,"recommend":446,"showCover":446,"lang":276},"Vueでスマホアプリ開発【Capacitor】","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_title_cover_001_lu3vq4\u002Fl_title_cover_001_lu3vq4\u002Fl_text:MPLUS1p-Black.ttf_88_bold:Vue.jsで%0Aスマホアプリ%0A開発,co_rgb:374151,w_720,c_fit\u002Fv1712091289\u002Fthumbnail__003_prznvl.webp","vuejs","\u002Farticles\u002Fcategory\u002Fvuejs\u002F",[],"2025\u002F12\u002F27",{"_path":484,"title":485,"description":486,"cover":487,"alt":485,"category":441,"categoryBasePath":460,"tags":488,"createDate":489,"updated":490,"homepage":469,"recommend":469,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Fthe-land-of-playful-fellows\u002F","紅白もちのひみつ『めっきらもっきら どおん どん』","奥さんに言われて「はっ」としました。もんもんびゃっこ達は赤いおもちを食べていて、かんたは白いおもち。これはなんらかの意味がこめられてるのでは？と思い考えてみました。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fv1712091289\u002Fthe-land-of-playful-fellows_vgkvsf",[],"2025\u002F12\u002F20","2025\u002F12\u002F22",{"_path":492,"title":493,"description":494,"cover":495,"alt":493,"category":441,"categoryBasePath":460,"tags":496,"createDate":497,"updated":497,"homepage":446,"recommend":446,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Fpixel-astrophotography\u002F","星空写真をAndroid Pixelでキレイに撮る","キャンプ場での夜空はやっぱりキレイでした。星がよく見れます。肉眼で見れるこのキレイな星空を写真に残せたら嬉しいなーと思いながら、タイマーが終わるのを待ちます。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_title_cover_001_lu3vq4\u002Fl_title_cover_001_lu3vq4\u002Fl_text:MPLUS1p-Black.ttf_88_bold:星空写真を%0APixelで%0Aキレイに撮る,co_rgb:374151,w_720,c_fit\u002Fv1712091289\u002Fpixel-astrophotography",[],"2025\u002F09\u002F29",{"_path":325,"title":499,"description":500,"cover":501,"alt":499,"category":502,"categoryBasePath":503,"tags":504,"createDate":505,"updated":505,"homepage":446,"recommend":446,"showCover":446,"lang":276},"Storybookのダッシュボードを公開する","以前から Vue の UI ライブラリを Storybook を使って作っていました。その UI ライブラリの Storybook を静的サイトにビルドしてホスティングしてみました。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_88_bold:Storybookの%0Aダッシュボードを%0A公開する,co_rgb:fff,w_720,c_fit\u002Fv1712091289\u002Fcover_2025_rpwog8.png","storybook","\u002Farticles\u002Fcategory\u002Fstorybook\u002F",[],"2025\u002F05\u002F28",{"_path":507,"title":508,"description":509,"cover":510,"alt":508,"category":441,"categoryBasePath":460,"tags":511,"createDate":512,"updated":512,"homepage":469,"recommend":469,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Fmemo\u002F","メモは脳の排水","紙、デジタルどちらでもなんでもメモに書き出します。書き出すことで考えが整理され、ネタ帳になってくれるので重宝しています。この「脳の排水」という言葉にグッときました。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_88_bold:メモは脳の排水,co_rgb:fff,w_720,c_fit\u002Fv1712091289\u002Fcover_2025_rpwog8.png",[],"2025\u002F05\u002F27",{"_path":514,"title":515,"description":516,"cover":517,"alt":515,"category":518,"categoryBasePath":519,"tags":520,"createDate":522,"updated":522,"homepage":446,"recommend":446,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Fa2a-guide\u002F","A2A 試してみた","A2AとはAIエージェントとAIエージェントが連携するための規格です。Googleが2025年4月に発表しました。Googleのサンプルコードを動かしてみます。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_88_bold:A2A 試してみた,co_rgb:fff,w_720,c_fit\u002Fv1712091289\u002Fcover_2025_rpwog8.png","ai","\u002Farticles\u002Fcategory\u002Fai\u002F",[521],"AI","2025\u002F05\u002F01",{"_path":524,"title":525,"description":526,"cover":527,"alt":525,"category":528,"categoryBasePath":529,"tags":530,"createDate":531,"updated":532,"homepage":446,"recommend":446,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Fdify-self-hosted-guide\u002F","Dify をセルフホストで立ち上げる","Dify をセルフホストで立ち上げる機会があったので、手順を紹介します。Dify（ディファイ）は、AIアプリを簡単に開発できるオープンソースのプラットフォームです。クラウド版とセルフホスト版があります。今回は Dify をセルフホストで立ち上げてみます。公式と同じ手順で実行する。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_88_bold:Dify を%0Aセルフホストで%0A立ち上げる,co_rgb:fff,w_720,c_fit\u002Fv1712091289\u002Fcover_2025_rpwog8.png","dify","\u002Farticles\u002Fcategory\u002Fdify\u002F",[],"2025\u002F04\u002F29","2025-04-29",{"_path":534,"title":535,"description":536,"cover":537,"alt":535,"category":441,"categoryBasePath":460,"tags":538,"createDate":539,"updated":539,"homepage":469,"recommend":469,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Fphysical-bookstore\u002F","リアル書店の選書体験","今回で改めて書店の良さに気付けたのが良かったです。ただ、ネット通販や電子書籍には手軽に買えるなど別の良さがあると思ってます。なのでうまく使い分けていきたいです。","https:\u002F\u002Fasset.hirameki.dev\u002Fimg%2Fblog%2Fjournal%2F2025%2F20250425%2F20250425_010.webp?alt=media",[],"2025\u002F04\u002F25",{"_path":541,"title":542,"description":543,"cover":544,"alt":542,"category":518,"categoryBasePath":519,"tags":545,"createDate":546,"updated":546,"homepage":446,"recommend":446,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Fcline-guide\u002F","Cline やってみた","Clineは自分自身でコマンドを実行できるようになっています。暴走しても被害がコンテナの中だけで済むようにDevContainersを使って今回試してみました。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_88_bold:Cline%20やってみた,co_rgb:fff,w_720,c_fit\u002Fv1712091289\u002Fcover_2025_rpwog8.png",[521],"2025\u002F04\u002F16",{"_path":319,"title":548,"description":549,"cover":550,"alt":548,"category":551,"categoryBasePath":552,"tags":553,"createDate":555,"updated":555,"homepage":446,"recommend":469,"showCover":446,"lang":276},"今まで作った OSS プロジェクト","今まで、いくつか OSS プロジェクトを作ってきたので紹介します。番外編まで含めると全部で5つあります。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_88_bold:今まで作った%0AOSS%20プロジェクト,co_rgb:fff,w_720,c_fit\u002Fv1712091289\u002Fcover_2025_rpwog8.png","oss","\u002Farticles\u002Fcategory\u002Foss\u002F",[554],"OSS","2025\u002F04\u002F02",{"_path":557,"title":558,"description":559,"cover":560,"alt":558,"category":441,"categoryBasePath":460,"tags":561,"createDate":562,"updated":562,"homepage":446,"recommend":446,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Fbuilt-custom-keyboard\u002F","キーボードを自作した","ずっと興味のあった自作キーボードに挑戦した記録で、遊舎工房でキットやキーキャップを選び、秋葉原で工具を買い、久しぶりのはんだ付けに苦戦しながら完成させました。","https:\u002F\u002Fasset.hirameki.dev\u002Fimg%2Fblog%2Fjournal%2F2025%2F20250309_built-custom-keyboard%2F20250309_built-custom-keyboard_010.webp?alt=media",[],"2025\u002F03\u002F09",{"_path":113,"title":564,"description":565,"cover":566,"alt":564,"category":567,"categoryBasePath":568,"tags":569,"createDate":570,"updated":570,"homepage":446,"recommend":446,"showCover":446,"lang":276},"Cloudflare Workers でキャッシュ層を作る","画像サーバーの前段に Cloudflare Workers でキャッシュ層を作ったら転送量が大幅に減ったので記録です。やりかたです。1. 以下のコードで Workers を作りカスタムドメインを当てる。2. ソースコードの URL を Workers に割り当てたドメインに変更する。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_88_bold:Cloudflare Workers で%0Aキャッシュ層を%0A作る,co_rgb:fff,w_720,c_fit\u002Fv1712091289\u002Fcover_2025_rpwog8.png","web","\u002Farticles\u002Fcategory\u002Fweb\u002F",[],"2025\u002F02\u002F23",{"_path":572,"title":573,"description":574,"cover":575,"alt":573,"category":576,"categoryBasePath":577,"tags":578,"createDate":579,"updated":580,"homepage":446,"recommend":469,"showCover":446,"lang":276},"\u002Farticles\u002F2022\u002Flearn-programming\u002F","プログラミング勉強のコツを調べてみた","エラーに対する態度は3パターンあります。上達が早いのはもちろん3番目のパターンです。事前に知っておくことで、エラーに直面した時に少し落ち着いて対処できそうです。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_title_cover_001_lu3vq4\u002Fl_title_cover_001_lu3vq4\u002Fl_text:MPLUS1p-Black.ttf_88_bold:プログラミング%0A勉強のコツを%0A調べてみた,co_rgb:374151,w_720,c_fit\u002Fv1642574453\u002Falfons-morales-YLSwjSy7stw-unsplash_2_1_xnt6z7.png","programming","\u002Farticles\u002Fcategory\u002Fprogramming\u002F",[],"2022\u002F05\u002F23","2025\u002F02\u002F12",{"_path":582,"title":583,"description":584,"cover":585,"alt":583,"category":441,"categoryBasePath":460,"tags":586,"createDate":587,"updated":587,"homepage":446,"recommend":446,"showCover":446,"lang":276},"\u002Farticles\u002F2025\u002Flearn-9-years\u002F","９年間、毎日プログラミングの勉強をしてる話","仕事から帰ってきて、ご飯食べたりお風呂に入って、一息ついたらパソコンにむかって12時まで作業する。初めはビジネス書とか経済の本を読んだりしてた。それから9年経った。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_title_cover_001_lu3vq4\u002Fl_title_cover_001_lu3vq4\u002Fl_text:MPLUS1p-Black.ttf_88_bold:９年間、毎日%0Aプログラミングの勉強をしてる話,co_rgb:374151,w_720,c_fit\u002Fv1712091289\u002Fthumbnail__001_tdrr4g.webp",[],"2025\u002F02\u002F10",{"_path":589,"title":590,"description":591,"cover":592,"alt":590,"category":441,"categoryBasePath":460,"tags":593,"createDate":594,"updated":594,"homepage":469,"recommend":446,"showCover":446,"lang":276},"\u002Farticles\u002F2021\u002Fstudy-5-years\u002F","5年間ほぼ毎日プログラミングの勉強をするためにやったこと","人生の節目で一時的に勉強してない時期もありました。ですが、それ以外のほとんどの期間で毎日プログラミングを勉強しています。楽しいので、あまり勉強と思っていませんが。","https:\u002F\u002Fimage.hirameki.dev\u002Ftakasqr\u002Fimage\u002Fupload\u002Fl_text:MPLUS1p-Black.ttf_88_bold:5年間ほぼ毎日%0Aプログラミングの%0A勉強をする為に%0Aやったこと,co_rgb:fff,w_720,c_fit\u002Fv1642574453\u002Faaron-burden-QJDzYT_K8Xg-unsplash_1_xaxykh.png",[],"2021\u002F08\u002F01",18,[597,598,599,604,609,613,618],{"id":27,"depth":414,"text":28},{"id":79,"depth":414,"text":79},{"id":91,"depth":414,"text":91,"children":600},[601,602,603],{"id":107,"depth":421,"text":107},{"id":116,"depth":421,"text":117},{"id":123,"depth":421,"text":124},{"id":163,"depth":414,"text":163,"children":605},[606,607,608],{"id":172,"depth":421,"text":172},{"id":211,"depth":421,"text":211},{"id":223,"depth":421,"text":223},{"id":252,"depth":414,"text":252,"children":610},[611,612],{"id":255,"depth":421,"text":256},{"id":291,"depth":421,"text":291},{"id":306,"depth":414,"text":306,"children":614},[615,616,617],{"id":309,"depth":421,"text":310},{"id":331,"depth":421,"text":332},{"id":345,"depth":421,"text":346},{"id":403,"depth":414,"text":403,"children":619},[620],{"id":406,"depth":421,"text":406},{"_path":113,"title":564,"description":565,"cover":566,"alt":564,"category":567,"categoryBasePath":568,"tags":622,"createDate":570,"updated":570,"homepage":446,"recommend":446,"showCover":446,"lang":276},[],{"_path":303,"title":477,"description":192,"cover":478,"alt":477,"category":479,"categoryBasePath":480,"tags":624,"createDate":482,"updated":-1,"homepage":446,"recommend":446,"showCover":446,"lang":276},[],{"_path":319,"title":548,"description":549,"cover":550,"alt":548,"category":551,"categoryBasePath":552,"tags":626,"createDate":555,"updated":555,"homepage":446,"recommend":469,"showCover":446,"lang":276},[554],{"_path":325,"title":499,"description":500,"cover":501,"alt":499,"category":502,"categoryBasePath":503,"tags":628,"createDate":505,"updated":505,"homepage":446,"recommend":446,"showCover":446,"lang":276},[],1776498755548]