[{"data":1,"prerenderedAt":2246},["ShallowReactive",2],{"posts-list-1":3},{"posts":4,"total":236},[5,154,546,905,1297,1763],{"id":6,"title":7,"body":8,"date":140,"description":141,"draft":142,"extension":143,"meta":144,"navigation":145,"path":146,"seo":147,"stem":148,"summary":149,"tags":150,"__hash__":153},"posts\u002Fposts\u002Fhello-static-blog.md","用 Nuxt 4 搭一个纯静态博客",{"type":9,"value":10,"toc":132},"minimark",[11,15,20,23,26,39,42,94,97,108,111,122],[12,13,14],"p",{},"这是本站的第一篇文章，也是这份脚手架的自述。",[16,17,19],"h2",{"id":18},"为什么选-ssg","为什么选 SSG",[12,21,22],{},"博客的内容在写作时就定下来了，没有评论也没有登录，所以完全不需要服务端。把页面在构建时全部预渲染成 HTML，部署就只剩复制文件这一步。",[12,24,25],{},"好处很直接：",[27,28,29,33,36],"ul",{},[30,31,32],"li",{},"没有运行时依赖，任意静态服务器都能跑",[30,34,35],{},"首屏是现成的 HTML，不用等 JavaScript",[30,37,38],{},"出问题时不用翻日志，因为根本没有服务进程",[16,40,41],{"id":41},"技术栈",[43,44,45,58],"table",{},[46,47,48],"thead",{},[49,50,51,55],"tr",{},[52,53,54],"th",{},"用途",[52,56,57],{},"选型",[59,60,61,70,78,86],"tbody",{},[49,62,63,67],{},[64,65,66],"td",{},"框架",[64,68,69],{},"Nuxt 4",[49,71,72,75],{},[64,73,74],{},"样式",[64,76,77],{},"Tailwind CSS 4",[49,79,80,83],{},[64,81,82],{},"组件",[64,84,85],{},"daisyUI 5",[49,87,88,91],{},[64,89,90],{},"内容",[64,92,93],{},"@nuxt\u002Fcontent v3",[16,95,96],{"id":96},"目录结构",[98,99,105],"pre",{"className":100,"code":102,"language":103,"meta":104},[101],"language-text","app\u002F               页面、布局、组件、样式\ncontent\u002Fposts\u002F     Markdown 文章\nshared\u002F            页面与构建脚本共用的配置\ndeploy\u002F            nginx 示例配置\ndist\u002F              构建产物（不进 git）\n","text","",[106,107,102],"code",{"__ignoreMap":104},[16,109,110],{"id":110},"写一篇新文章",[12,112,113,114,117,118,121],{},"在 ",[106,115,116],{},"content\u002Fposts\u002F"," 下新建一个 ",[106,119,120],{},".md"," 文件，填好 frontmatter 就够了。列表页、标签页、RSS 和 sitemap 都会自动带上它。",[123,124,125],"blockquote",{},[12,126,127,128,131],{},"全部页面在 ",[106,129,130],{},"pnpm generate"," 时预渲染，因此不需要任何服务端进程。",{"title":104,"searchDepth":133,"depth":133,"links":134},3,[135,137,138,139],{"id":18,"depth":136,"text":19},2,{"id":41,"depth":136,"text":41},{"id":96,"depth":136,"text":96},{"id":110,"depth":136,"text":110},"2026-09-28","这个站点是怎么搭起来的：Nuxt 4 + Tailwind CSS 4 + daisyUI 5 + @nuxt\u002Fcontent，产物是一堆静态文件。",false,"md",{},true,"\u002Fposts\u002Fhello-static-blog",{"title":7,"description":141},"posts\u002Fhello-static-blog","从技术选型到目录结构，把这份脚手架的每一块讲清楚。",[151,152],"Nuxt","SSG","jnZfxGrQ_juLHYrvEdHpKGaNYrcgWTbDetrljxKQmM8",{"id":155,"title":156,"body":157,"date":536,"description":537,"draft":142,"extension":143,"meta":538,"navigation":145,"path":539,"seo":540,"stem":541,"summary":542,"tags":543,"__hash__":545},"posts\u002Fposts\u002Fnuxt-content-frontmatter.md","@nuxt\u002Fcontent 的 frontmatter 怎么写",{"type":9,"value":158,"toc":530},[159,166,170,328,332,396,399,483,498,501,526],[12,160,161,162,165],{},"文章元数据分两层：",[106,163,164],{},"content.config.ts"," 定义 schema，Markdown 的文件头填值。",[16,167,169],{"id":168},"定义-collection","定义 collection",[98,171,175],{"className":172,"code":173,"language":174,"meta":104,"style":104},"language-ts shiki shiki-themes github-light github-dark","import { defineCollection, defineContentConfig, z } from '@nuxt\u002Fcontent'\n\nexport default defineContentConfig({\n  collections: {\n    posts: defineCollection({\n      type: 'page',\n      source: 'posts\u002F*.md',\n      schema: z.object({\n        date: z.date(),\n        tags: z.array(z.string()).default([]),\n      }),\n    }),\n  },\n})\n","ts",[106,176,177,197,202,217,223,234,246,257,268,280,304,310,316,322],{"__ignoreMap":104},[178,179,182,186,190,193],"span",{"class":180,"line":181},"line",1,[178,183,185],{"class":184},"szBVR","import",[178,187,189],{"class":188},"sVt8B"," { defineCollection, defineContentConfig, z } ",[178,191,192],{"class":184},"from",[178,194,196],{"class":195},"sZZnC"," '@nuxt\u002Fcontent'\n",[178,198,199],{"class":180,"line":136},[178,200,201],{"emptyLinePlaceholder":145},"\n",[178,203,204,207,210,214],{"class":180,"line":133},[178,205,206],{"class":184},"export",[178,208,209],{"class":184}," default",[178,211,213],{"class":212},"sScJk"," defineContentConfig",[178,215,216],{"class":188},"({\n",[178,218,220],{"class":180,"line":219},4,[178,221,222],{"class":188},"  collections: {\n",[178,224,226,229,232],{"class":180,"line":225},5,[178,227,228],{"class":188},"    posts: ",[178,230,231],{"class":212},"defineCollection",[178,233,216],{"class":188},[178,235,237,240,243],{"class":180,"line":236},6,[178,238,239],{"class":188},"      type: ",[178,241,242],{"class":195},"'page'",[178,244,245],{"class":188},",\n",[178,247,249,252,255],{"class":180,"line":248},7,[178,250,251],{"class":188},"      source: ",[178,253,254],{"class":195},"'posts\u002F*.md'",[178,256,245],{"class":188},[178,258,260,263,266],{"class":180,"line":259},8,[178,261,262],{"class":188},"      schema: z.",[178,264,265],{"class":212},"object",[178,267,216],{"class":188},[178,269,271,274,277],{"class":180,"line":270},9,[178,272,273],{"class":188},"        date: z.",[178,275,276],{"class":212},"date",[178,278,279],{"class":188},"(),\n",[178,281,283,286,289,292,295,298,301],{"class":180,"line":282},10,[178,284,285],{"class":188},"        tags: z.",[178,287,288],{"class":212},"array",[178,290,291],{"class":188},"(z.",[178,293,294],{"class":212},"string",[178,296,297],{"class":188},"()).",[178,299,300],{"class":212},"default",[178,302,303],{"class":188},"([]),\n",[178,305,307],{"class":180,"line":306},11,[178,308,309],{"class":188},"      }),\n",[178,311,313],{"class":180,"line":312},12,[178,314,315],{"class":188},"    }),\n",[178,317,319],{"class":180,"line":318},13,[178,320,321],{"class":188},"  },\n",[178,323,325],{"class":180,"line":324},14,[178,326,327],{"class":188},"})\n",[16,329,331],{"id":330},"写-frontmatter","写 frontmatter",[98,333,337],{"className":334,"code":335,"language":336,"meta":104,"style":104},"language-yaml shiki shiki-themes github-light github-dark","---\ntitle: 文章标题\ndescription: 列表页与搜索引擎用的摘要\ndate: 2026-09-25\ntags:\n  - Nuxt\n---\n","yaml",[106,338,339,344,356,366,376,384,392],{"__ignoreMap":104},[178,340,341],{"class":180,"line":181},[178,342,343],{"class":212},"---\n",[178,345,346,350,353],{"class":180,"line":136},[178,347,349],{"class":348},"s9eBZ","title",[178,351,352],{"class":188},": ",[178,354,355],{"class":195},"文章标题\n",[178,357,358,361,363],{"class":180,"line":133},[178,359,360],{"class":348},"description",[178,362,352],{"class":188},[178,364,365],{"class":195},"列表页与搜索引擎用的摘要\n",[178,367,368,370,372],{"class":180,"line":219},[178,369,276],{"class":348},[178,371,352],{"class":188},[178,373,375],{"class":374},"sj4cs","2026-09-25\n",[178,377,378,381],{"class":180,"line":225},[178,379,380],{"class":348},"tags",[178,382,383],{"class":188},":\n",[178,385,386,389],{"class":180,"line":236},[178,387,388],{"class":188},"  - ",[178,390,391],{"class":195},"Nuxt\n",[178,393,394],{"class":180,"line":248},[178,395,343],{"class":212},[16,397,398],{"id":398},"在页面里查询",[98,400,402],{"className":172,"code":401,"language":174,"meta":104,"style":104},"const { data: posts } = await useAsyncData('posts', () =>\n  queryCollection('posts').order('date', 'DESC').all(),\n)\n",[106,403,404,445,478],{"__ignoreMap":104},[178,405,406,409,412,416,418,421,424,427,430,433,436,439,442],{"class":180,"line":181},[178,407,408],{"class":184},"const",[178,410,411],{"class":188}," { ",[178,413,415],{"class":414},"s4XuR","data",[178,417,352],{"class":188},[178,419,420],{"class":374},"posts",[178,422,423],{"class":188}," } ",[178,425,426],{"class":184},"=",[178,428,429],{"class":184}," await",[178,431,432],{"class":212}," useAsyncData",[178,434,435],{"class":188},"(",[178,437,438],{"class":195},"'posts'",[178,440,441],{"class":188},", () ",[178,443,444],{"class":184},"=>\n",[178,446,447,450,452,454,457,460,462,465,468,471,473,476],{"class":180,"line":136},[178,448,449],{"class":212},"  queryCollection",[178,451,435],{"class":188},[178,453,438],{"class":195},[178,455,456],{"class":188},").",[178,458,459],{"class":212},"order",[178,461,435],{"class":188},[178,463,464],{"class":195},"'date'",[178,466,467],{"class":188},", ",[178,469,470],{"class":195},"'DESC'",[178,472,456],{"class":188},[178,474,475],{"class":212},"all",[178,477,279],{"class":188},[178,479,480],{"class":180,"line":133},[178,481,482],{"class":188},")\n",[12,484,485,486,489,490,493,494,497],{},"单篇用 ",[106,487,488],{},".path(route.path).first()","，分页用 ",[106,491,492],{},".skip(n).limit(m)"," 配合 ",[106,495,496],{},".count()","。",[16,499,500],{"id":500},"常见坑",[502,503,504,513,523],"ol",{},[30,505,506,508,509,512],{},[106,507,276],{}," 用 ",[106,510,511],{},"z.date()"," 才能正确排序，写字符串会按字典序比。",[30,514,515,516,519,520,497],{},"文件名决定 URL：",[106,517,518],{},"content\u002Fposts\u002Fhello.md"," 对应 ",[106,521,522],{},"\u002Fposts\u002Fhello",[30,524,525],{},"定好 schema 后，frontmatter 里多写字段不会报错，少写必填字段会在构建时失败。",[527,528,529],"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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":104,"searchDepth":133,"depth":133,"links":531},[532,533,534,535],{"id":168,"depth":136,"text":169},{"id":330,"depth":136,"text":331},{"id":398,"depth":136,"text":398},{"id":500,"depth":136,"text":500},"2026-09-25","content.config.ts 里定义 collection 与 schema，Markdown 里填 frontmatter，页面里用 queryCollection 查询。",{},"\u002Fposts\u002Fnuxt-content-frontmatter",{"title":156,"description":537},"posts\u002Fnuxt-content-frontmatter","一份可直接照抄的 frontmatter 与查询写法。",[151,544],"Content","NzDcuZ_q0u7EWO3-OX3yo65qzbHvtn5goFCc7S0Sjso",{"id":547,"title":548,"body":549,"date":893,"description":894,"draft":142,"extension":143,"meta":895,"navigation":145,"path":896,"seo":897,"stem":898,"summary":899,"tags":900,"__hash__":904},"posts\u002Fposts\u002Ftailwind-daisyui-theme.md","Tailwind 4 与 daisyUI 5 的主题、深色模式",{"type":9,"value":550,"toc":887},[551,554,557,624,627,758,764,767,782,874,877,884],[12,552,553],{},"Tailwind 4 把配置搬进了 CSS。daisyUI 5 跟着这个模型走，主题也是 CSS 里的插件选项。",[16,555,556],{"id":556},"接入方式",[98,558,560],{"className":172,"code":559,"language":174,"meta":104,"style":104},"import tailwindcss from '@tailwindcss\u002Fvite'\n\nexport default defineNuxtConfig({\n  css: ['~\u002Fassets\u002Fcss\u002Fmain.css'],\n  vite: {\n    plugins: [tailwindcss()],\n  },\n})\n",[106,561,562,574,578,589,600,605,616,620],{"__ignoreMap":104},[178,563,564,566,569,571],{"class":180,"line":181},[178,565,185],{"class":184},[178,567,568],{"class":188}," tailwindcss ",[178,570,192],{"class":184},[178,572,573],{"class":195}," '@tailwindcss\u002Fvite'\n",[178,575,576],{"class":180,"line":136},[178,577,201],{"emptyLinePlaceholder":145},[178,579,580,582,584,587],{"class":180,"line":133},[178,581,206],{"class":184},[178,583,209],{"class":184},[178,585,586],{"class":212}," defineNuxtConfig",[178,588,216],{"class":188},[178,590,591,594,597],{"class":180,"line":219},[178,592,593],{"class":188},"  css: [",[178,595,596],{"class":195},"'~\u002Fassets\u002Fcss\u002Fmain.css'",[178,598,599],{"class":188},"],\n",[178,601,602],{"class":180,"line":225},[178,603,604],{"class":188},"  vite: {\n",[178,606,607,610,613],{"class":180,"line":236},[178,608,609],{"class":188},"    plugins: [",[178,611,612],{"class":212},"tailwindcss",[178,614,615],{"class":188},"()],\n",[178,617,618],{"class":180,"line":248},[178,619,321],{"class":188},[178,621,622],{"class":180,"line":259},[178,623,327],{"class":188},[16,625,626],{"id":626},"定义两套主题",[98,628,632],{"className":629,"code":630,"language":631,"meta":104,"style":104},"language-css shiki shiki-themes github-light github-dark","@import 'tailwindcss';\n\n@plugin 'daisyui' {\n  themes: false;\n}\n\n@plugin 'daisyui\u002Ftheme' {\n  name: 'myblog';\n  default: true;\n  color-scheme: light;\n  --color-primary: oklch(44% 0.088 250);\n}\n\n@plugin 'daisyui\u002Ftheme' {\n  name: 'myblog-dark';\n  color-scheme: dark;\n  --color-primary: oklch(78% 0.084 235);\n}\n","css",[106,633,634,645,649,657,662,667,671,678,683,688,696,707,711,715,721,733,741,753],{"__ignoreMap":104},[178,635,636,639,642],{"class":180,"line":181},[178,637,638],{"class":184},"@import",[178,640,641],{"class":195}," 'tailwindcss'",[178,643,644],{"class":188},";\n",[178,646,647],{"class":180,"line":136},[178,648,201],{"emptyLinePlaceholder":145},[178,650,651,654],{"class":180,"line":133},[178,652,653],{"class":184},"@plugin",[178,655,656],{"class":188}," 'daisyui' {\n",[178,658,659],{"class":180,"line":219},[178,660,661],{"class":188},"  themes: false;\n",[178,663,664],{"class":180,"line":225},[178,665,666],{"class":188},"}\n",[178,668,669],{"class":180,"line":236},[178,670,201],{"emptyLinePlaceholder":145},[178,672,673,675],{"class":180,"line":248},[178,674,653],{"class":184},[178,676,677],{"class":188}," 'daisyui\u002Ftheme' {\n",[178,679,680],{"class":180,"line":259},[178,681,682],{"class":188},"  name: 'myblog';\n",[178,684,685],{"class":180,"line":270},[178,686,687],{"class":188},"  default: true;\n",[178,689,690,693],{"class":180,"line":282},[178,691,692],{"class":348},"  color-scheme",[178,694,695],{"class":188},": light;\n",[178,697,698,701,704],{"class":180,"line":306},[178,699,700],{"class":188},"  --color-primary: oklch(44% 0",[178,702,703],{"class":212},".088",[178,705,706],{"class":188}," 250);\n",[178,708,709],{"class":180,"line":312},[178,710,666],{"class":188},[178,712,713],{"class":180,"line":318},[178,714,201],{"emptyLinePlaceholder":145},[178,716,717,719],{"class":180,"line":324},[178,718,653],{"class":184},[178,720,677],{"class":188},[178,722,724,727,730],{"class":180,"line":723},15,[178,725,726],{"class":188},"  name: '",[178,728,729],{"class":348},"myblog-dark",[178,731,732],{"class":188},"';\n",[178,734,736,738],{"class":180,"line":735},16,[178,737,692],{"class":348},[178,739,740],{"class":188},": dark;\n",[178,742,744,747,750],{"class":180,"line":743},17,[178,745,746],{"class":188},"  --color-primary: oklch(78% 0",[178,748,749],{"class":212},".084",[178,751,752],{"class":188}," 235);\n",[178,754,756],{"class":180,"line":755},18,[178,757,666],{"class":188},[12,759,760,763],{},[106,761,762],{},"themes: false"," 表示不加载 daisyUI 自带的几十套主题，只留我们自己定义的两套。",[16,765,766],{"id":766},"切换与防闪烁",[12,768,769,770,773,774,777,778,781],{},"切换就是把 ",[106,771,772],{},"data-theme"," 写到 ",[106,775,776],{},"\u003Chtml>"," 上；防闪烁的关键是这个属性必须在首屏绘制前就位，所以要在 ",[106,779,780],{},"\u003Chead>"," 里内联一小段脚本，而不是等 Vue 挂载。",[98,783,787],{"className":784,"code":785,"language":786,"meta":104,"style":104},"language-js shiki shiki-themes github-light github-dark","var stored = localStorage.getItem('myblog-theme')\nvar theme =\n  stored || (matchMedia('(prefers-color-scheme: dark)').matches ? 'myblog-dark' : 'myblog')\ndocument.documentElement.setAttribute('data-theme', theme)\n","js",[106,788,789,812,822,858],{"__ignoreMap":104},[178,790,791,794,797,799,802,805,807,810],{"class":180,"line":181},[178,792,793],{"class":184},"var",[178,795,796],{"class":188}," stored ",[178,798,426],{"class":184},[178,800,801],{"class":188}," localStorage.",[178,803,804],{"class":212},"getItem",[178,806,435],{"class":188},[178,808,809],{"class":195},"'myblog-theme'",[178,811,482],{"class":188},[178,813,814,816,819],{"class":180,"line":136},[178,815,793],{"class":184},[178,817,818],{"class":188}," theme ",[178,820,821],{"class":184},"=\n",[178,823,824,827,830,833,836,838,841,844,847,850,853,856],{"class":180,"line":133},[178,825,826],{"class":188},"  stored ",[178,828,829],{"class":184},"||",[178,831,832],{"class":188}," (",[178,834,835],{"class":212},"matchMedia",[178,837,435],{"class":188},[178,839,840],{"class":195},"'(prefers-color-scheme: dark)'",[178,842,843],{"class":188},").matches ",[178,845,846],{"class":184},"?",[178,848,849],{"class":195}," 'myblog-dark'",[178,851,852],{"class":184}," :",[178,854,855],{"class":195}," 'myblog'",[178,857,482],{"class":188},[178,859,860,863,866,868,871],{"class":180,"line":219},[178,861,862],{"class":188},"document.documentElement.",[178,864,865],{"class":212},"setAttribute",[178,867,435],{"class":188},[178,869,870],{"class":195},"'data-theme'",[178,872,873],{"class":188},", theme)\n",[16,875,876],{"id":876},"顺带一提",[12,878,879,880,883],{},"深色模式下代码块的配色由 Shiki 的双主题负责：浅色写内联样式，深色用 ",[106,881,882],{},"--shiki-dark"," 变量，再用一条属性选择器覆盖即可。",[527,885,886],{},"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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":104,"searchDepth":133,"depth":133,"links":888},[889,890,891,892],{"id":556,"depth":136,"text":556},{"id":626,"depth":136,"text":626},{"id":766,"depth":136,"text":766},{"id":876,"depth":136,"text":876},"2026-09-20","用 CSS 变量定义两套自定义主题，再用一个 data-theme 属性切换，顺带解决首屏闪烁。",{},"\u002Fposts\u002Ftailwind-daisyui-theme",{"title":548,"description":894},"posts\u002Ftailwind-daisyui-theme","不用 tailwind.config.js，全部写在 CSS 里。",[901,902,903],"Tailwind","daisyUI","CSS","q8g-tw99FVDWTsZB3NvM1UX-ilRMzFgc80P_04eFOvU",{"id":906,"title":907,"body":908,"date":1286,"description":1287,"draft":142,"extension":143,"meta":1288,"navigation":145,"path":1289,"seo":1290,"stem":1291,"summary":1292,"tags":1293,"__hash__":1296},"posts\u002Fposts\u002Funiversity-php-notes.md","大学里学 PHP 记的那几页",{"type":9,"value":909,"toc":1278},[910,923,927,942,963,968,985,1007,1010,1026,1030,1138,1141,1149,1152,1163,1188,1215,1218,1275],[123,911,912],{},[12,913,914,915,918,919,922],{},"这篇是 2021 年 11 月记的。当时散在好几条笔记里，这里并成了一篇，原文照抄，拼错的库名（",[106,916,917],{},"guzzie","、",[106,920,921],{},"amsey UUID","）也留着。",[16,924,926],{"id":925},"装环境先从扩展开始","装环境，先从扩展开始",[27,928,929,932,935],{},[30,930,931],{},"装不上很大一部分原因是 php 扩展没启动，mbstring、dom 都要启动。",[30,933,934],{},"指令没响应是没有加 path。",[30,936,937,938,941],{},"php-pdo、php-mysql 这些都要手动装，用 ",[106,939,940],{},"phpenmod"," 来启用：",[98,943,947],{"className":944,"code":945,"language":946,"meta":104,"style":104},"language-bash shiki shiki-themes github-light github-dark","phpenmod gd\nphpenmod pdo_mysql\n","bash",[106,948,949,956],{"__ignoreMap":104},[178,950,951,953],{"class":180,"line":181},[178,952,940],{"class":212},[178,954,955],{"class":195}," gd\n",[178,957,958,960],{"class":180,"line":136},[178,959,940],{"class":212},[178,961,962],{"class":195}," pdo_mysql\n",[27,964,965],{},[30,966,967],{},"全局指令的 path：",[98,969,971],{"className":944,"code":970,"language":946,"meta":104,"style":104},"export PATH=$PATH:$HOME\u002F.config\u002F.composer\u002Fvendor\u002Fbin\n",[106,972,973],{"__ignoreMap":104},[178,974,975,977,980,982],{"class":180,"line":181},[178,976,206],{"class":184},[178,978,979],{"class":188}," PATH",[178,981,426],{"class":184},[178,983,984],{"class":188},"$PATH:$HOME\u002F.config\u002F.composer\u002Fvendor\u002Fbin\n",[27,986,987,990,1000],{},[30,988,989],{},"我也不知道是第几次学了。算了算了再学一遍。",[30,991,992,995,996,999],{},[106,993,994],{},"\"\""," 能插值，",[106,997,998],{},"''"," 不能插。",[30,1001,1002,1003,1006],{},"comment 用 ",[106,1004,1005],{},"\u002F\u002F"," 就好了。别的也支持但是就用这个。",[16,1008,1009],{"id":1009},"composer",[27,1011,1012,1015],{},[30,1013,1014],{},"getcomposer repository 里头找安装文件。才五百多个星，一个包管理器就这点，这是否",[30,1016,1017,918,1020,918,1023],{},[106,1018,1019],{},"composer require",[106,1021,1022],{},"composer update",[106,1024,1025],{},"composer global require",[16,1027,1029],{"id":1028},"从-js-找-php-的对应库","从 JS 找 PHP 的对应库",[43,1031,1032,1042],{},[46,1033,1034],{},[49,1035,1036,1039],{},[52,1037,1038],{},"在 JS 里用惯的",[52,1040,1041],{},"PHP 这边的对应",[59,1043,1044,1052,1059,1067,1075,1083,1090,1098,1106,1114,1122,1130],{},[49,1045,1046,1049],{},[64,1047,1048],{},"lodash",[64,1050,1051],{},"radash",[49,1053,1054,1057],{},[64,1055,1056],{},"axios",[64,1058,917],{},[49,1060,1061,1064],{},[64,1062,1063],{},"dayjs",[64,1065,1066],{},"carbon",[49,1068,1069,1072],{},[64,1070,1071],{},"docx",[64,1073,1074],{},"phpword",[49,1076,1077,1080],{},[64,1078,1079],{},"nodemailer",[64,1081,1082],{},"phpmailer",[49,1084,1085,1088],{},[64,1086,1087],{},"uuid",[64,1089,921],{},[49,1091,1092,1095],{},[64,1093,1094],{},"crypto-js",[64,1096,1097],{},"builtin",[49,1099,1100,1103],{},[64,1101,1102],{},"exceljs",[64,1104,1105],{},"phpspreadsheet",[49,1107,1108,1111],{},[64,1109,1110],{},"fastq",[64,1112,1113],{},"symfony messenger \u002F laravel",[49,1115,1116,1119],{},[64,1117,1118],{},"orm",[64,1120,1121],{},"doctrine orm \u002F eloquent orm",[49,1123,1124,1127],{},[64,1125,1126],{},"zod",[64,1128,1129],{},"symfony validator \u002F respect validateion",[49,1131,1132,1135],{},[64,1133,1134],{},"validate",[64,1136,1137],{},"WebGeeker-Validation",[16,1139,1140],{"id":1140},"thinkphp",[27,1142,1143],{},[30,1144,1145,1148],{},[106,1146,1147],{},"imagecreate()"," 找不到，要装 php-gd。",[16,1150,1151],{"id":1151},"laravel",[27,1153,1154,1160],{},[30,1155,1156,1157,497],{},"create 之后要 ",[106,1158,1159],{},"composer install",[30,1161,1162],{},"sanctum：",[98,1164,1166],{"className":944,"code":1165,"language":946,"meta":104,"style":104},"php artisan session:table\nphp artisan migrate\n",[106,1167,1168,1179],{"__ignoreMap":104},[178,1169,1170,1173,1176],{"class":180,"line":181},[178,1171,1172],{"class":212},"php",[178,1174,1175],{"class":195}," artisan",[178,1177,1178],{"class":195}," session:table\n",[178,1180,1181,1183,1185],{"class":180,"line":136},[178,1182,1172],{"class":212},[178,1184,1175],{"class":195},[178,1186,1187],{"class":195}," migrate\n",[27,1189,1190,1193,1202,1209],{},[30,1191,1192],{},"csrf 要放 header 不然 laravel 这头猪不认。",[30,1194,1195,1198,1199,497],{},[106,1196,1197],{},"auth.php"," 里 ",[106,1200,1201],{},"guards.api.driver = sanctum",[30,1203,1204,1198,1206,497],{},[106,1205,1197],{},[106,1207,1208],{},"defaults.guard = web",[30,1210,1211,1212,497],{},"User model extends ",[106,1213,1214],{},"Illuminate\\Foundation\\Auth\\User",[16,1216,1217],{"id":1217},"现在回头看",[27,1219,1220,1242,1253,1261],{},[30,1221,1222,1223,1225,1226,1229,1230,1225,1232,1229,1235,1225,1238,1241],{},"库名拼错了一堆：",[106,1224,917],{}," 是 ",[106,1227,1228],{},"guzzle","，",[106,1231,921],{},[106,1233,1234],{},"ramsey\u002Fuuid",[106,1236,1237],{},"respect validateion",[106,1239,1240],{},"Respect\\Validation","。当时全靠手打，一个都没查。",[30,1243,1244,1245,1248,1249,1252],{},"「csrf 要放 header」：Laravel 的 ",[106,1246,1247],{},"api"," 路由本来就不套 CSRF 中间件，我那时候多半是把 API 路由写进了 ",[106,1250,1251],{},"web"," 组，才一路撞到 419。",[30,1254,1255,1257,1258,497],{},[106,1256,940],{}," 是 Debian 系才有的一套；换个发行版就得自己去改 ",[106,1259,1260],{},"php.ini",[30,1262,1263,1264,1267,1268,1270,1271,1274],{},"thinkphp 那条：装完 ",[106,1265,1266],{},"php-gd"," 还得确认 ",[106,1269,1260],{}," 里的 ",[106,1272,1273],{},"extension=gd"," 没被注释掉，不然一样报找不到函数。",[527,1276,1277],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .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}",{"title":104,"searchDepth":133,"depth":133,"links":1279},[1280,1281,1282,1283,1284,1285],{"id":925,"depth":136,"text":926},{"id":1009,"depth":136,"text":1009},{"id":1028,"depth":136,"text":1029},{"id":1140,"depth":136,"text":1140},{"id":1151,"depth":136,"text":1151},{"id":1217,"depth":136,"text":1217},"2021-11-07","学 PHP 时的几条笔记：扩展得自己开、composer 怎么用、一份 JS 到 PHP 的库对照表，还有 thinkphp 和 laravel 的零碎。",{},"\u002Fposts\u002Funiversity-php-notes",{"title":907,"description":1287},"posts\u002Funiversity-php-notes","从装环境到挑库，按 JS 的习惯找 PHP 的对应物，库名拼错了一堆。",[1294,1295],"PHP","大学旧笔记","HEXnnKFrYIhvvqu3fsyhQjRhwafbXlOApJFYO67IoIs",{"id":1298,"title":1299,"body":1300,"date":1752,"description":1753,"draft":142,"extension":143,"meta":1754,"navigation":145,"path":1755,"seo":1756,"stem":1757,"summary":1758,"tags":1759,"__hash__":1762},"posts\u002Fposts\u002Funiversity-excel-vba-macro.md","大学时写的第一段宏：比对 Excel 的两列",{"type":9,"value":1301,"toc":1749},[1302,1319,1322,1682,1684,1746],[123,1303,1304],{},[12,1305,1306,1307,1310,1311,1314,1315,1318],{},"这篇是 2020 年 6 月记的，大学里第一次为了一张表去写宏。代码原样贴着：",[106,1308,1309],{},"MsgBox"," 当调试输出、",[106,1312,1313],{},"Dim"," 写在循环里、变量名叫 ",[106,1316,1317],{},"dontknow","，都没动。",[12,1320,1321],{},"要做的事：选中两列，从第一行往下逐字对齐比较，哪里不一样，就把后面的内容弹出来。",[98,1323,1327],{"className":1324,"code":1325,"language":1326,"meta":104,"style":104},"language-vb shiki shiki-themes github-light github-dark","Function diffcell(cell1 As Range, cell2 As Range)\n    Dim str1 As String, str2 As String\n    str1 = cell1.Text\n    str2 = cell2.Text\n    Dim i As Integer, j As Integer\n    i = 1\n    j = 1\n    While i \u003C> Len(str1) And j \u003C> Len(str2)\n        If Mid(str1, i, 1) = Mid(str2, j, 1) Then\n            i = i + 1\n            j = j + 1\n        Else\n            Dim afterward1 As String, afterward2 As String\n            afterward1 = Mid(str1, i)\n            afterward2 = Mid(str2, j)\n            Dim foundIdx1 As Integer, foundIdx2 As Integer\n            foundIdx1 = InStr(i, str1, afterward2)\n            foundIdx2 = InStr(j, str2, afterward2)\n            MsgBox Mid(str1, foundIdx1 - i)\n\n            If foundIdx1 \u003C foundIdx2 Then\n                MsgBox Mid(str1, foundIdx1 - i)\n                i = foundIdx1\n            Else\n                MsgBox Mid(str2, foundIdx2 - j)\n                j = foundIdx2\n            End If\n        End If\n    Wend\n    If i \u003C Len(str1) Then\n        MsgBox Mid(str1, i)\n    Else\n        MsgBox Mid(str2, j)\n    End If\nEnd Function\n\nSub test()\n    Dim rng As Range\n    On Error Resume Next\n    Set rng = Selection\n    On Error GoTo 0\n    If rng Is Nothing Then\n        MsgBox \"未选择区域\"\n        Return\n    End If\n    If TypeName(rng) \u003C> \"Range\" Then\n        MsgBox \"选的不是格子\"\n        Return\n    End If\n    If rng.Columns.Count \u003C> 2 Then\n        MsgBox \"选中列数量应为2\"\n        Return\n    End If\n    Dim skipRow As Integer\n    skipRow = 1\n    For i = 1 + skipRow To rng.Rows.Count\n        Dim cell1 As Range, cell2 As Range\n        Set cell1 = rng.Cells(i, 1)\n        Set cell2 = rng.Cells(i, 2)\n        Dim dontknow As Variant\n        dontknow = diffcell(cell1, cell2)\n    Next i\nEnd Sub\n","vb",[106,1328,1329,1334,1339,1344,1349,1354,1359,1364,1369,1374,1379,1384,1389,1394,1399,1404,1409,1414,1419,1425,1430,1436,1442,1448,1454,1460,1466,1472,1478,1484,1490,1496,1502,1508,1514,1520,1525,1531,1537,1543,1549,1555,1561,1567,1573,1578,1584,1590,1595,1600,1606,1612,1617,1622,1628,1634,1640,1646,1652,1658,1664,1670,1676],{"__ignoreMap":104},[178,1330,1331],{"class":180,"line":181},[178,1332,1333],{},"Function diffcell(cell1 As Range, cell2 As Range)\n",[178,1335,1336],{"class":180,"line":136},[178,1337,1338],{},"    Dim str1 As String, str2 As String\n",[178,1340,1341],{"class":180,"line":133},[178,1342,1343],{},"    str1 = cell1.Text\n",[178,1345,1346],{"class":180,"line":219},[178,1347,1348],{},"    str2 = cell2.Text\n",[178,1350,1351],{"class":180,"line":225},[178,1352,1353],{},"    Dim i As Integer, j As Integer\n",[178,1355,1356],{"class":180,"line":236},[178,1357,1358],{},"    i = 1\n",[178,1360,1361],{"class":180,"line":248},[178,1362,1363],{},"    j = 1\n",[178,1365,1366],{"class":180,"line":259},[178,1367,1368],{},"    While i \u003C> Len(str1) And j \u003C> Len(str2)\n",[178,1370,1371],{"class":180,"line":270},[178,1372,1373],{},"        If Mid(str1, i, 1) = Mid(str2, j, 1) Then\n",[178,1375,1376],{"class":180,"line":282},[178,1377,1378],{},"            i = i + 1\n",[178,1380,1381],{"class":180,"line":306},[178,1382,1383],{},"            j = j + 1\n",[178,1385,1386],{"class":180,"line":312},[178,1387,1388],{},"        Else\n",[178,1390,1391],{"class":180,"line":318},[178,1392,1393],{},"            Dim afterward1 As String, afterward2 As String\n",[178,1395,1396],{"class":180,"line":324},[178,1397,1398],{},"            afterward1 = Mid(str1, i)\n",[178,1400,1401],{"class":180,"line":723},[178,1402,1403],{},"            afterward2 = Mid(str2, j)\n",[178,1405,1406],{"class":180,"line":735},[178,1407,1408],{},"            Dim foundIdx1 As Integer, foundIdx2 As Integer\n",[178,1410,1411],{"class":180,"line":743},[178,1412,1413],{},"            foundIdx1 = InStr(i, str1, afterward2)\n",[178,1415,1416],{"class":180,"line":755},[178,1417,1418],{},"            foundIdx2 = InStr(j, str2, afterward2)\n",[178,1420,1422],{"class":180,"line":1421},19,[178,1423,1424],{},"            MsgBox Mid(str1, foundIdx1 - i)\n",[178,1426,1428],{"class":180,"line":1427},20,[178,1429,201],{"emptyLinePlaceholder":145},[178,1431,1433],{"class":180,"line":1432},21,[178,1434,1435],{},"            If foundIdx1 \u003C foundIdx2 Then\n",[178,1437,1439],{"class":180,"line":1438},22,[178,1440,1441],{},"                MsgBox Mid(str1, foundIdx1 - i)\n",[178,1443,1445],{"class":180,"line":1444},23,[178,1446,1447],{},"                i = foundIdx1\n",[178,1449,1451],{"class":180,"line":1450},24,[178,1452,1453],{},"            Else\n",[178,1455,1457],{"class":180,"line":1456},25,[178,1458,1459],{},"                MsgBox Mid(str2, foundIdx2 - j)\n",[178,1461,1463],{"class":180,"line":1462},26,[178,1464,1465],{},"                j = foundIdx2\n",[178,1467,1469],{"class":180,"line":1468},27,[178,1470,1471],{},"            End If\n",[178,1473,1475],{"class":180,"line":1474},28,[178,1476,1477],{},"        End If\n",[178,1479,1481],{"class":180,"line":1480},29,[178,1482,1483],{},"    Wend\n",[178,1485,1487],{"class":180,"line":1486},30,[178,1488,1489],{},"    If i \u003C Len(str1) Then\n",[178,1491,1493],{"class":180,"line":1492},31,[178,1494,1495],{},"        MsgBox Mid(str1, i)\n",[178,1497,1499],{"class":180,"line":1498},32,[178,1500,1501],{},"    Else\n",[178,1503,1505],{"class":180,"line":1504},33,[178,1506,1507],{},"        MsgBox Mid(str2, j)\n",[178,1509,1511],{"class":180,"line":1510},34,[178,1512,1513],{},"    End If\n",[178,1515,1517],{"class":180,"line":1516},35,[178,1518,1519],{},"End Function\n",[178,1521,1523],{"class":180,"line":1522},36,[178,1524,201],{"emptyLinePlaceholder":145},[178,1526,1528],{"class":180,"line":1527},37,[178,1529,1530],{},"Sub test()\n",[178,1532,1534],{"class":180,"line":1533},38,[178,1535,1536],{},"    Dim rng As Range\n",[178,1538,1540],{"class":180,"line":1539},39,[178,1541,1542],{},"    On Error Resume Next\n",[178,1544,1546],{"class":180,"line":1545},40,[178,1547,1548],{},"    Set rng = Selection\n",[178,1550,1552],{"class":180,"line":1551},41,[178,1553,1554],{},"    On Error GoTo 0\n",[178,1556,1558],{"class":180,"line":1557},42,[178,1559,1560],{},"    If rng Is Nothing Then\n",[178,1562,1564],{"class":180,"line":1563},43,[178,1565,1566],{},"        MsgBox \"未选择区域\"\n",[178,1568,1570],{"class":180,"line":1569},44,[178,1571,1572],{},"        Return\n",[178,1574,1576],{"class":180,"line":1575},45,[178,1577,1513],{},[178,1579,1581],{"class":180,"line":1580},46,[178,1582,1583],{},"    If TypeName(rng) \u003C> \"Range\" Then\n",[178,1585,1587],{"class":180,"line":1586},47,[178,1588,1589],{},"        MsgBox \"选的不是格子\"\n",[178,1591,1593],{"class":180,"line":1592},48,[178,1594,1572],{},[178,1596,1598],{"class":180,"line":1597},49,[178,1599,1513],{},[178,1601,1603],{"class":180,"line":1602},50,[178,1604,1605],{},"    If rng.Columns.Count \u003C> 2 Then\n",[178,1607,1609],{"class":180,"line":1608},51,[178,1610,1611],{},"        MsgBox \"选中列数量应为2\"\n",[178,1613,1615],{"class":180,"line":1614},52,[178,1616,1572],{},[178,1618,1620],{"class":180,"line":1619},53,[178,1621,1513],{},[178,1623,1625],{"class":180,"line":1624},54,[178,1626,1627],{},"    Dim skipRow As Integer\n",[178,1629,1631],{"class":180,"line":1630},55,[178,1632,1633],{},"    skipRow = 1\n",[178,1635,1637],{"class":180,"line":1636},56,[178,1638,1639],{},"    For i = 1 + skipRow To rng.Rows.Count\n",[178,1641,1643],{"class":180,"line":1642},57,[178,1644,1645],{},"        Dim cell1 As Range, cell2 As Range\n",[178,1647,1649],{"class":180,"line":1648},58,[178,1650,1651],{},"        Set cell1 = rng.Cells(i, 1)\n",[178,1653,1655],{"class":180,"line":1654},59,[178,1656,1657],{},"        Set cell2 = rng.Cells(i, 2)\n",[178,1659,1661],{"class":180,"line":1660},60,[178,1662,1663],{},"        Dim dontknow As Variant\n",[178,1665,1667],{"class":180,"line":1666},61,[178,1668,1669],{},"        dontknow = diffcell(cell1, cell2)\n",[178,1671,1673],{"class":180,"line":1672},62,[178,1674,1675],{},"    Next i\n",[178,1677,1679],{"class":180,"line":1678},63,[178,1680,1681],{},"End Sub\n",[16,1683,1217],{"id":1217},[27,1685,1686,1695,1708,1717,1737],{},[30,1687,1688,1691,1692,497],{},[106,1689,1690],{},"While i \u003C> Len(str1)","：用不等号收尾，最后一个字符永远比不到，得写 ",[106,1693,1694],{},"\u003C=",[30,1696,1697,1700,1701,1704,1705,497],{},[106,1698,1699],{},"Mid(str1, foundIdx1 - i)","：",[106,1702,1703],{},"Mid"," 的第二个参数是起始位置，我当时按长度用了。想取中间一段得写 ",[106,1706,1707],{},"Mid(str1, i, foundIdx1 - i)",[30,1709,1710,1713,1714,1716],{},[106,1711,1712],{},"If"," 之前那句 ",[106,1715,1309],{}," 跟两个分支里的重复，是调日志时留下的。",[30,1718,1719,1722,1723,1726,1727,1729,1730,1733,1734,497],{},[106,1720,1721],{},"Sub"," 里用 ",[106,1724,1725],{},"Return"," 提前退出：VBA 的 ",[106,1728,1725],{}," 是配 ",[106,1731,1732],{},"GoSub"," 用的，这里应该写 ",[106,1735,1736],{},"Exit Sub",[30,1738,1739,1742,1743,1745],{},[106,1740,1741],{},"diffcell"," 没有返回值，所以 ",[106,1744,1317],{}," 拿到的一直是空。",[527,1747,1748],{},"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);}",{"title":104,"searchDepth":133,"depth":133,"links":1750},[1751],{"id":1217,"depth":136,"text":1217},"2020-06-13","一个没写完的 Excel VBA 宏：选中两列，逐字比较，不一样的地方用 MsgBox 弹出来。代码原样贴着。",{},"\u002Fposts\u002Funiversity-excel-vba-macro",{"title":1299,"description":1753},"posts\u002Funiversity-excel-vba-macro","为了一张表第一次写宏，靠 MsgBox 调日志，最后也没收尾。",[1760,1761,1295],"VBA","Excel","HLZgdQkGyIiMWoZBcjFV7oZh57afs6CjfiBLoY5k3OM",{"id":1764,"title":1765,"body":1766,"date":2236,"description":2237,"draft":142,"extension":143,"meta":2238,"navigation":145,"path":2239,"seo":2240,"stem":2241,"summary":2242,"tags":2243,"__hash__":2245},"posts\u002Fposts\u002Funiversity-python-notes.md","开学前的那几页 Python 笔记",{"type":9,"value":1767,"toc":2230},[1768,1773,1776,1817,1821,1824,1916,1919,2126,2130,2180,2189,2194,2196,2228],[123,1769,1770],{},[12,1771,1772],{},"这篇是 2019 年 8 月记的，上大学前的那个暑假。原文照抄，只调了排版，当时写错的地方一处都没改。",[16,1774,1775],{"id":1775},"语法零碎",[27,1777,1778,1781,1784,1787,1792,1795,1798,1801,1804,1811,1814],{},[30,1779,1780],{},"（）不可变",[30,1782,1783],{},"【】可变",[30,1785,1786],{},"｛｝可变，无序",[30,1788,1789,1790],{},"形式常亮用大写！CONSTANT = ",[178,1791],{},[30,1793,1794],{},"模块变量按规则都应该是常亮，变量放函数或者类里头",[30,1796,1797],{},"Pycharm好像没有模块常量波浪线标注建议大写功能？",[30,1799,1800],{},"Range(0,10) 表示1-9",[30,1802,1803],{},"Print(x,end=’|’)打印完成不换行，以|分隔",[30,1805,1806,1807,1810],{},"B = a",[178,1808,1809],{},"0:len(a):2"," b数组获取a 相当于range(0,len(a),2)",[30,1812,1813],{},"Break终止循环 contiune跳过这一轮循环",[30,1815,1816],{},"Len(a) a的字串长度",[16,1818,1820],{"id":1819},"random-模块","random 模块",[12,1822,1823],{},"用法是从别处抄来的，第一段的作者署名我留在了代码里：",[98,1825,1829],{"className":1826,"code":1827,"language":1828,"meta":104,"style":104},"language-python shiki shiki-themes github-light github-dark","#!\u002Fusr\u002Fbin\u002Fpython\n\n## -*- coding: UTF-8 -*-\n\nimport random\n\nprint( random.randint(1,10) )        # 产生 1 到 10 的一个整数型随机数\nprint( random.random() )             # 产生 0 到 1 之间的随机浮点数\nprint( random.uniform(1.1,5.4) )     # 产生  1.1 到 5.4 之间的随机浮点数，区间可以不是整数\nprint( random.choice('tomorrow') )   # 从序列中随机选取一个元素\nprint( random.randrange(1,100,2) )   # 生成从1到100的间隔为2的随机整数\n\na=[1,3,5,6,7]                # 将序列a中的元素顺序打乱\nrandom.shuffle(a)\nprint(a)\n\n# 冷面做的梦\n# 1年前 (2018-05-23)\n","python",[106,1830,1831,1836,1840,1845,1849,1854,1858,1863,1868,1873,1878,1883,1887,1892,1897,1902,1906,1911],{"__ignoreMap":104},[178,1832,1833],{"class":180,"line":181},[178,1834,1835],{},"#!\u002Fusr\u002Fbin\u002Fpython\n",[178,1837,1838],{"class":180,"line":136},[178,1839,201],{"emptyLinePlaceholder":145},[178,1841,1842],{"class":180,"line":133},[178,1843,1844],{},"## -*- coding: UTF-8 -*-\n",[178,1846,1847],{"class":180,"line":219},[178,1848,201],{"emptyLinePlaceholder":145},[178,1850,1851],{"class":180,"line":225},[178,1852,1853],{},"import random\n",[178,1855,1856],{"class":180,"line":236},[178,1857,201],{"emptyLinePlaceholder":145},[178,1859,1860],{"class":180,"line":248},[178,1861,1862],{},"print( random.randint(1,10) )        # 产生 1 到 10 的一个整数型随机数\n",[178,1864,1865],{"class":180,"line":259},[178,1866,1867],{},"print( random.random() )             # 产生 0 到 1 之间的随机浮点数\n",[178,1869,1870],{"class":180,"line":270},[178,1871,1872],{},"print( random.uniform(1.1,5.4) )     # 产生  1.1 到 5.4 之间的随机浮点数，区间可以不是整数\n",[178,1874,1875],{"class":180,"line":282},[178,1876,1877],{},"print( random.choice('tomorrow') )   # 从序列中随机选取一个元素\n",[178,1879,1880],{"class":180,"line":306},[178,1881,1882],{},"print( random.randrange(1,100,2) )   # 生成从1到100的间隔为2的随机整数\n",[178,1884,1885],{"class":180,"line":312},[178,1886,201],{"emptyLinePlaceholder":145},[178,1888,1889],{"class":180,"line":318},[178,1890,1891],{},"a=[1,3,5,6,7]                # 将序列a中的元素顺序打乱\n",[178,1893,1894],{"class":180,"line":324},[178,1895,1896],{},"random.shuffle(a)\n",[178,1898,1899],{"class":180,"line":723},[178,1900,1901],{},"print(a)\n",[178,1903,1904],{"class":180,"line":735},[178,1905,201],{"emptyLinePlaceholder":145},[178,1907,1908],{"class":180,"line":743},[178,1909,1910],{},"# 冷面做的梦\n",[178,1912,1913],{"class":180,"line":755},[178,1914,1915],{},"# 1年前 (2018-05-23)\n",[12,1917,1918],{},"第二段：",[98,1920,1922],{"className":1826,"code":1921,"language":1828,"meta":104,"style":104},"#!\u002Fusr\u002Fbin\u002Fpython\n\n## -*- coding: UTF-8 -*-\n\nimport random\nimport string\n\n#### 随机整数：\n\nprint random.randint(1,50)\n\n#### 随机选取0到100间的偶数：\n\nprint random.randrange(0, 101, 2)\n\n#### 随机浮点数：\n\nprint random.random()\nprint random.uniform(1, 10)\n\n#### 随机字符：\n\nprint random.choice('abcdefghijklmnopqrstuvwxyz!@#$%^&*()')\n\n#### 多个字符中生成指定数量的随机字符：\n\nprint random.sample('zyxwvutsrqponmlkjihgfedcba',5)\n\n#### 从a-zA-Z0-9生成指定数量的随机字符：\n\nran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))\nprint ran_str\n\n#### 多个字符中选取指定数量的字符组成新字符串：\n\nprint ''.join(random.sample(['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'], 5))\n\n#### 随机选取字符串：\n\nprint random.choice(['剪刀', '石头', '布'])\n\n#### 打乱排序\n\nitems = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\nprint random.shuffle(items)\n",[106,1923,1924,1928,1932,1936,1940,1944,1949,1953,1958,1962,1967,1971,1976,1980,1985,1989,1994,1998,2003,2008,2012,2017,2021,2026,2030,2035,2039,2044,2048,2053,2057,2062,2067,2071,2076,2080,2085,2089,2094,2098,2103,2107,2112,2116,2121],{"__ignoreMap":104},[178,1925,1926],{"class":180,"line":181},[178,1927,1835],{},[178,1929,1930],{"class":180,"line":136},[178,1931,201],{"emptyLinePlaceholder":145},[178,1933,1934],{"class":180,"line":133},[178,1935,1844],{},[178,1937,1938],{"class":180,"line":219},[178,1939,201],{"emptyLinePlaceholder":145},[178,1941,1942],{"class":180,"line":225},[178,1943,1853],{},[178,1945,1946],{"class":180,"line":236},[178,1947,1948],{},"import string\n",[178,1950,1951],{"class":180,"line":248},[178,1952,201],{"emptyLinePlaceholder":145},[178,1954,1955],{"class":180,"line":259},[178,1956,1957],{},"#### 随机整数：\n",[178,1959,1960],{"class":180,"line":270},[178,1961,201],{"emptyLinePlaceholder":145},[178,1963,1964],{"class":180,"line":282},[178,1965,1966],{},"print random.randint(1,50)\n",[178,1968,1969],{"class":180,"line":306},[178,1970,201],{"emptyLinePlaceholder":145},[178,1972,1973],{"class":180,"line":312},[178,1974,1975],{},"#### 随机选取0到100间的偶数：\n",[178,1977,1978],{"class":180,"line":318},[178,1979,201],{"emptyLinePlaceholder":145},[178,1981,1982],{"class":180,"line":324},[178,1983,1984],{},"print random.randrange(0, 101, 2)\n",[178,1986,1987],{"class":180,"line":723},[178,1988,201],{"emptyLinePlaceholder":145},[178,1990,1991],{"class":180,"line":735},[178,1992,1993],{},"#### 随机浮点数：\n",[178,1995,1996],{"class":180,"line":743},[178,1997,201],{"emptyLinePlaceholder":145},[178,1999,2000],{"class":180,"line":755},[178,2001,2002],{},"print random.random()\n",[178,2004,2005],{"class":180,"line":1421},[178,2006,2007],{},"print random.uniform(1, 10)\n",[178,2009,2010],{"class":180,"line":1427},[178,2011,201],{"emptyLinePlaceholder":145},[178,2013,2014],{"class":180,"line":1432},[178,2015,2016],{},"#### 随机字符：\n",[178,2018,2019],{"class":180,"line":1438},[178,2020,201],{"emptyLinePlaceholder":145},[178,2022,2023],{"class":180,"line":1444},[178,2024,2025],{},"print random.choice('abcdefghijklmnopqrstuvwxyz!@#$%^&*()')\n",[178,2027,2028],{"class":180,"line":1450},[178,2029,201],{"emptyLinePlaceholder":145},[178,2031,2032],{"class":180,"line":1456},[178,2033,2034],{},"#### 多个字符中生成指定数量的随机字符：\n",[178,2036,2037],{"class":180,"line":1462},[178,2038,201],{"emptyLinePlaceholder":145},[178,2040,2041],{"class":180,"line":1468},[178,2042,2043],{},"print random.sample('zyxwvutsrqponmlkjihgfedcba',5)\n",[178,2045,2046],{"class":180,"line":1474},[178,2047,201],{"emptyLinePlaceholder":145},[178,2049,2050],{"class":180,"line":1480},[178,2051,2052],{},"#### 从a-zA-Z0-9生成指定数量的随机字符：\n",[178,2054,2055],{"class":180,"line":1486},[178,2056,201],{"emptyLinePlaceholder":145},[178,2058,2059],{"class":180,"line":1492},[178,2060,2061],{},"ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))\n",[178,2063,2064],{"class":180,"line":1498},[178,2065,2066],{},"print ran_str\n",[178,2068,2069],{"class":180,"line":1504},[178,2070,201],{"emptyLinePlaceholder":145},[178,2072,2073],{"class":180,"line":1510},[178,2074,2075],{},"#### 多个字符中选取指定数量的字符组成新字符串：\n",[178,2077,2078],{"class":180,"line":1516},[178,2079,201],{"emptyLinePlaceholder":145},[178,2081,2082],{"class":180,"line":1522},[178,2083,2084],{},"print ''.join(random.sample(['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'], 5))\n",[178,2086,2087],{"class":180,"line":1527},[178,2088,201],{"emptyLinePlaceholder":145},[178,2090,2091],{"class":180,"line":1533},[178,2092,2093],{},"#### 随机选取字符串：\n",[178,2095,2096],{"class":180,"line":1539},[178,2097,201],{"emptyLinePlaceholder":145},[178,2099,2100],{"class":180,"line":1545},[178,2101,2102],{},"print random.choice(['剪刀', '石头', '布'])\n",[178,2104,2105],{"class":180,"line":1551},[178,2106,201],{"emptyLinePlaceholder":145},[178,2108,2109],{"class":180,"line":1557},[178,2110,2111],{},"#### 打乱排序\n",[178,2113,2114],{"class":180,"line":1563},[178,2115,201],{"emptyLinePlaceholder":145},[178,2117,2118],{"class":180,"line":1569},[178,2119,2120],{},"items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n",[178,2122,2123],{"class":180,"line":1575},[178,2124,2125],{},"print random.shuffle(items)\n",[16,2127,2129],{"id":2128},"模块导入和别的","模块、导入和别的",[27,2131,2132,2135,2138,2141,2144,2147,2150,2153,2156,2159,2162,2165,2168,2171,2174,2177],{},[30,2133,2134],{},".dll是C#里类似模块的 组织结构 动态链接库 .lib静态链接库",[30,2136,2137],{},".jar也是",[30,2139,2140],{},"Pack._init_这个写法是错的，_init_直接用pack表达",[30,2142,2143],{},"Import c7",[30,2145,2146],{},"Print(c7.a)这样能把c7模块的a打印出来",[30,2148,2149],{},"解释型语言在意import print顺序",[30,2151,2152],{},"同级模块不用目录直接名字就好，高级导入次级需要 子报名.模块名",[30,2154,2155],{},".pyc是编译器做的自检码，提升运行效率，可以被反编译，谨防小偷！",[30,2157,2158],{},"Round(a,b) a数字b位四舍五入",[30,2160,2161],{},"Python命令行help()查询函数",[30,2163,2164],{},"Sys.函数能改很多人工限制",[30,2166,2167],{},"循环调用最多3923 3925次",[30,2169,2170],{},"定义立刻执行，声明等着以后执行",[30,2172,2173],{},"_不推荐外部调用；__防止被继承覆盖",[30,2175,2176],{},"__dict__是类内变量",[30,2178,2179],{},"a = list(range(1,5)) list()只接受单个参数，结果：",[98,2181,2183],{"className":1826,"code":2182,"language":1828,"meta":104,"style":104},"a = [1, 2, 3, 4]\n",[106,2184,2185],{"__ignoreMap":104},[178,2186,2187],{"class":180,"line":181},[178,2188,2182],{},[27,2190,2191],{},[30,2192,2193],{},"序列解包不是并行过程",[16,2195,1217],{"id":1217},[27,2197,2198,2204,2218,2225],{},[30,2199,2200,2203],{},[106,2201,2202],{},"range(0, 10)"," 是 0 到 9。我那时候写「表示 1-9」，两头都记错了。",[30,2205,2206,2209,2210,2213,2214,2217],{},[106,2207,2208],{},"_init_"," 少了下划线，是 ",[106,2211,2212],{},"__init__","；",[106,2215,2216],{},"pack"," 那句到现在我也没还原出当时想说什么。",[30,2219,2220,2221,2224],{},"第二段 random 的代码是 Python 2 的（",[106,2222,2223],{},"print"," 不带括号），我照着抄下来，没看出来它和第一段的区别。",[30,2226,2227],{},"「循环调用最多 3923 3925 次」这个数，我至今不知道是从哪儿抄的。",[527,2229,1748],{},{"title":104,"searchDepth":133,"depth":133,"links":2231},[2232,2233,2234,2235],{"id":1775,"depth":136,"text":1775},{"id":1819,"depth":136,"text":1820},{"id":2128,"depth":136,"text":2129},{"id":1217,"depth":136,"text":1217},"2019-08-15","2019 年 8 月，上大学前的暑假自学 Python 记的几页：列表字典、range 的边界、两段抄来的 random 用法，还有一串当时没弄明白的语法。",{},"\u002Fposts\u002Funiversity-python-notes",{"title":1765,"description":2237},"posts\u002Funiversity-python-notes","大学开学前自学 Python 的原始笔记，写错的、想岔的都原样留着。",[2244,1295],"Python","2RMQgL_P1ZC-Z9iyl7X5mRdzSo_DoqecOWGExN51P_c",1792556024904]