[{"data":1,"prerenderedAt":1163},["ShallowReactive",2],{"post-\u002Fposts\u002Fgithub-actions-intro":3,"all-posts-nav":889},{"id":4,"title":5,"body":6,"categories":875,"date":877,"description":12,"draft":878,"extension":879,"hidden":878,"meta":880,"navigation":100,"path":881,"published":878,"seo":882,"stem":883,"tags":884,"__hash__":888},"posts\u002Fposts\u002Fgithub-actions-intro.md","GitHub Actions 入门：自动化你的工作流",{"type":7,"value":8,"toc":865},"minimark",[9,13,17,66,69,179,182,272,276,494,498,505,549,552,611,621,625,693,696,701,739,744,844,861],[10,11,12],"p",{},"GitHub Actions 是 GitHub 内置的 CI\u002FCD 平台，可以在代码推送、PR 创建等事件触发时自动执行任务。本文介绍基本用法。",[14,15,16],"h2",{"id":16},"核心概念",[18,19,20,32,48,54,60],"ul",{},[21,22,23,27,28],"li",{},[24,25,26],"strong",{},"Workflow","：工作流，定义在 ",[29,30,31],"code",{},".github\u002Fworkflows\u002F*.yml",[21,33,34,37,38,41,42,41,45],{},[24,35,36],{},"Event","：触发条件，如 ",[29,39,40],{},"push","、",[29,43,44],{},"pull_request",[29,46,47],{},"schedule",[21,49,50,53],{},[24,51,52],{},"Job","：工作流中的一个任务，运行在独立的虚拟机上",[21,55,56,59],{},[24,57,58],{},"Step","：Job 中的单个步骤，可以是命令或 Action",[21,61,62,65],{},[24,63,64],{},"Action","：可复用的步骤单元，来自 GitHub Marketplace 或自定义",[14,67,68],{"id":68},"最简单的例子",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-yaml shiki shiki-themes github-dark-dimmed github-light","name: Hello World\n\non: push\n\njobs:\n  greet:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Say hello\n        run: echo \"Hello, GitHub Actions!\"\n","yaml","",[29,77,78,95,102,114,119,128,136,147,155,168],{"__ignoreMap":75},[79,80,83,87,91],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"shb1k","name",[79,88,90],{"class":89},"ssh_m",": ",[79,92,94],{"class":93},"sXfbr","Hello World\n",[79,96,98],{"class":81,"line":97},2,[79,99,101],{"emptyLinePlaceholder":100},true,"\n",[79,103,105,109,111],{"class":81,"line":104},3,[79,106,108],{"class":107},"swcJU","on",[79,110,90],{"class":89},[79,112,113],{"class":93},"push\n",[79,115,117],{"class":81,"line":116},4,[79,118,101],{"emptyLinePlaceholder":100},[79,120,122,125],{"class":81,"line":121},5,[79,123,124],{"class":85},"jobs",[79,126,127],{"class":89},":\n",[79,129,131,134],{"class":81,"line":130},6,[79,132,133],{"class":85},"  greet",[79,135,127],{"class":89},[79,137,139,142,144],{"class":81,"line":138},7,[79,140,141],{"class":85},"    runs-on",[79,143,90],{"class":89},[79,145,146],{"class":93},"ubuntu-latest\n",[79,148,150,153],{"class":81,"line":149},8,[79,151,152],{"class":85},"    steps",[79,154,127],{"class":89},[79,156,158,161,163,165],{"class":81,"line":157},9,[79,159,160],{"class":89},"      - ",[79,162,86],{"class":85},[79,164,90],{"class":89},[79,166,167],{"class":93},"Say hello\n",[79,169,171,174,176],{"class":81,"line":170},10,[79,172,173],{"class":85},"        run",[79,175,90],{"class":89},[79,177,178],{"class":93},"echo \"Hello, GitHub Actions!\"\n",[14,180,181],{"id":181},"常用触发条件",[70,183,185],{"className":72,"code":184,"language":74,"meta":75,"style":75},"on:\n  push:\n    branches: [main, develop]\n  pull_request:\n    branches: [main]\n  schedule:\n    - cron: '0 9 * * 1'  # 每周一早上 9 点\n  workflow_dispatch:       # 手动触发\n",[29,186,187,193,200,220,227,237,244,261],{"__ignoreMap":75},[79,188,189,191],{"class":81,"line":82},[79,190,108],{"class":107},[79,192,127],{"class":89},[79,194,195,198],{"class":81,"line":97},[79,196,197],{"class":85},"  push",[79,199,127],{"class":89},[79,201,202,205,208,211,214,217],{"class":81,"line":104},[79,203,204],{"class":85},"    branches",[79,206,207],{"class":89},": [",[79,209,210],{"class":93},"main",[79,212,213],{"class":89},", ",[79,215,216],{"class":93},"develop",[79,218,219],{"class":89},"]\n",[79,221,222,225],{"class":81,"line":116},[79,223,224],{"class":85},"  pull_request",[79,226,127],{"class":89},[79,228,229,231,233,235],{"class":81,"line":121},[79,230,204],{"class":85},[79,232,207],{"class":89},[79,234,210],{"class":93},[79,236,219],{"class":89},[79,238,239,242],{"class":81,"line":130},[79,240,241],{"class":85},"  schedule",[79,243,127],{"class":89},[79,245,246,249,252,254,257],{"class":81,"line":138},[79,247,248],{"class":89},"    - ",[79,250,251],{"class":85},"cron",[79,253,90],{"class":89},[79,255,256],{"class":93},"'0 9 * * 1'",[79,258,260],{"class":259},"sgHix","  # 每周一早上 9 点\n",[79,262,263,266,269],{"class":81,"line":149},[79,264,265],{"class":85},"  workflow_dispatch",[79,267,268],{"class":89},":       ",[79,270,271],{"class":259},"# 手动触发\n",[14,273,275],{"id":274},"实用示例nodejs-项目-ci","实用示例：Node.js 项目 CI",[70,277,279],{"className":72,"code":278,"language":74,"meta":75,"style":75},"name: CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version: [18, 20]\n\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Setup Node.js ${{ matrix.node-version }}\n        uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: 'npm'\n\n      - run: npm ci\n      - run: npm test\n",[29,280,281,290,294,300,306,316,322,326,332,339,347,355,363,381,386,393,406,411,423,434,442,453,464,469,482],{"__ignoreMap":75},[79,282,283,285,287],{"class":81,"line":82},[79,284,86],{"class":85},[79,286,90],{"class":89},[79,288,289],{"class":93},"CI\n",[79,291,292],{"class":81,"line":97},[79,293,101],{"emptyLinePlaceholder":100},[79,295,296,298],{"class":81,"line":104},[79,297,108],{"class":107},[79,299,127],{"class":89},[79,301,302,304],{"class":81,"line":116},[79,303,197],{"class":85},[79,305,127],{"class":89},[79,307,308,310,312,314],{"class":81,"line":121},[79,309,204],{"class":85},[79,311,207],{"class":89},[79,313,210],{"class":93},[79,315,219],{"class":89},[79,317,318,320],{"class":81,"line":130},[79,319,224],{"class":85},[79,321,127],{"class":89},[79,323,324],{"class":81,"line":138},[79,325,101],{"emptyLinePlaceholder":100},[79,327,328,330],{"class":81,"line":149},[79,329,124],{"class":85},[79,331,127],{"class":89},[79,333,334,337],{"class":81,"line":157},[79,335,336],{"class":85},"  test",[79,338,127],{"class":89},[79,340,341,343,345],{"class":81,"line":170},[79,342,141],{"class":85},[79,344,90],{"class":89},[79,346,146],{"class":93},[79,348,350,353],{"class":81,"line":349},11,[79,351,352],{"class":85},"    strategy",[79,354,127],{"class":89},[79,356,358,361],{"class":81,"line":357},12,[79,359,360],{"class":85},"      matrix",[79,362,127],{"class":89},[79,364,366,369,371,374,376,379],{"class":81,"line":365},13,[79,367,368],{"class":85},"        node-version",[79,370,207],{"class":89},[79,372,373],{"class":107},"18",[79,375,213],{"class":89},[79,377,378],{"class":107},"20",[79,380,219],{"class":89},[79,382,384],{"class":81,"line":383},14,[79,385,101],{"emptyLinePlaceholder":100},[79,387,389,391],{"class":81,"line":388},15,[79,390,152],{"class":85},[79,392,127],{"class":89},[79,394,396,398,401,403],{"class":81,"line":395},16,[79,397,160],{"class":89},[79,399,400],{"class":85},"uses",[79,402,90],{"class":89},[79,404,405],{"class":93},"actions\u002Fcheckout@v4\n",[79,407,409],{"class":81,"line":408},17,[79,410,101],{"emptyLinePlaceholder":100},[79,412,414,416,418,420],{"class":81,"line":413},18,[79,415,160],{"class":89},[79,417,86],{"class":85},[79,419,90],{"class":89},[79,421,422],{"class":93},"Setup Node.js ${{ matrix.node-version }}\n",[79,424,426,429,431],{"class":81,"line":425},19,[79,427,428],{"class":85},"        uses",[79,430,90],{"class":89},[79,432,433],{"class":93},"actions\u002Fsetup-node@v4\n",[79,435,437,440],{"class":81,"line":436},20,[79,438,439],{"class":85},"        with",[79,441,127],{"class":89},[79,443,445,448,450],{"class":81,"line":444},21,[79,446,447],{"class":85},"          node-version",[79,449,90],{"class":89},[79,451,452],{"class":93},"${{ matrix.node-version }}\n",[79,454,456,459,461],{"class":81,"line":455},22,[79,457,458],{"class":85},"          cache",[79,460,90],{"class":89},[79,462,463],{"class":93},"'npm'\n",[79,465,467],{"class":81,"line":466},23,[79,468,101],{"emptyLinePlaceholder":100},[79,470,472,474,477,479],{"class":81,"line":471},24,[79,473,160],{"class":89},[79,475,476],{"class":85},"run",[79,478,90],{"class":89},[79,480,481],{"class":93},"npm ci\n",[79,483,485,487,489,491],{"class":81,"line":484},25,[79,486,160],{"class":89},[79,488,476],{"class":85},[79,490,90],{"class":89},[79,492,493],{"class":93},"npm test\n",[14,495,497],{"id":496},"使用-secrets","使用 Secrets",[10,499,500,501,504],{},"敏感信息（Token、密钥）存在仓库的 Settings → Secrets 中，通过 ",[29,502,503],{},"${{ secrets.MY_SECRET }}"," 引用：",[70,506,508],{"className":72,"code":507,"language":74,"meta":75,"style":75},"- name: Deploy\n  env:\n    API_TOKEN: ${{ secrets.API_TOKEN }}\n  run: .\u002Fdeploy.sh\n",[29,509,510,522,529,539],{"__ignoreMap":75},[79,511,512,515,517,519],{"class":81,"line":82},[79,513,514],{"class":89},"- ",[79,516,86],{"class":85},[79,518,90],{"class":89},[79,520,521],{"class":93},"Deploy\n",[79,523,524,527],{"class":81,"line":97},[79,525,526],{"class":85},"  env",[79,528,127],{"class":89},[79,530,531,534,536],{"class":81,"line":104},[79,532,533],{"class":85},"    API_TOKEN",[79,535,90],{"class":89},[79,537,538],{"class":93},"${{ secrets.API_TOKEN }}\n",[79,540,541,544,546],{"class":81,"line":116},[79,542,543],{"class":85},"  run",[79,545,90],{"class":89},[79,547,548],{"class":93},".\u002Fdeploy.sh\n",[14,550,551],{"id":551},"缓存依赖",[70,553,555],{"className":72,"code":554,"language":74,"meta":75,"style":75},"- uses: actions\u002Fcache@v4\n  with:\n    path: ~\u002F.npm\n    key: ${{ runner.os }}-node-${{ hashFiles('**\u002Fpackage-lock.json') }}\n    restore-keys: |\n      ${{ runner.os }}-node-\n",[29,556,557,568,575,585,595,606],{"__ignoreMap":75},[79,558,559,561,563,565],{"class":81,"line":82},[79,560,514],{"class":89},[79,562,400],{"class":85},[79,564,90],{"class":89},[79,566,567],{"class":93},"actions\u002Fcache@v4\n",[79,569,570,573],{"class":81,"line":97},[79,571,572],{"class":85},"  with",[79,574,127],{"class":89},[79,576,577,580,582],{"class":81,"line":104},[79,578,579],{"class":85},"    path",[79,581,90],{"class":89},[79,583,584],{"class":93},"~\u002F.npm\n",[79,586,587,590,592],{"class":81,"line":116},[79,588,589],{"class":85},"    key",[79,591,90],{"class":89},[79,593,594],{"class":93},"${{ runner.os }}-node-${{ hashFiles('**\u002Fpackage-lock.json') }}\n",[79,596,597,600,602],{"class":81,"line":121},[79,598,599],{"class":85},"    restore-keys",[79,601,90],{"class":89},[79,603,605],{"class":604},"s6PUj","|\n",[79,607,608],{"class":81,"line":130},[79,609,610],{"class":93},"      ${{ runner.os }}-node-\n",[10,612,613,616,617,620],{},[29,614,615],{},"actions\u002Fsetup-node"," 的 ",[29,618,619],{},"cache: 'npm'"," 参数会自动处理缓存，大多数情况下不需要手动配置。",[14,622,624],{"id":623},"常用-actions","常用 Actions",[626,627,628,640],"table",{},[629,630,631],"thead",{},[632,633,634,637],"tr",{},[635,636,64],"th",{},[635,638,639],{},"用途",[641,642,643,654,663,673,683],"tbody",{},[632,644,645,651],{},[646,647,648],"td",{},[29,649,650],{},"actions\u002Fcheckout",[646,652,653],{},"检出代码",[632,655,656,660],{},[646,657,658],{},[29,659,615],{},[646,661,662],{},"配置 Node.js",[632,664,665,670],{},[646,666,667],{},[29,668,669],{},"actions\u002Fsetup-python",[646,671,672],{},"配置 Python",[632,674,675,680],{},[646,676,677],{},[29,678,679],{},"actions\u002Fupload-artifact",[646,681,682],{},"上传构建产物",[632,684,685,690],{},[646,686,687],{},[29,688,689],{},"peaceiris\u002Factions-gh-pages",[646,691,692],{},"部署到 GitHub Pages",[14,694,695],{"id":695},"小技巧",[10,697,698],{},[24,699,700],{},"只在特定路径变更时触发：",[70,702,704],{"className":72,"code":703,"language":74,"meta":75,"style":75},"on:\n  push:\n    paths:\n      - 'src\u002F**'\n      - 'package.json'\n",[29,705,706,712,718,725,732],{"__ignoreMap":75},[79,707,708,710],{"class":81,"line":82},[79,709,108],{"class":107},[79,711,127],{"class":89},[79,713,714,716],{"class":81,"line":97},[79,715,197],{"class":85},[79,717,127],{"class":89},[79,719,720,723],{"class":81,"line":104},[79,721,722],{"class":85},"    paths",[79,724,127],{"class":89},[79,726,727,729],{"class":81,"line":116},[79,728,160],{"class":89},[79,730,731],{"class":93},"'src\u002F**'\n",[79,733,734,736],{"class":81,"line":121},[79,735,160],{"class":89},[79,737,738],{"class":93},"'package.json'\n",[10,740,741],{},[24,742,743],{},"Job 之间传递数据：",[70,745,747],{"className":72,"code":746,"language":74,"meta":75,"style":75},"jobs:\n  build:\n    outputs:\n      version: ${{ steps.get-version.outputs.version }}\n    steps:\n      - id: get-version\n        run: echo \"version=$(node -p \"require('.\u002Fpackage.json').version\")\" >> $GITHUB_OUTPUT\n\n  deploy:\n    needs: build\n    steps:\n      - run: echo \"Deploying version ${{ needs.build.outputs.version }}\"\n",[29,748,749,755,762,769,779,785,797,806,810,817,827,833],{"__ignoreMap":75},[79,750,751,753],{"class":81,"line":82},[79,752,124],{"class":85},[79,754,127],{"class":89},[79,756,757,760],{"class":81,"line":97},[79,758,759],{"class":85},"  build",[79,761,127],{"class":89},[79,763,764,767],{"class":81,"line":104},[79,765,766],{"class":85},"    outputs",[79,768,127],{"class":89},[79,770,771,774,776],{"class":81,"line":116},[79,772,773],{"class":85},"      version",[79,775,90],{"class":89},[79,777,778],{"class":93},"${{ steps.get-version.outputs.version }}\n",[79,780,781,783],{"class":81,"line":121},[79,782,152],{"class":85},[79,784,127],{"class":89},[79,786,787,789,792,794],{"class":81,"line":130},[79,788,160],{"class":89},[79,790,791],{"class":85},"id",[79,793,90],{"class":89},[79,795,796],{"class":93},"get-version\n",[79,798,799,801,803],{"class":81,"line":138},[79,800,173],{"class":85},[79,802,90],{"class":89},[79,804,805],{"class":93},"echo \"version=$(node -p \"require('.\u002Fpackage.json').version\")\" >> $GITHUB_OUTPUT\n",[79,807,808],{"class":81,"line":149},[79,809,101],{"emptyLinePlaceholder":100},[79,811,812,815],{"class":81,"line":157},[79,813,814],{"class":85},"  deploy",[79,816,127],{"class":89},[79,818,819,822,824],{"class":81,"line":170},[79,820,821],{"class":85},"    needs",[79,823,90],{"class":89},[79,825,826],{"class":93},"build\n",[79,828,829,831],{"class":81,"line":349},[79,830,152],{"class":85},[79,832,127],{"class":89},[79,834,835,837,839,841],{"class":81,"line":357},[79,836,160],{"class":89},[79,838,476],{"class":85},[79,840,90],{"class":89},[79,842,843],{"class":93},"echo \"Deploying version ${{ needs.build.outputs.version }}\"\n",[10,845,846,847,854,855,860],{},"GitHub Actions 的文档很完善，遇到具体需求直接查 ",[848,849,853],"a",{"href":850,"rel":851},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions",[852],"nofollow","官方文档"," 或 ",[848,856,859],{"href":857,"rel":858},"https:\u002F\u002Fgithub.com\u002Fmarketplace?type=actions",[852],"Marketplace"," 找现成的 Action 即可。",[862,863,864],"style",{},"html pre.shiki code .shb1k, html code.shiki .shb1k{--shiki-default:#8DDB8C;--shiki-light:#22863A}html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sgHix, html code.shiki .sgHix{--shiki-default:#768390;--shiki-light:#6A737D}html pre.shiki code .s6PUj, html code.shiki .s6PUj{--shiki-default:#F47067;--shiki-light:#D73A49}",{"title":75,"searchDepth":97,"depth":104,"links":866},[867,868,869,870,871,872,873,874],{"id":16,"depth":97,"text":16},{"id":68,"depth":97,"text":68},{"id":181,"depth":97,"text":181},{"id":274,"depth":97,"text":275},{"id":496,"depth":97,"text":497},{"id":551,"depth":97,"text":551},{"id":623,"depth":97,"text":624},{"id":695,"depth":97,"text":695},[876],"技术笔记","2026-04-04 09:00:00",false,"md",{},"\u002Fposts\u002Fgithub-actions-intro",{"title":5,"description":12},"posts\u002Fgithub-actions-intro",[885,886,887],"GitHub Actions","CI\u002FCD","自动化","b0WjwVCW-wu37Aezw6WDRLqcXZi5gfSI0dWJ01ophWc",[890,903,915,921,933,942,951,961,971,980,990,1001,1013,1025,1033,1043,1055,1066,1076,1084,1095,1101,1107,1113,1121,1130,1138,1144,1152,1160],{"slug":891,"path":892,"title":893,"date":894,"tags":895,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":157},"multimodal-rag-from-scratch","\u002Fposts\u002Fmultimodal-rag-from-scratch","从零实现多模态 RAG：BM25、Dense 检索、RRF 融合、MMR 重排全部手写","2026-06-30 18:00:00",[896,897,898,899,900,901,902],"RAG","多模态","AI Infra","BM25","向量检索","混合检索","实习求职",{"slug":904,"path":905,"title":906,"date":907,"tags":908,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":349},"mini-llm-engine-deep-dive","\u002Fposts\u002Fmini-llm-engine-deep-dive","讲透 mini-llm-engine：从显存碎片到六大推理优化","2026-06-30 14:00:00",[909,898,910,911,912,913,914,902],"LLM","vLLM","PagedAttention","KV Cache","推理优化","投机解码",{"slug":916,"path":917,"title":918,"date":919,"tags":920,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":170},"mini-llm-engine-from-scratch","\u002Fposts\u002Fmini-llm-engine-from-scratch","从零实现 LLM 推理引擎：深挖 vLLM 的六大核心优化","2026-06-30 10:00:00",[909,898,910,911,913,914,902],{"slug":922,"path":923,"title":924,"date":925,"tags":926,"description":932,"draft":878,"hidden":878,"published":100,"readingTime":413},"bytedance-recommendation-architecture-intern-interview","\u002Fposts\u002Fbytedance-recommendation-architecture-intern-interview","字节推荐架构实习生 Data 面试准备：推荐系统、实时特征与高并发八股","2026-06-09",[927,928,929,930,931],"面试","推荐系统","后端架构","实时计算","字节跳动","面向字节跳动推荐架构团队实习岗位的八股准备清单，覆盖推荐系统链路、实时数据、特征服务、高并发后端、分布式系统与项目包装。",{"slug":934,"path":935,"title":936,"date":925,"tags":937,"description":941,"draft":878,"hidden":878,"published":100,"readingTime":357},"high-concurrency-rate-limiting-algorithms","\u002Fposts\u002Fhigh-concurrency-rate-limiting-algorithms","高并发限流算法：固定窗口、滑动窗口、漏桶与令牌桶",[938,939,929,940,927],"高并发","限流","系统设计","面试和工程都常见的限流算法总结，讲清楚固定窗口、滑动窗口、漏桶、令牌桶、并发数限制以及分布式限流如何落地。",{"slug":943,"path":944,"title":945,"date":925,"tags":946,"description":950,"draft":878,"hidden":878,"published":100,"readingTime":149},"kafka-producer-broker-consumer","\u002Fposts\u002Fkafka-producer-broker-consumer","Kafka 入门：生产者、Broker、消费者和“消费”到底是什么意思",[947,948,949,927,928],"Kafka","消息队列","后端","用推荐系统里的用户行为日志为例，讲清楚 Kafka 的作用、Producer、Broker、Consumer、Topic、Partition、Offset 和消费语义。",{"slug":952,"path":953,"title":954,"date":925,"tags":955,"description":960,"draft":878,"hidden":878,"published":100,"readingTime":130},"leetcode-lru-merge-k-reverse-list","\u002Fposts\u002Fleetcode-lru-merge-k-reverse-list","链表与缓存高频题：LRU Cache、合并 K 个有序链表、反转链表",[956,957,958,959,927],"算法","链表","LRU","LeetCode","面试高频算法题速记，整理 LRU Cache、合并 K 个有序链表、反转链表的核心思路、复杂度和 C++ 代码。",{"slug":962,"path":963,"title":964,"date":965,"tags":966,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":395},"meddococr-interpreter-source-analysis","\u002Fposts\u002Fmeddococr-interpreter-source-analysis","MedDocOCR-Interpreter 源码导读：医疗文档 OCR、结构化抽取与报告解读原型","2026-05-22 10:30:00",[967,897,968,896,969,970],"OCR","医疗 AI","Python","源码分析",{"slug":972,"path":973,"title":974,"date":975,"tags":976,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":170},"cet6-writing-model-essays","\u002Fposts\u002Fcet6-writing-model-essays","六级写作范文背诵包：10 个高频话题","2026-05-20 09:00:00",[977,978,979],"English","CET6","Writing",{"slug":981,"path":982,"title":983,"date":984,"tags":985,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":989},"claude-code-context-management","\u002Fposts\u002Fclaude-code-context-management","Claude Code 上下文管理机制：从 Microcompact 到 Auto Compact","2026-05-19 10:00:00",[986,987,909,898,988],"Claude Code","Agent","上下文工程",27,{"slug":991,"path":992,"title":993,"date":994,"tags":995,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":425},"nanotron-llm-pretraining-framework-analysis","\u002Fposts\u002Fnanotron-llm-pretraining-framework-analysis","Nanotron 项目详解：Hugging Face 的大模型预训练框架怎么做分布式训练","2026-05-10 12:10:00",[909,996,997,998,999,898,1000],"大模型训练","分布式训练","Nanotron","Hugging Face","PyTorch",{"slug":1002,"path":1003,"title":1004,"date":1005,"tags":1006,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":484},"gofoundry-go-backend-foundation-framework","\u002Fposts\u002Fgofoundry-go-backend-foundation-framework","GoFoundry 项目详解：基于 Go 的后端基础框架套件设计","2026-05-10 11:20:00",[1007,1008,1009,1010,1011,948,1012],"Go","后端框架","ORM","分布式缓存","分布式锁","项目架构",{"slug":1014,"path":1015,"title":1016,"date":1017,"tags":1018,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":989},"cloudvault-go-cloud-storage-system","\u002Fposts\u002Fcloudvault-go-cloud-storage-system","CloudVault 项目详解：基于 Go 的云端存储与网盘系统架构设计","2026-05-10 10:30:00",[1007,1019,1020,1021,1012,1022,1023,1024],"云存储","网盘系统","分布式系统","Redis","RabbitMQ","Elasticsearch",{"slug":1026,"path":1027,"title":1028,"date":1029,"tags":1030,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":436},"openclaw-source-code-analysis","\u002Fposts\u002Fopenclaw-source-code-analysis","OpenClaw 源码导读：个人 AI 助手的网关、通道、插件与运行时架构","2026-05-08 16:30:00",[1031,987,898,1032,970],"OpenClaw","TypeScript",{"slug":1034,"path":1035,"title":1036,"date":1037,"tags":1038,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":170},"flow-matching-generative-models","\u002Fposts\u002Fflow-matching-generative-models","Flow Matching：从噪声到数据的连续流生成模型","2026-05-07 00:00:00",[1039,1040,1041,1042],"生成模型","Diffusion","Flow Matching","深度学习",{"slug":1044,"path":1045,"title":1046,"date":1047,"tags":1048,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":388},"database-ai-week4","\u002Fposts\u002Fdatabase-ai-week4","Week 4：数据库速成——从 Storage、Index、Query Optimization 到 Vector DB 与 RAG","2026-05-05 12:00:00",[1049,1050,1051,896,1052,1053,1054],"数据库","CMU 15-445","Vector DB","LLM Memory","Query Optimization","Caching",{"slug":1056,"path":1057,"title":1058,"date":1059,"tags":1060,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":395},"distributed-systems-week3","\u002Fposts\u002Fdistributed-systems-week3","Week 3：分布式系统速成——MapReduce、Raft、容错与 Distributed KV Store","2026-05-05 11:00:00",[1021,1061,1062,1063,1064,1065,987],"MIT 6.824","MapReduce","Raft","KV Store","Ray",{"slug":1067,"path":1068,"title":1069,"date":1070,"tags":1071,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":388},"gpu-inference-acceleration-week2","\u002Fposts\u002Fgpu-inference-acceleration-week2","Week 2：GPU 与推理加速——从 Kernel、算子融合到 LLM Serving","2026-05-05 10:00:00",[1042,1072,1073,909,1074,910,1075],"GPU","推理加速","CMU 10-414","TensorRT",{"slug":1077,"path":1078,"title":1079,"date":1080,"tags":1081,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":413},"dl-framework-autograd-mini","\u002Fposts\u002Fdl-framework-autograd-mini","Week 1：DL 框架与 Autograd——从计算图、反向传播到 Mini Autograd 实现","2026-05-05 09:00:00",[1042,1082,1000,1074,1083],"Autograd","Mini Framework",{"slug":1085,"path":1086,"title":1087,"date":1088,"tags":1089,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":357},"lock-free-concurrency-notes","\u002Fposts\u002Flock-free-concurrency-notes","无锁并发入门：从 CAS 到 Atomic Ring Buffer","2026-04-25",[1090,1091,1092,1093,1094],"C++","并发","无锁编程","性能优化","量化开发",{"slug":1096,"path":1097,"title":1098,"date":1099,"tags":1100,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":121},"agent-memory","\u002Fposts\u002Fagent-memory","Agent 对话记忆化：从原理到实现","2026-04-24",[909,987,896,927],{"slug":1102,"path":1103,"title":1104,"date":1099,"tags":1105,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":130},"llm-context-compression","\u002Fposts\u002Fllm-context-compression","LLM 上下文五层压缩机制详解",[909,987,1106,927],"上下文压缩",{"slug":1108,"path":1109,"title":1110,"date":1111,"tags":1112,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":157},"cpp-concurrency-basics","\u002Fposts\u002Fcpp-concurrency-basics","C++ 并发编程入门：从数据竞争到线程池","2026-04-15",[1090,1091,927,1094],{"slug":1114,"path":1115,"title":1116,"date":1117,"tags":1118,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":82},"travel-in-shenzhen","\u002Fposts\u002Ftravel-in-shenzhen","XCPC 深圳游记","2026-04-13",[1119,1090,1120],"XCPC","比赛",{"slug":1122,"path":1123,"title":1124,"date":1125,"tags":1126,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":138},"backend-stack-deep-dive","\u002Fposts\u002Fbackend-stack-deep-dive","后端五件套：FastAPI \u002F Node.js \u002F SQLAlchemy async \u002F PostgreSQL \u002F Docker 面试速通","2026-04-07",[949,1127,1128,1129,927],"FastAPI","PostgreSQL","Docker",{"slug":1131,"path":1132,"title":1133,"date":1134,"tags":1135,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":130},"deepscientist-tech-stack","\u002Fposts\u002Fdeepscientist-tech-stack","DeepScientist 技术栈全解析：一个 AI 科研平台的架构设计","2026-04-06",[1136,1127,1137,1128,927],"全栈","Next.js",{"slug":1139,"path":1140,"title":1141,"date":1134,"tags":1142,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":149},"minicode-source-analysis","\u002Fposts\u002Fminicode-source-analysis","MiniCode 源码解析：用 5000 行 TypeScript 实现一个 AI 编程助手",[1032,1143,909,970,927],"CLI",{"slug":1145,"path":1146,"title":1147,"date":1134,"tags":1148,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":121},"nova-theme-implementation","\u002Fposts\u002Fnova-theme-implementation","我是怎么从零实现 Nova 主题的",[1149,1150,1151],"Hexo","前端","开源",{"slug":1153,"path":1154,"title":1155,"date":1156,"tags":1157,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":97},"git-cheatsheet","\u002Fposts\u002Fgit-cheatsheet","Git 常用操作备忘","2026-04-05 14:00:00",[1158,1159],"Git","工具",{"slug":1161,"path":881,"title":5,"date":877,"tags":1162,"description":75,"draft":878,"hidden":878,"published":100,"readingTime":104},"github-actions-intro",[885,886,887],1782796012143]