[{"data":1,"prerenderedAt":6358},["ShallowReactive",2],{"all-posts":3},[4,61,1086,1156,1315,1602,1696,2113,2213,2278,2505,3221,3513,3649,4318,4567,4849,5005,5236,5321,5442,5522,5604,6183,6241],{"id":5,"title":6,"body":7,"categories":48,"date":50,"description":51,"draft":52,"extension":53,"meta":54,"navigation":55,"path":56,"seo":57,"stem":58,"style":59,"__hash__":60},"content\u002Fblog\u002F00-hello-world.md","Hello World",{"type":8,"value":9,"toc":44},"minimark",[10,14,17,20,23,26,29,32,35,38,41],[11,12,13],"p",{},"古往今来按照传统,不论广厦还是草屋，落成之际总是要写点什么的，以示纪念。",[11,15,16],{},"既如此，xwill.cn(更新：x-will.cn 做备用了)搭建起来，这\"hello world\"也就在情理之中了。",[11,18,19],{},"个人的一片小天地。没有主题,任意记录,按照自己的想法去尝试。",[11,21,22],{},"如果以餐饮业来论，我们程序员差不多就是厨子。不管是在星级酒店后厨炒菜，亦或在巷间小馆掌勺，终归会梦想自己开间自己的店。",[11,24,25],{},"想来，从接触第一行printf 到现今也差不多10个年头了。天生愚钝又不够勤奋，在0-1的世界里管中窥豹数年，门门道道还是没那么清楚。加之IT技术之发展如比迅猛。在前后端那些刚刚知晓些皮毛而沾沾自喜之际，分布式\u002F高并发\u002F大数据\u002F云计算\u002FAI已经铺天盖地。",[11,27,28],{},"随着年岁的增长,人到中年生活的压力也无法免除。这无疑又加重了厨子的焦虑。\n偶然间同事谈论云主机优惠活动，一个瞬间的念头，也买了下来。想这念头大概是那个时候埋下了要炒最牛B的菜还要有间大酒店，到如今还没熄灭吧。",[11,30,31],{},"有了这个小破站，也差不多自己有了自己的门脸。按眼前这样子，最多算个大排档的摊点。",[11,33,34],{},"无碍，无妨。",[11,36,37],{},"现如今的我大抵只要，一个人去菜场挑土豆，青椒，洗切上锅，盛盘。",[11,39,40],{},"能够整出点能吃的东西，简单美味足矣。",[11,42,43],{},"那，就先支棱起来～～～",{"title":45,"searchDepth":46,"depth":46,"links":47},"",2,[],[49],"随笔杂记","2021-01-11","1st, but not important",false,"md",{},true,"\u002Fblog\u002F00-hello-world",{"title":6,"description":51},"blog\u002F00-hello-world",null,"lx63bferqDrZUXb5NsgR3l8u15zG4eB-4FqtgGHk_Do",{"id":62,"title":63,"body":64,"categories":1077,"date":1079,"description":1080,"draft":52,"extension":53,"meta":1081,"navigation":55,"path":1082,"seo":1083,"stem":1084,"style":59,"__hash__":1085},"content\u002Fblog\u002F01-blog_construction.md","blog搭建",{"type":8,"value":65,"toc":1074},[66,69,77,119,123,128,131,162,165,169,184,212,221,228,233,291,297,300,305,329,340,354,357,457,462,525,528,532,535,540,561,566,569,604,618,621,644,647,664,667,681,684,737,742,750,753,761,766,892,896,902,906,909,918,921,927,930,991,993,996,999,1002,1005,1008,1011,1013,1016,1021,1024,1056,1058,1061,1063,1070],[11,67,68],{},"刚搭起来，趁着热乎劲，做个记录.",[11,70,71,72,76],{},"记得，从开始打算搭建自己的博客那一刻起，你就是这个网站的",[73,74,75],"strong",{},"cto","了。",[78,79,80,84,87,104,107,110,113,116],"ul",{},[81,82,83],"li",{},"注册域名，购买云主机(管局备案)",[81,85,86],{},"域名添加dns解析，a地址到云主机提供的外网ip",[81,88,89,90],{},"云主机设置\n",[78,91,92,95,98,101],{},[81,93,94],{},"ssh登陆：",[81,96,97],{},"下载安装 openresty",[81,99,100],{},"修改or配置文件 & 新建一个server的配置文件",[81,102,103],{},"下载 certbot，生成证书。 配置到 新建的or server配置文件中",[81,105,106],{},"hugo 安装",[81,108,109],{},"下载git，添加 ssh-key到 github",[81,111,112],{},"挑选hugo主题，下载到theme文件夹",[81,114,115],{},"本机安装hugo + 下载主题。调试+写文",[81,117,118],{},"rsync public文件夹到远程主机",[120,121,122],"h2",{"id":122},"details",[124,125,127],"h4",{"id":126},"ssh-登陆","ssh 登陆",[11,129,130],{},"下载云主机秘钥到本机；",[132,133,139],"pre",{"className":134,"code":135,"highlights":136,"language":138,"meta":45,"style":45},"language-bash shiki shiki-themes github-light github-dark","ssh -i  本机路径\u002F秘钥   root@云主机外网ip\n",[137,137],0,"bash",[140,141,142],"code",{"__ignoreMap":45},[143,144,147,151,155,159],"span",{"class":145,"line":146},"line",1,[143,148,150],{"class":149},"sScJk","ssh",[143,152,154],{"class":153},"sj4cs"," -i",[143,156,158],{"class":157},"sZZnC","  本机路径\u002F秘钥",[143,160,161],{"class":157},"   root@云主机外网ip\n",[11,163,164],{},"  \t还可以参考云主机相关帮助文档",[124,166,168],{"id":167},"安装openresty-并配置","安装openresty 并配置",[78,170,171,181],{},[81,172,173,180],{},[174,175,179],"a",{"href":176,"rel":177},"https:\u002F\u002Fopenresty.org\u002Fcn\u002Flinux-packages.html",[178],"nofollow","安装文档"," 有详细linux系统安装命令，登陆云主机依葫芦画瓢执行即可",[81,182,183],{},"安装完毕查看",[132,185,188],{"className":134,"code":186,"highlights":187,"language":138,"meta":45,"style":45},"ubuntu@VM-4-5-ubuntu:~$ openresty -v\nnginx version: openresty\u002F1.19.3.1\n",[137,137],[140,189,190,201],{"__ignoreMap":45},[143,191,192,195,198],{"class":145,"line":146},[143,193,194],{"class":149},"ubuntu@VM-4-5-ubuntu:~$",[143,196,197],{"class":157}," openresty",[143,199,200],{"class":153}," -v\n",[143,202,203,206,209],{"class":145,"line":46},[143,204,205],{"class":149},"nginx",[143,207,208],{"class":157}," version:",[143,210,211],{"class":157}," openresty\u002F1.19.3.1\n",[11,213,214,217,218],{},[140,215,216],{},"openresty -V"," (大写) 可查看编译的支持的模块，和一些已经设置的默认配置值: ",[140,219,220],{},"--prefix=\u002Fusr\u002Flocal\u002Fopenresty\u002Fnginx",[11,222,223,224,227],{},"  ",[140,225,226],{},"ubuntu@VM-4-5-ubuntu:~$ sudo openresty"," 启动or，就可以在浏览器访问了域名了。 一切正常就是默认的 or欢迎页",[78,229,230],{},[81,231,232],{},"修改配置文件",[132,234,237],{"className":134,"code":235,"highlights":236,"language":138,"meta":45,"style":45},"ubuntu@VM-4-5-ubuntu:~$ mkdir or_conf  \u002F\u002F 新建一个我们自己的server配置文件\nubuntu@VM-4-5-ubuntu:~$ cd or_conf\nubuntu@VM-4-5-ubuntu:~\u002For_conf$ touch myserver.conf\nubuntu@VM-4-5-ubuntu:~$ sudo vi \u002Fusr\u002Flocal\u002Fopenresty\u002Fnginx\u002Fconf\u002Fnginx.conf\n",[137,137],[140,238,239,255,265,277],{"__ignoreMap":45},[143,240,241,243,246,249,252],{"class":145,"line":146},[143,242,194],{"class":149},[143,244,245],{"class":157}," mkdir",[143,247,248],{"class":157}," or_conf",[143,250,251],{"class":157},"  \u002F\u002F",[143,253,254],{"class":157}," 新建一个我们自己的server配置文件\n",[143,256,257,259,262],{"class":145,"line":46},[143,258,194],{"class":149},[143,260,261],{"class":157}," cd",[143,263,264],{"class":157}," or_conf\n",[143,266,268,271,274],{"class":145,"line":267},3,[143,269,270],{"class":149},"ubuntu@VM-4-5-ubuntu:~\u002For_conf$",[143,272,273],{"class":157}," touch",[143,275,276],{"class":157}," myserver.conf\n",[143,278,280,282,285,288],{"class":145,"line":279},4,[143,281,194],{"class":149},[143,283,284],{"class":157}," sudo",[143,286,287],{"class":157}," vi",[143,289,290],{"class":157}," \u002Fusr\u002Flocal\u002Fopenresty\u002Fnginx\u002Fconf\u002Fnginx.conf\n",[292,293,294],"ol",{},[81,295,296],{},"启用user,并改为root.不然后续访问文件等，启动的worker进程可能权限问题。有403的error : forbidden (13: Permission denied)",[11,298,299],{}," \t#user  nobody;  ==>  user root;",[292,301,302],{"start":46},[81,303,304],{},"http 块最后添加我们server配置的引用",[132,306,309],{"className":134,"code":307,"highlights":308,"language":138,"meta":45,"style":45},"include \u002Fhome\u002Fubuntu\u002For_conf\u002F*.conf;\n",[137,137],[140,310,311],{"__ignoreMap":45},[143,312,313,316,319,322,325],{"class":145,"line":146},[143,314,315],{"class":149},"include",[143,317,318],{"class":157}," \u002Fhome\u002Fubuntu\u002For_conf\u002F",[143,320,321],{"class":153},"*",[143,323,324],{"class":157},".conf",[143,326,328],{"class":327},"sVt8B",";\n",[292,330,331,334,337],{"start":267},[81,332,333],{},"注释掉server",[81,335,336],{},"关闭，保存",[81,338,339],{},"修改 myserver.conf",[132,341,344],{"className":134,"code":342,"highlights":343,"language":138,"meta":45,"style":45},"ubuntu@VM-4-5-ubuntu:~\u002For_conf$ vi myserver.conf\n",[137,137],[140,345,346],{"__ignoreMap":45},[143,347,348,350,352],{"class":145,"line":146},[143,349,270],{"class":149},[143,351,287],{"class":157},[143,353,276],{"class":157},[11,355,356],{},"  以域名 abc.com为例",[132,358,361],{"className":134,"code":359,"highlights":360,"language":138,"meta":45,"style":45},"server {\n    listen 80 default；\n    server_name  abc.com;\n\n    location \u002F {\n        default_type  text\u002Fhtml;\n        content_by_lua_block {\n            ngx.say(\"this is helloworld test\")\n        }\n    }\n}\n",[137,137],[140,362,363,371,382,392,397,408,419,427,439,445,451],{"__ignoreMap":45},[143,364,365,368],{"class":145,"line":146},[143,366,367],{"class":149},"server",[143,369,370],{"class":157}," {\n",[143,372,373,376,379],{"class":145,"line":46},[143,374,375],{"class":149},"    listen",[143,377,378],{"class":153}," 80",[143,380,381],{"class":157}," default；\n",[143,383,384,387,390],{"class":145,"line":267},[143,385,386],{"class":149},"    server_name",[143,388,389],{"class":157},"  abc.com",[143,391,328],{"class":327},[143,393,394],{"class":145,"line":279},[143,395,396],{"emptyLinePlaceholder":55},"\n",[143,398,400,403,406],{"class":145,"line":399},5,[143,401,402],{"class":149},"    location",[143,404,405],{"class":157}," \u002F",[143,407,370],{"class":157},[143,409,411,414,417],{"class":145,"line":410},6,[143,412,413],{"class":149},"        default_type",[143,415,416],{"class":157},"  text\u002Fhtml",[143,418,328],{"class":327},[143,420,422,425],{"class":145,"line":421},7,[143,423,424],{"class":149},"        content_by_lua_block",[143,426,370],{"class":157},[143,428,430,433,436],{"class":145,"line":429},8,[143,431,432],{"class":149},"            ngx.say(",[143,434,435],{"class":149},"\"this is helloworld test\"",[143,437,438],{"class":327},")\n",[143,440,442],{"class":145,"line":441},9,[143,443,444],{"class":327},"        }\n",[143,446,448],{"class":145,"line":447},10,[143,449,450],{"class":327},"    }\n",[143,452,454],{"class":145,"line":453},11,[143,455,456],{"class":327},"}\n",[292,458,459],{"start":410},[81,460,461],{},"测试一下",[132,463,466],{"className":134,"code":464,"highlights":465,"language":138,"meta":45,"style":45},"        ubuntu@VM-4-5-ubuntu:~\u002For_conf$ sudo openresty -t\n        nginx: the configuration file \u002Fusr\u002Flocal\u002Fopenresty\u002Fnginx\u002Fconf\u002Fnginx.conf syntax is ok\n    nginx: configuration file \u002Fusr\u002Flocal\u002Fopenresty\u002Fnginx\u002Fconf\u002Fnginx.conf test is successful\n",[137,137],[140,467,468,480,506],{"__ignoreMap":45},[143,469,470,473,475,477],{"class":145,"line":146},[143,471,472],{"class":149},"        ubuntu@VM-4-5-ubuntu:~\u002For_conf$",[143,474,284],{"class":157},[143,476,197],{"class":157},[143,478,479],{"class":153}," -t\n",[143,481,482,485,488,491,494,497,500,503],{"class":145,"line":46},[143,483,484],{"class":149},"        nginx:",[143,486,487],{"class":157}," the",[143,489,490],{"class":157}," configuration",[143,492,493],{"class":157}," file",[143,495,496],{"class":157}," \u002Fusr\u002Flocal\u002Fopenresty\u002Fnginx\u002Fconf\u002Fnginx.conf",[143,498,499],{"class":157}," syntax",[143,501,502],{"class":157}," is",[143,504,505],{"class":157}," ok\n",[143,507,508,511,513,515,517,520,522],{"class":145,"line":267},[143,509,510],{"class":149},"    nginx:",[143,512,490],{"class":157},[143,514,493],{"class":157},[143,516,496],{"class":157},[143,518,519],{"class":157}," test",[143,521,502],{"class":157},[143,523,524],{"class":157}," successful\n",[11,526,527],{},"   再浏览器访问，正确响应就是我们的\"this is helloworld test\"  \u002F\u002F 浏览器可能会有缓存，记得清除",[124,529,531],{"id":530},"使用certbot生成证书-和-配置https","使用certbot生成证书 和 配置https",[11,533,534],{},"先关闭nginx: sudo openresty -s stop",[292,536,537],{},[81,538,539],{},"安装certbot",[132,541,544],{"className":134,"code":542,"highlights":543,"language":138,"meta":45,"style":45},"ubuntu@VM-4-5-ubuntu:~$ sudo apt install certbot\n",[137,137],[140,545,546],{"__ignoreMap":45},[143,547,548,550,552,555,558],{"class":145,"line":146},[143,549,194],{"class":149},[143,551,284],{"class":157},[143,553,554],{"class":157}," apt",[143,556,557],{"class":157}," install",[143,559,560],{"class":157}," certbot\n",[292,562,563],{"start":46},[81,564,565],{},"获取证书",[11,567,568],{},"以 域名 abc.com 为例",[132,570,573],{"className":134,"code":571,"highlights":572,"language":138,"meta":45,"style":45},"ubuntu@VM-4-5-ubuntu:~$ sudo certbot certonly --manual -d \"abc.com\" -d \"*.abc.com\"--preferred-challenges dns\n",[137,137],[140,574,575],{"__ignoreMap":45},[143,576,577,579,581,584,587,590,593,596,598,601],{"class":145,"line":146},[143,578,194],{"class":149},[143,580,284],{"class":157},[143,582,583],{"class":157}," certbot",[143,585,586],{"class":157}," certonly",[143,588,589],{"class":153}," --manual",[143,591,592],{"class":153}," -d",[143,594,595],{"class":157}," \"abc.com\"",[143,597,592],{"class":153},[143,599,600],{"class":157}," \"*.abc.com\"--preferred-challenges",[143,602,603],{"class":157}," dns\n",[78,605,606,609,612,615],{},[81,607,608],{},"certonly  只为域名申请证书",[81,610,611],{},"--manual  不使用certbot的若干插件",[81,613,614],{},"-d: 证书申请域名。可指定多个",[81,616,617],{},"--preferred-challenges 优先使用域名所有权的校验方式。可设置参数值：http\u002Fdns (后续需要使用)\nhttp 需要再web根目录下\u002F.well-known\u002Facme-challenge\u002F 放置指定文件供访问;\ndns 需要配置dns解析 以 _acme-challenge 开头的文件值。",[11,619,620],{},"执行了命令后,会有交互操作:",[78,622,623,626,629,632,635,638,641],{},[81,624,625],{},"填邮箱地址。 (符合邮件格式即可)",[81,627,628],{},"同意",[81,630,631],{},"确认信息鸭",[81,633,634],{},"生成了一个 dns的 TXT解析记录。 到这一步后，需要把 解析记录填到你的域名解析里。",[81,636,637],{},"在dns 解析中增加 _acme-challenge.abc.com  值为certbot生成的",[81,639,640],{},"本地机器(或者另一个终端) 使用命令查看是否生效\nnslookup -q=txt _acme-challenge.abc.com",[81,642,643],{},"最后生成证书。目录 \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002F",[11,645,646],{},"查看证书",[132,648,651],{"className":134,"code":649,"highlights":650,"language":138,"meta":45,"style":45},"ubuntu@VM-4-5-ubuntu:~$ sudo certbot certificates\n",[137,137],[140,652,653],{"__ignoreMap":45},[143,654,655,657,659,661],{"class":145,"line":146},[143,656,194],{"class":149},[143,658,284],{"class":157},[143,660,583],{"class":157},[143,662,663],{"class":157}," certificates\n",[11,665,666],{},"运行后会打印:",[78,668,669,672,675,678],{},[81,670,671],{},"证书名",[81,673,674],{},"证书包含域名",[81,676,677],{},"过期时间啊",[81,679,680],{},"路径 等等等",[11,682,683],{},"证书续期\n重新运行创建证书命令，会根据已经存在证书自动renew\n重复更新 dns解析 txt文档值 （再新建一下，填入新生成字符串）",[132,685,688],{"className":134,"code":686,"highlights":687,"language":138,"meta":45,"style":45},"ubuntu@VM-4-5-ubuntu:~$ sudo certbot certonly --manual -d \"abc.com\" -d \"*.abc.com\"--preferred-challenges dns\n -----不要----- ubuntu@VM-4-5-ubuntu:~$ sudo certbot renew --cert-name  xxxx.com\n",[137,137],[140,689,690,712],{"__ignoreMap":45},[143,691,692,694,696,698,700,702,704,706,708,710],{"class":145,"line":146},[143,693,194],{"class":149},[143,695,284],{"class":157},[143,697,583],{"class":157},[143,699,586],{"class":157},[143,701,589],{"class":153},[143,703,592],{"class":153},[143,705,595],{"class":157},[143,707,592],{"class":153},[143,709,600],{"class":157},[143,711,603],{"class":157},[143,713,714,717,720,723,726,728,731,734],{"class":145,"line":46},[143,715,716],{"class":149}," -----不要-----",[143,718,719],{"class":157}," ubuntu@VM-4-5-ubuntu:~",[143,721,722],{"class":327},"$ ",[143,724,725],{"class":157},"sudo",[143,727,583],{"class":157},[143,729,730],{"class":157}," renew",[143,732,733],{"class":153}," --cert-name",[143,735,736],{"class":157},"  xxxx.com\n",[78,738,739],{},[81,740,741],{},"--cert-name 指定续期的证书名。查看证书中打印的Certificate Name:\n证书更新成功\n提示",[132,743,748],{"className":744,"code":746,"language":747},[745],"language-text","IMPORTANT NOTES:\n - Congratulations! Your certificate and chain have been saved at:\n   \u002Fetc\u002Fletsencrypt\u002Flive\u002F你的域名\u002Ffullchain.pem\n   Your key file has been saved at:\n   \u002Fetc\u002Fletsencrypt\u002Flive\u002F你的域名\u002Fprivkey.pem\n   Your cert will expire on 新-的-时间. To obtain a new or tweaked\n   version of this certificate in the future, simply run certbot\n   again. To non-interactively renew *all* of your certificates, run\n   \"certbot renew\"\n - If you like Certbot, please consider supporting our work by:\n","text",[140,749,746],{"__ignoreMap":45},[11,751,752],{},"最后需要nginx reload",[11,754,755,756],{},"其他证书相关管理，添加域名啊，强制更新啊之类的操作可参看certbot ",[174,757,760],{"href":758,"rel":759},"https:\u002F\u002Fcertbot.eff.org\u002Fdocs\u002Fusing.html#",[178],"官方文档",[292,762,763],{"start":267},[81,764,765],{},"配置or https",[132,767,770],{"className":134,"code":768,"highlights":769,"language":138,"meta":45,"style":45},"    server {\n        listen 443 ssl;\n        server_name  abc.com;\n\n        # 填 刚申请域名的证书路径(比如:abc.com)\n        ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Ffullchain.pem;\n        ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Fprivkey.pem;\n\n    }\n    server {\n        listen 80 default;\n        server_name abc.com;\n\n        return 301 https:\u002F\u002Fabc.com$request_uri;\n    }\n",[137,137],[140,771,772,779,792,801,805,811,821,831,835,839,845,856,866,871,887],{"__ignoreMap":45},[143,773,774,777],{"class":145,"line":146},[143,775,776],{"class":149},"    server",[143,778,370],{"class":157},[143,780,781,784,787,790],{"class":145,"line":46},[143,782,783],{"class":149},"        listen",[143,785,786],{"class":153}," 443",[143,788,789],{"class":157}," ssl",[143,791,328],{"class":327},[143,793,794,797,799],{"class":145,"line":267},[143,795,796],{"class":149},"        server_name",[143,798,389],{"class":157},[143,800,328],{"class":327},[143,802,803],{"class":145,"line":279},[143,804,396],{"emptyLinePlaceholder":55},[143,806,807],{"class":145,"line":399},[143,808,810],{"class":809},"sJ8bj","        # 填 刚申请域名的证书路径(比如:abc.com)\n",[143,812,813,816,819],{"class":145,"line":410},[143,814,815],{"class":149},"        ssl_certificate",[143,817,818],{"class":157}," \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Ffullchain.pem",[143,820,328],{"class":327},[143,822,823,826,829],{"class":145,"line":421},[143,824,825],{"class":149},"        ssl_certificate_key",[143,827,828],{"class":157}," \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Fprivkey.pem",[143,830,328],{"class":327},[143,832,833],{"class":145,"line":429},[143,834,396],{"emptyLinePlaceholder":55},[143,836,837],{"class":145,"line":441},[143,838,450],{"class":327},[143,840,841,843],{"class":145,"line":447},[143,842,776],{"class":149},[143,844,370],{"class":157},[143,846,847,849,851,854],{"class":145,"line":453},[143,848,783],{"class":149},[143,850,378],{"class":153},[143,852,853],{"class":157}," default",[143,855,328],{"class":327},[143,857,859,861,864],{"class":145,"line":858},12,[143,860,796],{"class":149},[143,862,863],{"class":157}," abc.com",[143,865,328],{"class":327},[143,867,869],{"class":145,"line":868},13,[143,870,396],{"emptyLinePlaceholder":55},[143,872,874,878,881,884],{"class":145,"line":873},14,[143,875,877],{"class":876},"szBVR","        return",[143,879,880],{"class":153}," 301",[143,882,883],{"class":157}," https:\u002F\u002Fabc.com",[143,885,886],{"class":327},"$request_uri;\n",[143,888,890],{"class":145,"line":889},15,[143,891,450],{"class":327},[124,893,895],{"id":894},"云主机上ssh-key-配置到-github","云主机上ssh-key 配置到 github",[132,897,900],{"className":898,"code":899,"language":747},[745],"在云主机上使用 ssh-keygen 生成 SSH key\n    ssh-keygen -o -t rsa -C \"email@example.com\"  \u002F\u002F一路enter, 生成密钥文件目录: \u002Fhome\u002Fxxxxx\u002F.ssh\u002F\n    -o 强制生成 OpenSSH格式 key\n    -t 设置 SSH-key 类型\n    -C 添加邮件为metadata做备注, 添加到public key文件的末尾\n\n登陆github, setting -- SSH and GPG keyss -- New SSH key, 复制已经生成的 .ssh\u002Fid_rsa.pub文件内容即可\n",[140,901,899],{"__ignoreMap":45},[124,903,905],{"id":904},"rsync-同步","rsync 同步",[11,907,908],{},"rsync -av source\u002F  username@remote_host:destination",[11,910,911,912,917],{},"  这篇",[174,913,916],{"href":914,"rel":915},"http:\u002F\u002Fwww.ruanyifeng.com\u002Fblog\u002F2020\u002F08\u002Frsync.html",[178],"rsync教程","讲的清楚详细，可参看",[124,919,920],{"id":920},"last",[132,922,925],{"className":923,"code":924,"language":747},[745],"以上, 有错误的地方或者任何疑问,请联系 email\n",[140,926,924],{"__ignoreMap":45},[928,929],"hr",{},[132,931,936],{"className":932,"code":933,"highlights":934,"language":935,"meta":45,"style":45},"language-go shiki shiki-themes github-light github-dark","    \u002F\u002F comment\n    \u002F*\n       another\n       markdown 格式测试\n    *\u002F\n    func Test(name string) bool {\n        if name == \"hello\" {\n            return true\n        }\n        return false\n    }\n",[137,137],"go",[140,937,938,943,948,953,958,963,968,973,978,982,987],{"__ignoreMap":45},[143,939,940],{"class":145,"line":146},[143,941,942],{},"    \u002F\u002F comment\n",[143,944,945],{"class":145,"line":46},[143,946,947],{},"    \u002F*\n",[143,949,950],{"class":145,"line":267},[143,951,952],{},"       another\n",[143,954,955],{"class":145,"line":279},[143,956,957],{},"       markdown 格式测试\n",[143,959,960],{"class":145,"line":399},[143,961,962],{},"    *\u002F\n",[143,964,965],{"class":145,"line":410},[143,966,967],{},"    func Test(name string) bool {\n",[143,969,970],{"class":145,"line":421},[143,971,972],{},"        if name == \"hello\" {\n",[143,974,975],{"class":145,"line":429},[143,976,977],{},"            return true\n",[143,979,980],{"class":145,"line":441},[143,981,444],{},[143,983,984],{"class":145,"line":447},[143,985,986],{},"        return false\n",[143,988,989],{"class":145,"line":453},[143,990,450],{},[928,992],{},[11,994,995],{},"首先得确定下大概怎么干这件事。随便一搜有很多的方案，当然有更多的教程。囫囵个大概。",[11,997,998],{},"本着满足核心需求即可，选， nginx + hugo（nginx做web服务，hugo来生成静态页面文件。）",[11,1000,1001],{},"nginx：有了解的基础。方便支持https。无需开发就完全cover响应静态页面的web",[11,1003,1004],{},"  讲道理，生成静态页面，很多框架都可以。hexo，hugo。。。。此处如果有熟悉的，选熟悉的更好。\n选hugo，一来较新go语言开发(假想自己以后可以追源码)。二来，轻简，当然官网上可选主题大都简陋（花花绿绿的不符合后端程序员的审美。）\n三，无他",[11,1006,1007],{},"  相信我，注册了域名，买了云主机，会加强开发动力。",[11,1009,1010],{},"  相信我，没有云主机，本地服务也可以完成所有开发和效果展示。",[928,1012],{},[11,1014,1015],{},"遇到的问题：",[78,1017,1018],{},[81,1019,1020],{},"文章的排版，简直惨不忍睹。代码块， markdown的正确使用迫在眉睫",[11,1022,1023],{},"还要做些什么？",[78,1025,1026,1029,1032,1035,1038,1041,1044,1047,1050,1053],{},[81,1027,1028],{},"or 日志完善",[81,1030,1031],{},"session 在前后交互的使用 --> 用户信息挂钩(设备id？)",[81,1033,1034],{},"文章索引",[81,1036,1037],{},"页面内位置跳转",[81,1039,1040],{},"回到顶部",[81,1042,1043],{},"点赞功能(交互页面的行为。)",[81,1045,1046],{},"留言 （插件，三方等等）",[81,1048,1049],{},"理解hugo，定制前端",[81,1051,1052],{},"访问路径\u002F二级域名使用",[81,1054,1055],{},"访问日志。服务器安全",[928,1057],{},[11,1059,1060],{},"做个自己的云盘，上传，下载\n爬虫 --> 考据\n大芒果 MaNGOS VS TrinityCore\nelectron\nreact",[928,1062],{},[11,1064,1065],{},[174,1066,1069],{"href":1067,"rel":1068},"https:\u002F\u002Fcloud.tencent.com\u002Fact\u002Fcps\u002Fredirect?redirect=10488&cps_key=2d60d337ba24d09654f0c08bf58ee784&from=activity",[178],"企鹅云",[1071,1072,1073],"style",{},"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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":45,"searchDepth":46,"depth":46,"links":1075},[1076],{"id":122,"depth":46,"text":122},[1078],"tips","2021-01-01","从0-1的流水账记录",{},"\u002Fblog\u002F01-blog_construction",{"title":63,"description":1080},"blog\u002F01-blog_construction","wH4RwMNBoNFRGXkBPF4ER19wp29oJHn9dAokpIxh23U",{"id":1087,"title":1088,"body":1089,"categories":1148,"date":1149,"description":1150,"draft":52,"extension":53,"meta":1151,"navigation":55,"path":1152,"seo":1153,"stem":1154,"style":59,"__hash__":1155},"content\u002Fblog\u002F02-bit.md","位运算",{"type":8,"value":1090,"toc":1146},[1091,1094,1110,1113,1116,1119,1122,1125,1128,1131,1134,1137,1140,1143],[11,1092,1093],{},"字符 大小写的转换",[78,1095,1096,1099,1107],{},[81,1097,1098],{},"转小写 | 和空格\n('a'| '') = 'a'\n('A'| '') = 'a'",[81,1100,1101,1102,1106],{},"转大写 & 和下划线\n('a'& '",[1103,1104,1105],"em",{},"') = 'A'\n('A'& '","') = 'A'",[81,1108,1109],{},"大小写互转 异或^ 和 空格\n('a' ^ '') = 'A'\n('A' ^ '') = 'a'",[11,1111,1112],{},"异或(^): 相同为0, 不同为1 --> 不进位加法",[11,1114,1115],{},"x最右边的n位清零  :  x & (~0 \u003C\u003C n)",[11,1117,1118],{},"获取第n位的值    : (x >> n) & 1",[11,1120,1121],{},"获取第n位的幂值  : x & (1 \u003C\u003C n)",[11,1123,1124],{},"仅将第n位置1    :  x | (1 \u003C\u003C n)",[11,1126,1127],{},"仅将第n位置0    :  x & (~(1\u003C\u003Cn))",[11,1129,1130],{},"最高位至第n位清零 :  x & ((1\u003C\u003Cn)-1)",[11,1132,1133],{},"判断奇偶:  x&1 == 1 (奇) x&1 == 0 (偶)",[11,1135,1136],{},"x >> 1 : x\u002F2",[11,1138,1139],{},"清零最低位的1: x= x&(x-1)",[11,1141,1142],{},"取得最低位的1: x&(-(x-1)",[11,1144,1145],{},"x & ~x =>0",{"title":45,"searchDepth":46,"depth":46,"links":1147},[],[1078],"2021-01-03","举个栗子,方便查找",{},"\u002Fblog\u002F02-bit",{"title":1088,"description":1150},"blog\u002F02-bit","ud4wUYwA65lkdiS-yeEiPI6XR9xpZ1Agp7SOo0-g7SI",{"id":1157,"title":1158,"body":1159,"categories":1307,"date":1308,"description":1309,"draft":52,"extension":53,"meta":1310,"navigation":55,"path":1311,"seo":1312,"stem":1313,"style":59,"__hash__":1314},"content\u002Fblog\u002F03-regular.md","正则表达式",{"type":8,"value":1160,"toc":1305},[1161,1164,1170,1173,1176,1181,1184,1208,1211,1214,1217,1220,1226,1229,1235,1238,1244,1247,1253,1256,1259,1262,1265,1272,1289,1295,1302],[11,1162,1163],{},"开篇一条：",[132,1165,1168],{"className":1166,"code":1167,"language":747},[745],"`(https?|ftp|file):\u002F\u002F[-A-Za-z0-9+&@#\u002F%?=~_|!:,.;]+[-A-Za-z0-9+&@#\u002F%=~_|]`\n`((([A-Za-z]{3,9}:(?:\\\u002F\\\u002F)?)(?:[-;:&=\\+$,\\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:ww‌​w.|[-;:&=\\+$,\\w]+@)[A-Za-z0-9.-]+)((?:\\\u002F[\\+~%\\\u002F.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?‌​(?:[\\w]*))?)`\n",[140,1169,1167],{"__ignoreMap":45},[11,1171,1172],{},"通常看到正则总有火星文的感觉。其实正则就和我们打扑克一样，只要弄清楚了基本规则，也就能大致明白。至于高效优雅的耍起来，需要多理解练习。那就是下一个话题了。",[11,1174,1175],{},"开门见山:",[292,1177,1178],{},[81,1179,1180],{},"元字符\n|\n| :--:| :--\n| .  | 匹配除换行符以为的任意字符\n| \\w | 匹配字母，数字，下划线，汉字\n| \\s | 匹配任意空白符\n| \\d | 匹配数字\n| \\b | 匹配单词的开始或者结束\n| ^  | 匹配字符串的开始\n| $  | 匹配字符串的结束",[11,1182,1183],{},"注意以上w\u002Fs\u002Fd\u002Fb是小写字符。\n大写表示不同的含义。 或者更准确点，是非的含义。\n\\W  非字母，非数字，非下划线，非汉字的字符\n\\S  非空格的字符\n\\D  非数字的字符\n\\B  非单词的开始和结束（单词的中间）",[292,1185,1186,1189,1192,1195,1198],{"start":46},[81,1187,1188],{},"重复限定\n*, 0次or更多\n+, 1次or更多\n?, 0次or1次\n{n,m}, n次到m次\n重复限定是贪婪匹配。  \\d{3,6}   \u002F\u002F这个表示匹配3到6个数字，如果6个则匹配6个\n非贪婪(懒惰)\n语法： 重复限定幅号后面加 ?",[81,1190,1191],{},"组合\n() 为一个整体，内部可以 或这种，",[81,1193,1194],{},"转义",[81,1196,1197],{},"条件或\n|",[81,1199,1200,1201,1203,1204,1207],{},"区间\n",[143,1202],{},"   one of them 的意思，注意 ｜ 字符，即",[143,1205,1206],{},"a|b|c"," 指a\u002Fb\u002Fc\u002F｜ 4个字符中的一个",[11,1209,1210],{},"第二部分",[11,1212,1213],{},"零宽断言\n断言好懂，零宽的含义，可以理解为 断言语句在整个表达式里不占位置，只是用来标记位置，帮助准确匹配.",[11,1215,1216],{},"比如： \"a regular expression\" 要想匹配 regular 中的 re，但不能匹配 expression 中的 re",[11,1218,1219],{},"语法:",[132,1221,1224],{"className":1222,"code":1223,"language":747},[745],"?= pattern   正向先行 匹配pattern表达式前面的内容     可以写 re(?=gular)\n?\u003C=          正向后行 匹配pattern表达式后面\n?!           负向后行 匹配非pattern表达式的前面内容\n?\u003C!\n先行和后行\n正则表达式引擎在执行字符串和表达式匹配时，会从头到尾（从前到后）连续扫描字符串中的字符，\n设想有一个扫描指针指向字符边界处并随匹配过程移动。\n先行断言，是当扫描指针位于某处时，引擎会尝试匹配指针还未扫过的字符，先于指针到达该字符，故称为先行。\n后行断言，引擎会尝试匹配指针已扫过的字符，后于指针到达该字符，故称为后行。\n正向和负向\n\n不等于 (!=)、逻辑非 (!) 都是用 !号来表示，所以有 ! 号的形式表示不匹配、负向；\n将 ! 号换成 = 号，就表示匹配、正向。\n",[140,1225,1223],{"__ignoreMap":45},[11,1227,1228],{},"捕获  --> 匹配",[132,1230,1233],{"className":1231,"code":1232,"language":747},[745],"分组  --> ()\n\n给组号命名\u003Cname>\n    语法： (?\u003Cname>exp)\n",[140,1234,1232],{"__ignoreMap":45},[11,1236,1237],{},"反向引用",[132,1239,1242],{"className":1240,"code":1241,"language":747},[745],"捕获的捕获组，外部引用，内部引用即反向引用\n    语法：\\k \\number\n         \\k \\'name'  ?????\n",[140,1243,1241],{"__ignoreMap":45},[11,1245,1246],{},"贪婪 非贪婪",[132,1248,1251],{"className":1249,"code":1250,"language":747},[745],"多个贪婪的匹配权   ?????\n懒惰(非贪婪) 格式,后面加个 ？\n",[140,1252,1250],{"__ignoreMap":45},[11,1254,1255],{},"反义",[11,1257,1258],{},"前面的介绍，理解完，应该比较容易看懂别人的正则了。\n那么下面就是多写写正则，尝试用用规则，写的优雅高效些。",[11,1260,1261],{},"1>. 小括号()：匹配小括号内的字符串，可以是一个，也可以是多个，常跟“|”（或）符号搭配使用，是多选结构的",[11,1263,1264],{},"　　示例1：string name = \"way2014\";  regex：(way|zgw)  result：结果是可以匹配出way的，因为是多选结构，小括号是匹配字符串的",[11,1266,1267,1268,1271],{},"　　示例2：string text = \"123456789\";  regex：(0-9)　result：结果是什么都匹配不到的，它只匹配字符串\"0-9\"而不是匹配数字, ",[143,1269,1270],{},"0-9","这个字符组才是匹配0-9的数字",[11,1273,1274,1275,1277,1278,1281,1282,1284,1285,1288],{},"　2>.中括号",[143,1276],{},"：匹配字符组内的字符，比如咱们常用的",[143,1279,1280],{},"0-9a-zA-Z.*?!","等，在",[143,1283],{},"内的字符都是字符，不是元字符，比如“0-9”、“a-z”这中间的“-”就是连接符号，表示范围的元字符，如果写成",[143,1286,1287],{},"-!?*(","这样的话，就是普通字符",[11,1290,1291,1292,1294],{},"　　示例1： string text = \"1234567890\";  regex：",[143,1293,1270],{},"  result：结果是可以匹配出字符串text内的任意数字了，像上边的【或符号“|”在字符组内就是一个普通字符】",[11,1296,1297,1298,1301],{},"　　示例2：string text = \"a|e|s|v\";  regex：",[143,1299,1300],{},"a|e|s","  result：结果就是匹配字符a、e、|三个字符，这个跟(a|e|s)有区别的，区别就是(a|e|s)匹配的是a、e、s三个字符的随意一个，三个中的任意一个，这里的|是元字符",[11,1303,1304],{},"　3>.大括号{}：匹配次数，匹配在它之前表达式匹配出来的元素出现的次数，{n}出现n次、{n,}匹配最少出现n次、{n,m}匹配最少出现n次，最多出现m次",{"title":45,"searchDepth":46,"depth":46,"links":1306},[],[1078],"2021-01-04"," 火星文上路 ",{},"\u002Fblog\u002F03-regular",{"title":1158,"description":1309},"blog\u002F03-regular","GwYhDsFFeLQaqU990JZXlXIijk1fyAwerFodDy7etl8",{"id":1316,"title":1317,"body":1318,"categories":1593,"date":1595,"description":1596,"draft":52,"extension":53,"meta":1597,"navigation":55,"path":1598,"seo":1599,"stem":1600,"style":59,"__hash__":1601},"content\u002Fblog\u002F05-git.md","git 小tip",{"type":8,"value":1319,"toc":1591},[1320,1323],[1071,1321,1322],{},"\ntable th:first-of-type {\n    width: 50%;\n}\ntable th:nth-of-type(2) {\n    width: 30%;\n}\ntable th:nth-of-type(3) {\n    width: 20%;\n}\n",[1324,1325,1326,1343],"table",{},[1327,1328,1329],"thead",{},[1330,1331,1332,1337,1340],"tr",{},[1333,1334,1336],"th",{"align":1335},"left","命令",[1333,1338,1339],{},"说明",[1333,1341],{"align":1342},"center",[1344,1345,1346,1358,1369,1380,1390,1400,1410,1420,1431,1453,1466,1480,1488,1498,1508,1518,1526,1535,1545,1553,1563,1574,1583],"tbody",{},[1330,1347,1348,1352,1355],{},[1349,1350,1351],"td",{"align":1335},"git branch  -r",[1349,1353,1354],{},"查看远程仓库的分支信息",[1349,1356,1357],{"align":1342},"-r ：remote",[1330,1359,1360,1363,1366],{},[1349,1361,1362],{"align":1335},"git branch -a",[1349,1364,1365],{},"查看本地和远程仓库的分支信息",[1349,1367,1368],{"align":1342},"-a : all",[1330,1370,1371,1374,1377],{},[1349,1372,1373],{"align":1335},"git branch -m \u003Coldbranch> \u003Cnewbranch>",[1349,1375,1376],{},"重命名",[1349,1378,1379],{"align":1342},"-M 强制重命名",[1330,1381,1382,1385,1388],{},[1349,1383,1384],{"align":1335},"git branch",[1349,1386,1387],{},"查看本地",[1349,1389],{"align":1342},[1330,1391,1392,1395,1398],{},[1349,1393,1394],{"align":1335},"git branch  \u003Cbranchname>",[1349,1396,1397],{},"创建本地分支",[1349,1399],{"align":1342},[1330,1401,1402,1405,1408],{},[1349,1403,1404],{"align":1335},"git checkout -b \u003Cbranchname>",[1349,1406,1407],{},"创建新分支，并切换到该分支",[1349,1409],{"align":1342},[1330,1411,1412,1415,1418],{},[1349,1413,1414],{"align":1335},"git checkout \u003Cbranchname>",[1349,1416,1417],{},"切换分支",[1349,1419],{"align":1342},[1330,1421,1422,1425,1428],{},[1349,1423,1424],{"align":1335},"git branch    -d  \u003Cbranchname>",[1349,1426,1427],{},"删除分支(已参与过合并的分支)",[1349,1429,1430],{"align":1342},"-D  强制删除",[1330,1432,1433,1440,1443],{},[1349,1434,1435,1436,1439],{"align":1335},"git push ",[143,1437,1438],{},"远程仓库","  \u003C本地分支>: \u003C远程分支>",[1349,1441,1442],{},"推送本地分支的代码到远程仓库",[1349,1444,1445,1446,1449,1450,1452],{"align":1342},"\u003C远程分支> 名不填，则推送到与本地分支名相同的分支。",[1447,1448],"br",{},"如果远程仓库没有，则创建",[1447,1451],{}," git默认远程仓库 origin  分支 master",[1330,1454,1455,1460,1463],{},[1349,1456,1435,1457,1459],{"align":1335},[143,1458,1438],{},"  : \u003C远程分支>",[1349,1461,1462],{},"删除远程仓库的分支",[1349,1464,1465],{"align":1342},"推送一个空到远程仓库的分支",[1330,1467,1468,1474,1477],{},[1349,1469,1470,1471,1473],{"align":1335},"git pull ",[143,1472,1438],{}," \u003C远程分支>: \u003C本地分支>",[1349,1475,1476],{},"拉取远程仓库分支到本地",[1349,1478,1479],{"align":1342},"本地分支不填，则默认本地分支名为远程分支名",[1330,1481,1482,1484,1486],{},[1349,1483],{"align":1335},[1349,1485],{},[1349,1487],{"align":1342},[1330,1489,1490,1493,1496],{},[1349,1491,1492],{"align":1335},"git stash",[1349,1494,1495],{},"暂存修改",[1349,1497],{"align":1342},[1330,1499,1500,1503,1506],{},[1349,1501,1502],{"align":1335},"git stash pop",[1349,1504,1505],{},"应用最近的暂存修改",[1349,1507],{"align":1342},[1330,1509,1510,1513,1516],{},[1349,1511,1512],{"align":1335},"git stash list",[1349,1514,1515],{},"列出当前暂存所有修改",[1349,1517],{"align":1342},[1330,1519,1520,1522,1524],{},[1349,1521],{"align":1335},[1349,1523],{},[1349,1525],{"align":1342},[1330,1527,1528,1531,1533],{},[1349,1529,1530],{"align":1335},"tag",[1349,1532],{},[1349,1534],{"align":1342},[1330,1536,1537,1540,1543],{},[1349,1538,1539],{"align":1335},"git tag -l -n",[1349,1541,1542],{},"查看本地tag",[1349,1544],{"align":1342},[1330,1546,1547,1549,1551],{},[1349,1548],{"align":1335},[1349,1550],{},[1349,1552],{"align":1342},[1330,1554,1555,1558,1561],{},[1349,1556,1557],{"align":1335},"git fetch",[1349,1559,1560],{},"单单获取远程信息到本地，但不是pull",[1349,1562],{"align":1342},[1330,1564,1565,1568,1571],{},[1349,1566,1567],{"align":1335},"git diff --cached  path\u002Ffile",[1349,1569,1570],{},"查看暂存去修改",[1349,1572,1573],{"align":1342},"git add后 红的变绿的",[1330,1575,1576,1579,1581],{},[1349,1577,1578],{"align":1335},"git merge --squash ｜ 多次合并记录为一次提交记录",[1349,1580],{},[1349,1582],{"align":1342},[1330,1584,1585,1587,1589],{},[1349,1586],{"align":1335},[1349,1588],{},[1349,1590],{"align":1342},{"title":45,"searchDepth":46,"depth":46,"links":1592},[],[1594,1078],"git","2021-01-06T02:01:58+05:30"," 举个栗子,方便查找 ",{},"\u002Fblog\u002F05-git",{"title":1317,"description":1596},"blog\u002F05-git","Jn9SlgjNkRzXuUFFBc8yUkXwstAqPR49K81_FNTMUbQ",{"id":1603,"title":1604,"body":1605,"categories":1688,"date":1689,"description":1690,"draft":52,"extension":53,"meta":1691,"navigation":55,"path":1692,"seo":1693,"stem":1694,"style":59,"__hash__":1695},"content\u002Fblog\u002F07-书信.md","旧时书信用语",{"type":8,"value":1606,"toc":1683},[1607,1612,1617,1621,1642,1646,1651,1657,1659,1664,1670,1672,1677],[11,1608,1609],{},[140,1610,1611],{},"全文内容摘抄整理自互联网",[1613,1614,1616],"h3",{"id":1615},"格式","格式：",[1613,1618,1620],{"id":1619},"用语例句","用语例句：",[11,1622,1623,1624,1626,1627,1629,1630,1632,1633,1635,1636,1638,1639,1641],{},"见字如晤；展信舒颜；",[1447,1625],{},"\n久违芝宇，时切遐思（葭思）；  \u002F\u002F 很久没有见到你的样子，内心十分想念",[1447,1628],{},"\n别经数月，思何可知。         \u002F\u002F 分别很久，对你的思念让我如何忍受",[1447,1631],{},"\n暌违日久，拳念殊殷。         \u002F\u002F 许久没见到你，思念的心情越加殷切",[1447,1634],{},"\n鄙寓君安，可释远念。         \u002F\u002F 我这边一切安好，你不必太过惦念",[1447,1637],{},"\n音问久疏，垂念已深。         \u002F\u002F 很久没有收到你的消息，甚是想念。",[1447,1640],{},"\n并请诸安，顺颂时祺；         \u002F\u002F 一切平安，祝愿你时时吉祥，身体健康",[1613,1643,1645],{"id":1644},"书信举例","书信举例：",[292,1647,1648],{},[81,1649,1650],{},"鲁迅致母亲",[132,1652,1655],{"className":1653,"code":1654,"language":747},[745],"母亲大人膝下，敬禀者，\n  日前寄上海婴照片一张，想已收到。\n  小包一个，今天收到了。\n  酱鸭、酱肉，昨起白花，蒸过之后，味仍不坏；\n  只有鸡腰是全不能吃了。其余的东西，都好的。  \n  下午已分了一份给老三去。\n  但其中的一种粉，无人认识，亦不知吃法，下次信中，乞示知。\n  上海一向很暖，昨天发风，才冷了起来，但房中亦尚有五十余度。\n  寓内大小俱安，请勿念为要。\n\n  海婴有几句话，写在另一纸上，今附呈。\n\n专此布达，恭请金安。\n\n男树叩上 广平及海婴同叩\n一月十六日\n",[140,1656,1654],{"__ignoreMap":45},[928,1658],{},[292,1660,1661],{"start":46},[81,1662,1663],{},"致老师",[132,1665,1668],{"className":1666,"code":1667,"language":747},[745],"澄宇先生夫子道席：\n\n既接光仪，又获手示，诲谕勤勤，感且不荆德芳返平，托致微物，尚祈哂纳。\n世局多故，至希为国自珍。\n\n肃此。敬颂\n教安。不具。\n受业 某某某\n",[140,1669,1667],{"__ignoreMap":45},[928,1671],{},[292,1673,1674],{"start":267},[81,1675,1676],{},"曾国藩致儿子曾纪鸿",[132,1678,1681],{"className":1679,"code":1680,"language":747},[745],"字谕纪鸿：\n\n   自尔还乡启行后，久未接尔来禀，殊不放心。\n   今日天气奇热，尔在途次平安否？\n   余在金陵与阮叔相聚二十五日，二十日等舟还皖，体中尚适。\n   余与阮叔蒙恩晋封侯伯，门户大盛，深为袛惧。\n   尔在省以谦、敬二字为主，事事请问意臣、芝生两姻叔，断不可送条子，致腾物议。\n   十六日出闱，十七八拜客，十九日即可回家。九月初在家听榜信后，再启程来署可也。\n   择交是第一要事，须择志趣远大者。\n\n此嘱。（涤生手示）\n",[140,1682,1680],{"__ignoreMap":45},{"title":45,"searchDepth":46,"depth":46,"links":1684},[1685,1686,1687],{"id":1615,"depth":267,"text":1616},{"id":1619,"depth":267,"text":1620},{"id":1644,"depth":267,"text":1645},[49],"2021-01-08","一些例句摘抄,方便记录",{},"\u002Fblog\u002F07",{"title":1604,"description":1690},"blog\u002F07-书信","YHs8SV_Uigpxrm_ogYRM-CNQKKhGqHdSbpWmmjmopWA",{"id":1697,"title":1698,"body":1699,"categories":2105,"date":2106,"description":2107,"draft":52,"extension":53,"meta":2108,"navigation":55,"path":2109,"seo":2110,"stem":2111,"style":59,"__hash__":2112},"content\u002Fblog\u002F17- go reflect.md","go reflect学习",{"type":8,"value":1700,"toc":2103},[1701,1704,1707,2097,2100],[11,1702,1703],{},"需求：\nmongo 中的结构，可能会持续进行变更(新增成员)\n对外的接口，已经提供出去，期望接口不变，能对数据进行更新。",[11,1705,1706],{},"这个时候可以利用 mongo 的update 和 reflect 完成需求。",[132,1708,1712],{"className":1709,"code":1710,"language":1711,"meta":45,"style":45},"language-golang shiki shiki-themes github-light github-dark","import (\n    \"errors\"\n    \"reflect\"\n    \"strings\"\n)\n\nvar ErrInvalide = errors.New(\"invalid err\")\n\nfunc extractReflectValueMap(modifyValue reflect.Value, rMap map[string]interface{}) (err error) {\n    if !modifyValue.IsValid() || modifyValue.Kind() != reflect.Struct {\n        return ErrInvalide\n    }\n\n    for i := 0; i \u003C modifyValue.NumField(); i++ {\n        tag := modifyValue.Type().Field(i).Tag.Get(\"json\")\n        tag = strings.TrimSuffix(tag, \",omitempty\")\n        if _, ok := rMap[tag]; ok {\n            return ErrInvalide\n        }\n        switch modifyValue.Field(i).Kind() {\n        case reflect.Struct:\n            sMap := make(map[string]interface{})\n            err = extractReflectValueMap(modifyValue.Field(i), sMap)\n            if err != nil {\n                return\n            }\n            if tag != \"\" {\n                rMap[tag] = sMap\n            } else {\n                for k, v := range sMap {\n                    if _, ok := rMap[k]; ok {\n                        return ErrInvalide\n                    }\n                    rMap[k] = v\n                }\n            }\n        default:\n            if tag == \"\" {\n                return ErrInvalide\n            }\n            rMap[tag] = modifyValue.Field(i).Interface()\n        }\n    }\n    return\n}\n\ntype ApiData struct {\n    Name string `json:\"name,omitempty\" bson:\"name\"`\n    Age int `json:\"age,omitempty\" bson:\"age\"`\n}\n\ntype YourDB struct {\n    ApiData\n    AppendMember string `json:\"appendMember,omitempty\" bson:\"appendMember\"`\n}\n\nfunc ApiModifyData(data *ApiData) {\n    dealMap := make(map[string]interface{})\n    if err = extractReflectValueMap(reflect.ValueOf(*data), dealMap); err != nil {\n        return\n    }\n\n    m := bson.M{}\n    for k, v := range dealMap {\n        m[k] = v\n    }\n\n    yourMongo.update(bson.M{\"key\": key}, bson.M{\"$set\": m})\n    return\n}\n","golang",[140,1713,1714,1719,1724,1729,1734,1738,1742,1747,1751,1756,1761,1766,1770,1774,1779,1784,1790,1796,1802,1807,1813,1819,1825,1831,1837,1843,1849,1855,1861,1867,1873,1879,1885,1891,1897,1903,1908,1914,1920,1926,1931,1937,1942,1947,1953,1958,1963,1969,1975,1981,1986,1991,1997,2003,2009,2014,2019,2025,2031,2037,2043,2048,2053,2059,2065,2071,2076,2081,2087,2092],{"__ignoreMap":45},[143,1715,1716],{"class":145,"line":146},[143,1717,1718],{},"import (\n",[143,1720,1721],{"class":145,"line":46},[143,1722,1723],{},"    \"errors\"\n",[143,1725,1726],{"class":145,"line":267},[143,1727,1728],{},"    \"reflect\"\n",[143,1730,1731],{"class":145,"line":279},[143,1732,1733],{},"    \"strings\"\n",[143,1735,1736],{"class":145,"line":399},[143,1737,438],{},[143,1739,1740],{"class":145,"line":410},[143,1741,396],{"emptyLinePlaceholder":55},[143,1743,1744],{"class":145,"line":421},[143,1745,1746],{},"var ErrInvalide = errors.New(\"invalid err\")\n",[143,1748,1749],{"class":145,"line":429},[143,1750,396],{"emptyLinePlaceholder":55},[143,1752,1753],{"class":145,"line":441},[143,1754,1755],{},"func extractReflectValueMap(modifyValue reflect.Value, rMap map[string]interface{}) (err error) {\n",[143,1757,1758],{"class":145,"line":447},[143,1759,1760],{},"    if !modifyValue.IsValid() || modifyValue.Kind() != reflect.Struct {\n",[143,1762,1763],{"class":145,"line":453},[143,1764,1765],{},"        return ErrInvalide\n",[143,1767,1768],{"class":145,"line":858},[143,1769,450],{},[143,1771,1772],{"class":145,"line":868},[143,1773,396],{"emptyLinePlaceholder":55},[143,1775,1776],{"class":145,"line":873},[143,1777,1778],{},"    for i := 0; i \u003C modifyValue.NumField(); i++ {\n",[143,1780,1781],{"class":145,"line":889},[143,1782,1783],{},"        tag := modifyValue.Type().Field(i).Tag.Get(\"json\")\n",[143,1785,1787],{"class":145,"line":1786},16,[143,1788,1789],{},"        tag = strings.TrimSuffix(tag, \",omitempty\")\n",[143,1791,1793],{"class":145,"line":1792},17,[143,1794,1795],{},"        if _, ok := rMap[tag]; ok {\n",[143,1797,1799],{"class":145,"line":1798},18,[143,1800,1801],{},"            return ErrInvalide\n",[143,1803,1805],{"class":145,"line":1804},19,[143,1806,444],{},[143,1808,1810],{"class":145,"line":1809},20,[143,1811,1812],{},"        switch modifyValue.Field(i).Kind() {\n",[143,1814,1816],{"class":145,"line":1815},21,[143,1817,1818],{},"        case reflect.Struct:\n",[143,1820,1822],{"class":145,"line":1821},22,[143,1823,1824],{},"            sMap := make(map[string]interface{})\n",[143,1826,1828],{"class":145,"line":1827},23,[143,1829,1830],{},"            err = extractReflectValueMap(modifyValue.Field(i), sMap)\n",[143,1832,1834],{"class":145,"line":1833},24,[143,1835,1836],{},"            if err != nil {\n",[143,1838,1840],{"class":145,"line":1839},25,[143,1841,1842],{},"                return\n",[143,1844,1846],{"class":145,"line":1845},26,[143,1847,1848],{},"            }\n",[143,1850,1852],{"class":145,"line":1851},27,[143,1853,1854],{},"            if tag != \"\" {\n",[143,1856,1858],{"class":145,"line":1857},28,[143,1859,1860],{},"                rMap[tag] = sMap\n",[143,1862,1864],{"class":145,"line":1863},29,[143,1865,1866],{},"            } else {\n",[143,1868,1870],{"class":145,"line":1869},30,[143,1871,1872],{},"                for k, v := range sMap {\n",[143,1874,1876],{"class":145,"line":1875},31,[143,1877,1878],{},"                    if _, ok := rMap[k]; ok {\n",[143,1880,1882],{"class":145,"line":1881},32,[143,1883,1884],{},"                        return ErrInvalide\n",[143,1886,1888],{"class":145,"line":1887},33,[143,1889,1890],{},"                    }\n",[143,1892,1894],{"class":145,"line":1893},34,[143,1895,1896],{},"                    rMap[k] = v\n",[143,1898,1900],{"class":145,"line":1899},35,[143,1901,1902],{},"                }\n",[143,1904,1906],{"class":145,"line":1905},36,[143,1907,1848],{},[143,1909,1911],{"class":145,"line":1910},37,[143,1912,1913],{},"        default:\n",[143,1915,1917],{"class":145,"line":1916},38,[143,1918,1919],{},"            if tag == \"\" {\n",[143,1921,1923],{"class":145,"line":1922},39,[143,1924,1925],{},"                return ErrInvalide\n",[143,1927,1929],{"class":145,"line":1928},40,[143,1930,1848],{},[143,1932,1934],{"class":145,"line":1933},41,[143,1935,1936],{},"            rMap[tag] = modifyValue.Field(i).Interface()\n",[143,1938,1940],{"class":145,"line":1939},42,[143,1941,444],{},[143,1943,1945],{"class":145,"line":1944},43,[143,1946,450],{},[143,1948,1950],{"class":145,"line":1949},44,[143,1951,1952],{},"    return\n",[143,1954,1956],{"class":145,"line":1955},45,[143,1957,456],{},[143,1959,1961],{"class":145,"line":1960},46,[143,1962,396],{"emptyLinePlaceholder":55},[143,1964,1966],{"class":145,"line":1965},47,[143,1967,1968],{},"type ApiData struct {\n",[143,1970,1972],{"class":145,"line":1971},48,[143,1973,1974],{},"    Name string `json:\"name,omitempty\" bson:\"name\"`\n",[143,1976,1978],{"class":145,"line":1977},49,[143,1979,1980],{},"    Age int `json:\"age,omitempty\" bson:\"age\"`\n",[143,1982,1984],{"class":145,"line":1983},50,[143,1985,456],{},[143,1987,1989],{"class":145,"line":1988},51,[143,1990,396],{"emptyLinePlaceholder":55},[143,1992,1994],{"class":145,"line":1993},52,[143,1995,1996],{},"type YourDB struct {\n",[143,1998,2000],{"class":145,"line":1999},53,[143,2001,2002],{},"    ApiData\n",[143,2004,2006],{"class":145,"line":2005},54,[143,2007,2008],{},"    AppendMember string `json:\"appendMember,omitempty\" bson:\"appendMember\"`\n",[143,2010,2012],{"class":145,"line":2011},55,[143,2013,456],{},[143,2015,2017],{"class":145,"line":2016},56,[143,2018,396],{"emptyLinePlaceholder":55},[143,2020,2022],{"class":145,"line":2021},57,[143,2023,2024],{},"func ApiModifyData(data *ApiData) {\n",[143,2026,2028],{"class":145,"line":2027},58,[143,2029,2030],{},"    dealMap := make(map[string]interface{})\n",[143,2032,2034],{"class":145,"line":2033},59,[143,2035,2036],{},"    if err = extractReflectValueMap(reflect.ValueOf(*data), dealMap); err != nil {\n",[143,2038,2040],{"class":145,"line":2039},60,[143,2041,2042],{},"        return\n",[143,2044,2046],{"class":145,"line":2045},61,[143,2047,450],{},[143,2049,2051],{"class":145,"line":2050},62,[143,2052,396],{"emptyLinePlaceholder":55},[143,2054,2056],{"class":145,"line":2055},63,[143,2057,2058],{},"    m := bson.M{}\n",[143,2060,2062],{"class":145,"line":2061},64,[143,2063,2064],{},"    for k, v := range dealMap {\n",[143,2066,2068],{"class":145,"line":2067},65,[143,2069,2070],{},"        m[k] = v\n",[143,2072,2074],{"class":145,"line":2073},66,[143,2075,450],{},[143,2077,2079],{"class":145,"line":2078},67,[143,2080,396],{"emptyLinePlaceholder":55},[143,2082,2084],{"class":145,"line":2083},68,[143,2085,2086],{},"    yourMongo.update(bson.M{\"key\": key}, bson.M{\"$set\": m})\n",[143,2088,2090],{"class":145,"line":2089},69,[143,2091,1952],{},[143,2093,2095],{"class":145,"line":2094},70,[143,2096,456],{},[11,2098,2099],{},"伪代码的过程比较简单。\n其他还可以补充，数据判断，异常处理等。",[1071,2101,2102],{},"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":45,"searchDepth":46,"depth":46,"links":2104},[],[1711,1078],"2023-03-23","go代码学习，实践示例 ",{},"\u002Fblog\u002F17-go-reflect",{"title":1698,"description":2107},"blog\u002F17- go reflect","n8FZ042d6qiT_kQAMgmOa6SpLzTTmfFnrsWkumwAU6o",{"id":2114,"title":2115,"body":2116,"categories":2205,"date":2206,"description":2207,"draft":52,"extension":53,"meta":2208,"navigation":55,"path":2209,"seo":2210,"stem":2211,"style":59,"__hash__":2212},"content\u002Fblog\u002F19- 大小端数据.md","大小端数据",{"type":8,"value":2117,"toc":2203},[2118,2121,2130,2141,2150,2152,2164,2172,2174,2187,2189],[11,2119,2120],{},"先以一个10进制(base-10)的数：1234 为例，方便我们来理解",[11,2122,2123,2124,2126,2127],{},"我们日常读写，是以大端方式来对待的。",[1447,2125],{},"\n即  ",[140,2128,2129],{},"1234 = 1*10^3 + 2*10^2 + 3*10^1 + 4*10^0",[11,2131,2132,2133,2126,2135,2138,2140],{},"如果1234 用10进制的小端表示的话,则表示为 4321",[1447,2134],{},[140,2136,2137],{},"4321 = 4*10^0 + 3*10^1 + 2*10^2 + 1*10^3",[1447,2139],{},"\n计算机中通常是按照这样的方式去寻址和做计算的",[11,2142,2143,2144,2146,2147,2149],{},"可以认为",[1447,2145],{},"\n大端， 第一位数字代表的是 10的最大次方",[1447,2148],{},"\n小端， 第一位数字代表的是 10的最小次方",[928,2151],{},[11,2153,2154,2155,2157,2158,2160,2161,2163],{},"在电脑中存储",[1447,2156],{},"\n大端： 高字节存放在低地址，类似我们日常读写",[1447,2159],{},"\n小端： 低字节存放在低地址",[1447,2162],{},"\n即，以一个32位的整数 0x12345678为例",[78,2165,2166,2169],{},[81,2167,2168],{},"内存地址： 1000  1001  1002  1003",[81,2170,2171],{},"存储数据： 0x78  0x56  0x34  0x12",[928,2173],{},[11,2175,2176,2177,2179,2180,2182,2183,2186],{},"在网络传输中",[1447,2178],{},"\n使用大端，也就是常说的网络字节序。",[1447,2181],{},"\n所以我们的代码在发送数据包的时候，总是要调用 ",[140,2184,2185],{},"htonl"," (host to network long)",[928,2188],{},[11,2190,2191,2192,2194,2195,2197,2198,2200],{},"go代码中",[1447,2193],{},"\nencoding\u002Fbinary 包中",[1447,2196],{},"\nbase-256",[1447,2199],{},[140,2201,2202],{},"2,3,5,7 = 2*256^0 + 3*256^1 + 5*256^2 + 7*256^3",{"title":45,"searchDepth":46,"depth":46,"links":2204},[],[1078],"2023-05-08T13:25:58+08:00","big-endian little-endian",{},"\u002Fblog\u002F19",{"title":2115,"description":2207},"blog\u002F19- 大小端数据","K9BZq3lv6f2wllPZT3Sohvw5SWrqpdCzKTU-3lhJy7U",{"id":2214,"title":2215,"body":2216,"categories":2269,"date":2271,"description":2272,"draft":52,"extension":53,"meta":2273,"navigation":55,"path":2274,"seo":2275,"stem":2276,"style":59,"__hash__":2277},"content\u002Fblog\u002F20-一句话.md","一句话知识点",{"type":8,"value":2217,"toc":2267},[2218,2224,2227],[11,2219,2220,2221,2223],{},"许多结论是在若干前提条件下才可以成立的。",[1447,2222],{},"\n某些结论，是在潜在条件下的语境里的结论,这些潜在条件，是大多数人共识，容易让人忽视。",[11,2225,2226],{},"本文的结论，不是绝对答案。",[292,2228,2229,2241,2252,2261],{},[81,2230,2231,2232,2234,2235,2237,2238],{},"喝酒脸红",[1447,2233],{},"\n乙醛堆积，没有转化，引起脸红。",[1447,2236],{},"\n酒精(乙醇)在肝脏中被乙醇脱氢酶转化为乙醛，乙醛再被乙醛脱氢酶转化为乙酸，最后被分解成二氧化碳，水和脂肪。  ",[140,2239,2240],{},"---from 知乎《人类停止进化了么》",[81,2242,2243,2244],{},"冰箱自制冰块不透明",[78,2245,2246,2249],{},[81,2247,2248],{},"水中是否有杂质",[81,2250,2251],{},"水中有溶解空气；冰箱中冰块冻结方向从外向内的冻结，总有气泡无法排出",[81,2253,2254,2255,2257,2258,2260],{},"没有2岁前的记忆",[1447,2256],{},"\n长期记忆功能还没有形成。大脑可能快速生长而降低了记忆的功能。",[1447,2259],{},"\n认知功能还没完善，比如语言组织。即，记忆编码和未来解码方式的差异。",[81,2262,2263,2264,2266],{},"84消毒液的名字",[1447,2265],{},"\n名字由来是因为其被发明于1984年，地坛医院的前身北京第一传染病医院研制成功能迅速杀灭各类肝炎病毒的消毒液，经北京市卫生局组织专家坚定，授予应用成果二等奖。",{"title":45,"searchDepth":46,"depth":46,"links":2268},[],[2270,1078],"生活","2023-08-01","简单的说",{},"\u002Fblog\u002F20",{"title":2215,"description":2272},"blog\u002F20-一句话","aLsaKd4F5uZpHAr_2p_BEKPEanSie3fN53yan6UElow",{"id":2279,"title":2280,"body":2281,"categories":2497,"date":2498,"description":2499,"draft":52,"extension":53,"meta":2500,"navigation":55,"path":2501,"seo":2502,"stem":2503,"style":59,"__hash__":2504},"content\u002Fblog\u002F22-最大公约数_最小公倍数.md","最大公约数，最大公倍数",{"type":8,"value":2282,"toc":2495},[2283,2340,2359,2430,2493],[132,2284,2286],{"className":1709,"code":2285,"language":1711,"meta":45,"style":45},"    func gcd(a, b int) int {\n        for b != 0 {\n            tmp := b\n            b = a%b\n            a = tmp\n        }\n        return a\n    }\n\n    \u002F\u002F a%b a除以b的余数\n    \u002F\u002F a\u003Cb 余数为a\n",[140,2287,2288,2293,2298,2303,2308,2313,2317,2322,2326,2330,2335],{"__ignoreMap":45},[143,2289,2290],{"class":145,"line":146},[143,2291,2292],{},"    func gcd(a, b int) int {\n",[143,2294,2295],{"class":145,"line":46},[143,2296,2297],{},"        for b != 0 {\n",[143,2299,2300],{"class":145,"line":267},[143,2301,2302],{},"            tmp := b\n",[143,2304,2305],{"class":145,"line":279},[143,2306,2307],{},"            b = a%b\n",[143,2309,2310],{"class":145,"line":399},[143,2311,2312],{},"            a = tmp\n",[143,2314,2315],{"class":145,"line":410},[143,2316,444],{},[143,2318,2319],{"class":145,"line":421},[143,2320,2321],{},"        return a\n",[143,2323,2324],{"class":145,"line":429},[143,2325,450],{},[143,2327,2328],{"class":145,"line":441},[143,2329,396],{"emptyLinePlaceholder":55},[143,2331,2332],{"class":145,"line":447},[143,2333,2334],{},"    \u002F\u002F a%b a除以b的余数\n",[143,2336,2337],{"class":145,"line":453},[143,2338,2339],{},"    \u002F\u002F a\u003Cb 余数为a\n",[132,2341,2343],{"className":1709,"code":2342,"language":1711,"meta":45,"style":45},"    func lcm(a,b int) int {\n        return a*b\u002Fgcd(a,b)\n    }\n",[140,2344,2345,2350,2355],{"__ignoreMap":45},[143,2346,2347],{"class":145,"line":146},[143,2348,2349],{},"    func lcm(a,b int) int {\n",[143,2351,2352],{"class":145,"line":46},[143,2353,2354],{},"        return a*b\u002Fgcd(a,b)\n",[143,2356,2357],{"class":145,"line":267},[143,2358,450],{},[132,2360,2362],{"className":1709,"code":2361,"language":1711,"meta":45,"style":45},"    func ngcd(nums []int) int {\n        size := len(nums)\n        if size == 0 {\n            panic(\"empty nums\")\n        }\n        if size == 1{\n            return nums[0]\n        }\n        x := nums[0]\n        for i:=1; i\u003Csize; i++ {\n            x = gcd(x, nums[i])\n        }\n        return x\n    }\n\n",[140,2363,2364,2369,2374,2379,2384,2388,2393,2398,2402,2407,2412,2417,2421,2426],{"__ignoreMap":45},[143,2365,2366],{"class":145,"line":146},[143,2367,2368],{},"    func ngcd(nums []int) int {\n",[143,2370,2371],{"class":145,"line":46},[143,2372,2373],{},"        size := len(nums)\n",[143,2375,2376],{"class":145,"line":267},[143,2377,2378],{},"        if size == 0 {\n",[143,2380,2381],{"class":145,"line":279},[143,2382,2383],{},"            panic(\"empty nums\")\n",[143,2385,2386],{"class":145,"line":399},[143,2387,444],{},[143,2389,2390],{"class":145,"line":410},[143,2391,2392],{},"        if size == 1{\n",[143,2394,2395],{"class":145,"line":421},[143,2396,2397],{},"            return nums[0]\n",[143,2399,2400],{"class":145,"line":429},[143,2401,444],{},[143,2403,2404],{"class":145,"line":441},[143,2405,2406],{},"        x := nums[0]\n",[143,2408,2409],{"class":145,"line":447},[143,2410,2411],{},"        for i:=1; i\u003Csize; i++ {\n",[143,2413,2414],{"class":145,"line":453},[143,2415,2416],{},"            x = gcd(x, nums[i])\n",[143,2418,2419],{"class":145,"line":858},[143,2420,444],{},[143,2422,2423],{"class":145,"line":868},[143,2424,2425],{},"        return x\n",[143,2427,2428],{"class":145,"line":873},[143,2429,450],{},[132,2431,2433],{"className":1709,"code":2432,"language":1711,"meta":45,"style":45},"    func nlcm(nums []int) int {\n        size := len(nums)\n        if size == 0 {\n            panic(\"empty nums\")\n        }\n        if size == 1{\n            return nums[0]\n        }\n        x := nums[0]\n        for i:=1; i\u003Csize; i++ {\n            x = (x * nums[i]) \u002F gcd(x, nums[i])\n        }\n        return x\n    }\n",[140,2434,2435,2440,2444,2448,2452,2456,2460,2464,2468,2472,2476,2481,2485,2489],{"__ignoreMap":45},[143,2436,2437],{"class":145,"line":146},[143,2438,2439],{},"    func nlcm(nums []int) int {\n",[143,2441,2442],{"class":145,"line":46},[143,2443,2373],{},[143,2445,2446],{"class":145,"line":267},[143,2447,2378],{},[143,2449,2450],{"class":145,"line":279},[143,2451,2383],{},[143,2453,2454],{"class":145,"line":399},[143,2455,444],{},[143,2457,2458],{"class":145,"line":410},[143,2459,2392],{},[143,2461,2462],{"class":145,"line":421},[143,2463,2397],{},[143,2465,2466],{"class":145,"line":429},[143,2467,444],{},[143,2469,2470],{"class":145,"line":441},[143,2471,2406],{},[143,2473,2474],{"class":145,"line":447},[143,2475,2411],{},[143,2477,2478],{"class":145,"line":453},[143,2479,2480],{},"            x = (x * nums[i]) \u002F gcd(x, nums[i])\n",[143,2482,2483],{"class":145,"line":858},[143,2484,444],{},[143,2486,2487],{"class":145,"line":868},[143,2488,2425],{},[143,2490,2491],{"class":145,"line":873},[143,2492,450],{},[1071,2494,2102],{},{"title":45,"searchDepth":46,"depth":46,"links":2496},[],[140],"2024-04-28","golang 代码",{},"\u002Fblog\u002F22-_",{"title":2280,"description":2499},"blog\u002F22-最大公约数_最小公倍数","GcJ2202B7jPI0xTK_KBCmeueUF979FYUBWNQe1MAPFw",{"id":2506,"title":2507,"body":2508,"categories":3210,"date":3214,"description":3215,"draft":52,"extension":53,"meta":3216,"navigation":55,"path":3217,"seo":3218,"stem":3219,"style":59,"__hash__":3220},"content\u002Fblog\u002F27-证书申请.md","域名https证书申请",{"type":8,"value":2509,"toc":3197},[2510,2513,2517,2534,2538,2544,2552,2556,2574,2578,2624,2628,2789,2794,2846,2850,2880,2883,2901,2904,2915,2921,2933,2939,2952,2956,2961,3030,3035,3068,3073,3087,3092,3098,3100,3104,3111,3117,3163,3169,3175,3179,3185,3191,3194],[11,2511,2512],{},"记录一下https 证书申请的详细步骤",[120,2514,2516],{"id":2515},"_0前提","0.前提",[78,2518,2519,2522,2525,2528],{},[81,2520,2521],{},"本文基于云主机系统： Ubuntu",[81,2523,2524],{},"域名已经配置好了DNS解析，即 指向了云主机的公网IP",[81,2526,2527],{},"具备Nginx 运行环境",[81,2529,2530,2531],{},"申请的域名: ",[140,2532,2533],{},"abc.com",[120,2535,2537],{"id":2536},"_1安装certbot","1.安装certbot",[132,2539,2542],{"className":2540,"code":2541,"language":747},[745],"sudo apt install certbot\n\ncertbot --version\n",[140,2543,2541],{"__ignoreMap":45},[11,2545,2546,2547],{},"另，certbot详细安装可以参考 ",[174,2548,2551],{"href":2549,"rel":2550},"https:\u002F\u002Fcertbot.eff.org\u002Finstructions?ws=other&os=ubuntufocal&tab=standard",[178],"instructions",[120,2553,2555],{"id":2554},"_2申请证书","2.申请证书",[132,2557,2559],{"className":134,"code":2558,"language":138,"meta":45,"style":45},"# 可查看当前主机上已有证书信息，包含证书名，包含域名，过期时间，保存路径 等等\nsudo certbot certificates\n",[140,2560,2561,2566],{"__ignoreMap":45},[143,2562,2563],{"class":145,"line":146},[143,2564,2565],{"class":809},"# 可查看当前主机上已有证书信息，包含证书名，包含域名，过期时间，保存路径 等等\n",[143,2567,2568,2570,2572],{"class":145,"line":46},[143,2569,725],{"class":149},[143,2571,583],{"class":157},[143,2573,663],{"class":157},[1613,2575,2577],{"id":2576},"_21-创建验证文件","2.1 创建验证文件",[132,2579,2581],{"className":134,"code":2580,"language":138,"meta":45,"style":45},"# 构建用于证书验证的访问目录\nsudo mkdir -p \u002Fvar\u002Fwww\u002Fabc.com\u002F.well-known\u002Facme-challenge\nsudo touch \u002Fvar\u002Fwww\u002Fabc.com\u002F.well-known\u002Facme-challenge\u002Fhello\nsudo echo \"hello\" > \u002Fvar\u002Fwww\u002Fabc.com\u002F.well-known\u002Facme-challenge\u002Fhello\n",[140,2582,2583,2588,2600,2609],{"__ignoreMap":45},[143,2584,2585],{"class":145,"line":146},[143,2586,2587],{"class":809},"# 构建用于证书验证的访问目录\n",[143,2589,2590,2592,2594,2597],{"class":145,"line":46},[143,2591,725],{"class":149},[143,2593,245],{"class":157},[143,2595,2596],{"class":153}," -p",[143,2598,2599],{"class":157}," \u002Fvar\u002Fwww\u002Fabc.com\u002F.well-known\u002Facme-challenge\n",[143,2601,2602,2604,2606],{"class":145,"line":267},[143,2603,725],{"class":149},[143,2605,273],{"class":157},[143,2607,2608],{"class":157}," \u002Fvar\u002Fwww\u002Fabc.com\u002F.well-known\u002Facme-challenge\u002Fhello\n",[143,2610,2611,2613,2616,2619,2622],{"class":145,"line":279},[143,2612,725],{"class":149},[143,2614,2615],{"class":157}," echo",[143,2617,2618],{"class":157}," \"hello\"",[143,2620,2621],{"class":876}," >",[143,2623,2608],{"class":157},[1613,2625,2627],{"id":2626},"_22-配置nginx","2.2 配置nginx",[132,2629,2631],{"className":134,"code":2630,"language":138,"meta":45,"style":45},"\nserver {\n    listen 80;\n    server_name abc.com;\n\n    location \u002F.well-known\u002Facme-challenge\u002F {\n        root \u002Fvar\u002Fwww\u002F$host;\n        allow all;\n    }\n    location \u002F {\n        return 301 https:\u002F\u002F$host$request_uri;   # HTTP 重定向到 HTTPS\n    }\n}\n\nserver {\n    listen 443 ssl;\n    server_name abc.com;\n    \n    # 先暂时注销. 因为这些目录还未创建\n    #ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Ffullchain.pem;\n    #ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Fprivkey.pem;\n\n    # 其他配置（根目录、代理等）...\n}\n",[140,2632,2633,2637,2643,2651,2659,2663,2672,2683,2693,2697,2705,2720,2724,2728,2732,2738,2748,2756,2761,2766,2771,2776,2780,2785],{"__ignoreMap":45},[143,2634,2635],{"class":145,"line":146},[143,2636,396],{"emptyLinePlaceholder":55},[143,2638,2639,2641],{"class":145,"line":46},[143,2640,367],{"class":149},[143,2642,370],{"class":157},[143,2644,2645,2647,2649],{"class":145,"line":267},[143,2646,375],{"class":149},[143,2648,378],{"class":153},[143,2650,328],{"class":327},[143,2652,2653,2655,2657],{"class":145,"line":279},[143,2654,386],{"class":149},[143,2656,863],{"class":157},[143,2658,328],{"class":327},[143,2660,2661],{"class":145,"line":399},[143,2662,396],{"emptyLinePlaceholder":55},[143,2664,2665,2667,2670],{"class":145,"line":410},[143,2666,402],{"class":149},[143,2668,2669],{"class":157}," \u002F.well-known\u002Facme-challenge\u002F",[143,2671,370],{"class":157},[143,2673,2674,2677,2680],{"class":145,"line":421},[143,2675,2676],{"class":149},"        root",[143,2678,2679],{"class":157}," \u002Fvar\u002Fwww\u002F",[143,2681,2682],{"class":327},"$host;\n",[143,2684,2685,2688,2691],{"class":145,"line":429},[143,2686,2687],{"class":149},"        allow",[143,2689,2690],{"class":157}," all",[143,2692,328],{"class":327},[143,2694,2695],{"class":145,"line":441},[143,2696,450],{"class":327},[143,2698,2699,2701,2703],{"class":145,"line":447},[143,2700,402],{"class":149},[143,2702,405],{"class":157},[143,2704,370],{"class":157},[143,2706,2707,2709,2711,2714,2717],{"class":145,"line":453},[143,2708,877],{"class":876},[143,2710,880],{"class":153},[143,2712,2713],{"class":157}," https:\u002F\u002F",[143,2715,2716],{"class":327},"$host$request_uri;   ",[143,2718,2719],{"class":809},"# HTTP 重定向到 HTTPS\n",[143,2721,2722],{"class":145,"line":858},[143,2723,450],{"class":327},[143,2725,2726],{"class":145,"line":868},[143,2727,456],{"class":327},[143,2729,2730],{"class":145,"line":873},[143,2731,396],{"emptyLinePlaceholder":55},[143,2733,2734,2736],{"class":145,"line":889},[143,2735,367],{"class":149},[143,2737,370],{"class":157},[143,2739,2740,2742,2744,2746],{"class":145,"line":1786},[143,2741,375],{"class":149},[143,2743,786],{"class":153},[143,2745,789],{"class":157},[143,2747,328],{"class":327},[143,2749,2750,2752,2754],{"class":145,"line":1792},[143,2751,386],{"class":149},[143,2753,863],{"class":157},[143,2755,328],{"class":327},[143,2757,2758],{"class":145,"line":1798},[143,2759,2760],{"class":327},"    \n",[143,2762,2763],{"class":145,"line":1804},[143,2764,2765],{"class":809},"    # 先暂时注销. 因为这些目录还未创建\n",[143,2767,2768],{"class":145,"line":1809},[143,2769,2770],{"class":809},"    #ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Ffullchain.pem;\n",[143,2772,2773],{"class":145,"line":1815},[143,2774,2775],{"class":809},"    #ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Fprivkey.pem;\n",[143,2777,2778],{"class":145,"line":1821},[143,2779,396],{"emptyLinePlaceholder":55},[143,2781,2782],{"class":145,"line":1827},[143,2783,2784],{"class":809},"    # 其他配置（根目录、代理等）...\n",[143,2786,2787],{"class":145,"line":1833},[143,2788,456],{"class":327},[78,2790,2791],{},[81,2792,2793],{},"以上主要内容修改或者新建到 nginx_abc.conf 文件",[132,2795,2797],{"className":134,"code":2796,"language":138,"meta":45,"style":45},"# 检查新的配置是否\nsudo nginx -t\n# 重新加载配置\nsudo nginx -s reload\n# 确认 certbot验证请求的path\ncurl -v \"http:\u002F\u002Fabc.com\u002F.well-known\u002Facme-challenge\u002Fhello\"\n",[140,2798,2799,2804,2813,2818,2830,2835],{"__ignoreMap":45},[143,2800,2801],{"class":145,"line":146},[143,2802,2803],{"class":809},"# 检查新的配置是否\n",[143,2805,2806,2808,2811],{"class":145,"line":46},[143,2807,725],{"class":149},[143,2809,2810],{"class":157}," nginx",[143,2812,479],{"class":153},[143,2814,2815],{"class":145,"line":267},[143,2816,2817],{"class":809},"# 重新加载配置\n",[143,2819,2820,2822,2824,2827],{"class":145,"line":279},[143,2821,725],{"class":149},[143,2823,2810],{"class":157},[143,2825,2826],{"class":153}," -s",[143,2828,2829],{"class":157}," reload\n",[143,2831,2832],{"class":145,"line":399},[143,2833,2834],{"class":809},"# 确认 certbot验证请求的path\n",[143,2836,2837,2840,2843],{"class":145,"line":410},[143,2838,2839],{"class":149},"curl",[143,2841,2842],{"class":153}," -v",[143,2844,2845],{"class":157}," \"http:\u002F\u002Fabc.com\u002F.well-known\u002Facme-challenge\u002Fhello\"\n",[1613,2847,2849],{"id":2848},"_23-获取证书","2.3 获取证书",[132,2851,2853],{"className":134,"code":2852,"language":138,"meta":45,"style":45},"# 获取证书\nsudo certbot certonly --manual -d \"abc.com\" --preferred-challenges http\n",[140,2854,2855,2860],{"__ignoreMap":45},[143,2856,2857],{"class":145,"line":146},[143,2858,2859],{"class":809},"# 获取证书\n",[143,2861,2862,2864,2866,2868,2870,2872,2874,2877],{"class":145,"line":46},[143,2863,725],{"class":149},[143,2865,583],{"class":157},[143,2867,586],{"class":157},[143,2869,589],{"class":153},[143,2871,592],{"class":153},[143,2873,595],{"class":157},[143,2875,2876],{"class":153}," --preferred-challenges",[143,2878,2879],{"class":157}," http\n",[11,2881,2882],{},"参数含义",[78,2884,2885,2892,2895,2898],{},[81,2886,2887,2888,2891],{},"certonly：      仅获取证书，不自动修改Nginx的配置。证书默认保存在 ",[140,2889,2890],{},"\u002Fetc\u002Fletsencrypt\u002Flive\u002F"," 下",[81,2893,2894],{},"--manual：      手动模式。申请过程会一步步提示需要执行哪些手动操作。",[81,2896,2897],{},"-d \"abc.com\"：  指定申请证书的域名",[81,2899,2900],{},"--preferred-challenges http：   指定验证方式优先使用 HTTP-01 challenge。即 Certbot 会要求在 Web 服务器的 http:\u002F\u002F\u003C域名>\u002F.well-known\u002Facme-challenge\u002F 路径下放置一个特定的验证文件，Let's Encrypt 的服务器通过公网访问该文件来确认您拥有域名的控制权",[124,2902,2903],{"id":2903},"http验证流程",[292,2905,2906,2909,2912],{},[81,2907,2908],{},"Certbot 向 Let's Encrypt 发起申请",[81,2910,2911],{},"Certbot 提示：在 Web 服务器的指定目录下创建一个文件（包含特定内容）",[81,2913,2914],{},"需要手动创建该文件（例如：\u002Fvar\u002Fwww\u002F\u003Csomething>\u002F.well-known\u002Facme-challenge\u002Fxxxx）",[132,2916,2919],{"className":2917,"code":2918,"language":747},[745],"sudo touch \u002Fvar\u002Fwww\u002Fabc.com\u002F.well-known\u002Facme-challenge\u002Fxxxx\nsudo echo \"xxxxxx\" > \u002Fvar\u002Fwww\u002Fabc.com\u002F.well-known\u002Facme-challenge\u002Fxxxx\n",[140,2920,2918],{"__ignoreMap":45},[292,2922,2923,2930],{"start":279},[81,2924,2925,2926,2929],{},"确保 ",[140,2927,2928],{},"http:\u002F\u002Fabc.com\u002F.well-known\u002Facme-challenge\u002Fxxxx"," 可以公网访问；",[81,2931,2932],{},"Certbot 验证通过后，颁发证书。",[11,2934,2935,2936,2938],{},"按照提示操作，一路enter即可",[1447,2937],{},"\n再次查看主机上的证书",[132,2940,2942],{"className":134,"code":2941,"language":138,"meta":45,"style":45},"sudo certbot certificates\n",[140,2943,2944],{"__ignoreMap":45},[143,2945,2946,2948,2950],{"class":145,"line":146},[143,2947,725],{"class":149},[143,2949,583],{"class":157},[143,2951,663],{"class":157},[120,2953,2955],{"id":2954},"_3配置验证证书","3.配置&验证证书",[78,2957,2958],{},[81,2959,2960],{},"启用nginx证书配置",[132,2962,2964],{"className":134,"code":2963,"language":138,"meta":45,"style":45}," server {\n    listen 443 ssl;\n    server_name abc.com;\n    \n    # 放开注释\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fabc.com\u002Fprivkey.pem;\n\n    # 其他配置（根目录、代理等）...\n}\n",[140,2965,2966,2973,2983,2991,2995,3000,3009,3018,3022,3026],{"__ignoreMap":45},[143,2967,2968,2971],{"class":145,"line":146},[143,2969,2970],{"class":149}," server",[143,2972,370],{"class":157},[143,2974,2975,2977,2979,2981],{"class":145,"line":46},[143,2976,375],{"class":149},[143,2978,786],{"class":153},[143,2980,789],{"class":157},[143,2982,328],{"class":327},[143,2984,2985,2987,2989],{"class":145,"line":267},[143,2986,386],{"class":149},[143,2988,863],{"class":157},[143,2990,328],{"class":327},[143,2992,2993],{"class":145,"line":279},[143,2994,2760],{"class":327},[143,2996,2997],{"class":145,"line":399},[143,2998,2999],{"class":809},"    # 放开注释\n",[143,3001,3002,3005,3007],{"class":145,"line":410},[143,3003,3004],{"class":149},"    ssl_certificate",[143,3006,818],{"class":157},[143,3008,328],{"class":327},[143,3010,3011,3014,3016],{"class":145,"line":421},[143,3012,3013],{"class":149},"    ssl_certificate_key",[143,3015,828],{"class":157},[143,3017,328],{"class":327},[143,3019,3020],{"class":145,"line":429},[143,3021,396],{"emptyLinePlaceholder":55},[143,3023,3024],{"class":145,"line":441},[143,3025,2784],{"class":809},[143,3027,3028],{"class":145,"line":447},[143,3029,456],{"class":327},[78,3031,3032],{},[81,3033,3034],{},"重加载配置",[132,3036,3038],{"className":134,"code":3037,"language":138,"meta":45,"style":45},"sudo nginx -t\nsudo nginx -s reload\n# 如果没有重新加载证书，换个方式尝试\n# systemctl reload nginx\n",[140,3039,3040,3048,3058,3063],{"__ignoreMap":45},[143,3041,3042,3044,3046],{"class":145,"line":146},[143,3043,725],{"class":149},[143,3045,2810],{"class":157},[143,3047,479],{"class":153},[143,3049,3050,3052,3054,3056],{"class":145,"line":46},[143,3051,725],{"class":149},[143,3053,2810],{"class":157},[143,3055,2826],{"class":153},[143,3057,2829],{"class":157},[143,3059,3060],{"class":145,"line":267},[143,3061,3062],{"class":809},"# 如果没有重新加载证书，换个方式尝试\n",[143,3064,3065],{"class":145,"line":279},[143,3066,3067],{"class":809},"# systemctl reload nginx\n",[78,3069,3070],{},[81,3071,3072],{},"https 请求域名",[132,3074,3076],{"className":134,"code":3075,"language":138,"meta":45,"style":45},"curl -v \"https:\u002F\u002Fabc.com\"\n",[140,3077,3078],{"__ignoreMap":45},[143,3079,3080,3082,3084],{"class":145,"line":146},[143,3081,2839],{"class":149},[143,3083,2842],{"class":153},[143,3085,3086],{"class":157}," \"https:\u002F\u002Fabc.com\"\n",[78,3088,3089],{},[81,3090,3091],{},"本地机器直接请求server的访问ip,确认获取的证书生成和过期时间",[132,3093,3096],{"className":3094,"code":3095,"language":747},[745],"echo | openssl s_client -connect \u003Cserver-ip>:443 -servername abc.com 2>\u002Fdev\u002Fnull | openssl x509 -noout -dates \n",[140,3097,3095],{"__ignoreMap":45},[928,3099],{},[120,3101,3103],{"id":3102},"patch","PATCH",[11,3105,3106,3107,3110],{},"一个问题：\n在前面的获取证书命令 certbot certonly --manual 是手动模式，Certbot 会强制把验证方式写入配置文件为 manual，且要求每次续订时人工干预。\n免费证书时长为90天，一直人工续订不方便，而且Certbot是可以自动续订的。\n我们只要使用 ",[140,3108,3109],{},"--webroot"," 参数重新签发(或覆盖)证书即可",[132,3112,3115],{"className":3113,"code":3114,"language":747},[745],"# 模拟运行\nsudo certbot certonly --webroot -w \u002Fetc\u002Fletsencrypt\u002Frenewal\u002Fabc.com.conf -d abc.com --dry-run\n",[140,3116,3114],{"__ignoreMap":45},[78,3118,3119,3129,3142,3148,3154],{},[81,3120,3121,3124,3125,3128],{},[140,3122,3123],{},"--dry-run"," 模拟运行，可以检查命令是否ok。看到 ",[140,3126,3127],{},"The dry run was successful"," 后，再执行前面带 --force-renewal 的正式命令",[81,3130,3131,3132,3135,3136,3138,3139],{},"去掉 ",[140,3133,3134],{},"--manual"," 这是最关键的，只要用了 ",[140,3137,3109],{},", Certbot 就不会再往配置文件里写 ",[140,3140,3141],{},"manual",[81,3143,3144,3147],{},[140,3145,3146],{},"--force-renewal"," 强制用新方式重新签发证书，执行成功后，Certbot自动覆盖配置文件",[81,3149,3150,3153],{},[140,3151,3152],{},"-w webroot_path"," 配置文件的路径",[81,3155,3156,3159,3160,3162],{},[140,3157,3158],{},"--preferred-challenges http"," 无需添加。",[140,3161,3109],{}," 默认就使用 http-01 验证，写不写都一样",[132,3164,3167],{"className":3165,"code":3166,"language":747},[745],"# 强制重新签发运行\nsudo certbot certonly --force-renewal --webroot -w \u002Fetc\u002Fletsencrypt\u002Frenewal\u002Fabc.com.conf -d abc.com\n",[140,3168,3166],{"__ignoreMap":45},[132,3170,3173],{"className":3171,"code":3172,"language":747},[745],"# 检查证书实际有效期，应该是最新订阅的\nsudo certbot certificates\n",[140,3174,3172],{"__ignoreMap":45},[1613,3176,3178],{"id":3177},"确认-certbot-自动更新状态正常","确认 Certbot 自动更新状态正常",[132,3180,3183],{"className":3181,"code":3182,"language":747},[745],"# 检查定时器状态\nsudo systemctl status certbot.timer\n",[140,3184,3182],{"__ignoreMap":45},[132,3186,3189],{"className":3187,"code":3188,"language":747},[745],"# 检查历史执行日志\nsudo journalctl -u certbot.service\n\n# 查看 Certbot日志\nsudo tail -50 \u002Fvar\u002Flog\u002Fletsencrypt\u002Fletsencrypt.log\n",[140,3190,3188],{"__ignoreMap":45},[11,3192,3193],{},"如果一切正常的话，Certbot 就可以自动运行，续订证书了。",[1071,3195,3196],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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":45,"searchDepth":46,"depth":46,"links":3198},[3199,3200,3201,3206,3207],{"id":2515,"depth":46,"text":2516},{"id":2536,"depth":46,"text":2537},{"id":2554,"depth":46,"text":2555,"children":3202},[3203,3204,3205],{"id":2576,"depth":267,"text":2577},{"id":2626,"depth":267,"text":2627},{"id":2848,"depth":267,"text":2849},{"id":2954,"depth":46,"text":2955},{"id":3102,"depth":46,"text":3103,"children":3208},[3209],{"id":3177,"depth":267,"text":3178},[3211,3212,3213],"https","certbot","certificates","2026-05-24","certbot申请https证书流程",{},"\u002Fblog\u002F27",{"title":2507,"description":3215},"blog\u002F27-证书申请","34aGarpw00_28CF7suWn-150zXwSpG6iP2ivqZ9AJsM",{"id":3222,"title":3223,"body":3224,"categories":3500,"date":3502,"description":3503,"draft":52,"extension":53,"meta":3504,"navigation":55,"path":3509,"seo":3510,"stem":3511,"style":59,"__hash__":3512},"content\u002Fblog\u002Fgame\u002F04-poker.md","德州扑克",{"type":8,"value":3225,"toc":3494},[3226,3229,3232,3235,3270,3273,3276,3279,3311,3314,3317,3478,3480,3483,3486],[11,3227,3228],{},"德州扑克玩法上手",[1613,3230,3231],{"id":3231},"基础玩法",[11,3233,3234],{},"一句话简单来讲，每人手上各自拿两张底牌，经过加注和发牌后，桌上5张公共牌，7张中的5张，组合成最大牌型比大小。或通过加注使其他对手弃牌退出。\n在到达最后一步中的过程中，会伴随几轮发牌和下注：",[292,3236,3237,3240,3243,3246,3249,3252,3255,3258,3261,3264,3267],{"start":137},[81,3238,3239],{},"确定庄家位(第一局可随机确定，以后每一局结束后，顺时针沿转给下一位),\n庄家位下一位为小盲位,再下一位为大盲位",[81,3241,3242],{},"小盲位\u002F大盲位，首先下注. 同时洗牌，切牌",[81,3244,3245],{},"按序发底牌(小盲位开始，每轮每人一张，发两轮)",[81,3247,3248],{},"开始第一轮(preflop圈)下注or弃牌\n（大盲位的下一位先说话，然后依次说话，直至玩家的下注额度都追平）",[81,3250,3251],{},"烧牌(burn card)后，发三张公共牌",[81,3253,3254],{},"第二轮(flop圈)下注（小盲位先说话-不加注\u002F加注\u002F弃牌，依次顺延，直至本轮下注金额追平）",[81,3256,3257],{},"烧牌后，发一张公共牌(转牌)",[81,3259,3260],{},"第三轮(turn圈)下注 (同5)",[81,3262,3263],{},"烧牌后，发一张公共牌(河牌)",[81,3265,3266],{},"第四轮(river圈)下注（同5）",[81,3268,3269],{},"最后摊牌，比大小",[11,3271,3272],{},"庄家，顺时针，下一位，小盲，大盲",[1613,3274,3275],{"id":3275},"牌型比较",[11,3277,3278],{},"从大到小",[78,3280,3281,3284,3287,3290,3293,3296,3299,3302,3305,3308],{},[81,3282,3283],{},"皇家同花顺\t\troyal straight flush",[81,3285,3286],{},"同花顺\t\t\tstraight flush",[81,3288,3289],{},"四条 \t\t\tfour of a kind",[81,3291,3292],{},"葫芦 (3带2) \tfull house",[81,3294,3295],{},"同花 \t\t\tflush",[81,3297,3298],{},"顺子 \t\t\tstraight",[81,3300,3301],{},"三条 \t\t\tthree of a kind",[81,3303,3304],{},"两对\t\t\ttwo pair",[81,3306,3307],{},"对子\t\t\tpair",[81,3309,3310],{},"高牌\t\t\thigh-card\u002Fzitch",[1613,3312,3313],{"id":3313},"一些术语",[11,3315,3316],{},"了解下，玩起来也Texas-style些",[1324,3318,3319,3327],{},[1327,3320,3321],{},[1330,3322,3323,3325],{},[1333,3324],{"align":1335},[1333,3326],{"align":1335},[1344,3328,3329,3337,3345,3353,3361,3369,3377,3385,3393,3406,3414,3422,3430,3438,3446,3454,3462,3470],{},[1330,3330,3331,3334],{},[1349,3332,3333],{"align":1335},"shark",[1349,3335,3336],{"align":1335},"鲨鱼，一般指能够赢钱的高手",[1330,3338,3339,3342],{},[1349,3340,3341],{"align":1335},"fish",[1349,3343,3344],{"align":1335},"鱼， 指菜鸟玩家",[1330,3346,3347,3350],{},[1349,3348,3349],{"align":1335},"chip",[1349,3351,3352],{"align":1335},"筹码，通常以深度来形容筹码量",[1330,3354,3355,3358],{},[1349,3356,3357],{"align":1335},"pot",[1349,3359,3360],{"align":1335},"筹码池：玩家下注到桌上的筹码总和",[1330,3362,3363,3366],{},[1349,3364,3365],{"align":1335},"dealer",[1349,3367,3368],{"align":1335},"同button, 指 庄家",[1330,3370,3371,3374],{},[1349,3372,3373],{"align":1335},"blind",[1349,3375,3376],{"align":1335},"下盲注",[1330,3378,3379,3382],{},[1349,3380,3381],{"align":1335},"fold",[1349,3383,3384],{"align":1335},"盖牌，退出当前这一盘",[1330,3386,3387,3390],{},[1349,3388,3389],{"align":1335},"call",[1349,3391,3392],{"align":1335},"跟注：投入本轮其他玩家等量的筹码",[1330,3394,3395,3398],{},[1349,3396,3397],{"align":1335},"raise",[1349,3399,3400,3401,3405],{"align":1335},"加注：preflop(2bb",[3402,3403,3404],"del",{},"allin), flop (bb","allin);",[1330,3407,3408,3411],{},[1349,3409,3410],{"align":1335},"reraise",[1349,3412,3413],{"align":1335},"再加注. 指前位玩家加注后，继续加注(范围 上一个raise~allin)",[1330,3415,3416,3419],{},[1349,3417,3418],{"align":1335},"all-in",[1349,3420,3421],{"align":1335},"全押下注：投入手中所有的筹码",[1330,3423,3424,3427],{},[1349,3425,3426],{"align":1335},"bluff",[1349,3428,3429],{"align":1335},"吓唬其他玩家。让其他玩家误判的一种战术，但不会长期有效",[1330,3431,3432,3435],{},[1349,3433,3434],{"align":1335},"小盲(small blind)",[1349,3436,3437],{"align":1335},"庄家左边第一个玩家位小盲位，小盲位必须强制下注，小盲通常是牌局赌注的一半",[1330,3439,3440,3443],{},[1349,3441,3442],{"align":1335},"大盲(big blind)",[1349,3444,3445],{"align":1335},"庄家左边第二位玩家，大盲必须投一注钱。",[1330,3447,3448,3451],{},[1349,3449,3450],{"align":1335},"h(Heart)",[1349,3452,3453],{"align":1335},"红桃",[1330,3455,3456,3459],{},[1349,3457,3458],{"align":1335},"s(Spade)",[1349,3460,3461],{"align":1335},"黑桃",[1330,3463,3464,3467],{},[1349,3465,3466],{"align":1335},"d(Diamond)",[1349,3468,3469],{"align":1335},"方块",[1330,3471,3472,3475],{},[1349,3473,3474],{"align":1335},"c(Club)",[1349,3476,3477],{"align":1335},"梅花",[928,3479],{},[1613,3481,3482],{"id":3482},"一些快速上手的小tip",[11,3484,3485],{},"关键词：新手, 娱乐局, 个人经验, 仅供参考",[292,3487,3488,3491],{},[81,3489,3490],{},"first & most important --- 舍得弃牌(fold)",[81,3492,3493],{},"明确下注的目标:\n01. 价值下注 -- 让更差的牌跟注\n02. bluff  -- 让更好的牌弃牌\n03. 获取池底",{"title":45,"searchDepth":46,"depth":46,"links":3495},[3496,3497,3498,3499],{"id":3231,"depth":267,"text":3231},{"id":3275,"depth":267,"text":3275},{"id":3313,"depth":267,"text":3313},{"id":3482,"depth":267,"text":3482},[3501,1078],"game","2021-01-05","Texas Hold’em poker",{"excerpt":3505},{"type":8,"value":3506},[3507],[11,3508,3228],{},"\u002Fblog\u002Fgame\u002F04-poker",{"title":3223,"description":3503},"blog\u002Fgame\u002F04-poker","47BWgFvW7-FjTvcxOJ2BPWCGxpWdQgeru9GajhQcX3k",{"id":3514,"title":3515,"body":3516,"categories":3641,"date":3642,"description":3643,"draft":52,"extension":53,"meta":3644,"navigation":55,"path":3645,"seo":3646,"stem":3647,"style":59,"__hash__":3648},"content\u002Fblog\u002Fgame\u002F14- d2 pass流程.md","D2 pass",{"type":8,"value":3517,"toc":3634},[3518,3521,3524,3527,3529,3533,3544,3548,3580,3584,3598,3602,3613,3617],[11,3519,3520],{},"pass 1拖7",[11,3522,3523],{},"1 是大号，称司机(driver, bus)",[11,3525,3526],{},"7 是小号，称baby(bb) 1-7。 其中一个bb主跟随完成任务，称跑路bb。跑路bb各难度有等级限制，其他可以1级偷渡",[928,3528],{},[120,3530,3532],{"id":3531},"act-1","act 1:",[292,3534,3535,3538,3541],{"start":137},[81,3536,3537],{},"bus直接飞走最后小站；安姐拐口，木桶处开门。",[81,3539,3540],{},"跑路bb 进门， 看bus杀安姐，安姐挂了回城。",[81,3542,3543],{},"bb1-7 找npc(瓦瑞夫),说完话去act 2",[120,3545,3547],{"id":3546},"act-2","act 2:",[292,3549,3550,3553,3556,3559,3562,3565,3568,3571,3574,3577],{"start":137},[81,3551,3552],{},"任一bb 先点下 npc(杰海因)，跟他对下话，防止出现消失bug",[81,3554,3555],{},"跑路bb 可以先跑到港口，等bus门",[81,3557,3558],{},"bus去遥远的绿洲，到虫洞第三层清场后开门，跑路bb进来捡国王之杖后回程",[81,3560,3561],{},"bus 到利爪蝮蛇神殿第二层，把祭坛上的怪清了回程， 跑路bb进门踢蛇坛捡起蛇护身符回程。bus也回程",[81,3563,3564],{},"bus丢盒子给跑路bb，跑路bb用盒子把国王杖和蛇护符合成赫拉迪克之杖。跑路bb 和 凯恩，卓格南 对话。",[81,3566,3567],{},"bus去神秘的避难所清场，在召唤者附近开门，跑路bb进，bus杀召唤者，bb翻召唤者身后的日记，跑路bb回去，和旅店阿特玛对话",[81,3569,3570],{},"bus进红门去塔拉夏古墓，在插杖处开门，跑路bb进，插杖，bus进洞杀杜瑞尔，注意此时bb不要进洞，直到bus杀死boss再进。跑到最后和大天使对话，大天使开门，回程",[81,3572,3573],{},"跑路bb 去皇宫 和杰海因对话，再进皇宫开门回程。",[81,3575,3576],{},"其他bb 和杰海因对话，进皇宫，从跑路bb的门回程，和马席夫对话，去act 3",[81,3578,3579],{},"跑路bb和马席夫对话，去act 3",[120,3581,3583],{"id":3582},"act-3","act 3:",[292,3585,3586,3589,3592,3595],{"start":137},[81,3587,3588],{},"跑路bb 和凯恩对话，等开门。",[81,3590,3591],{},"bus到崔凡客 3c背后开门，跑路bb进，bus杀3c，回程找凯恩时说话，（bus注意杀3c时bb离开不能超过两屏距离）。",[81,3593,3594],{},"bus去憎恨囚牢第三层杀掉平台上的3c，在红门前面开门，跑路bb进，bus杀劳模。从红门去act 4",[81,3596,3597],{},"其他bb 和凯恩对话，进bus门，从红门去act 4",[120,3599,3601],{"id":3600},"act-4","act 4:",[292,3603,3604,3607,3610],{"start":137},[81,3605,3606],{},"bus去chaos清场，柱子后面开门，跑路bb进，躲在角落。",[81,3608,3609],{},"bus杀diablo后和bb一起回程，跑路bb和天使对话，红门去act 5。",[81,3611,3612],{},"其他bb 红门去act 5",[120,3614,3616],{"id":3615},"act-5","act 5:",[292,3618,3619,3622,3625,3628,3631],{"start":137},[81,3620,3621],{},"bus去冰冷高原，督军山克前开门，跑路bb进,看bus杀山克，回程。（打孔任务）",[81,3623,3624],{},"bus到亚瑞特巅峰下图处开门，跑路bb进，点书激活野蛮人。（人物等级有要求:普通 20， 噩梦 40， 地狱60）",[81,3626,3627],{},"bus杀3bb后和bb一起回程。",[81,3629,3630],{},"bus去王座清场，在此处开门，bb进站吸经验。1级bb可以站城里等pass",[81,3632,3633],{},"bus清完5小队后，bb和bus一起进世界之石大殿，bus杀掉82，该难度的pass流程完成。",{"title":45,"searchDepth":46,"depth":46,"links":3635},[3636,3637,3638,3639,3640],{"id":3531,"depth":46,"text":3532},{"id":3546,"depth":46,"text":3547},{"id":3582,"depth":46,"text":3583},{"id":3600,"depth":46,"text":3601},{"id":3615,"depth":46,"text":3616},[3501,1078],"2023-02-22","暗黑2 pass流程",{},"\u002Fblog\u002Fgame\u002F14-d2-pass",{"title":3515,"description":3643},"blog\u002Fgame\u002F14- d2 pass流程","RiK6kkJh8U_HgBJWBblnFfGdwKGMQG_Ehq4AJsSogsg",{"id":3650,"title":3651,"body":3652,"categories":4310,"date":4311,"description":4312,"draft":52,"extension":53,"meta":4313,"navigation":55,"path":4314,"seo":4315,"stem":4316,"style":59,"__hash__":4317},"content\u002Fblog\u002Fnginx\u002F21-nginx_failed.md","nginx emerg --- getgrnam(\"root\") failed in nginx.conf",{"type":8,"value":3653,"toc":4305},[3654,3673,3680,3683,3686,3688,3692,3717,3720,3731,3734,4302],[132,3655,3657],{"className":134,"code":3656,"language":138,"meta":45,"style":45},"nginx: [emerg] getgrnam(\"root\") failed in nginx.conf\n",[140,3658,3659],{"__ignoreMap":45},[143,3660,3661,3664,3667,3670],{"class":145,"line":146},[143,3662,3663],{"class":149},"nginx:",[143,3665,3666],{"class":327}," [emerg] getgrnam(",[143,3668,3669],{"class":149},"\"root\"",[143,3671,3672],{"class":327},") failed in nginx.conf\n",[11,3674,3675,3676,3679],{},"这样的错误通常在 ",[73,3677,3678],{},"Mac"," 环境上出现",[11,3681,3682],{},"在nginx配置文件中，group 值默认是和user名相同。",[11,3684,3685],{},"在mac系统上，对于root用户，或者使用sudo执行nginx时，系统并没有root的group，所以就提示了如上的错误。",[928,3687],{},[120,3689,3691],{"id":3690},"快捷的修改方式","快捷的修改方式：",[132,3693,3697],{"className":3694,"code":3695,"language":3696,"meta":45,"style":45},"language-shell shiki shiki-themes github-light github-dark","#修改nginx.conf文件，指定root用户mac中的group\nuser root admin;\n","shell",[140,3698,3699,3704],{"__ignoreMap":45},[143,3700,3701],{"class":145,"line":146},[143,3702,3703],{"class":809},"#修改nginx.conf文件，指定root用户mac中的group\n",[143,3705,3706,3709,3712,3715],{"class":145,"line":46},[143,3707,3708],{"class":149},"user",[143,3710,3711],{"class":157}," root",[143,3713,3714],{"class":157}," admin",[143,3716,328],{"class":327},[1613,3718,3719],{"id":3719},"另外的情况",[78,3721,3722],{},[81,3723,3724,3725,3727,3728,3730],{},"nginx.conf无法直接修改",[1447,3726],{},"\n比如运行UT，test::Nginx中，对应case会自动生成nginx.conf文件。",[1447,3729],{},"\n那么，mac中增加一个root用户组，并把root用户加入到group中也可以。",[11,3732,3733],{},"参考下列操作：",[132,3735,3737],{"className":3694,"code":3736,"language":3696,"meta":45,"style":45},"\u002F\u002F 切换到root用户\nsu\n\n\u002F\u002F 新建root用户组，并指定id 为2024 (和现有id不冲突即可，尽量>500)\ndscl . -create \u002FGroups\u002Froot PrimaryGroupID 2024\n\u002F\u002F 添加root用户到root用户组中\ndscl . -append \u002FGroups\u002Froot GroupMembership root\n\n\n\u002F\u002F 其他的一些命令\n\n\u002F\u002F list所有的用户组\ngroups\n\u002F\u002F 查看user所属的用户组\ngroups \u003Cuser>\n\u002F\u002F 同上，同时展示用户组id\nid -a \u003Cuser>\n\n\u002F\u002F 查看当前登陆的用户名\nwhoami\n\n\u002F\u002F mac 管理用户及用户组命令\n\u002F\u002F dscl\n\n\u002F\u002F 创建\u003Cuser-name>用户,且id 为\u003Cid-num>\nsudo dscl . -create \u002FUsers\u002F\u003Cuser-name> UniqueID \u003Cid-num>\n\u002F\u002F 查看所有用户和id\nsudo dscl . -list \u002FUsers UniqueID\n\u002F\u002F 删除\nsudo dscl . -delete \u002FUsers\u002F\u003Cuser-name>\n\n\u002F\u002F 创建\u003Cgroup-name>用户组,且id 为\u003Cid-num>\nsudo dscl . -create \u002FGroups\u002F\u003Cgroup-name> PrimaryGroupID \u003Cid-num>\n\u002F\u002F 查看所有用户和id\nsudo dscl . -list \u002FGroups PrimaryGroupID\n\u002F\u002F 删除\nsudo dscl . -delete \u002FGroups\u002F\u003Cgroup-name>\n\n\u002F\u002F 添加\u003Cuser-name> 到用户组\u003Cgroup-name>中\nsudo dscl . -append \u002FGroups\u002F\u003Cgroup-name> GroupMembership \u003Cuser-name>\n\u002F\u002F 删除用户组\u003Cgroup-name>中\u003Cuser-name>\nsudo dscl . -delete \u002FGroups\u002F\u003Cgroup-name> GroupMembership \u003Cuser-name>\n\u002F\u002F 查看所有组下个用户信息\ndscl . -list \u002FGroups GroupMembership\n",[140,3738,3739,3747,3752,3756,3769,3789,3796,3813,3817,3821,3828,3832,3839,3844,3851,3868,3875,3891,3895,3902,3907,3911,3921,3928,3932,3967,4000,4007,4024,4031,4052,4056,4084,4115,4121,4137,4143,4163,4167,4196,4226,4252,4282,4289],{"__ignoreMap":45},[143,3740,3741,3744],{"class":145,"line":146},[143,3742,3743],{"class":149},"\u002F\u002F",[143,3745,3746],{"class":157}," 切换到root用户\n",[143,3748,3749],{"class":145,"line":46},[143,3750,3751],{"class":149},"su\n",[143,3753,3754],{"class":145,"line":267},[143,3755,396],{"emptyLinePlaceholder":55},[143,3757,3758,3760,3763,3766],{"class":145,"line":279},[143,3759,3743],{"class":149},[143,3761,3762],{"class":157}," 新建root用户组，并指定id",[143,3764,3765],{"class":157}," 为2024",[143,3767,3768],{"class":327}," (和现有id不冲突即可，尽量>500)\n",[143,3770,3771,3774,3777,3780,3783,3786],{"class":145,"line":399},[143,3772,3773],{"class":149},"dscl",[143,3775,3776],{"class":157}," .",[143,3778,3779],{"class":153}," -create",[143,3781,3782],{"class":157}," \u002FGroups\u002Froot",[143,3784,3785],{"class":157}," PrimaryGroupID",[143,3787,3788],{"class":153}," 2024\n",[143,3790,3791,3793],{"class":145,"line":410},[143,3792,3743],{"class":149},[143,3794,3795],{"class":157}," 添加root用户到root用户组中\n",[143,3797,3798,3800,3802,3805,3807,3810],{"class":145,"line":421},[143,3799,3773],{"class":149},[143,3801,3776],{"class":157},[143,3803,3804],{"class":153}," -append",[143,3806,3782],{"class":157},[143,3808,3809],{"class":157}," GroupMembership",[143,3811,3812],{"class":157}," root\n",[143,3814,3815],{"class":145,"line":429},[143,3816,396],{"emptyLinePlaceholder":55},[143,3818,3819],{"class":145,"line":441},[143,3820,396],{"emptyLinePlaceholder":55},[143,3822,3823,3825],{"class":145,"line":447},[143,3824,3743],{"class":149},[143,3826,3827],{"class":157}," 其他的一些命令\n",[143,3829,3830],{"class":145,"line":453},[143,3831,396],{"emptyLinePlaceholder":55},[143,3833,3834,3836],{"class":145,"line":858},[143,3835,3743],{"class":149},[143,3837,3838],{"class":157}," list所有的用户组\n",[143,3840,3841],{"class":145,"line":868},[143,3842,3843],{"class":149},"groups\n",[143,3845,3846,3848],{"class":145,"line":873},[143,3847,3743],{"class":149},[143,3849,3850],{"class":157}," 查看user所属的用户组\n",[143,3852,3853,3856,3859,3862,3865],{"class":145,"line":889},[143,3854,3855],{"class":149},"groups",[143,3857,3858],{"class":876}," \u003C",[143,3860,3861],{"class":157},"use",[143,3863,3864],{"class":327},"r",[143,3866,3867],{"class":876},">\n",[143,3869,3870,3872],{"class":145,"line":1786},[143,3871,3743],{"class":149},[143,3873,3874],{"class":157}," 同上，同时展示用户组id\n",[143,3876,3877,3880,3883,3885,3887,3889],{"class":145,"line":1792},[143,3878,3879],{"class":149},"id",[143,3881,3882],{"class":153}," -a",[143,3884,3858],{"class":876},[143,3886,3861],{"class":157},[143,3888,3864],{"class":327},[143,3890,3867],{"class":876},[143,3892,3893],{"class":145,"line":1798},[143,3894,396],{"emptyLinePlaceholder":55},[143,3896,3897,3899],{"class":145,"line":1804},[143,3898,3743],{"class":149},[143,3900,3901],{"class":157}," 查看当前登陆的用户名\n",[143,3903,3904],{"class":145,"line":1809},[143,3905,3906],{"class":149},"whoami\n",[143,3908,3909],{"class":145,"line":1815},[143,3910,396],{"emptyLinePlaceholder":55},[143,3912,3913,3915,3918],{"class":145,"line":1821},[143,3914,3743],{"class":149},[143,3916,3917],{"class":157}," mac",[143,3919,3920],{"class":157}," 管理用户及用户组命令\n",[143,3922,3923,3925],{"class":145,"line":1827},[143,3924,3743],{"class":149},[143,3926,3927],{"class":157}," dscl\n",[143,3929,3930],{"class":145,"line":1833},[143,3931,396],{"emptyLinePlaceholder":55},[143,3933,3934,3936,3939,3942,3945,3948,3951,3954,3957,3959,3962,3965],{"class":145,"line":1839},[143,3935,3743],{"class":149},[143,3937,3938],{"class":157}," 创建",[143,3940,3941],{"class":876},"\u003C",[143,3943,3944],{"class":157},"user-nam",[143,3946,3947],{"class":327},"e",[143,3949,3950],{"class":876},">",[143,3952,3953],{"class":157},"用户,且id",[143,3955,3956],{"class":157}," 为",[143,3958,3941],{"class":876},[143,3960,3961],{"class":157},"id-nu",[143,3963,3964],{"class":327},"m",[143,3966,3867],{"class":876},[143,3968,3969,3971,3974,3976,3978,3981,3983,3985,3987,3989,3992,3994,3996,3998],{"class":145,"line":1845},[143,3970,725],{"class":149},[143,3972,3973],{"class":157}," dscl",[143,3975,3776],{"class":157},[143,3977,3779],{"class":153},[143,3979,3980],{"class":157}," \u002FUsers\u002F",[143,3982,3941],{"class":876},[143,3984,3944],{"class":157},[143,3986,3947],{"class":327},[143,3988,3950],{"class":876},[143,3990,3991],{"class":157}," UniqueID",[143,3993,3858],{"class":876},[143,3995,3961],{"class":157},[143,3997,3964],{"class":327},[143,3999,3867],{"class":876},[143,4001,4002,4004],{"class":145,"line":1851},[143,4003,3743],{"class":149},[143,4005,4006],{"class":157}," 查看所有用户和id\n",[143,4008,4009,4011,4013,4015,4018,4021],{"class":145,"line":1857},[143,4010,725],{"class":149},[143,4012,3973],{"class":157},[143,4014,3776],{"class":157},[143,4016,4017],{"class":153}," -list",[143,4019,4020],{"class":157}," \u002FUsers",[143,4022,4023],{"class":157}," UniqueID\n",[143,4025,4026,4028],{"class":145,"line":1863},[143,4027,3743],{"class":149},[143,4029,4030],{"class":157}," 删除\n",[143,4032,4033,4035,4037,4039,4042,4044,4046,4048,4050],{"class":145,"line":1869},[143,4034,725],{"class":149},[143,4036,3973],{"class":157},[143,4038,3776],{"class":157},[143,4040,4041],{"class":153}," -delete",[143,4043,3980],{"class":157},[143,4045,3941],{"class":876},[143,4047,3944],{"class":157},[143,4049,3947],{"class":327},[143,4051,3867],{"class":876},[143,4053,4054],{"class":145,"line":1875},[143,4055,396],{"emptyLinePlaceholder":55},[143,4057,4058,4060,4062,4064,4067,4069,4071,4074,4076,4078,4080,4082],{"class":145,"line":1881},[143,4059,3743],{"class":149},[143,4061,3938],{"class":157},[143,4063,3941],{"class":876},[143,4065,4066],{"class":157},"group-nam",[143,4068,3947],{"class":327},[143,4070,3950],{"class":876},[143,4072,4073],{"class":157},"用户组,且id",[143,4075,3956],{"class":157},[143,4077,3941],{"class":876},[143,4079,3961],{"class":157},[143,4081,3964],{"class":327},[143,4083,3867],{"class":876},[143,4085,4086,4088,4090,4092,4094,4097,4099,4101,4103,4105,4107,4109,4111,4113],{"class":145,"line":1887},[143,4087,725],{"class":149},[143,4089,3973],{"class":157},[143,4091,3776],{"class":157},[143,4093,3779],{"class":153},[143,4095,4096],{"class":157}," \u002FGroups\u002F",[143,4098,3941],{"class":876},[143,4100,4066],{"class":157},[143,4102,3947],{"class":327},[143,4104,3950],{"class":876},[143,4106,3785],{"class":157},[143,4108,3858],{"class":876},[143,4110,3961],{"class":157},[143,4112,3964],{"class":327},[143,4114,3867],{"class":876},[143,4116,4117,4119],{"class":145,"line":1893},[143,4118,3743],{"class":149},[143,4120,4006],{"class":157},[143,4122,4123,4125,4127,4129,4131,4134],{"class":145,"line":1899},[143,4124,725],{"class":149},[143,4126,3973],{"class":157},[143,4128,3776],{"class":157},[143,4130,4017],{"class":153},[143,4132,4133],{"class":157}," \u002FGroups",[143,4135,4136],{"class":157}," PrimaryGroupID\n",[143,4138,4139,4141],{"class":145,"line":1905},[143,4140,3743],{"class":149},[143,4142,4030],{"class":157},[143,4144,4145,4147,4149,4151,4153,4155,4157,4159,4161],{"class":145,"line":1910},[143,4146,725],{"class":149},[143,4148,3973],{"class":157},[143,4150,3776],{"class":157},[143,4152,4041],{"class":153},[143,4154,4096],{"class":157},[143,4156,3941],{"class":876},[143,4158,4066],{"class":157},[143,4160,3947],{"class":327},[143,4162,3867],{"class":876},[143,4164,4165],{"class":145,"line":1916},[143,4166,396],{"emptyLinePlaceholder":55},[143,4168,4169,4171,4174,4176,4178,4180,4182,4185,4187,4189,4191,4193],{"class":145,"line":1922},[143,4170,3743],{"class":149},[143,4172,4173],{"class":157}," 添加",[143,4175,3941],{"class":876},[143,4177,3944],{"class":157},[143,4179,3947],{"class":327},[143,4181,3950],{"class":876},[143,4183,4184],{"class":157}," 到用户组",[143,4186,3941],{"class":876},[143,4188,4066],{"class":157},[143,4190,3947],{"class":327},[143,4192,3950],{"class":876},[143,4194,4195],{"class":157},"中\n",[143,4197,4198,4200,4202,4204,4206,4208,4210,4212,4214,4216,4218,4220,4222,4224],{"class":145,"line":1928},[143,4199,725],{"class":149},[143,4201,3973],{"class":157},[143,4203,3776],{"class":157},[143,4205,3804],{"class":153},[143,4207,4096],{"class":157},[143,4209,3941],{"class":876},[143,4211,4066],{"class":157},[143,4213,3947],{"class":327},[143,4215,3950],{"class":876},[143,4217,3809],{"class":157},[143,4219,3858],{"class":876},[143,4221,3944],{"class":157},[143,4223,3947],{"class":327},[143,4225,3867],{"class":876},[143,4227,4228,4230,4233,4235,4237,4239,4241,4244,4246,4248,4250],{"class":145,"line":1933},[143,4229,3743],{"class":149},[143,4231,4232],{"class":157}," 删除用户组",[143,4234,3941],{"class":876},[143,4236,4066],{"class":157},[143,4238,3947],{"class":327},[143,4240,3950],{"class":876},[143,4242,4243],{"class":157},"中",[143,4245,3941],{"class":876},[143,4247,3944],{"class":157},[143,4249,3947],{"class":327},[143,4251,3867],{"class":876},[143,4253,4254,4256,4258,4260,4262,4264,4266,4268,4270,4272,4274,4276,4278,4280],{"class":145,"line":1939},[143,4255,725],{"class":149},[143,4257,3973],{"class":157},[143,4259,3776],{"class":157},[143,4261,4041],{"class":153},[143,4263,4096],{"class":157},[143,4265,3941],{"class":876},[143,4267,4066],{"class":157},[143,4269,3947],{"class":327},[143,4271,3950],{"class":876},[143,4273,3809],{"class":157},[143,4275,3858],{"class":876},[143,4277,3944],{"class":157},[143,4279,3947],{"class":327},[143,4281,3867],{"class":876},[143,4283,4284,4286],{"class":145,"line":1944},[143,4285,3743],{"class":149},[143,4287,4288],{"class":157}," 查看所有组下个用户信息\n",[143,4290,4291,4293,4295,4297,4299],{"class":145,"line":1949},[143,4292,3773],{"class":149},[143,4294,3776],{"class":157},[143,4296,4017],{"class":153},[143,4298,4133],{"class":157},[143,4300,4301],{"class":157}," GroupMembership\n",[1071,4303,4304],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":45,"searchDepth":46,"depth":46,"links":4306},[4307],{"id":3690,"depth":46,"text":3691,"children":4308},[4309],{"id":3719,"depth":267,"text":3719},[205,1078],"2024-04-07T18:55:04+08:00","nginx getgrnam() failed",{},"\u002Fblog\u002Fnginx\u002F21-nginx_failed",{"title":3651,"description":4312},"blog\u002Fnginx\u002F21-nginx_failed","Irh_anavsvzFjMtlNwFwqsflCmc7IqhNcWRw0DEgT2A",{"id":4319,"title":4320,"body":4321,"categories":4559,"date":4560,"description":4561,"draft":52,"extension":53,"meta":4562,"navigation":55,"path":4563,"seo":4564,"stem":4565,"style":59,"__hash__":4566},"content\u002Fblog\u002Fnginx\u002F25-nginx-log处理.md","nginx日志",{"type":8,"value":4322,"toc":4557},[4323,4326,4329,4332,4340,4343,4346,4349,4355,4375,4381,4396,4399,4414,4417,4442,4444,4450,4460,4463,4466,4469,4472,4475,4545,4550,4555],[11,4324,4325],{},"##背景",[11,4327,4328],{},"随着nginx 运行，记录的access和error日志文件也会变的越来越大。无论文件存储，还是查阅都是不方便的。",[11,4330,4331],{},"我们需求：",[78,4333,4334,4337],{},[81,4335,4336],{},"对日志能自动分割，最好按照日期，每天生成一个文件。在未来如果某一天的文件过大的话，也能再继续分割。",[81,4338,4339],{},"日志文件的总大小过大后，可以自动删除较旧的文件，或者打包到另外的地方进行存档。",[11,4341,4342],{},"##方案",[11,4344,4345],{},"使用linux系统中logrotate 和 crontab两个工具",[11,4347,4348],{},"##介绍",[11,4350,4351,4354],{},[73,4352,4353],{},"cron"," 是linux里一个在后台运行任务调度的守护进程。任务调度包括:",[78,4356,4357,4364],{},[81,4358,4359,4360,4363],{},"系统任务 ",[140,4361,4362],{},"\u002Fetc\u002Fcrontab"," 文件",[81,4365,4366,4367,4370,4371,4374],{},"用户任务 通过 ",[140,4368,4369],{},"crontab"," 工具来设置任务。定义的文件在  ",[140,4372,4373],{},"\u002Fvar\u002Fspool\u002Fcron\u002Fcrontabs\u002Froot","  (root 用户 && 如果已经存在任务)",[11,4376,4377,4378,4380],{},"用户任务的文件不要直接编辑, 使用 ",[140,4379,4369],{}," 命令修改",[132,4382,4384],{"className":932,"code":4383,"language":935,"meta":45,"style":45},"crontab -l          \u002F\u002F 显示用户crontab任务文件\ncrontab -e      \u002F\u002F  修改crontab任务文件\n",[140,4385,4386,4391],{"__ignoreMap":45},[143,4387,4388],{"class":145,"line":146},[143,4389,4390],{},"crontab -l          \u002F\u002F 显示用户crontab任务文件\n",[143,4392,4393],{"class":145,"line":46},[143,4394,4395],{},"crontab -e      \u002F\u002F  修改crontab任务文件\n",[11,4397,4398],{},"任务文件中的格式  (一行一个任务)",[132,4400,4402],{"className":932,"code":4401,"language":935,"meta":45,"style":45},"*   *   *   *   *   command\n分   时  日   月  周   执行的命令\n",[140,4403,4404,4409],{"__ignoreMap":45},[143,4405,4406],{"class":145,"line":146},[143,4407,4408],{},"*   *   *   *   *   command\n",[143,4410,4411],{"class":145,"line":46},[143,4412,4413],{},"分   时  日   月  周   执行的命令\n",[11,4415,4416],{},"第1列表示分钟 00～59 每分钟用*或者 *\u002F1表示\n第2列表示小时 00～23（0表示0点）\n第3列表示日期 01～31\n第4列表示月份 01～12\n第5列标识号星期 0～6（0表示星期天）\n第6列要运行的命令  (使用绝对路径)\n此外每一列除了数字，还可以有这些符号：",[132,4418,4420],{"className":932,"code":4419,"language":935,"meta":45,"style":45},"*       代表任何时间，比如第一个 * 就代表一小时中的每分钟都执行\n,       逗号分割, 占一列位置。代表不连续的时间，比如 0 8,12,16 * * * 代表每天8，12，16点0分执行\n-       代表连续的范围，比如 0 5 * * 1-6 代表在周一到周六凌晨5点0分执行\n*\u002Fn     代表每个多久执行一次，比如*\u002F10 * * * *代表每隔10分钟执行一次\n",[140,4421,4422,4427,4432,4437],{"__ignoreMap":45},[143,4423,4424],{"class":145,"line":146},[143,4425,4426],{},"*       代表任何时间，比如第一个 * 就代表一小时中的每分钟都执行\n",[143,4428,4429],{"class":145,"line":46},[143,4430,4431],{},",       逗号分割, 占一列位置。代表不连续的时间，比如 0 8,12,16 * * * 代表每天8，12，16点0分执行\n",[143,4433,4434],{"class":145,"line":267},[143,4435,4436],{},"-       代表连续的范围，比如 0 5 * * 1-6 代表在周一到周六凌晨5点0分执行\n",[143,4438,4439],{"class":145,"line":279},[143,4440,4441],{},"*\u002Fn     代表每个多久执行一次，比如*\u002F10 * * * *代表每隔10分钟执行一次\n",[928,4443],{},[11,4445,4446,4449],{},[73,4447,4448],{},"logrotate"," 是linux中默认安装的日志文件管理工具。\n。\n分割日志文件，删除旧的文件，并创建新的日志文件",[132,4451,4453],{"className":932,"code":4452,"language":935,"meta":45,"style":45},"\u002Fetc\u002Flogrotate.conf\n\n",[140,4454,4455],{"__ignoreMap":45},[143,4456,4457],{"class":145,"line":146},[143,4458,4459],{},"\u002Fetc\u002Flogrotate.conf\n",[11,4461,4462],{},"crontab 定时任务",[11,4464,4465],{},"##设置",[11,4467,4468],{},"大",[11,4470,4471],{},"##验证",[11,4473,4474],{},"###备注\n环境信息",[132,4476,4478],{"className":932,"code":4477,"language":935,"meta":45,"style":45},"cat \u002Fetc\u002Fos-release\nNAME=\"Ubuntu\"\nVERSION=\"20.04 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https:\u002F\u002Fwww.ubuntu.com\u002F\"\nSUPPORT_URL=\"https:\u002F\u002Fhelp.ubuntu.com\u002F\"\nBUG_REPORT_URL=\"https:\u002F\u002Fbugs.launchpad.net\u002Fubuntu\u002F\"\nPRIVACY_POLICY_URL=\"https:\u002F\u002Fwww.ubuntu.com\u002Flegal\u002Fterms-and-policies\u002Fprivacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n",[140,4479,4480,4485,4490,4495,4500,4505,4510,4515,4520,4525,4530,4535,4540],{"__ignoreMap":45},[143,4481,4482],{"class":145,"line":146},[143,4483,4484],{},"cat \u002Fetc\u002Fos-release\n",[143,4486,4487],{"class":145,"line":46},[143,4488,4489],{},"NAME=\"Ubuntu\"\n",[143,4491,4492],{"class":145,"line":267},[143,4493,4494],{},"VERSION=\"20.04 LTS (Focal Fossa)\"\n",[143,4496,4497],{"class":145,"line":279},[143,4498,4499],{},"ID=ubuntu\n",[143,4501,4502],{"class":145,"line":399},[143,4503,4504],{},"ID_LIKE=debian\n",[143,4506,4507],{"class":145,"line":410},[143,4508,4509],{},"PRETTY_NAME=\"Ubuntu 20.04 LTS\"\n",[143,4511,4512],{"class":145,"line":421},[143,4513,4514],{},"VERSION_ID=\"20.04\"\n",[143,4516,4517],{"class":145,"line":429},[143,4518,4519],{},"HOME_URL=\"https:\u002F\u002Fwww.ubuntu.com\u002F\"\n",[143,4521,4522],{"class":145,"line":441},[143,4523,4524],{},"SUPPORT_URL=\"https:\u002F\u002Fhelp.ubuntu.com\u002F\"\n",[143,4526,4527],{"class":145,"line":447},[143,4528,4529],{},"BUG_REPORT_URL=\"https:\u002F\u002Fbugs.launchpad.net\u002Fubuntu\u002F\"\n",[143,4531,4532],{"class":145,"line":453},[143,4533,4534],{},"PRIVACY_POLICY_URL=\"https:\u002F\u002Fwww.ubuntu.com\u002Flegal\u002Fterms-and-policies\u002Fprivacy-policy\"\n",[143,4536,4537],{"class":145,"line":858},[143,4538,4539],{},"VERSION_CODENAME=focal\n",[143,4541,4542],{"class":145,"line":868},[143,4543,4544],{},"UBUNTU_CODENAME=focal\n",[11,4546,4547],{},[73,4548,4549],{},"TODO",[78,4551,4552],{},[81,4553,4554],{},"代码块行号",[1071,4556,2102],{},{"title":45,"searchDepth":46,"depth":46,"links":4558},[],[205,1078],"2024-07-04","nginx,log,crontab,logrotate",{},"\u002Fblog\u002Fnginx\u002F25-nginx-log",{"title":4320,"description":4561},"blog\u002Fnginx\u002F25-nginx-log处理","GeuaHNJoTmF-3UqYkXBjig62_FAt33gy7L63DGT7GXw",{"id":4568,"title":4569,"body":4570,"categories":4841,"date":4842,"description":4843,"draft":52,"extension":53,"meta":4844,"navigation":55,"path":4845,"seo":4846,"stem":4847,"style":59,"__hash__":4848},"content\u002Fblog\u002Fnginx\u002F26-Nginx本地test(mac环境).md","Nginx本地test",{"type":8,"value":4571,"toc":4837},[4572,4575,4589,4592,4603,4628,4633,4653,4690,4741,4746,4770,4775,4804,4809,4818,4826,4835],[120,4573,4574],{"id":4574},"介绍",[78,4576,4577,4583],{},[81,4578,4579],{},[174,4580,4581],{"href":4581,"rel":4582},"https:\u002F\u002Fgithub.com\u002Firesty\u002Fprogramming-openresty-zh\u002Fblob\u002Fmaster\u002Ftesting\u002FREADME.adoc",[178],[81,4584,4585],{},[174,4586,4587],{"href":4587,"rel":4588},"https:\u002F\u002Fopenresty.gitbooks.io\u002Fprogramming-openresty\u002Fcontent\u002F",[178],[120,4590,4591],{"id":4591},"步骤",[78,4593,4594,4597,4600],{},[81,4595,4596],{},"切换root用户或者sudo 执行相关命令",[81,4598,4599],{},"nginx 启停更，或者读写文件需要。避免权限错误。所以后续操作统一用root级用户角色",[81,4601,4602],{},"本地安装好nginx",[132,4604,4606],{"className":932,"code":4605,"language":935,"meta":45,"style":45},"$ which nginx\n\u002Fusr\u002Flocal\u002Fbin\u002Fnginx\n$ nginx -v\nnginx version: openresty\u002F1.19.3.1\n",[140,4607,4608,4613,4618,4623],{"__ignoreMap":45},[143,4609,4610],{"class":145,"line":146},[143,4611,4612],{},"$ which nginx\n",[143,4614,4615],{"class":145,"line":46},[143,4616,4617],{},"\u002Fusr\u002Flocal\u002Fbin\u002Fnginx\n",[143,4619,4620],{"class":145,"line":267},[143,4621,4622],{},"$ nginx -v\n",[143,4624,4625],{"class":145,"line":279},[143,4626,4627],{},"nginx version: openresty\u002F1.19.3.1\n",[78,4629,4630],{},[81,4631,4632],{},"安装 test::Nginx",[132,4634,4636],{"className":932,"code":4635,"language":935,"meta":45,"style":45},"通过cpan安装（默认已经安装了perl，cpan）\n$ cpan -v\n$ cpan Test::Nginx\n",[140,4637,4638,4643,4648],{"__ignoreMap":45},[143,4639,4640],{"class":145,"line":146},[143,4641,4642],{},"通过cpan安装（默认已经安装了perl，cpan）\n",[143,4644,4645],{"class":145,"line":46},[143,4646,4647],{},"$ cpan -v\n",[143,4649,4650],{"class":145,"line":267},[143,4651,4652],{},"$ cpan Test::Nginx\n",[78,4654,4655,4658,4665,4668,4671,4678,4681,4684,4687],{},[81,4656,4657],{},"luacov 安装(不是必须的)",[81,4659,4660,4661],{},"下载源码：",[174,4662,4663],{"href":4663,"rel":4664},"https:\u002F\u002Fgithub.com\u002Flunarmodules\u002Fluacov\u002Ftree\u002Fv0.15.0\u002Fsrc",[178],[81,4666,4667],{},"cp luacov 到对应的lua_package_path 下即可。 比如 net-cache\u002Fnginx\u002Fshare_lua 下",[81,4669,4670],{},"chash动态库 mac 编译(也不是必须的，用到的话，linux和mac不同)",[81,4672,4673,4674],{},"如果本地没有chash的C代码，可以参考 ",[174,4675,4676],{"href":4676,"rel":4677},"https:\u002F\u002Fgithub.com\u002Fopenresty\u002Flua-resty-balancer\u002Ftree\u002Fmaster",[178],[81,4679,4680],{},"下载.chash.c,  chash.h, Makefile 到本地",[81,4682,4683],{},"make all 即可，生成libchash.dylib",[81,4685,4686],{},"mv libchash.dylib  到 nginx\u002Ffor_test_lib 下",[81,4688,4689],{},"增加root用户组",[132,4691,4693],{"className":932,"code":4692,"language":935,"meta":45,"style":45},"\u002F\u002F 针对nginx: [emerg] getgrnam(\"root\") failed in nginx.conf 错误\n\u002F\u002F 原因是mac下root用户不是在root用户组，nginx.conf 默认user group相同\n\n\n\u002F\u002F 新建root用户组，并指定id 为2024\n$ sudo dscl . -create \u002FGroups\u002Froot PrimaryGroupID 2024\n\n\n\u002F\u002F 添加root用户到root用户组中\n$ sudo dscl . -append \u002FGroups\u002Froot GroupMembership root\n",[140,4694,4695,4700,4705,4709,4713,4718,4723,4727,4731,4736],{"__ignoreMap":45},[143,4696,4697],{"class":145,"line":146},[143,4698,4699],{},"\u002F\u002F 针对nginx: [emerg] getgrnam(\"root\") failed in nginx.conf 错误\n",[143,4701,4702],{"class":145,"line":46},[143,4703,4704],{},"\u002F\u002F 原因是mac下root用户不是在root用户组，nginx.conf 默认user group相同\n",[143,4706,4707],{"class":145,"line":267},[143,4708,396],{"emptyLinePlaceholder":55},[143,4710,4711],{"class":145,"line":279},[143,4712,396],{"emptyLinePlaceholder":55},[143,4714,4715],{"class":145,"line":399},[143,4716,4717],{},"\u002F\u002F 新建root用户组，并指定id 为2024\n",[143,4719,4720],{"class":145,"line":410},[143,4721,4722],{},"$ sudo dscl . -create \u002FGroups\u002Froot PrimaryGroupID 2024\n",[143,4724,4725],{"class":145,"line":421},[143,4726,396],{"emptyLinePlaceholder":55},[143,4728,4729],{"class":145,"line":429},[143,4730,396],{"emptyLinePlaceholder":55},[143,4732,4733],{"class":145,"line":441},[143,4734,4735],{},"\u002F\u002F 添加root用户到root用户组中\n",[143,4737,4738],{"class":145,"line":447},[143,4739,4740],{},"$ sudo dscl . -append \u002FGroups\u002Froot GroupMembership root\n",[78,4742,4743],{},[81,4744,4745],{},"新建测试目录t",[132,4747,4749],{"className":932,"code":4748,"language":935,"meta":45,"style":45},"$ cd your-codedir\u002Fnginx\u002Fconf\u002Flua_dir\n\n$ sudo mkdir t\n$ touch test.sh\n",[140,4750,4751,4756,4760,4765],{"__ignoreMap":45},[143,4752,4753],{"class":145,"line":146},[143,4754,4755],{},"$ cd your-codedir\u002Fnginx\u002Fconf\u002Flua_dir\n",[143,4757,4758],{"class":145,"line":46},[143,4759,396],{"emptyLinePlaceholder":55},[143,4761,4762],{"class":145,"line":267},[143,4763,4764],{},"$ sudo mkdir t\n",[143,4766,4767],{"class":145,"line":279},[143,4768,4769],{},"$ touch test.sh\n",[78,4771,4772],{},[81,4773,4774],{},"新建自定义shell脚本",[132,4776,4778],{"className":932,"code":4777,"language":935,"meta":45,"style":45},"$ cat test.sh\n#! \u002Fusr\u002Fbin\u002Fenv bash\nexport PATH=\u002Fusr\u002Flocal\u002Fbin\u002Fnginx:$PATH\n\nexec prove \"$@\"\n",[140,4779,4780,4785,4790,4795,4799],{"__ignoreMap":45},[143,4781,4782],{"class":145,"line":146},[143,4783,4784],{},"$ cat test.sh\n",[143,4786,4787],{"class":145,"line":46},[143,4788,4789],{},"#! \u002Fusr\u002Fbin\u002Fenv bash\n",[143,4791,4792],{"class":145,"line":267},[143,4793,4794],{},"export PATH=\u002Fusr\u002Flocal\u002Fbin\u002Fnginx:$PATH\n",[143,4796,4797],{"class":145,"line":279},[143,4798,396],{"emptyLinePlaceholder":55},[143,4800,4801],{"class":145,"line":399},[143,4802,4803],{},"exec prove \"$@\"\n",[78,4805,4806],{},[81,4807,4808],{},"尝试运行下ut",[132,4810,4812],{"className":932,"code":4811,"language":935,"meta":45,"style":45},"$ .\u002Ftest.sh test\u002Fyour_testfile.t\n",[140,4813,4814],{"__ignoreMap":45},[143,4815,4816],{"class":145,"line":146},[143,4817,4811],{},[78,4819,4820,4823],{},[81,4821,4822],{},"如果出错，很多内容，不好分辨",[81,4824,4825],{},"可以尝试启动测试nginx，排除环境问题。如果nginx可以正常启动，那么就是测试文件 test\u002Fqtest_scheduler.t的问题，按照提示修正",[132,4827,4829],{"className":932,"code":4828,"language":935,"meta":45,"style":45},"$ nginx -p your-codedir\u002Fnginx\u002Fconf\u002Flua\u002Ft\u002Fservroot\u002F -c your-codedir\u002Fnginx\u002Fconf\u002Flua\u002Ft\u002Fservroot\u002Fconf\u002Fnginx.conf\n",[140,4830,4831],{"__ignoreMap":45},[143,4832,4833],{"class":145,"line":146},[143,4834,4828],{},[1071,4836,2102],{},{"title":45,"searchDepth":46,"depth":46,"links":4838},[4839,4840],{"id":4574,"depth":46,"text":4574},{"id":4591,"depth":46,"text":4591},[205,1078],"2024-10-04","nginx,test,mac",{},"\u002Fblog\u002Fnginx\u002F26-nginxtest(mac)",{"title":4569,"description":4843},"blog\u002Fnginx\u002F26-Nginx本地test(mac环境)","F3jI0mVM10UvuTlPXFTSto7409fkzU8N2Z6_PP1Uo8c",{"id":4850,"title":4851,"body":4852,"categories":4997,"date":4998,"description":4999,"draft":52,"extension":53,"meta":5000,"navigation":55,"path":5001,"seo":5002,"stem":5003,"style":59,"__hash__":5004},"content\u002Fblog\u002F生活\u002F世人皆苦.md","世人皆苦",{"type":8,"value":4853,"toc":4995},[4854,4862,4864,4870,4876,4882,4900,4909,4915,4927,4945,4951,4954,4960,4963,4965,4968,4974,4989],[4855,4856,4857],"blockquote",{},[11,4858,4859],{},[1103,4860,4861],{},"一篇多年前的旧文",[928,4863],{},[11,4865,4866,4867,4869],{},"题目有种悯人的意味。不是我心之所喜。",[1447,4868],{},"\n这感觉让自己成为一个俯视的人。",[11,4871,4872,4873,4875],{},"虽说看过不少这个主题的文字，视频。",[1447,4874],{},"\n因为没有切身感受，终究只是脑海中一个过客流水的念头。",[11,4877,4878,4879,4881],{},"离公司所在园区不远有大片住宅区，小区马路边有一家新疆风味名头，也确实颇有几分正宗的小饭馆。",[1447,4880],{},"\n每到中午，一上午的无所事事之后带来的饥肠辘辘，再加上平添的不少馋意。不愿点外卖的我，喜欢溜达着到这小馆子来吃饭。",[11,4883,4884,4885,4887,4888,4890,4891,4893,4894,4896,4897,4899],{},"正值饭点，店里坐满了人。食客们都在心无旁骛的吃饭。",[1447,4886],{},"\n在紧靠着出餐口的半张桌子前坐下。",[1447,4889],{},"\n扫码，点餐。",[1447,4892],{},"\n西红柿鸡蛋拌面，软件贴心的提示，+3元可以组合成拌面+烤串的套餐。",[1447,4895],{},"\n这是实打实的优惠，ok，接受了他的推荐。",[1447,4898],{},"\n再来份凉拌菜。饿也是实打实的饿，更多的是拌面的份量也不是很充足。",[11,4901,4902,4903,4905,4906,4908],{},"坐我邻桌的是一位大叔，年龄应该5,60 左右。",[1447,4904],{},"\n看打扮，估计是在附近小区里装修干活的师傅。",[1447,4907],{},"\n老板给他端上是一份标准的拉面。",[11,4910,4911,4912,4914],{},"就在同时刻，我的面条也端了上来，还有凉菜，烤串。老板还配了一小碗汤。",[1447,4913],{},"\n相对邻桌的拉面，着实丰盛。我可以吃个十二分饱了。",[11,4916,4917,4918,4920,4921,4923,4924,4926],{},"邻桌大叔慢慢而细致的吃着一碗拉面。旁边是一小碟自助泡菜。",[1447,4919],{},"\n一筷子一筷子的静静叉起面条，偶尔停下来，夹上几块小菜。",[1447,4922],{},"\n看他的拉面单调了些，却丝毫不影响美味的享用着。",[1447,4925],{},"\n面都吃完后，捧起碗，还是轻轻地喝着面汤，喝光了所有的汤。",[11,4928,4929,4930,4932,4933,4935,4936,4938,4939,4941,4942,4944],{},"在过去的一上午，我半打着酱油混了过去。",[1447,4931],{},"\n大叔说不准早早的去了工地，实打实的拿出力气。因为活干完，工钱才能有着落。",[1447,4934],{},"\n赚到的每一分辛苦钱，都要小心的花出去。",[1447,4937],{},"\n干活，攒钱就是他们进城务工的目标。日日劳作，精疲力尽。",[1447,4940],{},"\n想比起他们，我们的工作不用经历身体的折磨。劳务环境也相对舒适些。",[1447,4943],{},"\n和他们一样的是，颈上都套着一副脖套，只能围着磨盘转圈圈。",[11,4946,4947,4948,4950],{},"当然，以上都是我们自己强加解读出的苦。",[1447,4949],{},"\n固然终日筋骨酸痛。等晚上一顿饱餐，每每的睡一觉，所有生理上苦痛说不准就消散很多了。只要接受白天的捶打，夜晚就可以什么不用想了。",[11,4952,4953],{},"而我们的苦，是不自由，是被各式任务命令，生活被推着往前走，而身不由己的痛苦。",[11,4955,4956,4957,4959],{},"孰为苦孰为乐，又怎评判呢？",[1447,4958],{},"\n不过是，围城内外人的烦恼而已。",[11,4961,4962],{},"看来，世人皆苦。",[928,4964],{},[11,4966,4967],{},"最近翻到这些文字，感觉自己too young too simple。",[11,4969,4970,4971,4973],{},"姨妈今年70岁，在老家乡下，有一份算不上正式的工作。",[1447,4972],{},"\n说是工作，因为姨妈是在镇子上一家童车厂的车间干活。有自己品牌，正规产品的厂子。干活的内容也是在流水线上。",[11,4975,4976,4977,4979,4980,4982,4983,4985,4986,4988],{},"但却和零工无二样，虽每日50~60元的工资标准，不过，要和其他人一起轮班，平均每天也就只能领半日的工资数额。",[1447,4978],{},"\n当我去看望姨妈，听她讲起这事时，是震惊的。我已经被热闹而繁荣的信息成功洗脑了。",[1447,4981],{},"\n在2026年的江苏，在中国较富裕省份之一的乡村中。这在互联网上是难以想象的，而他真真切切的就在那儿。",[1447,4984],{},"\n在我的老家村里，还有很多的人，和姨妈过着大抵一样的生活。",[1447,4987],{},"\n不管年岁多高，依然劳作不停，可每月收入极大可能就几百块。加上农村的养老保险，可能可以凑到1000。连月薪3000的梗都赶不上。",[11,4990,4991,4992,4994],{},"世人皆苦。",[1447,4993],{},"\n我们无病呻吟的时候，只是因为坐井观天。",{"title":45,"searchDepth":46,"depth":46,"links":4996},[],[2270],"2026-08-18","我们无病呻吟的时候，只是因为坐进观天",{},"\u002Fblog\u002F",{"title":4851,"description":4999},"blog\u002F生活\u002F世人皆苦","V97eKR6EQ6-mz6F6n4MHHI5NKVT4LOynWeccpzoaDQ4",{"id":5006,"title":5007,"body":5008,"categories":5229,"date":5230,"description":5231,"draft":52,"extension":53,"meta":5232,"navigation":55,"path":5001,"seo":5233,"stem":5234,"style":59,"__hash__":5235},"content\u002Fblog\u002F生活\u002F失业.md","失业",{"type":8,"value":5009,"toc":5221},[5010,5022,5037,5040,5043,5070,5073,5075,5090,5111,5114,5129,5132,5135,5141,5153,5174,5180,5183,5204,5207,5210],[11,5011,5012,5013,5015,5016,5018,5019,5021],{},"九月一号，小朋友如期开学。",[1447,5014],{},"\n看着儿子按部就班的去学校，心里满是羡慕。",[1447,5017],{},"\n因为，我自己现在是个无业游民。",[1447,5020],{},"\n一个连续失业者。",[11,5023,5024,5025,5027,5028,5030,5031,5033,5034,5036],{},"第一次失业，是在24年的国庆前。",[1447,5026],{},"\n手忙脚乱两月有余，算是续上了份工作，刚过春节，又是猝不及防的被约谈，连试用期都没能熬过去。。。。",[1447,5029],{},"\n重新再一次上班已是25年的仲夏时节。",[1447,5032],{},"\n来到2026，五一长假前，又一次的失业通知。",[1447,5035],{},"\n想来，大抵人到中年，逢节亦渡劫。",[11,5038,5039],{},"现在时间大把，让我来慢慢记下失业的杂乱想法。",[120,5041,5042],{"id":5042},"心态",[11,5044,5045,5046,5048,5049,5051,5052,5054,5055,5057,5058,5060,5061,5063,5064,5066,5067,5069],{},"焦虑。",[1447,5047],{},"\n是从被约谈得知失业的那一刻起，直接心态爆炸。",[1447,5050],{},"\n尤记得，24年的第一次失业后，一向倒头就睡的我，直接体会了，忧虑而夜不能寐的状态。",[1447,5053],{},"\n脑子里呢除了慌乱还是慌乱，半夜2,3点依然没有丝毫睡意，不停的反复刷招聘软件，刷通信录看还有哪些可托付之人，看技术跟面试公众号文章。",[1447,5056],{},"\n显然，在大半夜时候看这些是完全没有任何作用的，招聘软件的消息不会有任何更新，通讯录里的人永远还是那些人，不增不减。",[1447,5059],{},"\n公众号，短视频海量而精准的推送你脑子急需补充的信息，永远有看不完且不会的内容。",[1447,5062],{},"\n几天之后，身体疲倦不堪，整个精神都萎靡至极。",[1447,5065],{},"\n好在，我是个意志力薄弱的人。。。。",[1447,5068],{},"\n自己对自己说，就先这么过着吧，我命由天不由我。",[11,5071,5072],{},"回头来看，焦虑是无可避免，但同时也是无济于事的，更多应该坦然些，乐观些，再多一点敏于行。",[120,5074,2270],{"id":2270},[11,5076,5077,5078,5080,5081,5083,5084,5086,5087,5089],{},"上了十来年的班，突然可以不上班了，理所当然的不用上。",[1447,5079],{},"\n感觉还是轻松愉快的。大抵是无官一身轻的意思吧。",[1447,5082],{},"\n每日的主要活动也就是，早上送儿子去幼儿园，下午接放学，一起玩乐，吃饭，洗澡，哄睡。",[1447,5085],{},"\n而,小家伙自己的快乐无疑又额外带给我更多的快乐。",[1447,5088],{},"\n这确实是段幸福的时光。",[11,5091,5092,5093,5095,5096,5098,5099,5101,5102,5104,5105,5107,5108,5110],{},"\"爸爸，我知道你没有工作了。\"",[1447,5094],{},"\n\"告诉爸爸，你是怎么想到的呢？\"，一开始以为是妻子和儿子讲了，或者儿子无意听到了耳朵里。",[1447,5097],{},"\n\"因为爸爸说把电脑带回公司后，再没有把电脑带回家了。爸爸不坐在电脑上开会了。\"",[1447,5100],{},"\n儿子的这份严谨思路我当然开心极了，但也害怕失业的焦虑会传染给儿子。",[1447,5103],{},"\n\"xx,说的很对，爸爸现在不需要上班了，可以每天去幼儿园接你。但是，爸爸过段时间再去公司上班，就不能去幼儿园接你放学了。\"",[1447,5106],{},"\n\"爸爸去公司，我去幼儿园，奶奶接我放学。我听奶奶的话。\"",[1447,5109],{},"\n稚子数言着实叫老父亲欣慰不已。",[11,5112,5113],{},"生活除了美好，还有现实。",[11,5115,5116,5117,5119,5120,5122,5123,5125,5126,5128],{},"现实不是经济的压力，至少眼前不是，而是来自家人的的压力。",[1447,5118],{},"\n妻子作为IT同路人，也多少能了解上班的情况，对于我丢了工作倒没说什么。每天能一直陪着儿子，她反而可以多些轻松。",[1447,5121],{},"\n母亲则是担忧，总会提起没了工作，会坐吃山空的。孩子还小，以后的路长压力大。",[1447,5124],{},"\n而我却不知该如何回复。",[1447,5127],{},"\n母亲不需要明白事情的来龙去脉，我也解释不明白。只要在某天，我继续开始上班了，自会解了她的担忧。",[120,5130,5131],{"id":5131},"工作的意义",[11,5133,5134],{},"一句话，工作就是为搞钱。",[11,5136,5137,5138,5140],{},"大学总是迷茫的，离开学校随大流进入社会。开始上班，因为总要养活自己，当然这个时候养活自己也就够了。",[1447,5139],{},"\n工作只是拼命完成领导给的一切口令，以及试图寻找无尽疑问的答案。",[11,5142,5143,5144,5146,5147,5149,5150,5152],{},"后来，站稳了脚跟，社会生活也进入了新阶段。",[1447,5145],{},"\n工作有了发展，也有了更多的花销。",[1447,5148],{},"\n可能谈恋爱了，交朋友了。",[1447,5151],{},"\n这个时候，工作是美好的，有内驱式的干劲，也有一次次的加薪的刺激，相信只要认真学好技术就会有光明的前途。",[11,5154,5155,5156,5158,5159,5161,5162,5164,5165,5167,5168,5170,5171,5173],{},"再后来，结婚了。 这个时候就不仅仅是养活自己，还要担起责任，追逐未来。",[1447,5157],{},"\n时间真是把杀猪刀啊。",[1447,5160],{},"\n有可能有了孩子，有可能还背着房贷。",[1447,5163],{},"\n一边工作有些倦怠，一边而又不能停歇日复一日撞着钟。",[1447,5166],{},"\n突然某日，那份工作没有了。",[1447,5169],{},"\n那份薪水也自然没了着落。。。",[1447,5172],{},"\n似乎除了上班，再无其他生财之道。",[11,5175,5176,5177,5179],{},"环顾四周，回望过去，同龄人有着相差不多的出发点，勤勉工作十余载，如今各自的身家早已天壤之别。",[1447,5178],{},"\n所以说，勤奋努力固然重要，更重要的是考虑历史进程。",[120,5181,5182],{"id":5182},"复盘与反思",[11,5184,5185,5186,5188,5189,5191,5192,5194,5195,5197,5198,5200,5201,5203],{},"工作选择，算是蹭上了时代红利，选择了IT。",[1447,5187],{},"\n工作初期，借助公司的平台给自己带来的成长，也是和工资一样，是自己获得的另一份隐形收益。",[1447,5190],{},"\n站在电梯里的上行，给了自己行的感觉。",[1447,5193],{},"\n潮水褪去之时，就会变的艰难起来。AI的急速发展，单单写代码这条路，越来越窄。",[1447,5196],{},"\n自己是个普通人。认清这点之后，可以让心态平和。",[1447,5199],{},"\n人生有很多阶段，每个阶段有相应的使命。工作是生活的一个手段。",[1447,5202],{},"\n最重要的是，过好现在和以后的阶段。",[1613,5205,5206],{"id":5206},"自己对自己说",[11,5208,5209],{},"人生还很长，我们还有很多路要走。工作之外，生活还有很多面。",[78,5211,5212,5215,5218],{},[81,5213,5214],{},"读书, 成本小，也容易做。可以让精神丰盈起来，超划算了。",[81,5216,5217],{},"运动, 这确是件难而正确的事，大概只要有坚持就够了。",[81,5219,5220],{},"乐观, 乐观的心态总是好的，毕竟还没到最差的境地呢。",{"title":45,"searchDepth":46,"depth":46,"links":5222},[5223,5224,5225,5226],{"id":5042,"depth":46,"text":5042},{"id":2270,"depth":46,"text":2270},{"id":5131,"depth":46,"text":5131},{"id":5182,"depth":46,"text":5182,"children":5227},[5228],{"id":5206,"depth":267,"text":5206},[2270],"2026-09-01","自由职业者心态与念头",{},{"title":5007,"description":5231},"blog\u002F生活\u002F失业","HdZ0Xzb9-HvggCpUAdoXgvrw4XuR_cQE5-CEm3LtSOg",{"id":5237,"title":5238,"body":5239,"categories":5314,"date":5315,"description":5316,"draft":52,"extension":53,"meta":5317,"navigation":55,"path":5001,"seo":5318,"stem":5319,"style":59,"__hash__":5320},"content\u002Fblog\u002F生活\u002F安全第一.md","安全第一",{"type":8,"value":5240,"toc":5312},[5241,5246,5249,5252,5291,5303],[11,5242,5238,5243,5245],{},[1447,5244],{},"\n对于开车人来说，这是条铁律，且必须首当其冲，永远置顶。",[11,5247,5248],{},"暴雨来的快，去的也快。地面上湿湿的颜色还没褪尽。路崖子边依然可以偶尔看到不少大大小小的水塘。这些积水都是薄薄，算不上深，也很少有大片的。",[11,5250,5251],{},"车子没上高速，车速不快，国道上车子很少，车速也不慢。",[11,5253,5254,5255,5257,5258,5260,5261,5263,5264,5266,5267,5269,5270,5272,5273,5275,5276,5278,5279,5281,5282,5284,5285,5287,5288,5290],{},"突然，前面有一块明显的水塘。",[1447,5256],{},"\n好奇心，瞬间就来了。",[1447,5259],{},"\n没有变道，没有刹车，没有减速，直接迎了上去。",[1447,5262],{},"\n噗----，一侧前轮吱进水里闷哼声。",[1447,5265],{},"\n声调不高，更不响。",[1447,5268],{},"\n啪！紧接着扬起的水撞到车底的声响。脆而短。",[1447,5271],{},"\n滋。应该是后轮轧过水坑的声音。几近不闻。",[1447,5274],{},"\n电光火石间，力道十足。方向盘已经明显感受到这股劲。",[1447,5277],{},"\n心头瞬间拉紧。",[1447,5280],{},"\n这是来自车子两侧不平衡拉力带来的。带来了车子的一晃。",[1447,5283],{},"\n方向盘上的双手紧紧握着，似乎还有了些汗渍。",[1447,5286],{},"\n好在水塘不长，方向盘的力道也转瞬即逝，手却不敢松。",[1447,5289],{},"\n揪上去的心倒是下来的有些慢了，随着刚憋住的气，开始缓缓舒了下来。",[11,5292,5293,5294,5296,5297,5299,5300,5302],{},"后知后觉的踩下了刹车，前方路上依然很空。",[1447,5295],{},"\n万幸。",[1447,5298],{},"\n感觉到后背渗出了汗。",[1447,5301],{},"\n后怕。",[11,5304,5305,5306,5308,5309,5311],{},"开车安全第一。",[1447,5307],{},"\n安全第一。",[1447,5310],{},"\n哪怕是有了一个好奇心的时候，一定要在这之前加上这四字，再做决定。",{"title":45,"searchDepth":46,"depth":46,"links":5313},[],[2270],"2024-05-06","开车感悟",{},{"title":5238,"description":5316},"blog\u002F生活\u002F安全第一","MJAGm0nHjGrFkbqq24UYLIHjEUbPDMAxDfV9TPsU1w8",{"id":5322,"title":5323,"body":5324,"categories":5435,"date":5436,"description":5437,"draft":52,"extension":53,"meta":5438,"navigation":55,"path":5001,"seo":5439,"stem":5440,"style":59,"__hash__":5441},"content\u002Fblog\u002F生活\u002F年夜饭.md","年夜饭",{"type":8,"value":5325,"toc":5430},[5326,5344,5346,5349,5352,5355,5359,5362,5365,5371,5374,5377,5380,5384,5387,5390,5393,5396,5399,5402,5405,5408,5411,5414,5417,5421,5427],[11,5327,5328,5337,5339],{},[1103,5329,5330],{},[73,5331,5332,5333],{},"cp from: ",[174,5334,5335],{"href":5335,"rel":5336},"https:\u002F\u002Fmp.weixin.qq.com\u002Fs\u002F9E8Tosl2IFWihhY-lb6JQg",[178],[1447,5338],{},[1103,5340,5341],{},[73,5342,5343],{},"公众号：浪潮工作室 《我从未如此期待一顿饭》",[928,5345],{},[11,5347,5348],{},"曾经，在许多人心目中，“年夜饭”是“年味变淡”的集中体现——大鱼大肉、一成不变、应酬尴尬……每一点，都让人失去期待。",[11,5350,5351],{},"对于城市中产人群来说，下馆子早已成为日常。习惯了高档餐厅精致摆盘、新奇口感、周到服务和私密空间的人，再来吃“大鱼大肉”的年夜饭，难免心生疲倦：十年不变的老一套菜品，一大家子嘈杂的氛围，杯盘狼藉的善后……怎么都不是理想中的一顿饭。",[11,5353,5354],{},"但春节毕竟不同于平日消费，在经历了两三个和速冻饺子、预制菜相伴的春节后，人们终于重新开始期待回家过年，吃一顿记忆中的年夜饭了。",[120,5356,5358],{"id":5357},"年夜饭站起来了","年夜饭，站起来了",[11,5360,5361],{},"年夜饭和普通饭局的最大不同，就是它漫长的酝酿过程。年夜饭并不从大家坐在桌边的那一刻开始，而是伴随着老家亲人对你的思念、对春节的期待，悄然开始。",[11,5363,5364],{},"要准备一顿除夕的年夜饭，需要从小年甚至更早就开始。干香有嚼劲的腊肉，可能还带着去年的烟火气；小猪变成红烧肉、酱猪蹄，从年头等到了年尾；米酒等待被啜饮，已经酝酿了一整个腊月。",[11,5366,5367,5368,5370],{},"这份等待，在亲手做、亲口尝中进行。",[1447,5369],{},"\n饺子是许多家庭年夜饭餐桌上的“钉子户”，也是最能让家人一起参与烹饪的佳肴。在细密的刀起刀落声中，猪肉、白菜、鸡蛋等经典配料融合在一起；白花花的面团被切成一小块，擀面杖将面团缓缓推开，仿佛也熨平了从大城市带回来的焦虑与不安；几双手把馅料填进饺子皮中，捏成不同的形状，柳叶饺、裙边饺、玫瑰花饺、元宝饺……各自的创意、彼此间的爱意包容进同一张大锅里。",[11,5372,5373],{},"佛跳墙、花胶鸡、八宝鸭等费时费力的硬菜，还得指望家里的大厨。那个常年在厨房的背影，耐心等待着数小时的蒸煮、腌制，细心处理好每一道配菜，把一年的唠叨或沉默不语的牵挂，融入复杂繁琐的大菜制作流程里。\n而当一桌热腾腾的饭菜被端上餐桌，香气氤氲了整个房间，炉子上的酒也温好了。在亲人们清脆的干杯和温暖的祝福声中，这几年缺失的年味，似乎又回来了。",[11,5375,5376],{},"这场家宴中，没有精致的摆盘和时髦的花样，但父母长辈却永远记得你最爱的菜品和口味；那些从前吃厌了的菜，在几年不见后，融合了熟悉与陌生，又俨然如一道新品；没有了餐厅的服务，但和爸妈肩并肩在厨房备菜、端盘、洗碗，时不时聊几句天，一切好像回到你还年少、尚未离家远行的时候。",[11,5378,5379],{},"缺席了许久的热闹年夜饭，在此刻终于寻回了温馨、陪伴、包容的本真意义。",[120,5381,5383],{"id":5382},"年夜饭里藏着我们的来处","年夜饭里，藏着我们的来处",[11,5385,5386],{},"年夜饭的独特之处，正源于它背后的深厚内涵：年夜饭从来不只是吃，更是一种文化烙印与情感联结。",[11,5388,5389],{},"在那些以农业为基本生产方式的历史岁月中，人们和农作物的相处遵循着自然的时间规律，春种秋收。过年前夕，恰逢当庄稼收割，五谷成熟，人们有了充足的食物，又有了一段农闲时间，自然值得过一个盛大的节日。\n看看年夜饭吃了什么菜，是辣的还是酸的，是清淡的还是重口的，就能知道围坐这张餐桌的人，耕耘在哪一方水土。而当我们发现了年夜饭的本质，也就更能体会它的精华所在。",[11,5391,5392],{},"去餐厅用餐，讲究的是好不好吃、环境如何、服务是否周到……归根结底，它遵循的是商业和消费的逻辑。而年夜饭则截然不同。它是春节仪式的一部分，讲究丰盛、团圆、吉利，满足的是更古老的农业社会的期许。",[11,5394,5395],{},"中式年夜饭的精髓，首先是样式要多。鸡鸭鱼肉，天上地下，面面俱到，这是农业社会对“丰盛”的朴素想象。除了样式多，分量也要足，彰显富裕的家底，也祝福着来年的丰收。有些地区的年夜饭一定要剩下一些，或者“年鱼”只看不吃，也是对未来一年富足生活的期盼。",[11,5397,5398],{},"正是在这个新年，人们开始重新认识和理解“丰衣足食”这样古老而朴素的愿望。当我们在春节前夕穿过北上广的人潮、回到天南海北的小城、乡镇乃至村庄，那个已经被我们抛在身后甚至渐渐忘却的乡土中国的逻辑，又渐渐地浮现出来。",[11,5400,5401],{},"在大城市，人与人之间是“陌生人社会”，讲规则、谈价格。然而，养育我们的家乡是一个“熟人社会”，承载着血缘宗族关系为基础的人际规则。",[11,5403,5404],{},"不论你是哪所名校的高材生、哪家公司的高管、哪座城市的社畜，回了家都只是老李家的大闺女、老王家的小儿子；不论你这一年顺利还是坎坷，悟得了多少人生道理，见证了多少美丽风景，都逃不开“考上研究生了吗？”“谈恋爱了吗？”“什么时候结婚？”“什么时候买房？”等“灵魂追问”。",[11,5406,5407],{},"而这些，正是出于宗族规则中对长幼之序、成家立业的看重。",[11,5409,5410],{},"在春节，农业的宗族社会和现代的城市文明重新交汇。不管有钱还是没钱，得势还是落魄，家人始终在期盼着你回家过年，他们的包容让你踏实、心安。",[11,5412,5413],{},"在你需要的时候， 正是这些健谈多话，充满好奇，观念朴素甚至落后的老家的亲戚们，为你在厨房忙碌一整天准备一桌饭菜，为你东奔西走办事，把土特产塞满你的后备箱……",[11,5415,5416],{},"一桌年夜饭，把不同的规则和声音聚到同一处，用朴素而真挚的情感弥合分歧，用包容的力量让我们看到彼此的复杂性，也看到自己的来处。",[120,5418,5420],{"id":5419},"年夜饭之后重新出发","年夜饭之后，重新出发",[11,5422,5423,5424,5426],{},"年夜饭之后，年轻人们终究要回到大城市，从二狗和丽丽做回时髦的Chandler和Chloe；",[1447,5425],{},"\n但在这个充满了包容、弥合、理解和温情的春节之后，我们需要重新审视自己的复杂性，在老家和北上广之间，找寻一个更安稳自洽的身份，突破出新的可能。",[11,5428,5429],{},"在包容中寻求突破，需要“和而不同”的智慧。“和而不同”贯穿于中国历史和思想史的整个发展过程，意味着多元、共存，既保持自身独立性，亦尊重他者合理性。",{"title":45,"searchDepth":46,"depth":46,"links":5431},[5432,5433,5434],{"id":5357,"depth":46,"text":5358},{"id":5382,"depth":46,"text":5383},{"id":5419,"depth":46,"text":5420},[2270],"2023-01-17","浪潮工作室 《我从未如此期待一顿饭》",{},{"title":5323,"description":5437},"blog\u002F生活\u002F年夜饭","LcfDOW304brzTFcsfdmUQWBWmSMY87k1lZthKRdspbo",{"id":5443,"title":5444,"body":5445,"categories":5515,"date":5516,"description":5517,"draft":52,"extension":53,"meta":5518,"navigation":55,"path":5001,"seo":5519,"stem":5520,"style":59,"__hash__":5521},"content\u002Fblog\u002F生活\u002F网约车一日行.md","网约车一日行",{"type":8,"value":5446,"toc":5513},[5447,5459,5468,5480,5489,5501],[11,5448,5449,5450,5452,5453,5455,5456,5458],{},"独自从老家返城。",[1447,5451],{},"\n想着找找网约车单子。",[1447,5454],{},"\n很顺利的就接到了。",[1447,5457],{},"\n两单。",[11,5460,5461,5462,5464,5465,5467],{},"说是顺风车，但起始点还是得弯些路，接上客。",[1447,5463],{},"\n进了城也得再送到终点 。",[1447,5466],{},"\n好在路上没有堵车，算是一路顺风。",[11,5469,5470,5471,5473,5474,5476,5477,5479],{},"不知是不是系统给予的新人福利。",[1447,5472],{},"\n还是对我临了再看一眼的奖励。",[1447,5475],{},"\n完结了返城的单子，准备真的回家的时候，又接了隔壁的小区99%顺路单子。",[1447,5478],{},"\n收入35。",[11,5481,5482,5483,5485,5486,5488],{},"账目简单，收入，160+95.两单居然有这么大奇怪的差距值。",[1447,5484],{},"\n支出高速120,约150的油费。",[1447,5487],{},"\n数据上基本持平。加上35，还可以算略有结余。",[11,5490,5491,5492,5494,5495,5497,5498,5500],{},"但，这着实不划算。",[1447,5493],{},"\n早上8点半出门，下午5点才到家。",[1447,5496],{},"\n头昏脑胀，精疲力竭。",[1447,5499],{},"\n3～4小时的返程之路，硬是加班到8小时。",[11,5502,5503,5504,5506,5507,5509,5510,5512],{},"可以算做一次网约车打工之旅。。。。",[1447,5505],{},"\n也是给自己上了一课。",[1447,5508],{},"\n有个班上就多多珍惜吧，失业了就开网约车的念头早早的有了冷水浇。",[1447,5511],{},"\n也算是又一份附加收获。",{"title":45,"searchDepth":46,"depth":46,"links":5514},[],[2270],"2026-05-14","网约车师傅初体验",{},{"title":5444,"description":5517},"blog\u002F生活\u002F网约车一日行","MUMh-TQUyXYkmd-ERgqPS0ojNi7xk1r3zjx8YmLVq4w",{"id":5523,"title":5524,"body":5525,"categories":5595,"date":5597,"description":5598,"draft":52,"extension":53,"meta":5599,"navigation":55,"path":5600,"seo":5601,"stem":5602,"style":59,"__hash__":5603},"content\u002Fblog\u002F诗词\u002F15-清平乐-村居.md","村居",{"type":8,"value":5526,"toc":5593},[5527,5545,5547,5550,5559,5562,5568,5578],[5528,5529,5532],"div",{"className":5530},[5531],"poems",[4855,5533,5534,5542],{},[11,5535,5536,5539],{},[73,5537,5538],{},"清平乐 · 村居",[1103,5540,5541],{},"宋 · 辛弃疾",[11,5543,5544],{},"茅檐低小，溪上青青草。\n醉里吴音相媚好，白发谁家翁媪？\n大儿锄豆溪东，中儿正织鸡笼。\n最喜小儿亡赖，溪头卧剥莲蓬。",[928,5546],{},[11,5548,5549],{},"这首小诗描述了很简单的场景，照着字面意思就可以理解。字符间的画面也容易想象出来。",[11,5551,5552,5553,5555,5556],{},"忍不住效颦一番：真想给自己的房子也命名，那样也就能有这闲适的日子了。",[1447,5554],{},"\n暂且取上一个 -- ",[1103,5557,5558],{},"江右村居",[11,5560,5561],{},"眼前的社会，很难有这样的场景了。",[11,5563,5564,5565,5567],{},"诗中描绘的场景，是个让人羡慕的场景。",[1447,5566],{},"\n如果置身其中，也会悠闲快乐的。自然环境可以寻得，但这样的生活又有几人能去过呢。",[11,5569,5570,5573,5575],{},[1103,5571,5572],{},"天下熙熙 皆为利来,天下攘攘 皆为利往。",[1447,5574],{},[1103,5576,5577],{},"世人慌慌张张，不过图碎银几两。",[11,5579,5580,5581,5583,5584,5586,5587,5589,5590,5592],{},"偏偏这碎银几两，能解世间万般惆怅。",[1447,5582],{},"\n我们有了太多的需求， 一箪食一瓢饮已经不能满足我们了。",[1447,5585],{},"\n不得不说，现在社会化分工，可以让我们生活品质提升很多。",[1447,5588],{},"\n但实际，我们的需求没有那么复杂。",[1447,5591],{},"\n如果我们满足点低些，只为饱腹奔波，是不是不会有那么多心累。",{"title":45,"searchDepth":46,"depth":46,"links":5594},[],[5596],"诗词","2023-03-20","诗",{},"\u002Fblog\u002F\u002F15",{"title":5524,"description":5598},"blog\u002F诗词\u002F15-清平乐-村居","VNgAnbixnk31TeYts1OXxPzdI1VtZMX4ZJy_tciNNno",{"id":5605,"title":5606,"body":5607,"categories":6174,"date":6175,"description":6176,"draft":52,"extension":53,"meta":6177,"navigation":55,"path":6178,"seo":6179,"stem":6180,"style":6181,"__hash__":6182},"content\u002Fblog\u002F诗词\u002F23-古诗.md","古诗",{"type":8,"value":5608,"toc":6172},[5609,5622,5635,5648,5661,5677,5682,5695,5700,5712,5717,5730,5742,5755,5760,5773,5786,5798,5810,5823,5836,5849,5861,5866,5878,5890,5902,5915,5928,5940,5953,5958,5971,5976,5988,6000,6013,6024,6037,6049,6061,6073,6085,6097,6104,6116,6128,6140,6147,6160],[4855,5610,5611,5619],{},[11,5612,5613,5616],{},[73,5614,5615],{},"咏鹅",[1103,5617,5618],{},"唐 · 骆宾王",[11,5620,5621],{},"鹅，鹅，鹅，\n曲项向天歌，\n白毛浮绿水，\n红掌拨清波。",[4855,5623,5624,5632],{},[11,5625,5626,5629],{},[73,5627,5628],{},"静夜思",[1103,5630,5631],{},"唐 · 李白",[11,5633,5634],{},"床前明月光，\n疑似地上霜。\n举头望明月，\n低头思故乡。",[4855,5636,5637,5645],{},[11,5638,5639,5642],{},[73,5640,5641],{},"春晓",[1103,5643,5644],{},"唐 · 孟浩然",[11,5646,5647],{},"春眠不觉晓，\n处处闻啼鸟。\n夜来风雨声，\n花落知多少。",[4855,5649,5650,5658],{},[11,5651,5652,5655],{},[73,5653,5654],{},"悯农",[1103,5656,5657],{},"唐 · 李绅",[11,5659,5660],{},"锄禾日当午，\n汗滴禾下土。\n谁知盘中餐，\n粒粒皆辛苦。",[4855,5662,5663,5671],{},[11,5664,5665,5668],{},[73,5666,5667],{},"赋得古原草送别",[1103,5669,5670],{},"唐 · 白居易",[11,5672,5673,5674,5676],{},"离离原上草，\n一岁一枯荣。\n野火烧不尽，\n春风吹又生。",[1447,5675],{},"\n远芳侵古道，\n晴翠接荒城。\n又送王孙去，\n萋萋满别情。",[11,5678,5679],{},[1103,5680,5681],{},"注：赋得——借古人诗句或成语命题作诗。诗题前一般都冠以\"赋得\"二字。这是古代人学习作诗或文人聚会分题作诗或科举考试时命题作诗的一种方式，称为\"赋得体\"。",[4855,5683,5684,5692],{},[11,5685,5686,5689],{},[73,5687,5688],{},"画",[1103,5690,5691],{},"唐 · 王维",[11,5693,5694],{},"远看山有色，\n近听水无声。\n春去花还在，\n人来鸟不惊。",[11,5696,5697],{},[1103,5698,5699],{},"教错后两句的顺序了。",[4855,5701,5702,5709],{},[11,5703,5704,5707],{},[73,5705,5706],{},"望庐山瀑布",[1103,5708,5631],{},[11,5710,5711],{},"日照香炉生紫烟，\n遥看瀑布挂前川。\n飞流直下三千尺，\n疑是银河落九天。",[11,5713,5714],{},[1103,5715,5716],{},"最后一句前两个字发音不友好，小朋友不易上口。",[4855,5718,5719,5727],{},[11,5720,5721,5724],{},[73,5722,5723],{},"登鹳雀楼",[1103,5725,5726],{},"唐 · 王之涣",[11,5728,5729],{},"白日依山尽，\n黄河入海流。\n欲穷千里目，\n更上一层楼。",[4855,5731,5732,5739],{},[11,5733,5734,5737],{},[73,5735,5736],{},"夜宿山寺",[1103,5738,5631],{},[11,5740,5741],{},"危楼高百尺，\n手可摘星辰。\n不敢高声语，\n恐惊天上人。",[4855,5743,5744,5752],{},[11,5745,5746,5749],{},[73,5747,5748],{},"寻隐者不遇",[1103,5750,5751],{},"唐 · 贾岛",[11,5753,5754],{},"松下问童子，\n言师采药去。\n只在此山中，\n云深不知处。",[11,5756,5757],{},[1103,5758,5759],{},"第三句，只\u002F此，翘舌平舌不友好。",[4855,5761,5762,5770],{},[11,5763,5764,5767],{},[73,5765,5766],{},"绝句",[1103,5768,5769],{},"唐 · 杜甫",[11,5771,5772],{},"两个黄鹂鸣翠柳，\n一行白鹭上青天。\n窗含西岭千秋雪，\n门泊东吴万里船。",[4855,5774,5775,5783],{},[11,5776,5777,5780],{},[73,5778,5779],{},"清明",[1103,5781,5782],{},"唐 · 杜牧",[11,5784,5785],{},"清明时节雨纷纷，\n路上行人欲断魂。\n借问酒家何处有，\n牧童遥指杏花村。",[4855,5787,5788,5795],{},[11,5789,5790,5793],{},[73,5791,5792],{},"早发白帝城",[1103,5794,5631],{},[11,5796,5797],{},"朝辞白帝彩云间，\n千里江陵一日还。\n两岸猿声啼不住，\n轻舟已过万重山。",[4855,5799,5800,5807],{},[11,5801,5802,5804],{},[73,5803,3477],{},[1103,5805,5806],{},"宋 · 王安石",[11,5808,5809],{},"墙角数枝梅，\n凌寒独自开。\n遥知不是雪，\n为有暗香来。",[4855,5811,5812,5820],{},[11,5813,5814,5817],{},[73,5815,5816],{},"小池",[1103,5818,5819],{},"宋 · 杨万里",[11,5821,5822],{},"泉眼无声惜细流，\n树阴照水爱晴柔。\n小荷才露尖尖角，\n早有蜻蜓立上头。",[4855,5824,5825,5833],{},[11,5826,5827,5830],{},[73,5828,5829],{},"江雪",[1103,5831,5832],{},"唐 · 柳宗元",[11,5834,5835],{},"千山鸟飞绝，\n万径人踪灭。\n孤舟蓑笠翁，\n独钓寒江雪。",[4855,5837,5838,5846],{},[11,5839,5840,5843],{},[73,5841,5842],{},"出塞",[1103,5844,5845],{},"唐 · 王昌龄",[11,5847,5848],{},"秦时明月汉时关，\n万里长征人未还。\n但使龙城飞将在，\n不教胡马渡阴山。",[4855,5850,5851,5858],{},[11,5852,5853,5856],{},[73,5854,5855],{},"送元二使安西",[1103,5857,5691],{},[11,5859,5860],{},"渭城朝雨浥轻尘，\n客舍青青柳色新。\n劝君更尽一杯酒，\n西出阳关无故人。",[11,5862,5863],{},[1103,5864,5865],{},"浥（yì）",[4855,5867,5868,5875],{},[11,5869,5870,5873],{},[73,5871,5872],{},"九月九日忆山东兄弟",[1103,5874,5691],{},[11,5876,5877],{},"独在异乡为异客，\n每逢佳节倍思亲。\n遥知兄弟登高处，\n遍插茱萸少一人。",[4855,5879,5880,5887],{},[11,5881,5882,5885],{},[73,5883,5884],{},"黄鹤楼送孟浩然之广陵",[1103,5886,5631],{},[11,5888,5889],{},"故人西辞黄鹤楼，\n烟花三月下扬州。\n孤帆远影碧空尽，\n惟见长江天际流。",[4855,5891,5892,5899],{},[11,5893,5894,5897],{},[73,5895,5896],{},"望天门山",[1103,5898,5631],{},[11,5900,5901],{},"天门中断楚江开，\n碧水东流至此回。\n两岸青山相对出，\n孤帆一片日边来。",[4855,5903,5904,5912],{},[11,5905,5906,5909],{},[73,5907,5908],{},"枫桥夜泊",[1103,5910,5911],{},"唐 · 张继",[11,5913,5914],{},"月落乌啼霜满天，\n江枫渔火对愁眠。\n姑苏城外寒山寺，\n夜半钟声到客船。",[4855,5916,5917,5925],{},[11,5918,5919,5922],{},[73,5920,5921],{},"题西林壁",[1103,5923,5924],{},"宋 · 苏轼",[11,5926,5927],{},"横看成岭侧成峰，\n远近高低各不同。\n不识庐山真面目，\n只缘身在此山中。",[4855,5929,5930,5937],{},[11,5931,5932,5935],{},[73,5933,5934],{},"自提金山画像",[1103,5936,5924],{},[11,5938,5939],{},"心似已灰之木，\n身如不系之舟。\n问汝平生功业，\n黄州惠州儋州。",[4855,5941,5942,5950],{},[11,5943,5944,5947],{},[73,5945,5946],{},"天净沙 · 秋思",[1103,5948,5949],{},"元 · 马致远",[11,5951,5952],{},"枯藤老树昏鸦，\n小桥流水人家，\n古道西风瘦马。\n夕阳西下，\n断肠人在天涯。",[11,5954,5955],{},[1103,5956,5957],{},"小朋友很好上口。",[4855,5959,5960,5968],{},[11,5961,5962,5965],{},[73,5963,5964],{},"风",[1103,5966,5967],{},"唐 · 李峤",[11,5969,5970],{},"解落三秋叶，\n能开二月花。\n过江千尺浪，\n入竹万竿斜。",[11,5972,5973],{},[1103,5974,5975],{},"峤：jiào 或 qiáo",[4855,5977,5978,5985],{},[11,5979,5980,5983],{},[73,5981,5982],{},"大林寺桃花",[1103,5984,5670],{},[11,5986,5987],{},"人间四月芳菲尽，\n山寺桃花始盛开。\n长恨春归无觅处，\n不知转入此山中。",[4855,5989,5990,5997],{},[11,5991,5992,5995],{},[73,5993,5994],{},"赠汪伦",[1103,5996,5631],{},[11,5998,5999],{},"李白乘舟将欲行，\n忽闻岸上踏歌声。\n桃花潭水深千尺，\n不及汪伦送我情。",[4855,6001,6002,6010],{},[11,6003,6004,6007],{},[73,6005,6006],{},"凉州词",[1103,6008,6009],{},"唐 · 王翰",[11,6011,6012],{},"葡萄美酒夜光杯，\n欲饮琵琶马上催。\n醉卧沙场君莫笑，\n古来征战几人回？",[4855,6014,6015,6021],{},[11,6016,6017,6019],{},[73,6018,6006],{},[1103,6020,5726],{},[11,6022,6023],{},"黄河远上白云间，\n一片孤城万仞山。\n羌笛何须怨杨柳，\n春风不度玉门关。",[4855,6025,6026,6034],{},[11,6027,6028,6031],{},[73,6029,6030],{},"咏柳",[1103,6032,6033],{},"唐 · 贺知章",[11,6035,6036],{},"碧玉妆成一树高，\n万条垂下绿丝绦。\n不知细叶谁裁出，\n二月春风似剪刀。",[4855,6038,6039,6046],{},[11,6040,6041,6044],{},[73,6042,6043],{},"回乡偶书",[1103,6045,6033],{},[11,6047,6048],{},"少小离家老大回，\n乡音无改鬓毛衰。\n儿童相见不相识，\n笑问客从何处来。",[4855,6050,6051,6058],{},[11,6052,6053,6056],{},[73,6054,6055],{},"晓出净慈寺送林子方",[1103,6057,5819],{},[11,6059,6060],{},"毕竟西湖六月中，\n风光不与四时同。\n接天莲叶无穷碧，\n映日荷花别样红。",[4855,6062,6063,6070],{},[11,6064,6065,6068],{},[73,6066,6067],{},"鹿柴",[1103,6069,5691],{},[11,6071,6072],{},"空山不见人，\n但闻人语响。\n返景入深林，\n复照青苔上。",[4855,6074,6075,6082],{},[11,6076,6077,6080],{},[73,6078,6079],{},"山居秋暝",[1103,6081,5691],{},[11,6083,6084],{},"空山新雨后，\n天气晚来秋。\n明月松间照，\n清泉石上流。\n竹喧归浣女，\n莲动下渔舟。\n随意春芳歇，\n王孙自可留。",[4855,6086,6087,6094],{},[11,6088,6089,6092],{},[73,6090,6091],{},"饮湖上初晴后雨",[1103,6093,5924],{},[11,6095,6096],{},"水光潋滟晴方好，\n山色空蒙雨亦奇。\n欲把西湖比西子，\n浓妆淡抹总相宜。",[4855,6098,6099],{},[11,6100,6101],{},[1103,6102,6103],{},"潋滟(liàn yàn) ：水面波光闪动的样子",[4855,6105,6106,6113],{},[11,6107,6108,6111],{},[73,6109,6110],{},"惠崇春江晚景",[1103,6112,5924],{},[11,6114,6115],{},"竹外桃花三两枝，\n春江水暖鸭先知。\n蒌蒿满地芦芽短，\n正是河豚欲上时。",[4855,6117,6118,6125],{},[11,6119,6120,6123],{},[73,6121,6122],{},"池上",[1103,6124,5670],{},[11,6126,6127],{},"小娃撑小艇，\n偷采白莲回。\n不解藏踪迹，\n浮萍一道开。",[4855,6129,6130,6137],{},[11,6131,6132,6135],{},[73,6133,6134],{},"忆江南",[1103,6136,5670],{},[11,6138,6139],{},"江南好，\n风景旧曾谙。\n日出江花红胜火，\n春来江水绿如蓝。\n能不忆江南？",[4855,6141,6142],{},[11,6143,6144],{},[1103,6145,6146],{},"绿如蓝： 绿得比蓝还要绿。如，用法犹‘于’",[4855,6148,6149,6157],{},[11,6150,6151,6154],{},[73,6152,6153],{},"示儿",[1103,6155,6156],{},"宋 · 陆游",[11,6158,6159],{},"死去元知万事空，\n但悲不见九州同。\n王师北定中原日，\n家祭无忘告乃翁。",[4855,6161,6162,6169],{},[11,6163,6164,6167],{},[73,6165,6166],{},"泊船瓜洲",[1103,6168,5806],{},[11,6170,6171],{},"京口瓜洲一水间，\n钟山只隔数重山。\n春风又绿江南岸，\n明月何时照我还。",{"title":45,"searchDepth":46,"depth":46,"links":6173},[],[5596],"2024-05-15","教小朋友的古诗列表",{},"\u002Fblog\u002F\u002F23",{"title":5606,"description":6176},"blog\u002F诗词\u002F23-古诗","poem","bnjGiwcmQVjv5pJ55tTTTrQ__fEdxdIhNLhZl31GTuQ",{"id":6184,"title":6185,"body":6186,"categories":6233,"date":6234,"description":6235,"draft":52,"extension":53,"meta":6236,"navigation":55,"path":6237,"seo":6238,"stem":6239,"style":59,"__hash__":6240},"content\u002Fblog\u002F诗词\u002F24-成语.md","成语",{"type":8,"value":6187,"toc":6231},[6188],[78,6189,6190,6193,6196,6199,6202,6205,6208,6211,6214,6217,6220,6223,6226,6229],{},[81,6191,6192],{},"守株待兔",[81,6194,6195],{},"刻舟求剑",[81,6197,6198],{},"狐假虎威",[81,6200,6201],{},"亡羊补牢",[81,6203,6204],{},"掩耳盗铃",[81,6206,6207],{},"拔苗助长",[81,6209,6210],{},"专心致志",[81,6212,6213],{},"胸有成竹",[81,6215,6216],{},"画龙点睛",[81,6218,6219],{},"负荆请罪",[81,6221,6222],{},"三顾茅庐",[81,6224,6225],{},"程门立雪",[81,6227,6228],{},"南辕北辙",[81,6230,6195],{},{"title":45,"searchDepth":46,"depth":46,"links":6232},[],[5596],"2024-06-13","可以给小朋友讲古诗的成语",{},"\u002Fblog\u002F\u002F24",{"title":6185,"description":6235},"blog\u002F诗词\u002F24-成语","lJkDRq6JHZFK6wqkh-wVhZ720lcanfnIIW9-rV1FbtA",{"id":6242,"title":6243,"body":6244,"categories":6351,"date":6352,"description":6353,"draft":52,"extension":53,"meta":6354,"navigation":55,"path":5001,"seo":6355,"stem":6356,"style":6181,"__hash__":6357},"content\u002Fblog\u002F诗词\u002F李清照.md","李清照",{"type":8,"value":6245,"toc":6348},[6246,6262,6274,6285,6300,6315,6330,6333],[4855,6247,6248,6256],{},[11,6249,6250,6253],{},[73,6251,6252],{},"一剪梅",[1103,6254,6255],{},"宋 · 李清照",[11,6257,6258,6259,6261],{},"红藕香残玉簟秋。\n轻解罗裳，独上兰舟。\n云中谁寄锦书来？\n雁字回时，月满西楼。",[1447,6260],{},"\n花自飘零水自流。\n一处相思，两处闲愁。\n此情无计可消除，\n才下眉头，却上心头。",[4855,6263,6264,6271],{},[11,6265,6266,6269],{},[73,6267,6268],{},"如梦令",[1103,6270,6255],{},[11,6272,6273],{},"昨夜雨疏风骤，\n浓睡不消残酒。\n试问卷帘人，\n却道海棠依旧。\n知否，知否？应是绿肥红瘦。",[4855,6275,6276,6282],{},[11,6277,6278,6280],{},[73,6279,6268],{},[1103,6281,6255],{},[11,6283,6284],{},"常记溪亭日暮，\n沉醉不知归路。\n兴尽晚回舟，\n误入藕花深处。\n争渡，争渡，惊起一滩鸥鹭。",[4855,6286,6287,6294],{},[11,6288,6289,6292],{},[73,6290,6291],{},"醉花阴",[1103,6293,6255],{},[11,6295,6296,6297,6299],{},"薄雾浓云愁永昼，\n瑞脑销金兽。\n佳节又重阳，\n玉枕纱厨，半夜凉初透。",[1447,6298],{},"\n东篱把酒黄昏后，\n有暗香盈袖。\n莫道不销魂，\n帘卷西风，人比黄花瘦。",[4855,6301,6302,6309],{},[11,6303,6304,6307],{},[73,6305,6306],{},"武陵春",[1103,6308,6255],{},[11,6310,6311,6312,6314],{},"风住尘香花已尽，日晚倦梳头。\n物是人非事事休，欲语泪先流。",[1447,6313],{},"\n闻说双溪春尚在，也拟泛轻舟。\n只恐双溪蚱蜢舟，载不动，许多愁。",[4855,6316,6317,6324],{},[11,6318,6319,6322],{},[73,6320,6321],{},"声声慢",[1103,6323,6255],{},[11,6325,6326,6327,6329],{},"寻寻觅觅，\n冷冷清清，\n凄凄惨惨戚戚。\n乍暖还寒时候，最难将息。\n三杯两盏淡酒，\n怎敌他，晚来风急？\n雁过也，正伤心，\n却是旧时相识。",[1447,6328],{},"\n满地黄花堆积，\n憔悴损，如今有谁堪摘？\n守着窗儿，\n独自怎生得黑。\n梧桐更兼细雨，\n到黄昏，点点滴滴。\n这次第，怎一个愁字了得！",[120,6331,6332],{"id":6332},"辛弃疾",[4855,6334,6335,6342],{},[11,6336,6337,6340],{},[73,6338,6339],{},"南乡子·登京口北固亭有怀",[1103,6341,5541],{},[11,6343,6344,6345,6347],{},"何处望神州？\n满眼风光北固楼。\n千古兴亡多少事？\n悠悠。不尽长江滚滚流。",[1447,6346],{},"\n年少万兜鍪(móu)，\n坐断东南战未休。\n天下英雄谁敌手？\n曹刘。生子当如孙仲谋。",{"title":45,"searchDepth":46,"depth":46,"links":6349},[6350],{"id":6332,"depth":46,"text":6332},[5596],"2024-06-05","词",{},{"title":6243,"description":6353},"blog\u002F诗词\u002F李清照","viZSLUJreRM33lmGewDSw7pA4G9zBNArme3Qld3_kEc",1791473314996]