[{"content":"","date":"2026-08-24","externalUrl":null,"permalink":"/tags/ai/","section":"Tags","summary":"","title":"AI","type":"tags"},{"content":"","date":"2026-08-24","externalUrl":null,"permalink":"/tags/%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99/","section":"Tags","summary":"","title":"个人网站","type":"tags"},{"content":" 一片互联网菜园 # 有人健身，有人读书，也有人一天二十四个小时里有十六个小时泡在网上。\n对我来说，这个网站就是属于自己的那一小片菜园。\n我想在互联网圈下一块地。可以养花种草，可以搭几个没人用的小玩意，也可以什么都不做，任由它杂草丛生。\n哪怕有一天这里满地荒芜，只要它依然属于我，我大概也会觉得开心。\n2022 年，我曾经有过一个个人网站，后来搁置至今。\n兜兜转转几年，我又回来了。\n最近沉迷于购买 VPS，于是一切似乎又重新开始：买机器、装系统、买域名、配服务、折腾一些可能并没有什么实际用途的东西，然后因为某个小功能终于按照自己的设想运行起来而获得莫名其妙的满足感。\n可能这就是我喜欢互联网的原因。\n这里足够大，大到一个普通人也可以找到一块没有人注意的角落，然后对着它说：\n这是我的地方。\n关于我 # 我喜欢看电影、美剧，喜欢听音乐，会阅读，也爱玩游戏。\n如果一个 About 页面写到这里就结束，那大概只能说明我是一个再普通不过的人。\n电影、音乐、阅读、游戏，一个不落。\n标准的普通人开局。\n所以下面想说一些我自以为稍微不一样的地方。\n我经常会想到《龟兔赛跑》的故事。\n有时候，我觉得自己是那只乌龟。\n走得很慢，甚至有些步履蹒跚。别人已经走出去很远的时候，我可能还在原地解决一些在别人看来早就应该解决的问题。\n但至少，我知道自己想往哪里走。\n有时候，我又觉得自己是那只兔子。\n懒惰、散漫，自我感觉良好，偶尔甚至有些狂妄。明明知道自己有很多事情应该去做，却总觉得时间还多，总觉得以后还有机会。\n所以我好像同时是两种动物。\n我是想赢的乌龟，也是骄傲的兔子。\n最近在折腾什么 # 最近的兴趣是 VPS 和 Herness。\n最近期的待办事项，是做一个属于自己的 Agent，并且把它作为一个开源项目长期维护下去。\n目前还没有什么宏大的规划，我更想先做一个玩具出来。\n前段时间，我做了一个 NodeSeek 论坛的 AI 画像脚本，使用者寥寥。\n但我自己倒是一直很起劲，前前后后优化了十多个版本。\n所以我觉得，这件事和经营这个网站其实很像。\n有没有很多人使用、有没有很多人访问，当然会让人开心，但似乎又没有那么重要。\n因为在那些没有反馈的时刻，我依然愿意继续改一点东西。\n可能我真正喜欢的不是「做出了一个受欢迎的产品」。\n而只是：\n创造某个原本不存在的东西，它属于我。\n关于过去 # 我的背景有一点奇特。\n至少和很多按部就班长大、毕业、工作，然后沿着一条相对清晰的道路继续生活的人相比，我的人生轨迹没有那么标准。\n走过一些弯路，也偏离过一些通常意义上的“正轨”。具体发生过什么，也许以后会慢慢写。\n现在的我正在做的，与其说是“回到正轨”，不如说是在重新建立自己的生活秩序。\n重新认识自己真正想要什么，重新积累，重新学习。\n重新让身体、工作、兴趣、关系和生活一点点回到自己能够掌控的范围里。\n今年 26 岁，仍在积蓄力量。\n关于这个时代 # 我相信 AI 最终会深刻影响世界上的每一个人。\n这种影响可能远比今天大家所看到的更加深远。\n也许不久以后，就会有人开始怀念 2022 年以前的时光。\n那时候的一篇文章，不需要先怀疑它是不是 AI 写的。\n那时候的一封情书，大概不会先交给豆包分析措辞并润色。\n那时候的 Coding，大概也算是一种**“从前车马很慢。”**\n我不确定 AI 最终会把世界带到哪里。\n乐观的人认为它会释放无数人的创造力，悲观的人担心它会让很多东西失去原本的意义。\n我大概介于两者之间。但无论如何，我不想做一个旁观者。\n我想尽可能靠近它，使用它，理解它，做一些属于自己的东西，也亲眼看看这个时代究竟会走向哪里。\n也许这也是我想做 Agent 的原因之一。\n想成为怎样的人 # 我希望有更多户外活动，有更好的体态，有一份真正和兴趣相关的副业。\n可以持续创造一些东西，解决一些实际的问题。\n我也希望多去一些地方，多经历一些事情，和所爱的人留下更多值得记住的回忆。\nHLSay，即 HLS Say # 它是我的互联网菜园，也是一个很少向外社交的人的日记本。\n你可以在很多地方找到我曾经留下的足迹。\n花会不会开，不重要。\n地先圈下来。\n","date":"2026-08-24","externalUrl":null,"permalink":"/posts/reclaim-a-piece-of-land/","section":"文章","summary":"","title":"重新圈下一块地","type":"posts"},{"content":"","date":"2026-08-24","externalUrl":null,"permalink":"/categories/%E9%9A%8F%E7%AC%94/","section":"Categories","summary":"","title":"随笔","type":"categories"},{"content":"","date":"24 August 2026","externalUrl":null,"permalink":"/en/tags/blog/","section":"Tags","summary":"","title":"Blog","type":"tags"},{"content":"","date":"24 August 2026","externalUrl":null,"permalink":"/en/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"Welcome to HLSay — notes on programming, AI and software engineering.\n","date":"24 August 2026","externalUrl":null,"permalink":"/en/","section":"HLSay","summary":"","title":"HLSay","type":"page"},{"content":"","date":"24 August 2026","externalUrl":null,"permalink":"/en/tags/hlsay/","section":"Tags","summary":"","title":"HLSay","type":"tags"},{"content":"","date":"24 August 2026","externalUrl":null,"permalink":"/en/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"24 August 2026","externalUrl":null,"permalink":"/en/categories/site-news/","section":"Categories","summary":"","title":"Site News","type":"categories"},{"content":"","date":"24 August 2026","externalUrl":null,"permalink":"/en/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"Welcome to HLSay.\nThis site collects notes on programming, AI and software engineering. Chinese and English content are maintained independently.\n","date":"24 August 2026","externalUrl":null,"permalink":"/en/posts/welcome/","section":"Posts","summary":"","title":"Welcome to HLSay","type":"posts"},{"content":"","date":"2026-08-24","externalUrl":null,"permalink":"/tags/%E5%8D%9A%E5%AE%A2/","section":"Tags","summary":"","title":"博客","type":"tags"},{"content":"","date":"2026-08-24","externalUrl":null,"permalink":"/categories/%E7%AB%99%E7%82%B9%E5%85%AC%E5%91%8A/","section":"Categories","summary":"","title":"站点公告","type":"categories"},{"content":"","date":"2022-08-26","externalUrl":null,"permalink":"/categories/%E5%8D%9A%E5%AE%A2/","section":"Categories","summary":"","title":"博客","type":"categories"},{"content":"","date":"2022-08-26","externalUrl":null,"permalink":"/categories/%E6%97%A5%E5%B8%B8/","section":"Categories","summary":"","title":"日常","type":"categories"},{"content":"","date":"2022-08-26","externalUrl":null,"permalink":"/tags/%E6%97%A5%E5%B8%B8/","section":"Tags","summary":"","title":"日常","type":"tags"},{"content":"周会致辞：\n时间很快，我来到推荐团队也有四个多月了，接近开学不得不和大家告别。感谢大家这段时间来的指引和陪伴。\n三人行，必有我师焉。我们组更是人才济济，卧虎藏龙。不管是做人做事还是搞技术，各位都是我的榜样。\n很荣幸和大家共事，祝大家新的一年工作顺利，身体健康。谢谢大家。\n只有新的一年吗工作顺利吗？（德哥） 哦，你们新的一年是从九月份开始算的。（德哥）\n待办：\nDuckDuckGo 申请 @duck.com 邮箱\n完成文章 Chirpy 主题如何添加备案链接\n弃用 WordPress 后，Jetpack 仍每八分钟检查一次 yellow13441.cn 是否可访问\n192.0.101.226 - - [25/Aug/2022:22:26:09 +0800] \u0026quot;HEAD / HTTP/1.1\u0026quot; 301 0 \u0026quot;-\u0026quot; \u0026quot;jetmon/1.0 (Jetpack Site Uptime Monitor by WordPress.com)\u0026quot;\nDowntime Monitoring\n","date":"2022-08-26","externalUrl":null,"permalink":"/posts/last-day-in-shein/","section":"文章","summary":"","title":"离职日","type":"posts"},{"content":"","date":"2022-08-26","externalUrl":null,"permalink":"/categories/%E8%AE%B0%E5%BD%95/","section":"Categories","summary":"","title":"记录","type":"categories"},{"content":" 时效性提示： 本文记录的是 Windows 10 时期的 WinDbg 界面、驱动程序和第三方软件下载流程，这些内容可能已经发生变化。实际排障前请结合当前 Windows/WinDbg 版本及官方文档确认。 本文原使用 GitHub 图床，迁移后相关图片已本地化。\n情景描述 # 11月17日晚电脑出现蓝屏重启，错误代码为KERNEL_MODE_HEAP_CORRUPTION，如下图\n安装 WinDbg 工具 # 请按照以下步骤在 Windows 10 中安装 WinDbg 工具：\n在您的首选浏览器中导航至 Microsoft WinDbg 下载页面。 单击 Get（或“Install/Open”）按钮。 在弹出的对话框中单击 Open Microsoft Store。 单击 Install 按钮。 图中展示了 Microsoft 商店中的 WinDbg 应用程序 安装完成后，单击 Launch。\n分析转储文件 # 请按照以下步骤在 Windows 10 中打开并分析转储文件： 按 Windows 键唤出搜索框，然后键入 WinDbg， 以管理员身份运行 WinDbg Preview。 单击左上角文件菜单， 单击 Start debugging 子菜单下的 Open Dump file， 从文件夹位置选择转储文件 — 输入 %SystemRoot%\\Minidump 后点击 Browse\u0026hellip; 选中要检查的dmp文件，单击打开。 打开转储文件可能需要几分钟时间。进度条可作为有用的指示参考。 打开完毕后，点击Command窗口下的 !analyze -v 超链接（或在下方命令行输入该命令并按 Enter） 在分析完成之前，请留意进度条（大容量的转储文件可能需要很长的时间）。 WinDbg 将显示分析结果以供查验。对结果进行研究将决定进一步的故障处理步骤，并可能揭示错误的原因。 ******************************************************************************* * * * Bugcheck Analysis * * * ******************************************************************************* KERNEL_MODE_HEAP_CORRUPTION (13a) The kernel mode heap manager has detected corruption in a heap. Arguments: Arg1: 0000000000000011, Type of corruption detected Arg2: ffffb08208400100, Address of the heap that reported the corruption Arg3: ffffb082083ec0e0, Address at which the corruption was detected Arg4: 0000000000000000 Debugging Details: ------------------ fffff8063cefb390: Unable to get MiVisibleState Unable to get NonPagedPoolStart Unable to get NonPagedPoolEnd Unable to get PagedPoolStart Unable to get PagedPoolEnd HeapDbgInitExtension Failed KEY_VALUES_STRING: 1 Key : Analysis.CPU.mSec Value: 6686 Key : Analysis.DebugAnalysisManager Value: Create Key : Analysis.Elapsed.mSec Value: 10989 Key : Analysis.IO.Other.Mb Value: 0 Key : Analysis.IO.Read.Mb Value: 0 Key : Analysis.IO.Write.Mb Value: 1 Key : Analysis.Init.CPU.mSec Value: 1390 Key : Analysis.Init.Elapsed.mSec Value: 486414 Key : Analysis.Memory.CommitPeak.Mb Value: 101 Key : Bugcheck.Code.DumpHeader Value: 0x13a Key : Bugcheck.Code.Register Value: 0x13a Key : Dump.Attributes.AsUlong Value: 8 Key : Dump.Attributes.KernelGeneratedTriageDump Value: 1 FILE_IN_CAB: 111722-10750-01.dmp DUMP_FILE_ATTRIBUTES: 0x8 Kernel Generated Triage Dump BUGCHECK_CODE: 13a BUGCHECK_P1: 11 BUGCHECK_P2: ffffb08208400100 BUGCHECK_P3: ffffb082083ec0e0 BUGCHECK_P4: 0 POOL_ADDRESS: Unable to get NonPagedPoolStart Unable to get NonPagedPoolEnd Unable to get PagedPoolStart Unable to get PagedPoolEnd unable to get nt!MmSpecialPagesInUse ffffb082083ec0e0 FREED_POOL_TAG: None BLACKBOXBSD: 1 (!blackboxbsd) BLACKBOXNTFS: 1 (!blackboxntfs) BLACKBOXPNP: 1 (!blackboxpnp) BLACKBOXWINLOGON: 1 CUSTOMER_CRASH_COUNT: 1 PROCESS_NAME: System STACK_TEXT: ffffec03`2044f1d8 fffff806`3c78e77c : 00000000`0000013a 00000000`00000011 ffffb082`08400100 ffffb082`083ec0e0 : nt!KeBugCheckEx ffffec03`2044f1e0 fffff806`3c78e7dc : 00000000`00000011 00000000`00000000 ffffb082`08400100 00000000`00000000 : nt!RtlpHeapHandleError+0x40 ffffec03`2044f220 fffff806`3c78e409 : 00000000`00000020 ffffb082`083ec000 00000000`00000202 ffffb082`1e80e010 : nt!RtlpHpHeapHandleError+0x58 ffffec03`2044f250 fffff806`3c651396 : 00000000`00000282 00000000`d153776f ffffb082`1e80e010 ffffb082`0f0fe0a8 : nt!RtlpLogHeapFailure+0x45 ffffec03`2044f280 fffff806`3c4a5232 : ffffb082`08400340 ffffec03`2044f4ff ffffec03`0810080c ffffb082`00000000 : nt!RtlpHpLfhSubsegmentFreeBlock+0x18c876 ffffec03`2044f330 fffff806`3cbb2149 : ffffb082`00000000 ffffb082`1e80e010 ffffb082`0f0fe0a8 01000000`00100000 : nt!ExFreeHeapPool+0x362 ffffec03`2044f410 fffff806`59181c95 : ffffb082`1704fb50 ffffb082`1e80e010 00000000`00000000 00000000`00000000 : nt!ExFreePool+0x9 ffffec03`2044f440 ffffb082`1704fb50 : ffffb082`1e80e010 00000000`00000000 00000000`00000000 ffffb082`18291c00 : PassGuard_x64+0x1c95 ffffec03`2044f448 ffffb082`1e80e010 : 00000000`00000000 00000000`00000000 ffffb082`18291c00 00000000`00000000 : 0xffffb082`1704fb50 ffffec03`2044f450 00000000`00000000 : 00000000`00000000 ffffb082`18291c00 00000000`00000000 00000000`00000000 : 0xffffb082`1e80e010 SYMBOL_NAME: PassGuard_x64+1c95 MODULE_NAME: PassGuard_x64 IMAGE_NAME: PassGuard_x64.sys STACK_COMMAND: .cxr; .ecxr ; kb BUCKET_ID_FUNC_OFFSET: 1c95 FAILURE_BUCKET_ID: 0x13a_11_None_PassGuard_x64!unknown_function OSPLATFORM_TYPE: x64 OSNAME: Windows 10 FAILURE_ID_HASH: {4b87af2a-da32-d8ca-8a06-dec6d0076795} Followup: MachineOwner --------- 找出罪魁祸首 # 从WinDbg给出的信息，可以在 119 行处明显看到导致系统崩溃的原因是一个名为PassGuard_x64的驱动程序。\n打开everything（如果你没有这个程序，考虑安装一个），搜索PassGuard_x64.sys。\n打开该驱动的属性，可以看到数字签名方是北京微通新成网络科技有限公司.\nGoogle 搜索北京微通新成网络科技有限公司，没有找到更多有价值的信息。\n继续搜索PassGuard_x64.sys，看到下面两篇帖子。\npassguard_x64.sys是什么文件？passguard_x64.sys是什么驱动？ - 哔哩哔哩\n中国移动网站控件引发的蓝屏问题分析 - 佘华煜 - 博客园\n这时我回想起，前段时间总有一个程序结束运行的弹窗，当时发现问题出在邮政银行的安全控件。联想到这个公司的经营范围，问题大概已经找到了。\n重新找到邮政银行的安全控件，下载到本地后右键查看属性。\n果然，同样是北京微通新成网络科技有限公司的数字签名。上次查到邮政的安全组件有问题时，我已经用他提供的Uninstall.exe卸载了，驱动还在，又一个国产毒瘤。\n解决方法： # 火绒 - 安全工具 - 文件粉碎（如果你没有这个程序，考虑安装一个）\n参考资料 # 如何读取 Mini Dump 文件？ | Dell 中国\n","date":"2022-08-26","externalUrl":null,"permalink":"/posts/win10-crash-debug/","section":"文章","summary":"","title":"记录一次 Win10 蓝屏的处理过程","type":"posts"},{"content":" 8/29 # 在健康打卡系统中提交“返校申请”，填写相关信息。在附件中提交申请当日安康码、大数据行程卡和其它相关材料，经班主任、学院负责人批准后方可返肥。\n下午参加选课测试，到医院做核酸。\n8/30 # 上午前往南阳，吃过午饭约 12:30 到达南阳火车站，乘 K306 火车前往合肥，预计 21:46 到达合肥。\n若合肥火车站有核酸检测点，则出站前做第二次核酸，乘地铁前往住处，预计耗时 1 小时。\n若没有，则打车去住处，预计耗时 35 分钟，随后到安医大附一高新院区做核酸（晚 19:00 至 23:00 )。\n8/31 # 晚 22:30-23:00 前往安医大附一高新院区做第三次核酸（需确保距离第二次核酸采样时间超过24小时）。\n9/1 # 上午在健康打卡平台提交入校申请（在附件中提交申请当日安康码、大数据行程卡和居家隔离期全部核酸检测结果），审批通过后去学校报到。\n","date":"2022-08-25","externalUrl":null,"permalink":"/posts/postgraduates-registration/","section":"文章","summary":"","title":"入学报到事宜","type":"posts"},{"content":"","date":"2022-08-25","externalUrl":null,"permalink":"/tags/%E5%87%BA%E8%A1%8C/","section":"Tags","summary":"","title":"出行","type":"tags"},{"content":" 时效性提示： 本文基于 Glances 3.2.7、Ubuntu Server 20.04 LTS 和 Python 3.8 时期的环境编写，相关版本、命令、认证方式、DNS/云平台界面及配置流程可能已经发生变化，请结合当前环境核对后使用。 关于 # Glances - An Eye on your system\nGlances is a cross-platform monitoring tool which aims to present a large amount of monitoring information through a curses or Web based interface. The information dynamically adapts depending on the size of the user interface.\nGlances web page Desktop\nGlances web page Mobile\n我的需求是在一个 Web 界面能够看到服务器实时资源占用情况，目前只能登录腾讯云控制台在监控页面查看。\n下面以 Glances 当前最新版本 3.2.7 演示在 Ubuntu Server 20.04 LTS (Python 3.8) 上的安装和部署过程。\n安装 # 首先，请检查你的 Python 版本应满足python\u0026gt;=2.7 or python\u0026gt;=3.4，否则请参照nicolargo/glances: requirements - Github选用较早版本的 Glances 安装。\nNote for Python 2.6 users Glances no longer supports Python 2.6. Please upgrade to a minimum Python version of 2.7/3.4+ or downgrade to Glances 2.6.2 (last version with Python 2.6 support).\n# 安装psutil pip install psutil # 安装Glances(Web Server Mode) pip install --user \u0026#39;glances[web]\u0026#39; # 启动glances(Web Server Mode) glances -w 查看 # 打开 http://#{server_ip}:61208 查看 Glances 页面，用你的域名或服务器 IP 地址替换 URL 中的 #{server_ip}。\n以本站为例，即yellow13441.cn:61208。\n进阶 # 除了监控的基础功能以外，我还有以下两个需求：\n更优雅的访问路径\n使用用户名密码限制访问\n更优雅的访问路径 # 通过yellow13441.cn:61208访问过于丑陋，我想通过yellow13441.cn/monitor或monitor.yellow13441.cn访问。\n踩了若干坑后的正确思路如下：\n先配置域名解析服务使monitor.yellow13441.cn能正确解析到http://yellow13441.cn:61208；\n再配置 Nginx 将https://www.yellow13441.cn/monitor请求重定向至https://monitor.yellow13441.cn。\n配置域名解析服务 # 以腾讯云服务器为例，在腾讯云-控制台中打开域名解析配置界面，添加如下记录。\n记录类型处选择隐性URL，记录值填写http://yellow13441.cn:61208，有关显/隐性URL的介绍如下：\n显性URL：从一个地址301重定向到另一个地址的时候，就需要添加显性URL记录。\n隐性URL：类似于显性URL，区别在于隐性URL不会改变地址栏中的域名。\n待 DNS 配置生效后，打开monitor.yellow13441.cn查看是否跳转到 Glances 页面。\n配置 Nginx # 打开 nginx.conf，在合适的 server block 中添加location /monitor {}代码段\nserver { listen 443 ssl; server_name www.yellow13441.cn; location /monitor { return 301 http://monitor.yellow13441.cn; } } nginx.conf\n使用用户名密码限制访问 # 若 Glances 已在前台启动，则需按 CTRL + C 终止进程。\n若 Glances 进程在后台执行，可通过 ps aux | grep glances |awk '{print $2}' | xargs kill -9结束进程。\n# 按提示设置用户名和密码 glances --username --password -w Define the Glances webserver username: foo Define the Glances webserver password (foo username): bar Password (confirm): bar Do you want to save the password? [Yes/No]: Yes # 先按CTRL + C 终止进程，再执行下面命令 nohup glances -u foo -w 1\u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp; # nohup 确保当前 shell 退出后进程保持执行 # -u 指定用于密码验证的用户名 # -w 指定 Web Server Mode # 1\u0026gt;/dev/null 2\u0026gt;\u0026amp;1 丢弃 nohup 的标准输出流和标准错误流 # 详见 Linux 输入输出重定向（https://www.runoob.com/linux/linux-shell-io-redirections.html） # 结尾的 \u0026amp; 将命令在（background）后台执行，可通过 Jobs 命令查看当前 shell 下的任务 # 也可通过 fg 命令从 background 栈中取出一个任务到 foreground 参考 # nicolargo/glances: Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, Mac OS and Windows operating systems.\nQuickstart — Glances 3.2.7 documentation\nPassword for Web/Browser mode · Issue #1674 · nicolargo/glances\nShell 输入/输出重定向 | 菜鸟教程\n致谢 # 特别感谢我司SHEIN提供的工作环境，我才能全身心投入本文章的写作。\n","date":"2022-08-23","externalUrl":null,"permalink":"/posts/deploy-glances-web-server/","section":"文章","summary":"","title":"在服务器端部署资源监控服务（Glances）","type":"posts"},{"content":"","date":"2022-08-23","externalUrl":null,"permalink":"/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/","section":"Tags","summary":"","title":"服务器","type":"tags"},{"content":"","date":"2022-08-23","externalUrl":null,"permalink":"/categories/%E7%AC%94%E8%AE%B0/","section":"Categories","summary":"","title":"笔记","type":"categories"},{"content":"","date":"2022-08-23","externalUrl":null,"permalink":"/tags/%E7%AC%94%E8%AE%B0/","section":"Tags","summary":"","title":"笔记","type":"tags"},{"content":"我一向是反对做事拼尽全力的，总觉得那样不够体面。\n追求八十五分的动机显然是以最少的成本获得尽可能多的利润，通俗讲就是摆但不完全摆。\n但是，代价是什么呢？\n八十五分标准放在任何形式的考试都不失为一种选择，但换做是我们的人生呢？\n假设人生考卷的试题包含以下内容：\n健康 家庭 爱情 事业 你愿意在哪里 失去 十五分？\n35岁财务自由，36岁确诊癌症，37岁撒手人寰 疾病或意外随机带走一名家人 错过你的一生挚爱 事业上升期被优化 可能你的答案和我一样，那就是\n去他妈的「八十五分人生」，没有人能规定我们只有八十五分！\nFind your inner beast!\nfrom Minions: The Rise of Gru\n","date":"2022-08-21","externalUrl":null,"permalink":"/posts/fuck-85-life/","section":"文章","summary":"","title":"向「八十五分人生」宣战","type":"posts"},{"content":"晚上看了《千万别抬头》(Don\u0026rsquo;t Look Up)。\n一直对灾难片（包括丧尸片）有种奇特的爱好，我似乎喜欢看到另一个平行时空的地球被毁灭，就像电影《2012》。又或是之前的《雄兵连》（可惜只有其中一季戳我，后面就偏离宏观叙事，转而刻画女角色迎合观众了），总给我一种史诗般的苍凉。\n如果不能重逢，分别便没有意义。\n我们做了所有能做的，不是吗？\n周末待办：\n从办公电脑向自己的电脑进行非敏感数据迁移（包括环境配置以及个人笔记）\n整理衣服杂物，把部分行李先用快递寄回家里\n","date":"2022-08-20","externalUrl":null,"permalink":"/posts/dont-look-up/","section":"文章","summary":"","title":"Don't Look Up","type":"posts"},{"content":"","date":"2022-08-20","externalUrl":null,"permalink":"/categories/%E7%94%B5%E5%BD%B1/","section":"Categories","summary":"","title":"电影","type":"categories"},{"content":"","date":"2022-08-20","externalUrl":null,"permalink":"/tags/%E7%94%B5%E5%BD%B1/","section":"Tags","summary":"","title":"电影","type":"tags"},{"content":"最近读的几个博客链接如下：\nBojie Li\nBeyond the Void\nMingrui (Ray) Zhang · DrustZ\n要么是 HUAWEI ，要么是 Google 或 Facebook。\n或许宇宙的尽头不是考公，是出国？\n看来还对考公抱有幻想的我，属实是格局小了。\n就像 Mingrui 在与郭家宝学长谈后感受 - 🚀火箭升空之时 When Rocket Launches中提到的“多挖一口井”那样，我也很期待有不同的体验。\n我曾经找张小平老师谈，问他对大学生有没有什么建议，他说要多做自己感兴趣的，“多挖一口井”，多去经历，尽可能多地经历。很神奇，跟今天你的思想如出一辙。\n因此军训虽感觉很累，但也没有想哭爹喊娘。因为对我来说，军训也是一种难得的体验。也可能是抖M？\n关于学术界和工业界的取舍 # 以下整段摘录于 byvoid 的博文这一年来眼界与成就部分。\n有一次和一个已经工作了的朋友吃饭，他问过我一个这样问题：「解决一个难题和做出一件东西，哪个给你的成就感更大？」具体来说，解决一个难题指的是在学术研究领域或者工程中解决了一个难题，小到一篇paper，大到图灵奖、诺贝尔奖；做出一件东西指的是做成了一个可以使用的产品，有许多人使用，产生了价值，小到一个开源工具，大到Google搜索这样的产品。我毫不犹豫地选择了后者，当然是做出产品更有价值。他告诉我这个问题反映了不同人不同的价值观和兴趣所在，简单讲就是前者适合搞学术，去科研，当一名科学家或者专家，后者应该是搞开发，做产品，做一名工程师或者企业家。我的这个朋友告诉我，也许对于我来说，创业也是不错的一条路。后来我也拿这个问题问过不少人，结果都和他预期的判断一致。人生的价值在何处？在于证明自己的价值，或者说自我实现。成就是一个人终生追求的东西，其背后的动力是被人认可，无论是造福社会还是为害人类，都是其副作用。信息产业领域最诱人的地方在于，无论你是一名科学家还是一名工程师，你都会造福人类，从而获得丰厚的回报。\n结合从 boj 那里学来的戴着镣铐跳舞的看法，诚然，工业界在于用已有的工具在当前的规则下左右逢源，做最有利于业务需求的 tradeoff （取舍）；学术界则可以将眼光放更高远，去开拓去设计更优雅的解决方案。\n工业界重在 practice ，而学术界则重在 idea。\n工业界需要做事情，而学术界需要做对事情。\n我甚至在想，考公对我未必是个稳定的选择。\n我不想做笼中的鸟，就要趁能飞的时候飞得足够高足够远。\n结合我个人的历史，高考一志愿CS被调二志愿SE，考研081200失败085400上岸。\nCS 是梦想，SE 是生活。\n我一直以来向往的是成为计算机科学的弄潮儿，在所处的时代做出自己的贡献。\n我想要成为的是科学家，但实际上更适合我的工作是工程师。\n人总要结合自己的实际情况，做出最合适的选择。\nOne more time in my mind, Engineers knocked scientists down.\n后记 # 我读到的这些仅是十年前的博客，读到他们的文字，既有敬佩，也有庆幸。\n既敬佩于他们取得的成就，也庆幸于由自己选择的人生尚且刚刚开始。\n或许十年后，也会有读者读到我的博客，就像我此刻读着他们的博客。\n彼时的我三十二岁，而你们正年轻！\nPS：感谢我司 SHEIN 提供的实习机会。过去两周既没写日报，也没有受到任何工作委托，没有做任何有益于公司和团队的贡献。\n完全是依我个人的意愿自由发展，也因此我才得以有此机会拜读上面各位的博客。\n上午提了离职申请，计划 8/26（下周五）办离职手续，回家休息几天准备开学。\nTODO # 最后的最后，\n阮一峰的科技爱好者周刊，我觉得挺有意思的，可以开阔视野。毕竟在这个信息爆炸的时代，看啥不是看。\n阮一峰的网络日志\n另外，最近打算了解一下RSS订阅。\n","date":"2022-08-19","externalUrl":null,"permalink":"/posts/blogs-notes/","section":"文章","summary":"","title":"CS 是梦想，SE 是生活","type":"posts"},{"content":"记录力扣-数据结构入门学习计划的做题记录。\n「数据结构」 - 学习计划 - 力扣（LeetCode）\n题目 简单 中等 困难 备注 217. 存在重复元素 ✔ 53. 最大子数组和 ✔ 1. 两数之和 ✔ 88. 合并两个有序数组 350. 两个数组的交集 II 121. 买卖股票的最佳时机 566. 重塑矩阵 118. 杨辉三角 36. 有效的数独 73. 矩阵置零 387. 字符串中的第一个唯一字符 383. 赎金信 242. 有效的字母异位词 141. 环形链表 21. 合并两个有序链表 203. 移除链表元素 206. 反转链表 83. 删除排序链表中的重复元素 20. 有效的括号 232. 用栈实现队列 144. 二叉树的前序遍历 94. 二叉树的中序遍历 145. 二叉树的后序遍历 102. 二叉树的层序遍历 104. 二叉树的最大深度 101. 对称二叉树 226. 翻转二叉树 112. 路径总和 700. 二叉搜索树中的搜索 701. 二叉搜索树中的插入操作 98. 验证二叉搜索树 653. 两数之和 IV - 输入 BST 235. 二叉搜索树的最近公共祖先 第1天 数组 # 217. 存在重复元素 # 217. 存在重复元素 - 力扣（LeetCode）\n思路 # 定义一个std::set\u0026lt;int\u0026gt;，每次插入数组元素前，检查set中是否已有整数。若已存在，则返回true；否则，继续执行，并在最后返回false。\n代码 # class Solution { public: bool containsDuplicate(vector\u0026lt;int\u0026gt;\u0026amp; nums) { set\u0026lt;int\u0026gt; check; for (int num : nums) { if (check.find(num) != check.end()) return true; check.insert(num); } return false; } }; 笔记 # 遍历 vector 可使用C++11提供的 range based for loop 特性\nvector\u0026lt;int\u0026gt; vi; ... for(int i : vi) cout \u0026lt;\u0026lt; \u0026#34;i = \u0026#34; \u0026lt;\u0026lt; i \u0026lt;\u0026lt; endl; set.find() 方法返回指向该值的iterator，若 set 中不存在，则返回 set.end() (iterator)\nReturn value\nIterator to an element with key equivalent to key. If no such element is found, past-the-end (see end()) iterator is returned.\n53. 最大子数组和 # 53. 最大子数组和 - 力扣（LeetCode）\n思路 # 定义一个dp[]用于保存以第i个数字结尾的子数组的最大连续子数组和，用ans记录当前最大子数组和。\n代码 # class Solution { public: int maxSubArray(vector\u0026lt;int\u0026gt;\u0026amp; nums) { int l = nums.size(); int ans = nums[0]; int dp[l]; dp[0] = nums[0]; for (int i = 1; i \u0026lt; l; i++) { dp[i] = max(nums[i], dp[i - 1] + nums[i]); ans = max(ans, dp[i]); } return ans; } }; 笔记 # 解决动态规划问题的核心在于写出正确的状态转移方程。这道题看似是编程题，实际是数学题。\ndp[]数组用于维护状态，顾名思义，状态转移方程用于描述dp[n]和dp[n-1]的关系（类似数学里的数列）。找出dp[n]和dp[n-1]的关系，编程解决剩下的问题。\n第2天 数组 # 1. 两数之和 # 1. 两数之和 - 力扣（LeetCode）\n思路 # 定义一个std::unordered\u0026lt;int, int\u0026gt;，key 表示nums[]中的数，val 表示该数对应的索引。\n遍历nums[]，若已存在，则返回true；否则，在mp中保存该数和它在nums[]中的索引。\n代码 # class Solution { public: vector\u0026lt;int\u0026gt; twoSum(vector\u0026lt;int\u0026gt;\u0026amp; nums, int target) { unordered_map\u0026lt;int, int\u0026gt; mp; for (int i = 0; i \u0026lt; nums.size(); i++) { if (mp.find(target - nums[i]) != mp.end()) return {i, mp[target - nums[i]]}; mp[nums[i]] = i; } return {-1, -1}; } }; 笔记 # 注意std::unordered\u0026lt;int, int\u0026gt;.find()的返回类型为iterator，若未找到则返回mp.end()。\nC++ 11 中可通过std::vector\u0026lt;int\u0026gt; v = {1, 2, 3, 4};初始化一个vector。\n88. 合并两个有序数组 # 88. 合并两个有序数组 - 力扣（LeetCode）\n思路 # 代码 # 笔记 # 第3天 数组 # 350. 两个数组的交集 II # 350. 两个数组的交集 II - 力扣（LeetCode）\n121. 买卖股票的最佳时机 # 121. 买卖股票的最佳时机 - 力扣（LeetCode）\n第4天 数组 # 566. 重塑矩阵 # 566. 重塑矩阵 - 力扣（LeetCode）\n118. 杨辉三角 # 118. 杨辉三角 - 力扣（LeetCode）\n第5天 数组 # 36. 有效的数独 # 36. 有效的数独 - 力扣（LeetCode）\n73. 矩阵置零 # 73. 矩阵置零 - 力扣（LeetCode）\n第6天 字符串 # 387. 字符串中的第一个唯一字符 # 387. 字符串中的第一个唯一字符 - 力扣（LeetCode）\n383. 赎金信 # 383. 赎金信 - 力扣（LeetCode）\n242. 有效的字母异位词 # 242. 有效的字母异位词 - 力扣（LeetCode）\n第7天 链表 # 141. 环形链表 # 141. 环形链表 - 力扣（LeetCode）\n21. 合并两个有序链表 # 21. 合并两个有序链表 - 力扣（LeetCode）\n203. 移除链表元素 # 203. 移除链表元素 - 力扣（LeetCode）\n第8天 链表 # 206. 反转链表 # 206. 反转链表 - 力扣（LeetCode）\n83. 删除排序链表中的重复元素 # 83. 删除排序链表中的重复元素 - 力扣（LeetCode）\n第9天 栈/队列 # 20. 有效的括号 # 20. 有效的括号 - 力扣（LeetCode）\n232. 用栈实现队列 # 232. 用栈实现队列 - 力扣（LeetCode）\n第10天 树 # 144. 二叉树的前序遍历 # 144. 二叉树的前序遍历 - 力扣（LeetCode）\n94. 二叉树的中序遍历 # 94. 二叉树的中序遍历 - 力扣（LeetCode）\n145. 二叉树的后序遍历 # 145. 二叉树的后序遍历 - 力扣（LeetCode）\n第11天 树 # 102. 二叉树的层序遍历 # 102. 二叉树的层序遍历 - 力扣（LeetCode）\n104. 二叉树的最大深度 # 104. 二叉树的最大深度 - 力扣（LeetCode）\n101. 对称二叉树 # 101. 对称二叉树 - 力扣（LeetCode）\n第12天 树 # 226. 翻转二叉树 # 226. 翻转二叉树 - 力扣（LeetCode）\n112. 路径总和 # 112. 路径总和 - 力扣（LeetCode）\n第13天 树 # 700. 二叉搜索树中的搜索 # 700. 二叉搜索树中的搜索 - 力扣（LeetCode）\n701. 二叉搜索树中的插入操作 # 701. 二叉搜索树中的插入操作 - 力扣（LeetCode）\n第14天 树 # 98. 验证二叉搜索树 # 98. 验证二叉搜索树 - 力扣（LeetCode）\n653. 两数之和 IV - 输入 BST # 653. 两数之和 IV - 输入 BST - 力扣（LeetCode）\n235. 二叉搜索树的最近公共祖先 # 235. 二叉搜索树的最近公共祖先 - 力扣（LeetCode）\n","date":"2022-08-10","externalUrl":null,"permalink":"/posts/leetcode-ds-bronze/","section":"文章","summary":"","title":"Leetcode - 数据结构入门 - C++","type":"posts"},{"content":"","date":"2022-08-10","externalUrl":null,"permalink":"/categories/%E5%8A%9B%E6%89%A3/","section":"Categories","summary":"","title":"力扣","type":"categories"},{"content":"","date":"2022-08-10","externalUrl":null,"permalink":"/tags/%E5%8A%9B%E6%89%A3/","section":"Tags","summary":"","title":"力扣","type":"tags"},{"content":"","date":"2022-08-10","externalUrl":null,"permalink":"/tags/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/","section":"Tags","summary":"","title":"学习计划","type":"tags"},{"content":"","date":"2022-08-10","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/","section":"Tags","summary":"","title":"数据结构","type":"tags"},{"content":"","date":"2022-08-10","externalUrl":null,"permalink":"/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%85%A5%E9%97%A8/","section":"Categories","summary":"","title":"数据结构入门","type":"categories"},{"content":" 时效性提示： 本文写于 2022 年，涉及的 gRPC、Protobuf、CMake、安装路径和构建方式可能已经发生变化。实际操作前请结合当前版本及官方文档确认。 预期读者 # 对gRPC和Protobuf有理论上的了解，缺乏动手完成demo的经验。\n安装gRPC和Protobuf # gRPC和Protobuf支持主流的编程语言，要安装C++版本的gRPC请参考：Quick start | C++ | gRPC\nStaffBook # 以gRPC安装在默认路径$HOME/.local/grpc，Protobuf安装在$HOME/.local/grpc/third_party/protobuf为例：\n设置环境变量 # export MY_INSTALL_DIR=$HOME/.local 准备proto协议文件 # # 进入gRPC保存examples的proto协议的地址 cd $MY_INSTALL_DIR/grpc/examples/protos # 创建staffbook.proto文件 touch staffbook.proto # 编辑并保存staffbook.proto文件 nano staffbook.proto staffbook.proto\n// See README.txt for information and build instructions. // // Note: START and END tags are used in comments to define sections used in // tutorials. They are not part of the syntax for Protocol Buffers. // // To get an in-depth walkthrough of this file and the related examples, see: // https://developers.google.com/protocol-buffers/docs/tutorials // [START declaration] syntax = \u0026#34;proto3\u0026#34;; package tutorial; import \u0026#34;google/protobuf/timestamp.proto\u0026#34;; // [END declaration] // [START messages] message Employee { int32 id = 1; // Unique ID number for this employee. string name = 2; int32 age = 3; enum GenderType { OTHERS = 0; MALE = 1; FEMALE = 2; } GenderType gender = 4; string email = 5; string phone = 6; google.protobuf.Timestamp last_updated = 7; } // Our staff book file is just one of these. message StaffBook { repeated Employee employees = 1; } // [END messages] 创建并进入项目路径 # # 创建目录 mkdir -p ../cpp/staffbook # 进入项目路径 cd ../cpp/staffbook 准备项目需要的文件 # # 创建需要的三个文件 touch CMakeLists.txt add_employee.cc list_employees.cc # CMakeLists.txt用于使用CMake命令创建稍后的Makefile nano CMakeLists.txt # add_employee.cc提供添加一条员工记录的方法 nano add_employee.cc提供添加一条员工记录的方法 # list_employees.cc列出所有已添加的员工信息 nano list_employees.cc CMakeLists.txt\n# Copyright 2022 yellow13441 authors. # # Licensed under the Apache License, Version 2.0 (the \u0026#34;License\u0026#34;); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an \u0026#34;AS IS\u0026#34; BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # cmake build file for C++ staffbook example. # Assumes protobuf and gRPC have been installed using cmake. # See cmake_externalproject/CMakeLists.txt for all-in-one cmake build # that automatically builds all the dependencies before building staffbook. cmake_minimum_required(VERSION 3.5.1) project(StaffBook C CXX) include(../cmake/common.cmake) # Proto file get_filename_component(sb_proto \u0026#34;../../protos/staffbook.proto\u0026#34; ABSOLUTE) get_filename_component(sb_proto_path \u0026#34;${sb_proto}\u0026#34; PATH) # Generated sources set(sb_proto_srcs \u0026#34;${CMAKE_CURRENT_BINARY_DIR}/staffbook.pb.cc\u0026#34;) set(sb_proto_hdrs \u0026#34;${CMAKE_CURRENT_BINARY_DIR}/staffbook.pb.h\u0026#34;) set(sb_grpc_srcs \u0026#34;${CMAKE_CURRENT_BINARY_DIR}/staffbook.grpc.pb.cc\u0026#34;) set(sb_grpc_hdrs \u0026#34;${CMAKE_CURRENT_BINARY_DIR}/staffbook.grpc.pb.h\u0026#34;) add_custom_command( OUTPUT \u0026#34;${sb_proto_srcs}\u0026#34; \u0026#34;${sb_proto_hdrs}\u0026#34; \u0026#34;${sb_grpc_srcs}\u0026#34; \u0026#34;${sb_grpc_hdrs}\u0026#34; COMMAND ${_PROTOBUF_PROTOC} ARGS --grpc_out \u0026#34;${CMAKE_CURRENT_BINARY_DIR}\u0026#34; --cpp_out \u0026#34;${CMAKE_CURRENT_BINARY_DIR}\u0026#34; -I \u0026#34;${sb_proto_path}\u0026#34; --plugin=protoc-gen-grpc=\u0026#34;${_GRPC_CPP_PLUGIN_EXECUTABLE}\u0026#34; \u0026#34;${sb_proto}\u0026#34; DEPENDS \u0026#34;${sb_proto}\u0026#34;) # Include generated *.pb.h files include_directories(\u0026#34;${CMAKE_CURRENT_BINARY_DIR}\u0026#34;) # sb_grpc_proto add_library(sb_grpc_proto ${sb_grpc_srcs} ${sb_grpc_hdrs} ${sb_proto_srcs} ${sb_proto_hdrs}) target_link_libraries(sb_grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF}) # Targets greeter_[async_](client|server) foreach(_target add_employee list_employees) add_executable(${_target} \u0026#34;${_target}.cc\u0026#34;) target_link_libraries(${_target} sb_grpc_proto ${_REFLECTION} ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF}) endforeach() add_employee.cc\n// See README.txt for information and build instructions. #include \u0026lt;ctime\u0026gt; #include \u0026lt;fstream\u0026gt; #include \u0026lt;google/protobuf/util/time_util.h\u0026gt; #include \u0026lt;iostream\u0026gt; #include \u0026lt;string\u0026gt; #include \u0026#34;staffbook.pb.h\u0026#34; using namespace std; using google::protobuf::util::TimeUtil; // This function fills in a Employee message based on user input. void PromptForStaff(tutorial::Employee* employee) { cout \u0026lt;\u0026lt; \u0026#34;Enter employee ID number: \u0026#34;; int id; cin \u0026gt;\u0026gt; id; employee-\u0026gt;set_id(id); cin.ignore(256, \u0026#39;\\n\u0026#39;); cout \u0026lt;\u0026lt; \u0026#34;Enter name: \u0026#34;; getline(cin, *employee-\u0026gt;mutable_name()); cout \u0026lt;\u0026lt; \u0026#34;Enter age: \u0026#34;; int age; cin \u0026gt;\u0026gt; age; employee-\u0026gt;set_age(age); cin.ignore(256, \u0026#39;\\n\u0026#39;); cout \u0026lt;\u0026lt; \u0026#34;Enter gender (M or F): \u0026#34;; string gender; getline(cin, gender); if (gender == \u0026#34;M\u0026#34;) { employee-\u0026gt;set_gender(tutorial::Employee::MALE); } else if (gender == \u0026#34;F\u0026#34;) { employee-\u0026gt;set_gender(tutorial::Employee::FEMALE); } else { cout \u0026lt;\u0026lt; \u0026#34;Unknown gender type. Using default: Other.\u0026#34; \u0026lt;\u0026lt; endl; } cout \u0026lt;\u0026lt; \u0026#34;Enter email address (blank for none): \u0026#34;; string email; getline(cin, email); if (!email.empty()) { employee-\u0026gt;set_email(email); } cout \u0026lt;\u0026lt; \u0026#34;Enter phone number (blank for none): \u0026#34;; string phone; getline(cin, phone); if (!phone.empty()) { employee-\u0026gt;set_phone(phone); } *employee-\u0026gt;mutable_last_updated() = TimeUtil::SecondsToTimestamp(time(NULL)); } // Main function: Reads the entire staff book from a file, // adds one employee based on user input, then writes it back out to the same // file. int main(int argc, char* argv[]) { // Verify that the version of the library that we linked against is // compatible with the version of the headers we compiled against. GOOGLE_PROTOBUF_VERIFY_VERSION; if (argc != 2) { cerr \u0026lt;\u0026lt; \u0026#34;Usage: \u0026#34; \u0026lt;\u0026lt; argv[0] \u0026lt;\u0026lt; \u0026#34; STAFF_BOOK_FILE\u0026#34; \u0026lt;\u0026lt; endl; return -1; } tutorial::StaffBook staff_book; { // Read the existing staff book. fstream input(argv[1], ios::in | ios::binary); if (!input) { cout \u0026lt;\u0026lt; argv[1] \u0026lt;\u0026lt; \u0026#34;: File not found. Creating a new file.\u0026#34; \u0026lt;\u0026lt; endl; } else if (!staff_book.ParseFromIstream(\u0026amp;input)) { cerr \u0026lt;\u0026lt; \u0026#34;Failed to parse staff book.\u0026#34; \u0026lt;\u0026lt; endl; return -1; } } // Add an staff. PromptForStaff(staff_book.add_employees()); { // Write the new staff book back to disk. fstream output(argv[1], ios::out | ios::trunc | ios::binary); if (!staff_book.SerializeToOstream(\u0026amp;output)) { cerr \u0026lt;\u0026lt; \u0026#34;Failed to write staff book.\u0026#34; \u0026lt;\u0026lt; endl; return -1; } } // Optional: Delete all global objects allocated by libprotobuf. google::protobuf::ShutdownProtobufLibrary(); return 0; } list_employees.cc\n// See README.txt for information and build instructions. #include \u0026lt;fstream\u0026gt; #include \u0026lt;google/protobuf/util/time_util.h\u0026gt; #include \u0026lt;iostream\u0026gt; #include \u0026lt;string\u0026gt; #include \u0026#34;staffbook.pb.h\u0026#34; using namespace std; using google::protobuf::util::TimeUtil; // Iterates though all employees in the StaffBook and prints info about them. void ListEmployees(const tutorial::StaffBook\u0026amp; staff_book) { for (int i = 0; i \u0026lt; staff_book.employees_size(); i++) { const tutorial::Employee\u0026amp; employee = staff_book.employees(i); cout \u0026lt;\u0026lt; \u0026#34;Employee ID: \u0026#34; \u0026lt;\u0026lt; employee.id() \u0026lt;\u0026lt; endl; cout \u0026lt;\u0026lt; \u0026#34; Name: \u0026#34; \u0026lt;\u0026lt; employee.name() \u0026lt;\u0026lt; endl; cout \u0026lt;\u0026lt; \u0026#34; Age: \u0026#34; \u0026lt;\u0026lt; employee.age() \u0026lt;\u0026lt; endl; cout \u0026lt;\u0026lt; \u0026#34; Gender: \u0026#34; \u0026lt;\u0026lt; employee.gender() \u0026lt;\u0026lt; endl; if (employee.email() != \u0026#34;\u0026#34;) { cout \u0026lt;\u0026lt; \u0026#34; E-mail address: \u0026#34; \u0026lt;\u0026lt; employee.email() \u0026lt;\u0026lt; endl; } if (employee.phone() != \u0026#34;\u0026#34;) { cout \u0026lt;\u0026lt; \u0026#34; Phone number: \u0026#34; \u0026lt;\u0026lt; employee.phone() \u0026lt;\u0026lt; endl; } if (employee.has_last_updated()) { cout \u0026lt;\u0026lt; \u0026#34; Updated: \u0026#34; \u0026lt;\u0026lt; TimeUtil::ToString(employee.last_updated()) \u0026lt;\u0026lt; endl; } } } // Main function: Reads the entire staff book from a file and prints all // the information inside. int main(int argc, char* argv[]) { // Verify that the version of the library that we linked against is // compatible with the version of the headers we compiled against. GOOGLE_PROTOBUF_VERIFY_VERSION; if (argc != 2) { cerr \u0026lt;\u0026lt; \u0026#34;Usage: \u0026#34; \u0026lt;\u0026lt; argv[0] \u0026lt;\u0026lt; \u0026#34; STAFF_BOOK_FILE\u0026#34; \u0026lt;\u0026lt; endl; return -1; } tutorial::StaffBook staff_book; { // Read the existing staff book. fstream input(argv[1], ios::in | ios::binary); if (!staff_book.ParseFromIstream(\u0026amp;input)) { cerr \u0026lt;\u0026lt; \u0026#34;Failed to parse staff book.\u0026#34; \u0026lt;\u0026lt; endl; return -1; } } ListEmployees(staff_book); // Optional: Delete all global objects allocated by libprotobuf. google::protobuf::ShutdownProtobufLibrary(); return 0; } 编译项目 # # 创建编译目录 mkdir -p cmake/build cd cmake/build # 通过CMake命令在当前路径下编译 # -DCMAKE_PREFIX_PATH指明CMake的find_package()方法查找的路径 # ../..指明CMakeLists.txt的位置 cmake -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR ../.. # 可以看到目录下生成Makefile ll # 通过Make命令对CMake生成的Makefile进行编译 # -j指明同时进行尽可能多的任务 以加快编译效率 # 用make --help查看更多信息 make -j 执行项目 # # 编译完成后可以看到当前目录下出现两个可执行文件 # 分别为add_employee和list_employees # staffbook.data存储员工信息 # 若不存在 则会在首次执行时创建此文件 ./add_employee staffbook.data # 列出staffbook.data中存储的所有员工信息 ./list_employees staffbook.data ","date":"2022-05-12","externalUrl":null,"permalink":"/posts/grpc-staffbook-demo/","section":"文章","summary":"","title":"【入门】仿照gRPC示例完成的第一个demo","type":"posts"},{"content":"","date":"2022-05-12","externalUrl":null,"permalink":"/categories/grpc/","section":"Categories","summary":"","title":"GRPC","type":"categories"},{"content":"","date":"2022-05-12","externalUrl":null,"permalink":"/tags/grpc/","section":"Tags","summary":"","title":"GRPC","type":"tags"},{"content":"","date":"2022-05-12","externalUrl":null,"permalink":"/tags/protobuf/","section":"Tags","summary":"","title":"Protobuf","type":"tags"},{"content":"","date":"2022-05-12","externalUrl":null,"permalink":"/tags/%E5%85%A5%E9%97%A8/","section":"Tags","summary":"","title":"入门","type":"tags"},{"content":"","date":"2022-05-12","externalUrl":null,"permalink":"/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/","section":"Categories","summary":"","title":"技术分享","type":"categories"},{"content":"你好，我是 HLS。\n喜欢电影、剧集、音乐、阅读和游戏。最近沉迷 VPS、AI，以及创造一些原本不存在的东西。\n2022 年曾经有过一个个人网站，后来荒废了几年。现在重新回来，在互联网圈下一小块地，写点东西，放些项目，偶尔养花种草。\n我经常想起《龟兔赛跑》。\n有时候觉得自己是步履蹒跚、但目标明确的乌龟；有时候又是懒惰、散漫且骄傲的兔子。\n我是想赢的乌龟，也是骄傲的兔子。\n我相信 AI 会深刻改变这个世界，所以不想只做一个旁观者。\n今年 26 岁，仍在积蓄力量。\nHLSay，即 HLS Say。\n这里是我的互联网菜园，也是一个很少向外社交的人的日记本。\n欢迎一切友善的交流。\n","externalUrl":null,"permalink":"/about/","section":"HLSay","summary":"","title":"关于我","type":"page"}]