<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>PrintLove</title>
    <link>https://www.printlove.cn/</link>
    <description>Recent content on PrintLove</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <copyright>Content under license [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)</copyright>
    <lastBuildDate>Fri, 03 Jan 2025 15:41:45 +0800</lastBuildDate><atom:link href="https://www.printlove.cn/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>使用 Obsidian 免费建个人博客</title>
      <link>https://www.printlove.cn/obsidian-blog/</link>
      <pubDate>Thu, 21 Dec 2023 10:06:19 +0800</pubDate>
      
      <guid>https://www.printlove.cn/obsidian-blog/</guid>
      <description>目前我的网站发布流程就是使用该篇文章技术，如果你使用的 Notion 写文章，可以看看这篇 Vercel + Notion 建个人博客 。
流程简介：
选择自己的静态网站生成工具，我选择 Hugo； 使用 Hugo 初始化好结构然后上传到 Github 仓库； Obsidian 写好文章，然后使用插件将指定的文章 (md 格式) 上传到第 2 步的仓库,插件的作用就是将 Obsidian 中的 markdown 内容适配成 Hugo 需要的内容； 部署仓库，配置域名。 相关工具 Obsidian + Enveloppe 插件，必须 Hugo + Paper Mod 主题，可选择其它 Github，必须 Vercel，可选择其它 具体步骤继续往下看。
Hugo + PaperMod 使用 hugo 初始化一个网站，并配置好你喜欢的主题，并发布到 Github 上，这块具体怎么弄就不展开介绍了。
可以参考：
官方主题文档：PaperMod 我的仓库：miaogaolin/workspace-obsidian-publisher 稍微改了点官方主题 Enveloppe 给 Obsidian 安装 Enveloppe 插件，该插件的作用是将 Obsidian 中的文章和本地附件上传到 Github 仓库，上传前可以指定文件目录、自定义内容替换等操作。
Github config Github config 注意：</description>
    </item>
    
    <item>
      <title>阅读书单</title>
      <link>https://www.printlove.cn/books/</link>
      <pubDate>Wed, 02 Apr 2025 18:17:07 +0800</pubDate>
      
      <guid>https://www.printlove.cn/books/</guid>
      <description>使用 Obsidian&#43;Enveloope&#43;Dataview自动发布的个人阅读书单</description>
    </item>
    
    <item>
      <title>跑步我终于捡起来了</title>
      <link>https://www.printlove.cn/start-running/</link>
      <pubDate>Fri, 03 Jan 2025 15:41:45 +0800</pubDate>
      
      <guid>https://www.printlove.cn/start-running/</guid>
      <description>怎么开始的 2020 年，我与女朋友相识相爱，那时候她还在上大学，而她日常就有跑步的好习惯，可能我为了在我俩相识期间显示一下男人的气概，所以我也开始跑步了。
但是跑步没多久，我受伤了，后面重新认真跑步就到了 2024 年 3 月，因为女朋友给买了佳明手表。
受伤小故事： 刚开始我跑步啥也不懂，什么步频、步幅、配速，统统都不懂，只是拿着 Keep 围着一栋楼一直绕圈圈，一圈我估计也就几十米吧，最多一次能跑 11km（不知道能绕多少圈，我一直听着歌也没有觉得无聊）。
经过我这一顿操作，结果呢？受伤！！！去医院检查的结果就是积液、半月板磨损，医生给的建议就是休息和吃氨糖。
可从 2020 年受伤一直到 2024 年期间，我一直休息的很充分，也有过很长时间吃氨糖，稍微感觉差不多吧，就试试跑一跑，但膝盖还是不舒服，严重的话人都会跛着走。
2024 年，我回头复盘这次受伤，明白了原因：绕圈太多，造成一侧膝盖太大，不受伤才怪。
怎么坚持 如果问我具体是什么原因坚持的，那我确实说不明白，而是一个多个方面都影响的，主要三个方面：
手表：没数据那不白跑了，哈哈哈 应对枯燥：难免会出现不想跑的时候 避免受伤：只有健康的身体才能跑的长远 手表 刚开始的我坚持是得益于手表推荐的科学训练，而后面的坚持是想要一个健康的身体。
另外插播，女朋友为啥能保持规律的跑步了呢？主要是因为索康尼坦途的新鞋，解决了她足外翻的问题，所以装备还是很重要的。
应对枯燥 有个跑步搭子，我的搭子就是女朋友。
而个人习惯方面我是不带耳机的，因为现在还不觉得枯燥，但是以后确实有担心枯燥。倘若家附近的地方跑的多了，而且时间太长，那我可能会考虑带个耳机听听播客，如果能顺便练习英语听力那就更好了。
安全提醒：如果戴耳机，要么是完全封闭的路，没有车辆，要么就是一定要都听到外界的声音
到了周末时间比较充足了，那我一定会选一个风景好的跑长距离，我也搜集了我所在地方的热门路线去打卡（可有成就感了）。
避免受伤 2024 年的我才明白，有时候受的严重伤不能只通过休息恢复，这也是很多医生给的错误引导。
如果想避免受伤，或者恢复跑步，一定要注意以下几点：
落脚点要在身体正下方：这个自己跑的时候体会别有伸腿的感觉，脚迈出去自然落地，如果注意的比较好的话，可能就会带来较高的步频，一般建议最少 180 以上，可以通过听对应频率的音乐训练 循序渐进：从 1km 开始，一点点增加，为了控制自己每次的跑量，女朋友还专门给我买了佳明手表，我跟着佳明手表中提供的 5km 跑步课表来跑 拍跑姿照片：拍下自己的跑姿，看看有没有什么大问题，例如我的主要问题就是足外翻 跑鞋：找到自己的问题，选择合适的跑鞋，例如我的问题是扁平足和足外翻，这都是选择支撑性好的鞋纠正 力量训练：为了防止受伤，或者纠正自己目前发现的跑姿问题，力量训练都是很有必要的 自我感知：随着自己的跑步量增多，一定会遇到这不舒服那不舒服，要自己感受严不严重，或者先通过休息看会不会好一些，也可以借助“懂伤帝”小程序中的损伤自查功能查看原因 热身和拉伸：热身我主要解决跑不起来不那么痛苦，有时候我也会忽略，通过慢跑应对，而拉伸一定要做，静态拉伸跑后基本都会做，而泡沫轴一般是 LSD 之后再放松放松肌肉，使肌肉能得到一个很好的放松 如果发现不舒服了，就及时降低跑步难度或者取消跑步，一定不能逞能，毕竟我可是想着一辈子跑下去。
跑之后的变化 减肥：减轻 20 斤，刚开始比较注意晚上少吃点，而现在到了 120 斤后，吃饭就无所谓了，体重也继续维持在了 120 斤 旅游：通过跑步的借口，让我更愿意尝试去远点的地方旅游（其实远地方还没去，先想想），如果在外订酒店了，可以考虑选择适合跑步的就近位置 了解周边：因为基本在家附近跑步，所以家附近哪块有个小路、哪块有好看的风景等等，都让我更了解 我的装备 如果你问我只留下一样装备，你最想留哪个？我的答案是手表，哈哈哈，没想到吧！
毕竟因为买了手表我才进行了科学训练，这就感觉多了个私人教练一样，而其它装备也是我认真之后才开始陆陆续续买的。
列表：
手表（必带）：佳明 255 不带音乐版本，后续如果听歌可以选择带内存的耳机，这样手表也省电 跑鞋（必穿） 索康妮坦途 1 代日光色：想 pb 或者长距离 LSD 使用 361Spire S 2.</description>
    </item>
    
    <item>
      <title>解决：两步路路线不能分享到佳明手表</title>
      <link>https://www.printlove.cn/1714023209/</link>
      <pubDate>Thu, 25 Apr 2024 13:33:29 +0800</pubDate>
      
      <guid>https://www.printlove.cn/1714023209/</guid>
      <description>我的手表是佳明 255 国内版本。
问题 两步路的路线保存到 connect 手机端时如果什么都不修改就可以分享到手表，一旦改了信息，即使是标题，都会造成无法分享到手表的情况。 原因 认真思考的猜测，不一定完全正确。
因为当修改了路线信息时，国内的版本就会把路线当成 GCJP2 坐标对待，因此就需要手表也要支持，但支持的设备是这些“Edge530/830/1030/Fenix5Plus/Fenix6/Forerunner945/MARQ系列等机型1”, 应该就是支持内置中国离线地图的设备类型。
而我的佳明手表 255 系列就不支持。
解决办法 导入路线的时候记着点击“重新定位路线”再保存，这一步的意思是讲当前的路线转为 GCJP2 坐标，这样会导致整个路线会偏移，后面会再调整过来。 重新定位路线 这时候你可以随意编辑这个路线 等所有的信息修改好了之后，需要打开 connect 网页端，选择地图匹配，这样会将 GCJP2 坐标转为国际通用的坐标 地图匹配 下来在 connect 手机端试试，应该就可以分享到手表了 https://support.garmin.com/zh-CN/?faq=KaVurf1bW49GjnsTso5TP8&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
    </item>
    
    <item>
      <title>开始折腾 Vim, 怎么学？</title>
      <link>https://www.printlove.cn/vim-study/</link>
      <pubDate>Mon, 04 Mar 2024 12:00:03 +0800</pubDate>
      
      <guid>https://www.printlove.cn/vim-study/</guid>
      <description>Vim 从我知道开始最少八年了，而一直知道的命令数量反正不超过手指头。反正还到不了我用它写代码的地步，只是偶尔在 Linux 上改改文件。
今天突然想开始系统学习学习，我估摸的原因：
我进入这个行业时间久，接触到很多人也在学习，感觉自己不学的话，有点不好意思 我用过的很多编辑器都集成了 Vim，例如 vscode、obsidian，感受操作的统一性 想感受下学会了 Vim 是如何提高效率的 怎么学 按照下面的资料顺序学习就行。
视频 Vim 学起来还是挺枯燥的，我还是觉得先看看好点的视频讲解。
我推荐这个 Vscode + Vim 怎么搭配使用的讲解，当然重头还是讲 Vim 怎么使用。
vimtutor 适合刚开始接触入门。
有 Vim 工具，就一定会配套一个 vimtutor 命令，这是官方的 Vim 文档，也支持中文。
使用该工具的好处是，边看文档变练习。
命令行运行：
vimtutor 如果打开的内容不是中文的，可以运行：
vimtutor zh 更进一步 上面的学完了，如果还想更系统的再学习学习，推荐下面资料。
《Vim实用技巧》这本书等上面学完了，可以通过这本书再巩固学习，而且也确实写的好，对于提高Vim 的使用速度很有帮助。 《Learn Vimscript the Hard Way》：想写 Vim 插件，可以看看。 VimGolf ：通过挑战，类似玩游戏的方式学习 Vim，可以看别人针对某个目标是如何实现的，你也可以提交自己实现的结果，像做题一样，有打分机制。 Golang 开发环境 如果你想纯 Shell 端开发环境，推荐看这篇文章：如何配置 Vim 的 Golang 开发环境。
总结 假如你像我一样，平时都在 IDE 开发项目，那基本都会支持 Vim 的。
先学会 Vim 的各种键位，看是否自己能坚持下来，或者明确自己是否喜欢，当过这个都坚持不下来，那确实不适合你。</description>
    </item>
    
    <item>
      <title>周报 #02 - 跑步、写作、演唱会、身高</title>
      <link>https://www.printlove.cn/1708851469/</link>
      <pubDate>Sun, 25 Feb 2024 16:57:49 +0800</pubDate>
      
      <guid>https://www.printlove.cn/1708851469/</guid>
      <description>记录时间 2024-02-18 至 2024-02-25，这周在公司到了下午专注力就不够了，很容易疲惫。
