[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-PNq5wx1vUeCH":3,"adjacent-PNq5wx1vUeCH":380},{"id":4,"title":5,"content":6,"summary":361,"charCount":362,"eyecatch":13,"tags":363,"is_no_index":376,"publishedAt":377,"createdAt":378,"updatedAt":379},"PNq5wx1vUeCH","Workers Tech Talks #8を見て思ったこと",{"type":7,"content":8},"doc",[9,18,23,31,35,39,43,48,52,56,60,64,71,77,84,88,93,100,104,108,112,116,120,127,131,135,139,143,147,152,156,160,164,171,175,179,183,187,191,196,200,204,208,215,228,232,236,243,250,254,258,262,266,270,274,279,286,290,294,298,302,306,310,314,318,322,327,331,338,342,346,350,357],{"type":10,"attrs":11,"content":14},"heading",{"level":12,"id":13},1,null,[15],{"type":16,"text":17},"text","はじめに",{"type":19,"content":20},"paragraph",[21],{"type":16,"text":22},"どうも、私です。",{"type":19,"content":24},[25,27,29],{"type":16,"text":26},"先日、Cloudflare Workers Tech Talks in Tokyo #8を見ました。",{"type":28},"hardBreak",{"type":16,"text":30},"で、見終わった感想なんですが、あまり面白くなかったです。",{"type":19,"content":32},[33],{"type":16,"text":34},"全部が全部というわけではなく、Containersの話やメルカリの話なんかは興味深く聞いていました。ただ、全体的に技術的な踏み込みが浅いというか、聞き終わって「結局何の話だったんだろう」となる発表がちらほらあって、すごく悲しい気持ちになったというのが正直な感想です。",{"type":19,"content":36},[37],{"type":16,"text":38},"別にプレゼンが下手だったわけではありませんし、むしろ全体的に皆さん発表が上手かったと思います。",{"type":19,"content":40},[41],{"type":16,"text":42},"ただ、私はテックトークにそういうものを求めていなかったようです。",{"type":10,"attrs":44,"content":45},{"level":12,"id":13},[46],{"type":16,"text":47},"何をもってそう思ったの",{"type":19,"content":49},[50],{"type":16,"text":51},"例えば、大規模SaaSの話は、Cloudflareにはこういうサービスがあって、従来こうしていたものがこうできて、Cloudflareでも大規模なSaaSを作れそうだ、というような話だったかと思います。",{"type":19,"content":53},[54],{"type":16,"text":55},"で、何をもって作れそうだと判断したんですかね。",{"type":19,"content":57},[58],{"type":16,"text":59},"Cloudflareに何のサービスがあって、それぞれ何がどのようにできるのかは、概ね公式ドキュメントを読めば分かります。実際に大規模SaaSのアーキテクチャを検討したのであれば、既存の構成と比較してどこが問題になったのか、Cloudflare固有の制約をどう評価したのか、どこまでをCloudflareに載せられて、どこからは載せられないのか。そういう話が私は聞きたかったです。",{"type":19,"content":61},[62],{"type":16,"text":63},"他の発表を聞いていても、似たようなことを何度か思いました。",{"type":19,"content":65},[66,68,69],{"type":16,"text":67},"｢この技術を使いました。｣",{"type":28},{"type":16,"text":70},"なぜ？",{"type":19,"content":72},[73,75,76],{"type":16,"text":74},"｢この構成にしました。｣",{"type":28},{"type":16,"text":70},{"type":19,"content":78},[79,81,82],{"type":16,"text":80},"｢これで実現できました。｣",{"type":28},{"type":16,"text":83},"そもそも何が課題で、それをどう解決するためにこの構成になったの？",{"type":19,"content":85},[86],{"type":16,"text":87},"技術スタックそのものを知りたいのではなくて、その技術スタックに至るまでの判断が知りたかったです。結果だけ並べられても、｢へえ、そうなんですね、すごい｣で終わってしまいます。",{"type":10,"attrs":89,"content":90},{"level":12,"id":13},[91],{"type":16,"text":92},"Vibe Codingの話",{"type":19,"content":94},[95,97,98],{"type":16,"text":96},"今回かなり話題になっていたのが、宮本佳林さんの「アイドル視点から見たものづくりの本質」という発表でした。",{"type":28},{"type":16,"text":99},"自分の活動で使うWebサイトや配信システムなんかを、LLMを使いながら自分で作っている、という話です。",{"type":19,"content":101},[102],{"type":16,"text":103},"まず前提として、作ったこと自体はとてもすごいことだと思います。",{"type":19,"content":105},[106],{"type":16,"text":107},"必要なものがあって、それを自分で作って、実際の活動に投入している。世の中、口だけ達者で何も作らない人間が嫌なほど沢山いるので、手を動かして成果物を出していることはとてもすごい事だと思います。",{"type":19,"content":109},[110],{"type":16,"text":111},"プレゼンはすごく上手かったですし、話の組み立ても上手で、エンタメとして見れば、普段見る技術者の発表より完成度が高かったように思います。｢やっぱりアイドルってすごいんだな〜｣などと思いながら見ていました。",{"type":19,"content":113},[114],{"type":16,"text":115},"ただ、内容についてはあまり好きではありませんでした。",{"type":19,"content":117},[118],{"type":16,"text":119},"例えば、10時間配信のためのシステムを作ったという話であれば、10時間配信を成立させるにあたって何が課題だったのか、それを解決するためになぜそのアーキテクチャを選んだのか、私はその辺が気になりました。",{"type":19,"content":121},[122,124,125],{"type":16,"text":123},"KV, D1, R2を採用したのであれば、それぞれ何を保存して、何を根拠にそこへ保存することにしたのか。KVの整合性モデルは要件上問題にならなかったのか。LLMが生成した実装をどう検証して、本番投入して問題ないと判断したのか。",{"type":28},{"type":16,"text":126},"せっかくVibe Codingを題材にするのであれば、そういう話題を深堀すると面白い話ができると思います。",{"type":19,"content":128},[129],{"type":16,"text":130},"コードの生成をLLMに任せるとして、人間はどこまでシステムを理解する必要があるのか。生成された設計が妥当であることをどう判断するのか。自分の理解を超えた実装が出てきたときにどうするのか。",{"type":19,"content":132},[133],{"type":16,"text":134},"この辺の話題には私自身、かなり興味があります。",{"type":19,"content":136},[137],{"type":16,"text":138},"しかし、実際の発表ではそこまで踏み込まれず、私には概ね「LLMを使いながら色々作ってみたら楽しく作れました」という話に聞こえました。",{"type":19,"content":140},[141],{"type":16,"text":142},"それはそれで良いことだと思います。",{"type":19,"content":144},[145],{"type":16,"text":146},"ただ、テックトークとして聞いて面白いかというと、すごく申し訳ないのですが、私はあまり面白く思えませんでした。",{"type":10,"attrs":148,"content":149},{"level":12,"id":13},[150],{"type":16,"text":151},"DynamoDB",{"type":19,"content":153},[154],{"type":16,"text":155},"中でも特に気になったのが、DynamoDBについてのくだりでした。",{"type":19,"content":157},[158],{"type":16,"text":159},"チケットシステムについて宮本さんが「これはDynamoDBではないか」と質問したところ、相手の会社の方が驚いていた、という話がありました。その理由として、チケットシステムは処理が速いからDynamoDBではないかと考えた、という趣旨の説明がされていたと思います。",{"type":19,"content":161},[162],{"type":16,"text":163},"ここは聞いていて、かなりもにょもにょしました。",{"type":19,"content":165},[166,168,169],{"type":16,"text":167},"速いからDynamoDB。",{"type":28},{"type":16,"text":170},"いや、なんで？",{"type":19,"content":172},[173],{"type":16,"text":174},"DynamoDBが低レイテンシで大規模なワークロードを捌けるのはそうなんですが、当然ながら「処理が速いシステムだからDynamoDB」というだけでデータストアを推測できるわけではありません。",{"type":19,"content":176},[177],{"type":16,"text":178},"どんなデータを扱っているのか、アクセスパターンはどうなっているのか、どの程度の一貫性が必要なのか、スケール特性はどうなのか。その辺を考えた結果としてDynamoDBではないかと推測したのであれば、その思考過程こそ聞きたいところです。",{"type":19,"content":180},[181],{"type":16,"text":182},"少なくとも発表中の説明だけを聞く限りでは、DynamoDBについて中途半端に見聞きした特徴をそのまま当てはめているようにしか見えず、私はあまり好きではありませんでした。",{"type":19,"content":184},[185],{"type":16,"text":186},"もちろん、実際にはもっと色々考えた上での発言だった可能性はあります。発表時間の都合で省いただけかもしれません。",{"type":19,"content":188},[189],{"type":16,"text":190},"なら、なおさらその話してほしかったです。",{"type":10,"attrs":192,"content":193},{"level":12,"id":13},[194],{"type":16,"text":195},"「アイドルなのにすごい」",{"type":19,"content":197},[198],{"type":16,"text":199},"世の中には私が面白いと思わないものを面白いと思う人も沢山居るでしょうし、その逆も当然あります。プレゼンの上手さや、ものづくりの楽しさを伝えることに価値を感じる人もいるでしょう。",{"type":19,"content":201},[202],{"type":16,"text":203},"好みの問題なので、別にそれはどうでもいいのかもしれません。",{"type":19,"content":205},[206],{"type":16,"text":207},"ただ、発表後の反応を見ていて、別のところで引っ掛かりました。",{"type":19,"content":209},[210,212,213],{"type":16,"text":211},"「アイドルなのにこんなことができるのがすごい」というような評価です。",{"type":28},{"type":16,"text":214},"これ、褒めているようで結構失礼ではないですかね？",{"type":19,"content":216},[217,219,226],{"type":16,"text":218},"以前、",{"type":16,"marks":220,"text":225},[221],{"type":222,"attrs":223},"link",{"href":224,"target":13,"rel":13,"class":13,"title":13},"https:\u002F\u002Fnote.com\u002Fcellacoates\u002Fn\u002Fn6711046dea15","〇〇なのに、凄い！n回目",{"type":16,"text":227},"というnoteの記事を読みました。そこでは「アイドルなのにサッカーに詳しい」といった表現について、その言葉が成立する背景にある、属性への期待について書かれていました。",{"type":19,"content":229},[230],{"type":16,"text":231},"「アイドルなのに技術ができてすごい」も同様であると私は思います。",{"type":19,"content":233},[234],{"type":16,"text":235},"この評価が成立するためには、まず「アイドルには通常、この程度の技術的能力はないだろう」という期待が必要になります。アイドルという属性からあらかじめ期待値を下げておいて、その低く設定した基準を超えたので「すごい」と評価する。",{"type":19,"content":237},[238,240,241],{"type":16,"text":239},"要するに「あなたの属性であれば、この程度の基準で評価するのが妥当でしょう」という話です。",{"type":28},{"type":16,"text":242},"私はそこに、ある種の差別的、あるいは蔑視的なものを感じます。すごく傲慢ですよね。",{"type":19,"content":244},[245,247,248],{"type":16,"text":246},"念のため書いておくと、「アイドルなのにすごい」と言っている人に悪意があるとは思っていません。",{"type":28},{"type":16,"text":249},"ただ、悪意がないことと、その見方に差別的なものが含まれていないことは別でしょう。",{"type":19,"content":251},[252],{"type":16,"text":253},"例えば「女性なのに論理的ですね」だとか、「高齢者なのにITに詳しいですね」みたいな言葉も、発言者は褒め言葉として使えます。",{"type":19,"content":255},[256],{"type":16,"text":257},"しかし、その言葉が褒め言葉として成立するためには、「女性は普通それほど論理的でない」「一般的な高齢者はITに詳しくない」という前提となる期待が必要です。",{"type":19,"content":259},[260],{"type":16,"text":261},"少なくとも私は言われたくないです。普通に失礼だと感じるので。",{"type":19,"content":263},[264],{"type":16,"text":265},"アイドルについても同様で、アイドルという職業から技術的な能力を勝手に推測して、通常より低い評価基準を適用することが、果たして相手に敬意を持った接し方なのかは疑問です。",{"type":19,"content":267},[268],{"type":16,"text":269},"以前、属性によるカテゴライズから完全に逃れることは無理だろう、というようなことを書きました。なので、「人を属性で見るな」のような綺麗なことを言うつもりは毛頭ありません。私自身、人間を様々な属性で括って見ていますし、アイドルという職業から何らかの傾向を推測すること自体を差別だと言い始めたら、人間の認知そのものが成立しなくなってしまいます。",{"type":19,"content":271},[272],{"type":16,"text":273},"ただ、同時に、その属性をそのまま個人の評価基準にまで持ち込むことには、もう少し慎重であるべきだと私は考えます。",{"type":10,"attrs":275,"content":276},{"level":12,"id":13},[277],{"type":16,"text":278},"同じ土俵",{"type":19,"content":280},[281,283,284],{"type":16,"text":282},"私は、宮本さんがアイドルだから技術的に未熟だと思いたくはありません。",{"type":28},{"type":16,"text":285},"同時に、アイドルだから多少理解が浅くてもすごい、とも思いたくありません。",{"type":19,"content":287},[288],{"type":16,"text":289},"Cloudflare Workersのテックトークに登壇して、Cloudflare Workersを使ったものづくりについて話しているのであれば、私はその発表を普通に一本のテックトークとして聞きたいと思います。",{"type":19,"content":291},[292],{"type":16,"text":293},"その結果として、技術的に面白ければ面白いと言うし、理解が浅いと思えば浅いと言いたい。",{"type":19,"content":295},[296],{"type":16,"text":297},"寧ろ、「本業はアイドルなんだから技術的に浅くても仕方ないよね」と評価基準を変える方が、私には余程失礼に思えます。",{"type":19,"content":299},[300],{"type":16,"text":301},"もちろん、本業とは全く違う分野のものを短期間で学び、実際に動くところまで持っていったという事実は、それ単体で評価できます。",{"type":19,"content":303},[304],{"type":16,"text":305},"作ったことはすごい。",{"type":19,"content":307},[308],{"type":16,"text":309},"行動力もすごい。",{"type":19,"content":311},[312],{"type":16,"text":313},"プレゼンも上手い。",{"type":19,"content":315},[316],{"type":16,"text":317},"ただ、技術的な内容はすごく浅いように感じました。",{"type":19,"content":319},[320],{"type":16,"text":321},"全てを「アイドルなのにすごい」という便利な一言に押し込める必要はないでしょうし、押し込めるべきではないでしょう。",{"type":10,"attrs":323,"content":324},{"level":12,"id":13},[325],{"type":16,"text":326},"さいごに",{"type":19,"content":328},[329],{"type":16,"text":330},"今回のWorkers Tech Talksを見ていて一番残念だったのは、宮本さんの発表というより、全体として技術的に深掘りする発表が思ったより少なかったことです。",{"type":19,"content":332},[333,335,336],{"type":16,"text":334},"何を使ったかより、なぜそれを使ったのか。作れたという結果より、なぜそれで作れると判断したのか。",{"type":28},{"type":16,"text":337},"そういう公式ドキュメントを読めば分かるようなサービスの紹介よりも、実際に使った人間がどこで苦しんだのかが知りたかったです。",{"type":19,"content":339},[340],{"type":16,"text":341},"Vibe Codingなら、LLMで作れましたという話より、LLMに実装を委ねた状態でどうシステムの正しさを担保したのか。そういう話の方が、私は面白いと思います。",{"type":19,"content":343},[344],{"type":16,"text":345},"世間の反応を見る限り、今回のイベントを楽しんだ人はかなり多かったようなので、単純に私がテックトークに求めるものとズレているだけなのかもしれません。",{"type":19,"content":347},[348],{"type":16,"text":349},"好みの話なので仕方ないのかもしれませんが。",{"type":19,"content":351},[352,354,355],{"type":16,"text":353},"ただ、「アイドルなのにすごい」という評価については、それとは別にやっぱり好きではありません。",{"type":28},{"type":16,"text":356},"属性によって期待値を下げた上で褒めるくらいなら、普通に同じ土俵で、その人が実際にやったことを見ればいいんじゃないでしょうか。",{"type":19,"content":358},[359],{"type":16,"text":360},"少なくとも私は、その方が相手に対して幾分か誠実な態度であると思います。","どうも、私です。先日、Cloudflare Workers Tech Talks in Tokyo #8を見ました。で、見終わった感想なんですが、あまり面白くなかったです。全部が全部というわけではなく、Containersの話やメルカリの話なんかは興味深く聞いていました。ただ、全体的に技術的な踏み込",4348,[364,368,372],{"id":365,"name":366,"slug":367},"qfey3yw0z1","テクノロジー","technology",{"id":369,"name":370,"slug":371},"4oy2jc8mdg","日記","diary",{"id":373,"name":374,"slug":375},"wia4slp55q","独り言","thoughts",false,"2026-08-28T20:06:27.604Z","2026-08-28T20:05:08.273Z","2026-08-29T06:56:29.446Z",{"older":381,"newer":717},{"id":382,"title":383,"content":384,"summary":705,"charCount":706,"eyecatch":13,"tags":707,"is_no_index":376,"publishedAt":714,"createdAt":715,"updatedAt":716},"rIhGFBCz3nkO","microCMSやめた",{"type":7,"content":385},[386,390,393,397,401,405,409,413,417,422,426,430,434,438,442,446,451,455,469,485,489,493,497,501,517,521,526,530,543,552,556,565,572,576,581,585,589,593,620,624,629,633,644,648,652,659,666,670,674,678,682,693,697,701],{"type":10,"attrs":387,"content":388},{"level":12,"id":13},[389],{"type":16,"text":17},{"type":19,"content":391},[392],{"type":16,"text":22},{"type":19,"content":394},[395],{"type":16,"text":396},"このサイトを作り始めてから、ずっとmicroCMSを利用してきましたが、とうとうやめることにしました。",{"type":19,"content":398},[399],{"type":16,"text":400},"お仕事の方でも、私が技術選定に関わっているプロダクトでは利用しているくらいにはmicroCMSのことが好きですし、このサイトでも長らくお世話になっていたので、それなりに愛着があります。",{"type":19,"content":402},[403],{"type":16,"text":404},"APIが使いやすいですし、ドキュメントもそれなりに充実していて、Headless CMSを選ぶ機会があれば今でも普通に候補に入れるかと思います。ですので、何か致命的な不満があってmicroCMSを嫌いになったみたいな話ではありません。",{"type":19,"content":406},[407],{"type":16,"text":408},"単純に、このサイトでのユースケースと少しずつ合わなくなってしまいました。",{"type":19,"content":410},[411],{"type":16,"text":412},"大きな理由から順に、配信トラヒック上限, リッチテキストフィールドが返すHTMLの扱い, モバイルデバイスからのエディタ操作性です。",{"type":19,"content":414},[415],{"type":16,"text":416},"そんなこんなで、最終的にはCMSごと自分で作ることにしました。",{"type":10,"attrs":418,"content":419},{"level":12,"id":13},[420],{"type":16,"text":421},"Hobbyプランの20Gi\u002Fmoが厳しい",{"type":19,"content":423},[424],{"type":16,"text":425},"今回microCMSをやめる決断に至った一番の理由がこれでした。",{"type":19,"content":427},[428],{"type":16,"text":429},"microCMSのHobbyプランでは、月あたり20Giまでのデータを配信できます。このサイトを作り始めた当初ではあまり気にしていませんでしたが、有難いことに以前よりもアクセス数が増えてしまい、月によっては上限を超過してしまいそうになることがちまちまありました。",{"type":19,"content":431},[432],{"type":16,"text":433},"それなら上位プランに乗り換えようかという話になるのですが、Hobbyの次にあたるTeamプランは月額4,900円します。",{"type":19,"content":435},[436],{"type":16,"text":437},"仕事で利用するサービスであれば、CMSを自前で運用保守するコストや管理監査機能周りを考えると寧ろ安いと思えるのですが、如何せん個人の雑記帳なので躊躇してしまいます。年額6万円弱ですからね。",{"type":19,"content":439},[440],{"type":16,"text":441},"勿論、microCMSでしか代替できない何かがあって、このサイトにとってならなくてはならないコアな存在になっていたのであれば、そのまま課金していたのかもしれません。が、ちょうど実装面でもmicroCMSに合わせ続けることに若干のﾂﾗﾐを感じることがありました。",{"type":19,"content":443},[444],{"type":16,"text":445},"であれば、月額を払っていまの構成を維持し続けるよりも、この機会にコンテンツ管理そのものを作り直したいなとなり今に至ります。",{"type":10,"attrs":447,"content":448},{"level":12,"id":13},[449],{"type":16,"text":450},"HTMLをどうにか加工したかった",{"type":19,"content":452},[453],{"type":16,"text":454},"microCMSではAPIに型のような概念があり、事前に定義した種別によって入力できる内容が異なります。このサイトでは、本文にリッチテキストフィールドを利用していました。",{"type":19,"content":456},[457,459,464,466,467],{"type":16,"text":458},"このリッチテキストフィールドはAPIの返り値としてセマンティックなHTMLを返してきます。最小限の表示を行うのであれば、そのHTMLを",{"type":16,"marks":460,"text":463},[461],{"type":462},"code","v-html",{"type":16,"text":465},"で横流しして、いい感じのCSSを当ててあげるとそれっぽいものができます。",{"type":28},{"type":16,"text":468},"しかし、長いこと触っていると色々なことがやりたくなってきます。",{"type":19,"content":470},[471,473,477,479,480,482,483],{"type":16,"text":472},"このサイトで言うと、",{"type":16,"marks":474,"text":476},[475],{"type":462},"\u003Ca href=\"https:\u002F\u002Fexample.com\">https:\u002F\u002Fexample.com\u003C\u002Fa>",{"type":16,"text":478},"のようなテキストと遷移先が一致するリンクに対して、そのまま平文を表示せず、リッチなリンクカードに差し替える処理があります。",{"type":28},{"type":16,"text":481},"コードブロックにはsyntax highlightがほしいし、言語名やファイルパスによって表示を出し分けたかったりもします。",{"type":28},{"type":16,"text":484},"GItHub, YouTube. Instagram, Twitter, MisskeyあたりのURLであれば、それぞれ専用の埋め込みが表示された方が嬉しいですし、Mermaidが書かれていればダイアグラムとして描画したいものです。",{"type":19,"content":486},[487],{"type":16,"text":488},"他にも色々仕込んでいくうちに、気付けば結構な量になってしまいました。",{"type":19,"content":490},[491],{"type":16,"text":492},"これまでは、APIから取得されたHTMLをCheerioに食わせてDOMを参照し、条件に合う要素を置き換えたり属性を追加したりで凌いでいました。できるにはできるんです。中身はHTMLなので。",{"type":19,"content":494},[495],{"type":16,"text":496},"ただ、記事内で使いたい表現を増やす度に、「microCMSがこういうHTMLを返してくるだろうから、このDOM構造を副作用なく検出して、特定のコンポーネントと置き換えて使おう…」みたいな処理が無限に増えていきます。",{"type":19,"content":498},[499],{"type":16,"text":500},"これはもうHTMLそのものを表示しているというよりかは、HTMLを中間言語として受け取り記事構造を復元しているように思えてきました。",{"type":19,"content":502},[503,505,509,511,515],{"type":16,"text":504},"先程例に挙げたコードブロックであれば、HTMLの",{"type":16,"marks":506,"text":508},[507],{"type":462},"pre > code",{"type":16,"text":510},"を見つけて置き換えるよりも、最初から",{"type":16,"marks":512,"text":514},[513],{"type":462},"codeBlock",{"type":16,"text":516},"というノードが状態として存在していた方が扱いやすいですよね。リンクカードもそうですし、画像も、今後増やすであろう何かしらの変な独自表現もすべてそうです。",{"type":19,"content":518},[519],{"type":16,"text":520},"microCMSが返してくるHTMLをどうにか加工し続けるより、自分で記事の構造を持って、自分でレンダリングした方が素直なんじゃないの、と。",{"type":10,"attrs":522,"content":523},{"level":12,"id":13},[524],{"type":16,"text":525},"スマホから改行をしたい",{"type":19,"content":527},[528],{"type":16,"text":529},"もうひとつ。",{"type":19,"content":531},[532,534,535,537,541],{"type":16,"text":533},"私はベッドからスマホで文章を書くことが多いです。最初から最後までスマホだけで書くこともありますし、あとからPCで書き直したりすることもあります。",{"type":28},{"type":16,"text":536},"で、microCMSのリッチエディタでは、スマホから",{"type":16,"marks":538,"text":540},[539],{"type":462},"Shift + Enter",{"type":16,"text":542},"と等価の操作ができません。",{"type":19,"content":544},[545,547,550],{"type":16,"text":546},"どういう事かと言うと、段落を変えずに改行したい場合(CR\u002FLFではなくLFを単体で入力したい場合)、",{"type":16,"marks":548,"text":540},[549],{"type":462},{"type":16,"text":551},"を入力する必要があります。確かWordなんかもこういう操作ですよね。",{"type":19,"content":553},[554],{"type":16,"text":555},"PCから使う分にはShiftを押しながらEnterを押せばいいので何も困りません。問題はスマホです。",{"type":19,"content":557},[558,560,563],{"type":16,"text":559},"当然ながらスマホのソフトウェアキーボードには",{"type":16,"marks":561,"text":540},[562],{"type":462},{"type":16,"text":564},"等価の入力キーはなく、同じ感覚で改行を入れるのが困難でした。加えて、このサイトでは、羅列されたパラグラフの可読性を高める目的で、記事レンダラのコンポーネント内子要素に対し、余白を意図的に持たせるスタイルを適用していたので困りものです。",{"type":19,"content":566},[567,569,570],{"type":16,"text":568},"これを読まれている方も日本語を母語としている方が多いでしょうし、おそらく肌感として理解していただけると思うのですが、現代的な日本語の文章表現として、句点と読点の間くらいの区切りとして改行がかなり用いられているように感じます。",{"type":28},{"type":16,"text":571},"浅学さを晒すようで大変恥ずかしいのですが、これが何かしらの正式な文章技法として定義されているのか、単にそのような表現が自然に広まってしまったのかは知りません。知りませんが、とにかくよく目にしますし、私自身もよく使います。",{"type":19,"content":573},[574],{"type":16,"text":575},"そんなこんなで、よく使う表現がよく使うデバイスから入力しにくい状態でした。",{"type":10,"attrs":577,"content":578},{"level":12,"id":13},[579],{"type":16,"text":580},"そうだ、CMSをつくろう",{"type":19,"content":582},[583],{"type":16,"text":584},"ということで、CMSを作ることにしました。楽しそうですし。",{"type":19,"content":586},[587],{"type":16,"text":588},"汎用的なものを作るつもりは最初からなく、このサイトでだけ使える最小限のものを実装しています。そもそも私一人しか使わないものにコラボレーション機能だとか監査機能だとかは不要ですしね。",{"type":590,"attrs":591},"linkCard",{"url":592},"https:\u002F\u002Fgithub.com\u002Fchan-mai\u002Fmq1-web\u002Fcommit\u002F7f7808a57db62445f5bfd47f36db706b84e1c188",{"type":19,"content":594},[595,597,598,600,603,605,608,610,613,615,618],{"type":16,"text":596},"記事本文についてはTiptapのJSONをそのまま構造化されたドキュメントとして持つようにしました。",{"type":28},{"type":16,"text":599},"文章は",{"type":16,"marks":601,"text":19},[602],{"type":462},{"type":16,"text":604},"、見出しは",{"type":16,"marks":606,"text":10},[607],{"type":462},{"type":16,"text":609},"、コードブロックは",{"type":16,"marks":611,"text":514},[612],{"type":462},{"type":16,"text":614},"、リンクカードなら",{"type":16,"marks":616,"text":590},[617],{"type":462},{"type":16,"text":619},"、と最初から何者なのか分かった状態で保存しておくことで、HTMLをゴネゴネ処理する必要がなくなり非常に楽になりました。当然と言えば当然なのですが。",{"type":19,"content":621},[622],{"type":16,"text":623},"記事やタグなんかのメタデータはD1に、メディア系はR2に置くようにしています。元々このサイトではいいね機能周りでD1を使っていましたし、Workers上で動いているので自然なのかなと。",{"type":10,"attrs":625,"content":626},{"level":12,"id":13},[627],{"type":16,"text":628},"エディタの話",{"type":19,"content":630},[631],{"type":16,"text":632},"ちょっと本筋とは離れるのですが、エディタを作るにあたって、一つ明確に理想としていたものがあります。",{"type":19,"content":634},[635,642],{"type":16,"marks":636,"text":641},[637],{"type":222,"attrs":638},{"href":639,"target":640,"rel":13,"class":13,"title":13},"https:\u002F\u002Fsizu.me\u002F","_blank","しずかなインターネット",{"type":16,"text":643},"です。",{"type":19,"content":645},[646],{"type":16,"text":647},"以前利用していたのですが、あのサービスのエディタの書き心地がすごく好きでした。余計なものがほとんど視界に入らず、とりあえずタイトルを書いて文章を書き始められ、文章を書くことそのものがUIの中心にある感じがすごく好きです。よくあるCMSの管理画面でコンテンツを編集している体験とはまた違ったものがあります。",{"type":19,"content":649},[650],{"type":16,"text":651},"ああいうのがいいなと。",{"type":19,"content":653},[654,656,657],{"type":16,"text":655},"しずかなインターネットはReactを基盤にしていて、こちらはVue\u002FNuxtです。使っているライブラリまで含めて完全に同じものを作るとなるとまぁまぁ大変ですし、別にコピーを作りたいわけでもないので、その辺りは普通に割り切っています。",{"type":28},{"type":16,"text":658},"ただ、考えとして文章を書くことを邪魔しないという部分はかなり参考にしています。",{"type":660,"attrs":661},"image",{"src":662,"alt":13,"caption":663,"width":664,"height":665},"\u002Fimages\u002Fr2\u002FHVt3_R3fiKxhIM7x.png","記事の管理画面のスクリーンショット",1920,1080,{"type":660,"attrs":667},{"src":668,"alt":13,"caption":669,"width":664,"height":665},"\u002Fimages\u002Fr2\u002Feq4mue3h8X_-DYl1.png","記事の編集画面のスクリーンショット",{"type":19,"content":671},[672],{"type":16,"text":673},"結局のところ、私しか使わないので私が満足できればそれでいいのかなと。",{"type":10,"attrs":675,"content":676},{"level":12,"id":13},[677],{"type":16,"text":326},{"type":19,"content":679},[680],{"type":16,"text":681},"そんなこんなで、長いこと使ってきたmicroCMSへの依存を完全にやめてしまいました。",{"type":19,"content":683},[684,686,691],{"type":16,"text":685},"実際、作ってみると「この操作ちょっと嫌だな」と思ったらその場で直せますし、「こういう表現が欲しい」と思えば",{"type":16,"marks":687,"text":690},[688],{"type":689},"dpgk","こんな感じに",{"type":16,"text":692},"好きなノードを生やせます。",{"type":19,"content":694},[695],{"type":16,"text":696},"自分のブログのためだけにCMSを作るなんて、一般論で考えればどう考えても割に合わないと思います。でも、個人サイトなんてそれくらいでいいんじゃないでしょうか。",{"type":19,"content":698},[699],{"type":16,"text":700},"以前にも似たようなことを書いた気がしますが、自分のサイトなので。",{"type":19,"content":702},[703],{"type":16,"text":704},"長いことお世話になりました、microCMS。","どうも、私です。このサイトを作り始めてから、ずっとmicroCMSを利用してきましたが、とうとうやめることにしました。お仕事の方でも、私が技術選定に関わっているプロダクトでは利用しているくらいにはmicroCMSのことが好きですし、このサイトでも長らくお世話になっていたので、それなりに愛着があります",3762,[708,709,713],{"id":369,"name":370,"slug":371},{"id":710,"name":711,"slug":712},"8q8qyy8sz3","プログラミング","programming",{"id":365,"name":366,"slug":367},"2026-08-23T16:09:35.280Z","2026-08-23T11:18:22.125Z","2026-08-23T16:11:23.877Z",{"id":718,"title":719,"content":720,"summary":1208,"charCount":1209,"eyecatch":13,"tags":1210,"is_no_index":376,"publishedAt":1217,"createdAt":1218,"updatedAt":1219},"U0w-0MgT8IhM","やはりKubernetesからは逃れられない",{"type":7,"content":721},[722,726,730,734,738,741,748,752,756,760,764,768,772,776,780,785,789,793,797,801,805,812,816,820,825,829,833,837,844,851,855,859,863,868,872,879,883,887,891,895,929,933,937,942,949,953,985,992,996,1000,1004,1009,1013,1017,1021,1028,1032,1036,1040,1044,1049,1056,1124,1128,1132,1136,1143,1150,1154,1159,1166,1170,1177,1181,1185,1189,1193,1200,1204],{"type":10,"attrs":723,"content":724},{"level":12,"id":13},[725],{"type":16,"text":17},{"type":19,"content":727},[728],{"type":16,"text":729},"どうも、わたしです。",{"type":19,"content":731},[732],{"type":16,"text":733},"最近、安価なVPS上で複数のワークロードをいい感じに収容する方法について考えています。",{"type":19,"content":735},[736],{"type":16,"text":737},"こんなツイートが伸びるくらいなので、もしかしたら多くの人が気になっているのではないでしょうか。",{"type":590,"attrs":739},{"url":740},"https:\u002F\u002Fx.com\u002Fmai_llj\u002Fstatus\u002F2095891620973686914",{"type":19,"content":742},[743,745,746],{"type":16,"text":744},"このような用途の多くは既にサーバレスへ代替されてしまっているのでしょうが、私がやりたいのは、常時起動する小リソースでステートフルなワークロードをデプロイすることです。",{"type":28},{"type":16,"text":747},"そもそも、リクエスト単位で起動して終了するようなものであればCloudflareのWorkersが一番安くていい感じなんじゃないでしょうか。",{"type":19,"content":749},[750],{"type":16,"text":751},"基本的に、私しか使わないようなものは自宅のKubernetesクラスタにデプロイしているのですが、Misskeyのように外向きのトラヒックが大半を占めるワークロードを自宅に置くのには抵抗があります。",{"type":19,"content":753},[754],{"type":16,"text":755},"そこで活躍するのが安価なVPSです。帯域こそ微妙なものの、安価で、国内ベンダとしては比較的まともなKAGOYA CLOUD VPSを私は愛用しています。",{"type":19,"content":757},[758],{"type":16,"text":759},"VPSなんて必要になったらその都度1台生やせばいいじゃん、という話ではあるのですが、数が増えてくるとそう単純でもありません。例えば、2GiB程度のVPSをアプリケーション単位を収容境界として個別に割り当てていけば、当然ながら管理するホストの数も増えていきます。",{"type":19,"content":761},[762],{"type":16,"text":763},"では大きなVPSを1台借りて、そこへDocker Composeで全部詰め込めばいいのかというと、それも段々と辛くなってきます。どのホストに何が載っているのか、あとどれくらいメモリが空いているのか、新しいワークロードをどこに置くべきなのか。そういうことは機械にやらせてしまいたいわけです。",{"type":19,"content":765},[766],{"type":16,"text":767},"もっと言えば、負荷に応じていい感じにスケールアウトもしてほしいですし、クレデンシャルを含めて綺麗にIaCしたい気持ちがあります。",{"type":19,"content":769},[770],{"type":16,"text":771},"私が思いつく限り、このような用途で一番有用なのがKubernetesです。",{"type":19,"content":773},[774],{"type":16,"text":775},"Argo CDなりFluxなりを使えばGitOpsできますし、Terraformなどとは違い、コントローラによる継続的なreconciliationを前提とした宣言的な構成管理ができます。クレデンシャルについてもExternal Secrets Operatorなどを利用すれば、外部のSecret Managerへ管理を寄せられます。",{"type":19,"content":777},[778],{"type":16,"text":779},"至れり尽くせりなわけです。",{"type":10,"attrs":781,"content":782},{"level":12,"id":13},[783],{"type":16,"text":784},"Kubernetesのオーバーヘッド",{"type":19,"content":786},[787],{"type":16,"text":788},"しかし、Kubernetesには致命的な欠点があります。",{"type":19,"content":790},[791],{"type":16,"text":792},"よく言われるものでは、エコシステムが無駄に大きいとか、学習コストが高いとかいう話もありますが、現に私は使っているので本質的な問題ではありません。",{"type":19,"content":794},[795],{"type":16,"text":796},"単純にオーバーヘッドが大きいんです。",{"type":19,"content":798},[799],{"type":16,"text":800},"もちろん、何をもって重いとするかにもよるでしょし、数十GiB、数百GiBのメモリを積んだノードを大量に抱えている環境なら、kubeletやcontainer runtimeが数百MiB食っていたところで誤差でしょう。",{"type":19,"content":802},[803],{"type":16,"text":804},"しかし、今回考えているのは、安価に契約できるVPSです。4GiB、8GiBあたりの小さい仮想マシンを10何台か契約して、その上へ1-2GiB程度のワークロードを効率よく詰めることを目的としています。",{"type":19,"content":806},[807,809,810],{"type":16,"text":808},"こういう用途に限れば、ノード単位で数百MiBから1GiB近いメモリを基盤側に持っていかれるのは結構しんどいですし、まともに運用しようとすると追加で監視基盤も必要になります。",{"type":28},{"type":16,"text":811},"node-exporterが生え、ログを集めようとするとAlloyやFluent Bitが生え、Ingress Controllerが生え、metrics-serverが生え、cert-managerが生えてきます。",{"type":19,"content":813},[814],{"type":16,"text":815},"もちろん全部が必須というわけではありません。が、Kubernetesをちゃんと運用しようとすると、周辺コンポーネントはどうしても増えてしまいます。結果として、ワークロードを収容するために用意したリソースのうち、それなりの割合を基盤そのものが消費することになります。",{"type":19,"content":817},[818],{"type":16,"text":819},"OS本体の消費リソースも考える必要がありますし、キャパシティの小さいVPSではこのオーバーヘッドを無視することができません。",{"type":10,"attrs":821,"content":822},{"level":12,"id":13},[823],{"type":16,"text":824},"小さいVPSをいっぱい借りればいい？",{"type":19,"content":826},[827],{"type":16,"text":828},"そもそもの発端は、VPSの料金体系を眺めていたことでした。",{"type":19,"content":830},[831],{"type":16,"text":832},"これが不思議なもので、キャパシティの大きいプランを1台契約する場合と比較して、小さいプランを複数台契約した方が安いことがあります。(KAGOYAの場合だと、2GiBのプランがいちばんコスト効率が高そう)",{"type":19,"content":834},[835],{"type":16,"text":836},"であれば、「小さいVPSを大量に借りればよくない？」と思うわけです。",{"type":19,"content":838},[839,841,842],{"type":16,"text":840},"しかし当然、VPSを増やすたびにOSも増えます。",{"type":28},{"type":16,"text":843},"OS本体のオーバーヘッドもそうですが、Linuxをbootして、SSHできるようにして、Dockerなりcontainerdなりを入れて、監視を入れて、アップデートして、という作業を10台、20台やりたいかというと、全然やりたくありません。",{"type":19,"content":845},[846,848,849],{"type":16,"text":847},"私はアプリケーションを動かす基盤がほしいのであって、Ubuntuのお世話をしたいわけではないんです。",{"type":28},{"type":16,"text":850},"極端な話、ホストなんて壊れたら捨てて作り直せればいいし、普段SSHで入る必要すらない形が理想です。",{"type":19,"content":852},[853],{"type":16,"text":854},"その点においてはTalos Linuxがかなり好きです。Immutableで、SSHもshellもなく、APIから管理できますしね。ホストOSを意識する場面を大きく減らせるという意味ではとても理想的です。",{"type":19,"content":856},[857],{"type":16,"text":858},"ただし、TalosはKubernetesを動かすためのOSです。",{"type":19,"content":860},[861],{"type":16,"text":862},"私はKubernetesを前提にしないTalosがほしい。",{"type":10,"attrs":864,"content":865},{"level":12,"id":13},[866],{"type":16,"text":867},"Nomad",{"type":19,"content":869},[870],{"type":16,"text":871},"この手の話をすると、大体Nomadがおすすめされます。実際、使ってみるまでは結構良さそうに見えました。",{"type":19,"content":873},[874,876,877],{"type":16,"text":875},"Task Groupで複数のコンテナを同じノードに置けますし、CPUやメモリを見てスケジューリングしてくれます。Rolling Updateもできます。Kubernetesより構成要素も少なく、かなり軽量です。",{"type":28},{"type":16,"text":878},"もうこれでいいのでは、と思えてきます。",{"type":19,"content":880},[881],{"type":16,"text":882},"しかし、使っていく中で微妙な部分がかなりあります。",{"type":19,"content":884},[885],{"type":16,"text":886},"Nomad自体は単一バイナリでシンプルなのですが、当然それを実行するOSは必要です。OCIコンテナを動かすのであればDockerやPodmanなどのruntimeも必要になりますし、ネットワークをちゃんとやろうとするとCNIが出てきます。service discoveryをどうするかという話もあります。",{"type":19,"content":888},[889],{"type":16,"text":890},"Consulもあります、Vaultもあります、とHashiCorpのエコシステムで補っていくことはできます。が、それらを積み上げた結果できるものに、Kubernetesとの本質的な違いがどれほどあると言えるのでしょうか。",{"type":19,"content":892},[893],{"type":16,"text":894},"別にHashiCorpスタックを愛しているわけではないのですが、気がつくと、",{"type":896,"content":897},"bulletList",[898,905,911,917,923],{"type":899,"content":900},"listItem",[901],{"type":19,"content":902},[903],{"type":16,"text":904},"immutableなOSを選ぶ",{"type":899,"content":906},[907],{"type":19,"content":908},[909],{"type":16,"text":910},"Nomadを載せる",{"type":899,"content":912},[913],{"type":19,"content":914},[915],{"type":16,"text":916},"runtimeを載せる",{"type":899,"content":918},[919],{"type":19,"content":920},[921],{"type":16,"text":922},"ネットワークを考える",{"type":899,"content":924},[925],{"type":19,"content":926},[927],{"type":16,"text":928},"service discoveryを考える",{"type":19,"content":930},[931],{"type":16,"text":932},"という、Kubernetesで既に統合されているものを自分で組み直す必要が出てきました。",{"type":19,"content":934},[935],{"type":16,"text":936},"どう考えても無駄なのでなかったことにします。",{"type":10,"attrs":938,"content":939},{"level":12,"id":13},[940],{"type":16,"text":941},"Incus",{"type":19,"content":943},[944,946,947],{"type":16,"text":945},"IncusOSなんかは特に好みで、immutableでshellもSSHもなく、APIから管理するという、Talosに近いものです。OCI application containerも直接実行できます。",{"type":28},{"type":16,"text":948},"ただ、特性上、複数のコンテナを1つのワークロードとして扱う振る舞いをしてしまう問題がありました。",{"type":19,"content":950},[951],{"type":16,"text":952},"例えば、",{"type":896,"content":954},[955,961,967,973,979],{"type":899,"content":956},[957],{"type":19,"content":958},[959],{"type":16,"text":960},"Application",{"type":899,"content":962},[963],{"type":19,"content":964},[965],{"type":16,"text":966},"PostgreSQL",{"type":899,"content":968},[969],{"type":19,"content":970},[971],{"type":16,"text":972},"Redis",{"type":899,"content":974},[975],{"type":19,"content":976},[977],{"type":16,"text":978},"Caddy",{"type":899,"content":980},[981],{"type":19,"content":982},[983],{"type":16,"text":984},"Backup",{"type":19,"content":986},[987,989,990],{"type":16,"text":988},"を1セットとして、必ず同じホストへ配置したいとします。",{"type":28},{"type":16,"text":991},"KubernetesであればPodがありますし、NomadならTask Groupがあります。",{"type":19,"content":993},[994],{"type":16,"text":995},"Incusの場合、基本的にはそれぞれが独立したinstanceになり、同じノードに置くのであれば、その配置をこちらで管理する必要があります。",{"type":19,"content":997},[998],{"type":16,"text":999},"では、それらを1つの単位として扱って、CPUやメモリの空きを見ながら自動配置してほしい。となると、結局schedulerが欲しくなりました。",{"type":19,"content":1001},[1002],{"type":16,"text":1003},"というわけでIncusもなかったことにします。",{"type":10,"attrs":1005,"content":1006},{"level":12,"id":13},[1007],{"type":16,"text":1008},"NixOS",{"type":19,"content":1010},[1011],{"type":16,"text":1012},"じゃあ、世の中の人たちは複数のホストを一体どう管理しているのか気になります。Redditを見てみました。思ったよりつまらなかったです。",{"type":19,"content":1014},[1015],{"type":16,"text":1016},"大きめのマシンを1台用意してDocker Composeをそのまま導入している場合や、複数台をそれぞれ独立したDocker hostとして管理する。PortainerやKomodo、Dokployのようなもので疑似的に中央管理する人もいるようでした。",{"type":19,"content":1018},[1019],{"type":16,"text":1020},"あとはNixOS。これは結構魅力的でした。というか既に私はこれを普段使いのクライアント環境で使っています。",{"type":19,"content":1022},[1023,1025,1026],{"type":16,"text":1024},"OSの状態自体を宣言的に管理できますし、再現もロールバックもできます。サーバを手作業で育てていく必要がありません。Talosに求めているものの大部分を備えています。",{"type":28},{"type":16,"text":1027},"ただ、NixOSはあくまで「このマシンをどういう状態にするか」を管理するものです。",{"type":19,"content":1029},[1030],{"type":16,"text":1031},"複数のホストを1つのリソースプールとして見て、「このワークロードは空きメモリが多いnode-hogeへ」みたいな配置をしてくれるわけではありません。",{"type":19,"content":1033},[1034],{"type":16,"text":1035},"それらは別途考える必要があります。",{"type":19,"content":1037},[1038],{"type":16,"text":1039},"ここでまたschedulerです。",{"type":19,"content":1041},[1042],{"type":16,"text":1043},"どうも私が欲しいものの大半はschedulerの周辺に集約されているようです。",{"type":10,"attrs":1045,"content":1046},{"level":12,"id":13},[1047],{"type":16,"text":1048},"結局、Kubernetes",{"type":19,"content":1050},[1051,1053,1054],{"type":16,"text":1052},"ここまで色々使ってみて、ようやく気づくことがあります。",{"type":28},{"type":16,"text":1055},"私が欲しいものを並べると、",{"type":896,"content":1057},[1058,1064,1070,1076,1082,1088,1094,1100,1106,1112,1118],{"type":899,"content":1059},[1060],{"type":19,"content":1061},[1062],{"type":16,"text":1063},"複数ホストを1つのresource poolとして扱える",{"type":899,"content":1065},[1066],{"type":19,"content":1067},[1068],{"type":16,"text":1069},"リソースを見て動的に自動配置できる",{"type":899,"content":1071},[1072],{"type":19,"content":1073},[1074],{"type":16,"text":1075},"複数のコンテナを1つの単位として扱える",{"type":899,"content":1077},[1078],{"type":19,"content":1079},[1080],{"type":16,"text":1081},"クレデンシャル含め、すべてを宣言的に管理できる",{"type":899,"content":1083},[1084],{"type":19,"content":1085},[1086],{"type":16,"text":1087},"異常終了したワークロードを再作成できる",{"type":899,"content":1089},[1090],{"type":19,"content":1091},[1092],{"type":16,"text":1093},"Rolling Updateできる",{"type":899,"content":1095},[1096],{"type":19,"content":1097},[1098],{"type":16,"text":1099},"ホストをdrainできる",{"type":899,"content":1101},[1102],{"type":19,"content":1103},[1104],{"type":16,"text":1105},"service discoveryがある",{"type":899,"content":1107},[1108],{"type":19,"content":1109},[1110],{"type":16,"text":1111},"APIから操作できる",{"type":899,"content":1113},[1114],{"type":19,"content":1115},[1116],{"type":16,"text":1117},"OCI imageをそのまま使える",{"type":899,"content":1119},[1120],{"type":19,"content":1121},[1122],{"type":16,"text":1123},"immutableなホストOSを選べる",{"type":19,"content":1125},[1126],{"type":16,"text":1127},"という感じになります。",{"type":19,"content":1129},[1130],{"type":16,"text":1131},"すごくKubernetesですね。",{"type":19,"content":1133},[1134],{"type":16,"text":1135},"Kubernetesを避けるために代替を探していたのに、代替できるものも結局はKubernetesになってしまいます。",{"type":19,"content":1137},[1138,1140,1141],{"type":16,"text":1139},"Kubernetesは無駄に複雑で、実際私が使わない機能も大量にありますが、NomadやIncusの節で書いたとおり、小さなソフトウェアを組み合わせて同じ要件を満たそうとすると、runtimeやCNI、service discovery、schedulerの選定と統合が今度は自分の責務になってしまいます。",{"type":28},{"type":16,"text":1142},"Kubernetesの中で済んでいた統合作業を自分でやり直しているだけで、複雑さの総量は減っていませんよね。Kubernetesがあの大きさなのにも、相応の理由があるということなのかもしれません。",{"type":19,"content":1144},[1145,1147,1148],{"type":16,"text":1146},"では素直にマネージドKubernetesを使えばいいのかというと、あれはあれで高すぎて使えません。",{"type":28},{"type":16,"text":1149},"workerもcontrolもパブクラの価格水準で、格安VPSをよしなにしようねという今回の話とは前提の金額が異なります。",{"type":19,"content":1151},[1152],{"type":16,"text":1153},"結局のところ、Kubernetesは潤沢な計算資源を前提にした、富豪向けのソリューションなのかもしれません。",{"type":10,"attrs":1155,"content":1156},{"level":12,"id":13},[1157],{"type":16,"text":1158},"結局どうするの",{"type":19,"content":1160},[1161,1163,1164],{"type":16,"text":1162},"まだ決めていません。",{"type":28},{"type":16,"text":1165},"ここまで書いておいて何なんだという話ですが、本当に決めていません。",{"type":19,"content":1167},[1168],{"type":16,"text":1169},"Kubernetesを使えば、欲しいものは一通りそれなりに揃います。が、VPSで小規模なワークロードを高密度に詰めたいという用途では、やっぱりオーバーヘッドが気になります。",{"type":19,"content":1171},[1172,1174,1175],{"type":16,"text":1173},"軽量化という意味ではK3sがあります。K3sはKubernetes自体を大幅に軽量化していますが、その下には普通のLinux distributionが必要になります。",{"type":28},{"type":16,"text":1176},"一方のTalosは、別にK3sより軽いわけではなく、ホストOSとして綺麗なのであって、upstream Kubernetesそのものを軽量化してくれるものではないからです。",{"type":19,"content":1178},[1179],{"type":16,"text":1180},"Talosのような運用モデルで、K3sくらい軽量なKubernetesが動けばかなり嬉しいのですが、どうも都合よく存在してくれることはありませんでした。",{"type":19,"content":1182},[1183],{"type":16,"text":1184},"何かしらが足りない近しいものはいくつか見つけられたのですが、足りない部分を自分で補おうとすると、またKubernetesに近づいてしまいます。",{"type":10,"attrs":1186,"content":1187},{"level":12,"id":13},[1188],{"type":16,"text":326},{"type":19,"content":1190},[1191],{"type":16,"text":1192},"Docker Composeで困らない規模なら、Docker Composeを使えばいいと思いますし、単一ホストで収まるなら、無理にクラスタを作る必要もありません。",{"type":19,"content":1194},[1195,1197,1198],{"type":16,"text":1196},"ただ、要求を増やしていくと、最終的には「それKubernetesでできるよ」という話になってしまいます。",{"type":28},{"type":16,"text":1199},"そんなことはとっくの昔から知っています。",{"type":19,"content":1201},[1202],{"type":16,"text":1203},"それを避けたくて色々試していたわけですが、どうもこれらの要件を満たしたいのであれば、Kubernetesを使うのが一番素直なのかもしれません。",{"type":19,"content":1205},[1206],{"type":16,"text":1207},"やはりKubernetesからは逃れられないようです。","どうも、わたしです。最近、安価なVPS上で複数のワークロードをいい感じに収容する方法について考えています。こんなツイートが伸びるくらいなので、もしかしたら多くの人が気になっているのではないでしょうか。このような用途の多くは既にサーバレスへ代替されてしまっているのでしょうが、私がやりたいのは、常時起動",5361,[1211,1215,1216],{"id":1212,"name":1213,"slug":1214},"fwj_nwhj1-s","サーバー","server",{"id":365,"name":366,"slug":367},{"id":373,"name":374,"slug":375},"2026-09-05T17:43:52.489Z","2026-09-05T16:58:20.431Z","2026-09-05T21:50:20.484Z"]