[{"data":1,"prerenderedAt":721},["ShallowReactive",2],{"article-2025-my-oss-projects":3,"articles-[]":577},{"id":4,"title":5,"alt":5,"body":6,"category":561,"cover":562,"createDate":563,"description":16,"extension":564,"homepage":84,"meta":565,"navigation":84,"path":569,"recommend":570,"seo":571,"showCover":84,"slug":572,"stem":573,"tag":574,"updated":563,"__hash__":576},"articles\u002Farticles\u002F2025\u002Fmy-oss-projects.md","今まで作った OSS プロジェクト",{"type":7,"value":8,"toc":553},"minimark",[9,13,17,21,24,38,41,47,217,220,245,249,252,255,258,428,435,446,450,457,460,467,476,494,498,501,509,512,519,522,540,543,546,549],[10,11,12],"h2",{"id":12},"はじめに",[14,15,16],"p",{},"今まで、いくつか OSS プロジェクトを作ってきたので紹介します。番外編まで含めると全部で5つあります。",[10,18,20],{"id":19},"eslint-plugin-pattern-rules","ESLint Plugin Pattern Rules",[14,22,23],{},"ESLint のプラグインです。禁止ワードと必須ワードを正規表現で設定できます。",[25,26,27,35],"ul",{},[28,29,30,34],"li",{},[31,32,33],"code",{},"\u002Fpages","ディレクトリでは必ずメタデータを設定する関数を呼び出さなければならない",[28,36,37],{},"ライブラリで非推奨となった関数をエラーとしたい",[14,39,40],{},"例えば上記のような状況を想定しています。",[14,42,43,46],{},[31,44,45],{},"eslint.config.js","はこんな感じで書くことができます。",[48,49,54],"pre",{"className":50,"code":51,"language":52,"meta":53,"style":53},"language-js shiki shiki-themes github-light github-dark","import patternRules from 'eslint-plugin-pattern-rules';\n\nexport default [\n  {\n    files: [\"*.js\", \"*.ts\"],\n    plugins: {\n      'pattern-rules': patternRules,\n    },\n    rules: {\n      \u002F\u002F forbidde* を禁止に\n      'pattern-rules\u002Fbanned': ['error', { patterns: [\"forbidde*\"] }],\n      \u002F\u002F required を必須に\n      'pattern-rules\u002Frequired': ['error', { patterns: [\"required\"] }],\n    },\n  },\n];\n","js","",[31,55,56,79,86,98,104,122,128,137,143,149,156,177,183,200,205,211],{"__ignoreMap":53},[57,58,61,65,69,72,76],"span",{"class":59,"line":60},"line",1,[57,62,64],{"class":63},"szBVR","import",[57,66,68],{"class":67},"sVt8B"," patternRules ",[57,70,71],{"class":63},"from",[57,73,75],{"class":74},"sZZnC"," 'eslint-plugin-pattern-rules'",[57,77,78],{"class":67},";\n",[57,80,82],{"class":59,"line":81},2,[57,83,85],{"emptyLinePlaceholder":84},true,"\n",[57,87,89,92,95],{"class":59,"line":88},3,[57,90,91],{"class":63},"export",[57,93,94],{"class":63}," default",[57,96,97],{"class":67}," [\n",[57,99,101],{"class":59,"line":100},4,[57,102,103],{"class":67},"  {\n",[57,105,107,110,113,116,119],{"class":59,"line":106},5,[57,108,109],{"class":67},"    files: [",[57,111,112],{"class":74},"\"*.js\"",[57,114,115],{"class":67},", ",[57,117,118],{"class":74},"\"*.ts\"",[57,120,121],{"class":67},"],\n",[57,123,125],{"class":59,"line":124},6,[57,126,127],{"class":67},"    plugins: {\n",[57,129,131,134],{"class":59,"line":130},7,[57,132,133],{"class":74},"      'pattern-rules'",[57,135,136],{"class":67},": patternRules,\n",[57,138,140],{"class":59,"line":139},8,[57,141,142],{"class":67},"    },\n",[57,144,146],{"class":59,"line":145},9,[57,147,148],{"class":67},"    rules: {\n",[57,150,152],{"class":59,"line":151},10,[57,153,155],{"class":154},"sJ8bj","      \u002F\u002F forbidde* を禁止に\n",[57,157,159,162,165,168,171,174],{"class":59,"line":158},11,[57,160,161],{"class":74},"      'pattern-rules\u002Fbanned'",[57,163,164],{"class":67},": [",[57,166,167],{"class":74},"'error'",[57,169,170],{"class":67},", { patterns: [",[57,172,173],{"class":74},"\"forbidde*\"",[57,175,176],{"class":67},"] }],\n",[57,178,180],{"class":59,"line":179},12,[57,181,182],{"class":154},"      \u002F\u002F required を必須に\n",[57,184,186,189,191,193,195,198],{"class":59,"line":185},13,[57,187,188],{"class":74},"      'pattern-rules\u002Frequired'",[57,190,164],{"class":67},[57,192,167],{"class":74},[57,194,170],{"class":67},[57,196,197],{"class":74},"\"required\"",[57,199,176],{"class":67},[57,201,203],{"class":59,"line":202},14,[57,204,142],{"class":67},[57,206,208],{"class":59,"line":207},15,[57,209,210],{"class":67},"  },\n",[57,212,214],{"class":59,"line":213},16,[57,215,216],{"class":67},"];\n",[14,218,219],{},"自分が欲しかったから作りました。実際、結構使っていて重宝しています。",[25,221,222,235],{},[28,223,224,228,229],{},[225,226,227],"strong",{},"Web:"," ",[230,231,20],"a",{"href":232,"rel":233},"https:\u002F\u002Fpattern-rules.takasqr.dev\u002Fja",[234],"nofollow",[28,236,237,228,240],{},[225,238,239],{},"GitHub:",[230,241,244],{"href":242,"rel":243},"https:\u002F\u002Fgithub.com\u002Ftakasqr\u002Feslint-plugin-pattern-rules",[234],"takasqr\u002Feslint-plugin-pattern-rules",[10,246,248],{"id":247},"hono-firebase-functions","Hono Firebase Functions",[14,250,251],{},"Firebase Functions の中で Hono を使いたくて作りました。これも欲しいものがなかったから作ったやつです。",[14,253,254],{},"Hono の Lambda のアダプタを少し参考にしながら作りました。Hono の Web 標準を基準にしているところの素晴らしさと面白さを感じることができました。",[14,256,257],{},"こんな感じで書くことができます。",[48,259,263],{"className":260,"code":261,"language":262,"meta":53,"style":53},"language-ts shiki shiki-themes github-light github-dark","import {onRequest} from \"firebase-functions\u002Fv2\u002Fhttps\";\nimport {handle} from \"hono-firebase-functions\";\nimport {Hono} from \"hono\";\n\nconst app = new Hono();\n\n\u002F\u002F Hono を定義\napp.get(\"\u002F\", (c) => {\n  return c.text(\"Hello Hono!\");\n});\n\n\u002F\u002F Firebase Functions を定義\nexport const hono = onRequest(handle(app));\n","ts",[31,264,265,279,293,307,311,333,337,342,372,391,396,400,405],{"__ignoreMap":53},[57,266,267,269,272,274,277],{"class":59,"line":60},[57,268,64],{"class":63},[57,270,271],{"class":67}," {onRequest} ",[57,273,71],{"class":63},[57,275,276],{"class":74}," \"firebase-functions\u002Fv2\u002Fhttps\"",[57,278,78],{"class":67},[57,280,281,283,286,288,291],{"class":59,"line":81},[57,282,64],{"class":63},[57,284,285],{"class":67}," {handle} ",[57,287,71],{"class":63},[57,289,290],{"class":74}," \"hono-firebase-functions\"",[57,292,78],{"class":67},[57,294,295,297,300,302,305],{"class":59,"line":88},[57,296,64],{"class":63},[57,298,299],{"class":67}," {Hono} ",[57,301,71],{"class":63},[57,303,304],{"class":74}," \"hono\"",[57,306,78],{"class":67},[57,308,309],{"class":59,"line":100},[57,310,85],{"emptyLinePlaceholder":84},[57,312,313,316,320,323,326,330],{"class":59,"line":106},[57,314,315],{"class":63},"const",[57,317,319],{"class":318},"sj4cs"," app",[57,321,322],{"class":63}," =",[57,324,325],{"class":63}," new",[57,327,329],{"class":328},"sScJk"," Hono",[57,331,332],{"class":67},"();\n",[57,334,335],{"class":59,"line":124},[57,336,85],{"emptyLinePlaceholder":84},[57,338,339],{"class":59,"line":130},[57,340,341],{"class":154},"\u002F\u002F Hono を定義\n",[57,343,344,347,350,353,356,359,363,366,369],{"class":59,"line":139},[57,345,346],{"class":67},"app.",[57,348,349],{"class":328},"get",[57,351,352],{"class":67},"(",[57,354,355],{"class":74},"\"\u002F\"",[57,357,358],{"class":67},", (",[57,360,362],{"class":361},"s4XuR","c",[57,364,365],{"class":67},") ",[57,367,368],{"class":63},"=>",[57,370,371],{"class":67}," {\n",[57,373,374,377,380,383,385,388],{"class":59,"line":145},[57,375,376],{"class":63},"  return",[57,378,379],{"class":67}," c.",[57,381,382],{"class":328},"text",[57,384,352],{"class":67},[57,386,387],{"class":74},"\"Hello Hono!\"",[57,389,390],{"class":67},");\n",[57,392,393],{"class":59,"line":151},[57,394,395],{"class":67},"});\n",[57,397,398],{"class":59,"line":158},[57,399,85],{"emptyLinePlaceholder":84},[57,401,402],{"class":59,"line":179},[57,403,404],{"class":154},"\u002F\u002F Firebase Functions を定義\n",[57,406,407,409,412,415,417,420,422,425],{"class":59,"line":185},[57,408,91],{"class":63},[57,410,411],{"class":63}," const",[57,413,414],{"class":318}," hono",[57,416,322],{"class":63},[57,418,419],{"class":328}," onRequest",[57,421,352],{"class":67},[57,423,424],{"class":328},"handle",[57,426,427],{"class":67},"(app));\n",[14,429,430,431,434],{},"まだ、Firebase Functions の",[31,432,433],{},"onRequest","にしか対応してないのですが、他の種類にも対応させようと思っています。",[25,436,437],{},[28,438,439,228,441],{},[225,440,239],{},[230,442,445],{"href":443,"rel":444},"https:\u002F\u002Fgithub.com\u002Ftakasqr\u002Fhono-firebase-functions",[234],"takasqr\u002Fhono-firebase-functions",[10,447,449],{"id":448},"vanilla-vue-ui","Vanilla Vue UI",[14,451,452,453,456],{},"Vue + Tailwind の UI ライブラリです。あまりクセのないプレーンな UI ライブラリという意味で",[31,454,455],{},"Vanilla","というワードを使っています。",[14,458,459],{},"元々 UI ライブラリは GitHub Packages でプライベートで作っていたのですが、公開できるものは公開しようということで作りました。ダークモード対応です。",[14,461,462,463,466],{},"Vanilla Vue なので、V が2つで W をプレフィックスにしています。",[31,464,465],{},"w-button","のように宣言します。",[14,468,469,470,475],{},"コンポーネントは Storybook で管理していて、静的サイトにビルドして",[230,471,474],{"href":472,"rel":473},"https:\u002F\u002Fui.takasqr.dev\u002F",[234],"公開","しています。",[25,477,478,485],{},[28,479,480,228,482],{},[225,481,227],{},[230,483,449],{"href":472,"rel":484},[234],[28,486,487,228,489],{},[225,488,239],{},[230,490,493],{"href":491,"rel":492},"https:\u002F\u002Fgithub.com\u002Ftakasqr\u002Fvanilla-vue-ui",[234],"takasqr\u002Fvanilla-vue-ui",[10,495,497],{"id":496},"japanjs","JapanJS",[14,499,500],{},"日本に関連する処理をツール化して詰め合わせたライブラリです。丁度、ツリーシェイキングを勉強していて、対応したライブラリを作りたかったので作りました。",[25,502,503,506],{},[28,504,505],{},"カナ変換",[28,507,508],{},"都道府県一覧",[14,510,511],{},"みたいな処理を詰め合わせています。",[14,513,514,515,518],{},"JapanJS というワードが npm と",[31,516,517],{},".org","ドメインで空いていたからというのも大きいです。笑",[14,520,521],{},"npm でライブラリ名が空いてない問題、結構あると思っています。",[25,523,524,532],{},[28,525,526,228,528],{},[225,527,227],{},[230,529,497],{"href":530,"rel":531},"https:\u002F\u002Fgithub.com\u002Fjapanjsorg\u002Fjapanjs",[234],[28,533,534,228,536],{},[225,535,239],{},[230,537,539],{"href":530,"rel":538},[234],"japanjsorg\u002Fjapanjs",[10,541,542],{"id":542},"さいごに",[14,544,545],{},"どれもたくさんの人が使っているわけではないです。というか多分、自分以外誰も使っていないです。笑",[14,547,548],{},"でも OSS でライブラリを作るのは楽しいのでこれからも続けていこうと思っています。",[550,551,552],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":53,"searchDepth":81,"depth":81,"links":554},[555,556,557,558,559,560],{"id":12,"depth":81,"text":12},{"id":19,"depth":81,"text":20},{"id":247,"depth":81,"text":248},{"id":448,"depth":81,"text":449},{"id":496,"depth":81,"text":497},{"id":542,"depth":81,"text":542},"oss","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","2025\u002F04\u002F02","md",{"emoji":566,"type":567,"topics":568,"published":84},"🧪","tech",[],"\u002Farticles\u002F2025\u002Fmy-oss-projects",false,{"title":5,"description":16},"my-oss-projects","articles\u002F2025\u002Fmy-oss-projects",[575],"OSS","BpxuEEVq0CTIX2MNvB3zOgvaOvxNToaBfxoBqWh5i1A",{"items":578,"total":720},[579,589,597,603,611,619,626,635,642,652,662,669,676,680,687,696,706,713],{"_path":580,"title":581,"description":582,"cover":583,"alt":581,"category":584,"categoryBasePath":585,"tags":586,"createDate":587,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\u002Farticles\u002F2026\u002Fmy-app-stack\u002F","2年半のフルプラットフォーム開発について全部書く","2年半前、人生で一番追い詰められたプロジェクトが終わりました。少しだけ時間に余裕ができたので、個人で運用していたWebアプリをリプレイスすることにしました。そしてあれこれ試行錯誤していたら、2年半経っていました。やりたかった事を一通りやり切ることができたので、こだわり部分を紹介します。","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","other","\u002Farticles\u002Fcategory\u002Fother\u002F",[],"2026\u002F04\u002F08","ja",{"_path":590,"title":591,"description":592,"cover":593,"alt":593,"category":53,"categoryBasePath":594,"tags":595,"createDate":596,"homepage":570,"recommend":570,"showCover":570,"lang":588},"\u002Farticles\u002F2026\u002Fthe-goal\u002F","『ザ・ゴール ― 企業の究極の目的とは何か』を読んだ","「ザ・ゴール ― 企業の究極の目的とは何か」を読みました。",null,"\u002Farticles\u002Fcategory\u002F",[],"2026\u002F02\u002F10",{"_path":598,"title":599,"description":600,"cover":593,"alt":593,"category":53,"categoryBasePath":594,"tags":601,"createDate":602,"homepage":570,"recommend":570,"showCover":570,"lang":588},"\u002Farticles\u002F2026\u002Ftidy-first\u002F","『Tidy First? ―個人で実践する経験主義的ソフトウェア設計』を読んだ","「Tidy First? ―個人で実践する経験主義的ソフトウェア設計」を読んだ。",[],"2026\u002F01\u002F31",{"_path":604,"title":605,"description":53,"cover":606,"alt":605,"category":607,"categoryBasePath":608,"tags":609,"createDate":610,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\u002Farticles\u002F2025\u002Fcapacitor\u002F","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":612,"title":613,"description":614,"cover":615,"alt":613,"category":584,"categoryBasePath":585,"tags":616,"createDate":617,"updated":618,"homepage":570,"recommend":570,"showCover":84,"lang":588},"\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":620,"title":621,"description":622,"cover":623,"alt":621,"category":584,"categoryBasePath":585,"tags":624,"createDate":625,"updated":625,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\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":627,"title":628,"description":629,"cover":630,"alt":628,"category":631,"categoryBasePath":632,"tags":633,"createDate":634,"updated":634,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\u002Farticles\u002F2025\u002Fhosting-storybook\u002F","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":636,"title":637,"description":638,"cover":639,"alt":637,"category":584,"categoryBasePath":585,"tags":640,"createDate":641,"updated":641,"homepage":570,"recommend":570,"showCover":84,"lang":588},"\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":643,"title":644,"description":645,"cover":646,"alt":644,"category":647,"categoryBasePath":648,"tags":649,"createDate":651,"updated":651,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\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",[650],"AI","2025\u002F05\u002F01",{"_path":653,"title":654,"description":655,"cover":656,"alt":654,"category":657,"categoryBasePath":658,"tags":659,"createDate":660,"updated":661,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\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":663,"title":664,"description":665,"cover":666,"alt":664,"category":584,"categoryBasePath":585,"tags":667,"createDate":668,"updated":668,"homepage":570,"recommend":570,"showCover":84,"lang":588},"\u002Farticles\u002F2025\u002Fphysical-bookstore\u002F","リアル書店の選書体験","今回で改めて書店の良さに気付けたのが良かったです。ただ、ネット通販や電子書籍には手軽に買えるなど別の良さがあると思ってます。なのでうまく使い分けていきたいです。","https:\u002F\u002Fasset.hirameki.dev\u002Fimg%2Fblog%2Fjournal%2F2025%2F20250425%2F20250425_010.webp?alt=media",[],"2025\u002F04\u002F25",{"_path":670,"title":671,"description":672,"cover":673,"alt":671,"category":647,"categoryBasePath":648,"tags":674,"createDate":675,"updated":675,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\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",[650],"2025\u002F04\u002F16",{"_path":677,"title":5,"description":16,"cover":562,"alt":5,"category":561,"categoryBasePath":678,"tags":679,"createDate":563,"updated":563,"homepage":84,"recommend":570,"showCover":84,"lang":588},"\u002Farticles\u002F2025\u002Fmy-oss-projects\u002F","\u002Farticles\u002Fcategory\u002Foss\u002F",[575],{"_path":681,"title":682,"description":683,"cover":684,"alt":682,"category":584,"categoryBasePath":585,"tags":685,"createDate":686,"updated":686,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\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":688,"title":689,"description":690,"cover":691,"alt":689,"category":692,"categoryBasePath":693,"tags":694,"createDate":695,"updated":695,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\u002Farticles\u002F2025\u002Fcloudflare-workers-cache-layer\u002F","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":697,"title":698,"description":699,"cover":700,"alt":698,"category":701,"categoryBasePath":702,"tags":703,"createDate":704,"updated":705,"homepage":84,"recommend":570,"showCover":84,"lang":588},"\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":707,"title":708,"description":709,"cover":710,"alt":708,"category":584,"categoryBasePath":585,"tags":711,"createDate":712,"updated":712,"homepage":84,"recommend":84,"showCover":84,"lang":588},"\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":714,"title":715,"description":716,"cover":717,"alt":715,"category":584,"categoryBasePath":585,"tags":718,"createDate":719,"updated":719,"homepage":570,"recommend":84,"showCover":84,"lang":588},"\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,1776498755836]