下周我可要变自律了，期待哦。
毕竟我都加入了早打卡群，每天早上 6:00-7:00 开视频学习，每周休息一天，连续 28 天就会退我加入时的 50 元。
跑步 想起来自己之前一段时间总跑步，最多一次性 10 公里，厉害吧。我可是想着要冲击马拉松的人呢，可不久之后，膝盖出现问题了。于是运动也就搁置了，直到现在也没恢复。可我还是不甘心。现在有点重新燃起希望，科学运动起来。
运动手表 看了好多佳明运动手表的各种评测，也看了很多跑步爱好者的文章，让我对于跑步更加蠢蠢欲动。可不是因为我穷，我都要买佳明 255 运动手表了。为了不想变成差生文具多，还是给自己定个目标。2024 年跑够了 100 km 之后了再买。女朋友说太少了，跑 200 km 她给我买，很期待哦。
2024-03-22 我才跑了 3km，老婆就给我买了佳明 255 运动手表作为我今年的生日礼物。
看表的运动模式，其中有爬山和徒步，这两个的区别 1：
涉及的活动 登山（Mountaineering）：徒步、攀登、滑雪 徒步（Hiking）：走路、偶尔爬 地形 登山：爬高山 徒步：山、森林、沙漠、海滩、乡村 目的地 登山：山顶 徒步：目标不重要，主要是过程，可以到顶也可以不用 装备 登山：冰爪、冰斧、绳索、滑雪设备、露营装备 徒步：一副适合的鞋子就能达到目标 看下来就是徒步对我就够了。 有氧和无氧运动区别 之前老听说，这次我一定要弄懂，具体如下 2：
有氧运动就是身体使用氧气去消耗身体中的燃料，这个过程会提供运动的能量会比较慢，如果提供不足就会变成无氧运动 有氧运动消耗糖、脂肪、蛋白质，无氧消耗的是糖分 例如：游泳、慢跑都属于有运动，举重、快跑属于无氧运动 没有明确的分界线去区分有氧还是无氧，只能确定以哪个为主 所以我下来想跑步也不能只跑步，要结合无氧运动，过多的有氧运动可能会让人太瘦，甚至会显老。
读书 为了科学运动，我可要认真了，所以看了这本 《跑步，該怎麼跑？》 (豆瓣)。
目前我只看到了第 24 章，但也大概知道了什么才是好的跑步姿势。
简单识别，去听，好的跑者脚落地的声音会很小，所以在看别人跑步时可以观察下。 跑步姿势中有三个关键点需要注意。
第一，跳起来的脚落地时，头、肩膀、臀部、前脚掌 (跖球部) 都要在一条线上。 落地姿势 第二，跳起来脚落地时一定要落在前脚掌 (跖球部) 。 落地的前脚掌位置 第三，要借助身体往前倾斜的重力来提供跑步前进的动力，一切为了省力而跑，看下图错误姿势。 三不做 对应图中三处不应该做的：</description>
    </item>
    
    <item>
      <title>2024 年西安春节安排</title>
      <link>https://www.printlove.cn/2024-new-year/</link>
      <pubDate>Mon, 19 Feb 2024 15:40:15 +0800</pubDate>
      
      <guid>https://www.printlove.cn/2024-new-year/</guid>
      <description>第一次见女朋友爸妈，而且还是来我这边 (西安) 旅游，所以我一定要安排妥当，紧张的一批。
时间只有三天：2024-02-15（初六） 至 2024-02-17（初八）。
在见之前我想应该要准备好礼物迎接，想的是给女朋友爸爸买手机，妈妈买项链，但女朋友和妈妈沟通了下说不是正式见面，只是单纯旅游，别准备这些。
于是，就给妈妈准备好鲜花，然后一人一杯奶茶（最后女朋友贤惠的也没让我做这些了）。
景点 大雁塔 (02-15 下午) 大雁塔的演出因为过年的原因时间安排总是会调整，之前演出是在晚上，现在都放在白天了。 演出时间表 城墙 (02-15 下午晚上) 计划从永宁门（南门）上，以次为准。 灯会：
灯展活动日期：02 月 02 日 - 03 月 24 日，总共 52 天 城墙开放时间：08:00 - 22:00 购票：仅线上（&amp;quot; 西安城墙景区 &amp;quot; 小程序）提前 7 天预约购票 价格：100/人，学生 50 /人 灯会主题（灯火暖长安 龙启中国年）演出时间：9:30 - 17:30，因此线上预约最晚应该选择 16:00 - 18:00。
注意：中间还计划买城墙年卡 60 元，然后再补差价呢，但联系了客服说初一至十五不能用年卡 官方通告
钟楼 - 回民街（02-16 晚上） 钟楼就在外面看看拍拍照，然后再走到回民街。
回民街附近街道 回民街历史由来： 西安回民街是西安著名的美食文化街区，是西安小吃街区。回民街所在北院门，为清代官署区，因陕西巡抚衙门在鼓楼之北，故名北院。1990 年代末，部分回民在此街租房经营餐饮，莲湖区遂改向餐饮街方向，北院门遂成为回民街。
根据 网友推荐，在 “北广济街、西羊市、大皮院、洒金桥” 转悠，还有美食店铺：
花奶奶酸梅汤 定家小酥肉 盛志望麻酱酿皮铺 一真楼 刘信牛羊肉泡馍小炒 老李家杂肝汤 白翔甜食店 胖子甄糕 杨天玉腊牛羊肉店 老金家蛋菜夹馍 李唯一肉丸糊辣汤 志亮灌汤蒸饺 刘纪孝腊牛羊肉店 贾三灌汤包子 石家包子 德发长 陕拾叁 朱秀英梆梆肉葫芦头 大唐芙蓉园（02-16 晚上） 门票一人 120 元，我看票很充足，那就看时间情况就去。</description>
    </item>
    
    <item>
      <title>周报 #1 - 过年、Obsidian插件、记录生活、二手书</title>
      <link>https://www.printlove.cn/weekly-01/</link>
      <pubDate>Sun, 11 Feb 2024 22:04:50 +0800</pubDate>
      
      <guid>https://www.printlove.cn/weekly-01/</guid>
      <description>记录时间 2024-02-05 至 2024-02-11，一切平平淡淡。 女朋友家的口袋 过年 今年我爸妈都来城里了，也是我几十年以来第一次在城里过年。
我感觉过年很无聊，没意思，当然这种感受也是从小到大都有的，因为从来没有什么印象让我喜欢过年。我不知道过年我应该做些什么，走亲戚吧，就是在别人家耗费时间到回家。
听见的烟花炮声也没有像我女朋友那样的感动，我只感觉挺吵的。
希望明年有女朋友在我身边吧，当然不管是在我家还是她家都行，感觉只有她在，我的生活会变得亮堂起来。
赚钱 这篇《在折腾的时候发现了一个程序员月入过万的副业 - 李迷糊》文章作者给了我启发，要善于分享自己的专业技能，并去思考如何去解决小白的需求，例如我折腾的工具：hugo 搭网站、docker 使用等等，对于那些非程序员的人就很有需要。所以还是要多思考自己的技能是不是很多小白用户会出现大量的问题。
这是同样作者的另一篇文章 《课程cps分销，小赚70万元的里程碑项目复盘 - 李迷糊》，真的感慨作者的行动力和商业洞察力。让我在分享时也多了再思考思考，我分享的东西有分销的功能吗，我能赚点小钱吗？毕竟这都是顺便的事情，何乐不为呢。
总结，别埋头只是倒腾技术，多跳出程序员的思维。
避孕 一种避孕贴的形式，很好奇，当然想试也不敢呀，哈哈哈。 通过这篇文章了解到：
避孕贴品牌：Evar 世界上第一款以避孕贴形式出现的避孕方式 避孕原理 荷尔蒙透过皮肤释放到血液 抑制卵子的产生 使女性的子宫颈黏液变厚 优点 避孕率特别高，大于避孕套和子宫环 使经期规律、减少经量、缩短经期、减少经痛 减少女性患盘腔炎，纤维瘤的风险 减少患上良心乳房疾病卵巢癌和子宫癌的风险 缺点 不能预防性疾病传播 可能有的人会产生皮肤过敏，作者贴创可贴过敏的人，但贴这个却没有 需要点适应期，可能会产生乳房胀痛，头疼，经痛 吸烟者不能使用 体重超过 90kg 的人不能使用 有高血压，心肌梗塞，冠状动脉疾病等患者不能使用 欧美使用该避孕贴比较普及 使用方法 每星期贴一次，连续三星期，第四星期不用贴，以此循环下去 女生使用 具体贴在哪，文章中没有说 这个真不真我就不知道了，我还搜了搜小红书，也确实有很多人在用，我就好奇心了解下，先到此为止。
外面的世界 向往外面世界在心中出现了萌芽，向往这国外工作生活的 Balance，也向往那份安心的自由。
勃艮第 2023 年第一次知道勃艮第这个地方是通过一个桌游，它也“叫勃艮第城堡”。
这次通过这篇 X文 看到了勃艮第这地方还挺美。 X友截图 芬兰 这是女朋友 分享的一篇 一位妈妈带着自己丈夫和孩子从中国前往荷兰后的感受记录。
做出这个决定的主要原因还是为了自己小孩的教育，不想让小孩和自己一样成为一个看的见未来的人。
记录的好处 受 Pseudoyu 作者的影响，我也开始了写周报 这周开始看《笔记的方法》这本书，也影响我多写点生活的内容，别只知道写技术，毕竟生活才是自己独有的东西。 卖二手书 第一次在网上卖二手书，选择了“多抓鱼”这个平台，这个也是在 Twitter 上看见了好几次别人在说。</description>
    </item>
    
    <item>
      <title>提高网站图片加载速度</title>
      <link>https://www.printlove.cn/opt-image/</link>
      <pubDate>Thu, 25 Jan 2024 18:23:45 +0800</pubDate>
      
      <guid>https://www.printlove.cn/opt-image/</guid>
      <description>我的网站图片总是加载很慢，实在忍不了，之前还使用 PageSpeed Insights 工具检测时 70、80 多分的样子，现在 90 多分了，暂时已经满足了。 图片占位符 我的这个需求比较简单，刷文章封面的时候，在等图片还没出来前不要白花花一片就行，因此在图片的容器加了个背景色。
.entry-cover { background-color: var(--content); /* 图片圆角加下面两句，不能直接给图片加，不然背景色会漏出来*/ border-radius: var(--radius); overflow: hidden; } 如果你想根据图片的尺寸显示对应大小的占位，推荐其它朋友写的 这篇。
CDN jsdelivr 提供免费的 CDN，用于给 Github 上的图片提速。 配置：
https://cdn.jsdelivr.net/gh/用户名/仓库名@版本号/文件路径 @版本号 可自定义，省略的话表示使用最新的图片。
不过我准备使用前，刷到过说 jsdelivr 有过崩的情况，所以就不敢贸然动手。 于是保险起见我改了 Hugo 模板增加了配置，方便有问题时关闭：
params: ImageCDN: &amp;#34;https://cdn.jsdelivr.net/gh/miaogaolin/workspace-obsidian-publisher/static&amp;#34; 修改模板（我使用的是 PaperMod 主题）。
先创建 layouts/partials/image_cdn.html，粘贴内容：
{{ $imgDest := . }} {{- with site.Params.ImageCDN }} &amp;lt;!-- 文件不以 http 开头 --&amp;gt; {{ if not (hasPrefix $imgDest &amp;#34;http&amp;#34;) }} &amp;lt;!-- ImageCDN + /path/image.</description>
    </item>
    
    <item>
      <title>Enveloppe 插件适配 Hugo 的配置</title>
      <link>https://www.printlove.cn/github-publisher-hugo/</link>
      <pubDate>Sun, 14 Jan 2024 18:14:22 +0800</pubDate>
      
      <guid>https://www.printlove.cn/github-publisher-hugo/</guid>
      <description>2025-04-02 更新了 Text Replacer 配置中箭头上下的含义
先写了 使用 Obsidian 免费建个人博客 这篇文章，但是发现枯燥的讲解这个插件的配置不适合初学者，所以索性在这篇文章中统一整理下，对于想更深入了解的人可以选择性看看这篇。
本文基于 Obsidian 的 Enveloppe 插件，版本：v6.15.7，版本不同可能略有差异，如果差异影响使用了，我就会更新该篇文章，及时收到通知可以关注我的频道。
下面我会对重要的配置进行讲解，如果你暂时不想看了，可以使用我提供的默认配置。
File paths Property key 可以通过文章的属性设置上传的目录，例如我这配置：
通过 dir 属性获取上传的目录，最终的上传路径为 Root folder / Property key，即 content/{dir} 如果 dir 属性没有设置则默认上传到 Default folder 目录下，即 content/posts Content Text replacer 每行后面都有个箭头，↓箭头表示插件应用其它配置之前替换，↑箭头表示之后替换。
[[Wikilinks]] 转 [MDlinks](links) 开启 Content -&amp;gt; [[Wikilinks]] 转 [MDlinks](links) 菜单。
图片 在 Obsidian 中引用本地图片链接时是不需要路径的，而在 Hugo 中一般会把图片统一放在 /static/images 目录下。
因此在 Hugo 文章的引用方式路径为 /images/图片名称。
我图片在本地存储的，如果你有图床那这个配置也没那么重要
现在要做的就是给 Obsidian 的本地图片路径增加 /images 前缀，使用到了 Text replacer 正则。</description>
    </item>
    
    <item>
      <title>冬天我们三爬华山去喽</title>
      <link>https://www.printlove.cn/huashan/</link>
      <pubDate>Sat, 13 Jan 2024 12:09:04 +0800</pubDate>
      
      <guid>https://www.printlove.cn/huashan/</guid>
      <description>1 月 4 号我有那么一点厌倦上班，再加上本来也计划最近去爬华山，就做攻略第二天爬上去。
感动小插曲：媳妇出去玩现在就只想我俩的二人世界，这次却想问问我妈去不，我问为啥：她说咋俩还有很多机会，但妈妈可能没什么机会了。
2023 年做好的攻略因为人多最后取消了，2024 年 1 月 5 号重启计划。 这次带着我媳妇和我妈一块，刚开始担心我妈身体吃不消，毕竟她的腿之前痛过，可真的去了，真是厉害呀，我和我媳妇都是一直走在我妈的后面。
我妈从小是在山里长大的，当时条件艰苦，上山务农、放羊、爬山等都是经常操作，而且最近还给别人摘苹果，身体素质杠杠的。
路线图 这次选择北上西下，之前的规划 是西上北下。 从早上开始北上，会累点但风景会更好点，西下下山更舒服。 北上西下路线图 物资 水：总共拿了 5 瓶水，可能冬天原因吧，也就喝了 3 瓶水 巧克力 橘子 饼干🍪 三桶泡面：没吃，山顶没找到 5 块的热水，找到了 11 块的，也没那么饿，就在回去的高铁上吃了 手套三双 时间线 按照北上西下过程总结下，光顾着两天腿不停切换了，具体多久达到华山的某个峰没有详细记录 。
周五，天气晴，不过还有点雾霾。
高铁 1 月 5 号，7:52 发车， 8:20 到华山北。
免费公交，坐到华山游客中心，出了高铁左转过马路，一定记住进客运站坐免费公交，1，2 号免费，但 1 号到华山游客中心是一条直线，大概 13 分钟到，2 号会有点绕路大概 20 多分钟到吧。
如果赶时间的话，也可以坐出租车，2、3 个人也就 15 - 20 块。
去北峰缆车大巴车，如果网上购买了直接刷身份证上车。 刚进山的时候看见阳光洒在山顶上犹如金山，还是很壮观的。 北峰缆车处 下了缆车，继续前往了北峰（没多停留）、东峰，马上到东峰的路上看见挑水师傅一步一个台阶的挑水，而且是往山下 走，这应该很伤膝盖。 挑水的大爷 还看见了 700 多年的树，还好奇为啥这样把树围起来，媳妇想了下，可能是为了防止“到此一游”吧，我回应：“有道理，真聪明啊”，哈哈哈。 700多年的树 爬了这个九十度的梯子，就这样嘛，没啥难度么。媳妇试了试放弃了，放弃也挺好的，这可是掉下来过人的地方呢。 媳妇就选择了旁边的楼梯，我和我妈蹭一下就上去。 勇敢的我 东峰接着没有停留，前往了南峰，路过了鹞子翻身、长空栈道，我们三人都没玩，有个伴我就去了，哈哈哈。</description>
    </item>
    
    <item>
      <title>赞助</title>
      <link>https://www.printlove.cn/sponsor/</link>
      <pubDate>Wed, 27 Dec 2023 14:38:19 +0800</pubDate>
      
      <guid>https://www.printlove.cn/sponsor/</guid>
      <description>非常感谢每一个赞助者，不管赞助多少，都让我一点点明白我的创造与分享真的有用，也更加给予了我坚持的动力。
微信扫码 如果遇到了什么问题，可以通过最下方的方式联系我，我很乐意和每一位朋友的沟通。
感谢 赞助人 时间 人民币 说点啥 漂流到岸 2024-11-09 3.5 没想到还是上一位朋友，谢谢你。看了你的网站 kiss1314.top，弄得真挺不错，咱都继续加油！ 漂流到岸 2024-07-04 1 时间过得好快，我已经离开大学好久了，也希望你度过一个开心的大学时光 - 2024-06-12 10 太客气了，这位朋友留言“感谢您”，没必要，说“感谢你”就行 - 2024-04-08 10 看不到这位朋友的昵称，谢谢啦，我都没处感谢去了，哈哈哈，下次希望能看到你的昵称 点半 2024-03-08 15 我以为 《Obsidian搭网站》 没啥人看了呢（邮箱也就看的不频繁了，抱歉），没想到还能帮助到这位朋友，我很开心 爱放屁的大豆 2024-02-12 200 我一点不相信谁能给我赞助这么多，所以立马想到了女朋友，也是这个时候她才告诉我上次也是她赞助的，真能忍 爱放屁的大豆 2024-01-12 5 女朋友偷摸给我赞助，藏了好久才给我说了 叉子 2024-01-09 20 第一位赞助我的人，写文章的动力一下满满的 </description>
    </item>
    
    <item>
      <title>PaperMod 主题引用“霞鹜文楷”字体</title>
      <link>https://www.printlove.cn/lxgw-font/</link>
      <pubDate>Wed, 20 Dec 2023 15:39:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/lxgw-font/</guid>
      <description>有两种方法，一种是 下载字体 并上传到自己的项目中引用，一种是使用现成的 CDN 引用，我直接选择了 CDN 方式。
下来替换主题的默认模板和样式，进入 Hugo 内容管理的仓库根目录：
新建模板 layouts/partials/extend_head.html，设置内容： &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;https://cdn.staticfile.org/lxgw-wenkai-screen-webfont/1.7.0/style.css&amp;#34; media=&amp;#34;print&amp;#34; onload=&amp;#34;this.media=&amp;#39;all&amp;#39;&amp;#34;&amp;gt; 这是七牛云的 CDN，更多的引用方式可以看看这个项目：chawyehsu/lxgw-wenkai-webfont
全局引用字体，新建 assets/css/extended/fonts.css，设置内容： body, .post-content code { font-family: &amp;#34;LXGW WenKai Screen&amp;#34;, &amp;#34;Roboto&amp;#34;, &amp;#34;PingFang SC&amp;#34;, &amp;#34;Microsoft Yahei&amp;#34;, sans-serif; } 设置完成，不过再扩展下里面涉及到的知识点：
异步加载 CSS，设置 link 标签属性 media=&amp;quot;print&amp;quot; 在打印的时候加载该引用 onload=&amp;quot;this.media=&#39;all&#39;&amp;quot; 等页面加载完后在将 media 设置回去，即默认，这就会开始应用该 css media 属性的详细用法请看：media types 在该 cdn 引用的 css 文件中，会有这么一个设置： @font-face { font-display: swap; } font-display 表示加载 font-family 后面字体的规则：
swap 如果想使用的字体没有，则直接使用备用字体，等字体下载完成再交换渲染 auto 这是默认，一般会先文本空白等字体下载</description>
    </item>
    
    <item>
      <title>关于我</title>
      <link>https://www.printlove.cn/about/</link>
      <pubDate>Tue, 19 Dec 2023 13:48:03 +0800</pubDate>
      
      <guid>https://www.printlove.cn/about/</guid>
      <description>博客的死掉不是停止更新，而是无法访问 —— Randy Lu
因为这句话，让我重新认识写博客的态度，为的不是马不停蹄，而是 “我一直在”。
你好，I&#39;m Evan Miao，之前的博客也称呼过老苗、潇洒哥老苗，希望我的创作给来这里的朋友带来一丝丝的帮助。
联系我 Twitter / X: @laomiao_ Email: mglluoye@gmail.com 每篇文章最后也贴有，方便交流。 Telegram Channel: Evan&#39;s Share, 创建时间：2024-01-15。有些文章后期会经常更新，为了让需要的人能及时收到消息，才有了该频道。
我的 “尸体” 以前在很多平台写文章时都坚持过一段时间，回头去看看这些还有一丢丢的失落，把这些遗忘的地方再这留个标记。
潇洒哥老苗 - learnku 老苗 - 简书 反重力落叶 - CSDN 公众号：苗木青，之前叫 “潇洒哥和黑大帅”，希望什么时候重新开始 潇洒哥老苗 - 知乎 网站来源 为啥网站名称叫 printlove？
之前由女朋友提议一块弄个公众号写文章吧，那创建公众号时就要取一个 ID。为了表现两人的爱意，我想一定要有 Love 的出现，试了好多 ID 都重名，最后我灵机一动直接直译“输出我们的爱”，对应英文 PrintOurLove（真不会取名字），Print 在程序里也经常有打印输出的意思，也有点沾边我程序员身份。
那到了网站域名上，为了简化微信的 ID，也可能是微信 ID 取名 PrintLove 出现重名，反正总之网站就叫 PrintLove 这个名字了。</description>
    </item>
    
    <item>
      <title>在农村混着也挺好</title>
      <link>https://www.printlove.cn/1702954489/</link>
      <pubDate>Mon, 18 Dec 2023 16:36:49 +0800</pubDate>
      
      <guid>https://www.printlove.cn/1702954489/</guid>
      <description>因为要考试了，回老家农村待着。
这几天我感觉非常舒服，太阳温暖，花儿美丽，菜园丰盛，妈妈可爱……一切都这么惬意，节奏缓慢。
刚回家的时候，爸爸就在亲戚那里拉了半头粮食猪回家，肉很香捏，煮好切成肉片居然还会有五彩的光芒（表示新鲜）。妈妈用这肉做了腊肉香肠，这个味道哪里也买不到。
没几天，我的生日到了，少不了出去嗨一顿的。吃完青花椒鱼我们就去一个广场逛街了，里面很多摊贩，人最多的地方是买圈套大鹅的地方。我爸爸没到之前看见别人牵着套到的几只鹅回家，跃跃欲试，到了之后观察了半天，觉得几率太小，遂放弃。即使我撺掇了好几次也没有用，老汉儿还是理智人物呢哈哈哈哈哈！
好喜欢这样的日子呀，见惯了城市的高楼大厦，还是爱着农村的小青瓦房。</description>
    </item>
    
    <item>
      <title>Skinny Sim 卡官方尝试购买</title>
      <link>https://www.printlove.cn/skinny-sim/</link>
      <pubDate>Mon, 04 Dec 2023 18:12:00 +0800</pubDate>
      
      <guid>https://www.printlove.cn/skinny-sim/</guid>
      <description>这是新西兰的 Sim 卡，简单总结下我遇到的购买渠道：
KakaSkinny ✨: 150 元，太贵了，先不考虑 官网邮寄：2 NZD$ v2ex.com：有人分享购买，大约 70 元 官网邮寄 如果你想看官方如何成功购买，那就不用继续看了，这只是一次没结果的尝试。
https://www.skinny.co.nz/
我使用的 ChatGPT 帮我翻译的英文地址 邮编需要查询：https://www.youbianku.com/ 成功后会看到这个：
遇到的问题 我在第一次提交订单时没有出现任何结果，邮件也没有收到，于是又重新填写提交了一下，这下有了上图的 “All Done” 也有了邮件，但是我的扣款记录出现了两条。
我通过邮件 support@skinny.co.nz 联系客服说明我的诉求，正在等结果。
歇菜 官方不支持国际邮寄，所以通过邮件告诉客服取消订单，退款。
官方邮件回复：
Please note we are unable to ship orders internationally or to P.O. boxes
我是用的是招商信用卡，支付和退款的外币都以人民币汇率计算，退款时，因为人民币贬值吧，还给我多退了一丢丢钱。</description>
    </item>
    
    <item>
      <title>第一次拿到群晖设置的东西</title>
      <link>https://www.printlove.cn/synology-new/</link>
      <pubDate>Mon, 06 Nov 2023 17:23:55 +0800</pubDate>
      
      <guid>https://www.printlove.cn/synology-new/</guid>
      <description>群晖对于刚拿到的新手，还是稍微有那么一丢丢的茫然，毕竟还不像国产 NAS 那样傻瓜。
下来我根据我使用的过程总结下必要的设置。
群晖管家 APP “群晖管家”这是第一步手机要装的东西，说明书上就会告诉你，功能：
安装群晖系统 给新手提供了手机端常用套件的下载入口 用户管理 等等 访问 NAS 后台 看看官方文档，有详细的教程：如何通过 Web Assistant 或 Synology Assistant 找到我的Synology NAS ？
我自己不知道上面的简单方式，就这样搞了，NAS 的后台我是通过浏览器 IP + 端口 来访问，默认的端口是 5000，IP 的话在自己的路由器管理设备里查看到的。
安装套件 可以理解为你想用的 APP，需要进入 NAS 后台。
Synology Photos 手机端和 Web 端都需要安装，用来方便查看自己的图片，具体功能如下：
手机端：
同步手机的照片，可以选择最新文件同步或全量同步 手机端同步后可选择删除本地设备的照片 可切换个人空间和共享空间的照片 自动识别人物，也可手动将多个人的分类合并
系统端： 系统端管理员可设置多人管理的共享目录 需要回收站功能，需要在控制面板的共享目录文件夹里开启 问题：
若有特定人物未出現於人物相簿，該如何處理？ - Synology 知識中心 如果按照这个套件太慢，可以直接在官网下载安装包，然后进行手动按照：下载中心 Synology Drive Web 端和手机端都可以安装，用来管理 NAS 中的文件，就是类似 Onedrive 的替代品。
PC 端有需求可下载客户端。
Download
Cloud Sync 仅 Web 端，将 NAS 中指定的文件和云盘进行定时同步，主要功能：</description>
    </item>
    
    <item>
      <title>从 Notion 转到 Obsidian，又回来了</title>
      <link>https://www.printlove.cn/back-notion/</link>
      <pubDate>Fri, 10 Feb 2023 12:43:25 +0800</pubDate>
      
      <guid>https://www.printlove.cn/back-notion/</guid>
      <description>2024 年我又投入到了 Obsidian 发布文章了，原因自然是找到了更流程的发布方式，详细请看 《使用 Obsidian 免费建个人博客》
为啥回来呢 主要是 Notion 模板的发布，我优化了下，可以正常使用了 我的网站，我不用依赖双链 Notion 的模板够好看 部署起来很方便 写文章足够自由省事 Notion AI 当然这只是我的选择，Notion 部署也有缺点，但我不太在乎，毕竟每个人的需求点不一样。
如何部署，看这篇： Vercel + Notion 建个人博客
为何使用 我其实一直在使用 Notion，也使用 Notion 建立起了自己的个人网站，LaoMiao.site。
所有体验都基于免费基础上，希望在免费基础上有很好的体验
该个人网站基于该项目 nextjs-notion-starter-kit，使用 Vercel 发布，但在使用中出现了如下问题：
该项目访问太慢，尤其大图片的影响 nextjs-notion-starter-kit 出现问题不能及时解决，当然自己也可以修改，但是难度比较大（是我太笨了） Vercel 页面容易出现失败，当 Notion 页面太多，Function 时间如果处理超过 10s（免费额度），就失败了 当然，使用 Notion 作为后台也有他的优点让我选择：
无感发布，在 Notion 写好的内容无感进行发布 有 Notion 作为后台，编写体验比较好 为了解决上面的问题，并延续优点，我转入了 obisdian 的怀抱，当然也有其它优点：
内容都在本地存储，没有风险 不同于 Notion 的其它体验 基于 Markdown 语法，并基于本地内容生成文章，只是还不能实现无感，但好在内容编辑体验比较好，这个问题不大 现在寻找下基于 obsidian 存在的网站模板有哪些？
Obsidian账户 使用时不需要进行登录就可以使用，笔记都存储在本地，只需要用 Onedrive 类似的工具同步即可，当然 Git 也 Ok。 那使用账户登录时，是为了得到一些付费的额外体验：</description>
    </item>
    
    <item>
      <title>自组山地车笔记</title>
      <link>https://www.printlove.cn/bike/</link>
      <pubDate>Sun, 20 Nov 2022 21:36:29 +0800</pubDate>
      
      <guid>https://www.printlove.cn/bike/</guid>
      <description>做的几个相关视频，比较粗糙
花费 包含工具总计：1993.94 人民币，详情如下表。
项目 名称 价格 类型 备注(默认淘宝) 车架 hoobike 27.5*16寸 468 零件 闲鱼全新 前叉 MOSSO 硬叉 258 零件 送花心 把横 非凡 56 零件 把立 同上 0 零件 坐管 同上 0 零件 坐管夹 景晔 16.8 零件 碗组 乐百客 44-55mm 35 零件 PDD 轮组 喜德盛英雄600 150 零件 闲鱼二手 外胎 朝阳黄边 H5224(52) 105 零件 内胎 建大27.5*1.9/2.125 （18） 31 零件 减免 5 元 刹车 禧玛诺mt200 油压碟刹 200 零件 碟片 G3 两张，同上 0 零件 曲柄 racework 中空中轴 135 零件 牙盘 hassns 正负齿 38 T 24.</description>
    </item>
    
    <item>
      <title>Golang在线工具迁入Vercel</title>
      <link>https://www.printlove.cn/tools-vercel/</link>
      <pubDate>Sun, 27 Feb 2022 13:44:53 +0800</pubDate>
      
      <guid>https://www.printlove.cn/tools-vercel/</guid>
      <description>2023/12/19 由于网站主题更换，为了使在线工具切换主题也能访问，就将 https://printlove.cn/tools/ 路径做了跳转。
不知道还有朋友在使用 https://printlove.cn/tools/ 这几个工具没，因为访问人数不多，我就给将网站停用了，真实原因是还要花钱续服务器，所以就...
在停用的几天，有 1 个朋友说挺好用的，但网站停了。为了不让这位朋友寒心，网站就重新启用了。
这次不再购买服务器，选择了 Vercel 平台管理我的网站，原因如下：
支撑 hugo 工具
支持部署 Go 代码，还支持 Node.js、Python、Ruby
免费
如果你对免费部署一个网站感兴趣，可以看看我的这篇 Vercel + Notion 建个人博客。
Hugo 部署 printlove.cn 网站内容是通过 Hugo 工具生成的，所以先解决此问题。
步骤如下：
使用 Github 登录 Vercel 平台。
导入 printlove 仓库，如果是本地代码部署，待会会讲。
配置部署
如果在开始部署时，出现了报错，那就需要指定 hugo 的版本。我的项目是遇到了，原因是 vercel 默认的版本存在 Bug。
通过设置环境变量指定版本：
Go 代码部署 完成了静态网页的部署，下来就要搞 API 接口代码。
其中除了 json 转 Go Struct 工具外，其它的工具都是使用 Go 代码实现，开始整。
在项目根目录下创建 api 目录。
在目录下创建 tool.go 文件，这个文件名称随意，内容如下：
package api import ( &amp;#34;net/http&amp;#34; ) func Tool(w http.</description>
    </item>
    
    <item>
      <title>向日葵远程连接 Ubuntu 桌面</title>
      <link>https://www.printlove.cn/notes/1705894162/</link>
      <pubDate>Fri, 28 Jan 2022 11:29:22 +0800</pubDate>
      
      <guid>https://www.printlove.cn/notes/1705894162/</guid>
      <description>如果安装后可以登录，但是马上又会断连，那就需要安装 lightdm。 下来切换桌面管理。
sudo dpkg-reconfigure lightgm-dk-greeter 切换后重启系统即可。</description>
    </item>
    
    <item>
      <title>2022 科学上网 Ubuntu &amp; CFW 实现透明代理</title>
      <link>https://www.printlove.cn/ubuntu-cfw/</link>
      <pubDate>Thu, 27 Jan 2022 15:25:26 +0800</pubDate>
      
      <guid>https://www.printlove.cn/ubuntu-cfw/</guid>
      <description>这篇文章是我折腾 3 天的结果，在这方面也是初学者，如果有问题，可以一块讨论。
目标 我家里有个不用的笔记本，所以用它来实现透明代理。
💡 透明代理：只要连接上了家里的局域网，不管是 wifi 还是连接到路由器的宽带，都可以自动的实现科学上网，无需设置什么。
准备 第一点：准备一台安装了 Ubuntu 桌面的电脑，连接上你的路由器，设置有线网络为静态 ip，如下图： 图解：
192.168.31.1 是我的路由器地址。 192.168.31.193 是我设置的 Ubuntu 的静态 ip，这个随意。 第二点：路由器需要支持 DHCP，需要后面设置 DNS 和网关，现在暂时不需要。
安装 CFW CFW 软件全称 clash for windows，看到名字不要以为只能在 windows 上安装，支持 mac/linux/windows，现在开始下载。
第一步：官方被禁了，需要在替代的仓库下载。
被下架的官方截图 第二步：解压，并进入目录运行 ./cfw ，这就运行起来了，但不能退出终端，有点不好。
💡 不要在 root 下运行，会出现 —no-sandbox 的错误，找了好久也没找到解决办法，涉及 electron 和 chrome 相关的。
加入桌面 现在讲 CFW 这个软件加入 Ubuntu 的软件中心，打开终端，新建一个 clash.desktop 文件，写入下面信息。
[Desktop Entry] Name=clash for windows Icon=/home/miaogaolin/cfw/logo.png Exec=/home/miaogaolin/cfw/cfw Type=Application 重点解释：
Exec 代表刚才执行 .</description>
    </item>
    
    <item>
      <title>Ubuntu 安装 ssh 服务</title>
      <link>https://www.printlove.cn/notes/ubuntu-ssh/</link>
      <pubDate>Thu, 27 Jan 2022 11:26:09 +0800</pubDate>
      
      <guid>https://www.printlove.cn/notes/ubuntu-ssh/</guid>
      <description>安装 sudo apt install openssh-server 安装时出现了问题：
无法解析域名 “cn.archive.ubuntu.com” 解决办法：
# 打开 $ vi /etc/resolv.conf # 修改内容 nameserver 8.8.8.8 下来就可以正常远程登录了
ssh 用户名@ip 启动 如果停止了，使用下面命令启动。
systemctl start ssh 参考 apt-get 提示 无法解析域名“cn.archive.ubuntu.com” 的解决_wuzhidefeng的博客-CSDN博客 </description>
    </item>
    
    <item>
      <title>Ubuntu 开发所有端口</title>
      <link>https://www.printlove.cn/notes/ubuntu-port/</link>
      <pubDate>Wed, 26 Jan 2022 11:10:57 +0800</pubDate>
      
      <guid>https://www.printlove.cn/notes/ubuntu-port/</guid>
      <description>指定端口 防火墙增加端口。
# 查看端口列表 sudo ufw status # 增加 sudo ufw allow 7890 # 重启 sudo ufw reload 开放所有 三步骤：
关闭 ufw 开放 iptables 所有规则 检查端口绑定的 ip 1. 关闭 ufw sudo ufw disable 2. 开放 iptables iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT F：删除所有策略链 X：删除用户定义的链 P INPUT/OUTPUT/FORWARD ：接受指定的流量 3. 检查 ip 先查看端口情况。
netstat -anp | grep 7890 结果中如果看到了 :::7890 那说明对外开放，倘若是 127.0.0.1:7890 那就只针对当前电脑开放。
这种情况就要不同情况不同解决办法。</description>
    </item>
    
    <item>
      <title>Vercel 解决静态网站接口跨域</title>
      <link>https://www.printlove.cn/vercel-cross/</link>
      <pubDate>Sun, 19 Dec 2021 21:20:31 +0800</pubDate>
      
      <guid>https://www.printlove.cn/vercel-cross/</guid>
      <description>当你的站是一个静态网站时，并且网站中有接口请求时，可能会出现跨域问题。那解决该问题的大部分的办法就是使用一个服务器做代理转发。
所以说到这就知道，还需要一个服务器，即：要花钱。那有什么办法吗？
说出来了当然有。
前提 使用 vercel 托管你的静态网站。
开始配置 1. vercel.json 在你的项目根目录创建一个 vercel.json 文件，内容如下：
{ &amp;#34;rewrites&amp;#34;: [ { &amp;#34;source&amp;#34;: &amp;#34;/notion-api/(.*)&amp;#34;, &amp;#34;destination&amp;#34;: &amp;#34;/api/proxy&amp;#34; } ] } •source：不直接请求接口地址，而是按照 source 格式的方式访问，该格式自己定义。•destination：将 source 匹配到的 url 转发到 destination 地址上。
2. destination 这个地址是在 vercel 上启动一个常驻服务生成的。
在项目根目录创建一个 api/proxy.js 路径的文件，按照这个路径要求来，该文件的内容如下：
// req：请求 // res：响应 module.exports = (req, res) =&amp;gt; { // ... } 然后在这个函数体内可以自己编写请求的转发。
看看我的写过的一个例子，用来转发 Notion API 接口。
完整例子：
const request = require(&amp;#39;request&amp;#39;); module.exports = (req, res) =&amp;gt; { // proxy middleware options let prefix = &amp;#34;/notion-api&amp;#34; if (!</description>
    </item>
    
    <item>
      <title>Vercel &#43; Notion 建个人博客</title>
      <link>https://www.printlove.cn/vercel-notion/</link>
      <pubDate>Fri, 17 Dec 2021 11:58:02 +0800</pubDate>
      
      <guid>https://www.printlove.cn/vercel-notion/</guid>
      <description>大家好，我是 “潇洒哥老苗”。
今天我带大家创建一个站，不需要购买服务器，只需要掏钱买个自己喜欢的域名即可。
涉及 Vercel：免费静态网站托管 Notion：内容后台 CloudFlare：CDN 加速 域名 nextjs-notion-starter-kit：以 Notion 为后台的网站 nextjs-notion-starter-kit 地址：https://github.com/transitive-bullshit/nextjs-notion-starter-kit
1. fork 打开该网址，然后 fork 该项目。
2. 修改项目名(可选) 如果 fork 后的项目名不喜欢，可以修改自己喜欢的。
3. 修改配置 在项目根目录打开 site.config.js 文件，点击修改，如下： 编辑文件 编辑文件
然后修改几处内容，刚开始只需要看有中文描述的几处。
module.exports = { // where it all starts -- the site&amp;#39;s root Notion page (required) // Notion 根页面的 ID rootNotionPageId: &amp;#39;c811c01b7d824f5ba966f688ee37652b&amp;#39;, // if you want to restrict pages to a single notion workspace (optional) // (this should be a Notion ID; see the docs for how to extract this) rootNotionSpaceId: null, // basic site info (required) name: &amp;#39;老苗&amp;#39;, // 站名 domain: &amp;#39;laomiao.</description>
    </item>
    
    <item>
      <title>Go基础系列：19. 单元测试</title>
      <link>https://www.printlove.cn/golang-unit-test/</link>
      <pubDate>Fri, 10 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.printlove.cn/golang-unit-test/</guid>
      <description>Go 语言中如何进行单元测试，代码覆盖率的作用及不同模式，testify 包的使用</description>
    </item>
    
    <item>
      <title>深入微服务：3. Protobuf 为啥比 JSON、XML 牛？</title>
      <link>https://www.printlove.cn/protobuf/</link>
      <pubDate>Fri, 19 Nov 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.printlove.cn/protobuf/</guid>
      <description>Protobuf 的实现原理，并说明 JSON、XML 的不同支持</description>
    </item>
    
    <item>
      <title>深入微服务：2. 研究 Protobuf 时发现一个挺好的算法 — ZigZag</title>
      <link>https://www.printlove.cn/zigzag/</link>
      <pubDate>Mon, 08 Nov 2021 17:45:01 +0800</pubDate>
      
      <guid>https://www.printlove.cn/zigzag/</guid>
      <description>Protobuf 底层使用的压缩算法，并使用 Go 语言实现</description>
    </item>
    
    <item>
      <title>深入微服务：1. 开篇 gRPC 环境&amp;启动</title>
      <link>https://www.printlove.cn/grpc-start/</link>
      <pubDate>Mon, 08 Nov 2021 16:48:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/grpc-start/</guid>
      <description>gRPC 的环境搭建及入门使用</description>
    </item>
    
    <item>
      <title>我用 Go 语言解决 Github Webhook</title>
      <link>https://www.printlove.cn/go-webhook/</link>
      <pubDate>Mon, 01 Nov 2021 17:51:00 +0800</pubDate>
      
      <guid>https://www.printlove.cn/go-webhook/</guid>
      <description>使用 webhook 工具快速完成 Github 钩子的配置</description>
    </item>
    
    <item>
      <title>Google：12 条 Golang 最佳实践</title>
      <link>https://www.printlove.cn/go-bestpractices/</link>
      <pubDate>Wed, 27 Oct 2021 11:14:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/go-bestpractices/</guid>
      <description>12 条 Golang 最佳实践，并在原文基础上增加了解读与补充</description>
    </item>
    
    <item>
      <title>快速了解 “小字端” 和 “大字端” 及 Go 语言中的使用</title>
      <link>https://www.printlove.cn/go-big-small/</link>
      <pubDate>Tue, 26 Oct 2021 11:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/go-big-small/</guid>
      <description>小字端、大字端、Go 语言中的应用</description>
    </item>
    
    <item>
      <title>Go基础系列：18. 并发</title>
      <link>https://www.printlove.cn/golang-concurrency/</link>
      <pubDate>Fri, 22 Oct 2021 10:12:00 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-concurrency/</guid>
      <description>并发与并行的区别，什么是Goroutine，什么是通道，select语句使用等等</description>
    </item>
    
    <item>
      <title>Go基础系列：17. 详解 20 个占位符</title>
      <link>https://www.printlove.cn/golang-format/</link>
      <pubDate>Thu, 30 Sep 2021 18:12:00 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-format/</guid>
      <description>Go 语言中 20 个占位符的想详细讲解，还有几个标记符号的用法</description>
    </item>
    
    <item>
      <title>Go基础系列：16. 错误与异常</title>
      <link>https://www.printlove.cn/golang-error/</link>
      <pubDate>Wed, 29 Sep 2021 10:10:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-error/</guid>
      <description>学到什么 什么是错误？ 如何创建错误？ 如何处理错误？ errors 包的使用？ 什么是异常？ 如何处理异常？ defer 关键字的作用？ recover 函数的使用？ 什么是错误 在写代码时，不是所有情况都能处理，对于不能处理的逻辑，就需要使用错误机制告诉上层调用者。
在 Go 语言中，错误是被作为一个接口类型对待，它不像其它语言一样使用 try/catch 去捕捉，只需在函数或方法之间使用一个错误类型变量去传递。
创建错误 这里所说的创建错误，实际上就是去实现错误接口，接口如下：
type error interface { Error() string } 该接口是 Go 标准包内置的，所有创建的错误类型都需要实现此接口，怎么去实现接口，不懂的看看上篇文章 Golang接口。
1. errors.New Go 语言中内置了一个处理错误的标准包，你不需要自己去实现 error 接口，它有函数帮你处理，如下：
import &amp;#34;errors&amp;#34; var ErrNotFound = errors.New(&amp;#34;not found&amp;#34;) 导入 errors 包，调用 New 函数创建了一个错误并保存到 ErrNotFound 变量，该错误信息为 not found 。
2. fmt.Errorf fmt 标准包内也有一个创建错误的函数 Errorf ，该函数可以使用占位符设置错误信息，比 errors.New 函数更灵活。
import &amp;#34;fmt&amp;#34; var ErrHuman = fmt.Errorf(&amp;#34;%s不符合我们人类要求&amp;#34;, &amp;#34;老苗&amp;#34;) 3.</description>
    </item>
    
    <item>
      <title>Go基础系列：15. 接口</title>
      <link>https://www.printlove.cn/golang-interface/</link>
      <pubDate>Sat, 18 Sep 2021 17:51:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-interface/</guid>
      <description>什么是接口？如何定义接口？如何使用接口？如何嵌入接口？接口与接口之间如何赋值？如何推断接口的实际类型？如何使用空接口？</description>
    </item>
    
    <item>
      <title>Go基础系列：14. 指针类型</title>
      <link>https://www.printlove.cn/golang-pointer/</link>
      <pubDate>Wed, 15 Sep 2021 18:24:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-pointer/</guid>
      <description>什么是指针？什么什么是指针类型？如何使用和创建指针类型变量？如何从指针变量中取值？如何传递指针？</description>
    </item>
    
    <item>
      <title>Go基础系列：13. 自定义类型和结构体 - 方法</title>
      <link>https://www.printlove.cn/golang-method/</link>
      <pubDate>Fri, 10 Sep 2021 11:30:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-method/</guid>
      <description>自定义类型和结构体如何携带方法？什么是值接收者？什么是指针接收者？等等等</description>
    </item>
    
    <item>
      <title>Go基础系列：12. 自定义类型和结构体 - 定义</title>
      <link>https://www.printlove.cn/golang-struct/</link>
      <pubDate>Tue, 07 Sep 2021 18:30:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-struct/</guid>
      <description>自定义类型、结构体定义、匿名结构体、类型别名</description>
    </item>
    
    <item>
      <title>Go基础系列：11. 包</title>
      <link>https://www.printlove.cn/golang-package/</link>
      <pubDate>Wed, 01 Sep 2021 17:35:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-package/</guid>
      <description>学习 Go 语言中包的声明、导入、使用、和包之间的加载顺序等等</description>
    </item>
    
    <item>
      <title>中国打击隐藏摄像机和秘密拍摄</title>
      <link>https://www.printlove.cn/secret-camera/</link>
      <pubDate>Fri, 20 Aug 2021 23:35:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/secret-camera/</guid>
      <description>中国打击隐藏摄像机和秘密拍摄</description>
    </item>
    
    <item>
      <title>Go基础系列：10. 函数</title>
      <link>https://www.printlove.cn/golang-func/</link>
      <pubDate>Fri, 06 Aug 2021 17:15:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-func/</guid>
      <description>一文搞懂 Go 语言中的函数，系统整理了 15 个内置函数</description>
    </item>
    
    <item>
      <title>BBC如何报道河南洪灾？</title>
      <link>https://www.printlove.cn/henan-flood/</link>
      <pubDate>Sat, 24 Jul 2021 18:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/henan-flood/</guid>
      <description>看BBC对河南洪灾的报道学英语</description>
    </item>
    
    <item>
      <title>使用了WSL2后，Docker 太慢，如何解决？</title>
      <link>https://www.printlove.cn/docker-wsl2/</link>
      <pubDate>Fri, 23 Jul 2021 10:25:45 +0800</pubDate>
      
      <guid>https://www.printlove.cn/docker-wsl2/</guid>
      <description>docker开启了WSL2，运行时太慢、Vscode 配置 WSL</description>
    </item>
    
    <item>
      <title>简单且真实有效的Docker镜像加速</title>
      <link>https://www.printlove.cn/docker-speed/</link>
      <pubDate>Wed, 21 Jul 2021 17:39:52 +0800</pubDate>
      
      <guid>https://www.printlove.cn/docker-speed/</guid>
      <description>docker镜像加速,docker加速配置</description>
    </item>
    
    <item>
      <title>Go基础系列：9. 内置集合 - map</title>
      <link>https://www.printlove.cn/golang-map/</link>
      <pubDate>Fri, 16 Jul 2021 17:21:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-map/</guid>
      <description>go语言map的创建、遍历、删除键等知识讲解</description>
    </item>
    
    <item>
      <title>Go基础系列：8. 内置集合 - 切片</title>
      <link>https://www.printlove.cn/golang-slice/</link>
      <pubDate>Thu, 15 Jul 2021 16:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-slice/</guid>
      <description>一文搞定 Go 语言切片，并对比了数组与切片的区别</description>
    </item>
    
    <item>
      <title>Go基础系列：7. 内置集合 - 数组</title>
      <link>https://www.printlove.cn/golang-array/</link>
      <pubDate>Wed, 14 Jul 2021 16:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-array/</guid>
      <description>go语言中数组的用法，go语言中通道、map、数组和切片的遍历</description>
    </item>
    
    <item>
      <title>Go基础系列：6. 流程控制</title>
      <link>https://www.printlove.cn/golang-if-for-switch/</link>
      <pubDate>Mon, 12 Jul 2021 18:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-if-for-switch/</guid>
      <description>go语言if、for、switch语句使用，break、continue、goto、fallthrough关键字使用</description>
    </item>
    
    <item>
      <title>Go基础系列：5. 常量及运算符</title>
      <link>https://www.printlove.cn/golang-const/</link>
      <pubDate>Sun, 11 Jul 2021 18:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-const/</guid>
      <description>go语言常量的使用和其它语言的不同之处，go语言的运算符优先级，go语言运算符结合性</description>
    </item>
    
    <item>
      <title>Go基础系列：4. 变量及数据类型</title>
      <link>https://www.printlove.cn/golang-var/</link>
      <pubDate>Sat, 10 Jul 2021 18:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-var/</guid>
      <description>go语言变量，go语言数据类型</description>
    </item>
    
    <item>
      <title>Go基础系列：3. 环境搭建疑惑 - gomod学习</title>
      <link>https://www.printlove.cn/gomod/</link>
      <pubDate>Fri, 09 Jul 2021 18:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/gomod/</guid>
      <description>gomod如何使用，不同配置的含义，gomod命令的作用</description>
    </item>
    
    <item>
      <title>Go基础系列：2. 环境搭建</title>
      <link>https://www.printlove.cn/golang-install/</link>
      <pubDate>Thu, 08 Jul 2021 18:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-install/</guid>
      <description>windows、linux、mac的环境搭建，编辑器goland配置</description>
    </item>
    
    <item>
      <title>Go基础系列：1. 学习前导</title>
      <link>https://www.printlove.cn/golang-start/</link>
      <pubDate>Wed, 07 Jul 2021 18:18:56 +0800</pubDate>
      
      <guid>https://www.printlove.cn/golang-start/</guid>
      <description>程序猿工作经历，掏心窝子学习Go语言</description>
    </item>
    
    <item>
      <title>“番茄工作法”你确定了解吗？</title>
      <link>https://www.printlove.cn/tomato/</link>
      <pubDate>Fri, 26 Feb 2021 11:35:00 +0800</pubDate>
      
      <guid>https://www.printlove.cn/tomato/</guid>
      <description>在看这篇文章时，你应该从其它地方都听过这种方法。但我不想像其他人一样长篇大论，从最简单的开始，动起来再根据实际情况调整。
“番茄工作法”是弗朗西斯科·西里洛自己工作（包括学习）所总结下的一套简单高效的学习方式。
简单说：每当有要学习的任务时，开启一个 25 分钟的番茄钟（时间段），在这个时间内进入好整以暇、正襟危坐的姿势，尽量不被其它事所打扰（如果打扰，文章后会说明此情况如何处理）。完成后休息 5 分钟。接着再投入下一个 25 分钟。
活动清单 将自己的工作计划、学习计划写入活动清单，这个不限制什么时候完成。如果有特殊计划的可以标注好截至日期。考虑每个计划所需的番茄钟。番茄钟是不能分割的，不存在小数番茄钟。如果小于 25 分钟，可以先标注为 0 番茄钟。
今日待办 每天早上或前一晚考虑第二天的计划，从活动清单中选择。今日待办最好想清楚，最好今日完成。把番茄钟为 0 的计划根据时间合并成完整的一个或多个番茄钟。定好今日需要的番茄钟数量。每完成 1 番茄钟，画一个×。
番茄钟中断 1. 内部中断 自己想做的其它事。比如，想玩微信、访问淘宝、打个电话，等等。为了保证工作质量，请完成后再做。在当前这个番茄钟任务后标记一下，我推荐一个撇号。如果今日要完成就写入今日计划外紧急，不着急就加入活动清单。
2. 外部中断 同事和你沟通问题，收到一个紧急电话。和他人沟通下是否可以推迟一下，等完成此次番茄钟。如果今日完成就写入今日计划外紧急，不着急就加入活动清单。在当前番茄钟任务后标记一下，我推荐减号。
3. 原子性 番茄钟是不可中断的，如果中断的，就重新启动番茄钟。因为一个番茄钟是最小单位，不可分割。
今日总结 睡觉前，总结今天的学习效率和结果。实际所用的番茄钟数和计划的番茄钟数的误差，中断次数。如何调整减少问题出现。
强调 如果真像逼自己一把，讨厌自己的学习效率底下，不能长期坚持。从现在起，使用这种方法坚持两周。如果还是不喜欢，那再选择放弃。</description>
    </item>
    
    <item>
      <title>Docker的cgroup讲解</title>
      <link>https://www.printlove.cn/docker-cgroup/</link>
      <pubDate>Thu, 14 Jan 2021 11:06:39 +0800</pubDate>
      
      <guid>https://www.printlove.cn/docker-cgroup/</guid>
      <description>最近在看一个微服务框架 github.com/tal-tech/go-zero，在 core/stat/internal 目录下学习到 cgroup 知识，本文只涉及到了我所学习到的，正文开始。
概念 cgroup ，控制组，它提供了一套机制用于控制一组特定进程对资源的使用。cgroup 绑定一个进程集合到一个或多个子系统上。官方解释
subsystem，子系统，一个通过 cgroup 提供的工具和接口来管理进程集合的模块。一个子系统就是一个典型的“资源控制器”，用来调度资源或者控制资源使用的上限。其实每种资源就是一个子系统。子系统可以是以进程为单位的任何东西，比如虚拟化子系统、内存子系统。
hierarchy，层级树，多个 cgroup 的集合，这些集合构成的树叫 hierarchy。可以认为这是一个资源树，附着在这上面的进程可以使用的资源上限必须受树上节点（cgroup）的控制。hierarchy 上的层次关系通过 cgroupfs 虚拟文件系统显示。系统允许多个 hierarchy 同时存在，每个 hierachy 包含系统中的部分或者全部进程集合。
cgroupfs 是用户管理操纵 cgroup 的主要接口：通过在 cgroupfs 文件系统中创建目录，实现 cgroup 的创建；通过向目录下的属性文件写入内容，设置 cgroup 对资源的控制；向 task 属性文件写入进程 ID，可以将进程绑定到某个 cgroup，以此达到控制进程资源使用的目的；也可以列出 cgroup 包含的进程 pid。这些操作影响的是 sysfs 关联的 hierarchy，对其它 hierarchy 没有影响。
对于 cgroup，其本身的作用只是任务跟踪。但其它系统（比如 cpusets，cpuacct），可以利用 cgroup 的这个功能实现一些新的属性，比如统计或者控制一个 cgroup 中进程可以访问的资源。举个例子，cpusets 子系统可以将进程绑定到特定的 cpu 和内存节点上。
如果未理解跳过往下看，回头再看
讲解 /proc/[pid]/cgroup 进程的 cgroup 信息，如下图：
每行的格式 hierarchy-ID:controller-list:cgroup-path，此截图中 cgroup-path 对应的容器 id /sys/fs/cgroup/ 目录 cpuacct/cpuacct.usage_percpu 每个 cpu 的使用时间，如下图：</description>
    </item>
    
    <item>
      <title>supervisor(进程管理)小白快速上手</title>
      <link>https://www.printlove.cn/supervisor/</link>
      <pubDate>Fri, 12 Jul 2019 09:58:16 +0800</pubDate>
      
      <guid>https://www.printlove.cn/supervisor/</guid>
      <description>简介 supervisor 是用 Python 开发的一个 client/server 服务，是 Linux/Unix 系统下的一个进程管理工具。可以很方便的监听、启动、停止、重启一个或多个进程。用 supervisor 管理的进程，当一个进程意外被杀死，supervisor 监听到进程死后，会自动将它重启，很方便的做到进程自动恢复的功能，不再需要自己写 shell 脚本来控制。
安装 sudo apt-get install supervisor 其它安装方式 使用 pip 工具
pip install supervisor 配置文件 生成 echo_supervisord_conf &amp;gt; /etc/supervisord.conf 配置文件加载顺序 默认在当前目录查找 supervisord.conf 配置文件
1.$CWD/supervisord.conf
2.$CWD/etc/supervisord.conf
3./etc/supervisord.conf
4./etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
5.../etc/supervisord.conf (Relative to the executable)
6.../supervisord.conf (Relative to the executable)
指定配置文件 sudo supervisord -c supervisord.conf 配置程序 增加自己的一个程序，打开 supervisord.conf 配置文件
[program:jshop] command=make run ; the program (relative uses PATH, can take args) stdout_logfile=jshop.</description>
    </item>
    
    <item>
      <title>Windows 安装 Docker 并简单使用</title>
      <link>https://www.printlove.cn/windows-docker/</link>
      <pubDate>Mon, 13 Aug 2018 10:11:21 +0800</pubDate>
      
      <guid>https://www.printlove.cn/windows-docker/</guid>
      <description>初次安装后，首先更换docker镜像地址，打开daemon.json，配置：
win10配置文件路径，~/docker/daemon.json { &amp;#34;registry-mirrors&amp;#34;: [&amp;#34;https://registry.docker-cn.com&amp;#34;] } 或者
右键点击docer运行图标，选择setting &amp;gt;&amp;gt; 右侧Daemon 1. 登录出错 win10系统 解决办法：打开防火墙
2. 查看所有镜像 docker image ls docker images 3. 查看所有容器 docker container ls -all 4. 镜像与容器的关系 镜像（Image）和容器（Container）的关系，就像是面向对象程序设计中的 类 和 实例 一样，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
5. 删除镜像和容器 docker rmi &amp;lt;镜像名|镜像ID&amp;gt; rm &amp;lt;容器名|容器ID&amp;gt; docker rm `docker ps -aq` # 删除所有容器 6. 启动与暂停容器 docker start &amp;lt;容器名|容器ID&amp;gt; docker stop &amp;lt;容器名|容器ID&amp;gt; 7. 查看容器详细信息 docker inspect &amp;lt;容器ID|容器名&amp;gt; 结果类似于json数据，可以通过| grep来过滤需要的信息
8. 运行并进去容器 docker run [--name &amp;lt;容器名&amp;gt;] -itd centos bash 如果有错误提示，有可能会在命令前加winpty</description>
    </item>
    
    <item>
      <title>git常用命令</title>
      <link>https://www.printlove.cn/git-always-use/</link>
      <pubDate>Mon, 18 Dec 2017 14:15:25 +0800</pubDate>
      
      <guid>https://www.printlove.cn/git-always-use/</guid>
      <description>1、清除暂存区和工作区记录
git reset --hard HEAD git clean -df 然后运行 git status 显示 clean 字样说明清除成功
2、当 a 分支修改的内容迁移到 b 分支
回到 a 分支修改之前（假定是当前） git reset --soft HEAD^ 查看修改的文件 git status 加入到储存区 git stash 切换到新的分支并取出修改的东西 git checkout b git stash pop 3、从线上拉去本地不存在的分支
git fetch origin [远程分支]:[本地不存在的分支] 4、从仓库中删除文件
git rm --cached 文件路径 5、合并分支
情况 1：假设当前分支是 master,将 develop 分支合并到 master 上
git merge develop 情况 2：假设当前分支是 master，将 master 分支合并到 develop 分支上
6、基于分支检出 强制创建一个基于指定的 tag 的分支。</description>
    </item>
    
    <item>
      <title>css的高级用法</title>
      <link>https://www.printlove.cn/css-plus/</link>
      <pubDate>Fri, 17 Nov 2017 11:57:08 +0800</pubDate>
      
      <guid>https://www.printlove.cn/css-plus/</guid>
      <description>模糊背景图片 (:before) 类似这样的效果
之前 之后 重点注意: 颜色的变化,之后的图片相比之前的好像更暗淡一些
&amp;lt;div class=&amp;#34;banner&amp;#34;&amp;gt;&amp;lt;/div&amp;gt; banner 放置类似上面的图片
.banner{ width: 800px; height: 400px; position: relative; background: url(图片路径) no-repeat; background-size: cover; } .banner:before{ content: &amp;#39; &amp;#39;; display: block; width: 100%; height: 100%; left: 0; top: 0; background: url(images/overlay.png); position: absolute; opacity: 0.5; } </description>
    </item>
    
    <item>
      <title>Vagrant安装与使用</title>
      <link>https://www.printlove.cn/vagrant-install/</link>
      <pubDate>Tue, 05 Sep 2017 21:17:35 +0800</pubDate>
      
      <guid>https://www.printlove.cn/vagrant-install/</guid>
      <description>安装 环境：win10
下载 virtualbox 和 vagrant，直接傻瓜式下一步安装就行:
virtualbox5.1.8 vagrant1.8.6 常用命令 序号 命令 解释 1 vagrant box list 查看目前已有的 box 2 vagrant box add [自定义名称] [box 镜像路径] 新增加一个 box 3 vagrant box remove 删除指定 box 4 vagrant init 初始化配置 vagrantfile 5 vagrant up 启动虚拟机 6 vagrant ssh ssh 登陆虚拟机 7 vagrant suspend 挂起虚拟机 8 vagrant reload 重启虚拟机 9 vagrant halt 关闭虚拟机 10 vagrant status 查看虚拟机状态 11 vagrant destroy 删除虚拟机 12 vagrant package --output xxx.</description>
    </item>
    
    <item>
      <title>Thinkphp的cron计划任务</title>
      <link>https://www.printlove.cn/thinkphp-cron/</link>
      <pubDate>Sat, 26 Aug 2017 11:14:38 +0800</pubDate>
      
      <guid>https://www.printlove.cn/thinkphp-cron/</guid>
      <description>首先明白一点，thinkphp 中的计划任务不是真正意义上的，它是使用一个文件的修改时间差来比较是否执行，并且必须依赖网站的访问才能触发脚本
在 conf 下新建两个文件并配置 tags.php 和 crons.php
配置 tag.php
return array( &amp;#39;app_end&amp;#39;=&amp;gt;array(&amp;#39;\Behavior\CronRun&amp;#39;), // 定时任务 ); 配置 crons.php
return array( &amp;#39;cron_1&amp;#39;=&amp;gt;array(&amp;#39;cron1&amp;#39;, &amp;#39;10&amp;#39;) //cron1要执行的脚本 ) cron1 默认在 ThinkPHP\Library\Cron\cron1.php 如果没有 cron 目录则新建一个,cron1.php 自己所要执行的脚本
注意：
app_end 的路径配置，\Behavior\CronRun 路径要包含 \ 否则不被认为是 Behavior 如果报错 Log::write 相关错误，则打开 ThinkPHP\Library\Behavior\CronRunBehavior.class.php 大约 55 行 \Think\Log::write(implode(&#39;&#39;,$log)); </description>
    </item>
    
    <item>
      <title>移动端滑动切换</title>
      <link>https://www.printlove.cn/mobile-swipe/</link>
      <pubDate>Wed, 30 Nov 2016 10:19:34 +0800</pubDate>
      
      <guid>https://www.printlove.cn/mobile-swipe/</guid>
      <description>预览 scss 样式 @import &amp;#39;common&amp;#39;;//初始样式，可以不需要(这是我项目需要) /*body默认铺满整个屏幕*/ body{ position: absolute; bottom: 0; top: 0; left: 0; right: 0; } #nav{ height: 2.8125rem; background-color: white; color: $gray; @include flex(center, center); .sub-item{ text-align: center; -webkit-flex: 1; flex: 1; line-height: 2.8125rem; width: 100%; height: 100%; border-bottom: none; } } .selected{ border-bottom: 0.0625rem solid $textcolor!important; color: $textcolor!important; } #main{ min-height: 100%; } html 额外了解: swiper插件
&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&amp;#34;UTF-8&amp;#34;&amp;gt; &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no&amp;#34;&amp;gt; &amp;lt;title&amp;gt;投资计划&amp;lt;/title&amp;gt; &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; type=&amp;#34;text/css&amp;#34; href=&amp;#34;css/swiper.</description>
    </item>
    
    <item>
      <title>LAMP环境搭建</title>
      <link>https://www.printlove.cn/lamp/</link>
      <pubDate>Tue, 27 Sep 2016 12:09:47 +0800</pubDate>
      
      <guid>https://www.printlove.cn/lamp/</guid>
      <description>安装 php, yum -y install php 查询是否安装了 apache rpm -qa httpd linux 当中 apache 称为 httpd
service httpd start 启动软件 httpd.conf 配置文件路径 /etc/httpd/conf/httpd.conf systemctl systemctl 命令是系统服务管理器指令，它实际上将 service 和 chkconfig 这两个命令组合到一起。
疑点解释 linux 下，源码的安装一般由 3 个步骤组成：配置（configure）、编译（make）、安装（make install）
过程中用到 configure --prefix --with；其中 --prefix 指的是安装路径，--with 指的是安装本文件所依赖的库文件
./configure 的作用是检测系统配置，生成 makefile 文件，以便你可以用 make 和 make install 来编译和安装程序。
./configure 是源代码安装的第一步，主要的作用是对即将安装的软件进行配置，检查当前的环境是否满足要安装软件的依赖关系，但并不是所有的 tar 包都是源代码的包，
你先 ls，看有没有 configure 或者 makefile 文件。
如果有 configure，就./configure，有很多参数。如果系统环境合适，就会生成 makefile，否则会报错。
如果有 makefile，就直接 make，然后 make install。</description>
    </item>
    
    <item>
      <title>(centos)svn服务器与客户端的搭建</title>
      <link>https://www.printlove.cn/centos-svn-install/</link>
      <pubDate>Mon, 19 Sep 2016 17:44:29 +0800</pubDate>
      
      <guid>https://www.printlove.cn/centos-svn-install/</guid>
      <description>1、 yum install subversion.i686
2、 创建仓库
创建版本库目录 mkdir -p /home/svndata/lvmaque_svn 创建版本库 svnadmin create /home/svndata/lvmaque_svn 结果:
3、进入 conf 目录（该 svn 版本库配置文件）
authz 文件是权限控制文件
passwd 是帐号密码文件
svnserve.conf SVN 服务配置文件
4、设置帐号密码
vi passwd
在 [users] 块中添加用户和密码，格式：帐号=密码，如 dan=dan
5、 设置权限
vi authz
在末尾添加如下代码：
[/] dan=rw ww = r 意思是版本库的根目录 dan 对其有读写权限，ww 只有读权限。
/，表示根目录及以下。根目录是 svnserve 启动时指定的，我们指定为/home/svnadmin/svndata。这样，/就是表示对全部版本库设置权限。
repos1:/，表示对版本库 1 设置权限
repos2:/occi，表示对版本库 2 中的 occi 项目设置权限
repos2:/occi/aaa,，表示对版本库 2 中的 occi 项目的 aaa 目录设置权限
6、修改 svnserve.conf 文件
vi svnserve.</description>
    </item>
    
    <item>
      <title>(windows)svn服务器与客户端的搭建</title>
      <link>https://www.printlove.cn/win-svn-install/</link>
      <pubDate>Sat, 17 Sep 2016 23:49:35 +0800</pubDate>
      
      <guid>https://www.printlove.cn/win-svn-install/</guid>
      <description>准备软件 VisualSVN_Server 服务器端
TortoiseSVN 客户端
安装过程 1） 先安装好两个软件，这个没有什么难度，就不细说了
2） 在服务器端创建一个空仓库
要建立版本库,需要右键单击左边窗口的 Repositores,如下图:
在弹出的右键菜单中选择 Create New Repository 或者新建 -&amp;gt;Repository:
进入下一步，如下图
点击【下一步】，如下图：
点击【create】，如下图：
点击【Finish】即可完成基本创建。
需要建立用户和组，并且需要分配权限 3.1 在 VisualSVN Server Manager 窗口的左侧右键单击用户组,选择 Create User 或者新建 -&amp;gt;User,如图:
点击 User 后，进入如下图：
填写 Username 和 password 后，点击 ok 按钮后，进入如下图：
点击上面的【Add】按钮后，如下图
增加 longen0707 到用户中 (如果有多个用户，操作一样)。
3.2 然后我们建立用户组,在 VisualSVN Server Manager 窗口的左侧右键单击用户组,选择 Create Group 或者新建 -&amp;gt;Group,如图:
建立组可以在分配权限给一个组分配，省去了多个用户相同权限的频繁操作
点击【Group】按钮后，进入如下图：
在弹出窗口中填写 Group name 为 Developers,然后点 Add 按钮,在弹出的窗口中选择 Developer,加入到这个组,然后点 Ok.</description>
    </item>
    
    <item>
      <title>使用css3属性处理单词的换行和断词</title>
      <link>https://www.printlove.cn/css3-word/</link>
      <pubDate>Sat, 11 Jun 2016 21:03:33 +0800</pubDate>
      
      <guid>https://www.printlove.cn/css3-word/</guid>
      <description>问题呈现 &amp;lt;div class=&amp;#34;main&amp;#34;&amp;gt; Nameofuser-definedcallbackfunctiontobecalledwheneverastreamtriggersanotification. &amp;lt;/div&amp;gt; &amp;lt;style type=&amp;#34;text/css&amp;#34;&amp;gt; .main{ width: 100px; border: 2px solid red; } &amp;lt;/style&amp;gt; 默认情况下,连续的单词如果在一行容纳不下的话会在空格和连字符处换行，那如何让它换行呢?
认识 word-break 属性 属性值 解释 normal 使用浏览器默认的换行规则 (默认) break-all 允许在单词内换行 keep-all 只能在半角空格或连字符处换行 现在大多说的浏览器默认的换行规则为半角空格和连字符,因此 normal 和 keep-all 的效果是一样的。
word-break: break-all &amp;lt;style type=&amp;#34;text/css&amp;#34;&amp;gt; .main{ width: 100px; border: 2px solid red; word-break: break-all; } &amp;lt;/style&amp;gt; word-break: break-all，打破了默认的换行规则。那如果想保留空格和连字符处换行怎么办？
认识 word-wrap 属性 属性值 解释 normal 使用浏览器默认的换行规则 (默认) break-word 长单词进行换行 下来看一下演示,我把单词内部插入了几个空格
先看默认的，以作对比。我把长单词多插入了几个空格，以便效果明显 &amp;lt;div class=&amp;#34;main&amp;#34;&amp;gt; Name of user-definedcallbackfunction to be called wheneverastreamtriggersanotification.</description>
    </item>
    
    <item>
      <title>php缓冲区与header函数之间的秘密</title>
      <link>https://www.printlove.cn/php-header/</link>
      <pubDate>Sun, 05 Jun 2016 12:42:47 +0800</pubDate>
      
      <guid>https://www.printlove.cn/php-header/</guid>
      <description>我们在实际的开发中,是否听说过在 header 之前不能有任何的实际输出。甚至有的认为 header 函数必须写在代码的最前面。可是你是否试验过 header 函数之前输出东西?下来让我们更深层次的了解一下
测试 header 之前有输出 &amp;lt;?php echo &amp;#39;hello world!&amp;#39;; header(&amp;#39;content-type: text/html;charset=utf-8;&amp;#39;); 我经过测试时可以成功的,不会出现任何错误和警告。不知道你们是怎么样的?可是我想大多说都是没有问题,如果出现了Cannot modify header information - headers already sent这样的警告,这是是说不能修改头部信息,头部信息已经发送。下来就了解一下为什么会出现两种不同结果?
缓冲区 做个比喻,就好比我们看电影时的缓存一样。它不会之间立即给我们播放出来,而是先将一部分下载好的电影放到缓存里面,再有缓存播放出来。我们编写 php 代码也是这个道理
php 的缓存机制 -output_buffering php 中的常用 ob 函数 函数 解释 ob_start 打开输出缓冲区 ob_clean 清空缓冲区 ob_get_contents 返回缓冲区内容 ob_get_clean 返回缓冲区内容,并清空 &amp;lt;?php ob_start(); echo &amp;#39;hello world!&amp;#39;; echo ob_get_contents();//输出hello world!hello world! 在 php.ini 配置文件中,修改缓冲区大小
注：一般在 233 行左右,默认是 4096 表示 4096 字节也就是 4kB。
下来将 4096 修改为 5,重新运行这段代码
&amp;lt;?php echo &amp;#39;hello world!</description>
    </item>
    
    <item>
      <title>跟我学习php数组常用函数-下篇</title>
      <link>https://www.printlove.cn/php-func-down/</link>
      <pubDate>Sun, 05 Jun 2016 00:05:03 +0800</pubDate>
      
      <guid>https://www.printlove.cn/php-func-down/</guid>
      <description>mixed array_rand ( array $input [, int $num_req = 1 ] ) 从 input 所给的数组中随机 选取一个或多个键
num_req，指明了你想取出多少个单元。如果指定的数目超过了数组里的数量将会产生一个 E_WARNING 级别的错误。 返回值,如果你只取出一个，array_rand() 返回一个随机单元的键名，否则就返回一个包含随机键名的数组。这样你就可以随机从数组中取出键名和值。 array array_replace ( array $array1 , array $array2 [, array $... ] ) array_replace() 函数使用后面数组元素相同 key 的值替换 array1 数组的值。
如果一个键存在于第一个数组同时也存在于第二个数组，它的值将被第二个数组中的值替换。 $arr1 = array(&amp;#39;hobby&amp;#39; =&amp;gt; &amp;#39;basketball&amp;#39;); $arr2 = array(&amp;#39;hobby&amp;#39; =&amp;gt; &amp;#39;football&amp;#39;); $arr = array_replace($arr1, $arr2); //$arr结果,array(&amp;#39;hobby&amp;#39; =&amp;gt; &amp;#39;football&amp;#39;); 如果一个键存在于第二个数组，但是不存在于第一个数组，则会在第一个数组中创建这个元素。 $arr1 = array(&amp;#39;hobby&amp;#39; =&amp;gt; &amp;#39;basketball&amp;#39;); $arr2 = array(&amp;#39;sex&amp;#39; =&amp;gt; &amp;#39;male&amp;#39;); $arr = array_replace($arr1, $arr2); //$arr结果,array(&amp;#39;hobby&amp;#39; =&amp;gt; &amp;#39;basketball&amp;#39;, &amp;#39;sex&amp;#39; =&amp;gt; &amp;#39;male&amp;#39;); 如果一个键仅存在于第一个数组，它将保持不变。 如果传递了多个替换数组，它们将被按顺序依次处理，后面的数组将覆盖之前的值。 是非递归的：它将第一个数组的值进行替换而不管第二个数组中是什么类型。 $arr1 = array(&amp;#39;hobby&amp;#39; =&amp;gt; array(&amp;#39;a&amp;#39; =&amp;gt; &amp;#39;football&amp;#39;, &amp;#39;b&amp;#39; =&amp;gt; &amp;#39;basketball&amp;#39;)); $arr2 = array(&amp;#39;hobby&amp;#39; =&amp;gt; array(&amp;#39;a&amp;#39; = &amp;gt; &amp;#39;ping-pong&amp;#39;)); $arr = array_replace($arr1, $arr2); //结果:array(&amp;#39;hobby&amp;#39; =&amp;gt; array(&amp;#39;a&amp;#39; = &amp;gt; &amp;#39;ping-pong&amp;#39;)); 如果是递归的,结果:array(&#39;hobby&#39; =&amp;gt; array(&#39;a&#39; =&amp;gt; &#39;ping-pong&#39;, &#39;b&#39; =&amp;gt; &#39;basketball&#39;));</description>
    </item>
    
    <item>
      <title>跟我学习php数组常用函数-上篇</title>
      <link>https://www.printlove.cn/php-func-up/</link>
      <pubDate>Fri, 03 Jun 2016 23:54:14 +0800</pubDate>
      
      <guid>https://www.printlove.cn/php-func-up/</guid>
      <description>对于 php 的初学者,也许会对它大量的函数不清楚该学习哪些。我在这列举了一些大家实际当中可能会使用到的,供您参考
array_map ( callable $callback , array $arr1 [, array $... ] ) callback(回调函数),接受一个函数
函数作用: 将 arr1 的参数顺序的传递给前面的回调函数
回调函数有参时: /*例1*/ &amp;lt;?php function cube ( $n ) { return( $n * $n * $n ); } $a = array( 1 , 2 , 3 , 4 , 5 ); $b = array_map ( &amp;#34;cube&amp;#34; , $a ); print_r ( $b ); /** 输出 Array ( [0] =&amp;gt; 1 [1] =&amp;gt; 8 [2] =&amp;gt; 27 [3] =&amp;gt; 64 [4] =&amp;gt; 125 ) **/ ?</description>
    </item>
    
    <item>
      <title>你清楚 C# 怎么使用 Python 的东西吗</title>
      <link>https://www.printlove.cn/csharp-python/</link>
      <pubDate>Thu, 02 Jun 2016 14:52:30 +0800</pubDate>
      
      <guid>https://www.printlove.cn/csharp-python/</guid>
      <description>本次实验是 vs2010 版本以下（包括 vs2010）,我记得如果是高版本的话好像已经内置了，所以比较简单
去官网下载 IronPython，它是 IronPython 是一种在 NET 和 Mono 上实现的 Python 语言
打开 vs,添加两个引用，在 IronPython 的安装根目录下面选择 IronPython.dll 和 Microsoft.Scripting.dll
using Microsoft.Scripting.Hosting; using IronPython.Hosting; //前面要导入两个名称空间 private void button1_Click(object sender, EventArgs e) { ScriptEngine pyEngine = Python.CreateEngine(); //建立python引擎 pyEngine.CreateScriptSourceFromFile(&amp;#34;demo1.py&amp;#34;).Execute(); //执行.py脚本 } 上面这个 &amp;quot;demo1.py&amp;quot; 是你的 Python 脚本文件，如果想通过上面两句执行.py 文件必须，前提是你还要导入别的模块，就必须加入在最前面写入以下代码,还有要设置脚本属性中（vs 中右键）“复制到输出目录中”这一项，选择始终复制（所有脚本一样） import sys sys.path.append(&amp;#34;C:\IronPython 2.7\Lib&amp;#34;)#看自己的Lib路径 调用 python 的方法//配置 python 的环境,另写一个脚本 demo2.py ScriptRuntime pyRuntime = Python.CreateRuntime(); dynamic obj = pyRuntime.UseFile(&amp;#34;demo2.py&amp;#34;); var a = obj.</description>
    </item>
    
    <item>
      <title>认识css3伪元素</title>
      <link>https://www.printlove.cn/css3-class/</link>
      <pubDate>Wed, 01 Jun 2016 22:10:21 +0800</pubDate>
      
      <guid>https://www.printlove.cn/css3-class/</guid>
      <description>css2 的规定为单冒号表示，而 css3 已经明确表示伪类使用单冒号，伪元素使用双冒号，本次所有测试双冒号。
提示：对于读者阅读，有的地方显得有些冗余，但是，这是为了测试没办法了，如果写的不全面或者有错误，请您提出建议。
::selection 对用户所选取的部分样式改变
浏览器支持 | IE | FireFox| Chrome |Safari|Opera|Edge|360|
| :-: |:-:|:-:|:-:|:-:|:-:|:-:|
| 支持 |支持 |支持 | 没测试 | 支持 | 支持 | 支持 |
注：IE9+、Opera、Google Chrome 以及 Safari 中支持 ::selection 选择器。
Firefox 支持替代的 ::-moz-selection。
代码示例 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&amp;#34;UTF-8&amp;#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style type=&amp;#34;text/css&amp;#34;&amp;gt; ::selection{ background-color: red; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;article&amp;gt; ::selection元素选择器的学习,如果选中显示为红色，默认为蓝色的 &amp;lt;/article&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; w3cshool,css3 ::selection
::before 在元素显示内容之前进行某些样式
###浏览器支持
| IE | FireFox| Chrome |Safari|Opera|Edge|360|</description>
    </item>
    
    <item>
      <title>这种div高度自适应确定你知道吗？</title>
      <link>https://www.printlove.cn/div-height-auto/</link>
      <pubDate>Wed, 01 Jun 2016 22:06:11 +0800</pubDate>
      
      <guid>https://www.printlove.cn/div-height-auto/</guid>
      <description>随子元素 div 高度自适应 如何下面的 child1 和 child2 浮动，parent 高度就会为 0，前提 child1 和 child2 都有高度，如果你想 parent 的高度自适应，请继续阅读
&amp;lt;body&amp;gt; &amp;lt;div class=&amp;#34;parent&amp;#34;&amp;gt; &amp;lt;div class=&amp;#34;child1&amp;#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&amp;#34;child2&amp;#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 样式省略 方法 1 .parent{ overflow:hidden; } 方法 2 会使用到伪元素：after,如果不懂请看 伪元素 .parent:after{ content: &amp;#34; &amp;#34;; height: 0; display: block; clear: both; visibility: hidden; } 根据 div 宽度的百分比调整 div 高度 假设我的 div 宽度会自动变化,但是我的高度只想设置成 div 宽度的一半,该如何实现呢?
&amp;lt;body&amp;gt; &amp;lt;div class=&amp;#34;main&amp;#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 设置 main 的高度为宽度的一半
.main:after{ display: block; content: &amp;#39; &amp;#39;; padding-top: 50%; border: 1px solid black;/*便于看出div的效果*/ } </description>
    </item>
    
    <item>
      <title>那些经常使用的 CSS3属性</title>
      <link>https://www.printlove.cn/css-property/</link>
      <pubDate>Tue, 31 May 2016 19:44:16 +0800</pubDate>
      
      <guid>https://www.printlove.cn/css-property/</guid>
      <description>1、display:flex||inline-flex display flex inline-flex 解释 将对象作为弹性伸缩盒显示 将对象作为内联块级弹性伸缩盒显示 项目中的应用 我当时写过一个因为子元素浮动让 div 自适应高度的解决办法，使用的是 css 方法解决的。div高度自适应
下面就是换用 display:flex 解决
&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&amp;#34;UTF-8&amp;#34;&amp;gt; &amp;lt;title&amp;gt;Test&amp;lt;/title&amp;gt; &amp;lt;style type=&amp;#34;text/css&amp;#34;&amp;gt; .main{ width:200px; background-color: red; display: flex;/*父div设置该属性*/ } .main&amp;gt;div{ width: 50px; height: 50px; border: 1px solid blue; box-sizing: border-box;/*这是css3属性，如果不懂，请继续往下阅读*/ /*float:left;这个属性就不需要了，会自动浮动*/ } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&amp;#34;main&amp;#34;&amp;gt; &amp;lt;div&amp;gt;1&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;2&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;3&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;4&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; display:inline-flex,如果想看到效果，将上面的 display:flex,换成 display:inline-flex,并且将 width:200px 删除。在没有测试之前，有的人可能会认为.main 会占据整个一行，但是，测试结果是，它会根据子元素所有的 div 大小自适应宽度和高度
2、属性 align-items 项目中的应用
属性值 解释 flex-start 弹性盒子元素的侧轴（纵轴）起始位置的边界紧靠住该行的侧轴起始边界 flex-end 弹性盒子元素的侧轴（纵轴）起始位置的边界紧靠住该行的侧轴结束边界 center 弹性盒子元素在该行的侧轴（纵轴）上居中放置。（如果该行的尺寸小于弹性盒子元素的尺寸，则会向两个方向溢出相同的长度 baseline 如弹性盒子元素的行内轴与侧轴为同一条，则该值与 &#39;flex-start&#39; 等效。其它情况下，该值将参与基线对齐 stretch 如果指定侧轴大小的属性值为 &#39;auto&#39;，则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸，但同时会遵照 &#39;min/max-width/height&#39; 属性的限制 再次注意:</description>
    </item>
    
    <item>
      <title>实现HTML元素垂直居中的六种方法</title>
      <link>https://www.printlove.cn/css-center/</link>
      <pubDate>Tue, 31 May 2016 19:40:00 +0800</pubDate>
      
      <guid>https://www.printlove.cn/css-center/</guid>
      <description>一、 img 的垂直水平居中 使用到的重要样式属性 display,vertical-align
vertical-align:middle 这个属性是对 table 元素垂直居中起作用，如果想使用在 img 元素上，就注意下面的 display 设置
&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&amp;#34;en&amp;#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&amp;#34;UTF-8&amp;#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style type=&amp;#34;text/css&amp;#34;&amp;gt; .main{ width: 400px; height: 400px; background-color: #aaa; display: table;/*父元素设置表格属性*/ text-align: center; } .main span{ display: table-cell;/*img设置成表格元素属性*/ vertical-align: middle;/*两个display设置后这个属性就起作用*/ } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&amp;#34;main&amp;#34;&amp;gt; &amp;lt;span&amp;gt;&amp;lt;img src=&amp;#34;1.jpg&amp;#34; alt=&amp;#34;/&amp;#34; width=&amp;#34;150px&amp;#34;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 注意: display:table-cell，这是对类似文字元素起作用的,所以包含在 span 标签内
对于文字居中也 h1,span,p 等类似文字标签都可以这样设置居中 二、 div 的垂直水平居中 这种方法同样适用于 img,只需将 child 换成 img 就行，不再需要 span 了</description>
    </item>
    
    <item>
      <title>Ajax简单实现文件异步上传的多种方法</title>
      <link>https://www.printlove.cn/ajax-upload/</link>
      <pubDate>Tue, 31 May 2016 19:33:05 +0800</pubDate>
      
      <guid>https://www.printlove.cn/ajax-upload/</guid>
      <description>1. 认识 FormData 对象 FormData 是 Html5 新加进来的一个类,可以模拟表单数据
构造函数 解释 FormData (optional HTMLFormElement form) (可选) 一个 HTML 表单元素,可以包含任何形式的表单控件,包括文件输入框. 方法 void append(DOMString name, DOMString value)
name 表单元素名称 value 表单元素要传递的值 &amp;lt;form name=&amp;#34;myForm&amp;#34; enctype=&amp;#34;multipart/form-data&amp;#34;&amp;gt; &amp;lt;input type=&amp;#34;text&amp;#34; name=&amp;#34;userName&amp;#34;&amp;gt; &amp;lt;input type=&amp;#34;file&amp;#34; name=&amp;#34;img&amp;#34;&amp;gt; &amp;lt;input type=&amp;#34;button&amp;#34; id=&amp;#34;btn&amp;#34; value=&amp;#34;submit&amp;#34;&amp;gt; &amp;lt;/form&amp;gt; 2. 使用 javascript 简单实现 function upload() { var userName = document.myForm.userName.value; var img = document.myForm.img.files[0]; var fm = new FormData(); fm.append(&amp;#39;userName&amp;#39;, userName); fm.append(&amp;#39;img&amp;#39;, img); var request = new XMLHttpRequest(); request.</description>
    </item>
    
    <item>
      <title>WPF如何使用触发器</title>
      <link>https://www.printlove.cn/wpf-trigger/</link>
      <pubDate>Mon, 02 Nov 2015 20:29:11 +0800</pubDate>
      
      <guid>https://www.printlove.cn/wpf-trigger/</guid>
      <description>一 属性触发器 1.WPF 如何实现下面的功能
2.下面就是利用属性触发器实现 (如果不懂可以看看《WPF 高级编程》这本书)
&amp;lt;!--给编辑资料添加属性触发器,字体颜色变色，提醒用户可以点击--&amp;gt; &amp;lt;Style x:Key=&amp;#34;styPropert&amp;#34; TargetType=&amp;#34;{x:Type CheckBox}&amp;#34;&amp;gt; &amp;lt;Style.Triggers&amp;gt; &amp;lt;Trigger Property=&amp;#34;IsMouseOver&amp;#34; Value=&amp;#34;true&amp;#34;&amp;gt; &amp;lt;Setter Property=&amp;#34;BorderBrush&amp;#34; Value=&amp;#34;Yellow&amp;#34;&amp;gt;&amp;lt;/Setter&amp;gt; &amp;lt;/Trigger&amp;gt; &amp;lt;/Style.Triggers&amp;gt; &amp;lt;/Style&amp;gt; 3.如果针对一个这种情况你可能会使用 MouseEnter 和 MouseLeave 两个事件,但是如果这种情况多的话，差不多相同的重复写，还有你可以多个 Label 共同作用这两个事件，这样也确实变的简单了，但是你利用属性触发器代码变得就会变得更清晰和更优美
//利用这两个事件实现上图简单的功能 private void label1_MouseEnter(object sender, MouseEventArgs e) { label1.Foreground = Brushes.Blue; //将鼠标指针变成手的形状 label1.Cursor = Cursors.Hand; } private void label1_MouseLeave(object sender, MouseEventArgs e) { label1.Foreground = Brushes.Black; } 二 多触发器 1.我现在做一个简单的关键字变色（只是为了演示多触发器），本来是应该需要正则表达式来完成
对于这种功能的实现你完全可以使用一个事件来写，但是今天只是想说说触发器如何使用
&amp;lt;Window.Resources&amp;gt; &amp;lt;Style x:Key=&amp;#34;styColor&amp;#34; TargetType=&amp;#34;{x:Type ComboBox}&amp;#34;&amp;gt; &amp;lt;Style.Triggers&amp;gt; &amp;lt;MultiTrigger&amp;gt; &amp;lt;MultiTrigger.Conditions&amp;gt; &amp;lt;!--被选择，并且内容为是整个字体变颜色--&amp;gt; &amp;lt;Condition Property=&amp;#34;SelectedIndex&amp;#34; Value=&amp;#34;0&amp;#34;&amp;gt;&amp;lt;/Condition&amp;gt; &amp;lt;Condition Property=&amp;#34;Text&amp;#34; Value=&amp;#34;WPF&amp;#34;&amp;gt;&amp;lt;/Condition&amp;gt; &amp;lt;/MultiTrigger.</description>
    </item>
    
    <item>
      <title>C#调用Python语言</title>
      <link>https://www.printlove.cn/csharp-python/</link>
      <pubDate>Fri, 23 Oct 2015 20:57:06 +0000</pubDate>
      
      <guid>https://www.printlove.cn/csharp-python/</guid>
      <description>本次实验是 vs2010 版本以下（包括 vs2010）,我记得如果是高版本的话好像已经内置了，所以比较简单。
1.去官网下载 IronPython,链接 http://ironpython.codeplex.com/，它是 IronPython 是一种在 NET 和 Mono 上实现的 Python 语言
2.打开 vs,添加两个引用，在 IronPython 的安装根目录下面选择 IronPython.dll 和 Microsoft.Scripting.dll
using Microsoft.Scripting.Hosting; using IronPython.Hosting; //前面要导入两个名称空间 private void button1_Click(object sender, EventArgs e) { ScriptEngine pyEngine = Python.CreateEngine(); //建立python引擎 pyEngine.CreateScriptSourceFromFile(&amp;#34;demo1.py&amp;#34;).Execute();//执行.py脚本 } 3.上面这个 &amp;quot;demo1.py&amp;quot; 是你的 Python 脚本文件，如果想通过上面两句执行.py 文件必须，前提是你还要导入别的模块，就必须加入在最前面写入以下代码,还有要设置脚本属性中（vs 中右键）“复制到输出目录中”这一项，选择始终复制（所有脚本一样）
import sys sys.path.appedn(&amp;#34;C:\IronPython 2.7\Lib&amp;#34;)#看自己的Lib路径 4.调用python的方法//配置python的环境,另写一个脚本demo2.py ScriptRuntime pyRuntime = Python.CreateRuntime(); dynamic obj = pyRuntime.UseFile(&amp;#34;demo2.py&amp;#34;); var a = obj.ShutDown(1800); //调用脚本的ShutDown方法，1800时间单位为秒 if (a == 1) { Console.</description>
    </item>
    
    <item>
      <title>使用sql语句的两种分页方法</title>
      <link>https://www.printlove.cn/sql-page/</link>
      <pubDate>Mon, 19 Oct 2015 15:12:58 +0800</pubDate>
      
      <guid>https://www.printlove.cn/sql-page/</guid>
      <description>使用存储过程 1. 使用 top 方法 &amp;lt;pre name=&amp;#34;code&amp;#34; class=&amp;#34;sql&amp;#34;&amp;gt;--一条一条的访问数据库 Create procedure data_page @num int,--每页的信息数 @i int--接受是第几页 as declare @n int --存储总信息数 set @n=(select COUNT(*) from people) if(@i&amp;lt;=@n/@num) begin select top (@num) * from people where P_id in(select top (@i*@num) p_id from people order by p_id asc) order by p_id desc end --如果最后一张不是完整的一页 --进入一面的判断 if(@i*@num-@n&amp;gt;0) select top (@n-(@i-1)*@num) * from people order by p_id desc go exec data_page 5,1 --删除存储过程 drop procedure data_page 2.</description>
    </item>
    
    
  </channel>
</rss>
