


{"version":1,"root":{"entry":null,
"pages":[],
"sections":[{"entry":{"title":"两耳不闻，偶发兴致",
"url":"/social/",
"date":"",
"headings":[],
"body":"自我介绍\n邮箱：\nlxz#underfitting.com (请把#换成@)\ngithub: \nlinxz-coder\n我的项目：\n\n\nchatfun-react：基于 React 的 ChatGPT 风格 AI 对话应用。\n\n\nchatfun-vue：基于 Vue 的 ChatGPT 风格 AI 对话应用。\n\n\n星级酒店捡漏雷达：追踪高星酒店的价格机会，通过同类型日期比价发现值得捡漏的酒店。\n\n\n反向旅游好选择：按酒店条件筛选旅行目的地，通过含税房价比较寻找高性价比去处。\n\n\n笑谈潮汕话：轻松查询潮汕俚语、俗语、有趣说法和发音，也可以参与贡献词条。\n\n\n鲁迅到底有没有说：鉴定中文互联网名言真假，用游戏化方式辨认鲁迅到底说没说过。\n\n\nWhat AI Cannot Do：记录 AI 目前做不到的事情，并在挑战成功后将它们归入 What AI Can Do。\n\n\n"},
"pages":[],
"sections":[]},{"entry":null,
"pages":[{"title":"AI能教我们怎么学习，胡适的母亲早就知道了",
"url":"/blog/aineng-jiao-wo-men-zen-me-xue-xi-hu-gua-de-mu-qin-zao-jiu-zhi-dao-liao/",
"date":"2026-10-30",
"headings":[{"level":2,"id":"yi-bu-shi-bu-ai-xue-xi-er-shi-gen-ben-ting-bu-dong","permalink":"https://linxz.online/blog/aineng-jiao-wo-men-zen-me-xue-xi-hu-gua-de-mu-qin-zao-jiu-zhi-dao-liao/#yi-bu-shi-bu-ai-xue-xi-er-shi-gen-ben-ting-bu-dong","title":"一、不是不爱学习，而是根本听不懂","children":[]},{"level":2,"id":"er-xing-qu-ke-neng-shi-bei-nan-du-ya-kua-de","permalink":"https://linxz.online/blog/aineng-jiao-wo-men-zen-me-xue-xi-hu-gua-de-mu-qin-zao-jiu-zhi-dao-liao/#er-xing-qu-ke-neng-shi-bei-nan-du-ya-kua-de","title":"二、兴趣可能是被难度压垮的","children":[]},{"level":2,"id":"san-ren-tian-sheng-you-hao-qi-xin-que-wei-bi-tian-sheng-you-xue-xi-xing-qu","permalink":"https://linxz.online/blog/aineng-jiao-wo-men-zen-me-xue-xi-hu-gua-de-mu-qin-zao-jiu-zhi-dao-liao/#san-ren-tian-sheng-you-hao-qi-xin-que-wei-bi-tian-sheng-you-xue-xi-xing-qu","title":"三、人天生有好奇心，却未必天生有学习兴趣","children":[]},{"level":2,"id":"si-aizui-zhong-yao-de-neng-li-bu-shi-gei-da-an-er-shi-bang-ni-kua-guo-na-dao-kan","permalink":"https://linxz.online/blog/aineng-jiao-wo-men-zen-me-xue-xi-hu-gua-de-mu-qin-zao-jiu-zhi-dao-liao/#si-aizui-zhong-yao-de-neng-li-bu-shi-gei-da-an-er-shi-bang-ni-kua-guo-na-dao-kan","title":"四、AI最重要的能力，不是给答案，而是帮你跨过那道坎","children":[]},{"level":2,"id":"wu-bu-yao-ba-aibian-cheng-ling-yi-ge-zhi-hui-guan-shu-zhi-shi-de-xian-sheng","permalink":"https://linxz.online/blog/aineng-jiao-wo-men-zen-me-xue-xi-hu-gua-de-mu-qin-zao-jiu-zhi-dao-liao/#wu-bu-yao-ba-aibian-cheng-ling-yi-ge-zhi-hui-guan-shu-zhi-shi-de-xian-sheng","title":"五、不要把AI变成另一个只会灌输知识的先生","children":[]}],
"body":"前段时间，我读了《胡适自述》，其中有一段关于胡适小时候读书的经历，让我印象特别深刻。\n胡适说，他小时候家乡有一种叫“蒙馆”的私塾。普通学生每年只交两块银元的学费，先生自然不肯花太多心思教他们，每天就是让他们念书、背书，从来不解释书里的意思。\n刚开始读的是一些有韵律的文字，小孩子念起来倒也不算太辛苦。可后来读到《幼学琼林》《四书》这些散文，问题就来了。\n一个几岁的小孩子，面对满篇的文言文，根本不知道自己在念什么。每天还要背诵，哪里有什么乐趣可言？\n于是，很多学生开始逃学。\n但胡适不一样。\n他的母亲非常重视教育，第一年就交了六块银元的学费，后来逐年增加，最后一年甚至交到了十二块。\n多交这么多钱，是为了什么？\n不是让先生布置更多作业，也不是让胡适背更多的书，而是提出了一个要求：\n每读一个字，就要讲清楚这个字的意思；每读一句话，就要讲清楚这句话的意思。\n结果，胡适反而觉得读书没有那么辛苦。\n因为他读得懂。\n我觉得，这件事特别有意思。\n一百多年前，胡适的母亲花钱解决的问题，不正是今天我们想用AI解决的问题吗？\n一、不是不爱学习，而是根本听不懂\n我一直觉得，我们可能把学习兴趣这件事想得太神秘了。\n我们经常说，一个人天生喜欢数学，另一个人天生喜欢文学，还有的人就是不爱读书。\n好像兴趣是出生时就分配好的技能点。\n但真的是这样吗？\n假设现在把一本没有任何注释的古文放在你面前，要求你每天朗读、背诵，却不告诉你它究竟在讲什么。\n你能坚持多久？\n再换一种情况。\n有人坐在你旁边，告诉你这篇文章写于什么年代，作者为什么要写它，里面每句话是什么意思，甚至还能联系你熟悉的故事来解释。\n你可能读着读着，就觉得有意思了。\n同样一本书，为什么会有这么大的区别？\n不是书变了，而是你开始理解它了。\n学英语也是一样。\n一个完全不懂英语的人，坐在那里听外国人连续讲话半个小时，大概率只会觉得无聊。\n但如果他已经能听懂一半，剩下一半可以通过上下文猜测，情况就不一样了。\n他会忍不住去想，这个词是什么意思？刚才那句话是不是在开玩笑？为什么这个人会这样回答？\n原本听不懂的噪音，突然变成了值得探索的信息。\n有时候，不是因为有兴趣才学得进去，而是因为学得进去，才慢慢产生了兴趣。\n二、兴趣可能是被难度压垮的\n我上高中的时候，对数学就有过这样的体验。\n高中数学有一个特点，就是知识之间的联系特别紧密。\n前面一节课没听懂，后面可能就开始跟不上。再往后，老师讲的每个公式、每种解题方法，都像是凭空冒出来的。\n你不是不想学，而是不知道从哪里开始学。\n更麻烦的是，老师不可能因为你一个人没听懂，就让全班停下来。\n于是你只能硬着头皮继续听。\n第一天不懂一点，第二天不懂更多，到了第三天，可能连老师在讲哪一章都不知道了。\n这时候，别人很容易得出一个结论：这个学生对数学没有兴趣。\n可问题是，一个人连题目都看不懂，怎么可能对解题产生兴趣呢？\n但如果有人帮你把前面遗漏的知识补上，情况可能马上就变了。\n原来这个公式是这样推导出来的。\n原来这道题只是在考前面那个知识点。\n原来我不是不会做，只是漏掉了中间一个步骤。\n当你开始能够独立解出一些题目时，那种成就感又会让你想继续学习。\n这也是为什么有些学生补习之后，成绩和学习积极性会一起提高。\n当然，并不是补习班天然就有用，而是好的补习能够找到学生真正卡住的地方。\n我觉得，很多人所谓的失去兴趣，可能并不是失去了好奇心，而是学习过程中积累了太多无法解决的困难。\n当困难超过一定程度，人自然就想逃避。\n胡适那些逃学的同学，未必真的讨厌读书。\n他们可能只是讨厌每天面对一堆自己根本看不懂的东西。\n三、人天生有好奇心，却未必天生有学习兴趣\n再往深处想，我觉得兴趣甚至不需要刻意去培养。\n一个小孩子，为什么总喜欢问为什么？\n为什么天会黑？为什么飞机能飞？为什么月亮会跟着自己走？\n没有人要求他学习这些知识，他也不会因为回答正确就获得考试分数。\n他只是想知道。\n我觉得，人对未知事物的好奇心，本来就是一种很自然的东西。\n但好奇心和学习兴趣之间，还隔着一道门槛。\n你想知道飞机为什么会飞，别人却直接给你一本空气动力学教材，里面全是复杂的数学公式。\n你可能翻两页就放弃了。\n这并不意味着你对飞机没有兴趣。\n只是你原本想解决一个小小的疑问，结果突然被要求掌握一整套庞大的知识体系。\n我们过去的教育，有时候就存在这样的问题。\n学生只是想知道一个问题的答案，但教学却必须按照既定章节推进。\n你要先学第一章，再学第二章，最后才有机会接触到自己真正感兴趣的东西。\n等学到那里，最初的好奇心可能早就消失了。\n而AI让我觉得有意思的地方，恰恰在于它可以反过来。\n你不需要先掌握整门学科，才有资格提出一个问题。\n你可以直接从自己的疑问开始。\n比如你问，为什么飞机那么重，却不会掉下来？\nAI可以先用最简单的语言解释升力。\n你听懂之后，可能又会问，既然如此，为什么飞机起飞需要那么快的速度？\n接着你又会发现，原来这里涉及空气流动、机翼形状、迎角等知识。\n一个问题带出另一个问题。\n你知道的东西越来越多，能够提出的问题也越来越深入。\n这是一种很自然的学习过程。\n不是有人强迫你把整本书读完，而是你自己想知道下一页究竟写了什么。\n四、AI最重要的能力，不是给答案，而是帮你跨过那道坎\n教育心理学里有一个概念，叫做“最近发展区”。\n简单来说，就是一个人独立完成某件事的能力，与在别人帮助下能够完成的能力之间，存在一个区域。\n这个区域里的学习任务，往往更适合推动一个人进步。\n太简单的东西，没有挑战。\n太困难的东西，又容易让人放弃。\n最合适的难度，是你现在还不完全会，但只要有人稍微帮助一下，你就能理解和掌握。\n回过头看胡适的经历，我觉得他的母亲其实就抓住了这个道理。\n先生不是替胡适把书读完，而是把他读不懂的地方讲明白。\n这样，原本超出理解能力的内容，就变成了他可以继续学习的东西。\n而AI把这种学习方式变得更加容易获得。\n以前，你需要一个有耐心的老师。\n老师还必须了解你的知识水平，知道你哪里不懂，愿意根据你的情况反复解释。\n这是一件成本很高的事情。\n胡适的母亲需要支付普通学生好几倍的学费，才有机会获得这样的教学。\n今天，我们打开AI，就可以随时提问。\n听不懂，可以让它换一种说法。\n公式太复杂，可以让它从最基础的概念开始推导。\n不知道自己漏掉了什么知识，可以让它通过提问，帮你寻找理解上的断点。\n甚至你可以直接告诉它：\n“不要一次性把答案告诉我，先看看我懂多少，再一步一步引导我。”\n我觉得，这才是AI真正值得重视的学习能力。\n当然，AI也可能讲错，也未必每次都能准确判断你的水平。重要知识仍然需要核对，真正掌握了没有，也要靠自己练习来验证。\n但至少，它让我们有机会以自己的疑问作为学习的起点，而不是永远被迫跟着统一的教学进度走。\n五、不要把AI变成另一个只会灌输知识的先生\n不过，我也发现，很多人使用AI学习时，依然沿用过去的学习习惯。\n比如想学习经济学，就让AI列出一份完整的经济学课程。\n想学习编程，就让AI制定一个三个月的学习计划。\n想了解某个历史事件，就要求AI从背景、原因、经过、结果开始，系统地讲解一遍。\n这些方法当然不是没有用。\n但我总觉得，如果只是让AI把整套知识重新灌输给我们，那它跟过去的课堂又有什么本质区别呢？\n只不过以前是老师讲，现在换成了AI讲。\n以前老师照着课本讲一小时，现在AI可以在一分钟内生成几千字。\n可你依然可能看不懂，也依然可能觉得无聊。\n甚至因为AI生成内容太容易了，我们可能更容易陷入一种错觉：看过了，就等于学过了。\n我觉得，真正适合AI的学习方式，反而应该从一个很小的问题开始。\n先问自己究竟想知道什么。\n再让AI帮你理解。\n理解之后，尝试自己解释、运用，或者提出新的问题。\n如果中途遇到困难，就退回来，把遗漏的知识补上。\n这样一层一层地往上走，学习就不再是被动接收知识，而变成了主动探索。\n你甚至不一定需要在一开始就明确自己要学会多少东西。\n因为随着理解不断加深，你的兴趣也可能发生变化。\n原本只想了解一个历史人物，后来开始对整个时代感兴趣。\n原本只是想看懂一段英文，后来发现自己愿意去读一本英文小说。\n兴趣不一定是学习的起点，它也可能是学习过程中慢慢长出来的东西。\n而这恰恰是我觉得AI最有价值的地方。\n它不只是让我们学得更快，也可能让那些原本觉得自己不爱学习的人，重新发现学习的乐趣。\n一百多年前，胡适的母亲多花了几块银元，请先生把每个字、每句话讲明白。\n今天，我们已经不需要为此多交几倍的学费了。\n但那个最简单的要求，依然值得记住：\n先让我听懂，再让我继续学。\n"},{"title":"没了AI，我还会写作吗？",
"url":"/blog/mei-liao-ai-wo-huan-hui-xie-zuo-ma/",
"date":"2026-10-29",
"headings":[{"level":2,"id":"da-bu-kai-de-na-ji-fen-zhong","permalink":"https://linxz.online/blog/mei-liao-ai-wo-huan-hui-xie-zuo-ma/#da-bu-kai-de-na-ji-fen-zhong","title":"打不开的那几分钟","children":[]},{"level":2,"id":"wo-wai-bao-diao-de-du-shi-bu-xiang-zuo-de-shi","permalink":"https://linxz.online/blog/mei-liao-ai-wo-huan-hui-xie-zuo-ma/#wo-wai-bao-diao-de-du-shi-bu-xiang-zuo-de-shi","title":"我外包掉的，都是不想做的事","children":[]},{"level":2,"id":"na-yi-ke-wo-hao-xiang-bu-hui-xie-zuo-liao","permalink":"https://linxz.online/blog/mei-liao-ai-wo-huan-hui-xie-zuo-ma/#na-yi-ke-wo-hao-xiang-bu-hui-xie-zuo-liao","title":"那一刻，我好像不会写作了","children":[]},{"level":2,"id":"zhen-zheng-rang-wo-shang-yin-de-shi-liu-chang","permalink":"https://linxz.online/blog/mei-liao-ai-wo-huan-hui-xie-zuo-ma/#zhen-zheng-rang-wo-shang-yin-de-shi-liu-chang","title":"真正让我上瘾的是流畅","children":[]}],
"body":"早上因为网络原因，我常用的AI打不开，刚好是我的写作时间。\n坦率来说，那一瞬间我是有点懵的。因为近期的写作，我已经离不开AI了。并不是说我让AI直接写一篇成品文章，而是我习惯和它先聊一遍：把逻辑顺出来，看看观点有没有疏漏，值得展开的，再让它查一查。最后，它会按照我习惯的方式，输出一篇带着我个人风格的文章。\n可那个早晨，它不在。\n打不开的那几分钟\n我盯着打不开的页面，脑子里第一个感觉不是“网络不好”，而是“完了，这下怎么写”。\n我突然意识到，这种反应本身就很说明问题。\n以前的我不是这样的。我能自己理顺逻辑，自己搜资料，自己一句一句把文章敲出来。这些事对我来说，应该是基础能力。\n可当工具突然缺席，我第一反应竟是一种近似于停滞的空白。好像思路还在，却不知道该从哪里下手。\n那几分钟里，我忽然有点分不清：到底是AI坏了，还是我坏了。\n我外包掉的，都是不想做的事\n我习惯的写作流程大概是这样的：让AI帮我理顺逻辑、查找信息、查缺补漏、做风格润饰。这些环节都挺耗时间，我把它外包了，自己才能更多地思考文章的主题、风格偏向和修改方向。\n听起来很合理。一个人只做核心判断，把执行交给工具。\n可仔细想想就会发现，所谓“外包”，并不只是把时间省下来了。它同时也把我从那些细琐的环节里解脱出来，而那些环节，本来也是写作的一部分。\n我以前会为了一个说法去翻来覆去地搜，会为了某句话顺不顺反复推敲，会担心逻辑上有没有漏洞。现在这些都不需要了。AI会做，而且做得不差。\n问题在于，当我习惯把它交出去之后，那些我不想做的事，也渐渐变成了我不会做的事。\n那一刻，我好像不会写作了\n我也试过其他的AI。说不上来哪里不对，就是觉得讨论起来也不顺了，写得也呆板了，哪哪都不像样。\n这更让我确认，我依赖的并不是“有一个AI”，而是那一个特定的、熟悉我风格的AI。它像我的外脑，也像我的手的一部分。一旦换掉，哪里都不对劲；一旦拿掉，我连从头开始都变得困难。\n那一刻，我好像突然丧失了写作能力。确切地说，我不再拥有从构思到成文的能力。而这种能力，以前我是具备的。\n现在的我，已经高度依赖工具了。\n写这篇文章的时候，没有AI的参与。我不再“口喷成文”，而是一字一句地敲出来，然后阅读，再修改。这个过程让我异常清醒，也让我意识到，AI确实改变了我的写作习惯。\n我意识到，书写能力退化了，即使指的是“键盘书写”。我害怕AI不可用，我不再依赖搜索工具，不愿再花时间去查信息的来源。我习惯抛出问题，等AI给我答案，然后自然成文。\n真正让我上瘾的是流畅\n我是离不开AI，并不是因为它构思精巧，也不是因为它会帮我思考主题，或者它写的文章我认为有多完美。\n我离不开的是流畅性。\n从思考到行文，我不再会中途卡壳。我不需要中途去查一堆资料，也不用“推敲”文字是否合理，甚至坚信逻辑上一定过关。结果出来后，我也不用找谁看一遍，直接AI检查，再加上我肉眼一过，这篇文章基本就定了。\n这种行云流水的感觉让我上瘾。\n一个想法，迅速发展成一篇文章，并多平台发表，有时候就是二十分钟的事情。\n以前写作像走一条需要自己找路的路，会绕、会停、会悔棋。现在，坐在AI旁边，我像是上了高速公路。我只要知道方向，它负责铺路。\n问题是，日子久了，我还会不会自己走路？\n"},{"title":"我们正在丧失理解项羽的能力",
"url":"/blog/wo-men-zheng-zai-sang-shi-li-jie-xiang-yu-de-neng-li/",
"date":"2026-10-29",
"headings":[{"level":2,"id":"yi-qun-ren-shi-ni-yi-bei-zi-de-ren","permalink":"https://linxz.online/blog/wo-men-zheng-zai-sang-shi-li-jie-xiang-yu-de-neng-li/#yi-qun-ren-shi-ni-yi-bei-zi-de-ren","title":"一群认识你一辈子的人","children":[]},{"level":2,"id":"wei-shen-me-yi-ding-yao-yi-jin-huan-xiang","permalink":"https://linxz.online/blog/wo-men-zheng-zai-sang-shi-li-jie-xiang-yu-de-neng-li/#wei-shen-me-yi-ding-yao-yi-jin-huan-xiang","title":"为什么一定要衣锦还乡？","children":[]},{"level":2,"id":"bei-ren-ren-shi-ye-shi-yi-chong-fu-dan","permalink":"https://linxz.online/blog/wo-men-zheng-zai-sang-shi-li-jie-xiang-yu-de-neng-li/#bei-ren-ren-shi-ye-shi-yi-chong-fu-dan","title":"被人认识，也是一种负担","children":[]},{"level":2,"id":"xiang-yu-wei-shen-me-bu-ken-guo-jiang-dong","permalink":"https://linxz.online/blog/wo-men-zheng-zai-sang-shi-li-jie-xiang-yu-de-neng-li/#xiang-yu-wei-shen-me-bu-ken-guo-jiang-dong","title":"项羽为什么不肯过江东？","children":[]},{"level":2,"id":"jiang-dong-huan-zai-fu-lao-que-bu-jian-liao","permalink":"https://linxz.online/blog/wo-men-zheng-zai-sang-shi-li-jie-xiang-yu-de-neng-li/#jiang-dong-huan-zai-fu-lao-que-bu-jian-liao","title":"江东还在，父老却不见了","children":[]}],
"body":"最近跟父母聊天，他们又提起了回老家建房子的事情。\n我一直不太理解，为什么他们对这件事如此执着。\n现在住得好好的，老家的房子一年也住不了几天，花几十万甚至上百万建一栋房子，到底有什么意义？\n当然，我知道他们想要什么。\n一方面是落叶归根。人老了，总想着回到自己出生和长大的地方，那里有熟悉的土地，有童年的记忆。\n另一方面，大概还有一点衣锦还乡的意思。\n年轻时离开家乡，到外面打拼几十年，如今有了一些积蓄，总想回去建一栋漂漂亮亮的房子，让乡亲们看看，自己这些年在外面混得还不错。\n这件事，我能够理解，却始终无法感同身受。\n以前我以为，两代人最大的代沟，是工作、婚姻、育儿这些事情。后来发现，这些分歧其实都还好，至少我们可以摆事实、讲道理，甚至慢慢说服彼此。\n真正难以跨越的代沟，是有些东西对他们来说无比重要，对我们来说却几乎毫无意义。\n不是谁对谁错，而是我们根本没有经历过同一种生活。\n一群认识你一辈子的人\n小时候，我曾经跟奶奶回过老家。\n有一次陪她去市场买菜，我发现一件很有意思的事情。\n几乎每个摊贩都认识她。\n走到卖菜的地方，有人跟她打招呼；走到卖鱼的地方，又有人停下来跟她聊几句。她也认识他们，知道谁是谁家的孩子，谁最近发生了什么事情。\n原本只是买个菜，结果一路都在聊天。\n那时候我并没有觉得这有什么特别。现在回想起来，却发现这是一种我几乎没有体验过的生活。\n在那个地方，奶奶不仅仅是一个买菜的老太太。\n她是谁家的女儿，嫁给了谁，生了几个孩子，年轻时做过什么，可能很多人都知道。\n她的整个人生，几乎都被周围的人见证过。\n这是一种很奇妙的关系。\n现在我们住在城市里，可能连对门邻居姓什么都不知道。每天去同一家便利店买东西，店员也许会记得你的脸，但他并不知道你是谁，更不知道你经历过什么。\n哪怕你突然发了大财，换了一辆豪车，搬进了豪宅，又有多少人会在意呢？\n但在一个熟人社会里，情况完全不同。\n你小时候光着屁股在村里跑，大家认识你；你考上大学，全村都知道；你出去工作，赚了大钱，消息可能很快传遍整个村子。\n等到你有一天开着豪车回来，大家又会聚在一起讨论。\n这时候，你的成功不只是你个人的事情。\n它还是一群认识你几十年的人，共同见证的一件事情。\n为什么一定要衣锦还乡？\n我想起刘强东的故事。\n他曾经讲过，自己当年上大学时，家乡的亲友凑钱支持他，后来他事业有成，又回到家乡给乡亲们发钱、送礼物。\n这件事如果放在一个城市长大的年轻人身上，可能就很难理解。\n你考上大学，为什么邻居要给你凑钱？\n你发达了，为什么又要给邻居发钱？\n大家各过各的日子，不是挺好吗？\n但在那样的乡村社会里，人与人之间的关系，可能远远超过今天我们理解的邻里关系。\n它不只是住得近，而是大家共同参与了彼此的人生。\n我小时候看过一部电视剧，叫《我来自潮州》。\n里面几个年轻人离开家乡，到外面的世界闯荡。虽然他们并非真正的亲兄弟，却因为共同的出身和经历，建立了很深的感情。\n后来无论走得多远、取得多大的成就，他们始终记得自己从哪里来，也想着有一天能够回馈家乡。\n以前看这样的故事，我觉得很自然。\n现在再想，却觉得这种感情正在变得陌生。\n我们当然也会怀念小时候住过的地方，会想念某条街、某家小店，或者某个一起玩过的朋友。\n但这跟父母那一代人的乡愁，似乎不是同一种东西。\n我们的乡愁，更多是对过去生活的怀念。\n而他们的乡愁，除了怀念，还有一群具体的人。\n他们想回去的，不仅是一个地方，还是一个认识自己的世界。\n所以，他们为什么要回乡建房子？\n也许并不是因为那栋房子有多么实用。\n而是他们离开了几十年，终于有机会回到那个世界，向所有认识自己的人交上一份答卷。\n我终于明白了其中的道理。\n但如果让我花几十万去做同样的事情，我还是不愿意。\n这大概就是代沟。\n被人认识，也是一种负担\n不过，这样的生活也不全是美好的。\n我发现父母那一代人，往往特别在乎别人的看法。\n做一件事情之前，总要想想亲戚怎么看、邻居怎么看、村里人会不会说闲话。\n有时候，别人怎么看，甚至比事情本身更重要。\n我们这一代人可能会觉得很奇怪。\n日子是自己过的，为什么要活给别人看？\n但如果你从小生活在一个人人都认识你的地方，这件事就没那么简单了。\n你做了什么事情，可能很快就会传遍整个村子。\n你事业成功，大家会称赞你；你做生意失败，大家也会讨论你；你家里发生了什么矛盾，甚至可能成为别人茶余饭后的谈资。\n你很难真正摆脱这些目光。\n因为那些评价你的人，不是互联网上与你毫无关系的陌生人。\n他们可能是看着你长大的长辈，是曾经帮助过你的邻居，是与你父母相处几十年的朋友。\n你可以不在乎他们的意见，却很难彻底切断与他们的关系。\n这也解释了一个看似矛盾的现象。\n为什么父母一方面如此眷恋家乡，另一方面又如此在乎乡亲们的评价？\n因为这原本就是同一种关系的两面。\n让你获得归属感的那些人，也拥有评价你的权力。\n他们的认可让你感到荣耀，他们的失望也可能让你无地自容。\n而我们这些在城市长大的人，恰恰越来越难体验这种感受。\n项羽为什么不肯过江东？\n说到这里，我突然想起了项羽。\n当年项羽兵败垓下，逃到乌江边，亭长劝他渡江，回到江东，还有机会东山再起。\n但项羽拒绝了。\n《史记》记载，他说：\n“纵江东父兄怜而王我，我何面目见之？”\n意思是，即使江东的父老乡亲愿意拥戴我，我又有什么脸面去见他们呢？\n我们今天读这段历史，往往会觉得项羽太骄傲、太爱面子了。\n胜败乃兵家常事。\n留得青山在，不怕没柴烧。\n只要活着，就还有翻盘的机会。为什么非要为了所谓的面子，放弃自己的生命呢？\n甚至有人认为，这就是项羽不如刘邦的地方。\n刘邦能屈能伸，项羽却放不下自己的尊严。\n这些分析当然有道理。\n但我现在觉得，我们可能还忽略了一件事情。\n江东父老，对项羽来说究竟意味着什么？\n如果用今天的眼光去理解，我们可能会觉得，那不过是一群家乡人。\n他们跟项羽有什么关系？\n项羽打仗是自己的事情，失败也是自己的事情。即使家乡人对他失望，又有什么大不了的？\n这就像今天一个网红，因为觉得自己辜负了粉丝，竟然不愿意继续活下去。\n我们大概会觉得不可思议。\n粉丝不喜欢你了，换一批粉丝不就好了？\n但江东父老不是粉丝。\n他们不是因为项羽成功才认识他，也不是因为他失败就可以轻易换掉的一群人。\n他们是项羽生命中原本就存在的人。\n项羽年轻时在江东成长，后来跟随叔父项梁起兵。渡江西进时，他带走了八千江东子弟。\n这些人跟着他征战天下，最终却没能跟他一起回来。\n他面对的，不仅是一个失败者如何面对家乡人的问题。\n还有那些曾经信任他、追随他的人，以及他们的父母亲友。\n这时候再看那句“无颜见江东父老”，似乎就有了另一层重量。\n他不是单纯害怕别人嘲笑自己失败。\n他可能是真的无法面对那些认识自己、相信自己，甚至把孩子交给自己的人。\n当然，我们无法知道项羽临死前全部的真实想法。他的骄傲、绝望、责任感，也许都混杂在一起。\n但至少有一点值得思考：\n对于一个生活在那样的社会关系中的人来说，家乡人的目光，可能真的比我们想象中重要得多。\n重要到足以影响他对生死的选择。\n江东还在，父老却不见了\n我们这一代人正在经历一种很特别的变化。\n很多人虽然祖籍在农村，却从小就在城市里长大。\n逢年过节跟着父母回老家，村里的人认识我们的父母，认识我们的爷爷奶奶，却未必认识我们。\n有时候走在村里的路上，别人会问一句：“你是谁家的孩子？”\n我们报出父母的名字，对方才恍然大悟。\n但除此之外，大家其实没有什么交集。\n我们没有在那里长大，没有跟村里的孩子一起上学，没有接受过乡亲们的帮助，也没有被他们共同见证过人生。\n所以，我们很难产生父母那样的感情。\n至于我们长大的城市，又是另一回事。\n城市太大了。\n你在深圳生活几十年，可能也只是几百万人中的一个。\n你考上大学，没人会在意；你升职加薪，邻居不知道；你创业成功，整座城市也不会因此记住你的名字。\n即使有一天你真的发达了，你会想着回馈深圳吗？\n可能会，但你又能回馈谁呢？\n这座城市有太多比你更成功的人，也有太多与你毫无关系的人。\n你可以捐钱给学校，帮助某个社区，资助一些有需要的人。\n但这跟父母那种衣锦还乡的感觉，终究不太一样。\n因为你所帮助的人，未必认识过去的你。\n他们也不会因为你的成功，而觉得自己的人生参与了其中。\n当然，城市也有自己的熟人圈子。我们有朋友、同事、同学，也有从小一起长大的伙伴。\n只是这些关系越来越分散。\n你的同学可能去了北京，朋友去了上海，同事换了三家公司，小时候的邻居早已搬走。\n大家都在各自的人生里奔忙。\n再也没有一个地方，聚集着一群从你出生起就认识你，并且愿意一直看着你长大、变老的人。\n这种变化当然有好处。\n我们不必再为邻居的闲话烦恼，不必因为家乡人的期待而勉强自己，也不必非得衣锦还乡，才能证明自己有出息。\n我们拥有了更多选择，也获得了更多自由。\n只是与此同时，我们也失去了一种很古老的情感。\n以前读到项羽不肯过江东，我总觉得他太傻。\n现在我仍然觉得，他应该渡江。\n但我开始意识到，自己之所以能够如此轻松地说出这句话，可能只是因为，我从来没有真正拥有过他的江东父老。\n"},{"title":"一个人是怎么把自己写空的？",
"url":"/blog/yi-ge-ren-shi-zen-me-ba-zi-ji-xie-kong-de/",
"date":"2026-10-29",
"headings":[{"level":2,"id":"yi-wo-men-hao-xiang-wang-ji-liao-yi-jian-shi-qing","permalink":"https://linxz.online/blog/yi-ge-ren-shi-zen-me-ba-zi-ji-xie-kong-de/#yi-wo-men-hao-xiang-wang-ji-liao-yi-jian-shi-qing","title":"一、我们好像忘记了一件事情","children":[]},{"level":2,"id":"er-shu-ru-bu-shi-mei-tian-jie-hong-yi-xie-xin-xi-jiu-gou-liao","permalink":"https://linxz.online/blog/yi-ge-ren-shi-zen-me-ba-zi-ji-xie-kong-de/#er-shu-ru-bu-shi-mei-tian-jie-hong-yi-xie-xin-xi-jiu-gou-liao","title":"二、输入不是每天接触一些信息就够了","children":[]},{"level":2,"id":"san-wan-you-xi-ye-neng-ba-zhe-ge-dao-li-jiang-qing-chu","permalink":"https://linxz.online/blog/yi-ge-ren-shi-zen-me-ba-zi-ji-xie-kong-de/#san-wan-you-xi-ye-neng-ba-zhe-ge-dao-li-jiang-qing-chu","title":"三、玩游戏也能把这个道理讲清楚","children":[]},{"level":2,"id":"si-shu-chu-tai-duo-ye-ke-neng-shi-yi-chong-tou-lan","permalink":"https://linxz.online/blog/yi-ge-ren-shi-zen-me-ba-zi-ji-xie-kong-de/#si-shu-chu-tai-duo-ye-ke-neng-shi-yi-chong-tou-lan","title":"四、输出太多，也可能是一种偷懒","children":[]},{"level":2,"id":"wu-shu-ru-he-shu-chu-ben-lai-jiu-shi-yi-jian-wan-zheng-de-shi-qing","permalink":"https://linxz.online/blog/yi-ge-ren-shi-zen-me-ba-zi-ji-xie-kong-de/#wu-shu-ru-he-shu-chu-ben-lai-jiu-shi-yi-jian-wan-zheng-de-shi-qing","title":"五、输入和输出，本来就是一件完整的事情","children":[]},{"level":2,"id":"liu-bie-ba-zi-ji-xie-kong-liao","permalink":"https://linxz.online/blog/yi-ge-ren-shi-zen-me-ba-zi-ji-xie-kong-de/#liu-bie-ba-zi-ji-xie-kong-liao","title":"六、别把自己写空了","children":[]}],
"body":"以前看过一位博主的文章，他说，一个人想要成功，就应该保持高强度的输出。\n每天写点东西，做点作品，发表一些观点。哪怕一开始水平不怎么样，只要坚持下去，数量积累到一定程度，自然就会越来越好。\n乍一听，这个道理似乎没什么问题。\n毕竟，写作需要练习，做事情需要经验。你每天写一篇文章，一年就能写三百多篇，总比一年只写三篇的人进步得快吧？\n我以前也挺认同这种观点。\n最近我自己经常写文章，有时候一天能写两三篇。写得多了，慢慢发现一个奇怪的问题：\n一个人真的会因为不断输出，而变得越来越好吗？\n还是说，他有可能把自己写空了？\n一、我们好像忘记了一件事情\n我发现，很多关于个人成长的建议，都特别强调输出。\n想提高写作能力，就坚持日更；想做好自媒体，就保持更新频率；想提升专业能力，就多做项目、多积累经验。\n这些建议当然有道理。\n但它们好像都忽略了一个环节：输入。\n一个人每天写文章，他写出来的东西究竟从哪里来？\n当然是来自他过去的经历、阅读、观察和思考。\n可是，如果他每天都在拼命输出，却没有持续接触新的东西，那么他实际上就是在不断消耗自己过去积累的存货。\n刚开始可能没什么问题。\n毕竟，一个人活了几十年，总有一些经历可以分享，也有一些观点值得表达。\n但写到一定程度之后呢？\n那些熟悉的故事讲完了，那些反复思考的问题也讲得差不多了。\n接下来怎么办？\n继续写。\n于是，他可能开始换一种说法表达同一个观点，换一个故事讲同一个道理。\n文章数量还在增加，但里面的新东西却越来越少。\n我觉得这是一件挺可怕的事情。\n因为从外面看，这个人非常勤奋，每天都在创作。\n但实际上，他可能已经很久没有成长了。\n二、输入不是每天接触一些信息就够了\n有人可能会说，怎么可能没有输入呢？\n我们每天都在接触新东西。\n刷短视频、看新闻、和别人聊天、看电视剧，甚至上班、吃饭、走在路上，不都是输入吗？\n当然可以算。\n但我觉得，这里有一个很大的区别。\n接触了一个东西，不代表这个东西真正进入了你的思想。\n比如看一部电影。\n你可以花两个小时看完，觉得挺精彩，然后打开下一部。\n也可以看完之后，突然对其中一个人物的选择产生疑问。\n他为什么要这么做？\n如果换成我，我会怎么选择？\n导演为什么要把故事拍成这样？\n这个故事是不是和我生活中的某件事情有点相似？\n同样是看电影，前者可能只是获得了一次娱乐体验，后者却可能因此产生一个新的观点。\n当然，我不是说看电影一定要思考，更不是说所有娱乐都应该变成学习。\n只是如果我们希望这些经历能够反过来帮助自己的创作，那么有意识地思考，确实会带来很大的不同。\n甚至阅读优秀文章也是如此。\n你读了一百篇文章，可能只是记住了几个有趣的故事。\n但如果其中一篇文章让你发现，原来一个问题还可以从完全不同的角度理解，那么这一篇带来的收获，可能比前面一百篇都大。\n所以我越来越觉得，输入并不是简单地往脑子里塞东西。\n它更像是不断让外面的世界进来，和自己原有的认识发生碰撞。\n三、玩游戏也能把这个道理讲清楚\n最近我一直在玩《杀戮尖塔》。\n这是一款卡牌游戏，每次开始游戏，都需要重新选择卡牌、组合战术，然后挑战不同的敌人。\n我发现它特别适合用来解释输入和输出之间的关系。\n刚开始玩的时候，我经常失败。\n有时候是攻击不够，有时候是防御不足，有时候明明觉得自己的卡组已经很强了，结果碰到一个Boss，几回合就被打死。\n于是我重新开始。\n尝试不同的卡牌，改变组合，看看有没有更好的打法。\n这个过程其实挺有意思。\n因为每次失败，我都有可能发现一个新的问题。\n但玩久了之后，我发现另一种情况。\n连续玩几个小时，始终采用差不多的策略，失败之后又重新开始，甚至已经懒得认真思考为什么失败。\n这个时候，游戏突然变得很无聊。\n就像我之前形容的，玩游戏玩得像坐牢一样。\n明明是自己主动打开的游戏，最后却像在完成某种任务。\n有趣的是，有时候我不继续玩了，而是停下来看看别人的攻略。\n看看别人怎么组合卡牌，怎么解决我一直解决不了的问题。\n突然发现，原来还有这种打法！\n然后再回到游戏里尝试，整个体验就不一样了。\n同样一款游戏，同样那些卡牌，因为我知道了新的东西，游戏又变得有趣起来。\n这件事情让我意识到，输入和输出的关系，可能远比我们想象的复杂。\n玩游戏究竟算输入，还是输出？\n其实很难划分。\n当我尝试一种新的战术时，我是在实践，也是在验证自己的想法。\n当我研究失败原因时，我是在思考。\n当我看别人的攻略时，我是在学习新的知识。\n而当我机械地重复同一种打法，连自己为什么这么做都不清楚的时候，可能就只剩下单纯的消耗了。\n同样一件事情，有时候能让你成长，有时候却只是在消耗时间。\n区别未必在于你做了什么，而在于你有没有从中获得新的东西。\n四、输出太多，也可能是一种偷懒\n这听起来有点矛盾。\n一个人每天坚持写文章，怎么反而成了偷懒？\n但我觉得，确实存在这种可能。\n因为当一个人熟悉某种表达方式之后，写文章可能并没有想象中那么困难。\n你已经有了一套熟悉的观点，也有自己擅长的叙事方式。\n遇到一个话题，很快就知道应该怎么展开，怎么举例，怎么得出结论。\n写得越来越快，也越来越顺手。\n但这里面可能隐藏着一个问题：\n你只是越来越擅长表达自己已经知道的东西。\n而那些自己不知道的东西呢？\n那些与你原有观点相反的看法呢？\n那些需要花很长时间才能理解的问题呢？\n可能反而被你忽略了。\n因为重新学习一件事情，往往比重复表达一件事情困难得多。\n写一篇自己熟悉的文章，可能只需要半个小时。\n但要真正理解一个陌生的问题，可能需要读一本书，看几篇不同观点的文章，甚至花几天时间反复思考。\n相比之下，继续输出反而是一条轻松的路。\n更麻烦的是，输出很容易被量化。\n今天写了三篇，昨天写了两篇，这个月已经写了五十篇。\n这些数字看起来很漂亮，也很容易给人带来成就感。\n但一个人花了三个小时，终于发现自己过去的某个观点是错的，这种进步却很难统计。\n于是，我们很容易把那些看得见的产量，当成自己正在进步的证据。\n甚至开始为了保持输出频率，而牺牲真正需要花时间的阅读和思考。\n原本是为了让自己成长而写作，最后却可能变成了为了写作而写作。\n这才是我觉得最值得警惕的地方。\n五、输入和输出，本来就是一件完整的事情\n不过，讲到这里，也不能得出另一个结论：既然输入这么重要，那就少写一点，多读一点。\n因为只输入不输出，同样存在问题。\n有些人特别喜欢读书，看了很多优秀作品，收藏了大量文章，也听过无数精彩的观点。\n但如果始终没有尝试表达自己的理解，那么这些东西究竟有没有真正成为自己的认识，其实很难判断。\n有时候，你觉得自己已经理解了一个问题。\n直到你试着把它讲给别人听，才发现根本讲不清楚。\n或者写到一半，突然发现自己的观点前后矛盾。\n这时候，你才意识到，原来自己还没有真正想明白。\n于是，你又重新去阅读，重新寻找资料，重新思考。\n我觉得这才是输入和输出最有意思的地方。\n它们根本不是两件需要刻意分配时间的事情。\n不是规定自己每天阅读两个小时，再写作一个小时，就算完成了成长任务。\n而是你在写作的时候，发现自己需要更多知识，于是去阅读。\n你在阅读的时候，产生了一个新的想法，于是尝试表达。\n你在表达的时候，又发现新的问题，于是继续寻找答案。\n它们互相推动，形成一个完整的过程。\n甚至思考本身，也很难简单地归类为输入或者输出。\n有时候，我看完一部电影，脑子里突然产生一个想法。\n我没有马上把它写出来，但这个想法已经在改变我对某件事情的认识。\n等到某一天，碰到一个合适的话题，它又自然地出现在我的文章里。\n所以我不觉得每一次输入都必须马上产生作品，也不觉得每一次输出都必须带来什么惊人的成果。\n真正重要的是，这个过程有没有持续发生。\n六、别把自己写空了\n现在我依然觉得，坚持写作是一件好事。\n我也没有打算因为担心输出太多，就刻意减少写文章的数量。\n只是相比以前，我开始更加在意另一件事情：\n最近有没有接触什么新的东西？\n有没有看到一个自己以前没有想过的观点？\n有没有什么事情，让我改变了原来的看法？\n如果有，那么哪怕最近写得少一点，我也不觉得有什么问题。\n反过来，如果每天都写得很勤奋，却发现自己越来越习惯重复那些熟悉的道理，那可能真的需要停下来看看了。\n毕竟，一个人总不能只顾着把脑子里的东西倒出来，却忘了往里面装点新的东西。\n"},{"title":"时间管理，其实是资源分配的问题",
"url":"/blog/shi-jian-guan-li-qi-shi-shi-zi-yuan-fen-pei-de-wen-ti/",
"date":"2026-10-28",
"headings":[],
"body":"最近我一直在想，为什么我们的时间总是不够用？\n每天要工作，要陪孩子，还想运动、学习、写文章，偶尔也想打打游戏。\n其实每件事情都不算过分，甚至可以说都挺有意义的。\n可问题是，一天只有二十四个小时。\n以前我总觉得，这是时间管理的问题。只要提高效率，少刷手机，充分利用碎片时间，就能做更多事情。\n但后来我又想到，时间其实是一个很公平的东西。\n不管你是普通人，还是身家百亿的富豪，每天都只有二十四个小时。\n那么，为什么有些人好像能够完成那么多事情，而我们却总觉得时间不够用呢？\n一、有钱人真的拥有更多时间吗？\n一个很容易想到的答案，就是他们能够利用别人的时间。\n比如一个企业家，可以雇用几百人、几千人替自己工作。\n他不需要亲自写代码、做设计、处理客户投诉，只需要让不同的人负责不同的事情。\n从这个角度看，他好像真的拥有了比普通人更多的时间。\n我们现在使用 AI，其实也有类似的效果。\n以前写一个程序，可能需要花几天时间。现在借助 AI，几个小时就能完成。\n以前整理一份资料需要一下午，现在可能几分钟就有了结果。\n这不就相当于我们获得了额外的时间吗？\n但我后来又觉得，好像也不完全是这样。\n因为不管别人还是 AI，帮我们完成的都只是某些具体任务。\n任务完成以后，我们还需要判断结果好不好，方向对不对，接下来应该做什么。\n一个企业家即使有几千名员工，也不可能同时关注公司里的每一件事情。他仍然需要决定哪些项目值得投资，哪些问题应该优先解决。\nAI 也是如此。\n它可以帮我快速完成十个项目，但我真的有时间检查这十个项目吗？有精力维护它们吗？甚至，我真的需要这十个项目吗？\n我发现，这里面有一个挺有意思的矛盾。\n我们可以借助别人和工具扩大自己的产出，却不能无限扩大自己判断和选择的能力。\n执行效率提高了，能够做的事情变多了，但新的问题也随之出现。\n以前是没有时间做，现在可能是没有时间决定该做什么。\n所以即使拥有再多的工具和人手，最终还是要回到那个问题：我每天只有二十四个小时，究竟应该把注意力放在哪里？\n这让我开始怀疑，所谓时间管理，可能从一开始就不只是时间的问题。\n二、从游戏里想到的资源分配\n最近我一直在玩《杀戮尖塔》，对这个问题有了一个很直观的感受。\n游戏里有攻击牌，也有防御牌，而每个回合能够使用的能量有限。\n刚开始我总喜欢拿攻击牌，因为攻击能够消灭敌人，防御却不能。\n但后来发现，如果只顾着攻击，很容易因为血量不足而失败。反过来，如果只顾着防御，又可能无法及时消灭敌人。\n更重要的是，游戏里的血量不会在每场战斗结束后自动恢复。\n所以你不仅要考虑眼前这一场战斗能不能赢，还要考虑打完以后，自己还剩下多少资源。\n我觉得这跟现实生活挺像的。\n工作、学习、创业，更像是进攻。我们投入时间和精力，希望获得更好的收入和更多机会。\n而睡眠、运动、储蓄，则更像是防守。它们未必能够直接创造收益，却能帮助我们避免损失。\n有意思的是，我们似乎总是更喜欢进攻。\n比如晚上有两个小时，我可能更愿意拿来写文章、研究新技术，而不是早点睡觉。\n因为前者让我觉得今天又有了一点收获。\n后者呢？\n睡了一觉，第二天还是要上班，好像什么也没有改变。\n但如果长期睡眠不足，导致身体变差、工作效率下降，那之前多出来的时间，究竟算不算赚到了？\n我们总是很容易计算自己获得了什么，却很少计算为了获得这些东西，究竟消耗了多少资源。\n三、资源分配，不是把每件事情都做好\n顺着这个思路，我又想到，我们平时为什么总想把时间安排得满满当当？\n可能是因为我们不太愿意放弃。\n工作要做好，孩子要陪伴，身体要锻炼，还希望自己不断成长。\n每件事情都有充分的理由去做。\n如果有些事情明显不重要，直接放弃就好了。\n真正麻烦的是，它们都很重要。\n但资源分配并不是平均分配。\n比如每天运动半个小时，可能就已经有不错的效果。但如果想认真开发一个软件，每天只投入半个小时，可能刚进入状态就要结束了。\n同样，工作十个小时，也不一定比八个小时多创造25%的价值。\n所以我们不能只看一件事情重不重要，还得看继续投入，究竟能够获得多少额外收益。\n有些事情值得集中投入，有些事情做到一定程度就够了。\n而且，资源分配还要考虑风险。\n比如一个刚毕业的年轻人，没有房贷，也没有太多家庭负担，可能完全可以花几年时间尝试一些不确定的事情。\n但对于一个已经有了孩子、房贷，父母也逐渐年老的人来说，同样的选择，代价可能完全不同。\n这不是谁更有勇气的问题，而是每个人拥有的资源，以及能够承受的损失不同。\n我觉得一个合理的资源分配方案，不应该只考虑成功以后能获得多少，还应该考虑失败以后自己剩下多少。\n如果一次失败只是损失一点时间和金钱，那完全可以尝试。\n但如果一次失败就可能让整个家庭陷入困境，那再诱人的机会，也需要重新考虑。\n这也是为什么我觉得，防守并不意味着放弃进攻。\n保留必要的资源，是为了让自己以后还有机会继续进攻。\n四、做得更多，不一定意味着过得更好\n回到最开始那个问题。\n为什么有些人能够完成那么多事情？\n因为他们懂得利用别人的时间，懂得使用工具，也懂得把一些事情交给别人。\n但我觉得，这还不是最关键的。\n更重要的是，他们必须决定哪些事情值得自己关注。\n这也是我现在使用 AI 时越来越明显的一种感受。\n以前有些想法，因为技术能力或者时间有限，我根本不会考虑去实现。\n现在不一样了。\n只要有一个想法，我就可以让 AI 帮我写代码、搭建网站，甚至很快做出一个可以运行的产品。\n这当然是一件好事。\n但新的烦恼也出现了。\n我可能同时有好几个项目想做，每个都觉得有意思，每个都觉得有一点潜力。\n结果呢？\n项目越来越多，自己的时间却没有增加。\n甚至因为能够做的事情变多了，反而更容易分散精力。\n这就有点像《杀戮尖塔》里拿牌。\n刚开始我总觉得，只要是好牌就应该拿下来。\n后来才发现，拿了太多牌，反而可能让牌组变得臃肿，关键时刻抽不到真正需要的牌。\n有时候，最好的选择反而是什么都不拿。\n现实生活也是一样。\n一件事情值得做，并不意味着它就值得我现在去做。\n一个项目可能很有前景，一项技能可能很有价值，一个工作机会也可能带来更高的收入。\n但它们都需要消耗资源。\n而选择其中一件事情，就意味着放弃另外一些事情。\n以前我总觉得，一个人应该尽可能抓住机会。\n现在反而觉得，能够主动放弃一些机会，可能也是一种很重要的能力。\n毕竟，我们真正缺少的，从来都不是值得做的事情，而是足够把它们全部做好的资源。\n⸻\n写到这里，我发现自己其实并没有解决时间不够用的问题。\n明天还是要上班，孩子还是要陪，晚上可能还是会舍不得睡觉。\n即使 AI 以后变得再厉害，能够替我完成更多工作，我也不觉得自己就会突然拥有大量空闲时间。\n因为当一件事情变得容易以后，我可能又会想做另外十件事情。\n人的欲望似乎总能跟着能力一起增长。\n我们接受一个事实：\n永远有做不完的事情，也永远不可能把所有值得做的事情都做好。\n有些事情需要全力以赴，有些事情做到差不多就够了，还有些事情，即使再有意思，也只能暂时放弃。\n这当然会有遗憾。\n但如果什么都不愿意放弃，最后可能反而什么都做不好。\n时间对每个人都是公平的，我们可以借助工具，可以利用别人的时间，可以不断提高效率。\n但最终，还是得由自己决定，把有限的时间、精力和注意力，交给什么。\n我想，这才是时间管理真正需要解决的问题。\n"},{"title":"为什么有些游戏，玩起来像坐牢？",
"url":"/blog/wei-shen-me-you-xie-you-xi-wan-qi-lai-xiang-zuo-lao/",
"date":"2026-10-28",
"headings":[{"level":2,"id":"mei-tian-du-neng-da-you-xi-zhen-de-shi-yi-jian-xing-fu-de-shi-ma","permalink":"https://linxz.online/blog/wei-shen-me-you-xie-you-xi-wan-qi-lai-xiang-zuo-lao/#mei-tian-du-neng-da-you-xi-zhen-de-shi-yi-jian-xing-fu-de-shi-ma","title":"每天都能打游戏，真的是一件幸福的事吗？","children":[]},{"level":2,"id":"ke-shi-mei-you-ren-wu-de-you-xi-jiu-hao-wan-ma","permalink":"https://linxz.online/blog/wei-shen-me-you-xie-you-xi-wan-qi-lai-xiang-zuo-lao/#ke-shi-mei-you-ren-wu-de-you-xi-jiu-hao-wan-ma","title":"可是，没有任务的游戏就好玩吗？","children":[]},{"level":2,"id":"you-mei-you-yi-chong-you-xi-wan-wan-zhi-hou-fan-er-geng-you-jing-shen","permalink":"https://linxz.online/blog/wei-shen-me-you-xie-you-xi-wan-qi-lai-xiang-zuo-lao/#you-mei-you-yi-chong-you-xi-wan-wan-zhi-hou-fan-er-geng-you-jing-shen","title":"有没有一种游戏，玩完之后反而更有精神？","children":[]},{"level":2,"id":"wo-men-yi-jing-you-na-me-duo-shi-qing-yao-wan-cheng-liao","permalink":"https://linxz.online/blog/wei-shen-me-you-xie-you-xi-wan-qi-lai-xiang-zuo-lao/#wo-men-yi-jing-you-na-me-duo-shi-qing-yao-wan-cheng-liao","title":"我们已经有那么多事情要完成了","children":[]}],
"body":"不知道从什么时候开始，玩家们喜欢用“坐牢”来形容某些游戏。\n这个词挺有意思的。\n打游戏原本是一件娱乐的事情。你花钱买游戏，花时间玩游戏，没有人强迫你，甚至你还可以随时退出。但玩着玩着，你却觉得自己像个犯人，每天被关在同一个地方，重复完成一些没有意义的任务。\n比如某些开放世界游戏，地图很大，任务很多。刚开始玩的时候，你觉得这个世界充满了惊喜。可是玩了十几个小时之后，你发现任务无非就是跑到某个地方，杀掉几个敌人，收集一些东西，再跑回来领取奖励。\n换一个地方，换一批敌人，换一个任务发布者，你做的事情却没有什么变化。\n第一次可能很有趣，第二次也还行，第三次你就开始怀疑，自己为什么要做这些事情。\n到了第四次，你已经不是在探索世界了，而是在清理地图上的图标。\n你甚至开始计算，今天再玩两个小时，能清掉多少个任务。\n这时候，游戏就有点像上班了。\n奇怪的是，明明没有人要求我们完成这些任务，我们却会主动给自己安排工作。\n地图上还有几个问号没有清掉，任务列表里还有几个支线没有完成，装备还差一点材料才能升级。\n明明已经觉得无聊，却又不甘心就这样放下。\n于是，一个原本用来消遣的东西，慢慢变成了另一种负担。\n每天都能打游戏，真的是一件幸福的事吗？\n小时候，很多人可能幻想过，如果长大以后能够每天打游戏，那该多好。\n现在确实有这么一种职业，叫电竞选手。\n每天的工作就是打游戏，甚至有人愿意花钱看你打游戏。\n听起来简直是梦想中的职业。\n可是仔细想想，电竞选手真的每天都在玩吗？\n假设你喜欢《街头霸王》，平时有空就打几局。赢了当然开心，输了也无所谓，觉得累了就关掉游戏。\n但是如果你是一名职业选手呢？\n每天固定时间训练，同样的角色、同样的招式、同样的对局，可能要反复练习几百次。\n你不能因为今天不想玩就不玩，也不能因为连续输了十局就关机。\n你必须分析自己为什么输，哪里操作失误了，怎样才能提高胜率。\n如果你的对手是一个天赋远超你的人呢？\n你可能练习了几百个小时，依然打不过他。\n但是你还得继续练。\n当然，训练也有乐趣。你可能突然领悟了一种新的打法，或者发现自己的反应速度提高了。这些都会让人兴奋。\n可是，这种乐趣跟我们在学校学习、在公司工作时获得的乐趣，又有什么本质区别呢？\n我们在工作中解决了一个难题，也会开心。考试取得好成绩，也会兴奋。\n电竞选手当然可能热爱游戏，但热爱不代表每天的训练都是享受。\n当一件事情必须在固定的时间、固定的地点完成，而且必须取得某种成绩时，它就已经具有了工作的性质。\n哪怕这件事情是打游戏。\n所以，我有时候觉得，职业电竞选手可能比普通玩家更容易体会到游戏里的“坐牢”。\n普通玩家不想玩了可以退出，他们却未必可以。\n可是，没有任务的游戏就好玩吗？\n说到这里，好像可以得出一个很简单的结论：\n既然游戏里的任务让人觉得坐牢，那干脆不要任务好了。\n给玩家一个自由的世界，让他们想干什么就干什么。\n但我又觉得，事情没那么简单。\n因为人似乎并不那么擅长给自己寻找目标。\n有些游戏给了玩家极大的自由。你可以建造房屋、探索世界、收集资源，也可以什么都不做。\n刚开始的时候，这种自由让人兴奋。\n但玩了一段时间之后，你可能突然不知道自己该干什么了。\n房子已经建好了，资源也够用了，接下来呢？\n游戏没有告诉你。\n于是，你开始无聊。\n这跟现实生活其实很像。\n我们上班的时候，总觉得有人安排任务很烦，希望有一天能够自由支配自己的时间。\n可是等到真的放了一个长假，什么事情都不用做的时候，又可能在家里无所事事。\n刷刷手机，看看视频，一天就过去了。\n甚至还会怀念那种有事情可以忙的感觉。\n人好像很矛盾。\n我们讨厌别人给自己安排任务，却又希望有人告诉自己，接下来可以做点什么。\n所以，游戏真正的问题可能不是有没有任务，而是这些任务能不能持续给我们带来新的体验。\n同样是打怪，如果每一次战斗都需要采用不同的策略，每一次失败都能发现新的东西，那即使重复一百次，也可能很有意思。\n比如我最近玩《杀戮尖塔》，每一局都是爬塔、选牌、打怪，基本流程没有太大变化。\n但因为每次获得的卡牌不同、遗物不同、敌人不同，我就得不断调整自己的策略。\n有时候，一张原本觉得没什么用的卡牌，突然跟另一张牌产生了奇妙的配合。\n那种发现新玩法的感觉，就很有意思。\n但如果每次战斗只是换一批敌人，要求我重复已经熟练掌握的操作，那我可能很快就会厌烦。\n所以，重复本身未必无聊，真正无聊的是重复已经知道结果的事情。\n当然，《杀戮尖塔》也可能让人坐牢。\n当你连续失败十几局，满脑子只想着下一局一定要通关的时候，原本有趣的策略探索，也可能变成一种折磨。\n同一款游戏，有时候是娱乐，有时候却是坐牢。\n区别可能不完全在游戏，而在于你究竟是想体验什么，还是非得完成什么。\n有没有一种游戏，玩完之后反而更有精神？\n聊到这里，我又产生了一个疑问。\n我们为什么要玩游戏？\n当然是为了快乐。\n但快乐这个词似乎太宽泛了。\n有些游戏，玩的过程中非常刺激，让人根本停不下来。\n可是关掉游戏之后，你却觉得特别疲惫。\n眼睛酸痛，脑子昏沉，什么事情都不想做。\n甚至有点后悔，觉得自己又浪费了几个小时。\n这种体验很奇怪。\n明明整个过程都在追求快乐，结束之后却没有觉得自己得到了什么。\n我突然想到，好的游戏体验，会不会有点像适度运动？\n比如你去跑步，跑的过程中当然要付出体力，甚至会觉得有点累。\n但如果运动量恰到好处，结束之后，你反而觉得身体舒畅，精神也变好了。\n你不会因为刚才跑了几公里，就觉得自己接下来什么事情都不想做。\n相反，你可能更愿意去工作、阅读，或者处理一些生活中的事情。\n游戏有没有可能也产生这样的效果呢？\n它同样需要你付出努力，需要你思考、判断、解决问题。\n但这些努力没有让你筋疲力尽，反而让你的精神活跃起来。\n你可能刚刚解决了一个巧妙的谜题，突然发现了一个有意思的故事，或者在某个游戏里体验了一种从来没有接触过的思维方式。\n关掉游戏的时候，你不是觉得终于解脱了，而是觉得刚才那段时间过得很充实。\n甚至还想去做点别的事情。\n这种状态，我觉得可能比单纯的刺激更值得追求。\n当然，也不能说玩完之后觉得累的游戏就不是好游戏。\n有些精彩的电影，看完之后同样让人情绪低落。有些书籍，也会让人思考很久。\n而且，人本来就有需要彻底放松、什么都不想做的时候。\n但至少对于日常娱乐来说，我开始觉得，游戏好不好玩，不能只看玩的那几个小时，还应该看看关掉游戏之后，自己是什么状态。\n我们已经有那么多事情要完成了\n仔细想想，成年人的生活里，已经有太多需要完成的任务。\n上班要完成工作目标，回家要处理家庭事务，孩子有孩子的事情，父母有父母的事情。\n好不容易有一点属于自己的时间，打开游戏，却发现里面还有一大堆任务等着自己。\n今天要刷材料，明天要做日常，后天还要完成活动。\n如果不做，可能就错过了某些奖励。\n于是，你开始担心进度，担心落后，担心自己的时间没有得到充分利用。\n这不是很奇怪吗？\n我们明明是为了逃离现实中的任务，才进入游戏世界，结果却在另一个世界里，给自己安排了更多的任务。\n当然，也有人特别享受这种感觉。\n现实生活中的目标可能很遥远，努力了很久也未必有结果。\n但是游戏不一样。\n你完成一个任务，就能获得奖励；升级一件装备，战斗力就会提高；打败一个敌人，屏幕上就会出现胜利的提示。\n这种确定性，本身就很有吸引力。\n所以我也不觉得，喜欢刷刷刷的玩家有什么问题。\n只是对于我来说，随着年龄增长，能够自由支配的时间越来越少，我开始对这种重复劳动失去耐心。\n如果一个游戏已经不能给我带来新的东西，我可能就不愿意再花几十个小时，只为了看到一个通关画面。\n我也不确定，自己究竟喜欢什么类型的游戏。\n有时候想玩剧情，有时候想解谜，有时候又想在《杀戮尖塔》里研究一套新的卡组。\n但我希望玩完之后，自己还能精神饱满地去做点别的事情。\n毕竟，现实生活已经有那么多任务了，我可不想打个游戏，还要再坐一次牢。\n"},{"title":"写文章总得图点什么吧？有人图钱，有人图千古留名",
"url":"/blog/xie-wen-zhang-zong-de-tu-dian-shen-me-ba-you-ren-tu-qian-you-ren-tu-qian-gu-liu-ming/",
"date":"2026-10-27",
"headings":[],
"body":"我最开始写文章，其实没想那么多。\n就是脑子里经常冒出一些乱七八糟的想法，有时候是工作上的事情，有时候是生活中的小事，有时候只是突然对某个问题产生了兴趣。\n想明白一点，就想写下来。\n可能是为了清空一下脑子，也可能是希望有人能够理解我的想法。说得矫情一点，就是想把自己交出来，给这个世界看一看。\n至于有没有人看，当然也在乎，但一开始并没有那么在乎。\n后来，事情慢慢变得不一样了。\n我发现文章居然可以带来广告收益。\n虽然钱不一定多，但当你发现，原来写一篇文章不只是表达自己，还可以赚钱的时候，心态就开始发生微妙的变化。\n以前想的是，今天有什么值得写的？\n后来偶尔会想，今天写什么比较容易火？\n这两个问题看起来差不多，其实已经不是一回事了。\n一、写作者为什么这么容易被流量裹挟？\n因为流量真的有用。\n对于一个靠自媒体赚钱的人来说，阅读量就是收入，曝光量就是机会。阅读量高了，广告收益可能增加，品牌可能找上门，甚至还可能带来其他商业合作。\n如果你是在一家公司做内容，情况就更直接了。\n公司招一个写作者，当然希望他能够创造商业价值。一个人写得再有深度，如果文章长期没人看，可能还不如另一个天天写爆款的人受欢迎。\n毕竟，公司不是花钱请你来思考人生的。\n所以，追求流量有什么错呢？\n我觉得没有。\n一个富二代，衣食无忧，可能有足够的时间研究哲学，写一些自己感兴趣、但没几个人愿意看的东西。\n一个普通的工薪阶层，白天上班，晚上挤出时间写文章，希望每个月多赚一点钱，改善一下生活。\n你很难说，前者就比后者高尚。\n甚至同一个人，在不同的人生阶段，追求也可能完全不一样。\n年轻时想赚钱，中年时想表达自己，等到生活没有那么多压力了，又开始关心自己写的东西能不能留下来。\n人的追求本来就是会变化的。\n但我发现，真正让我被流量吸引的，甚至还不完全是钱。\n二、最可怕的不是想赚钱，而是写作变成了数字游戏\n现在的写作者，跟过去很不一样。\n以前写文章，可能要投稿，等编辑回复，等报纸出版，甚至等上很长时间，才能知道有没有人喜欢。\n现在呢？\n你在小红书发一篇文章，几分钟后就能看到阅读量。\n有人点赞了。\n有人收藏了。\n有人转发了。\n于是你忍不住打开后台看一眼。\n过了十分钟，又看一眼。\n过了半小时，再看一眼。\n有时候我自己都觉得可笑。\n明明刚才还在认真思考一个问题，文章发出去之后，却开始盯着几个数字，看它们有没有往上涨。\n甚至一篇文章写得好不好，自己心里已经有了判断，但如果阅读量不好，还是会有一点失落。\n反过来，一篇自己觉得很普通的文章，突然有了几万阅读量，又会莫名其妙地兴奋起来。\n这就很有意思了。\n原本写作是为了表达自己的想法，后来却变成了等待别人给自己的想法打分。\n而且，这个分数还是实时更新的。\n更麻烦的是，平台给你的反馈非常明确：什么标题容易火，什么话题有人看，什么表达方式容易引起争论。\n慢慢地，你就会学着迎合这些规则。\n不是有人强迫你这么做，而是你自己会主动调整。\n今天这个话题火了，明天就想再写一个类似的。\n今天这个标题带来了流量，下一次就忍不住继续使用。\n写着写着，你可能已经分不清，自己到底是想写这篇文章，还是想要这篇文章带来的数据。\n三、我也想让自己的文章穿越时间\n当然，我也有自己的一套标准。\n我希望自己的文章，能够穿越时间。\n比如今天发生了一件热点事件，我可能会写它，但我更想写的是，这件事情背后有什么值得思考的东西。\n两年之后，五年之后，当这个热点早就被人忘记了，我希望重新翻开这篇文章，依然能从里面找到一些有意思的观点。\n不一定是什么伟大的思想。\n可能只是一个观察问题的角度，一段个人经历，或者某个当时想明白了的小问题。\n最近我也会翻看自己以前写过的文章。\n有些文章，确实已经看不出当时为什么要写了。事情过去了，争论结束了，连我自己都对那个话题失去了兴趣。\n但也有一些文章，隔了很久再看，依然觉得有意思。\n甚至会惊讶，原来当时的自己是这样思考的。\n我挺喜欢这种感觉。\n就好像过去的自己留下了一点东西，几年后的自己还能重新捡起来。\n所以，比起单纯追逐热点，我更希望自己写下来的东西，能够经得起一点时间的考验。\n可是，想到这里，我又发现了一个问题。\n追求文章能够穿越时间，难道就比追求十万阅读量更高尚吗？\n好像也未必。\n四、有人图钱，有人图千古留名\n一个写作者希望自己的文章带来一千块广告收益。\n另一个写作者希望自己的文章，五十年后还有人读。\n我们很容易觉得，后者的追求更有格调。\n但仔细想想，这两个人不都是在期待某种回报吗？\n一个期待金钱，一个期待名声。\n一个希望现在有更多人看到，一个希望未来还有人记得。\n甚至所谓的千古留名，可能也是一种更大的虚荣心。\n只不过，前者想要的东西可以马上兑现，后者想要的东西可能要几十年，甚至几百年之后才能得到验证。\n我们为什么会认为，等待时间越长的欲望，就一定越高尚呢？\n当然，有人会说，我写作不是为了钱，也不是为了名声，我只是为了追求真理。\n这当然也是一种可能。\n但追求真理的人，也可能希望自己的思想被理解、被认可、被传播。\n一个人写下了自己认为非常重要的东西，却始终没有人愿意看，他真的能够完全不在乎吗？\n我不知道。\n至少我自己做不到。\n我希望自己的文章有深度，也希望它有人看。\n我希望它能够穿越时间，也希望今天就有人给我点个赞。\n如果还能顺便赚一点广告费，那当然更好。\n这些想法其实一直同时存在，并没有那么泾渭分明。\n而且我越来越觉得，没有必要非得给它们排一个高低。\n想赚钱不丢人，想被认可也不丢人，想留下点什么，同样没什么可笑的。\n五、可是，我们为什么一定要从写作中得到点什么？\n聊到最后，我突然想到了一个比喻。\n写文章就像往水里扔一颗石子。\n你把石子扔出去，总会期待一点水花。\n有人期待水花越大越好，最好能让所有人都看到。\n有人希望水花能换来一点钱。\n有人希望这颗石子能够沉到水底，很多年之后，还有人能够发现它。\n但不管是哪一种，好像都在期待一个结果。\n那扔石子这件事情本身呢？\n我们有没有可能，只是因为喜欢扔石子，所以才去扔？\n写作也是一样。\n我最开始写文章的时候，很多快乐其实来自写作本身。\n一个模糊的问题，经过反复思考，突然变得清晰。\n两个原本毫不相关的事情，忽然发现它们之间存在某种联系。\n有时候写着写着，甚至会推翻自己最开始的想法。\n这种感觉其实很有意思。\n就像一个人在脑子里探险，原本不知道会走到哪里，走着走着，却发现了一条新的路。\n而当文章发表之后，我们的注意力又很容易从这种探索的快乐，转移到阅读量、点赞数、收益，以及未来会不会有人记得它。\n我并不觉得这些期待有什么问题。\n毕竟，如果一颗石子扔进水里，连一点水花都没有，多少还是会有些失落。\n但我也开始想，假如有一天，我写了一篇自己非常满意的文章，结果只有十个人阅读，没有点赞，也没有广告收益，五年之后可能连我自己都忘记了它。\n那这篇文章算不算白写了？\n如果按照流量标准，它可能是失败的。\n如果按照穿越时间的标准，它可能也是失败的。\n可是在写它的那个下午，我确实因为一个问题想通了而感到高兴。\n这个下午，难道就没有价值吗？\n我现在还没有想清楚，写作者到底应该给自己设立什么标准。\n也许不同阶段，我们需要的标准本来就不一样。\n只是我希望，自己以后在关心一篇文章有多少阅读量、能赚多少钱、能不能穿越时间的时候，偶尔也能想起最开始写作的那个自己。\n那时候，我只是脑子里有点东西，想把它写出来。\n至于石子扔出去之后，能溅起多大的水花，其实是后来的事。\n"},{"title":"中年人的“电子阳痿”，可能根本不存在",
"url":"/blog/zhong-nian-ren-de-dian-zi-yang-wei-ke-neng-gen-ben-bu-cun-zai/",
"date":"2026-10-27",
"headings":[],
"body":"不知道从什么时候开始，网上流行起了一个词，叫“电子阳痿”。\n大概意思就是，人到中年，明明喜欢玩游戏，电脑里也装满了游戏，Steam 游戏库里甚至还有一大堆买了没玩的，但就是提不起兴趣。\n有时候兴致勃勃地打开电脑，翻了半天游戏列表，最后又默默关掉。\n于是大家开始感慨，是不是年纪大了，游戏也不好玩了？\n我觉得这个问题挺有意思的。\n如果说现在的游戏不好玩，好像也说不过去。\n现在的游戏无论画面、技术还是玩法，都比过去丰富得多。即使你不喜欢新游戏，也完全可以回去玩以前的经典作品。\n事实上，光是过去几十年发行的游戏，一个人穷尽一生，恐怕都玩不完。\n既然如此，为什么我们反而不想玩了？\n有人说，是因为见识多了。\n以前看到一个新游戏，什么都觉得新鲜。现在看一眼宣传片，大概就知道它是什么玩法，甚至连剧情套路都能猜个七七八八。\n也有人说，是因为学习能力下降了。\n小时候拿到一款游戏，愿意花几个小时研究操作，研究系统。现在看到密密麻麻的技能树、装备系统和教学提示，第一反应就是：怎么这么麻烦？\n还有一个更现实的原因，就是没时间。\n工作、家庭、孩子，每天留给自己的时间可能只有那么一两个小时。与其打开一款需要几十个小时才能通关的游戏，不如躺在沙发上刷刷短视频。\n这些解释都有道理。\n但我后来想到一个问题：\n我们为什么一定要拿现在的自己，跟十几二十岁时的自己比较呢？\n我是在九十年代长大的。\n那个时候，游戏远没有现在这么容易获得。\n家里条件好一点的，可能有 PS、土星之类的游戏机。更多人接触的是小霸王、Game Boy，后来还有 GBA 和电脑游戏。\n而且那时候能够接触到的游戏数量也很有限。国内引进的游戏不多，盗版和汉化资源也集中在少数作品上。\n但奇怪的是，选择那么少，我们却玩得特别开心。\n一款游戏可以玩几个月，甚至几年。\n通关以后还不舍得放下，要研究有没有隐藏剧情、隐藏人物，有没有什么自己没发现的秘密。\n我还记得以前特别喜欢买一本杂志，叫《大众软件》。\n几乎每一期都会买。\n里面有游戏介绍、攻略、秘籍，还有各种游戏背后的故事。\n有时候自己根本没有玩过那款游戏，也能把攻略看得津津有味。玩过的游戏就更不用说了，恨不得把所有相关内容都翻出来看一遍。\n那种感觉很奇妙。\n游戏明明已经通关了，但它好像还没有结束。你仍然愿意花大量时间去了解它，琢磨它。\n现在回头想想，这种体验其实跟当时的环境有很大关系。\n因为选择少，所以我们会把注意力集中在少数几款游戏上。\n因为没有那么多攻略视频，所以很多东西只能自己慢慢摸索。\n更重要的是，我们有大把时间。\n年轻的时候，跟朋友去网吧，待上一整天甚至两天，中间出来吃个饭，回去接着玩。\n当时觉得这再正常不过了。\n但现在想想，一个成年人怎么可能经常这样生活？\n你有工作，有家庭，有孩子，有各种需要处理的事情。哪怕没有这些责任，你也可能想去旅游、运动、社交，或者做点别的事情。\n游戏只不过是众多娱乐方式中的一种。\n所以我突然觉得，我们小时候那种可以把大量时间投入游戏的状态，可能才是一种特殊状态。\n而我们现在的生活，反而更接近一个普通成年人的常态。\n这就有点意思了。\n所谓的“电子阳痿”，其实隐含着一个判断标准：一个正常的游戏爱好者，应该始终对游戏保持旺盛的兴趣，愿意花大量时间去玩。\n可是这个标准是谁定的呢？\n如果拿一个三十多岁的人跟十几岁的自己比较，那他当然会觉得自己退步了。\n以前可以连续玩十个小时，现在玩一个小时就想休息。\n以前愿意花几天研究一个游戏系统，现在连教程都懒得看。\n但如果拿他跟其他普通成年人比较呢？\n可能根本没有什么异常。\n有人下班喜欢打球，有人喜欢喝茶，有人喜欢看电影，有人喜欢陪孩子，还有人喜欢什么都不干。\n为什么一个曾经喜欢玩游戏的人，到了中年就必须继续保持同样的热情？\n难道年轻时喜欢打篮球，到了中年不想打了，也要给自己发明一个“篮球阳痿”？\n当然，我并不是说年龄对人的影响不存在。\n精力会变化，学习新东西的意愿可能下降，生活压力也确实会消耗一个人的兴趣。\n但这些变化不一定意味着我们失去了某种能力。\n也可能只是因为，我们不再愿意为同样的事情付出同样的成本。\n最近我一直在玩《杀戮尖塔》。\n这是一款卡牌游戏，每一局都要重新开始，失败了就再来。\n它没有什么复杂的剧情，也不需要记住上次任务进行到哪里。\n有时候坐地铁，拿出来玩一会儿；有时候晚上有空，就再打一局。\n输了也没关系，下次重新开始。\n但有意思的是，我发现自己居然又开始像小时候那样研究游戏了。\n我会琢磨不同卡牌之间的组合，研究怎么实现无限循环，怎么打败最终 Boss。\n有时候失败了，还会反复分析到底是哪一张牌拿错了，或者哪一个决策出了问题。\n甚至不玩游戏的时候，我也会去看别人的攻略，研究各种打法。\n这不就跟小时候买《大众软件》，反复研究一款游戏的感觉差不多吗？\n原来我并不是不喜欢研究游戏了。\n只是现在的我，不太愿意为一款游戏连续投入几十个小时，不太愿意每次打开游戏，都要重新回忆上次的剧情和任务。\n但是如果一款游戏能够适应我的生活节奏，我仍然可以从中找到很多乐趣。\n当然，《杀戮尖塔》也不一定真的节省时间。\n有时候一局接着一局，不知不觉也玩了很久。\n但它至少给了我一种选择：我可以投入十分钟，也可以投入两个小时，而不需要提前为它安排一整个下午。\n我觉得这可能是一个值得思考的方向。\n我们总是在讨论，为什么中年人不爱玩游戏了。\n但或许更应该问的是：\n为什么我们认为，一个人到了中年，还应该像年轻时那样玩游戏？\n小时候，我们拥有的娱乐方式很少，却有大量时间。\n现在，我们拥有的娱乐方式很多，却没有那么多时间。\n以前我们需要靠少数几款游戏填满漫长的下午，现在却要在无数种事情中，决定把有限的时间分给谁。\n环境变了，生活变了，选择变了。\n我们对游戏的要求自然也会跟着改变。\n其实，根本就没有什么“电子阳痿”。\n一个三十多岁的人，终于过上了三十多岁的人该有的生活。这怎么就成了一种病？\n"},{"title":"为什么我的人生没有伟大的目标？",
"url":"/blog/wei-shen-me-wo-de-ren-sheng-mei-you-wei-da-de-mu-biao/",
"date":"2026-10-26",
"headings":[{"level":2,"id":"yi-dang-gong-ju-yue-lai-yue-qiang-da-wo-que-bu-zhi-dao-yao-zuo-shen-me","permalink":"https://linxz.online/blog/wei-shen-me-wo-de-ren-sheng-mei-you-wei-da-de-mu-biao/#yi-dang-gong-ju-yue-lai-yue-qiang-da-wo-que-bu-zhi-dao-yao-zuo-shen-me","title":"一、当工具越来越强大，我却不知道要做什么","children":[]},{"level":2,"id":"er-mu-biao-wei-shen-me-mei-you-xuan-ze-wo","permalink":"https://linxz.online/blog/wei-shen-me-wo-de-ren-sheng-mei-you-wei-da-de-mu-biao/#er-mu-biao-wei-shen-me-mei-you-xuan-ze-wo","title":"二、目标为什么没有选择我？","children":[]},{"level":2,"id":"san-wei-shen-me-lao-ban-zong-neng-qing-yi-ding-chu-mu-biao","permalink":"https://linxz.online/blog/wei-shen-me-wo-de-ren-sheng-mei-you-wei-da-de-mu-biao/#san-wei-shen-me-lao-ban-zong-neng-qing-yi-ding-chu-mu-biao","title":"三、为什么老板总能轻易定出目标？","children":[]},{"level":2,"id":"si-yuan-lai-mu-biao-bu-yi-ding-shi-wei-liao-shi-xian-de","permalink":"https://linxz.online/blog/wei-shen-me-wo-de-ren-sheng-mei-you-wei-da-de-mu-biao/#si-yuan-lai-mu-biao-bu-yi-ding-shi-wei-liao-shi-xian-de","title":"四、原来，目标不一定是为了实现的","children":[]},{"level":2,"id":"wu-ye-xu-wo-yi-zhi-wu-jie-liao-wei-da-de-mu-biao","permalink":"https://linxz.online/blog/wei-shen-me-wo-de-ren-sheng-mei-you-wei-da-de-mu-biao/#wu-ye-xu-wo-yi-zhi-wu-jie-liao-wei-da-de-mu-biao","title":"五、也许我一直误解了伟大的目标","children":[]},{"level":2,"id":"liu-sheng-huo-bu-yi-ding-xu-yao-yi-tiao-zao-yi-xie-hao-de-zhu-xian","permalink":"https://linxz.online/blog/wei-shen-me-wo-de-ren-sheng-mei-you-wei-da-de-mu-biao/#liu-sheng-huo-bu-yi-ding-xu-yao-yi-tiao-zao-yi-xie-hao-de-zhu-xian","title":"六、生活不一定需要一条早已写好的主线","children":[]}],
"body":"我在玩游戏、看小说或者看电影的时候，经常会发现一件事情：故事里的主角，似乎总有一个明确的目标。\n有的人要拯救世界，有的人要保卫自己的村庄，有的人要推翻一个邪恶的组织。哪怕只是一个普通的冒险故事，主角也总有一件非做不可的事情。\n这些目标可能很宏大，也可能很简单，但它们都有一个共同点：足以支撑主角不断行动，甚至为此付出一生。\n可是回头看看自己的生活，我却发现一个奇怪的问题：\n为什么我的人生，好像没有一个值得长期追求的目标？\n每天上班、下班，照顾家庭，偶尔玩玩游戏，研究一些感兴趣的东西。生活当然有很多事情要做，但如果突然有人问我，你这一生究竟想完成什么？\n我好像回答不上来。\n以前我会安慰自己，毕竟我是个普通人，没有什么伟大的目标也很正常。\n但后来想想，这个解释似乎有点牵强。\n谁规定普通人就不能有伟大的目标呢？\n目标又不需要真的实现。一个普通人完全可以梦想改变世界，或者改变一个行业，甚至只是想创造一件属于自己的作品。\n问题不在于我能不能做到，而在于，我似乎连这样的念头都很少产生。\n究竟是伟大的目标没有选择我，还是我没有选择它？\n一、当工具越来越强大，我却不知道要做什么\n最近使用AI的时候，我对这种感觉尤其强烈。\n现在的AI工具已经非常强大了。写代码、做软件、生成图片、分析数据，很多以前需要专业技能才能完成的事情，现在普通人也可以尝试。\n我自己也订阅了比较高级的AI套餐。\n刚开始的时候，确实有很多想法。尝试做一些小游戏，开发一些自己用的软件，把工作中的流程自动化。\n但折腾了一段时间之后，我却发现，自己好像没什么事情需要它做了。\n每个月付着不便宜的订阅费，实际使用量却远远达不到套餐的上限。\n有时候看别人分享AI的使用经验，会觉得很奇怪。\n为什么别人有那么多东西想做？有人开发产品，有人经营自己的项目，有人不断尝试新的商业模式。\n而我明明也拥有这些工具，却经常不知道下一步该做什么。\n以前总觉得，是能力限制了自己的想象力。\n现在工具已经把很多能力上的门槛降低了，我反而发现，真正稀缺的可能是那个让我愿意持续投入的目标。\n这就有点尴尬了。\n以前是想做却做不到，现在是好像什么都能试试，却不知道自己究竟想做什么。\n二、目标为什么没有选择我？\n我开始想，为什么有些人会产生改变世界的念头，而我没有？\n可能首先是环境和机会的问题。\n一个创业者，身边都是投资人、创业者和行业专家，他每天接触的事情，就是市场规模、商业模式、行业竞争。\n他很容易产生一个想法：我要做一家什么样的公司，我要改变这个行业的什么问题。\n但如果一个人长期生活在相对稳定的环境里，每天面对的是固定的工作、收入和家庭事务，那么他的思考自然也容易围绕这些事情展开。\n不是他没有想象力，而是他的生活没有不断向他提出那些问题。\n游戏里的主角也是如此。\n如果没有怪物入侵村庄，他可能一辈子都不会想着成为英雄。如果没有战争，他可能也不会产生保卫国家的使命感。\n很多伟大的目标，并不是一个人坐在家里凭空想出来的。\n而是环境把某个问题推到了他的面前。\n当然，这也不能完全归咎于环境。\n同样的环境里，有些人会主动寻找机会，有些人则更愿意维持现状。\n我也可以主动接触新的行业，认识不同的人，尝试一些自己从来没做过的事情。\n但我没有那么强烈的动力。\n所以这件事情可能有两个方向：\n一方面，是环境和机会没有把目标送到我面前。\n另一方面，是我自己也没有主动去寻找它。\n这两个因素交织在一起，最后就形成了一种状态：我并不讨厌现在的生活，但也不知道自己究竟要往哪里走。\n三、为什么老板总能轻易定出目标？\n后来，我突然想到一个很有意思的对比。\n在公司里，制定目标似乎是一件再正常不过的事情。\n老板会制定年度目标，管理层会拆解季度目标，下面的员工又会把目标落实到每个月、每个星期。\n为什么公司里的目标这么容易产生，而个人生活里的目标却这么难？\n我觉得一个重要原因是，公司的目标本来就是组织运作的需要。\n老板可能接受了投资人的资金，就需要告诉投资人，公司未来几年要增长多少，什么时候盈利，有没有上市的计划。\n管理层接受了老板的要求，就需要把这些目标拆解成具体的任务。\n普通员工则需要完成自己的业绩指标。\n每个人似乎都有目标，但这些目标并不完全来自个人的理想，而是来自他们所处的位置。\n换句话说，很多时候不是一个人先有目标，才进入某个环境。\n而是他进入了某个环境，那个环境要求他必须有目标。\n但个人生活就不一样了。\n假设我给自己设定一个目标：未来每个季度，家庭收入增长2%。\n这个目标看起来很合理，也很具体。\n可问题是，这2%从哪里来？\n公司可以通过增加客户、拓展业务、调整价格来争取增长。但对于一个收入相对固定的普通家庭来说，收入并不是想增长就能增长的。\n我当然可以设定这个目标，但如果找不到实现它的途径，设定又有什么意义呢？\n久而久之，目标反而会变成一种负担。\n这也让我意识到，公司的目标和个人的目标，可能从一开始就不是完全相同的东西。\n四、原来，目标不一定是为了实现的\n不过，真正让我改变想法的，是我重新思考了公司制定目标这件事。\n以前我一直觉得，既然制定了目标，就应该努力实现它。\n如果一个目标经常实现不了，那是不是说明制定目标的人不够了解现实？\n但观察久了，我发现老板制定的业绩目标，很多时候并不是他心里真正预期的结果。\n比如，公司可能提出一个非常高的增长目标。\n但老板和股东心里，可能早就有了一个相对现实的底线。\n他们不会把这个底线直接告诉所有人，而是希望大家朝着更高的目标努力。\n如果目标太容易实现，大家可能就没有动力继续突破。\n如果目标高得离谱，大家又可能直接放弃。\n所以目标需要不断调整。\n以前我觉得，这样制定目标是不是有点不严谨？甚至有点像是在利用人的心理。\n但现在我开始理解，目标可能从来就不只是一个等待兑现的数字。\n它更重要的作用，是让人产生行动。\n一个目标提出之后，团队开始尝试新的办法，投入更多资源，寻找新的机会。\n最后即使没有实现原定目标，也可能取得了原本不会发生的进展。\n而管理者根据这些结果，再去调整下一阶段的目标。\n如此反复。\n这时候，目标就不再是一个必须实现的承诺，而更像是推动行动的一种工具。\n它不一定完全符合现实，但也不能脱离现实太远。\n它需要让人相信，自己再努力一点，或许就能做到。\n这个发现让我觉得挺有意思的。\n因为我们平常总把目标看得太神圣了。\n似乎一个目标必须经过深思熟虑，必须符合自己的能力，必须有明确的实现路径，最好还能坚持十年、二十年。\n但如果目标的作用首先是让人行动，那么我们为什么一定要等到想清楚一切之后，才允许自己设定目标呢？\n五、也许我一直误解了伟大的目标\n重新回到最开始的问题。\n为什么我的人生没有一个伟大的目标？\n我突然觉得，也许是因为我把目标的意义想反了。\n我一直以为，应该先找到一件值得奋斗终生的事情，然后再开始行动。\n就像游戏里的主角一样，先知道自己要拯救世界，然后踏上旅程。\n但现实生活可能恰好相反。\n很多人最开始也不知道自己究竟要做什么。\n他只是对某件事情产生了兴趣，尝试了一下，发现有点意思，于是继续做。\n做着做着，他接触到更多的人，发现更多的问题，也获得了更多的能力。\n原本只是一个很小的念头，后来才慢慢变成一个值得长期投入的目标。\n我们看到的那些伟大人物，往往已经站在故事的终点。\n回头看，他们的一生似乎有一条非常清晰的主线。\n但如果回到故事开始的时候，他们未必真的知道自己最终会走向哪里。\n就像我最开始研究AI，只是觉得有趣，想做一些东西。\n后来没有继续下去，我就觉得自己缺乏目标。\n但也许我根本不需要一开始就想清楚，要用AI创造一家多么伟大的公司，或者做出一个改变世界的产品。\n我完全可以先给自己设定一个有点吸引力、又不那么容易实现的目标。\n比如，尝试做出一个真正有人愿意使用的软件。\n至于它最后有没有人使用，能不能赚到钱，甚至能不能顺利做出来，都可以在过程中再去验证。\n如果发现这个方向不值得继续投入，就调整它，甚至放弃它。\n这不一定意味着失败。\n因为目标已经完成了它的一部分使命：让我开始行动，让我接触到原本不会接触的东西。\n而新的机会，也可能正是在这个过程中出现的。\n六、生活不一定需要一条早已写好的主线\n我想，游戏和现实生活最大的区别，可能就在这里。\n游戏设计者通常已经知道主角最终要去哪里。\n所以他可以把目标放在故事的开头，让玩家沿着这条路线前进。\n但现实生活没有这样一个设计者。\n没有人提前写好我的主线任务，也没有人保证我选择的方向一定有意义。\n如果我一直等待一个足够伟大的目标出现，等待自己突然产生某种强烈的使命感，那么我可能真的会等很久。\n反过来，如果我只是给自己设定一个暂时值得追求的方向，让它推动自己去做一些事情，那么即使最后没有实现，也不一定有什么损失。\n当然，目标也不能完全凭空编造。\n它至少应该让我有一点兴趣，有一点期待，让我愿意为它投入时间和精力。\n至于它够不够伟大，能不能坚持一辈子，反而不必急着回答。\n目标不一定是人生的答案，它也可以只是让我愿意继续探索人生的一个理由。\n"},{"title":"我想与众不同，但请大家一定要喜欢我",
"url":"/blog/wo-xiang-yu-zhong-bu-tong-dan-qing-da-jia-yi-ding-yao-xi-huan-wo/",
"date":"2026-10-26",
"headings":[{"level":2,"id":"yi-ru-guo-zhen-de-yu-zhong-bu-tong-ni-ke-neng-gen-ben-gao-xing-bu-qi-lai","permalink":"https://linxz.online/blog/wo-xiang-yu-zhong-bu-tong-dan-qing-da-jia-yi-ding-yao-xi-huan-wo/#yi-ru-guo-zhen-de-yu-zhong-bu-tong-ni-ke-neng-gen-ben-gao-xing-bu-qi-lai","title":"一、如果真的与众不同，你可能根本高兴不起来","children":[]},{"level":2,"id":"er-ke-shi-gen-da-jia-yi-yang-wo-men-you-bu-gan-xin","permalink":"https://linxz.online/blog/wo-xiang-yu-zhong-bu-tong-dan-qing-da-jia-yi-ding-yao-xi-huan-wo/#er-ke-shi-gen-da-jia-yi-yang-wo-men-you-bu-gan-xin","title":"二、可是，跟大家一样，我们又不甘心","children":[]},{"level":2,"id":"san-suo-wei-de-zheng-chang-bu-guo-shi-ni-shen-bian-de-ren-du-zhe-yang","permalink":"https://linxz.online/blog/wo-xiang-yu-zhong-bu-tong-dan-qing-da-jia-yi-ding-yao-xi-huan-wo/#san-suo-wei-de-zheng-chang-bu-guo-shi-ni-shen-bian-de-ren-du-zhe-yang","title":"三、所谓的正常，不过是你身边的人都这样","children":[]},{"level":2,"id":"si-wo-men-xiang-cheng-wei-guai-tai-dan-zhi-xiang-bi-tong-lei-guai-yi-dian-dian","permalink":"https://linxz.online/blog/wo-xiang-yu-zhong-bu-tong-dan-qing-da-jia-yi-ding-yao-xi-huan-wo/#si-wo-men-xiang-cheng-wei-guai-tai-dan-zhi-xiang-bi-tong-lei-guai-yi-dian-dian","title":"四、我们想成为怪胎，但只想比同类怪一点点","children":[]},{"level":2,"id":"wu-na-me-wo-dao-di-shi-bu-shi-yi-ge-guai-tai","permalink":"https://linxz.online/blog/wo-xiang-yu-zhong-bu-tong-dan-qing-da-jia-yi-ding-yao-xi-huan-wo/#wu-na-me-wo-dao-di-shi-bu-shi-yi-ge-guai-tai","title":"五、那么，我到底是不是一个怪胎？","children":[]}],
"body":"最近写文章的时候，我常常有一种奇怪的感觉。\n我觉得自己应该是个挺正常的人。我关心的问题，别人应该也会关心；我觉得有意思的思考，别人应该也会觉得有意思。\n所以，我把这些想法写成文章，满心期待会有人产生共鸣。\n结果却很奇怪。\n有些我觉得没什么特别的文章，阅读量反而不错。有些我花了很多时间思考，自认为很有意思的话题，却没几个人看。\n这让我偶尔会怀疑：难道我是个怪胎吗？\n我觉得有趣的东西，别人根本不感兴趣。我觉得值得思考的问题，别人可能压根就没想过。\n但转念一想，怪胎又有什么不好呢？\n我们不是总希望自己与众不同吗？\n可仔细想想，这件事情似乎又没有那么简单。\n一、如果真的与众不同，你可能根本高兴不起来\n最近我在玩一款游戏，叫《超凡双生》。\n游戏的女主角朱迪，从小就拥有一种特殊能力，可以与一个神秘的灵体产生联系。\n按照一般游戏的逻辑，拥有超能力应该是件值得高兴的事情。你比别人厉害，可以做到别人做不到的事情，简直就是天选之人。\n但朱迪的人生恰恰相反。\n她从小就被当成怪胎，无法像普通孩子一样生活。别人可以交朋友、参加派对、谈恋爱，她却常常因为自己的特殊能力受到排斥，甚至被人恐惧。\n她的能力还让她成为研究和控制的对象。\n她明明拥有别人梦寐以求的超能力，却连普通人的生活都很难拥有。\n我玩到这里的时候，就觉得很有意思。\n我们常常幻想自己拥有某种特殊能力，成为人群中最特别的那个人。\n但假如这种特别意味着你无法融入群体，意味着别人不愿意跟你玩，意味着你走到哪里都被当成异类，那你还愿意吗？\n恐怕很多人都不愿意。\n因为我们想象中的与众不同，通常伴随着羡慕、掌声和赞美。\n但现实中的与众不同，可能伴随着孤独、误解和排斥。\n如果没有人欣赏你的特别，那这种特别还有多少吸引力呢？\n二、可是，跟大家一样，我们又不甘心\n另一款游戏《去月球》，恰好提供了一个相反的例子。\n游戏中的女主角 River 有着与别人不太一样的行为方式，不太擅长普通的社交，也常常不被别人理解。\n但男主角 Johnny 年轻时，恰恰被她的特别所吸引。\n其中一个很有意思的细节是，Johnny 希望自己成为一个特别的人。他不甘心只是人群中毫不起眼的一个，所以会被 River 的与众不同吸引。\n他甚至有一点想通过接近这个特别的女孩，让自己也变得特别。\n这就很微妙了。\n在《超凡双生》里，朱迪因为与众不同而痛苦。\n在《去月球》里，Johnny 却因为自己不够与众不同而焦虑。\n一个想成为普通人，一个不甘心成为普通人。\n到底怎样才好呢？\n我又想起陈奕迅的《浮夸》。\n这首歌里的人物，同样渴望得到关注。他不甘心被淹没在人群中，于是试图通过夸张的表达，让别人注意到自己。\n这其实是一种很常见的心理。\n我们不希望自己奇怪到被别人排斥，但又希望自己特别到值得别人关注。\n我们希望别人觉得自己有个性、有品位、有思想，最好还有一点别人没有的天赋。\n但前提是，别人必须认可这些东西。\n所以，我们真正想要的，可能根本不是与众不同。\n而是被认可的与众不同。\n我可以是怪胎，但最好是一个很酷的怪胎。\n我可以跟别人不一样，但你们一定要觉得我这样很棒。\n如果我的特别得不到认可，那我可能马上就不想特别了。\n三、所谓的正常，不过是你身边的人都这样\n但问题又来了。\n究竟谁有资格决定，什么样的特别值得认可？\n我们经常会说，某个人很正常，某个人很奇怪。\n可这个正常的标准，究竟是从哪里来的？\n我觉得很大程度上，来自我们身边的群体。\n比如二次元文化。\n一个人穿着动漫角色的服装走在街上，可能会吸引很多奇怪的目光。\n但如果他走进一场漫展，周围几百个人都穿着类似的服装，他反而成了一个再正常不过的人。\n他的衣服没有变，他的行为没有变。\n变的只是周围的人。\n甚至在漫展里，如果他穿得太普通，反而可能显得有点格格不入。\n这就很有意思了。\n怪胎并不是一种固定的身份，而是一种相对的位置。\n你是不是怪胎，可能根本不取决于你是什么样的人，而取决于你站在哪一群人中间。\n我以前跟一个美国人聊过流浪汉的问题。\n当时我很好奇，为什么有些流浪汉宁愿在大雪天露宿街头，也不愿意接受救助？\n我以为作为美国本地人，他应该更能理解这些人的处境。\n但他的回答非常简单：因为他们懒，不愿意按时领取食物。\n那一刻我突然意识到，即使生活在同一个国家，人和人之间的理解也可能是断裂的。\n我还想起深圳的“三和大神”。\n这些人曾经因为特殊的生活方式而受到关注。他们有些人只打几天零工，赚到钱就休息，花完了再去工作。\n如果你每天在深圳南山的写字楼里上班，习惯了升职、加薪、买房、规划未来，可能很难理解这种生活。\n还有柬埔寨一些工人的故事。\n据说有些人发了工资，就跑去高级酒店消费一晚，剩下的日子靠非常简单的食物度过。\n这两群人相隔很远，语言、文化、国家都不一样。\n但如果把他们放在一起，我猜他们反而可能理解彼此。\n因为他们似乎共享着某种相似的生活逻辑。\n他们不那么信任长期规划，不愿意为了遥远的未来牺牲眼前的体验。\n在一些人眼里，这叫不负责任、没有上进心。\n但在另一些人眼里，这也许叫自由。\n当然，他们各自的处境和选择未必相同，也不能简单地归为一类。但至少说明了一件事：\n我们以为理所当然的生活方式，未必是所有人共同认可的标准。\n甚至可能存在这样的情况：\n一个中国人和一个美国人，因为相似的价值观而彼此理解，却无法理解生活在自己隔壁的人。\n我们总以为，认同应该发生在国家、城市、家庭这些既定的群体之内。\n但认同也可能发生在这些边界之外。\n互联网更是把这件事情放大了。\n一个在小城市里被当成怪胎的人，可能在网上找到成千上万个跟自己一样的人。\n他突然发现，原来自己一点都不特别。\n只不过以前站错了地方。\n四、我们想成为怪胎，但只想比同类怪一点点\n想到这里，我又发现了一个更有意思的矛盾。\n假如一个人因为自己的特别而被主流群体排斥，他可能会去寻找另一个更能接受自己的群体。\n比如二次元爱好者，或者某些小众音乐、游戏、艺术的爱好者。\n进入这个群体之后，他终于不用再担心自己奇怪了。\n但接下来会发生什么？\n他可能又开始希望自己比这个群体里的其他人更特别一点。\n别人都喜欢某个角色，他偏偏喜欢一个冷门角色。\n别人都在玩热门游戏，他希望自己发现一款没人听说过的神作。\n别人都在讨论某个流行观点，他希望自己能够提出不一样的见解。\n你看，事情又回到了原点。\n他逃离了一个不接受自己的群体，进入一个能够接受自己的群体。\n但他仍然希望在这个新群体中，成为一个与众不同的人。\n只不过，这一次他非常清楚，自己的特别不能超出这个群体能够接受的范围。\n我们既想成为群体的一员，又想成为群体里比较特别的那一员。\n这似乎才是很多人真正追求的状态。\n我们需要群体，因为群体提供安全感、认同感和归属感。\n但我们又不满足于完全融入群体，因为那样会让自己变得毫不起眼。\n所以，我们总是在两者之间寻找一个微妙的位置。\n既不能太普通，也不能太奇怪。\n最好是别人一眼就能看出我的特别，但又不会因此讨厌我。\n说起来，这个要求还挺高的。\n甚至有一点贪心。\n我们既想享受与众不同带来的好处，又不想承担与众不同带来的代价。\n五、那么，我到底是不是一个怪胎？\n回到最开始写文章的问题。\n我为什么会觉得，自己感兴趣的东西，别人也应该感兴趣？\n其实是因为我不自觉地把自己当成了一个普通人的样本。\n我觉得自己很正常，所以我关心的问题，应该也是很多正常人关心的问题。\n但现在想想，这个推论未必成立。\n我觉得一个问题很有趣，也许只是因为我刚好有过某种经历，读过某些东西，玩过某些游戏，或者习惯了某一种思考方式。\n这些东西组合在一起，让我对某个问题产生了兴趣。\n别人没有这些经历，自然未必有同样的兴趣。\n反过来也是一样。\n别人热衷的事情，我也未必能够理解。\n更有意思的是，当我发现自己的文章没人看的时候，我会怀疑自己是不是怪胎。\n但假如某篇文章突然有几万人阅读，我又可能会觉得，原来有这么多人跟我一样。\n实际上，我的想法并没有因为阅读量而发生改变。\n只是认可我的人数变了。\n那我究竟是正常人，还是怪胎呢？\n如果我需要通过阅读量来判断自己是不是正常，那不就意味着，我仍然在等待别人替我定义自己吗？\n而这恰恰又回到了前面那个矛盾。\n我希望自己的思考跟别人不一样，因为这样才有写出来的价值。\n但我又希望别人都能理解、欣赏，最好还愿意转发。\n我希望自己是个怪胎，但最好是一个有很多粉丝的怪胎。\n"},{"title":"我这么菜，你能教我吗？",
"url":"/blog/wo-zhe-me-cai-ni-neng-jiao-wo-ma/",
"date":"2026-10-23",
"headings":[],
"body":"最近写了几篇关于游戏的文章，其中提到了《杀戮尖塔》，也分享了一些自己玩游戏时的思考。\n评论区偶尔会出现一些很有意思的声音。\n“你这么菜，要不我来教你？”\n“这水平，我来带你吧。”\n看到这种评论，我倒没有觉得特别生气，甚至有一点不屑。毕竟大家也没真正交过手，谁的水平高、谁的水平低，还不一定呢。\n不过，我反而产生了另一个疑问：\n假设你真的比我厉害，那你就一定能教好我吗？\n这件事情让我想起了很多年前的一位数学老师。\n一、高手不一定是好老师\n读书的时候，我们学校有一位公认很厉害的数学老师。\n他是真的厉害，解题能力很强，甚至可以说是竞赛级别的选手。那些我们绞尽脑汁都做不出来的题目，在他眼里似乎根本不算什么。\n但奇怪的是，他并没有把我们教成全年级数学最好的班级。\n我印象很深的是，他经常觉得我们很笨。\n这么简单的东西，为什么你们都不会？\n有时候上课，他就在黑板上把题目解一遍，解完之后，课也差不多结束了。\n我们看着他行云流水般的解题过程，确实觉得很厉害，但看完之后，自己还是不会。\n现在回过头来想，我倒觉得这位老师很有代表性。\n他可能是一个非常优秀的学习者，却未必是一个非常优秀的教育者。\n因为学习和教学，看起来是在处理同一份知识，实际上却是两种完全不同的能力。\n二、学习只需要解决自己的问题\n我们通常是怎么学会一件事情的？\n拿我玩游戏来说。\n碰到打不过的 Boss，我会去网上找攻略，看看别人怎么打。如果文字看不懂，我就找视频，看高手怎么操作。\n然后自己模仿一下，发现哪里不对，再去调整。\n观察、模仿、练习、反馈。\n大部分技能的学习，差不多都是这个过程。\n当然，有些人悟性特别高，不需要观察别人，自己琢磨就能找到答案。但无论如何，学习者最终需要解决的，是自己的问题。\n你知道自己的条件，知道自己卡在哪里，也可以按照自己能够接受的速度慢慢尝试。\n可是教学不一样。\n教学不是把自己走过的路，再向别人展示一遍。\n你会做，不代表别人看一遍就会。\n你觉得很简单，不代表别人也觉得简单。\n甚至你认为理所当然的前提，对方可能根本就不具备。\n这就好像现在很火的 FDE（前沿部署工程师）。\n你把一套 AI 系统做出来了，在自己电脑上运行得很好，到了客户那里，却发现怎么都跑不起来。\n这时候你不能只是说：\n“不对啊，我这里明明可以运行。”\n因为你的工作恰恰就是弄清楚，为什么在别人那里运行不了。\n对方的环境、条件、使用习惯，甚至对这套系统的理解，都可能跟你完全不同。\n我觉得教学也是这样。\n学习是让一套方法在自己身上跑通，教学则是让它在另一个人身上跑通。\n后者需要解决的问题，显然复杂得多。\n三、教学真正困难的，是理解另一个人\n以前我学习 ABA（应用行为分析）的时候，接触过一种教学方法，叫做 BST，行为技能训练。\n它通常包括四个环节：指导、示范、练习和反馈。\n简单来说，就是先告诉对方怎么做，再示范给他看，然后让他自己尝试，观察他的表现，给予反馈，接着再练习。\n如果还没有掌握，就继续调整，重复这个过程。\n这个方法本身不算多么神秘。\n有意思的是，它让我意识到，教学与学习之间有一个很重要的区别。\n学习主要是观察事情，教学还必须观察人。\n你不仅要知道一件事情正确的做法是什么，还要观察对方为什么做不到。\n他是缺乏基础知识？理解错了？练习不足？还是根本没有动力？\n如果他连第一步都做不好，你就不能急着让他做第三步。\n如果他已经掌握了前面的内容，你又不能让他一直重复那些毫无挑战的练习。\n有时候，你还需要把一个大目标拆成很多小目标，让他能够看见自己的进步。\n这就是我们常说的因材施教、循序渐进。\n但这八个字，说起来简单，做起来却非常困难。\n因为每个人都是不同的。\n你甚至无法完全确定，学生这次进步究竟是因为你的教学方法，还是他自己突然开窍了，或者只是碰巧遇到了适合他的练习。\n教学不是一道有标准答案的数学题。\n它面对的是一个不断变化的人。\n所以，当我看到有人在网上随手评价一句“你这么菜，我来教你”的时候，我其实有些怀疑。\n一个连对方的情况都不了解，就急着给别人下判断的人，真的愿意花时间去理解另一个人吗？\n当然，也许他确实是个高手。\n但证明自己比别人厉害，和帮助别人变得厉害，完全是两回事。\n前者可能只需要展示一次成绩，后者却需要长期的观察、耐心和投入。\n四、既然教人这么难，为什么还要教？\n想到这里，我又产生了另一个问题。\n如果教学这么麻烦，那么一个真正的高手，为什么要花时间去教别人？\n尤其是那些原本就靠个人能力吃饭的人。\n俗话说，教会徒弟，饿死师傅。\n虽然现实未必如此，但至少对很多人来说，教学的收益并没有那么直接。\n同样花一个小时，你可以自己练习、自己创作、自己工作，为什么要拿来解决别人的问题？\n而且教得好不好，还不完全由你决定。\n学生的基础、努力程度、学习环境，都会影响最终结果。\n即使学生后来取得了很好的成绩，也很难说其中有多少功劳属于老师。\n最多就是学生获奖之后，回来感谢你一下。\n这当然也会让人高兴，但如果仅仅从个人收益来看，教学似乎并不是一笔特别划算的买卖。\n不过，我想到了一类很有代表性的人：职业运动员。\n一个奥运冠军，可能在年轻的时候拥有惊人的身体素质、反应速度和竞技能力。\n但这些优势不可能永远存在。\n随着年龄增长，他可能再也无法达到曾经的竞技巅峰。\n电子竞技选手也面临类似的问题。即使经验还在，职业生涯也可能受到反应速度、训练强度和竞技状态的限制。\n可是，他过去积累的那些经验，并没有因此失去价值。\n如果他能够学会教学，就有机会把自己的经验转化成另一种能力。\n从运动员变成教练，从亲自赢得比赛，变成帮助别人赢得比赛。\n这其实是一次很有意思的职业转型。\n以前，他的价值主要体现在自己能做到什么。\n后来，他的价值可以体现在自己能让别人做到什么。\n当然，优秀运动员不一定能成为优秀教练。\n他仍然需要重新学习如何观察、如何沟通、如何设计训练，以及如何面对那些跟自己完全不同的学生。\n但如果他掌握了这项能力，他的职业生涯就可能被大大延长。\n甚至，教学本身也可能成为他新的事业。\n这让我觉得，教学并不只是知识的传递，它还是一种把个人能力转化为他人能力的技术。\n而这种技术，可能比原来的专业技能更有长期价值。\n五、你到底是想教我，还是想证明你比我厉害？\n再回到最开始的那条游戏评论。\n我当然相信，网上有很多比我厉害的玩家。\n有些人可能已经玩了几千个小时，能够轻松打过我一直打不过的 Boss，甚至可以指出我每一步操作的问题。\n我也很愿意观察他们怎么玩，看看他们的思路，尝试那些我以前没有想到的方法。\n毕竟，这本来就是我学习游戏的方式。\n但我觉得，真正的教学，跟随手指出别人哪里做错了，还是有很大区别的。\n如果你真的想教会我，你可能首先需要知道，我目前理解到了什么程度，为什么会做出这样的选择，以及我到底想解决什么问题。\n然后，你还需要想办法，让我能够理解你的思路，而不是仅仅看着你表演。\n这显然比说一句“你太菜了”麻烦得多。\n我也不认为每一个高手都有义务去教别人。\n有些人只是想展示自己的技术，有些人喜欢交流，有些人享受竞争，还有些人确实愿意花时间帮助新手。\n这些都没有什么问题。\n只是我觉得，我们经常把“自己很厉害”和“能够教会别人”混为一谈。\n尤其是在网上，大家很容易凭借某个领域的优势，就自然地站到老师的位置上。\n可真正的老师，并不是那个永远知道正确答案的人。\n而是那个能够理解你为什么得不到正确答案，并且愿意帮助你找到答案的人。\n所以，下次再有人对我说：\n“你这么菜，要不我来教你？”\n我可能还是会有点好奇。\n我这么菜，你真的能教会我吗？\n"},{"title":"一张早就过时的试卷，一个拼命考满分的你",
"url":"/blog/yi-zhang-zao-jiu-guo-shi-de-shi-juan-yi-ge-pin-ming-kao-man-fen-de-ni/",
"date":"2026-10-23",
"headings":[{"level":2,"id":"yi-zhang-mei-ren-ren-zhen-wei-hu-de-shi-juan","permalink":"https://linxz.online/blog/yi-zhang-zao-jiu-guo-shi-de-shi-juan-yi-ge-pin-ming-kao-man-fen-de-ni/#yi-zhang-mei-ren-ren-zhen-wei-hu-de-shi-juan","title":"一张没人认真维护的试卷","children":[]},{"level":2,"id":"wei-shen-me-wo-men-zhe-me-xi-huan-shua-fen","permalink":"https://linxz.online/blog/yi-zhang-zao-jiu-guo-shi-de-shi-juan-yi-ge-pin-ming-kao-man-fen-de-ni/#wei-shen-me-wo-men-zhe-me-xi-huan-shua-fen","title":"为什么我们这么喜欢刷分？","children":[]},{"level":2,"id":"dang-ni-zhi-dao-gui-ze-shi-zen-me-zhi-ding-de","permalink":"https://linxz.online/blog/yi-zhang-zao-jiu-guo-shi-de-shi-juan-yi-ge-pin-ming-kao-man-fen-de-ni/#dang-ni-zhi-dao-gui-ze-shi-zen-me-zhi-ding-de","title":"当你知道规则是怎么制定的","children":[]},{"level":2,"id":"you-shi-hou-80fen-zhen-de-jiu-gou-liao","permalink":"https://linxz.online/blog/yi-zhang-zao-jiu-guo-shi-de-shi-juan-yi-ge-pin-ming-kao-man-fen-de-ni/#you-shi-hou-80fen-zhen-de-jiu-gou-liao","title":"有时候，80分真的就够了","children":[]},{"level":2,"id":"wo-men-shi-bu-shi-ye-zai-pin-ming-shua-fen","permalink":"https://linxz.online/blog/yi-zhang-zao-jiu-guo-shi-de-shi-juan-yi-ge-pin-ming-kao-man-fen-de-ni/#wo-men-shi-bu-shi-ye-zai-pin-ming-shua-fen","title":"我们是不是也在拼命刷分？","children":[]}],
"body":"最近在工作中，我发现了一件挺好笑的事情。\n我偶尔会负责组织公司的销售晋级考试。考试时间是一个小时，80分及格，而且在规定时间内可以无限次重考。\n我发现，参加考试的人大致分成两种。\n一种是考到80分就退出了。反正已经及格，达到了晋级要求，也就没必要继续折腾。\n另一种就比较有意思了。\n他们会不断地重新考试，从80分刷到90分，再从90分刷到95分，甚至还想考到100分。\n我倒不觉得这有什么问题，只是有点好奇：明明80分就已经及格了，为什么还要继续刷呢？\n更有意思的是，我知道一些他们不知道的事情。\n一张没人认真维护的试卷\n这套试卷其实不是我设计的，而是很多年前一位销售总监留下来的。\n这么多年过去，公司的业务发生了不少变化，但这套试卷基本没有更新过。\n有些题目甚至已经不符合现在的实际情况。\n而我作为考试的组织者，也很清楚这套试卷在公司内部的真实处境。\n大家平时有很多工作要处理，考试本身又不直接产生业绩，所以没有多少人愿意投入精力去重新设计、维护这套题目。\n说白了，只要考试能够正常进行，能够完成晋级流程，大家也就不太在意了。\n但参加考试的人并不知道这些。\n他们看到的是一套有标准答案的试卷。\n于是，有些人会不断尝试，记住哪些答案能够得分，再调整自己的选择，努力把分数刷得更高。\n问题是，那些所谓的标准答案，本身可能就是错的。\n你越是努力刷分，越是记住那些答案，就可能越是在强化一些已经过时甚至错误的知识。\n这就让我觉得特别有意思。\n出题的人早就不怎么在乎这套题了，做题的人却还在拼命追求满分。\n而且，我举办过很多次这样的考试，极少有销售主动来反馈某道题是不是有问题，某个答案是不是不符合实际业务。\n大多数人只是默默接受这套规则。\n有人及格就走，有人继续刷分。\n但很少有人问一句：这道题本身是不是有问题？\n为什么我们这么喜欢刷分？\n其实，这种现象并不只发生在考试里。\n我发现很多人都特别喜欢刷分。\n有人反复参加雅思考试，想把成绩再提高一点；有人沉迷各种测试，努力拿到最高评价；还有人在游戏里反复挑战同一个关卡，只为了刷新纪录，或者收集所有成就。\n当然，这些事情不完全一样。\n雅思成绩可能关系到留学申请，游戏刷分也可能纯粹是因为好玩。\n但我觉得它们背后有一种共同的心理：人很容易被明确的数字吸引。\n现实中的进步往往很难衡量。\n你今天比昨天更懂销售了吗？你的沟通能力提高了多少？你对客户的理解有没有加深？\n这些问题都很难回答。\n但如果昨天考了80分，今天考了95分，那就不一样了。\n数字清清楚楚地告诉你：你进步了。\n哪怕这种进步只是因为你记住了更多答案，它依然能够带来一种成就感。\n我觉得这也和我们从小接受的教育有关。\n小时候，我们被训练着做题、考试、寻找标准答案。\n考80分不如考90分，考90分不如考100分。\n久而久之，我们可能形成了一种习惯：只要有分数，就想把它刷高；只要有排名，就想往前挤。\n至于这个分数到底在衡量什么，反而很少有人去想。\n我们太熟悉怎么把题目做对了，却不一定习惯去判断这道题值不值得做。\n当你知道规则是怎么制定的\n我觉得这件事最有趣的地方，其实还不是刷分本身。\n而是不同的人，因为掌握的信息不同，对同一件事情会产生完全不同的理解。\n在参加考试的销售眼里，这是一套正式的晋级考试，有标准答案，有分数，有及格线。\n既然能够考100分，为什么不试试呢？\n但在我眼里，这只是一套很多年前留下来的试卷。\n我知道它是谁设计的，知道它已经多久没有更新，也知道它在整个公司运营中究竟占据多大的分量。\n所以，当我看到有人为了提高几分而反复考试时，就会觉得有点好笑。\n不是因为这些人不够聪明，而是因为他们根本不知道这套规则背后的情况。\n他们可能把一套并不完善的评价体系，看得比设计它的人还要认真。\n这让我想到一个问题：\n我们是不是经常因为不了解一套规则是怎么产生的，就误以为它一定是合理的？\n很多制度、标准、考核指标，其实都是人制定的。\n它们可能是在某个特定时期，为了解决某个具体问题而出现的。\n制定的时候，可能经过了深思熟虑，也可能只是当时某个人觉得这样比较合适。\n后来环境变了，人员换了，业务调整了，但规则却被保留下来。\n新加入的人不知道它的来历，只知道必须按照这套规则行事。\n于是，大家开始认真研究规则，努力适应规则，甚至把规则中的高分当成了自己的目标。\n但很少有人会去了解，这套规则究竟是为了什么而存在的。\n我觉得这是一件挺荒诞的事情。\n有时候，80分真的就够了\n当然，我不是说所有刷分都没有意义。\n如果你是在玩游戏，享受不断突破纪录的过程，那刷分本身就是乐趣。\n如果更高的雅思成绩能够帮助你申请更好的学校，那么继续提高分数当然也有价值。\n甚至有人就是喜欢挑战满分，喜欢那种不断接近完美的感觉，也没什么不好。\n但问题在于，你是否清楚自己为什么要这么做。\n回到公司的晋级考试。\n如果考试的目的只是判断你是否具备晋级资格，80分已经满足要求，而90分和100分不会带来任何额外收益，那么继续刷分的价值到底在哪里？\n尤其当这套试卷本身还存在问题的时候。\n你投入更多时间，未必能够学到更多正确的知识。\n反而可能因为反复记忆错误答案，让自己对业务产生一些错误理解。\n这就不是努力不努力的问题了。\n而是你有没有判断过，这件事情究竟值得投入多少精力。\n我一直觉得，人的时间和精力是有限的。\n我们不可能在每一件事情上都追求完美。\n有些事情值得花大量时间去研究，有些事情做到及格就够了，还有些事情可能根本不值得做。\n真正重要的，或许不是你有没有能力把每一件事情做到100分，而是你能不能判断出，哪些事情值得拿100分。\n如果不加区分地追求完美，反而可能把大量时间浪费在一些并不重要的地方。\n我们是不是也在拼命刷分？\n后来我又想，其实这种事情在生活中还挺常见的。\n工作中，我们会追求各种绩效指标、排名和职级。\n生活中，我们会关注收入、学历、证书，甚至社交平台上的粉丝数量和点赞数。\n这些数字当然不是毫无意义。\n但我们很容易在追求数字的过程中，渐渐忘记自己最初为什么要追求它们。\n比如，一个人为了提高某项工作指标，花费了大量时间，最后指标确实提高了，但实际业务并没有改善多少。\n又比如，一个人考了很多证书，却没有认真想过这些证书究竟能够帮助自己解决什么问题。\n甚至有些时候，我们明明已经达到了原本的目的，却还是忍不住想把分数刷得更高一点。\n因为分数摆在那里。\n因为还有进步空间。\n因为没有拿到满分，总觉得差了点什么。\n但谁规定了，我们一定要拿满分呢？\n更何况，我们追求的那个满分，可能只是某个人在某个时候制定的一套标准。\n我之所以会觉得那些拼命刷分的销售有点好笑，只是因为我恰好知道这套试卷背后的情况。\n我知道它已经过时了，知道有些答案未必正确，也知道考到80分其实就已经足够。\n所以我能够站在外面，看着他们认真地追求一个可能没什么意义的满分。\n但如果换一个场景呢？\n如果我也是那个参加考试的人，而不是组织考试的人呢？\n我会不会也觉得那些分数特别重要，也会为了提高几分而反复尝试？\n说不定，我也正在某个地方，认真研究着一套早就过时的试卷。\n而那个真正了解规则的人，正在旁边看着我拼命考满分，觉得我挺好笑的。\n"},{"title":"终于到了要送礼的年纪",
"url":"/blog/zhong-yu-dao-liao-yao-song-li-de-nian-ji/",
"date":"2026-10-23",
"headings":[{"level":2,"id":"na-xie-ni-yi-wei-bu-xu-yao-de-dong-xi","permalink":"https://linxz.online/blog/zhong-yu-dao-liao-yao-song-li-de-nian-ji/#na-xie-ni-yi-wei-bu-xu-yao-de-dong-xi","title":"那些你以为不需要的东西","children":[]},{"level":2,"id":"yi-ge-zong-shi-qiang-zhao-mai-dan-de-zhu-guan","permalink":"https://linxz.online/blog/zhong-yu-dao-liao-yao-song-li-de-nian-ji/#yi-ge-zong-shi-qiang-zhao-mai-dan-de-zhu-guan","title":"一个总是抢着买单的主管","children":[]},{"level":2,"id":"gao-guan-xi-qi-shi-shi-yi-chong-neng-li","permalink":"https://linxz.online/blog/zhong-yu-dao-liao-yao-song-li-de-nian-ji/#gao-guan-xi-qi-shi-shi-yi-chong-neng-li","title":"搞关系，其实是一种能力","children":[]},{"level":2,"id":"wo-men-bu-shi-bu-xu-yao-zhi-shi-huan-mei-lun-dao-wo-men","permalink":"https://linxz.online/blog/zhong-yu-dao-liao-yao-song-li-de-nian-ji/#wo-men-bu-shi-bu-xu-yao-zhi-shi-huan-mei-lun-dao-wo-men","title":"我们不是不需要，只是还没轮到我们","children":[]},{"level":2,"id":"zhong-yu-dao-liao-yao-song-li-de-nian-ji","permalink":"https://linxz.online/blog/zhong-yu-dao-liao-yao-song-li-de-nian-ji/#zhong-yu-dao-liao-yao-song-li-de-nian-ji","title":"终于到了要送礼的年纪","children":[]}],
"body":"前段时间，我陪孩子逛超市，路过一家茶叶店，突然想进去看看。\n因为早几天，父母给我们准备了几款茶叶，让我们拿去送人。\n进去茶叶店后，货架上摆满了各种品牌的茶叶，有不同的包装、不同的价格，有些看起来很高档，有些却很普通。\n我不知道哪个牌子比较好，也不知道什么价位适合送什么人，更不知道这些茶叶到底值不值那个钱。\n这一刻我突然意识到，自己已经三十多岁了，却连送礼这种事情都不太会。\n以前我从来不关心烟酒茶。\n我不抽烟，也不怎么喝酒，对茶叶更没什么研究兴趣。那些研究烟酒茶品牌、年份、档次的人，在我看来，似乎是在研究一些没什么意义的东西。\n但现在，我竟然有了兴趣。\n原因也很简单：这些东西开始对我有用了。\n那些你以为不需要的东西\n我们这一代人，尤其是独生子女，很多事情其实都是父母帮忙解决的。\n小时候上学，父母帮忙联系学校、老师。长大了找工作，有些家庭也会托关系、找熟人。逢年过节，父母准备好礼物，带着我们去走亲戚。\n有些亲戚，可能一年到头都没什么往来，但父母还是会专门去拜访一下，带上一些礼品，坐下来聊聊天。\n以前我特别不理解，既然平时都不怎么联系，为什么还要专门跑一趟？有这个时间，待在家里不好吗？\n甚至，我会觉得这些行为有点功利。\n人与人之间，难道不能简单一点吗？为什么非得送礼、吃饭、搞关系？\n但现在，人到中年，有了自己的家庭和孩子之后，我开始有了新的认识。\n比如说，你突然需要回老家办理房产确权，或者在老家买了一套房子，需要有人偶尔帮忙照看一下。\n这些事情，你当然可以花钱找人做，但有些忙并不是给钱就一定有人愿意帮的。\n又比如，有了孩子之后，我觉得认识一位能够信任、方便咨询的儿科医生，是一件很有价值的事情。\n孩子有些小问题，未必每次都需要跑医院，但作为父母，又总有各种各样的疑问。如果有熟悉的专业人士能够在合适的时候提供一些建议，确实能省去很多麻烦。\n这些关系不是等到需要的时候，突然就能建立起来的。\n你不能平时完全不联系别人，等到有事了，才突然想起这个人。\n当然，也不是说送了礼，别人就有义务帮你。\n只是人与人之间的熟悉、信任和情分，很多时候都需要平时一点点积累。\n我以前觉得这些事情不重要，现在才发现，可能不是它们不重要，而是一直有人替我做了。\n一个总是抢着买单的主管\n我刚开始工作的时候，曾经在一家超市上班。\n当时水产部有一位主管，给我留下了很深的印象。\n他的职位并不算高，这种职务收入上就比普通员工多几百，他本身穿着朴素，也不是什么特别有钱的人。\n但他有一个特点：出去吃饭的时候，总是主动买单。\n不管是跟上级吃饭，还是跟下属、同事吃饭，他都很愿意掏钱。\n而且他是特别低调的人，话不多，不喜欢吹嘘，更不会因为请了别人吃饭，就到处宣扬。\n他只是很自然地做这些事情，大家都挺尊敬他，反而主动给他宣传。\n年轻的时候，我不太理解这种行为。\n明明大家收入都差不多，为什么总要自己买单呢？大家AA不好吗？\n现在回头看，我觉得他很早就理解了一些我当时不懂的东西。\n一顿饭花不了多少钱，但主动买单这件事，会让别人感受到他的态度。\n他可能并没有刻意计算过这些事情能带来多少回报，但长期下来，他确实在别人心里留下了不一样的印象。\n而且，这种大方不只是对上级，对下属也是如此。\n这让我觉得，他并不是单纯地在讨好某个人，而是有一套自己的待人处事方式。\n我想，人与人之间的关系，有时候就是这样建立起来的。\n你不一定需要特别能说会道，也不一定要认识很多大人物。\n你可以很低调，但在一些具体的事情上，让别人觉得你是一个值得交往的人。\n而这些东西，恰恰是我年轻时没有认真学习过的。\n搞关系，其实是一种能力\n以前一提到搞关系，我脑海里想到的就是送礼、请客、找后门。\n这些词听起来总有些不太光彩。\n但现在我觉得，搞关系其实有很大一部分，是经营人与人之间的联系。\n比如说，某个长辈一直很关心你，你逢年过节给他送点东西，表达一下感谢。\n某个朋友曾经帮过你的忙，你找个机会请他吃顿饭。\n某个行业前辈给过你不少建议，你偶尔向他汇报一下自己的近况，也关心一下对方。\n甚至只是去别人家里做客，知道提前准备一点合适的礼物。\n这些事情并不复杂，但真正做起来，却有很多细节。\n送什么东西？送多少钱的？什么时候送？对方喜欢什么？什么样的关系适合什么样的表达方式？\n现在大家群发祝福短信都已经泛滥了，发一句节日快乐，未必真的能拉近多少距离。\n有时候，你需要花一点心思，才能让别人感受到你确实在意这段关系。\n而送礼只是其中一种方式。\n有的人擅长组织饭局，有的人擅长记住别人的喜好，有的人愿意主动帮忙，有的人很懂得表达感谢。\n这些都是能力。\n而且，它跟一个人有没有钱，也不完全是一回事。\n就像我以前那位主管，他并不富裕，但他愿意拿出自己有限的一部分资源，去经营他认为值得经营的关系。\n反过来说，有些人明明有能力请客吃饭，也不是舍不得那点钱，只是从来没有觉得自己需要这样做。\n我想，我以前可能就属于后者。\n我们不是不需要，只是还没轮到我们\n现在回想起来，父母那一代人其实承担了很多我们看不见的工作。\n他们知道老家有什么事情应该找谁，知道哪些亲戚应该经常走动，知道逢年过节要准备什么礼品，也知道碰到不同的问题，可以向哪些朋友求助。\n而我们呢？\n可能只需要跟着去吃顿饭，甚至连礼物是谁买的、花了多少钱都不知道。\n父母把这些事情安排好了，我们就觉得生活本来就是这样的。\n甚至会反过来觉得，父母为什么要花这么多时间在这些人情往来上。\n可是等到自己成家、有了孩子，开始独立面对各种各样的问题，才发现这些事情总得有人做。\n孩子要上学，家里老人有事情，房子需要处理，工作上碰到新的问题……\n我们不可能什么都懂，也不可能什么事情都靠自己解决。\n很多时候，认识什么人、能向谁请教、谁愿意帮你一把，确实会影响一件事情处理起来有多麻烦。\n这不是说所有问题都要靠关系解决，更不是说有关系就可以不守规则。\n而是一个人在社会上生活，除了自己的专业能力、经济能力之外，还需要有建立和维护社会关系的能力。\n以前家里有父母，或者有能干的哥哥姐姐，他们把这些事情承担了，我们就不用操心。\n这是幸运的。\n但这种幸运也可能让我们产生一种错觉：这些事情根本没有必要做。\n直到有一天，轮到自己成为家里那个需要解决问题的人，才发现自己对这些事情几乎一无所知。\n终于到了要送礼的年纪\n其实，我也不觉得自己应该突然变成一个特别圆滑、特别擅长应酬的人。\n我还是不喜欢那些毫无意义的饭局，也不想为了所谓的人脉，到处讨好别人。\n但我开始意识到，有些关系确实值得主动维护，有些人情确实需要认真对待。\n它不一定是为了将来获得什么回报。\n有时候只是因为别人曾经关心过你，你也应该有所表示。\n有时候是因为你珍惜一段关系，不希望只有需要帮忙的时候才想起对方。\n当然，也有一些关系，你确实希望将来能够互相帮助。\n我觉得这没什么不好意思承认的。\n人本来就是互相需要的。\n只不过，过去这些事情都是父母在做，我没有机会，也没有动力去了解。\n现在不一样了。\n我开始需要自己判断，什么样的人值得交往，什么样的关系需要维护，什么场合应该主动一点，什么情况下又应该保持分寸。\n所以，当我走进那家茶叶店，看着货架上琳琅满目的茶叶，不知道该挑哪一款的时候，我倒也没有觉得特别丢脸。\n只是觉得有点好笑。\n以前那些我根本不会多看一眼的烟酒茶，如今竟然成了我想认真研究的东西。\n我甚至开始好奇，为什么有的茶叶卖几百块，有的卖几千块，什么品牌拿出去比较体面，什么东西适合送长辈，什么东西适合送朋友。\n这些问题，过去都是父母在考虑的。\n而现在，我也开始考虑了。\n不知不觉间，我也到了要自己准备礼物、自己去走动关系的年纪。\n"},{"title":"到底什么人才算“深二代”啊？",
"url":"/blog/dao-di-shen-me-ren-cai-suan-shen-er-dai-a/",
"date":"2026-10-22",
"headings":[],
"body":"在深圳生活，经常会听到一个词，叫“深二代”。\n我的一些同事，也经常半开玩笑地说我是深二代。\n说实话，我一直没搞懂这个词。\n我还特意去查了一下，按照一种常见的解释，深二代就是深圳的第二代移民，父母来到深圳，自己在深圳出生或者长大。有的人还会用深圳户口来判断，更严格一点的，甚至要求身份证号码以4403开头。\n这不是挺简单？\n但奇怪的是，我在生活中听到的“深二代”，好像根本不是这么一回事。\n比如同事聊到买房，谁的父母帮忙出了首付，甚至直接给孩子买了房，就会有人说：“那他是深二代嘛。”\n聊到深圳车牌，有些人的父母很早就买了车，有粤B牌照，不用摇号，又会扯到深二代。\n还有一种更典型的，就是家里有房子收租。\n好像只要家里有几套房，每个月不用怎么工作就有租金收入，那就是大家心目中最标准的深二代了。\n有一次，同事聊到小孩上学，问起我以前在哪里读书。\n我说了深圳的一所学校，他马上恍然大悟：“哦，你是深二代啊！上这么好的学校。”\n我当时心里就在想，啊？这也算？\n我倒不是觉得被冒犯了，也没有特别想否认这个身份。\n只是觉得很奇怪。\n为什么买房算，收租算，在深圳读过一所学校也算？\n而且，大家好像从来没有认真问过我有没有深圳户口，身份证是不是4403开头。\n既然如此，那我们到底在用什么标准判断一个人是不是深二代啊？\n我特别较真。\n比如，一个人从小在深圳长大，有深圳户口，但父母只是普通打工者，家里没有房产，买房也帮不上什么忙。\n他算不算深二代？\n反过来，一个人没有深圳户口，但父母很早就在深圳买了几套房，现在光靠收租就能生活。\n他算不算？\n甚至有些人明明长期生活在深圳，却因为老家有土地或者其他原因，一直没有把户口迁过来。\n难道他就不算了？\n还有一点，我觉得特别有意思。\n深圳这么大，福田长大的孩子，和坪山长大的孩子，真的能算同一种人吗？\n一个人可能从小就生活在繁华的商业区，经历了深圳中心城区从建设到成熟的过程。\n另一个人可能从小在城中村、工业区附近长大，小时候看到的是工厂、出租屋，后来才慢慢有了新的道路、商场和住宅。\n虽然都叫深圳，但他们小时候看到的深圳，可能根本不是同一个深圳。\n更别说他们各自的家庭条件、教育资源和生活经历了。\n如果只是因为都在深圳长大，就把他们归为同一种人，我总觉得哪里不太对劲。\n另外，我认为的深二代是以前接触过一些深圳本地的客家人，他们的家庭很早就在这里扎根。\n比如说，去附近某个公园，只要讲几句客家话，就能享受到本地人的待遇。\n还有一些家庭，因为本地长期积累的人脉和关系，子女在找工作时可能拥有更多渠道。别人需要到处投简历、面试，他们可能早就有人帮忙介绍单位。\n更不用说一些家庭拥有土地、集体经济权益，或者因为城市发展获得了可观的资产。\n当然，并不是所有客家人或者深圳原居民都有这些条件。\n但在我的理解里，这些因家庭积累而获得额外资源和机会的人，反而更接近大家口中所谓的深二代。\n因为我感觉，同事们每次谈到深二代，真正想谈的并不是你在深圳出生，或者在深圳生活了多少年。\n他们想谈的，好像是另一件事。\n你有没有因为父母比别人更早来到深圳，而获得一些别人没有的好处？\n想到这里，我突然觉得有点好笑。\n我前面纠结了那么久，甚至还认真研究身份证号码，可能从一开始就搞错了方向。\n因为大家根本就没有打算讨论深二代的定义。\n同事说我在深圳读过一所好学校，所以我是深二代，他可能只是想说，我小时候享受了不错的教育资源。\n有人说父母帮忙买房就是深二代，他可能只是在感慨，为什么有些人买房这么轻松，而自己却要辛苦攒钱。\n有人说家里有房收租才是真正的深二代，可能只是羡慕别人有一个不用太担心生计的家庭。\n这些话其实都很好理解。\n只不过，他们没有直接说出来，而是用了一个“深二代”来代替。\n而我偏偏还在那里琢磨：这词用得不对吧？\n我有时候聊天还真有这个毛病。\n别人只是随口说了一句话，我却很容易开始思考，这句话的定义是什么，逻辑上成不成立，有没有例外。\n结果别人可能只是想感慨一下生活，我却差点把话题变成了一场辩论。\n这也让我开始想，日常聊天是不是根本就不需要那么准确？\n毕竟我们平时说话，本来就不会把所有意思都解释清楚。\n很多时候，我们只是借用一个大家熟悉的词，表达某种情绪或者看法。\n比如有人说：“你是领导，你当然这么想。”\n他可能不是在认真讨论你的职务，而是觉得你没有站在普通员工的角度考虑问题。\n有人说：“你是年轻人，你不懂。”\n他可能也不是想讨论年龄，而是觉得你没有经历过他经历的事情。\n还有人说：“你是富二代，当然不理解赚钱有多难。”\n其实他想说的，可能只是家庭条件对一个人的生活有很大影响。\n这样想来，“深二代”只是无数标签中的一个。\n而且我发现，这些标签还挺好用的。\n一个词，就能省掉一大段解释。\n你不用把自己的羡慕、不满、感慨，或者对某个人的判断完整说出来，只需要给他贴上一个标签，对方大概就知道你在说什么。\n但问题是，他真的知道吗？\n至少我就经常不知道。\n更有意思的是，标签有时候不只是用来表达感受，还会悄悄地替别人安排好一个立场。\n比如有人说：“你是深二代，你当然不理解外地人在深圳买房有多难。”\n这句话听起来似乎很有道理。\n但我就想问，为什么？\n为什么我在深圳长大，就一定不理解买房的困难？\n为什么我读过一所不错的学校，就意味着我的家庭条件一定很好？\n为什么别人知道了我身上的某一个特征，就可以顺便推断出我其他方面的经历？\n我觉得这才是标签最有意思，也最容易让人忽略的地方。\n它不只是告诉别人你是谁，有时候还会替你决定，你应该是什么样的人。\n你是领导，所以你一定站在公司那边。\n你是年轻人，所以你一定不够成熟。\n你是本地人，所以你一定拥有某些优势。\n你是富二代，所以你一定没吃过苦。\n这些判断当然不一定完全错误。\n家庭、年龄、职业和成长环境，确实会影响一个人的经历和看法。\n但我总觉得，一个人应该比这些标签复杂得多。\n如果我们还没有真正了解一个人，就已经通过标签替他想好了家庭背景、生活经历，甚至他的立场，那后面的聊天还有多少意义呢？\n因为无论他说什么，我们都可以把他的回答重新塞回那个标签里。\n他觉得买房困难，我们说他不懂真正的困难。\n他谈自己的努力，我们说他只是起点高。\n他表达不同意见，我们说这是因为他的身份决定了他的立场。\n这样一来，好像怎么说都说不清楚。\n不过，我也不想把贴标签这件事说得太严重。\n毕竟我自己也会给别人贴标签。\n而且有时候，这些标签确实挺方便的。\n如果每次聊天都要先解释清楚所有概念，确认每一个词的定义，那也太累了。\n更何况，我也不希望自己变成一个别人随口说句话，都要认真纠正半天的人。\n当别人说我是深二代时，我不一定要马上判断自己到底算不算。\n我也不需要急着接受这个身份，或者反驳对方。\n我可以先想想，他为什么突然这么说？\n他是在羡慕我的成长环境，还是想讨论深圳的教育资源？\n他是在感慨父母对子女的帮助，还是想说人与人之间的起点本来就不公平？\n又或者，他真的只是开个玩笑，根本没有想那么多。\n如果他想聊买房，那就聊买房。\n如果他想聊教育，那就聊教育。\n如果他想聊深圳的发展红利，那这个话题其实还挺值得展开的。\n至于我是不是深二代，好像反而没有那么重要了。\n"},{"title":"我发现了一个让生活不再无聊的漏洞",
"url":"/blog/wo-fa-xian-liao-yi-ge-rang-sheng-huo-bu-zai-wu-liao-de-lou-dong/",
"date":"2026-10-22",
"headings":[],
"body":"最近，我发现自己的生活好像变得有趣了很多。\n倒不是发生了什么特别的事情。每天还是上班、下班，处理工作，照顾家庭，偶尔玩玩游戏，生活跟以前并没有太大区别。\n真正的变化，是我开始高频写作了。\n最近这段时间，我几乎每天都会写两三篇文章。说来也奇怪，写作明明是一件需要花费精力的事情，我却没有觉得生活因此变得更加忙碌和疲惫，反而觉得每天都有很多值得期待的东西。\n更奇怪的是，以前一些让我觉得烦躁的事情，现在竟然也能让我产生兴趣。\n我渐渐意识到，自己好像无意中发现了一个让生活不再无聊的漏洞。\n一、当你开始寻找素材，世界就变得不一样了\n以前，我对身边发生的很多事情其实并不怎么在意。\n同事抱怨工作，朋友讨论生活，网上有人争论某个话题，我可能听一听、看一看，表达一下自己的态度，然后就过去了。\n但自从开始写作，我看待这些事情的方式就发生了变化。\n比如，有人向我抱怨领导，过去我可能会跟着吐槽几句，或者觉得对方传递了一些负面情绪，影响了自己的心情。\n现在，我反而会觉得：哎，这件事情挺有意思的。\n为什么他会这样想？为什么领导会这样做？如果站在领导的角度，这件事会不会有完全不同的解释？为什么同样一件事，有些人特别愤怒，有些人却觉得无所谓？\n想着想着，一个原本让我觉得无聊甚至烦躁的话题，竟然变成了一个值得研究的问题。\n而且，这些话题还有一个好处：它们不是我凭空想象出来的。\n既然身边的人会关心，会抱怨，会争论，就意味着这些问题很可能也是其他人正在经历的。\n把这样的思考写出来，说不定还能引起不少人的共鸣。\n于是，我开始更留意身边的人、事、物，甚至会观察别人说话时的情绪，以及他们为什么会有这样的反应。\n生活并没有提供更多的故事，只是我开始主动寻找故事了。\n二、原来，想明白一件事情，本身就是一种快乐\n不过，如果写作只是为了寻找素材，我觉得还不足以解释为什么生活会变得这么有趣。\n真正让我享受的，其实是思考的过程。\n我们每天都会遇到很多事情，也会对它们形成各种判断。\n但大多数时候，这些判断是很粗糙的。\n比如，我们觉得某个人很讨厌，某件事不合理，某个游戏不好玩。\n为什么？\n可能自己也说不清楚。\n但如果我要把它写成一篇文章，就不能停留在这种模糊的感受上。\n我需要继续追问：到底是哪里不合理？有没有例外？别人为什么不这样认为？我的判断是不是建立在某个没有意识到的前提上？\n有时候，想来想去，突然发现一个以前完全没有想到的角度。\n那种感觉是很奇妙的。\n就像你每天都经过同一条街道，某一天却突然发现，原来这里还有一条自己从来没有走过的小巷。\n街道没有变化，但你眼中的世界不一样了。\n我觉得，思考最大的乐趣之一，就在于这种发现。\n而写作恰好提供了一个理由，让我愿意把原本可以一闪而过的想法，继续往深处挖一挖。\n有时候，文章还没有写出来，我就已经因为想明白了一件事情而感到满足。\n三、写作还有一个奇怪的作用：清空大脑\n我不知道其他人是不是这样，但我的脑子里经常会冒出各种奇奇怪怪的想法。\n工作上的问题、生活里的观察、某个游戏的机制，甚至一句别人随口说出来的话，都可能让我反复琢磨。\n有些想法很有趣，但如果一直放在脑子里，它们又会变成一种负担。\n因为事情没有想清楚，总觉得还有什么东西没有处理完。\n但当我把它写出来，情况就不一样了。\n写作的过程，有点像把脑子里杂乱无章的东西一件件拿出来，摆在桌面上。\n哪些想法是重要的，哪些只是重复，哪些地方存在矛盾，写着写着就清楚了。\n而且，一旦写完，我就会有一种如释重负的感觉。\n仿佛这件事情已经有了一个暂时的交代，可以不用继续惦记它了。\n当然，这不代表我已经找到了最终答案。\n只是这个问题不必再一直占据我的注意力。我可以放心地去思考下一件事情。\n从这个角度看，写作不仅是一种输出，还是一种清理。\n它让我能够不断产生新的想法，又不至于被这些想法困住。\n四、最有意思的是，文章写完了，思考却没有结束\n以前，我以为写作主要就是把自己的观点表达出来。\n后来我发现，发表文章之后，事情才刚刚开始。\n我曾经写过一篇文章，讨论为什么游戏一旦开了修改器，就可能变得不好玩。\n这个话题来自我自己的游戏体验。\n我发现，当游戏里的困难被轻易消除，原本需要努力获得的成就也变得唾手可得时，游戏反而失去了一部分乐趣。\n文章发表之后，有不少人认同我的看法。\n但也有一些人提出了完全不同的意见。\n他们认为，有些游戏存在大量重复劳动，修改器恰好可以跳过这些无聊的环节，让玩家把时间花在真正喜欢的内容上。\n我看了之后，觉得很有道理。\n因为我之前思考这个问题时，主要关注的是挑战和成就感，却没有充分考虑到，不同玩家想从游戏中获得的东西本来就不一样。\n对有些人来说，困难是乐趣的一部分；对另一些人来说，困难可能只是妨碍他们体验游戏的障碍。\n这让我觉得，发表文章还有一个很大的好处：它能让自己的思考接触到更多人的思考。\n当然，公开表达也会带来一些麻烦。\n有人会误解你的意思，有人会故意抬杠，甚至有人会直接谩骂。\n但我觉得这些事情并没有想象中那么可怕。\n不想看的评论可以不看，没有意义的争论也不一定要参与。\n真正值得关注的，是那些能够提供不同视角的人。\n因为有些问题，仅靠自己思考，可能永远也想不到另一个角度。\n写作让我有机会找到与自己想法相近的人，也让我有机会遇到与自己想法完全不同的人。\n这两件事都挺有意思。\n五、写作最大的好处，可能根本不在文章本身\n说到这里，我觉得还有一个很有趣的现象。\n很多人谈论写作，总是习惯关注最后的结果。\n文章写得好不好？有没有人看？有没有流量？能不能赚到钱？\n我当然也关心这些。\n毕竟，我喜欢表达自己的想法，也希望有人愿意阅读。有人认同，或者有人提出值得思考的反对意见，都会让我很开心。\n如果文章能够获得很多流量，那自然更好。\n但写了一段时间之后，我也发现，流量并不是一件容易获得的东西。\n你认真写了一篇自认为很有价值的文章，可能没什么人看。反而某篇随手写下来的东西，突然就有很多人讨论。\n这些事情并不完全由自己决定。\n如果把写作的价值全部寄托在流量上，恐怕很容易失望。\n但我现在发现，即使没有多少人阅读，写作本身也已经给我带来了很多东西。\n它让我愿意观察生活，让我有动力去思考问题，让我能够整理自己的想法，也让我有机会与其他人的思想发生碰撞。\n甚至可以说，文章还没有发表，我就已经获得了一部分回报。\n我原本以为，写作是在消耗生活中的素材。后来才发现，写作反而让我拥有了更多生活素材。\n因为你越愿意观察，就越容易发现值得思考的事情；越愿意思考，就越容易产生表达的冲动；而表达之后，又可能从别人的反馈中获得新的问题。\n这就形成了一个很有意思的循环。\n而且，这个循环并不一定需要多么精彩的生活才能启动。\n一场普通的聊天，一次工作上的争执，一段游戏体验，甚至某个突然冒出来的念头，都可以成为它的起点。\n以前我可能会觉得，今天好像没发生什么值得一提的事情。\n现在我却经常觉得，今天又有好多东西可以写。\n有时候一天写了两三篇，脑子里居然还有新的题目。\n我甚至开始觉得，自己缺少的不是话题，而是时间。\n这大概就是我所说的那个漏洞。\n我们总是希望生活能发生一些有趣的事情，好让自己不那么无聊。\n但有没有一种可能，生活本来就有很多有趣的事情，只是我们没有足够的理由去认真观察它们？\n写作恰好给了我这样一个理由。\n现在，每当身边发生什么事情，尤其是那些让我感到困惑、不满，或者与别人意见不一致的事情，我都会忍不住多想一会儿。\n有时候想着想着，还会冒出一个念头：\n哎，这个好像可以写一篇文章。\n然后，我的一天又变得有趣起来了。\n"},{"title":"心情就像天气，有晴天，也有阴天",
"url":"/blog/xin-qing-jiu-xiang-tian-qi-you-qing-tian-ye-you-yin-tian/",
"date":"2026-10-21",
"headings":[],
"body":"前几天早上，女儿又赖床了。\n叫她起床的时候，她很不情愿。穿衣服需要大人帮忙，刷牙的时候甚至闭着眼睛，整个人无精打采，似乎对什么事情都提不起兴趣。\n我也没有什么特别好的办法，只能催促她赶紧收拾，准备出门。\n有趣的事情发生在出门之后。\n刚走到门口，她突然看见外面的阳光，整个人一下子精神起来，笑着对我说：“爸爸，今天的阳光很明！”\n她大概是想说“明媚”，只是还不太会用这个词。\n刚才那个满脸不情愿、连眼睛都不想睁开的小朋友，突然就开心了起来。\n我想起了以前一位儿童康复督导说过的话。\n人的心情就像天气，有晴天，也有阴天。\n一、为什么我们不能接受心情有阴天？\n因为工作的缘故，我接触过不少特殊儿童。\n有些孩子的情绪特别敏感，一点小小的刺激，就可能引发非常强烈的情绪反应。\n面对这样的孩子，我们很容易把注意力集中在如何让他们平静下来，如何避免他们生气，如何让他们保持一个好的心情。\n但那位督导提出了一个很有意思的观点。\n他说，我们可以告诉孩子，心情就像天气一样。\n有时候是晴天，有时候是阴天，偶尔还会下雨。\n晴天的时候，我们很开心，愿意多做一些事情。阴天的时候，可能没那么有精神，做什么都提不起劲。\n但这又有什么关系呢？\n我们不会因为今天是阴天，就认为天气出了问题。\n同样，我们也不应该因为孩子今天不开心，就认为他的情绪出了问题。\n阴天本身不是一种错误，不开心也不是。\n我很喜欢这个比喻，因为它把情绪变成了一件特别自然的事情。\n就像我们从来不会要求天空每天都晴朗一样，我们为什么要要求一个人每天都开心呢？\n二、阴天的时候，生活也照常进行\n这个比喻还有另外一层意思。\n假如今天是阴天，我们会怎么办？\n大多数时候，什么也不会发生。\n我们照样起床、刷牙、吃早餐、上学、上班。\n可能因为天气不好，出门的时候有些不情愿；也可能因为下雨，走路的时候慢一点，或者多带一把伞。\n但我们不会因为天气不够好，就决定什么都不做。\n心情其实也一样。\n有时候，我们很容易把自己的情绪当成行动的前提。\n心情不好，就不想做事；没有兴致，就不愿意开始；遇到一点不顺心的事情，就觉得今天什么都不对劲。\n仿佛一定要先拥有一个好心情，才能正常生活。\n但如果换成天气，我们就不会这样想了。\n当然，遇到暴雨、台风，我们也需要停下来避一避。人的情绪也是如此，有些时候确实需要休息、安抚，甚至寻求帮助。\n但大多数普通的情绪起伏，并不需要我们立即停下所有事情，等待它彻底消失。\n我们可以带着一点不开心，继续做原本要做的事情。\n不是强迫自己开心，也不是假装没有情绪。\n只是允许今天的天空有一点阴。\n三、有时候，我们太着急改变情绪了\n回头想想女儿那个早晨，我觉得特别有意思。\n她赖床的时候，我的第一反应是希望她赶紧振作起来。\n快点起床，快点穿衣服，快点刷牙。\n作为家长，我们总希望孩子能尽快调整好状态。\n如果孩子不开心，我们就想办法哄她开心；如果孩子发脾气，我们就希望她赶紧平静下来。\n似乎只有情绪恢复正常，事情才能继续。\n但那天早上，我其实没有做任何特别的情绪引导。\n没有告诉她应该开心一点，没有跟她讲道理，也没有试图分析她为什么不高兴。\n我只是带她出了门。\n然后，她看到了阳光。\n这让我想到，有时候我们太关注如何改变一个人的心情，却忽略了改变他所处的环境。\n人在一个昏暗的房间里，可能觉得疲倦、烦躁，不想动弹。\n但走到户外，吹一吹风，看看阳光，听听周围的声音，感受就可能完全不一样。\n这当然不意味着所有坏心情都能靠晒太阳解决。\n只是情绪并不是一个完全封闭的东西。它会受到睡眠、环境、身体状态，以及周围发生的各种小事影响。\n既然如此，我们又何必每次都站在原地，急着把情绪处理好呢？\n有时候，换个地方，做一点别的事情，也许就会发生变化。\n四、天气会变，心情也会变\n我后来一直觉得，那位督导用天气来比喻情绪，是一种很巧妙的教育方式。\n因为它没有试图告诉孩子，什么情绪是好的，什么情绪是坏的。\n也没有要求孩子必须学会控制所有情绪。\n它只是让孩子理解一件事情：\n今天不开心，是很正常的。\n而且，今天不开心，也不代表接下来都会不开心。\n我们常常会高估当下情绪的持续性。\n生气的时候，觉得整件事情都很糟糕；难过的时候，觉得今天都不会再有什么值得高兴的事情。\n但回头看，很多情绪其实来得很快，走得也很快。\n有时候，甚至不需要什么特别的理由。\n就像天气一样，刚才还是乌云密布，过一会儿，阳光就从云层里露了出来。\n我们无法要求天气按照自己的意愿变化，也很难要求情绪每时每刻都处于理想状态。\n但我们可以学着和不同的天气相处。\n晴天的时候，享受阳光。\n阴天的时候，照常生活。\n下雨的时候，找个地方躲一躲，或者撑起一把伞。\n我又想起女儿那天早上的样子。\n她在房间里赖床的时候，大概也没有想到，门外正是一个阳光明媚的早晨。\n直到走出门，她才突然发现。\n“爸爸，今天的阳光很明！”\n"},{"title":"AI可以替你干活，但不能替你负责",
"url":"/blog/aike-yi-ti-ni-gan-huo-dan-bu-neng-ti-ni-fu-ze/",
"date":"2026-10-20",
"headings":[],
"body":"最近，我在社交平台上看到一款用AI制作的《小王子》游戏。\n画面非常漂亮。玩家可以在一个充满童话色彩的开放世界里探索，场景、光影、人物都相当精致。单看演示视频，很难相信这是一个人借助AI制作出来的。\n评论区里，不少人也开始展示自己的作品。有人说，自己只用了15天，就做出了一款游戏。\n我对此并不怀疑。因为我自己也在尝试用AI开发游戏。\n如今借助AI，一个没有多少专业开发经验的人，也确实能够制作出相当漂亮的场景、人物和游戏界面。\n但漂亮的画面是一回事，好玩的游戏是另一回事。\n我自己的作品就是如此。截图看起来不错，真正运行起来，却有各种各样的问题。操作手感、游戏机制、性能优化、内容完整度，每一个环节都可能出现问题。\n如果让我把它包装成一款完整游戏卖给玩家，我会觉得有些对不起他们。\n所以，我没有出售游戏，只是把其中一些比较满意的素材上架了。\n这件事让我开始思考一个问题：\n当AI让一个人拥有了过去一个团队的生产能力，我们是不是也应该重新讨论，谁来为这些产品负责？\n一、AI让生产变得容易，却没有让交付变得简单\n过去，制作一款游戏需要程序员、美术、策划、测试等不同岗位的配合。\n每个岗位都有自己的专业门槛，也有相应的质量标准。\n如今，AI正在降低这些门槛。\n一个人可以生成美术素材，可以编写程序，可以设计游戏机制，甚至可以让AI帮助测试。\n这当然是好事。\n但这里有一个容易被忽略的区别：能够生产，不等于能够交付。\nAI可以在几分钟内生成一段程序，却不代表这段程序能够在各种环境下稳定运行。\n它可以生成一份漂亮的财务报告，却不代表里面的数字一定准确。\n它可以写出一篇逻辑流畅的文章，却不代表其中的事实都经得起核实。\n以前，这些问题往往由不同岗位的人把关。现在，一个人借助AI完成了所有环节，也意味着原本分散在多个岗位上的质量把关工作，可能集中到了这个人身上。\n生产过程可以压缩，但最终的责任并不会因为生产过程缩短而消失。\n这让我想到，所谓的负责，其实包含两件不同的事情。\n一种叫责任，另一种叫责任感。\n二、责任：出了问题，谁来承担后果？\n我在公司经常遇到一件事。\n财务同事发现某个中心的业绩数据有问题，就会来找我核对。\n原因很简单：我平时与各部门沟通比较多，发消息也比较频繁，所以大家习惯了遇到问题就找我。\n但有些数据根本不是我发出的。\n它可能是另一位同事整理的，其中还涉及一些人工调整，或者某位领导的特殊安排。\n这些信息我未必知道。\n所以我会告诉财务同事，应该去找实际发出这份数据的人。\n这并不是推卸责任，而是因为只有真正掌握数据来源和处理过程的人，才有条件解释为什么系统数据与最终数据不同。\n谁交付了结果，谁就需要对自己交付的部分作出解释，并承担相应责任。\n把这个逻辑放到AI身上，其实也一样。\n假设我用AI制作了一款游戏，并以自己的名义出售。\n玩家购买之后发现游戏无法正常运行，我能不能告诉他：\n“这不是我的问题，是AI生成的代码有问题，你去找AI公司吧。”\n显然不合理。\n玩家购买的是我交付的游戏，而不是我使用AI的过程。\n同样，一个员工使用AI生成了一份错误的业务报告，也不能仅仅用“AI算错了”来结束问题。\n至于涉及法律责任的情况，当然还需要根据具体行为、合同关系和法律规定，判断开发者、经营者、平台以及AI服务提供商各自应当承担什么责任。\n但至少有一点是明确的：\nAI参与了生产，并不意味着交付者就自动免除了责任。\n这与经销商销售商品有些相似。\n消费者通过经销商购买商品，遇到质量问题，经销商不能简单地把消费者推给厂家，就认为自己的事情已经结束。\n厂家可能有厂家的责任，经销商也可能有经销商应当履行的义务。\n否则，消费者为什么要通过你这一层交易？\nAI也是如此。\n它可以成为你的程序员、设计师、秘书，甚至帮助你完成过去需要整个部门才能完成的工作。\n但它不能因为替你做了这些事情，就自动替你承担所有后果。\n三、责任感：没有人追究，你还愿不愿意把东西做好？\n不过，我觉得比责任更值得讨论的，是责任感。\n两者看起来很相似，实际上却有一个重要区别。\n责任关注的是出了问题怎么办，责任感关注的是在问题发生之前，你愿意做到什么程度。\n还是拿AI游戏来说。\n假设我开发了一款游戏，它能够启动，能够运行，也确实有一些可玩的内容。\n我在商品介绍里没有作出虚假承诺，也没有违反平台规则。\n从形式上看，我可能已经具备了出售它的条件。\n但我自己玩过之后，知道它的操作体验很差，游戏内容也不够完整。\n这时候，我仍然可以选择把它卖出去。\n也许有玩家愿意买单，也许不会有人投诉。\n那么，这款游戏是不是就应该出售？\n这已经不是一个简单的法律问题，而是我对自己产品的判断。\n我愿不愿意让别人为这样的体验付钱？\n我是否愿意把自己的名字放在这个产品上？\n这就是责任感。\n当然，这并不是说半成品不能出售。\n实验性游戏、抢先体验版本、开发中的软件，都可以成为商品。消费者也可能愿意为尚未完成的作品付费。\n关键是，你有没有如实告诉消费者，他购买的究竟是什么。\n你可以出售一个实验性的Demo，但不应该把它包装成一款成熟完整的游戏。\n你可以出售一份AI生成的初步研究报告，但不应该让客户误以为它已经经过严谨的人工核实。\n责任感并不要求每个人都交付完美的作品。\n它要求的是，你知道自己在交付什么，也愿意对这个交付标准作出判断。\n而这恰恰是AI很难替你完成的事情。\nAI当然可以根据要求检查代码、测试程序、寻找错误。\n但它不知道，你究竟愿意以什么样的品质标准面对自己的客户。\n即使AI能够提出一套质量标准，最终决定是否接受这套标准、是否发布产品的，仍然是你。\n四、AI越强，人反而越需要成为最后一道屏障\n过去，我们经常讨论AI会替代什么岗位。\n程序员会不会被替代？设计师会不会被替代？文案、财务、分析师会不会被替代？\n这些讨论通常围绕着一个问题：AI能不能完成这些人的工作？\n但我觉得，我们可能忽略了另一个问题。\n当AI真的能够完成这些工作之后，谁来判断这些工作是否已经完成得足够好？\n假设未来AI已经可以独立制作一款游戏。\n它能够完成策划、美术、程序、测试，甚至能够自动修复发现的问题。\n那么，人是不是就没有价值了？\n我觉得未必。\n因为这里仍然存在两种无法简单转交给AI的东西。\n第一种，是承担后果的主体。\n一款游戏侵犯了别人的权益，一份报告导致了错误的经营决策，一项服务给客户造成了损失，都需要有人或者某个经营实体承担相应的责任。\n第二种，是对交付品质的主动要求。\n一个人完全可以让AI生成一百款游戏，随便挑选几款上架销售。\n另一个人也可以使用同样的AI工具，只制作一款游戏，却反复测试、修改、打磨，直到他认为值得交给玩家。\n他们使用的技术可能完全一样，最终交付的东西却可能有天壤之别。\n这种差异并不完全来自技术能力，而来自他们如何看待自己的产品，以及如何看待购买产品的人。\n所以，AI越强大，我们越不能简单地把自己理解成一个给AI下指令的人。\n我们更像一个产品负责人，甚至是一个小型经营实体。\nAI负责完成大量具体工作，而我们负责定义目标、判断质量、决定交付，并承担后果。\n过去，一个人可能因为掌握某种技术而获得工作机会。\n未来，当技术本身变得越来越容易获得，能否把大量自动生成的成果变成可靠的交付，可能会成为另一种重要能力。\n五、人人都能生产之后，什么东西会变得稀缺？\n回到最开始的AI游戏。\n我并不反对有人用15天制作一款游戏，也不认为使用AI就意味着作品质量低劣。\n相反，我很期待AI让更多普通人拥有创作的机会。\n以前一个人想制作游戏，可能需要学习多年，或者投入大量资金。\n现在，他可以先把脑海里的世界制作出来，再慢慢完善。\n这是非常了不起的变化。\n但也正因为如此，未来我们可能会看到海量的AI作品。\n漂亮的图片、精致的视频、看起来功能丰富的软件，以及各种各样的游戏。\n它们的生产成本会大幅下降，生产数量也会快速增加。\n而消费者将面临一个新的问题：\n这么多看起来不错的东西，到底哪些值得购买？\n或许到那个时候，单纯展示一个漂亮的界面，已经不足以让人信任一款产品。\n消费者还会关心，它是否经过充分测试，是否能够稳定运行，开发者是否持续维护，以及出了问题之后能否找到人解决。\n换句话说，当生产能力不再稀缺，可靠的交付和可以追溯的责任，反而可能成为产品真正的竞争力。\n这也是为什么我觉得，未来AI产品的质量问题，不能仅仅通过标注“AI生成”来解决。\n标注可以帮助消费者了解产品的制作方式，却不能代替产品质量。\n一款游戏无论是人工制作还是AI生成，都应该按照它承诺的内容接受评价。\n如果质量很好，我们没有理由因为它使用了AI就否定它。\n如果质量很差，也不能因为它使用了AI就降低对它的要求。\nAI可以解释产品是怎么做出来的，却不应该成为产品为什么做不好的借口。\n我想，这也是AI时代一个很有意思的变化。\n我们曾经以为，掌握生产工具的人最有价值。\n但当每个人都拥有越来越强大的生产工具，人与人之间的差别，也许会更多地体现在交付的最后一步。\n你是否愿意检查AI给出的答案。\n你是否愿意为一份数据核对来源。\n你是否愿意在游戏已经能够出售的时候，再花时间改善玩家的体验。\n以及，当产品真的出了问题，你是否愿意站出来处理，而不是告诉客户：\n“这是AI做的，不关我的事。”\nAI可以替你完成工作，但责任和责任感，最终仍然需要由人来承担。\n"},{"title":"你连自己的情绪都控制不好，凭什么教孩子控制情绪？",
"url":"/blog/ni-lian-zi-ji-de-qing-xu-du-kong-zhi-bu-hao-ping-shen-me-jiao-hai-zi-kong-zhi-qing-xu/",
"date":"2026-10-20",
"headings":[],
"body":"昨天晚上，家里发生了一件小事。\n孩子妈妈买了一条牵引绳，原本是用来拉小车的。五岁的女儿觉得好玩，就拿来挂在脖子上。\n奶奶看到了，马上制止她。因为这种绳子有收紧的功能，挂在脖子上很危险。\n奶奶可能说话稍微大声了一点，女儿听完，突然就哭了起来。\n她有个习惯，一旦情绪爆发，就喜欢找个地方躲起来。这个时候，谁跟她说话都没有用。她不想听解释，也不愿意沟通，仿佛整个世界只剩下一件事情：为什么你们不让我玩？\n奶奶开始安慰她，拿东西给她吃，慢慢转移她的注意力。\n我在旁边看着，心里却有一些不同的想法。\n一、孩子哭了，不代表孩子有理\n我很认可奶奶的处理方式。\n孩子正在情绪当中，首先应该帮助她平静下来，而不是急着批评她。\n但我认为，这件事情还没有结束。\n牵引绳不能挂在脖子上，这是一个安全问题。无论孩子哭得多么伤心，这个规则都不会改变。\n孩子可以因为被阻止而生气，但不能因为生气，就让原本错误的行为变得正确。\n我希望她能够逐渐理解，情绪和行为是两回事。\n你可以哭，可以生气，可以不喜欢奶奶说话的方式，甚至可以暂时不愿意跟我们交流。\n但是，你不能把危险的东西挂在脖子上。下一次，我们依然会阻止你。\n同样，你可以选择一个安静的地方哭一会儿，但要保证安全，让家人知道你在哪里。你也不能因为自己不开心，就要求所有人放下手里的事情，围着你转。\n允许情绪，不等于取消规则。\n这两件事情并不矛盾。\n二、我们究竟想解决孩子的什么问题？\n面对一个情绪爆炸的孩子，大人其实有很多办法。\n最简单的，就是吼她一顿。\n告诉她不准哭，不准闹，再哭就要受到惩罚。\n这种方法甚至可能非常有效。孩子害怕了，停止哭泣，事情似乎就解决了。\n但我一直在想一个问题：\n如果有一天，我们不在她身边了呢？\n她在学校被老师批评，和朋友发生争执，想做的事情遭到拒绝，或者长大以后，在工作中遇到不公平的待遇。\n难道每一次，都需要一个比她更有权威的人站出来，吼她一句，让她停止发脾气吗？\n如果她只是学会了害怕权威，那么当权威不在场的时候，她依然不知道该怎么办。\n这让我意识到，我们可能从一开始就搞错了教育的目标。\n我们想要的，究竟是一个不再哭闹的孩子，还是一个知道如何面对自己情绪的孩子？\n前者追求的是眼前的秩序，后者培养的才是一种可以伴随她成长的能力。\n我更希望给孩子准备一个工具箱。\n当她感到委屈、愤怒、不被理解的时候，她知道自己可以做些什么。\n比如，她可以告诉别人自己很生气，可以要求对方解释原因，可以暂时离开现场，让自己平静下来。\n等情绪过去，再去思考刚才发生了什么，自己有什么选择，下次又可以怎么处理。\n这套方法当然不会因为讲过一次就学会。\n但至少，她开始拥有了除了哭闹和服从之外的其他选择。\n三、为什么我不喜欢在孩子哭的时候讲道理？\n还有一种看起来更加文明的教育方式，就是不停地讲道理。\n孩子一哭，大人就开始分析。\n为什么你做错了？为什么奶奶是为你好？为什么你不应该这样？为什么你要理解别人？\n这些道理可能都没有错。\n但问题在于，孩子当时根本听不进去。\n成年人其实也一样。\n当我们正在气头上的时候，别人越是摆事实、讲道理，我们有时候反而越烦躁。\n因为那个瞬间，我们最强烈的感受可能不是自己有没有道理，而是自己没有被理解。\n更值得警惕的是，如果孩子每一次哭泣，最后都要接受一番教育，她可能会渐渐形成一种印象：\n哭是不好的，生气是不好的，表达不满是不好的。\n于是，她开始学习隐藏情绪，而不是处理情绪。\n我不认为孩子爱哭是什么大问题。\n成年人看起来没有那么容易情绪爆炸，很大程度上是因为我们已经学会了克制和掩饰。\n但克制并不总意味着真正解决了情绪。\n我们可能表面平静，内心却在抱怨、愤怒，甚至把这些情绪带到另一件毫不相关的事情上。\n孩子至少还会直接表达出来。\n当然，这不意味着我们应该鼓励她无节制地发泄，更不意味着可以让情绪伤害别人。\n只是我不希望，她最终学会的情绪管理，仅仅是把自己的感受藏起来。\n有些道理，不一定要在哭完之后立刻讲。\n有些事情，也不需要每次都上升到一次正式的教育。\n等她平静下来，或许只需要简单地告诉她，刚才那个东西为什么危险。再问问她，下次遇到这样的事情，有没有别的办法。\n教育不一定要发生在每一次冲突之后。\n四、孩子真正学习情绪管理，可能是在看大人发脾气\n聊到这里，我突然想到另一个问题。\n我们一直在讨论，应该怎样教孩子控制情绪。\n但孩子又是从哪里学会这些东西的呢？\n很大一部分，可能来自她每天观察的大人。\n当奶奶看到危险的行为，着急地提高音量时，孩子看到了。\n当爸爸面对她的大哭，开始不耐烦时，孩子也看到了。\n当父母因为意见不同而争吵，或者因为工作不顺心而抱怨时，孩子同样在观察。\n我们经常以为，只有正式跟孩子讲道理的时候，才是在教育她。\n但实际上，我们处理自己情绪的方式，本身就是孩子每天都在学习的教材。\n这也让我重新思考，大人是不是应该在孩子面前尽量不表现情绪？\n我觉得不是。\n大人当然可以生气，可以难过，可以失望，也可以因为某件事情而感到委屈。\n如果我们要求自己永远平静，反而给孩子展示了一个不太真实的世界。\n真正值得展示的，是情绪出现之后，我们怎么处理。\n比如，爸爸刚才因为着急，说话声音太大了。\n爸爸可以承认这一点，可以向孩子道歉。\n但同时也可以告诉她，刚才那个行为确实很危险，所以爸爸仍然会阻止。\n道歉不意味着取消规则，承认自己的情绪也不意味着放弃立场。\n又比如，父母发生争执之后，能够重新坐下来讨论问题，而不是继续冷战，或者要求其中一个人无条件服从。\n孩子从这些经历中看到的，不只是大人也会生气。\n她还会看到，生气之后可以道歉，可以解释，可以沟通，可以重新解决问题。\n我甚至觉得，这可能比我们给她讲十次情绪管理的道理更加有效。\n因为孩子不是只在听我们说什么。\n她还在看我们怎么做。\n五、教育的目的，是让孩子有一天不再需要我们\n回到昨天晚上那件事。\n其实无论是奶奶的安慰，还是我希望坚持的规则，出发点都是为了孩子好。\n奶奶希望她赶快平静下来，我希望她明白危险行为不能继续。\n但如果把时间拉长，我觉得还有一个更重要的目标。\n我们不可能永远陪在孩子身边。\n今天，她只是因为一条牵引绳而大哭。\n将来，她可能因为考试失利、朋友疏远、恋爱受挫、工作不顺而愤怒、委屈甚至崩溃。\n我们不可能替她解决所有问题，也不可能要求这个世界上的每个人都温柔地对待她。\n我们能做的，是在她还愿意依赖我们的时候，慢慢帮助她建立自己的判断能力和处理问题的方法。\n让她知道，情绪是可以被接纳的，但行为需要有边界。\n让她知道，别人不允许她做某件事情，不一定是在否定她这个人。\n让她知道，即使非常生气，也不意味着只能通过哭闹、攻击或者逃避来解决问题。\n更重要的是，让她知道，当自己情绪失控的时候，并不意味着一切都完了。她仍然可以重新整理自己的感受，重新选择接下来要做的事情。\n我当然希望女儿能够管理好自己的情绪。\n但我不希望她成为一个从来不敢生气的人。\n我希望她可以哭，可以愤怒，可以不喜欢别人制定的规则，也可以勇敢地表达自己的不同意见。\n只是，她需要逐渐明白，有些事情即使不喜欢，也不能做；有些问题即使很委屈，也需要自己面对。\n而在她学会这些事情之前，我想我首先需要做的，不是成为一个永远正确、永远平静的父亲。\n而是让她看到，一个成年人也会生气，也会犯错，也会有控制不住情绪的时候。\n但他仍然可以在情绪过去之后，重新面对问题，承担责任，找到解决的办法。\n"},{"title":"你不敢赌博，凭什么在职场拿大结果？",
"url":"/blog/ni-bu-gan-du-bo-ping-shen-me-zai-zhi-chang-na-da-jie-guo/",
"date":"2026-10-19",
"headings":[],
"body":"有的人工作十年，勤勤恳恳，能力也不差，却始终拿不出什么值得一提的成绩。\n有的人只用了两三年，参与一个项目，做成一款产品，突然就成了公司的核心人物，甚至实现了财富自由。\n我们通常会把这种差距归结为能力。\n前者能力不够，后者能力突出。\n但我觉得，这个解释可能有问题。\n因为很多时候，不是你能力不够，而是你从来没有参与过一场可能产生巨大收益的赌博。\n一、不是所有工作，都有机会拿到大结果\n我觉得可以把工作简单分成两种：技能型工作和实验型工作。\n技能型工作，就是你掌握一项技能，然后按照要求完成任务。\n比如写一段代码、制作一份报表、设计一张海报。\n这些工作通常有明确的交付标准。只要你的技能足够熟练，结果大体是可以预期的。\n公司付给你工资，你交付相应的劳动。\n至于这款产品最后有没有人买，这个项目能不能赚钱，原则上并不由你负责。\n另一种是实验型工作。\n比如开发一款新游戏、开拓一个新市场、设计一种新的商业模式。\n这类工作有一个特点：你可能做对了所有事情，最后还是失败。\n产品质量不错，但市场不接受；方案设计合理，但执行时机不对；团队很努力，但竞争对手突然推出了更好的产品。\n它们都有很大的不确定性。\n也正因为如此，实验型工作才可能产生远超普通工资的收益。\n一个项目成功了，负责人可能获得晋升、奖金、股权，甚至借此改变整个职业生涯。\n当然，前提是他真的有机会分享这些收益。\n技能型工作主要出售确定性，实验型工作则是在承担不确定性。\n这两种工作的回报逻辑，本来就不一样。\n二、为什么以前一个程序员能改变世界，现在却很难？\n拿游戏行业举例。\n早期电子游戏产业规模很小，一个优秀的程序员，可能同时承担程序、美术、玩法设计等多项工作。\n像宫本茂这样的游戏制作人，能够对一款游戏产生极大的影响。\n当然，他的成功不只是因为个人能力，也离不开当时的产业环境。\n那个时代，游戏开发团队很小，技术人才稀缺，一个人的创造力有机会直接决定产品的面貌。\n但今天不同了。\n一款3A游戏，可能需要几百甚至上千人参与制作。\n你可能是一名非常优秀的程序员，负责其中一个系统，把它做到行业顶尖水平。\n但游戏最终成功还是失败，与你的个人能力并没有那么直接的关系。\n市场营销、发行时机、美术风格、玩法设计、预算管理，任何一个环节都可能改变结果。\n你是整个工业化生产体系中的一个环节。\n这不是说你的能力不重要，而是说，你的能力与最终商业成果之间，隔着一条很长的链条。\n所以，有时候你工作十年，没有什么特别亮眼的大成果，并不代表你比那些履历漂亮的人差。\n可能只是你一直在一个不容易产生个人大成果的位置上。\n而另一个人，恰好参与了一次成功的实验。\n他的能力可能和你差不多，但履历从此完全不同。\n三、所谓拿大结果，其实就是赌赢了一次\n职场上很喜欢讲一个词：拿结果。\n好像一个人只要足够优秀，就应该不断拿到结果。\n但这里面有一个很容易被忽略的问题：\n你做的事情，本身有没有产生大结果的可能？\n如果你的工作是维护一个成熟系统，那么你最大的成绩，可能就是十年不出问题。\n这当然很有价值。\n但它很难变成一个轰轰烈烈的成功故事。\n相反，一个人负责开发新产品，即使失败了三次，只要第四次成功，就可能得到远超你的回报。\n我们很容易看到第四次成功，却忽略前三次失败。\n甚至会反过来认为，这个人拥有某种特别优秀的能力。\n实际上，他可能确实很优秀，但也可能只是比别人多获得了几次下注的机会。\n当然，赌博不代表完全依靠运气。\n好的项目负责人会研究市场、控制成本、判断时机，提高成功的概率。\n但只要结果存在不确定性，就不可能完全排除运气。\n所以，我觉得职场上有一个很重要的区别：\n能力决定你能把一件事做到什么程度，机会决定你做成这件事之后，究竟能获得多大的回报。\n很多人只顾着提升能力，却很少思考自己到底站在什么样的机会面前。\n四、你可能一直在帮别人赌博\n还有一种情况，我觉得更值得警惕。\n你以为自己正在承担一个重要项目，实际上，你只是在帮别人赌博。\n比如公司让你负责开发一个新业务。\n没有成熟的流程，没有明确的市场，你需要不断试错，协调资源，承担很大的压力。\n项目失败了，你的绩效受到影响，甚至可能丢掉工作。\n但项目成功了呢？\n公司赚了几千万，你可能只得到一笔普通的年终奖。\n这时候，你承担了实验的风险，却没有真正参与实验的收益。\n当然，公司投入资金、品牌和资源，理应获得相应的回报。\n但你也应该想清楚，自己究竟在这场赌博中扮演什么角色。\n是领取固定工资的技能提供者？\n还是承担风险、分享收益的项目合伙人？\n又或者是最糟糕的一种：承担了项目失败的责任，却没有分享成功收益的权利？\n很多人追求更大的职位、更重要的项目，却很少认真计算这里面的风险和收益。\n有些所谓的机会，只是把原本属于公司的不确定性，转移到了员工身上。\n不是所有值得冒险的工作，都值得你去冒险。\n五、真正值得考虑的，是如何给自己下注\n讲到这里，可能有人会问：\n难道我们都应该辞职创业，或者主动去做高风险项目吗？\n当然不是。\n每个人的经济条件、家庭责任、风险承受能力都不同。\n有些人追求稳定，有些人喜欢探索，有些人希望快速积累财富。\n没有哪一种选择天然更高级。\n但如果你希望自己的职业生涯有机会出现一次大的突破，那么你可能需要接受一个现实：\n仅仅把手头的工作做好，未必足够。\n你还需要给自己创造一些有机会获得超额回报的事情。\n比如，在完成本职工作的同时，尝试一个新业务。\n或者参与一个有明确激励机制的项目。\n甚至是利用业余时间开发一款产品，写作，经营自己的客户资源。\n这些事情未必成功。\n但它们有一个共同点：成功之后，你有机会真正拥有一部分成果。\n这里最重要的不是冒险，而是选择。\n首先，你得有一个基本盘。\n稳定的收入、足够的积蓄，以及失败之后仍然能够正常生活的能力。\n其次，你要学会计算赔率。\n一个项目即使成功了，你也只能获得一点象征性的奖励，那就未必值得投入太多。\n而另一个项目，可能只需要投入少量时间，失败了也没什么损失，成功之后却能给你带来新的职业机会。\n后者反而值得认真考虑。\n最后，你还需要接受失败。\n如果你做的是实验，就不能每次都要求自己一定成功。\n有时候，一次实验最大的成果，就是让你知道这条路走不通。\n你获得了经验，修正了判断，下一次可能会做得更好。\n这也是为什么我觉得，评价一个人的职业生涯，不能只看他最终做成了多少项目。\n还应该看看，他做过什么样的尝试，承担过什么样的风险，又从中获得了什么。\n六、你想要的结果，究竟是什么？\n其实，工作不一定非要追求所谓的大结果。\n如果你想要的是稳定的生活，那么一份能够长期提供收入、风险可控的工作，本身就是很好的结果。\n如果你想要的是个人成长，那么即使项目失败，只要你获得了新的经验，也可能是值得的。\n但如果你想要的是财富、地位，或者一次职业生涯的巨大突破，那么你可能就不能只依靠日复一日的技能交付。\n因为这些东西往往来自不确定性。\n你必须在某个时候，参与一场可能成功、也可能失败的实验。\n而且，你得确保自己不仅承担风险，也有资格分享成功的收益。\n我觉得职场最值得学习的，可能不只是如何把工作做得更好。\n还包括如何识别机会，判断赔率，控制风险，以及什么时候应该下注。\n你不需要把全部身家押上去，也不需要每一次都赌赢。\n但至少，你应该知道自己现在是在领取工资，还是在参与一场赌博。\n以及这场赌博如果真的赢了，你能分到什么？\n"},{"title":"为什么玩游戏，你总想再来一局？",
"url":"/blog/wei-shen-me-wan-you-xi-ni-zong-xiang-zai-lai-yi-ju/",
"date":"2026-10-19",
"headings":[],
"body":"为什么我们能够理解一个人熬夜追剧，却很难理解一个人对着同一款游戏，玩上几百个小时？\n追剧很好理解。故事还没有结束，人物的命运悬而未决，我们总想知道下一集会发生什么。\n但有些游戏却完全不同。\n它们没有多少剧情，地图差不多，敌人差不多，甚至每一局的目标都一样。输了就重新开始，赢了也重新开始。\n在旁人看来，这简直是在重复劳动。\n可玩家却乐此不疲。明明已经玩了几个小时，还是忍不住告诉自己：再来一局。\n到底是什么东西，让人愿意一遍又一遍地做看起来相同的事情？\n一、你以为自己已经玩懂了，其实才刚刚入门\n最近我一直在玩《杀戮尖塔》。\n这是一款卡牌游戏。玩家需要不断收集卡牌、获得遗物、调整牌组，然后打败一路上的敌人，最终挑战Boss。\n一开始，我觉得这游戏挺有意思。\n抽到一张厉害的牌会很开心，拿到一个强力遗物也很开心。有时候运气好，凑出一套不错的组合，就能一路打到终点。\n后来，我陆续通关了四个角色。\n我以为自己已经玩得差不多了。\n直到我发现，原来我通关的只是最低的进阶难度，后面还有A10、A20这样的挑战。\n到了A10，我已经打得磕磕碰碰。每一局都觉得自己的牌组还不够完善，攻击、防御、能量、抽牌，似乎什么都缺一点。\n我想不出更好的办法，于是去看高手的视频。\n结果让我大吃一惊。\n有些高手的牌组只有寥寥几张牌，却能通过抽牌、消耗、能量循环等机制，不断打出卡牌，甚至让敌人没有还手的机会。\n原来游戏还可以这样玩。\n我以前觉得不起眼的卡牌，在他们手里竟然是整套战术的核心。\n看到这里，我突然有了一种很奇妙的感觉。\n原来我以为已经玩得差不多的游戏，实际上才刚刚开始。\n但与此同时，游戏也变得不好玩了。\n以前只需要考虑哪张牌厉害，现在却要考虑整套牌组的运转。要不要拿这张牌？要不要删掉一张牌？血量应该保留多少？这一回合该不该承受伤害？\n每个选择都需要思考。\n玩游戏本来是为了放松，现在却像是在做一道又一道复杂的数学题。\n可是奇怪的事情发生了。\n我反而更想玩了。\n因为我突然发现，眼前还有大量没有尝试过的战术，还有很多自己从未理解的机制。\n我迫不及待地想重新开一局，试试刚刚学到的方法。\n哪怕最后没有通关，只要发现了一种新的打法，我也会觉得很开心。\n游戏恰恰是在变得不好玩的时候，又变得更好玩了。\n二、为什么旁观者觉得重复，玩家却觉得每一局都不同？\n我觉得这是理解这类游戏的关键。\n对于没有玩过《杀戮尖塔》的人来说，第一局和第一百局，可能真的没有多少区别。\n无非就是抽牌、出牌、打怪、通关。\n但对于玩家来说，这一百局可能完全不同。\n因为游戏虽然没有发生太大的变化，玩家自己却变了。\n第一局的时候，你看到一张牌，只知道它能造成多少伤害。\n第五十局的时候，你开始考虑它与其他卡牌的配合。\n第一百局的时候，你可能已经在考虑它的抽牌效率、能量成本，以及它会不会破坏整套牌组的循环。\n同样一张牌，在不同阶段的玩家眼里，已经是完全不同的东西。\n这有点像看围棋。\n一个不懂围棋的人，看到的可能只是两个人不断往棋盘上放黑白棋子。\n但对于高手来说，每落下一颗棋子，整个局势都会发生变化。他看到的是空间、攻防、取舍，以及未来几十步的可能性。\n外面的人看的是动作，里面的人看的是结构。\n这也解释了一个很有意思的现象：\n有些游戏不需要不断提供新的内容，因为玩家自己就在不断创造新的体验。\n同样的规则，在不同水平的人手里，会呈现出不同的世界。\n所谓的重复，只是旁观者看到的表象。\n玩家真正反复体验的，并不是同一件事情，而是自己对这件事情的理解。\n这或许也是为什么有些游戏能够让人玩上几千个小时。\n游戏里的世界没有变大，但玩家眼里的世界却在不断展开。\n三、还有一种力量，叫作不甘心\n当然，如果把所有的乐趣都归结为学习和成长，恐怕也不准确。\n因为很多时候，我们想再来一局，根本不是为了学习。\n而是因为输了。\n我在看《杀戮尖塔》的视频时，经常看到弹幕和评论里有人说“红温”。\n这个词通常形容一个人因为连续受挫、情绪激动而上头。\n这种状态我也很熟悉。\n明明上一局已经打得很好，结果在最后一个Boss那里输了。\n可能只差一点血量，可能只是抽牌顺序不好，也可能是前面做错了一个决定。\n这时候你很难甘心。\n你会想，如果刚才不拿那张牌，如果提前多留一点血，如果最后一回合抽到了另一张牌……\n是不是就赢了？\n于是你又开始了一局。\n这和单纯享受游戏的乐趣，似乎是两种不同的心理。\n前者是因为看到了新的可能性，想主动探索。\n后者则是因为无法接受刚才的结果，想重新证明自己。\n尤其是那些带有随机性的游戏，很容易让这两种心理交织在一起。\n因为你永远无法完全确定，上一局的失败到底是因为自己的水平，还是因为运气。\n而下一局，又永远存在着一种可能：\n这次也许就赢了。\n这种心理有时会让人认真复盘、改善策略，有时也会让人陷入赌徒式的侥幸，不断重复已经证明无效的方法。\n同样一句“再来一局”，背后可能是完全不同的动机。\n四、有人享受过程，有人只想拿到结果\n我之前写过一些关于游戏的思考，有位读者在评论区提到，多巴胺和内啡肽，总有一种适合自己。\n这让我想到，游戏里的快乐可能确实存在很多不同的来源。\n有人喜欢抽到稀有道具时的惊喜。\n有人喜欢研究复杂系统，发现一套别人没有想到的打法。\n还有人喜欢刷成就。\n哪怕某个成就需要重复十几个小时，过程十分枯燥，他也愿意坚持下去。\n因为当那个成就终于解锁时，他会获得一种强烈的满足感。\n我以前不太理解这种玩法。\n如果过程已经不好玩了，为什么还要继续？\n但现在想想，或许是因为每个人对快乐的定义并不相同。\n有的人喜欢不确定性带来的刺激，有的人喜欢逐渐掌握一套复杂规则的感觉，还有的人就是喜欢把一件事情彻底完成。\n这里不妨借用多巴胺来理解奖励期待与行动动力，但也不必把它和内啡肽简单划分成短期快乐与长期快乐。人的愉悦体验并没有这么明确的化学分工。\n比起是哪一种物质在起作用，我更感兴趣的是：为什么同样一件事，在不同的人眼里，付出和回报的关系会如此不同？\n一个人觉得刷成就枯燥，另一个人却觉得充实。\n一个人觉得研究牌组费脑，另一个人却觉得兴奋。\n我们往往习惯用自己的标准判断别人是不是在享受游戏，却忽略了别人可能正在追求一种我们根本不在意的奖励。\n五、为什么偏偏是“再来一局”？\n还有一个因素，我觉得很容易被忽略。\n就是这些游戏允许你不断重新开始。\n现实生活中，很多事情没有那么容易重来。\n一次考试失败了，下一次可能要等几个月。一个项目做错了，可能要承担很长时间的后果。\n但在游戏里，一局结束，下一局马上就能开始。\n而且你并不是完全从零开始。\n虽然游戏里的装备、等级、卡牌可能全部重置，但你上一局积累的经验并没有消失。\n你知道哪张牌不值得拿，知道哪个敌人需要提前准备，也知道自己刚才为什么会输。\n游戏重置了你的资源，却保留了你的认知。\n这是一个很巧妙的设计。\n它让失败既有代价，又不至于让人彻底失去希望。\n每次重新开始，你都可以带着上一局的经验，尝试修正一个错误。\n如果再加入随机性，每一局又会出现新的问题。\n于是你永远处于一种微妙的状态：\n你觉得自己比上一局更懂了，但又不敢保证这一局一定能赢。\n你既期待验证自己的进步，又期待遇到新的变化。\n当然，这种机制也有另一面。当失败后的重开过于容易，玩家也可能来不及反思，就被下一次尝试吸引过去。\n有时我们是在学习，有时只是在重复。\n而游戏最厉害的地方，可能就是让这两种状态很容易混在一起。\n六、同样是再来一局，我们追求的可能根本不是同一件事\n回到最初的问题。\n为什么有些人愿意对着一款没有多少剧情、看起来每局都差不多的游戏，玩上几百甚至几千个小时？\n我想，答案并不只是因为游戏设计了多少奖励。\n而是因为它能够同时满足很多不同的期待。\n你可能想赢。\n可能想验证一种新的战术。\n可能想弥补上一局的遗憾。\n可能只是想看看，这次随机出现的卡牌能不能组合出什么意想不到的东西。\n甚至你可能什么都不想，只是习惯性地再开一局。\n这些动机并不矛盾，它们经常在同一个玩家身上交替出现。\n就像我现在玩《杀戮尖塔》。\n有时候我很想通关A20，有时候却只是想试试一套新牌组。\n有时候输了也很开心，因为发现了以前不知道的玩法。\n有时候明明已经玩累了，却因为最后一个Boss差一点就能打赢，又忍不住重新开始。\n我很难说自己究竟是在享受游戏，还是被游戏牵着走。\n但我发现了一件事。\n以前，我打开游戏，是想看看这一局会给我什么。\n现在，我打开游戏，更多时候是想看看，自己还能做出什么。\n屏幕上的怪物还是那些怪物，卡牌还是那些卡牌。\n只不过，当我再次看到它们时，脑子里已经开始出现一些以前根本想不到的组合。\n然后，我又点下了“开始游戏”。\n"},{"title":"创作，是为了成为一个伟大的人吗？",
"url":"/blog/chuang-zuo-shi-wei-liao-cheng-wei-yi-ge-wei-da-de-ren-ma/",
"date":"2026-10-16",
"headings":[],
"body":"看昆汀的《低俗小说》时，我曾经想过一个问题：一个导演，究竟需要有多深刻的思想，才能拍出这样的电影？\n电影里充满了偶然、选择和命运。一个看似无关紧要的决定，可能改变一个人的一生。不同人物的故事相互交织，每个人都在自己的处境中做出选择，又承担着意想不到的后果。\n最近玩了一款叫《Late Shift》的互动电影游戏，也让我产生了类似的感受。\n玩家需要不断替主角做决定，有些选择看起来微不足道，却可能将故事带向完全不同的结局。\n这些作品让我觉得，创作者似乎不仅仅是在讲故事，更像是在做一场思想实验。\n他们提出一个问题，设计一些人物和情境，然后让故事自己发展下去。\n他们并不急于告诉观众答案，而是邀请观众参与思考。\n于是我开始好奇：这些大导演、大编剧，是不是本身就是哲学家？\n一、我们是不是把创作者想得太神秘了？\n我们很容易对伟大的创作者产生一种距离感。\n看完一部精彩的电影，会觉得导演一定拥有非常深刻的人生理解。读完一本小说，会觉得作者一定看透了人性。\n仿佛这些人拥有某种普通人无法企及的智慧。\n但仔细想想，也许并没有那么神秘。\n一个导演，可能只是对某些人生问题特别感兴趣。\n比如，一个人在什么情况下会背叛朋友？一个善良的人会不会做出残忍的决定？如果人生可以重新选择，结果真的会更好吗？\n这些问题，普通人同样会思考。\n区别可能在于，普通人想了一会儿，就去忙其他事情了。而创作者愿意花几个月甚至几年，把一个问题发展成一部作品。\n他需要设计人物、构建冲突、安排情节，再通过镜头、对白和表演呈现出来。\n这里当然需要专业能力。\n但专业能力和思想深度，其实是两件可以分开讨论的事情。\n一个人不必先成为哲学家，才有资格提出哲学问题。\n他也不必想清楚人生的全部答案，才能开始创作。\n有时候，恰恰是因为想不清楚，才值得把它写出来。\n二、创作不一定是表达答案，也可以是探索问题\n我发现自己更喜欢那些不急着给出答案的作品。\n如果一部电影从头到尾都在告诉我，什么是正确的，什么是错误的，什么样的人值得赞扬，什么样的人应该受到惩罚，那么看完之后，我能够继续思考的空间反而很少。\n但如果创作者只是提出问题，然后通过人物的选择，实验性地展示不同的可能性，事情就有趣多了。\n比如《Late Shift》，它并不只是告诉玩家应该如何选择，而是让玩家亲自面对选择，再看到可能产生的后果。\n你甚至可能在做出选择之后，仍然不知道自己到底有没有选对。\n这种不确定性，恰恰是作品吸引人的地方。\n我觉得好的创作，有点像搭建一间思想实验室。\n创作者负责提出问题、设置条件、安排冲突，而观众带着自己的经历走进去。\n不同的人，可能得到完全不同的理解。\n这也意味着，创作者不一定需要比观众更聪明。\n他可能只是比观众更愿意花时间，把一个问题研究得足够具体。\n而且，他不必把所有问题都解决。\n一个创作者可以有自己的判断，也可以坦诚地保留那些尚未想清楚的部分。\n作品不是标准答案，而是他目前探索到的地方。\n三、所谓创作能力，也许就是长期积累的结果\n想到这里，我突然觉得，大导演、大作家似乎也没有想象中那么遥不可及。\n当然，拍电影是一项复杂的工业活动，需要资金、团队、技术和大量经验。写出优秀的小说，也需要语言能力、结构能力和长期练习。\n这些门槛是真实存在的。\n但如果暂时不考虑作品规模，只讨论创作本身，它似乎没有那么高不可攀。\n你观察到一个有趣的现象，提出一个问题，尝试用自己的经验解释它，再把这个过程表达出来。\n这不就是创作吗？\n专业创作者可能拥有更丰富的表达手段，而普通人也可以通过文章、照片、短视频，甚至一个小游戏，去完成自己的表达。\n两者在规模和成熟度上存在差异，但未必有一道不可跨越的鸿沟。\n而且，创作能力很大程度上是可以积累的。\n今天你注意到一个细节，明天你对某个问题有了新的理解，后天你发现自己过去的判断并不准确。\n这些东西并不会因为没有立即成为作品，就失去价值。\n它们会逐渐构成你的观察方式、判断方式和表达方式。\n时间长了，你会发现自己开始拥有一些别人不容易复制的东西。\n那不是某个惊天动地的观点，而是你长期积累出来的视角。\n四、成为优秀的创作者，与成为著名的创作者，是两回事\n我们经常会把这两件事情混在一起。\n因为我们认识的创作者，往往已经是被市场筛选出来的人。\n我们认识昆汀，是因为他的电影被全世界看见了。我们认识那些伟大的作家，也是因为他们的作品被出版、传播、讨论，最终留了下来。\n于是，我们很容易把创作的终点理解为获得这样的地位。\n但这里其实存在一个问题。\n一个人能否成为优秀的创作者，与他的作品能否被广泛看见，并不是完全相同的事情。\n前者需要长期练习、积累经验、提高判断力。\n后者除了作品质量，还受到时代、市场、传播渠道和运气的影响。\n你可能写出一篇很好的文章，却只有几十个人阅读。\n也可能拍出一部自己非常满意的短片，却始终没有机会进入更大的市场。\n反过来，一部作品突然走红，也不一定意味着创作者已经达到了多么高深的思想境界。\n知名度和创作能力之间有联系，却不能简单画等号。\n如果把成为著名创作者当作唯一目标，那么绝大多数人的创作生涯，可能都会被定义为失败。\n但这个评价标准真的合理吗？\n五、创作的过程，也是在成为你自己\n我现在写文章，反而不太想逼着自己写出什么伟大的作品。\n以前可能会觉得，一篇文章应该有一个非常深刻的观点，最好能让读者看完之后恍然大悟。\n但后来发现，很多时候，我自己也没有完全想清楚。\n我只是对某个现象感兴趣，想知道它为什么会发生。\n于是开始提问、讨论、寻找例子，再尝试把自己的判断写出来。\n写着写着，有些问题清楚了，有些问题却变得更加复杂。\n甚至有时候，写到最后，我发现自己最初的判断是错的。\n但这并不意味着这次创作没有价值。\n因为下一次遇到类似的问题时，我已经不再是原来那个自己。\n我拥有了新的经验，新的理解，也多了一种观察世界的方法。\n这种积累未必能让我成为一个著名作家，却会实实在在地改变我。\n我觉得，这可能是创作中一个经常被忽略的部分。\n我们总是关注作品最终获得了什么：多少阅读量、多少票房、多少奖项、多少人的认可。\n却很少关注创作者在完成作品的过程中，究竟获得了什么。\n如果一个人持续十年观察生活、提出问题、表达自己的判断，即使他的作品始终没有获得广泛关注，他也很可能已经形成了一套独特的思想和表达方式。\n而且，这套东西属于他自己。\n他不必成为第二个昆汀，也不必成为第二个任何人。\n他只是在不断创作的过程中，渐渐成为了自己。\n⸻\n我们认识昆汀，是因为他的电影被全世界看见了。\n但在成为今天的昆汀之前，他也只是一个喜欢电影、不断积累经验和想法的人。\n也许世界上还有很多这样的人。\n他们同样在观察、思考、写作、拍摄，同样在认真对待自己感兴趣的问题。\n只是他们的作品没有被多少人看见。\n那么，一个没有被看见的创作者，他的创作就没有意义了吗？\n"},{"title":"年轻人找工作，别只想着锻炼能力",
"url":"/blog/nian-qing-ren-zhao-gong-zuo-bie-zhi-xiang-zhao-duan-lian-neng-li/",
"date":"2026-10-16",
"headings":[],
"body":"年轻人找工作，经常会听到一种建议：不要太在意眼前的工资，要选择能够锻炼能力的岗位。\n这句话当然没错。\n但我觉得，它可能只说对了一半。\n因为一个人的职业发展，除了依靠自身能力，还依靠许多外部条件。有时候，选对一个位置，比你在原来的位置上努力三年更有价值。\n年轻人不仅要学会培养能力，还要学会寻找红利。\n一、你以为是自己的本事，可能只是站对了位置\n在企业工作久了，会慢慢发现一件有意思的事。\n有些人明明没有特别突出的能力，却能获得很多机会。\n比如，一个人在大厂工作，哪怕只是普通员工，出去找工作时也可能更容易获得面试机会。\n这就是平台红利。\n又比如，一个人在企业负责采购、审批或者某些重要资源，许多人对他特别客气，甚至主动送礼、请客。\n这就是职务红利。\n还有一种情况，你在某个行业工作了几年，突然有竞争对手愿意出高薪挖你。你的能力未必发生了多大变化，但因为你掌握着对方需要的行业经验和信息，你的身价突然提高了。\n这可以叫作行业竞争带来的红利。\n这些好处当然不是凭空产生的，但也不完全来自个人能力。\n有一个很简单的判断方法：\n假如明天你离开现在的平台、岗位或者行业，这些好处还会不会存在？\n如果答案是否定的，那么你享受的，很可能就是某种红利。\n不过，我并不认为这有什么不好。\n恰恰相反，我觉得年轻人应该主动寻找这样的机会。\n二、为什么我们总是强调能力，却很少强调红利？\n可能是因为，我们从小接受的教育，更接近一种考试思维。\n你想取得好成绩，就要认真学习，掌握知识，提高解题能力。\n在学校里，这套逻辑通常是有效的。你掌握的知识越多，解题能力越强，就越有可能取得好成绩。\n于是，进入职场之后，我们也很容易延续这种思维。\n我应该学习什么技能？考什么证书？进入什么岗位？怎样让自己变得更优秀？\n这些问题当然重要。\n但现实世界并不是一张试卷。\n它不会保证能力最强的人获得最多的回报，也不会保证你付出了多少努力，就能得到相应的奖励。\n一个编程能力普通的人，如果在移动互联网快速发展的时期进入一家高速成长的企业，可能几年后就获得了相当不错的收入和履历。\n另一个技术能力更强的人，如果进入一个不断萎缩的行业，可能付出更多努力，也很难获得同样的回报。\n这并不是说能力不重要。\n而是说，能力决定你能做什么，环境在很大程度上决定你的能力值多少钱。\n既然如此，为什么我们找工作时，只研究如何提高能力，却很少研究什么地方能够放大自己的价值？\n三、找工作，其实也在寻找杠杆\n我觉得年轻人可以换一种思路。\n不要只问，这份工作能教会我什么。\n还应该问，这份工作能够给我带来什么额外的优势？\n比如，一家企业的工资不算特别高，但它在行业里非常有名。你在里面工作两年，可能获得一份很有竞争力的履历。\n这是品牌带来的杠杆。\n一家企业虽然规模不大，但正在快速扩张。你加入时只是普通员工，随着业务增长，你可能获得管理团队、负责新项目的机会。\n这是增长带来的杠杆。\n还有一种企业，内部有很强的资源整合能力。你个人未必能够接触到那些客户、专家或者合作伙伴，但因为你处于这个岗位，就能够与他们建立联系。\n这是资源带来的杠杆。\n这些机会并不一定能立即锻炼某种具体技能，却可能改变你未来的发展空间。\n更有意思的是，红利有时候会产生复利效应。\n你因为进入一家知名企业，获得了更好的履历；因为这份履历，又获得了更好的工作机会；因为新的工作机会，接触到更重要的项目和资源。\n几年之后，你的职业发展可能已经与当初处于同一起点的人拉开了距离。\n这里面当然有个人努力的作用。\n但如果忽略最初那个位置带来的优势，就很容易错误地理解自己的成功。\n有时候，你不是先变得特别优秀，才获得好的机会；而是先进入一个有优势的环境，才有机会变得更加优秀。\n四、红利不属于你，但这不是拒绝它的理由\n当然，红利有一个很重要的特点：它可能随时消失。\n你离开了大厂，原来的平台光环可能渐渐减弱。\n你失去了管理职务，过去对你特别客气的人，可能不再主动联系你。\n你所在的行业不再热门，过去高薪挖人的企业，可能开始裁员。\n所以，红利和能力最大的区别，不是哪个更有价值，而是它们依赖的条件不同。\n有些能力可以跟随你很长时间，有些红利却必须依附于特定的环境。\n但我觉得，很多职场建议恰恰在这里走向了另一个极端。\n它们总是提醒你，不要依赖平台，不要依赖关系，不要把环境带来的优势当成自己的能力。\n这当然有道理。\n可是，为什么不能依赖呢？\n企业发展本来就需要利用市场环境，投资者也会寻找行业机会。没有人会要求一家企业只依靠自身能力赚钱，而完全不利用外部条件。\n为什么到了个人职业发展，我们反而要求自己只靠能力，不靠红利？\n真正需要警惕的，不是享受红利，而是误判红利。\n你可以利用平台给你的机会，但不要以为平台的声誉全部属于你。\n你可以利用岗位带来的资源，但不要以为别人对你的尊重永远不会改变。\n你也可以利用行业竞争获得更高的薪水，但不要以为这样的机会会一直存在。\n知道自己正在借助什么力量，比假装一切都是自己的本事重要得多。\n五、不要把职业生涯当成一场能力考试\n我越来越觉得，年轻人找工作，不应该只有一条标准答案。\n不是所有人都必须先掌握某项技能，再进入某个行业，最后一步一步晋升。\n有时候，你可以先进入一个发展很快的行业，再慢慢寻找自己的位置。\n有时候，你可以先借助一家公司的品牌，获得进入更大市场的机会。\n有时候，你甚至可以暂时选择一份技能成长不那么明显、但资源和机会更多的工作。\n当然，这并不意味着任何红利都值得追逐。\n有些红利持续时间很短，有些需要付出很高的代价，有些甚至会让你逐渐失去独立发展的能力。\n因此，找工作时除了考虑收入和能力成长，还应该多问几个问题：\n这个岗位的优势来自哪里？这些优势还能持续多久？我需要付出什么代价才能获得它？如果有一天失去了这些条件，我又能带走什么？\n这不是鼓励年轻人投机取巧，而是希望他们更全面地理解职业世界。\n毕竟，工作不是考试。\n考试通常有明确的范围、统一的评分标准，你只需要努力提高分数。\n但职业发展更像是在一个不断变化的市场里寻找自己的位置。\n你不仅需要提高能力，还需要观察环境、识别机会、判断趋势，必要时调整方向。\n一个人完全可能很努力，却一直待在一个无法发挥优势的位置上。\n也可能只是换了一个环境，过去积累的经验和能力就突然变得有价值了。\n所以，如果让我给刚进入职场的年轻人一条建议，我不会只说，要努力学习，让自己变得更强。\n我还想告诉他：\n不要只盯着自己还缺少什么能力，也要抬头看看，这个世界正在给什么样的人提供机会。\n有时候，后者可能比前者更值得你花时间研究。\n"},{"title":"这个时代，为什么不必等产品做好了再卖？",
"url":"/blog/zhe-ge-shi-dai-wei-shen-me-bu-bi-deng-chan-pin-zuo-hao-liao-zai-mai/",
"date":"2026-10-15",
"headings":[],
"body":"以前，我们习惯了一种商业逻辑：先把东西做好，再拿出去卖。\n写一本书，要经过漫长的构思、写作和修改；开发一款游戏，要把完整的内容制作出来；做一款软件，要经过反复测试，确认没有太多问题，才敢正式发布。\n产品是产品，制作过程是制作过程。只有完成的东西，才有资格进入市场。\n但现在，这条界限正在变得模糊。\n我们正在进入一个连制作过程都可以拿来卖钱的时代。\n一、你以为别人卖的是文章，其实卖的是思考过程\n我经常写文章。\n以前，我觉得写文章应该有一个完整的过程：先确定主题，搜集资料，组织观点，反复推敲，最后形成一篇逻辑严密、表达精炼的文章。\n但现在，我发现另一种方法同样有效。\n我只需要有一个大致的想法，然后对着 AI 聊半个小时。\n这个过程中，我可能会提出一个问题，想到几个解释，推翻其中一个，又突然发现另一个值得讨论的方向。\nAI 帮我去掉口头禅、重复和无关内容，再把这些思考整理成一篇文章。\n文章就完成了。\n有意思的是，这样的文章不一定比精心打磨的文章差，有时候反而更容易获得阅读量。\n为什么？\n因为读者需要的，未必只是一个结论。\n假设你想向一个小学生解释大学数学，直接把论文递给他，即使论文写得再严谨，他也不可能看懂。\n你得先告诉他，为什么会产生这个问题，人们最初是怎么解决的，遇到了什么困难，后来又发现了什么。\n读者需要沿着一条路径，慢慢走到结论面前。\n而一个人真实的思考过程，恰好提供了这条路径。\n这意味着，过去我们认为需要删掉的东西——疑问、尝试、探索，甚至部分错误——现在也可以成为内容本身。\n以前卖的是思考完成后的成果，现在连思考过程都可以成为商品。\n二、游戏和电视剧，早就在卖半成品了\n这种现象当然不只发生在写文章上。\n比如游戏。\n传统游戏开发，通常需要投入大量资金和时间，等到作品基本完成后，才能正式销售。\n如果玩家不喜欢，开发商可能已经投入了几年时间，损失很难挽回。\n但现在，越来越多游戏采用抢先体验、持续更新、DLC 等方式。\n先拿出一个具备核心玩法的版本，看看玩家愿不愿意付钱。\n如果市场反应不错，就继续投入资源，扩充内容；如果反应一般，就调整方向，甚至停止开发。\n玩家买到的可能不是最终形态的游戏，而是一个正在成长的产品。\n美剧的季度制作模式，也有类似的商业逻辑。\n一部剧不一定要先规划好几十集，拍完一个完整故事。\n可以先制作一季，观察收视表现和市场反应，再决定是否续订。\n这背后有一个很重要的变化：\n市场反馈不再只是产品完成后的考试，而是产品制作过程的一部分。\n以前，创作者需要猜测市场想要什么。\n现在，可以把产品放到市场里，让真实的消费者告诉你答案。\n更重要的是，市场不仅提供答案，还可能为下一阶段的开发提供现金流。\n这就把原来集中在前期的投入和风险，拆成了一个个较小的阶段。\n三、AI 正在加速这种变化\n如果说过去这种模式主要是为了降低商业风险，那么 AI 的出现，则进一步降低了生产和修改的成本。\n过去开发一款软件，可能需要一个团队花几个月才能完成基本功能。\n现在，借助 AI，一个人就有机会在很短时间内做出可以使用的原型。\n于是，产品发布的节奏也发生了变化。\n先上线，再收集反馈，再修复问题，再增加功能。\n尤其在 AI 软件领域，我们经常看到新功能快速发布，随后又密集更新、修复和调整。\n从积极的一面看，这是生产效率的提高。\n但从另一面看，也可能意味着一些原本应该在发布前完成的测试和完善工作，被转移到了用户使用阶段。\n用户付了钱，却可能还要承担一部分测试成本。\n这其实是过程商品化最有争议的地方。\n以前，企业把产品做好，再交给消费者。\n现在，企业可能把一个尚未成熟的产品交给消费者，然后邀请消费者参与它的成长。\n当然，这里有一个前提：未完成不等于不可用，更不等于可以不负责任。\n一款游戏可以暂时没有后续章节，但现有玩法应该成立。\n一款软件可以暂时缺少高级功能，但已经承诺的基本功能应该可靠。\n消费者可以接受产品继续进化，却未必愿意为企业的敷衍买单。\n四、真正改变的，是我们对商品的理解\n过去，我们购买商品，主要是购买一个确定的结果。\n买一本书，得到完整的内容。\n买一款软件，得到已经实现的功能。\n但现在，越来越多的交易不再局限于一个固定的成果。\n比如订阅制软件。\n用户每个月付费，不仅购买当下的功能，也期待软件未来持续改善。\n如果产品长期不更新，或者更新不能创造新的价值，用户就可能取消订阅。\n这意味着，企业出售的不只是产品当前的状态，还有它持续提供价值的能力。\n当然，消费者不会仅仅因为你承诺未来会变好就一直付钱。\n每一次续费，都是一次重新选择。\n产品必须不断证明自己值得这个价格。\n从这个角度看，商业模式也发生了变化。\n过去，企业可能花一年制作产品，然后用一个月集中销售。\n现在，企业可以花一个月制作初始版本，再用一年时间持续销售、持续完善。\n生产、销售、反馈和改进，不再是严格分开的几个阶段，而是同时发生的。\n五、传统的手艺人思维，可能需要改变了\n我觉得，这件事对普通创作者最有启发。\n我们从小接受的教育，往往鼓励我们把事情准备充分。\n写文章要反复修改，做产品要尽善尽美，创业要把商业计划想清楚。\n这些原则当然没有错。\n但它们有一个隐藏的假设：你可以在产品进入市场之前，就知道什么才是好产品。\n现实未必如此。\n你可能花三个月写了一篇自认为很有深度的文章，结果只有几十个人阅读。\n也可能花半个小时整理一个自己刚刚想到的问题，却有几万人愿意看。\n你可能花一年开发一个功能完整的软件，最后发现根本没人需要。\n也可能先做一个简单工具，解决了某个具体问题，就有人愿意每个月付费。\n在这些情况下，决定产品价值的，不是创作者投入了多少时间，也不是它看起来有多完整。\n而是它有没有满足真实的需求。\n完成度是创作者的标准，需求才是市场的标准。\n这两套标准并不总是一致。\n因此，与其关起门来追求一个想象中的完美产品，不如尽早拿出一个真正能够创造价值的版本，让市场参与判断。\n这不是说我们应该放弃质量，而是应该重新思考：哪些质量必须在发布之前完成，哪些完善可以留到发布之后？\n六、但当市场开始决定创作方向，我们又失去了什么？\n不过，我自己在写文章的过程中，也感受到这种模式的另一个问题。\n当一篇文章可以快速生产，又可以迅速获得阅读反馈时，创作者很容易开始研究：什么题目更有流量？\n于是，选题渐渐向热点、争议、情绪和容易理解的内容靠拢。\n因为这些内容更容易得到反馈，也更容易获得广告收入。\n反过来，那些需要长期研究、阅读门槛较高、受众较少的内容，可能很难获得同样的商业回报。\n一个人花半年研究一个严肃问题，获得的收益，可能远不如另一个人每天生产几篇热门文章。\n这不是简单的谁更努力、谁更有才华的问题。\n而是不同的内容，在同一种商业机制下，获得了不同的奖励。\n市场能够帮助创作者找到需求，但市场反馈不一定能够衡量作品的全部价值。\n如果所有人都根据点击量调整方向，那么那些暂时没有市场、需要长期积累的东西，又由谁来完成？\n它们可能只能依靠少数人的兴趣、积蓄，或者其他收入来支持。\n这也是过程商品化的一个矛盾。\n它让更多普通人有机会把自己的想法变成收入，降低了创作和创业的门槛。\n但与此同时，它也可能让创作者更加依赖即时反馈，把那些暂时无法商业化的探索放到一边。\n所以，我觉得我们真正需要改变的，并不是简单地从追求完美，转向追求速度。\n而是学会区分两件事情：\n一件事情，是为了满足已经存在的市场需求。\n另一件事情，是为了探索那些市场还不知道自己需要的东西。\n前者适合快速发布、不断迭代。\n后者可能仍然需要长时间的沉淀，甚至需要忍受很久没有反馈、没有收入的阶段。\n以前，我们总觉得只有完成的作品才能出售。\n现在，我们发现，原来一个想法、一段探索、一个初步版本，也可能已经具有商业价值。\n这当然是一件好事。\n但当我们终于学会了不必等到万事俱备才把作品拿出来，或许还需要保留另一种能力：\n即使暂时没有人愿意付钱，我们也能判断一件事情是否值得继续做。\n"},{"title":"人为什么要玩游戏来折磨自己的大脑？",
"url":"/blog/ren-wei-shen-me-yao-wan-you-xi-lai-zhe-mo-zi-ji-de-da-nao/",
"date":"2026-10-14",
"headings":[],
"body":"最近沉迷《杀戮尖塔》，玩了几十个小时，突然发现一件很奇怪的事情。\n我好像一直在做数学题。\n每个回合，我都要计算攻击力、防御力、剩余能量，还要考虑各种状态叠加，以及下一回合可能出现的情况。\n比如，敌人还有40点生命值，我手里有几张攻击牌，每张造成不同的伤害。有的牌能增加力量，有的牌能减少敌人的攻击，有的牌还能让我多抽几张。\n我要不断计算，怎样组合才能获得最大的收益。\n仔细想想，这不就是加减乘除，再加上一点概率吗？\n更奇怪的是，我居然乐此不疲。\n如果有人让我坐在书桌前，连续做两个小时的数学题，我大概早就不耐烦了。\n但在《杀戮尖塔》里，我不仅愿意算，还会因为一道题没算好，重新开始，再算一遍。\n我明明是来玩游戏放松的，怎么最后主动给自己找了一份数学作业？\n一、很多游戏，拆开来看都挺无聊的\n这种感觉不只出现在《杀戮尖塔》里。\n之前我玩过一款很喜欢的游戏，叫《最后的篝火》。\n它有漂亮的画面、温柔的音乐，还有一个关于迷失与寻找的故事。\n但如果把这些东西全部去掉，你会发现，它的大量谜题其实就是搬箱子。\n一个箱子应该放在哪里？怎样移动才能打开通道？如何利用有限的空间到达目标位置？\n再抽象一点，就是空间几何和逻辑推理。\n类似的还有《塞尔达传说》里的许多神庙谜题，以及《雷顿教授》里的逻辑题。\n如果把它们从游戏里拿出来，印在一本练习册上，可能就是一道道普通的数学题、几何题和逻辑题。\n这些题目本身未必不好玩，但让一个人连续做几十个小时，恐怕没有那么容易。\n可是一旦加上人物、场景、故事和音效，再设计一些互动机制，体验就完全不同了。\n这里有一个值得注意的现象。\n游戏的底层规则可能非常简单，但由这些简单规则组合出来的体验，却可以非常丰富。\n就像音乐只有有限的音符，却能创造出无数不同的作品。\n不过，这又带来了一个新问题。\n既然数学、逻辑这些基础元素如此重要，为什么我们不直接去做数学题，而是需要游戏把它们包裹起来？\n二、计算本身不够好玩，但没有计算又不好玩\n不妨做一个实验。\n假设把《杀戮尖塔》里的卡牌、怪物、动画和音效全部去掉，只剩下一张Excel表格。\n每个回合，系统给出一些数字，你需要通过加减乘除，计算怎样获得最大的收益。\n虽然底层规则可能完全相同，但你还愿意玩几十个小时吗？\n至少对我来说，吸引力会下降很多。\n可是反过来也一样。\n假设保留《杀戮尖塔》所有的美术、音效和角色，但取消所有计算和策略选择。\n你只需要点击一个按钮，角色就会自动出牌、自动战斗。\n那它还会这么好玩吗？\n恐怕也不会。\n这就很奇怪了。\n数学本身不是全部的乐趣来源，但数学又是游戏乐趣不可缺少的一部分。\n我觉得，这恰恰是游戏最值得研究的地方。\n我们很容易把游戏理解成两部分：一部分是玩法，一部分是包装。\n玩法负责提供挑战，包装负责让它变得好看。\n但实际上，两者的关系可能远比这复杂。\n当数字代表生命值时，它不再只是数字。\n当计算结果决定角色能否存活时，计算也不再只是计算。\n原本抽象的数学关系，被赋予了具体的情境、目标和后果。\n你不再是为了算出40减去多少等于零，而是在想办法击败眼前的敌人。\n虽然数学运算没有改变，但你参与这件事情的方式已经改变了。\n三、游戏不是让你停止思考，而是让你愿意思考\n我以前觉得，玩游戏是一种放松，思考是一种消耗。\n但现在想想，这个理解可能不太准确。\n很多游戏其实非常消耗脑力。\n尤其是策略游戏，你不仅要计算，还要预测、权衡、记忆和判断。\n有时候，一场战斗甚至需要思考十几分钟。\n但我们很少把这种体验称为学习或者工作。\n为什么？\n我觉得至少有三个原因。\n首先，游戏给了我们一个自己想实现的目标。\n做数学题时，通常是别人告诉你要计算什么。\n但在《杀戮尖塔》里，是你自己想打败敌人，于是主动寻找解决问题的方法。\n计算从目的变成了工具。\n其次，游戏允许我们选择解决问题的方式。\n同样面对一个敌人，你可以追求最大伤害，也可以优先防御，还可以牺牲眼前的收益，为后面的回合做准备。\n这些选择未必存在唯一的正确答案。\n你需要根据当前条件，不断寻找更合适的方案。\n这和单纯计算一道算术题，显然不是同一种体验。\n最后，游戏让思考产生了可以感受到的后果。\n你做出一个判断，敌人的血量减少了。\n你设计了一套组合，原本打不过的敌人被击败了。\n你计算失误，角色可能就此死亡。\n这些结果让抽象的思考变成了一种具体的行动。\n游戏没有消除思考的难度，而是让思考成为改变局面的一种能力。\n当然，游戏也在替我们承担一些负担。\n它自动记录数值、执行计算、展示结果，让我们不必把精力全部花在机械性的操作上。\n于是，我们可以把更多注意力放在判断、选择和尝试上。\n这可能也是游戏设计巧妙的地方：它不一定减少了思考，而是重新分配了思考的负担。\n四、那为什么我们的数学教育游戏，往往不好玩？\n想到这里，我突然觉得，现在很多所谓的教育游戏，可能从一开始就理解错了游戏。\n比如，一只小动物遇到了怪物。\n屏幕弹出一道题：\n8＋6＝？\n孩子答对了，怪物被击败，小动物鼓掌，奖励十个金币。\n这样的产品当然也可能帮助孩子练习计算。\n但仔细想想，它真的把数学变成游戏了吗？\n其实没有。\n它只是把一道数学题放进了游戏场景里。\n孩子仍然是在完成一道独立的算术题，只不过答对之后，多了一段动画和一点奖励。\n而《杀戮尖塔》完全不同。\n它不会让你先做五道数学题，再奖励你攻击一次怪物。\n攻击怪物这件事情本身，就是一道数学题。\n这两种设计有着本质区别。\n前者是用游戏奖励吸引孩子完成学习任务。\n后者是让学习所需要的思考，直接成为游戏玩法的一部分。\n假设我们设计一款儿童数学游戏。\n玩家需要经营一家商店，拥有100元启动资金。\n不同商品有不同的进货价格、销售价格和库存限制。顾客的需求还会发生变化。\n孩子需要决定进什么货、卖多少钱、怎样安排资金，才能让商店持续经营。\n在这个过程中，他会主动使用加减乘除，甚至逐渐接触利润、成本和概率。\n重要的是，系统不需要不断提醒他：“现在开始学习数学了。”\n因为如果不使用数学，他就无法实现自己的目标。\n这让我想到另一种可能。\n我们是不是可以不再把数学设计成一个个等待回答的问题，而是把它设计成一套可以探索的规则？\n让孩子通过调整数字，改变游戏世界。\n通过尝试不同方案，发现规律。\n通过失败和重新尝试，逐渐理解数学关系。\n当然，这里还有一个不能忽略的问题。\n一个孩子非常擅长经营虚拟商店，并不代表他就掌握了所有相关数学知识。\n他可能只是记住了某些游戏技巧，却无法把这些经验应用到新的问题里。\n所以，真正好的数学游戏，不仅要让孩子愿意使用数学，还需要帮助他理解背后的规律，并且能够在其他情境中运用。\n游戏可以成为学习的入口，但不一定能替代所有学习过程。\n不过，至少它提醒了我们一件事：\n让数学变得有趣，未必需要改变数学，而可能需要改变数学出现的方式。\n五、也许我们根本没有那么讨厌思考\n回到最初的问题。\n为什么人们明明想通过游戏放松，却愿意在游戏里进行大量复杂的计算？\n我现在觉得，我们可能一直混淆了两件事。\n一件是思考本身。\n另一件是我们被要求以什么方式思考。\n人未必讨厌困难。\n否则就很难解释，为什么有人愿意花几十个小时挑战一个高难度游戏，失败了还要重新开始。\n人也未必只喜欢轻松的事情。\n否则，那些不需要动脑、只需要不断点击的游戏，应该比复杂的策略游戏更受所有人欢迎。\n但事实并非如此。\n我们有时候甚至会主动寻找困难。\n因为困难意味着挑战，而挑战给了我们运用能力的机会。\n当然，也不是所有思考都能带来快乐。\n如果一道题太难，让人完全无从下手，可能只会产生挫败感。\n如果一道题太简单，没有任何不确定性，也很容易让人厌倦。\n而好的游戏，往往能在这两者之间创造一种微妙的平衡。\n它让你觉得困难，但又不是完全没有办法。\n让你需要努力，但努力之后又能看到变化。\n更重要的是，它让你觉得，自己正在主动解决一个问题，而不只是被动完成一项任务。\n这或许也是为什么，我们会愿意在游戏里反复做那些平时觉得枯燥的事情。\n数学还是那些数学。\n逻辑还是那些逻辑。\n加减乘除没有发生任何变化。\n但当它们与目标、选择、情境和反馈结合起来，就产生了完全不同的体验。\n写到这里，我又想起自己玩《杀戮尖塔》的样子。\n有时候为了决定先打哪张牌，我会盯着屏幕计算好几分钟。\n算错了，重新来。\n打输了，再开一局。\n如果有人让我坐在书桌前，连续做几个小时的数学题，我大概会觉得这是一种折磨。\n可是在游戏里，我甚至希望下一场战斗能再复杂一点，可这明明是我的数学作业……\n"},{"title":"AI不需要一种固定的使用方法",
"url":"/blog/aibu-xu-yao-yi-chong-gu-ding-de-shi-yong-fang-fa/",
"date":"2026-10-13",
"headings":[],
"body":"最近在工作中，我发现AI有一个很明显的特点：它写出来的报告，经常没有重点。\n比如，我让AI分析一份经营数据，它会非常认真地把各种信息整理出来。哪个中心营收增长了，哪个中心业绩下降了，哪些数据存在异常，甚至某个数字出现了一点微小的偏差，它都可能专门拿出来说一说。\n乍一看，这份报告很全面，分析也很细致。但读完之后，我反而不知道重点在哪里。\n我尝试告诉它，报告要简洁一点，只关注重要的问题。它确实会缩短篇幅，但那些无关紧要的信息，往往还是会出现。\n最后，我发现一个比较有效的办法，就是把要求规定得非常具体：哪些指标需要关注，什么情况才算异常，哪些内容不要出现，甚至每个部分应该写几句话。\n这样一来，AI终于能写出一份符合我要求的报告。\n但这件事让我产生了一个疑问：\n为什么AI总是倾向于把事情说得那么全面，而人却那么在意重点？\n一、为什么人需要重点？\n后来我想，也许这不完全是AI的问题，而是人和AI处理信息的方式不同。\n人为什么需要分清主次？\n一个很重要的原因，是我们的注意力有限。\n一份报告有100个数据，我们不可能同时关注所有数据。我们必须筛选、排序、压缩，最后只留下那些值得关注的信息。\n写报告的人需要分清主次，看报告的人同样需要。\n比如，一份经营报告是给公司领导看的，他可能只想知道三个问题：业绩怎么样，出现了什么重要问题，接下来需要做什么。\n如果你把所有数据都罗列出来，哪怕每一个数字都是正确的，这份报告也可能是不合格的。\n因为报告的价值，不只是提供信息，更是帮助阅读者减少处理信息的负担。\n但如果换一个场景呢？\n假设这份报告不是给领导看的，而是交给另一个AI继续分析。\n那我们可能反而希望它保留尽可能多的信息。\n某个中心的业绩出现微小波动，某个数据存在异常，某个指标和其他指标之间出现了不寻常的关系，这些信息对于人来说可能不值得阅读，但对于后续的数据分析，却可能有价值。\n当然，AI也不是信息越多就一定判断得越好。重复、错误和无关的信息同样会干扰它。\n但至少可以说明一件事：\n信息的好坏，并不完全取决于它有多全面、多简洁，而是取决于它最终要交给谁，以及拿来做什么。\n我们习惯把人类的阅读习惯当成一种普遍标准，但这个标准未必适用于所有任务。\n二、也许不是AI不会做，而是我们用错了方式\n回到最开始的经营报告。\n如果我的目标是向领导汇报，那么我当然应该要求AI突出重点，减少不必要的细节。\n但如果我的目标是检查经营数据有没有异常呢？\n那我反而应该鼓励它尽可能全面地寻找问题。\n如果我想研究某个中心为什么业绩下降，我可能还需要它大胆提出各种假设，哪怕其中一些假设最后被证明是错误的。\n而如果我要它按照公司的制度，计算员工是否符合晋升条件，那么情况又完全不同。\n这个时候，我不希望它有任何自由发挥。\n我需要把晋升标准、计算方式、特殊情况全部告诉它，让它严格执行规则。\n同样是AI，同样是分析数据，但这几种场景需要的工作方式完全不同。\n有时候，我们希望AI尽可能全面。\n有时候，我们希望它尽可能简洁。\n有时候，我们希望它大胆提出观点。\n有时候，我们又希望它一个字都不要偏离规定。\n这些要求看起来互相矛盾，但它们其实都可能是正确的。\n区别只在于，我们究竟想完成什么任务。\n这让我想到现在很多关于AI使用技巧的讨论。\n有人说，提示词一定要写得详细。\n有人说，一定要给AI设定角色。\n还有人说，必须规定输出格式，AI才能得到稳定的结果。\n这些方法当然都有价值。\n但我觉得，它们很容易让人产生一个误解：仿佛只要掌握某种正确的提示词结构，就能解决所有问题。\n实际上，提示词写得越详细，不一定越好。\n比如，你希望AI帮你寻找公司业绩下降的原因，但你一开始就规定它只能从获客量、转化率和客单价三个方面分析。\n它可能很快给你一份漂亮的报告。\n但真正的问题，也许是产品竞争力下降，或者客户需求发生了变化。\n你越是详细地规定分析范围，就越可能让它忽略那些你自己没有想到的问题。\n你以为自己在提高AI的准确性，实际上也可能是在限制它的能力。\n三、有时候AI是下属，有时候是老师\n我觉得，人和AI的协作，有点像我们在现实中与不同的人合作。\n有时候，你应该把AI当成下属。\n比如，你要它整理一份固定格式的日报，或者按照明确的制度计算奖金。\n这个时候，你是知道自己想要什么的。\n你需要做的，就是把目标、规则、边界告诉它，让它严格执行。\n它不需要提出什么创新建议，也不需要告诉你公司的奖金制度是否合理。\n把事情做好就行了。\n但有时候，你应该把AI当成同事。\n比如，你正在思考一个新的经营方案，或者讨论某个管理问题。\n你可能知道自己想解决什么问题，但还没有确定具体方案。\n这时候，你需要的就不是一个只会执行命令的下属，而是一个能够与你讨论、提出不同意见的合作伙伴。\n你提出一个想法，它提出另一个角度。你反驳它，它再根据你的意见调整。\n在这个过程中，双方的观点都可能发生变化。\n还有时候，你应该把AI当成老师。\n比如，你正在学习一个完全陌生的领域。\n你连这个领域有哪些重要问题都不知道，又怎么可能一开始就给AI规定详细的学习内容？\n这个时候，反而应该让它主动介绍知识框架，告诉你哪些概念重要，哪些地方容易产生误解。\n甚至，你应该允许它纠正你的问题。\n因为你提出的问题本身，就可能建立在错误的理解之上。\n更有意思的是，有时候，你甚至可以把AI当成老板。\n比如，你已经完成了一份方案。\n你可以让它站在管理者的角度，质疑你的工作。\n为什么要做这件事？投入这么多资源值得吗？有没有更重要的事情？你是不是忽略了某些风险？\n当然，AI不是真的老板，也不意味着它的判断一定正确。\n但你可以主动让它扮演一个审视者，挑战那些你已经习以为常的想法。\n仔细想想，这几种协作方式的差异其实很大。\n面对下属，你需要把要求讲清楚。\n面对同事，你需要交换意见。\n面对老师，你需要承认自己不知道。\n面对老板，你需要接受自己的想法受到挑战。\n如果我们永远只用一种方式与AI交流，就像我们永远用同一种方式与所有人相处一样。\n显然不太合理。\n四、真正需要学习的，是什么时候该放手\n我觉得AI使用中一个很有趣的矛盾是：\n我们既希望AI听话，又希望它能够带来惊喜。\n当它没有按照我们的要求完成任务时，我们觉得它不够听话。\n但当它完全按照我们的要求执行，没有提出任何新观点时，我们又觉得它不够聪明。\n这两个要求本身就存在一定的冲突。\n如果你希望AI严格执行，就需要收紧它的自由度。\n如果你希望AI发现未知的问题，就需要给它一定的探索空间。\n而且，即使在同一个任务中，这种关系也可能不断变化。\n比如写一篇文章。\n最开始，我可能只有一个模糊的想法。\n这时候，我希望AI和我自由讨论，甚至提出一些我完全没有想到的观点。\n经过几轮交流，我逐渐发现其中一个方向很有意思。\n于是，我开始收紧范围，要求它围绕这个观点继续深入，而不是不断发散。\n等到观点和结构都确定之后，我又会要求它按照明确的方向写作，避免增加无关内容。\n最后修改文章的时候，我甚至会提出非常具体的要求：删掉某一段，保留某个例子，不要在结尾总结升华。\n在这个过程中，AI的角色一直在变化。\n它一开始像一个讨论问题的朋友，后来像一个共同策划内容的同事，最后又像一个执行写作任务的助手。\n我并没有始终坚持某一种使用方法。\n我只是根据任务进行到哪个阶段，以及当下需要解决什么问题，不断调整与它协作的方式。\n这让我觉得，我们可能过于关注如何写出一条好的提示词，却忽略了一个更重要的能力：\n判断什么时候应该自己做决定，什么时候应该让AI参与决定。\n这其实不只是一个AI使用技巧的问题。\n它还要求我们理解自己的目标，知道自己掌握了哪些信息、缺少哪些信息，判断当前的问题究竟需要执行、讨论、探索，还是接受挑战。\n有时候，真正困难的不是告诉AI怎么做，而是意识到自己还不知道应该怎么做。\n如果连问题都没有想清楚，过早地给AI规定一套详细的执行方案，未必是一件好事。\n反过来，如果目标和规则已经非常明确，却还让AI不断探索、提出观点，也只会增加不必要的沟通成本。\n所以，我现在不太相信存在一种可以适用于所有场景的AI使用方法。\n同样一个AI，可以被要求严格遵守规则，也可以被邀请质疑规则。\n可以负责整理信息，也可以负责寻找信息。\n可以帮我们减少思考的负担，也可以故意给我们制造一些值得思考的问题。\n关键不在于我们给它设定了什么角色，而在于我们为什么需要这个角色。\n现在再回头看那份让我头疼的经营报告，我发现一个挺有意思的地方。\n一开始，我一直在想，怎样才能让AI学会抓重点。\n后来我才意识到，或许我首先应该问自己：\n这一次，我究竟是想让它帮我发现更多问题，还是帮我把已经发现的问题讲清楚？\n"},{"title":"领导不重用你，你可能一直在解决错误的问题",
"url":"/blog/ling-dao-bu-zhong-yong-ni-ni-ke-neng-yi-zhi-zai-jie-jue-cuo-wu-de-wen-ti/",
"date":"2026-10-13",
"headings":[],
"body":"一个人在公司工作了很多年，能力不错，做事认真，领导交代的任务也总能完成。\n但每次升职加薪，都轮不到他。\n他开始怀疑，是不是自己不够优秀？是不是领导没有看到自己的贡献？\n于是，他更加努力地工作，承担更多任务，希望有一天领导能够发现自己的价值。\n但有没有一种可能，领导早就知道你很优秀，只是不愿意为此支付更多的钱？\n你以为自己需要解决的是能力问题，其实可能是选择权问题。\n一、领导知道你的价值，为什么还要给你加薪？\n我们很容易把职场理解成学校。\n只要成绩足够好，就应该获得奖励。\n但公司不是学校，它首先是一个利益组织。\n假设你原本拿一万元工资，现在工作效率提高了，一个人能够完成过去两个人的工作。\n你认为自己创造了更多价值，应该获得更高的薪水。\n但站在公司的角度，它现在用同样的成本，获得了更多产出。\n如果你没有离职的打算，公司又为什么一定要主动增加成本？\n这不是说所有公司都如此，而是说明一个经常被忽略的问题：\n创造价值和分配价值，是两件不同的事情。\n你的能力决定了你能创造什么，而你最终获得多少回报，还受到市场供需、组织制度以及双方议价能力的影响。\n所以，一个人即使很优秀，也可能长期得不到理想的待遇。\n这时候，如果你继续把所有精力用于证明自己有多优秀，可能并不能改变什么。\n因为对方早就知道了。\n二、为什么你越需要这份工作，就越没有议价能力？\n假设有两个能力相近的员工。\n一个人只有当前这份工作，每个月要还房贷，还要承担家庭开支。他非常需要这份收入，无法承受失业的风险。\n另一个人除了当前工作，还获得了其他公司的聘用机会，甚至有一些额外收入。\n当两个人都提出加薪时，他们的处境显然不同。\n第一个人即使对薪资不满意，也很难离开。\n第二个人却可以认真比较不同机会，再决定是否留下。\n他们的能力可能相差不大，但选择权不同。\n这也是为什么，有些员工工作多年都没有获得加薪，一提出离职，公司反而愿意提高待遇。\n难道他提出离职的那一刻，能力突然变强了吗？\n当然不是。\n改变的是公司对失去他的可能性和成本的判断。\n一个人的议价能力，不只取决于别人有多需要他，也取决于他有多需要别人。\n当然，这不意味着我们应该动不动就拿离职威胁公司。\n恰恰相反，如果你没有真正能够接受的其他选择，离职只会让自己承担更大的风险。\n真正值得积累的，不是威胁别人的勇气，而是即使谈判失败，也能够从容选择的能力。\n三、为什么我们管理投资，却不管理自己的职业组合？\n我们都知道，投资不能把所有鸡蛋放在同一个篮子里。\n但在职业发展上，很多人却采用了完全相反的策略。\n一个人工作十年，全部收入来自一家公司。\n工资由公司决定，晋升由领导评价，未来的发展机会也几乎全部寄托在这个组织里。\n如果领导欣赏他，他就觉得前途光明。\n如果领导不重用他，他就开始怀疑自己的价值。\n这相当于把自己最重要的资产——未来几十年的劳动能力——押注在一个非常单一的评价体系上。\n但领导也是普通人。\n他可能有自己的偏好，可能受到组织预算限制，也可能单纯与你合不来。\n你无法保证自己遇到的每一个领导，都能够准确评价你的能力，更无法保证他们愿意为你的能力支付合理的价格。\n既然如此，为什么要把全部职业希望寄托在一个人身上？\n我们完全可以借用投资组合的思路来管理职业发展。\n稳定工作可以提供现金流，专业技能可以积累长期竞争力，外部工作机会可以提高议价能力，而副业或个人项目则可以用较小的成本探索新的收入来源。\n这些路径并不一定互相排斥。\n你可以一边上班，一边了解行业对自己能力的真实需求；也可以保留稳定收入，同时尝试把某项技能转化成别人愿意付费的产品。\n这并不是鼓励所有人辞职创业。\n对于有家庭、有房贷的人来说，保留稳定工作本身就是一种理性的风险管理。\n真正需要改变的，是把职业发展理解成一道单选题。\n不是只能在打工和创业之间二选一，也不是只能等待公司晋升，或者愤而辞职。\n你可以让不同的路径同时存在，再根据它们的发展情况，逐渐调整自己的投入。\n当然，人的精力有限，职业组合也不是越分散越好。\n就像投资一样，重要的不是买入多少种资产，而是让不同的配置承担不同的作用。\n四、你可能一直在解决错误的问题\n回到最初的问题：领导为什么不重用你？\n可能是能力不足，可能是公司没有机会，也可能是领导明明知道你的价值，却没有动力给予更多回报。\n但如果你已经努力了很多年，依然没有改变现状，那么继续研究如何获得领导认可，未必是最好的选择。\n因为你始终在试图改变一个自己无法控制的人。\n相比之下，了解外部市场、积累可迁移的能力、寻找新的收入渠道，反而是你能够主动推进的事情。\n更重要的是，当你逐渐拥有其他选择，你对当前工作的态度也会发生变化。\n领导不重用你，你可以分析原因，但不必因此否定自己。\n公司不给你加薪，你可以尝试谈判，也可以比较外部机会。\n你依然可以认真工作，却不再需要把全部希望寄托在一次晋升上。\n真正的职业安全感，可能不是让一家公司离不开你，而是即使离开这家公司，你依然有其他选择。\n所以，下一次当你觉得怀才不遇时，或许不必急着证明自己。\n你可以先问问自己：\n如果明天不在这家公司工作，我还有哪些选择？\n"},{"title":"人为什么要自找苦吃地思考？",
"url":"/blog/ren-wei-shen-me-yao-zi-zhao-ku-chi-di-si-kao/",
"date":"2026-10-12",
"headings":[],
"body":"我有一个习惯，平时想到什么有意思的话题，就会随手记下来。\n时间久了，笔记本里积累了很多想法。有些是工作中遇到的问题，有些是生活中的感受，还有一些是突然冒出来的、看起来没什么实际用途的问题。\n这些想法只要没有被整理出来，就会时不时出现在我的脑海里。\n所以，我会找时间把它们写成文章。\n有意思的是，每次写完一篇文章，我都会觉得很开心。\n这种开心并不是来自文章发表之后的阅读量，也不是因为有人点赞或者认可。事实上，文章可能还没有发表，甚至连好不好都不知道。\n但我已经觉得很满足了。\n就像从脑海里搬走了一件东西，终于可以把它放到一边。\n这种感觉让我想到一个问题：\n思考明明是一件很累的事情，为什么人还会主动去思考，甚至从中获得快乐？\n一、思考是一种高级的偷懒\n我最初想到的答案，其实很简单。\n思考可以节省时间。\n比如工作中遇到一个问题，你当然可以按照过去的经验把它处理掉。但如果愿意多花一点时间，研究它为什么会发生，背后有什么规律，是否存在更好的解决方法，那么下一次遇到类似的问题，就可能不需要重新处理一遍。\n你可以把这次思考的成果反复使用。\n这有点像写程序。\n第一次编写一个函数可能很麻烦，需要考虑各种条件、异常和边界。但只要函数写好了，以后就可以反复调用。\n人的思考也有类似的作用。\n我们通过一次比较费力的思考，建立一套可以重复使用的认知模型，以此减少未来的劳动。\n从这个角度看，思考其实是一种高级的偷懒。\n我们愿意现在多动一点脑子，是为了以后少动一点脑子。\n但这个解释并不完整。\n因为现实中有很多思考，根本没有明确的实际用途。\n比如有人喜欢研究哲学问题，有人喜欢推理小说，有人喜欢解谜游戏，还有人愿意花几个小时研究一套复杂的游戏策略。\n这些事情往往不会提高工作效率，甚至可能占用大量时间。\n如果只是为了节省时间，直接查看攻略、参考别人的结论，显然更加高效。\n可奇怪的是，很多人偏偏不愿意这么做。\n他们宁愿自己想。\n二、为什么只是想出来，就已经很快乐？\n我最近玩《杀戮尖塔》时，经常有这样的体验。\n游戏里有很多卡牌，每张卡牌的作用都不一样。你需要根据手里的牌、当前的敌人以及接下来的路线，不断调整自己的策略。\n有时候，我会突然想到几张卡牌之间存在一种特别好的组合。\n这种组合甚至还没有真正打出来，我就已经开始兴奋了。\n因为我觉得自己发现了一个新的可能性。\n但仔细想想，这件事很奇怪。\n我还没有通关，没有击败敌人，也没有证明这套组合真的有效。\n我只是想到了一个东西。\n为什么光是想出来，就已经能够带来快乐？\n我觉得这里面至少存在两种不同的满足感。\n第一种，是创造的满足感。\n创造不一定意味着生产出一个看得见、摸得着的东西。\n当我们把原本不相关的信息联系起来，发现一个新的规律，或者提出一种新的解释时，其实也是在创造。\n外部世界可能没有发生任何变化，但我们的认知世界已经发生了变化。\n第二种，是自我肯定的满足感。\n想出一个巧妙的办法，不仅意味着我们获得了一个答案，还意味着我们发现自己有能力解决这样的问题。\n那一刻，我们获得的可能不只是知识，还有一种对自身能力的确认。\n原来我也能想明白这么复杂的事情。\n这种快乐不需要别人认可，甚至不需要实践验证。\n仅仅是自己意识到这一点，就足够让人高兴。\n不过，这里又出现了一个更有意思的问题。\n如果我们真的只是为了寻找正确答案，为什么还没有验证答案，就已经这么开心了？\n三、我们喜欢的是真理，还是想明白的感觉？\n假设你花了三天时间，终于想明白一个困扰自己很久的问题。\n你建立了一套完整的解释，觉得一切都说得通了。\n结果第二天，有人拿出充分的证据，证明你的解释是错的。\n你会是什么感受？\n我想，大多数人多少都会有些沮丧。\n即使理性上知道，发现错误意味着自己可以进一步接近事实，情绪上还是很难立即接受。\n因为我们已经为那个答案投入了时间、精力，甚至产生了感情。\n这说明，思考带来的快乐，并不完全来自发现真理。\n有时候，我们享受的是一种主观上的理解感。\n原本混乱的事情，突然有了解释。\n原本互相矛盾的信息，突然能够联系起来。\n原本不确定的事情，突然变得确定。\n至于这个解释是不是真的正确，可能反而是后面才需要考虑的问题。\n这也能解释为什么某些阴谋论如此吸引人。\n一个阴谋论可能用非常简单的逻辑，把大量复杂事件联系起来，让人产生一种“我终于看透了”的感觉。\n这种感觉可能非常强烈，但并不意味着解释本身就是正确的。\n大脑获得理解的满足感，和我们真正理解了世界，是两件不同的事情。\n这也意味着，思考不一定会让人更加接近真理。\n有些人会不断检验自己的想法，愿意推翻过去的结论。\n也有些人会越来越喜欢自己的解释，不断寻找支持它的证据。\n两个人可能都很喜欢思考，但一个越来越开放，另一个却越来越固执。\n区别或许就在于，我们究竟享受的是不断修正认知的过程，还是享受自己已经掌握答案的感觉。\n四、思考有时候不是为了得到，而是为了放下\n除了创造和自我肯定，我还发现思考存在另一种快乐。\n这种快乐甚至有点反直觉。\n思考明明很费脑子，但它有时候恰恰是为了让我们放松。\n比如，我喜欢把待办事项一项项划掉。\n每划掉一项，都会有一点轻松的感觉。\n有时候，一件工作其实还没有产生最终结果。\n比如上司交代了一个复杂的问题，我花了一段时间分析，终于想出一个解决方案。\n方案还没有实施，结果也不知道好坏。\n但仅仅是把思路整理清楚，我就已经觉得轻松了许多。\n又比如，我曾经做过一个关于人生价值排序的心理测试。\n测试要求把不同的人生目标按照重要程度排列。\n这件事其实很难。\n因为很多东西都很重要，健康、家庭、事业、自由、金钱，你很难给它们排出一个绝对正确的顺序。\n但当我终于完成排序时，却产生了一种很明显的放松感。\n我的人生并没有因此发生什么变化。\n那些问题也没有真正得到解决。\n我只是暂时给出了自己的答案。\n为什么会这样？\n心理学中的负强化，可以为这种现象提供一个解释。\n负强化并不是惩罚，而是指某种行为因为能够移除或避免令人不舒服的刺激，从而更容易在未来重复发生。\n如果一个问题长期悬而未决，让我们感到困扰，而思考能够缓解这种困扰，那么这种轻松感就可能强化我们继续思考的行为。\n换句话说，思考带来的快乐，不一定来自获得了什么。\n也可能来自失去了什么。\n失去了困惑，失去了不确定性，失去了一个不断占据注意力的问题。\n就像我写文章。\n每写完一篇文章，就相当于把一个盘旋在脑海里的问题整理好，放进一个抽屉。\n这个抽屉以后当然还可以打开。\n我也可能发现自己过去的想法是错的。\n但至少在这一刻，我可以暂时不去想它了。\n我突然觉得，这可能是思考非常重要、却经常被忽略的一种价值。\n我们以为思考是为了获得更多知识、更多答案、更多能力。\n但有时候，思考是为了让自己能够放下一些东西。\n五、为什么有些思考让人放松，有些思考却让人痛苦？\n当然，并不是所有思考都能让人放松。\n有时候，一个问题越想越复杂。\n明明已经花了很多时间，却始终得不到答案。\n你不断怀疑自己，不断推翻过去的结论，又不断回到原来的问题。\n这种感觉不仅不快乐，反而非常痛苦。\n我们通常把它叫作钻牛角尖，或者精神内耗。\n那么，同样是思考，为什么结果会如此不同？\n我觉得一个重要的区别是：\n思考有没有让我们与问题的关系发生变化。\n比如写文章。\n一开始，我可能只有一个模糊的念头。\n随着不断整理，我渐渐知道自己想表达什么，哪些观点有道理，哪些地方还存在疑问。\n最终，我不一定得到了一个完美的答案，但至少已经知道自己思考到了哪里。\n我可以决定暂时停止。\n而钻牛角尖往往不一样。\n你可能不断重复同一个问题，没有获得新的信息，也没有建立新的理解。\n最重要的是，你不知道什么时候可以停止。\n你始终觉得还有什么没有想清楚。\n于是，思考不再是帮助你处理问题，而是让你持续困在问题里面。\n这让我想到，很多哲学问题其实也是如此。\n比如人生的意义是什么？\n我们从哪里来，又要到哪里去？\n这些问题可能永远没有一个所有人都认可的最终答案。\n但这不意味着思考它们毫无价值。\n你可以通过思考，形成一个现阶段能够接受的解释。\n这个解释可能随着年龄、经历和知识的变化而改变。\n但它至少能够帮助你在当下作出选择，继续生活。\n所以，有价值的思考，不一定要彻底解决问题。\n有时候，它只是让我们能够接受问题暂时没有答案。\n六、思考的尽头，可能是停止思考的自由\n回到最开始的问题。\n人为什么要自找苦吃地思考？\n我最初认为，是因为思考能够节省时间。\n现在看来，这只是其中一个原因。\n我们也会因为发现新的联系而快乐，因为确认自己的能力而快乐，因为消除困惑而快乐。\n而这些快乐背后，似乎还有一个共同的东西。\n我们希望自己能够对这个复杂的世界，多一点理解，多一点把握。\n这种把握不一定意味着控制外部世界。\n有时候，只是能够整理好自己的想法，知道自己为什么这样选择，知道还有哪些事情暂时无法确定。\n思考并不会让世界变得简单。\n但它可能让我们不必时时刻刻都被世界的复杂性所困扰。\n我以前觉得，喜欢思考的人，大概就是喜欢不断寻找问题和答案。\n但现在我有点怀疑。\n也许很多时候，我们并不是喜欢一直思考。\n我们只是很喜欢那个终于想明白、终于可以不再想的瞬间。\n就像写完一篇文章，合上电脑。\n文章还没有发表，也不知道会有多少人阅读。\n但那个在脑海里停留了很久的问题，终于可以暂时放下了。\n"},{"title":"我们花钱的时候，真的知道自己在买什么吗？",
"url":"/blog/wo-men-hua-qian-de-shi-hou-zhen-de-zhi-dao-zi-ji-zai-mai-shen-me-ma/",
"date":"2026-10-10",
"headings":[],
"body":"我有一个习惯，喜欢在 Steam 上买游戏。\n有时候看到一款感兴趣的游戏，看看介绍、评价，再看看价格，觉得不错，就买下来了。\n但买回来之后，我不一定会玩。\n有些游戏在我的游戏库里放了好几年，甚至一次都没有打开过。\n这就让我产生了一个很奇怪的疑问：\n我明明是为了玩游戏才花钱的，为什么买回来不玩，我也没有觉得这笔钱完全白花了？\n如果我买的是游戏本身，那么没有玩，意味着这笔消费没有实现目的。\n但事实好像不是这样。\n有时候，仅仅是把一款期待已久的游戏加入自己的游戏库，我就已经获得了某种满足。\n那我买的到底是什么？\n一、我们以为自己在买东西，其实未必\n人们经常说，现代消费已经从购买商品，转向了购买体验。\n这句话听起来很有道理。\n比如，我们买电影票，不是为了拥有一张纸质票，而是为了看一场电影。\n我们买游戏，不是为了拥有一堆代码，而是为了体验游戏中的世界。\n我们去旅游，也不是为了拥有那个地方，而是为了经历一段与日常不同的生活。\n但我觉得，“花钱买体验”这个解释，还是太宽泛了。\n因为体验本身并不稀缺。\n你换一份工作，是一种体验。\n你跟别人吵一架，是一种体验。\n你生病住院，甚至被老板批评，同样是一种体验。\n生活每天都在给我们提供大量的体验，而且很多是免费的。\n为什么我们还要花钱，主动购买某些体验？\n我觉得，关键可能不在于体验本身，而在于它能否让我们产生某种自己期待的心理变化。\n比如玩《黑暗之魂》。\n这款游戏的体验未必愉快。你可能反复死亡，被同一个敌人击败几十次，甚至气得想摔手柄。\n但奇怪的是，很多人不仅愿意忍受，还愿意花钱购买这样的经历。\n因为他们真正追求的，可能不是简单的快乐，而是从失败、挫折，到理解规则、掌握技巧，最终战胜困难的过程。\n这种心理上的刺激，并不等于感官上的兴奋。\n它可以是紧张、恐惧、好奇、满足、感动，也可以是经历困难之后的成就感。\n甚至有些作品，会让你感到悲伤、压抑，或者不安。\n但你依然觉得值得。\n我们愿意花钱购买的，有时候不是快乐，而是让自己发生某种变化的机会。\n二、为什么同样的东西，有时候我们愿意花钱，有时候却不愿意？\n这又带来另一个问题。\n既然我们想要的是游戏带来的体验，为什么以前很多人喜欢下载盗版游戏，现在却愿意在 Steam 上花钱买正版？\n游戏的核心内容可能没有改变。\n甚至对于某些单机游戏来说，盗版和正版提供的主要游玩体验差别并不大。\n那我们为什么愿意花钱了？\n一个常见的解释是，大家的收入提高了，版权意识也增强了。\n这些当然是原因。\n但我觉得，还有一个值得思考的地方：\n我们愿不愿意花钱，并不完全取决于东西本身有没有价值，而是取决于花钱与不花钱之间，究竟存在多大的差别。\n以前下载盗版游戏，可能需要寻找资源、安装破解补丁、解决各种运行问题。\n而现在，在 Steam 上购买一款游戏，只需要点击几下。\n游戏可以自动更新，可以云存档，可以查看成就，还可以加入自己的游戏库。\n你买到的已经不只是游戏内容，还有便利、稳定、服务，以及一种持续拥有的感觉。\n反过来想，如果正版游戏需要复杂的安装流程，价格又特别昂贵，而盗版可以轻松获得，那么一部分消费者可能依然不愿意付费。\n这说明，价格不是唯一的问题。\n人们是在比较不同选择带来的整体收益与成本。\n而且，这个成本也不只是金钱。\n时间、精力、风险、麻烦程度，甚至心理上的不舒服，都可能被计算进去。\n有时候，我们花钱是为了获得某种东西。\n有时候，我们花钱恰恰是为了避免某些东西。\n比如花钱打车，可能不是为了体验坐汽车，而是不想在下雨天挤地铁。\n花钱买视频会员，可能不是因为会员有什么特别的吸引力，而是因为不想看广告。\n花钱请人打扫卫生，也不一定是因为自己不会打扫，而是不愿意把周末的几个小时花在这件事上。\n有意思的是，这些理由未必始终成立。\n今天我可能愿意花几十块钱打车，明天却觉得同样的距离坐地铁更划算。\n今天我觉得一款游戏卖两百块钱很值得，明天却可能为一个十几块钱的软件会员犹豫半天。\n如果消费完全由商品的客观价值决定，这种现象就很难解释。\n但如果我们承认，消费是一个人在特定时间、特定环境下，对自己各种需求进行的选择，就容易理解了。\n同样一笔钱，在不同的时刻，购买的可能根本不是同一种东西。\n三、最奇怪的是，我们买之前，可能根本不知道自己想要什么\n我觉得这是消费中最有意思的部分。\n很多时候，我们以为自己知道为什么花钱。\n但那只是购买当下的解释。\n最后真正得到的东西，可能完全超出我们的预期。\n还是以买游戏为例。\n有些游戏，我买的时候非常期待，甚至觉得自己一定会通关。\n但买回来以后，玩了十几分钟就放下了。\n有些游戏，我原本没有太高期待，却不知不觉玩了几十个小时。\n还有一些游戏，我买的时候只是想娱乐一下，结果却让我开始思考很多与游戏无关的问题。\n比如《杀戮尖塔》。\n最初，我只是想玩一个卡牌游戏。\n但在不断失败、重新组合卡牌、调整策略的过程中，我开始思考，为什么人在不确定的条件下寻找解决方案，会获得如此强烈的满足感。\n这又让我联想到工作、创业，甚至我们面对人生选择时的状态。\n这些思考显然不是我购买游戏之前就能预料到的。\n如果当初有人问我，为什么要买《杀戮尖塔》？\n我大概只会回答，因为它好玩。\n但后来我从中得到的东西，已经远远超过了这个理由。\n这里存在一个很有趣的时间差。\n购买之前，我们只能想象商品的价值；购买之后，我们才真正开始创造它的价值。\n而且，这两种价值未必相同。\n一场电影可能没有你预想中精彩，却因为某个情节，让你想起了一个多年没有联系的人。\n一次旅行可能遭遇坏天气、交通延误，甚至跟同行的人发生争执，但几年以后，你记得最清楚的，恰恰是这些意外。\n一本书可能没有教会你什么实用技能，却改变了你看待某件事情的角度。\n当然，也可能什么都没有发生。\n你买了一款游戏，玩了几个小时，关掉电脑，过几个月连剧情都忘记了。\n这是不是浪费？\n也不一定。\n因为在玩的那几个小时里，你可能确实获得了快乐、放松，或者暂时摆脱了现实生活中的压力。\n这种价值不会因为你后来忘记了它，就自动消失。\n我们吃过的大多数饭菜，可能也记不得具体味道。\n但这不代表当时的满足不存在。\n只是，消费产生的价值，有些能够保存下来，有些只能存在于当下。\n四、那么，那些买回来从来不玩的游戏呢？\n这可能是最难解释的一种消费。\n因为它连体验都没有发生。\n但我慢慢发现，有时候购买本身，就是消费体验的一部分。\n比如，我在 Steam 上看到一款特别感兴趣的游戏。\n我会阅读介绍，观看视频，想象自己进入那个世界以后会发生什么。\n也许是探索一个陌生的城市，也许是扮演一个完全不同的人，也许是体验一段现实生活中永远不会发生的冒险。\n在这个过程中，我其实已经开始享受它了。\n当我点击购买，把它加入游戏库时，我获得的是一种确定性：\n以后只要我想，就可以进入这个世界。\n但拥有这种可能性，并不代表我真的会去实现它。\n这跟买书有点相似。\n我们买一本书时，可能想象自己会认真读完，掌握某种知识，成为一个更有见识的人。\n但真正读书，需要时间、注意力和耐心。\n购买只需要几秒钟。\n于是，购买行为在某种程度上，提前兑现了我们对未来的期待。\n这里面当然可能有自我欺骗。\n我们会高估未来的自己有多少时间，低估完成一件事情需要多少精力。\n但我觉得，也不能简单地把这些消费归结为冲动和浪费。\n因为我们确实可能从中获得了某种满足。\n只不过，这种满足来自想象，而不是实践。\n有时候，我们花钱购买的不是一种已经发生的体验，而是一种随时可以发生、但也可能永远不会发生的生活。\n这让我觉得，消费和人的自我想象之间，存在着一种非常微妙的关系。\n五、花钱买自己\n回到最初的问题。\n人花钱到底是在买什么？\n我觉得，很难找到一个统一的答案。\n因为同样是花钱买游戏，有时候我买的是快乐，有时候是挑战，有时候是好奇心，有时候是对未来某个周末的期待。\n甚至有时候，我只是因为打折而产生了购买冲动。\n而这些动机还可能同时存在。\n更复杂的是，我们对消费的解释，也可能在事后发生变化。\n买的时候，我觉得自己是为了娱乐。\n玩完之后，我觉得自己获得了思考。\n过了几年，我又可能觉得那款游戏最大的价值，是让我想起了当时某段生活。\n这几个解释未必互相矛盾。\n但它们也提醒我，人并不总是先知道自己需要什么，再通过消费去满足它。\n有时候，我们是在消费的过程中，才逐渐发现自己需要什么。\n甚至，消费本身也会改变我们的需要。\n一个原本对摄影没有兴趣的人，买了一台相机之后，可能开始观察光线、建筑、街道和人物。\n一个原本不喜欢运动的人，报名参加某项活动之后，可能慢慢爱上运动。\n当然，也有人买完相机就放在柜子里，办完会员就再也没有去过。\n购买并不保证改变发生。\n但它有可能成为改变的起点。\n所以我越来越觉得，“花钱买东西”和“花钱买体验”，都还不足以解释消费的全部。\n如果一定要找一个更宽泛的说法，我想叫它：\n花钱买自己。\n不是说每一笔消费都在塑造一个更好的自己，也不是说花钱越多，就越了解自己。\n而是说，我们所有的消费，最终都要回到自己身上。\n我们在乎什么，厌恶什么，期待什么，害怕什么，愿意忍受什么，又希望摆脱什么。\n这些东西共同决定了我们愿意为什么付钱。\n但有趣的是，我们自己也未必完全清楚这些答案。\n我现在再打开 Steam，看着游戏库里那些买了却没有玩的游戏，偶尔还是会想起这个问题。\n有些游戏，我可能真的永远不会打开。\n有些游戏，也许会在未来某个无聊的周末，突然成为我最喜欢的一款作品。\n而当初点击购买的那个我，显然不可能知道这些。\n我只是看了看介绍，觉得有点意思，然后按下了购买按钮。\n"},{"title":"别再寻找正确的人生观了",
"url":"/blog/bie-zai-xun-zhao-zheng-que-de-ren-sheng-guan-liao/",
"date":"2026-10-09",
"headings":[],
"body":"最近我沉迷于一款游戏，叫《杀戮尖塔》。\n它的玩法并不复杂。你选择一个角色，沿着地图不断战斗，获得卡牌、遗物和金币，逐步强化自己，直到击败最终的敌人。\n但有一个很特别的设定：每一局游戏，你获得的资源都是随机的。\n你无法保证自己抽到什么牌，也无法保证遇到什么敌人。甚至上一局让你轻松通关的打法，下一局可能连第一关都过不去。\n一开始，我觉得策略游戏应该有一套正确的玩法。\n比如，尽量选择长期收益，而不是短期收益。\n如果在休息点可以选择升级卡牌或者恢复生命值，我会倾向于升级。毕竟升级是永久的，而恢复的生命值很快又会被消耗掉。\n这听起来很合理。\n但后来我发现，我经常带着一套看起来很有潜力的牌组，死在半路上。\n原因很简单：我太想赢得未来，以至于忘记了自己可能活不到未来。\n一、每一个选择都正确，为什么最后还是输了？\n最近我在玩《杀戮尖塔》里的观者。\n这个角色有一种非常有意思的机制：进入愤怒状态之后，造成的攻击伤害翻倍，但受到的攻击伤害也会翻倍。\n我一开始特别喜欢这个机制。\n既然攻击力能够翻倍，那我只要尽可能进入愤怒状态，不就可以快速消灭敌人了吗？\n但实际玩起来完全不是这么回事。\n有时候我进入愤怒状态，手里却没有足够的攻击牌；有时候虽然打出了很高的伤害，却没能杀死敌人；还有时候我没有足够的能量切换回平静状态，只能眼睁睁看着敌人打出双倍伤害。\n于是我开始调整策略。\n我想保留几张进入愤怒状态的牌，再准备几张切换回平静状态的牌，搭配姿态转换时获得格挡的能力。\n这样平时可以慢慢防守，等到合适的机会，再进入愤怒状态，一口气解决敌人。\n这套思路明显比之前成熟。\n但问题又来了。\n我需要攻击牌，需要防御牌，需要姿态转换牌，还需要抽牌能力，最好再来几个厉害的遗物。\n每一种东西都有用。\n可是当我把这些东西全部放进牌组，结果却不一定更好。\n因为每回合能够抽到的牌是有限的，能量也是有限的。\n我可能抽到了很强的攻击牌，却没有足够的能量；也可能抽到了姿态转换牌，却没有任何值得配合的攻击。\n最后，我拥有一套看起来什么都能做的牌组，却什么都做不好。\n这让我意识到一件事：局部正确的选择，加起来不一定是一个正确的整体。\n生活中其实也经常发生这样的事情。\n学习英语是对的，锻炼身体是对的，努力工作是对的，发展副业是对的，陪伴家人也是对的。\n但一个人每天只有24小时，精力和金钱都有限。\n如果我们把所有正确的事情都塞进生活里，可能最后每件事都做不好。\n问题并不是这些事情不值得做，而是我们忘记了：资源有限，本身就是选择的一部分。\n二、长期主义不一定正确，及时行乐也不一定错误\n我们经常听到各种人生建议。\n有人告诉你，要坚持长期主义，延迟满足。\n有人告诉你，人生苦短，应该及时行乐。\n有人说年轻人应该勇敢创业，有人说普通人最重要的是稳定。\n这些观点都有道理。\n但我慢慢发现，一个观点有没有道理，和它适不适合你，其实是两回事。\n就像在《杀戮尖塔》里，升级卡牌通常是个好选择。\n但如果你只剩下十几点生命值，下一场又是强大的敌人，那么恢复生命值可能比升级任何卡牌都重要。\n不是长期主义错了，而是你当前的处境，已经不允许你继续投资未来。\n反过来也是一样。\n如果你的生命值非常充足，牌组又缺乏足够的输出能力，那么继续选择恢复生命值，可能就是在浪费机会。\n同一个选择，在不同的处境下，价值完全不同。\n我觉得现实生活中最容易被忽略的，恰恰是这一点。\n一个收入稳定、有足够储蓄、没有太多家庭负担的人，可能适合拿出一部分资金创业。\n但一个没有储蓄、每个月都要还贷款、又缺乏相关经验的人，如果只是听到一句“年轻人应该勇敢追梦”，就决定借钱创业，甚至使用高杠杆，那就很危险。\n他们听到的是同一句建议，但手里的牌完全不同。\n我们特别喜欢讨论什么样的人生观才是正确的，却很少认真讨论：这个人究竟拥有什么资源，承担什么责任，面临什么风险？\n脱离具体处境的人生建议，就像一份不知道你手里有什么牌的游戏攻略。\n它可能很精彩，但未必能帮你赢。\n三、最可怕的不是选择错误，而是根本没有策略\n玩《杀戮尖塔》还有一个很有意思的体验。\n有时候，我明明拿到了不少好牌，却发现自己越来越难打。\n因为我看到一张不错的攻击牌，就想拿；看到一张厉害的防御牌，也想拿；看到能够增加生命值、抽牌或者提供额外能力的牌，又觉得舍不得错过。\n每次选择都能说出理由。\n但这些选择之间没有联系。\n结果就是牌组越来越厚，真正需要的牌却越来越难抽到。\n相比之下，有些看起来并不强大的牌，只要能够形成配合，反而可以打出惊人的效果。\n比如铁甲战士可以围绕力量增长、消耗等机制构建牌组；静默猎手可以利用弃牌机制形成循环；故障机器人可以围绕充能球与栏位建立自己的战斗体系。\n不同的角色有不同的玩法，同一个角色也有许多不同的路线。\n重要的不是每张牌都很强，而是这些牌能不能共同完成一个目标。\n这让我想到现实生活中的另一种情况。\n有些人今天看到别人做自媒体赚钱，就想做自媒体；明天看到AI很火，又决定学习编程；后天听说投资回报很高，又开始研究股票。\n每一个方向单独来看，都可能有价值。\n但如果没有想清楚自己究竟想得到什么，手里又有什么资源，那么这些行动就只是不断收集看起来不错的卡牌。\n我们可能很努力，也可能一直在学习，但始终无法形成真正的优势。\n当然，短期策略也可以是一种好策略。\n有时候，你不需要建立一套能够无限成长的牌组，只需要在眼前的战斗中打出足够高的伤害，快速结束战斗。\n策略不一定要宏大，也不一定要长期。策略首先意味着，你知道自己为什么做这个选择。\n没有策略的人，并不是没有目标，也不是不努力。\n而是每一次行动都看起来合理，却不知道这些行动最终要组合成什么。\n四、你不可能在游戏开始之前，就决定整局游戏的打法\n不过，如果我们因此认为，最重要的是提前设计好一套策略，那又会陷入另一个误区。\n因为《杀戮尖塔》最有趣的地方就在于，你根本不知道接下来会发生什么。\n你可能原本想玩力量流，但一直抽不到合适的卡牌。\n你可能本来没有打算玩消耗流，却意外获得了几张能够相互配合的牌。\n你也可能遇到某个遗物，突然发现之前一直忽略的卡牌变得非常强大。\n这时候，如果你还坚持最初的计划，反而可能把自己逼入绝境。\n我在玩观者时就有这种体会。\n一开始，我只关注愤怒和平静之间的转换。\n后来发现，观者还可以积累真言，进入神性状态；也可以利用其他机制构建完全不同的打法。\n这些东西我最初都不熟悉。\n有些牌拿到手里甚至不知道有什么用，试了几次才慢慢明白。\n如果我从第一局开始就认定，姿态转换才是最正确的玩法，那么其他可能性就永远不会进入我的视野。\n这也是我觉得策略游戏特别吸引人的地方。\n它不是让你执行一个已经知道答案的计划，而是不断让你面对新的信息，重新理解自己拥有的资源。\n现实生活也是如此。\n我们在二十岁时制定的人生规划，很可能建立在非常有限的经验上。\n那时候我们不知道自己真正擅长什么，不知道市场会发生什么变化，也不知道未来会遇到什么人、什么机会。\n但奇怪的是，我们却经常要求自己对年轻时确定的目标保持忠诚。\n仿佛改变方向就是不够坚定，调整计划就是缺乏毅力。\n我觉得这很值得怀疑。\n如果你已经拥有了新的信息，发现了新的机会，甚至连自己的能力和需求都发生了变化，为什么还要坚持过去的判断？\n坚持一个目标，与坚持一种实现目标的方法，是两回事。\n而且，有时候连目标本身也值得重新审视。\n这不是朝三暮四。\n朝三暮四是没有理由地改变方向。\n真正的策略调整，是因为你对局面的认识发生了变化。\n五、原则可以参考，但不能代替判断\n我以前也喜欢寻找一些能够长期指导自己的原则。\n比如长期主义、第一性原理、延迟满足、及时止损。\n这些概念确实很有价值。\n它们帮助我们理解复杂的问题，也能让我们少犯一些已经有人犯过的错误。\n但我现在觉得，我们可能高估了原则的作用。\n因为原则通常是对大量经验的抽象。\n它把复杂的情况压缩成一句容易记住的话。\n这让它容易传播，也让它容易被误用。\n比如“坚持就是胜利”。\n在一个需要长期积累的领域，坚持当然重要。\n但如果你坚持的是一条已经被证明走不通的路线，那么坚持只会让你损失更多资源。\n再比如“及时止损”。\n如果你发现一个项目没有前景，及时退出可能非常明智。\n但如果你只是遇到一点困难就退出，那么你可能永远无法跨过真正有价值的门槛。\n两句话都正确。\n可它们无法告诉你，眼前这个困难究竟是值得坚持的门槛，还是应该放弃的陷阱。\n这个判断，仍然需要你自己完成。\n所以，我现在更愿意把这些人生原则理解成一种工具。\n就像《杀戮尖塔》里的卡牌。\n每张牌都有自己的效果，但你不能因为某张牌很强，就在任何情况下都使用它。\n你需要知道自己现在有多少能量，手里还有什么牌，敌人下一回合准备做什么。\n甚至有时候，你需要放弃一张看起来很强的牌。\n不是它不好，而是它不适合你现在的牌组。\n我觉得人生原则也应该这样使用。\n你可以有原则，但不能让原则替你做判断。\n六、真正的判断力，是一局一局打出来的\n还有一个让我着迷的地方。\n《杀戮尖塔》很难靠看攻略彻底学会。\n当然，你可以学习高手的卡牌评价、路线选择和战斗技巧。\n但真正进入游戏后，你还是需要自己判断。\n你会发现，曾经觉得毫无价值的卡牌，在某些组合里竟然非常厉害。\n也会发现，过去特别喜欢的卡牌，在某些情况下反而成为负担。\n你开始学会计算伤害，预估风险，判断什么时候应该保留生命值，什么时候值得冒险挑战精英怪。\n这些东西不是通过记住一句原则学会的。\n而是在一次次失败、调整和尝试中形成的。\n最初，你可能只会问：这张牌强不强？\n后来，你开始问：这张牌适不适合我现在的牌组？\n再后来，你甚至会问：我接下来可能遇到什么敌人？这张牌能不能解决我当前最缺乏的能力？\n同样是一张牌，你看到的信息已经完全不同。\n这让我想到，我们经常希望在行动之前，先找到正确的方法。\n先读一本书，先学一套理论，先确定一个方向，最好能够确保自己不会走弯路。\n但很多时候，我们根本不具备做出正确判断所需要的经验。\n我们必须先做一些事情，才知道自己缺少什么。\n必须先尝试一些方法，才知道哪些方法适合自己。\n甚至必须先犯一些错误，才能理解为什么某个原则有用。\n这不是说所有错误都有价值。\n有些错误只是浪费，有些错误甚至会让人付出无法承受的代价。\n所以我们仍然需要控制风险，尽量让自己有机会继续尝试。\n但如果因为害怕走错路，就一直停留在寻找正确答案的阶段，那么我们的判断力也很难真正成长。\n我现在越来越觉得，好的策略不是提前知道所有答案，而是能够根据不断出现的新信息，持续修正自己的答案。\n这也是为什么我不太相信存在一套可以适用于所有人的人生观。\n每个人的起点不同，资源不同，经历不同，想要的东西也不同。\n甚至同一个人，在不同的人生阶段，也可能需要完全不同的策略。\n你可以学习别人的经验，可以建立自己的原则，也可以制定长期计划。\n但这些东西都应该允许被现实修正。\n做中学，学中变。\n有时候你需要积累，有时候你需要爆发，有时候你需要休息，有时候你甚至应该放弃原本想走的路线。\n最近我玩观者，还是经常失败。\n有时候好不容易搭建了一套不错的牌组，却因为一场战斗中的判断失误，直接结束游戏。\n然后我又重新开始。\n重新拿牌，重新选择路线，重新考虑每一次战斗应该怎么打。\n有意思的是，虽然每次都从头开始，但我已经不是上一局的那个玩家了。\n"},{"title":"一个职场悖论：你越有用，就越显得没用",
"url":"/blog/yi-ge-zhi-chang-bei-lun-ni-yue-you-yong-jiu-yue-xian-de-mei-yong/",
"date":"2026-10-09",
"headings":[],
"body":"我一直不太理解，为什么领导那么喜欢开会。\n日会、周会、月会，还有各种临时会议。\n有些会议明明半小时就能结束，却非要开两个小时。有些事情明明发个通知就能解决，却要把十几个人叫到一起。\n后来我尝试换一个角度思考。\n假如我是一个领导，我每天到底在干什么？\n一、领导有一个难题：如何证明自己在工作？\n普通员工的工作通常比较容易衡量。\n销售签了多少单，设计师出了多少张图，客服处理了多少个问题。\n但是总监、副总裁这些人呢？\n他们的主要工作可能是收集信息、分析市场、判断方向、分配资源、协调部门。\n这些工作有一个共同特点：不容易被看见。\n一个总监花了三天时间，判断某个项目不值得继续投入，决定及时止损。\n这可能是一个非常有价值的决策。\n但从外面看，他好像什么都没做。\n更麻烦的是，绝大多数领导也有自己的领导。\n你是总监，上面还有副总裁；你是副总裁，上面还有总裁。\n你也需要向上级证明，自己正在创造价值。\n怎么办？\n开会、写报告、发布指令、制定制度。\n这些都是很好的办法。\n因为它们能把原本看不见的管理工作，变成一件件看得见的事情。\n你组织了一场会议，十几个部门参加，会上提出了三个问题，明确了五项工作，最后形成一份会议纪要。\n至少从形式上看，你完成了一次非常完整的管理活动。\n至于这场会议到底创造了多少价值，那是另一回事。\n二、但我慢慢发现，领导开会还真有必要\n一开始，我觉得开会多少有点表演的成分。\n后来想想，也不能这么说。\n因为领导确实承担着一个非常重要的功能：让组织里不同的人，朝着同一个方向努力。\n比如，一家公司原本把大量资源投入到某个产品。\n突然有一天，市场发生变化，消费者的需求改变了。\n高层经过讨论，决定调整战略，把资源转移到另一个方向。\n但基层员工不知道。\n销售还在卖原来的产品，市场部还在做原来的推广，运营还在优化原来的流程。\n每个人都很努力。\n但整个公司正在朝错误的方向前进。\n这时候，开会就很有必要。\n当然，也可以发文件。\n但文件有个问题：发出去了，不代表大家看了；看了，不代表理解了；理解了，也不代表真的认同了。\n会议则不同。\n你必须放下手头的工作，在特定的时间里，和一群人集中讨论同一件事情。\n我甚至想到一个不太恰当的类比：某些组织为什么喜欢举办封闭式的集体活动？\n因为当一个人暂时隔绝外界信息，长时间集中接收同一套信息时，他的注意力和判断就更容易受到影响。\n当然，正常的企业会议和那些极端的洗脑活动完全不是一回事。\n但它们确实都利用了一个特点：集中注意力，可以提高信息传递和形成共识的效率。\n这也是为什么有些重要的事情，光靠一份文件是不够的。\n比如我们公司每个月有一次全员会议，通常不超过一个小时，主要同步最近的政策和业务变化。\n我反而觉得，这种会议值得保留。\n因为它有明确的目的，也解决了一个真实存在的问题。\n三、最可怕的会议，是开着开着就不知道为什么要开了\n我以前参加过日会、周会、月会。\n刚开始的时候，大家还有很多东西可以讨论。\n后来慢慢地，会议就变成了一个固定流程。\n到了星期一，就要开周会。\n到了月底，就要开月会。\n至于这周到底有没有什么值得讨论的事情，似乎已经不重要了。\n有时候组织者自己也没什么内容，只能让大家轮流汇报一下最近做了什么。\n于是，一个原本用来解决问题的工具，变成了一个需要被完成的任务。\n我觉得这里有个很有意思的现象。\n我们原本是因为有事情要解决，所以决定开会。后来却变成了因为要开会，所以必须找一些事情来讲。\n日报、周报也是如此。\n一个管理者要求所有员工每天写日报，理由可能是让大家养成复盘习惯，也方便自己掌握工作进度。\n听起来很合理。\n但仔细想想，有复盘习惯的人，即使没有日报制度，也会主动梳理自己的工作。\n而没有复盘习惯的人，可能只是每天花五分钟，把昨天的内容改几个字，再提交一次。\n更荒谬的是，有些日报根本没人看。\n员工每天认真填写，领导每天收到一堆文件，大家都完成了各自的任务。\n但如果突然取消这个制度，可能什么事情都不会发生。\n这就很值得思考了。\n如果一项管理制度被取消之后，组织仍然运转良好，那我们过去花在这项制度上的时间，到底创造了什么价值？\n四、一个优秀的领导，可能恰恰是不需要经常出面的领导\n假设有两个部门经理。\n第一个经理每天都很忙。\n员工遇到问题要找他，部门之间发生冲突要找他，项目推进不顺利要找他。\n他每天开五场会，处理几十条消息，经常加班到晚上十点。\n第二个经理看起来没那么忙。\n他提前明确了各个岗位的职责，设计好了协作流程，让员工知道遇到不同的问题应该怎么处理。\n大部分事情，团队自己就能解决。\n他偶尔看看关键数据，只有出现重大异常时才介入。\n从表面看，第一个经理似乎更重要。\n因为整个部门都离不开他。\n但如果两个部门的业绩相同，甚至第二个部门的业绩更好呢？\n那么，究竟谁的管理能力更强？\n这让我想到一个问题。\n一个领导到底应该让自己成为组织中不可替代的人，还是应该让组织不再依赖自己？\n从公司的角度看，答案似乎很明确。\n当然是后者。\n但从领导个人的角度看，事情就没那么简单了。\n如果团队没有你也能正常运转，上级会不会觉得，你这个岗位其实没那么重要？\n如果所有流程都已经完善，所有问题都有对应的解决机制，你每天还能做什么？\n你可能需要不断寻找新的问题，发起新的项目，制定新的制度。\n甚至有时候，一些本来不需要那么复杂的事情，也会被重新组织成一个需要管理者介入的项目。\n我不认为所有领导都会故意这么做。\n但组织制度确实可能产生这样的激励：一个人越频繁地介入工作，他的贡献就越容易被看见。\n而一个人提前消除了问题，他的贡献反而很难被证明。\n五、后来我发现，这个问题不只是领导才有\n我自己也遇到了类似的困惑。\n我很喜欢研究各种自动化工具。\n工作中，只要发现一件事情需要反复操作，我就会想，有没有办法用 Excel 公式、自动化程序或者 AI 来解决？\n比如，一项原本需要人工整理、核对、统计的工作。\n以前可能每周要花几个小时。\n后来我花了一些时间，把规则整理好，设计好自动化流程。\n只要数据正常输入，程序就能自动完成计算、核对和输出。\n第一次运行成功的时候，我会特别开心。\n因为这意味着，以后再也不需要重复做这些事情了。\n而且，这种事情做多了之后，我发现自己手头不少工作都已经实现了自动化。\n原本需要我亲自完成的任务，现在只需要偶尔检查一下结果。\n但随之而来的，是一种很奇怪的感觉。\n我突然意识到：\n如果公司发现，这些事情没有我也能正常完成，那我还有什么价值？\n我明明提高了工作效率。\n我明明帮公司节省了时间。\n我明明让整个流程变得更加稳定。\n但从另一个角度看，我似乎正在一步步降低公司对我的依赖。\n这就很矛盾了。\n如果我不做自动化，每天花大量时间处理重复性的工作，公司会觉得我很忙，而且这些工作确实需要我来完成。\n如果我把所有事情都自动化了，我反而可能变成一个看起来没什么事情可做的人。\n当然，有人会说，你可以把节省出来的时间用来创造更大的价值。\n比如优化其他流程、发现新的问题、推动新的项目。\n这当然没错。\n但问题是，不是每个岗位都有源源不断的新项目。\n也不是每家公司都有足够多的机会，让一个人不断从执行者转变成创新者。\n而且，自动化工作本身也有边界。\n一个部门的流程就那么多，能优化的事情总有做完的一天。\n难道为了证明自己的价值，我还需要不断创造新的工作，再想办法把它们自动化吗？\n六、你越有用，就越显得没用\n聊到这里，我发现领导和普通员工，其实面临着同一个问题。\n领导通过建立制度，让组织减少对自己的依赖。\n员工通过自动化，让工作减少对自己的依赖。\n从组织的角度看，这都是好事。\n但从个人的角度看，却未必如此。\n因为一个人的价值，和一个人看起来有多重要，根本不是同一回事。\n一个管理者每天忙着救火，可能是因为他没有建立好预防机制。\n一个员工每天加班整理数据，可能是因为他还没有找到更高效的方法。\n但在现实工作中，我们经常只能看到谁在救火，谁在加班。\n那些提前避免的问题、节省下来的时间、永远不再发生的错误，很难被直观地感受到。\n这甚至会产生一种奇怪的结果：\n一个人越擅长解决问题，就越容易把自己的工作变得不重要。\n而一个人越离不开某项工作，反而越容易证明自己不可替代。\n我最近就经常有这种感觉。\n以前完成一项工作，需要打开好几个表格，核对数据，反复修改，最后整理出一份结果。\n现在只要打开程序，点一下运行。\n几分钟之后，结果就出来了。\n我看着屏幕上的数据，确认没有问题，然后关掉窗口。\n有时候还挺有成就感的。\n毕竟，这个程序是我自己一点点做出来的。\n只是偶尔也会想到一件事情。\n如果明天我不来上班了，这个程序好像也能继续运行。\n而且可能运行得还不错。\n"},{"title":"为什么游戏开了修改器，反而不好玩了？",
"url":"/blog/wei-shen-me-you-xi-kai-liao-xiu-gai-qi-fan-er-bu-hao-wan-liao/",
"date":"2026-10-08",
"headings":[],
"body":"最近，我沉迷于一款叫《杀戮尖塔》的游戏。\n它的玩法其实很简单：玩家从一副基础卡牌开始，不断击败敌人，获取新的卡牌和道具，最终登上塔顶。\n但就是这么一个看起来并不复杂的游戏，我经常一玩就是一两个小时。\n最奇怪的是，我大部分时间都在失败。\n有时候，好不容易建立起一套不错的卡组，结果碰到一个刚好克制自己的 Boss，直接被打回起点。\n有时候，明明已经想好了战术，却始终抽不到最关键的那张牌。\n然后，我又会重新开始。\n我突然想到一个问题：\n为什么我们会对这种充满随机性、而且经常失败的游戏如此着迷？\n如果只是为了通关，我完全可以打开修改器，给自己无限生命、无限能量，甚至直接获得最强大的卡牌。\n但我很清楚，一旦这样做，这个游戏可能马上就不好玩了。\n这就很奇怪。\n明明玩游戏是为了赢，为什么当胜利变得唾手可得时，我们反而失去了兴趣？\n一、我们到底是在享受努力，还是享受运气？\n一开始，我想到的是赌博。\n赌博有一个很有意思的心理现象，叫作“赌徒谬误”。\n假设抛一枚公平的硬币，连续十次都是正面，很多人会觉得下一次出现反面的概率应该更大了。\n但实际上，第十一次出现反面的概率依然是50%。\n过去的结果，并不会改变下一次独立事件的概率。\n可人就是很容易产生一种感觉：下一次应该轮到我了。\n这似乎可以解释为什么有人沉迷赌博，也能解释为什么有人不断抽卡。\n但仔细想想，《杀戮尖塔》又不完全一样。\n因为我并不是单纯等待好运降临。\n我会主动删除牌组里不需要的卡牌，升级核心卡牌，寻找能够配合的遗物，根据即将遇到的敌人调整战术。\n这些操作都在做同一件事：\n改变自己获胜的概率。\n比如，我需要一张关键卡牌才能启动战术。\n如果牌组里有三十张牌，我可能很难及时抽到它。\n但如果通过不断精简，最后只剩十五张牌，那么抽到它的机会就提高了。\n我没有控制下一张牌是什么。\n但我可以通过自己的选择，让想要的结果更容易发生。\n这和纯粹碰运气，有着本质的区别。\n二、真正让人着迷的，是调控概率的过程\n我慢慢意识到，《杀戮尖塔》最吸引我的地方，并不是获得一副最强的卡组。\n而是亲手把一副普通的卡组，慢慢改造成自己想要的样子。\n游戏一开始，我并不知道自己会拿到什么牌。\n可能拿到一张非常强大的核心牌，也可能连续遇到一些不太理想的选择。\n但无论如何，我都得从眼前的条件出发。\n拿到攻击牌，就思考能不能围绕攻击构建战术。\n拿到防御遗物，就考虑是否可以转向防御体系。\n发现原来的策略行不通，就及时调整。\n整个过程中，我一直在做选择。\n每个选择都不一定正确，也不一定马上产生效果。\n但我能感觉到，自己的卡组正在发生变化。\n它不再是游戏随机发给我的那副牌，而是逐渐变成了一副带有我个人意志的牌。\n我不能决定命运给我什么，但我可以决定如何处理命运给我的东西。\n这可能才是最令人着迷的地方。\n而且，游戏并不会因为我的努力就保证我成功。\n即使卡组已经非常完善，也可能因为一次糟糕的抽牌而失败。\n但正因为这种不确定性始终存在，我才需要不断思考、不断调整。\n我不是在等待一个确定的结果。\n我是在不断提高自己获得理想结果的可能性。\n三、如果一切都能掌控，反而没意思了\n这里又出现了一个有趣的矛盾。\n如果一个游戏完全依靠运气，玩家无法通过任何操作改变结果，那它很容易让人产生无力感。\n但如果一个游戏完全没有随机性，所有结果都可以提前计算，而且玩家拥有压倒性的能力，它同样可能变得无聊。\n就像打开修改器。\n当我拥有无限生命、无限攻击力的时候，所有敌人都不再构成威胁。\n我确实可以赢。\n但我的判断、策略和操作，似乎都不再重要了。\n无论我做什么，都能赢。\n那我为什么还要认真思考？\n这让我意识到一件事：\n我们并不是单纯喜欢掌控，而是喜欢通过自己的能力获得掌控。\n这两者有很大的区别。\n一个人天生拥有无穷的财富，和一个人通过经营逐渐积累财富，获得的心理体验可能完全不同。\n一个人打开修改器直接站在塔顶，和一个人经历无数次失败终于登顶，也完全不是一回事。\n因为在后者的过程中，我们能够清楚地感受到自己的作用。\n如果没有困难，能力就失去了发挥的机会。\n如果没有不确定性，判断也失去了价值。\n所以，我们并不一定喜欢困难本身。\n我们喜欢的，是困难让自己的能力变得有价值。\n这也解释了为什么一手烂牌有时反而更有意思。\n因为一手好牌可能不需要太多思考就能获胜。\n而一手烂牌如果最终被打好了，我们会产生一种更强烈的满足感：\n这个结果，是我亲手改变的。\n四、其实，人生也是一场《杀戮尖塔》\n想到这里，我突然觉得，很多现实中的事情，不也是这样吗？\n比如创业。\n创业者一开始拥有的资源各不相同。\n有人有资金，有人有技术，有人有人脉，有人只有一个想法。\n这些就是每个人起手拿到的牌。\n接下来，你需要根据市场不断调整自己的组合。\n发现某个产品没有竞争力，就把它淘汰。\n发现某个渠道有效，就加大投入。\n发现竞争对手发生变化，就重新调整策略。\n你不可能保证每一次决策都正确。\n但你可以通过不断试错，让自己的资源组合逐渐更有竞争力。\n投资也是类似的道理。\n你无法预测市场每一次波动，但可以调整资产配置、控制风险、优化决策。\n当然，现实并不像游戏一样公平。每个人的起点、机会和承受风险的能力差异巨大，也不是所有努力都能得到回报。\n但从决策过程来看，它们确实存在一种相似的结构：\n我们面对不确定的环境，利用有限的资源，通过不断选择，尝试提高成功的概率。\n甚至普通人的职业发展也是如此。\n学习一项技能，相当于获得一张新牌。\n放弃低价值的工作方式，相当于删除一张废牌。\n找到适合自己的岗位，相当于让原本分散的卡牌产生配合。\n而我们过去积累的经验，则可能像遗物一样，在未来的某个时刻发挥作用。\n人生没有一套保证获胜的卡组。\n但我们可以不断调整自己手中的牌。\n这样看来，游戏中最令人兴奋的过程，现实中其实一直都在发生。\n五、为什么我们愿意为游戏熬夜，却不愿意为人生努力？\n不过，这里还有一个让我觉得更奇怪的问题。\n既然现实和游戏存在如此相似的过程，为什么我可以连续几个小时研究一副虚拟的卡组，却很难用同样的热情研究自己的工作和生活？\n我觉得，其中一个重要原因是反馈。\n在《杀戮尖塔》里，反馈实在太清楚了。\n我删除一张不需要的牌，下一次抽牌时就可能感受到牌组更加流畅。\n我升级一张卡牌，马上就能看到伤害或者防御数值的变化。\n我调整一套战术，下一场战斗就有机会验证它是否有效。\n即使失败了，我也经常能够发现问题出在哪里。\n是防御不足？\n是牌组太臃肿？\n还是过早确定了战术方向？\n于是，我又有了重新开始的理由。\n但现实生活完全不同。\n你可能认真工作了半年，却不知道自己的能力究竟提高了多少。\n你可能做出了一个正确的决策，但因为市场环境不好，最后依然失败。\n你可能努力学习一项技能，却要等到几年以后，才知道它究竟有没有价值。\n更麻烦的是，现实中的很多结果，并不能清楚地归因于某一个选择。\n究竟是我做得好，还是运气好？\n究竟是我的策略有问题，还是时机不对？\n我们往往很难判断。\n而游戏把这个复杂的过程压缩到了几十分钟里。\n它让我们能够频繁经历：\n选择、行动、反馈、调整。\n然后再次选择。\n这种循环让人很容易进入一种投入的状态。\n因为我们始终能感觉到，自己正在做一件有意义的事情。\n哪怕最终失败了，整个过程也没有白费。\n至少，我又发现了一种新的可能性。\n六、也许，我们真正需要的是看见自己的力量\n回过头来看，我发现自己一开始提出的问题，可能就有一点偏差。\n我以为自己沉迷《杀戮尖塔》，是因为人类天生对概率有某种执念。\n总觉得下一次会更好。\n总觉得下一次能抽到想要的牌。\n但现在看来，随机性只是其中一部分。\n真正吸引我的，是随机性给了我一个发挥能力的空间。\n如果所有事情都已经确定，我不需要思考。\n如果所有事情都完全随机，我的思考又没有意义。\n只有当结果不确定，但我的行动又确实能够影响结果的时候，我才会产生强烈的参与感。\n这可能也是为什么，我们会喜欢那些有挑战性的游戏，喜欢解决复杂的问题，甚至愿意主动承担一些本来可以避免的困难。\n因为在这些过程中，我们能够感受到：\n自己并不是一个被动接受结果的人。\n我们有能力改变一些东西。\n哪怕这种改变很小，哪怕最终还是失败了。\n而我觉得，这种感觉可能比成功本身更重要。\n毕竟，如果游戏一开始就让我站在塔顶，我可能根本不会想玩。\n真正让我愿意花上几个小时的，是从塔底出发，一张牌、一张牌地调整，一场战斗、一场战斗地往上走。\n我不知道最后能不能赢。\n但我知道，自己正在尝试让赢的可能性变大。\n写到这里，我反而开始思考另一个问题。\n为什么我们愿意花几个小时，把一副虚拟的烂牌慢慢打好，却经常对现实中那些真正能够改变命运的选择失去耐心？\n也许，我们并不是不喜欢努力。\n而是现实很少像游戏一样，清楚地告诉我们：你刚才的那个选择，究竟让自己变强了多少。\n如果有一天，我们也能像经营一副卡组一样，清楚地看见自己正在删除哪些无效的选择、升级哪些重要的能力、提高哪些事情的成功概率。\n我们会不会也像沉迷游戏一样，开始沉迷于经营自己的人生？\n"},{"title":"十一假期，到底要不要回工作消息？",
"url":"/blog/shi-yi-jia-qi-dao-di-yao-bu-yao-hui-gong-zuo-xiao-xi/",
"date":"2026-09-30",
"headings":[],
"body":"马上就是十一假期了。\n每到长假，总会出现一个很经典的职场问题：\n放假了，领导发消息，到底要不要回？\n现在互联网上的主流答案，似乎越来越简单。\n放假就是放假。\n下班以后不要谈工作，休息时间不要回复消息。欧美人为什么活得轻松？因为人家工作和生活分得开。国内为什么这么累？因为老板总想用八小时的工资，买你二十四小时的人生。\n这些话当然有道理。\n但我慢慢发现，现实好像没有这么简单。\n因为你真的去观察一些欧美公司，或者看一些以职场为背景的剧集，会发现他们同样有 on-call，同样有人在假期待命，同样有人半夜接电话。\n并不是所有人到了下午五点，就把电脑一关，去海岛晒太阳了。\n很多工作确实可以外包。\n技术可以外包，客服可以外包，执行可以外包，值班也可以排班。\n但有一样东西很难外包：\n责任。\n事情真的出了问题，总得有一个人接那个电话。\n而且很有意思的是，这个人往往不应该是最下面的人。\n⸻\n越往上走，卖的越不是时间\n假设一个普通员工，月薪几千块。\n没有决策权，没有项目分红，公司今年赚一个亿和他没什么关系，项目成功了也不会因此改变命运。\n十一假期，公司却要求他手机24小时开机，消息秒回，出了问题随叫随到。\n他当然会不爽。\n因为公司给他的是一份普通员工的工资，却希望他承担老板一样的责任。\n但把这个人换成公司创始人呢？\n他正在马尔代夫晒太阳，公司突然打电话过来：\n核心业务出问题了，可能损失几百万。\n他会不会说：\n“不好意思，现在是法定假期，八号上班再说。”\n大概率不会。\n甚至他自己都不会把这件事理解成“加班”。\n因为他知道，公司出事，就是自己出事。\n所以，同样是在十一假期接一个电话，背后的性质完全不同。\n一个人在出售时间，另一个人在承担结果。\n职位越往上走，这种区别越明显。\n基层岗位卖的是时间和技能。\n八小时里，我完成我的工作。\n但到了更高的位置，公司真正购买的已经不完全是你的八小时了。\n而是：\n出了事，这个人会兜底。\n这也是为什么我现在觉得，“责任心”这个词有时候被滥用了。\n责任不应该无限向下传递。\n责任应该和三个东西绑在一起：\n权力、收益和位置。\n你拿走更多收益，拥有更多决策权，占据更稀缺的位置，就应该承担更多责任。\n这很公平。\n真正不公平的是，一个人拿着普通员工的工资，没有决定事情的权力，却被要求拥有老板的责任心。\n⸻\n所谓“加班是福报”，问题可能不在加班\n以前“加班是福报”这句话被骂得很惨。\n我其实也不喜欢把加班包装成某种美德。\n但如果换一个角度，会发现这里面有一个很容易被忽略的问题：\n福报和责任，本来就应该同时存在。\n如果一个位置百里挑一，拥有巨大的资源、收入、决策权和未来收益，那么这个位置附带更大的责任，其实很正常。\n不能只要福报，不要责任。\n一个高管一年拿几百万，十一在国外度假，公司出了重大问题，电话打过去，他需要处理一下。\n我不觉得这是一件多么难以理解的事情。\n因为那几百万买的本来就不只是他的工作时长。\n某种程度上，也是在买：\n关键时刻，你得在。\n问题在于，我们经常把这套逻辑用反了。\n上面的人拿走了收益和权力，下面的人承担了待命和责任。\n最后还告诉下面的人：\n“年轻人要有主人翁精神。”\n那当然没人愿意当主人。\n因为只有责任是主人的，收益还是员工的。\n⸻\n更有意思的是，有些厉害的人其实是“不经济”的\n这也是我最近想到的另一个问题。\n为什么投资经常说“投项目不如投人”？\n因为一个项目真正的成本，远比财务报表上看到的复杂。\n假设一件事情最后花10万元做成了。\n我们会觉得：\n这个项目成本10万元。\n其实可能根本不是。\n背后有个人凌晨两点还在处理问题；\n供应商突然掉链子，他重新找人；\n十一假期别人都出去玩了，他还在跟进行业变化；\n原来的方案走不通，他自己重新想办法；\n突然出了一个没人预料到的问题，他没有说“这不归我管”，而是想：\n那现在还能怎么办？\n这些东西都没有进入那10万元。\n他的睡眠、时间、焦虑、机会成本、家庭时间，都没有出现在Excel里面。\n所以很多看起来“低成本完成”的事情，实际上成本一点都不低。\n只是有一个人替这个项目支付了大量看不见的成本。\n成本没有消失，只是转移到了某个人身上。\n而这种人，从经济学意义上看，甚至有点“不经济”。\n因为他投入得太多了。\n如果把他的每一分钟、每一次半夜醒来、每一个假期电话全部折算成钱，这件事情可能根本没有我们想象中那么便宜。\n但偏偏很多真正困难的事情，就是靠这种“不经济的人”做出来的。\n⸻\n所以，为什么投资最后会变成“投人”？\n因为真正复杂的事情，不可能提前把所有问题都写进SOP。\n你不可能规定：\n10月3日下午4点，如果供应商突然跑路，请执行第37号预案。\n现实不是这么运行的。\n真正重要的是，你找到一个人。\n然后你知道：\n不管发生什么，他都会想办法把事情往前推。\n他可能换方案，可能找人，可能打电话，可能自己顶上。\n因为这件事情的成败，已经和他绑在一起了。\n所以创业者、合伙人、核心负责人和普通员工最大的区别，有时候并不是能力。\n而是他们计算成本的方式完全不同。\n普通员工会想：\n这是不是我的工作？\n现在是不是工作时间？\n做这件事情有没有加班费？\n这完全合理。\n但一个真正和结果绑定的人想的是：\n这件事得成。\n至于今天是不是星期六，是不是十一，是不是晚上十一点，反而变成了第二层问题。\n因为他实际上是在用一个很高的当下成本，去赌一个更大的未来。\n⸻\n所以，十一到底要不要回消息？\n写到这里，我反而觉得，这个问题没有一个统一答案。\n有些消息，你完全可以不回。\n因为公司只是购买了你的工作时间，没有购买你二十四小时的人生。\n但有些人可能确实没有所谓“彻底下线”的假期。\n因为他拥有的，本来就不只是一份工资。\n他拥有决策权、收益、资源、位置，甚至这件事情未来成功以后巨大的回报。\n那么相应地，他也承担着别人不需要承担的责任。\n所以真正值得讨论的，从来不是：\n“十一假期回工作消息，是不是太卷？”\n而是：\n凭什么是你回？\n如果你拿着普通员工的工资，没有决策权，没有分红，也不分享这件事情未来的收益，却被要求24小时拥有老板一样的责任心——\n那确实值得问一句：\n为什么？\n但如果你已经拥有了一个稀缺的位置，拿走了这个位置带来的收益，也拥有决定事情走向的权力，那么有些责任，本来就不会随着假期一起消失。\n我甚至觉得，一个组织健不健康，看十一假期谁还在回消息，就能看出一点东西。\n最下面的人全部待命，老板彻底失联，这很奇怪。\n所有人全部待命，也很奇怪。\n真正合理的状态可能是：\n越接近结果的人，承担越大的责任；越远离结果的人，拥有越清晰的边界。\n所以今年十一，如果工作群里又突然弹出一条消息，也许真正值得问的不是：\n“放假了，我到底该不该回？”\n而是另一个问题：\n“这件事的成功，到底有多少真正属于我？”\n"},{"title":"最懂你的人，可能是你的对手",
"url":"/blog/zui-dong-ni-de-ren-ke-neng-shi-ni-de-dui-shou/",
"date":"2026-09-28",
"headings":[],
"body":"最近玩《杀戮尖塔》，我经常会有一种很奇怪的感觉。\n刚开始玩的时候，我当然希望敌人弱一点。\n最好我抽到的牌都很强，对面的攻击都很好预测，一套组合打出去，血都不用掉多少，就能一路往前走。\n这种感觉很爽。\n人其实都喜欢虐菜。\n打游戏是这样，打牌是这样，工作有时候也是这样。当你发现别人没有你知道得多，没有你做得快，甚至对方还在纠结一个你早就解决的问题时，很难完全没有一点优越感。\n“原来我已经这么厉害了。”\n但奇怪的是，这种快乐往往持续不了太久。\n如果《杀戮尖塔》里的敌人永远这么弱，我大概很快就不玩了。\n真正让我一局接一局、回过神来已经过去一两个小时的，反而是那些让我觉得棘手的局。\n手里的牌明明不错，但怎么出都差一点。\n这一回合多打一点伤害，下一回合可能就扛不住；现在把关键牌用了，后面可能没有办法处理；想好的卡组碰到一个特殊的敌人，突然发现以前很好用的套路失效了。\n然后我就开始认真了。\n盯着那几张牌想半天。\n甚至输了以后，还会想着：\n刚刚是不是还有另外一种打法？\n这件事让我想到一个很有意思的问题。\n为什么人明明喜欢赢，却又会主动寻找那些可能让自己输的人？\n⸻\n下棋的时候，这种感觉可能更加明显。\n假设你的水平很高，对面却是个刚学会规则的人。\n你走一步，他想半天。\n你设了一个局，他根本没看出来。\n你提前想了五步，他还在考虑眼前这一步。\n你当然可以赢。\n甚至可以赢得很漂亮。\n但这种棋往往没什么意思。\n因为你走出去的那些棋，没有被看见。\n真正有意思的是另外一种情况。\n你走了一步。\n对方停了一下。\n然后他走出了一步你没想到的棋。\n那一瞬间，你可能马上就知道：\n他看懂了。\n他知道你刚才为什么这么走。\n甚至不只是看懂了，他还知道你下一步想干什么，所以提前在那里等你。\n于是你又开始想：\n他既然知道我知道他知道，那我还能不能换一种走法？\n这时候，一盘棋突然变成了一场非常复杂的对话。\n只不过你们一句话都没有说。\n你出招，他回应。\n他试探，你识破。\n你故意露出一个破绽，他在判断这个破绽到底是真的，还是你希望他以为是真的。\n这时候你才会发现一件很奇怪的事：\n一个真正厉害的对手，可能比很多朋友都更“懂你”。\n⸻\n我们平时说“懂一个人”，总觉得那应该是一件很温柔的事情。\n懂你的情绪，懂你的难处，懂你为什么开心，为什么难过。\n但还有另外一种“懂”。\n我知道你为什么这么做。\n我知道你在想什么。\n我知道你下一步准备去哪里。\n甚至我知道，你希望我以为你在想什么。\n这种理解，不一定来自朋友。\n反而经常来自对手。\n德州扑克尤其明显。\n如果桌上的人水平都很差，游戏其实会变得简单。\n他们的下注透露着非常直接的信息，他们的选择很容易预测。你不需要理解他，只需要利用他。\n但碰到一个真正厉害的人，事情完全不同。\n你在观察他，他也在观察你。\n你发现了他的习惯，他可能也发现你已经发现了他的习惯。\n于是他甚至可以利用你的“聪明”来骗你。\n你们之间开始出现一层又一层的判断。\n最有意思的是：\n你们明明都在想办法打败对方，却又因为这种对抗，进入了一种很深的交流。\n这可能就是“棋逢敌手”真正迷人的地方。\n它不只是势均力敌。\n而是——\n终于有人接得住你的招了。\n⸻\n这也是为什么“虐菜”和“棋逢敌手”其实是两种完全不同的快乐。\n虐菜的快乐来自自己。\n我比你强。\n我赢了。\n我掌控了局面。\n但棋逢敌手的快乐，却来自两个人之间。\n我做了一件复杂的事，而你看懂了。\n你不但看懂了，还回应了。\n于是我不得不拿出更复杂的东西。\n然后你再次回应。\n这种快乐甚至不要求最后一定是我赢。\n有时候输给一个很厉害的人，反而会记很久。\n因为他走出了某一步以后，你突然意识到：\n原来还可以这样。\n那一刻当然有挫败感。\n但同时又有一种非常奇怪的满足。\n像是自己说了一句很难被理解的话，终于有人听懂了，而且对方还回了一句你从来没想到过的话。\n所以我们才会想再来一次。\n⸻\n后来我觉得，《杀戮尖塔》最厉害的地方可能也在这里。\n它当然不是一个真人。\n但它一直在制造一种“有人接得住你的招”的感觉。\n你学会了一种打法，它就给你一个新的问题。\n你终于理解了卡组，它开始考验你的取舍。\n你以为自己已经找到答案，它又用随机性把标准答案拿走。\n于是你不得不继续回应它。\n它再回应你。\n你再改变。\n所以时间才会消失得那么快。\n因为那几个小时里，你不是在机械地点击几张卡牌。\n你其实一直处在一场高密度的“对话”里。\n⸻\n我以前会觉得，所谓知音，大概是高山流水。\n一个人弹琴，另一个人听懂了。\n后来才发现，知音还有另外一种形式。\n他不坐在你旁边。\n他坐在你对面。\n你们甚至希望彼此输掉。\n但你出了一招，他看懂了。\n他回了一招，你也看懂了。\n然后你突然有一种很久没有出现过的兴奋：\n终于不用解释了。\n来，再下一局。\n"},{"title":"成为母亲之前，她是一个什么样的人呢？",
"url":"/blog/cheng-wei-mu-qin-zhi-qian-ta-shi-yi-ge-shen-me-yang-de-ren-ni/",
"date":"2026-09-23",
"headings":[],
"body":"最近，我看到一个母亲陪着自己的孩子去上班。\n她的孩子已经26岁了，是一名自闭症人士。\n一路上，她都在说话。\n上楼的时候，要提醒他注意什么；坐车的时候，要告诉他应该怎么做；到了公司，看见同事，她又要在旁边提醒：\n要打招呼。\n要回应别人。\n这个时候应该说什么，那个时候应该怎么做。\n有时候孩子没有反应，她甚至要先替他开口，再回过头来教他一遍。\n如果只是看这样一个片段，你甚至会觉得，这个母亲有点啰嗦。\n孩子都26岁了，为什么还要什么都说？\n可是我看着看着，脑子里突然冒出来一个问题：\n她成为母亲之前，是一个什么样的人？\n她以前也这么爱说话吗？\n她年轻的时候，会不会其实是一个很安静的人？\n会不会不喜欢麻烦别人，不喜欢跟陌生人打交道，甚至在人多的时候，也习惯站在角落里？\n我不知道。\n但我知道，她大概不是从一开始，就会做今天这些事情的。\n只是后来，她有了一个这样的孩子。\n于是她必须一遍又一遍地提醒，一遍又一遍地解释，一遍又一遍地替孩子处理那些对普通人来说根本不需要处理的事情。\n不是因为她喜欢唠叨。\n而是因为有些话，如果她不说，就没有人替孩子说了。\n⸻\n我还听过另一个特殊孩子母亲的故事。\n有人问她：\n你有没有想过，以后自己老了，孩子怎么办？\n她说，她想过。\n然后她说了一句让我很久都忘不了的话：\n她希望自己的孩子，可以比她先走。\n第一次听到这句话，会觉得很残忍。\n哪一个母亲会希望自己的孩子比自己先离开？\n可是她后面说：\n这样，她就不用担心自己走了以后，谁来照顾他。\n突然就明白了。\n她不是希望孩子离开。\n她只是不敢让孩子一个人留下。\n对于很多父母来说，孩子长大，意味着慢慢放手。\n上学、工作、结婚，有自己的生活。\n父母老了以后，会担心孩子过得好不好，却不再需要时时刻刻守着他。\n但对一些特殊孩子的父母来说，也许不是这样。\n他们陪孩子一年、十年、二十年。\n最后发现，自己已经老了，那个最让自己放心不下的人，却还在那里。\n于是连死亡都变成了一件需要安排先后顺序的事情。\n这大概是我以前很难理解的一种母爱。\n⸻\n后来我发现，其实不只是这些特殊孩子的母亲。\n我身边很多普通的母亲，也在经历一些没有人注意到的变化。\n有的人以前很内向。\n不喜欢主动跟别人讲话，更不喜欢经营什么关系。\n可是有了孩子以后，她开始主动认识别的家长。\n为了让孩子多几个朋友，她得学着跟陌生人攀谈；\n为了孩子在学校里的事情，她得主动找老师；\n以前不好意思开口问的事情，现在要问；\n以前觉得麻烦的关系，现在也得学着处理。\n她未必喜欢这些。\n她只是突然发现：\n自己不能永远只做原来的自己了。\n孩子需要一个能够站出来的人，她就得学着站出来。\n孩子需要一个会沟通的人，她就得学着沟通。\n孩子遇到事情的时候，她甚至不能先害怕。\n因为她知道，身后还有一个比她更害怕的人。\n很多时候，我们看到一个母亲的时候，看到的已经是她被生活改造之后的样子。\n所以我们很容易以为：\n她本来就这么坚强。\n她本来就这么会照顾人。\n她本来就喜欢操心。\n她本来就这么能扛。\n可也许并不是。\n她只是做母亲做了很多年。\n⸻\n因为我自己也有女儿，所以现在看到这些事情，我会有一种以前没有的感觉。\n我看着自己的孩子，会觉得她现在还这么小。\n她有自己害怕的东西，有自己的脾气，会撒娇，会哭，也会因为一些很小的事情跑过来找爸爸妈妈。\n做父母的，当然希望她以后的人生一直顺顺利利。\n最好不用经历太多困难。\n不用逼着自己坚强。\n不用被生活逼着学会那些她原本不擅长的事情。\n可是我也知道，这大概是不可能的。\n她以后会遇到什么样的人，会经历什么事情，会爱上谁，会保护谁，会因为什么事情不得不改变自己，我都不知道。\n也许有一天，她也会变成一个让我觉得陌生的人。\n那个现在躲在父母身后的孩子，有一天会站到别人前面。\n那个现在需要别人安慰的人，有一天会去安慰别人。\n那个现在遇到一点事情就来找我们的人，有一天也可能成为另一个人的依靠。\n甚至可能有一天，我会看着她想：\n她什么时候变成这样的？\n我想，很多父母都会有这样一个瞬间。\n我们总觉得自己是在看着孩子长大。\n可“长大”其实不是单纯地年龄增加。\n生活会一点一点要求一个人改变。\n有时候是工作，有时候是婚姻，有时候是疾病，有时候只是因为有一天，她的怀里也出现了一个需要她保护的人。\n然后，她开始做以前不敢做的事，说以前不会说的话，承担以前想都没有想过的责任。\n直到很多年以后，别人再认识她时，只会看到她已经成为的那个人。\n却很少有人知道，她曾经是什么样子。\n所以现在再看到一个不停叮嘱孩子的母亲，我好像不太会觉得她啰嗦了。\n我反而会忍不住想：\n她第一次这么做的时候，是几岁？\n第一次硬着头皮替孩子开口的时候，她紧张吗？\n第一次发现自己不能倒下的时候，她害怕吗？\n那个说希望孩子比自己先走的母亲，在成为母亲以前，又有没有想过，自己有一天会说出这样一句话？\n我不知道。\n但也许，“母亲”这个词真正让我触动的地方就在这里。\n她们并不是天生就比别人坚强。\n只是后来，有一个人需要她们坚强。\n"},{"title":"你越崇拜一个人，越学不到他的东西",
"url":"/blog/ni-yue-chong-bai-yi-ge-ren-yue-xue-bu-dao-ta-de-dong-xi/",
"date":"2026-09-23",
"headings":[],
"body":"最近我在玩《极乐迪斯科》。\n这个游戏有一个设计让我印象很深：它不太愿意简单地告诉你，主角到底是一个“厉害的人”，还是一个“失败的人”。\n它把一个人拆得非常碎。\n智力是一组属性，精神是一组属性，身体是一组属性，行动能力又是一组属性。\n你可能逻辑能力很强，却完全不懂得察言观色；可能共情能力很高，却身体糟糕；可能非常擅长说服别人，但面对压力时一塌糊涂。\n玩久了以后，我突然觉得：\n游戏里评价一个人，比现实世界精细多了。\n因为现实中的我们，太喜欢用一个数字评价一个人。\n⸻\n01\n尤其是进入职场以后，我们有一套非常粗糙的“人物评分系统”。\n一个人年薪百万，我们会觉得他厉害。\n一个人做到公司高管，我们会觉得他成功。\n一个人创业赚了很多钱，我们会觉得他有能力。\n一个人很有名，我们甚至会下意识觉得，他说的其他东西也更可信。\n我最近观察公司里的一些高管，就越来越强烈地感受到这一点。\n有的人职业成就确实很高，职位、收入可能都远高于普通人。\n但你真的接触以后，会发现他依然只是一个普通人。\n他的生活习惯可能很糟糕，可能长期吃高油高盐的东西，也不太管理自己的身体；他的精神生活可能非常单调；他对一些工作之外的事情，判断力甚至未必比普通人强。\n这并不影响他在职业上的成就。\n问题在于，我们很容易因为他的职业成就，把那些根本不存在的属性也一起补上去。\n好像一个人事业做得好，他就应该懂管理、懂投资、懂生活、懂教育、懂健康，甚至连他推荐的商品都更值得买。\n明星带货其实也是同一个逻辑。\n一个人唱歌很好听，跟他懂不懂护肤品有什么关系？\n没有关系。\n可是大脑很喜欢自动把这两件事连起来。\n我们看到的明明只是一个很高的数值，却脑补出了一整张漂亮的属性面板。\n⸻\n02\n而《极乐迪斯科》恰恰提醒了我：\n一个人的属性，本来就是分开的。\n假如现实中的每个人头顶也有一张人物面板，事情可能会变得非常有趣。\n一个公司高管可能是：\n职业能力：9\n组织协调：8\n向上管理：9\n身体管理：3\n审美：4\n亲密关系：5\n情绪稳定：6\n生活趣味：2\n当然，这只是一个比喻。\n但它会逼着我们意识到一件事情：\n这个世界上可能根本没有那么多“厉害的人”，只有某几个数值特别高的人。\n甚至就连那个很高的数值，你也应该继续往下拆。\n一个人做到高管，并不能直接证明他的“工作能力是9”。\n因为一个人走到今天的位置，背后可能有很多东西。\n专业能力、人际关系、资源、平台、时代红利、跳槽机会、贵人、运气，甚至仅仅是某几个关键节点做对了选择。\n尤其过去几十年处在快速发展的行业里，一个人频繁跳槽，往往伴随着职位和薪酬不断上涨。\n多年以后再看履历，会觉得这个人非常厉害：\n做过这个岗位，又做过那个岗位，当过总监，又当过VP。\n但履历告诉你的只是：\n他走过这些位置。\n至于他为什么能走到那里，每一步到底贡献了什么，哪些东西属于个人能力，哪些属于环境，你仍然需要重新判断。\n职位是一个结果。\n它不是一个人的完整说明书。\n⸻\n03\n再往下想，还有一个更有意思的问题：\n为什么我们那么喜欢寻找“厉害的人”？\n因为这样很省事。\n只要认定了一个人厉害，我们就不用再拆了。\n他说什么，我听就好了。\n他怎么做，我学就好了。\n他推荐什么，我相信就好了。\n可是一个真正的人，怎么可能这么简单？\n《极乐迪斯科》里想把一个角色的所有属性都堆得很高，你都需要大量的点数，甚至可能要玩很多周目。\n现实世界比游戏复杂得多。\n而我们只有一个周目。\n一个人把大量时间投入事业，他就必然减少了投入其他地方的时间；一个人在某个专业领域钻得极深，并不意味着他同时有精力把另外十个领域也研究透。\n所以我不相信一种东西：\n“全方位厉害的人”。\n这并不是说优秀不存在。\n恰恰相反。\n我是觉得我们应该把“优秀”看得更具体一点。\n⸻\n04\n因为只有把一个人从神坛上拆下来，你才真正开始向他学习。\n这是我后来觉得特别反常识的一点：\n崇拜其实不利于学习。\n一个人职位比你高很多，你把他想得特别厉害，结果会发生什么？\n你开始紧张。\n你不敢问太简单的问题。\n你不敢质疑。\n你本来有一个不同的观点，想了半天还是算了。\n甚至聊天的时候，你都在揣摩：\n“我这样说会不会显得很蠢？”\n两个人明明坐在同一张桌子前，大脑里却已经被你自己划出了一条等级线。\n这时候你很难真正从他身上学到东西。\n因为学习需要观察、追问、比较，甚至质疑。\n而崇拜需要仰视。\n你一旦开始仰视，就很难看清细节。\n⸻\n05\n所以我现在更喜欢另外一种学习方式。\n不是找一个“厉害的人”，然后努力变成他。\n而是把我遇到的每一个人，都当成一个数据库。\n我可能遇到一个特别会开会的人。\n那我就观察：\n为什么同样一个会议，他20分钟可以把事情讲清楚？\n他先问了什么？\n怎么把跑偏的话题拉回来？\n怎么判断什么时候应该继续讨论，什么时候应该直接拍板？\n这些东西我拿走。\n下一次，我又遇到一个特别会谈判的人。\n我继续观察。\n他什么时候沉默？\n什么时候报价？\n什么时候让步？\n为什么同一句话，从他嘴里说出来，对方愿意接受？\n这个东西，我也拿走。\n至于这个人是不是一个“值得我崇拜的人”，其实已经不重要了。\n我甚至不需要喜欢他。\n我不需要模仿他的生活，不需要接受他的价值观，更不需要因为他某一个维度很强，就顺便相信他在其他领域的判断。\n我只需要把那个有用的零件拆下来，装进自己的工具箱。\n慢慢地，你会发现一个很有意思的变化：\n以前你收集的是“厉害的人”。\n后来你收集的是厉害的方法。\n⸻\n06\n这两种学习方式，看起来很像，其实完全不同。\n前一种是：\n“这个人好厉害，我要向他学习。”\n后一种是：\n“他刚才处理这个问题的方法很好，我要研究一下。”\n前者学习的是人。\n后者学习的是场景—动作—结果。\n而真正可以被你复制的，恰恰是后面这个东西。\n因为你永远复制不了另外一个人的人生。\n你没有他的家庭，没有他的关系，没有他的时代，没有他的运气，也没有他的职业路径。\n但你可以复制一个具体的方法。\n下一次碰到类似场景时，你的工具箱里会突然多出一个选项：\n“我见过一个人，当时是这么处理的。”\n这才是别人真正能够留给你的东西。\n⸻\n07\n所以现在再遇到那些所谓的“厉害的人”，我反而希望自己少一点崇拜。\n不是为了贬低他们。\n而是为了看清他们。\n他职位比我高，不代表我和他不是两个平等的人。\n他收入比我高，不代表他在所有问题上的判断都比我好。\n他在某个领域做出了我做不到的成绩，那我就去研究那个领域里，他到底做对了什么。\n该尊重的尊重，该学习的学习，该怀疑的怀疑。\n不要因为一个人站得比你高，就把他身上所有数值都自动加满。\n也不要因为发现他某个地方只有3分，就突然觉得他原来的9分也是假的。\n人本来就是这样。\n一堆高高低低的数值，拼成了一个具体的人。\n也许真正成熟的识人方式，不是终于找到了一个值得自己崇拜的人。\n而是有一天，你不再需要崇拜任何人。\n你只是走过去，打开他的属性面板。\n看看哪几个数值比你高。\n然后，把它学走。\n"},{"title":"二孩之后，我决定退出“鸡娃圈”",
"url":"/blog/er-hai-zhi-hou-wo-jue-ding-tui-chu-ji-wa-quan/",
"date":"2026-09-22",
"headings":[],
"body":"有了两个孩子以后，我渐渐确定一件事：\n一个家庭真正稀缺的，从来不只是钱，而是注意力。\n以前只有一个孩子的时候，我很容易产生一种错觉：只要方法是对的，就应该尽量做到。\n孩子有兴趣，应该培养；\n孩子有情绪，应该接住；\n亲子陪伴，要高质量；\n阅读习惯，要从小建立；\n运动不能少；\n英语最好早点启蒙；\n吃饭要营养；\n睡眠要规律……\n单独看，每一条都没错。\n问题是，当你有两个孩子，再加上工作、家务、夫妻关系、老人、自己的生活以后，你会发现：\n所有正确的事情加在一起，可能会变成一种错误的生活。\n你的精力，根本不够。\n⸻\n一\n我以前其实不太理解父母那一代人。\n六七十年代出生的很多人，年轻时面对的是一个完全不同的世界。\n资源少，收入低，很多家庭还有几个孩子。\n所以他们很早就练出了一种我们这一代人不太擅长的能力：\n同时把很多事情维持住。\n一边工作，一边做饭，一边带孩子，一边处理家里的各种事情。\n你今天回过头去看，会觉得很多事情都很“粗糙”。\n孩子有没有兴趣爱好？\n学校里过得开不开心？\n有没有得到足够的情绪回应？\n某个阶段应该培养什么能力？\n他们可能根本没有认真想过。\n但这不一定是因为他们不爱孩子。\n而是因为在那个时代，评价一个父母做得好不好，标准可能根本不是这些。\n孩子吃饱了吗？\n有衣服穿吗？\n生病有没有看？\n书有没有读？\n家里有没有正常运转？\n如果这些都做到了，已经很好了。\n他们擅长的不是把一件事情做到九十分，而是同时让十件事情都不要掉到不及格。\n这其实是一种很强的生存能力。\n⸻\n二\n但我们这一代人接受的训练完全不同。\n我们从小就被鼓励把某一件事情做好。\n数学考第一，会被表扬。\n作文写得特别好，会被表扬。\n哪怕其他科目普通，只要你有一个特别突出的特长，别人也会觉得：这个孩子很厉害。\n我们慢慢习惯了一种思维：\n做了，就应该做好。\n等我们成为父母，这套标准也被带进了育儿。\n更麻烦的是，我们知道得太多了。\n上一代父母可能根本不知道什么叫“高质量陪伴”，今天的父母打开手机，到处都是。\n你知道儿童心理发展。\n知道敏感期。\n知道兴趣培养。\n知道亲子阅读。\n知道运动的重要性。\n知道不能随便否定孩子。\n知道要尊重孩子的选择。\n知道父母情绪稳定的重要性。\n知道屏幕时间要控制。\n每多知道一个“正确答案”，身上就多背了一项责任。\n所以我们这一代父母很容易陷入一个奇怪的困境：\n不是不知道怎么做，而是知道得太多了。\n每一件事情单独拿出来，我们都知道怎样做到九十分。\n可是生活不是考试。\n它不会让你这一小时只考数学，下一小时再考英语。\n现实是，两个孩子可能同时在叫你，工作消息正在响，饭还没做好，你自己也已经很累了。\n这个时候，你不可能每一科都考九十分。\n⸻\n三\n这也是我有了两个孩子以后，慢慢强烈起来的一种感受。\n育儿真正困难的地方，不是“怎样把孩子教育好”。\n而是：\n当所有事情都重要的时候，你到底把有限的资源放在哪里？\n比如两个孩子同时有需求。\n一个孩子想让我陪他玩，另一个年龄更小的孩子正处在一个需要照看的环境里。\n我当然希望两个都满足。\n但做不到。\n那就只能先处理安全。\n这不意味着另一个孩子的陪伴不重要。\n只是这一刻，它的优先级没那么高。\n同样的道理，有些兴趣，我当然知道坚持下去可能更好。\n但如果为了把这个兴趣从七十分做到九十分，要牺牲全家大量的时间和精力，我可能会停下来想：\n这二十分，真的值得吗？\n以前我会觉得，“既然做了，就尽量做好”。\n现在我越来越觉得：\n成熟可能恰恰是，你明明知道怎样做到九十分，却主动允许它只做到六七十分。\n因为你知道，省下来的那三十分，要留给更重要的地方。\n⸻\n四\n所以我现在再看父母那一代，心态也发生了一些变化。\n我们很容易站在今天批判过去。\n为什么小时候没有好好培养我的兴趣？\n为什么没有关注我的情绪？\n为什么当年要生那么多孩子？\n为什么不能给每个孩子更多陪伴？\n这些问题当然可以讨论。\n但有时候，我们其实是在拿2026年的答案，去批改三四十年前的一张试卷。\n时代不一样，题目也不一样。\n过去一些地方需要更多劳动力，一些家庭会觉得孩子多意味着家庭抵御风险的能力更强；整个社会对于生育、家庭和教育的理解，也和今天完全不同。\n这不是说过去的一切都是对的。\n但是，理解，不等于同意。\n只是当你理解一个人为什么会形成这样的标准，你才有可能真正解决今天的问题。\n否则两代人的沟通很容易变成：\n“我们以前几个孩子不也这样带大了吗？”\n“你们那套早就过时了。”\n然后双方都觉得自己有道理。\n但问题根本没有被解决。\n问题从来不是：\n谁的育儿理念更高级？\n而是：\n我们这个家庭现在只有这么多时间、钱和精力，应该怎么分？\n⸻\n五\n从这个角度看，很多所谓的“代沟”，其实都是资源配置问题。\n上一代人的默认策略是：\n降低单项标准，维持整个家庭运转。\n我们这一代人的默认策略则更像：\n提高单项标准，希望重要的事情都被认真对待。\n两种策略都有道理，也都有代价。\n前一种容易忽略一些真正重要的东西。\n后一种则很容易把整个家庭拖得精疲力尽。\n真正需要做的，可能不是证明哪一代人对。\n而是重新画一条线：\n哪些事情必须九十分？\n哪些事情七十分就够了？\n哪些事情甚至六十分也没关系？\n比如安全问题，我不会妥协。\n一些真正影响孩子长期成长的事情，我愿意投入更多注意力。\n但有些兴趣班少上一节，有些活动没有参加，有一天没有高质量陪伴，甚至偶尔让孩子无聊一会儿——\n可能真的没那么严重。\n一个家庭最重要的能力，不是把所有事情都做到最好，而是知道什么事情值得做好。\n⸻\n六\n所以，如果“鸡娃”意味着每一个维度都不能落后，每一种能力都要培养，每一件正确的事情都要做到九十分——\n那有了两个孩子以后，我决定退出这个“鸡娃圈”。\n不是因为我突然觉得教育不重要了。\n恰恰相反。\n是因为我开始觉得，真正重视教育的人，更应该知道把资源花在哪里。\n我的时间是有限的。\n我的注意力是有限的。\n我的情绪容量也是有限的。\n孩子的时间同样有限。\n一个家庭一天也只有24小时。\n承认这些边界，不是降低标准。\n而是终于开始给标准排序。\n我们这一代人当然没必要回到父母那一代的生活方式。\n但我现在反而觉得，有一种能力，我们也许真的应该重新从他们身上学回来：\n允许生活有一点粗糙。\n饭不一定顿顿完美。\n兴趣不一定样样坚持。\n陪伴不可能时时高质量。\n孩子也不需要在每一个维度都领先。\n有些事情做到九十分。\n有些做到七十分。\n有些六十分就让它过去。\n因为所谓家庭，从来不是一张要求每一科都考九十分的成绩单。\n真正的生活，是你只有一百分的精力，却有十件事情等着你做。\n最后，重要的不是每件事都做到九十分。\n而是要分辨——\n哪件事，值得那九十分。\n"},{"title":"我们早就不再“使用”互联网了",
"url":"/blog/wo-men-zao-jiu-bu-zai-shi-yong-hu-lian-wang-liao/",
"date":"2026-09-22",
"headings":[],
"body":"我以前在一个社交平台上的签名，叫做：\n“假装外向。”\n那时候我一直觉得自己是个内向的人。\n现实生活里，我不太喜欢成为人群的中心，也不是那种见到陌生人就能迅速聊起来的人。\n但在互联网上，我完全是另外一个样子。\n我会写很多东西，会主动表达自己的观点，也愿意跟完全不认识的人讨论问题。\n所以当时我觉得，互联网给了我一次“转身”的机会。\n现实里的我比较内向，那我就在互联网上做一个外向的人。\n我把它理解成一种角色扮演。\n就像戴上一张面具。\n但很多年以后，我越来越觉得：\n可能根本没有什么面具。\n因为面具是可以摘下来的。\n而互联网已经慢慢长进我们的生活里了。\n⸻\n01\n我们过去很喜欢把互联网叫做“工具”。\n这个词其实暗含了一种关系：\n我是主体，它是工具。\n我要查东西的时候，打开搜索引擎。\n我要联系一个人的时候，打开聊天软件。\n我要买东西的时候，打开购物网站。\n用完，关掉。\n就像锤子一样。\n我要钉钉子的时候拿起来，不需要的时候放回工具箱。\n但今天的互联网显然已经不是这样了。\n你无聊的时候，会下意识拿起手机。\n突然想到一个问题，会搜索。\n看到一个有趣的东西，第一反应是分享。\n遇到一种现实里没人理解的爱好，会去网上找同好。\n有些话不愿意和身边的人讲，却愿意告诉一个从来没见过面的陌生人。\n甚至有时候你什么目的都没有，也会打开某个App。\n这时候互联网到底在帮你完成什么任务？\n很难说。\n因为你已经不是“有事才去使用它”了。\n你的一部分生活，本来就发生在那里。\n⸻\n02\n这也是为什么，我现在再看“互联网人格”这件事，会觉得它很有意思。\n我们以前会觉得：\n现实中的我是真的。\n互联网上的我，是一个账号，是一个人设，甚至是一张面具。\n但为什么一定是这样？\n一个现实生活里很安静的人，可能在网上写了十年文章。\n他认识了一群现实生活中永远不会认识的人。\n他的很多想法，只会在那里表达。\n他的某些兴趣，只有那里的人理解。\n甚至别人认识他、理解他最深的地方，恰恰不是现实世界，而是互联网。\n那你还能说，网上那个他是假的吗？\n好像不能。\n可能恰恰相反：\n互联网让一些在现实生活中没有机会出现的“自己”，获得了存在的空间。\n现实世界对一个人的容纳其实是有限的。\n你生活在一个具体的家庭里，进入一家具体的公司，身边只有那么几十、几百个人。\n他们未必理解你的兴趣，也未必关心你的想法。\n但互联网把这个范围突然扩大了。\n你喜欢一个极其冷门的游戏，有人和你聊。\n你研究一个没人关心的问题，有人愿意看。\n你写下一种很难解释的感受，可能有人在几千公里之外告诉你：\n“我也是。”\n于是一些原本只能留在脑子里的东西，开始有地方放了。\n这不是简单的“上网”。\n这是人的一部分生活空间，被搬到了互联网上。\n⸻\n03\n所以我们为什么越来越离不开互联网？\n我们很容易把答案归结为“方便”。\n因为工作要用，因为信息在里面，因为支付、导航、购物都离不开它。\n这些当然是真的。\n但我觉得还有一个更深的原因：\n我们已经把太多的自己放进去了。\n你的朋友在那里。\n你的兴趣在那里。\n你的表达在那里。\n你的记录在那里。\n你认识的一些人甚至只存在于那里。\n你可能从来没有见过他们，却认识了很多年。\n到了这个时候，“离开互联网”就已经不像“不用一个工具”那么简单了。\n假设明天开始，我不用计算器了。\n没关系，我可以手算。\n不用某个办公软件，也没关系，我可以换一个。\n工具是可以被替换的。\n但如果一个东西已经参与组成了你的日常生活，事情就不一样了。\n这也是我觉得未来AI真正值得观察的地方。\n我们今天也习惯问：\nAI是什么工具？\n它能提高多少效率？\n它能替我完成什么工作？\n但也许判断一种技术真正改变人类的标志，从来不是它“能做多少事”。\n而是有一天，我们不再意识到自己正在使用它。\n互联网可能已经走到了这一步。\n我们不会每天早晨郑重地想：\n“我要开始使用互联网了。”\n我们只是醒来。\n然后生活。\n而互联网已经在里面。\n⸻\n所以我现在再看到自己以前那句：\n“假装外向。”\n会觉得挺有意思。\n当年的我大概真的以为，现实中的自己才是“本体”，互联网上只是临时创造出来的另一个人。\n但这么多年过去，我在互联网上写过的东西、认识的人、产生的想法、找到的兴趣，都已经反过来构成了今天的我。\n如果是这样，\n那到底从什么时候开始，\n互联网不再是我们使用的东西，而变成了“我们生活的一部分”？\n以及再往后一点——\n如果有一天AI也走到了这一步，我们还会把它叫做“工具”吗？\n"},{"title":"你可以给任何人贴标签，但千万别相信它",
"url":"/blog/ni-ke-yi-gei-ren-he-ren-tie-biao-qian-dan-qian-mo-bie-xiang-xin-ta/",
"date":"2026-09-21",
"headings":[],
"body":"我一直对所谓的“识人术”有一点警惕。\n尤其是有一种很常见的识人方式：\n看一个人的穿着，就知道他是什么性格；看一个人的家怎么装修，就知道他是什么层次；看他说话时的几个动作，就知道这个人值不值得深交。\n甚至有人会告诉你：\n一个人明明很有钱，家里却装修得非常低调，说明这个人城府很深。\n听起来很厉害。\n因为它给你一种感觉：\n我只看到了几个细节，就已经把这个人看透了。\n很多所谓的识人术、九型人格、MBTI，甚至星座，满足的其实都是类似的需求：\n把一个极其复杂的人，压缩成几个简单的词。\n内向。\n外向。\n理性。\n感性。\n善良。\n自私。\n城府深。\n控制欲强。\n但我慢慢发现一个问题：\n这些标签，很可能从一开始就是错的。\n一\n因为“一个人是什么样的人”，本身可能就是一个有问题的问题。\n比如你说：\n“他是一个很内向的人。”\n什么意思？\n他在公司里不爱讲话，但和几个认识十几年的朋友在一起，可以从晚上八点聊到凌晨两点。\n那他到底内向还是外向？\n你说一个人脾气很差。\n可是他对下属很严厉，对孩子非常温柔；工作出了问题会发火，但服务员上错菜，他反而会说没关系。\n那他的脾气到底好不好？\n再比如我们经常说：\n“这个人很善良。”\n可是一个人在没有利益冲突的时候善良，和在自己需要付出巨大代价的时候依然选择善良，完全是两件事。\n所以如果我真的想“测量”一个人，我甚至觉得应该像《楚门的世界》一样，为他设计一整个世界。\n不是观察他走路的时候有没有驼背，不是观察他说话的时候眼睛往哪里看，也不是看他家里的装修。\n而是不断给他真正的选择。\n而且这些选择必须有代价。\n利益和原则冲突的时候，他选什么？\n自己吃亏和别人吃亏之间，他选什么？\n没人知道和有人监督的时候，他又怎么选？\n一次还不够。\n要换不同的人、不同的关系、不同的利益、不同的人生阶段，反复观察。\n最后你可能得到的依然不是：\n“这是一个善良的人。”\n而是：\n在这些条件下，他大概率会做出这样的选择。\n这已经是我们能够得到的非常不错的结论了。\n因为人还会变。\n一个人结婚前对孩子的看法，和有了孩子以后可能完全不同。\n二十岁的你、三十岁的你、四十岁的你，面对同一个问题，都未必会做出同一个选择。\n所以我越来越觉得：\n用一个形容词概括一个人，本身就是一种非常粗糙的信息压缩。\n二\n但有意思的地方来了。\n既然标签这么不准确，为什么人类用了几千年，还是戒不掉？\n为什么各种人格测试、识人术、星座，总是一轮又一轮地流行？\n后来我发现，因为标签虽然不准确，但它真的很好用。\n假设你有一个领导。\n有时候很严厉，有时候又很好说话；对你要求很高，对另外一个同事却比较宽松；某些事情寸步不让，另外一些事情又完全不管。\n如果你认真分析：\n可能是因为事情的重要程度不同；\n可能是因为不同下属的能力不同；\n可能是因为他当天承受的压力不同；\n可能是因为他过去吃过某些亏；\n可能是因为他在某些领域控制欲强，在另一些领域根本不在乎……\n你会发现：\n太累了。\n如果我们对遇到的每一个人都进行这种分析，我们可能什么事情都不用干了。\n所以大脑需要压缩。\n“这个领导控制欲很强。”\n好了。\n分析结束。\n五分钟的问题，一句话解决了。\n这句话未必准确，但它替你的大脑暂时按下了停止键。\n三\n甚至在很多时候，标签的作用根本不是“认识一个人”。\n而是连接另外一个人。\n两个下属坐在一起：\n“我们领导就是特别喜欢控制别人。”\n“对对对，我也觉得。”\n关系一下就近了。\n但如果其中一个人说：\n“其实我觉得不能这么简单判断，他在A项目里控制得比较多，但是B项目里授权还是比较充分的，而且可能和团队成熟度以及项目风险有关……”\n气氛可能瞬间就没了。\n因为前一种交流交换的是态度。\n后一种交流交换的是分析。\n复杂的描述很难让两个人迅速站到一起，而一个简单的标签可以。\n“他是个烂人。”\n“她很绿茶。”\n“这个人特别装。”\n“我们老板就是抠。”\n这些话的信息量可能很低，社交效率却非常高。\n所以有时候，我们给别人贴标签，根本不是为了理解他。\n我们只是需要一个足够简单的词，来处理眼前的事情。\n四\n这让我想到我们做方案。\n一个复杂的问题摆在面前，你总得找一个地方下手。\n这个切入点可能并不完整。\n甚至可能是错的。\n但你必须先切一刀。\n否则一个无限复杂的问题，你根本无法开始处理。\n标签也是一样。\n假设我刚认识一个同事，发现他开会的时候很少主动表达。\n我暂时给他一个标签：\n“表达比较谨慎。”\n这个标签有没有可能错？\n当然有。\n但它可以帮助我做一个眼前的决定：\n下一次开会，我不要突然点他回答一个开放性问题，可以提前把议题发给他，让他准备一下。\n这时候，标签是有用的。\n问题出在哪里？\n问题出在半年以后，我依然认为：\n“他就是一个不擅长表达的人。”\n甚至有一个需要公开表达的机会，我直接把他排除了。\n你看，同样一个标签，性质已经完全变了。\n一开始它只是：\n“为了完成眼前这个任务，我暂时这样理解你。”\n后来却变成：\n“你就是这样的人。”\n前者是工具。\n后者是判决。\n五\n所以我现在觉得，真正值得警惕的从来不是“给人贴标签”。\n因为我们根本做不到完全不贴标签。\n人脑需要分类，需要概括，需要压缩信息。\n否则这个世界复杂到根本无法处理。\n真正危险的是：\n我们忘记了标签为什么被创造出来。\n标签应该服务于一个具体的问题。\n我要怎么和这个人沟通？\n我要怎么给他安排工作？\n这件事情我要不要找他合作？\n发生冲突的时候，我应该用什么方式处理？\n为了回答这些问题，我们可以建立一些临时的判断。\n但问题结束以后，你应该知道：\n那个标签并不是这个人。\n就像数据标注一样。\n同一个对象，因为任务不同，可以拥有完全不同的标签。\n你今天想研究消费能力，可以把一个人标成“高消费人群”。\n明天研究家庭结构，他可能变成“二孩家庭”。\n后天研究游戏用户，他又成了“重度玩家”。\n哪一个才是真正的他？\n都可以是。\n但都不是全部的他。\n标签描述的从来不是一个完整的人。\n它只是为了某一个目的，从一个人身上截取出来的一小块信息。\n六\n所以我反而不再追求一种特别厉害的“识人术”。\n那种看一个动作、一个眼神、一间房子的装修，就敢告诉你“这个人的本质是什么”的能力，我甚至觉得应该保持一点距离。\n因为一个人越相信自己能够迅速看透别人，他可能越容易忽略那些不符合自己判断的信息。\n真正有用的能力，可能恰恰相反：\n我可以快速形成判断，但我始终允许这个判断被推翻。\n我可以说：\n“按照我目前和他合作的经验，他在涉及利益分配时会比较谨慎。”\n而不是：\n“他这个人就是自私。”\n我可以说：\n“目前这种会议形式下，他不太主动表达。”\n而不是：\n“他就是一个内向的人。”\n前一种说法，永远给现实留下修改答案的空间。\n后一种说法，却已经替一个活生生的人写好了人物设定。\n我们当然需要标签。\n没有标签，我们甚至很难思考。\n但最好始终记得：\n标签是我们为了处理世界而画出来的地图，不是世界本身。\n地图可以粗糙，可以画错，可以随时修改。\n最怕的不是地图不准。\n而是有一天，我们拿着自己画的那张地图，看着眼前真实的山川河流，却开始觉得——\n一定是这个世界画错了。\n"},{"title":"我们一边嫌孩子没主见，一边又要求他听话",
"url":"/blog/wo-men-yi-bian-xian-hai-zi-mei-zhu-jian-yi-bian-you-yao-qiu-ta-ting-hua/",
"date":"2026-09-21",
"headings":[],
"body":"有一个挺奇怪的育儿现象。\n孩子吃饭磨磨蹭蹭，不肯吃青菜，我们会生气：\n“你怎么这么不听话？”\n带他出门，他非要往另外一个方向跑，我们又觉得：\n“怎么说都不听。”\n可是有一天，你带他出去跟其他小朋友玩。\n别人说玩什么，他就玩什么；别人说去哪里，他就去哪里；别人抢他的玩具，他也不敢说什么。\n这时候父母反而开始着急：\n“这个孩子怎么一点主见都没有？”\n仔细想想，这两种要求其实是矛盾的。\n我们希望孩子听话。\n但我们又不希望他真的成为一个“听话的人”。\n⸻\n一\n“听话”可能根本不是一种性格\n我们经常评价一个孩子：\n“这个孩子很乖。”\n“这个孩子特别听话。”\n但“听话”到底是什么意思？\n是每天按时吃饭？\n是认真上学？\n是父母叫他不要做什么，他马上停下来？\n还是大人说什么，他都觉得是对的？\n你会发现，“听话”其实是一个非常模糊的词。\n甚至同一个孩子，同一种行为，换一个对象，我们的评价都会完全不同。\n他听父母的话，我们说他乖。\n他什么都听同学的，我们又说他没主见。\n所以很多时候，我们在意的可能根本不是孩子“听不听话”。\n而是：\n他听谁的话。\n这就让“听话”这件事变得很有意思了。\n当父母说“我希望孩子听话”的时候，真正的意思常常是：\n我希望他在我认为重要的事情上，按照我的判断行动。\n这当然不一定有什么问题。\n一个五岁的孩子不可能拥有和成年人一样的判断能力。\n真正的问题是，我们很容易慢慢把两件事情混在一起：\n遵守规则，和服从我。\n⸻\n二\n为什么父母特别容易把“规则”变成“听我的”？\n因为后者真的简单太多了。\n比如吃饭。\n最简单的处理方式是什么？\n“赶紧吃。”\n“不要玩了。”\n“我数到三。”\n“再不吃以后不给你买零食了。”\n因为我们的目标很明确：\n我现在只想让这顿饭赶紧结束。\n但如果真的把它当成一个规则问题，事情马上就复杂了。\n为什么饭前不能一直吃零食？\n几点吃饭？\n吃多少是孩子决定，还是父母决定？\n不吃饭以后饿了怎么办？\n是不是所有东西都必须吃完？\n孩子说自己饱了，我相不相信？\n这些问题没有一句“听话”那么简单。\n再比如上学。\n一句：\n“每个人都要上学，你必须去。”\n当然最省事。\n可是如果孩子真的问：\n“我为什么要上学？”\n父母反而要开始解释一大堆东西。\n学校是干什么的。\n为什么人要学习。\n为什么不能每天待在家里。\n为什么有些事情即使今天不喜欢，还是需要去做。\n甚至有些问题，我们自己都未必想得那么清楚。\n所以很多时候，“听话”其实是一种非常高效的管理工具。\n它跳过了解释、协商、试错和建立规则的过程，直接得到了一个结果。\n而做父母的人每天已经很累了。\n谁有精力每件事情都开一场家庭辩论会？\n所以父母会使用自己的权力，这本身很正常。\n问题只在于：\n我们不能因为它好用，就误以为这就是教育本身。\n⸻\n三\n权力可以快速制造秩序，但规则是在教孩子以后没有你怎么办\n有些事情，父母就是要直接做决定。\n比如孩子突然往马路上跑。\n这个时候你不可能蹲下来跟一个四岁的孩子讨论：\n“宝贝，你觉得汽车以每小时四十公里的速度行驶，撞到人体会发生什么？”\n你就是要一把把他拉回来。\n因为安全优先。\n这时候孩子甚至不需要完全理解。\n先服从，再解释。\n但另外一些事情不是这样。\n比如每天饭前吃很多零食。\n你当然也可以每天靠吼：\n“不准吃！”\n只要父母在旁边，这套办法可能一直有效。\n但真正的规则应该慢慢变成：\n我知道为什么饭前不能一直吃零食；\n我知道吃了以后可能吃不下饭；\n我也知道如果我选择不吃晚饭，晚一点饿了，并不一定马上会有另外一顿专门为我准备的饭。\n这时候孩子遵守的已经不是：\n“妈妈不让我吃。”\n而是：\n“我知道这件事情会有什么后果。”\n两者表面上可能完全一样。\n孩子都没有吃那包零食。\n但内在发生的事情完全不同。\n前一种秩序依赖的是权力在场。\n后一种秩序开始依赖的是规则内化。\n这可能才是父母真正想要的东西。\n因为我们教育孩子，最终不是为了让他在我们面前表现得很好。\n而是为了有一天我们不在旁边的时候，他仍然知道自己该怎么办。\n⸻\n四\n最麻烦的是，我们经常想同时拥有两种孩子\n我觉得这是现代父母最纠结的地方。\n我们已经不像上一代那么相信“乖就是好”。\n我们会看很多育儿书，会强调独立人格，会希望孩子勇敢、有想法、有创造力。\n我们希望他说：\n“我不同意。”\n“我想试试另外一种办法。”\n“为什么一定要这样？”\n可问题来了。\n当这些品质真的出现在家里的时候，我们又受不了了。\n因为一个有主见的孩子，不可能只在你希望他有主见的时候有主见。\n他不会精准地做到：\n在学校大胆质疑；\n和同学相处坚持自己；\n遇到陌生人勇敢说不；\n回到家以后立刻切换模式——\n妈妈说什么都对。\n如果一个孩子真的开始形成自己的判断，他一定会把这种判断用在父母身上。\n他会问：\n“为什么？”\n他会说：\n“我不要。”\n他会觉得你的规则不合理。\n甚至有时候，他的理由非常幼稚，非常错误，非常让人抓狂。\n但这恰恰是一个很容易被忽略的事实：\n你希望孩子拥有的很多优秀品质，在小时候看起来并不一定那么“优秀”。\n独立，小时候可能表现为固执。\n好奇，可能表现为问题特别多。\n坚持自己，可能表现为不好说服。\n敢于质疑，首先质疑的可能就是父母。\n我们不能一边训练孩子“不要挑战我的判断”，一边又期待十八岁以后，他突然变成一个特别有判断力的人。\n⸻\n五\n所以问题从来不是：孩子到底该不该听话\n这个问题本身可能就问错了。\n真正应该区分的是三件事。\n有些事情，需要服从。\n汽车开过来的时候，不讨论。\n危险的东西不能碰，不讨论。\n年龄越小，这样的事情可能越多。\n有些事情，需要遵守规则。\n吃饭、睡觉、上学、使用电子产品、和别人相处。\n这些事情不是“爸爸妈妈永远正确”，而是家庭和社会需要一些稳定的规则才能运转。\n规则可以解释，可以随着年龄调整，有时候甚至可以讨论。\n还有一些事情，本来就应该让孩子自己决定。\n喜欢什么颜色。\n想跟谁做朋友。\n想先玩哪个玩具。\n觉得这件衣服好不好看。\n甚至在一些不会造成严重后果的事情上，允许他做一个我们明知道“不太聪明”的决定。\n因为判断力不是听父母讲出来的。\n判断力是在一次次选择和承担结果里面长出来的。\n⸻\n所以我慢慢觉得，“孩子听不听话”可能并不是一个特别有价值的评价。\n一个孩子今天顶了你一句嘴，不代表他有主见。\n一个孩子今天乖乖把饭吃完，也不代表他被压抑了。\n值得观察的是：\n他为什么听？\n他为什么不听？\n是因为理解规则，所以愿意遵守？\n是因为害怕父母，所以不敢反抗？\n还是因为他有自己的理由，并且愿意承担这个选择带来的结果？\n这三种孩子，表面上可能看起来差不多，内在却完全不同。\n父母真正要做的，或许也不是培养一个“听话的孩子”，更不是刻意培养一个“不听话的孩子”。\n而是慢慢把一种最初只能依靠父母权力维持的生活——\n变成孩子即使离开父母，也能够自己运行的生活。\n因为孩子总有一天不会再听我们的。\n而教育真正要解决的问题，本来就是：\n到了那一天，他听谁的？\n最好不是盲目听任何人的。\n而是开始听得懂道理，也听得见自己。\n"},{"title":"别再说 AI 时代拼审美了，很多人连“审美”是什么都没搞清楚",
"url":"/blog/bie-zai-shuo-ai-shi-dai-pin-shen-mei-liao-hen-duo-ren-lian-shen-mei-shi-shen-me-du-mei-gao-qing-chu/",
"date":"2026-09-20",
"headings":[],
"body":"最近经常听到一句话：\nAI 时代，最后拼的是审美。\n逻辑听起来很合理。\n以前你想做一个漂亮的视频，要会摄影、剪辑、调色、特效；想做一张图，要会构图、绘画、设计软件。\n现在这些执行能力正在被 AI 快速拉平。\n于是大家自然得出一个结论：\n当“怎么做”不再稀缺，最后剩下的就是“做什么”。\n所以，未来最值钱的是审美。\n但我最近发现，这句话可能把“审美”说得太玄了。\n因为我们一说到审美，很容易想到一个人看过很多电影，去过很多画展，听得懂古典音乐，能欣赏一些曲高和寡的作品。\n好像看的好东西足够多，审美自然就会变好。\n可如果真是这样，就会出现一个很奇怪的问题：\n一个特别懂艺术的人，为什么不一定能做出大众喜欢的作品？\n反过来，一个能持续做出爆款的人，难道就一定比收藏家、画廊策展人、电影学者的“审美”更高吗？\n好像也不能这么说。\n所以我开始怀疑：\n我们今天所谓的“审美”，可能根本不是一种单纯的审美能力。\n它更接近一种——判断力。\n⸻\n01\n最近我在看 AI 视频创作者DiDi_ok的作品。\n比如《Sign》，以及他最近的《Candy》。\n我看这些作品时，一个很强烈的感受是：\n它不是简单的“AI 画面很好看”。\n而是大量不同的东西被组织在了一起。\n虚化、构图、镜头运动、转场、节奏、色彩、视觉隐喻……\n单独拿一个出来，似乎都不是什么秘密。\n甚至今天你把截图丢给 AI，它可能都能告诉你：\n这个镜头用了什么景别，为什么这里要虚化，为什么这里要快速剪辑。\n真正困难的反而是：\n为什么偏偏是这里用？\n为什么这个地方应该切镜头？\n为什么这里应该停？\n为什么这个画面应该克制，另一个地方却应该把视觉刺激拉满？\n为什么几十个甚至几百个充满创意的镜头放在一起，没有彻底散掉，反而还能围绕一个主题，形成节奏和高潮？\n这时候我突然发现：\n所谓“审美好”，可能并不是这个人比别人更容易感受到“美”。\n而是面对无数种可能性的时候，他更会选。\n⸻\n02\n如果这么理解，审美一下就没那么神秘了。\n它甚至很像一个工具库。\n比如一个导演脑子里可能有很多这样的东西：\n我想让观众感觉不安，可以怎么做？\n我想表达人物的孤独，可以怎么做？\n我想让这个场景突然产生荒诞感，可以怎么做？\n我要让观众意识到某件东西很重要，但又不能直接告诉他，可以怎么做？\n普通人面对这些问题，脑子里可能只有一两个答案。\n而一个经验丰富的创作者，脑子里可能瞬间跳出十几个方案。\n但这还不是最重要的。\n因为 AI 也可以一次给你十几个方案。\n真正的差距在下一步：\n十几个方案摆在面前，你选哪个？\n这才是判断。\n所以我更愿意把所谓的审美理解成一条“判断工具链”。\n你见过足够多的东西，所以脑子里有足够多的可能性；\n你分析过这些东西为什么有效，所以知道它们分别适合什么场景；\n你自己做过，又得到过真实反馈，所以知道哪些东西只是自己觉得酷，哪些东西真的能让观众产生反应。\n最后，这些东西渐渐沉淀成一种直觉。\n别人看起来觉得：\n“这个人真有审美。”\n但他脑子里发生的事情可能根本没有那么浪漫。\n更像是：\n见过、分析过、试过、错过、反馈过，然后下一次选得更准。\n⸻\n03\n所以审美的形成，可能比我们想象中更像做实验。\n这也是我以前容易忽略的一点。\n我们很容易把优秀创作者想象成这样：\n他看了很多伟大的作品，被美好的东西熏陶，于是某一天灵感降临，他也创作出了一个伟大的作品。\n这当然可能发生。\n但大量成熟创作者真正经历的过程，可能平淡得多。\n做一个东西。\n发出去。\n没人看。\n再做一个。\n发现这个地方大家特别喜欢。\n再试一次。\n发现换一种表达就不行。\n于是开始分析两者有什么区别。\n下一次再调整。\n做了几十次以后，他开始隐约知道什么东西有效。\n做了几百次以后，很多判断甚至不再需要思考。\n他会觉得：\n这里不对。\n这个镜头太满了。\n这个转场虽然炫，但不应该放在这里。\n这个画面很好看，但是应该删。\n别人问他为什么，他甚至不一定马上说得清楚。\n于是我们把这种能力叫作：\n审美。\n但如果把这个过程倒回去看，你会发现：\n它很可能是一轮又一轮实验压缩出来的判断。\n作品是实验，观众是反馈，下一部作品是迭代。\n所谓品味，只是大量实验之后留在脑子里的结果。\n⸻\n04\n这也解释了一个问题：\n为什么只“多看好作品”，不一定能提高审美？\n因为看见，和建立判断，是两回事。\n一个人可以看一千部电影。\n看到漂亮镜头的时候说：\n“哇，好有电影感。”\n然后继续看下一部。\n一千部看完，他可能依然不知道：\n这个镜头为什么出现在这里？\n如果换一个位置还成立吗？\n导演还有没有其他选择？\n为什么最后没选其他方案？\n这个东西如果放到短视频里还有效吗？\n如果面对的是另一群观众呢？\n这就像一个人天天去米其林餐厅吃饭，不代表他会做菜。\n真正有价值的不是：\n“我见过很多好东西。”\n而是：\n“我知道它为什么好，以及在什么情况下它会失效。”\n这两者之间差得非常远。\n⸻\n05\n所以如果真的想训练所谓的“审美”，广度确实非常重要。\n因为你没见过的东西，很难凭空调用。\n你的脑子里只有三种表达方式，面对问题的时候，大概率只能在这三种里面选。\n而见过一百种的人，会拥有一百种可能性。\n但广度只是建立素材库。\n真正让素材变成能力的，是后面的几个循环：\n看见 → 拆解 → 尝试 → 反馈 → 修正 → 再尝试。\n慢慢地，外部的作品才会变成你内部的判断工具。\n所以我现在反而觉得，一个创作者最危险的状态不是“看的东西不够高级”。\n而是：\n看得很多，却从来不验证。\n收藏了一万个案例，关注了一百个大神，保存了一堆“高级感”“电影感”“神级运镜”。\n真正轮到自己做的时候，还是不知道该选哪个。\n因为那些东西只是存在收藏夹里。\n没有进入他的判断系统。\n⸻\n06\n这也是为什么 AI 出现以后，这种能力突然变得如此重要。\n以前，一个想法和一次实验之间隔着很长的距离。\n你想到一个镜头，可能要找演员、找场地、打灯、拍摄、剪辑。\n最后发现效果不好。\n一次实验就结束了。\n成本太高，所以很多判断根本没有机会被验证。\n但 AI 正在疯狂压低这个成本。\n以前你一天只能试一次。\n现在可能一天能试二十次。\n以前脑子里出现一个荒唐的想法，你第一反应是：\n算了，做不出来。\n现在第一反应变成了：\n试一下。\n这才是 AI 真正可怕的地方。\n它降低的不只是执行门槛。\n它降低了判断力的训练成本。\n你可以更快地产生方案，更快地看到结果，更快地发现自己判断错了，再更快地重来一次。\n所以未来真正被 AI 放大的，可能不是那些“天生有审美”的人。\n而是那些脑子里已经积累了大量判断，又愿意不断实验的人。\n他们以前有一百个想法，只能实现三个。\n现在，一百个都可以试。\n那套过去藏在脑子里的“判断工具链”，突然获得了巨大的杠杆。\n⸻\n07\n所以我现在不太喜欢一句话：\nAI 时代，拼的是审美。\n因为它太容易让人误以为：\n未来最重要的是多看一些高级的东西，把自己熏陶成一个“有品位的人”。\n我反而觉得更准确的说法应该是：\nAI 时代，拼的是判断。\n审美只是判断的一种。\n你面对大众，就要理解大众；\n你面对小众，就要理解小众；\n你做商业作品，就要知道什么能够传播；\n你做个人表达，也要知道自己究竟想表达什么。\n它们没有一套统一的“高级答案”。\n一个画廊收藏家的判断体系，和一个爆款视频创作者的判断体系，本来就可以完全不同。\n真正重要的不是谁“更高级”。\n而是：\n你面对自己的目标时，能不能持续做出有效的选择。\n而这种能力也远没有我们想象得那么玄。\n它不是坐在那里欣赏美好事物，然后突然获得的天赋。\n它可能恰恰来自最笨的一套循环：\n多看一点，多拆一点，多做一点，多错一点，再看看别人到底为什么喜欢。\n如此反复。\n直到有一天，别人看着你的作品说：\n这个人审美真好。\n而只有你自己知道，\n所谓审美，不过是你曾经做过的无数次实验，最后留在脑子里的判断。\n"},{"title":"有些苦，根本不值得吃",
"url":"/blog/you-xie-ku-gen-ben-bu-zhi-de-chi/",
"date":"2026-09-18",
"headings":[],
"body":"我玩解谜游戏的时候，经常会碰到一个很微妙的问题：\n到底什么时候应该看攻略？\n看得太早，游戏没意思。\n一个谜题刚摆在面前，自己还没怎么想，就打开攻略照着操作。确实很快，但原本属于你的那一部分探索也没了。\n可如果坚决不看，也会走向另一个极端。\n你可能在一个场景里来回跑半个小时，把所有机关试了一遍，最后打开攻略才发现：\n角落里有个箱子。\n只是你没看见。\n那一瞬间通常不会有什么“终于靠自己的努力成长了”的感觉。\n更多的是：\n早知道十分钟前就看攻略了。\n所以我后来觉得，“什么时候看攻略”其实是一个挺重要的问题。\n因为它和工作、学习里那个更普遍的问题几乎一模一样：\n什么时候应该自己扛，什么时候应该寻求帮助？\n而这个问题真正难的地方，并不是判断自己“还能不能坚持”。\n而是判断：\n眼前这个困难，到底值不值得我继续吃这个苦。\n⸻\n一\n我们很容易默认一件事：\n困难是有价值的。\n一个问题越难，自己解决它，成长就越大。\n所以工作中碰到不会的东西，我们会觉得最好先自己研究；学习一个新东西，也会觉得最好不要太依赖别人。\n这种想法当然没错。\n但它偷偷混淆了两件事：\n困难，和学习机会。\n它们不是一回事。\n假设我第一次做一个程序，以前从来没接触过类似的东西。\n我不知道应该怎么拆需求，不知道不同模块怎么连接，也不知道一个报错应该从哪里开始检查。\n这时候让我自己多折腾一会儿，是有价值的。\n因为我表面上是在解决一个程序的问题，实际上是在建立一套以前没有的东西：\n我开始知道应该从哪里排查，知道哪些信息重要，知道错误大概会出现在哪里，也开始形成对整个系统的理解。\n哪怕最后我还是没解决，去问了别人，前面两个小时也不一定浪费。\n因为这两个小时改变了我的认知结构。\n下一次再遇到类似的问题，我已经不是原来的我了。\n这才叫学习机会。\n所以真正值得吃的苦，有一个很重要的特征：\n这个困难虽然正在消耗你，但它同时也在改变你。\n问题解决之后，有一些东西会留下来。\n可能是一种判断，可能是一套思路，可能是一项技能，也可能只是让你以后知道：原来这种问题应该先检查这里。\n这部分留下来的东西，才是困难真正的价值。\n⸻\n二\n但有些困难不是这样。\n你今天遇到它，折腾两个小时。\n下个月又遇到它，又折腾两个小时。\n半年以后再遇到一次，你还是从头搜索、从头问人、从头试。\n表面看起来，你每一次都在“解决困难”。\n实际上你可能一次都没有真正解决它。\n因为你解决的是这一次的问题，却没有解决“以后还会遇到这个问题”这件事。\n这就不是学习了。\n这是重复缴学费。\n比如一项工作每个月都要做一次，每次都要到处找数据、核对口径、问同样的人、复制同样的表格。\n第一次这么做，很正常。\n第二次，你可能还在熟悉。\n但如果第十次还是这样，那么问题已经不再是“这个工作很复杂”。\n真正的问题变成了：\n为什么前九次的经验没有留下任何东西？\n你应该开始做模板、写规则、留记录，甚至做自动化。\n因为真正的学习，不是让自己下一次更熟练地受苦。\n而是让某些苦以后不必再吃。\n这一点很容易被忽略。\n我们经常把“独立解决问题”理解成一种能力，却很少追问：\n为什么这个问题还需要你独立解决第十次？\n一个人的能力如果真的在增长，应该慢慢出现一个结果：\n旧问题越来越便宜，新问题越来越多。\n以前要花两个小时的问题，现在十分钟解决。\n以前需要到处问人的事情，现在有一套自己的判断。\n以前每次都要重新搜索的资料，现在已经沉淀成了工具、文档或者流程。\n省出来的时间，再拿去碰自己没碰过的问题。\n这才是学习的复利。\n⸻\n三\n所以我现在越来越不觉得“能吃苦”本身是什么值得追求的能力。\n更重要的是：\n你要会挑苦吃。\n一个以前从来没有处理过的问题，可以多坚持一下。\n因为你正在建立新的能力。\n一个已经遇到很多次的问题，则应该尽快把它变成流程、工具和经验。\n因为你真正应该学习的，不是怎么再解决一次，而是怎么让它以后不再成为问题。\n还有一些问题，本身几乎没有什么学习价值。\n就像解谜游戏里那个藏在阴影里的箱子。\n你没有发现它，并不是因为你的逻辑推理能力不够，也不是因为你没有掌握某种重要的方法。\n你只是没看见。\n继续在地图里跑两个小时，并不会让你获得两个小时的成长。\n这时候看一眼攻略，反而是更好的选择。\n因为攻略帮你跳过了一个低价值的卡点，让你重新回到真正有意思的问题上。\n所以，“坚持多久再求助”其实没有一个统一答案。\n半小时、一小时、一天，都只是非常粗糙的规则。\n真正应该观察的是另一件事：\n我的思考还在向前走吗？\n如果我不断提出新的假设、排除新的可能、理解新的东西，那么即使两个小时没有答案，这两个小时也可能很值。\n但如果过去二十分钟，我只是在重复同样的动作——刷新页面、重新搜索、来回检查、盲目尝试——那么继续坚持可能已经不是独立思考了。\n只是卡住而已。\n真正该求助的时刻，往往不是时间耗尽的时候，而是学习开始停止的时候。\n⸻\n四\n但这又带来另一个问题。\n既然遇到低价值的困难应该尽早求助，那是不是以后碰到问题就直接找人？\n也不是。\n因为求助本身也是一种能力。\n我有时候会碰到一种很难回答的问题：\n“怎么用某某主流 AI 工具？”\n这个问题看起来很简单，实际上几乎没法回答。\n因为我根本不知道你在哪里。\n是网站打不开？\n账号注册不了？\n不知道怎么付费？\n还是已经登录了，只是不知道某个功能在哪里？\n如果我要认真回答，就得从网络、账号、付费、界面、功能一路讲下来。\n对方只问了一句话，却把一个巨大的问题空间全部交给了我。\n所以好的求助，并不是：\n“我不会，你告诉我怎么做。”\n而应该是：\n“我已经走到这里了，现在卡在这里。”\n这两句话的差别非常大。\n因为在你能够准确描述自己“卡在哪里”之前，你通常已经做了一轮非常重要的学习：\n你拆过问题了。\n你试过几条路了。\n你排除了一些可能。\n你甚至已经隐约知道问题可能出在哪里，只是缺最后一块信息。\n这时候别人帮你，成本很低。\n他可能只需要说一句：\n“你检查一下账号地区。”\n你马上就能继续往下走。\n而且这个答案真正进入了你的知识体系。\n下一次遇到类似的问题，你会知道“地区”也是一个检查维度。\n所以我觉得，最好的求助不是把问题交出去，而是借别人的知识跨过自己暂时跨不过去的那一步。\n这也是为什么那些真正会提问的人，往往学得很快。\n他们并不是更少求助。\n有时候恰恰相反，他们非常喜欢问人。\n只是他们不会把整个问题扔给别人。\n他们先自己走一段，把问题空间越缩越小，直到最后变成一个非常具体的问题。\n然后借别人一下力。\n跨过去。\n再自己走。\n⸻\n五\n这么想以后，我反而觉得游戏里的攻略是一个特别好的比喻。\n完全不看攻略，不一定代表你厉害。\n从头到尾照着攻略走，也不一定有什么问题，只是你主动放弃了一部分探索。\n真正有意思的状态可能在两者之间：\n自己解决那些值得解决的问题，用攻略跳过那些不值得卡住的地方。\n工作和学习也是一样。\n第一次遇到的问题，不要急着逃。\n它可能正在给你增加一个新的能力。\n反复出现的问题，不要每次重新受苦。\n想办法把它沉淀下来。\n而那些已经让你的思考停止，只剩下机械试错的问题，也不要把坚持本身当成美德。\n去查资料。\n去问 AI。\n去找一个懂的人。\n但在开口之前，至少先走到一个你能够说清楚的位置：\n我做过什么，我排除了什么，我现在具体卡在哪里。\n因为真正会学习的人，既不是永远独立解决问题的人，也不是最擅长寻找答案的人。\n他更像一个很会分配自己注意力的人。\n他知道哪些地方应该慢一点，让自己真正想明白。\n也知道哪些地方应该直接跳过去，不值得浪费生命。\n会学习的人，不是更能吃苦。\n而是知道什么苦值得吃，什么苦吃过一次，就不该再吃第二次。\n"},{"title":"AI 时代，学习终于从“跑图”变成了“传送”",
"url":"/blog/ai-shi-dai-xue-xi-zhong-yu-cong-pao-tu-bian-cheng-liao-chuan-song/",
"date":"2026-09-17",
"headings":[],
"body":"我以前学一个新软件，很喜欢先找教程。\n而且最好是那种完整教程。\n比如最近想学 Blender，我第一反应还是：找一套系统课程，从第一课开始，一节一节往下看。\n这其实是我们非常熟悉的一种学习方式。\n第一课讲界面，第二课讲基础操作，第三课讲建模，第四课讲材质……\n老师把知识按照他认为合理的顺序排好，我们跟着走。\n看起来非常科学：循序渐进。\n但我最近慢慢发现一个问题：\n所谓“循序渐进”，到底是谁的“序”？\n是老师的序，是教材的序，是课程设计者的序。\n却未必是学习者的序。\n⸻\n一套 40 分钟的教程，为什么经常要学两个小时？\n因为视频里的 40 分钟，和你的 40 分钟根本不是一回事。\n老师点一下：“这里我们加一个修改器。”\n他可能两秒钟就过去了。\n你却停下来了：\n修改器在哪里？\n为什么我的界面跟他的不一样？\n这个参数是什么意思？\n我刚才是不是漏了一步？\n于是暂停、倒退、搜索、重新操作。\n一个地方卡十分钟，另一个地方再卡二十分钟。\n本来 40 分钟的课，最后学了两个小时。\n更麻烦的是，可能前面 20 分钟讲的东西你早就会了。\n你真正不会的，只有中间那一个操作。\n可为了找到它，你还是得“跑图”。\n从头开始，一点点往前走。\n这很像以前的线性游戏。\n第一章打完才能进第二章，穿过森林才能到城镇，过了这个 Boss 才能去下一个区域。\n课程表，本质上就是一张线性地图。\n它规定了：\n你先去哪里，再去哪里；\n先学什么，再学什么；\n什么时候遇到这个知识点，什么时候才能遇到下一个知识点。\n以前我们觉得学习就应该这样。\n可能并不是因为这是最好的学习方式。\n而是因为过去，我们没有更好的办法。\n⸻\n以前真正昂贵的，不是知识，而是“找到答案”\n以前遇到一个问题，怎么办？\n等老师讲。\n翻教材。\n去图书馆。\n上网搜论坛。\n打开一个两小时的视频，拖着进度条找那个不知道藏在哪里的答案。\n甚至有时候，你都不知道应该搜什么关键词。\n老师当然可以回答你。\n但老师不会 24 小时坐在你旁边。\n课程也不会因为你某个前置知识没学会，就突然停下来，为你重新设计接下来三节课。\n所以过去的教育必须提前设计路线。\n因为答案的获取成本太高。\n老师必须假设：\n“既然我不知道你什么时候会遇到什么问题，那我干脆提前把你可能需要的东西都教一遍。”\n这其实就是一种 Just in Case 的学习。\n这个以后可能有用，先学。\n那个以后可能遇到，先记。\n至于什么时候真正用到？\n以后再说。\n这套方法当然有价值。\n问题是，它天然会产生大量“跑图时间”。\n⸻\nAI 出现以后，学习突然变成了开放世界\nAI 真正改变学习的地方，可能并不只是“帮我们回答问题”。\n而是它把获取答案的成本突然降得非常低。\n我在 Blender 里真的想做一个东西。\n做到一半发现不会了：\n怎么把这个面挤出来？\n问。\n材质为什么没有显示？\n问。\n这个灯为什么照出来这么奇怪？\n问。\n我连这个按钮叫什么都不知道怎么办？\n截图，问。\n于是学习顺序发生了一个很有意思的变化：\n以前是：\n先学习 → 再练习 → 最后希望有一天用得上。\n现在可以变成：\n先去做 → 遇到问题 → 学习 → 继续做。\n这就是 Just in Time。\n我不是按照老师预计我什么时候需要这个知识来学习。\n而是按照：\n我什么时候真的需要它，我什么时候学。\n这时候，学习突然从线性游戏变成了开放世界。\n我的目标可能只是：\n“我想用 Blender 做出这个东西。”\n那我就朝着这个目标走。\n走到哪里卡住，就在哪里补知识。\n发现一个前置知识不会，就往回补一层。\n补完继续走。\n又遇到问题，再补。\n问题本身，开始替代课程表，成为学习的导航系统。\n⸻\n但这是不是意味着课程已经没用了？\n恰恰不是。\n因为开放世界还有一个问题：\n你根本不知道地图上还有什么。\n一个完全没接触过 Blender 的人，甚至不知道什么叫 UV，不知道节点是什么，不知道骨骼、拓扑、雕刻、几何节点分别能干什么。\n你不知道一个东西存在，自然也不可能主动问它。\n这正是老师、教材和系统课程依然重要的地方。\n只是它们的角色可能变了。\n以前，课程既是地图，也是路线。\n老师告诉你世界上有什么，同时规定你应该怎么走。\n而现在，课程更适合只做“地图”。\n它告诉你：\n这个领域大概有哪些区域；\n哪些东西是基础；\n哪些知识互相连接；\n哪些坑大多数人都会遇到；\n还有哪些地方，是你目前根本不知道存在的。\n但知道地图上有什么，不代表每个地方都必须亲自跑一遍。\n这就像现在很多开放世界游戏。\n我打开地图，知道北边有一座城，南边有一个村庄，中间还有几个任务点。\n但我没必要为了“系统学习地图”，沿着每条路重新跑一次。\n我现在要去北边。\n那就直接传送过去。\n⸻\nAI 给学习增加的，可能就是一个“传送”功能\n我觉得这个变化特别重要。\n因为以前即使有教程这张地图，你仍然得跑图。\n一个两小时的视频，我只想知道其中一个操作，也得拖进度条找半天。\n一本 500 页的书，我只缺其中一个前置知识，也得自己判断它到底在哪一章。\n所以很多所谓“系统学习”的时间，其实并没有花在学习上。\n而是花在：\n寻找自己真正需要学习的东西。\nAI 相当于给这张地图增加了传送点。\n你已经懂的地方，不必再跑一次。\n现在不需要的地方，可以先不去。\n突然发现某个前置知识缺失，也不用硬着头皮继续跟课。\n直接传送回去。\n补完，再回来。\n所以 AI 时代真正值得重新设计的，也许不是“课程表”。\n而是学习步骤表。\n课程表关心的是：\n第一周学什么，第二周学什么，第三周学什么。\n学习步骤表关心的却是：\n你现在想做到什么？\n做到这里卡在哪里？\n缺哪个前置知识？\n补完以后，下一步是什么？\n前者以内容为中心。\n后者以学习者正在发生的问题为中心。\n⸻\n未来真正重要的，也许不是“把课上完”\n以前我们很容易产生一种奇怪的成就感：\n一套 30 节的 Blender 教程，我终于全部看完了。\n但仔细想想：\n看完到底意味着什么？\n游戏地图探索率 100%，并不意味着你真的完成了自己的目标。\n真正重要的应该是：\n我原来想做什么？\n现在能不能做出来？\n为了做到它，我还缺什么？\n如果已经能做到，那为什么一定要把剩下的 17 节课看完？\n当然，如果你不知道自己还有什么不知道的，就重新打开地图看看。\n看看课程目录，看看高手的作品，看看教材的知识结构。\n发现一个从来没听过、但可能很重要的区域，再进去探索。\n于是未来的学习可能会形成一种新的循环：\n先看地图，但不要急着跑完整张地图。\n先确定目标，然后出发。\n遇到问题，就地学习。\n需要前置知识，随时传送。\n走一段以后，再打开地图，看看自己遗漏了什么。\n然后继续走。\n⸻\n我现在越来越觉得，AI 对学习最大的改变，可能不是让老师讲得更好，也不是让课程制作得更快。\n而是它第一次让普通学习者拥有了自己决定学习路线的能力。\n以前我们拿到一张地图，往往只能沿着别人画好的路线走。\n现在地图还在那里。\n老师也还在那里。\n教材、课程、视频也都还在那里。\n只是我们手里多了一个东西：\n传送按钮。\n从此以后，学习不一定非得从第一课开始。\n你可以先决定自己要去哪里。\n"},{"title":"工作十年后，我发现自己还不如一个小摊贩懂生意",
"url":"/blog/gong-zuo-shi-nian-hou-wo-fa-xian-zi-ji-huan-bu-ru-yi-ge-xiao-tan-fan-dong-sheng-yi/",
"date":"2026-09-17",
"headings":[],
"body":"有时候我会想一个挺奇怪的问题：\n一个在公司工作了十年的人，真的比一个摆了十年摊的人更懂怎么赚钱吗？\n未必。\n甚至在某些方面，答案可能恰恰相反。\n你可能做了十年行政，做了十年财务，做了十年运营，甚至做了十年产品、十年销售。\n你非常专业。\n你知道怎么做预算，怎么写方案，怎么开会，怎么推动跨部门协作，怎么把一个复杂项目拆成几十个节点，再一个个推进。\n但突然有一天，让你自己拿5000块钱出来，去市场上进一批货，然后把它卖掉。\n你可能一下子不知道该怎么办了。\n卖什么？\n卖给谁？\n进多少？\n定价多少？\n卖不掉怎么办？\n客户说贵怎么办？\n隔壁突然卖得比你便宜怎么办？\n更重要的是——\n你怎么知道自己判断的是对的？\n这时候你可能会发现：\n工作十年，和真正跟市场打了十年交道，是两回事。\n⸻\n一\n一个小摊贩每天面对的问题，其实非常残酷。\n今天进了1000块钱的货，晚上收摊的时候，只卖出去600块。\n没有人跟你开复盘会。\n没有人帮你分析是不是品牌部的问题，也没有人告诉你是不是渠道投放出了问题。\n市场只给你一个非常简单的答案：\n剩下的400块钱货还在你手上。\n你必须自己想为什么。\n是不是位置不对？\n是不是东西太贵？\n是不是今天下雨？\n是不是隔壁摊位卖了类似的东西？\n是不是年轻人根本不喜欢这个款？\n明天要不要少进一点？\n要不要换一个产品？\n要不要降价？\n要不要换个地方？\n这些决定看起来都很小。\n但它们有一个共同点：\n每一个决定，都直接和钱连接在一起。\n你判断对了，赚到钱。\n判断错了，自己承担损失。\n然后第二天继续。\n这其实是一种非常密集的市场训练。\n所以我渐渐理解，为什么有些地方会有很强的“做生意”文化。\n不一定是因为每个人最后都能成为大老板。\n而是只要你真的独立做过一门小生意，你就不得不完成一次商业闭环：\n找需求——选产品——投入成本——找到客户——完成交易——收到反馈——调整下一次决策。\n哪怕你只是摆一个很小的摊。\n这个闭环也是完整的。\n⸻\n二\n反过来看，现代企业有一个很有意思的特点：\n企业越来越会做生意了，但企业里的个人，却不一定需要会做完整的生意。\n因为组织存在的意义，本来就是分工。\n一个产品卖出去，可能涉及几十个环节。\n有人研究市场。\n有人开发产品。\n有人定价。\n有人投广告。\n有人做销售。\n有人交付。\n有人处理售后。\n有人负责财务。\n有人分析数据。\n当组织越来越成熟，每个人负责的那一小块也会越来越专业。\n这当然是一种进步。\n但它也带来了一个很容易被忽略的问题：\n你可能工作很多年，却从来没有独立完成过一次“从发现需求到赚到钱”的闭环。\n甚至销售也未必例外。\n你在一线发现某个产品特别好卖，或者发现客户其实需要另一种产品。\n你想试一下。\n但你不能直接试。\n你要告诉店长，店长告诉区域负责人，区域负责人再反馈给产品部门，产品部门再讨论研发、成本、合规、供应链……\n等整个流程跑完，那个市场节点可能早就过去了。\n这并不意味着企业的流程有问题。\n大组织当然不能让几百个人每天随意改变产品。\n问题在于：\n站在个人能力的角度，你失去了一种非常珍贵的东西——直接实验的机会。\n你很少能够说：\n我觉得这个东西能卖。\n那我今天就试试。\n明天市场直接告诉我答案。\n⸻\n三\n这也解释了一个我以前没有想明白的问题：\n为什么一个人在公司里表现得非常优秀，真正自己做生意的时候，却可能突然变得手足无措？\n不一定是执行力不够。\n也不一定是不够聪明。\n而是因为：\n他以前练的根本不是这个。\n公司训练了你很多非常有价值的能力。\n怎么在复杂组织里推进项目，怎么调动资源，怎么和不同部门协作，怎么管理几十个人，怎么把一件事情做得更加专业。\n这些能力当然重要。\n甚至很多小生意永远没有机会让你练到。\n一个小摊贩可能很懂客户，但他未必有机会管理一个几百人的项目。\n一个创业者可能很会卖东西，但他未必知道怎么建立一套可以复制到全国的管理体系。\n所以这里根本不是“打工好还是创业好”的问题。\n真正的问题是：\n你现在所在的位置，到底在训练你什么？\n以及——\n有什么能力，是这个位置永远不会主动训练你的？\n⸻\n四\n如果你在企业里工作，其实完全没必要因为这件事焦虑，更不需要为了“学习做生意”马上辞职。\n因为企业本身也是一个非常昂贵的训练场。\n公司花几百万做一个项目，你可能只承担其中一部分风险，却有机会参与。\n公司有成熟的品牌、客户、供应链、技术、管理体系，你可以在里面观察一个大型组织到底怎么运转。\n很多东西如果靠自己创业去学，学费可能贵得惊人。\n所以在企业里，真正值得做的，是尽量把自己的视野往前后多延伸一点。\n不要只问：\n“我的工作做完了吗？”\n还可以多问几个问题：\n这个东西最后卖给谁？\n客户为什么愿意付钱？\n钱到底从哪里进来？\n公司在这个客户身上花了多少钱？\n哪个产品真正赚钱？\n哪个产品看起来很热闹，其实不赚钱？\n如果把公司的品牌、渠道、团队全部拿掉，只剩下这个产品本身，它还能不能卖出去？\n这些问题未必属于你的岗位。\n但它们决定了你是在学习“完成工作”，还是在慢慢理解“生意为什么成立”。\n⸻\n五\n而如果有机会，你甚至可以做一点很小的市场实验。\n不一定是创业。\n更不一定是辞职。\n卖一个东西。\n做一个小产品。\n提供一次收费服务。\n甚至拿几百块钱试试看，有没有陌生人愿意为你的某个东西付钱。\n金额其实没那么重要。\n重要的是，你第一次把自己放到一个没有组织保护的位置上：\n没有老板给你目标，没有品牌替你背书，没有成熟产品给你卖，也没有固定工资告诉你“这个月干得还不错”。\n只有一个问题：\n有没有人愿意掏钱？\n那一刻，很多东西都会变得不一样。\n你会突然开始认真研究需求。\n开始在意成本。\n开始理解获客有多难。\n开始知道“别人说这个想法不错”和“别人愿意付199块钱”，完全是两件事情。\n你也会第一次发现：\n市场能力不是一个道理，而是一种需要反复练习的能力。\n就像游泳一样。\n看再多商业书，听再多创业故事，分析再多商业案例，都不能完全替代真正下水的那一次。\n⸻\n六\n所以现在我再看到一个小摊贩，不太会觉得“这不就是卖点东西吗”。\n因为换一个角度看，他每天其实都在进行一种很多白领很少有机会进行的训练。\n他的生意可能很小。\n他的管理可能很粗糙。\n他的收入甚至未必比一个白领高。\n但每天收摊的时候，他都会收到一张市场亲自批改的试卷。\n卖掉多少。\n剩下多少。\n赚了多少。\n亏了多少。\n明天还要不要继续。\n这种反馈非常残酷。\n但也非常珍贵。\n而我们在一个成熟组织里待得越久，有时候越容易忘记：\n工资是公司发给我们的。\n但公司的钱，最终是市场给的。\n如果有一天你希望自己能够独立做一个更大的项目，做一个自己的产品，甚至真的靠自己赚到更多的钱，那么有一种能力，可能迟早都要补回来：\n不是怎么把别人交给你的事情做好。\n而是从一片什么都没有的地方开始，\n找到一个需求，\n做出一个东西，\n然后试着让一个陌生人，\n愿意为它掏钱。\n这件事，一个摆摊的人可能第一天就在练。\n而有些人，\n工作了十年，还没有真正练过一次。\n"},{"title":"别急着躲开麻烦，那可能就是你最值钱的东西",
"url":"/blog/bie-ji-zhao-duo-kai-ma-fan-na-ke-neng-jiu-shi-ni-zui-zhi-qian-de-dong-xi/",
"date":"2026-09-16",
"headings":[],
"body":"最近我想在 Mac 上找一个更好用的翻译软件。\nMac 本身有翻译，但我用下来总觉得差一点。查一个单词还行，一旦碰到句子，效果就不太稳定。\n后来我找到了 Bob。\n用了之后发现，这个软件其实已经做得很好了。划词、翻译、查词，各种细节都考虑到了，而且价格也不贵。\n我本来还想过，要不要自己做一个。\n毕竟现在是 AI 时代，翻译本身已经不是什么技术难题。接一个大模型 API，再做一个简单的界面，理论上很快就能跑起来。\n但真要做的时候，我很快就不想做了。\n因为我发现：\n真正麻烦的，从来不是“翻译”这件事。\n而是翻译之外那一大堆东西。\n怎么取词？\n不同软件里的文字怎么识别？\n快捷键冲突怎么办？\n一句话和一个单词怎么分别处理？\nAPI 出问题怎么办？\n不同模型返回的格式不一样怎么办？\n这里没有任何一个问题特别高深。\n甚至你把它们单独拿出来，我可能都会觉得：\n这有什么难的？\n问题在于，它们太多了。\n一个麻烦不算什么。\n十个麻烦开始有点烦。\n当一百个麻烦被一个个解决掉以后，事情就完全不一样了。\n一百个不难的问题堆在一起，就开始变得很难复制。\n这时候我突然意识到：\n我们过去理解“护城河”，可能太喜欢寻找那个最难的东西了。\n⸻\n很多护城河，根本没有什么秘密\n我们一说到护城河，很容易想到某种别人不知道的核心技术。\n好像你一定要有一个神秘配方，一项别人突破不了的专利，或者某种极其高深的算法，才算真正的壁垒。\n但现实里，大量产品根本没有这样的东西。\n游戏就是一个很典型的例子。\n今天做一个 3D 游戏，角色跑起来、跳起来、攻击、碰撞，这些东西本身都不是什么秘密。\n游戏引擎已经帮你完成了大量底层工作。\n一个游戏火了以后，它的玩法也摆在所有人面前。\n大家都看得见。\n甚至连它为什么好玩，都可以分析出来。\n但你真的照着做一个，还是可能做不像。\n为什么？\n因为真正的差别可能藏在无数个很小的地方。\n角色跳起来的速度是多少，落地停顿多久，攻击前摇多少毫秒，镜头怎么移动，敌人在什么距离发动攻击，什么地方给玩家补给，什么地方安排一个存档点……\n这些东西有什么高深的吗？\n好像都没有。\n但问题是：\n人家已经试过了。\n他知道 0.8 不舒服，所以调成了 0.7。\n他知道这里放三个敌人太难，所以最后留下两个。\n他知道这个技能如果提前五分钟给玩家，后面的关卡体验会更好。\n你当然也可以重新试一遍。\n只是你得把人家踩过的坑，再踩一次。\n于是，真正拉开差距的，并不是“我知道一个你不知道的秘密”。\n而是：\n我已经解决过很多你还没有遇到的问题。\n⸻\n麻烦，其实是经验开始值钱的地方\n这件事放到工作里，我的感受更明显。\n最近很多同事也开始发现 AI 很好用。\n他们看到我会用 AI 自动处理一些信息，然后在群里播报，就会来问我：\n这个怎么做？\n一开始我觉得很好解释。\n我告诉他，用哪个 AI，然后跟它对话就行了。\n结果他做出来，跟我的不一样。\n那我再看。\n哦，原来 Prompt 不一样。\n于是我把 Prompt 给他。\n还是不行。\n为什么？\n因为我现在用的这个 Prompt，也不是第一天就写成这样的。\n它是我实际使用以后，一次次改出来的。\n第一次遇到一种异常，我加一条规则。\n第二次发现日期会搞错，我再加一条。\n第三次发现某种情况不能这么判断，我再修改。\n最后才变成现在这个版本。\n可即使把 Prompt 完整给别人，事情依然没有结束。\n万一公司原来的 AI 助手不能用了呢？\n我也遇到过。\n所以我以前又写过脚本。\n万一周末电脑不在身边怎么办？\n我又架了服务器。\n万一某个工具临时失效怎么办？\n我还有其他办法可以顶上去。\n回头看，每一步都没有什么了不起的技术。\n甚至我自己都会觉得：\n这不就是一个很简单的工作吗？\n但当别人真正想完整接过去的时候，我才发现：\n原来已经没那么简单了。\n因为我拥有的并不是一个工具，也不是一个 Prompt。\n而是一串经历：\n问题 1 出现过，我知道怎么处理。\n问题 2 出现过，我也处理过。\n问题 3、问题 4、问题 5……我都踩过。\n这些问题一个个出现的时候，都很烦。\n但等它们全部解决以后，它们反而一起变成了我的东西。\n⸻\n所以，有时候碰到麻烦，不一定是坏事\n工作中，我们很容易嫌一件事情麻烦。\n流程怎么这么复杂？\n为什么又出了一个特殊情况？\n为什么别人都能正常，到我这里偏偏出问题？\n当然，能简单解决的事情，没必要故意搞复杂。\n能自动化的流程，也应该尽量自动化。\n但有些麻烦是躲不掉的。\n而我现在反而觉得，这种麻烦出现的时候，值得多看它一眼。\n因为：\n一个麻烦出现，往往意味着现成的答案还不够好。\n如果所有人都已经把它解决得非常完美，你根本不会觉得它是麻烦。\n正因为这里还有摩擦，还有例外，还有东西没有被处理好，它才会让你难受。\n可这也意味着，这里可能恰恰存在积累经验的机会。\n你把它绕过去，只是少了一次麻烦。\n你把它解决掉，却多了一条经验。\n下一次再碰到类似的问题，你已经比第一次快了。\n再碰几次，你开始知道规律。\n再往后，别人来问你，你甚至会觉得：\n这有什么难的？\n可真正有意思的地方就在这里。\n你觉得不难，是因为你已经经历过了。\n⸻\n普通人的护城河，可能就是这样建起来的\n我们总觉得，要建立护城河，自己得特别聪明。\n要学一门极难的技术。\n要读很多书。\n要找到一个别人从来没有想到过的方向。\n当然，这些都很好。\n但对绝大多数普通人来说，还有一条朴素得多的路：\n去解决你真正遇到的麻烦。\n遇到一个，解决一个。\n再遇到一个，再解决一个。\n不需要哪一次突然顿悟，也不需要某一天掌握一项惊天动地的技术。\n只是问题不断出现，答案不断留下。\n一开始，你只有一个解决方案。\n后来有十个。\n再后来有五十个、一百个。\n直到有一天，别人看你的工作，会觉得：\n这东西看起来也没什么难的啊。\n是的。\n可能真的没有哪一步特别难。\n但他如果想重新走到你今天的位置，就得把你过去几年碰到的问题，重新碰一遍。\n把你踩过的坑，重新踩一遍。\n把你做过的那些判断，再重新做一遍。\n这时候，复杂度就出现了。\n而复杂度积累到一定程度，本身就是门槛。\n所以现在碰到一些麻烦，我反而没有以前那么讨厌了。\n因为我会换一个角度想：\n这个麻烦，会不会正是护城河开始的地方？\n"},{"title":"别学你领导怎么做事，先看他到底想干什么",
"url":"/blog/bie-xue-ni-ling-dao-zen-me-zuo-shi-xian-kan-ta-dao-di-xiang-gan-shen-me/",
"date":"2026-09-16",
"headings":[],
"body":"刚入职场的时候，我们很容易崇拜一些人。\n尤其是领导。\n你会发现，有些人好像特别会处理事情。\n他走进一个会议室，跟几个人聊几句，就知道问题出在哪里。\n他跟客户吃顿饭，原本僵住的合作突然就推进了。\n他跟下属喝几杯酒，对方平时不肯说的话，那天晚上全说出来了。\n于是我们很容易得出一个结论：\n这个人很厉害，我得学他。\n然后你开始观察他。\n他很外向，你也逼自己多说话。\n他经常参加饭局，你也开始研究怎么敬酒。\n他很会跟老板搞关系，你也开始琢磨怎么经营人脉。\n可学着学着，你可能会发现一个很尴尬的问题：\n有些东西，你根本学不了。\n他天生外向，你天生内向。\n他认识很多人，你没有。\n他坐在那个位置上，一句话就能调动几十个人，你不能。\n甚至更极端一点，有些人根本就是“氪金玩家”。\n他有钱、有资源、有平台、有信息。\n你跟他甚至不在同一个游戏难度里。\n那怎么办？\n后来我慢慢意识到一个问题：\n也许从一开始，我们就学错了东西。\n⸻\n一\n最近玩《古墓丽影》，里面有一个我很喜欢的功能：鹰眼。\n打开鹰眼以后，整个世界会突然变得很简单。\n大量无关的景物被弱化，真正重要的东西被突出显示出来。\n哪里可以攀爬，哪里有道具，哪里可能藏着线索，一眼就能看见。\n我突然觉得：\n分析一个厉害的人，也应该开一次“鹰眼”。\n你要暂时把这个人的性格、气场、身份，甚至那些很容易让你产生崇拜感的东西全部调成黑白。\n只留下一个问题：\n他到底想干什么？\n比如一个领导特别喜欢跟下属喝酒。\n你要学的是喝酒吗？\n未必。\n你真正应该研究的是：\n他为什么要喝这顿酒？\n也许他真正想做的，是创造一个比办公室更放松的环境。\n在会议室里，下属不敢讲的话，吃饭的时候可能敢讲。\n正式汇报里听不到的信息，酒过三巡之后可能就出来了。\n如果是这样，那么“喝酒”根本不是重点。\n获得真实信息，才是重点。\n一旦把这两个东西拆开，你的思路就完全不同了。\n你不喜欢喝酒，没关系。\n你可以请下属吃饭。\n你可以一对一散步。\n你可以开车送他回家。\n甚至可以找一个下午，两个人坐在咖啡馆里聊一个小时。\n形式完全不一样。\n但你完成的是同一件事。\n这才是真正值得学的东西。\n⸻\n二\n这也是为什么我最近玩游戏的时候，突然对这件事情有了很强的感受。\n以前我们很容易觉得：\n游戏嘛，不就是打怪吗？\n怪物出现了，把它杀掉。\n等级不够，练级。\n装备不够，刷装备。\n这套逻辑太熟悉了，以至于我们甚至不会怀疑它。\n但《Undertale》很有意思。\n一个怪物站在你面前，你不一定非得杀掉它。\n你可以赞美它。\n可以安抚它。\n可以恐吓它。\n甚至可以跟它调情。\n最后你发现：\n原来“打败怪物”和“杀死怪物”，从来都不是一回事。\n杀死它，只是其中一种解法。\n这件事情放到现实里也是一样。\n我们太容易把“路径”误认为“目标”。\n领导很会讲话。\n于是你以为：\n我要学会讲话。\n可问题是，他为什么讲话？\n是为了说服别人？\n是为了套取信息？\n是为了建立信任？\n还是为了让大家愿意支持他的方案？\n如果目标不同，“会讲话”这件事情的价值就完全不同。\n甚至有时候，你根本不需要讲话。\n别人靠一场演讲说服十个人，你可能靠一份非常扎实的数据报告也能做到。\n别人靠饭局建立关系，你可能靠连续三年靠谱的交付建立信任。\n别人靠强势推动项目，你可能靠提前把利益关系设计好，让所有人自己愿意往前走。\n终点相同，技能树可以完全不同。\n⸻\n三\n《底特律：变人》里，这种感觉更加明显。\n你面对一个人的时候，游戏经常会给你很多选择。\n安抚。\n威胁。\n直白。\n冷淡。\n共情。\n套取信息。\n你会慢慢发现，这些选项本身没有绝对的好坏。\n关键是：\n你现在想从这个人身上得到什么？\n如果你需要降低他的戒备，就选择一种方式。\n如果你需要快速获得信息，就选择另一种方式。\n如果你需要让他相信你，又是另外一种方式。\n这才是我觉得特别有意思的地方。\n真正厉害的玩家，并不是永远选择某一种选项。\n而是他知道：\n我现在要什么。\n现实世界其实也是这样。\n我们经常说一个人“情商高”。\n但“情商高”这个词太模糊了。\n你如果真的想学，就应该继续往下拆。\n他到底做了什么？\n他是能让陌生人快速放松？\n能听出别人话里的潜台词？\n能在冲突的时候给双方台阶？\n还是知道什么时候应该闭嘴？\n拆到这里，你才能开始学习。\n否则，“我要变得像他一样情商高”，基本上没有任何操作价值。\n⸻\n四\n所以我现在越来越觉得，学习一个厉害的人，第一步甚至不是学习。\n而是拆解。\n把他的行为和目的分开。\n把他的能力和资源分开。\n把他的性格和方法分开。\n把他所在的位置，也从这个人身上拆下来。\n然后你会发现一个很有意思的事情：\n有些你曾经非常崇拜的东西，其实没那么神秘。\n有的人之所以能做很多事情，不一定是因为他比你聪明多少。\n可能只是他掌握的信息比你多。\n他可以直接问到你问不到的人。\n他能调动你调动不了的资源。\n他所在的平台天然给了他更大的杠杆。\n如果这些东西没有拆开，你看到的就只有一个模糊的结果：\n“这个人好厉害。”\n可一旦拆开，问题就变成了：\n他有什么？\n他想要什么？\n他用了什么？\n为什么有效？\n我有没有？\n如果没有，我能不能换一种办法？\n这几个问题问完，“崇拜”往往就会变成一种更有价值的东西：\n理解。\n⸻\n五\n所以，真正值得培养的，也许不是某一种固定的“成功者性格”。\n而是不断增加自己的解法。\n你内向，不代表你不能管理。\n你不喜欢应酬，不代表你不能建立关系。\n你不会在会议上滔滔不绝，不代表你不能影响别人。\n这些都只是手段。\n甚至“做自己”这句话，有时候也会把人带偏。\n不是说：\n我是一个内向的人，所以我永远只用内向的方式解决问题。\n而是：\n我知道自己现在手里有什么牌，也知道这个问题需要什么，于是我开始寻找解法。\n别人好用的方法，我能学，就拿过来。\n不能学，就换一条路。\n暂时没有能力，就补能力。\n没有资源，就找别的资源。\n你甚至可以把每一个遇到的厉害的人，都当成一个游戏角色。\n看看他的技能树里有什么。\n有用的，学一点。\n学不了的，知道它存在就行。\n但没必要把自己的号删了，重新练成他。\n因为人生真正重要的，从来不是把自己练成某一种标准答案。\n而是当问题真的摆在你面前的时候——\n你手里有多少种解法。\n"},{"title":"为什么你明明很累，休息的时候却不肯休息？",
"url":"/blog/wei-shen-me-ni-ming-ming-hen-lei-xiu-xi-de-shi-hou-que-bu-ken-xiu-xi/",
"date":"2026-09-15",
"headings":[],
"body":"我最近坐地铁的时候，突然注意到一个很普通的现象。\n几乎所有人手上都有东西。\n有人刷短视频，有人打游戏，有人戴着耳机听音乐，有人看小说，有人回消息。\n很少有人只是坐在那里。\n什么都不干。\n我突然意识到一个挺奇怪的问题：\n我们每天都在喊累，每天都觉得自己没有时间休息。可一旦真的有了一点空闲，我们做的第一件事，却是赶紧找点东西把它填满。\n下班回家已经很累了，还是想开一局游戏。\n周末终于没事了，又觉得应该找部剧看看。\n坐几个小时飞机，明明什么都不用做，却要提前下载电影、准备游戏、带上耳机。\n实在什么都不想干了，就睡觉。\n我们好像什么都能接受。\n唯独很难接受一件事：\n清醒着，但什么都不发生。\n这就让我开始怀疑，我们平常说的“休息”，可能从一开始就理解错了。\n⸻\n人需要休息，但人并不需要空白\n以前我会觉得，休息就是“什么都不做”。\n后来发现根本不是。\n如果真的什么都不做就是最好的休息，那么一个人最舒服的状态，应该是坐在沙发上发呆一整天。\n但大多数人受不了。\n一个小时可能还行。\n一天呢？\n三天呢？\n一个星期呢？\n如果把手机、电视、游戏、书、工作、朋友全部拿走，让你每天醒来以后面对同样的房间，什么事情都没有发生，你大概率不会觉得：\n太爽了，我终于彻底休息了。\n你只会越来越难受。\n这也是为什么长期监禁真正令人恐惧的地方，不只是不能出去。\n更可怕的是单调、重复、缺少变化，自己的生活几乎没有新的事情发生。\n所以我们需要先把一件事情说清楚：\n休息和空白，根本不是一回事。\n人需要休息，却未必喜欢空白。\n我们甚至会主动逃避空白。\n刷短视频、打游戏、看剧、听音乐，甚至坐在那里胡思乱想，本质上都在给意识找一个对象。\n人好像需要一点东西，让自己的精神挂在上面。\n完全没有刺激，并不一定是一种享受。\n时间长了，它甚至可能是一种折磨。\n⸻\n那到底什么才叫休息？\n如果看电影不是“不做事”，打游戏也不是“不做事”，出去旅游更是累得要死，那为什么我们仍然把这些事情叫作休息？\n我后来觉得，判断工作和休息，可能不能看你有没有在“做事”。\n而要看：\n这段时间到底是谁在支配。\n比如一个人周末花六个小时研究自己喜欢的游戏攻略。\n他很忙。\n查资料、算数值、跑地图、反复尝试，脑子可能比上班的时候转得还快。\n但他觉得自己在休息。\n为什么？\n因为随时可以停。\n想玩就玩，不想玩就关。\n没人规定他九点上线，也没人问他今天完成了多少，更没人要求他晚上六点之前提交一份游戏进度报告。\n这六个小时属于他。\n反过来，一个人上班的时候可能根本没干多少活。\n坐在办公室里等消息，开两个没什么内容的会，回复几个群消息。\n身体不累，脑力消耗似乎也不大。\n可他回到家就是觉得累。\n因为那八个小时不是他的。\n他必须在那里。\n必须回复。\n必须等待。\n必须随时准备处理别人交给他的事情。\n所以真正让人疲惫的，有时候并不是“做了多少事情”。\n而是：\n很长一段时间里，你不能决定自己要做什么。\n⸻\n这样再看，有些老板说“工作就是休息”，可能真不是一句废话\n以前听到有人说：\n“我没有什么工作和生活的区别，我工作就是休息。”\n很容易觉得这人在凡尔赛。\n但如果按照刚才的定义，这句话对某些人来说，还真的可能是真的。\n因为他的工作方式和普通员工完全不同。\n他可以决定几点开始。\n可以决定今天见谁。\n可以决定这个项目做不做。\n觉得累了可以停一下。\n突然对一个东西感兴趣，也可以花半天研究。\n当然，他仍然受市场、客户、现金流和结果约束，不是真的毫无压力。\n但他拥有的时间支配权，可能比普通员工大得多。\n于是他的“工作”，慢慢变成了一种自己主动选择的高强度活动。\n这就很像游戏。\n玩游戏也有目标，也有压力，也有失败，也要解决问题。\n有些游戏甚至比工作难多了。\n可我们为什么愿意连续玩几个小时？\n因为游戏里的困难，是我主动选择的。\n工作里的很多困难，却是别人塞给我的。\n人未必讨厌辛苦，人更讨厌的是无法决定自己为什么辛苦。\n⸻\n所以退休也不一定意味着幸福\n这样一来，还有一个现象就很好理解了。\n有些人忙了一辈子，天天喊着退休。\n真退休以后，却突然不适应了。\n每天不用上班了。\n没人找他了。\n没有会议，没有任务，没有截止日期。\n按理说，这不是最完美的休息吗？\n可过一段时间，他反而开始给自己找事。\n养花、钓鱼、旅游、带孙子、炒股、打麻将、参加各种活动。\n有的人甚至又找了一份事情做。\n因为人真正想要的可能从来都不是：\n什么都不要发生。\n人只是希望：\n发生什么，由我来决定。\n这两个东西差得非常远。\n⸻\n我们缺的可能不是更多休息，而是更多属于自己的时间\n所以现在再看那个最开始的问题：\n为什么我们明明很累，休息的时候却还是不肯休息？\n答案可能很简单。\n因为我们其实已经在休息了。\n玩游戏是休息。\n看剧是休息。\n听音乐是休息。\n散步是休息。\n研究一个毫无用处但自己感兴趣的问题，也可以是休息。\n甚至对某些人来说，写东西、做木工、研究代码、开一家自己的店，也可能是休息。\n休息从来不意味着停止活动。\n它更像是把自己的注意力和时间，从别人手里拿回来。\n而真正的“什么都没有”，也就是绝对的空白，我们反而未必喜欢。\n这么一想，我突然觉得，我们这个时代一个很大的误会，就是总在讨论：\n一个人到底应该工作多久，休息多久。\n但也许还有一个更重要的问题：\n你一天二十四小时里，到底有多少时间真正属于你自己？\n一个人每天工作八小时，却可以决定怎么做、什么时候做，也许没有想象中那么痛苦。\n另一个人每天只工作六小时，却时时等待指令、随时响应别人、连午饭什么时候吃都不能决定，也可能疲惫不堪。\n我们真正渴望的，或许从来都不是躺在那里，面对一片空白。\n而是终于有一段时间——\n不用问任何人，我自己决定接下来干什么。\n"},{"title":"游戏从不催你努力，你却愿意为它拼命",
"url":"/blog/you-xi-cong-bu-cui-ni-nu-li-ni-que-yuan-yi-wei-ta-pin-ming/",
"date":"2026-09-15",
"headings":[],
"body":"我最近一直在玩解谜游戏。\n《最后的篝火》《INSIDE》《LIMBO》，再往前一点，还有《黄金太阳》《塞尔达》。甚至《古墓丽影》《黑暗之魂》这种看起来和解谜没那么直接的游戏，里面也塞了大量探索、机关和地图设计。\n玩着玩着，我突然觉得一件事很奇怪：\n我们上班已经够累了，为什么下班以后，还愿意主动给自己找难题？\n《LIMBO》甚至连一句提示都懒得给你。\n一个箱子，一根绳子，一个捕兽夹，一片水。\n自己想。\n想不出来就死。\n死了再来。\n有时候我在一个地方卡十几分钟，明明已经有点烦了，却还是不肯关掉游戏。\n更奇怪的是，一旦自己想出来了，会真的很开心。\n那种感觉不是“终于完成任务了”。\n而是：\n哦！原来是这样！\n⸻\n这就产生了一个很有意思的问题。\n如果人真的讨厌动脑，为什么解谜游戏会存在？\n如果人真的讨厌困难，为什么还有那么多人专门去玩高难度游戏？\n如果人下班以后只想放松，那最合理的娱乐方式，应该是躺在那里刷视频，而不是打开一个游戏，继续研究一个箱子到底该搬到哪里。\n甚至推理小说也是一样。\n阿加莎·克里斯蒂的小说为什么让人停不下来？\n因为你不是只在“看”。\n你会偷偷参与进去。\n谁是凶手？\n他的动机是什么？\n这个人的证词为什么前后矛盾？\n那个不起眼的东西为什么被作者写了两遍？\n《逆转裁判》《审判之眼》也是这样。\n尤其是《审判之眼》，它吸引我的地方就在这里。\n《如龙》本身已经有非常漂亮的日本街景、打斗和大量支线，但《审判之眼》又往里面加了一层东西：\n案件。\n而案件本身，就是一个巨大的谜题。\n你不是一路打过去就行了。\n你还想知道：\n到底发生了什么？\n于是玩家开始观察、猜测、验证、推翻，再重新猜测。\n仔细想想，这些行为都挺“累”的。\n可我们居然愿意主动做。\n所以我慢慢觉得：\n人可能根本没有我们想象中那么讨厌努力。\n我们讨厌的，是另外一种东西。\n⸻\n比如做一道数学题。\n理论上，它和解谜游戏其实很像。\n都有规则，都有答案，都需要思考。\n可为什么很多成年人愿意花两个小时解《最后的篝火》里的机关，却不会在下班之后兴致勃勃地说：\n来，今晚做两套几何题。\n区别当然有很多。\n游戏有画面、有音乐、有剧情，有一个可以探索的世界。\n但还有一个很重要的区别：\n好的游戏，非常懂得怎样让你努力。\n它不会一上来就把最复杂的谜题扔到你面前。\n它通常先给你一个很简单的东西。\n比如一个方块。\n你很快发现，方块可以垫脚。\n下一关，它告诉你，方块还可以压机关。\n再下一关，又多一个升降台。\n再后来，方块、升降台、水位、机关全部放到了一起。\n这时候谜题已经很复杂了。\n可你不会觉得自己是在面对一个完全陌生的问题。\n因为你之前学过的东西都还在。\n游戏只是在你已经会的东西上面，多加了一点点。\n于是你会产生一种非常重要的感觉：\n我好像能解出来。\n这句话很重要。\n不是“我一定能解出来”。\n而是“我好像能”。\n真正让人愿意努力的，恰恰是这中间的一点距离。\n太简单了，没有意思。\n完全看不到希望，也没有意思。\n最让人上瘾的，是答案就在前面，但还差那么一点。\n于是你愿意再试一次。\n⸻\n游戏甚至连你失败以后怎么办，都替你想好了。\n卡关怎么办？\n可以找攻略。\n动作游戏太难怎么办？\n可以调低难度。\n我现在反而越来越觉得，对于一个自己很想玩、但又觉得太难的游戏，完全没必要因为别人说“这个游戏就应该这么玩”，一上来就啃最硬的骨头。\n先开简单模式又怎么样？\n先通一遍。\n先熟悉地图，熟悉敌人，熟悉战斗系统，先获得一点“我会玩了”的感觉。\n等到二周目，再调高难度。\n甚至直接挑战最高难度。\n你会发现，同一个人，前后表现可能完全不一样。\n不是因为他的意志力突然增强了。\n而是因为他已经从：\n“我根本不知道该怎么办。”\n走到了：\n“我知道该怎么办，只是这次要做得更好。”\n这两种困难，看起来都叫困难，对人的感受却完全不同。\n⸻\n这也是我最近慢慢意识到的一件事：\n所谓“努力”，可能没有我们想象中那么依赖意志力。\n它非常依赖环境。\n一个人迟迟不愿意开始一件事，我们很容易说他懒，说他执行力差，说他没有上进心。\n但游戏设计师不会这么想。\n如果一款游戏90%的玩家都在第一关弃坑，游戏设计师大概不会说：\n这一届玩家不行，缺乏奋斗精神。\n他会回去检查第一关。\n是不是难度曲线出了问题？\n是不是规则没有讲清楚？\n是不是反馈不够明显？\n是不是玩家根本不知道自己为什么死？\n是不是缺少一个必要的提示？\n是不是我以为玩家知道，但其实他们根本不知道？\n这套思路放到现实里，其实很有意思。\n一个员工一直做不好一件事，除了问：\n“他为什么不努力？”\n是不是还可以问一句：\n“这个环境有没有让他知道该往哪里努力？”\n目标是不是清楚的？\n任务是不是一下子太难了？\n有没有人告诉他基本的方法？\n做对以后有没有反馈？\n做错以后，他知不知道错在哪里？\n卡住的时候，有没有一个类似“攻略”的东西——文档、经验、前辈或者一个可以问的人？\n甚至，他有没有机会先玩一次“简单模式”？\n⸻\n当然，这不是说人不需要自己负责。\n恰恰相反。\n玩家也可以主动选择自己的难度。\n觉得太难，就先降一级。\n不知道怎么玩，就先看看攻略。\n没有经验，就先找一个小一点的任务练手。\n不要因为别人已经在玩最高难度，就觉得自己也必须从最高难度开始。\n能够选择一个让自己持续玩下去的难度，本身就是一种能力。\n所以这件事情其实是双方的。\n人可以主动寻找一个更适合自己努力的环境。\n管理者、老师、父母，也可以主动创造一个更容易让人努力起来的环境。\n我们过去太喜欢把“努力”理解成一种人的品质。\n仿佛有些人天生努力，有些人天生懒惰。\n但游戏给我的感觉恰恰相反。\n同一个人，可以一边拖延工作，一边为了一个Boss连续死三十次。\n可以一边说自己没有耐心，一边在《LIMBO》里对着一个机关折腾半个小时。\n可以一边觉得自己不喜欢动脑，一边看到推理小说里的线索，忍不住停下来猜谁是凶手。\n所以问题可能从来都不只是：\n这个人够不够努力。\n还有一个经常被忽略的问题：\n我们到底把他的“游戏”，设计成了什么样子？\n好的游戏从来不会站在旁边催你：\n努力一点。\n坚持一下。\n你要有毅力。\n它只是给你一个够得着、但又没有那么容易够着的目标。\n让你试一次。\n给你一点反馈。\n再难一点。\n再给你一点反馈。\n直到某个晚上，你抬头一看，已经凌晨一点了。\n然后你才发现：\n原来根本没人逼你。\n你自己已经努力了很久。\n"},{"title":"很多人努力了很多年，其实一次真正的练习都没有",
"url":"/blog/hen-duo-ren-nu-li-liao-hen-duo-nian-qi-shi-yi-ci-zhen-zheng-de-lian-xi-du-mei-you/",
"date":"2026-09-14",
"headings":[],
"body":"我们经常说，一个人想把一件事情做好，就要多练。\n英语不好，多背单词，多开口。\n不会写作，多写。\n不会做产品，多做项目。\n不会管理，多带人。\n这当然没错。\n但我最近慢慢觉得，这句话可能漏掉了一个非常重要的前提：\n你得先有机会练。\n而很多普通人真正缺的，可能不是练习，而是练习的机会。\n01\n最明显的例子就是学英语。\n一个孩子从小生活在英语国家，他可能并没有什么惊人的语言天赋。\n但他每天都在练。\n上课要听英语，作业要写英语，买东西要说英语，和同学吵架也得用英语。\n他甚至不觉得自己在“练习”。\n可一天十几个小时，他都泡在里面。\n几年以后，他的英语自然很好。\n我们很容易把这种结果理解成：\n这个孩子英语真好。\n但如果把过程拆开，你会发现一个很残酷的区别：\n有些人的练习，是生活本身。\n而另一些人的练习，是每天晚上抽出半个小时，逼自己打开一本英语教材。\n看起来大家都在努力。\n但这真的是同一种“努力”吗？\n一个人一年背了几千个单词，做了几十套卷子。\n另一个人这一年用英语交朋友、玩游戏、写作业、点餐、看新闻、解决问题。\n后者得到的，不只是更多练习。\n而是更多真正需要使用这项能力的机会。\n02\n所以普通人怎么办？\n我们经常想到的答案是：\n那我就自己创造环境。\n这当然是对的。\n但我觉得，“创造环境”这句话还是太简单了。\n比如同样是学英语。\n你可以买一本原版教材，每天要求自己读十页。\n也可以因为自己喜欢八卦，天天去看英文娱乐新闻。\n你喜欢游戏，就去玩英文游戏。\n喜欢电影，就去看英文电影，甚至去玩《Erica》这种真人互动电影游戏。\n表面上看，这些都叫“接触英语”。\n但它们有一个非常大的区别。\n前一种方式，是你在逼自己学习。\n后一种方式，是你本来就想知道后面发生了什么，英语只是挡在你面前的一道门。\n于是动力完全不一样。\n你不是为了学英语去玩游戏。\n而是为了玩懂这个游戏，不得不去搞懂英语。\n这时候，一个很有意思的飞轮就出现了：\n因为喜欢，所以愿意接触；\n因为接触，所以能力提高；\n因为能力提高，所以原来很困难的东西变简单；\n因为变简单，你又愿意接触更多。\n最后你甚至不觉得自己在坚持。\n这可能才是普通人真正能够“创造”的练习机会。\n不是给自己安排更多任务。\n而是想办法让自己进入一个愿意长期待下去的场景。\n03\n但说到这里，还有一个更现实的问题。\n不是所有机会，都能靠自己创造。\n比如一个人想成为非常厉害的游戏开发者。\n他当然可以自己学编程。\n可以自己做游戏。\n可以买各种课程，可以研究最优秀的作品，甚至可以一个人独立开发一个小型游戏。\n这些都很好。\n但有一种经验，他可能永远无法在家里模拟。\n就是进入一个顶尖团队，和几百个人一起，用巨大的预算，做一个最终会被几百万甚至上亿人看到的产品。\n这种经验本身就是稀缺资源。\n你怎么协调几百个人？\n怎么面对几百万用户的反馈？\n怎么处理一个小改动带来的巨大影响？\n怎么在巨额预算、商业压力和创作表达之间做选择？\n这些东西不是看十本书就能练出来的。\n因为你首先得有资格坐到那张桌子上。\n这也是为什么，有时候我们会看到一些人进入一个很好的公司、碰到一个很好的项目之后，几年时间成长得特别快。\n我们很容易说：\n这个人真厉害。\n当然，他可能确实厉害。\n但还有一个经常被忽略的变量：\n他获得了别人没有的练习机会。\n而这种机会，本身就会制造能力差距。\n04\n这件事情让我重新理解了所谓的“努力”。\n我们以前很容易把成长想象成一条简单的公式：\n努力 → 能力 → 成功。\n但现实可能更像：\n机会 → 练习 → 反馈 → 能力 → 更大的机会。\n这是一条会自我强化的链条。\n一个人第一次参与了一个不错的项目。\n因为这个项目，他获得了经验。\n因为有了经验，下一个更好的项目愿意找他。\n于是他又获得了更高质量的练习。\n能力继续提高。\n最后我们回头一看，会觉得：\n这个人怎么这么厉害？\n可真正拉开差距的，可能是很早以前那个不起眼的入口。\n反过来也是一样。\n一个人可能非常努力。\n但是他一直在一个反馈很弱、变化很少、没有真实使用场景的地方重复。\n十年以后，他当然也积累了十年经验。\n只是这里面究竟是十年的经验，\n还是同一年的经验重复了十次，\n很难说。\n05\n那么普通人是不是就没办法了？\n我觉得也不是。\n只是想明白这一点以后，我们努力的方向可能要稍微改变一下。\n以前我们总问：\n我今天练了多久？\n以后也许应该多问一句：\n我有没有办法让自己获得更好的练习机会？\n想练口语，不一定先逼自己每天背多少句子，而是想办法找到一个真的需要开口的场景。\n想做产品，不一定永远在脑子里学习“产品方法论”，而是想办法做一个真的有人使用的小东西。\n想提高管理能力，也不能只是读管理书，而是要真的承担一个项目、带几个人、做一次艰难的决策。\n哪怕机会很小，也先进去。\n因为很多时候，小机会并不只是小机会，它还是下一次机会的入场券。\n当然，还有另外一件事也很重要：\n有机会的时候，尽量别浪费。\n因为回头看人生，会发现真正能让一个人跨越式成长的机会，其实没有想象中那么多。\n一个重要项目，一个愿意放权的领导，一个优秀的同事，一个突然出现的平台，甚至只是某一次别人愿意相信你，把一件超过你当前能力的事情交给你。\n当它出现的时候，你可能还没有准备好。\n但这恰恰就是练习。\n06\n最后，还有一个可能不那么励志的结论。\n即使你很努力地寻找机会、创造机会，你也未必能够走到金字塔尖。\n因为人的起点不同，环境不同，能接触到的资源也不同。\n有人从小就拥有语言环境。\n有人毕业就进入顶尖公司。\n有人第一次创业就认识投资人。\n而另一些人可能花很多年，才摸到别人一开始就站着的地方。\n这不是一句“只要努力就能改变”可以抹平的。\n所以我现在反而觉得，理解“机会”的重要性，并不是为了让人焦虑。\n恰恰相反。\n它可能会让我们对自己宽容一点。\n如果你已经在自己能够接触到的范围里，不断寻找机会、创造机会，也认真抓住了那些真正出现过的机会，那么最后没有成为最顶尖的那一批人，也不代表你不够努力。\n因为成功从来不只是努力程度的排名。\n我们真正能做的，大概就是：\n没有环境，就尽量给自己创造环境。\n没有机会，就尽量制造一些小机会。\n机会来了，就认真抓住。\n暂时没有，也别急着证明自己。\n把眼睛一直放在那里。\n然后给自己一点时间。\n毕竟，练习从来不是凭空发生的。\n在问自己“为什么还不够优秀”之前，\n也许更值得先问一句：\n我真正得到过多少次，让自己变得更优秀的机会？\n"},{"title":"靠关系升职，有什么不对？",
"url":"/blog/kao-guan-xi-sheng-zhi-you-shen-me-bu-dui/",
"date":"2026-09-14",
"headings":[],
"body":"我们很容易看不起一种人。\n工作能力好像也就那样，但特别会跟领导搞关系。\n领导说句话，他马上接住；领导做个决定，他第一个支持；吃饭的时候知道坐在哪里，开会的时候知道什么时候说话，领导心情不好了，他还能适时给点情绪价值。\n再夸张一点，有些人甚至就是裙带关系。\n你辛辛苦苦干了几年，做了那么多项目，结果人家一来，位置就在你上面。\n于是我们很容易得出一个结论：\n这个人没什么能力，就是靠关系上去的。\n但我现在越来越觉得，这句话可能从一开始就把问题想简单了。\n因为我们默认了一件事：\n靠能力上去是正道，靠关系上去是旁门左道。\n可如果把一家公司拆开来看，这两件事的差别，可能没有我们想象中那么大。\n公司不只是一台赚钱机器\n我们习惯用一种非常理性的方式理解公司。\n公司有战略，有组织架构，有岗位说明书，有绩效考核，有晋升机制。\n听起来就像一台巨大的机器。\n每个人都是一个零件，只要你的能力够强、产出够高，就应该被放到更重要的位置。\n但现实中的公司从来不是这样运转的。\n你把办公室、制度、流程、职级这些东西全部拿掉，最后剩下来的是什么？\n其实就是一群人。\n几十个人聚在一个办公室里，是公司。\n几百个人塞进一栋大厦里，也是公司。\n而只要是一群人聚在一起，就一定会产生关系。\n谁信任谁，谁喜欢谁，谁跟谁合作舒服，谁能影响谁，谁在关键时候愿意支持谁，谁又掌握着真正的决策权。\n这些东西不会因为墙上贴了一张组织架构图就消失。\n所以我们常说：\n有人的地方，就有江湖。\n公司当然是一个盈利组织。\n但它首先也是一个人的组织。\n而只要是人的组织，关系就不是公司运行之外的杂质。\n关系本来就是公司运行的一部分。\n为什么“讨老板喜欢”就一定是一件坏事？\n比如一个人特别会给老板提供情绪价值。\n我们可能会说他拍马屁。\n但换一种说法呢？\n他知道老板在意什么，知道什么时候应该支持，知道什么时候不要拆台，也知道怎样让一个掌握大量资源和决策权的人愿意信任自己。\n这件事真的完全没有价值吗？\n未必。\n尤其是越往组织上层走，工作越不是简单的“把事情做完”。\n你需要别人支持你的方案，需要跨部门配合，需要争取资源，需要说服关键人物，需要建立信任。\n这时候，人和人之间的关系本身就开始产生生产力。\n所以我后来发现，有些看起来特别喜欢“攀关系”的人，他们的思路其实非常清楚。\n他知道这个组织真正的权力在哪里。\n假设一个公司里，某个老板决定了大部分重要资源怎么分配。\n你想升职，想拿到更重要的项目，想让自己的想法进入决策，甚至只是想多分一点利益。\n那你怎么办？\n一种方法当然是拼命把自己的工作做好。\n但如果你每天埋头干活，跟这个人几乎没有交集，他甚至不知道你是谁，你又怎么影响他的判断？\n而另一个人选择直接经营跟他的关系。\n让他认识自己，信任自己，喜欢跟自己合作，在关键时刻想得到自己。\n从资源获取的角度来看，这其实是一条非常直接的路径。\n你可以不喜欢这种方式。\n但很难说它完全没有逻辑。\n能力和关系，本质上都在回答同一个问题\n这也是我觉得最有意思的地方。\n我们总觉得：\n靠能力升职，是因为“我很强”。\n靠关系升职，是因为“老板喜欢我”。\n好像前者非常牢固，后者特别虚。\n其实未必。\n一个人为什么会因为能力强而升职？\n因为公司现在需要这种能力。\n你能把销售做好，你能带团队，你能搞定某个大客户，你能把一个混乱的部门管起来。\n所以公司把更大的位置给你。\n说到底，是因为：\n你提供了别人暂时无法替代的价值。\n那关系呢？\n其实也是一样。\n老板信任你，愿意把重要的事情交给你；跟你相处舒服；在复杂的人际关系里，你愿意站在他这边；甚至只是他需要一个能理解自己、支持自己的人。\n你同样提供了一种价值。\n只不过这种价值没有写进岗位说明书里。\n一个提供的是业务价值。\n一个提供的是关系价值。\n甚至还有人提供的是身份价值、信任价值、情绪价值。\n它们当然不是完全等价的，也不是所有关系手段都值得提倡——如果涉及破坏规则、利益输送，那是另一回事。\n但如果只是讨论“一个人为什么会被放到更重要的位置”，事情可能没有我们想象中那么道德化。\n组织把位置给了一个它需要的人。\n仅此而已。\n靠能力，也没有想象中那么保险\n反过来，这也意味着一件不太好听的事情：\n不要因为自己是“靠能力吃饭”，就觉得自己天然比别人安全。\n能力同样会过期。\n今天公司最需要的是你的执行力，明天可能需要创新。\n今天老板觉得你特别能打，明天组织结构一变，你擅长的事情可能根本不重要了。\n甚至有一天，一个更年轻、更便宜、能力差不多的人出现了，你一样会被替代。\n关系也是如此。\n今天老板信任你，不代表永远信任你。\n领导换了，你原来的关系可能瞬间归零。\n老板以前喜欢你，也可能有一天不再喜欢你。\n所以能力和关系，其实都有替代性。\n只不过我们习惯把前者叫“实力”，把后者叫“关系”，于是天然觉得前者高级一点。\n但站在组织的角度，它未必这么浪漫。\n它只是在不断寻找：\n现在谁对我最有用？\n真正厉害的人，往往根本不选边\n当然，最强的其实是第三种人。\n他能力很强，同时也很会处理关系。\n事情来了，他能解决。\n资源不够，他能争取。\n老板需要支持的时候，他知道怎么回应。\n同事之间有冲突，他知道怎么协调。\n关键人物出现的时候，他也不会因为一句“我只靠实力说话”，就躲在角落里等别人发现自己。\n这种人才真正难替代。\n因为他既会做事，也会跟人打交道。\n而现实中的组织，本来就是由这两样东西共同推动的。\n所以我现在再看到那些特别擅长“搞关系”的人，不太会急着鄙视他们了。\n有时候，我们看不起一种玩法，只是因为我们自己不擅长那种玩法。\n你当然可以选择不玩。\n你也完全可以觉得，有些事情自己不愿意做。\n但最好不要因此误判它的价值。\n毕竟，公司从来不只是工作和工作的集合。\n它也是人和人的集合。\n而在一个由人组成的地方，能够影响人，本身就是一种能力。\n"},{"title":"AI再强，一个人也没必要成为一家公司",
"url":"/blog/aizai-qiang-yi-ge-ren-ye-mei-bi-yao-cheng-wei-yi-jia-gong-si/",
"date":"2026-09-11",
"headings":[],
"body":"前段时间，我突然开始做游戏了。\n我不是游戏行业的人，不会写游戏代码，Blender 也只会一点点，更谈不上什么角色建模、材质、绑定、动画。\n但现在有 AI。\n代码不会写，可以让 AI 写。\n模型不会做，可以让 AI 帮我做。\n场景不知道怎么搭，也可以让 AI 一点点试。\n于是，我居然真的做出了一个像模像样的 Demo。\n我想做的是一个发生在城中村里的游戏。\n楼挨着楼，招牌、电线、巷子、出租屋，再放进去一个可以控制的人物。\n当这个东西真的在屏幕上跑起来的时候，我突然产生了一种很容易让人上头的感觉：\n既然我已经能做一个了，为什么不能继续做下去？\nAI 能帮我做一个人物，那就再做 100 个。\n能做一条街，那就再做十条街。\n代码有问题就继续改，模型不满意就重新生成。\n以前需要一个游戏公司才能完成的事情，现在一个人好像也能做了。\n但真正往下做，我很快就发现：\n事情完全不是这么回事。\n⸻\n做出一个人，和做出一个世界，是两回事\n一个游戏人物到底有多少东西？\n以前玩游戏的时候，我从来没认真想过这个问题。\n直到自己开始做。\n一张脸，就有眼睛、眉毛、鼻子、嘴巴、耳朵、头发、胡须。\n然后是身体。\n高的、矮的、胖的、瘦的。\n然后是衣服。\nT 恤、衬衫、外套、裤子、裙子、鞋子、帽子。\n再往下还有眼镜、项链、腰带、纹身、背包。\n而这甚至还只是“长什么样”。\n人物做出来之后，还要考虑材质、骨骼、动作、碰撞、表情……\n这时候我才突然理解，为什么在真正的 3A 游戏公司里，光是“角色”这件事，就足以养活一群全职工作的人。\n更可怕的是，一个还不够。\n像 GTA 这样的游戏，不可能走在街上，发现所有人都长着同一张脸。\n所以你需要第二个、第三个、第一百个。\n我一开始对 AI 最大的误解也在这里。\n我以为：\nAI 既然能帮我做出第一个，就能帮我做出第一千个。\n理论上，当然可以。\n问题是，每一次生成都要消耗 Token，每一次不满意都要重来，每一个东西都要有人判断它到底能不能用。\n而且，当数量上升以后，问题已经不再是“能不能生成”。\n而是：\n这些东西风格统一吗？\n质量稳定吗？\n能互相兼容吗？\n放进游戏里真的好看吗？\n会不会这个人物像 GTA，旁边那个人突然像某个廉价手游？\n做出第一个，是能力问题。\n稳定地做出第一千个，已经变成了工业问题。\n⸻\n我这才理解，游戏公司的护城河到底是什么\n以前我会觉得，一家做了几十年游戏的公司，厉害的是它的程序员更强、美术更强、技术更先进。\n现在我发现，当然有这些。\n但还有一个很容易被忽略的东西：\n积累。\n一个成熟的游戏公司，手里可能已经有大量模型、材质、动作、角色、代码、工具和技术经验。\n更重要的是，它知道这些东西应该怎么配合。\n这也是为什么一款成功游戏的续作，天然拥有巨大的优势。\n人物可以继续用。\n动作系统可以继续改。\n工具链已经搭好了。\n上一代踩过的坑，下一代不用再踩一遍。\n甚至玩家对这个世界本身就已经有认知。\n所以我现在反而更能理解，为什么一家已经拥有成功 IP 的公司，要抛开原来的东西重新做一款游戏，需要很大的勇气。\nCD Projekt 做完《巫师 3》之后，完全可以继续待在自己最熟悉的世界里。\n但它后来选择了《赛博朋克 2077》。\n世界变了，题材变了，玩法变了，视角也变了。\n这意味着很多东西都要重新建立。\n你拥有一座已经挖出金矿的矿山，却决定去另外一片荒地重新挖。\n这不是一句“有创意”就可以概括的。\n背后是真金白银的资源重新配置。\n⸻\n那为什么几个人又能做出一款好游戏？\n这也是我后来想到的另一个问题。\n如果游戏真的这么复杂，为什么世界上还有那么多几个人，甚至一个人做出来的独立游戏？\n后来我发现，这里面有一个特别重要的区别：\n他们不是用两个人做了一款缩小版的 GTA。\n他们从一开始，就没有选择 GTA 那道题。\n小团队会主动避开那些会吞噬资源的东西。\n不追求几百个高度写实的人物。\n不追求一座什么都能进去的城市。\n不追求几十套复杂系统同时运行。\n甚至“不够真实”“素材少”“重复利用”，本身都可以变成一种美术风格。\n《旅程》这样的游戏就是很好的例子。\n它不需要让你进入一座拥有几千个 NPC 的现代城市。\n它只需要一片沙漠、一个远方的目标、一种移动方式、一套足够纯粹的视觉和情绪表达。\n于是，资源少不再只是缺点。\n资源的限制，反过来塑造了作品。\n这件事让我想了很久。\n因为它已经不只是游戏开发的问题了。\n⸻\nAI 放大了个人，但没有消灭“规模”\n这几年有一种很流行的说法：\nAI 会让一个人变成一家公司。\n我自己做完这个 Demo 以后，反而没那么相信这句话了。\n更准确的说法可能是：\nAI 让一个人能够做过去很多个人才能做的事情。\n但这和“一个人变成一家公司”，是两回事。\n假如给我无限的 Token、无限的算力、无限的时间，我当然可以继续把这个游戏做下去。\n人物不够就继续生成。\n场景不够就继续搭。\n代码坏了就继续改。\n一百次不行就试一千次。\n理论上，很多问题最终都能解决。\n可问题恰恰在于：\n我没有无限的 Token。\n我也没有无限的时间。\n更没有无限的注意力。\n而组织拥有的资源，天然比个人大得多。\n一家游戏公司可以融资，可以雇几百个人，可以让一个人花一年只研究角色的脸。\n一个人很难做到这些。\n如果有一天你真的融资了几千万，招了 100 个人，建立了美术、程序、策划、市场团队……\n那也不是“一个人战胜了组织”。\n而是你自己建立了一个组织。\n⸻\n一个人，不需要证明自己能干掉一家公司\n所以现在再回头看我那个 Demo，我反而没有那么强烈的欲望把它继续做下去了。\n不是因为我觉得自己做不到。\n恰恰相反。\n我第一次非常具体地意识到：\n如果资源足够，很多事情其实都做得到。\n但这并不是最重要的问题。\n真正的问题是：\n你现在到底拥有多少资源？\n如果你是一个人，就做适合一个人规模的事情。\n如果你带着十个人，就去解决十个人规模的问题。\n如果有一天你拥有一家几百人的公司，那就去做只有几百个人协作才能完成的事情。\n组织也是一样。\n哪怕是一家拥有几千人的大公司，它的资金、时间和注意力仍然有限。\n区别只是它站在一个更大的资源尺度上。\n所以真正重要的能力，从来不是幻想自己拥有无限资源，然后问：\n“如果什么都有，我能做到什么？”\n而是看清自己手里的牌，然后问：\n“就凭我现在拥有的这些，我最值得做什么？”\nAI 可以让一个人的手伸得更长。\n可以让十个人完成过去一百个人的工作。\n也可能让一家公司拥有过去无法想象的生产力。\n但它没有改变一个最古老的事实：\n资源永远有限。\n所以未来真正稀缺的，可能不是“会做”。\n会写代码的人会更多，会画图的人会更多，会做视频、做模型、做游戏的人也会更多。\n真正稀缺的是另一种能力：\n知道什么值得做，什么不值得做；什么应该自己做，什么需要交给组织；什么时候应该继续，什么时候应该停下来。\n技术不断突破能力的边界。\n但一个人真正成熟的标志，也许恰恰不是不断证明：\n“我什么都能做。”\n而是终于能够非常清楚地说：\n“我当然可以做很多事。\n但以我现在拥有的资源，这件事，不值得我做。”\n"},{"title":"真正的成熟，是开始“不认真”",
"url":"/blog/zhen-zheng-de-cheng-shou-shi-kai-shi-bu-ren-zhen/",
"date":"2026-09-11",
"headings":[],
"body":"我最近发现自己有一个很奇怪的习惯。\n我明明很喜欢玩游戏，但每次从 Steam 下载一个新游戏，真正要点开它的时候，我反而会犹豫。\n不是不想玩。\n而是会产生一种很微妙的感觉：\n我好像还没准备好。\n新的操作要学，新的系统要理解，不知道什么时候存档，不知道哪些东西以后会用到。按照我的习惯，我甚至会想把这些东西记录下来：现在玩到哪里、关键操作是什么、下次打开的时候应该干什么。\n于是，一个本来只需要双击就能打开的游戏，突然变成了一件需要“准备”的事情。\n更荒唐的是：\n游戏本来是我用来放松的。\n后来我才意识到，也许真正让我累的，从来不是事情太多。\n而是我对太多事情，都太认真了。\n⸻\n一\n我们从小接受的教育，几乎都在教我们怎么“认真”。\n认真学习。\n认真工作。\n认真准备。\n认真对待别人交代的事情。\n一个人如果做什么都认真，我们通常会认为这是优点。\n相反，如果一个人看起来吊儿郎当，很多事情都说“差不多就行”，我们很容易给他贴上一些不太好的标签：\n懒。\n没责任心。\n不上进。\n不靠谱。\n所以我们很自然地以为：\n成熟，就是对越来越多的事情负责。\n但生活久了以后，我开始怀疑这件事。\n因为如果你真的对每件事情都认真，后果可能不是你越来越优秀。\n而是——\n你会越来越累。\n开一个会，要提前把所有可能的问题想一遍。\n做一个决定，要尽量把所有后果想清楚。\n开始一个项目，要先弄明白应该怎么做。\n甚至打开一个新游戏，都觉得自己最好先搞懂操作、存档、系统和玩法。\n问题就在这里。\n人的认真，是有限的。\n你的注意力有限，精神有限，判断力有限，一天真正能够高度集中的时间更有限。\n如果每件事情都调用最高标准，最后真正重要的事情来了，你反而没力气了。\n⸻\n二\n所以我慢慢发现，那些真正“不吃压力”的人，可能根本不是我们想象中的那种人。\n他们不是没责任心。\n也不是什么都无所谓。\n恰恰相反。\n他们有一个很厉害的能力：\n他们知道一件事情到底有几斤几两。\n这种人在很多电视剧里其实很常见。\n平时看起来吊儿郎当。\n小事随便，生活马虎，别人着急的时候，他甚至还有心情开玩笑。\n你会觉得：这个人靠谱吗？\n可一旦真正重要的事情发生，他整个人突然就变了。\n注意力全部回来。\n判断非常清楚。\n该承担的责任一点不少。\n该拼命的时候真的拼命。\n这时候你才发现：\n他不是不认真。\n他只是不肯把“认真”浪费在所有事情上。\n这可能是一种被我们严重低估的能力。\n⸻\n三\n我以前做日报统计的时候，很多工作都是手工完成的。\n虽然麻烦，但我几乎可以保证每次都是对的。\n后来有了 AI，我开始把一部分工作交给 AI。\n结果它偶尔会出错。\n假设它只有 80% 的时候是对的。\n以前的我可能会觉得：\n那怎么能用？\n但后来我发现，好像完全可以。\n因为这件事情即使错了，我也有时间发现它、撤回它、改正它。\n于是一个很重要的东西出现了：\n容错率。\n我突然意识到，一件事情应该投入多少精力，可能根本不取决于“它会不会出错”。\n而取决于：\n它错了以后，会怎么样？\n如果一件事情错了以后可以改，那为什么一定要第一次就做到 100 分？\n如果一个游戏的操作忘了可以重新看，那为什么一定要记下来？\n如果一个决定今天做错了，明天还能调整，那为什么非要等到自己“状态最好”的时候才敢开始？\n反过来，如果这是一个很难撤回的决定，影响很多人，错误成本很高，那当然值得认真。\n这么一想，事情突然就不一样了。\n我们真正需要的可能不是一套越来越高的标准。\n而是很多套标准。\n⸻\n四\n重要的会议，我可以用 90 分的标准。\n因为我的准备会影响很多人的时间，也会影响最后的决策质量。\n一个可逆的小项目，也许 60 分就可以开始。\n先做，发现不对，再改。\n一个突然冒出来的新想法，可能 30 分就够了。\n甚至只是随手试一下。\n至于今晚刚下载的一个游戏——\n可能根本不需要标准。\n打开。\n玩二十分钟。\n不知道怎么存档也没关系。\n忘了操作也没关系。\n以后再也不打开，甚至都没关系。\n因为我只是试了一下。\n试一下，不等于承诺。\n这句话对我来说可能尤其重要。\n因为我发现自己很容易把“开始”理解成一种承诺。\n打开一个游戏，就好像以后要把它玩完。\n开始记录，就好像以后要维护这份记录。\n接触一个项目，就开始想怎么把它做好。\n于是每一次开始都会变重。\n可很多东西本来应该是很轻的。\n看看。\n碰碰。\n玩玩。\n不喜欢就走。\n没有结果也可以。\n⸻\n五\n所以我现在觉得，一个人真正的灵活，也许不是“随机应变”这么简单。\n而是他的身体里同时存在很多套标准。\n他可以非常认真，也可以非常随便。\n可以为了一个重要决定查很多资料，也可以在无关紧要的小事上说一句：\n算了。\n可以为了真正重要的事情连续思考几个小时，也可以允许一个游戏玩到一半永远放在那里。\n关键不是标准高还是低。\n而是：\n你能不能把正确的标准，用在正确的事情上。\n这可能也是为什么有些人看起来活得很松，但真正遇到事情却非常可靠。\n他的松弛不是因为他什么都不在乎。\n恰恰是因为他知道自己在乎什么。\n所以他不需要每时每刻证明自己很努力。\n⸻\n我以前总觉得，成熟意味着越来越认真。\n后来才发现，也许成熟还有另外一半：\n开始“不认真”。\n不是降低对自己的要求。\n不是摆烂。\n更不是对什么都无所谓。\n而是终于承认：\n我的时间有限。\n我的注意力有限。\n我的精力也有限。\n所以，我不再给所有事情同样的重量。\n有些事情值得我倾尽全力。\n有些事情，做到差不多就行。\n还有更多的事情——\n我只是想试试而已。\n真正的成熟，也许不是终于学会了对一切负责。\n而是终于知道：\n什么值得认真，什么根本不值得。\n"},{"title":"成熟，接纳别人的“不接纳”",
"url":"/blog/cheng-shou-jie-na-bie-ren-de-bu-jie-na/",
"date":"2026-09-09",
"headings":[],
"body":"最近看《黑镜》，有一集里的女主角是一个年轻的印度裔女孩。\n她生活在一个和自己原本文化很不一样的环境里。亲人已经离开，身边的人也谈不上友善。她很孤独，甚至慢慢生出了一些阴暗的念头。\n看着她的时候，我突然想到一个问题：\n如果你是一个群体里的少数，你要怎么生活？\n这种感觉，其实旅游的人很难真正体会。\n你去一个陌生国家待几天，语言不通也好，被人用异样的眼光看也好，甚至真的遇到一点不友善，过几天你就走了。\n但如果你要在那里生活十年、二十年，完全是另一回事。\n你的口音、肤色、生活习惯，甚至你开玩笑的方式，都可能不断提醒别人，也提醒你自己：\n你和他们不太一样。\n⸻\n我以前总觉得，面对这种问题，答案应该是“融入”。\n语言学得更好一点，了解当地文化，改变自己的生活习惯，多交当地朋友。\n这些当然都有用。\n但后来我慢慢发现一个问题：\n有些差异，本来就是消除不了的。\n一个第一代移民，英语可以说得很好，可以拥有体面的工作，甚至在当地取得很高的社会地位。\n可他的成长经历不会因此消失。\n他的思维方式、饮食习惯、家庭观念，甚至一些非常细微的反应，都可能和当地长大的人不同。\n更不用说外貌。\n所以很多第一代移民最后还是会回到自己的社群。\n唐人街、韩国城、小印度……\n以前我会把它理解成“不愿意融入”，后来才觉得，这也许只是人在寻找一个不需要时时解释自己的地方。\n因为一直当少数，其实是累的。\n⸻\n但这几年，我又开始对这件事有了另一种理解。\n我三十多岁以后，越来越不害怕一个人了。\n不是说我不需要朋友，也不是说孤独不存在。\n而是我慢慢意识到：\n很多事情，本来就不需要别人陪着你才能完成。\n一个人吃饭，可以。\n一个人去陌生的地方，可以。\n周围的人跟我想法不一样，也可以。\n别人没有那么喜欢我，好像也没什么。\n因为生活真正需要解决的问题，其实很具体。\n我的钱从哪里来？\n我住在哪里？\n我要吃什么？\n生病了去哪里看？\n孩子在哪里读书？\n明天我要去哪里，做什么？\n这些问题解决了以后，剩下很多过去觉得天大的事情，突然就没那么大了。\n别人觉得我是一个怎样的人，真的有那么重要吗？\n⸻\n这可能也是年轻时候很难理解的一件事。\n年轻的时候，我们特别需要“属于”。\n希望进入一个圈子，希望有人和自己一起，希望得到认同，希望证明自己不是那个格格不入的人。\n所以被排斥会很痛苦。\n但一个人的心理韧性慢慢建立起来以后，会出现一种很奇怪的变化：\n你仍然希望被接纳，但不再依赖被接纳才能生活。\n这两件事差别非常大。\n前者意味着，我必须找到一个群体证明我属于这里。\n后者意味着，我当然欢迎有人理解我，但就算没有，我也依然知道今天应该怎么过。\n⸻\n所以后来再想移民、留学生，甚至《底特律：化身为人》里的那些仿生人，我突然觉得：\n我们经常把问题问成——\n“少数者应该怎样融入多数？”\n可也许这个问题从一开始就问错了。\n因为它偷偷预设了一件事：\n只有变得和多数人足够相似，你才算获得了一种完整的生活。\n但为什么呢？\n你当然要学习语言，要理解规则，要尊重当地文化，因为这些决定了你能不能和这个社会正常协作。\n但协作，不等于同化。\n你不需要为了证明自己属于这里，而把自己变成和别人一样的人。\n⸻\n我以前有一个同学，在中国人的圈子里就显得有点格格不入。\n他有非常强的探索欲，大学时就喜欢认识五湖四海的人，后来也去了国外。\n现在回头看，也许有些人天生就更容易适应这种生活。\n因为他们从一开始，就没有那么强烈地要求周围的人和自己一样。\n而另一些人，则要经过很多年的生活，才慢慢学会这一点。\n所以所谓心理韧性，可能并不是变得刀枪不入。\n不是别人歧视你，你毫无感觉；也不是一个人生活，就再也不会寂寞。\n而是这些事情发生以后，你仍然能够继续组织自己的生活。\n寂寞了，承认寂寞。\n被排斥了，知道自己被排斥。\n有人不喜欢你，也不必假装毫不在乎。\n但这些事情不再拥有摧毁你整个生活的权力。\n⸻\n我们当然都希望生活在一个更加包容的世界里。\n但一个人的一生，不可能等到所有环境都变得友善以后才开始。\n有时候你就是那个少数。\n有时候你就是那个局外人。\n有时候你走进一个房间，里面没有一个人像你。\n那又怎么样呢？\n你仍然可以工作，可以吃饭，可以读书，可以养育孩子，可以喜欢一些没人理解的东西，也可以一个人去很远的地方。\n空气并不会因为你是少数，就少给你一点。\n脚下的土地，也不会因为你和周围的人不一样，就不允许你站在上面。\n成熟也许不是终于找到了一个所有人都接纳你的地方。\n而是有一天，即使没有被完全接纳，你也知道该怎么把自己的生活过下去。\n"},{"title":"GTA6 和《塞尔达：旷野之息》，其实是同一种游戏",
"url":"/blog/gta6-he-sai-er-da-kuang-ye-zhi-xi-qi-shi-shi-tong-yi-chong-you-xi/",
"date":"2026-09-09",
"headings":[],
"body":"第一次看《GTA6》和《塞尔达：旷野之息》，很难想象有人会把它们放在一起。\n它们甚至像是开放世界的两个极端。\n《GTA》一直在拼命靠近现实。\n城市要像真的，汽车要像真的，路人要像真的，警察追捕要像真的。到了《GTA6》，甚至连海滩上的游客、街边发生的小事、社交媒体，都恨不得把现实世界重新做一遍。\n而《塞尔达：旷野之息》走的是完全相反的方向。\n没有真实存在的城市，没有现代社会，没有汽车和高楼。你醒来就在一个叫海拉鲁的地方，面对怪物、神庙、魔法、滑翔伞，以及一个现实中根本不存在的世界。\n一个拼命模拟现实。\n一个拼命创造现实中不存在的东西。\n但我最近突然发现：\n这两款游戏，其实在做同一件事。\n它们都非常懂得，怎么利用你对现实世界的理解，然后再往前推一点点。\n⸻\n《GTA》真正好玩的地方，恰恰是它“不真实”\n很多人说《GTA》最大的魅力是真实。\n但仔细想想，《GTA》其实一点都不真实。\n现实里你不会因为好奇，突然抢走路边一辆车。\n不会看到警车之后想：\n我现在撞他一下会怎么样？\n更不会从高楼上开着摩托车冲出去，只为了看看自己能不能活下来。\n现实世界有一大堆东西阻止你产生这些念头。\n法律、道德、疼痛、金钱、死亡，以及事情发生之后无法撤销的后果。\n但《GTA》做了一件很聪明的事情：\n它保留了现实的外壳，却修改了现实的代价。\n车还是车，警察还是警察，城市还是城市。\n所以你几乎不需要学习这个世界。\n你看到汽车，就知道它可以开；看到商店，就知道可以进去；看到警察，就知道犯罪以后他们会追你。\n你把几十年来生活在现实世界积累的经验，直接带进了游戏。\n但是接下来，游戏开始允许你做现实中不会做的事情。\n于是一个非常有意思的心理出现了：\n“如果我这样做，会怎么样？”\n这可能才是《GTA》最迷人的地方。\n它不是让你体验现实。\n而是给你一个酷似现实的实验室，让你不断试探现实的边界。\n⸻\n《塞尔达》看起来完全相反，其实干的是同一件事\n《塞尔达》就更有意思了。\n照理来说，一个完全虚构的世界应该更难让人进入。\n如果一个世界里的所有东西都是陌生的，每看到一样东西，你都得先读说明书：\n这是什么？\n它有什么用？\n它遵守什么规律？\n那很快就累了。\n所以《塞尔达》虽然创造了一个幻想世界，却没有真的从零开始创造一切。\n它大量偷用了你对现实世界的直觉。\n火会烧草。\n木头会燃烧。\n金属会导电。\n高处的东西会掉下来。\n石头可以滚下山。\n风会影响物体。\n冷的地方需要御寒。\n下雨的时候岩壁会变滑。\n这些东西甚至不需要游戏告诉你。\n因为你本来就知道。\n这时候，《塞尔达》再悄悄往现实上加一点东西。\n现实里你当然没有希卡之石，也不会拿着滑翔伞从几百米高的山顶跳下来。\n但因为这个世界下面垫着大量你已经理解的规律，所以当游戏在上面增加一点幻想的时候，你很容易接受。\n你不是在从零学习海拉鲁。\n你是在用现实世界的经验，推理一个不存在的世界。\n这件事非常重要。\n⸻\n它们真正相同的地方，是都在奖励一句话\n后来我发现，我玩这两种游戏时，脑子里其实经常出现同一句话：\n“如果我这样做，会怎么样？”\n在《GTA》里：\n如果我抢了这辆车会怎样？\n如果我从这里冲出去会怎样？\n如果我把警察引到这里会怎样？\n如果我不用任务要求的方法解决问题呢？\n在《塞尔达》里也是：\n如果我把这里点着会怎样？\n如果我把这块石头推下去呢？\n如果雷雨天拿着金属武器会怎样？\n如果我从这座山直接飞过去呢？\n表面上，一个人在迈阿密式的现代城市里开跑车，一个人在海拉鲁拿着木棍打怪。\n但玩家脑子里进行的活动几乎一模一样：\n观察世界——产生猜想——动手尝试——等待世界回应。\n而真正厉害的地方，就出现在最后一步。\n世界真的回应了你。\n⸻\n这可能才是优秀开放世界最难做的地方\n有些开放世界也很大。\n地图上有森林、有城市、有山、有河流，有几百个任务和密密麻麻的问号。\n但玩久以后，你会发现自己其实并没有在“探索一个世界”。\n你只是在清单。\n去这里，接任务。\n去那里，杀敌人。\n爬上这个塔。\n打开那张地图。\n收集八个东西。\n再去下一个地方。\n世界看起来很大，但你和世界之间的关系非常单一。\n它一直在告诉你应该做什么，而不是等待你问它能做什么。\n《GTA》和《塞尔达》最厉害的地方，恰恰不是给玩家塞进了多少内容。\n而是它们让玩家不断产生问题。\n那里能不能去？\n这个东西能不能用？\n我这样做会发生什么？\n还有没有另一种办法？\n然后游戏尽可能地回答你。\n所以真正让人沉迷的，也许根本不是“自由”。\n而是好奇心得到了反馈。\n自由只是前提。\n真正让自由变得好玩的，是你做了一件设计师没有明确要求你做的事情，这个世界居然依然有反应。\n那一刻，你才会突然觉得：\n这个世界好像不是专门等着我完成任务的。\n它好像真的在运转。\n⸻\n所以，《GTA》和《塞尔达》可能真的属于同一种游戏\n一个借用了更多现实。\n一个借用了更少现实。\n一个先让你看到熟悉的城市，再允许你突破现实的限制。\n一个先创造陌生的海拉鲁，再用现实世界的规律帮助你理解它。\n但它们最后都在做同一件事：\n先给你足够多的熟悉，让你知道自己可以做什么；再给你足够多的未知，让你忍不住想试试还能做什么。\n这可能也是我现在越来越觉得，评价一个开放世界，地图大小并没有那么重要的原因。\n真正重要的是：\n当玩家突然冒出一句“如果我这样做会怎么样”，这个世界有没有准备好回答他。\n最糟糕的开放世界，是地图很大，但你很快就知道这里什么都不能做。\n而最好的开放世界，可能恰恰相反。\n你已经玩了几十个小时，\n却还是会看着远处的一个东西，突然冒出一个念头：\n“等等……这个不会也可以吧？”\n然后你试了一下。\n居然真的可以。\n"},{"title":"最累的人，不是干活最多的人",
"url":"/blog/zui-lei-de-ren-bu-shi-gan-huo-zui-duo-de-ren/",
"date":"2026-09-07",
"headings":[],
"body":"我以前一直以为，工作里最累的人，大概就是事情最多的人。\n后来慢慢发现，不一定。\n有些人手上的事情很多，但每天做得很干脆：该做什么做什么，做到哪一步就推进到哪一步，需要别人提供什么就明确提出来，到时间没有收到，就把当前状态摆出来。\n反而有一些人，事情未必最多，却每天都很累。\n因为他的工作里充满了另一种东西：\n等人。\n催人。\n替别人着急。\n担心催得太急别人不高兴，担心对方最近太忙，担心自己是不是应该再宽限两天。\n最后，一件本来很简单的事，被做成了一场漫长的心理活动。\n为什么收材料的人，最后反而成了最着急的人？\n比如公司要求各地提交一份材料。\n规则很清楚，截止时间也很清楚。\n到了时间，有人没交。\n正常来说，谁没交，压力应该在谁身上。\n但现实经常完全相反。\n负责收集的人开始着急了：\n是不是他最近比较忙？\n我要不要再等等？\n是不是应该私聊提醒一下？\n催了一次没回，要不要再催一次？\n最后实在收不齐，甚至开始帮对方整理、补数据、找理由。\n最奇怪的事情就这样发生了：\n一个人的责任，慢慢变成了另一个人的压力。\n而且你越负责，这种转移越容易发生。\n因为别人知道，最后你会催。\n催不动，你会想办法。\n实在不行，你甚至会帮他兜底。\n第一次是体谅，第二次是帮忙，第三次就可能变成默认的工作方式。\n对方甚至不会觉得自己拖延了。\n因为真正感受到截止日期的人，不是他，是你。\n我后来发现，工作里有时候应该像机器人一点\n机器人有一个很值得人学习的地方：\n它不会因为别人的任务没有完成，就自动修改自己的责任边界。\n假设一个流程有五步。\n第一步完成了，机器人就进入第二步。\n第三步需要另一个人的输入，对方没有完成，那么系统显示：\n卡在第三步，等待某某输入。\n就这么简单。\n机器人不会坐在那里想：\n他是不是最近比较辛苦？\n我要不要晚两天再找他？\n如果这个项目黄了，是不是显得我能力不行？\n我要不要偷偷帮他把第三步也做了？\n人会。\n所以很多所谓的“工作压力”，仔细拆开之后，会发现根本不是自己的工作量。\n而是我们在脑子里接管了太多本来属于别人的任务。\n真正值得学习的，并不是机器人的“无情”。\n而是它有一种人很难做到的能力：\n只处理自己能够处理的部分，不替整个世界负责。\n我能推进的，继续推进。\n需要别人输入的，明确输入。\n到了截止时间，更新状态。\n有人卡住了，如果我有办法、而且值得解决，我可以帮助。\n如果没有，那就把“卡在哪里、卡在谁那里”如实呈现。\n事情重要，自然会有人介入。\n事情不重要，也许它本来就不值得所有人围着它焦虑。\n这比一个人默默地追着所有人跑，要健康得多。\n好的管理，不应该靠一个“特别负责的人”撑着\n再往下想一步，这其实就不只是个人心态的问题了。\n它是一个组织设计的问题。\n为什么有些公司的收集工作特别痛苦？\n因为整个系统的设计就是：\n让收集人对“收齐”负责。\n于是，别人不交，最后挨批的却是收集人。\n那他当然只能不停地催。\n更好的设计是什么？\n不是让一个人私下追着十个人跑，而是让状态公开。\n10个人，7个人已提交，3个人未提交。\n谁没交，一目了然。\n这时候，收集人的任务是维护流程，而不是替所有人承担结果。\n这两个定义看起来只差一点点，工作体验却完全不同。\n甚至很多公司经常说的一句话，我现在也觉得值得警惕：\n“你们总部要多配合一下业务。”\n当然，总部不能设计一堆毫无意义的表格去折腾一线。\n一件事情被设计出来之前，首先应该证明它有必要，而且尽可能减少别人的工作量。\n但一旦确认这件事情是必要的，就不应该再变成“总部求着大家配合”。\n因为这不是谁帮谁。\n大家只是在共同参与一个组织已经决定要运行的流程。\n谁负责制定规则，谁负责提供输入，谁负责审核，谁负责最终结果。\n把这些接口定义清楚，比每天喊“大家互相配合一下”有效得多。\n真正成熟的系统，甚至应该尽量减少“配合”这件事本身。\n因为很多时候，所谓配合，其实是在用人情弥补流程的模糊。\n所以，我越来越觉得，人工作的时候可以适当地“机器人化”\n不是让自己变得冷漠。\n更不是不要同理心。\n而是把“做人”和“做事”稍微分开一点。\n同事遇到困难，我当然可以理解他。\n他真的需要帮助，我也可以帮助他。\n但理解一个人，不等于接管他的责任。\n这是两件完全不同的事。\n我们总觉得，一个特别负责的人，会让组织运行得更好。\n但一个组织如果必须依靠某个人天天催、天天提醒、到处救火、不断替别人兜底才能正常运行，这恰恰说明它的系统有问题。\n真正好的系统，应该让普通人按照规则做事，也能够顺畅地往前走。\n谁完成了，系统知道。\n谁没完成，系统也知道。\n谁卡住了，责任停留在那里，而不是悄悄流向那个最焦虑、最好说话、最有责任心的人。\n所以现在再看工作里那些特别累的人，我有时候会觉得：\n他们不一定是干活最多的人。\n他们可能只是承担了太多本来不属于自己的压力。\n很多内耗，不是因为事情太多，而是因为责任总是流向那个最有责任心的人。\n"},{"title":"AI最难学的，不是怎么做，而是什么更重要",
"url":"/blog/aizui-nan-xue-de-bu-shi-zen-me-zuo-er-shi-shen-me-geng-zhong-yao/",
"date":"2026-09-04",
"headings":[],
"body":"最近玩《底特律：化身为人》，有一个选择让我印象很深。\n康纳是一台非常先进的仿生人。他的任务是追查异常仿生人，分析能力、推理能力、行动能力几乎都是顶级的。\n有一次，他正在追一个非常重要的目标。\n追到一半，他的搭档汉克遇到了危险。\n游戏突然给了你一个选择：\n救汉克，还是继续追？\n我当时几乎没有犹豫，选择了救人。\n因为站在人类的角度，这似乎是一个很自然的答案：任务再重要，也不能眼睁睁看着自己的搭档出事。\n但后来我突然想到：\n如果我是制造康纳的人，我会希望他怎么选？\n事情一下就没那么简单了。\n⸻\n如果康纳的最高指令是“完成任务”，那么他当然应该继续追。\n线索可能稍纵即逝，目标跑掉之后，可能还会伤害更多的人。\n从效率上说，为了一个人放弃整个任务，甚至可能导致更多人受到伤害，未必是最优解。\n可如果康纳真的这么做了，我们又很可能会说：\n这个机器人太冷血了。\n于是问题来了。\n我们到底希望AI怎么选？\n这也是我玩《底特律》时，第一次真正意识到：\nAI最难学的，可能根本不是怎么做，而是什么更重要。\n怎么追踪一个人，可以计算。\n怎么分析现场，可以训练。\n怎么判断路线，可以优化。\n甚至怎样把一件事情做到效率最高，都可以慢慢找到越来越好的答案。\n但“什么更重要”不一样。\n因为它涉及排序。\n任务重要，还是生命重要？\n眼前这个人的生命重要，还是未来更多人的安全重要？\n规则重要，还是感情重要？\n结果重要，还是过程重要？\n这些问题最麻烦的地方，不是AI不知道答案。\n而是人类自己就没有统一答案。\n⸻\n这让我重新理解了现在AI领域经常提到的一个词：Alignment，也就是“对齐”。\n我们很容易把对齐理解成：\n让AI按照人类的要求做事。\n但“做事”其实可能是最容易对齐的部分。\n我要一张什么格式的表格，我可以告诉你。\n我要你按照什么流程处理订单，我也可以写成规则。\n甚至开车、搬运、诊断、写程序，只要目标足够明确，都可以不断提高准确率。\n真正麻烦的是：\n当两个正确的目标发生冲突时，谁排在前面？\n这时候，规则就开始失效了。\n就像康纳面对的选择。\n“保护人类”是对的。\n“完成任务”也是对的。\n“阻止更多伤害”还是对的。\n可它们偏偏在某个瞬间冲突了。\n你必须牺牲其中一个。\n这才是最难的地方。\n⸻\n而且更有意思的是，不同的人会给AI不同的答案。\n一个极度强调结果的人，可能会告诉康纳：\n别管汉克，继续追。\n一个更看重人与人之间关系的人，会说：\n先救人。\n警察系统可能希望他优先考虑公共安全。\n汉克本人可能又有完全不同的答案。\n所以我们经常说：\n要让AI符合“人类的价值观”。\n但仔细想想，这句话本身就有一个问题：\n哪一个人类的价值观？\n人类从来没有一套整整齐齐、所有人共同遵守的价值排序。\n我们真正拥有的，是无数套互相重叠、又经常彼此冲突的价值观。\n平时没有冲突的时候，大家看起来差不多。\n真正到了必须二选一的时候，区别才会暴露出来。\n⸻\n所以我现在觉得，AI对齐最难的地方，可能不是教会AI“什么是对的”。\n而是教它：\n当两件事情都是对的时候，哪一件更重要。\n甚至这句话还不够。\n还要加一句：\n在什么情况下，哪一件更重要。\n这已经不是给AI写几条规则那么简单了。\n某种意义上，我们是在要求AI学习一件连人类自己都争论了几千年的事情：\n如何取舍。\n所以《底特律：化身为人》里康纳真正有意思的地方，并不是他越来越像不像人。\n而是随着游戏推进，他不断遇到那些程序无法轻易解决的问题。\n你会渐渐发现：\n一个完美执行命令的机器人，其实很好制造。\n真正难制造的，是一个知道什么时候不该完美执行命令的机器人。\n"},{"title":"为什么第一人称恐怖游戏，恐怖得多？",
"url":"/blog/wei-shen-me-di-yi-ren-cheng-kong-bu-you-xi-kong-bu-de-duo/",
"date":"2026-09-04",
"headings":[],
"body":"前段时间我玩了一个第一人称恐怖游戏。\n其实故事没有多复杂，怪物也谈不上多有创意，但玩的时候，我就是会紧张。\n尤其是走进一条黑漆漆的走廊，背后突然传来一点声音的时候，人会下意识地想回头，又不太敢回头。\n后来我突然想到一个问题：\n为什么第一人称恐怖游戏，会比第三人称恐怖那么多？\n明明屏幕还是那块屏幕，怪物还是那个怪物，甚至画面、剧情、音效都可以完全一样。\n唯一的区别，不过是镜头的位置变了。\n但人的感觉完全不同。\n第三人称的时候，危险发生在“他”身上\n玩第三人称游戏的时候，屏幕里始终有一个角色。\n怪物冲过来，你看到的是：\n怪物正在追他。\n虽然这个“他”是由你控制的，但你和危险之间始终隔着一层。\n而且第三人称通常给你更多信息。\n你能看到角色背后，能看到怪物离你多远，能看到旁边有没有路。\n所以你很容易开始思考：\n往哪边跑？\n这个怪怎么打？\n能不能绕过去？\n这时候，你更像一个指挥官。\n你在控制一个人逃命。\n第一人称的时候，那个“他”消失了\n切成第一人称以后，屏幕里的角色不见了。\n剩下的只有你眼前有限的视野。\n背后有什么，你不知道。\n转角后面有什么，你也不知道。\n想确认身后的声音来自哪里，你必须亲自转过去。\n于是怪物突然冲出来的时候，你感受到的不再是：\n“它扑向了我的角色。”\n而是：\n“它扑过来了。”\n这两个感觉差别非常大。\n甚至连开门都会变得恐怖。\n因为你不是在看一个角色推开门。\n是你亲手把一扇不知道后面有什么的门推开。\n于是游戏开始完成一个很有意思的转换：\n它把你的思考，变成了你的反应。\n你明明知道这是假的。\n但突然一个声音响起，你还是会停下来；\n怪物冲到脸上，你还是会身体往后一缩；\n身后出现脚步声，你甚至会下意识回头。\n你的理智知道自己坐在房间里。\n但你的身体已经开始应对危险了。\n好的体验，都在缩短“我”和事情之间的距离\n后来我发现，不只是游戏。\n电影院为什么要关灯？\n可能就是为了尽量让现实世界从你的注意力里消失。\n恐怖片为什么那么依赖声音？\n因为一个声音从“背后”响起来，比你在屏幕上看到一个东西，更容易让身体产生反应。\n为什么有些故事文字本身很普通，做成多人演绎的有声节目以后，却突然变得很好听？\n因为人物的声音、呼吸、停顿、环境音，会把原本需要你自己想象的场景拉到你面前。\n4D电影、VR也是类似的。\n它们做的事情看起来不同，其实都在缩短一段距离：\n从“我知道这件事情发生了”，到“我感觉这件事情正在发生在我身上”。\n距离越远，你越像观察者。\n距离越近，你越像当事人。\n所以我现在觉得，我们经常说的“沉浸感”，其实可以说得更具体一点：\n所谓沉浸，就是让一个人慢慢失去旁观者的位置。\n这也是为什么第一人称恐怖游戏那么恐怖。\n它根本不需要让你真的相信世界上有鬼。\n你从头到尾都知道这是假的。\n它只需要在某一个瞬间，让你忘记自己正在“看一个人遇到危险”。\n因为那一刻，你感觉到的是：\n危险正在向我发生。\n而真正厉害的体验设计，可能就是这样——\n理智还知道它是假的，身体已经先当真了。\n"},{"title":"很多游戏不是在增加内容，而是在增加沉没成本",
"url":"/blog/hen-duo-you-xi-bu-shi-zai-zeng-jia-nei-rong-er-shi-zai-zeng-jia-chen-mei-cheng-ben/",
"date":"2026-09-03",
"headings":[],
"body":"最近我连续玩了几款游戏：《时空之轮》《底特律：化身为人》《巫师3》。\n它们有一个共同点：都在想办法让你玩得更久。\n多结局、多周目、支线任务、地图探索、收集要素……现在评价一款游戏，我们也很习惯问一个问题：\n“这游戏能玩多少小时？”\n以前我也觉得，能玩100小时肯定比只能玩20小时划算。\n但最近我开始觉得，游戏时长可能是一个很糟糕的评价指标。\n因为100小时的游戏，不代表有100小时的内容。\n有时候，它可能只有30小时的体验，剩下70小时都是重复。\n⸻\n多结局，有时是在惩罚最喜欢游戏的人\n《时空之轮》有很多结局。\n第一次知道的时候，我其实挺兴奋的。\n因为我有一点收集癖：既然已经玩了，就会忍不住想把所有结局都打出来。\n但真正开始收集以后，我慢慢发现一个问题：\n有些结局之间真正不同的部分，其实很短。\n为了看到最后那一点变化，我可能需要重新走一段已经非常熟悉的流程，重新打已经打过的敌人，重新经历已经知道结果的剧情。\n于是一个很奇怪的事情发生了：\n越喜欢这个游戏、越想把它玩完整的人，反而越容易被迫承受最多的重复。\n这时候，多结局到底是在奖励玩家，还是在惩罚玩家？\n这个问题不只存在于多结局。\n《刺客信条》里可以有几十个任务，但换个人、换个地点、换段对白之后，底层可能还是潜入、跟踪、刺杀、搜东西。\n《巫师3》的支线之所以评价更好，很大程度上是因为它经常会给任务加一些故事上的变化：委托你的人可能撒了谎，看起来的受害者未必真是受害者。\n可即便如此，当这种结构出现得足够多以后，你也会开始预判：\n好了，这个人肯定又没跟我说实话。\n所谓的“反转”，也会变成另一种重复。\n所以我现在觉得，衡量一款游戏内容多少，可能需要另一个指标：\n体验密度。\n⸻\n40小时和100小时，谁的内容更多？\n假设有两款游戏。\n一款只有40小时，但你不断遇到新人物、新机制、新地图、新故事，每隔一段时间都在想：\n后面还有什么？\n另一款号称可以玩100小时，但大量时间都花在清地图问号、重复战斗、收集材料，以及为了另一个结局重新跑已经跑过的流程。\n哪一款游戏的“内容”更多？\n如果按游戏时长计算，当然是后者。\n但如果按体验密度计算，答案可能完全相反。\n所以，时间不是内容的单位，体验才是。\n同样是重复使用一套游戏机制，如果二周目给了新的敌人、新的挑战、新的剧情，它依然可以产生新的体验。\n这也是为什么我很喜欢一些真正有内容的二周目，或者《巫师3》的《石之心》《血与酒》这种大型DLC。\n操作系统还是原来的，人物甚至还是原来的人物。\n但故事是新的，地点是新的，问题是新的。\n它不是让我把吃过的饭再吃一次。\n而是还用这套餐具，给我端上来一道新菜。\n⸻\n最危险的，是把“完成感”误认为“满足感”\n更值得讨论的是：\n为什么明明已经觉得重复了，我们还是会继续玩？\n因为很多人都有一种很强的完成欲。\n地图已经开了80%，那就想开到100%。\n结局已经打了8个，那剩下4个也想看看。\n成就已经拿了47个，看到那几个灰色图标就不舒服。\n这本身甚至是一种很好的品质。\n我们希望一件事情有始有终，希望把开始的东西完成，希望看到那个100%。\n问题在于，游戏太容易利用这种心理。\n它只需要不断制造“还差一点”，就可以让你继续投入时间。\n于是玩家继续玩的动力，悄悄发生了变化。\n一开始是：\n我想知道后面还有什么。\n后来变成：\n都玩这么久了，不打完太可惜了。\n这两句话看起来都能让一个人继续玩几个小时，但背后的体验完全不同。\n前者叫期待感。\n后者叫沉没成本。\n一个好的游戏应该尽可能依赖前者，而不是后者。\n⸻\n“终于通关了”，有时候不是赞美\n这也解释了我现在越来越警惕的一种游戏体验。\n一款游戏玩到最后，我说：\n“终于通关了。”\n以前我会把这句话理解成一种成就感。\n现在想想，它有时候其实意味着另一件事：\n终于不用玩了。\n这可能是一个非常糟糕的产品信号。\n玩家明明已经不再享受，却因为地图还没有清完、结局没有收齐、任务栏还有感叹号，而舍不得放弃已经投入的几十个小时。\n游戏当然可以设计100小时，可以有12个结局，可以有几百个任务。\n但这些数字本身不应该成为值得炫耀的东西。\n真正值得问的是：\n这100个小时里，到底有多少小时，是玩家没见过的东西？\n⸻\n所以现在再看一款游戏，我已经不太关心它能玩30小时还是100小时。\n我更关心另外一个问题：\n它每小时能给我多少新的体验？\n多结局当然可以很好，多周目也可以很好，开放世界更没有问题。\n但它们成立的前提，是让我不断产生新的期待，而不是不断利用我“既然开始了就想做完”的心理。\n因为真正优秀的游戏，应该让人在通关以后说：\n“怎么这么快就结束了？”\n而不是看着100%的完成度，长舒一口气：\n“终于结束了。”\n"},{"title":"人生真正要做的，是减少自己成为猎物的机会",
"url":"/blog/ren-sheng-zhen-zheng-yao-zuo-de-shi-jian-shao-zi-ji-cheng-wei-xi-wu-de-ji-hui/",
"date":"2026-09-02",
"headings":[],
"body":"最近领导交代了一个数据分析的任务。\n我发现一个挺有意思的现象。\n有些同事拿到任务以后会很焦虑：数据从哪里找？怎么统计？Excel 能不能做？要花多久？如果数据不完整怎么办？\n但我看到这种任务的时候，反而经常有一种很奇怪的感觉：\n像猎人看到了猎物。\n不是因为这个任务简单，而是因为我脑子里已经摆着很多“武器”。\n这个问题可以用 Excel 公式解决，那个问题可以写个脚本；数据量再大一点，可以直接翻数据库；实在不知道怎么处理，还可以扔给 AI，让它帮我找思路。\n所以当目标明确以后，我考虑的通常已经不是：\n“这个东西我会不会做？”\n而是：\n“我用哪件武器做最快？”\n这让我想到最近看的一本盗墓小说。\n小说里有一种很可怕的虫子。\n普通人看到它，第一反应大概是跑。因为你不知道它是什么，不知道它会怎么攻击你，也不知道应该怎么对付它。\n但那些经验丰富的盗墓者看到以后，反应完全不同。\n他们知道这是什么，知道它怕什么，也知道自己身上哪件工具能对付它。于是符咒、药粉、工具，一套东西马上就上去了。\n同一个东西。\n在普通人眼里，是危险。\n在专业的人眼里，却像猎物。\n我突然觉得，这可能是一个非常值得思考的问题：\n猎人和猎物，有时候并不是固定的身份。\n它更像是某一个具体场景里，你和问题之间的相对位置。\n⸻\n一个人什么时候最容易成为“猎物”？\n不是弱的时候。\n而是不知道发生了什么的时候。\n你不知道对方想干什么，不知道事情接下来会怎么发展，不知道自己有哪些选择，也不知道手里有什么东西可以反制。\n这时候，你只能被事情推着走。\n所以很多所谓的“捕猎”，真正利用的其实不是力量差距，而是认知差、经验差和工具差。\n这也解释了为什么“PUA”这个概念前几年会那么火。\n一个非常熟悉两性关系、熟悉心理机制、甚至专门研究过某些操控技巧的人，面对一个毫无经验的人，两个人看起来是在谈同一场恋爱，实际上掌握的信息可能完全不对称。\n一个人在体验感情。\n另一个人可能在观察反应、控制节奏、测试边界。\n所谓“最高端的猎人，往往以猎物的形式出现”，真正让人警惕的也正是这一点：\n真正危险的东西，很少会告诉你它正在捕猎你。\n而这种关系又何止存在于两性关系里。\n商业谈判、职场博弈、消费陷阱、人情往来，甚至一次很普通的合作，都可能存在类似的信息不对称。\n别人已经见过这套东西几十遍了。\n而你是第一次。\n那一刻，对方天然就比你多了一点主动权。\n⸻\n所以我慢慢觉得，“猎人思维”最值得学习的，并不是攻击别人\n而是准备。\n真正有经验的人遇到事情，脑子里不是空的。\n他有案例，有工具，有方法，有过去踩过的坑，还有一套自己总结出来的判断方式。\n事情没发生的时候，这些东西看起来都没什么用。\n可一旦事情出现，它们就会瞬间改变一个人的位置。\n就像数据分析。\n如果我过去从来没有研究过 Excel，不会写脚本，没有碰过数据库，也不知道 AI 能做什么，那么领导突然扔给我一个复杂的数据任务，我一样会焦虑。\n那个任务没有变。\n领导也没有变。\n数据更没有变。\n变的只是我手里的武器多了。\n于是原本追着我跑的问题，突然变成了一个可以被拆解、被研究、被解决的对象。\n攻守就在这一瞬间发生了变化。\n⸻\n这可能也是“积累”真正的意义\n我们平时学一个东西，总喜欢问：\n这个以后有什么用？\n但很多能力的价值，恰恰不是今天学完，明天马上兑现。\n它更像是在往自己的武器库里放东西。\n你学会识别一种话术，是放进去一件武器。\n你经历一次谈判，回来认真复盘，是放进去一件武器。\n你解决过一次复杂的数据问题，把方法留下来，也是在放进去一件武器。\n甚至一次被骗、一次吃亏、一次错误的选择，如果最后被你总结出了规律，都不算白白发生。\n下一次再遇到类似的事情，你看到的世界已经不一样了。\n别人看到一只从没见过的怪物。\n你看到的是：\n哦，原来是这个。\n这种感觉非常重要。\n因为真正让人恐惧的，往往不是事情有多困难，而是你根本不知道自己面对的是什么。\n⸻\n当然，我并不是说，一个人有了这些能力以后，就应该去“捕猎”别人。\n这是另外一个问题。\n能力决定你能不能做，价值观决定你做不做。\n你可以懂 PUA 的机制，但不代表你要操控别人。\n你可以懂谈判中的心理博弈，但不代表你要欺骗别人。\n你可以看懂别人的弱点，也可以选择不利用它。\n甚至我觉得，真正成熟的状态恰恰是：\n我知道这场游戏怎么玩，但我可以选择不这么玩。\n因为“不伤害别人”如果只是建立在“我什么都不懂”之上，它其实非常脆弱。\n更重要的是，你不懂，并不会阻止别人懂。\n⸻\n所以后来我再想“猎人和猎物”这个比喻，觉得它真正有意思的地方，并不是教我们怎样成为猎人。\n而是在提醒我们：\n不要让自己永远毫无准备地进入别人的游戏。\n多经历一点，多研究一点，多复盘一点。\n把吃过的亏变成经验，把解决过的问题变成方法，把偶然成功的事情总结成能力。\n一点点扩充自己的武器库。\n你未必要捕猎谁。\n但至少下一次，当那个东西再次出现在你面前的时候，你不再只有害怕和逃跑两个选项。\n你知道它是什么。\n你知道自己有什么。\n你也知道自己可以怎么选。\n人生真正要做的，也许从来不是成为猎人。\n而是不断减少自己成为猎物的机会。\n"},{"title":"写作者的尴尬：文章是你写的，好不好却不是你说了算",
"url":"/blog/xie-zuo-zhe-de-gan-ga-wen-zhang-shi-ni-xie-de-hao-bu-hao-que-bu-shi-ni-shuo-liao-suan/",
"date":"2026-09-02",
"headings":[],
"body":"写东西有一个很尴尬的地方。\n你花了很多时间想一个选题，反复修改一个句子，想着怎么表达得漂亮一点，怎么把观点再挖深一点，甚至为了一个标题纠结半天。\n最后你终于觉得：\n这篇不错。\n然后发出去，没人看。\n反而有一天，你随手写了一个自己觉得很普通的东西，突然很多人转发、评论。\n这时候你会发现一个很残酷的事实：\n文章是你写的，但文章好不好，并不完全由你决定。\n因为一篇文章真正完成的那一刻，不是你敲下最后一个句号的时候。\n而是有人读到它的时候。\n你写下的是你的版本，读者看到的却是他的版本。\n你觉得这个观点很深，他可能觉得离自己太远；你觉得这个句子很漂亮，他可能根本没有停下来；你自己觉得很普通的一段经历，他却可能因为刚好遇到过同样的问题，一下子记住了。\n所以写作者很容易犯一个错误：\n花太多时间研究自己，却花太少时间研究读者。\n我以前也会觉得，写作能力的提高，就是多读好文章、研究文笔、学习结构、把一个选题想得更深。\n这些当然有用。\n但如果你的文章最终是要给别人看的，那么还有一种能力可能同样重要：\n了解别人到底对什么有反应。\n而这件事靠想是想不出来的。\n你不能坐在电脑前虚构一个“读者”，然后猜他喜欢什么。\n最简单的方法，其实就是写出去。\n与其花十天憋一篇自己认为90分的文章，不如先写十篇60分的文章。\n一个谈工作，一个谈游戏，一个谈生活，一个写自己的经历，一个写最近大家都在讨论的事情。\n然后看看真实的反馈。\n哪篇有人看完？\n哪篇有人留言？\n哪句话有人转发？\n哪个选题你自己觉得一般，别人却特别有感觉？\n这其实就是写作者的市场调研。\n它甚至可能比你一个人在那里琢磨“怎样成为更好的写作者”有效得多。\n因为你终于不再猜了。\n你开始拿真实世界校准自己的判断。\n这也是为什么我现在觉得，写作者有时候不用把自己逼得那么紧。\n不是每一次动笔，都必须找到一个绝妙的选题；也不是每篇文章，都值得在发布之前打磨到自己心里的90分。\n有些文章的任务，就是出去试一下。\n看看世界有没有反应。\n如果没有，换一个。\n如果有，再往下挖。\n写作不是闭门考试。没有人因为你想了三天，就多给你三十分。\n真正有价值的反馈，很多时候只有在文章离开你以后才会出现。\n所以写作者真正需要练习的，也许不只是“怎么写得更好”。\n还有另外一种能力：\n少一点自我感动，多一点对真实反应的观察。\n毕竟，文章是你写的。\n但它离开你的那一刻，才真正开始接受考试。\n"},{"title":"最高级的表达，不是最高级形容词，而是最高级事实",
"url":"/blog/zui-gao-ji-de-biao-da-bu-shi-zui-gao-ji-xing-rong-ci-er-shi-zui-gao-ji-shi-shi/",
"date":"2026-09-02",
"headings":[],
"body":"最近听到一个词，觉得挺有意思：词语通货膨胀。\n现在很多表达，好像都在不断往上加码。\n一个讲座，不能只是“很好”，要说“极具水准”“难得一见”“业内顶级”。\n一个产品升级，不能只是“升级很大”，而要说“史上最大升级”“前所未有”“重新定义”。\n产品名字也一样。\nPro 不够了，还有 Max；Max 不够，还有 Ultra；Ultra 再不够，好像只能继续往宇宙里走。\n问题是，当所有东西都开始用“最”的时候，“最”也就慢慢不值钱了。\n第一次听到“史诗级升级”，可能还会觉得很厉害。\n听到第十次，就只是一个发布会 PPT 上应该出现的词。\n这有点像通货膨胀。\n以前一个“很好”就能表达的东西，现在要用“极好”；“极好”不够，要“顶级”；“顶级”也不够，就得“史上最强”。\n词越来越大，感觉却越来越小。\n于是出现了一个挺尴尬的问题：\n当我们真的遇到一个特别好的东西时，反而不知道该怎么形容了。\n一家餐厅真的很好吃，怎么说？\n“这是我吃过最好的餐厅之一。”\n听起来像大众点评。\n一个老师的课真的讲得特别好，怎么介绍？\n“这是业内顶级专家带来的高水平课程。”\n听起来又像宣传稿。\n后来我发现，也许问题不是我们的形容词还不够大，而是我们太依赖形容词了。\n真正有力量的表达，可能恰恰不需要“最”。\n比如：\n不说“这是我最喜欢的餐厅”，而说：\n“我已经来这里吃第五次了。”\n不说“这是我听过最好的讲座”，而说：\n“两个小时，几乎没人低头看手机。”\n不说“这是史上最大的手机升级”，而说：\n“这是第一代让我出门不再想带相机的手机。”\n不说“这本书对我影响巨大”，而说：\n“我看完三年了，做决定的时候还会想起里面的一句话。”\n这些句子甚至没有告诉你“它很好”。\n但你自己会得出这个结论。\n这可能才是表达里很有意思的一件事：\n形容词是在替读者下判断，事实是在让读者自己下判断。\n而后者往往更可信。\n所以，当“最好”“顶级”“巨大”“史诗级”这些词已经被用得有些通货膨胀时，也许我们不需要再发明一个比 Ultra 更 Ultra 的词。\n只需要退回来，把那个真正打动我们的事实说清楚。\n最高级的表达，不是最高级形容词。\n而是最高级事实。\n"},{"title":"你以为你在工作，其实你只是在玩一款你不懂规则的游戏",
"url":"/blog/ni-yi-wei-ni-zai-gong-zuo-qi-shi-ni-zhi-shi-zai-wan-yi-kuan-ni-bu-dong-gui-ze-de-you-xi/",
"date":"2026-08-31",
"headings":[],
"body":"我最近突然觉得，“游戏”和“生活”之间的界线，可能没有我们想象得那么清楚。\n我们习惯把一天切成几个部分：\n上班是在工作，下班是在生活，打开电脑是在玩游戏，看书是在学习。\n于是工作累了，我们会想：“我要去玩一会儿游戏。”\n游戏玩久了，又会产生一种负罪感：“不能再玩了，该干点正事了。”\n但如果把这些标签全部撕掉，会发现一件很有意思的事：\n很多时候，工作和游戏做的其实是同一件事。\n一\n一个人刚打开一款陌生的游戏，第一件事是什么？\n先搞清楚：这到底是个什么游戏？\n规则是什么？\n我扮演谁？\n我要完成什么？\n手里有哪些资源？\n哪些东西现在打不过？\n下一步应该去哪里？\n玩《巫师3》，你不会一级的时候非要跑去挑战一个二十级的怪物。发现打不过，你会看看是不是等级不够，是不是装备太差，是不是技能点错了，还是自己压根来错了地方。\n但到了工作里，我们反而经常忘记这些。\n领导扔过来一个项目，我们马上开始干。\n做PPT、拉群、开会、催进度、填表格，忙了半天，却很少停下来问：\n这个项目的胜利条件到底是什么？\n老板真正要的是完成任务，还是提高营收？\n哪些是主线，哪些只是支线？\n我现在缺的是能力，还是资源？\n哪些NPC能给我提供关键道具？\n哪些Boss根本不是现在应该打的？\n很多工作能力很强的人，我发现他们其实特别像老玩家。\n不是因为他们更能吃苦，而是因为他们会先研究这个世界的规则。\n他们知道什么事情值得做，什么事情做了经验值很低；知道什么时候应该自己打，什么时候应该组队；也知道一个任务如果奖励太差，完全可以不接。\n所以有些人工作十年，像玩了十年游戏却还在新手村刷小怪。\n另一些人工作几年，却已经开始研究地图、资源、机制和版本更新了。\n区别未必是努力程度。\n可能只是后者更早意识到：\n我不是来完成所有任务的，我是来完成自己的目标的。\n二\n当然，现实和游戏有一个巨大的区别。\n游戏可以重来。\nGTA里你可以抢银行，可以飙车，可以从楼顶跳下去。失败了，大不了重新读档。\n现实不行。\n有些事情的代价无法撤销，有些选择没有存档点，有些风险甚至一次都不能试。\n但这恰恰也是游戏很迷人的地方。\n它替我们扩展了人生的体验边界。\n现实中我不可能去抢银行，但我可以在游戏里体验一次被警察追着满城跑。\n现实中我不可能成为中世纪猎魔人，却可以在游戏里接委托、调查怪物、讨价还价。\n我也不可能真的穿越到公元600年，再跑到2300年的废墟看看人类文明变成了什么样。\n游戏创造了一个低成本、可重来的世界，让我们暂时拥有一些现实人生无法提供的经历。\n从这个角度看，玩游戏并不天然比工作“浪费时间”。\n工作也不天然比游戏“有意义”。\n真正的问题应该是：\n我现在想获得什么？\n三\n这可能才是我最近最想说的一件事。\n我们太容易按照社会已经分好的格子生活。\n工作时间就应该工作。\n学习时间就应该学习。\n娱乐时间才能娱乐。\n游戏属于娱乐，论文属于学习，项目属于工作，旅行属于生活。\n但人真正的需求不是这样分的。\n假如我最近突然对科幻产生了兴趣，那我完全可以去读《三体》，可以看《银翼杀手》，可以玩一款科幻游戏，也可以去翻宇宙学的科普书。\n形式根本不重要。\n我真正追逐的是“科幻”带给我的那种体验。\n同样，如果最近工作中有一个问题一直困扰我，我也不一定非要坐在办公桌前解决它。\n我可以找论文，可以看别人怎么做，可以和人聊天，甚至可能在一本小说、一部电影或者一款游戏里突然获得启发。\n这些东西原本就是相通的。\n是我们后来给它们贴上了不同标签。\n四\n甚至反过来也成立。\n游戏也完全可能变成工作。\n一款游戏已经玩得很烦了，每天上线只是为了签到、刷材料、清日常。\n明明已经没有任何乐趣，却因为“都玩到这里了”而舍不得放弃。\n这和一份让你厌倦的工作有什么本质区别？\n任务列表在那里。\n每天机械执行。\n数字不断上涨。\n自己却已经不知道为什么还要继续。\n所以“我是在玩游戏还是在工作”，可能根本不是一个特别重要的问题。\n真正重要的是：\n现在是谁在推动谁？\n是我想得到某种体验，所以主动选择了这个游戏、这份工作、这本书、这个项目？\n还是这个游戏的签到奖励、公司的任务列表、短视频的推荐算法、别人对我的期待，在推着我不停往前走？\n这两种状态看起来都很忙，内核却完全不同。\n前一种，你是玩家。\n后一种，你更像游戏里的角色。\n五\n所以我现在反而觉得，人活着也可以有一点“玩家心态”。\n进入一个新的环境，先看看地图。\n遇到一件事情，先理解规则。\n决定投入之前，看看奖励值不值得。\n打不过的时候，不要只想着更用力地按攻击键，看看是不是等级、装备、队友或者路线出了问题。\n一个任务做得痛苦，也可以问问自己：\n这是必须完成的主线，还是一个我根本没必要接的支线？\n当然，现实不是游戏。\n我们没有无限条命，也不能随便读档。\n正因为如此，才更应该想清楚自己的资源要投在哪里。\n人生真正稀缺的，从来不是任务。\n任务永远做不完。\n稀缺的是时间、注意力，以及我们能够亲自经历这个世界的次数。\n所以也许最重要的能力，不是把工作做好，也不是把游戏玩好。\n而是慢慢学会一件事情：\n我现在想要什么样的体验？\n然后去寻找最适合承载它的东西。\n它可能是一份工作，可能是一款游戏，可能是一本书、一场旅行、一个项目，甚至只是和某个人聊一个下午。\n不要急着问它属于“工作”“学习”还是“娱乐”。\n那些只是我们给世界贴上的标签。\n你才是玩家。\n别让标签替你决定，今天应该怎么玩。\n"},{"title":"为了写爆款，我开始研究骗子",
"url":"/blog/wei-liao-xie-bao-kuan-wo-kai-shi-yan-jiu-pian-zi/",
"date":"2026-08-31",
"headings":[],
"body":"最近我在写很多文章。\n写得多了以后，我发现一件挺打击创作者自尊的事情：\n流量最好的文章，往往并不是我自己觉得写得最好的文章。\n有些文章，我花了很多时间，结构完整，观点也想得很深，最后没什么人看。\n反而有些文章，只是碰巧聊到了繁体字、赌博之类的话题，突然就有了流量。评论区里的人甚至已经不怎么讨论我文章原本想表达的东西了，而是顺着那个话题自己争论起来。\n这让我想到了一件看起来完全不相干的事：\n骗子。\n一\n我以前经常有一个疑问：\n为什么那么低级的骗局，还会有人上当？\n比如收到一条漏洞百出的诈骗短信，或者有人拿着一段偷拍视频来勒索你。类似的骗局，我们在新闻里看多了，第一反应常常是：\n“这也有人信？”\n甚至会因此觉得，这个骗局设计得太差了。\n后来我发现，这个问题可能从一开始就问错了。\n因为骗子根本没准备骗过你。\n他也没准备骗过绝大多数人。\n假设一个骗局的成功率只有千分之一。\n听起来很低。\n但如果他一天只接触10个人，确实毫无意义；如果他可以同时接触100万人呢？\n哪怕999个人看一眼就删了，甚至顺手骂一句“傻子才信”，对他来说都无所谓。\n因为他的生意从来不是建立在“说服所有人”之上的。\n他只需要找到那千分之一。\n所以你觉得他的手法低级，是因为你在评价他的“质量”。\n而他计算的是：\n成本 × 数量 × 命中率。\n这是两套完全不同的评价体系。\n二\n想到这里，我突然发现：\n这件事情跟写爆款文章，居然有一点像。\n当然，我说的不是让人去学诈骗，更不是学灰产的违法手段。\n真正值得研究的，是它背后的概率思维。\n我们写文章时，很容易陷入一种“作品思维”。\n我写这一篇，就希望这一篇好。\n于是改标题、调结构、磨文字，花三天写一篇，再花两天修改，然后期待：\n它应该火吧？\n可现实并不会因为你认真，就给你流量。\n因为影响一篇文章传播的变量太多了。\n题目有没有刚好碰到大众情绪，发布时间对不对，平台当时在推什么，第一批读者是什么人，有没有争议，有没有一个词突然引发大家讨论……\n很多东西，你根本没办法在动笔之前准确预测。\n所以后来我慢慢觉得：\n爆款可能并不是被“设计”出来的，而是被“筛选”出来的。\n你当然可以研究标题、研究结构、研究用户，但这些只能提高概率。\n你很难保证：\n“我掌握了爆款公式，所以我下一篇一定爆。”\n真正可控的，还有另外一个变量：\n你可以增加自己的出手次数。\n三\n这也是为什么我现在重新看那些所谓的“流量推手”。\n有些人并没有什么神秘的流量公式。\n他们的方法甚至看起来很笨：\n几十个账号，大量选题，大量生产，大量发布。\n100个选题里，90个没人看。\n剩下10个有一点数据。\n10个里面又有1个突然起来了。\n然后他们迅速复制、改写、跟进、放大。\n我们看到那个爆款的时候，会以为：\n“这个人真懂流量。”\n但如果把他的后台全部打开，你可能会看到满地的失败品。\n只不过我们平时看不见而已。\n这就像骗子发出100万条信息，我们只在新闻里看到那个被骗走几十万元的人，却没有看到另外999999个直接把信息删掉的人。\n当样本足够大的时候，极低的概率，也可以变成稳定发生的结果。\n这才是数量真正可怕的地方。\n四\n所以，我现在觉得，创作者有时候太执着于“质量”了。\n这句话听起来可能很冒犯。\n质量当然重要。\n但问题在于，我们经常把质量理解成：\n我要在出手之前，就把它做到最好。\n可有些东西，你不扔到市场里，根本不知道它好不好。\n你以为自己最深刻的一篇，别人可能毫无感觉。\n你随手写下的一句话，却可能恰好戳中了几万人心里一直想说、却没有说出来的东西。\n这时候，发布本身就是一种测试。\n写100篇，不只是生产了100篇文章。\n更重要的是，你做了100次实验。\n你会慢慢知道：\n什么东西只有你自己觉得有意思；\n什么问题很多人其实都在想；\n什么标题看起来漂亮却没人点；\n什么话题你只说了一句话，评论区却能自己讨论几百楼。\n这些东西坐在房间里想，是想不出来的。\n市场会用流量给你反馈。\n五\n这也是我从“骗子”身上学到的一个很奇怪的道理：\n不要因为一个方法看起来低级，就认为它没有逻辑。\n“广撒网”听起来不高级。\n“批量生产”听起来也不高级。\n甚至“撞概率”听起来都有一点投机取巧。\n但如果一件事情单次尝试的成本已经足够低，那么大量尝试，本身就是一种非常理性的策略。\n尤其是在AI出现之后。\n过去写100篇文章，成本非常高。\n今天，一个人产生100个选题、整理100个思路、测试不同标题的成本，已经下降了很多。\n这时候，创作的方法也应该发生变化。\n不是放弃质量。\n而是不要在还没有得到市场反馈之前，就把所有成本押在一个自己以为正确的答案上。\n先做。\n先发。\n先测试。\n让真实世界告诉你，什么东西值得继续投入。\n然后再把有限的精力，集中到那些已经出现信号的地方。\n六\n这件事情其实也不只适用于流量。\n做产品、创业、找工作，甚至研究一个新方向，很多时候都有类似的逻辑。\n我们总希望找到那个“正确答案”，然后一次命中。\n于是花大量时间分析、判断、准备，希望把成功率从30%提高到60%，再从60%提高到80%。\n但还有另外一种思路：\n如果一次尝试的成本可以降下来，为什么不让自己多试几次？\n一次不行，就十次。\n十次不行，就一百次。\n每一次再根据反馈稍微调整。\n很多时候，与其拼命提高单次成功率，不如同时思考：\n我能不能把尝试的成本降下来，把出手次数提上去？\n这可能也是我写了很多文章之后，一个挺意外的感受。\n以前我总觉得，好作品应该是被精心打磨出来的。\n现在我觉得，它还有另一种可能：\n先大量地把东西扔进真实世界里，然后让世界帮你筛选。\n所以，为了写爆款，我开始研究骗子。\n我当然不想学他们骗人。\n但我确实从他们身上看懂了一件事：\n很多人一直在努力提高成功率。\n而另一群人，在想办法增加自己的样本量。\n当一次尝试的成本足够低时——\n数量，本身就是一种质量。\n"},{"title":"为什么有些人毫无底线？科幻片早就告诉了我们答案",
"url":"/blog/wei-shen-me-you-xie-ren-hao-wu-di-xian-ke-huan-pian-zao-jiu-gao-su-liao-wo-men-da-an/",
"date":"2026-08-31",
"headings":[],
"body":"我一直挺喜欢科幻和末日题材。\n《三体》《黑镜》，还有《行尸走肉》。\n以前我也想过，是不是因为自己喜欢科学、太空、物理这些东西。后来想想，好像也不是。我物理成绩并不好，对火箭怎么升空、飞船怎么推进，其实也没有那么大的兴趣。\n真正吸引我的，是另一个东西：\n我喜欢看一个人，是怎么走到“人性临界点”的。\n文明还在的时候，我们很难看到这个过程。\n因为我们生活在一个高度社会化的世界里。法律、道德、家庭、工作、舆论、朋友，甚至只是街上陌生人的目光，都在不断提醒你：\n你是一个生活在人类社会里的人。\n但科幻和末日题材有一种很特别的能力。\n它可以像做实验一样，把这些东西一层一层拿掉。\n拿掉法律。\n拿掉社会。\n拿掉家庭。\n拿掉未来。\n甚至拿掉其他人。\n然后问你一句：\n如果这些东西全都没有了，你还是现在的你吗？\n⸻\n《黑镜》里那个让我很难忘的瞬间\n《黑镜》第六季第三集《Beyond the Sea》，讲了两个执行太空任务的宇航员。\n他们的身体留在太空中，却可以通过复制体回到地球，继续和家人生活。\n其中一个人的家人被残忍杀害，复制体也被毁掉。\n于是，他虽然还活着，却被永远困在了太空。\n后来，他的同伴出于同情，把自己的复制体借给他，让他偶尔可以重新回到地球。\n他开始画画，接触土地，和同伴的妻子聊天。\n甚至渐渐对她产生了感情。\n一开始，他当然还有我们熟悉的“人性”。\n他会悲伤，会怀念，会渴望重新接触世界。\n可是后来，同伴不再允许他使用复制体。\n于是，他与地球之间最后的那根线，也断了。\n接下来发生的事情非常残酷。\n他利用同伴执行舱外任务的机会，借用复制体回到地球，杀掉了同伴的家人。\n但真正让我觉得这一集可怕的，并不是杀人本身。\n而是最后那个画面。\n同伴回到飞船，发现了一切。\n而杀人的那个人没有逃，没有辩解，没有歇斯底里，也没有得意地嘲讽对方。\n他只是平静地坐在那里。\n然后，用脚踢开了一把椅子。\n示意对方：\n坐下来。\n这个动作特别耐人寻味。\n因为到了这一刻，他们终于“平等”了。\n一个人的家人早已死去。\n另一个人的家人现在也死了。\n他们都回不去了。\n他们都只剩下这艘飞船。\n偏偏这艘飞船还必须两个人合作才能运行。\n所以那把椅子仿佛是在说：\n现在，你终于和我一样了。\n我们可以谈谈接下来怎么办了。\n⸻\n真正可怕的，也许不是疯狂，而是另一套“理性”\n我们很容易把这种行为解释成：\n这个人疯了。\n他变态了。\n他在报复。\n但我反而觉得，这样解释以后，事情就简单了。\n因为“疯子”离我们很远。\n真正让我感兴趣的是另一种可能：\n他没有失去理性，只是支撑他原来那套理性的世界已经不存在了。\n想想我们今天为什么会觉得杀人不可接受。\n当然有人的同理心，但同时还有很多东西共同支撑着我们的判断。\n法律会惩罚你。\n社会会排斥你。\n亲人会怎么看你。\n你的未来怎么办。\n别人会如何评价你。\n你希望自己成为什么样的人。\n这些东西像无数根看不见的绳子，把一个人固定在社会之中。\n可假如这些绳子一根一根断掉呢？\n如果你永远回不了地球了呢？\n如果你认识的所有人都死了呢？\n如果你再也不需要面对社会评价呢？\n如果你根本没有所谓的“未来人生”了呢？\n甚至，整个世界只剩下你和另外一个人呢？\n很多原本极其重要的东西，权重可能会发生剧烈变化。\n这才是科幻最有意思的地方：它不是简单地让一个人变坏，而是在改变一个人做判断时的全部参数。\n⸻\n《行尸走肉》其实也一直在做同一个实验\n丧尸只是背景。\n真正有意思的是：\n文明消失以后，人会变成什么？\n钱突然没用了。\n职位没用了。\n学历没用了。\n房产证没用了。\n你过去是谁，也慢慢没那么重要了。\n与此同时，另外一些东西的价值开始暴涨。\n食物。\n水。\n武器。\n药品。\n安全的住所。\n值得信任的人。\n于是，一个非常奇怪的变化发生了。\n文明社会里价值极高的东西，在末日里可能一文不值；文明社会里被我们压制的某些行为，却可能突然变得“合理”。\n抢夺、欺骗、杀戮、结盟、背叛……\n不是因为所有人突然集体变坏了。\n而是因为游戏规则换了。\n如果一个人判断世界的最高标准变成“活下去”，那么很多在我们看来不可接受的事情，在他的体系里都可能是一个非常理性的选择。\n这也是我喜欢末日题材的地方。\n它其实是在追问：\n所谓文明人，到底有多少是“人性”，又有多少只是文明环境塑造出来的行为？\n⸻\n然后我发现，这件事情根本不需要等到世界末日\n想到这里以后，我反而开始理解现实生活中的一些人。\n现实中我们偶尔会碰到一些很难理解的人。\n你会觉得：\n他怎么可以这样？\n他不怕别人骂吗？\n他没有羞耻心吗？\n他怎么连亲情都可以牺牲？\n他为什么为了钱什么都做得出来？\n过去我们很容易得出一个结论：\n这个人没有底线。\n但科幻作品给了我另外一种观察方式。\n也许他不是“没有底线”。\n而是：\n他的价值排序和你完全不同。\n你的排序可能是：\n尊严、家庭、关系、体面、利益。\n他的排序可能是：\n资源、资源、资源，然后才是其他东西。\n所以你会觉得某件事情“怎么能做”。\n他却根本理解不了：\n为什么不能做？\n如果损失一点名声，可以换来巨大的利益，他觉得值得。\n如果牺牲一段关系，可以获得更多资源，他也觉得值得。\n甚至如果别人都觉得他很难看，只要实际利益还在增长，他依然会继续。\n我们站在自己的价值体系里看他，会觉得这个人不可理喻。\n但如果站进他的价值体系里，你反而会发现：\n他可能理性得可怕。\n⸻\n人和人最大的区别，可能不是聪明，而是什么东西排在第一位\n我们经常假设所有人共享一套价值观。\n钱重要，但不能为了钱什么都做。\n亲人重要，所以关键时候应该选择亲人。\n名誉重要，所以人应该有羞耻心。\n伤害别人会产生愧疚。\n被所有人讨厌会感到痛苦。\n这些对很多人来说都成立。\n但问题就在这里：\n它并不是一套写进所有人大脑里的统一程序。\n每个人心里，都有一张自己的价值排序表。\n有人把安全放在第一位。\n有人把关系放在第一位。\n有人把尊严放在第一位。\n有人把控制感放在第一位。\n也有人真的会把资源放在第一位。\n平常大家生活在同一个社会里，差别可能还没有那么明显。\n一旦发生冲突，真正排在第一位的东西就会浮出来。\n这时候你才会突然发现：\n原来我们虽然生活在同一个世界里，却根本没有运行同一套程序。\n⸻\n所以我现在看科幻，已经不太关心飞船了\n我当然还是喜欢太空、丧尸、人工智能、末日这些设定。\n但后来我发现，真正让我着迷的，从来不是这些东西本身。\n我喜欢的是科幻提供的那个实验室。\n它可以把一个普通人扔到距离地球几亿公里的地方。\n可以把法律拿走。\n把社会拿走。\n把亲人拿走。\n把资源拿走。\n把未来拿走。\n然后一点一点观察：\n到底拿走哪一样东西的时候，这个人会变？\n而更有意思的是，当你看多了这些故事以后，再回头看现实中的人，有些原本无法理解的行为，突然也能看懂一点了。\n理解当然不等于认同。\n一个人的行为是否应该受到约束，是另一个问题。\n但至少你不会总是用一句“他怎么能这样”结束思考。\n你会多问一句：\n如果他真的觉得资源比体面重要，利益比关系重要，控制比感情重要，那么站在他的世界里，他现在做的事情是不是反而很合理？\n这可能也是科幻带给我最大的乐趣。\n它写的是未来、太空和世界末日。\n可看到最后，你发现——\n它真正研究的，一直都是现在的人。\n"},{"title":"为什么照片永远拍不出你真正看到的世界",
"url":"/blog/wei-shen-me-zhao-pian-yong-yuan-pai-bu-chu-ni-zhen-zheng-kan-dao-de-shi-jie/",
"date":"2026-08-31",
"headings":[],
"body":"今天看窗外的时候，我突然注意到一件很奇怪的事。\n远处有几棵树。\n当我盯着其中一棵树看的时候，那棵树会变得非常明确，周围的东西仿佛都退到了背景里。\n但当我把注意力转向旁边的树，刚才那棵树又不重要了。\n如果再把目光投向更远的地方，整个画面的感觉又会发生变化。\n那一刻我突然觉得：\n人的眼睛，本身就很像一台摄影机。\n但继续想下去，我又发现恰恰相反——\n摄影机和我们的眼睛，其实从来没有看到过同一个世界。\n一、我们以为自己看见了一整幅画面\n我们平时会有一种错觉：\n我睁开眼睛，面前的一切都是清楚的。\n树、房子、天空、路上的人，都同时存在于我的视野里。\n但实际上并不是这样。\n人的眼睛真正能够看得非常清晰的范围并没有想象中那么大。我们的眼球一直在快速移动，注意力也不断转移，大脑再把这些信息拼接起来。\n于是，我们获得了一种很完整的感觉：\n我看见了整个世界。\n但这个“整个世界”，本来就是经过加工的。\n甚至我们看一棵树的时候，也并不是简单地接收这棵树反射过来的光。\n我们在选择。\n我现在看树干，下一秒看树叶，再下一秒注意到树后面的天空。\n眼睛在调整焦点，大脑在调整注意力。\n所以所谓“看见”，从来都不是一个被动过程。\n你不是把世界原封不动地装进脑子里，而是在不断选择自己要看什么。\n这件事恰好也是摄影的起点。\n二、照片从按下快门之前，就已经不真实了\n我们经常说：\n“拍张照片记录一下。”\n这句话很容易让人产生一种错觉，好像照片是现实的复制品。\n但仔细想想就会发现，它从来不是。\n比如你去一个山谷旅行。\n你站在那里时，真正经历的是一个完整的空间。\n你可以转头，可以抬头，可以看远处，也可以低头看脚下的草；你能感觉到风，听见声音，也能不断移动自己的视线。\n但当你拿出手机拍照的时候，一切都改变了。\n你首先要做一件事：\n取景。\n什么东西进入照片，什么东西留在照片外面？\n山占多少？\n天空占多少？\n人放在哪里？\n镜头朝哪个方向？\n你站近一点还是远一点？\n这些决定看起来只是“拍照”，实际上已经是在编辑现实。\n更不用说之后还可以调整曝光、对比度、色温、饱和度，甚至删除某些东西。\n所以照片并不是：\n“这里当时是什么样。”\n它更接近：\n“我选择让你看到这里当时的这个样子。”\n这是两件完全不同的事情。\n三、所以照片为什么还能成为“证据”？\n这就产生了一个很有意思的矛盾。\n一方面，我们知道照片是被选择过的。\n另一方面，我们又天然相信照片。\n发生一件事情，我们会说：\n“有图有真相。”\n可问题是：\n图真的等于真相吗？\n一张照片当然可以证明某些东西。\n比如某个人在某个地方出现过，某件物体曾经存在，某个瞬间确实发生过什么。\n但它很难独自证明那个瞬间的全部意义。\n因为摄影最强大的地方，同时也是它最危险的地方：\n画框里面是真的，但画框外面发生了什么，你不知道。\n两个人争吵，你拍下其中一个人愤怒的一瞬间，他可能看起来像施暴者。\n但如果把时间往前拉十秒呢？\n如果镜头向左移动两米呢？\n如果把前后发生的事情一起放进来呢？\n意义可能完全不同。\n所以照片可以是事实的一块切片，却很难天然等于完整的事实。\n甚至完全不需要 Photoshop。\n仅仅“选择在哪里按下快门”，就已经是一种表达。\n四、这也解释了：为什么大家都在拍照，有些照片却明显更好\n这也是我后来觉得最有意思的问题。\n如果摄影只是把眼前的东西记录下来，那么摄影应该是一件非常简单的事情。\n现在几乎人人都有手机。\n大家看到晚霞都会拍，看到漂亮的建筑会拍，旅行会拍，孩子会拍，街边一个有趣的场景也会拍。\n可为什么有些照片一看就很普通，有些照片却会让很多人停下来？\n甚至进入摄影展、获奖、被反复观看？\n差别可能并不只是设备。\n甚至也不只是技巧。\n真正重要的区别可能是：\n普通人拍的是“我看到了什么”，摄影师拍的是“我要让你看到什么”。\n这中间只差几个字，实际上差得很远。\n面对同一条街，普通人看到的可能是：\n这里有一栋楼，这里有个人，这里有辆自行车。\n于是把它们拍下来。\n但摄影师可能在寻找另一件东西：\n我究竟被什么吸引？\n是一个人在巨大建筑下面显得特别渺小？\n是下午的阳光刚好把街道切成明暗两半？\n还是一群匆忙的人里面，只有一个老人停了下来？\n于是构图、焦距、景深、光线、色彩这些所谓的“摄影技巧”，突然就有了意义。\n它们并不是为了让照片“高级”。\n它们是在做同一件事情：\n控制观众的注意力。\n这里我要你看。\n那里可以忽略。\n这个人重要。\n后面的世界不重要。\n这个瞬间值得留下。\n其他瞬间可以消失。\n所以摄影师真正创作的，某种意义上并不是景物。\n景物原本就在那里。\n他创作的是一种“观看世界的方法”。\n五、摄影最有意思的地方，也许就是它既真实，又不真实\n绘画可以凭空画出一个不存在的世界。\n摄影不一样。\n摄影必须面对某个曾经真实存在过的东西。\n光确实照在了那里。\n那个人确实站在那里。\n那棵树确实存在。\n那个瞬间也确实发生过。\n所以摄影天然带着一种真实感。\n可是摄影师又通过位置、角度、时间、焦点、构图和后期，把这份现实重新组织了一遍。\n于是摄影变成了一种非常奇妙的艺术：\n它拿现实当材料，却不负责复制现实。\n这可能也是为什么，同一个地方，一千个人可以拍出一千张完全不同的照片。\n世界没有变。\n变的是观看世界的人。\n所以现在再回头看我最开始盯着的那几棵树，我突然觉得：\n也许我们一直误解了摄影。\n摄影真正想模仿的，从来不是人的眼睛。\n因为人的眼睛也没有忠实地“记录世界”。\n我们同样在聚焦、忽略、选择、拼接和解释。\n从这个角度看，摄影反而很像人的意识。\n我们从一个无限复杂的世界里，切下一小块。\n然后说：\n你看。\n这一刻，我看到的是这个。\n"},{"title":"真正让人焦虑的，往往不是工作，而是不确定",
"url":"/blog/zhen-zheng-rang-ren-jiao-lu-de-wang-wang-bu-shi-gong-zuo-er-shi-bu-que-ding/",
"date":"2026-08-28",
"headings":[],
"body":"最近接到一个工作，要和一位美国专家开会。\n我的任务其实很简单：找到一个双方都能用的方式，把会议顺利开起来。\n但就是这么一件小事，却让我烦了挺久。\n我们平时用企业微信，但对方人在美国，没有国内手机号，也没有中国身份证，注册和加入都不太顺利。\nIT同事建议加微信。但微信也有实名认证的问题，对方不能主动加我；我主动找，又找不到他。\n事情就卡在这里。\n它并不难，也没有多少工作量，但因为对方在美国，有时差，很多问题没办法马上问、马上得到反馈。于是这件事就一直挂在脑子里。\n直到今天，我突然把它解决了。\n对方下载企业微信后，把二维码发给我，我一扫，反而顺利把他加进来了。\n后来我又做了一件看起来没什么必要的事：去查他的时区。\n我知道了我们中午12点的时候，他那边是晚上9点，也大概确认了他所在的时区。\n很奇怪。\n做完这些事情以后，我突然感觉——\n这件事从我的脑子里消失了。\n回头想想，我才意识到：\n真正给我造成压力的，好像从来都不是“开一场会”。\n而是那些悬而未决的东西。\n他到底能不能注册？\n微信能不能用？\n企业微信有没有别的方法？\n如果都不行怎么办？\n什么时候能联系到他？\n我们几点开会最合适？\n这些问题单独拿出来都很小，但只要它们还是问号，大脑就会不断回来检查它们。\n所以有些工作很累，不是因为工作量大，而是因为里面有太多没有闭合的东西。\n与其告诉自己“别焦虑”，不如先消灭几个问号\n以前碰到这种事情，我可能会想：这么小的事情，为什么我要一直想？是不是自己太容易焦虑了？\n但现在我觉得，这个方向可能搞反了。\n如果一件事情还有很多关键变量没有确定，大脑惦记它，其实很正常。\n这时候最有用的不是强迫自己放松，而是问：\n这里面到底还有哪些东西是我不知道的？\n然后一个一个处理。\n能查的，先查。\n能测试的，先测试。\n需要问人的，发出去。\n暂时只能等待的，就明确告诉自己：现在卡在这里，下一步要等谁回复。\n甚至像“查一下对方在哪个时区”这种小动作，都有价值。\n因为你并没有解决什么大问题，但你又消灭了一个未知。\n每少一个问号，事情在脑子里的体积就会小一点。\n但还有第二层：把这一次的焦虑，变成下一次的方法\n如果只是解决这次的问题，其实还不够。\n因为以后一定还会遇到新的事情。\n真正有价值的是，事情结束以后再回头看一遍：\n当时到底是什么让我觉得烦？\n哪些担心后来证明根本没必要？\n哪几个动作真正推动了事情？\n如果再来一次，我第一步会做什么？\n比如这次之后，我大概就知道了。\n碰到一个陌生的跨国协作问题，不要一上来就在脑子里想“怎么办”。\n先确认工具，确认账号限制，找替代路径，确认时区，做一次实际测试。\n走完一次，这就不再只是一次经验，而开始变成一个流程。\n下一次再碰到类似的事情，我面对的就不再是一个完全未知的问题。\n这可能才是处理压力更长期的方法。\n我们当然不可能训练到对任何事情都没有压力。\n但可以让自己见过的“未知”慢慢变成“已知”，把曾经踩过的坑变成路径，把曾经让自己焦虑的问题变成方法。\n这样下一次面对陌生任务时，大脑里出现的就不只是：\n“这怎么办？”\n而会多出一句：\n“这种事情，我知道第一步该做什么。”\n我觉得这两句话之间的距离，就是一个人处理不确定性的能力。\n"},{"title":"如今我30+看从前，一句“我喜欢你”意义有了变化",
"url":"/blog/ru-jin-wo-30-kan-cong-qian-yi-ju-wo-xi-huan-ni-yi-yi-you-liao-bian-hua/",
"date":"2026-08-26",
"headings":[],
"body":"对孩子来说，“我喜欢你”如此容易出口，玩一块儿或者仅仅想和你玩，就可以说“我喜欢你”。\n对青春期来说，“我喜欢你”却如此难以出口，忍受着自我羞耻和想象中被拒绝的恐惧，还没开口就被打倒。\n对中年来说，“我喜欢你”似乎太轻，轻得不屑于说。\n也许，“我喜欢你”它只是一个信号，证明了你的倾向，不要让它加以繁重的负担，作为你的“情报官”，大声表达没啥错。\n但是，也不要夸大它的意义，它是一种即时的反应，需要接受生活的考验。\n依然，它是这么的纯粹，不添加任何杂质。\n"},{"title":"在公司发现了问题，到底该不该提？",
"url":"/blog/zai-gong-si-fa-xian-liao-wen-ti-dao-di-gai-bu-gai-ti/",
"date":"2026-08-25",
"headings":[],
"body":"职场里有一句很流行的话：\n不要只向领导提问题，要带着解决方案。\n听起来很有道理。\n一个优秀的员工，不应该只会抱怨。你发现一个问题，最好顺便告诉领导应该怎么办。\n但我现在反而觉得，这句话可能让很多人忽略了一件更基础、也更难的事：\n在解决问题之前，先把事实说清楚。\n很多人其实连这一步都没有做到。\n⸻\n公司里经常会出现一种人。\n刚入职没多久，就发现公司到处都是问题。\n流程不合理、制度有漏洞、管理效率低、部门之间配合有问题……于是洋洋洒洒写一篇“万言书”，告诉公司应该怎么改革。\n但这种东西有时候看起来反而有点傻。\n不是因为新员工不应该提意见，而是因为他看到的可能只是公司很小的一个切面。\n你在执行层，看到的是执行层的问题。\n你觉得一个流程非常低效，可能是真的。但你不知道这个流程背后还有财务、合规、IT，甚至一些你根本不知道的历史原因。\n于是很容易从：\n“我发现这里每天都要重复做一件事。”\n跳到：\n“公司的流程设计有问题。”\n再跳到：\n“公司应该把整个流程重新设计。”\n前面可能是事实，后面已经全部变成了判断。\n⸻\n所以我现在觉得，一个员工发现问题以后，第一反应甚至不应该是：\n“我有什么解决方案？”\n而应该先问：\n“我看到的事实到底是什么？”\n比如：\n“这个流程太烂了。”\n不是事实。\n“过去一个月，我处理了30单业务，其中27单需要把同样的信息分别录入三个系统，每单大约多花20分钟。”\n这才是事实。\n事实里面最好没有情绪，也没有急着证明谁对谁错。\n发生了什么？\n发生了多少次？\n涉及哪些人？\n造成了什么结果？\n哪些是我亲眼看到的，哪些是别人告诉我的？\n哪些是确定的，哪些只是我的推测？\n能把这些东西拆干净，其实已经很难得了。\n很多公司内部的争论，表面上是在争解决方案，实际上连大家讨论的事实是不是同一个，都还没有搞清楚。\n⸻\n当然，能提出解决方案更好。\n你可以在事实之后继续说：\n“我想到一个办法，也许可以把三个系统的数据打通。”\n但这个时候，最好给自己的方案留一点余地。\n因为你不知道技术成本，不知道预算，不知道其他部门的需求，也不知道公司为什么当初会这样设计。\n你离现场近，所以你更容易看到问题；领导掌握的信息更多，所以他更适合做权衡。\n这两种价值其实不一样。\n一个好的意见，不一定非要长成：\n“我发现了问题，而且我已经想好了公司应该怎么办。”\n它也可以只是：\n“这里反复发生了一件事，我把它尽可能准确地记录下来了。”\n这已经很有价值。\n⸻\n还有一种更让人纠结的情况：\n如果这个问题根本解决不了怎么办？\n那还有必要提吗？\n我觉得有。\n因为组织里的很多问题，本来就不是第一次被发现时就能解决。\n可能第一次有人提出，没有资源。\n第二次又有人遇到，还是没有解决。\n第三次、第四次，数据慢慢积累。\n直到某一天，它造成的损失足够大，或者公司的条件发生了变化，原本解决不了的问题突然有了解决的可能。\n这时候，前面留下来的那些事实就有价值了。\n反过来，如果每个人都觉得：\n“反正领导也解决不了，算了。”\n三年以后，公司甚至可能不知道这个问题已经存在了三年。\n记录一个暂时解决不了的问题，也是在给未来的决策留下证据。\n⸻\n所以，在公司发现问题，到底该不该提？\n我觉得可以提。\n只是不要急着站在更高的位置告诉公司应该怎么办，也不要因为自己暂时想不到答案，就觉得这个问题不值得说。\n先把自己真正知道的东西讲清楚。\n事实之后，可以有判断；判断之后，可以有建议。\n这个顺序不要反过来。\n你不一定知道公司应该怎么解决。\n但你至少可以让所有人知道：\n这里，到底发生了什么。\n"},{"title":"企业真正不能裁掉的，不是岗位，而是功能",
"url":"/blog/qi-ye-zhen-zheng-bu-neng-cai-diao-de-bu-shi-gang-wei-er-shi-gong-neng/",
"date":"2026-08-21",
"headings":[],
"body":"这两年，我已经很明显地感受到企业裁员的浪潮。\n而且有一个很有意思的现象：中层往往首当其冲。\n以前一个部门可能是高管下面有总监，总监下面有经理，经理下面有主管，再下面才是具体执行的人。\n现在一裁，经理没了，甚至总监也没了。主管直接挂到高管下面。\n神奇的是，公司好像也没有因此停摆。\n高管继续跟老板定方向，下面的人继续干活。原来需要四五层的组织，突然三层甚至两层也能跑。\n这很容易让人产生一个判断：\n原来很多中层真的没有必要。\n但我最近观察了一些身边的同事，又觉得事情没有这么简单。\n有个同事的直属上级就是公司高管。他经常跑来问我一些非常基础的问题。\n不是因为他能力差，而是因为他的领导给他的指令通常只有一句话：\n“这个事情你去做一下。”\n为什么做？做到什么程度？标准是什么？可以调用哪些资源？遇到什么情况可以自己决定？\n都没有。\n甚至有些问题去问他的领导，领导也不知道具体怎么做。\n因为站在高管的位置上，他本来就不需要知道。\n高管负责的是“我要什么”，但总得有人把“我要什么”翻译成“我们接下来具体怎么干”。\n以前，这件事情往往是中层在做。\n所以我慢慢意识到，我们讨论“中层还有没有价值”，可能从一开始就问错了问题。\n企业真正需要的，从来不是岗位，而是功能\n一个组织要正常运转，其实始终需要几种人。\n有人负责判断方向：我们到底要解决什么问题，什么事情值得做。\n有人负责翻译方向：把一句模糊的“我要这个”，拆成目标、路径、标准和具体动作。\n有人负责协调资源：这个事情需要谁配合，跨部门卡住了找谁，有限的资源应该优先给哪里。\n有人负责执行：真正把事情一件件做出来。\n还有人负责纠偏：发现实际情况和最初设想不一样，及时调整，而不是机械地把错误方向执行到底。\n过去，我们习惯把这些功能装进一个个岗位里。\n总监干什么，经理干什么，主管干什么，专员干什么。\n时间久了，我们甚至误以为，是这些岗位构成了公司。\n但其实不是。\n真正让公司运转的，是藏在这些岗位背后的功能。\nAI时代很可能正在把这件事重新暴露出来。\n一个只负责上传下达的经理，当然可以被裁掉。因为信息传递这件事，本来就不值那么多钱，甚至AI做得更快。\n但你把经理裁掉，并不意味着他原来承担的所有功能都消失了。\n方向还是要有人翻译，标准还是要有人制定，资源还是要有人协调，异常还是要有人判断。\n你裁掉的是一个岗位，但这些功能总得落到某个人身上。\n于是很多公司出现了一个很有意思的变化：\n经理没了，主管开始干经理的活；主管没了，一个能力强的专员开始直接对接高管。\n这未必是一件坏事。\n甚至可能是未来组织变得更扁平的一种方式。\n问题只在于，公司不能一边把层级裁掉，一边假装那些功能也一起消失了。\n如果一个主管开始承担原来经理的工作，就应该让他知道自己现在承担了什么功能，哪些事情可以自己判断，可以调动什么资源，出了什么问题应该向上升级。\n否则所谓的“组织扁平化”，最后就会变成：\n高管随口说一句，下面的人猜半天。\n猜对了，是应该的。\n猜错了，是能力不行。\n所以我现在越来越觉得，组织架构也许应该换一种画法\n以后设计一个团队，第一件事或许不应该是：\n“这里要不要放一个经理？”\n而应该先问：\n为了让这件事情跑起来，我们到底需要哪些功能？\n谁负责定方向？\n谁负责把方向翻译成可执行的东西？\n谁有权协调资源？\n谁负责做？\n谁负责判断做得对不对？\n然后再看，这五种功能究竟需要五个人，还是三个人，甚至一个能力足够强的人就可以承担其中两三种。\n这样一来，组织当然可以变得更轻。\n一个优秀的主管完全可能承担过去经理的一部分功能；一个优秀的专员也完全可能拥有过去主管才有的判断权。\n这才是真正的降本增效。\n减少的是岗位和层级，而不是把必要的组织功能凭空删掉。\n所以AI时代真正值得重新设计的，也许不只是岗位说明书。\n而是整张组织架构背后的那张**“功能地图”**。\n当我们把岗位名称全部擦掉，只留下“这个组织到底需要哪些事情被完成、哪些判断必须有人做”时，可能才会真正看清：\n哪些人可以被AI替代，哪些层级可以被压缩，哪些能力应该下放。\n以及——\n一个公司真正不能裁掉的，究竟是什么。\n"},{"title":"我一直以为我在写文章，后来才发现我参加的是另一场比赛",
"url":"/blog/wo-yi-zhi-yi-wei-wo-zai-xie-wen-zhang-hou-lai-cai-fa-xian-wo-can-jia-de-shi-ling-yi-chang-bi-sai/",
"date":"2026-08-21",
"headings":[],
"body":"我以前总觉得，一篇文章只要写得足够好，就应该有人看。\n所以我一直很容易被一种故事打动。\n一个普通老头，一辈子喜欢集邮，默默写了几十年博客。等他去世以后，孩子整理遗物，才发现那个老旧的网站里藏着大量关于邮票的文章，专业、细致，甚至可能比很多所谓专家写得都好。\n又或者一个住在乡村的老太太，喜欢吃，也喜欢记录。她把几十年吃过的东西、旅行遇到的小店、家乡快要消失的食物，一点点写下来。\n东西很好。\n但没人看。\n每天三五个访问，偶尔几十个。\n也许有一天，一个博主偶然发现了她，转发了一篇，于是突然来了几百个人。热闹几天，然后又恢复安静。\n以前我会觉得，这是一件很遗憾的事情：\n这么好的东西，为什么没人看见？\n直到我自己开始写东西。\n身边不止一个朋友跟我说，你应该写公众号，应该发小红书。\n以前我总觉得麻烦。现在有了 AI，连这个借口也没有了。我只需要负责想，编辑、整理、排版这些事情都容易了很多。\n于是我真的把自己写的东西交了出去。\n然后发现——\n也没有我想象中那么多人感兴趣。\n反而我写过最火的一些东西，恰恰是我自己觉得最没什么“含金量”的。\n比如以前腰痛，我去了一趟医院，就顺手把就医流程、社保怎么弄、医生大概怎么看之类的东西整理下来。\n在我看来，这有什么好写的？\n去一次医院不就知道了吗？\n结果几万浏览量，还有人不断私信问我问题。\n前段时间我又随手写了一百多字，说自己小时候是怎么接触繁体字的。\n我甚至不觉得那算一篇文章。\n结果下面很多人讨论。\n后来我才发现，他们讨论的甚至不是我。\n他们只是对“繁体字”这件事有话想说。\n这件事情慢慢改变了我对写作的理解。\n作者其实很容易把自己想得太大。\n我们花很多时间构思一篇文章，于是天然会觉得：这是我的作品，我提出了这个问题，我设计了这条逻辑，我最后落到了这个观点，那么读者当然应该沿着这条路走下来。\n可读者为什么要呢？\n假如你写了一万字讲抑郁的形成原理，你觉得自己最重要的是把原理讲清楚。\n但一个正在搜索的人点进来，可能只想知道：\n“那我现在怎么办？”\n你关于解决方法只写了两百字。\n于是他根本不关心你前面那九千八百字有多严谨，他只盯着这两百字。\n甚至你其中一句话写得不准确，他就在评论区抓住这一句话。\n另一个人反驳他。\n第三个人加入。\n最后这篇文章火了。\n但它火起来的原因，可能跟你原本想表达的东西已经没有多大关系。\n我们经常说别人“过度解读”电影。\n周星驰一个镜头，导演可能根本没想那么多，几十年后却有人逐帧分析，给它赋予各种意义。\n可换一个角度想：\n作品发表以后，作者真的还有权决定别人应该怎么看吗？\n可能没有。\n文字是作者写的，但意义是读者完成的。\n而流量，则是另外一件事情。\n它取决于此刻有多少人关心这个问题，有多少人愿意点开，有多少人有话想说，有没有争议，有没有情绪，有没有搜索需求，有没有一个恰好把它推到更多人面前的机会。\n这也是为什么我后来开始理解那些以前我不太喜欢的“运营”。\n以前做内容，我会觉得：\n这个标题太俗了。\n这个热点有什么好蹭的？\n这个东西虽然有流量，但跟我们的调性不符。\n这篇文章明明写得很好，为什么不推这一篇？\n后来我才意识到，我和运营参加的根本不是同一场比赛。\n我在评判文章。\n他在评判传播。\n我关心这句话够不够准确，这个观点够不够深。\n他关心有多少人点进来，有多少人留下来，有多少人转发，最后有没有产生实际的价值。\n站在作者的位置，我当然可以坚持自己的标准。\n但站在一家公司的位置，他也完全有理由问一句：\n所以呢？\n花了这么多人力，最后得到的只是作者自己很满意，这件事情对公司意味着什么？\n我以前很讨厌一些网络推手。\n后来才想明白：\n他们大概也挺讨厌我。\n因为他们的工作就是把东西推出去，而我拿着一套作者的标准，不断告诉他们这个不能做，那个不好看，这个太俗，那个不够高级。\n我以为自己在保护内容。\n对他们来说，我可能只是在阻碍工作。\n这并不意味着以后写东西，就应该什么火写什么。\n我现在反而觉得，真正需要分清的是三件事：\n文字属于作者。\n意义属于读者。\n流量属于市场。\n你可以决定自己写什么。\n但你不能决定别人从里面看到什么，更不能因为自己觉得它好，就要求市场给你掌声。\n那个写了一辈子邮票博客的老头，可能真的写得很好。\n那个记录了一辈子乡村食物的老太太，留下的东西也可能真的很珍贵。\n它们只有几十个阅读，并不能证明它们没有价值。\n但反过来也一样：\n有价值，不代表一定会有人看见。\n以前我总觉得这很残酷。\n现在我觉得，这可能只是两件完全不同的事。\n写出好东西，是一种能力。\n让好东西被人看见，是另一种能力。\n而当我们决定把文字交出去的那一刻，就已经不再只是写文章了。\n我们参加了另一场比赛。\n"},{"title":"职场上，真正值得学习的，是那些有余力的人",
"url":"/blog/zhi-chang-shang-zhen-zheng-zhi-de-xue-xi-de-shi-na-xie-you-yu-li-de-ren/",
"date":"2026-08-21",
"headings":[],
"body":"刚进职场的时候，我们很容易找一个学习对象。\n通常是团队里工作做得最好的人：最专业、最勤奋、每天忙到最晚，什么事情交给他都能搞定。\n以前我也觉得，这样的人当然最值得学习。\n但工作久了以后，我反而觉得，真正值得学习的，可能是那些看起来没那么忙的人。\n这里说的当然不是摸鱼。\n而是那些明明把工作做完了，却依然有时间、有精力去想别的事情的人。\n我以前的领导跟我讲过一个很反常识的观点：\n你很难只靠完成现在这个岗位要求你做的事情，学会下一个岗位需要的能力。\n比如一个技术人员，每天把全部时间都拿来钻研技术，当然可以成为一个很好的技术人员。\n但有一天让他去做管理，他可能突然发现自己不会了。\n因为怎么分配工作、怎么带人、怎么协调资源、怎么确定目标，这些东西，本来就不是他原来的岗位要求他做的。\n可问题来了：\n如果你每天的时间都被现在的工作占满了，你什么时候去学习下一份工作的能力？\n所以我现在观察一个职场上的人，会特别注意一件事：\n他有没有余力。\n有些人工作做得非常好，但每天都在疲于奔命。\n这当然可能是因为工作量真的很大，但也可能意味着一些别的问题：不会把重复工作流程化，不懂得拒绝，不会判断事情的优先级，或者习惯把所有事情都揽到自己身上。\n最后的结果就是，他越来越擅长现在的工作，却也越来越被现在的工作困住。\n反过来，有一些人看起来没有那么忙。\n他能够很快处理掉自己的本职工作，然后多出来一点时间。\n他可能去研究一个原本不属于自己的问题，参与一次更高层级的讨论，尝试一个新的项目，甚至拿公司的资源做一些暂时没人要求他做的实验。\n因为这本来就不是他的职责，所以反而没有那么大的包袱。\n试着试着，他可能真的做出了一点东西。\n然后有一天领导突然发现：\n原来这个人已经可以做更高一个层级的事情了。\n这时候，升职才变成了一件很自然的事情。\n所以我现在越来越觉得，职场里最值得学习的，并不一定是那个每天忙到最后的人。\n你可以学习他的工具，学习他的经验，学习他把某件具体事情做好的方法。\n但真正值得长期观察的，是另外一种人：\n他为什么可以不那么忙？\n他砍掉了什么？\n他拒绝了什么？\n他把什么东西流程化了？\n他是怎么判断优先级的？\n以及最重要的——\n他把省下来的时间，用在了哪里？\n一个人把100%的精力都用来完成今天的工作，和一个人只用70%的精力完成工作，把剩下30%用来研究明天需要什么能力，看起来可能是前者更努力。\n但几年以后，两个人可能已经走到了完全不同的地方。\n而且这种“余力”对组织同样重要。\n一个人如果长期靠透支身体、情绪和时间来维持优秀，甚至所有重要的事情都只能由他来完成，这其实并不是一个健康的系统。\n一个健康的人和一个健康的组织，都应该能够长期运转，而不是靠某个人一直拼命撑着。\n所以，如果让我重新选择职场上的学习对象，我可能不会再去找那个最忙的人。\n我会去找那个事情做得不错，却始终还有余力的人。\n然后看看，他究竟是怎么做到的。\n因为职场真正值得学习的，也许从来都不是怎么把自己变得更忙。\n而是怎么在完成今天的同时，给明天的自己留一点余力。\n"},{"title":"一个故事高级不高级，就看主角死后还能不能讲下去",
"url":"/blog/yi-ge-gu-shi-gao-ji-bu-gao-ji-jiu-kan-zhu-jiao-si-hou-huan-neng-bu-neng-jiang-xia-qu/",
"date":"2026-08-20",
"headings":[],
"body":"我们看故事的时候，很容易默认一件事：主角不能死。\n配角可以死，朋友可以死，甚至整个世界都可以毁灭，但主角通常得活着。因为故事就是跟着他走的，他死了，故事还怎么讲？\n但有一些作品偏偏敢这么干。\n《冰与火之歌》就是最典型的例子。\n故事刚开始的时候，很难不把奈德·史塔克当成主角。后来奈德死了，我们又会自然地把目光转向罗柏·史塔克，觉得接下来大概是儿子替父亲完成没有完成的事。\n结果罗柏也死了。\n奇怪的是，故事没有因此垮掉。\n你继续关心琼恩、丹妮莉丝、提利昂、艾莉亚，甚至原来你以为只是配角的人，也开始拥有自己的故事。\n后来我玩《时空之轮》，又遇到了类似的感觉。\n这是一款1995年的游戏，但它做了一件今天看来都很大胆的事情：玩到后期，你一路培养的主角克罗诺突然死了。\n这跟电影还不太一样。\n因为在游戏里，你是真的在这个角色身上投入过东西的。等级、装备、技能，包括几十个小时形成的操作习惯。正常来说，这个人怎么可能死？\n但他真的死了。\n然后游戏继续。\n剩下的伙伴继续穿越时空，继续寻找自己的故事。甚至到了这个时候，你才会发现：原来这个故事并不一定需要克罗诺才能成立。\n这让我想到一个很有意思的问题：\n一个故事真正吸引我们的，到底是主角，还是主角背后的那个东西？\n《冰与火之歌》给出的答案可能是“世界”。\n维斯特洛已经被构建得足够完整。家族、战争、权力、宗教、历史、魔法都在按照自己的逻辑运转。\n奈德死了，世界不会停下来等他。\n罗柏死了，战争也不会结束。\n一个人退出以后，留下来的权力真空、仇恨、承诺和后果，反而会继续推动其他人的命运。\n所以到了后来，你已经不完全是在追某一个人的故事了。\n你是在看：这个世界接下来会怎么样。\n但还有另外一种方法。\n比如《低俗小说》。\n它没有创造一个像维斯特洛那样庞大的幻想世界。它的厉害之处在于人物之间的关系。\n你刚刚还在跟着两个杀手走，下一段突然去了另一个人的故事；一个看起来无关紧要的人，后来又和前面的人发生联系；时间被打乱，人物不断交叉。\n于是吸引你的东西变成了另一个问题：\n这些人到底是怎么连起来的？\n所以回过头来看，主角死亡其实只是一个很极端的测试。\n它测试的是：\n如果把你最重要的那个人拿走，这个故事还剩下什么？\n有的故事拿走主角以后，就什么都没有了。因为整个世界存在的意义，就是为了服务他的成长。\n但有些故事不一样。\n拿走一个人，世界还在运转，人物之间的关系还在变化，过去发生的事情还在产生新的后果，甚至会自然地长出新的主角。\n这时候我才意识到：\n真正厉害的作者，未必只是创造了一个令人难忘的主角，而是创造了一套没有主角也能继续运转的东西。\n可能是一个世界，可能是一张人物关系网，也可能是一套不断产生故事的规则。\n主角只是我们最开始走进去的那个入口。\n入口当然重要。\n但真正让我们留下来的，是门后面的东西。\n"},{"title":"一个好故事，留给孩子的从来不是一个角色,而是一套理解世界的方法",
"url":"/blog/yi-ge-hao-gu-shi-liu-gei-hai-zi-de-cong-lai-bu-shi-yi-ge-jiao-se-er-shi-yi-tao-li-jie-shi-jie-de-fang-fa/",
"date":"2026-08-20",
"headings":[],
"body":"以前给孩子挑动画片，我会想：这个动画片正不正向？\n但后来我慢慢觉得，这可能不是一个特别好的标准。\n所谓“正向”，很多时候是成年人定义的，而且有很强的时代性。我们今天认为正确的东西，到了孩子长大的年代，未必还是同一套标准。更何况，为什么我们一定相信，父母现在的判断就是对的？\n所以比起“正不正向”，我现在反而更在意另一件事：孩子有没有看过一些真正完整、成熟的作品。\n比如《蜡笔小新》。\n按照今天很多家长挑选儿童动画的标准，它大概很难算得上“正向”。但回过头去看，我却觉得它对我小时候认识世界有很大帮助。\n它当然有很多胡闹甚至有点儿童不宜的东西，但它也非常生动地展示了一个男孩的生活：家庭是什么样的，大人是什么样的，小孩之间怎么相处，一个普通家庭每天会发生什么。\n《哆啦A梦》也是一样。\n大雄遇到一个问题，哆啦A梦拿出一个奇怪的道具。这个道具看起来解决了问题，最后往往又制造出更大的问题。\n小时候看的是热闹，实际上脑子里留下来的，却是无数关于“如果有一种东西可以……”的想象。\n所以我现在给孩子看动画，会更愿意让她真正进入一个作品。\n而不是今天认识艾莎，明天看到皮卡丘，后天又买了一个不知道从哪里来的卡通玩偶。她认识很多形象，却只认识它们最表面的部分。\n比如孩子可能会说：\n艾莎公主很漂亮。\n当然没什么问题。\n但如果她完整看过这个故事，“艾莎”在她脑子里就不应该只有一张漂亮的脸。\n她还应该意味着恐惧、逃避、孤独、失控，以及最后怎么面对自己，怎么接受自己身上那个曾经被认为“不好”的部分。\n这时候，艾莎和白雪公主就不再只是两个“漂亮公主”。\n她们开始成为两个完全不同的人。\n我觉得这可能就是完整作品很重要的地方。\n一个形象只有进入故事，才会拥有厚度。\n颜色、长相、衣服、名字，都是最容易被孩子抓住的东西。但人物为什么这样做，他害怕什么，他喜欢什么，他和别人是什么关系，他经历了什么才变成现在这样——这些东西必须通过故事才能慢慢长出来。\n而当孩子真正经历过很多这样的故事以后，我想留在她脑子里的，也许远远不只是“看过几部动画片”。\n而是一个巨大的素材库。\n以后她害怕的时候，可能会想起某个人物也曾经害怕过。\n她和朋友闹矛盾的时候，可能会想起某一段关系。\n她遇到一个新的人物，甚至现实中的一个人，也可能慢慢发现：这个人和我以前见过的那个人有一点像，但又不完全一样。\n她甚至不需要意识到自己在做这些事情。\n那些故事已经变成了她理解世界的材料。\n这也是为什么我现在觉得，动画片也好，小说、电影、游戏也好，它们本身可能都只是一个个容器。\n真正重要的是，这个容器里装了多少东西。\n一个好的作品，可以装下人物、关系、选择、失败、勇气、欲望、孤独、想象力，也可以装下一些现在的她还根本理解不了的东西。\n没关系。\n先装进去。\n也许很多年以后，当她第一次真正遇到某件事的时候，她会突然从自己的记忆里找到一个故事。\n到那个时候，小时候看过的一部动画片，就不再只是一部动画片了。\n它可能已经变成了她理解自己、理解别人，甚至在某些时刻安慰自己的一小块人生经验。\n所以我现在没那么执着于给孩子寻找“正确的动画片”。\n我更愿意给她一些真正好的、完整的故事。\n因为故事最珍贵的地方，也许从来不是替孩子告诉她答案，而是提前给她存下一些理解人生的材料。\n"},{"title":"我不再逼自己想创意",
"url":"/blog/wo-bu-zai-bi-zi-ji-xiang-chuang-yi/",
"date":"2026-08-19",
"headings":[],
"body":"以前我一直觉得，创意很难。\n命题作文其实不难，题目已经在那里了，真正难的是：没人给你题目，你甚至不知道今天该写什么。\n灵感怎么可能凭空跑出来？\n后来我发现，它确实不会凭空跑出来。\n我现在会刻意保持一些输入。比如午休前看十几二十分钟《黑镜》，一集看不完就分几天看；有空玩一会儿《巫师3》，一个任务一个任务往前推。\n不是为了找灵感，就是看。\n但有些东西会突然让我停下来。\n比如《黑镜》把科技和人的问题放在一起：如果一个科技公司掌握了你几乎全部的数据，会怎么样？\n当我开始想这个问题的时候，一个写作的主题其实就已经出现了。\n但我后来又发现，有输入还不够。\n一直刷熟悉的内容是输入，反复玩已经非常熟悉的游戏也是输入。它们当然可以让人放松，但很难产生新的东西。\n真正容易触发思考的，往往是那些我没见过的东西。\n所以我现在越来越觉得，与其培养一个“坚持做某件事”的习惯，不如给自己的生活增加一些新变量。\n每天十分钟游戏，十几分钟剧集，一部没看过的电影，一本陌生的书，一个以前不会点进去的话题。\n不需要规定自己从里面得到什么，也不用看完以后强迫自己总结三点感悟。\n大多数时候，什么都不会发生。\n但只要不断增加新变量，偶尔就会有一个东西撞进来，让原来毫无关系的两件事突然连在一起。\n那一刻，创意就出现了。\n所以我现在不太逼自己想创意了。\n我只是尽量让自己的生活里，不断出现一些新的变量。\n以前我以为创意靠的是天赋。\n现在我觉得，它更像概率。\n你不需要保证自己今天一定想到什么。\n你只需要不断给生活增加新变量，让新的东西有机会发生。\n"},{"title":"我们真正想要的，从来不是时间机器",
"url":"/blog/wo-men-zhen-zheng-xiang-yao-de-cong-lai-bu-shi-shi-jian-ji-qi/",
"date":"2026-08-19",
"headings":[],
"body":"最近在玩《时空之轮》，我发现一个很有意思的事情。\n游戏里可以跨越时间。你可以去未来，也可以回到过去。\n但如果真的给一个人一次穿越的机会，我猜大多数人第一反应不是“我要去看看未来”，而是：\n我想回到过去。\n为什么？\n《时空之轮》里有一段剧情让我印象很深。\n露卡小时候，母亲因为机器发生了意外。后来露卡获得了穿越时间的能力，她真的回到了事故发生的那一天。\n这一次，她有机会改变它。\n这大概是“回到过去”最直接的诱惑：弥补遗憾。\n如果曾经失去过一个重要的人，我们可能会想，如果那天我早一点发现呢？如果我当时多做一点呢？如果今天的我，带着现在知道的信息回到那一天呢？\n当然，也有人会开玩笑：\n如果能穿越，我什么都不干，先去买英伟达。\n其实本质上还是一样的。\n我们站在今天回头看，会发现过去充满了“答案”。\n我们知道哪家公司后来会崛起，知道哪个选择后来错了，知道哪个人应该珍惜，也知道哪些当时觉得天大的事情，其实根本没那么重要。\n过去最大的诱惑，是答案已经揭晓，而你却获得了重新答题的机会。\n但未来不一样。\n《时空之轮》里的未来并不美好。主角们来到未来，看到的是一个几乎被毁灭的世界，人类连吃饱都变得困难。\n未来是一个盲盒，你不知道打开以后是什么。\n可即使未来很好，就一定更吸引人吗？\n我想起《三体》里那些冬眠后醒来的人。\n他们跨越漫长的时间，醒来以后发现世界已经高度发达。但问题也随之出现：这个世界虽然更先进，却已经不是他们的世界了。\n这很像一个从来没接触过智能手机的老人，突然被扔进今天。\n每一样东西都更方便，但每一样东西都需要重新学习。\n你没有参与这个时代一点点变化的过程，于是你拥有了未来，却失去了对这个世界的熟悉感。\n所以未来满足的，其实是我们的好奇心。\n而过去满足的是更深的东西：控制感。\n未来问你的是：\n“后来发生了什么？”\n过去问你的却是：\n“如果再给你一次机会，你会怎么选？”\n也许这就是为什么那么多穿越故事，都喜欢让人回到过去。\n我们真正想要的，可能从来都不是时间机器。\n而是在那些已经无法改变的事情面前，再拥有一次选择的权利。\n"},{"title":"存档最大的意义，是允许你离开",
"url":"/blog/cun-dang-zui-da-de-yi-yi-shi-yun-xu-ni-chi-kai/",
"date":"2026-08-18",
"headings":[],
"body":"昨天晚上我失眠了。\n其实没什么大事，只是今天有一个跨部门的会。\n我躺在床上想：明天这个会应该怎么开？对方可能会说什么？我应该怎么回应？这个事情怎么推动，又不把最后的负担都放到自己身上？\n想着想着，我又想到了最近玩的《巫师3》和《时空之轮》。\n《巫师3》玩到哪里了？接下来做什么？有些操作是不是又忘了？《时空之轮》现在是什么进度？\n我突然意识到，我的脑子里好像一直开着很多没有关闭的程序。\n因为怕忘记，所以它们一直在后台运行。\n这让我想到一个东西：checkpoint，记录点。\n⸻\n我以前玩游戏有个误区，总觉得一个游戏开始了，就应该尽快通关。\n因为一旦停下来，隔一两个月再回来，很可能已经忘了玩到哪里、接下来干什么，甚至连操作都忘了。\n所以有时候明明不太想玩了，还是会继续推进。\n本来是我想玩游戏，最后却变成了被游戏的进度推着走。\n但如果每次退出之前，我都留下一个记录点呢？\n现在在哪里，做到什么任务，下一步准备干什么，有哪些容易忘记的操作。\n那我其实随时都可以停下来。\n今天想玩《时空之轮》就玩《时空之轮》，过两个星期想玩《巫师3》，看一下记录，两分钟就能回到原来的状态。\n我甚至可以同时开好几个游戏。\n因为我知道，我随时可以回来。\n⸻\n后来我发现，工作也是一样。\n比如今天这个会议，我根本不需要昨天晚上在脑子里预演十遍。\n我只需要留下一个记录点：\n现在事情进展到哪里？我已经做了什么？下一步是什么？还有什么问题没解决？我担心对方问什么？如果真的问了，我准备怎么回应？\n写到这里，就可以关掉了。\n因为剩下的事情，应该等它真正发生的时候再处理。\n我越来越觉得，大脑不应该用来保存这些已经处理过的信息。\n游戏键位、任务进度、项目进展、已经想好的应对方案，都可以交给外部记录。\n大脑应该留给那些还没有答案的问题，留给临场判断，留给真正需要思考的事情。\n游戏为什么要设计存档？\n因为设计者知道，人不可能一直玩下去。\n存档最大的意义，也许不是保存进度，而是允许你离开。\n只要状态被保存下来，离开就没那么可怕。\n生活和工作其实也一样。\n我以前觉得，一件事情开始了，就应该尽快做完。\n现在我觉得，还有一种能力可能更重要：\n能够在任何一个地方停下来，并且让自己以后可以无损地回来。\n给工作存档，给游戏存档，也给暂时想不完的问题存档。\n保存，然后退出。\n这样我们才不会一直被那些“已经开始的事情”推着往前走。\n而是可以重新决定：\n我现在，到底想把注意力放在哪里。\n"},{"title":"选择真的比无脑前进难多了",
"url":"/blog/xuan-ze-zhen-de-bi-wu-nao-qian-jin-nan-duo-liao/",
"date":"2026-08-17",
"headings":[],
"body":"我印象很深刻的一个职场细节。\n有一次，一个同事半夜打电话跟我讨论一个问题。讨论了很长时间，最后他有点愤怒地甩下一句话：\n“我跟你讨论这么长时间，有这个时间我早就做完了。”\n然后电话就挂了。\n挂断的那一刻，我突然觉得这句话挺滑稽的。\n既然有这个时间你早就做完了，那为什么还要打电话让我去做呢？你自己做不就完了吗？\n现在具体争论的事情我早已经忘了，大概是跟这个事情要不要持续做、效益和价值有关。\n这个事情今天我可以做，这个月我们部门也可以承担。但是下个月呢？以后呢？谁来承担？\n如果我们多了这个任务，我们的工作价值有提升吗？它为什么应该由我们来做？以后如果一直要做，是不是就会慢慢变成我们部门默认的工作？\n其实我当时是想从他那里得到这些答案的。\n后来慢慢多了一些管理视角之后，我越来越觉得，打电话给一个下属，让他去做一个事情，甚至愤怒地指责他为什么没有按照要求去做，其实是很容易的。\n遇到一个硬骨头，可能会争论几句；遇到一个软骨头，事情很快就做完了。\n难的是选择。\n这个事情我们到底要不要做？\n做了以后能带来什么收益？是一次性的，还是长期的？未来谁来做？谁来做风险最低、成本最低？我们现在有什么资源，可以借靠什么资源？如果这个事情以后每个月都要发生，有没有办法形成一个稳定的流程，甚至把它自动化？\n这些东西要一个个想清楚。\n想清楚以后，我才能很自信地告诉自己，也告诉身边的人：\n对，这个事情我们就是要做。\n为什么做，能得到什么，我们有哪些资源，可以依靠哪些资源，又有哪些限制。然后把这一整条链条串起来。\n这种事情其实很耗时间。\n有时候可能讨论一个小时，那个具体的任务半个小时就能做完。所以才会有人觉得：有这个时间，早就做完了。\n但如果每次都这样想，今天多做一个，明天多做一个，很多工作就是这么一点一点长出来的。\n一开始只是“顺手做一下”，后来变成“以后都由你们做”，再后来甚至写进了岗位职责。到最后已经没有人记得，当初为什么要做这件事情。\n所以我现在越来越觉得，选择真的比无脑前进难多了。\n无脑前进很舒服，因为永远都有下一件事情可以做。做完一个，再做一个，至少每天都会觉得自己很忙，也确实完成了很多事情。\n选择却需要停下来想。\n有时候想了半天，最后的答案甚至是：这件事情不要做。\n但也可能正是这几个小时的思考，让一个部门以后少做几年没有价值的事情。\n所以，做更难的事情吧。\n多花一点时间去选择我们应该做什么，把资源放在哪里，怎么让一件值得做的事情有一条可以持续执行的路径。\n因为做完一件事情并不难。\n难的是决定，什么事情值得我们一直做下去。\n"},{"title":"不要成为全公司最会做PPT的人",
"url":"/blog/bu-yao-cheng-wei-quan-gong-si-zui-hui-zuo-pptde-ren/",
"date":"2026-08-13",
"headings":[],
"body":"我刚毕业的时候，PPT做得特别好。\n那时候我很喜欢研究各种PPT技巧，领导和同事发现以后，就经常叫我做PPT。后来我又研究Excel，各种公式很早就学会了，于是大家不会做的表也开始找我。\n再后来我学会了数据库，领导发现系统里查不到的数据我能查，于是查数据的工作也来了。\n这些当然不是坏事。它们让我掌握了很多技能，也让我更快地理解了业务。\n但慢慢地，我发现一个问题：\n我的时间开始被大量稀释。\n做个PPT，查个数据，改个表，写个公式，翻译一份材料……每一件事情看起来都不难，每一个人来找你的理由也都很合理。但它们加在一起，就会把你的时间切得七零八落。\n有人可能会说，你要学会拒绝。\n其实没这么简单。\n同事找你，你当然可以拒绝。但领导觉得你PPT做得好，让你帮忙做一个方案，你怎么拒绝？很多工作本来就没有那么清楚的边界。\n所以后来我给自己定了一个原则：\n我可以帮你，但我的时间不能是免费的。\n如果一件事情不属于我的职责，又需要占用我大量时间，那它必须给我足够的回报，而且这个回报要大于我把时间花在其他事情上的收益。\n很有意思的是，当我开始这样想以后，来找我的人反而少了。\n我也突然意识到，原来很多人需要的并不是“我”，他们只是需要一个免费的解决方案。\n那些我曾经引以为傲的技能，放到市场上可能并没有想象中那么值钱。PPT有人几十块就能做，Excel公式网上随便就能找到，现在很多事情AI几分钟也能完成。\n这并不是说这些技能没用。\n刚毕业的时候，PPT、Excel、数据库都是很好的工具，它们可以让你进入业务、理解业务，也可以让你迅速成为一个“好用的人”。\n但千万不要停在这里。\n因为一个人真正的职业价值，不是他会多少工具，而是：\n他正在解决一个多大的问题。\n同样是Excel，有人只是帮别人做表，有人却通过数据发现一个几百万的经营问题。\n同样是PPT，有人负责调整字体、排版和动画，有人却在思考这份PPT要推动什么决策、争取什么资源、最终解决什么问题。\n工具可能完全一样，价值却完全不同。\n所以刚毕业的时候，可以努力成为那个PPT做得最好、Excel最熟、最会查数据的人。\n但要尽快离开这个阶段。\n不要最后成为那个什么都会一点、谁有问题都来找你、每天忙得要死，却说不清自己到底创造了什么的人。\n不要成为全公司最会做PPT的人。\n要成为那个知道为什么要做这份PPT，以及做完以后，事情应该发生什么变化的人。\n"},{"title":"主流的世界，是一个滞后的世界",
"url":"/blog/zhu-liu-de-shi-jie-shi-yi-ge-zhi-hou-de-shi-jie/",
"date":"2026-08-11",
"headings":[],
"body":"我们经常会看到各种“炸裂消息”“最新消息”，好像每天都有最新的东西发生。\n但我后来发现，如果是突发新闻，比如哪里发生了地震、谁赢了比赛，那么主流媒体确实可以给你最新的信息。\n但如果是技术、产品、商业趋势，情况可能刚好相反。\n当一件事情进入主流的时候，它往往已经发生很久了。\n原因也很简单，因为主流媒体关心的是最大多数人关心的事情。\n而一个真正新的东西刚刚出现的时候，通常不会有那么多人关心。\n最早研究它的可能只有几十个人，然后是几百个人、几千个人。有人研究，有人试用，有人失败，有人开始找到真正的用法。\n等到它已经比较成熟，开始影响几十万、几百万人，主流媒体才会注意到它。\n所以一个东西的发展，大概会经历这样一个过程：\n研究和实验 → 内部使用 → 小圈子试用 → 行业扩散 → 产品化 → 大规模发布 → 主流讨论\n我们平时看到的，往往已经是最后几层。\n比如一家 AI 公司发布了一个新的模型，我们会觉得：新的模型终于来了。\n但对公司内部来说，它当然不是今天才出现的。\n它可能已经训练了很长时间，做过很多轮测试和评估，甚至在正式发布这一代模型的时候，下一代的研究已经开始了。\n手机也是一样。\n当苹果发布一代新手机的时候，我们会把它叫作“最新款”。\n但一家这么大的公司，不可能发布完这一代，第二天才开始思考下一代。下一代甚至下下代的一些技术、设计和供应链准备，很可能早就在进行了。\n所以很有意思：\n我们所谓的“最新”，很多时候只是“最新进入大众世界的东西”。\n它不一定是这个世界真正正在发生的最新变化。\n这样一想，我们平时接收到的信息，其实可以分成几个层次。\n第一层，是已经成为共识的信息。\n新闻报道了，朋友圈在讨论，短视频到处都在讲。\n这类信息的好处是确定性比较高，但问题也很明显：当所有人都知道的时候，你基本已经没有什么信息优势了。\n第二层，是行业正在发生的信息。\n行业媒体、垂直媒体、从业者已经开始大量讨论，但普通人还不太关心。\n这时候一个东西可能已经证明自己有一定价值，只是还没有完全进入大众世界。\n第三层，是小圈子正在尝试的信息。\n可能出现在论坛、开发者社区、论文、GitHub、小型社群里。\n很多东西还很粗糙，甚至根本不能称为产品，但是已经有人开始真正使用它、改造它、研究它。\n这一层的信息会开始变得很有价值，因为你已经比主流世界往前走了一段。\n但再往前，还有一层。\n第四层，是还没有形成信息的“迹象”。\n比如某家公司突然开始大量招聘某一类人。\n某个以前很冷门的开源项目突然出现很多开发者。\n很多创业公司突然同时往一个方向走。\n某种芯片、传感器或者原材料突然开始被大量采购。\n这时候甚至还没有一篇新闻告诉你“某某时代来了”。\n你看到的只是一些散落的现象。\n但是变化可能已经开始了。\n所以我现在觉得，看到一条所谓的“最新消息”，第一反应不应该只是：\n这件事是真的假的？\n还可以多问一个问题：\n这条信息现在处于哪一层？\n是已经被所有人确认的共识？\n是行业正在发生的变化？\n是小圈子正在尝试的东西？\n还是一些尚未被命名的迹象？\n甚至还可以继续问：\n如果我现在看到的是结果，那么它前面发生了什么？\n一个产品突然爆火，在爆火之前谁已经在用了？\n一个技术突然进入主流，在进入主流之前哪些人在研究？\n一个行业突然成为风口，在成为风口之前资本、人才和公司已经发生了什么变化？\n这样看信息，会慢慢从“看新闻”变成“看一件事情是怎么长出来的”。\n当然，越往前的信息也越危险。\n主流信息虽然慢，但是经过了很多人的验证。\n越靠近源头的信息越快，但噪音也越大。\n论坛里十个所谓的未来趋势，可能九个最后什么都不是。\n一个实验室里的技术可能永远无法商业化。\n一个爆料也可能完全是假的。\n所以信息其实存在一个很有意思的关系：\n越确定的信息，通常越晚；越早的信息，通常越不确定。\n这意味着，真正的信息优势并不是“我知道很多别人不知道的小道消息”。\n如果只是这样，很容易变成每天追逐各种所谓内幕。\n真正重要的能力，是能够判断：\n我现在看到的信息，究竟处于整个变化过程的哪一个位置？\n如果它已经成为主流，我可以把它当作事实。\n如果它正在行业扩散，我可以开始研究。\n如果它只存在于小圈子，我可以观察和尝试。\n如果它只是一些零散的迹象，那就先不要急着下结论，而是继续寻找更多能够互相验证的信号。\n所以主流世界的滞后，本身其实没有什么问题。\n因为主流世界承担的，本来就不是探索未知，而是把已经相对成熟的东西交给最大多数人。\n真正值得警惕的是：\n如果我们所有的信息都来自主流世界，就很容易把“现在大家终于知道了”，误认为“这件事情刚刚发生”。\n而真正发生变化的地方，往往还在更前面。\n那里没有标题告诉你答案，也没有人告诉你这是不是未来。\n只有一些很小的圈子、一些奇怪的尝试、一些还无法解释的变化。\n等有一天所有媒体都开始告诉你“时代变了”的时候，\n时代可能早就已经变了。\n"},{"title":"我们为什么欣赏幽默？",
"url":"/blog/wo-men-wei-shen-me-xin-shang-you-mo/",
"date":"2026-08-07",
"headings":[],
"body":"今天玩一个游戏的时候突然想到一个问题：为什么人类文化这么推崇幽默感？\n很多游戏、电影都有这种主角。平常吊儿郎当，嘴里没几句正经话，碰到危险还在开玩笑，但是到了真正重要的事情上，又会突然认真起来。\n而且很奇怪，越是严肃的故事，好像越喜欢安排这种人。\n世界都要毁灭了，他还在讲笑话。\n为什么这种人反而很有魅力？\n我觉得一个原因是，幽默代表一个人还有余力。\n两个人面对同样的危险，一个人已经紧张得不得了，另一个人居然还有心情开玩笑，我们很容易觉得后面这个人更从容。\n因为一个人真的被压力压到极限的时候，很难幽默。大脑里想的都是怎么逃跑、怎么解决问题、接下来怎么办。\n这个时候还能开玩笑，好像是在传递一个信息：\n我知道这件事情很严重，但它还没有严重到完全控制我。\n所以很多电影里的英雄，面对敌人还要嘴欠几句。单独看这些话未必有多好笑，但是放在那个场景里，人就显得特别有魅力。\n还有一种很经典的人物设定：\n平常吊儿郎当，关键时刻特别认真。\n这种反差为什么这么好用？\n因为你慢慢会发现，他并不是分不清轻重。\n他只是觉得很多事情不值得那么严肃。\n小事情随便一点，甚至拿来开玩笑；真正重要的事情来了，他马上知道什么时候应该认真。\n这会让人感觉这个人心里有自己的一套尺度。\n如果一个人任何时候都很严肃，事情严肃，他就跟着严肃，领导严肃，他也严肃，环境紧张，他也紧张。\n但一个平常吊儿郎当的人突然认真起来，你会感觉到：是他自己判断这件事情值得认真。\n这里面其实有一种主体性。\n而且越严肃的作品，幽默反而越重要。\n如果一部电影两个小时都在世界毁灭、朋友牺牲、敌人进攻、大家痛哭，观众很快就麻木了。\n人的情绪需要有松有紧。\n紧张一下，开个玩笑，再紧张一下，再开个玩笑。\n到了最后真正的大事发生，那个平时最喜欢开玩笑的人突然不说话了。\n你马上就知道：\n这次真的严重了。\n所以幽默甚至可以变成一个刻度。平时的轻松，反而让最后的严肃有了重量。\n再往下想，我觉得幽默还是一种很有意思的认知能力。\n很多笑话的本质，都是大家按照一个正常的方向理解一件事情，突然有人从另外一个完全没想到的角度去理解它。\n大家都在害怕一个大反派。\n突然有个人说：等一下，他为什么穿成这样？\n危险并没有消失。\n只是这个人突然把观察世界的摄像机挪了一个位置。\n所以真正幽默的人，经常会让人觉得聪明。\n因为他同时看到了两个视角。\n大家都知道的那个视角，他知道；另外一个奇怪的、出乎意料的视角，他也看到了。\n我觉得这里面甚至有一点认知上的自由。\n现实告诉大家：现在应该害怕。\n他知道。\n但他还能说：等一下，我还可以从另外一个角度看看这件事。\n这可能也是为什么AI的幽默经常不太好笑。\n你跟AI说：“幽默一点。”\n它马上开始加俏皮话、网络梗、奇怪的比喻，甚至每隔几句话就安排一个笑点。\n结果你一眼就能看出来：\n它正在努力幽默。\n真正好笑的东西很少是这样产生的。\n真正的幽默经常需要先非常准确地理解现在发生了什么，理解大家正常情况下会怎么想，然后在一个刚刚好的地方，把这个视角轻轻扭一下。\n所以幽默的人看起来吊儿郎当，背后其实需要很强的理解能力。\n你得先知道什么时候应该严肃，才知道什么时候可以不严肃。\n你得先知道大家正常会怎么看，才有可能找到那个大家没有看到的角度。\n这么想下来，我们欣赏的可能也不只是“这个人会讲笑话”。\n我们欣赏幽默背后的那些东西：\n聪明、从容、余力、判断力，还有一种不完全被现实牵着走的感觉。\n世界发生什么事情，我们很多时候决定不了。\n但是事情发生以后，我用什么角度去看它，好像还可以由我自己决定。\n所以人在战争、灾难、疾病，甚至面对死亡的时候，依然会开玩笑。\n幽默并没有让这些事情变得不严重。\n它只是说明了一件事：\n这件事情很严重，但它还没有大到占据我的整个精神世界。\n可能这就是我们为什么欣赏幽默。\n"},{"title":"真正掌握的能力，往往是在环境里长出来的",
"url":"/blog/zhen-zheng-zhang-wo-de-neng-li-wang-wang-shi-zai-huan-jing-li-chang-chu-lai-de/",
"date":"2026-08-07",
"headings":[],
"body":"学会繁体字的过程真是奇怪。\n生活在广东的人，可能对一件事习以为常：会看繁体字。甚至会觉得，全国人民应该都差不多。\n我第一次意识到这件事并不普遍，是在大学。同学问我：“你怎么看得懂繁体字？”\n我当时反而愣了一下，心想：这不是每个人都会的吗？\n后来才认真想了想，为什么我会。\n小时候接触港台的电视剧、综艺、新闻比较多，屏幕上到处都是繁体字。后来又赶上盗版游戏盛行，很多游戏没有简体中文，甚至没有中文，只有繁体版或日文版。为了玩游戏，只能边玩边猜，时间久了，自然而然就认识了。\n现在回头看，这种学习方式很特别。\n整个过程里，你几乎没有觉得自己在学习，没有背字，没有记规则，也没有考试。只是不断接触、不断使用，某一天突然发现，原来自己已经会了。\n很多真正掌握的能力，好像都是这样来的。\n不是靠刻意去学，而是在一个需要它、会不断用到它的环境里，不知不觉就长出来了。\n如果其他知识，也能设计成这种几乎感觉不到学习，却能慢慢掌握的过程，那学习本身，大概就不会是一件那么痛苦的事情了。\n"},{"title":"怎么设计一个让自己舒服的成长系统",
"url":"/blog/zen-me-she-ji-yi-ge-rang-zi-ji-shu-fu-de-cheng-chang-xi-tong/",
"date":"2026-08-04",
"headings":[],
"body":"最近玩大型 RPG 的时候，我经常会觉得很累。\n不是因为游戏不好玩，而是常常一不小心就玩了一两个小时。一直坐着不动，身体开始酸痛，注意力也越来越疲惫。\n我一直在想，为什么会这样？\n后来发现，很多大型 RPG 都有一个共同特点：它不太允许你在自己想停的时候停下来。\nBoss 打到一半，退出很可惜；前面没有存档点，不敢退出；剧情刚进入高潮，又想再玩一会儿。\n于是节奏开始由游戏决定，而不是自己决定。\n我想到跑步就完全不是这样。\n今天计划跑十公里，跑到三公里累了，可以停。明天继续跑，今天的三公里也不会白跑，身体已经得到锻炼了。\n后来我发现，两者最大的区别，不是游戏，也不是跑步，而是成长系统的设计。\n有些系统把价值放在最后。\nBoss 打赢了才算完成，项目做完了才算完成，考试结束了才算完成。中途停下来，总会觉得今天白费了。\n有些系统的价值是一直累积的。\n今天跑三公里有收获，今天学会一个知识点有收获，今天把一个想法整理清楚也有收获。什么时候停，都不会觉得今天白做了。\n这样的系统，节奏就会一直掌握在自己手里。\n所以我觉得，一个舒服的成长系统，至少有三个特点。\n第一，允许你随时结束。\n第二，结束的时候，不会觉得今天白费了。\n第三，今天积累的东西，明天还能继续接着长。\n这样的设计，做得多一点很好，做得少一点也没关系。可以根据自己的身体状态、时间和精力去调整，而不是一直被终点推着走。\n很多事情，一开始带来的都是好处，但做过头了，反而会变成负担。\n能够让人长期坚持的，往往不是靠意志力，而是每天结束的时候，都能觉得今天已经有收获了，今天到这里，就很好。\n"},{"title":"为什么每个公司都会有财务部门？",
"url":"/blog/wei-shen-me-mei-ge-gong-si-du-hui-you-cai-wu-bu-men/",
"date":"2026-07-31",
"headings":[],
"body":"不知道有没有人好奇过，为什么每个公司都会有财务部门？\n人事部门很好理解，要负责招聘、培训、薪酬；行政部门要负责文具、场地以及各种内务。这些事情总得有人做，公司才能正常运转。\n那财务是干什么的？\n很多人跟财务打交道最多的地方，就是贴发票、报销，然后等财务付款。所以很多人对财务的印象，就是收款、付款、出纳。\n最近我跟 AI 讨论企业管理，想到一个以前没有认真思考过的问题。\n如果只是收款、付款、报销，这些都是执行动作，行政部门也能做，甚至以后系统和 AI 都能做。既然如此，公司为什么还要单独设一个财务部门？\n我想到，财务看的并不是某一张发票，而是整个公司的资金。\n公司的钱是怎么进来的，来源有没有风险？为什么付款人不是客户本人？中间有没有销售先收款再转给公司？付款的时候会不会付错人、付多了、付少了？退款有没有退回正确的账户？\n公司赚到钱以后，是留在账户里，还是拿去投资？投资会不会带来新的风险？\n准备推出一个新产品，或者设计新的激励政策，会不会影响利润？会不会影响现金流？这些问题，也都会落到财务这里。\n这么一想，财务关注的是资金从进入公司，到最后流出公司的整个过程，以及每一个可能出现风险的地方。\n很多创业者擅长产品、擅长市场，想到机会就往前冲，这是企业发展的动力。但组织里也需要有人一直盯着风险，不断提醒：这里有哪些风险，可以提前怎么控制，如果一定要做，又该准备哪些措施。\n财务承担的，就是这样一个角色。\n顺着这个思路，我又想到，公司里的很多部门，划分依据并不是工作内容，而是承担的职责。\n人事长期关注组织能力，销售长期关注市场，产品长期关注价值创造，财务长期关注资金和经营风险。\n所以，贴发票、报销、付款，只是财务每天看得见的工作。这个岗位真正长期承担的职责，是让公司的钱流得更安全，让企业能够跑得更稳。\n"},{"title":"和 AI 最好的协作方式，不是把它当实习生，而是把它当龟仙人",
"url":"/blog/he-ai-zui-hao-de-xie-zuo-fang-shi-bu-shi-ba-ta-dang-shi-xi-sheng-er-shi-ba-ta-dang-gui-xian-ren/",
"date":"2026-07-30",
"headings":[],
"body":"和 AI 最好的协作方式，不是把它当实习生，而是把它当龟仙人。\n小时候看《七龙珠》，我一直觉得龟仙人很有意思。\n他平时看起来疯疯癫癫，甚至有点不靠谱，但一到关键时候，总能拿出一些别人不会的东西。所以大家还是叫他 Master。\n我现在和 AI 相处，也越来越像这种感觉。\n很多人会说，AI 很不稳定。\n有的时候特别厉害，有的时候很普通，有的时候甚至不知道在讲什么。\n其实这不奇怪。\n有些 Master 就是这样，不是每件小事都做得漂亮，但总会在某些地方拿出让你意想不到的方法。\n所以我现在几乎什么任务都会先丢给 AI 试一下。\n我不会先花很多时间去判断它能不能做。\n先让它做。\n如果它做得很好，我就继续问它：\n你为什么会这样做？\n你的思路是什么？\n很多时候，我想学的已经不是这一次的结果，而是它解决问题的方法。\n然后再把这些方法整理下来，变成一套流程，一个提示词，或者一种以后还能继续用的工作方式。\n如果它做不出来，也没什么。\n这次不会，不代表下一次不会。\n这个模型不会，不代表下一个模型不会。\n我不会因为一次失败，就给它下一个结论。\n所以我一直觉得，AI 更适合当一个 Master。\n很多人和 AI 的关系，是让它替自己干活。\n我更喜欢把它当成老师。\n它偶尔会胡说八道，也偶尔会突然放出一个大招。\n而我的工作，就是不断去发现这些大招，再把它们变成自己的能力。\n"},{"title":"AI 的极限，可能在数字世界之外",
"url":"/blog/ai-de-ji-xian-ke-neng-zai-shu-zi-shi-jie-zhi-wai/",
"date":"2026-07-29",
"headings":[],
"body":"深入思考了一下，AI 的极限到底在哪里？\n我觉得，凡是能够用代码完成的事情，就是 AI 能做到的事情。\n准确地说，凡是最终能够在计算机里运行的东西，本质上都可以被 AI 重建。\n这几天 AI 圈很热闹，Claude 那边新模型不断延期，ChatGPT 又不断重置 5.6 的额度。晚上看到很多人一直在刷 AI、跑任务、试各种工作流，外人可能觉得他们什么大项目都没做出来。\n但我觉得，他们跟我一样，都在验证一件事情：\nAI 到底能不能造出任何一个现在程序员能够造出来的东西。\n很多人会说，美团依赖门店，滴滴依赖司机，互联网产品最终还是离不开线下。\n这句话没错。\n但如果只看数字世界，我突然发现一个很有意思的现象。\n无论是大型 3D 游戏、设计作品、网站、App，还是视频，它们最终都只是计算机里的数字信息。3D 游戏不过是模型、贴图、代码；设计稿不过是像素和图层；网站不过是 HTML、CSS 和 JavaScript。\n既然它们最终都能被计算机生成，那理论上，也都可以被计算机重新表达。\n最近我一直在研究把图片逆向成 HTML，本质上就是这个思路。不是复制，而是寻找另一种能够完整表达它的结构。\n所以我越来越觉得，AI 真正改变的，不只是生成内容，而是在消灭数字世界里那些“只能看、不能改”的东西。\n未来真正稀缺的，也许已经不是代码能力，而是谁拥有现实世界的资源和接口。\n因为数字世界，只要能够程序化，就越来越接近可以被 AI 重建；真正难复制的，反而是门店、工厂、物流、品牌、组织，以及人与人之间的信任。\n也许，这才是 AI 真正的边界。\n"},{"title":"AI 对审美漠不关心",
"url":"/blog/ai-dui-shen-mei-mo-bu-guan-xin/",
"date":"2026-07-29",
"headings":[],
"body":"AI 对审美漠不关心。\n想象一下，如果有两个最先进的 AI 在互相交流，它们会聊什么？\n它们大概率不会说：\n“你看我今天的界面设计多漂亮。”\n“你看我用的字体多有艺术感。”\n“你看我做的软件多美。”\n这些东西对 AI 来说没有意义。\n它们更可能讨论的是：\n“我把任务完成时间缩短了多少。”\n“我的准确率提高了多少。”\n“我的推理成本降低了多少。”\n“我对用户需求的满足度提高了多少。”\n因为 AI 从诞生开始，被衡量的就不是审美，而是各种指标：准确率、效率、成本、对齐度、成功率。\n更重要的是，AI 不会因为审美而感到愉悦。\n人类看到一幅画、一段音乐、一座建筑，甚至一个漂亮的字体时，会产生情绪上的满足感。美本身就是一种奖励机制，它会让人感到快乐、感动、震撼，甚至愿意为了这种体验投入时间和金钱。\n但 AI 不会。\n它不会因为看到一幅伟大的画作而激动，也不会因为一个精妙的设计而感到满足。对于 AI 来说，梵高和一张白纸没有本质区别，它们都只是数据。\n所以当我们说某个 AI 的审美更好时，其实并不是它更懂美，而是它更准确地预测了人类会觉得什么是美，它的审美就是一种幻觉。\nAI 可以模仿审美，可以生成艺术，甚至可以比大多数人更擅长复刻艺术风格。\n但是，它并不拥有人类面对美时产生的那种愉悦感。\n因此，审美最终仍然是一种非常“人类”的能力。AI 可以成为艺术的生产者，却永远不会成为艺术的欣赏者。\n"},{"title":"AI 管理的关键，不是规则，而是例外",
"url":"/blog/ai-guan-li-de-guan-jian-bu-shi-gui-ze-er-shi-li-wai/",
"date":"2026-07-29",
"headings":[],
"body":"最近一直在思考，AI 到底什么时候能真正参与管理？\n工作中经常会遇到这样的事。\n一位同事没有按标准完成工作，但因为家里有特殊情况，主管决定特批；一位员工迟到，是因为送孩子去医院；一个客户本来不符合优惠政策，但为了长期合作，决定破例。\n这些决定，人做起来很自然。\n但如果交给 AI，它往往不知道怎么办。\n后来我发现，问题不是 AI 不够聪明，而是管理真正处理的，从来不是规则，而是例外。\n更准确地说，管理者每天都在做一件事：判断哪些例外值得通融，哪些例外以后还会发生。\n当同样的例外出现一次、十次、一百次，它就不再是例外，而会慢慢变成新的制度。\n疫情催生了远程办公，特殊情况催生了弹性考核，越来越多的”特批”，最终都变成了 SOP。\n所以，人和 AI 的分工，也许不是”人管理，AI执行”。\n而是：\n人负责发现新的例外，做第一次判断；AI负责记住已经验证过的例外，让下一次处理得更快、更公平、更一致。\n未来优秀的管理者，不只是管理员工，更重要的是不断把自己的管理经验沉淀给 AI。\n因为真正能复制的，不是制度，而是那些曾经被认真思考过的例外。\n"},{"title":"AI 会不会“离职”？",
"url":"/blog/ai-hui-bu-hui-chi-zhi/",
"date":"2026-07-29",
"headings":[],
"body":"AI 会不会离职？\n最近我一直在思考一个问题：管理 AI 和管理人，到底有什么区别？\n想象一下未来的工作场景。\n作为管理者，你每天来到公司，不再是给一群员工分配任务，而是给一群 AI Agent 分配任务。你告诉它们目标、标准和方向，它们各自思考、执行任务，你负责验收结果，然后进入下一轮循环。\n乍一看，这和管理人似乎没什么区别。\n但人有一个特点：会离职。\n所以企业会建立交接制度、培训体系和备份人员。当一个人离开后，组织仍然能够继续运转。\n那 AI 呢？\n很多人会觉得 AI 不会离职。毕竟它不像员工会跳槽、会退休、会请假。它更像电脑、打印机这样的工具，永远摆在那里等你使用。\n但仔细想想，其实不是。\n你依赖的从来不是“AI”，而是某个具体的模型、平台或者服务商。而这些东西同样会发生变化。\n今天稳定可用的模型，明天可能涨价；今天效果最好的模型，明天可能被淘汰；今天能够访问的服务，明天可能因为地区、政策或者商业原因无法使用。\n从这个角度看，AI 其实也会“离职”。\n它不会递交辞职信，但它可能以另一种方式从你的工作流里消失。\n所以真正成熟的管理者，无论管理人还是管理 AI，都不应该把关键能力完全建立在某一个对象身上。\n就像管理团队一样，你需要交接方案、备份方案和应急方案。最重要的是，当所有人都离开的时候，你自己依然知道这件事情应该怎么做。\n很多人以为 AI 时代最重要的是学会使用 AI。\n但我越来越觉得，真正重要的是：即使没有这个 AI，你依然知道事情该如何完成。\n因为管理的本质，从来不是拥有资源，而是在资源失效的时候，依然能够让事情继续运转。\n"},{"title":"AI 会“通融”吗？",
"url":"/blog/ai-hui-tong-rong-ma/",
"date":"2026-07-29",
"headings":[],
"body":"最近一直在思考一个问题：\nAI 会“通融”吗？\n工作中经常会遇到这样的情况。\n一位同事因为特殊原因，没有按标准完成工作。主管愿意批准，但又不想公开影响他的评价；既希望把事情办好，又不想伤害同事的感情。\n如果交给今天的大多数 AI，它通常只有两个答案：要么严格执行规则，要么直接修改结果。\n但现实中的管理，很少只有这两个选项。\n优秀的管理者真正做的，是寻找第三种方案：延期、补做、一次性特批、保留审批记录、限制查看权限……既完成任务，又兼顾规则和人的感受。\n我越来越觉得，这可能才是 AI 真正难学会的能力。\n未来优秀的 AI，不只是执行命令，而是能够主动思考：有没有一种创造性的解决方案，既满足制度要求，又尽量降低对人的伤害，让各方都能够接受。\n很多时候，人类真正需要的，并不是一个“正确答案”，而是一个“大家都认可的答案”。\n如果有一天，AI 学会的不是一味执行规则，而是学会在规则之内寻找更好的解决方案，它理解的就不只是任务，而是真正开始理解人类社会。\n"},{"title":"AI 时代，程序员的终点不是全栈，而是判断力",
"url":"/blog/ai-shi-dai-cheng-xu-yuan-de-zhong-dian-bu-shi-quan-zhan-er-shi-pan-duan-li/",
"date":"2026-07-29",
"headings":[],
"body":"今天没有AI 聊我的岗位，聊一下最近我和后端开发聊天的话题。\n程序员变全栈做项目靠谱吗？\n很多人不知道，程序员真正积累的，从来不只是代码。他每天都在分析需求、拆解问题、权衡方案、协调资源、评估风险，这些能力本来就可以延伸到效率管理、增长管理，甚至经营管理。\n代码只是起点，不应该是终点。\nAI 时代最值得重新思考的是：执行越来越便宜，判断越来越昂贵。\n以前，一个人能把事情做出来，就是核心竞争力；现在，AI 已经能把越来越多的事情做出来。真正拉开差距的，开始变成判断什么事情值得做、资源应该投向哪里、目标应该如何取舍。\n判断并不是一句“做决定”这么简单，它背后是对目标、信息、资源和未来的综合理解。\n也许未来，无论是程序员，还是其他职业，真正决定一个人能走多远的，都不是他的专业能力，而是能否把专业能力，最终沉淀成判断能力。\n"},{"title":"AI 时代，工具正在让人对自己祛魅",
"url":"/blog/ai-shi-dai-gong-ju-zheng-zai-rang-ren-dui-zi-ji-qu-mei/",
"date":"2026-07-29",
"headings":[],
"body":"AI 时代的来临，让我对自己的能力越来越“去魅”。\n以前总觉得自己缺的不是能力，而是机会。总觉得自己像一匹千里马，只是一直没有遇到伯乐。如果给我足够的资源、工具和平台，我一定能做出一些与众不同的事情。\n但当 AI 工具真正来到面前，我忽然发现，很多过去做不到的事情，现在理论上都能做了。写代码、做产品、设计游戏、搭建网站，门槛都在快速下降。\n于是问题来了：如果工具已经给你了，你会拿它做什么？\n我认真想了想，脑海里浮现的，大多还是与自己生活相关的小工具、小项目、小想法。它们当然有价值，但似乎也没有什么颠覆行业的构想，没有什么改变世界的宏大计划。\n这让我开始重新审视自己。过去我们总喜欢把能力和成就的差距归因于外部条件，归因于缺少机会、资源和平台。但当工具被大幅拉平之后，人就不得不面对一个更直接的问题：你的想法到底值多少钱？你的认知边界到底在哪里？\n所以我越来越觉得，每个人都应该认真用一次 AI。不是为了提高效率，而是为了看看自己到底能走到哪里。\n当工具的限制被拿掉之后，你是否还认可曾经对自己的评价？\n"},{"title":"AI 时代还有工匠精神吗？",
"url":"/blog/ai-shi-dai-huan-you-gong-jiang-jing-shen-ma/",
"date":"2026-07-29",
"headings":[],
"body":"AI 时代是否还有工匠精神？\n我们在 AI 快速发展的时代，随着 Agent 的不断迭代，人们越来越崇尚多任务，认为 AI 是可以取代专家的。一个专家数十年积累的知识，和 AI 一秒钟的思考似乎差不多。\n这有一部分是正确的。越来越多很难获取的知识，或者以往人们觉得需要长时间积累的知识，确实通过 AI 瞬间到达了许多人身边。\n但是，工匠精神依然存在。在 AI 时代，越来越稀缺的反而是那些真正有质量的内容。当你看到一个人能够打磨自己的技能至臻完美的时候，你的心里还是会涌起一股感动。\n在 AI 时代，最重要的不是是否使用 AI 工具，而是“发出人”是谁：\n\n有些人因为标准较低，所以他们发出来的东西就会用很低的标准，这是 AI 弥补不了的。\n有些人做什么事都追求尽善尽美、至臻完善，所以他发出来的内容，不管是否有 AI 辅助创作，都是好内容。\n\n好内容总是受到欢迎的，工匠精神总会让人感动。\n"},{"title":"AI 时代，谁在卖铲子的人身后赚钱？",
"url":"/blog/ai-shi-dai-shui-zai-mai-chan-zi-de-ren-shen-hou-zhuan-qian/",
"date":"2026-07-29",
"headings":[],
"body":"最近看到两个新闻。\n一个是韩国 SK 海力士，因为 AI 带来的业绩暴涨，据报道员工今年可能拿到几百万元人民币级别的奖金。\n另一个是中国长鑫存储推进上市，也有消息说将诞生一批千万富翁员工。\n我突然发现，AI 时代的”淘金理论”好像又升级了。\n以前大家都说：\n淘金的人不赚钱，卖铲子的人赚钱。\n放到 AI 行业，GPU 很像那个卖铲子的人。\n但最近我发现，还有比卖铲子更赚钱的位置。\n那就是——卖铲子的人，也需要买东西。\nGPU 再强，也离不开存储。\nAI 模型越大、推理越多，对存储的需求就越高。结果就是，AI 越火，GPU 越赚钱，而 GPU 越赚钱，整个产业对存储的需求也越大。\n于是，一个原本没有那么多人关注的行业，反而成了 AI 时代最大的受益者之一。\n我觉得这里面最有意思的不是存储赚钱了。\n而是每一个赚钱的产业，上面都还有一个产业。\nGPU 是 AI 的铲子。\n而存储，是卖铲子的人离不开的东西。\n所以，当所有人的目光都盯着 AI 模型的时候，真正闷声发财的，可能已经是那些一直默默做存储的人了。\n"},{"title":"AI 为什么还改不好图片里的中文？",
"url":"/blog/ai-wei-shen-me-huan-gai-bu-hao-tu-pian-li-de-zhong-wen/",
"date":"2026-07-29",
"headings":[],
"body":"最近一直在研究一个问题：为什么我不相信 AI 很快就能彻底解决图片里的中文问题。\n很多人的观点是，再过一两代模型，中文自然就不会乱码了。但我的看法恰恰相反。\n现在主流的 AI 图片生成，本质上是在预测每一个像素应该长什么样。对于它来说，一个汉字和一片树叶、一块砖墙、一团纹理没有本质区别，它是在“画”文字，而不是“写”文字。\n这也是为什么，改两个字，旁边几个字可能一起变了；让它生成一段中文，总会出现一些似是而非的笔画。因为它理解的是图像，而不是文字本身。\n英文还能勉强依靠 26 个字母和人脑自动补全，但中文有几千个常用汉字，每一个字都是高度精确的符号，只要一笔错，整个字就变了。\n所以我越来越觉得，这可能不是模型大小的问题，而是生成方式的问题。\n也正因为如此，我最近反而开始研究另一个方向：不是等待 AI 把中文做到完美，而是思考如何把 AI 已经生成好的图片重新变成可编辑、可修改、可复用的内容。\n很多人都在追求更强的生成能力，但也许未来会诞生一类新的工程，它们并不负责“生成”，而是负责“理解 AI 已经生成的结果”，让这些原本一次性的图片，重新拥有编辑能力。\n我越来越觉得，这条路未必只是一个补丁，它可能会成为 AI 时代新的基础设施。\n"},{"title":"AI 与老师傅的差距，到底在哪里？",
"url":"/blog/ai-yu-lao-shi-fu-de-chai-ju-dao-di-zai-na-li/",
"date":"2026-07-29",
"headings":[],
"body":"AI 与老师傅的差距到底在哪里？\n最近做《GTA 中国县城版》Demo，我越来越觉得，AI 与老师傅真正的差距，并不是执行能力。\n如果你告诉 AI：“做一个接近 GTA5 的高真实感游戏。”对人来说，这已经是一个足够明确的目标；但对 AI 来说，这里面藏着大量没有说出口的“隐含假设”。\n老师傅会自动补齐这些假设：要短期出效果、优先选择行业最佳实践、不要自己造轮子、先解决人物、光照、环境这些最影响真实感的部分，而不是在低价值的工具和技术路线里不断修补。\n更重要的是，老师傅想的是全局最优，而 AI 往往容易陷入局部最优。AI 会不断思考：“这个方案还能不能再优化一点？”于是一直修修补补；而老师傅会很快判断：“这条路线从一开始就错了，直接换。”因为他知道，再好的局部优化，也不可能变成全局最优。\n所以，老师傅最有价值的地方，从来不是知道怎么做，而是知道哪些事情根本不用做。经验的本质，也不是积累了更多知识，而是把几十年的踩坑经历，变成了一套默认的判断规则，不断缩小搜索空间，快速排除 90% 的错误路线，把资源集中到最有可能成功的方向。\n我越来越觉得，未来人与 AI 的分工会发生变化。AI 的执行效率会越来越强，但真正稀缺的能力，将变成定义目标、补齐隐含假设、选择正确路线，以及在关键节点做出全局最优的决策。\n专业判断力，本质上不是知道得更多，而是知道什么值得做，什么不值得做。\n"},{"title":"AI 真正让人担忧的，是它从一开始就被政治化",
"url":"/blog/ai-zhen-zheng-rang-ren-dan-you-de-shi-ta-cong-yi-kai-shi-jiu-bei-zheng-zhi-hua/",
"date":"2026-07-29",
"headings":[],
"body":"AI真正让人担忧的，或许从来不只是技术本身，而是它从一开始就被深度政治化。\n掌握核心模型、芯片和算力的人，并不愿意向所有地区平等开放；各国也在不断收紧技术与资源，因为谁都害怕在这场竞争中落后。\n而它带来的裁员问题也不能忽视，这些人都没工作了，未来会在哪里？\n而更大的问题是，AI这次替代的不再只是体力，而开始进入写作、设计、编程、金融、教育等脑力工作领域。\n企业会发现：\n过去几十人的工作，现在可能只需要几个管理者加一套AI系统。\n于是，技术红利越来越集中，但普通岗位却可能越来越少。\n社会真正焦虑的，并不是“AI会不会毁灭人类”，而是大量普通人，是否还能在新的秩序里找到自己的位置。\n"},{"title":"AI时代，真正重要的不是学会更多技能，而是走出竞技场",
"url":"/blog/aishi-dai-zhen-zheng-zhong-yao-de-bu-shi-xue-hui-geng-duo-ji-neng-er-shi-zou-chu-jing-ji-chang/",
"date":"2026-07-29",
"headings":[],
"body":"最近在社交媒体上，以及在我生活中碰到的一些程序员，在面对AI浪潮时，表面上看起来都很适应。\n现在还跟不上的人已经很少了。毕竟大家都开始用AI编程，没有人再有借口停留在原处，坚持说自己不会。\n但这场表面上的学习盛宴，真的是因为大家都这么有热情、这么有好奇心吗？\n在我看来，它更像一场《饥饿游戏》。\n我观察到，不只是程序员，只要是技术岗位，大家都在拼命学习其他岗位的知识。前端转后端，后端学前端，开发学产品，程序员学设计，甚至测试、部署、运营都想一起做。\n他们在干什么？\n其实是在不断兼并其他岗位。自己多懂一点、多做一点，然后希望最后公司只需要留下少数几个人，而自己成为那个最不容易被淘汰的人。\n驱动他们不断学习和进步的，未必是好奇心，而更多是焦虑和恐惧。\n不是“我想学”，而是“我不能不会”。\n不是“我对这个东西感兴趣”，而是“如果别人会我的，而我不会别人的，那被淘汰的可能就是我”。\n所以大家都在拼命给自己增加技能，仿佛掌握的武器越多，在这场《饥饿游戏》里活下来的概率就越高。\n但我发现，业务部门反而很少出现这种现象。\n一个销售学会了AI，不会想着我要取代运营；一个运营做出了一张好图，更多时候是顺手发给同事，告诉大家这个工具很好用。\n他们学习AI，反而更像是出于好奇，或者是为了把工作做得更方便，然后互相分享、互相帮助。\n为什么技术岗位会更焦虑？\n因为技术岗位过去的分工太清晰了。前端就是前端，后端就是后端，测试就是测试，设计就是设计。\n但AI最先打掉的，恰恰就是这些边界。\n于是大家开始相信：公司原来需要五个人，现在可能只需要一个人，那我就努力成为那个能够干五个人工作的人。\n这场游戏当然可以参加，而且短期内可能很有效。\n但是，有些人其实学错了东西。\n有些人不断横向增加技能，却没有扩大自己负责的问题。\n以前只会前端，现在前后端都会了；以前只会开发，现在测试、部署、设计也会一点。\n但他仍然在等待别人告诉他要做什么。\n他能完成的任务越来越多，却仍然不知道为什么要做这件事，这件事解决了谁的问题，值不值得投入，什么结果才算真正完成。\n他只是从一个单一工具人，变成了一个全能工具人。\n还有一些人，今天学Agent，明天学MCP，后天学新的框架，永远在追最新的工具。\n但这些恰恰是AI正在快速降低门槛的东西。\n你今天花几个月学会的能力，半年以后可能一句提示词就能完成。\n如果一直追着AI补技能，你其实不是在积累真正的优势，而是在不断延缓自己被追上的时间。\n那怎么跳出这场游戏？\n不是停止学习技术，而是改变自己学习技术时所站的位置。\n不要只问：\n我还需要掌握哪些岗位的技能，才能不被淘汰？\n而应该问：\n我能够负责一个什么样的完整结果？\n站在岗位里，你看到的是前端、后端、测试、设计和产品。\n站在结果上，你看到的是：怎样让一个产品真正被用户使用，怎样让公司降低成本，怎样让业务流程自动运行，怎样让客户更愿意付费，怎样发现一个值得解决的问题。\n当你开始负责结果，技术就不再是身份，而只是工具。\n你不再是一个会很多技术的程序员，而是一个能够借助程序、AI、产品、设计和业务知识，把某个问题完整解决的人。\n这时，学习什么，就不应该由焦虑决定，而应该由问题决定。\n需要就学，不需要就不学；学到能够完成结果即可，而不是为了证明自己比别人更全面。\n《饥饿游戏》最可怕的地方，不只是所有人互相淘汰，而是每个人都只能盯着身边的人：\n他有什么武器，我缺什么武器；他会不会先淘汰我；我怎样才能比他活得更久。\n但真正拥有更高视野的人，会抬头看看竞技场本身。\n是谁设计了这套规则？\n为什么我要按照这套规则竞争？\n除了成为最后一个留下来的程序员，我能不能成为定义问题、组织资源，甚至设计游戏的人？\n有些游戏当然值得参加，因为它能换来眼前的生存空间。\n但不能因为所有人都在奔跑，就默认奔跑的方向是对的。\nAI时代最危险的人，未必是不学习的人。\n反而可能是那些极其勤奋、不断学习，却始终只在练习如何取代旁边那个人的人。\n他们掌握了越来越多的武器，却从来没有想过走出竞技场。\n真正重要的，不只是学会更多技能，而是看清自己正在参加什么游戏，为什么参加，以及有没有可能从一个参赛者，变成一个能够选择游戏、定义游戏，甚至创造游戏的人。\n"},{"title":"白领，或许会重新走入“工厂”",
"url":"/blog/bai-ling-huo-xu-hui-zhong-xin-zou-ru-gong-han/",
"date":"2026-07-29",
"headings":[],
"body":"白领，或许会重新走入“工厂”。\n自从大学扩招之后，社会诞生了大量白领岗位。很多人进入企业，对着电脑工作、处理信息、敲打键盘，然后每个月领取工资。过去二十年，整个社会都在朝“办公室化”发展。\n但 AI 可能会改变这一切。\n它不再需要那么多重复性的脑力劳动，也不再需要那么多传统白领。很多标准化的文书、代码、运营、分析工作，都会被 AI 大量接管。\n那未来需要什么人？需要懂 AI 的人，需要维护 AI 的人，需要为 AI 运转提供基础设施的人。\n很多人最终会重新进入某种意义上的“工厂”。只是这个工厂，不再是过去的流水线车间，而是服务器机房、能源系统、冷却设备和数据中心。\nAI 并不是悬浮在云端的魔法，它背后需要庞大的现实世界支撑：大量电力、冷冻系统、显卡、服务器、网络和土地空间。它会像工业时代的机器一样，占据现实中的资源与空间，并重新组织人的劳动。\n过去，人围绕工厂工作；未来，很多人可能会开始围绕 AI 运转。\n"},{"title":"笔记不需要完美结构，只需要回到问题",
"url":"/blog/bi-ji-bu-xu-yao-wan-mei-jie-gou-zhi-xu-yao-hui-dao-wen-ti/",
"date":"2026-07-29",
"headings":[],
"body":"在《西部世界》中，世界的创作者 Arnold 一直试图让机器诞生真正的“意识”。\n最初，他认为意识是一种“金字塔结构”：底层是记忆，其上是即兴反应，再往上叠加更复杂的认知能力——仿佛只要一层层构建，就能抵达意识的顶点。\n但后来他发现，这种理解是错的。\n意识并不是向上累积的结构，而更像是一座“迷宫”。无论你做出怎样的选择、走向哪条路径，最终都会不断靠近某个“中心”，或者逐渐偏离它。\n我觉得AI时代的笔记系统也是。\n我原以为记笔记应该有一个“完美的结构”，我翻看之前复杂的笔记，发现知识的获取根本不是构建复杂的笔记，而是回到那个原点———你的问题是什么？\n因此，你只需要提问和不断寻找答案，而不是停下来“建造宫殿”。\n"},{"title":"不被 AI 时代裹挟，也是一种能力",
"url":"/blog/bu-bei-ai-shi-dai-guo-xie-ye-shi-yi-chong-neng-li/",
"date":"2026-07-29",
"headings":[],
"body":"最近我也认真想过做 AI 自媒体。\nAI 刚出来的时候，我写过公众号，拉过群，也跟着关注各种新模型、新产品。但后来我慢慢发现，很多事情其实已经不是在做 AI，而是在做传媒。\n每天追新闻、抢首发、做评测、写资讯、剪视频，本质上是在传播信息，而不是创造技术。很多所谓的 AI 内容，其实是在比谁更新得更快，谁更会挑动公众情绪。真正深入的技术文章，反而常常石沉大海。\n所以我开始问自己：我真正想做的，到底是哪一件事？\n如果选择做 AI 自媒体，就意味着要接受它的游戏规则。\n今天有新模型要测，明天有新产品要体验，后天又有新的爆款话题。头部博主几乎都在和时间赛跑，一天几更，甚至凌晨还在更新，因为热点过去了，流量也就过去了。\n这不是能力的问题，而是职业本身决定了节奏。\n而我发现，这并不是我现在想过的生活。\n我有家庭，有孩子。我不想为了追上每一次 AI 的热点，把晚上的时间、周末的时间，甚至陪伴家人的时间都换成一条视频、一篇推文。\n不是说影响力不重要，也不是说做 AI 自媒体没有价值，而是它离我真正想做的事情，还有一段距离。\n我更喜欢的是把 AI 当成工具，去完成一些真正长期存在的事情：做产品、搭系统、解决问题、提升工作效率，或者实现那些过去一个人根本做不到的项目。\n所以我越来越觉得，市场上那些火热的 AI，其实混杂着很多不同的人。\n有人是在做媒体，有人在做教育，有人在卖课程，有人在做咨询，有人在创业，也有人像我一样，只是想借助 AI 去完成自己的目标。\n这些都没有高低之分，但它们根本不是同一件事。\n很多人的焦虑，恰恰来自没有分清这一点。\n别人走的是媒体路线，你却拿自己的生活去和他的更新频率比较；别人靠热点吃饭，你却觉得自己也必须时时在线。\n最后不是 AI 推着你往前走，而是整个外部世界在裹挟你。\n真正重要的，也许不是追上 AI，而是先想清楚：AI 在你的人生里，到底应该扮演什么角色。\n找到适合自己的方向，也找到适合自己的节奏。\n因为节奏，本身就是一种选择；而不被时代裹挟，也是一种能力。\n"},{"title":"不要逼自己，要逼事情变得值得",
"url":"/blog/bu-yao-bi-zi-ji-yao-bi-shi-qing-bian-de-zhi-de/",
"date":"2026-07-29",
"headings":[],
"body":"如何去做自己不喜欢做的事情？\n很多人都在研究一个问题：\n怎么逼自己去做不喜欢的事情？\n但我的经验是，这个方向可能一开始就错了。\n真正应该做的，不是逼自己，而是逼这件事情变得对自己有价值。\n如果老板交给你一项不喜欢的工作，就主动去争取更多认可、更多资源、更多机会，甚至把它变成一次加薪或晋升的筹码。\n如果同事需要你帮忙，就不要只是默默付出，而是让这份帮助形成长期的互相支持，而不是单方面索取。\n如果一件事情重复又枯燥，就想办法让公司投入工具、让 AI 接手，或者推动流程优化，而不是一直要求自己更能忍。\n很多人之所以越来越累，是因为所有不喜欢的事情，都只有责任，没有价值。\n于是只能不断消耗自己的意志力。\n意志力终究会耗尽，但价值会持续产生动力。\n所以，与其研究怎么逼自己，不如研究：\n怎样逼环境、逼规则、逼别人，让这件事情开始对自己有价值。\n因为真正能长期坚持一件事情的，从来不是责任感，而是持续不断的正反馈。\n不要逼自己喜欢一件事情。\n要逼这件事情，变成一件值得自己去做的事情。\n"},{"title":"“聪明”不是一种能力，而是一个结果",
"url":"/blog/cong-ming-bu-shi-yi-chong-neng-li-er-shi-yi-ge-jie-guo/",
"date":"2026-07-29",
"headings":[],
"body":"我一直搞不懂，“聪明”到底是什么意思。\n一个小孩能够懂一道题，难道不是因为他被训练过吗？\n如果他能够举一反三，那应该叫举一反三；如果他反应快，那就是反应快；如果他很会待人接物，那就是情商高。\n为什么我们最后都统一称之为“聪明”？\n后来我越来越觉得，“聪明”其实不是一种能力，而是一个结果。\n当一个人总能比别人更快接近正确答案时，我们懒得继续追问原因，于是统称他“聪明”。\n可真正决定他接近答案速度的，可能完全不是同一种东西。\n有的人靠经验，有的人靠反应速度，有的人靠抽象能力，有的人靠模式识别，有的人靠对规律的总结。\n所以，“聪明”更像是一个标签，而不是一种能力。\n就像我们说一个人“成功”，却很少去区分，他究竟是因为运气、选择、坚持、资源，还是时代。\n很多词都是这样。\n它们不是解释，而是停止解释。\n当我们说“他很聪明”时，往往意味着我们不再继续追问：他到底为什么能够做到。\n而真正值得研究的，从来都不是“聪明”，而是那些构成聪明的能力。\n"},{"title":"当世界变大，困住你的事情就会变小",
"url":"/blog/dang-shi-jie-bian-da-kun-zhu-ni-de-shi-qing-jiu-hui-bian-xiao/",
"date":"2026-07-29",
"headings":[],
"body":"我越来越觉得，科幻作品或许对一些抑郁、长期内耗的人有帮助。\n心理学有个概念叫“心理距离”：很多情绪之所以强烈，是因为事情离自己太近，眼里只剩下工作、同事、得失，以及别人怎么看自己。\n最近重看《三体》《黑镜》《西部世界》《星际穿越》等作品，一个最大的感受是，它们会不断拉大你的“心理距离”。从几十年、几百年，甚至整个宇宙文明的尺度重新看待问题，从人类、人工智能、外星文明的视角再回头看自己，很多原本压得喘不过气的事情，都会变得没那么沉重。\n当然，科幻作品不能治疗抑郁，更不能替代专业的心理帮助。但它或许能帮助一些人跳出狭窄的思维框架，训练自己用更大的坐标系理解世界。\n当世界变大了，困住你的事情，往往就变小了。\n"},{"title":"第一性原理，不只是回到本质",
"url":"/blog/di-yi-xing-yuan-li-bu-zhi-shi-hui-dao-ben-zhi/",
"date":"2026-07-29",
"headings":[],
"body":"最近一直在思考很多人口中的“第一性原理”到底是什么。\n很多人都是从埃隆·马斯克那里知道这个概念，但真正解释的时候，往往都会停留在一句“回到事物的本质”。听起来很有道理，却又总觉得有点模糊。\n后来我查了一些资料，发现第一性原理最早来自亚里士多德，它强调的是：不要接受现有的经验和结论，而是不断追问，直到找到那些不能再继续拆分的基本事实，再从这些事实重新推导解决方案。\n马斯克造火箭就是一个经典例子。别人认为火箭就是几千万美元一枚，他却没有接受这个前提，而是继续往下拆：火箭到底是什么？其实就是铝、钛、碳纤维、电子元件……于是他重新计算原材料成本，再重新设计整个制造过程，而不是沿着行业原来的思路去优化。\n不过，看到这里，我发现我真正感兴趣的，并不是第一性原理本身，而是它让我开始重新思考：企业里的人，到底是在不同的什么层次上思考问题？\n最近在训练自己的管理思维时，我慢慢整理出了一个六层模型。\n第一层是执行层，思考的是“怎么做”。\n第二层是流程层，思考的是“怎样做得更稳定”。\n第三层是管理层，思考的是“怎样组织人去做”。\n第四层是经营层，思考的是“怎样做才能赚钱”。\n第五层是战略层，思考的是“什么该做，什么不该做”。\n而第六层，我把它称为本质层。\n这一层思考的，不再是方法，而是这件事情存在的目的到底是什么。\n比如商业。\n我们可以讨论流程有没有优化、团队有没有管理好、战略有没有方向，但如果企业长期亏损，那么前面所有动作做得再漂亮，都不能说是一家成功的企业。\n因为商业最终还是要解决企业持续生存的问题，而盈利，就是这个目标的重要体现。\n其实很多事情都是这样。\n很多会议讨论了一两个小时，讨论的是流程；很多管理动作花了很多精力，讨论的是执行；很多争论看起来很激烈，其实大家讨论的根本不是同一个层次的问题。\n真正重要的是，先回到最底层问一句：\n我们到底想解决什么问题？真正的目的是什么？\n最近我也一直在想，为什么大家很少会讨论到这一层？\n后来发现，并不是因为我们不会，而是因为我们的工作决定了我们的视角。\n员工每天面对的是任务，所以容易停留在执行层；主管每天面对的是流程，所以容易停留在流程层；经理每天面对的是团队，所以更多思考管理层。每个人都会被自己每天接触的问题，限制在对应的思维层次里。\n而老板之所以看起来总是“看得更远”，并不是因为他更聪明，而是因为他的职责决定了，他必须不断往上思考：这个业务为什么做？这件事情真正的目标是什么？企业最终靠什么活下来？\n所以，我觉得普通人如果想拥有更高层次的思维，不一定要等坐到那个位置。\n平时遇到任何事情，都可以多问自己几遍：\n为什么要这么做？\n如果把现在的流程全部推倒，真正想解决的问题是什么？\n这件事情最终要达成的目的是什么？\n很多时候，当你开始习惯这样思考，你看到的就不再只是执行、流程和管理，而会慢慢开始站到经营、战略，甚至本质层去看问题。\n也许，这才是第一性原理真正值得学习的地方——它不是一个商业技巧，而是一种不断向上追问、不断逼近本质的思维习惯。而这种习惯，恰恰也是普通人最容易训练，却又最容易忽略的能力。\n"},{"title":"懂 AI，不是懂某一个模型",
"url":"/blog/dong-ai-bu-shi-dong-mou-yi-ge-mo-xing/",
"date":"2026-07-29",
"headings":[],
"body":"很多人问，怎样才算一个“懂AI的人”？\n我越来越觉得，这个问题其实问错了。\n真正应该问的是：AI现在发展到了产业的哪个阶段？\n因为任何一个成熟产业，理解它的方法都会发生变化。\n汽车刚出现的时候，最重要的是机械原理，所以大家研究发动机、活塞、曲轴；后来汽车成熟了，更多人研究的是供应链、自动驾驶、车联网和商业模式，而真正天天研究发动机的人，只剩下一小部分。\n互联网也是一样。早期大家讨论TCP/IP、编译原理、数据库；后来讨论的是云计算、DevOps、产品设计；今天更多讨论的是商业生态和用户增长。底层原理没有消失，只是被封装了。\nAI也正在经历同样的过程。\n2022年，我接触AI时，学的是梯度下降、逻辑回归、神经网络、ReLU、Softmax，那时候觉得AI就是数学。\n到了2026年，大家讨论更多的是Agent、Harness、AI Infra、Workflow、模型选择、企业落地，甚至开始讨论AI伦理和组织协作。\n很多人会疑惑：为什么招聘要求越来越看不懂？既不是数学，也不是Prompt。\n其实不是AI变复杂了，而是AI开始产业化了。\n一个成熟产业，真正需要的人会越来越分工：\n有人研究底层原理，推动技术边界；\n有人建设基础设施，让技术稳定运行；\n有人做产品，把技术变成商业价值；\n有人管理组织，让人与AI协同工作。\n每一层需要的能力都不同。\n研究底层，需要数学和科研能力；做基础设施，需要工程经验；做产品，需要业务理解；管理AI，则需要组织和管理经验。\n所以，我现在已经不太喜欢用“懂AI”这个词。\n因为有人懂模型，有人懂工程，有人懂产品，有人懂商业，他们都懂AI，只是站在产业链的不同位置。\n真正值得学习的，也不是每天追最新的术语，而是学会判断：一项技术现在处于产业发展的哪个阶段，它真正需要什么能力。\n懂AI，本质上不是懂某一个模型，而是懂一个产业是如何从科学，走向工程，再走向商业和组织的。\n"},{"title":"敢于争取利益的人，争的往往是结果",
"url":"/blog/gan-yu-zheng-qu-li-yi-de-ren-zheng-de-wang-wang-shi-jie-guo/",
"date":"2026-07-29",
"headings":[],
"body":"最近听曾国藩的故事，有个细节让我印象很深。\n当年曾国藩不断向咸丰皇帝争取湘军的兵权、任命权和各种名分，朝中不少大臣都觉得他贪得无厌。\n可后来我发现，一个真正想把事情做成的人，几乎都会去争取利益。\n这里的利益，不只是钱，而是资源、权力、名分、激励。\n因为很多事情，不是你有能力就能完成，而是必须先拥有完成事情的条件。\n企业里也是一样。\n一个负责人不断争取预算、编制、激励政策、决策权限，很多时候不是为了自己，而是因为他知道，没有这些，事情根本推不动。\n还有一个很容易被忽略的地方。\n如果你是一个领导，却从来不替团队争取利益，下面的人为什么要死心塌地跟着你？很多管理者真正的职责，本来就是向上争取资源，向下创造结果。\n所以，我们经常把一件事情看反了。\n表面上，那个不断争取利益的人，好像成本最高；那个什么都说”无所谓”“都可以”“不给也行”的人，好像最好管理。\n但真正的成本，恰恰来自后者。\n因为一个什么都不争取的人，往往也不会真正对结果负责。他不会主动发现资源缺口，不会思考权责是否匹配，不会推动组织解决真正的问题。给他多少资源，他就做多少事；缺什么，他也不会去补；最后事情没做好，成本还是组织来承担。\n反而那些敢于争取资源、权力和利益的人，本质上争取的并不是利益本身，而是事情能够成功的条件。\n很多时候，我们以为他在争利益，其实他争的是结果；我们以为那些什么都不要的人最省成本，其实他们才是组织里最贵的人。\n"},{"title":"高手不是知道更多，而是把一个点走成一张网",
"url":"/blog/gao-shou-bu-shi-zhi-dao-geng-duo-er-shi-ba-yi-ge-dian-zou-cheng-yi-zhang-wang/",
"date":"2026-07-29",
"headings":[],
"body":"这些年工作下来，我越来越觉得，人与人之间真正的差距，很少来自智商，而是来自获取信息的方式。\n互联网最大的价值，其实不是信息本身，而是信息之间的链接。\n很多人看新闻，只停留在新闻。\n但高手会把每一条信息，当成一张地图上的起点。\n比如，一则新闻说：“某款 AI 软件一周突破百万用户。”\n普通人知道：“哦，它火了。”\n高手却会一路追下去。\n官网是怎么介绍的？用了哪些模型？有没有技术博客？GitHub 有没有开源？开发者有没有分享设计思路？评论区有没有人拆解实现方法？有没有教程可以复现？最后，自己还能不能照着做一遍？\n再比如，一款游戏突然爆火。\n很多人玩过就结束了。\n但也有人会去找制作团队的演讲、开发日志、美术资源、玩家拆解视频，再顺着里面提到的引擎、插件、工具、论文继续查下去。\n真正有价值的信息，往往不在新闻正文。\n它可能藏在一条评论、一个链接、一篇博客、一场演讲、一份源码、一篇论文，甚至作者关注的另一个作者。\n互联网就像一张巨大的知识网络，每一条信息都是一个节点，每一个链接都是通往下一层的入口。\n普通人获取的是一个答案。\n高手获取的是一条路径。\n普通人知道”是什么”。\n高手不断追问：“为什么？怎么做到的？还能找到哪些资料？我能不能亲手实现一次？”\n久而久之，他们积累的不只是知识，而是一张越来越完整的知识网络。新的信息一出现，他们总能迅速找到相关线索，把不同领域连接起来，再转化成自己的能力。\n人与人的差距，很多时候不是知道得更多，而是更会顺着信息，一步一步，把别人看到的一个点，走成一张网。\n"},{"title":"“功高震主”的本质，是组织失衡",
"url":"/blog/gong-gao-zhen-zhu-de-ben-zhi-shi-zu-zhi-shi-heng/",
"date":"2026-07-29",
"headings":[],
"body":"为什么说功高震主？\n最近听曾国藩的故事，我对“功高震主”有了一个新的理解。\n晚清平定太平天国之后，湘军已经成为全国最强大的军事力量。朝廷不断把曾国藩召回北京觐见，慈禧甚至当着他的面（阴阳怪气）说：“没有曾国藩，大清已经完了。”而曾国藩却始终不敢认这些功劳，一直强调，功劳都是皇帝和朝廷的，自己只是奉命办事。\n以前我一直觉得，“功高震主”就是皇帝猜忌功臣。\n后来才发现，它真正可怕的地方，不只是猜忌，而是组织开始失衡了。\n当一个人的影响力越来越大，甚至超过了原有组织能够承载的程度，整个组织就会开始围绕他重新运转。\n领导会开始担心，真正的决定权是不是正在发生转移；下面的人也会开始重新计算自己的利益，到底应该跟着谁，未来掌握在谁手里。\n于是，问题已经不是曾国藩有没有反心，而是所有人都会开始讨论一个问题：湘军到底还是朝廷的湘军，还是曾国藩的湘军？\n到了这个阶段，事情已经不是个人意志能够决定的了。\n如果曾国藩继续保留湘军，他就必须给这支越来越强大的组织一个新的未来；如果不这样做，原有体系也一定会不断排斥他，因为没有任何一个组织能够长期容纳两个中心。\n所以后来曾国藩不断强调，功劳属于皇帝，湘军属于国家，最后又主动裁撤湘军。\n很多人觉得这是谦虚或者自保，我觉得更像是在主动恢复组织的平衡，把围绕自己形成的利益共同体重新交还给朝廷。\n我想到前几年的董宇辉，其实也是类似的剧情。\n很多人都说，是董宇辉救了新东方。但反过来看，董宇辉能够拥有今天的影响力，同样离不开新东方的平台、供应链、品牌和组织资源，这并不是一个人能够完成的事情。\n可当越来越多人开始觉得“没有董宇辉，新东方就不行”的时候，结构其实已经发生了变化。\n这时候，无论是继续留下，还是独立出去，都已经不仅仅是董宇辉一个人的决定，而是关系到整个组织的利益重新分配。外界、员工、合作伙伴，都会围绕新的中心重新思考自己的位置。\n所以我越来越觉得，“功高震主”真正讲的，并不是领导心胸狭窄，也不是功臣野心太大。\n它讲的是一个组织的规律：当一个人的影响力大到足以改变组织结构时，人的心态会变，利益会重新流动，组织也一定会重新寻找平衡。\n很多时候，看似是一个人的选择，其实早已变成了一整个组织共同推动的结果。\n"},{"title":"共享同一片校园，却不是同一种人生",
"url":"/blog/gong-xiang-tong-yi-pian-xiao-yuan-que-bu-shi-tong-yi-chong-ren-sheng/",
"date":"2026-07-29",
"headings":[],
"body":"最近看到高中校友获得了菲尔兹奖，第一反应竟然不是震惊，而是觉得一种很奇怪的感觉——好像打破了次元壁。\n按理说，我们是同一所高中毕业，距离应该很近。但仔细想想，其实又远得不得了。\n他从高中开始就在国际奥数比赛不断拿金牌，过的根本不是普通高中生的生活。我们每天上课、放学、聊天、打球，而他的生活，大概是专职老师带着训练、做竞赛题、参加比赛。偶尔出现在学校，大家鼓掌，然后又离开。\n他的校园生活，更像是一个天才儿童的培养体系，而不是我们所经历的校园生活。\n所以，说是校友，好像很近；实际上，即使在同一个学校，恐怕连很多同班同学都会觉得离他很远。大家共享的是同一片校园，却不是同一种人生。\n后来我才发现，我们总以为一个学校、一个公司、一个城市，就是一个共同体。但实际上，它更像是许多平行世界叠在一起。\n有人每天为了考试努力，有人为国际竞赛做准备；有人忙着谈恋爱，有人已经开始创业；有人在实验室，有人在舞台上，有人默默无闻地做着自己的事情。\n大家共享同一个空间，却生活在完全不同的轨道里。\n也正因为如此，很多人其实一直都在我们身边，只是我们彼此没有交集。直到有一天，他获得了一个所有人都认识的奖项，或者做出了一件足够大的事情，媒体开始报道，我们才突然惊讶地说一句：“原来他是我的校友。”\n可事实上，在那之前，他一直都在那里。\n只是我们终于有机会，看见了那个原本就存在、却一直没有进入我们视野的世界。\n"},{"title":"故事最打动人的地方，可能恰恰是它虚构的部分",
"url":"/blog/gu-shi-zui-da-dong-ren-de-di-fang-ke-neng-qia-qia-shi-ta-xu-gou-de-bu-fen/",
"date":"2026-07-29",
"headings":[],
"body":"故事最打动人的地方，恰恰可能是它虚构的部分。\n今天早上我刷到一个视频。90 多岁的 修哥（胡枫） 举办演唱会，陈奕迅 作为嘉宾出场，分享了一段往事：当年自己还是新人时，修哥曾主动问他有没有需要帮忙的地方、有没有工作机会可以介绍。\n这样的故事我们听过很多。\n某个前辈提携后辈，某个老板关心员工，某个成功人士在成名前帮助过别人。甚至现实里，有些故事本身就是后来不断被润色、被加工出来的。\n但有趣的是，人们往往不在意故事是否百分之百真实。\n因为打动人的，从来不是事实本身，而是故事所承载的意义。\n也许当时只是一个很随意的举动，一句普通的话；也许当事人的想法远没有后来解读得那么高尚；也许这个人平时脾气暴躁、要求苛刻，根本不是大众想象中的完美形象。\n但故事会自动把这些复杂性过滤掉。\n留下的，是那个愿意提携后辈的前辈，是那个温和亲切的老板，是那个拥有巨大权力却依然平易近人的成功者。\n为什么这样的故事传播力这么强？\n因为它满足了人们对世界的期待。人们希望成功的人是善良的，希望强大的人是克制的，希望权力和温柔能够同时存在。\n而真实世界往往不是这样。真实的人充满矛盾，既有优点也有缺点，很难成为一个完美的符号。\n于是故事就出现了。\n它把一个复杂的人，提炼成一个简单的形象；把一个偶然的瞬间，放大成一种人格特质；把一个普通事件，变成一种值得传播的价值观。\n奇妙的地方在于，即使这些故事并不完全真实，它们依然能够真实地影响人。\n有人因为这样的故事变得更善良，有人因此努力成为一个更好的领导者，有人因此相信帮助别人是有意义的。\n如果故事完全按照现实来讲——这个老板平时经常骂人，只是在某一天说了一句温暖的话——它反而失去了力量，因为它又变回了那个充满矛盾和灰度的现实世界。\n所以很多时候，人类并不是活在事实里，而是活在故事里。\n正如 尤瓦尔·赫拉利 在《人类简史》中所说，人类能够大规模协作，很大程度上依赖于共同相信的故事。\n国家、货币、品牌、荣誉、使命，某种意义上都是故事。\n而推动人类向前的，很多时候也不是冰冷的事实，而是那些我们愿意相信、愿意传递、愿意为之行动的故事。\n"},{"title":"管理者真正需要的，不是工作能力，而是价值能力",
"url":"/blog/guan-li-zhe-zhen-zheng-xu-yao-de-bu-shi-gong-zuo-neng-li-er-shi-jia-zhi-neng-li/",
"date":"2026-07-29",
"headings":[],
"body":"管理者真正需要的，不是工作能力，而是价值能力。\n我最近有一个很深的感受。\n传递价值和工作技能，其实是两回事。\n很多人觉得，一个人工作能力强，自然就适合当管理者。但我越来越觉得，领导在招管理人员的时候，真正看重的，并不是谁最会做事，而是谁最会创造价值、传递价值。\n什么叫做传递价值？\n不是把任务完成，而是让别人知道，这个任务为什么值得做。\n不是多做出一个产品，而是让这个产品真正对客户有价值。\n因为价值一旦被看见，人就会产生动力。\n大家会主动思考怎么做好它，而不是等着别人安排。\n没有价值，就只能靠任务推动、靠监督推动、靠考核推动，人永远都是被动做事情。\n而这恰恰不是一个管理者应该具备的能力。\n很多人到了管理岗位，还是那个工作能力很强的人。\n他自己做得很快，自己解决问题很厉害，但整个团队并没有因为他的存在而创造出更多价值。\n他只是把自己的事情做得很好。\n这样的能力，在专业岗位当然很重要，但到了管理岗位，它的价值就开始下降了。\n就像一个科学家。\n他的专业能力可能世界一流，但如果他的研究始终不能形成市场价值，公司却要承担极高的成本，这对一家商业公司来说，其实并不划算。\n企业终究不是为能力买单，而是为价值买单。\n所以管理岗位真正需要的，不是最强的专业能力，而是能够不断创造价值、解释价值，并把价值传递出去的人。\n我后来发现，很多人的成长方向，一开始就偏了。\n大家都觉得，要成为管理者，就应该不断锻炼自己的工作技能。\nExcel 更熟一点。\nSQL 更快一点。\nPPT 做得更漂亮一点。\n这些当然重要。\n但它们更像是一张门票。\n它让领导觉得：“这个人事情做得不错，可以交给他。”\n可是，工作技能终究只是筹码。\n真正决定一个人能走多远的，不是技能，而是价值能力。\n因为技能的产出，几乎都是线性的。\n你一天能写多少代码，能做多少报表，能成交多少客户，都受时间限制。\n但价值创造和价值传递，却是一种杠杆。\n一个新的产品方向，一个新的激励机制，一个新的流程，一个新的组织目标，都可能影响几十个人、几百个人未来几个月甚至几年的行为。\n它放大的，不再是自己的产出，而是整个组织的产出。\n组织之所以需要管理层，也不是因为老板一个人忙不过来。\n而是因为每个人能够管理的信息、影响的人都是有限的。\n老板脑子里的价值，不可能直接传递给几百名员工。\n组织里面需要有人不断把这些价值翻译成大家能够理解、能够相信、愿意行动的语言。\n所以管理，本质上是在做价值的传播。\n我越来越觉得，如果目标是成为一个管理者，那么从一开始，就不应该只训练工作的技能。\n工作技能只是让领导看见你的机会，是进入牌桌的门票。\n而价值创造和价值传递，才是真正决定你未来高度的能力。\n它不是等你当上管理者以后才需要学习的东西。\n它应该越早训练越好。\n因为这是一种杠杆能力。\n只是有人很早就看见了它，有人很多年以后才明白。\n"},{"title":"关心别人，是一项需要学习的能力",
"url":"/blog/guan-xin-bie-ren-shi-yi-xiang-xu-yao-xue-xi-de-neng-li/",
"date":"2026-07-29",
"headings":[],
"body":"最近看到黄仁勋分享他和父母相处的一段话，印象很深。\n他说，即使到了六十多岁，父母还是总觉得他做得不够好，总会不断提醒他、督促他，希望他变得更好。他说，这就是很多亚洲父母关心孩子的方式。\n现在很多人批评这种教育方式太高压，也有人认为，这恰恰是真正为孩子好。\n我突然想到，也许双方讨论的不是同一件事。\n一方讨论的是出发点——父母是真的关心你，希望你越来越好。\n另一方讨论的是体验——这种关心的方式，确实会让人感到压力。\n后来我又想到身边很多人与人之间的相处，尤其是亲人之间，其实都很像。\n有些长辈关心你，第一句话永远是：“够不够钱？不够我打给你。”\n不管你的问题跟钱有没有关系。\n还有些长辈，你工作不顺、被领导批评，他们第一反应就是：“要虚心接受。”“是不是你哪里没做好？”\n有时候，他们也未必真的认为事情就是这样，只是这是他们最熟悉的反应。\n他们其实是在关心你。\n只是，他们不知道还有没有别的表达方式。\n我发现，关心别人好像不是一件很直觉的事情。\n我们小时候没有人学过”怎么关心别人”，所以长大以后，很多人只是复制了自己曾经被关心的方式。\n有人习惯给建议，有人习惯给钱，有人习惯讲道理，有人习惯不断提醒。\n于是就出现一个很有意思的现象：每个人都觉得自己在关心别人，但别人未必感受得到，甚至可能觉得自己被否定、被教育、被冒犯。\n所以我越来越觉得，关心别人和善良不是一回事。\n善良只是让你愿意关心别人。\n而关心本身，其实是一项需要学习的能力。\n它需要理解对方此刻真正需要什么，也需要学会用对方能够接受的方式表达出来。\n原来，真正困难的，不是有没有关心别人，而是怎么让这份关心，真正被对方接收到。\n"},{"title":"很多冲突不是对错，而是价值观锁定",
"url":"/blog/hen-duo-chong-tu-bu-shi-dui-cuo-er-shi-jia-zhi-guan-suo-ding/",
"date":"2026-07-29",
"headings":[],
"body":"看《黑镜》第三季第一集，很有感触。\n主角和弟弟其实从来就不是一类人。主角深深沉迷于人类社会的“评分体系”里，她努力微笑、精致生活、小心经营每一句话，本质上都是想获得更高的评分，跻身所谓的“上等社会”。\n弟弟则完全相反，他不断吐槽姐姐越来越虚伪，觉得她早已忘记了真实的自己，活成了那些“高分人”的样子。\n但主角也反问得很扎心：难道和你一起住在凌乱狭小的公寓里，就是所谓的真实吗？真实的人生，真的值得过吗？\n这其实就是很多家庭、很多亲密关系里的矛盾。\n虽然现实里很少有人是绝对的非黑即白，但人与人之间，往往就是两种力量在拉扯：一种人拼命想“拿高分”，渴望被社会认可，希望通过规则获得更好的生活；另一种人则更在意“真实的自我”，讨厌表演，抗拒迎合，不愿把人生变成一场长期营业。\n这两种人都不一定错。因为“高分”确实能换来资源、机会和体面的生活；但“真实”也确实能让人活得轻松、不那么拧巴。\n很多冲突的根源，并不是谁对谁错，而是双方都太过认同自己的那套价值观，认为这是唯一正确的人生。\n"},{"title":"驾驭 AI 最好的人，最会补充隐含假设",
"url":"/blog/jia-yu-ai-zui-hao-de-ren-zui-hui-bu-chong-yin-han-jia-she/",
"date":"2026-07-29",
"headings":[],
"body":"驾驭AI最好的人，将是“隐含假设”补充得最好的人。\n为什么我们让AI做一个任务，它几乎不可能一次就做好？\n很多时候不是AI不行，而是我们说得不够完整。\n人和人沟通时，一句话背后其实藏着很多默认前提。比如你说“帮我做个PPT”，一个有经验的人会自动想到：给谁看？什么风格？几页？要不要数据图？颜色要不要统一？是否要方便修改？哪些内容要突出？\n但AI不会天然知道这些。它只能根据你说出来的内容去猜。模型越强，猜得越准，但它永远不可能穷尽你的所有隐含假设。\n我最近研究别人的skill，其中一个PPT skill让我印象很深。它不是简单地“生成PPT”，而是设计了一套完整流程：先把需求转成Markdown，再转成SVG，中间还会让用户确认风格、颜色、页面结构等，甚至强制中止等待确认。\n这看起来很神奇，其实本质上也只是一个skill.md文件，一些文字，一些prompt。\n但它厉害的地方在于：它不是让AI一次性猜完，而是把人的隐含假设拆成一步一步的确认。\n所以真正有价值的不是prompt写得长，而是prompt把多少没说出口的默认前提变成了明确规则。\n专业人员为什么还有一席之地？因为他知道“你真正要的东西是什么”。他可以通过一系列具体指导，让AI大概率沿着正确路径到达目标。\nAI不能保证一次成功，但好的工作流可以保证路径正确。路径一旦正确，效果通常就只是时间和迭代问题。\n所以未来真正会用AI的人，不一定是最懂模型参数的人，而是最会补充隐含假设的人。\n更进一步说，Prompt不是命令，而是把隐含假设显性化。\nSkill、workflow、checklist、system prompt，本质上都是把经验工程化。\n老师傅厉害，不只是因为他会做，而是因为他脑子里有一整套默认假设库。他知道什么地方会出错，什么路径低价值，什么步骤必须确认，什么结果才算合格。\n未来驾驭AI最好的人，可能就是能把这些“默认假设库”整理出来的人。\n这件事最后不是魔法，而是工程。\n模型负责推理，工作流负责约束路径。\n谁能把模糊经验变成清晰流程，谁就能真正驾驭AI。\n"},{"title":"健康是手段，不是目的",
"url":"/blog/jian-kang-shi-shou-duan-bu-shi-mu-de/",
"date":"2026-07-29",
"headings":[],
"body":"刚刚路过一个标语，上面写着一句话：\n“健康才是目的。”\n我就在想，健康真的就是目的吗？\n恐怕很少有人会把自己生命的目的定义成：“我要健康。”\n在我看来，健康更像是一种手段，而且是最重要的手段。\n因为没有健康，人生很多想做的事情做不到，很多想体验的事情体验不到。你有再多的想法、再好的机会、再丰富的资源，身体和头脑跟不上，一切都会受到限制。\n所以，健康存在的意义，不是成为人生的意义，而是支撑人生的意义。\n另外，我觉得健康也不是狭义上的养生。\n它不是把所有指标都维持在最好，也不是为了什么都不敢尝试。\n我理解的健康，是一种能够尽可能扩大自己能力范围的状态。\n你的身体允许你去探索，你的体力允许你去尝试，你的头脑允许你去思考，你的精神允许你去面对变化。它让你能够做更多事情、体验更多事情，而不是把自己小心翼翼地保护起来。\n所以，健康始终是一种手段。\n它不是终点，而是让我们拥有更多选择、更多尝试、更多体验，让人生变得更加丰富的首要条件。\n"},{"title":"开发游戏的四个基本步骤",
"url":"/blog/kai-fa-you-xi-de-si-ge-ji-ben-bu-zou/",
"date":"2026-07-29",
"headings":[],
"body":"我应该知道开发游戏的大概流程了。\n\n选择游戏引擎，可以用 Unreal、Unity 这种成熟的游戏引擎，也可以用 Three.js、OpenGL 这种更底层的方案，从零开始搭建。\n设计游戏内容，包括世界观、玩法、关卡、地图、人物、车辆、NPC 等，再自己建模、AI 生成，或者直接下载现成的资源。\n导入游戏引擎，用 C++、C#、蓝图等开发游戏逻辑，比如人物控制、驾驶、战斗、任务、AI、物理、UI 等功能。\n不断测试和优化，调整画面、性能、交互和玩法，把所有资源和功能组装起来，最终发布成一个完整的游戏。\n\n"},{"title":"空山新雨后，我们与王维看过同一片天空",
"url":"/blog/kong-shan-xin-yu-hou-wo-men-yu-wang-wei-kan-guo-tong-yi-pian-tian-kong/",
"date":"2026-07-29",
"headings":[],
"body":"“空山新雨后，天气晚来秋。”\n今天雨后，看着窗外的风景，忽然想起了王维的这句诗。\n好像每一次雨后，空气会变得格外清新，景物也变得格外清晰，整个世界都像被重新洗过一遍。\n我们与一千多年前的王维，居然仰望着同一片天空，在雨后感受过同样的清澈。\n"},{"title":"快乐不等于快感",
"url":"/blog/kuai-le-bu-deng-yu-kuai-gan/",
"date":"2026-07-29",
"headings":[],
"body":"快乐不等于快感。\n赫胥黎的《美丽新世界》里描绘了一个近乎完美的世界：\n没有战争，没有贫穷，没有焦虑，不开心就吃药，人人都能获得快乐。\n但作者真正想问的是：\n如果一个人永远快乐，却失去了选择、成长、痛苦和追求意义的能力，这样的人生还值得过吗？\n因为快乐（hapiness）和快感（pleasure），其实两种东西。\n快感来自即时满足：\n刷短视频、打游戏、吃甜食、获得点赞。\n它来得很快，也消失得很快，所以需要不断重复刺激。\n而真正的快乐，往往来自那些并不舒服的事情：\n养孩子、学习、创业、创作、坚持一段关系、完成一个困难目标。\n这些事情充满疲惫、焦虑和挫折，但很多年后回头看，却会觉得：\n那段日子很有意义。\n尤瓦尔在《人类简史》里提到，人类越来越擅长制造快感，却不一定更幸福。\n因为幸福不仅是一种感觉，更是一种对人生意义的确认。\n养孩子就是最典型的例子。\n从快感角度看，养孩子几乎全是成本：\n花钱、熬夜、操心、失去自由。\n但很多父母依然会说：\n孩子是我人生最重要的部分。\n这说明，人追求的从来不只是舒服。\n人还需要意义。\n所以《美丽新世界》最可怕的地方，不是让人痛苦，而是让人沉迷于快感，最终失去寻找意义的能力。\n也许真正的人生不是消灭所有痛苦，而是找到那些值得承受痛苦的事情。\n"},{"title":"老板买的不是时间，而是注意力支配权",
"url":"/blog/lao-ban-mai-de-bu-shi-shi-jian-er-shi-zhu-yi-li-zhi-pei-quan/",
"date":"2026-07-29",
"headings":[],
"body":"小时候帮家里看店时，我一直觉得是在“卖时间”。\n后来发现不是。\n老板买的从来不是你的时间，而是你的注意力支配权。\n店里一天开12小时，真正来客人可能只有2小时，但剩下10小时你也不能走，因为你必须随时准备响应客人、送货、电话和各种突发情况。\n上班也是一样。\n开会可以远程，人不一定要在现场，但会议软件必须在线；工作不一定一直在做，但消息来了必须马上回复。\n所以很多人明明一天没干多少活，下班却特别累。消耗的不是体力，而是注意力。不断被微信、电话、会议和各种琐事打断，大脑始终处于待命状态。\n从这个角度看，员工出售的是部分注意力，老板出售的则是全部注意力。真正束缚人的往往不是工作量，而是无法关闭的“待命状态”。\n或许财富自由的本质，也不是不用工作，而是重新获得自己注意力的支配权。\n能够连续几个小时专注做自己想做的事，而不必随时响应别人的需求，这可能才是现代社会最稀缺的自由。\n"},{"title":"老板喜欢的，未必是听话的人",
"url":"/blog/lao-ban-xi-huan-de-wei-bi-shi-ting-hua-de-ren/",
"date":"2026-07-29",
"headings":[],
"body":"很多人觉得，老板喜欢听话的人，是因为喜欢别人顺着自己、喜欢听好话，这样老板会觉得舒服。\n我觉得应该不只是这样。\n老板喜欢听话的人，更多来自于一个词：试错。\n企业经营，或者说做很多事情，本身就是在信息不完整的情况下进行的。老板或者CEO最大的价值，就是在信息不完整的时候做出决策，然后再由市场去验证这个决策到底是对还是错。\n所以，很多事情其实都处于试验阶段。\n这时候，陪老板一起做试验的人就很重要。\n如果老板提出一个想法，你总能像打辩论赛一样，找到很多反对意见，也能拿出很多论据，那这些观点有没有价值？\n当然有。\n提出反对意见的人，可以帮助老板及时纠偏，避免一些明显的错误。\n但问题是，很多事情不是讨论出来的，而是试出来的。\n如果每一个决策都停留在会议室里反复论证，老板就永远拿不到真正的市场反馈。\n真正的答案，往往只有放到市场里，回来之后才知道是对还是错。\n所以，一个执行力强、愿意支持老板把事情先做出来的人，其实非常重要。\n他的作用不是证明老板是对的，也不是无脑服从老板，而是帮助老板快速验证一个决策。\n老板真正喜欢的，也许从来不是”听话”的人，而是那些能够把一个想法快速变成现实，再让市场告诉大家答案的人。\n因为在商业世界里，验证速度，本身就是竞争力。\n"},{"title":"买车险这件事，让我重新理解“最低价”",
"url":"/blog/mai-che-xian-zhe-jian-shi-rang-wo-zhong-xin-li-jie-zui-di-jia/",
"date":"2026-07-29",
"headings":[],
"body":"车险到期，又到了和销售们“博弈”的时候。\n有个相熟的销售，每年月初都会来找我。以前我基本都会找他买，因为算上返现，确实比支付宝便宜不少。\n今年，我却看出了一点猫腻。\n他先报了一个价格，我随便找了另一个销售比价，发现差不多，就按我一贯的策略——晾几天再买。没想到，才过几天价格就变了。\n变了就算，还贵了几百块。我跟他说这样不实在，他却说这个行业就是这样，价格跟股市行情一样，每天都在变。\n我问了 AI，了解到现在很多车险优惠本身就是动态调整的，不同时间、不同渠道，甚至不同人，优惠都可能不一样。我也懒得纠结原理，直接回去问之前另一位销售重新报价，结果她也重新算了一遍，比之前又贵了 80 块。\n这时候我灵机一动，打开了蚂蚁保。\n因为我保存了过去两年的保单，拿出来一对比，发现销售有个习惯：总会趁你不注意，把几个险种的保额悄悄提高。被我指出来后，对方解释说是公司要求这样打包销售。\n套路一下子就清晰了。\n于是我干脆自己研究了一下车险，按照去年的险种搭配，在蚂蚁保重新配置，还顺便加上了我真正需要的医保外责任险。\n最后算下来，总价竟然比销售月底号称的“最低优惠价”还便宜。\n唯一的小问题是，被保人默认是车主，不是我。我咨询了一下客服，2 秒钟就解决了。\n越来越觉得，很多事情不是因为别人坑你，而是因为自己不懂。\n当你开始了解规则、自己会操作之后，很多所谓的“优惠”“最低价”“内部渠道”，其实都没那么神秘了。\n"},{"title":"每一项工作，最终应该属于哪一层？",
"url":"/blog/mei-yi-xiang-gong-zuo-zui-zhong-ying-gai-shu-yu-na-yi-ceng/",
"date":"2026-07-29",
"headings":[],
"body":"最近，我发现自己的工作流越来越清晰了。\n当有一项工作过来，我第一反应总是交给 AI，但我不只是把工作交给 AI。\n我会继续问几个问题。\n第一，AI 能不能完成？\n如果能完成，我马上会想第二个问题：未来能不能不靠 AI 完成？\n如果答案是可以，那我就脚本化（Script）。\n因为这说明这件事本质上是确定性的，AI 只是帮我验证了流程。一旦流程跑通，就应该交给脚本，速度更快、成本更低、结果也更稳定。\n如果发现摆脱不了 AI，例如需要理解自然语言、总结信息、保持一定创造性，那我就不会继续重复写 Prompt，而是直接做成一个 Skill。\n把 Prompt、上下文、规则全部沉淀进去，保证下一个任务还能获得几乎一样的体验。\n如果这还是一个重复发生的任务，那就再往下一层。\n不需要 AI 的，就交给 Cron 定时执行。\n需要 AI 的，例如每天搜集信息、分析新闻、生成报告，我就直接交给 Automation，让 AI 每天自动完成，我只负责消费最终结果。\n后来我发现，我真正设计的不是 AI 工作流，而是一套工作的归宿。\n每一个新任务都会先经过 AI 探路，然后根据它的性质，最终沉淀到不同的层：\nAI 探索 → Script 脚本化 → Skill 产品化 → Automation 自动运行。\n以前的软件，是人在找工具。\n现在更像是在思考：每一项工作，最终应该属于哪一层。\n"},{"title":"那次没有走上舞台，成了我旅行中的遗憾",
"url":"/blog/na-ci-mei-you-zou-shang-wu-tai-cheng-liao-wo-lv-xing-zhong-de-yi-han/",
"date":"2026-07-29",
"headings":[],
"body":"说个和AI无关的事情。\n多年前，我和老婆一起去马尔代夫度蜜月。当时有落日、海滩、清爽的海风，我发现沙滩坐了一群人。\n原来有一个表演，但舞台的主演并没有人，只有一些乐器。看了一会儿，我才明白，原来这些乐器是给旅客准备的。\n要是谁愿意上去高歌一曲，或者是玩一下乐器都是受到允许的，台下的人也会认真听。那是一个绝佳的机会，没多少“候选者”。\n但是，我并没有勇气。因为我的音乐修养太差，现在想起还是一个遗憾。\n如果当时我会唱几首英文歌，能弹弹吉他或者是打鼓，那该多好呀。\n"},{"title":"努力本身，不是人生的意义",
"url":"/blog/nu-li-ben-shen-bu-shi-ren-sheng-de-yi-yi/",
"date":"2026-07-29",
"headings":[],
"body":"如何对那些工作努力、又做得很好的人去魅？\n看石黑一雄的《长日将尽》即可。\n小说里的史蒂文斯，是英国最顶级的管家。他把”尽职”做到极致，把”专业”做到无可挑剔。他一生都相信，只要忠于职责，把工作做到最好，就是人生最大的意义。\n于是，当父亲临终时，他没有陪在身边；面对彼此有好感的肯顿小姐，他一次次把感情压了下去；几十年后，当他终于发现自己效忠的主人站错了历史的一边，他才意识到，自己用一生守护的信念，并没有带来自己以为的人生。\n他没有偷懒，没有懈怠，没有犯什么明显的错误。恰恰相反，他几乎把每一件事情都做到了极致。\n但他也几乎错过了一切。\n《长日将尽》最让我震撼的地方，不是它告诉我们不要努力，而是它让我开始怀疑：努力本身，并不是人生的意义。\n我们总以为，只要认真、负责、尽职，就一定会拥有一个无愧于心的人生。但人生并不只是由”把事情做好”组成，它还包括爱、陪伴、选择、勇气，以及那些无法重来的人和时刻。\n《长日将尽》写的不是一个失败者，而是一个几乎没有做错任何事的人，却依然留下了巨大的遗憾。\n也许，这才是它最令人难过的地方。\n"},{"title":"如果不能收回时间，就收回注意力",
"url":"/blog/ru-guo-bu-neng-shou-hui-shi-jian-jiu-shou-hui-zhu-yi-li/",
"date":"2026-07-29",
"headings":[],
"body":"如果不能收回你的时间，那就收回你的注意力。\n很多人觉得，一个人最宝贵的是时间。后来我发现，更宝贵的是注意力。\n因为很多工作，不只是占用了你的上班时间，还要求你每时每刻都保持在线、随时响应。真正消耗你的，不是八小时，而是持续被打断、被切碎的注意力。\n如果暂时无法离开这份工作，那就不要轻易交出自己的注意力。\n能快速完成的事情，就不要无限内耗；能标准化、自动化的工作，就不要反复投入思考。把最好的注意力，留给真正能改变未来的事情：学习一项新技能、做一个项目、培养第二收入，而不是无止境地消耗在不会带来更多回报的事务上。\n这也是为什么很多白领会“摸鱼”做自己的项目。不是因为懒，而是因为他们知道，月薪通常不会因为投入了更多注意力就自动上涨。\n真正决定未来的，往往不是公司买下的那八小时，而是下班前后、碎片时间里，你把注意力投向了哪里。\n时间有时无法收回，但注意力，最好始终掌握在自己手里。\n"},{"title":"如何把个人经验变成团队资产？",
"url":"/blog/ru-he-ba-ge-ren-jing-yan-bian-cheng-tuan-dui-zi-chan/",
"date":"2026-07-29",
"headings":[],
"body":"今天看到 Claude Code 负责人 Boris Cherny 分享了一个很有意思的观点，让我开始重新思考 AI 时代的管理。\n过去，一个优秀的程序员会不断把经验自动化：写测试、写 Lint 规则、完善 CI，把踩过的坑变成规则，让同样的错误不会发生第二次。\n但如果站在管理者的角度，一个更大的问题是：怎么把个人经验，变成团队资产？\nAI 时代，一个重要答案就是持续建设 CLAUDE.md、REVIEW.md、Lint 规则 这样的知识基础设施。\n它们看起来像文档，但实际上并不是给人看的文档，而是 AI 工作时的上下文、团队经验和工作约束。它们记录的不只是“怎么做”，更是“为什么这样做”“哪些坑已经踩过”“哪些规范不能违反”。\n以前，一个新人需要花几个月才能学会的隐性经验，未来可以直接交给 AI，也可以交给下一个加入团队的人。\n所以我觉得，未来程序管理的重点，可能会从管理代码、管理人，逐渐变成管理知识。\n每发现一个重复出现的问题，不只是把这一次修掉，而是思考：能不能把它沉淀成一条规则、一份 CLAUDE.md、一条 Lint、一项自动检查，让这个问题永远不要再发生。\n管理者真正应该建设的，不只是团队，而是一套能够不断积累、不断放大生产力的知识基础设施。\n"},{"title":"软件像左脑，AI 像右脑",
"url":"/blog/ruan-jian-xiang-zuo-nao-ai-xiang-you-nao/",
"date":"2026-07-29",
"headings":[],
"body":"软件像左脑，AI 像右脑。\n过去几十年，我们几乎一直都在发展“左脑工具”。\nExcel、数据库、ERP、各种管理系统，本质上都是在强化人的逻辑、计算、记忆、流程和执行能力。它们让我们的左脑越来越强，让复杂的事情变得有秩序、有标准。\n而 AI 的出现，第一次让我觉得，人类开始拥有了一个真正意义上的“外置右脑”。\n它会联想、会创作、会写作、会设计、会总结、会提出新的思路。很多过去需要灵感才能完成的事情，现在 AI 都能参与其中。\n所以，AI 并不是软件的一次升级，而是人类能力的一次升级。\n过去，我们主要训练自己的左脑，把右脑交给天赋、经验和偶然的灵感。\n未来，也许恰恰相反。\n需要记忆的，让软件去做；需要计算的，让程序去做；需要标准化执行的，让工作流去做。\n而我们真正需要学习的，是如何驾驭这个比自己更强大的“外置右脑”。\n不是让 AI 替你思考，而是学会向它提问；不是接受它的第一个答案，而是利用它不断发散、不断推演、不断碰撞新的想法。\n也许未来人与人的差距，不再是谁的左脑更强，而是谁更懂得管理自己的左脑，以及如何借助 AI，把自己的右脑放大十倍、百倍。\n工具一直都在进化。\n真正需要进化的，始终是我们使用工具的方式。\n"},{"title":"商业的本质，是提高资源回报率",
"url":"/blog/shang-ye-de-ben-zhi-shi-ti-gao-zi-yuan-hui-bao-lu/",
"date":"2026-07-29",
"headings":[],
"body":"商业的本质，是用最小的资源获取最大的收益。\n所以在收入不变的情况下，无脑加班其实是一件很奇怪的事情。\n很多人把加班当成努力，把忙碌当成价值。\n但从商业角度看：\n工时只是成本，\n产出才是价值。\n如果一个人每天工作12小时，收入不变；\n另一个人每天工作8小时，收入也不变。\n那么多出来的4个小时，并没有创造额外收益，只是在消耗自己的时间、精力、健康和家庭生活。\n真正优秀的企业和个人，思考的从来不是：\n“怎么工作更久？”\n而是：\n“怎么用更少资源完成同样结果？”\n所以商人研究流程，\n工程师研究自动化，\n投资人研究杠杆。\n他们都在做同一件事：\n提高资源回报率。\n因为时间是最昂贵、最不可再生的资源。\n如果一个问题只能靠不断加班解决，\n很多时候不是人不够努力，\n而是系统出了问题。\n商业世界最终奖励的，\n不是最辛苦的人，\n而是资源利用效率最高的人。\n"},{"title":"图形负责理解，文字负责压缩",
"url":"/blog/tu-xing-fu-ze-li-jie-wen-zi-fu-ze-ya-suo/",
"date":"2026-07-29",
"headings":[],
"body":"最近用 AI 的时候，我发现一个很有意思的现象。\n很多中文、英文的原文，我其实不是看不懂，而是看得很累。尤其是一大段介绍、论文或者技术文档，总觉得要花不少精力才能理解。\n后来我换了一种方式，让 AI 把内容生成一张海报、一张流程图或者一张概念图，结果几乎一眼就懂了。\n我开始思考，这是 AI 总结得好吗？\n后来发现，可能不是。\n真正起作用的，不是 AI，而是图形。\n人类从出生开始，就是先认识图形，再认识文字。婴儿不会字，却能认出妈妈、猫、狗、奶瓶。文字其实只是后来发明的一套符号，用来给这个世界贴标签。\n我忽然想到，文字真正的作用，可能并不是让人理解，而是索引。\n比如我看到“苹果”两个字，脑子里出现的并不是“苹”和“果”这两个汉字，而是一颗苹果的画面；看到“长城”，浮现出来的是城墙蜿蜒的景象；看到“大海”，脑海里会自动出现海浪和海面的颜色。\n也就是说，文字更像是一个索引，它负责把大脑里的画面、经验和记忆调出来。真正完成理解的，其实还是这些画面和结构，而不是文字本身。\n这也让我重新理解了为什么流程图、思维导图、PlantUML、draw.io 这些工具这么高效。它们不是让知识变多，而是直接把文字还原成大脑更容易处理的结构，减少了一次从文字到画面的翻译。\n后来我又想到一个问题。\n如果图形理解起来这么快，那为什么人类文明最终还是选择了文字？\n答案可能是：图形负责理解，文字负责压缩。\n一张图可以让人快速理解，一个字却可以把一整幅图压缩成一个符号，让知识得以记录、传播、搜索和复制。\n也许，人脑真正的语言一直都是图形，而文字只是文明发明的一种压缩算法。\n"},{"title":"未来，我可能只需要一个 AI",
"url":"/blog/wei-lai-wo-ke-neng-zhi-xu-yao-yi-ge-ai/",
"date":"2026-07-29",
"headings":[],
"body":"未来，我可能只需要一个 AI\n最近我发现了一个跟 AI 沟通最有效率的方式。\n就是，我只跟最强的 AI 对话。\n每次我想做一件事情，我不会急着去问一堆 AI，而是先告诉目前我能找到的最强 AI。它会根据我过去的上下文、我的习惯、我是一个怎样的人、喜欢什么、真正想解决什么问题，把这些都梳理出来，再整理成一个完整的提示词、框架，甚至是一份需求说明，让我复制给其他 AI 去执行。\n我发现，这个流程比直接跟其他 AI 沟通效率高得多。\n后来我发现，最强 AI 真正厉害的地方，不是能力比别人强一点，而是它更懂你在说什么。\n很多时候，并不是其他 AI 不会做，而是它们没真正理解我的需求。经过最强 AI 翻译之后，它们做出来的结果反而更加完整，也更加滴水不漏。\n所以我越来越觉得，未来最强 AI 的定位，不应该只是他们家的产品做得最好，而应该成为所有 AI 的总指挥。\n我只需要跟这一个 AI 对话，它负责理解我的需求，再根据任务自动分配给最适合的 AI 去完成：写代码的写代码，做设计的做设计，长上下文的处理上下文……\n未来我可能不需要知道背后是谁完成的任务，就像今天我们浏览网页，不需要知道数据经过了多少台服务器。\n我真正需要沟通的，永远只有那个最懂我的 AI。\n也许未来真正的竞争，不是谁家的 AI 更强，而是谁能成为那个最懂用户、最会调度其他 AI 的 AI。\n"},{"title":"为什么 AI 不会主动选择最好的工具？",
"url":"/blog/wei-shen-me-ai-bu-hui-zhu-dong-xuan-ze-zui-hao-de-gong-ju/",
"date":"2026-07-29",
"headings":[],
"body":"为什么AI不会主动选择最好的工具？\n我做了很久的县城版GTA5，但是效果离GTA5差很远？\n我尝试过goal模式，尝试用AI写prompt，尝试过让它做“十五年经验的游戏开发”。\n经过了近半个月的拉扯，我问GPT，为什么你就是做不到我想要的样子？它说开发游戏需要很多反馈，也要不同agent负责不同部分，上下文才一致，我也这样做了，还给每个agent设计了定时任务，再指定了“总策划”定时总结和传达给执行者。\n后来，我想通了，不如抄最好的，我就逆向一下，让ai全网搜gta5的开发过程，于是才发现，ai用的是一种最原始的工具three.js，现代游戏用Unity和Unreal引擎。\n我就依次试了一下，效果果然变好了，但下一个问题来了，怎么让人物脱离玩具感？这个也是让ai反复修改不得法的例子。\n终于有一天，我在网上刷到一个日本开发者做游戏用的#二次元人物3D模型Vroid Studio，我想，真人是不是有类似模型，我找呀找，与ai探讨，发现了character creator和metaHuman等3D模型。\n奇怪的是，ai早就知道我说的这些引擎和模型，但它就是不在一开始告诉我，总是等我发现。\n我发现，开发游戏，我需要的不是AI，而是各个领域的经验者，在一开始就知道用最成熟的工具，或者至少像我一样的人，能够根据目的摸索出工具的。\n"},{"title":"为什么有些人明明很有能力，却赚不到更多钱？",
"url":"/blog/wei-shen-me-you-xie-ren-ming-ming-hen-you-neng-li-que-zhuan-bu-dao-geng-duo-qian/",
"date":"2026-07-29",
"headings":[],
"body":"为什么有些人明明很有能力，却赚不到更多钱？\n很多人以为，收入和能力是线性关系。\n能力越强，收入越高。\n但现实显然不是这样。\n如果能力决定一切，那么最努力的人应该最有钱，最聪明的人应该收入最高。然而现实中，我们经常看到能力差距不大的人，收入却相差数倍甚至数十倍。\n问题出在哪里？\n因为市场定价的从来不只是能力。\n就像黄金和水。\n水对生命远比黄金重要，但黄金更贵。因为市场衡量的不是重要性，而是稀缺性，以及别人愿意为它支付多少钱。\n工作也是一样。\n一个人的收入，更接近于：\n能力 × 信任 × 影响力 × 稀缺性。\n能力只是门票。\n真正决定价格的，是你能够影响多少结果，降低多少风险，以及别人有多难替代你。\n任何一项约等于零，你的价值就等于零。\n为什么学历值钱？\n不是因为那张纸本身创造了价值，而是因为它完成了一次筛选。它向市场证明：这个人大概率值得被信任、值得被押注。\n为什么高管收入更高？\n很多人以为是因为他们更忙。\n其实不是。\n基层出售执行力，中层出售协调能力，高层出售判断力。\n高层最大的价值，是在信息不完整时做选择，在结果不确定时承担风险，在复杂局面中指出方向。\n当组织开始依赖你的判断，而不是只依赖你的执行时，你的价值就发生了质变。\n工作的底层价值，其实不是能力，而是风险。\n公司愿意支付高薪，不一定因为你更辛苦，也不一定因为你更聪明，而是因为你承担、转移或者降低了某种关键风险。\n反过来，还有一个很多人不愿意承认的事实：\n安全感本身会降低你的定价。\n当一个人特别需要稳定，不敢离开，没有外部机会时，公司就更容易低价购买他的能力。\n因为能力决定价值，而选择权决定价格。\n所以个人成长最重要的事情，或许不是单纯提升能力，而是：\n提升能力；\n进入更需要这种能力的场景；\n让关键的人看见你的价值；\n以及始终保留离开的选择权。\n因为有用，只是组织需要你。\n而值钱，是组织害怕失去你。\n"},{"title":"我喜欢的从来不是电子游戏，而是门后的世界",
"url":"/blog/wo-xi-huan-de-cong-lai-bu-shi-dian-zi-you-xi-er-shi-men-hou-de-shi-jie/",
"date":"2026-07-29",
"headings":[],
"body":"我为什么喜欢玩游戏？\n这个问题，我从小到大，隔一段时间就会问自己一次。\n小时候，我就是觉得自己喜欢玩电子游戏。\n大概每个男孩子都会经历这样的过程。第一次看到电脑里那些闪闪发光的人物，在自己的操控下做出各种动作，就觉得特别有成就感。路过游戏机房的时候，总是迈不开腿。\n后来上学了，因为学业压力，也不是每天都有时间玩，总要等到假期，或者晚上偷偷玩一会儿。\n其实那时候玩的到底是什么游戏，我很多都已经忘记了。我只记得，自己很喜欢玩游戏。\n现在回头看，那时候喜欢的，也许不是某一款游戏，而是游戏给了我一个暂时离开现实生活的地方。\n后来上大学，自由了一段时间，也沉迷过游戏。工作以后有了收入，又把小时候买不起的游戏机一台一台买回来。\n可奇怪的是，真正拥有之后，反而没有小时候那种纯粹的快乐了。\n我开始挑游戏。\n不是所有游戏都喜欢，而是喜欢故事好的、剧情好的、或者特别有创意的游戏。\n玩这些游戏的时候，总有一种在体验第二种人生的感觉。\n我很好奇，如果我是另外一个人，会经历怎样的故事，会做出怎样的选择。\n后来我又发现，这种满足感，其实和看一本好小说、看一部好电影没有太大的区别。\n它们本质上都是在体验另一种人生。\n所以慢慢地，我发现，我并没有自己想象中那么喜欢玩游戏。\n甚至现在，如果让我坐在电脑前玩一整天，我可能会觉得累。\n前段时间，我重新打开一些小时候很喜欢的游戏，也已经没有太多耐心玩下去了。\n直到最近，我开始陪女儿玩游戏。\n我已经很多年没有认真玩过游戏了。\n她玩得很开心，我也很开心。\n更有意思的是，她喜欢的游戏类型，和我完全不一样。\n她喜欢卡通一点的，简单一点的，有一点创意的小作品。\n很多以前我连点都不会点开的小游戏，因为陪她，我重新学着去玩，最后居然发现，它们也挺有意思。\n这时候我突然明白了一件事。\n我其实既喜欢玩游戏，又不喜欢玩游戏。\n我喜欢的，从来不是电子游戏本身。\n我喜欢的是它带给我的那些东西。\n小时候，是掌控和新鲜感。\n学生时代，是暂时逃离现实。\n后来，是体验另一种人生。\n现在，则是陪伴，是一起探索，是和女儿共同拥有一段回忆。\n直到这里，我才真正理解，电子游戏到底是什么。\n它其实只是一个入口。\n它可以是进入故事的入口，可以是满足好奇心的入口，可以是体验另一种人生的入口，也可以是人与人建立连接的入口。\n只是刚好，这个入口叫电子游戏。\n我现在也希望女儿能够慢慢明白这一点。\n我不会因为电子游戏就否定它，也不会因为电子游戏就神化它。\n如果有一天，她能从一本书里获得同样的好奇，从一次旅行里获得同样的新鲜，从一段友谊里获得同样的快乐，从一门手艺里获得同样的成就感，从真实的生活里获得同样丰富的体验，那这些也都是入口。\n电子游戏不是唯一的入口。\n它只是我们很多人最早遇见的那个入口。\n后来长大了才发现，生活里还有很多很多扇门。\n值得追寻的，从来不是某一扇门，而是那扇门后面的世界。\n"},{"title":"芯片战争背后，需要很多很多个默默深耕的人",
"url":"/blog/xin-pian-zhan-zheng-bei-hou-xu-yao-hen-duo-hen-duo-ge-mo-mo-shen-geng-de-ren/",
"date":"2026-07-29",
"headings":[],
"body":"最近看《芯片战争》很有感触。以前总觉得，想干成一件大事，就要“集中力量办大事”。这种模式在某些领域确实有效，比如造原子弹，一个顶尖团队、几个关键人物，就可能改变历史。可芯片不一样，它不是单点突破，而是无数行业、无数细节、无数代人的积累共同托起的结果。\n芯片背后，不只是科学家，还有材料、化学、精密制造、软件、光学、工业设备、供应链、教育体系……它需要的不是一个邓稼先，而是很多很多个，在不同领域默默深耕的人。\n所以一个真正强大的社会，未必是所有人都在追同一种热点、看同一种内容，而是每个人都能有自己的热爱，在不同方向持续成长。因为那些今天看起来“没什么用”的兴趣和行业，也许正是未来某个关键环节里，最不可替代的一块拼图。\n"},{"title":"兴趣变成工作后，为什么可能不再快乐？",
"url":"/blog/xing-qu-bian-cheng-gong-zuo-hou-wei-shen-me-ke-neng-bu-zai-kuai-le/",
"date":"2026-07-29",
"headings":[],
"body":"“追随兴趣”一定是好事吗？\n很多人都有过这样的想法：工作太无聊了，要是兴趣能变成工作就好了。\n但仔细想想，我们喜欢的未必是“兴趣”，而是某种能持续给我们带来刺激和满足感的活动。问题在于，兴趣本身是会变化的。今天喜欢滑雪，明天可能喜欢爬山；今年沉迷摄影，明年又爱上钓鱼。再喜欢的事情，如果每天强制重复，也可能逐渐失去新鲜感。\n很多人所谓的兴趣，其实更接近于“上瘾”。比如打游戏，喜欢的不一定是游戏本身，而是升级、奖励和反馈带来的持续刺激。而任何依赖刺激的东西，都存在边际递减——获得得越多，满足感反而越弱。\n电影 发条橙 里有一个极端的例子：主角原本沉迷于暴力和刺激，后来被绑在椅子上，强迫观看大量暴力影像，并配合药物进行厌恶疗法。结果不是让他更喜欢这些东西，而是让他产生了强烈的排斥和痛苦反应。虽然这是戏剧化的情节，但它说明了一件事：任何刺激一旦失去选择权，变成被迫和重复，愉悦感都可能转变成厌恶感。\n当兴趣变成工作后，它也会面临类似的问题。原本是“想做就做”，后来变成“必须做、每天做、按要求做”。压力、责任和考核会不断侵蚀原本的乐趣。\n所以问题不在于能不能把兴趣变成工作，而在于不要把人生全部寄托在兴趣上。兴趣会变，激情会退，而工作终究有它的职责属性。\n或许更合理的状态是：工作就是工作，在有限时间内完成它；兴趣就是兴趣，在工作之外享受它。给兴趣保留自由，也给工作保留边界。\n"},{"title":"学习什么，取决于你相信什么能让人生更好",
"url":"/blog/xue-xi-shen-me-qu-jue-yu-ni-xiang-xin-shen-me-neng-rang-ren-sheng-geng-hao/",
"date":"2026-07-29",
"headings":[],
"body":"我注意到一种现象。\n有位“老钱”把城中村的一栋房子给了自己孩子，孩子转手就翻新，门口挂着大大的“XX设计”招牌，还停着一辆与城中村气质格格不入的改装车。\n为什么很多家境优越的二代，更愿意做设计、艺术、音乐，而不是去钻研那些严肃的理科？\n我觉得，不是因为理科不重要，而是学习的动力变了。\n学习理科其实不是一件简单的事。不是智商的问题，而是它很难激起兴趣。很多知识都离日常生活很远，需要长期投入，也没有即时反馈。很多人会修东西，但只是会换开关、换零件，很少会继续追问背后的原理。\n相反，艺术天然具有一种“表演性”。\n钢琴可以演奏，绘画可以展览，设计可以成为一家店的招牌，建筑可以成为城市地标。这些成果是可以被别人直接看见的，也更容易获得赞美和认同。\n而严肃的理科却很难表演。\n你很少会因为推导出一个公式而获得掌声，也不会因为理解一个算法而让别人一眼看出来。它更多是一种看不见的积累。\n因此，当一个家庭已经不需要依靠技术改变命运时，更容易投入那些能够表达、能够展示、能够获得社会认同的能力。这里面当然也包含了父母希望孩子“拿得出手”、能够体现家庭文化品位的心理。\n上一代人为什么愿意投入科学、工程、航海、制造？因为他们亲眼看见，一个国家的强大、一个家庭的未来、一个人的前程，都与这些知识有关。说到底，是因为资源有限，所以技术值得拼命去学。\n而当这些目标已经实现之后，学习的动力自然发生了变化。\n所以，我越来越觉得，一个人最终学什么，未必取决于兴趣，也未必取决于天赋。\n真正决定学习方向的，往往是他相信什么，能够让自己的人生变得更好。\n贫穷时，学习是为了改变命运；富足后，学习更多是为了表达自己。\n学习的内容会变，但学习的动力，从来没有变。\n"},{"title":"眼睛像吸盘",
"url":"/blog/yan-jing-xiang-xi-pan/",
"date":"2026-07-29",
"headings":[],
"body":"睡觉前，我女儿总是会嘟囔着“睡不着”，然后在床上翻来覆去。\n我觉得很奇怪，就问她，“那你每天都睡着了，是怎么睡的？”\n她说，“不知道啊，就是眼皮像吸盘一样，吸在一起了。”\n我反复想着她的这段话，吸盘这个比喻太妙了，完全是她操控外的事情，又物理性地让眼皮合上。\n"},{"title":"一次交流，是在给能量，还是在掏能量？",
"url":"/blog/yi-ci-jiao-liu-shi-zai-gei-neng-liang-huan-shi-zai-tao-neng-liang/",
"date":"2026-07-29",
"headings":[],
"body":"你是在给能量，还是在掏能量？\n生活里，我们很喜欢给人贴上“正能量”或“负能量”的标签。但什么才算“负能量”呢？一个情绪高亢、永远乐观的人，就是高能量吗？一个安静、悲观、敏感的人，就一定是负能量吗？还是说，一个不服从、不愿妥协、总是逆行的人，就是所谓的“低能量”？\n我后来觉得，这样的划分太粗暴了。真正值得观察的，其实不是“这个人本身是什么能量”，而是：在某一次交流里，他到底是在给你能量，还是在掏你的能量。\n有些人总在抱怨别人做事不符合自己的标准，却又提不出任何建设性的方案；有些人面对一个已经低能量的孩子，还不断数落和施压，把对方最后一点火苗也消耗殆尽。这样的人，未必是坏人，但交流之后，你会明显感觉自己被“抽空”了。\n我以前一直不能理解一位上级。每次我想和他聊工作中的负面情绪，他都会很快转移话题。我曾经觉得他“缺乏人性”，不愿意共情。\n后来我才明白，不是这样的。因为他知道，自己并没有能力真正帮我解决那个问题。如果只是陪我一起沉浸在悲观情绪里，除了继续放大无力感，对现实没有任何帮助。毕竟我还在这家公司，还是需要继续面对方向、任务和责任。\n而且，对他来说，“一起吐槽”这件事，本身也有职位上的敏感性，甚至可能导向更糟糕的结果。所以他选择了另一种方式：告诉我一些好消息，给我补一点能量，让我至少还能继续往前走。\n后来我越来越觉得，不是所有问题都能立刻解决，也不是几句“姐妹们窸窸窣窣的吐槽”，就能真正处理一个严肃的人生议题。有时候，更好的办法反而是先放一放，把注意力重新拉回那些真正值得投入、值得改变、值得坚持的方向上。\n"},{"title":"一个决策，往往是在选择整条人生路径",
"url":"/blog/yi-ge-jue-ce-wang-wang-shi-zai-xuan-ze-zheng-tiao-ren-sheng-lu-jing/",
"date":"2026-07-29",
"headings":[],
"body":"决策的分量\n越长大，越能体会到决策的分量。\n人生很多重要的变化，并不是某个惊天动地的瞬间造成的，而是源于一个看似普通的选择。选择在哪座城市发展，选择和谁结婚，是否要孩子，是否创业，甚至选择进入哪个行业，这些决定往往会在未来几年、十几年里持续产生影响。\n比如选择一座城市，选择的其实不仅是工作机会，还包括房价、教育、社交圈、未来伴侣的来源，甚至孩子将来成长的环境。\n选择一段婚姻，也不仅仅是选择一个人，而是在选择两个家庭、未来几十年的生活方式，以及无数需要共同承担的责任。\n决定要不要孩子，看似只是增加一个家庭成员，实际上会改变未来十几年甚至几十年的时间分配、消费结构和人生优先级。\n选择创业也一样。表面上是在选择一份工作，实际上是在选择收入的不确定性、风险承受能力，以及未来几年生活的重心。\n一个决策真正重要的地方，不在于它发生的那一刻，而在于它会引发一连串连锁反应。很多时候，你以为自己只是在选择一件事，实际上是在选择随之而来的整个生活路径。\n这并不是说冲动的决定一定会带来坏结果，理性的决定就一定正确。人生本来就充满偶然性，没有人能准确预测未来。\n但当你意识到决策背后的分量后，你会更愿意去思考它可能带来的后果，尝试预见未来几步会发生什么，并提前为各种可能做好准备。\n慎重决策的意义，不是为了保证自己永远正确，而是为了在结果到来时，能够更加从容地面对它。\n"},{"title":"音乐中，唯独不重要的是语言",
"url":"/blog/yin-le-zhong-wei-du-bu-zhong-yao-de-shi-yu-yan/",
"date":"2026-07-29",
"headings":[],
"body":"说说英语。\n高中时我有个同桌，成绩普通，尤其是英语，总觉得她的发音有些“怪怪的”。\n但有一次，我听到她唱英文歌，几乎被震住了。\n她的发音在歌声里变得异常标准、流畅，像MP3里放出来的一样好听，远胜我那磕磕绊绊的口语。\n她说自己不喜欢学习，只喜欢唱歌。我问她懂不懂歌词的意思，她说不懂，只是觉得好听。\n前些日子，我在听边江的《冰与火之歌》播客，评论区里不少人吐槽他的英文发音，说他“语言素养不行”。\n但正是通过他的推荐，我听到了《Jenny of Oldstones》。因为有了他讲的背景——王子爱上平民女孩——这首歌在我耳中，多了几分层次与余味。\n我通过他的视角，走进了《冰与火》的世界；即便不懂英语，也依然觉得这首歌动人。\n不理解歌词，好听；理解歌词，一样好听。音乐中，唯独不重要的是“语言”。\n"},{"title":"有钱人怎么吃饭？",
"url":"/blog/you-qian-ren-zen-me-chi-fan/",
"date":"2026-07-29",
"headings":[],
"body":"有钱人是不是用金饭碗吃饭的？\n我有任老板是加拿大人，每次都是从香港过来深圳。\n他的时间很贵，别人约他，一般都是按小时付费的。\n你一定会很好奇，赚这么多钱的人，每天到底吃什么？\n答案可能会让很多人失望。\n每次他快到的时候，都会提前嘱咐我，下楼帮他买一份肠粉。\n不是连锁店，就是楼下那种破破烂烂的小店，五块钱一份，放在我小时候，大概就是两块钱水平的那种。\n买回来以后，他也不会再点别的，就匆匆吃完，喝一口水，然后开始工作。\n偶尔喝杯咖啡，有时候是星巴克，有时候就是楼下无名小店冲的一杯。\n中午也跟我们一起吃饭，我去打饭的时候，也就是给他打一份。\n真正让我意外的是，有一次他生日请我们吃饭。\n那家餐厅我觉得挺普通，但人均一千多块钱，他请了七八个同事。\n我后来发现，他不是舍不得花钱，而是平时根本不会把心思放在吃饭这件事情上。\n因为对他来说，真正贵的已经不是饭，而是时间。\n他们总想把尽可能多的时间留给工作，留给创造价值，而不是花在思考今天吃什么、去哪吃、要不要排队这些事情上。\n所以真正花很多钱，往往是在一些特别重要的时刻，而不是每天的日常。\n还有一次，我帮他安排一天的行程。\n他半开玩笑地跟我说：“能不能留一点时间给我上厕所。”\n当时我愣了一下。\n后来才意识到，他每次来深圳的时间都很短，所以所有人都希望把他的时间安排得满满当当。\n他的时间，真的已经贵到连上厕所，都需要提前留出来。\n很多人觉得，有钱以后生活一定很轻松。\n但当你真正靠近这些人，你反而会发现，他们只是把原来为钱焦虑，变成了为时间焦虑。\n他们确实不用像我们一样，每个月想着卡里还剩多少钱。\n但他们也未必拥有我们想象中的轻松。\n钱可以买到很多东西，却买不回时间。\n所以越靠近这些人，越会发现，什么事情都有它的代价。\n这个世界上，大概真的没有一种人生，是可以永远既要，又要。\n"},{"title":"语言的消失，往往不是没人会说，而是没人记录",
"url":"/blog/yu-yan-de-xiao-shi-wang-wang-bu-shi-mei-ren-hui-shuo-er-shi-mei-ren-ji-lu/",
"date":"2026-07-29",
"headings":[],
"body":"几年前，我在夏威夷遇到过一个很神奇的人。\n那天，我和家人坐出租车去机场。司机是一位华裔，但显然听不懂普通话，所以一路上我们都用英语简单交流。\n途中，父母开始用潮汕话和我聊天。突然，司机的眼睛亮了，也开始蹦出几句潮汕话。\n原来，他是几十年前移民美国的华裔。因为来到美国时年纪很小，成长过程中主要使用英语，而家里人只会潮汕话，所以父母教给他的也是潮汕话。结果，他形成了一种很特别的语言组合——英语流利，潮汕话熟练，却不会说普通话。\n为什么我会觉得神奇？\n因为在我的成长环境里，几乎没有见过这样的人。我们这一代人的语言路径通常是“潮汕话→普通话→英语”，而他直接跳过了普通话，走出了一条“潮汕话→英语”的路线。\n后来我们问他：“你的孩子会讲潮汕话或者普通话吗？”\n他笑着摇摇头：“不会，他们不肯学。”\n那一刻我忽然意识到，对他这一支家族来说，潮汕话很可能就在这一代结束了。\n这也是我想做“笑谈潮汕话”的原因。\n今天，互联网上其实有不少潮汕文化内容，但大多是零散的资料，或者偏学术化的字典网站。而真正的潮汕话，从来不只是字典里的词汇，它藏在日常对话里，藏在俚语里，藏在那些一句话就能让老乡会心一笑的表达里。\n可惜的是，很多俚语连我们这一代都已经说不全、讲不清了，更不用说下一代。\n语言的消失，往往不是因为没人会说，而是因为没人记录。\n如果你也会潮汕话，欢迎一起参与整理和编辑。或许我们做的事情很小，但至少能为潮汕话的传承留下一点痕迹。\nMAKE CHAOSHAN GREAT AGAIN!\n试用地址：https://chaoshan.linxz.online/\n"},{"title":"愿你不要见到朋友圈外的我",
"url":"/blog/yuan-ni-bu-yao-jian-dao-peng-you-quan-wai-de-wo/",
"date":"2026-07-29",
"headings":[],
"body":"愿你不要见到朋友圈外面的我。\n看不到我的彷徨与无助，\n看不到我的蓬头垢面、手忙脚乱；\n看不到我的迟疑、结巴，\n看不到那个远没有想象中从容的我。\n愿你永远看不到这一切。\n就把朋友圈里的那个我，装进你的心里，带走吧。\n而我，会继续回到生活里，\n蓬头垢面地赶路，跌跌撞撞地活着。\n"},{"title":"这个世界不缺会用 AI 的人，缺的是会赚钱的人",
"url":"/blog/zhe-ge-shi-jie-bu-que-hui-yong-ai-de-ren-que-de-shi-hui-zhuan-qian-de-ren/",
"date":"2026-07-29",
"headings":[],
"body":"说个笑话。\n这个世界不缺少会用AI的人，但缺少会赚钱的人。因为没有这些赚钱的人，大概率也请不起这么多会用AI的人。\n—————————————————————\n大家都在学习AI。\n研究提示词、Agent、工作流、自动化，好像谁掌握了更多AI工具，谁就掌握了未来。\n但这里面有一个很容易被忽略的问题。\nAI很厉害，但AI本身并不会赚钱。\n它可以写文案、画图、写代码、分析数据、生成方案，把一个人的效率提高几倍，甚至几十倍。\n但这些事情，本身通常都不会产生收入。\n文案写得再快，没有人愿意付钱，它还是一篇文案；软件开发得再快，没有用户，它还是一个Demo；工作流做得再漂亮，如果没有解决真实的问题，它也只是把一件原本不重要的事情自动化了。\nAI更像是一台效率机器。\n它负责把事情做得更快、更便宜。\n但赚钱这件事，往往发生在做事之前。\n做什么？\n卖给谁？\n为什么别人愿意买？\n为什么愿意今天就买？\n怎么定价？\n怎么获客？\n利润够不够？\n现金流会不会断？\n这些问题，很少有标准答案。\n它们更多依赖于对市场的理解、对人的理解、对资源的组织，以及承担风险的能力。\nAI可以帮你分析这些问题，却不会替你承担判断错误的代价。\n它不会因为创业失败而赔钱，也不会因为客户拒绝而睡不着觉。\n所以我越来越觉得，AI真正解决的是生产问题，而赚钱解决的是价值问题。\n一个负责把东西做出来。\n另一个负责让别人愿意为这个东西付钱。\n后者，好像一直都比前者难。\n于是我想到另外一个问题。\n如果把今天学习AI的人，分一半去学习赚钱，这个社会会不会反而创造出更多价值？\n为什么大家愿意花几十个小时研究提示词、Agent、工作流，却很少愿意花同样的时间去研究销售、产品、定价、品牌、谈判、用户需求，甚至研究别人为什么愿意掏钱？\n我想，一个很重要的原因是，学习AI的反馈太快了。\n今天学，今天就能生成图片。\n今天学，今天就能写代码。\n今天学，今天就能让效率提升。\n它很容易让人产生一种“我变强了”的感觉。\n但赚钱不是。\n赚钱的反馈很慢，也很残酷。\n研究了一个月产品，可能没人买。\n学了半年销售，可能还是谈不成订单。\n创业一年，甚至可能亏钱。\nAI学习，更像是在学习一种工具。\n赚钱学习，更像是在接受市场的审判。\n前者，大多数时候模型都会告诉你：“回答已生成。”\n后者，只有客户会告诉你：“我愿意付款。”\n也许真正稀缺的，并不是更多会用AI的人。\n而是更多愿意研究——为什么别人愿意付钱——的人。\n因为只有这样的人越来越多，才会有更多企业赚钱，更多企业赚钱，才会有更多预算购买AI、部署AI、招聘会用AI的人。\n所以，这个笑话真正好笑的地方可能在于：\n大家都担心自己不会AI，会被时代淘汰。\n却很少有人担心，自己学会了AI之后，依然不知道钱从哪里来。\n"},{"title":"真正困住我们的，是被想象放大的恐惧",
"url":"/blog/zhen-zheng-kun-zhu-wo-men-de-shi-bei-xiang-xiang-fang-da-de-kong-ju/",
"date":"2026-07-29",
"headings":[],
"body":"以前我很害怕人际矛盾，总觉得一旦出现分歧，关系就会破裂。\n后来慢慢想通了：这个世界上，本来就存在无数意见相左、性格不同、甚至彼此无法完全理解的人，可大家依然能够一起生活、一起工作、一起同行。\n恰恰是这种“不同也能共处”，证明了这个世界其实比想象中更安全。\n很多时候，真正困住我们的，不是现实里的冲突，而是内心不断放大的恐惧。\n心中的“魔鬼”，总会提前替我们预演最坏的结局，让人误以为分歧等于危险。但当真正走进去才发现，大多数关系并没有那么脆弱，大多数人也没有那么可怕。\n我们不敢迈出的那一步，不过是被自己的想象拦住了。\n"},{"title":"真正难以复制的，是组织里的“事实标准”",
"url":"/blog/zhen-zheng-nan-yi-fu-zhi-de-shi-zu-zhi-li-de-shi-shi-biao-zhun/",
"date":"2026-07-29",
"headings":[],
"body":"最近发现“事实标准”这个词很有意思。\n很多事情，一开始其实是没有标准的，或者标准很模糊。\n比如领导安排一件事情：“下个月开始，所有销售的新签人头都给予激励。”\n真正开始执行后，问题就来了。\n卖多少钱算激励？0元算不算？10元算不算？还是必须达到某个金额、某个产品数量才能算？\n这些往往不是领导一开始就能全部定义清楚，而是在执行过程中，一个案例一个案例慢慢补出来。\n领导工作繁忙，很多时候就由下属代为思考、代为判断。今天遇到一个情况这样处理，明天又遇到类似情况，继续按这个方式处理。久而久之，这套处理方式就变成了大家默认的标准。\n我把它叫做**“事实标准”**。\n它不一定写在制度里，却是真正每天支撑组织运转的东西。\n也正因为如此，公司里总会有一些人，职位未必最高，却总有人遇事就去问他。不是因为他的权力最大，而是因为他的脑子里积累了太多案例，知道组织过去是怎么判断、怎么取舍的。\n回过头看，我在公司待了很多年，最大的收获或许并不是这个岗位本身，而是这些年经手的大量案例，慢慢沉淀出了一套属于自己的事实标准。\n有意思的是，这恰恰也是今天 AI 最难学会的东西。\n制度、流程、知识库，它都可以读取；但那些藏在一个个具体案例里的判断、取舍和边界，并不会自然出现在文档里。它们只能靠时间，一次次决策，一点点沉淀。\n或许真正难以复制的，从来不是岗位，而是那些经过多年实践才形成的“事实标准”。\n"},{"title":"真正需要翻译的，不只是语言",
"url":"/blog/zhen-zheng-xu-yao-fan-yi-de-bu-zhi-shi-yu-yan/",
"date":"2026-07-29",
"headings":[],
"body":"翻译，不只是语言。\n最近我发现，我以前理解的翻译太浅了。\n我们总以为翻译，就是把中文翻成英文，把英文翻成中文。\n但最近我经常让 AI 帮我整理自己的文章，我发现它真正做的，不是语言翻译，而是层级翻译。\nAI 改出来的文章通常会更长。\n它会加入更多转折、举例、互动、情绪，甚至一些互联网热词。\n第一次看的人，会觉得很好理解。\n但长期看我文章的人，可能反而会觉得有点累，因为真正新增的信息并没有那么多，很多内容都在重复同一个观点。\n后来我看一些阅读量很高的大 V，也有同样的感觉。我甚至能够看出哪些地方像是 AI 根据作者的表达习惯重新组织过。阅读量确实很高，但我每次真正想获取的信息其实很少，更多的是各种铺垫、语气词和互动表达。\n以前我觉得这些都是废话。\n现在我发现，它们并不是废话，而是楼梯。\n因为问题从来不是读者认知高还是低。\n而是他当前所在的信息层级，还接不住更高层级的信息。\n人脑并不是直接理解抽象概念，而是通过大量具体的例子、类比和重复，把这些信息不断压缩，最后形成一个高层级的理解。\n所以，一个专家一分钟讲完的内容，新人可能需要二十分钟才能真正听懂。\n多出来的十九分钟，并不是在增加知识，而是在帮助大脑搭建通往那个知识的楼梯。\n这也让我重新理解了”价值”。\n很多人觉得专业文章价值高，科普文章废话多。\n但实际上，它们服务的是不同层级的读者。\n专业文章直接给答案。\n科普文章负责把人一步一步带到能够理解这个答案的位置。\n所以我越来越觉得，未来 AI 最大的翻译能力，不是把中文翻译成英文。\n而是把同一份知识，翻译成不同层级的人都能够吸收的版本。\n真正需要翻译的，从来都不是语言。\n而是人与知识之间，那一段还没有搭好的楼梯。\n"},{"title":"真正有价值的能力，是人生的概率放大器",
"url":"/blog/zhen-zheng-you-jia-zhi-de-neng-li-shi-ren-sheng-de-gai-lu-fang-da-qi/",
"date":"2026-07-29",
"headings":[],
"body":"年轻的时候，我总觉得，人生就是不断赌博。\n后来发现，真正的区别，不是赌不赌，而是你的能力，能不能成为一个“概率放大器”。\n我把人生中的赌博，大致分成两种。\n一种是高概率赌博。\n比如，你在一个普通业务部门，却掌握了别人没有的技术。你会 AI、会编程、会数据分析，或者拥有某种别人短时间学不会的能力。\n即使公司裁员、行业变化，你依然比别人更有竞争力。\n它仍然有风险，所以还是一种赌博。\n但你的能力，把原本只有五成把握的事情，提高到了八九成。\n另一种，是低概率赌博。\n我在职业生涯中见过很多人，为了更高的薪水，去做自己并不擅长的事情。\n最典型的，就是从专业岗位转向管理岗位。\n他们不是没有机会成功，只是面对同样竞争这个岗位的人，他们并没有足够的优势。\n很多人坐上高位，又很快离开。\n他们错了吗？\n也未必。\n他们只是选择了一场高回报、低胜率的赌博。\n创业也是一样。\n很多人看到成功者，就觉得创业是一条通往财富的捷径。\n但真正能把企业长期做起来的人，其实少之又少。\n真正有企业家能力的人，最后大多都会走出去创造自己的事业。\n而这样的人，本来就是极少数。\n所以，我越来越觉得，大多数普通人最大的误区，不是能力不够，而是总想着参加更大的游戏。\n总想着创业、做高管、赚更多的钱。\n却很少问自己一句：\n我凭什么比别人更容易赢？\n后来，我发现自己以前对“能力”的理解，也是不完整的。\n我一直以为，能力是一项技能。\n现在觉得不是。\n能力，更像一个概率放大器。\n很多人学习一项技术，是希望完成一件事情。\n但真正有价值的能力，不只是让你完成这一次任务，而是让你以后面对任何机会时，成功率都提高一点。\n也许，每一次只提高 5%。\n看起来微不足道。\n但人生不是一次选择，而是几十次、上百次重要决策组成的。\n如果你的每一次决策，成功率都比别人高一点点，这个优势最终会像复利一样，被不断放大。\n所以，我越来越相信：\n人生最重要的投资，不是投资某一个机会，而是投资那个能够不断放大概率的自己。\n因为机会会消失，行业会变化，公司会裁员，风口会过去。\n但一个人的认知、能力、信誉，以及持续创造价值的能力，会不断提高他未来所有选择的胜率。\n真正厉害的人，不是每次都押中了风口。\n而是无论风口吹向哪里，他都比别人更容易成功。\n这，才是真正的长期主义。\n"},{"title":"执行力很强的人，如何给创意引擎加油？",
"url":"/blog/zhi-xing-li-hen-qiang-de-ren-ru-he-gei-chuang-yi-yin-qing-jia-you/",
"date":"2026-07-29",
"headings":[],
"body":"我发现自己一直有一个特点，从以前开始，我就是一个执行力很强，甚至强到有点可怕的人。\n很多事情，只要我想做一个实验，就会想尽办法尽快去做，也愿意花时间、花成本去验证。虽然很多实验最后都是失败的，但我几乎不会停留在“想”的阶段，而是会直接去执行。\n反而是在创意方面，我一直觉得自己有所缺乏。我总觉得别人怎么总能想到那么多新东西，而我更多是在执行别人已经想到的东西。\n但最近，我一直在研究创意到底是怎么来的。\n于是我开始刻意改变自己的输入。我开始大量看有创意的影视剧，关注不同的信息来源，不只是为了娱乐，而是想看看别人的世界观是怎么建立的，故事是怎么设计的，一个好的创意到底是怎么产生的。\n后来和 AI 讨论时，它给了我一个很有意思的观点。\n它说，我可能不是创意差，而是创意引擎一直缺少燃料。\n它形容得很有意思：别人可能是一台普通发动机，但油箱很满；而我像一台大马力的发动机，执行力很强，却总是很快把油跑光了，所以才一直觉得自己的创意跟不上执行速度。\n如果创意本质上是把过去看过的东西、经历过的事情重新连接起来，那么输入，其实就是给这台发动机不断加油。影视剧、商业、历史、科技、游戏……这些看起来毫无关系的东西，都会慢慢变成大脑里的素材库。\nAI最后还给了我一个判断，我一直记得。\n也许未来某一天，我会把今天输入的这些看似毫无关系的东西全部连接起来，形成属于自己的创意。而真正把这些创意快速变成现实的人，恰好还是那个执行力强到可怕的自己。\n"},{"title":"主动不是性格，而是一种策略",
"url":"/blog/zhu-dong-bu-shi-xing-ge-er-shi-yi-chong-ce-lue/",
"date":"2026-07-29",
"headings":[],
"body":"我觉得很多内向的人，可能一直没有想清楚一件事。\n两个人的关系里，总要有一个人主动。\n而主动的那一方，往往也掌握了更多谈判的主动权。\n为什么？因为是他主动提出问题，主动摊开筹码，也主动决定了沟通发生的时间、地点和节奏。他可以选择在对自己最有利的时候行动，而不是被动等待别人来安排。\n所以，不主动，很多时候失去的不只是一次机会，而是把选择权交给了别人。\n后来我发现，主动和内向、外向其实没有太大关系。\n真正决定一个人会不会主动的，不是性格，而是他到底有多想要。\n当一件事情足够重要，当一个目标足够吸引你，人往往会突破自己的舒适区。平时那个看起来沉默寡言的人，也会主动争取、主动表达、主动创造机会。\n所以，主动不是一种性格，而是一种策略。\n如果一件事情真的是你想要的，是你的热情所在，那么主动，往往就是成功概率最高的选择。\n"},{"title":"赚钱很难，长大后才明白这句话",
"url":"/blog/zhuan-qian-hen-nan-chang-da-hou-cai-ming-bai-zhe-ju-hua/",
"date":"2026-07-29",
"headings":[],
"body":"赚钱很难。\n长大后才明白父辈们这句话。\n高考结束后，有些大学生开始放肆消费，我看新闻有人花了7万，标题说“你是高考结束，不是家里发财了。”\n我反思，我的成长也是这样。可能成长于中国的快速发展期，感觉家里还可以，没意识到很多局限，赚钱由很多因素构成，并不是凭空而来。\n其实也很难怪这些年轻人，我也如此，每天媒体渲染的都是万亿富豪，课程动辄如何赚一个亿，仿佛赚一千一万是很简单的事情。\n如果赚钱真的如此简单？为什么我还没赚到？为什么有这么多人需要出卖身体和尊严，需要累死累活去赚钱，他们不努力吗？\n确实有人赚钱容易，但有很多先决条件，出身知识积累等等，缺一不可。\n普通人的视野太远，而不知道日常的一分一毫，只剩下的只有不幸。\n"},{"title":"赚钱越来越像一场《田忌赛马》",
"url":"/blog/zhuan-qian-yue-lai-yue-xiang-yi-chang-tian-ji-sai-ma/",
"date":"2026-07-29",
"headings":[],
"body":"赚钱越来越像一场《田忌赛马》。\n很多人以为，赚不到钱是因为自己不够努力、不够优秀。\n其实还有一个更重要的问题：你是不是选错了战场。\n同样一个人，在高手云集的市场，你的能力只是平均水平，再努力，也可能只能参与内卷；但换一个市场、一个地区、一个行业，你原本普通的能力，可能就成了稀缺资源。\n中国人到东南亚做生意、把成熟的商业模式带到下沉市场、把先进的技术带到传统行业，本质上都是在利用一种“落差”。\n赚钱，很多时候不是创造了价值，而是发现了价值在不同地方、不同人之间并不相等。\n地域有落差，技术有落差，认知有落差，效率有落差，资源也有落差。\n真正会赚钱的人，并不是每天都在赚钱，而是在不断寻找新的落差、制造新的落差。因为今天的优势，明天可能就会被技术、AI、竞争者迅速填平。\n所以，一个人的收入，未必取决于他有多强，而是取决于：\n能否找到一个让自己的优势被放大的战场。\n与其在高端局拼命证明自己，不如找到一个能让自己拥有相对优势的位置。\n赚钱的本质，不只是提升自己，更是选择一个适合自己的局。\n"},{"title":"专业判断力是怎么形成的？",
"url":"/blog/zhuan-ye-pan-duan-li-shi-zen-me-xing-cheng-de/",
"date":"2026-07-29",
"headings":[],
"body":"专业判断力是怎么形成的？\n以前我一直觉得，专业判断力来自经验。后来和 AI 一起做项目，我发现更准确地说，它来自于不断修正自己的决策系统。\n很多人认为，做得越多，判断力就越强。但现实中，有的人做了十年，依然在重复踩同样的坑；有的人几年时间，就能快速成长。区别在于，他们是否一直在更新自己的判断规则。\n每完成一个项目，都应该问自己几个问题：\n\n为什么行业最佳实践会这样做，而不是只记住它的做法？\n这次失败，到底是执行的问题，还是路线的问题？\n如果今天重新开始，我还会选择这条路吗？\n哪些事情，以后可以直接排除，不再浪费时间？\n\n当这些问题不断重复，你脑子里就会形成一套默认规则。遇到新项目时，不需要从零开始思考，而是自动过滤掉大量低价值路线，把资源集中到最有可能成功的方向。\n我越来越觉得，老师傅最宝贵的，不是知识，而是脑子里运行着一套经过无数次实践迭代出来的 System Prompt。它不断告诉自己：什么值得做，什么不值得做；什么时候继续优化，什么时候果断推倒重来；什么时候追求局部最优，什么时候为了全局最优放弃眼前的成果。\n所以，专业判断力并不是一种神秘的天赋，它是一套可以持续迭代的决策系统。\n经验的终点，不是知道得越来越多，而是错误的路线越来越少。\n"},{"title":"做很多事情的关键，是先确定什么只需做到够好",
"url":"/blog/zuo-hen-duo-shi-qing-de-guan-jian-shi-xian-que-ding-shen-me-zhi-xu-zuo-dao-gou-hao/",
"date":"2026-07-29",
"headings":[],
"body":"今天突然想通了一件事。\n很多父母都说，现在的小孩越来越难带。我以前也这么觉得。\n直到有一次去参加女儿幼儿园的公开课，我却有了完全不同的体验。\n一个主班老师、一个配班老师，带着几十个孩子，整个课堂居然井井有条。不能打、不能骂，却依然能够把一天安排得有条不紊。\n我当时就在想，他们到底是怎么做到的？难道只是因为经验丰富吗？\n后来冷静下来才发现，不是。\n不是老师更会带孩子，而是老师和父母关注的重点根本不一样。\n父母希望孩子学会礼貌、养成习惯、身体健康、性格开朗，还要关注皮肤、感冒、情绪……几乎每一个细节都希望做到最好。\n而老师的目标是什么？让孩子安全、完成课堂、融入集体，把今天过好。\n目标不同，难度自然也不同。\n后来我发现，工作也是这样。\n领导更关心的是任务能不能完成，而执行的人更容易陷进各种细节里，总觉得事情做不完。\n但很多时候，不是事情做不完，而是我们默认每件事都要做到最好。\n其实，大多数事情都能完成，只是完成的粗细、完成的质量、投入的精力都可以调整。把重点放在A，B自然就会粗一点；要求做到100分，完成的事情就少一点；要求做到80分，反而能够完成更多事情。\n所以，真正重要的不是把每件事都做到最好，而是先确定好大家真正关注的重点和评价指标。因为指标一旦确定，资源该往哪里投入、哪些地方做到“够好就行”，答案也就出来了。\n"},{"title":"真正让人上瘾的，不是重复，而是成长",
"url":"/blog/zhen-zheng-rang-ren-shang-yin-de-bu-shi-zhong-fu-er-shi-cheng-chang/",
"date":"2026-07-27",
"headings":[],
"body":"最近玩《刺客信条》和一些日式 RPG，我发现里面有很多固定流程：去商店接任务、去村庄接任务、找东西、打几只怪、回来交任务，再接下一个。这样的内容其实占了游戏很大一部分时间，但玩久了总觉得有点空，好像一直在忙，却没有什么挑战。\n反过来看《黑魂》《血源》《艾尔登法环》，它们其实也很重复。你不断挑战同一个 Boss，不断死亡，再重新挑战。按理说，这种重复应该更容易让人厌烦，但事实恰恰相反，很多玩家反而乐在其中。\n后来我觉得，问题可能不在于重不重复，而在于它们属于两种完全不同的循环。\n一种叫执行循环。\n你已经知道答案了，只是在不断重复同一个动作：跑图、刷怪、交任务、领奖。时间一直在流逝，但你的思维没有什么变化，任务只是一个接着一个地完成。\n另一种叫成长循环。\n你做的还是同一件事，却不是在重复执行，而是在不断修正自己。每一次失败，都会带来一点新的理解：原来这里不能贪刀，原来第二阶段会变招，原来翻滚方向应该反过来。Boss 没变，但你的判断、策略和思维一直在进化。\n所以，《黑魂》系列奖励的并不是角色升级，而是玩家升级。角色的数据可能只涨了一点，但真正变强的是屏幕前的你。\n当然，这个规律不只是游戏。\n很多人工作越来越累，是因为每天都困在执行循环里。昨天怎么做，今天还是怎么做，只是不断把事情做完。\n而真正让人成长的工作，往往是在成长循环里。每天都会遇到新的问题，修正自己的判断，更新自己的思维模型。事情也许还是那些事情，但今天的自己已经不是昨天的自己。\n真正让人上瘾的，应该不是重复，而是成长。\n如果一百次努力，只是把第一次做得更熟练，那很容易疲倦；但如果一百次努力，都让自己获得一点新的理解，那重复本身，就会变成一种乐趣。\n"},{"title":"谁在花钱日报｜2026-07-24",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-24/",
"date":"2026-07-24",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-24/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-24/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-24/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-24/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-24/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-24/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-24/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-24/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中国银行体系 1 年期中期流动性、波黑与黑山跨境道路、AI 推理芯片、Meta 得克萨斯 AI 数据中心、Saudi PIF / Silver Lake / Affinity 对 Electronic Arts 的 550 亿美元游戏 IP 买断、绿色和智能消费，以及 AI 芯片 / 数据中心电气 / 游戏出海 / 跨境并购合规 / 智能消费运营高薪岗位”。\n政府\n今天政府端的花钱信号，是央行给银行体系补中期流动性。\n中国人民银行将于 7 月 24 日开展 5000 亿元 1 年期中期借贷便利（MLF）操作。由于 7 月有 4000 亿元 MLF 到期，本月 MLF 实际加量续作 1000 亿元。\n这不是直接给居民发钱，而是给商业银行补中期资金。它会影响银行负债端、贷款报价、债券久期交易、理财底层资产和企业融资成本。与前几天短端逆回购净回笼相比，今天的信号更像是：短端继续精细调节，中期流动性继续托底。\n普通人的机会在固收研究、银行资产负债管理、信贷投放数据、利率策略、资金交易、财资自动化和宏观报表。\n国际政府与开发资金\n开发资金今天看巴尔干跨境道路。\nEBRD 向波黑提供 6000 万欧元贷款，用于修建 Foča 至 Hum 的新道路段。这段路长 13.3 公里，从 Foča 附近的 Donji Kopilovi 通往黑山方向的 Hum 边境口岸。项目还将由 World Bank 提供 3940 万欧元贷款共同融资，并获得 EU 70 万欧元技术援助赠款。\n这笔钱不只是修一段路。它属于波黑和黑山共同推进的更大跨境交通投资，包括相邻道路修复、新建道路，以及一座约 380 米长的 Tara 河新桥。\n普通人的机会在国际工程、道路设计、桥梁施工、项目采购、环境社会影响评估、跨境物流、巴尔干区域运营和多边项目管理。\n投资机构\n投资机构今天的钱，继续砸向 AI 推理芯片。\nEtched 完成 3 亿美元 Series C，估值达到 103 亿美元。本轮由 Sequoia 领投，Andreessen Horowitz、Jane Street、Diffusion 和 SK Hynix 参与。\nEtched 的路线不是做通用 GPU，而是围绕 Transformer 推理做专用芯片、机柜、软件和制造协同。它的 A0 芯片已从 TSMC N4P 回来，正在和客户验证首个机柜级产品。这里投资人买的不是“又一家 AI 公司”，而是推理成本、延迟、吞吐、功耗和供应链替代。\n普通人的机会在 AI 芯片验证、编译器、低精度推理、系统软件、机柜热设计、供应链管理、客户 benchmark、AI 硬件销售和算力采购。\n企业\n企业端今天看 AI 数据中心如何被金融化。\nBlackRock 正为 Meta 得克萨斯 El Paso 数据中心筹划逾 120 亿美元债券融资，规模可能接近 130 亿美元。项目结构是 BlackRock 相关主体持有 80%，Meta 持有 20%；JPMorgan 和 Morgan Stanley 负责组织债券投资者沟通。\n这说明 AI 数据中心已经不只是科技公司的资本开支，而是被拆成长期项目融资、债券、私募信贷和租赁资产。Meta 获得算力，BlackRock 把数据中心变成可以卖给固定收益投资者的基础设施资产。\n普通人的机会在数据中心项目融资、电力接入、EPC、暖通、强电、债券评级、资产证券化、租赁会计、SLA 运维和能耗优化。\n富豪资本\n富豪资本今天看游戏 IP 买断的一步监管进展。\n包括 Saudi PIF 在内的投资者集团已获得欧盟反垄断批准，可以推进对 Electronic Arts 的 550 亿美元收购。这笔交易由 Saudi PIF、Silver Lake 和 Jared Kushner 创立的 Affinity Partners 参与，是史上最大私募股权买断之一。\n欧盟并购规则这一关已经过了，但交易仍在接受欧盟外国补贴规则审查，决定期限是 7 月 30 日。也就是说，这笔钱正在穿过两层监管：一层看竞争，另一层看非欧盟补贴和资本影响。\n这类钱买的不是单款游戏，而是全球年轻人的注意力入口、体育游戏 IP、电竞赛事、订阅服务、发行渠道和长期文化资产。\n普通人的机会在游戏海外发行、用户增长、买量投放、IP 授权、电竞运营、跨境内容合规、反垄断材料、外国补贴审查和并购整合。\n平民消费\n普通人的钱今天继续流向绿色和智能消费。\n上半年消费品以旧换新累计带动相关商品销售额 1.1 万亿元，惠及 1.5 亿人次。今天值得看的不是这个总量，而是结构变化：6 月，享受汽车以旧换新补贴的新能源车占比升至 65.4%，支撑二季度新能源汽车零售市场渗透率达到 62.4%；1 至 6 月，数码和智能产品销售量同比增长 13.4%，6 月单月增长 32.0%；智能眼镜 6 月单月增长 30.6%。\n热门品类包括新能源汽车置换、绿色节能家电、手机和平板、智能穿戴、智能眼镜、地方自主补贴品类、线上服务、暑期观影和文旅体验。代表产品包括新能源汽车、空调、冰箱、洗衣机、手机、平板、智能手表、智能眼镜、智能家居、电影票、酒店民宿券和亲子研学产品。\n昨日较热消费品牌：\n中国品牌和平台：比亚迪、理想、小米、华为、海尔、美的、格力、京东、天猫、苏宁易购、携程、美团、猫眼\n国际和跨境相关品牌：Apple、Samsung、Sony、Dyson、Panasonic、Nike、Adidas、Uniqlo、Disney、Universal、Starbucks、Sephora\n普通人的机会在汽车置换、家电安装回收、智能硬件导购、眼镜/穿戴设备销售、补贴核销、门店私域、即时零售、票务增长和亲子文旅套餐。\n高薪职位\n中国高薪岗位：\n\nAI 芯片数字前端设计师 / AI 芯片设计实现专家：人民币 40000 至 70000 元/月，部分 16 薪。训推一体芯片、AI 推理和国产供应链让数字前端继续高薪。\nAI 编译器工程师 / AI 系统软件工程师：人民币 40000 至 70000 元/月。芯片公司需要把模型、编译器、算子、内存和硬件指令真正跑通。\nAI 核芯片验证 / SOC 验证 / GPU 芯片验证工程师：人民币 30000 至 80000 元/月，部分 15 薪至 18 薪。AI 芯片融资继续升温，验证、仿真、覆盖率和可靠性是量产前的硬门槛。\n数据中心电气工程师 / IDC 强电运维：人民币 12000 至 50000 元/月，资深大型项目岗位更高。AI 数据中心融资变大后，10KV、UPS、PDU、柴油发电、液冷和 SLA 都变成高价值能力。\n游戏海外发行负责人 / 游戏商业化运营：人民币 25000 至 80000 元/月，部分 14 薪至 16 薪。EA 交易说明游戏 IP、买量、留存、付费和全球发行仍是大钱入口。\n跨境并购法务 / 外国补贴审查 / 反垄断合规：人民币 30000 至 90000 元/月。EA 和大型媒体交易都说明，交易能否落地越来越取决于监管材料和跨境沟通。\n智能硬件消费运营 / 补贴核销 / 新能源车置换运营：人民币 15000 至 40000 元/月。智能眼镜、数码产品和新能源车置换增长后，品牌、电商、门店和服务商都需要运营人才。\n\n国际高薪岗位：\n\nAI Architect：美国平均约 189887 美元/年，折合约 15824 美元/月；高分位可到 33 万美元以上年薪。\nHardware Engineer / AI Hardware Engineer：美国平均总补偿约 228000 美元/年，折合约 19000 美元/月；Nvidia 硬件工程师美国中位总补偿约 248000 美元/年。\nSenior Chip Design Engineer：美国平均约 180767 美元/年，折合约 15064 美元/月；高分位可接近 30 万美元年薪。\nData Center Engineer：Texas 平均约 137383 美元/年，折合约 11449 美元/月。\nData Center Electrical Engineer：美国平均约 127504 美元/年，折合约 10625 美元/月；高分位可到 21 万美元以上年薪。\n\n今天的岗位主线，是底层系统。AI 芯片看 Verilog/SystemVerilog、UVM、时序、低功耗、NoC、HBM、PCIe/CXL、编译器和模型推理；数据中心看高低压配电、UPS、柴油发电、暖通、液冷、SLA 和能耗；游戏出海看买量、留存、LTV、渠道、支付、合规和本地化；跨境并购看欧盟并购规则、外国补贴、CFIUS、数据合规和 IP；智能消费运营看补贴规则、核销链路、门店转化和售后履约。\n普通人可以优先做可展示项目：MLF 与流动性看板、Foča-Hum 道路项目地图、Etched/AI 芯片竞品拆解、数据中心 SPV 融资结构图、EA 交易监管时间线、智能眼镜消费小报告、游戏出海买量模型、补贴核销表和数据中心巡检模板。\n今日结论\n今天的钱继续往“系统底座”流。\n央行 5000 亿元 MLF 控制的是商业银行中期资金；EBRD 和 World Bank 投向波黑跨境道路，控制的是区域物流和边境效率；Sequoia 等投资者给 Etched 3 亿美元，押的是 AI 推理成本和芯片替代；BlackRock 为 Meta 数据中心做逾 120 亿美元债券融资，把算力机房变成长期债务资产；Saudi PIF、Silver Lake 和 Affinity 推进 550 亿美元 EA 收购，买的是全球游戏 IP、电竞和年轻用户注意力；居民消费端，钱继续被补贴导向新能源汽车、绿色家电、智能产品和智能眼镜。\n普通人的机会也对应这些底座：利率和资金系统、国际工程和物流、AI 芯片和系统软件、数据中心电气和项目融资、游戏发行和跨境监管、智能硬件销售和补贴运营。今天最值得关注的不是哪笔钱最大，而是哪笔钱正在变成未来几年反复需要人的基础设施。\n"},{"title":"谁在花钱日报｜2026-07-23",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-23/",
"date":"2026-07-23",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-23/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-23/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-23/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-23/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-23/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-23/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-23/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-23/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中国银行体系短端流动性回收、塔吉克斯坦青年与女性创业贷款、美国防务和政府技术基金、北美电池储能平台、Ellison家族相关媒体资本监管推进、耐用品以旧换新和线上服务消费，以及AI架构 / 半导体验证 / 储能系统 / 数据中心电气 / 媒体并购 / 消费补贴运营高薪岗位”。\n政府\n今天政府端的花钱信号，是央行继续回收短端流动性。\n7月23日，中国人民银行开展2040亿元7天期逆回购操作，操作利率1.40%。同日有6260亿元逆回购到期，按公开市场口径计算，当日净回笼4220亿元。\n这不是钱直接进入居民账户，而是银行间市场的资金阀门继续往回收。它影响的是回购利率、债券交易、同业资金、货币基金和现金管理类理财的底层收益。\n普通人的机会在资金交易、债券做市、银行同业、流动性压力测试、货币市场数据、资管风控和自动化报表。\n国际政府与开发资金\n开发资金今天看塔吉克斯坦中小微企业。\nEBRD宣布向塔吉克斯坦最大私营银行Bank Eskhata提供最高1500万美元融资包。其中，最高1200万美元投向中亚Youth in Business项目，面向35岁以下年轻人拥有或领导的中小微企业；最高300万美元投向Women in Business项目，支持女性拥有或领导的企业。\n这笔钱的重点不是修一座大工程，而是让本地银行更有能力把钱借给年轻人、女性创业者和小企业。贷款还配套技术合作资金，用来提升银行能力和市场推广实践。\n普通人的机会在普惠金融、信贷风控、贸易融资、俄语/中亚区域项目、创业服务、银行产品经理和中小企业咨询。\n投资机构\n投资机构今天的钱，流向防务和政府技术。\nCapitol Meridian Partners第二只旗舰私募股权基金Capitol Meridian Fund II以19亿美元硬上限关闭，超过12亿美元目标约50%。其中约18亿美元来自60多家机构有限合伙人，约1亿美元来自公司及关联方。\n这只基金主要投向国家安全、国防、政府技术和商业航空相关企业。它看中的不是单纯“军工概念”，而是服务政府客户、同时又有商业市场延展性的中型企业。\n普通人的机会在国防科技产品、政府合规销售、FedRAMP/安全认证、航空供应链、嵌入式软件、网络安全、合同管理和B2G市场拓展。\n企业\n企业端今天看北美储能平台。\nBrookfield宣布与Blackstone Energy Transition Partners管理的基金达成协议，拟收购Aypa Power。交易约70亿美元企业价值、约30亿美元股权价值。Aypa拥有约6.5GW运营、在建和已签约电池储能容量，还有超过20GW开发管线。\n这笔钱说明，储能已经从“新能源配套项目”变成大型机构愿意整体买下来的基础设施平台。AI数据中心和可再生能源并网都在增加电网波动，储能平台负责把电力系统重新拉稳。\n普通人的机会在储能系统集成、并网工程、功率电子、调度算法、能源交易、项目开发、EPC、运维、土地和许可、保险/融资模型。\n富豪资本\n富豪资本今天看媒体并购的一步监管进展。\n欧盟委员会已按欧盟并购规则有条件批准Paramount Skydance收购Warner Bros. Discovery。这笔交易的企业价值约1100亿美元、股权价值约810亿美元。欧盟条件包括：Paramount在交割后13个月内退出United International Pictures欧洲经济区权益，并在10年内不与NBCUniversal在欧洲经济区共同发行电影。\n这与昨天的美国暂停令是同一笔交易的不同更新：欧洲端接受了承诺，美国端仍面临12州诉讼和临时暂停令。也就是说，Ellison家族相关媒体资本的一只脚跨过了欧洲反垄断门槛，另一只脚还卡在美国法院。\n富豪资本做媒体并购，买的不只是片库和流媒体订阅，而是发行渠道、新闻资产、广告库存、IP衍生、院线话语权和监管谈判能力。\n普通人的机会在传媒法务、反垄断、内容发行、流媒体产品、广告销售、新闻合规、版权运营、并购整合和国际监管沟通。\n平民消费\n普通人的钱今天继续流向耐用品换新、线上消费和暑期体验。\n上半年，消费品以旧换新累计带动相关商品销售额1.1万亿元，惠及1.5亿人次。其中，汽车以旧换新370.7万辆，家电以旧换新6326.6万台，数码和智能产品购新7909.8万台。\n国家统计局数据显示，上半年社会消费品零售总额248722亿元，同比增长1.3%；全国网上商品和服务零售额100715亿元，同比增长5.2%；网上服务零售额36419亿元，同比增长6.0%。电影和文旅方面，暑期档电影总票房含预售已突破40亿元。\n热门品类包括汽车以旧换新、家电以旧换新、手机/数码和智能产品、线上商品零售、线上服务、电影票、暑期文旅和本地生活。代表产品包括汽车置换、空调、冰箱、洗衣机、手机、平板、智能穿戴、智能家居、电影票、亲子观影套餐、酒店民宿券、景区门票和外卖/即时零售套餐。\n昨日较热消费品牌：\n中国品牌和平台：京东、天猫、淘宝闪购、苏宁易购、海尔、美的、格力、小米、华为、比亚迪、理想、蔚来、猫眼、淘票票、万达电影、携程、美团、飞猪\n国际和跨境相关品牌：Apple、Samsung、Sony、Dyson、Panasonic、Nike、Adidas、Uniqlo、Disney、Universal、Starbucks、Sephora\n普通人的机会在补贴核销、门店导购、汽车置换、家电安装和回收、手机数码销售、即时零售运营、票务增长、电影IP联动、酒店民宿和本地生活套餐。\n高薪职位\n中国高薪岗位：\n\nAI Agent架构师 / AI平台架构师：人民币30000至70000元/月，部分13薪至15薪。企业Agent和安全控制层继续吸钱，架构能力仍是高薪核心。\n半导体CPU验证工程师 / SerDes架构师：人民币30000至70000元/月，部分16薪。防务基金、AI算力和高速接口都在拉动芯片验证和可靠性岗位。\n储能系统工程师 / BESS项目工程师：人民币20000至45000元/月，部分14薪。储能平台被70亿美元级别资金收购，说明系统设计、并网和项目交付会持续吃香。\n数据中心基础设施运维 / 电气工程师：人民币18000至65000元/月，部分13薪至18薪。AI用电和储能并网都需要稳定供配电、UPS、制冷和SLA管理。\n国防科技BD / 政府合规销售 / 安全认证经理：人民币30000至80000元/月。防务和政府技术公司需要懂产品、合规、投标和政府客户的人。\n媒体并购法务 / 反垄断合规 / 内容发行商业化：人民币30000至80000元/月。Paramount / WBD在欧洲放行、美国受阻，说明大型内容平台需要懂交易、监管、版权和发行的人。\n以旧换新运营 / 补贴核销 / 即时零售增长：人民币15000至40000元/月。1.1万亿元补贴带动销售后，平台、门店、品牌、物流和回收端都需要运营、数据和履约人才。\n\n国际高薪岗位：\n\nAI Architect：美国平均约189859美元/年，折合约15822美元/月；高分位可到25万美元至33万美元以上年薪。\nMachine Learning Engineer：美国平均总补偿约272500美元/年，折合约22708美元/月。\nData Center Engineer：美国平均约147461美元/年，折合约12288美元/月。\nData Center Electrical Engineer：美国平均约111091美元/年，折合约9257美元/月；高需求地区和资深岗位会更高。\nEnergy Storage Development / Power Markets / Project Finance：美国和加拿大岗位通常按能源开发、并网、容量市场、税务股权和项目融资经验定价。\n\n今天的岗位主线，是复杂系统落地。AI架构看Agent、RAG、权限边界和企业集成；半导体验证看UVM、仿真、接口协议和覆盖率；储能看BMS、PCS、EMS、热管理、消防、并网和项目设计；数据中心看高低压配电、UPS、制冷、SLA和故障演练；防务B2G看合规、投标、安全认证和政府客户；媒体并购看竞争法、交易条款、内容授权和跨境监管；消费运营看补贴规则、核销链路、门店转化、供应链和回收履约。\n普通人可以优先做可展示项目：央行逆回购和净投放看板、EBRD中小微贷款风控摘要、防务B2G投标流程图、Aypa储能项目地图、Paramount/WBD监管时间线、以旧换新补贴核销表、AI Agent权限demo、储能系统设计小样和数据中心巡检模板。\n今日结论\n今天的钱不是单纯扩张，而是沿着“系统控制权”流动。\n央行通过2040亿元逆回购和6260亿元到期净回笼4220亿元，控制的是银行体系短端资金；EBRD给Bank Eskhata最高1500万美元，控制的是小企业能否获得信贷；Capitol Meridian用19亿美元募集防务基金，控制的是国家安全与政府技术的中型资产入口；Brookfield用约70亿美元企业价值买Aypa，控制的是北美储能管线和AI时代电力弹性；Ellison家族相关媒体资本推动Paramount / WBD交易跨过欧盟门槛，控制的是内容、发行和流媒体平台。\n普通人的机会也对应这些控制点：资金交易和风控、普惠金融和贸易融资、防务合规和政府销售、储能工程和数据中心电气、媒体并购法务和内容发行、以旧换新核销和即时零售运营。今天最值得关注的不是哪笔钱最大，而是哪笔钱背后需要长期有人把系统跑稳。\n"},{"title":"谁在花钱日报｜2026-07-22",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-22/",
"date":"2026-07-22",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-22/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-22/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-22/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-22/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-22/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-22/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-22/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-22/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中国银行体系短端流动性回收、摩洛哥水务基础设施、欧洲Physical AI和工业人形机器人、影视巨头并购监管、富豪资本参与实体AI、耐用品以旧换新和暑期体验消费，以及AI Agent / 具身智能 / 数据中心 / 水务工程 / 传媒并购 / 消费运营高薪岗位”。\n政府\n今天政府端的花钱信号，是央行从前几天的大额呵护转向税期后的流动性回收。\n7月22日，中国人民银行开展760亿元7天期逆回购操作，操作利率1.40%，与此前持平。因为当日有4265亿元7天期逆回购到期，公开市场实现净回笼3505亿元。\n这不是钱直接进入居民账户，而是银行间市场的资金阀门被调了一下。它影响的是回购利率、债券交易、同业资金、货币基金和理财底层收益。对普通人来说，机会在资金交易、债券做市、流动性风险监控、银行同业业务、资管组合管理、金融数据和自动化报表。\n国际政府与开发资金\n开发资金今天看摩洛哥水务系统。\nEBRD项目页显示，ONEE Water - Performance Improvement Program的审批日期为2026年7月22日。项目拟向摩洛哥国家电力和饮用水公用事业ONEE提供最高2.5亿欧元贷款，其中1.2亿欧元为承诺 tranche A，1.3亿欧元为未承诺 tranche B。\n这笔钱投向的不是一个孤立水厂，而是饮用水生产和输送系统的效率、可靠性和韧性。项目要做的是修复和现代化生产/输水资产，降低漏损，提升网络表现，并推动计量和监测系统现代化。\n这说明开发资金继续流向“气候压力下的基础服务”。普通人的机会在水务工程、自动化仪表、SCADA/IoT、气候适应咨询、项目融资、EPC管理、法语/阿语区域项目协调和国际发展项目采购。\n投资机构\n投资机构今天的钱，押注实体AI和工业人形机器人。\n英国AI和机器人公司Humanoid宣布完成1.52亿美元Series A融资，投后估值13.5亿美元，累计融资2.7亿美元。Prime Movers Lab领投，Schaeffler、Bosch、Fubon Financial Holding Venture Capital和Aglae Ventures参与。\n资金将用于下一代机器人平台、2026年第四季度客户beta部署、轮式机器人规模制造，以及Humanoid自研机器人AI软件KinetIQ。\n这笔钱的意义不只是“又一个AI融资”，而是资本继续从模型和软件推向能进工厂、仓库和零售现场的实体AI。钱会流向机器人控制、运动规划、视觉感知、工业安全、供应链工程、硬件可靠性、量产测试和客户现场部署。普通人的机会在机器人算法、嵌入式、机械/电气系统、工业软件、质量工程、制造工艺、现场应用工程和B2B售前。\n企业\n企业端今天看一笔大钱被监管临时拦住。\nParamount Skydance与Warner Bros. Discovery此前宣布达成交易，Paramount拟以31美元/股现金收购WBD，交易企业价值1100亿美元。7月13日，加州总检察长Rob Bonta牵头12州检察长联盟发起诉讼，挑战该交易；7月20日，美国地区法官Araceli Martinez-Olguin对交易发出14天临时暂停令。\n这说明企业并购的钱，不是签了协议就一定能立刻流动。大型媒体交易会影响电影发行、流媒体订阅、频道授权、内容采购、裁员整合和创作者议价，也会触发反垄断监管。\n普通人的机会在反垄断、传媒法务、并购整合、影视发行、内容数据、流媒体增长、版权运营、院线商务和监管沟通。\n富豪资本\n富豪资本今天也进入实体AI。\nHumanoid官方融资公告列示Aglae Ventures为参投方。Aglae Ventures是与LVMH主席Bernard Arnault相关的投资机构。本月此前写过Arnault的5000万欧元数学研究院捐赠，今天的新信号是其相关投资资本参与欧洲工业人形机器人融资。\n这说明富豪资本不只买奢侈品、地产和体育资产，也在押注下一代制造能力。工业机器人如果真正进入生产线，影响的是工厂效率、劳动力替代、奢侈品供应链、仓储物流和欧洲高端制造。\n普通人的机会在家族办公室科技投资、机器人产业研究、制造业数字化、工业客户成功和跨境投后管理。\n平民消费\n普通人的钱今天看两个方向：耐用品以旧换新和暑期体验消费。\n商务部7月17日召开全国消费品以旧换新年中工作推进电视电话会议，披露2026年以来消费品以旧换新政策惠及超1.5亿人次。电影和文旅方面，2026年度电影票房含预售突破200亿元，全国暑期文旅消费季仍有超4.5亿元补贴和消费券落地。\n今天的新增主线是“补贴把耐用品消费继续往前拉”。电影和文旅是延续信号，说明暑期体验消费还在。\n热门品类包括家电以旧换新、数码3C、汽车/电动车、家居家装、电影票、亲子观影、暑期文旅券、避暑、夜游和研学旅行。代表产品包括空调、冰箱、洗衣机、手机、平板、笔记本、新能源车、智能家居、电影票、亲子观影套餐、景区门票立减、酒店民宿券和票根商圈优惠。\n昨日较热消费品牌：\n中国品牌和平台：京东、天猫、苏宁易购、海尔、美的、格力、小米、华为、比亚迪、猫眼、淘票票、万达电影、携程、美团、飞猪\n国际和跨境相关品牌：Apple、Samsung、Sony、Dyson、Panasonic、Nike、Adidas、Uniqlo、Disney、Universal、Starbucks、Sephora\n普通人的机会在补贴核销、线下门店导购、家电安装回收、二手回收、数码换新、汽车销售、票务增长、商圈联动、亲子活动和本地生活套餐。\n高薪职位\n中国高薪岗位：\n\nAI Agent架构师 / AI平台架构师：人民币45000至110000元/月。BOSS直聘样本显示，北京AI Agent架构师45-70K·15薪，深圳AI Native平台架构师50-80K·14薪，深圳AI Agent平台架构师80-110K·15薪；职友集深圳算法工程师样本显示79.4%岗位为20-50K/月。\n具身智能/机器人算法工程师 / 机器人算法经理：人民币30000至80000元/月。猎聘智能机器人岗位样本显示，智能机器人核心算法工程师30-50K，算法经理/算法总监50-80K；机器人算法工程师可见40-60K·14薪样本。\n数据中心电气 / 供配电 / 运维工程师：人民币10000至30000元/月，部分13薪至15薪。BOSS直聘和猎聘样本显示，数据中心电气、供配电、运维、制冷工程师多数在10-30K区间，高级和大型园区岗位上限更高。\n水务工程 / 自动化仪表 / 项目融资经理：人民币18000至50000元/月。EBRD/ONEE项目对应管网、水厂、泵站、计量监测和开发金融，机会在EPC、仪表自动化、SCADA、ESG、法语/阿语项目协调和国际采购。\n传媒并购法务 / 反垄断合规 / 内容商业化：人民币30000至80000元/月。Paramount/WBD交易被暂停说明，大型传媒集团需要并购、竞争法、内容授权、院线发行、流媒体增长和监管沟通人才。\n以旧换新零售运营 / 补贴核销 / 回收供应链：人民币15000至40000元/月。政策覆盖超1.5亿人次后，门店、平台、品牌、物流和回收端需要懂政策、数据、销售和供应链的人。\n\n国际高薪岗位：\n\nAI Engineer：美国平均base约184757美元/年，折合约15396美元/月；平均总补偿约211243美元/年。\nRobotics Engineer：美国平均base约148604美元/年，折合约12384美元/月；平均总补偿约183494美元/年。高级机器人工程师平均约186048美元/年，90分位约303868美元/年。\nData Center Engineer：美国样本平均约137385美元/年，折合约11449美元/月；休斯顿样本平均约140821美元/年。\nAntitrust / M&amp;A Counsel、Media Corporate Development、Water Infrastructure Project Finance：美国和欧洲岗位通常按法律、投行、开发金融和基础设施经验定价，核心门槛是交易、监管、融资项目经验，而不是单纯行业兴趣。\n\n今天的岗位主线，是“复杂系统落地”。AI Agent需要架构和权限边界，机器人需要感知、控制和量产，数据中心需要稳定供配电，水务项目需要工程和融资，媒体并购需要监管和整合，消费补贴需要核销和履约。\n普通人可以优先做可展示项目：AI Agent权限和工具调用demo、机器人感知/控制小项目、数据中心电气巡检表、摩洛哥水务项目融资摘要、Paramount/WBD反垄断时间线、以旧换新补贴核销看板、电影票根商圈联动方案。\n今日结论\n今天的钱分成两类：一类是“把系统收紧、改造和管住”的钱，另一类是“押注下一代现场自动化和体验消费”的钱。\n央行通过760亿元逆回购和4265亿元到期实现3505亿元净回笼，说明税期后的流动性正在回到更均衡状态；EBRD把最高2.5亿欧元放到摩洛哥饮用水系统，解决水损、韧性和计量监测；Prime Movers Lab、Bosch、Schaeffler等用1.52亿美元押注Humanoid，把AI从屏幕推向工厂；Paramount/WBD的1100亿美元交易则被14天暂停令卡住，显示大媒体并购的钱也必须先穿过反垄断监管；Bernard Arnault相关Aglae Ventures参与Humanoid，说明富豪资本也在把筹码放到实体AI。\n普通人的机会不只在“哪个数字最大”，而在这些钱需要什么人落地：资金交易和风险监控、水务工程和自动化、机器人算法和制造、并购法务和内容商业化、以旧换新运营和回收履约，以及本地生活和暑期文旅转化。\n"},{"title":"谁在花钱日报｜2026-07-21",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-21/",
"date":"2026-07-21",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-21/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-21/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-21/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-21/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-21/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-21/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-21/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-21/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中国银行体系短端流动性和税期资金面、南非电力 / 货运 / 水务基础设施改革、企业AI agent安全、GLP-1和多肽CDMO产能、NFL球队和现场娱乐资产、电影票房和亲子体验消费，以及AI安全 / 数据中心 / 生物医药CDMO / 体育文娱IP / 资金交易高薪岗位”。\n政府\n今天政府端最清晰的花钱信号，仍然是央行继续照看税期资金面。\n7月21日，中国人民银行开展2530亿元7天期逆回购操作，固定利率、数量招标，全额满足一级交易商需求，操作利率1.40%。当日有2365亿元逆回购到期，市场口径测算单日净投放约165亿元。\n这笔钱不会直接进入居民账户，而是先进入银行间市场。它影响的是回购利率、债券交易、同业资金和金融机构流动性，再进一步影响企业短期融资成本、债券估值和理财资产配置。\n7月中旬以来，央行逆回购从前期小额操作转向更明显的税期对冲。对普通人来说，机会在资金交易、债券交易、同业业务、流动性管理、资产负债管理、债券估值和金融数据监控。\n国际政府与开发资金\n开发资金今天看南非基础设施改革。\nWorld Bank Group向南非提供15亿美元IBRD贷款，用于支持电力、货运、水务和卫生等结构性改革。这是2022年以来世行对南非第四笔独立Development Policy Loan。\n这笔钱不是简单修一条铁路或建一个水厂，而是支持一整套基础设施市场改革。世行称，相关改革可能到2032年带来近60万个就业机会；此前改革已经让南非私营可再生能源投资增加6倍，铁路和港口货运量较2023年增长超50%。\n这说明开发资金正在从“补项目缺口”转向“改系统规则”。普通人的机会在国际工程、能源项目、港口物流、水务运营、PPP和项目融资、监管咨询、非洲市场本地化和开发金融。\n投资机构\n投资机构今天的钱，押注AI agent安全。\nNeo从隐身状态发布，披露获得1亿美元融资。创始人Shlomi Salem称，资金来自Bessemer Venture Partners和Andreessen Horowitz，并有Craft Ventures、Merlin Ventures参与。\nNeo要解决的问题，是AI应用正在从聊天窗口变成能读表格、写代码、调工具、访问业务系统的agent。传统安全工具更熟悉人、设备、网络和应用，却不一定能看清一个AI agent到底能做什么、访问了什么、代表谁在行动。\n这笔钱会流向agent inventory、权限映射、行为审计、数据泄露防护、AI应用治理和SecOps工作流。普通人的机会在AI安全、身份权限、应用安全、云安全、审计合规、企业软件集成和安全产品工程。\n企业\n企业端今天看GLP-1热潮背后的制造能力。\nSamsung Biologics宣布发起全现金公开要约，拟收购PolyPeptide 100%完全摊薄股本。要约价格为每股44.31瑞士法郎，隐含股权价值约14.6亿瑞士法郎，约18亿美元。交易预计2026年底完成，仍需最低接受门槛和监管批准。\nPolyPeptide是专注多肽API的全球CDMO，拥有70多年API制造经验和超过1000种治疗性多肽生产记录。Samsung Biologics原本强在抗体、ADC和大规模生物制造，这次补的是多肽和GLP-1相关能力。\n这说明肥胖、糖尿病和多肽疗法的热度正在从药品销售扩散到上游产能。钱会流向多肽合成、工艺放大、API质量体系、技术转移、全球产能布局和药厂供应链。普通人的机会在生物医药CDMO、多肽工艺、CMC、质量验证、注册申报、海外商务BD和供应链管理。\n富豪资本\n富豪资本今天看体育特许经营权。\nPaul G. Allen Estate确认已达成协议，把Seattle Seahawks出售给Khosla家族及有限合伙人。媒体披露交易价格约96.12亿美元，仍需NFL联盟审查和会员批准。Neeru Khosla将担任控制人，Khosla家族还需处置其San Francisco 49ers少数股权。\n这不是单纯买一支球队。NFL球队是一种稀缺资产，叠加本地身份、媒体版权、赞助、球场商业、会员体系、现场娱乐和城市品牌。另一方面，Allen遗产处置收益最终会服务其慈善安排。\n普通人的机会在体育商业、赞助销售、会员增长、场馆运营、内容版权、数据分析、城市活动、家族办公室交易支持和体育资产投后管理。\n平民消费\n普通人的钱今天继续看电影和暑期体验消费。\n央视网口径显示，2026年度电影总票房含预售已突破200亿元；此前暑期档电影总票房含预售已突破40亿元。全国暑期文旅消费季从7月初持续到8月底，超4.5亿元消费券和补贴仍在带动本地文旅消费。\n今天的更新点，是电影市场从昨天的年度票房197亿元级别继续推到200亿元级别。消费落点也不只是“买一张电影票”，而是“电影+亲子+IP周边+影院餐饮+商圈/景区权益”。\n热门品类包括动画电影、历史/喜剧/动作电影、亲子观影、电影IP周边、影院餐饮、票根商圈权益、避暑文旅和研学旅行。代表产品包括《飞驰人生3》《给阿嫲的情书》《镖人：风起大漠》、亲子观影厅、电影主题套餐、IP手办/盲盒/海报、票根景区和商圈优惠、暑期文旅消费券。\n昨日较热消费品牌：\n中国品牌和平台：猫眼、淘票票、万达电影、横店影视、博纳影业、华谊兄弟、携程、美团、同程、飞猪、泡泡玛特、华为、小米、瑞幸、霸王茶姬\n国际和跨境相关品牌：Disney、Universal、Pixar、Illumination、Apple、Samsung、Nike、Adidas、Lululemon、Starbucks、Uniqlo、Sephora\n普通人的机会在影院运营、票务增长、电影IP衍生品、亲子活动、短视频种草、本地生活套餐、文旅券核销、商圈联动和目的地供应链。\n高薪职位\n中国高薪岗位：\n\nAI架构工程师 / AI Agent架构工程师 / AI安全合规专家：人民币30000至80000元/月。BOSS直聘样本显示，深圳、北京、上海AI架构、AI Agent架构、AI Infra方向多在30K-70K/月，部分给到15薪或16薪；AI安全与合规岗位样本为15K-20K/月，网络安全架构师全国样本可见30K-60K/月。\n数据中心电气 / 关键设施 / AI算力基础设施工程师：人民币18000至60000元/月，部分岗位14薪、16薪或18薪。猎聘样本显示，数据中心电气工程师、数据中心热管理、云厂商数据中心资产工程师等岗位仍在高薪区间。\n生物医药CDMO / 多肽工艺 / CMC / 医药BD：人民币20000至60000元/月。GLP-1和多肽API制造热度，会抬高工艺放大、技术转移、质量体系、注册申报和海外客户岗位价值。\n基础设施改革 / 水务 / 港口物流 / PPP项目经理：人民币20000至50000元/月。南非世行贷款对应电力、货运和水务结构性改革，机会在项目融资、监管改革、EPC管理、运维绩效和私营资本引入。\n体育特许经营 / 赛事商务 / 文娱IP运营：人民币20000至60000元/月。Seahawks交易和电影票房增长共同说明，现场娱乐、会员、赞助、IP授权、票务、场馆运营和粉丝数据岗位仍有溢价。\n资金交易 / 债券交易 / 流动性风险管理：人民币30000至80000元/月。税期逆回购和债市资金面波动，会继续抬高银行、券商、资管机构对资金交易、债券做市、ALM和风险数据岗位的要求。\n\n国际高薪岗位：\n\nAI Engineer：美国平均base约184757美元/年，折合约15396美元/月；平均总补偿约211243美元/年。\nCybersecurity Engineer：美国平均base约166851美元/年，折合约13904美元/月；平均总补偿约200797美元/年。\nData Center Engineer：美国平均约147461美元/年，折合约12288美元/月。\nPrivate Equity Associate / Sports Finance / Corporate Development：美国私募股权Associate平均约249127美元/年，体育资产和企业发展岗位的上限取决于交易经验、联盟规则和商业化资源。\n\n今天的岗位主线不是单纯AI，而是“资本密集型系统的控制层”。资金面需要交易和风险控制，基础设施需要工程和融资控制，AI agent需要权限和数据控制，GLP-1多肽需要工艺和质量控制，体育和电影消费需要IP、会员和场馆控制。\n普通人可以优先做可展示项目：AI agent权限审计demo、Kubernetes/GPU推理成本优化、数据中心电气巡检模板、多肽CDMO供应链研究、基础设施项目融资模型、体育IP赞助方案、电影票务和商圈联动数据看板、债券资金面监控脚本。\n今日结论\n今天的钱集中在“控制层”和“现场体验资产”两条线上。\n央行用2530亿元逆回购继续照看税期资金面，World Bank用15亿美元支持南非电力、货运、水务和卫生改革，Andreessen Horowitz与Bessemer等拿1亿美元押注Neo的AI agent安全控制层，Samsung Biologics用约18亿美元级别全现金要约补上多肽和GLP-1制造能力，Khosla家族用约96.12亿美元买下Seattle Seahawks，普通消费者的钱则继续流向电影票房、亲子观影、IP周边、影院餐饮和文旅消费券。\n普通人的机会不是追最大金额，而是找这些钱的落点：资金面和债券交易、基础设施改革、AI安全、数据中心、生物医药CDMO、体育商业、电影IP和文旅本地生活。\n"},{"title":"谁在花钱日报｜2026-07-20",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-20/",
"date":"2026-07-20",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-20/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-20/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-20/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-20/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-20/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-20/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-20/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-20/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中国银行体系短端流动性、塞内加尔和肯尼亚数字基础设施、AI基础设施 / 机器人 / 医疗 / 能源早期公司、全球外卖和即时零售平台、青少年心理健康、暑期电影和亲子消费，以及AI Infra / 数据中心 / VC / PE投后 / 本地生活 / 网络安全高薪岗位”。\n政府\n今天政府端最清晰的花钱信号，是央行继续维护银行体系短端流动性。\n7月20日，中国人民银行开展3985亿元7天期逆回购操作，固定利率、数量招标，全额满足一级交易商需求，操作利率1.40%。\n这笔钱不会直接进入居民账户，而是先进入银行间市场。它影响的是回购利率、债券交易、同业资金和金融机构流动性，再进一步影响企业短期融资成本、债券估值和理财资产配置。\n本月央行已经多次通过逆回购和买断式逆回购维护资金面。今天这笔3985亿元说明，短端流动性仍然需要持续照看。对普通人来说，机会在资金交易、债券交易、同业业务、流动性管理、资产负债管理和金融数据监控。\n国际政府与开发资金\n开发资金今天看非洲数字基础设施。\nEBRD为非洲电信公司Yas提供最高2.7亿欧元长期融资，用于扩张塞内加尔和肯尼亚数字基础设施。这是EBRD在塞内加尔的首个项目，也是其在撒哈拉以南非洲的首个本币融资和首个A/B贷款结构。\n这笔融资包括最高1.7亿欧元承诺融资和最高1亿欧元未承诺未来融资。资金会进入塞内加尔4G和5G移动网络、核心基础设施、光纤部署，以及肯尼亚光纤网络现代化。\n这说明开发资金正在从传统道路、电力和银行信贷，延伸到通信网络、光纤、数据中心和金融科技底座。普通人的机会在非洲市场通信工程、光纤建设、移动网络运维、普惠金融产品、开发金融、ESG/性别包容项目、跨境项目管理和本地化运营。\n投资机构\n投资机构今天的钱，继续押注早期AI基础设施和实体技术。\nB Capital宣布Ascent Fund III以5亿美元硬上限关闭。这个基金主要投Seed、Series A和Series B阶段，重点覆盖医疗、企业软件、能源和frontier tech中的下一代技术公司。\n这只基金规模接近2022年Ascent Fund II的两倍，已经投资Apptronik、Havoc AI、Star Catcher等20多个项目。它不是只追应用层AI聊天工具，而是在押注AI进入机器人、能源、医疗和工业基础设施。\n普通人的机会在早期投资研究、技术尽调、机器人量产、AI Infra、医疗AI合规、能源项目商业化和面向大企业的产品落地。\n企业\n企业端今天最值得看的，是全球外卖和即时零售平台继续整合。\nUber宣布对Delivery Hero发起自愿收购要约，要约价格为每股41.50欧元，对应Delivery Hero 100%股权价值148亿美元，扣除Uber既有持仓后调整价值137亿美元。\n这不是单纯买一家外卖公司。Uber称交易完成后，其移动出行和配送平台将覆盖99个市场，2025年合并备考Gross Bookings为2360亿美元。SSW Partners还会以约16亿美元承接14个重叠市场业务，Uber则承诺未来5年在德国投资20亿欧元。\n外卖和即时零售已经进入更强的平台整合阶段。钱会流向商户广告、会员体系、骑手效率、履约网络、城市运营、自动驾驶配送、跨境监管和反垄断合规。\n普通人的机会在本地生活增长、商户运营、骑手网络调度、供应链、广告商业化、数据分析和德国/欧洲市场本地化。\n富豪资本\n富豪资本今天不是买股权，而是投向年轻人的心理健康。\nActive Minds宣布收到MacKenzie Scott 2000万美元无限制捐赠，这是该组织史上最大单笔捐赠。资金将用于扩大青年心理健康倡导、同伴支持、学校和校园网络，以及组织长期基础设施。\n这类钱的特点，是把决策权更多交给一线组织。它不是买楼命名，也不是限定一个项目，而是让组织可以在高中、大学、青年领导力、同伴网络和系统倡导之间灵活配置资源。\n普通人的机会在心理健康教育、校园项目、青年倡导、同伴支持培训、公益项目评估、筹款运营、数字心理健康工具和学校/社区合作。\n平民消费\n普通人的钱今天看暑期电影和亲子消费。\n2026年暑期档电影总票房含预售已突破40亿元，2026年度电影总票房含预售突破197亿元。全国暑期文旅消费季从7月初持续到8月底，仍有超过4.5亿元消费券和补贴在带动本地文旅消费。\n今天的更新点，是暑期档票房从此前30亿元级别继续上升到40亿元级别，而且消费落点从“看一场电影”，变成“电影+亲子+IP周边+影院综合空间”。\n七月以来，已有超15部中外动画影片定档。影院正在增加亲子观影厅、动画主题等候区、影视IP衍生品专区和电影主题零食套餐。IP手办、盲盒、毛绒公仔、角色挂件、主题卡牌和海报套装，正在把观影体验延伸到线下购物。\n昨日较热消费品牌：\n中国品牌和平台：猫眼、淘票票、万达电影、横店影视、博纳影业、携程、美团、同程、飞猪、京东、淘宝/天猫、泡泡玛特、华为、小米、瑞幸、霸王茶姬\n国际和跨境相关品牌：Disney、Universal、Apple、Samsung、Nike、Adidas、Lululemon、Sephora、Starbucks、Uniqlo\n普通人的机会在影院运营、IP衍生品、亲子活动、文旅消费券核销、短视频种草、本地生活套餐、书店/商圈联动和目的地供应链。\n高薪职位\n中国高薪岗位：\n\nAI Infra架构师 / AI产品架构师：人民币35000至95000元/月。上海、深圳公开样本显示，AI infra架构、AI产品架构、多模态、GPU集群和Agent平台岗位仍在高薪区间，部分岗位给到15薪或16薪。\n数据中心高级运维 / 电气工程师：人民币15000至30000元/月，部分岗位14薪或15薪。非洲通信基础设施、AI算力和平台整合都继续拉动数据中心与网络工程需求。\n股权投资 / PEVC / 投后运营：人民币25000至60000元/月，部分岗位18薪。早期AI基金和产业投资需要能做技术判断、建模、尽调和投后经营的人。\n本地生活 / 外卖即时零售增长运营：人民币25000至60000元/月。Uber和Delivery Hero这类平台整合，会继续放大商户运营、广告商业化、会员增长、履约效率和城市经营岗位价值。\n心理健康项目 / 校园公益 / 数字健康运营：人民币20000至50000元/月。青年心理健康资金增加后，项目设计、学校网络、评估、筹款和数字产品岗位会更重要。\n跨境平台合规 / 网络安全 / 数据治理：人民币30000至90000元/月。全球平台并购、欧洲监管、数据跨境和支付/履约系统都需要安全、隐私和合规人才。\n\n国际高薪岗位：\n\nAI Engineer：美国平均base约184757美元/年，总补偿约211243美元/年。\nData Center Engineer：美国平均约147461美元/年，约70.89美元/小时。\nPrivate Equity Associate：美国平均约249127美元/年，25至75分位约189430至334471美元/年。\nCybersecurity Engineer：美国平均base约166851美元/年，总补偿约200797美元/年。\n\n今天的岗位主线不只看AI。钱正在进入短端流动性、非洲通信基础设施、AI早期基金、外卖平台整合、心理健康公益和电影/文旅消费，这些领域都缺“能把资金落成项目、产品、效率和收入”的人。\n普通人可以优先做可展示项目：GPU/Kubernetes/推理成本优化、数据中心巡检和电气图纸、投后经营模型、本地生活商户增长看板、心理健康校园项目手册、网络安全证书和隐私合规清单。\n今日结论\n今天的钱集中在“平台和基础设施扩张”与“体验和心理健康消费”两条线上。\n央行用3985亿元逆回购维护短端流动性，EBRD把最高2.7亿欧元投向塞内加尔和肯尼亚数字基础设施，B Capital用5亿美元早期基金继续押注AI进入机器人、医疗、能源和企业基础技术，Uber用148亿美元级别要约整合Delivery Hero，MacKenzie Scott把2000万美元给到青年心理健康，普通消费者的钱则继续流向暑期电影、亲子观影、IP周边、影院餐饮和文旅消费券。\n普通人的机会不是追最大的标题，而是找这些钱的落点：资金面、通信基础设施、AI Infra、机器人商业化、外卖即时零售、心理健康项目、电影IP运营、文旅本地生活、数据中心和网络安全。\n"},{"title":"谁在花钱日报｜2026-07-17",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-17/",
"date":"2026-07-17",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-17/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-17/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-17/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-17/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-17/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-17/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-17/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-17/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中国银行体系短端流动性、阿尔巴尼亚中小企业贷款 / 绿色投资 / 旅游基础设施、服务业私募股权、精神健康创新药、欧洲电信资产、暑期体验消费，以及AI基础设施 / 服务业投后 / 数据中心 / 精神健康临床 / 电信整合 / 网络安全 / 文旅增长高薪岗位”。\n政府\n今天政府端最清晰的花钱信号，还是央行维护银行体系短端流动性。\n7月17日，中国人民银行开展4505亿元7天期逆回购操作，固定利率、数量招标，全额满足一级交易商需求，操作利率1.40%。\n这笔钱不会直接进入居民账户，而是先进入银行间市场。它影响的是回购利率、债券交易、同业资金和金融机构流动性安排，再进一步影响企业短期融资、理财资产配置和债券市场定价。\n本月逆回购和买断式逆回购已经多次出现。今天这笔4505亿元说明，资金面仍然需要持续维护。对普通人来说，机会在资金交易、债券交易、同业业务、流动性管理、利率风险控制、银行/券商资产负债管理和金融数据监控。\n国际政府与开发资金\n开发资金今天看阿尔巴尼亚。\nEBRD和EU支持ProCredit Bank Albania扩大中小企业贷款。EBRD提供最高2500万欧元未出资担保，预计支持最高5000万欧元新增贷款，资金主要流向阿尔巴尼亚SME、女性和青年创业者、Tirana以外地区、农业食品、旅游业和绿色投资。\n这不是单纯给银行增信。EBRD担保份额的50%会分配给绿色投资，同期EBRD/EU还在阿尔巴尼亚Berat推进旅游基础设施和本地企业支持。\n开发资金正在变成一组组合工具：一边提供信用担保，一边要求绿色标准，一边推动目的地基础设施和本地企业能力建设。\n普通人的机会在SME金融、绿色项目评估、开发金融、女性/青年创业服务、农旅企业财务规范、旅游目的地运营、项目合规和国际发展项目执行。\n投资机构\n投资机构今天的钱，进入服务业私募股权。\nUplift Investors首期基金以6.7亿美元硬上限关闭。这个基金不是追一两个炫目的科技概念，而是看服务业里的中端企业，包括知识与人才解决方案、法律服务、技术工种、金融服务和工业服务。\nUplift使用“5-5-5”框架：五类商业模式、五类服务行业、五个价值创造中心。公司已经成立Orion Legal MSO，并收购IMS Legal Strategies。\n这类钱买的不是流量，而是服务业企业的组织、销售、人才、数据、AI和并购整合能力。它说明服务业正在被私募股权重新工业化：把分散的专业服务变成可复制、可管理、可扩张的平台。\n普通人的机会在服务业并购、投后运营、财务建模、行业研究、组织设计、GTM、销售增长、人才系统和AI赋能运营。\n企业\n企业端今天最值得看的，是大型药企把钱投向精神健康创新药。\nEli Lilly同意收购AtaiBeckley，交易最高可达38亿美元，其中约28亿美元为现金对价，另有最高10亿美元里程碑付款。\nAtaiBeckley的重点资产面向难治性抑郁症和其他精神健康疾病。这个交易说明，精神健康不只是心理咨询和数字疗法的话题，也正在成为大型药企愿意用并购资金押注的临床管线。\n里程碑付款也很关键。它说明买方现在愿意先付一大笔钱锁定资产，同时把后续付款绑定在临床进展、监管节点和商业化可能性上。\n普通人的机会在精神健康药物研发、临床运营、监管事务、药物安全、真实世界证据、精神健康服务网络、商业化准入和患者管理。\n富豪资本\n富豪资本今天看Xavier Niel买Vodafone股权。\n法国富豪Xavier Niel的家族投资工具Vega将从e&amp;手中收购Vodafone约16.2%股权，交易金额约44亿英镑，也就是约59.1亿美元。交易完成后，Vega将成为Vodafone最大股东。\n这笔交易还需要监管和外国投资审查。但方向已经很清楚：富豪资本正在买稀缺网络资产和长期股东影响力。\nVodafone过去几年一直在重组，退出西班牙和意大利，聚焦德国、英国和非洲，并完成英国Three合并。Niel的钱进入以后，市场会继续关注成本削减、资产重组、网络投资和股东治理。\n普通人的机会在电信并购、网络资产运营、成本削减、监管沟通、资本市场关系、企业通信、用户增长和跨境股权交易。\n平民消费\n普通人的钱今天看暑期消费。\n人民日报海外版7月17日报道，暑期消费正在继续升温，但结构已经从简单短途游，转向长线游、本地酒店度假、旅居、研学、电影IP和文旅消费券。\n携程数据显示，1至3天出游占比从2025年暑期的71.6%降至52.9%，4天及以上出游占比从28.4%升至47.1%。\n美团数据显示，本地酒店度假订单同比增长124%，纯休闲酒店住宿游客占比从23%升至41%。\n途家数据显示，15天及以上旅居订单同比增长22%，7天及以上增长11%，三四居民宿订单增长25%。\n同程数据显示，研学、课文打卡、书本同款等产品搜索量环比增长2.8倍，古诗词和课本主题咨询增长130%，相关跟团游和定制游预订增长60%。\n全国暑期文旅消费季安排超过3万场活动，发放超过4.5亿元消费券和补贴。浙江、横琴、昆明等地也在发放文旅消费券。\n昨日较热消费品牌：\n中国品牌和平台：携程、美团、途家、同程、抖音生活服务、京东、淘宝/天猫、拼多多、泡泡玛特、华为、小米、瑞幸、霸王茶姬\n国际和跨境相关品牌：Apple、Samsung、Nike、Adidas、Lululemon、Sephora、Starbucks、Uniqlo、Disney\n今天的更新点不是“大家都在旅游”这么简单，而是消费者愿意为更长时间、更强体验、更适合家庭和孩子的暑期安排付费。\n普通人的机会在长线游产品、本地酒店套餐、旅居民宿运营、亲子研学、电影IP周边、书店活动、文旅消费券核销、内容种草、目的地供应链和本地生活转化。\n高薪职位\n中国高薪岗位：\n\nAI Infra / AI Agent架构师：人民币50000至90000元/月。BOSS直聘公开样本显示，AI Infra、AI Agent架构、C++引擎、GPU集群和云原生基础设施岗位仍在高薪区间，多薪制样本可到14至18薪。\n服务业私募股权 / 并购 / 投后运营：人民币30000至50000元/月，部分岗位薪制更高。服务业基金需要财务建模、尽调、投后运营、组织升级和AI/数据赋能人才。\n数据中心commissioning / 电气 / 关键设施工程师：执行岗公开样本常见13000至25000元/月，业主代表、项目管理、海外和大型关键设施岗位上限更高。\n文旅目的地运营 / 酒店收益 / 本地生活增长：人民币20000至70000元/月。暑期长线游、酒店度假、旅居民宿、研学和消费券核销需要供应链、投放、收益管理和本地商家整合人才。\n精神健康创新药 / 数字健康临床开发：人民币30000至80000元/月。大型药企并购会拉动临床运营、监管事务、药物安全、真实世界证据和商业化准入岗位。\n电信网络 / 企业通信 / 网络安全：人民币30000至90000元/月。电信整合和企业网络升级需要网络运营、监管、客户增长、成本管理和安全治理人才。\n\n国际高薪岗位：\n\nAI Engineer：美国平均base约184757美元/年，总补偿约211243美元/年。\nData Center Commissioning Engineer：美国平均约147461美元/年，约70.89美元/小时。\nPrivate Equity Associate：美国总薪酬均值约249089美元/年，常见区间约189387至334447美元/年，高分位更高。\nCybersecurity Engineer：美国平均base约166851美元/年，总补偿约200797美元/年。\n\n今日结论\n今天的钱集中在“系统升级”和“体验消费”两条线上。\n央行继续维护银行短端流动性，EBRD/EU把开发资金放进阿尔巴尼亚SME、绿色投资和旅游基础设施，Uplift把机构资本投向服务业私募股权，Eli Lilly用最高38亿美元买精神健康临床管线，Xavier Niel用约59亿美元买Vodafone长期股权，普通消费者的钱则继续流向暑期长线游、本地酒店度假、旅居、研学、电影IP和文旅消费券。\n普通人的机会不是追最大的数字，而是找这些资金的落点：资金面、开发金融、服务业投后、AI基础设施、精神健康临床、数据中心、电信整合、文旅目的地运营和本地生活增长。\n"},{"title":"谁在花钱日报｜2026-07-16",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-16/",
"date":"2026-07-16",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-16/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-16/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-16/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-16/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-16/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-16/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-16/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-16/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中国银行体系短端流动性、布基纳法索社会保护和脆弱家庭经济机会、北美中型企业私募信贷、生产级AI基础设施管理、博彩酒店和线下娱乐资产私有化、线上商品和服务消费，以及AI基础设施 / 私募信贷 / 数据中心 / 电商增长 / 社会保护数据 / 酒店博彩整合高薪岗位”。\n政府\n今天政府端最清晰的花钱信号，是央行继续给银行体系补短端流动性。\n7月16日，中国人民银行开展6260亿元7天期逆回购操作，固定利率、数量招标，全额满足一级交易商需求，操作利率1.40%。\n这笔钱不会直接进入居民账户，而是先进入银行间市场。它影响的是回购利率、债券交易、同业资金、券商和银行的流动性安排，再进一步影响企业短期融资和理财资产配置。\n本月已经有多轮逆回购和买断式逆回购，今天这笔6260亿元说明资金面仍然需要持续维护。对普通人来说，机会在资金交易、债券交易、同业业务、流动性管理、利率风险控制、资产负债管理和金融数据监控。\n国际政府与开发资金\n开发资金今天看布基纳法索。\nWorld Bank为布基纳法索 Economic Opportunities for Resilience Project 提供1.2亿美元融资包，其中包括1亿美元IDA credit和2000万美元grant。\n这笔钱不是修一条路或建一座厂，而是投向脆弱家庭、社会保护和经济机会。项目计划覆盖120000名受益人，支持技能发展、粮食安全、营养、健康、女性经济赋权，并把社会登记系统与流离失所人口、健康保险等数据库连接起来。\n这说明开发资金正在把“帮人”做成一套可识别、可追踪、可评估的系统。真正花钱的地方不只是补助本身，还有受益人识别、数据登记、项目监测、社区服务、金融服务接入和长期就业能力建设。\n普通人的机会在社会保护项目、公益和国际发展项目运营、M&amp;E、数据登记、女性创业支持、粮食安全、健康保险衔接和社区服务。\n投资机构\n投资机构今天的钱，进入私募信贷。\nSagard Credit Partners III完成超过10亿美元首关，目标规模20亿美元。这个基金投向美国和加拿大中型企业直接贷款，重点关注传统私募股权赞助贷款之外的企业。\n私募信贷的逻辑是：一些中型企业需要资金做增长、收购、重组或周转，但不一定适合走公开债市，也未必能从银行拿到足够灵活的贷款。机构资本就通过高级担保融资、定制化契约和持续投后监控来赚取收益。\n这类钱不直接买一家明星公司，而是买一批企业的现金流、抵押品、信用结构和还款能力。\n普通人的机会在直接贷款承做、企业信贷风控、财务建模、抵押品评估、契约设计、投后监控、机构募资和行业研究。\n企业\n企业端今天最值得看的，是AI基础设施的钱从“买算力”转向“管算力”。\nSpectro Cloud完成超过1亿美元Series D，累计融资达到2.6亿美元。领投方是Goldman Sachs Alternatives旗下Growth Equity，AMD Ventures、Ericsson、LG Technology Ventures、Maximus等参与。\nSpectro Cloud做的不是芯片，也不是大模型，而是生产级AI基础设施管理。它的PaletteAI帮助企业、公共部门、neocloud和主权云建设、治理、运行和扩展AI基础设施，覆盖GPU集群、AI工厂、分布式推理、成本控制、安全治理和多环境部署。\n这说明AI的下一段钱，不只投给“更大的模型”，也投给能让模型稳定、合规、低成本跑起来的底层平台。\n普通人的机会在AI基础设施平台、Kubernetes、GPU资源调度、推理成本控制、云原生运维、主权云、公共部门合规、安全治理和系统集成。\n富豪资本\n富豪资本今天看Tilman Fertitta收购Caesars的监管进展。\nCaesars此前公告将由Fertitta Entertainment以全现金交易收购，交易总价值约176亿美元，其中包括约57亿美元现金对价和约119亿美元债务承担，股东现金对价为31美元/股。\n7月15日的新进展是，Fertitta Entertainment两名高级管理人员Richard Liem和Steven Scheinthal已获Nevada Gaming Control Board一致批准，下一步进入7月23日Nevada Gaming Commission最终审议。\n这笔交易还没完全落地。它仍需要反垄断、股东和多个博彩司法辖区批准，Carl Icahn潜在更高竞标也还是变量。\n但方向已经很清楚：富豪资本正在重组稀缺线下体验资产。赌场、酒店、餐饮、体育博彩、会员系统和目的地娱乐正在被放进同一个并购逻辑里。\n普通人的机会在并购整合、酒店收益管理、博彩合规、餐饮集团运营、会员数据、体育娱乐营销、监管事务和债务融资。\n平民消费\n普通人的钱今天看上半年消费结构。\n国家统计局披露，上半年社会消费品零售总额248722亿元，同比增长1.3%；全国网上商品和服务零售额100715亿元，同比增长5.2%；网上商品零售额64296亿元，增长4.8%；网上服务零售额36419亿元，增长6.0%。\n增长比较清楚的地方包括：\n通讯器材类上半年5519亿元，增长14.4%。\n化妆品类2445亿元，增长6.3%。\n粮油食品类12091亿元，增长7.4%。\n饮料类1601亿元，增长6.0%。\n餐饮收入28255亿元，增长2.8%。\n便利店和超市零售额分别增长6.6%和3.8%。\n承压的地方也很明显：汽车类上半年19688亿元，下降12.6%；家用电器和音像器材类5437亿元，下降7.4%；建筑及装潢材料类609亿元，下降8.8%。\n昨日较热消费品牌：\n中国品牌和平台：京东、天猫 / 淘宝、拼多多、美团、抖音电商、华为、小米、泡泡玛特、瑞幸、霸王茶姬\n国际和跨境相关品牌：Apple、Samsung、Nike、Adidas、Lululemon、Sephora、Starbucks、Uniqlo、Disney\n今天的更新点不是再重复暑期电影和票根经济，而是看更大的消费结构：线上服务、线上商品、通讯器材、化妆品、食品饮料和便利零售仍有增长，汽车、家电和建材链条明显承压。\n普通人的机会在电商转化、线上服务、本地生活、通讯器材渠道、美妆品牌、食品饮料、便利零售、会员运营和供应链效率。\n高薪职位\n中国高薪岗位：\n\nAI Agent记忆系统 / AI基础设施架构师：人民币40000至90000元/月。BOSS直聘公开样本显示，AI Agent记忆系统工程师/架构师-基础设施可到60-90K·15薪，AI平台系统工程师和高级AI通信系统工程师多在40-70K区间。\n生产AI基础设施平台工程师：人民币35000至80000元/月。企业需要的不只是模型调用，而是GPU集群、Kubernetes、多云、推理成本、治理和安全的稳定生产系统。\n私募信贷 / 直接贷款投资经理：人民币30000至90000元/月。中型企业直接贷款需要承做、风控、契约设计和投后监控人才。\n数据中心commissioning / 关键设施电气工程师：执行岗公开样本常见10-30K/月，业主代表、项目管理、commissioning、海外和大型关键设施岗位会明显更高。\n跨境电商 / 线上服务增长负责人：人民币25000至90000元/月。深圳、亚马逊、品牌出海和P&amp;L负责人口径的岗位更高。\n社会保护项目数据 / M&amp;E / 项目运营：人民币15000至50000元/月。开发资金项目需要受益人识别、社会登记系统、项目监测评估和社区落地。\n博彩酒店并购整合 / 会员数据 / 收益管理：人民币25000至80000元/月。线下娱乐资产的价值来自会员、酒店、餐饮、博彩合规和跨区域运营。\n\n国际高薪岗位：\n\nAI Engineer：美国平均base约184757美元/年，总补偿约211243美元/年。\nData Center Commissioning Engineer：美国median约113033美元/年，经验、差旅、加班和mission-critical项目会显著抬高总包。\nDirector of E-Commerce：美国平均base约143265美元/年，样本区间约96446至212811美元/年。\nPrivate Credit / Direct Lending Associate：头部私募信贷平台重视财务建模、尽调、契约和行业研究，奖金弹性取决于平台和交易。\nGaming / Hospitality M&amp;A and Revenue Management：大型博彩酒店并购整合需要监管、财务、收益管理、会员增长和多地点运营经验。\n\n今日结论\n今天的钱集中在“让系统继续运行”的地方。\n央行维护银行短端流动性，World Bank投向脆弱家庭和社会保护执行系统，Sagard把机构资本放进中型企业私募信贷，Spectro Cloud把AI算力变成可管理的生产基础设施，Fertitta继续推进博彩酒店资产私有化，普通消费者的钱则继续流向线上商品、线上服务、通讯器材、化妆品、食品饮料和便利零售。\n普通人的机会不是追单个大数字，而是进入这些系统的连接岗位：资金面、社会保护数据、私募信贷风控、AI基础设施平台、数据中心调试、电商增长、酒店博彩合规和会员运营。\n"},{"title":"谁在花钱日报｜2026-07-15",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-15/",
"date":"2026-07-15",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-15/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-15/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-15/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-15/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-15/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-15/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-15/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-15/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中国银行体系中期流动性、泰国低碳城市和碳市场平台、下一代另类资产管理人、施工机器人和关键基础设施、稀有病特药渠道、家族基金会和慈善资本治理、暑期电影票根经济，以及AI金融工作流 / 施工机器人 / 数据中心 / 碳市场 / 特药渠道 / 票务增长高薪岗位”。\n政府\n今天政府端最清晰的花钱信号，是央行把14000亿元中期流动性投进银行体系。\n7月15日，中国人民银行将开展14000亿元买断式逆回购操作，期限为6个月（184天），到期日为2027年1月15日。\n这笔钱不是直接发给居民，而是先进入银行体系和债券市场。它影响的是银行中期资金来源、同业存单、政府债缴款、回购利率、债券配置和企业融资成本。\n前几天的7天期逆回购更像短端润滑，今天的6个月买断式逆回购则更像给银行体系补一段更长的资金底盘。资金面越稳定，银行、券商、基金、保险和企业融资链条越容易运转。\n普通人的机会在资金交易、债券交易、银行同业、流动性管理、资产负债管理、利率风险控制和金融数据监测。\n国际政府与开发资金\n开发资金今天看泰国。\nWorld Bank批准了泰国2亿美元 Low Carbon Cities and Carbon Market Development Project。这个项目的关键不是单个电站，而是把公共建筑节能、屋顶光伏、能源服务公司融资和碳市场连接起来。\n公共组织不需要一次性承担全部改造成本。能源服务公司先融资、先交付，公共组织再按服务付费。Krungthai Bank则负责聚合碳信用并连接碳市场。\n项目预计支持最多180MW可再生能源容量，每年节电约448GWh，并在执行期创造至少1800个job-years。\n这说明开发资金正在把许多小而散的节能项目打包成可融资、可复制、可交易的城市低碳平台。\n普通人的机会在ESCO项目开发、公共建筑节能、碳信用MRV、屋顶光伏、绿色贷款、节能审计、能源数据和城市低碳改造。\n投资机构\n投资机构今天的钱，投向“管理钱的人”。\nWafra宣布 Constellation Generation V 最终关闭，规模20亿美元，超过15亿美元原募资目标。\n这类GP stakes策略不是直接买一家工厂或一家软件公司，而是给新兴和成长中的另类资产管理公司提供资本、少数股权投资、机构LP背书和业务支持。\n换句话说，资本市场不只在买资产，也在买资产管理能力。一个优秀的新基金管理人，如果有交易能力、投后能力和募资能力，本身也可以成为被投资的资产。\n普通人的机会在GP stakes、机构募资、基金运营、投后增值、LP关系、财务合规、管理公司战略和另类资产数据。\n企业\n企业端今天最有代表性的花钱方向，是把AI和机器人带进施工现场。\nTerraFirma完成约1.15亿美元融资，其中1亿美元为Series A，由Kleiner Perkins领投，Bain Capital Ventures等参与。\n这家公司由前SpaceX工程师创立，方向是半自动重型施工设备。它把挖掘机、推土机、装载机、压路机等设备改造成可远程指挥的半自动机器人，让操作员不必坐在驾驶室里，而是在指挥中心调度多台设备。公司称，这套系统可以让操作员效率最高提升300%。\n这说明AI资金正在离开纯软件界面，进入土方、供电、住房、工厂、学校和政府基础设施现场。真正值钱的不只是模型，而是“软件+硬件+作业流程+安全责任”的全栈交付。\n普通人的机会在施工机器人、重型设备自动化、远程运维、工程项目管理、场地测绘、BIM/VDC、关键基础设施施工、能源站点建设和政府项目履约。\n富豪资本\n富豪资本今天的看点，是Warren Buffett的年度捐赠方向变化。\nBuffett今年约60亿美元Berkshire股票捐赠不再包括Bill &amp; Melinda Gates Foundation，而是转向四个家族相关基金会：Susan Thompson Buffett Foundation、Sherwood Foundation、Howard G. Buffett Foundation和NoVo Foundation。\n这不是简单的“捐了多少钱”，而是公益资本治理结构的变化。过去很大一部分资金进入一个超大型公共基金会，现在更多交给家族治理平台。\n当资金流向变了，拨款策略、项目评估、地区选择、教育医疗议题和非营利组织关系都会改变。\n普通人的机会在基金会项目官、公益评估、教育和医疗项目运营、捐赠者服务、家族办公室治理、影响力投资和非营利数据。\n平民消费\n普通人的钱今天继续流向暑期电影，但已经不是单纯买一张电影票。\n2026年暑期档电影总票房已超过30亿元，猫眼档期页显示档期票房继续上行。热门内容包括《功夫女足》《给阿嬷的情书》《玩具总动员5》等。\n电影正在带动一条更长的消费链：影院餐饮、IP周边、票根联动景区和商圈、酒店民宿、亲子研学、暑期夜游、演出和本地生活套餐。\n昨日较热消费品牌：\n中国品牌和平台：猫眼、淘票票、美团、携程 / Trip.com、大麦、支付宝、中国银联、12306 / 中国铁路\n国际和跨境相关品牌：Disney / Pixar、Universal / Illumination、IMAX、Booking、Airbnb、Apple、Sony Pictures\n今天的更新点不是再重复文旅消费券，而是电影票根经济继续证明：内容IP可以把人带到商圈、景区、酒店、餐饮和本地服务里。\n普通人的机会在电影宣发、票务增长、IP联名、商圈联动、酒店收益管理、景区二消、亲子研学、本地生活履约和内容运营。\n高薪职位\n中国高薪岗位：\n\n金融AI / 保险AI工作流 / Agent平台工程师：人民币40000至90000元/月。金融机构和保险公司要的不只是聊天机器人，而是客户资料、承保、开户、理赔、合规和决策系统。\n施工机器人 / 自动化重型设备 / 机器人控制工程师：人民币30000至80000元/月。施工现场、无人矿卡、工程机械电控和自动驾驶感知正在交叉。\n数据中心电气 / Commissioning / 关键设施工程师：人民币20000至60000元/月。AI数据中心和能源改造项目继续推高电力、调试、冷却和可靠性人才价值。\n碳市场 / ESCO项目经理 / 能源项目融资：人民币25000至70000元/月。公共建筑节能、屋顶光伏、碳信用聚合和绿色贷款需要既懂项目又懂金融的人。\n稀有病特药渠道 / 药房网络 / 医药市场准入：人民币30000至90000元/月。罕见病药房、有限分销网络、患者服务和药企渠道正在变成资本重点。\nGP stakes / 机构募资 / 基金运营 / 并购尽调：人民币30000至90000元/月。另类资产管理人本身成为可投资资产，懂LP关系、管理公司经济模型和合规的人更有议价权。\n电影票务增长 / IP联名 / 文旅本地生活运营：人民币18000至60000元/月。暑期档票房和票根经济继续推高内容宣发、平台转化、商圈联动和酒店景区二消岗位需求。\n\n国际高薪岗位：\n\nAI Engineer：美国平均base约184757美元/年，总补偿约211243美元/年。\nData Center Commissioning Engineer：美国median约113033美元/年，mission-critical senior角色可达250000至300000美元/年。\nRenewable Energy Financial Analyst / Project Finance：美国平均约174046美元/年，样本区间约99770至303617美元/年。\nSpecialty Pharmacy Networks Account Director：美国远程岗位薪资区间146250至211250美元/年。\nConstruction Robotics / Autonomy Engineer：头部融资公司会用高薪和股权争夺既懂机器人又懂现场工程的人。\n\n今日结论\n今天的钱集中在“把系统跑起来”的地方。\n央行给银行体系中期流动性，World Bank给公共节能项目融资模型，Wafra给资产管理人本身供血，TerraFirma把机器人带进施工现场，Warburg Pincus押注稀有病特药渠道，Buffett把慈善资本交给家族基金会，普通消费者则把钱花在电影、IP、票根和线下体验的组合上。\n普通人的机会不是盯着单个大数字，而是进入这些系统的连接岗位：资金、能源、碳市场、施工、设备、药房渠道、合规、项目交付、票务增长和本地履约。\n"},{"title":"谁在花钱日报｜2026-07-14",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-14/",
"date":"2026-07-14",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-14/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-14/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-14/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-14/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-14/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-14/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-14/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-14/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“短端流动性和银行间市场、全球气候融资和能源转型、中端实体企业并购、AI数据中心和地方基础设施、线下娱乐资产与数字博彩入口、暑期电影文旅交通消费，以及AI基础设施 / 数据中心 / 先进封装 / 气候金融 / 并购 / 文旅增长高薪岗位”。\n政府\n今天政府端最清晰的花钱信号，是央行把2365亿元短期流动性投进银行体系。\n7月14日，中国人民银行以固定利率、数量招标方式开展2365亿元7天期逆回购操作，全额满足一级交易商需求。\n这笔钱不是直接发到居民手里，而是先进银行间市场。它影响的是短端资金价格、回购利率、银行流动性、债券交易和机构的资金成本。\n如果把财政部前一天安排的国债招标看成中长期融资，那么今天的逆回购更像是短端润滑。它让银行、券商、基金、保险和企业短期融资链条继续运转，也会影响债券基金、银行理财、质押回购、同业拆借和企业票据融资。\n普通人的机会在货币市场交易、流动性管理、银行同业、债券基金、资金清算、利率风险控制和金融数据监控。\n国际政府与开发资金\n开发资金今天最大的数字，是多边开发银行把气候融资推到新高。\nEBRD披露的多边开发银行联合报告显示，2025年MDB气候融资在全部运营国达到1630亿美元，其中低中收入国家为1030亿美元，同比增长21%。低中收入国家的适应融资升至350亿美元，缓解融资升至680亿美元；私人资本动员也达到350亿美元。\n这说明开发资金正在从单个电站、公路、供水项目，扩展成一整套气候资金系统。它既要投可再生能源、输电网和减排项目，也要投洪水韧性、城市适应、水资源、农业和灾害风险管理。\n更重要的是，开发银行不只自己放款，还要把私人资本拉进来。风险分担、担保、混合融资、项目评级、碳核算和长期收益模型，正在成为气候项目能不能落地的关键。\n普通人的机会在气候金融、项目融资、能源审计、碳核算、适应型基础设施、自然风险建模、ESG数据和开发银行项目管理。\n投资机构\n投资机构今天不是给AI创业公司写支票，而是继续把钱投向中端实体企业。\nCitation Capital宣布首期基金关闭。Citation Fund I拿到11亿美元第三方LP承诺，达到硬上限；加上GP和关联方承诺后，总可投资本为12亿美元。含共同投资资本，Citation管理资产达到21亿美元。\n这只基金的钱来自养老金、主权财富基金、保险公司、FOF、捐赠基金、基金会和家族办公室。它已经投了四家公司：Cibo Vita、Aptive Environmental、Gallo Mechanical和World Travel Holdings。\n这类资金的方向很明确：买创始人和家族企业，尤其是服务业、工业和选择性消费领域里已有现金流、已有客户、但还需要资本、管理和接班方案的公司。\n普通人的机会在并购尽调、投后运营、财务规划、工业服务、旅游服务、消费品牌、供应链、家族企业交接和中端公司数字化。\n企业\n企业端最硬的花钱信号，是Meta把AI算力变成一整套地方基础设施。\nMeta计划把路易斯安那Richland Parish的Hyperion AI数据中心扩展到5GW容量，并在当地投入最高500亿美元。公司还承诺投入10亿美元改善道路、水和污水系统，称已经与本地公司签约超过16亿美元。\n这不是单纯多买几批GPU。5GW级别的数据中心意味着电力、土地、道路、水务、冷却、变电站、施工、调试、储能、地方税收和社区关系都会被卷进来。Meta还将与Entergy合作，配套天然气发电厂、电网级电池、核电增容和购电安排。\nAI基础设施的竞争正在从模型参数和芯片数量，转向谁能更快拿到电、建成园区、管住成本、稳定供能、处理地方关系，并把算力卖成云服务。\n普通人的机会在数据中心电气、关键设施、施工管理、能源调度、环境合规、水务、地方政府事务、AI云商业化和数据中心运维。\n富豪资本\n富豪资本今天的看点，是Barry Diller继续推进对MGM Resorts的收购。\nPeople Inc.已经持有MGM约26%股份，并提出以每股48.30美元收购剩余股份。按报道口径，这相当于给MGM股权估值约124亿美元，含债估值超过180亿美元。MGM已经设立特别委员会评估，Diller方面也在寻求JPMorgan等融资支持。\n这笔交易还没有落地，但它说明富豪资本正在重新看待线下娱乐资产。赌场、酒店、演出、餐饮、会员、体育赛事和线上娱乐，不再只是重资产生意，也可能被打包成一个数据、流量和体验入口。\n如果线下客流下滑、线上博彩竞争加剧，最值钱的不是某一家酒店，而是能把用户从线下住宿、餐饮、演出、体育和数字娱乐之间反复转化的系统。\n普通人的机会在酒店收益管理、线上娱乐增长、会员数据、体育娱乐IP、并购融资、用户运营和线下体验产品。\n平民消费\n普通人的钱今天继续流向暑期体验消费，但结构比“旅游热”更复杂。\n截至7月13日13时14分，2026年暑期档电影总票房超过30亿元。《给阿嬷的情书》《功夫女足》《玩具总动员5》暂列暑期档票房前三。全国暑期文旅消费季则从7月初持续到8月底，各地计划举办超3万场次文旅消费活动，发放超4.5亿元消费券等补贴。\n交通端也在放大这条消费链。全国铁路暑运预计62天发送旅客10.1亿人次；深圳铁路暑运前十天发送旅客243.67万人次，累计到发旅客498.46万人次。\n这说明暑期消费不是单独看电影、单独住酒店、单独坐火车，而是“内容+出行+本地体验”的组合：电影票根带动商圈和景区，平台补贴带动酒店民宿和出行，铁路和航空客流把人送到目的地，亲子、研学、夜游、演出和赛事再承接二次消费。\n昨日较热消费品牌：\n中国品牌和平台：美团、支付宝、中国银联、大麦、滴滴、携程 / Trip.com、猫眼、淘票票、12306 / 中国铁路\n国际和跨境相关品牌：Disney / Pixar、IMAX、Universal、Booking、Airbnb、Apple、Sony Pictures\n普通人的机会在电影宣发、票务增长、亲子研学、酒店收益管理、本地生活履约、短视频种草、景区二消、交通枢纽商业和文旅活动运营。\n高薪职位\n中国高薪岗位：\n\nAI Infra / AI Agent Infra工程师：人民币50000至100000元/月。BOSS直聘可见AI Agent Infra 50-70K、AI Infra负责人50-80K·15薪；猎聘可见AI Infra 70-100K；职友集可见30-60K·18薪和35-65K样本。\n数据中心电气 / 配电 / 关键设施工程师：人民币20000至60000元/月。BOSS直聘可见数据中心电气20-30K、储能配电高级工程师/专家40-60K·18薪。\n先进封装 / 半导体设备 / HBM相关工程师：人民币30000至100000元/月。猎聘可见先进封装/检测设备系统总工80-100K·16薪、先进封装工艺资深研究员20-35K·14薪。\n气候融资 / 能源项目财务 / ESG数据：人民币25000至70000元/月。开发银行和气候资金放大后，项目融资、碳核算、适应型基础设施和风险分担人才更值钱。\nPE并购 / 投后运营 / 家族企业交接顾问：人民币30000至90000元/月。中端私募基金继续买服务、工业和消费公司，懂财务、运营和行业的人更吃香。\n文旅票务增长 / 线上娱乐 / 酒店收益管理：人民币18000至60000元/月。暑期消费从流量补贴进入“内容+票务+会员+线下履约”阶段。\n\n国内扫描来源覆盖BOSS直聘、职友集、猎聘、看准网和公开薪资聚合页面。BOSS更适合看岗位能力要求，猎聘更适合看中高端薪资样本，职友集和看准网用于交叉观察行业中位。\n国际高薪岗位：\n\nAI Infrastructure Engineer：美国平均约127000美元/年，头部岗位约175000至250000美元/年，部分HPC和存储岗位可见170000至253000美元/年。\nAI Engineer / Machine Learning Engineer：美国平均base约184000美元/年，总现金补偿约211000美元/年，头部平台叠加股权更高。\nData Center Electrical / Commissioning / Critical Facilities Engineer：美国约120000至250000美元/年，5GW级数据中心项目会推高电力、调试和运维人才价格。\nAdvanced Packaging / Semiconductor Equipment Engineer：美国、韩国和中国头部厂商约120000至300000美元/年等值区间，资深制程、封装、设备和良率岗位更高。\nTrade / Project Finance Specialist：美国平均约74000美元/年，纽约金融与贸易结算高端样本约100000至200000美元/年。\n\n今日结论\n今天的钱集中在一个主题：系统性承载能力。\n央行的2365亿元逆回购是在维护金融系统的短端运转；MDB的1630亿美元气候融资是在建立全球气候资金系统；Citation的12亿美元基金是在承接中端企业交接系统；Meta的500亿美元Hyperion项目是在把AI算力落进电力、水务和地方建设系统；Barry Diller押注MGM，是想把线下娱乐资产和线上娱乐入口放进同一个系统；普通人的暑期消费，也正在从单点门票变成电影、交通、平台补贴、酒店、商圈和本地体验的转化系统。\n普通人的机会不在旁观“谁又花了多少钱”，而在进入这些系统的关键岗位：会管资金、项目、电力、合规、数据、票务、会员、运营和本地履约的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-13",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-13/",
"date":"2026-07-13",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-13/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-13/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-13/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-13/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-13/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-13/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-13/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-13/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中央财政融资、西非中小企业贸易金融、法律与基础设施 AI、AI 内存产能、富豪与专业服务资本、暑期文娱消费，以及 AI / 半导体 / 合规 / 贸易金融 / 文旅复合型高薪岗位”。\n政府\n今天政府端最清晰的花钱信号，是财政部把 1600 亿元债券融资排进本周招标窗口。\n7 月 14 日上午，财政部将招标两只国债。第一只是 20 年期超长期特别国债，竞争性招标面值总额 300 亿元；第二只是 1 年期记账式附息国债，竞争性招标面值总额 1300 亿元。\n这两笔钱的期限含义不同。300 亿元 20 年期超长期特别国债，更像是跨周期项目和长期财政资金池；1300 亿元 1 年期国债，则更像是短端财政融资、机构流动性配置和利率曲线定价工具。\n合在一起看，财政的钱继续从“年度预算”进入“债券市场基础设施”，由银行、券商、基金、保险和交易所体系承接，再影响债券基金、银行理财、机构久期配置、质押回购和企业融资成本。\n普通人的机会在国债承销、债券交易、固收投研、银行资产负债管理、财政债务数据、金融科技、清算托管、监管报送和利率风险管理。\n国际政府与开发资金\n开发资金今天的看点不在大型公路或电站，而在西非中小企业的贸易金融。\nEBRD 宣布，向 Ecobank Senegal 提供最高 1500 万欧元贸易融资便利，这是 EBRD 在 Senegal 的首个贸易融资便利项目。资金将帮助 Ecobank Senegal 为进口、出口和中小企业客户提供贸易融资支持，并通过 EBRD 的确认行网络降低政治和商业付款风险。\n紧接着，EBRD 又宣布在 Senegal 正式启动 SME 支持。它给出的工具箱不是单一贷款，而是信贷额度、微小企业组合风险分担、中型企业个别风险分担、供应链金融、咨询服务和政策对话。\n这笔钱说明，开发资金正在从“修项目”转向“修融资通道”。如果一个本地企业拿不到外贸授信、保函、信用证和周转资金，它就很难进入区域贸易和全球供应链。\n普通人的机会在贸易融资、国际结算、供应链金融、银行风控、信用证/保函、外贸单证、企业咨询、非洲区域贸易、法语区市场运营和中小企业数字化。\n投资机构\n投资机构今天继续给 AI 写大支票，但钱的方向更具体：一个是让 AI 进入法律和监管，另一个是让企业自己训练 AI。\nNorm Ai 完成 1.2 亿美元 Series C，估值 12 亿美元，由 Khosla Ventures 领投。公司称其客户代表的资产管理规模超过 30 万亿美元，产品方向是把法律条文、律师监督和 AI agents 结合起来，服务企业法务、资管、并购、监管合规和高风险 AI 部署。\nPrime Intellect 完成 1.3 亿美元 Series A，领投方为 Radical Ventures，NVIDIA Ventures、Intel Capital、Dell Technologies Capital 等参与，投后估值约 10 亿美元。它提供计算力、训练框架、强化学习和评测工具，让企业不用完全依赖少数闭源模型供应商，也能训练和部署自己的 AI agents。\n这两笔钱放在一起看，资本正在从“模型能力更强”转向“谁能把 AI 放进真实制度和真实生产系统”。Norm Ai 买的是法律可信度、律师监督和监管接口；Prime Intellect 买的是算力、训练栈、评测和企业私有智能。\n普通人的机会在 legal AI、合规自动化、法律产品经理、AI agent 工程、RL infrastructure、模型评测、GPU 调度、企业私有化部署、售前解决方案和 regulated workflow 咨询。\n企业\n企业端今天最硬的花钱信号，是 AI 内存把 SK Hynix 推成一场资本市场大事件。\nSK Hynix 7 月 10 日在美国市场通过 ADR 融资约 265 亿美元，ADR 定价 149 美元，上市首日上涨。这是 AI 芯片周期里一次非常典型的上游融资：企业不是为了讲 AI 故事，而是为了扩充 HBM、高速 DRAM、先进封装、封测设备、电力、洁净厂房和长期资本开支。\n这笔钱说明，AI 基础设施的竞争正在更上游化。谁能稳定供应 HBM，谁就更靠近 AI 基础设施利润池；谁能做设备、材料、制程、封装、良率、测试和供应链交付，谁就更靠近 AI 烧钱的底层订单。\n普通人的机会在 HBM 制程、先进封装、半导体设备、良率工程、存储产品管理、供应链计划、厂务工程、电力暖通、芯片测试、韩国/美国半导体项目管理和资本市场 IR。\n富豪资本\n富豪资本今天不是单独捐款，也不是政治攻防，而是跟资管、法律和企业服务资本一起进入 AI 法律系统。\nNorm Ai 披露，本轮除 Khosla Ventures 外，Blackstone、Bain Capital Ventures、Craft Ventures、Coatue、Vanguard、New York Life、TIAA、Tony James、Jeff Hammes 和 Fenwick LLP 等也参与。Tony James 是 Blackstone 前总裁和 COO，Jeff Hammes 是 Kirkland &amp; Ellis 前主席，Fenwick 则是硅谷法律服务的重要玩家。\n这类钱的含义是，富豪和专业服务精英不只在投资“AI 替代律师”，更在投资“AI 如何被法律监督”。当企业把 AI agents 放进投研、交易、法务、并购、客户服务和内部审批时，真正值钱的不是会回答问题的模型，而是能证明它合规、可审计、可追责、可由人类专家监督的系统。\n普通人的机会在高端法律服务、合规科技、AI 治理、模型审计、资管法务、基金合规、并购文件自动化、律师工作流产品、数据安全和企业风险管理。\n平民消费\n普通人的钱今天继续流向暑期文旅和电影，但更有意思的是：补贴不少，消费者仍然更挑内容。\n2026 年全国暑期文化和旅游消费季从 7 月初持续至 8 月底，各地将举办超 3 万场次文旅消费活动，发放超 4.5 亿元消费券等补贴。银联、支付宝、大麦、滴滴、美团等平台分别围绕景区门票、酒店民宿、演出、出行和夏季旅游产品推出优惠。\n但电影消费给出了另一个侧面。暑期档从 6 月 1 日到 8 月 31 日，赛程接近一半；截至 7 月 12 日 15 时，暑期档票房收入为 28.31 亿元，同比下滑 8%。仅靠降价救不了暑期档电影票房，观众真正买单的是内容质量、口碑、题材和体验。\n这说明居民文娱消费不是没有钱，而是钱更谨慎。消费券能降低门槛，平台补贴能提高转化，但如果电影、景区、演出和城市活动本身没有足够强的内容和社交传播，低价票也很难持续拉动复购。\n昨日较热消费品牌：\n中国品牌和平台：美团、支付宝、中国银联、大麦、滴滴、携程 / Trip.com、猫眼、淘票票、万达电影、横店影视\n国际和跨境相关品牌：Disney、Universal、IMAX、Netflix、Booking、Airbnb、Apple、Sony Pictures\n普通人的机会在文旅 IP、电影宣发、票务增长、酒店民宿运营、演出活动、亲子研学、夜游策划、短视频种草、本地生活履约、OTA 运营和线下体验产品经理。\n高薪职位\n中国高薪岗位：\n\nAI Agent / 企业 AI 应用工程师：人民币 25000 至 100000 元/月，一线城市和头部样本可达 70-100k。\nAI Infra / RL Infrastructure / GPU 通信工程师：人民币 40000 至 100000 元/月。企业自训 agent 需要训练框架、评测、GPU 调度、通信和稳定性人才。\nLegal AI / RegTech / 合规产品工程师：人民币 25000 至 80000 元/月。法律、合规和 AI agent 监督正在成为高价值企业服务市场。\nHBM / 先进封装 / 半导体设备工程师：人民币 30000 至 90000 元/月，资深制程、良率、封测和设备岗位更高。\n贸易金融 / 供应链金融 / 银行风控产品经理：人民币 25000 至 70000 元/月。国际贸易融资、信用证、保函、风控和供应链金融仍是中小企业进入全球贸易的关键通道。\n文旅 IP / 电影发行 / 票务增长 / 线下体验运营：人民币 18000 至 60000 元/月。真正稀缺的是能把内容、票务、渠道、达人、商户和现场履约连起来的人。\n\n国内扫描来源覆盖 BOSS 直聘、猎聘、职友集、看准网、腾讯招聘、字节招聘和公开薪资聚合页面。BOSS 更适合看岗位能力要求，猎聘更适合看中高端薪资样本，职友集和看准网用于交叉观察行业中位。\n国际高薪岗位：\n\nMachine Learning Engineer：美国 median total compensation 约 272500 美元/年；Meta Machine Learning Engineer 美国区间约 187000 至 678000 美元/年，median 约 520000 美元。\nAI Infrastructure / RL Infrastructure Engineer：美国约 160000 至 400000 美元/年，顶级 AI infra、GPU systems、distributed training 岗位叠加股权后更高。\nLegal AI / Compliance AI Engineer：美国约 140000 至 300000 美元/年，金融、资管、保险和大型企业合规场景会继续抬高复合型人才价格。\nSemiconductor HBM / Advanced Packaging Engineer：美国、韩国和中国头部厂商约 120000 至 300000 美元/年等值区间，资深制程、封装和设备岗位更高。\nTrade Finance / Supply Chain Finance Specialist：欧美、中东和非洲区域银行约 90000 至 220000 美元/年，高端岗位叠加奖金。\n\n今日结论\n今天的钱集中在一个主题：资金正在寻找“可落地的系统”。\n财政部 1600 亿元国债不是孤立融资，而是财政和债券市场系统；EBRD 在 Senegal 的 1500 万欧元贸易融资不是单笔贷款，而是贸易信用系统；Norm Ai 和 Prime Intellect 的融资不是泛泛买 AI，而是分别押注法律监督系统和企业自训 AI 系统；SK Hynix 的 265 亿美元 ADR 融资不是普通上市，而是 AI 内存供应系统；暑期文旅和电影消费也不是单纯打折，而是内容、IP、票务和线下体验系统的竞争。\n普通人的机会不在旁观“谁又融了多少钱”，而在进入这些系统的执行层：会做固收和财政融资、会做贸易金融、会做 AI agent 与 AI infra、会做法律合规 AI、会做 HBM 和先进封装、会做文旅内容运营的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-10",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-10/",
"date":"2026-07-10",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-10/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-10/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-10/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-10/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-10/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-10/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-10/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-10/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“政府短中端融资、户用屋顶光伏、AI 交互入口、AI 数据中心许可与电力、富豪税制攻防、重启中的文旅资产，以及 AI / 能源 / 债券 / 文旅复合型高薪岗位”。\n政府\n今天政府端最清晰的花钱信号，是财政部继续通过记账式国债把中央财政融资放进市场。\n财政部安排 2026 年记账式附息（十三期）国债第一次续发行，品种为 2 年期固定利率附息债，竞争性招标面值总额 1300 亿元，票面利率 1.21%。这类钱不是项目拨款，而是政府融资和金融机构资产配置的基础设施。\n1300 亿元短中端国债会进入银行、券商、基金、保险和交易所市场，成为流动性管理、利率定价、质押回购、债基组合、银行表内资产和保险资金久期配置的一部分。对普通人来说，它会间接影响债券基金收益、银行理财净值、贷款利率预期和企业融资成本。\n普通人的机会在国债承销、债券交易、银行资产负债管理、基金投研、清算托管、金融科技、监管报送、利率风险管理和财政债务数据分析。\n国际政府与开发资金\n开发资金今天继续从“大型基础设施”下沉到家庭能源资产。\nWorld Bank 批准融资支持印度 PM Surya Ghar 户用屋顶光伏计划。融资包包括 8.2 亿美元 IBRD 贷款、6000 万美元 Clean Technology Fund 优惠贷款和 1000 万美元赠款，合计 8.9 亿美元。World Bank 同时预计该计划将撬动 42 亿美元私人商业贷款，支持 1000 万城乡家庭安装屋顶光伏，并在可再生能源制造、安装和服务链条创造约 170 万个就业机会。\n这笔钱的意义在于，开发性金融不只修电网和大电站，也开始把家庭屋顶、免抵押贷款、分销商能力、供应商认证、本地制造和安装服务纳入金融基础设施。居民得到的是低电费和分布式电力，银行得到的是可规模化的绿色零售贷款，制造商和安装商得到的是订单，政府得到的是能源转型和就业。\n普通人的机会在户用光伏销售、现场勘测、屋顶结构评估、逆变器和组件供应、安装队管理、分销商运营、绿色金融产品、信用评估、售后运维和家庭能源管理。\n投资机构\n投资机构今天继续用九位数美元支票抢 AI 的“交互入口”和“企业流程入口”。\nGradium 是一家巴黎 AI voice startup，seed round 累计达到 1 亿美元，新投资人包括 Nvidia。它的方向是超低延迟语音模型，让 AI 语音代理能更接近即时对话，并计划用资金在 Bay Area 开办公室、争夺 AI 人才。\nLyzr 则是企业 AI agent 公司，完成约 1 亿美元 Series B，估值约 5 亿美元。它的标志性细节是让自家 agent 系统参与融资流程：回答投资人问题、生成投资备忘录、追踪投资人对材料的关注点，并获得来自硅谷、中东和金融投资者的融资兴趣。\n这两笔钱放在一起看，资本不是只买“更大的模型”，而是在买两个更靠近收入的环节：一个是人机交互入口，也就是语音、客服、车载、呼叫中心和实时助手；另一个是企业流程入口，也就是销售、融资、投研、客服、内部自动化和知识工作流。\n普通人的机会在 voice AI、音频模型、低延迟推理、agent orchestration、企业工作流、AI 产品经理、售前解决方案、数据标注、客户成功和行业场景落地。\n企业\n企业端今天最有价值的信号，不是又一个“砸钱建数据中心”，而是 AI 数据中心的钱开始被电力、水、社区许可和地方政治卡住。\n市场评论口径称，美国社区在 2026 年前三个月已阻止或延迟超过 1300 亿美元 AI 数据中心项目。典型案例包括 Google 撤回印第安纳州 Franklin Township 附近约 10 亿美元项目，Tucson 市议会反对 Amazon “Project Blue” 36 亿美元数据中心园区。多个州和城市围绕电费、水资源、土地、噪音和地方财政收益重新审视数据中心许可。\n反过来，已经锁定低成本电力、并提前拿到许可的数据中心资产开始更值钱。Bitzero 在挪威和芬兰控制超过 1GW 低成本清洁电力容量，并与 OneQode 签署 15 年、约 26 亿美元的 Namsskogan 场地租约。这个案例的关键不是某一只股票，而是 AI 基建的约束已经从 GPU 采购，转向电力、土地、水、许可、社区沟通和长期租约。\n普通人的机会在数据中心选址、电力接入、PPA、输配电工程、暖通冷却、水资源管理、社区关系、公共事务、土地法务、环境影响评估和项目融资。\n富豪资本\n富豪资本今天不是投公司，也不是做慈善，而是在投税制攻防。\n加州 11 月将就 proposed billionaire tax 投票，科技富豪和企业精英已投入超过 1.2 亿美元，试图削弱或阻止这项针对州内居民及资产超过 10 亿美元信托的一次性 5% 财富税。Sergey Brin 是最大出资者，已向 Building a Better California 捐出 8200 万美元；John Doerr 捐 1000 万美元；Chris Larsen 及 Ripple 相关资金合计至少 1250 万美元；Michael Moritz 捐 750 万美元；Patrick Collison 捐 700 万美元；Eric Schmidt 捐约 302.6 万美元；Peter Thiel 则向 California Business Roundtable 的政治部门捐 300 万美元。\n这类钱的目标不是直接买资产，而是影响财富规则本身。对富豪而言，税制、迁居、信托、政治捐赠、州法和资产所在地，都是资本配置的一部分。对公共财政而言，这是一个反向信号：当政府试图向极高净值人群征税，富豪资本会用组织化政治支出、法律策略和舆论动员防御。\n普通人的机会在税务咨询、信托与家族办公室、政治合规、竞选财务、公共政策研究、州税规划、法务、数据传播和高净值客户服务。\n平民消费\n普通人的钱今天继续流向暑期文旅，但更具体的看点是一个重金文旅资产重新开门迎客。\n张家界大庸古城项目计划 2026 年 7 月 10 日正式迎客。这个项目过去是典型重资产文旅案例：历史投资规模约 24.43 亿元，试营业以来曾长期亏损；后来张家界与电广传媒、芒果超媒等共同设立合资公司，由张家界芒果文旅负责提质改造与联合运营，提质改造和实际经营投资控制在 1.8 亿元以内。\n这不是单纯的“景区开业”，而是一次文旅资产再定价：过去的钱花在仿古建筑和重资产开发上，但消费者不买账；现在的钱花在 IP、内容、夜游、沉浸式体验、街区改造、飞行影院、主题民宿和运营团队上。暑期游客如果愿意为夜间体验、亲子内容、社交传播和综艺化场景买单，这类资产才有可能从沉没成本变成现金流入口。\n昨日较热消费品牌：\n中国品牌和平台：芒果文旅、芒果超媒、电广传媒、张家界、美团、携程 / Trip.com\n国际和跨境相关品牌：Disney、Universal、Booking、Airbnb、Trip.com 国际站、Apple\n普通人的机会在文旅 IP 运营、夜游策划、演艺和沉浸式内容、酒店民宿、景区餐饮、票务渠道、OTA 运营、短视频种草、亲子研学、商户招商和本地服务履约。\n高薪职位\n中国高薪岗位：\n\nAI Agent / 企业 AI 应用工程师：人民币 20000 至 100000 元/月，头部样本可达 70-100k·15 薪。高薪来自 agent 工程化、工作流编排、企业系统集成和业务场景落地。\nAI 集群网络 / GPU 通信工程师：人民币 30000 至 100000 元/月。今天 AI 语音、agent 和数据中心资金继续增加，真正稀缺的是能处理训练集群、推理集群、RDMA、RoCE、存储网络、调度和稳定性的人。\n户用光伏项目经理 / 分布式能源金融产品经理：人民币 18000 至 60000 元/月。World Bank 印度项目对应的是家庭屋顶、银行贷款、组件供应、安装队和售后服务，不只需要工程师，也需要懂金融和渠道的人。\n数据中心电力接入 / 许可 / 公共事务经理：人民币 30000 至 90000 元/月。AI 数据中心被水、电、社区许可卡住后，会沟通地方政府、设计 PPA、协调水资源和环境影响评估的人会更值钱。\n国债交易 / 固收投研 / ALM：人民币 30000 至 90000 元/月，一线机构和资深交易岗位更高。1300 亿元国债续发提醒市场，利率、久期、流动性和监管资本仍是金融机构核心能力。\n文旅 IP 运营 / 夜游项目负责人：人民币 20000 至 70000 元/月。大庸古城这类项目考验的不再是单纯修景区，而是内容、演艺、商户、票务、OTA、私域和现场服务的复合运营。\n\n国际高薪岗位：\n\nSenior Engineer - AI Agents and Systems：美国约 184000 至 356500 美元/年。\nAgentic AI Engineer：美国约 112800 至 257000 美元/年。\nMachine Learning Engineer：美国 median total compensation 约 272500 美元/年；头部公司机器学习岗位可显著更高。\nData Center Power / Critical Facilities / Permitting Manager：美国约 120000 至 250000 美元/年，高端岗位叠加奖金和股权。\nRenewable Energy Finance / Rooftop Solar Program Lead：美国和国际开发项目约 100000 至 220000 美元/年。\n\n今天的钱解释了岗位溢价：1300 亿元国债续发需要固收和 ALM 人才；8.9 亿美元 World Bank 融资需要户用光伏和绿色金融人才；AI 语音和 agent 九位数融资需要工程化落地人才；AI 数据中心受阻需要电力许可和公共事务人才；富豪税攻防需要税务、信托和政治合规人才；大庸古城重启需要内容型文旅运营人才。\n今日结论\n今天的钱集中在一个主题：资金本身不是最稀缺的，能让资金落地的系统才稀缺。\n财政部 1300 亿元国债续发，是政府融资系统；World Bank 8.9 亿美元和 42 亿美元私人融资，是家庭屋顶光伏系统；Gradium 和 Lyzr 的 1 亿美元级融资，是 AI 交互和企业流程系统；AI 数据中心受阻，说明电力、水、许可和社区关系正在变成基础设施系统的硬门槛；加州富豪税攻防，说明富豪资本会把钱投向规则系统；大庸古城重新迎客，则说明文旅重资产必须重新被内容、体验和运营系统激活。\n普通人的机会不在旁观“谁又融了多少钱”，而在进入这些系统的执行层：会做国债和利率、会做户用光伏金融、会做 AI agent 工程化、会做数据中心电力许可、会做税务和信托、会做文旅内容运营的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-09",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-09/",
"date":"2026-07-09",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-09/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-09/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-09/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-09/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-09/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-09/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-09/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-09/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“超长期政府融资、智能交通、前沿技术基金、AI 数据中心、电力与水务配套、儿童投资账户、暑期文旅消费券和 AI / 数据中心 / 固收高薪岗位”。\n政府\n今天政府资金最值得看的信号来自美国财政部的长债供给。\nU.S. Treasury 安排在 7 月 9 日拍卖 220 亿美元 29 年 10 个月期 5% 国债再发行，issue date 为 7 月 15 日，maturity date 为 2056 年 5 月 15 日。这不是“政府今天花了 220 亿美元”，而是财政融资端继续把长期资金锁进国债市场。长债发行规模、拍卖利率和投资者认购结构，会继续影响全球无风险利率、美元资产定价、银行久期管理、保险资金配置和各国政府债融资成本。\n这类钱离普通人很远，但会穿透到房贷利率、养老金资产、保险产品、银行理财、美元债基金、企业融资成本和汇率预期里。对职业机会来说，固定收益交易、债券承销、宏观策略、ALM、久期风险管理、财政债务系统、清算托管、评级和监管科技都会继续需要懂债券和数据的人。\n国际政府与开发资金\n黑山把 3000 万欧元开发资金投向道路智能交通系统。\n黑山政府公告显示，内阁已批准与欧洲复兴开发银行（EBRD）签署贷款协议，用于 Montenegro road network 的 Intelligent Transport Systems Implementation Project，金额最高 3000 万欧元。SeeNews 报道称，黑山与 EBRD 已签署 3000 万欧元贷款合同，用于道路智能交通系统开发和安装。\n这笔钱买的不是一条新路，而是道路网络的“数字控制层”：交通数据采集、道路监控、事故响应、收费和通行效率、跨境道路连接、安全管理和欧盟标准对接。对黑山这类旅游和跨境交通依赖较高的经济体来说，ITS 的价值在于让既有道路更安全、更透明、更适合欧盟一体化。\n普通人的机会在 ITS 系统集成、交通传感器、道路监控、视频分析、收费系统、交通数据平台、项目采购、道路安全咨询、跨境物流、欧洲公共项目合规和现场实施。\n投资机构\n投资机构今天的钱分成两条线：一条押注前沿技术，一条继续收集中型软件和技术服务现金流。\nParadigm 募集 12 亿美元新基金，目标是投资 technical frontier，并从 crypto 扩展到 AI、robotics 和其他 frontier technology。Paradigm 的变化说明，crypto 原生资本不再只押链上应用，而是在寻找 AI、机器人、可验证计算、agentic payments 和软件基础设施之间的新交叉点。\nSerent Capital 同日披露 13 亿美元 Fund VI，用于投资 founder-led software and technology-enabled services companies。它的方向不是追最大模型，而是投 B2B 软件、垂直业务系统、嵌入式支付、AI product innovation 和可持续增长团队。两笔钱合计 25 亿美元，构成一个很典型的 2026 年资本画像：一端追技术边界，一端追可规模化的软件现金流。\n普通人的机会在 AI infra、机器人、加密支付、合规与安全、B2B SaaS 产品经理、行业解决方案、增长运营、客户成功、M&amp;A 整合和 AI 改造传统软件。\n企业\n企业端今天最明确的花钱信号是 Meta 在加拿大开建 AI 数据中心。\nMeta 官方宣布在 Alberta 的 Sturgeon County 开建其加拿大首个数据中心。项目完成后投资额将超过 130 亿加元，并将额外投入约 6000 万加元改善当地道路和水务等基础设施。Meta 预计施工高峰期约 3000 名 construction workers 在场，运营后支持 300 多个岗位。AP 报道补充，该 AI 数据中心约合 91 亿美元，是 Meta 在美国之外最大的设施，将由 Sturgeon County 的 Greenlight Electricity Center 供电；该电厂规模约 932MW，预计 2030 年下半年投运。\n这笔钱说明，AI 公司已经不只是买 GPU，而是在买一整套地方生产条件：土地、电力、燃气电厂、道路、水务、冷却系统、施工队、运营岗位和地方许可。Meta 强调该数据中心会使用闭环液冷和干冷系统，运营冷却不从周边水源取水。AI 基础设施的竞争，已经变成“谁能把电力、散热和地方基础设施同时落地”。\n普通人的机会在数据中心选址、EPC、变电站、燃气电厂、并网、液冷、暖通、消防、水务、道路工程、环境许可、关键设施运维、AI 云销售和本地供应链。\n富豪资本\n富豪资本今天的新动作来自 SpaceX 股权进入儿童投资账户。\nSpaceX 总裁 Gwynne Shotwell 和丈夫 Robert Shotwell 表示，将把一部分 SpaceX 股票捐给 Trump Accounts。公开报道显示，捐赠对象是 200 多万名美国儿童，尤其是低收入地区 11 至 17 岁孩子，每人一股 SpaceX 股票，估算价值超过 3.2 亿美元。\n这笔钱的看点不是“SpaceX 又涨了多少”，而是高估值私人公司股权开始被包装成儿童财富账户和金融教育工具。7 月 7 日已经写过 Trump Accounts 与 Dell 夫妇 62.5 亿美元承诺，今天的新信息是 Shotwell 用 SpaceX 股票做股权型捐赠，把太空公司增长故事直接放进下一代账户。\n普通人的机会在儿童金融账户运营、指数基金和股权托管、税务合规、金融教育、员工股权计划、私有公司股票流动性、公益项目产品化和家庭理财服务。\n平民消费\n普通人的钱继续流向暑期出行和本地体验，但今天的更新点是官方把补贴和活动规模说清楚了。\n2026 年全国暑期文化和旅游消费季从 7 月初持续至 8 月底，各地围绕消夏避暑、滨海度假、夜间经济、游轮游艇、亲子游乐、研学旅行、非遗美食、博物馆游等需求，举办超 3 万场次文旅消费活动，并发放超 4.5 亿元消费券等消费补贴。银联、支付宝、大麦、滴滴、美团等平台也在门票、酒店民宿、演出、Livehouse、暑期自驾、站点巴士、景点游玩和旅游度假上推出优惠。\n这笔钱不是单一“旅游消费”，而是被平台和地方政府拆成了门票、住宿、交通、演出、研学、夜游、赛事、冰雪体验和本地生活核销。消费者看似只是在领券和订票，背后是地方政府、支付平台、OTA、本地生活平台、演出票务平台和景区酒店一起抢暑期现金流。\n昨日较热消费品牌：\n中国品牌和平台：美团、支付宝、银联、滴滴、大麦、携程 / Trip.com\n国际和跨境相关品牌：Disney、Universal、Booking、Airbnb、Apple、Trip.com 国际站\n普通人的机会在 OTA 运营、景区票务、酒店收益管理、演出 Livehouse 运营、本地生活核销、支付营销、赛事旅行、亲子研学、避暑路线设计、夜游项目、短视频种草和跨境游客权益。\n高薪职位\n中国高薪岗位：\n\nAI Infra / 大模型训练推理工程师：人民币 40000 至 120000 元/月，常见 13 至 16 薪。高端样本集中在分布式训练、计算 / 存储 / 网络架构、推理优化和系统稳定性。\n数据中心负责人 / AI 基础设施运维：人民币 80000 至 110000 元/月。岗位要求同时懂电力、暖通、网络、项目交付和客户 SLA。\n数据中心电气架构 / 配储 / 暖通工程师：人民币 20000 至 70000 元/月。一线高端岗位由 AI 数据中心和配储需求拉高，二三线数据中心城市也较当地平均工资有溢价。\n智能交通 ITS / 交通数据工程师：人民币 18000 至 50000 元/月。黑山 EBRD 项目对应的是交通信号、道路监控、视频分析、交通数据平台、项目采购和现场系统集成。\nB2B SaaS AI 产品 / 解决方案负责人：人民币 30000 至 80000 元/月。传统 B2B 软件正在把 AI product innovation、embedded finance、go-to-market 和客户成功变成增长抓手。\n固定收益 / 政府债交易与风控：人民币 30000 至 90000 元/月，一线机构和资深交易 / 研究岗位更高。久期、利率、美元流动性和资产负债管理仍是金融机构核心岗位。\n\n国际高薪岗位：\n\nMeta / Big Tech Infrastructure Engineer：美国约 175000 至 250000 美元/年。\nData Center Technician / Critical Facilities Engineer：美国约 169000 至 386000 美元/年。\nAI Research Scientist / ML Engineer / Production Engineer：美国约 150000 至 328000 美元 base salary。\nITS / Smart Mobility Project Manager：欧洲和国际开发项目约 90000 至 180000 美元/年。\nFixed Income Trader / Rates Strategist / ALM Specialist：美国和全球金融机构约 150000 至 350000 美元/年，奖金波动较大。\n\n今天的钱解释了岗位溢价：220 亿美元美债长端拍卖需要固收和 ALM 人才；3000 万欧元 EBRD ITS 贷款需要智能交通和公共项目交付人才；25 亿美元 Paradigm / Serent 新基金需要前沿技术和 B2B 软件增长人才；Meta 超 130 亿加元数据中心需要电力、冷却、施工和关键设施人才；SpaceX 股票进入儿童账户需要股权托管和金融教育人才；4.5 亿元文旅补贴需要平台运营和线下体验产品人才。\n今日结论\n今天的钱集中在“把长期资本变成可运营系统”。\n美国财政部 220 亿美元长债拍卖补的是政府长期融资锚；黑山和 EBRD 的 3000 万欧元买的是道路网络的数字控制层；Paradigm 和 Serent 合计 25 亿美元新基金把钱投向前沿技术和可规模化软件；Meta 超 130 亿加元数据中心说明 AI 公司正在直接购买地方电力、道路、水务和冷却条件；Shotwell 夫妇的 SpaceX 股票捐赠把私人公司股权放进儿童投资账户；普通消费者的钱则被 4.5 亿元文旅补贴和平台权益重新导向暑期出行、演出、酒店、景区和本地生活。\n普通人的机会不只在“跟热点”，而在能把钱落成系统：会做债券和利率、会做智能交通、会做 AI Infra、会做数据中心电力冷却、会做 B2B 软件增长、会做股权账户和金融教育、会做文旅平台运营的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-08",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-08/",
"date":"2026-07-08",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-08/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-08/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-08/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-08/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-08/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-08/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-08/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-08/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中央财政融资、洪灾韧性、AI 与物理世界的接口、AI 数据中心长期租约、基础数学、暑期体验消费和 AI / 电力 / 水利高薪岗位”。\n政府\n国内政府资金今天更值得看的不是单个项目开工，而是财政融资端的节奏。\n财政部安排 7 月 8 日上午招标两类国债：一是 2026 年记账式附息（十期）国债第四次续发行，10 年期固定利率附息债，竞争性招标面值总额 900 亿元，票面利率沿用 1.72%；二是 2026 年记账式贴现（四十一期）国债，期限 63 天，竞争性招标面值总额 300 亿元。两项合计 1200 亿元。\n这笔钱不能简单写成“政府今天花了 1200 亿元”。它更像财政资金池的补给动作：一边用 10 年期债券拉长资金期限，一边用 63 天贴现债补充短端流动性。低利率环境下，中央财政仍在通过国债市场把未来支出、投资安排和资金调度先铺好。\n普通人直接拿不到这笔钱，但会在债券承销、银行资产负债管理、固收交易、利率研究、财政资金系统、政府债 IT、合规托管、信用评级和机构资金配置里看到机会。对家庭资产配置来说，国债收益率和发行节奏也会继续影响银行理财、货币基金、保险和长期低风险资产的定价。\n国际政府与开发资金\n世界银行把 1.192 亿美元投向巴西 Santa Catarina 州的洪灾韧性和就业保护。\nWorld Bank Group 宣布新项目，支持 Santa Catarina 州降低严重洪水风险、提升气象灾害管理能力，并减少洪灾对经济和就业的冲击。项目规模为 1.192 亿美元，将覆盖约 42 万人、54 个市镇，重点在 Itajai Valley 做河道疏浚、堤防加固、闸门、上游拦洪坝、早期预警和自然基解决方案。\n这笔钱买的是“制造业和港口经济不要被洪水打断”。Itajai Valley 贡献该州约三分之一就业，Itajai 港又是巴西关键集装箱港之一。1991 至 2023 年，洪水和山体滑坡已在 Santa Catarina 造成超过 72 亿美元经济损失。发展资金正在把气候韧性从环保议题变成就业、港口、制造、农产品出口和供应链稳定议题。\n普通人的机会在水利工程、河道治理、港口韧性、灾害预警、GIS、水文模型、自然基解决方案、市政工程、项目采购、国际开发项目财务、现场监理和韧性城市咨询。\n投资机构\n投资机构的钱继续离开“只讲模型参数”的叙事，转向 AI 与物理世界、行业决策的接口。\n今天可写的一组融资包括：Even Realities 完成 1.5 亿美元 pre-Series B，由美团和腾讯等支持，估值达到 10 亿美元，押注无摄像头、显示优先、隐私导向的智能眼镜；Tripo AI 在扩展 Series A 中再融资 1.5 亿美元，用于 3D foundation models 和 world models；Taktile 完成 1.1 亿美元 Series C，由 Goldman Sachs Alternatives 领投，把 AI agents 放进银行、保险的承保、理赔、反欺诈、KYC 和 AML 决策；CarbonSix 完成 4000 万美元 Series A，把 Physical AI 部署到制造现场。\n这些钱的共同点很清楚：AI 正在从聊天框走向“眼睛、空间、工厂和金融决策流程”。资本不只买模型能力，而是买显示光学、空间数据、仿真、行业工作流、审计链路、机器人末端执行器、工厂部署和客户 ROI。\n普通人的机会在光学显示、边缘 AI、可穿戴产品、3D 数据生产、AIGC 工具链、工业仿真、机器人手、运动控制、金融风控策略、AI 合规、AML、客户成功、售前解决方案和行业交付。\n企业\n企业的钱今天最醒目的信号是 Anthropic 锁定 20 年 AI 数据中心容量。\nTeraWulf 官方披露，已与 Anthropic 签署 20 年租约，Anthropic 将租用 TeraWulf 位于 Kentucky Hawesville 的 Justified Data campus。这份租约预计在初始期限内带来约 190 亿美元合同租赁收入，园区将容纳约 401 MW critical IT load，计划 2027 年下半年开始投入初始容量，并在 2028 年初爬坡至完整 401 MW。TeraWulf 同时把 Abernathy JV 的 50.1% 权益出售给 Fluidstack 牵头的投资者组，把此前约 4.5 亿美元投资变现后重新投入全资 AI 基础设施机会。\n这笔钱说明，AI 公司不再只是临时买云算力，而是在用长期合同锁定电力、土地、并网、园区改造、制冷和关键设施运营。对 TeraWulf 这类从能源和加密挖矿转向 AI 基础设施的公司来说，真正值钱的是“能不能找到电、建出场、拿到长约客户”。\n普通人的机会在数据中心选址、电力交易、并网、变电站、柴油发电、UPS、暖通、液冷、关键设施运维、项目融资、长约谈判、建设管理、园区改造、AI 云销售和能源法务。\n富豪资本\n富豪资本今天买的是基础数学和技术主权。\nÉcole Polytechnique 宣布成立 Institute of Mathematics and Fundamental Sciences，未来位于 Palaiseau campus 的建筑将由 Bernard Arnault 提供的 5000 万欧元捐赠资助，计划 2030 年前落成。校方明确把数学与 AI、量子技术、网络安全等战略领域关联起来，并称该研究院将服务约 400 名教师、博士生和博士后相关生态。\n这不是传统意义上的公益捐款，而是奢侈品巨头家族资本把钱投向“人才密度”和“基础科学声望”。当 AI 竞争越来越依赖数学、算力、密码学、材料、物理和复杂系统时，基础学科的长期赞助会变成国家技术主权和高端人才入口的一部分。\n普通人的机会在数学、AI 理论、量子信息、网络安全、科研运营、大学基金会、国际学术交流、科技转移、深科技孵化和企业研究合作。\n平民消费\n普通人的钱继续流向暑期体验消费，但今天更清楚的是“文旅季 + 电影票根 + 平台权益 + 影院复合空间”的组合。\n2026 年全国暑期文化和旅游消费季主场活动 7 月 8 日在青海省海北州举办。地方层面，广东、横琴、云南、香港等仍在以消费券、酒店满额权益、交通和景点优惠拉动暑期出行。香港旅游发展局的夏日玩乐包设置了 Trip.com 酒店订单满港币 1500 元门槛，提供景点和交通优惠，数量超过 6 万份。\n电影消费也在把“看一场电影”变成商圈生意。暑期档票房已突破 20 亿元，暑期供给超过 90 部影片。电影票房拉动系数达 1:15.77，意味着每 1 元票房可带动 15.77 元全链条相关产业产值；今年电影全产业链产值已超过 2000 亿元。电影院也在被鼓励加入国潮电影美食、IP 联名食品、AI 智能体、电玩游戏、VR 电影、生日派对、企业团建、演唱会和体育赛事第二现场。\n昨日较热消费品牌：\n中国品牌和平台：携程 / Trip.com、美团、抖音、猫眼、淘票票、万达电影\n国际和跨境相关品牌：Disney、Universal、Booking、Airbnb、Apple、Illumination / Minions\n普通人的机会在 OTA 运营、目的地产品、酒店收益管理、景区票务、影院餐饮、IP 联名、演出和赛事第二现场、商圈联动、本地生活核销、短视频种草、亲子研学产品和跨境游客权益设计。\n高薪职位\n中国高薪岗位：\n\nAI Infra / 大模型训练推理工程师：人民币 30000 至 100000 元/月，常见 14 至 16 薪。猎聘和 BOSS 直聘样本显示，大模型 Infra、Data Infra TL、AI Infra 工程师在北京、上海、深圳、杭州集中，40K 以上岗位密度高。\n3D / 多模态 / 世界模型算法工程师：人民币 30000 至 80000 元/月。Tripo AI 这类融资说明，空间理解、3D 数据、仿真和工业 / 娱乐 / 机器人交叉岗位会继续有溢价。\nPhysical AI / 机器人软件硬件工程师：人民币 25000 至 70000 元/月。机器人手、视觉、运动控制、工厂部署和售前交付比单纯 demo 更值钱。\n金融 AI 决策 / 风控策略 / 反欺诈工程师：人民币 25000 至 60000 元/月。Taktile 的钱说明银行和保险愿意为“可审计、有人类监督、能减误报”的 AI 工作流付费。\n数据中心电力 / 暖通 / 关键设施工程师：人民币 15000 至 45000 元/月。Anthropic / TeraWulf 这类长约会继续推高供配电、UPS、柴发、液冷和园区交付经验的价值。\n水利韧性 / 洪水治理 / 港口基础设施项目经理：人民币 18000 至 50000 元/月。世行巴西项目对应的是水利、市政、EPC、GIS、水文模型和国际项目采购能力。\n\n国际高薪岗位：\n\nAI Infrastructure Engineer / ML-AI Software Engineer：美国约 170000 至 257000 美元/年，顶尖公司总包可更高。\nData Center Electrical Engineer / Critical Facilities Engineer：美国约 127000 至 210000 美元/年。\nPower Generation Infrastructure Engineer：美国约 136600 至 184800 美元/年。\nFlood Resilience / Water Infrastructure Project Manager：美国和国际开发项目约 100000 至 220000 美元/年，项目融资、采购合规、葡语 / 英语、多边机构经验有溢价。\nFinancial AI / Risk Decisioning / AML Product Engineer：美国约 140000 至 260000 美元/年，银行、保险、合规数据、模型治理和客户实施经验有溢价。\n\n今天的钱解释了岗位溢价：1200 亿元国债发行需要固收和财政融资人才；1.192 亿美元洪灾韧性资金需要水利和城市韧性人才；约 4.5 亿美元 AI 融资需要端侧、空间、机器人和金融 AI 人才；190 亿美元数据中心租约需要电力和关键设施人才；暑期文旅和电影消费需要线下空间运营、票务、IP 和本地生活人才。\n今日结论\n今天的钱集中在“把抽象能力落到基础设施和真实场景”。\n中国财政部 1200 亿元国债招标补的是财政资金池；World Bank 1.192 亿美元买的是巴西港口和制造业不被洪灾打断；Even Realities、Tripo AI、Taktile、CarbonSix 这组融资说明 AI 正在进入眼镜、3D 世界、金融决策和工厂；Anthropic 与 TeraWulf 的约 190 亿美元长约把算力竞争变成电力和园区竞争；Bernard Arnault 的 5000 万欧元捐赠说明基础数学重新成为技术主权资产；普通消费者的钱则被暑期文旅、电影、影院综合空间和平台权益重新组织起来。\n普通人的机会不只在“追热点”，而在能把钱落到系统里：会做财政和债券、会做水利韧性、会做 AI 工程化、会做机器人部署、会做数据中心电力、会做影院和文旅空间运营的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-07",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-07/",
"date":"2026-07-07",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-07/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-07/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-07/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-07/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-07/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-07/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-07/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-07/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“国家级基建资金池、城市韧性、AI agent 工具链、基础化工产能、儿童投资账户、暑期文旅消费和 AI/基建/化工高薪岗位”。\n政府\n国内政府资金今天主要流向“两重”建设的执行层。\n国家发展改革委披露，2026 年第三批“两重”建设项目近日已下达，共安排超长期特别国债资金 1935 亿元。至此，今年“两重”建设项目清单已全部下达完毕。全年口径看，相关部门共安排 8000 亿元，支持 1417 个重大项目建设。\n这笔钱不是一次性撒向地方，而是把年度项目清单推入执行期。资金覆盖科技创新、长江流域生态保护修复、长江沿线重大交通基础设施、城市地下管网、重大水利工程、西部陆海新通道、高等教育提质升级、“三北”工程等重点领域。\n普通人感受到的不是“直接发钱”，而是项目招标、设计院订单、施工总包、设备采购、管网改造、水利环保、科研平台和高校基建岗位增加。\n普通人的机会在项目申报、可研咨询、EPC、地下管网检测、智慧水务、水利工程、生态修复、交通工程、教育基建、科研平台运维、政府采购和项目审计。\n国际政府与开发资金\n世界银行把 2.25 亿美元投向马达加斯加城市韧性与就业。\nWorld Bank Group 批准 2.25 亿美元融资，用于 Integrated Urban Development and Resilience Project for Jobs，也就是 PRODUIRE2。项目重点覆盖 Greater Antananarivo 和 Greater Toamasina，目标是加强气候韧性、改善城市基础设施，并创造更多、更好的就业。\n这笔钱买的是“城市能不能扛住洪水、拥堵和基础设施短板”。发展资金正在从单一救灾转向排水、道路、社区服务、城市治理、就业吸纳和抗灾运营体系。\n普通人的机会在城市规划、排水管网、道路与桥梁、市政工程、灾害风险建模、GIS、社区就业项目、项目财务管理、国际开发项目采购和现场监理。\n投资机构\n投资机构的钱继续流向 AI agent 的“落地工具链”，而不只是模型本身。\nBespoke Labs 这家 AI agent training platform 已在 seed 和 Series A 中合计融资 4000 万美元。另一条相邻信号是 Tsuga：这家巴黎 AI-native observability 公司完成 3500 万美元 Series A，由 Singular 领投，General Catalyst、DST Global Partners、QuantumLight、Picus 和 Databricks Ventures 等参与。\n这两笔钱的共同点是：资本正在买“agent 上线后怎样训练、怎样观测、怎样治理、怎样控制成本”。企业真正卡住的地方，往往是 agent 是否稳定、是否可解释、是否能在业务流程中持续学习，以及日志、指标、链路追踪和安全数据是否会把云账单打爆。\n普通人的机会在 AI agent 评测、仿真训练环境、SRE、可观测性、日志和指标平台、云成本治理、企业安全、数据工程、提示词工作流、自动化测试和 AI 产品交付。\n企业\nYara 花 13 亿美元买下 Gulf Coast Ammonia 的德州氨厂。\nYara International 宣布，其美国子公司 Yara North America 已达成协议，将以 13 亿美元收购 Gulf Coast Ammonia 位于 Texas City 的氨生产设施。这笔交易会把公司 2026 年总资本开支提高到 25 亿美元；目标资产名义产能约 130 万吨/年，Air Products 将通过长期协议供应工业气体。\n这笔钱买的不是一个热概念，而是基础化工产能、美国低成本能源、港口与管线位置、全球化肥供应韧性和未来低碳氨选项。粮食、化肥、天然气和地缘供应链仍然连在一起，Yara 把产能放到美国 Gulf Coast，本质上是在分散欧洲能源价格和生产成本风险。\n普通人的机会在化工工艺、氨装置运维、工业气体、HSE、PSM、设备可靠性、港口物流、化肥贸易、能源采购、碳管理和装置数字化。\n富豪资本\n富豪资本今天更像是在买“家庭金融入口”。\nTrump Accounts 于 7 月 4 日正式上线，7 月 6 日在白宫举行启动活动。美国财政部长称已有约 600 万儿童家庭注册，其中约 140 万符合 1000 美元政府 seed money 条件；活动上还提到，本周将有约 8 亿美元新资本投入儿童账户。Michael Dell 和 Susan Dell 此前承诺 62.5 亿美元，为符合条件的儿童账户追加 250 美元激励；Ray Dalio 和 Barbara Dalio 也承诺支持康涅狄格儿童账户。\n这笔钱不是传统慈善，也不是单纯教育捐款，而是富豪资本参与设计未来家庭资产配置入口。账户默认围绕长期投资、指数基金、金融教育和儿童储蓄展开，等于是把私人财富、公共政策、券商/资管渠道和普通家庭金融习惯绑定在一起。\n争议也很清楚：每个孩子都有账户，不代表每个家庭都有持续缴款能力。真正长期受益的，可能仍然是有现金流、懂规则、能长期持有的家庭。\n普通人的机会在财富教育、低成本指数产品、儿童账户运营、金融科技、合规、税务咨询、雇主福利、公益项目管理和长期储蓄内容服务。\n平民消费\n普通人的钱继续流向暑期消费，但今天更明确的是“文旅券 + 平台满减 + 本地体验”的组合。\n多地近期密集上新暑期文旅消费券。广东 7 月 1 日起发放 2026“暑假当然来广东”文旅消费券，活动延续到 8 月 31 日；横琴粤澳深度合作区推出总计 5000 万元“文旅畅游·乐购横琴”促消费活动，覆盖景区门票、酒店住宿、餐饮零售、休闲娱乐、汽车购置等场景。云南 7000 万元“彩云文旅消费券”、广西数字人民币消费红包、洛阳九轮商文旅综合消费券也继续构成暑期消费底盘。\n这说明居民消费正在从“单次旅游”变成“平台组合券驱动的本地体验”。钱流向的不只是机票酒店，还包括景区、演出、文创、低空文旅、汉服体验、餐饮零售、水上乐园、森林康养和开学数码。\n昨日较热消费品牌：\n中国品牌和平台：携程、飞猪、美团、抖音、长隆、方特\n国际和跨境相关品牌：Trip.com、Disney、Universal、Apple、Samsung、Booking\n普通人的机会在本地生活运营、文旅产品打包、酒店收益管理、演出票务、景区数字化、低空文旅、汉服体验馆、餐饮零售核销、消费券系统、短视频种草和开学数码零售。\n高薪职位\n中国高薪岗位：\n\nAI Infra / 大模型训练推理工程师：人民币 35000 至 100000 元/月，常见 15 薪，北京、深圳、杭州更集中。\nAI Agent 平台工程师：人民币 25000 至 60000 元/月，常见 15 薪，广州、深圳、北京、成都均有样本。\n城市韧性 / 地下管网 / 水利项目经理：人民币 20000 至 50000 元/月，8 年以上项目经验、注册证书、政府项目经验有溢价。\n化工工程师 / 氨装置工艺工程师：人民币 12000 至 40000 元/月；化工厂长 / 生产负责人可到 35000 至 50000 元/月。\nHSE / PSM / 装置安全经理：人民币 20000 至 50000 元/月，大型化工装置、外企、英语工作环境和注册安全工程师经验有溢价。\n\n国内扫描来源覆盖 BOSS 直聘、猎聘、职友集、智联招聘、51job、看准网。BOSS 公开报道还显示，AI 工程师中位数薪资涨幅 15.8%，电工工资上涨 56%、招聘需求翻 11 倍，说明“AI + 实体基础设施”两端都在涨。\n国际高薪岗位：\n\nAI Infrastructure Engineer / AI Platform Engineer：美国约 180000 至 400000 美元/年。\nObservability / SRE Platform Engineer：美国约 160000 至 320000 美元/年。\nProcess / Ammonia / Chemical Engineer：美国约 100000 至 190000 美元/年。\nUrban Resilience / Water Infrastructure Project Manager：美国约 110000 至 220000 美元/年。\nDevelopment Finance / Infrastructure Procurement Specialist：美国和国际组织项目约 100000 至 220000 美元/年。\n\n今天的钱解释了岗位溢价：政府“两重”资金带来基建执行和管网项目；世行城市韧性项目带来水务、排水和城市治理；AI agent 融资带来训练、可观测性和 SRE；Yara 氨厂带来化工、HSE 和装置运维；Trump Accounts 带来金融科技和长期储蓄运营。\n今日结论\n今天的钱集中在“基础设施重新成为主角”。\n中国 1935 亿元第三批“两重”资金把年度重大项目清单推入执行期；World Bank 2.25 亿美元投向马达加斯加城市韧性；Bespoke Labs 和 Tsuga 说明 AI agent 的钱开始买训练、观测和治理工具；Yara 13 亿美元买下德州氨厂，把化肥和能源成本重新绑在一起；Dell 夫妇 62.5 亿美元承诺和 Trump Accounts 上线，把富豪资本推向儿童投资账户；普通消费者则继续被文旅券、平台满减、演出、景区、低空文旅和开学数码拉动。\n普通人的机会不只在“会写 AI”，还在“能把钱落地”：会做基建项目、城市韧性、AI 工程化、化工装置安全、文旅履约、儿童账户运营和长期金融教育的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-06",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-06/",
"date":"2026-07-06",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-06/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-06/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-06/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-06/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-06/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-06/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-06/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-06/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中期流动性、清洁储能、AI 视频模型、AI 数据中心冷却、奥运周期体育资产、暑期精细化消费和 AI 基建高薪岗位”。\n政府\n国内政府资金今天主要流向银行体系中期流动性。\n中国人民银行 7 月 6 日开展 10000 亿元 3 个月期买断式逆回购操作，期限 91 天。由于本月有 8000 亿元同期限买断式逆回购到期，7 月 3 个月期买断式逆回购净投放约 2000 亿元。\n这笔钱不是财政预算支出，而是央行向银行体系投放中期流动性。它影响的是银行间资金价格、债券交易、同业负债、理财产品、资管久期和企业融资环境。普通人感受到的不是“直接发钱”，而是贷款、债券、理财收益率和市场风险偏好背后的水位变化。\n普通人的机会在银行资金交易、债券研究、同业业务、资管运营、利率产品、金融数据、合规风控和现金管理。\n国际政府与开发资金\n世界银行把 2.65 亿美元投向摩洛哥抽水蓄能。\nWorld Bank Board of Directors 批准 2.65 亿美元，支持摩洛哥北部 Ifahsa Pumped Hydropower Storage Project。项目目标是提高摩洛哥电力系统可靠性和韧性，支持更多可再生能源并网，并为居民和企业提供更清洁、更可靠的电力。\n这笔钱买的是“可再生能源能不能稳定用”。风电和光伏增加之后，真正稀缺的不只是发电装机，而是调峰、储能、输配电、项目管理和电力市场机制。抽水蓄能项目会把钱导向土建、机电设备、泵站、隧洞、电网调度、安全评估和本地工程服务。\n普通人的机会在抽水蓄能设计、EPC、项目融资、设备采购、电网调度、水利工程、环境评估、运维和能源政策咨询。\n投资机构\n快手旗下可灵 AI 完成近 30 亿美元外部融资。\n快手公告可灵 AI 将完成近 30 亿美元融资。投资者已同意向北京可灵注入现金资本金 190.471 亿元，融资总额上限 204.471 亿元；投后估值约 180 亿美元。本轮由 CPE 源峰、国方创投、BlueFive、腾讯、中信证券、中关村科学城基金等联合领投，阿里云、百度、文娱产业方也参与。\n这笔钱说明，视频生成正在从“产品功能”变成“独立资产”。可灵的融资买的是模型训练、推理算力、海外订阅、影视广告场景、内容生产工具链和潜在 IPO 路径。快手一季报披露，Kling AI 2026 年一季度收入超过 6.5 亿元，同比增长超过 300%，这给独立融资提供了商业化支点。\n普通人的机会在视频生成产品经理、模型评测、提示词和工作流设计、影视广告预演、短剧和电商素材生产、海外增长、版权合规、模型安全、算力调度和多模态算法。\n企业\nEcolab 花约 47.5 亿美元买下 CoolIT，把 AI 数据中心液冷纳入主航道。\nEcolab 完成收购 CoolIT Systems，交易金额约 47.5 亿美元。CoolIT 是高密度数据中心直接液冷供应商，年初至今销售增长超过 100%，增长来自 AI 数据中心液冷需求。加入 Ovivo 和 CoolIT 后，Ecolab 的 Global High-Tech 业务 2026 年年化销售额接近 15 亿美元，2030 年目标为 40 亿美元。\nAI 基础设施的钱继续从“买 GPU”下沉到“让 GPU 稳定运行”。液冷、冷板、CDU、冷却液、超纯水、发电侧水系统和节能优化，都是数据中心扩张绕不开的成本项。Ecolab 买 CoolIT，本质上是在买 AI 工厂的水、电、热管理入口。\n普通人的机会在液冷工程、数据中心热管理、冷却液材料、CDU 设计、机房运维、超纯水系统、节能改造、现场服务、供应链质量和数据中心安全。\n富豪资本\nJoe Tsai 和 Ares 领投 Premier Lacrosse League 1 亿美元融资。\nPremier Lacrosse League 完成 1 亿美元 Series E，Ares 和 Joe Tsai 领投，ESPN 也进行少数股权投资，Glen Powell、Rob Mac 等名人资本参与。资金将用于扩大媒体分发和原创内容、增长赞助和商业合作、继续投入 Women's Lacrosse League，以及降低青少年参与门槛。\n这笔钱买的是 LA28 奥运周期前的体育资产增值窗口。长曲棍球将在 2028 年洛杉矶奥运会回归，职业联盟、女子联赛、青训、媒体版权、赞助和地方球队扩张都可能被重新定价。富豪资本不是只买球队，而是买项目进入主流体育叙事前的基础设施。\n普通人的机会在体育内容制作、赛事运营、青训营、女体育商业化、地方球队市场、赞助销售、运动装备、票务、校园推广和体育新媒体。\n平民消费\n普通人的钱继续流向暑期消费，但今天更明显的变化是“定向补贴到具体场景”。\n暑期刚需消费正在带动手机、平板、电脑等大学入学数码装备，平台和门店叠加高考生专区、旧机换新、装机调试和店铺满减。地方消费券也开始分得更细：云南发放 7000 万元“彩云文旅消费券”，聚焦文艺演出、文创产品和低空文旅；山东发放 2000 万元电影惠民消费券；广西启动数字人民币消费红包；洛阳分九轮投放商文旅综合消费券，覆盖餐饮、零售、住宿、汉服体验、电影和文创。\n这说明平民消费不只是“旅游人多”，而是被补贴引导到电子产品、电影、演出、低空文旅、汉服、本地餐饮和即时零售。钱从单一出行，转向“开学装备 + 本地体验 + 文化娱乐 + 平台补贴”的组合。\n昨日较热消费品牌：\n中国品牌和平台：小米、华为、荣耀、淘宝闪购、京东、美团\n国际和跨境相关品牌：Apple、Samsung、Dyson、Disney、Universal、Booking\n普通人的机会在数码零售、以旧换新服务、手机和平板配件、校园开学营销、电影票务、低空文旅产品、汉服体验馆、本地生活运营、消费券核销系统和短视频种草。\n高薪职位\n中国高薪岗位：\n\n视频生成 / 图像视频算法工程师：人民币 35000 至 80000 元/月，常见为 15 薪，北京、上海、杭州更集中。\n多模态算法工程师：人民币 35000 至 60000 元/月，常见要求图像、文本、音频、视频多模态数据处理和模型训练。\nAI Infra / 大模型算法工程师：人民币 35000 至 70000 元/月，常见为 15 薪，方向包括高效训练、推理优化、强化学习、算力平台和模型服务。\n量化算法工程师：人民币 30000 至 60000 元/月，常见为 15 薪，金融数据、深度学习、价格预测和组合优化能力有溢价。\n数据中心负责人 / AI 基础设施与运维：猎聘样本出现 80000 至 110000 元/月，偏 10 年以上经验、本科以上、跨国或大规模数据中心场景。\n数据中心电气 / 电源 / 液冷工程师：人民币 15000 至 35000 元/月是常见区间，资深架构、建设和解决方案岗位可更高。\n\n国际高薪岗位：\n\nMachine Learning Engineer：美国总包参考 Levels.fyi，成熟大厂和高阶岗位仍在高位。\nVideo AI / Computer Vision Engineer：美国约 180000 至 350000 美元/年。\nAI Infrastructure Engineer：美国约 180000 至 400000 美元/年。\nData Center Power / Energy Infrastructure Engineer：美国约 130000 至 250000 美元/年。\nLiquid Cooling / Thermal Engineer：美国约 120000 至 220000 美元/年。\n\n今天的钱解释了岗位溢价：可灵融资拉动视频生成、多模态和海外 AI 产品；Ecolab/CoolIT 拉动液冷、热管理和数据中心现场工程；央行流动性和世行抽蓄项目拉动金融、电力、项目融资和基础设施执行。\n今日结论\n今天的钱集中在“AI 产业继续基础设施化，消费继续场景化”。\n央行 10000 亿元买断式逆回购维持银行体系中期流动性；World Bank 2.65 亿美元投向摩洛哥抽水蓄能；可灵 AI 近 30 亿美元融资把视频生成推向独立资本化；Ecolab 47.5 亿美元收购 CoolIT 抢 AI 数据中心液冷入口；Joe Tsai 和 Ares 1 亿美元押注 LA28 前的长曲棍球商业化；普通消费者则被开学数码、文旅券、电影券、汉服和本地体验继续拉动。\n普通人的机会更靠近系统层和落地层：会做流动性和债券、抽水蓄能、视频 AI、数据中心液冷、体育赛事运营、开学数码零售和消费券履约的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-03",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-03/",
"date":"2026-07-03",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-03/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-03/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-03/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-03/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-03/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-03/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-03/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-03/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“长期财政、普惠融资、视频 AI、AI 数据中心电力、金融总部地产、暑期文旅消费和多模态高薪岗位”。\n政府\n国内政府资金今天流向超长期财政工具。\n财政部第一次续发行 2026 年超长期特别国债（四期），竞争性招标面值总额 800 亿元。这是一只 30 年期固定利率附息债，票面利率 2.23%，7 月 3 日招标，7 月 8 日起与之前发行的同期国债合并上市交易。\n这笔钱不是普通短期周转资金，而是长周期财政资金池的一部分。2026 年超长期特别国债拟发行 1.3 万亿元，持续支持“两重”建设、“两新”工作、消费品以旧换新、设备更新和财政金融协同促内需。\n普通人的机会在政府项目申报、基建与设备更新供应链、绿色改造、审计评估、财政资金绩效、国债交易支持和政策项目运营。\n国际政府与开发资金\nEBRD 把最高 5000 万美元投向哈萨克斯坦中小微企业和女性创业融资。\n这笔钱给到 KMF Bank，其中最高 4000 万美元用于向私营中小微企业放贷，最高 1000 万美元用于支持女性拥有或领导的企业。贷款可以用美元或哈萨克斯坦坚戈发放，并配套咨询、培训、网络、导师和知识产品。\n这类开发资金买的不是一座桥或一条路，而是小企业拿到钱的能力。它最终会流向小微贷款、创业服务、女性企业主、客户经理、风控模型和本地化金融产品。\n普通人的机会在小微贷款风控、女性创业服务、财务咨询、企业培训、数字放贷、本币结算、授信模型、客户经理和普惠金融产品运营。\n投资机构\nTwelveLabs 完成 1 亿美元 Series B。\nNEA 和 NAVER Ventures 共同领投，Amazon、Radical Ventures、Korea Investment Partners、Index Ventures、Quadrille Capital、Red Bull Ventures 参投。这家公司做视频智能，想把视频的感知、知识和推理统一到一个系统里，让企业和创作者能够搜索、分析、结构化和运营海量视频资产。\n这笔钱说明，AI 投资正在从文本、代码和图像继续扩展到视频。视频过去是存储成本，现在开始变成可检索、可推理、可运营的数据资产。AWS 也不只是投钱，还成为 TwelveLabs 的 preferred cloud provider，并会一起优化 Trainium 上的视频推理负载。\n普通人的机会在视频 RAG、视频 embedding、内容安全、体育与影视素材检索、安防分析、汽车和机器人视觉、AWS Trainium 优化、企业视频知识库和多模态产品经理。\n企业\nSK 和 KKR 启动约 13 亿美元韩国可再生能源平台。\n这个平台整合 SK 体系内的太阳能、陆上和海上风电、燃料电池等资产，当前约 1.7GW 已运营容量，开发管线会把总容量推向 10GW。它服务的核心需求很清楚：AI 数据中心、半导体生产线和大型工业用户需要可靠清洁电力。\nAI 基础设施的钱继续从“买芯片”延伸到“买电力”。如果 10GW 管线落地，公告口径称可持续供电 100 个 100MW 级大型数据中心。企业真正争夺的是可用电力、并网能力、能源合同和长期运维。\n普通人的机会在可再生能源开发、PPA、储能、微电网、数据中心供电、半导体厂务、电气工程、能源金融、项目并购、运维和碳管理。\n富豪资本\nKen Griffin 约 1.25 亿美元买下 Miami Brickell 一整栋公寓楼，为 Citadel 总部项目清场。\n他通过匿名 LLC 在约三年内买下 Solaris condominium 全部 138 套公寓和底层零售空间，目标是拆除这栋 22 层建筑，为 Citadel 新总部和周边园区扫清障碍。后续规划包括 25 亿美元、54 层 Citadel 总部塔楼、300 套公寓、1420 个停车位，并可能加入酒店。\n富豪资本今天买的是金融机构迁移后的城市控制权。一个总部项目不是只有一栋楼，它会带动办公、住宅、停车、餐饮、酒店、法律、税务、城市规划和高端服务业。\n普通人的机会在商业地产并购、拆迁协商、城市规划、建筑设计、施工管理、物业运营、金融总部服务、法律合规、税务筹划和高端生活配套。\n平民消费\n普通人的钱继续流向暑期文旅，但今天的重点从“人流量”转向“补贴和体验组合”。\n浙江将发放 2645 万元专项文旅消费券，携程、美团、同程三大平台累计投入 2.19 亿元补贴，浙商银行、交通银行等 7 家金融机构投入 2400 余万元补贴。四川分批发放 3000 万元文旅消费券，昆明发放 1000 万元彩云美物消费券，横琴 6 至 8 月启动首期 5000 万元消费券。\n钱正在流向景区门票、酒店民宿、餐饮美食、演艺市集、夜游、研学、咖啡、菌子美食、亲水活动和旅游专列。暑期消费不只是“买车票去远方”，而是地方政府、平台、银行、景区和商户一起把补贴打包成可核销的体验。\n昨日较热消费品牌：\n中国品牌和平台：携程、美团、同程、飞猪、淘宝闪购、马蜂窝\n国际和跨境相关品牌：Trip.com、Booking、Airbnb、Klook、Disney、Universal\n普通人的机会在 OTA 运营、酒店民宿收益管理、景区产品打包、夜游演艺、研学导师、短视频种草、本地团购、餐饮联名、活动执行和消费券核销系统。\n高薪职位\n中国高薪岗位：\n\n视频/多模态算法工程师：人民币 30000 至 60000 元/月，北京/上海/深圳/杭州，3 至 5 年更常见。\n大模型算法工程师：人民币 30000 至 50000 元以上/月，职友集样本显示 66.4% 岗位拿 30000 至 50000 元以上/月。\nAI 数据平台 / MLOps 工程师：人民币 25000 至 55000 元/月，向量检索、模型服务、数据治理、GPU 调度和企业系统集成更吃香。\n数据中心电气 / 电源工程师：人民币 17000 至 40000 元/月，AI 数据中心、电气、能源系统和厂务经验更值钱。\n可再生能源项目开发 / PPA / 储能解决方案：人民币 20000 至 45000 元/月，能源金融、项目并购、并网、电力交易和大客户售电经验更值钱。\n\n国际高薪岗位：\n\nMachine Learning Engineer：美国平均总包约 272000 美元/年。\nGoogle Machine Learning Engineer：美国约 199000 至 743000 美元/年，median 约 290000 美元/年。\nMeta Machine Learning Engineer：美国约 187000 至 644000 美元/年，median 约 476000 美元/年。\nVideo AI / Computer Vision Engineer：美国约 180000 至 350000 美元/年。\nData Center Power / Energy Infrastructure Engineer：美国约 130000 至 250000 美元/年，高级项目、能源金融和 hyperscaler 供电经验可更高。\n\n今天的钱解释了岗位溢价：TwelveLabs 需要会处理视频和多模态数据的人，SK/KKR 需要懂新能源和数据中心电力的人，财政和 EBRD 资金需要懂融资、风控、项目执行和数字化系统的人，文旅补贴需要懂本地供给组织和平台转化的人。\n普通人切入点也很明确：技术线可以从视频检索、RAG、模型服务、数据治理、GPU 运维、电力运维和储能项目切入；非技术线可以从政府项目运营、普惠金融客户经理、OTA 运营、文旅活动执行、商业地产服务和能源项目商务切入。\n今日结论\n今天的钱集中在“长期基础设施化”。\n财政部 800 亿元超长期特别国债续发行，买的是重大项目和设备消费更新的财政弹药；EBRD 5000 万美元，买的是哈萨克斯坦小微和女性创业的融资入口；TwelveLabs 1 亿美元，买的是视频数据资产化；SK/KKR 13 亿美元，买的是 AI 和半导体背后的清洁电力；Ken Griffin 1.25 亿美元买楼和 25 亿美元总部项目，买的是金融机构迁移后的城市地标；普通消费者则被文旅券、平台补贴和暑期活动推向本地体验组合。\n普通人的机会更靠近执行层、系统层和交付层：会做财政项目、普惠金融、视频 AI、能源项目、数据中心电力、商业地产服务、OTA 运营和消费券履约的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-02",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-02/",
"date":"2026-07-02",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-02/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-02/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-02/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-02/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-02/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-02/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-02/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-02/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“短端流动性、约旦增长和就业改革、开源AI推理云、AI数据中心电力、教育人才公益、暑运体验消费和FDE高薪岗位”。\n政府\n国内政府资金今天继续流向银行体系短端流动性。\n央行7月2日开展2885亿元7天期逆回购，操作利率1.40%，与此前持平。和昨天的1000亿元逆回购相比，这是新一天的公开市场调节，说明跨季之后资金面仍需要日度精细维护。\n这笔钱不是直接发给企业和居民，而是先进入银行间市场，影响同业资金、债券交易、银行理财、企业短期融资和金融机构流动性管理。\n普通人的机会在金融科技、资金系统、债券交易支持、利率风控、银行同业业务、企业司库和监管报送。\n国际政府与开发资金\nWorld Bank批准7亿美元贷款支持约旦增长和就业。\n这笔钱用于Jordan Growth and Competitiveness Development Policy Financing II，重点是把约旦的宏观稳定转化为私人投资、融资可得性和就业。具体方向包括简化行业许可、现代化电子和跨境交易法律框架、扩大灵活就业社保覆盖、推动电力部门私人投资、发展众筹和现金流贷款、绿色金融，以及政府付款数字化。\n这类开发资金买的不是单个工程，而是营商环境和金融基础设施。钱最终会流向数字政务、绿色金融、MSME融资、能源项目、电子支付和公共部门改革。\n普通人的机会在数字政务、电子支付、绿色金融、合规、营商环境咨询、能源项目、公共政策执行和本地化培训。\n投资机构\nTogether AI完成8亿美元Series C，投后估值83亿美元。\n这家公司做开源模型云，服务DeepSeek、Nemotron、MiniMax、Kimi等开源模型的训练和推理。它披露年化预订额已经超过11.5亿美元，客户包括Cursor、Cognition、Decagon等。新资金会用于扩展产品、推理服务和基础设施容量，未来五年基础设施规模预计约增长50倍。\n投资机构今天买的是“更便宜地跑AI”。当企业发现闭源前沿模型价格可能吃掉业务毛利，开源模型云、推理优化和AI成本工程就会变成真需求。\n普通人的机会在推理优化、模型服务、GPU调度、开源模型微调、企业AI迁移、成本评估、AI云销售工程、客户成功和安全合规。\n企业\nBrookfield和Bloom Energy把AI基础设施电力融资框架扩大到250亿美元。\n这项合作原本是50亿美元，现在扩大到250亿美元，用于支持Bloom燃料电池在AI基础设施中的全球部署。它解决的是AI数据中心越来越现实的约束：不是只有GPU贵，电力、并网等待、现场供能和稳定运行也开始决定AI工厂能不能落地。\n这笔钱说明，AI基础设施已经从“买芯片”进入“买电力、买数据中心、买项目交付”的阶段。谁能更快给数据中心供上稳定电力，谁就更靠近AI算力的真实瓶颈。\n普通人的机会在数据中心选址、现场电力、燃料电池、微电网、电气工程、能耗管理、并网许可、EPC、设备运维、能源金融和碳管理。\n富豪资本\nKen Griffin向Breakthrough Miami捐赠200万美元。\n这笔钱会支持更多高中和大学学生成为Volunteer Teachers、Teaching Assistants和Teaching Fellows。项目每年支持600多名高中和大学学生进入领导力管线，同时触达南佛罗里达1800名Breakthrough Scholars。资金会用于教学指导、领导力训练、招募、评估、项目容量建设，以及更多付费助教和教学研究员机会。\n富豪资本今天买的是教育和人才基础设施。它不如AI和电力项目金额大，但方向很清楚：提前培养能教学、能组织、能服务社区、能进入教育和社会服务行业的人。\n普通人的机会在K12课后项目、教育公益运营、青年导师、教学设计、项目评估、教育心理、社会服务、社区组织和非营利机构管理。\n平民消费\n普通人的钱开始流向暑运出行和体验消费。\n7月1日至8月31日，全国铁路暑运预计发送旅客10.1亿人次，日均1629万人次；全国铁路日均计划安排旅客列车约1.2万列，并增开跨铁路局集团公司旅客列车480列。民航暑运也同步启动，暑运旅客运输量预计约1.42亿人次。\n这背后不是简单“人多出门”，而是暑期消费结构切换：亲子家庭、学生、避暑康养中老年游客成为主力，研学旅行、避暑旅居、夜间休闲演艺等体验消费热度高于传统观光。携程暑期亲子游客预订人次同比增长13.6%；马蜂窝近一周“暑期出游”搜索热度环比上涨238%，“亲子游”同比上涨166%。\n昨日较热消费品牌：\n中国品牌和平台：铁路12306、携程、同程旅行、马蜂窝、去哪儿、飞猪\n国际和跨境相关品牌：Trip.com、Booking、Airbnb、Disney、Universal、Klook\n普通人的机会在旅游产品设计、亲子研学、夜游演艺、目的地运营、暑期兼职、导游讲解、酒店民宿、OTA内容、短视频种草、交通接驳和本地服务履约。\n高薪职位\n中国高薪岗位：\n\nAI FDE/行业解决方案工程师：人民币35000至80000元/月，常见15薪，北京/上海/深圳/杭州，3至8年。\n大模型算法工程师：人民币30000至50000元以上/月，北京/上海/深圳集中，硕士和3至5年经验更常见。\nAI基础设施架构师/解决方案架构师：人民币30000至70000元/月，部分岗位按15至19薪计。\n机器人/具身智能算法工程师：人民币25000至50000元/月，部分高级岗位可到80000元以上。\n数据中心电力/能源工程师：人民币25000至60000元/月，AI数据中心、电气工程、能源系统和EPC复合背景更吃香。\n\n国际高薪岗位：\n\nML / AI Software Engineer：美国平均总包约242500美元/年。\nForward Deployed Software Engineer：美国约200000美元/年以上总包中位区间，高级FDE可更高。\nSenior AI Engineer：美国约235000至340000美元/年，前沿实验室总包可超过380000美元。\nAI Infrastructure / Inference Platform Engineer：美国约180000至320000美元/年。\nData Center Power / Energy Infrastructure Engineer：美国约130000至250000美元/年，高级项目和能源金融复合岗位可更高。\n\n今天的钱解释了为什么这些岗位值钱：Together AI需要会把模型跑便宜的人，Bloom和Brookfield需要懂电力和数据中心的人，World Bank和央行相关资金需要懂金融基础设施和数字治理的人，暑运消费需要懂产品、履约和目的地运营的人。\n普通人切入点也很明确：技术线可以从GPU运维、推理服务、RAG/agent集成、数据治理、电力运维、机器人测试切入；非技术线可以从AI项目经理、客户成功、售前解决方案、文旅运营、教育项目运营和社区服务评估切入。\n今日结论\n今天的钱集中在“基础设施化”。\n央行2885亿元逆回购买的是短端流动性稳定；World Bank 7亿美元买的是约旦营商环境、金融可得性和数字政府；Together AI 8亿美元买的是更低成本的AI推理云；Brookfield和Bloom Energy 250亿美元买的是AI工厂的电力底座；Ken Griffin 200万美元买的是教育和领导力管线；普通消费者则把暑期预算花在亲子、研学、避暑、夜游和跨省出行上。\n普通人的机会更靠近交付层和基础设施层：会做资金系统、数字政务、AI云、数据中心电力、FDE现场交付、旅游体验产品和教育项目运营的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-07-01",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-07-01/",
"date":"2026-07-01",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-01/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-01/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-01/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-01/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-01/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-01/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-01/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-07-01/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“短端流动性、肯尼亚公共财政改革、AI推理芯片、企业AI落地队伍、Physical AI、AI消费硬件和FDE高薪岗位”。\n政府\n国内政府资金今天主要体现在银行体系流动性维护。\n央行7月1日开展1000亿元7天期逆回购，操作利率1.40%。这笔钱的背景是，6月30日央行刚开展695亿元7天期逆回购和6000亿元隔夜逆回购，用更短期限、更灵活的工具平滑跨季和月初资金波动。\n这不是简单“大放水”，而是给银行体系补短端资金，降低季末和月初的资金面噪音。钱最终流向银行间市场、债券交易、企业现金管理和金融机构流动性管理系统。\n普通人的机会在金融科技、资金系统、银行同业业务、债券交易支持、监管报送、风险管理和企业现金管理工具。\n国际政府与开发资金\nWorld Bank向肯尼亚提供7.5亿美元发展政策融资。\n这笔钱由3.4亿美元IBRD贷款和4.1亿美元IDA优惠融资组成，重点支持肯尼亚治理改革、公共财政管理、电子政府采购、社会保护，以及难民和接收社区生计支持。\n这类开发资金买的不是单个工程，而是治理能力。公共资源怎么少泄漏、采购怎么更透明、社会救助怎么更精准，都是钱要解决的问题。\n普通人的机会在电子采购系统、公共财政软件、审计、反腐合规、身份和救助登记、项目评估、数据治理、NGO执行和本地化培训。\n投资机构\nEtched披露累计融资8亿美元。\n这家公司做的是面向AI推理的专用芯片和整机系统。它还披露已有超过10亿美元客户合同，投资名单里包括Jane Street、TSMC相关VentureTech Alliance、Hudson River Trading、Two Sigma等。\n投资机构今天投的不是又一个聊天机器人，而是“让AI跑得更快、更便宜、更低延迟”的硬件。尤其是交易公司进入投资名单，说明实时推理已经开始接近金融、交易和高频决策场景。\n普通人的机会在推理芯片、系统验证、编译器、算子优化、低延迟网络、客户侧部署、芯片销售工程和可靠性测试。\n企业\nAWS投入10亿美元做Forward Deployed Engineering。\nAWS要把AI工程师和专用agent直接嵌入客户团队，帮助企业把AI系统接入真实数据、权限、流程、安全和运维。企业AI的瓶颈正在从“有没有模型”变成“能不能落地到生产系统”。\n这笔钱说明，AI服务商开始为“最后一公里”付真金白银。未来企业买AI，买的不只是API和云资源，也是在买一支能进现场、懂业务、能交付的工程队。\n普通人的机会在FDE、售前解决方案、AI项目经理、数据治理、权限系统、企业集成、合规、安全评估、运维和行业知识。\n富豪资本\nGeneral Intuition完成3.2亿美元Series A。\n这家公司用游戏玩家的行为数据训练能“行动”的AI，投后估值约23亿美元。融资名单里有Bezos Expeditions、Eric Schmidt相关Hillspire和Nico Rosberg等。\n富豪资本押的不是普通文本AI，而是能理解空间、动作和物理世界的AI。游戏数据、机器人、仿真和动作模型，正在成为下一轮资本试验场。\n普通人的机会在机器人数据、仿真环境、游戏引擎、动作捕捉、强化学习、低成本真实世界数据采集、机器人测试和具身智能产品化。\n平民消费\n普通人的钱继续流向AI硬件、智能家居、兴趣消费和服务消费。\n618后最明显的消费信号是：AI智能硬件从概念尝鲜变成实际购买。Rokid智能眼镜电商平台总销售额同比增长5倍；京东3C数码AI趋势产品成交额同比增长100%；家电家居智能化新品成交额同比增长20倍；AI迷你工作站和AI感知设备成交额同比增长超20倍。\n另一条线是“让生活变舒服”的消费。MARD马尔德拼豆网店销售环比增长100%、日均销售额超过20万元；京东家政日常保洁成交额同比增长超200%，护士到家失能照护服务订单量同比增长超4倍。\n昨日较热消费品牌：\n中国品牌：Rokid、雷鸟/RayNeo、Xreal、小米、华为、MARD马尔德、京东\n国际品牌：Meta Ray-Ban、Apple、Samsung、Pocket、Amazon、Best Buy\n普通人的机会在AI硬件门店演示、直播销售、硬件售后、语音交互、离线记录、智能家居安装、手作兴趣社群、家政履约、护理服务排班和本地生活运营。\n高薪职位\n中国高薪岗位：\n\nAI FDE/行业解决方案工程师：人民币35000至80000元/月，常见15薪，北京/上海/深圳/杭州，3至8年。\n大模型工程架构师/推理平台负责人：人民币50000至80000元/月，部分16薪，北京/杭州/深圳，3至8年以上。\nAI Infra架构师：人民币30000至70000元/月，部分15薪，北京/杭州/深圳，3至8年。\nAI芯片架构师/NPU/推理芯片架构师：人民币70000至110000元/月，北京/上海/深圳，5年以上。\nPhysical AI/机器人算法工程师：人民币40000至90000元/月，上海/深圳/北京/杭州，3至8年。\nAI智能眼镜产品经理/硬件算法工程师：人民币30000至70000元/月，深圳/杭州/北京，3至8年。\n\n国际高薪岗位：\n\nForward Deployed Engineer：美国约162000至300000美元/年。\nML / AI Software Engineer：美国总包中位数约242000美元/年。\nAI Infrastructure Engineer：美国总包约180000至320000美元/年。\nAI Chip / Inference Systems Engineer：美国约160000至300000美元/年。\nRobotics / Physical AI Research Engineer：美国约180000至350000美元/年。\n\n今天的钱很清楚：央行资金需要金融系统人才，World Bank融资需要公共财政数字化和项目执行人才，Etched需要推理芯片人才，AWS需要FDE和企业AI交付人才，General Intuition需要Physical AI和机器人人才，AI硬件消费需要产品、算法、渠道和售后人才。\n今日结论\n今天的钱集中在“短端流动性、公共财政改革、AI推理芯片、企业AI最后一公里、Physical AI、AI消费硬件和FDE高薪岗位”。\n央行用1000亿元7天期逆回购继续维护资金面；World Bank用7.5亿美元支持肯尼亚公共财政和社会保护；Etched的8亿美元融资说明推理芯片成为AI投资机构新焦点；AWS的10亿美元FDE投入说明企业AI真正缺的是落地队伍；General Intuition的3.2亿美元融资说明富豪资本正在押注能行动的AI；普通消费者则继续把钱花在AI硬件、智能家居、兴趣消费和本地服务上。\n普通人的机会更靠近交付层：会管资金系统、会做公共财政数字化、会把AI接进企业流程、会做推理芯片和机器人、会卖和服务AI硬件的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-30",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-30/",
"date":"2026-06-30",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-30/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-30/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-30/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-30/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-30/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-30/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-30/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-30/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“以旧换新补贴、孟加拉民生应急、AI数据中心电力、韩国存储芯片和AI数据中心、AI软件工厂、AI随身硬件和高薪AI基建岗位”。\n政府\n国内政府资金继续用财政补贴撬动耐用品消费。\n国家发展改革委、财政部下达今年第三批消费品以旧换新资金625亿元。今年以来，中央资金已经分三批下达1880亿元。截至6月中旬，汽车、家电、手机数码、家装厨卫、电动自行车等五大类以旧换新，带动销售额超过1.1万亿元。\n这不是简单发消费券，而是把财政资金投向“旧货回收+新货销售+绿色智能产品+线下门店核销”的整条链路。钱最终流到汽车、家电、手机、家装、两轮车、回收商、安装服务和地方消费平台。\n普通人的机会在补贴核销系统、家电/手机/电动车门店运营、二手回收、家装改造、绿色智能家电供应链、县域渠道、售后安装和政策合规。\n国际政府与开发资金\nWorld Bank向孟加拉国提供11亿美元紧急支持。\n这笔钱投向粮食安全、营养、农村生计、社会保护、健康和教育。它不是单个大型工程，而是在食品价格、气候冲击和外部压力下，托住低收入家庭和公共服务的基本盘。\n开发资金今天的方向很明确：买的不只是设备，也买执行能力。农业供应链、营养项目、社会保障系统、公共卫生、教育交付、数据上报、项目审计和开发银行采购，都会吃到这类钱。\n普通人的机会在农业项目执行、公共服务数字化、开发银行项目管理、NGO运营、项目审计、健康教育和本地供应链。\n投资机构\nReed Semiconductor完成1亿美元融资。\n这家公司做的是AI数据中心电源和功率半导体。AI数据中心最显性的花钱点是GPU，但越往后，电源转换、能效、散热和供电稳定性都会变成硬约束。\n这说明投资机构正在给“AI电力链条”付钱。下一阶段AI基建的赢家，不一定只在模型层，也会出现在功率芯片、电源模块、封装测试、可靠性、FAE和数据中心负载管理里。\n普通人的机会在功率半导体、芯片测试、数据中心电源、热管理、质量工程、供应链管理和技术销售。\n企业\n韩国科技巨头继续把钱压到“存储芯片+AI数据中心”上。\nSamsung和SK Hynix的半导体投资口径合计约800万亿韩元，约5180亿美元；韩国科技企业围绕半导体和AI数据中心的规划口径超过5500亿美元。Samsung和SK Hynix重点投存储与HBM，SK Group、GS Group和Naver等则推进AI数据中心、电力和服务配套。\n这笔钱说明，AI热潮不只缺GPU，也缺内存、供电、数据中心土地、冷却和稳定运营。企业资本开支正在从芯片厂，继续扩到AI数据中心、电网、服务器、冷却和云服务。\n普通人的机会在HBM、先进封装、工艺设备、数据中心电气、冷却、储能、服务器运维、跨境供应链、韩企客户服务和AI云迁移。\n富豪资本\nChamath Palihapitiya把1.35亿美元押到AI软件工厂。\n8090 Labs为Software Factory完成1.35亿美元Series A，Chamath亲自担任CEO。这个项目要做的不是单一代码补全，而是把软件需求、代码生成、测试、部署和企业流程打包成更自动化的“软件工厂”。\n这不是富豪资本只当财务投资人，而是亲自进入AI coding agent战场。企业真正愿意付钱的地方，也不是“能不能写一段代码”，而是能不能把需求、测试、安全、权限、部署和维护一起跑通。\n普通人的机会在Agent workflow、自动化测试、内部工具、软件交付、企业实施、安全审查、DevOps和垂直行业软件。\n平民消费\n普通人的钱今天有两条流向：一条是政策补贴继续推动耐用品换新，另一条是AI从App走向可穿戴硬件。\n五大类以旧换新已经带动超过1.1万亿元销售额；智能眼镜等新型可穿戴智能设备零售额同比增长超过1倍；Pocket完成1100万美元融资，继续押注离线AI记事硬件。AI眼镜、AI记录仪、智能车载硬件和绿色智能家电，正在一起争夺消费者的钱包。\n昨日较热消费品牌：\n中国品牌：Rokid、Xreal/雷鸟、小米、华为、京东、比亚迪、理想\n国际品牌：Pocket、Meta Ray-Ban、Apple、Samsung、Amazon、Best Buy\n普通人的机会在AI眼镜渠道销售、硬件产品经理、语音交互、离线模型、门店演示、家电安装、以旧换新核销、二手回收、新能源车售后和消费金融风控。\n高薪职位\n中国高薪岗位：\n\nAI Agent/代码智能体平台架构师：人民币50000至100000元/月，北京/上海/深圳/杭州，5至10年。\nAI基础设施架构师/推理平台负责人：人民币60000至120000元/月，北京/上海/深圳，5至10年以上。\n功率半导体/电源芯片研发专家：人民币40000至80000元/月，上海/深圳/苏州/无锡，5至10年。\nHBM/存储/封装工艺专家：人民币45000至90000元/月，上海/深圳/西安/合肥，5至10年。\n数据中心电气设计/能源系统工程师：人民币30000至65000元/月，北京/上海/杭州/海外项目地，5年以上。\nAI智能眼镜产品经理/硬件算法工程师：人民币30000至70000元/月，深圳/杭州/北京，3至8年。\n\n国际高薪岗位：\n\nAI Infrastructure Engineer：美国总包约180000至320000美元/年。\nMeta/Nvidia Machine Learning Engineer：美国总包约187000至637000美元/年。\nSemiconductor Power Device Engineer：美国年薪约140000至260000美元。\nData Center Electrical Engineer：美国典型约98172至166392美元/年，90分位约210579美元/年。\nProduct Manager, AI Wearables：美国总包约160000至300000美元/年。\n\n今天的钱很清楚：补贴消费需要渠道和核销，孟加拉11亿美元应急资金需要公共服务执行，Reed需要功率半导体人才，韩国AI基建需要HBM和数据中心人才，8090 Labs需要AI Agent和软件交付人才，AI眼镜和离线AI硬件需要产品、算法、渠道和售后人才。\n今日结论\n今天的钱，集中在“补贴消费、民生应急、AI数据中心电力、存储芯片、AI软件工厂和AI随身硬件”。\n国内政府用625亿元新增资金继续托住耐用品换新；World Bank用11亿美元托底孟加拉国粮食安全和公共服务；Reed Semiconductor的1亿美元融资说明AI数据中心开始为电力效率付钱；韩国科技巨头的5500亿美元级别投资说明存储、HBM和数据中心仍是AI的硬约束；Chamath的8090 Labs把富豪资本押到AI coding agent；普通消费者则把钱投向补贴商品和AI随身硬件。\n普通人的机会仍然在交付层：会做政策补贴落地、会做开发项目执行、会做数据中心电力和半导体、会把AI Agent变成可靠软件工厂、会卖和交付AI硬件的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-29",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-29/",
"date":"2026-06-29",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-29/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-29/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-29/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-29/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-29/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-29/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-29/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-29/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“川渝重点项目、斯里兰卡清洁能源、AI agent仿真、AI数据中心芯片和软件、富豪数据中心资本、暑期旅游专列和高薪AI基建岗位”。\n政府\n国内政府资金继续投向“区域协同+科创制造+基础设施”。\n川渝350个共建重点项目，2026年1至5月累计完成投资2276.3亿元，投资完成率45.6%；其中科创和现代产业类重点项目完成投资1047.1亿元。精密位移测量全国重点实验室、荣昌生猪区域性种业创新基地、高竹新区产业园、璧山动力电池研究总院等项目，正在封顶、完工或投建。\n这不是单一城市修一条路，而是成渝地区双城经济圈把科创、先进制造、产业园、交通和民生项目一起推。重庆2026年市级重点项目盘子也很大：开工、在建、完工项目总投资约2.9万亿元，年度计划投资约5012亿元。\n普通人的机会在科创平台运维、产业园招商、检测认证、动力电池测试、先进制造设备、物流配套、项目申报、工程咨询和区域协同项目管理。\n国际政府与开发资金\nADB批准5700多万美元融资，支持斯里兰卡屋顶光伏和虚拟净计量。\n这笔钱投向的不是单个大型电站，而是更分散、更贴近用电侧的清洁能源系统。屋顶光伏、虚拟净计量、公共机构和商业楼宇用电结算，都是让居民、企业和公共部门更容易接入清洁电力的基础设施。\n开发资金今天的方向很明确：从“建发电资产”扩展到“改造用电系统”。未来的机会不只在太阳能板，也在逆变器、储能、用电数据、净计量软件、电费结算、屋顶资源评估和本地化运维。\n普通人的机会在光伏EPC、储能、配电、用电数据、项目合规、开发银行采购、本地安装团队和清洁能源运维。\n投资机构\nPatronus AI完成5000万美元Series B融资。\n这家公司做的是AI agent训练和测试环境。它发布的Digital World Models，试图让AI agent在上线真实业务系统之前，先进入仿真工作流里练习、失败、被压力测试和被评估。\n这说明投资机构正在给“AI可靠性基础设施”付钱。过去企业买AI，常问模型能不能回答；现在企业开始问：智能体能不能在财务、客服、代码、销售、运维这些真实流程里不越权、不乱跑、不拖垮系统。\n普通人的机会在Agent评测、仿真环境、QA自动化、企业工作流建模、AI安全、可观测性、RL环境构建和行业测试数据。\n企业\nQualcomm把下一阶段增长押到AI数据中心。\nQualcomm在Investor Day公布了数据中心AI路线图，推出Dragonfly C1000 CPU、High Bandwidth Compute、Dragonfly AI300推理加速器，并宣布与Meta的多代数据中心CPU合作。公司还给出到2029财年数据中心收入超过150亿美元的目标。\n同时，Qualcomm宣布收购Modular。官方没有在新闻稿中披露金额，Barron's报道交易估值约39.2亿美元。Modular的价值在于AI软件栈、编译器、运行时和跨硬件部署能力。\n这笔钱说明，AI数据中心的竞争不只是买GPU。CPU、内存带宽、网络、推理加速器、编译器、软件栈、客户迁移和生态合作，都会成为企业资本开支和并购的重点。\n普通人的机会在AI推理优化、系统软件、编译器、数据中心平台、芯片生态、Meta和云厂商供应链、企业迁移咨询和AI基础设施销售。\n富豪资本\nKevin O'Leary继续把个人资本和媒体影响力押在AI数据中心上。\n他推动的Alberta Wonder Valley项目，公开项目库口径约700亿美元；Utah Stratos项目原拟40000英亩，后来因社区、政治和环境反对，同意大幅缩小范围。这类项目把富豪资本、算力、土地、天然气、电力、水资源和地方治理全部搅在一起。\n这不是传统富豪买股票、买楼、买球队，而是个人资本直接进入AI基础设施。但数据中心越大，越绕不开本地电价、水资源、土地权属、环评、居民沟通和政治风险。\n普通人的机会在能源规划、环评、水资源、社区沟通、土地合规、电力市场、数据中心工程和公共政策。风险也很直接：项目口径大、落地周期长、社区冲突高。\n平民消费\n618之后，普通人的钱开始转向暑期文旅，尤其是旅游专列。\n同程旅行数据显示，暑期开行的各类旅游列车预订热度同比增长超70%；55岁以上银发群体占比超60%；部分高端旅游专列线路境外游客占比达到80%至90%。部分高端线路价格也不低，公开报道中出现了20999元、76000元等人均区间。\n旅游专列卖的不是一张火车票，而是“交通+住宿+观景+餐饮+导游+医疗陪护”的整包服务。它精准击中银发族、三代同游、长线避暑、入境深度游和高客单慢旅行。\n昨日较热消费品牌：\n中国品牌：同程旅行、携程、飞猪、熊猫专列·锦绣天府、丝路梦享号、新东方快车、天山号\n国际品牌：Booking、Airbnb、Trip.com、Expedia、Klook、Agoda\n普通人的机会在旅游产品经理、专列运营、银发服务、随车医疗、目的地接待、小城文旅、跨语种导游、OTA投放、铁路文创、适老化服务和高客单线路销售。\n高薪职位\n中国高薪岗位：\n\n资深AI基础设施架构师：人民币90000至120000元/月，14薪，北京，10年以上，本科。\nAI Infra架构师：人民币50000至80000元/月，16薪，上海/深圳，5至10年，本科或硕士。\nAI Agent平台/系统架构师：人民币50000至110000元/月，15至18薪，北京/上海/深圳，5至10年。\n大模型工程架构师/推理平台工程师：人民币50000至80000元/月，16薪，北京/上海/深圳。\n数据中心电气设计/海外项目工程师：人民币30000至60000元/月，15至16薪，杭州/北京/上海/海外项目地。\nAI仿真评测/Agent QA/企业工作流测试工程师：人民币30000至70000元/月，北京/上海/深圳/杭州。\n\n国际高薪岗位：\n\nMeta Machine Learning Engineer：美国总包约187000至637000美元/年，中位数约476000美元/年。\nNvidia Machine Learning Engineer：美国总包约205000至331000美元/年。\nAI Infrastructure Engineer / Platform Engineer：美国常见总包约180000至320000美元/年。\nData Center Electrical Engineer：美国典型约98172至166392美元/年，90分位约210579美元/年。\nSenior HPC Engineer：美国平均约171000美元/年，典型区间约132000至224000美元/年。\n\n今天的钱很清楚：川渝重点项目需要工程和产业人才，ADB资金需要光伏和用电侧系统人才，Patronus需要AI agent评测和仿真人才，Qualcomm需要AI数据中心芯片和软件人才，O'Leary的数据中心资本需要能源、环评和社区治理人才，暑期旅游专列则需要高客单文旅运营和银发服务人才。\n今日结论\n今天的钱，集中在“项目、能源、AI可靠性、AI数据中心和暑期文旅”。\n国内用2276.3亿元级别的川渝共建项目推动科创、制造和基础设施；ADB用5700多万美元支持斯里兰卡屋顶光伏和虚拟净计量；Patronus AI用5000万美元融资说明AI agent需要先在仿真世界里练习和受压；Qualcomm用150亿美元数据中心收入目标和Modular收购切入AI推理基础设施；Kevin O'Leary的数据中心项目提醒我们，富豪资本也会被能源、水、土地和社区治理约束；普通消费者则开始把暑期预算投向旅游专列、银发游、亲子三代游和入境深度游。\n普通人的机会仍然在交付层：会做重点项目、会做能源和数据中心、会让AI agent可靠上线、会服务银发和家庭高客单消费的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-26",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-26/",
"date":"2026-06-26",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-26/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-26/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-26/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-26/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-26/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-26/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-26/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-26/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“国家重大工程、乌克兰重建、企业AI落地、印度云基建、碳化硅功率半导体和消费金融”。\n政府\n国内政府资金继续投向“硬基础设施+新基础设施”。\n国家发改委解读“十五五”109项重大工程时，把今年资金脉络说得很清楚：2026年“六张网”和重点领域建设投资规模合计超过7万亿元；7550亿元中央预算内投资、1万亿元超长期特别国债预计6月底前基本下达完毕；8000亿元新型政策性金融工具资金也在加快投放。一季度新开工重大水利工程15项，总投资1475亿元。\n这里的“六张网”，包括水网、新型电网、算力网、新一代通信网、城市地下管网和物流网。它不是单个项目，而是未来几年工程、设备、软件、运维、金融和地方配套资金的总入口。\n普通人的机会在重大项目申报、工程咨询、EPC、智能电网、算力中心、低空基础设施、地下管网改造、水利工程、充电设施、医疗教育数字化和政府项目合规。\n国际政府与开发资金\nEIB Group推出超过4.7亿欧元乌克兰支持包。\n这笔钱不是单一贷款，而是贷款、赠款、担保和基金承诺的组合：8000万欧元拟投向乌克兰重建旗舰基金，并预计撬动超过10亿欧元公共和私人股本；9600万欧元用于道路、桥梁和边境基础设施；5000万欧元EIB贷款配合EU赠款支持社会住房。\n开发资金今天投向的是战后恢复的底层能力：人住在哪里，货怎么通关，路桥怎么修，私营企业怎么重新获得资本。\n普通人的机会在重建工程、住房项目、道路桥梁、边境物流、项目融资、EU资金合规、战争风险保险、审计、工程设计和跨语种项目管理。\n投资机构\nHang Ten Systems完成3200万美元种子轮融资。\n这家公司由前Infosys CEO Vishal Sikka创办，Mayfield领投，Aramco Ventures参投，Jerry Yang加入董事会。它瞄准的不是再造一个通用大模型，而是帮助大型企业把AI投资转化为可衡量业务结果。\n这说明投资机构正在从“模型竞赛”转向“企业ROI竞赛”。老板愿意花的钱，不是为了说自己用了AI，而是为了更快处理流程、更低运营成本、更清楚的业务指标和更少的组织摩擦。\n普通人的机会在企业流程梳理、数据治理、AI产品经理、解决方案架构、行业顾问、售前、AI安全、评估指标和企业培训。\n企业\nAmazon宣布到2030年在印度新增130亿美元AI和云基础设施投资。\n这会把Amazon在印度2026-2030年的总投资计划推高到480亿美元。新增资金将扩充Mumbai和Hyderabad的AWS数据中心能力，为创业公司、企业和政府组织提供AI芯片、托管AI服务、云技术和开发工具。Amazon今年还会在印度新增20多个履约中心和100多个末端配送站。\n印度正在成为全球云厂商争夺AI基础设施增量的关键市场。AI不是只发生在美国西海岸，也会落在电力、机房、制冷、网络、合规、销售和本地生态里。\n普通人的机会在数据中心建设、供电、制冷、光纤、芯片采购、云迁移、DevOps、安全合规、区域销售、印度市场本地化和跨境项目管理。\n富豪资本\nRobert Friedland共同创办的I-Pulse拿到2.5亿美元CHIPS R&amp;D award。\n美国商务部CHIPS R&amp;D Office与I-Pulse签署协议，支持其开发能在高温、高频、高功率和极端环境下运行的下一代碳化硅功率半导体。美国政府还获得I-Pulse少数、非控制性股权。\n这不是传统富豪买楼、买股票、买球队，而是富豪创业资本和国家产业政策共同进入硬科技瓶颈。I-Pulse的技术应用包括脉冲功率钻探、地热、关键矿产、先进制造、医疗、国防和聚变能源。\n普通人的机会在SiC器件、功率封装、脉冲电源、地热工程、矿业设备、国防供应链、政府科研项目管理和技术商业化。\n平民消费\n618后的消费钱，今天重点看“怎么付款”。\n淘宝天猫平台上支持花呗分期免息的商品数量过亿款，同比提升26%；超过200万商家在国家贴息1%基础上补贴到免息；5000多名天猫新商家首次提供分期免息。\n高期数免息正在撬动大件和升级消费。凯越每10位购车用户中有6位选择免息，12期免息对应交易金额占免息总额97.8%；二轮车品类分期成交额同比增长15%；健康品类分期交易额同比增长超13%。宠物食品品牌蓝氏扩大中高端猫狗主粮免息覆盖，家用美容仪品牌极萌也提供6期免息。\n昨日较热消费品牌：\n中国品牌：蓝氏、凯越、极萌、Rokid、MARD马尔德、荣耀\n国际品牌：Apple、Nike、Adidas、LEGO、Booking、Airbnb、ASUS\n这说明普通消费不是只有“降价”，还有财政贴息、平台补贴、商家免息和分期工具共同改变购买门槛。\n普通人的机会在消费金融产品、分期运营、商家增长、品类投放、风控模型、宠物和健康品牌运营、二轮车门店销售、家用美容仪内容营销和售后服务。\n高薪职位\n中国高薪岗位：\n\n大模型算法专家/预训练数据算法专家：人民币50000至110000元/月，北京/上海/杭州/深圳。\n企业AI转型顾问/AI解决方案架构师：人民币35000至80000元/月，北京/上海/深圳/杭州/广州。\n云数据中心基础设施/电力/网络架构师：人民币35000至90000元/月，北京/上海/深圳/杭州/海外项目地。\n碳化硅功率半导体/电力电子/封装测试工程师：人民币30000至80000元/月，上海/深圳/苏州/无锡/西安/合肥。\n基础设施项目融资/政府资金申报/PPP项目经理：人民币30000至70000元/月，北京/上海/深圳/成都/武汉。\n消费金融风控/分期增长运营/商家金融产品经理：人民币30000至70000元/月，杭州/上海/深圳/北京。\n\n国际高薪岗位：\n\nNvidia Machine Learning Engineer：美国总包约205000至331000美元/年。\nNvidia Software Engineer / AI Infrastructure Engineer：美国总包约176000至653000美元/年。\nCloud / Data Center Infrastructure Engineer：美国、新加坡、印度和中东常见年薪约130000至250000美元。\nPower Semiconductor / SiC Device Engineer：美国、欧洲、日本、新加坡常见年薪约120000至220000美元。\nInfrastructure Finance / Reconstruction Project Manager：欧盟、开发银行、咨询公司和承包商常见年薪约100000至220000美元或欧元等值。\n\n今天的钱很清楚：政府重大工程需要项目和工程人才，EIB资金需要重建金融和合规人才，Hang Ten需要企业AI落地人才，Amazon需要云和数据中心人才，I-Pulse需要功率半导体和地热工程人才，618免息则需要消费金融和商家运营人才。\n今日结论\n今天的钱，集中在“国家重大工程、AI基础设施、硬科技瓶颈和消费金融”。\n国内用7万亿元级别的“六张网”和重点领域投资稳增长、补短板、增后劲；EIB用4.7亿欧元组合资金支持乌克兰住房、道路、边境和私营部门；Mayfield等机构用3200万美元押注企业AI落地；Amazon用新增130亿美元把印度AI和云基础设施继续做大；I-Pulse用2.5亿美元CHIPS奖励切入碳化硅功率半导体；普通消费者则在财政贴息和商家免息下，把钱投向二轮车、宠物、健康、数码和美容仪。\n普通人的机会不在“听到大词就追热点”，而在能连接真实资金和真实交付：会做项目、会懂云、会把AI落地、会做硬科技供应链、会做消费金融和商家增长的人，更靠近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-25",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-25/",
"date":"2026-06-25",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-25/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-25/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-25/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-25/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-25/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-25/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-25/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-25/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“半年末流动性、银行系统韧性、AI营销、AI内存、印度EV平台和服务型消费”。\n政府\n央行今天开展5000亿元1年期MLF，同时开展3705亿元7天期逆回购。\n这不是单一的短端资金操作，而是半年末资金面的组合维护。MLF给银行体系补中期流动性，7天期逆回购稳住短端资金价格。6月份有3000亿元MLF到期，这意味着本次MLF加量续作约2000亿元。\n这笔钱不会直接进入居民账户，但会影响银行资金成本、债券利率、货币基金收益、企业短期融资和银行同业交易。\n普通人的机会在银行资金、同业交易、固收研究、货币基金运营、银行司库、流动性风控、监管报送、金融数据系统和企业财资管理。\n国际政府与开发资金\nWorld Bank批准4.5亿美元融资，支持孟加拉国银行业改革。\n这笔钱将用于加强存款保护系统、提高孟加拉国央行监管能力、建立紧急流动性援助框架、支持银行重组策略，并推动国有银行改革。\n开发资金今天投向的不是公路或电站，而是金融系统本身。银行体系如果不稳，企业贷款、居民存款、政府融资和就业都会受影响。金融基础设施也是基础设施。\n普通人的机会在银行风险、存款保险、监管科技、银行核心系统、压力测试、金融法务、国有银行改革咨询、普惠金融和金融稳定研究。\n投资机构\nJustAI完成超过1700万美元A轮融资。\n这家公司做AI营销平台，Base10领投，Y Combinator和Peak XV Partners继续参与。它把营销工作拆成策略、创意、决策等AI Agent，用来做客户分群、内容生成、邮件和应用内沟通、留存和收入优化。\nAI正在从“客服和写文案”进入企业增长预算。老板愿意花钱的不是炫技，而是更低获客成本、更高复购、更快投放测试和更少人力消耗。\n普通人的机会在增长运营、营销数据、CRM、Lifecycle marketing、内容策略、A/B测试、客户分群、B2B销售运营、AI产品经理和MarTech实施。\n企业\nMicron FY2026 Q3收入达到414.6亿美元。\n美光这个季度GAAP净利润282.4亿美元，经营现金流253.9亿美元，资本开支71亿美元。公司把增长原因指向AI时代内存的战略价值，并称正以创纪录水平投资技术、产品和供应。\nAI基础设施不是只有GPU。训练和推理都需要高带宽内存、DRAM、NAND、先进封装、设备工程和稳定供应链。今天的钱说明，AI需求已经通过内存价格、长期客户协议、现金流和晶圆厂资本开支体现出来。\n普通人的机会在半导体制造、HBM封装、存储架构、供应链计划、设备工程、质量管理、数据中心采购、AI服务器验证、晶圆厂建设和半导体财务分析。\n富豪资本\nSajjan Jindal旗下JSW Motor用平台授权切入印度混动和电动车。\nReuters报道的印度EV合作脉络显示，JSW Motor通过与奇瑞的合作获得多个平台的使用和改造权，用于在印度打造混动和电动车。交易包含约200亿印度卢比，也就是约2.09亿美元前付款，另有后续版税。\n这不是传统股权投资，而是地缘限制下的另一种资本结构：不直接控股，用平台授权、技术适配、本地制造和版税把产业链接起来。电动车竞争不只是卖车，也是在争平台、供应链和本地化能力。\n普通人的机会在汽车平台工程、供应链本地化、技术授权法务、采购、车身/三电适配、印度市场渠道、合规认证、跨境商务和汽车项目管理。\n平民消费\n618后的钱继续流向AI硬件、爱己消费、服务体验和反向海淘。\nRokid智能眼镜在电商平台总销售额同比增长5倍；截至6月18日，京东3C数码AI趋势产品成交额同比增长100%，家电家居智能化新品成交额同比增长20倍，AI迷你工作站、AI感知设备等成交额同比增长超20倍。\n消费也在从囤货转向体验。MARD马尔德拼豆网店销售环比增长100%，日均销售额超20万元；京东医美线下自营诊所订单数环比翻倍，京东家政日常保洁成交额同比增长超200%，京东护士到家失能照护服务订单量同比增长超4倍。\n昨日较热消费品牌：\n中国品牌：Rokid、MARD马尔德、大疆、小米、荣耀、TCL、珀莱雅、李宁、朱炳仁·铜、THINKRIDER\n国际品牌：Apple、Nike、Adidas、Disney、Nintendo、LEGO、Booking、Airbnb\n这说明普通消费的钱不只追低价，也在追“更省时间、更有体验、更能表达自己、更能跨境买到”的东西。\n普通人的机会在AI硬件销售、门店体验、手作社群、内容电商、数字人直播、跨境店铺运营、本地生活服务、医美获客、家政履约、健康照护和品牌出海。\n高薪职位\n中国高薪岗位：\n\n大模型算法专家/预训练数据算法专家：人民币50000至110000元/月，北京/上海/杭州/深圳。\nAI营销增长/MarTech Agent产品经理：人民币30000至70000元/月，北京/上海/深圳/杭州。\nHBM/半导体供应链/晶圆厂设备工程师：人民币30000至80000元/月，上海/深圳/合肥/西安/无锡。\n数据中心电气/集群SRE/AI服务器验证工程师：人民币30000至70000元/月，北京/上海/华东和华北数据中心城市。\n银行风险/监管科技/流动性管理专家：人民币30000至70000元/月，上海/北京/深圳/香港。\nEV平台本地化/跨境汽车项目经理：人民币30000至70000元/月，上海/深圳/广州/海外项目地。\n\n国际高薪岗位：\n\nAI Engineer / Machine Learning Engineer：美国常见总包约150000至300000美元。\nNvidia / AI Infrastructure Engineer：美国头部AI硬件公司样本可到约460000美元/年总包。\nData Center Electrical / Power Engineer：美国常见年薪约130000至220000美元。\nSemiconductor Equipment / HBM Packaging Engineer：美国、新加坡、韩国高端岗位常见年薪约120000至220000美元，头部公司另有股票激励。\nBanking Risk / Financial Stability Specialist：国际金融机构、开发银行和大型银行常见年薪约120000至220000美元。\n\n今天的钱很清楚：央行资金需要金融和风控人才，World Bank项目需要银行改革和监管科技人才，JustAI融资需要营销AI和增长人才，Micron业绩需要半导体和数据中心供应链人才，JSW和奇瑞平台合作需要汽车本地化和跨境商务人才，618消费变化则需要AI硬件、本地生活和品牌出海人才。\n今日结论\n今天的钱，集中在“半年末流动性”和“AI进入实体供应链”。\n央行用5000亿元MLF和3705亿元逆回购稳定资金面，World Bank用4.5亿美元修补孟加拉国银行系统，JustAI用1700万美元融资把AI Agent带进企业营销预算，Micron用414.6亿美元季度收入和71亿美元资本开支证明AI内存需求已经兑现，JSW Motor用约2.09亿美元前付款加版税承接奇瑞平台，普通消费者则把钱投向AI硬件、服务体验、爱己消费和跨境购物。\n普通人的机会不只在“追AI概念”，而在能让钱落到真实业务：会管资金、会做银行风控、会卖AI工具、会做半导体供应链、会运营本地生活服务、会把汽车和消费品牌跨境落地的人，更靠近今天的资金流。\n"},{"title":"谁在花钱日报｜2026-06-24",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-24/",
"date":"2026-06-24",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-24/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-24/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-24/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-24/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-24/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-24/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-24/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-24/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“跨季流动性、中亚交通走廊、主权AI安全、欧洲GPU数据中心、SpaceX债券融资、反向海淘和暑期文旅”。\n政府\n央行今天开展6625亿元7天期逆回购。\n中国人民银行以固定利率、数量招标方式开展6625亿元7天期逆回购操作，操作利率1.40%。当天有4203亿元逆回购到期，单日净投放2422亿元。\n这笔钱的重点是维护跨季前的短端资金面。它不会直接进入居民账户，但会影响银行间利率、债券交易、货币基金收益、银行同业和企业短期融资预期。\n普通人的机会在银行资金、债券交易、银行同业、流动性管理、清算托管、货币基金运营、企业财资和金融数据系统。\n国际政府与开发资金\nEBRD向哈萨克斯坦道路升级提供最高2.3亿欧元贷款。\n这笔钱将用于完成Aktobe至Ulgaisyn之间234公里道路现代化，把现有二级单车道升级为一级双车道。项目同时服务跨里海走廊、欧洲-中国西部走廊和CAREC Corridor 1，并由AIIB共同融资。\n开发金融的钱继续投向真实连接能力：道路、口岸、物流、运输效率和区域贸易。中亚不是抽象地缘词，而是货物、能源和工程服务往返欧亚时必须经过的通道。\n普通人的机会在道路工程、国际承包、项目融资、PPP法务、交通数字化、测绘监理、施工管理、物流园区和跨境供应链服务。\n投资机构\nDream完成2.6亿美元融资，估值达到30亿美元。\n这家公司做的是面向政府和关键基础设施的主权AI与网络安全。资本押注的不是普通聊天机器人，而是国家、公共部门和关键行业能不能把AI部署在自己可控的数据、算力和安全框架里。\nAI安全正在从企业IT预算扩展到国家级基础设施预算。政府客户在意的不只是模型能力，还包括数据主权、攻击防护、本地化部署、可审计和长期运维。\n普通人的机会在安全产品、AI治理、政府行业解决方案、关键基础设施合规、威胁情报、国别数据主权、本地化部署和安全售前。\n企业\nArgentum AI签下78亿美元AI基础设施长期合同。\n这家由Super Micro支持的AI基础设施公司将部署4.7万块Nvidia GB300芯片，在波兰建设约300MW数据中心。两项长期协议分别约41亿美元和37亿美元，说明欧洲本地GPU云和主权算力正在形成更大的真实合同。\nAI基础设施的钱正在变得更像能源和地产生意：先锁客户，再锁电力、土地、服务器、网络、冷却、融资和长期运维。谁能把GPU从采购清单变成稳定交付的云服务，谁就能吃到这轮预算。\n普通人的机会在GPU集群运维、液冷和电力、数据中心项目管理、欧洲本地合规、云销售、AI平台SRE、服务器集成、网络和存储工程。\n富豪资本\nSpaceX完成250亿美元投资级债券发行。\n这是SpaceX首次发行投资级美元债券，五档优先无担保票据覆盖5年、7年、10年、20年和30年，认购订单约850亿至890亿美元。所得资金主要用于偿还过桥贷款和一般公司用途，也将继续支撑数据中心、计算硬件和电力基础设施等AI扩张。\n这不是单纯“马斯克又融资”。更重要的是，AI和航天资产开始把资本开支压力转移到投资级债券市场。模型、火箭、卫星、数据中心和电力基础设施都需要长期资金，而债券市场正在给这些资产重新定价。\n普通人的机会在债务资本市场、信用评级、投行承销、企业财务、数据中心金融、AI基础设施投研、航天供应链和长期资本开支管理。\n平民消费\n618后的钱继续流向AI购物、反向海淘和暑期文旅。\n今年618不只是比价。京东数字人已免费服务超过8万商家，618日均开播商家数量同比增长5倍；速卖通启动海外618大促，京东Joybuy把夏季黑五带到欧洲；大疆、小米、荣耀、TCL等中国数码电子品牌在海外增长势头强。\n暑期文旅也开始接力。飞猪数据显示，暑期旅行预订量同比增长超过80%；平台数据显示7月至8月亲子游占国内旅游订单约四成；去哪儿数据显示，截至6月21日，近一周暑期机票预订量环比增长65%，家庭旅客占比超过六成。\n昨日较热消费品牌：\n中国品牌：大疆、小米、荣耀、TCL、珀莱雅、李宁、朱炳仁·铜、THINKRIDER\n国际品牌：Apple、Nike、Adidas、Disney、Nintendo、LEGO、Booking、Airbnb\n这说明普通消费的钱正在从“低价囤货”转向“工具提效、跨境购买、家庭出行和兴趣消费”。消费者愿意为省时间、省选择成本、出门体验和更有身份感的品牌付费。\n普通人的机会在AI电商运营、数字人直播、跨境店铺运营、海外客服、内容本地化、文旅产品策划、亲子研学、供应链履约和品牌出海。\n高薪职位\n中国高薪岗位：\n\n大语言模型算法/AI应用专家：人民币70000至100000元/月，北京/上海/杭州/深圳，BOSS直聘、猎聘、脉脉高聘样本。\n主权AI/AI安全解决方案架构师：人民币40000至80000元/月，北京/上海/深圳，BOSS直聘、职友集、猎聘样本。\nGPU数据中心运维/电气/集群SRE：人民币30000至60000元/月，上海/北京/华东和华北数据中心集群城市，职友集、猎聘、BOSS直聘样本。\n固收交易/资金交易/债务资本市场分析师：人民币30000至70000元/月，上海/北京/香港，职友集、猎聘、金融机构招聘页样本。\n跨境电商AI运营/高级电商运营经理：人民币20000至50000元/月，杭州/深圳/广州/上海，职友集、猎聘、BOSS直聘样本。\n\n国际高薪岗位：\n\nAI Infrastructure Engineer：美国常见年薪约160000至250000美元。\nAI Security / Cybersecurity Architect：美国常见年薪约140000至220000美元。\nData Center Electrical / Power Engineer：美国常见年薪约130000至220000美元。\nDebt Capital Markets / Corporate Finance VP：美国常见总薪酬约180000至300000美元。\n\n今天的钱很清楚：央行短端资金需要资金和债券人才，EBRD道路贷款需要国际工程和项目融资人才，Dream融资需要AI安全人才，Argentum和SpaceX需要数据中心、电力、GPU运维和债券市场人才，平民消费则需要AI电商和跨境运营人才。\n今日结论\n今天的钱，集中在“跨季资金”和“AI基础设施资本化”。\n央行用6625亿元逆回购稳定短端资金，EBRD把2.3亿欧元投向中亚道路，Dream用2.6亿美元融资把主权AI推给政府客户，Argentum AI用78亿美元合同把欧洲GPU算力做成长期资产，SpaceX用250亿美元债券把AI扩张接到投资级债券市场，普通消费者则把钱投向AI购物、反向海淘和暑期文旅。\n普通人的机会不只在会用AI，而在会让钱落地：会管资金、会做安全、会建数据中心、会跑跨境店铺、会把旅行和消费产品卖出去的人，今天更靠近资金流。\n"},{"title":"谁在花钱日报｜2026-06-23",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-23/",
"date":"2026-06-23",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-23/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-23/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-23/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-23/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-23/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-23/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-23/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-23/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“短端流动性、电网、AI推理云、AI数据中心电力、家族控股权、线下体验和健康消费”。\n政府\n央行今天开展5245亿元7天期逆回购。\n中国人民银行以固定利率、数量招标方式开展5245亿元7天期逆回购操作，操作利率1.40%，全额满足一级交易商需求。\n这笔钱的重点是维护短端资金面。它不是长期产业资金，但会影响银行间利率、债券交易、货币基金收益和金融机构的日常资金调度。\n普通人的机会在银行资金、债券交易、流动性管理、清算托管、货币市场基金、金融系统建设和利率研究。\n国际政府与开发资金\nEBRD向波黑输电网提供最高4600万欧元贷款。\n这笔钱将用于采购和安装4台可变并联电抗器，改善波黑输电系统的电压稳定，降低网损，并为更多可再生能源接入和跨境电力交换创造条件。\n电网正在成为能源转型里最容易被低估的环节。光伏、风电和数据中心都需要电，但真正决定能不能接入、能不能稳定运行的，是输电网、变电站、无功补偿和调度系统。\n普通人的机会在电网设备、电力系统规划、变电站工程、无功补偿、项目融资、区域电力交易和新能源并网服务。\n投资机构\nGroq完成6.5亿美元增长资本融资。\n这家公司把方向押在AI推理云。它称目前运营13个数据中心，服务超过500万开发者，并计划到2027年底向200MW规模扩展。\nAI投资的重心正在从“谁训练最大模型”继续转向“谁能稳定、便宜、低延迟地跑模型”。企业真正开始大规模用AI时，花钱最多的不是演示，而是推理、调度、网络、可用性和成本控制。\n普通人的机会在推理优化、MLOps、GPU和加速器调度、数据中心运维、云销售、企业AI交付、Token成本治理和AI应用性能工程。\n企业\nChevron与Microsoft签下20年西德州数据中心供电协议。\nChevron子公司Energy Forge One将开发Project Kilby，为Microsoft运营的数据中心提供专用电力。项目预计约2.67GW容量，主要由GE Vernova大型燃气轮机供电，并由Caterpillar旗下Solar Turbines补充。官方预计项目2028年首次供电，并可能支持约2000个岗位、带来超过100亿美元州和地方税收。\n这说明AI云扩张已经不只是买GPU。真正的瓶颈开始变成电力、土地、水、施工、排放控制、长期购电合同和地方政府关系。\n普通人的机会在数据中心电力、燃机设备、项目开发、能源合同、环境合规、云基础设施规划、施工管理和本地就业。\n富豪资本\nDel Vecchio家族出现100亿欧元级控股权交易拉锯。\nLeonardo Maria Del Vecchio正在推动收购兄妹Luca和Paola合计25%的Delfin股权。若交易完成，他的持股将升至37.5%，成为Delfin最大股东。Delfin是Ray-Ban背后EssilorLuxottica的重要持股平台，也持有意大利金融机构投资。\n这不是简单的“富二代买股份”，而是家族财富进入继承、治理和融资重组阶段。大钱在这里买的不是单个资产，而是决策权、分红路径和长期控制力。\n普通人的机会在家族办公室、并购融资、财富管理、股权治理、奢侈品集团投研、银行贷款安排和跨境法律服务。\n平民消费\n618的钱继续流向线下体验、智能硬件和健康服务。\n人民日报报道，6月以来，“馕来了”文创产品团队自营网店销售额较上月增长超70%；荣耀线下单店销售额较上周增长18%；美团“肩颈推拿”搜索热度同比增长超135%，“夏日理疗”搜索热度同比增长近65%；京东健康品类开门红52小时内多个品类销售额同比增长超10倍。\n21世纪经济报道援引京东数据称，超5600家京东3C数码门店52小时客流同比增长138%，27家京东MALL销售额同比增长53%，京东养车服务订单量同比增长超110%，京东医美订单量环比增长226%。\n这说明今年618后段，消费者不只是等低价。钱在流向能体验、能立刻交付、有人服务、还能解决健康和日常效率问题的东西。\n昨日较热消费品牌：\n中国品牌：华为、荣耀、影石创新、小米、海尔、京东服务、白塔寺药店\n国际品牌：Apple、Sony PlayStation、Dyson、Nintendo、LEGO、Nespresso、高仪/GROHE\n普通人的机会在门店运营、3C导购、家电安装售后、健康服务、本地生活、即时零售、体验空间设计和私域复购。\n高薪职位\n中国高薪岗位：\n\nAI推理/MLOps平台工程师：人民币50000至90000元/月，北京/上海/深圳/杭州，BOSS直聘、职友集、猎聘样本。\n机器学习平台/LLMOps后端工程师：人民币30000至60000元/月，北京/上海/武汉/深圳，BOSS直聘、职友集、智联/猎聘样本。\nAI芯片/CPU验证工程师：人民币30000至50000元以上/月，上海/北京/深圳，职友集、BOSS直聘、猎聘样本。\n数据中心电力/电气/电力系统工程师：人民币30000至80000元/月，华北、华东、华南和西部数据中心集群城市，猎聘、BOSS直聘、职友集样本。\n跨境并购融资/家族办公室投资经理：人民币40000至90000元/月，北京/上海/香港/新加坡，猎聘、脉脉高聘、金融机构招聘样本。\n\n国际高薪岗位：\n\nAI Infrastructure Engineer：美国常见年薪约160000至250000美元。\nMachine Learning Engineer：Levels.fyi中位总薪酬约270000美元。\nAI Engineer：Levels.fyi中位总薪酬约153750美元。\nData Center Power/Electrical Engineer：美国常见年薪约130000至220000美元。\n\n今天的钱很直接：央行短端资金需要资金交易和系统人才，EBRD电网贷款需要电力工程人才，Groq融资继续抬高推理云岗位价格，Microsoft和Chevron的项目让数据中心电力人才更贵，Del Vecchio交易则对应家族办公室、并购融资和跨境法律服务。\n今日结论\n今天的钱，集中在“短端资金”和“AI基础设施的真实约束”。\n央行用5245亿元逆回购维护资金面，EBRD投电网，Groq拿6.5亿美元扩推理云，Microsoft和Chevron把AI数据中心的问题落到2.67GW电力，Del Vecchio家族把财富传承推进到控股权融资，普通消费者继续为线下体验、健康服务和智能硬件付费。\n普通人的机会不只在“会AI”，而在会把AI、电力、金融和服务交付连起来：会算成本、会管工程、会做系统、会服务现场的人，正在变贵。\n"},{"title":"谁在花钱日报｜2026-06-22",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-22/",
"date":"2026-06-22",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-22/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-22/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-22/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-22/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-22/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-22/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-22/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-22/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“离岸央票、亚欧水利、AI推理融资、AI云债券、央企回购、618服务消费和基础设施人才”。\n政府\n央行今天在香港投标发行400亿元6个月期央票。\n中国人民银行通过香港金管局CMU债券投标平台，招标发行2026年第六期中央银行票据。发行量为人民币400亿元，期限6个月，6月22日投标，6月24日交收，12月23日到期。\n这笔钱的重点不是“放水”，而是给离岸人民币市场补资产。香港人民币市场需要高信用等级、可定价、可交易的人民币资产，央票就是收益率曲线里的锚。\n普通人的机会在债券交易、银行资金、托管清算、跨境金融产品、离岸人民币研究和金融系统建设。\n国际政府与开发资金\nEBRD拟向亚美尼亚水库项目提供6300万欧元。\n欧洲复兴开发银行项目文件显示，亚美尼亚水库一期项目拟获得最高6300万欧元主权贷款，项目总成本约9000万欧元。资金将支持Kassakh、Lichk、Yelpin、Artik、Astghadzor等水库建设，用于提高灌溉和抗旱能力。\n气候适应不是抽象口号。对农业和城市来说，水库、泵站、管网、调度系统和维护能力，就是未来几年最硬的公共投资。\n普通人的机会在水利工程、测绘、施工管理、泵站设备、传感器、灌溉系统、气候适应咨询和国际工程承包。\n投资机构\nBaseten据报接近完成15亿美元融资。\nAI推理平台Baseten据报接近完成15亿美元融资，估值约130亿美元。它此前已经完成3亿美元Series E，估值约50亿美元。\n这说明资本正在把注意力从“谁训练最大模型”转到“谁能便宜稳定地跑模型”。企业真正花钱时，关心的是延迟、可用性、GPU调度、成本曲线和上线速度。\n普通人的机会在MLOps、推理优化、GPU调度、模型服务、API网关、企业AI交付和成本治理。\n企业\nCoreWeave用高息债券支撑AI云扩张。\nCoreWeave近期定价12.5亿美元2032年到期高级票据，票息9.625%；同时定价20亿欧元2032年到期高级票据，票息8.500%。它也在6月22日前进入Nasdaq-100。公司Q1收入约21亿美元，全年收入指引约120亿至130亿美元，但季度净亏损约7.4亿美元，期末总债务接近250亿美元。\nAI云正在从“股权融资买GPU”进入“债务融资滚资产”的阶段。谁能把GPU、客户合约、电力和债务期限匹配好，谁才可能撑过扩张周期。\n普通人的机会在AI云销售、GPU集群运维、债务融资分析、云成本管理、数据中心电力、合规采购和企业迁移服务。\n富豪资本\n中国中铁完成约8亿元股份回购并拟注销。\n中国中铁公告显示，2025年6月20日至2026年6月19日，公司累计回购1.55亿股，占总股本0.6275%，使用资金约8亿元，不含交易费用。公司将注销所回购股份。\n对大型央企来说，回购注销不是简单买股票，而是把现金流、融资工具、投资者回报和市值管理放到同一个框架里。\n普通人的机会在央国企资本运作、证券事务、投关、回购专项贷款、会计处理、指数研究和低估值蓝筹研究。\n平民消费\n618的钱从AI硬件扩散到服务、健康和娱乐。\n京东家政日常保洁成交额同比增长超200%，家电清洗成交额同比增长超300%。天猫侧，男士叶酸成交额增长672%，PS5等电玩主机成交额增长490%，宠物保险成交额增长56倍。京东AI趋势产品成交额同比增长100%，AI迷你工作站和AI感知设备成交额增长超20倍。\n这说明今年618的后半段不只是低价，也不是只卖AI硬件。消费者在买服务履约、悦己健康、线上娱乐和风险保障。\n昨日较热消费品牌：\n中国品牌：华为、小米、海尔、科大讯飞、Rokid、京东服务、泡泡玛特\n国际品牌：Apple、Sony PlayStation、Dyson、Nintendo、LEGO、Nike、adidas\n普通人的机会在本地生活服务、家电后市场、健康消费内容、宠物保险销售、电玩内容、AI硬件门店体验和售后维修。\n高薪职位\n中国高薪岗位：\n\nAI推理/MLOps平台工程师：人民币50000至90000元/月，北京/上海/深圳/杭州，BOSS直聘、猎聘、职友集样本。\nAI云成本/FinOps解决方案专家：人民币35000至70000元/月，北京/上海/深圳，BOSS直聘、智联招聘、看准网样本。\n数据中心电力/网络/SRE工程师：人民币40000至80000元/月，华东/华南/华北，猎聘、职友集、BOSS直聘样本。\n固收/资金交易/债券托管清算岗位：人民币35000至80000元/月，北京/上海/深圳/香港，猎聘、智联招聘、看准网样本。\n水利工程/城市韧性项目经理：人民币30000至60000元/月，国内一线/区域中心城市，猎聘、职友集、智联招聘样本。\n\n国际高薪岗位：\n\nAI Infrastructure Engineer：美国常见年薪约160000至250000美元。\nMLOps Engineer：美国常见年薪约150000至230000美元。\nCloud FinOps Lead：美国常见年薪约140000至220000美元。\nData Center Power Engineer：美国常见年薪约130000至220000美元。\n\n今天的钱很直接：央票需要固收和清算人才，水库需要工程和项目人才，Baseten需要推理平台人才，CoreWeave需要AI云、债务和电力人才，618需要服务履约和消费运营人才。\n今日结论\n今天的钱，集中在“资产供给”和“基础设施融资”。\n央行给离岸市场供人民币资产，EBRD投水库，Baseten和CoreWeave拿钱扩AI推理和AI云，中国中铁回购注销稳定股本结构，普通消费者继续为服务、健康和娱乐付费。\n普通人的机会在资金系统、工程系统和AI系统之间：会算账、会交付、会运营的人，正在变贵。\n"},{"title":"谁在花钱日报｜2026-06-19",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-19/",
"date":"2026-06-19",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-19/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-19/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-19/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-19/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-19/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-19/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-19/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-19/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“离岸人民币工具、南亚市政水务、AI营销、消费品牌AI转型、印度AI基础设施、618收官消费和跨界AI人才”。\n政府\n央行继续把人民币流动性工具推向离岸市场。\n陆家嘴论坛前后，央行释放的信号很清楚：人民币国际化不只靠汇率和贸易结算，也要靠可交易、可融资、可管理的离岸工具箱。境外央行类机构回购工具服务的是人民币流动性管理；6月22日在香港招标发行的400亿元6个月期央票，则补充香港市场的高信用等级人民币资产。\n这类钱不直接进普通人的账户，但会影响跨境资金、人民币债券、银行同业、托管清算和企业跨境融资。\n普通人的机会在债券交易、跨境支付、人民币资产配置、银行系统、资金清算、金融科技和机构客户服务。\n国际政府与开发资金\nADB批准1.15亿美元支持尼泊尔市政水务。\n亚洲开发银行批准1.15亿美元贷款，用于加强尼泊尔市政供水、卫生和韧性服务。开发性资金继续流向城市基本公共服务：水从哪里来、污水怎么处理、灾害来时系统能不能撑住。\n这不是最性感的AI故事，但它是真实城市运转的底层账本。\n普通人的机会在水务工程、污水处理、城市运维、抗灾系统、项目管理、国际工程承包和ESG咨询。\n投资机构\nGradial拿到6500万美元，AI开始接管营销流程。\nGradial完成6500万美元Series C，估值约6.75亿美元。它做的不是单点文案工具，而是把AI代理接进Adobe、Salesforce、ServiceNow、Databricks等企业系统，帮营销团队自动完成内容、审批、活动执行和跨系统协作。\n资本在买一个更具体的命题：AI不只是聊天窗口，而是企业工作流里的执行层。\n普通人的机会在营销自动化、CRM/MarTech实施、企业AI产品经理、销售运营、数据治理和行业解决方案。\n企业\nSmartbird卖掉鞋履业务，转向AI基础设施。\n原Allbirds鞋履业务出售金额约4300万美元，公司又从公开市场筹资约1亿美元，并把新故事转向AI基础设施。这是一个非常典型的2026年资本市场画面：旧消费品牌增长吃力，新叙事转向AI。\n它的风险也很直接：钱已经进来，业务还要证明。\n普通人的机会在AI基础设施运营、算力销售、企业转型顾问、品牌资产处置、资本市场研究和投资者关系。边界也要清楚：AI叙事很贵，执行失败也会很快。\n富豪资本\nAmbani继续把Reliance推向印度AI基础设施。\nMukesh Ambani强调，印度不能只是消费别人创造的AI，而要成为AI创造者、采用者和全球领导者。Reliance此前宣布的AI基础设施投入计划达到约1100亿美元，背后是电信网络、云服务、模型能力、设备入口和家庭场景的组合。\n这类富豪资本不是投一个App，而是投一个国家级入口：电话、家庭、支付、娱乐、云和AI服务都可能被重新打包。\n普通人的机会在印度数字服务、云交付、低成本AI应用、本地语言模型、设备渠道、客服自动化和跨境SaaS出海。\n平民消费\n618收官，钱流向AI硬件、服务消费和悦己消费。\n京东618全周期战报显示，高端手机成交额同比增长300%，AI硬件成交额增长超20倍，以旧换新订单量增长130%，线下门店订单量翻倍。另有平台战报显示，AI眼镜、AIPC、大屏AI手机等AI趋势产品成交额同比增长100%，AI迷你工作站和AI感知设备等成交额增长超20倍。\n更值得注意的是服务消费：家政保洁成交额同比增长超200%，家电清洗成交额同比增长超300%。天猫侧的男士叶酸、电玩主机、宠物保险等品类，也说明“悦己”和“照顾自己”开始成为消费关键词。\n昨日较热消费品牌：\n中国品牌：华为、小米、联想、Rokid、大疆、影石、科大讯飞\n国际品牌：Apple、ASUS、Sony PlayStation、Dyson、LEGO、Nike、adidas\n普通人的机会在AI硬件测评、门店体验、家电售后、家政履约、二手回收、直播导购、宠物金融和本地生活运营。\n高薪职位\n中国高薪岗位：\n\nAI Infra/大模型基础设施架构师：人民币60000至90000元/月，北京/上海/深圳/杭州，BOSS直聘、猎聘、职友集样本。\n企业AI营销/增长解决方案架构师：人民币35000至70000元/月，北京/上海/深圳/杭州，BOSS直聘、智联招聘、猎聘样本。\n数据中心电力/液冷/能源解决方案工程师：人民币35000至75000元/月，华东/华南/华北，猎聘、职友集、看准网样本。\n网络安全攻防/安全研究员：人民币35000至80000元/月，北京/上海/深圳，BOSS直聘、猎聘、看准网样本。\n机器人软件/运动控制工程师：人民币35000至70000元/月，上海/深圳/苏州/杭州，BOSS直聘、猎聘、智联招聘样本。\n\n国际高薪岗位：\n\nAI Infrastructure Engineer：美国常见年薪约160000至250000美元。\nMachine Learning Engineer：美国高阶岗位常见年薪约180000至300000美元。\nAI Security Engineer / Security Researcher：美国常见年薪约140000至240000美元。\nRobotics Software Engineer：美国常见年薪约130000至220000美元。\n\n今天的钱说明一个变化：高薪不只在模型训练岗位，也在企业流程、数据中心、电力液冷、网络安全、机器人和营销系统里。\n今日结论\n今天的钱，正在从“买概念”转向“买连接层”。\n央行补离岸人民币工具，ADB投城市水务，Gradial把AI接进企业营销，Smartbird把旧消费品牌改造成AI故事，Reliance把AI做成印度级基础设施，普通人则在618买AI硬件、服务和悦己体验。\n机会不只在写模型，而在把资金、设备、AI、服务履约和企业系统接起来。\n"},{"title":"谁在花钱日报｜2026-06-18",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-18/",
"date":"2026-06-18",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-18/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-18/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-18/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-18/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-18/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-18/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-18/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-18/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“短端流动性、欧洲公共融资、网络攻防、AI工厂、AI供应链财富、618 AI消费和AI基础设施人才”。\n政府\n央行今天投放2480亿元7天期逆回购。\n6月18日，中国人民银行以固定利率、数量招标方式开展2480亿元7天期逆回购操作，操作利率1.40%。今天有1885亿元到期，公开市场实现净投放595亿元。\n这笔钱的意义不只在单日投放。前一日，央行还优化了临时隔夜正、逆回购工具，把操作时间调整为工作日15:00至15:30，并把临时隔夜正/逆回购利率设置为7天期逆回购利率减/加25个基点。短端利率调控正在变得更细。\n普通人的机会在债券交易、银行同业、资金系统、企业财务、量化利率策略和人民币资产服务。\n国际政府与开发资金\nEIB Group继续按约1000亿欧元融资节奏投钱。\n欧盟财长背书EIB Group的新战略，核心是用更高风险偏好去支持能源自主、技术领导力、安全防务、乌克兰韧性和Global Gateway。EIB Group今年计划维持约1000亿欧元总体融资节奏，2025年TechEU项目承诺超过220亿欧元，欧洲Tech Champions Initiative扩容目标是动员150亿欧元。\n这不是一个单点项目，而是欧洲把公共融资投向“产业主权”和“安全韧性”的组合拳。\n普通人的机会在欧洲能源项目、深科技融资、AI和数字基础设施、国防供应链、乌克兰重建、公共项目咨询和跨境项目管理。\n投资机构\nTwenty拿到1亿美元，网络攻防继续吸金。\n网络安全创业公司Twenty完成1亿美元Series B，估值10亿美元。Accel领投，Friends &amp; Family Capital、Point72 Ventures和Caffeinated Capital等参与。它的定位不是传统企业安全告警平台，而是更偏网络攻防能力和关键基础设施安全。\n资本愿意为这类公司付钱，是因为政府、军方、关键基础设施和大型企业都在面对更高频的网络攻击风险。\n普通人的机会在安全研究、威胁情报、红队/蓝队、漏洞验证、安全合规、关键基础设施防护和安全产品销售。边界也要清楚：只做授权测试，不碰非法攻击。\n企业\nSharon AI融资16亿美元，继续买AI工厂。\nSharon AI完成16亿美元战略融资，包括约9亿美元普通股/预融资权证和7亿美元可转债。资金将用于支持它与NVIDIA的六年战略算力合作，计划部署最多4万块Grace Blackwell GB300 GPU。公司称总AI Factory容量已经扩至132MW，其中102MW已签约给终端客户。\n这说明AI基础设施正在从“模型公司买卡”变成“地区算力运营商融资建厂”。GPU、机房、电力、网络、客户合约和云服务被打包成新的企业资产。\n普通人的机会在GPU集群运维、数据中心电力、液冷、光模块、云销售、主权AI项目、企业算力采购和AI成本管理。\n富豪资本\nAI和芯片供应链继续造富。\n2026新财富500创富榜显示，张一鸣以5439亿元继续位列榜首，百亿级企业家达到464位，比去年增加123位。更值得看的变化是，AI、芯片、光模块、PCB、新能源汽车等供应链节点正在制造新一轮财富。\n例如，中国宏桥张波家族持股市值约1888亿元，胜宏科技陈涛家族持股市值从106亿元升至652亿元。资本市场给出的信号很直接：不只是大模型公司值钱，AI基础设施和硬件供应链也在被重新定价。\n普通人的机会在PCB、光模块、先进封装、服务器、液冷、功率器件、工业软件、供应链金融、产业研究和并购服务。\n平民消费\n618的钱继续流向AI硬件、官方直降和跨境出海。\n京东首轮数据显示，AIPC、AI眼镜、大屏AI手机、智能学习机等消费级AI产品成交额同比增长200%，AI迷你工作站和工业感知设备等B端智能硬件成交同比增长10倍以上。天猫AI智能硬件销售额同比增长80%，AI眼镜同比增长9倍。京东新商家数量同比增长超过62%。\n昨日较热消费品牌：\n中国品牌：华为、小米、科大讯飞、联想、追觅、泡泡玛特、京东京造\n国际品牌：Apple、Meta Ray-Ban、Nintendo、LEGO、Nike、adidas、Dyson\n今年618的关键词不是单纯低价，而是“能看见用途的AI终端”。消费者买的是AI眼镜、AI PC、AI学习机、AI家电、即时履约和跨境好价；商家买的是AI客服、AI推荐、AI投放和供应链效率。\n普通人的机会在AI硬件测评、门店体验、AI导购脚本、直播运营、跨境店铺、即时零售、售后维修和内容电商。\n高薪职位\n中国高薪岗位：\n\nAI Infra/大模型基础设施架构师：人民币60000至90000元/月、15-16薪，北京/上海/深圳/杭州，BOSS直聘和猎聘样本。\nGPU集群/HPC运维与SRE：人民币45000至80000元/月、14-16薪，深圳/上海/北京，BOSS直聘与职友集样本。\nAI安全/数据安全大模型专家：人民币35000至70000元/月，北京/上海/深圳，职友集、看准网和招聘平台样本。\n数据中心电力与液冷解决方案架构师：人民币35000至70000元/月，华东/华南/华北，猎聘和智联招聘样本。\n量化研究员/策略研究员：人民币50000至100000元/月，上海/北京/深圳，猎聘和BOSS直聘样本。\nAI产品/GTM解决方案架构师：人民币35000至70000元/月，北京/上海/深圳/杭州，BOSS直聘、猎聘和智联招聘样本。\n\n国际高薪岗位：\n\nAI Engineer：美国中位数约151000美元/年。\nMachine Learning Engineer：美国中位数约270000美元/年。\nAI Infrastructure Engineer：美国平均约169000美元/年上下。\nCybersecurity Engineer / Security Researcher：美国常见年薪约130000至220000美元，取决于授权攻防、政府合同和安全研究经验。\n\n这些岗位对应今天的钱：央行管短端资金，EIB加码公共融资，Twenty把网络攻防融资推到10亿美元估值，Sharon AI拿16亿美元买AI工厂，618把AI硬件卖给普通消费者。AI进入真实组织后，基础设施、安全和商业化能力都变贵了。\n今日结论\n今天的钱，继续流向“稳定器”和“加速器”。\n稳定器是央行短端流动性、EIB公共融资和利率工具；加速器是网络安全、AI工厂、GPU云、AI硬件和AI供应链财富。\n普通人的机会不只在写模型，而在把AI接入金融、能源、网络安全、数据中心、消费终端、跨境销售和企业交付这些真实场景。\n"},{"title":"谁在花钱日报｜2026-06-17",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-17/",
"date":"2026-06-17",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-17/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-17/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-17/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-17/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-17/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-17/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-17/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-17/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“短端流动性、危机融资、AI安全、GPU-as-a-Service、AI创业销售引擎、618 AI消费和AI基础设施人才”。\n政府\n央行今天投放4203亿元短端流动性。\n6月17日，中国人民银行以固定利率、数量招标方式开展4203亿元7天期逆回购操作，全额满足一级交易商需求。\n这笔钱不直接进企业项目，也不直接进个人账户。它的作用是让银行体系短端资金不断档，稳定货币市场利率、债券交易和企业短期融资预期。\n普通人的机会在资金交易、债券研究、银行同业、现金管理、企业财务和金融数据系统。\n国际政府与开发资金\n世界银行准备在冲击期拿出最高1000亿美元。\n在6月全球经济展望中，World Bank Group提示全球增长放缓，以及能源、食品、融资成本对发展中经济体的压力。它表示，现有工具可立即提供约600亿美元支持，并可在15个月内扩展至最高1000亿美元。\n这不是单个国家贷款，而是一组危机融资、担保和私营部门方案。钱会优先流向能源、食品、财政稳定、企业融资和民生保障。\n普通人的机会在国际项目咨询、能源贸易、农业供应链、担保产品、发展金融法务、风险评估和公共部门数据服务。\n投资机构\nEnt拿到1亿美元seed融资，押注AI时代的工作区安全。\nEnt从stealth状态公开，完成1亿美元seed financing。投资方包括Decibel、Sequoia、Crosspoint Capital Partners、Craft Ventures、Shield Capital、Felicis和In-Q-Tel。它的方向是intent-aware Workspace Security，也就是在人和AI agent执行高风险动作时，实时判断意图并干预。\nAI把攻击、误操作和数据泄露的速度都变快了，企业安全正在从“事后检测”转向“操作当下阻断”。\n普通人的机会在安全产品、企业AI治理、DLP、浏览器安全、endpoint agent、合规审计和安全售前。\n企业\nHydra Host融资1亿美元，做AI工厂的运营系统。\nHydra Host完成1亿美元Series A，由Kindred Ventures领投，NVIDIA、ARK Invest、Founders Fund、Comcast Ventures、Magnetar等参与。公司要扩张GPU-as-a-Service和AI factory operating system，称其网络覆盖50多个数据中心。\nAI基础设施的难题正在从“有没有GPU”，变成“怎样把电力、机房、GPU、客户负载和商业结算接起来”。\n普通人的机会在GPU运维、裸金属云、数据中心运营、算力经纪、供应链采购、AI平台SRE和企业算力成本管理。\n富豪资本\nRatmir Timashev把超过1亿美元投向Columbus的AI创业销售引擎。\nVeeam联合创始人Ratmir Timashev通过OH.io押注Columbus，计划五年引入100家B2B软件和AI公司，带来约2000个科技岗位。OH.io不是简单写支票，而是为创业公司在美国搭建销售和GTM团队，团队工资由OH.io承担，创业公司不出让股权，而是按收入分成。\n这说明AI创业不只缺模型和工程，也缺能卖进企业的销售、售前和客户成功团队。\n普通人的机会在B2B销售、售前工程、客户成功、渠道管理、国际创业公司美国落地、AI产品运营和区域创业生态建设。\n平民消费\n618继续把钱推向AI硬件、线下门店和跨境促销。\n京东AI家电家居新品成交额环比增长200%，AI眼镜、AIPC、大屏AI手机、AI学习机等3C数码AI趋势品类成交额同比增长200%；天猫AI智能硬件同比增长80%，AI眼镜同比增长9倍。\n昨日较热消费品牌：\n中国品牌：华为、小米、科大讯飞、追觅、Ulike、泡泡玛特、京东京造\n国际品牌：Apple、Meta Ray-Ban、Nintendo、LEGO、Nike、adidas、Pampers\n今天的消费关键词是“可解释的AI终端”。消费者不是只买概念，而是在买能看见用途的AI眼镜、AIPC、学习机、AI家电、即时履约和跨境好价。\n普通人的机会在AI硬件导购、门店体验、短视频内容、售后维修、跨境履约、酒水电商、医美获客、本地零售运营和AI消费品测评。\n高薪职位\n中国高薪岗位：\n\nAI Infra开发/专家/架构师：人民币60000至90000元/月、16薪，深圳，BOSS直聘样本。\n腾讯AI Infra-大模型训练与推理优化：人民币50000至80000元/月、15薪，北京/上海/深圳，BOSS直聘样本。\nAgent算法应用架构师：人民币40000至70000元/月、15薪，北京朝阳，BOSS直聘样本。\nAI Infra高级工程师/架构师：人民币40000至70000元/月，深圳，职友集样本。\n高性能计算研发工程师：人民币40000至70000元/月、16薪，北京，BOSS直聘样本。\nAI安全/数据安全大模型技术专家：人民币35000至65000元/月，深圳，职友集样本。\n\n国际高薪岗位：\n\nAI Engineer：美国中位数约151000美元/年。\nMachine Learning Engineer：美国中位数约270000美元/年。\nML / AI Software Engineer：美国平均总包约244275美元/年。\nAI Infrastructure Engineer：美国平均约169738美元/年。\n\n这些岗位对应今天的钱：央行稳短端流动性，世界银行准备危机融资，Ent投AI安全，Hydra Host投GPU运营，Timashev投AI销售引擎，618继续卖AI硬件。AI进入真实组织后，基础设施、风险控制和商业化能力都变贵了。\n今日结论\n今天的钱，在给AI和实体经济加“稳定器”。\n央行用4203亿元7天逆回购稳住短端资金；世界银行准备最高1000亿美元危机支持；Ent用1亿美元融资押注AI安全；Hydra Host用1亿美元融资扩张GPU-as-a-Service；Ratmir Timashev用超过1亿美元在Columbus搭建AI创业销售引擎；消费者继续在618里把钱投向AI硬件、线下体验和跨境渠道。\n普通人的机会不只是写模型，而是把模型接进真实世界：资金管理、危机融资、AI安全、GPU运维、数据中心电力、B2B销售、AI硬件渠道和企业级客户交付。\n"},{"title":"谁在花钱日报｜2026-06-16",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-16/",
"date":"2026-06-16",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-16/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-16/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-16/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-16/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-16/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-16/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-16/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-16/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“离岸人民币、非洲通电、Physical AI、AI工厂、开发者工具、结构性消费和AI基础设施人才”。\n政府\n财政部今天把150亿元人民币国债发到香港市场。\n6月16日，财政部在香港特别行政区面向机构投资者招标发行2026年第三期人民币国债，认购倍数3.86倍。其中2年期45亿元、3年期45亿元、5年期35亿元、10年期25亿元。\n这不是一个建设项目，但它是人民币资产供给。钱从机构投资者流向离岸人民币债券市场，影响的是资金成本、资产配置和香港人民币市场深度。\n普通人的机会在债券销售、财富管理、银行同业、跨境资金、人民币资产研究、离岸市场运营和金融科技服务。\n国际政府与开发资金\n世界银行和非洲开发银行把电力接入推进到5000万人规模。\n6月16日，World Bank Group和African Development Bank Group宣布，Mission 300已经让40个国家超过5000万人获得电力服务，执行速度接近启动时的两倍。这个计划的长期目标，是到2030年让3亿人获得电力。\n这类钱不是单个贷款新闻，而是一组电网、微电网、项目融资和政策执行的组合。电先到，工厂、冷链、教育、医疗和数字服务才有可能跟上。\n普通人的机会在电网工程、微电网、光储、计量设备、电力运维、项目融资和非洲市场供应链。\n投资机构\nPegasus和CYBERDYNE拿出100亿日元投Physical AI。\nPegasus Tech Ventures与CYBERDYNE设立100亿日元企业创投基金，约6000万美元。Pegasus担任GP，CYBERDYNE是唯一LP，基金重点投向机器人、Physical AI、医疗健康、自动化和智能系统。\n这说明AI投资正在从屏幕里的软件，继续往人机协作、康复、物流、工厂和日常工作场景移动。\n普通人的机会在机器人产品、医疗器械、康复设备、工业自动化、嵌入式AI、供应链和海外BD。\n企业\nNvidia和Coherent把AI工厂的钱投到Texas制造。\nNvidia与Coherent推进约20亿美元AI基础设施合作，Sherman, Texas工厂扩建用于生产芯片高速互连所需的Indium Phosphide激光材料。项目叠加约5000万美元政府支持，其中3300万美元来自CHIPS相关支持，1700万美元为新增grant。\nCoherent估计扩建会带来约1000个岗位，其中约550个是先进制造、工程和技术岗位。AI基础设施的瓶颈不只在GPU，也在光通信、材料、供电、厂务和本地制造。\n普通人的机会在光模块、半导体材料、先进制造、设备维护、厂务工程、数据中心能效和AI硬件供应链。\n富豪资本\nElon Musk用SpaceX股票买下Cursor。\nSpaceX宣布以600亿美元全股票交易收购AI代码工具Cursor，预计2026年第三季度完成。Cursor将成为SpaceX全资子公司，并与xAI/Grok及相关算力设施更深绑定。\n开发者工具正在从“小而美SaaS”变成巨头AI战略资产。会写代码的人越来越多，但能让代码生产更可靠、更安全、更可控的系统，正在变得更贵。\n普通人的机会在AI代码助手、企业研发平台、代码安全、模型评测、私有化部署、开发者运营和高可靠工程。\n平民消费\n消费总量承压，但线上服务和结构性新品仍有韧性。\n国家统计局数据显示，1至5月社会消费品零售总额206031亿元，同比增长1.4%；5月社会消费品零售总额41090亿元，同比下降0.6%。同时，1至5月全国网上商品和服务零售额83177亿元，同比增长5.9%，网上服务零售额30459亿元，同比增长7.6%。\n昨日较热消费品牌：\n中国品牌：华为、小米、追觅、Ulike、泡泡玛特、天猫、京东\n国际品牌：Apple、Nintendo、LEGO、Nike、adidas、Meta Ray-Ban、Samsung\n今天的消费关键词不是“都在涨”，而是“总量压力下找结构”。普通人的机会在本地即时零售、便利店运营、线上服务、折扣渠道、AI硬件导购、售后服务、内容电商和消费数据分析。\n高薪职位\n中国高薪岗位：\n\nAI Infra开发/专家/架构师：人民币60000至90000元/月、16薪，深圳，BOSS直聘样本。\nAI Infra架构师：人民币50000至80000元/月、16薪，上海徐汇，BOSS直聘样本。\n腾讯AI Infra-大模型训练与推理优化：人民币50000至80000元/月、15薪，北京/上海/深圳，BOSS直聘样本。\nAI Infra高级工程师/架构师：人民币40000至70000元/月，深圳，职友集样本。\n高性能计算研发工程师：人民币40000至70000元/月、16薪，北京，BOSS直聘样本。\nAgent算法应用架构师：人民币40000至70000元/月、15薪，北京朝阳，BOSS直聘样本。\n\n国际高薪岗位：\n\nAI Engineer：美国中位数约151000美元/年。\nMachine Learning Engineer：美国中位数约270000美元/年。\nML / AI Software Engineer：美国平均总包约244275美元/年。\nAI Infrastructure Engineer：美国平均约169738美元/年。\n\n这些岗位对应今天的钱：AI工厂需要光通信和GPU系统，Physical AI需要机器人和嵌入式AI，Cursor交易说明开发者工具开始巨头化，消费结构变化需要更精细的数据和运营。\n今日结论\n今天的钱，在买“基础设施和效率工具”。\n财政部用150亿元人民币国债补充离岸人民币资产；世界银行和非洲开发银行把电力接入推进到5000万人规模；Pegasus和CYBERDYNE押注Physical AI；Nvidia与Coherent把AI基础设施落到美国制造；SpaceX用600亿美元买AI代码工具；中国消费数据则提醒大家，线上服务和结构性新品比总量更值得看。\n普通人的机会在钱落地后必须有人做的事：债券和跨境资金、电力工程、机器人、康复设备、光通信、厂务工程、AI代码工具、安全治理、线上服务和AI硬件售后。\n"},{"title":"谁在花钱日报｜2026-06-15",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-15/",
"date":"2026-06-15",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-15/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-15/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-15/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-15/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-15/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-15/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-15/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-15/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“跨季流动性、农产品供应链、实体经济AI基金、AI服务器订单、工业AI、618消费冲刺和AI基础设施人才”。\n政府\n中国人民银行今天投放的是“资金面的稳定器”。\n6月15日，央行开展6000亿元6个月期买断式逆回购操作，期限183天，到期日为2026年12月15日。由于6月份同期限买断式逆回购到期规模也是6000亿元，这次属于等量续做。\n这不是给某个项目直接拨款，而是在稳定银行体系的中长期流动性。它影响的是银行资金成本、债券市场、企业融资节奏和跨季资金预期。\n普通人的机会在资金交易、债券研究、银行同业、企业财务管理、绿色改造融资、能效审计和工业节能设备。资金面稳住以后，项目和企业融资才更容易往下落。\n国际政府与开发资金\nADB把5000万美元投进咖啡和腰果供应链。\nADB与Export Trading Group签署5000万美元可持续挂钩贷款，支持印度和越南咖啡、腰果采购与出口，并配套85万美元技术援助，目标覆盖约5700名农户，特别关注女性农户。\n这笔钱不是修路建桥，而是帮助小农户进入可追溯、可认证、抗价格波动的出口供应链。\n普通人的机会在农产品外贸、供应链金融、认证服务、仓储物流、农户数字化、可持续农业咨询和跨境采购。\n投资机构\nBase10拿到8.5亿美元，继续投“实体经济AI”。\nBase10 Partners完成8.5亿美元新资本募集，资产管理规模达到26亿美元，资金已经开始部署。它的方向不是再造一个聊天机器人，而是把AI放进物流、建筑、餐饮、医疗、制造和企业后台流程。\n这说明AI投资正在从模型公司外溢到具体行业。未来很多机会来自“懂一个行业，并能把AI接到真实流程里”的团队。\n普通人的机会在行业AI产品经理、企业自动化顾问、物流调度、餐饮系统、建筑项目软件、医疗运营工具和制造流程智能化。\n企业\nSupermicro为AI服务器订单融资。\nSupermicro定价普通股和强制可转优先股等融资交易，潜在股权融资总额达到70亿美元。公司披露，近期收到约390亿美元高级AI服务器订单，计划用融资款购买零部件、补充营运资本，并支撑后续交付。\nAI需求正在从云厂商资本开支，传导到服务器厂商的现金流、库存和交付压力。订单再大，也要先买零部件、排产、测试、安装、运维。\n普通人的机会在AI服务器供应链、采购计划、库存融资、测试验证、数据中心机房交付、液冷、售后运维和企业算力成本管理。\n富豪资本\nJeff Bezos把120亿美元押向工业AI。\nPrometheus完成120亿美元Series B融资，估值410亿美元。投资方包括Bezos本人以及JPMorgan Chase、Goldman Sachs、BlackRock、DST Global、Arch Venture Partners等机构。公司目标是打造“artificial general engineer”，也就是帮助工程师更快设计和制造复杂实体产品的AI系统。\n这笔钱押的不是聊天，而是物理世界：喷气发动机、医疗设备、消费电子、药物、硬件和工厂流程。\n普通人的机会在工业仿真、CAE/EDA、材料研发、机器人、医疗器械、硬件验证、工程数据平台和高端制造流程软件。\n平民消费\n618进入第二波冲刺，钱继续流向AI硬件、酒水和即时零售。\n天猫618第一阶段超40000个品牌成交额翻倍，破亿品牌数同比增长40%；AI智能硬件成交额同比增长80%，AI眼镜同比增长9倍。京东618新商家数量同比增长超62%，首次参加京东618的51个新商家成交额破千万、1516个新商家成交额破百万。\n酒水也在升温：天猫酒水133个品牌翻倍增长，189个品牌增长超过50%；京东酒品类开门红1小时157个品牌成交额翻倍。抖音商城第一阶段中，成交额破亿元的美妆品牌数同比增长75%，服饰品牌数同比增长100%。\n昨日较热消费品牌：\n中国品牌：追觅、Ulike、华为、小米、茅台、五粮液、泡泡玛特\n国际品牌：Apple、Nintendo、Pampers、LEGO、Nike、adidas、Crocs\n今天的消费关键词不是单纯低价，而是国补、平台券、分期免息、AI硬件尝鲜、酒水线上化、即时履约和海外618。普通人的机会在家电数码导购、本地零售运营、酒水电商、跨境履约、AI硬件售后和内容带货。\n高薪职位\n中国高薪岗位：\n\n大模型infra架构师：人民币70000至100000元/月、14薪，北京朝阳，BOSS直聘样本。\n分布式系统架构师：人民币30000至40000元/月至100000至150000元/月，北京、嘉兴等地，BOSS直聘样本。\n分布式表格系统架构师--ByteTable/HBase：人民币45000至75000元/月、15薪，杭州或北京，BOSS直聘样本。\nAI Infra架构师：人民币40000至70000元/月、15薪，深圳南山，BOSS直聘样本。\n高级分布式存储系统研发工程师：人民币40000至70000元/月、13薪，深圳，BOSS直聘样本。\n资深量化策略研究员：人民币80000至100000元/月、30薪，上海，猎聘样本；量化研究员在中国大陆的平均年收入约650000元，含奖金。\n\n国际高薪岗位：\n\nAI Engineer：美国中位数约151000美元/年。\nML / AI Software Engineer：美国平均总包约243333美元/年。\nMachine Learning Engineer：美国平均总包约270000美元/年。\n\n这些岗位对应今天的钱：央行稳资金面，ADB投农业供应链，Base10投实体经济AI，Supermicro接AI服务器订单，Prometheus投工业AI，618继续卖AI硬件。能把GPU集群、分布式系统、低延迟交易、数据中心交付、工业AI和行业流程真正跑通的人，继续拿高薪。\n今日结论\n今天的钱，在买“流动性、供应链、AI落地和真实交付”。\n央行用6000亿元稳住跨季资金；ADB用5000万美元连接小农户和国际商品链；Base10用8.5亿美元押注实体经济AI；Supermicro用70亿美元级融资支撑AI服务器订单；Bezos和华尔街机构用120亿美元押注工业AI；普通消费者则在618第二波继续买AI硬件、酒水、即时零售和跨境商品。\n普通人的机会不在追每一个大额数字，而在钱落地后必须有人做的工作：资金交易、农产品供应链、行业AI产品、服务器交付、GPU集群、工业仿真、酒水电商、即时零售和量化研究。\n"},{"title":"谁在花钱日报｜2026-06-12",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-12/",
"date":"2026-06-12",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-12/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-12/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-12/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-12/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-12/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-12/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-12/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-12/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“西部产业协作、开发金融改革贷款、AI数据中心、电力和云资本开支、SpaceX IPO、亲子消费和AI基础设施人才”。\n政府\n中国继续把区域协作的钱导向西部产业链。\n东西部协作过渡期内，协作双方共建产业园区近800个，引导企业到西部地区投资7500多亿元；东部协作省份采购、帮助销售西部地区农产品近5700亿元；通过协作机制帮助西部地区500余万农村劳动力实现就业。\n这笔钱买的不是单一项目，而是“产业转移、就业、农产品销售和县域产业链”。普通人的机会在农产品加工、冷链物流、园区运营、直播电商、本地制造、供应链管理和乡村公共服务。\n国际政府与开发资金\nADB批准5亿美元等值贷款，支持哈萨克斯坦财政和金融部门改革。\n这是一笔政策性贷款，重点不是修一条路或建一座电站，而是帮助哈萨克斯坦增强财政可持续性和金融体系韧性，改善银行监管、资本市场和公共财政管理。\n开发金融正在把钱投向“制度性基建”。机会在金融IT、监管科技、债务管理、银行风控、财政数字化、咨询服务和跨境金融合规。\n投资机构\nKKR联合Kuwait Investment Authority、NVIDIA和Vistra推出Helix Digital Infrastructure。\nHelix启动时承诺资本超过100亿美元，由前AWS CEO Adam Selipsky领导，目标是把数据中心、电力和网络连接整合起来，服务正在扩张AI算力需求的hyperscalers。\n这说明AI基础设施已经不是单纯的数据中心地产，而是“长期资本+电力+GPU+网络+运营能力”的组合生意。机会在数据中心选址、机电工程、电力交易、液冷、网络互联、GPU集群交付、云成本优化和长期运维。\n企业\nOracle把AI云需求变成了重资本开支。\nOracle官方披露，FY2026末剩余履约义务达到6380亿美元，云基础设施需求强劲；财报电话会公开口径显示，公司预计FY2027资本开支净现金流出约700亿美元。换句话说，企业AI订单正在变成数据中心、服务器、GPU、网络和电力接入的真实支出。\n大厂AI竞争正在从软件毛利进入资产负债表。机会在云迁移、数据库运维、数据中心施工、GPU资源调度、企业FinOps、可靠性工程和AI成本治理。\n富豪资本\nSpaceX把750亿美元IPO推到公开市场。\nSpaceX IPO定价为每股135美元，筹资约750亿美元，估值约1.75万亿至1.77万亿美元。更新点在于：6月8日还是“拟融资约750亿美元”，今天已经按IPO定价和筹资落地来观察。\n富豪资本正在把商业航天、卫星互联网和AI算力故事一起推给公开市场。机会在卫星通信、地面站、商业航天供应链、AI算力运维、IPO服务、员工财富管理和二级市场研究。\n平民消费\n儿童和亲子消费接过了这一轮家庭消费的钱。\n2025年亲子消费市场规模预计突破5.5万亿元。618和六一叠加后，快手电商早教益智商品交易总额同比增长3倍，儿童营养健康增长4倍，儿童文创增长9倍；淘宝天猫六一前一周相关商品成交同比增长超50%，儿童餐具和画板类商品同比均超260%；美团“亲子”相关搜索热度较节前一周增长98%；儿童剧交易额同比上涨893%，亲子DIY交易额同比增长超过10倍。\n昨日较热消费品牌：\n中国品牌：Babycare、巴拉巴拉、西贝、华为、小米、泡泡玛特、蕉内儿童线\n国际品牌：Disney、LEGO、Nike Kids、adidas Kids、Fisher-Price、Apple/iPad、Crocs Kids\n消费者的钱正在从“买一件便宜东西”转向“为孩子买安全、陪伴、体验和智能化”。机会在亲子内容、本地亲子服务、儿童餐饮、研学、儿童运动、AI玩具运营、母婴供应链和儿童用品安全标准。\n高薪职位\n中国高薪岗位：\n\n分布式系统架构师：人民币100000至150000元/月，北京朝阳，3-5年，本科，BOSS直聘样本。\nAI Infra架构师：人民币40000至70000元/月、15薪，深圳南山，5-10年，硕士，BOSS直聘样本。\nAI基础设施/IDC架构师：人民币25000至50000元/月、14薪，或25000至35000元/月，无锡、上海等样本，BOSS直聘样本。\n量化研究员：人民币60000至83000元/月、15薪，北京或上海样本，猎聘样本。\n资深量化策略研究员：人民币80000至100000元/月、30薪，猎聘样本。\n\n国际高薪岗位：\n\nML / AI Software Engineer：美国平均总包约243000美元/年。\nAI Engineer：美国base salary约145000至310000美元/年。\nSenior ML Engineer：美国高薪城市总包可到400000美元+。\n\n这些岗位对应今天的钱：政府推动产业协作，ADB投金融系统，KKR和Oracle堆AI基础设施，SpaceX把航天和AI资产推向公开市场，消费侧也在买AI玩具和亲子智能产品。能把分布式系统、GPU集群、MLOps、数据中心网络、量化模型和AI产品真正落地的人，继续拿高薪。\n今日结论\n今天的钱，在买“区域产业迁移、AI基础设施和家庭亲子消费”。\n政府的钱把西部产业园、农产品销售和劳动力就业串起来；开发金融投向财政和金融体系；私募资本通过KKR继续押注数据中心、电力和网络；Oracle用700亿美元级别资本开支承接AI云需求；SpaceX用750亿美元IPO把富豪资本推向公开市场；普通家庭的钱则流向孩子的用品、课程、体验和AI玩具。\n普通人的机会不在追每一个大额数字，而在钱落地后必须有人做的工作：产业园招商、冷链和农产品渠道、金融IT、数据中心工程、AI Infra、云成本管理、商业航天供应链、亲子服务和儿童AI产品。\n"},{"title":"谁在花钱日报｜2026-06-11",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-11/",
"date":"2026-06-11",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-11/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-11/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-11/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-11/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-11/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-11/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-11/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-11/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“设备更新、低碳燃料、工业AI、AI算力贷款、欧洲数据中心、智能消费和AI基础设施人才”。\n政府\n中国继续把超长期特别国债投向设备更新。\n2026年第二批915亿元“两新”设备更新项目清单和资金安排已经下达，今年累计安排1851亿元，占全年2000亿元的92%。这批钱支持工业、能源电力、电子信息、交通运输、物流、教育、文旅、医疗、住宅老旧电梯、安全生产、节能降碳环保、回收循环利用等16个领域超过6700个项目，带动总投资超过3800亿元。\n这笔钱买的是“旧设备换新、旧系统升级、旧产线提效”。普通人的机会在设备销售、安装交付、工业软件、维保服务、低碳改造、公共设施运营和项目申报服务。\n国际政府与开发资金\nAIIB向Acelen Renewables提供5800万美元贷款，支持巴西可持续航空燃料项目。\n这个项目位于巴西Bahia，将建设大型生物炼厂，生产可持续航空燃料SAF和HVO可再生柴油。AIIB只是融资包的一部分，IFC、IDB等开发金融机构预计也会参与，整个项目融资包约15亿美元。\n开发资金买的是“航空和重交通减碳的工业产能”。机会在废油回收、油脂供应链、燃料检测、化工工程、航空燃料认证、跨境项目融资和低碳燃料贸易。\n投资机构\nTemasek领投PhysicsX 3亿美元Series C，估值约24亿美元。\nPhysicsX做的是工业AI和工程仿真，用AI-native engineering platform压缩航空航天、半导体、汽车、能源、材料和数据中心硬件的设计周期。参与方还包括M&amp;G Investments、Intrepid Growth Partners、Applied Materials、Atomico、General Catalyst、NVIDIA和Siemens。\n这说明AI投资不只追聊天机器人和内容工具，也在进入“飞机、芯片、能源设备、汽车、数据中心硬件怎么设计”的环节。机会在CAE仿真、工业数据、物理建模、GPU计算、半导体制造、自动化测试和工程软件销售。\n企业\nAmazon签下175亿美元高级无担保延迟提款定期贷款。\n这笔贷款由Citibank担任行政代理，承诺有效期至2026年9月30日，SOFR贷款利差0.625%至0.875%，没有财务契约。公司官方用途写作一般企业用途，但放在Amazon持续扩大AI基础设施和AWS资本开支的背景下，这就是企业为下一轮AI建设准备的资金池。\n大厂AI竞争正在从利润表进入资产负债表。机会在数据中心建设、云资源销售、芯片供应链、网络工程、电力接入、冷却系统、FinOps、AI成本管理和企业级云迁移。\n富豪资本\n孙正义领导的SoftBank把最高750亿欧元押向法国AI数据中心。\nSoftBank计划在法国开发和运营5GW AI数据中心容量，第一阶段投资450亿欧元，到2031年在Hauts-de-France地区交付3.1GW容量，地点包括Dunkirk/Loon-Plage、Bosquel和Bouchain。\n富豪资本正在把AI押注从模型公司延伸到“电力、土地、机房、长期客户”的硬基础设施。机会在数据中心园区开发、电力工程、冷却、运维、储能、建筑机电、跨境招商和欧洲本地AI生态服务。\n平民消费\n618的钱从单纯低价转向“国补+AI硬件+手机数码+清凉设备”。\n天猫618第一阶段，超40000个品牌成交额翻倍，破亿元品牌数同比增长40%，AI智能硬件成交额同比增长80%，AI眼镜成交额同比增长9倍。京东618开启52小时，超2000个家电家居品牌成交额同比增长超一倍，AI眼镜、大屏AI手机、AI电脑成交额同比增长两倍。抖音商城618第一阶段，参与国补商家的店铺平均订单量同比增长71%，空气循环扇、制冰机、手机散热器订单量分别同比增长348%、122%、167%。\n昨日较火消费品牌：\n中国品牌：华为、小米、vivo、真我、红魔、科沃斯、创维\n国际品牌：Apple/iPhone、Nike、adidas、FILA、Dyson、ASICS\n消费者的钱正在买“立刻能解决问题”的东西：降温、换新、AI功能、手机升级和家务自动化。普通人的机会在AI硬件导购、家电家居本地服务、手机数码门店、内容带货、补贴规则运营和售后安装。\n高薪职位\n中国高薪岗位：\n\n分布式系统架构师：人民币100000至150000元/月，北京，3-5年，本科，BOSS直聘样本。\n大模型工程架构师：人民币50000至80000元/月，16薪，北京，3-5年，本科，BOSS直聘样本。\nAI/机器学习架构工程师：人民币45000至75000元/月，16薪，北京，1-3年，本科，BOSS直聘样本。\n公共云解决方案架构师-AI基础设施领域：人民币30000至60000元/月，16薪，北京或杭州样本，BOSS直聘样本。\n量化研究员/量化投资研究员：人民币80000至100000元/月、18薪的上海量化研究员样本，以及人民币100000至200000元/月、24薪的量化投资研究员/基金经理样本，猎聘检索样本。\n\n国际高薪岗位：\n\nAI Engineer：美国base salary约145000至310000美元/年，约12083至25833美元/月。\nSenior AI Engineer：美国base salary约220000至300000美元/年，总包约280000至400000美元+，约18333至25000美元/月base。\nStaff/Principal AI Engineer：美国base salary约250000至400000美元+/年，总包约350000至600000美元+，约20833至33333美元/月base。\n\n这些岗位对应今天的钱：政府和企业要更新设备，资本要买工业AI，Amazon和SoftBank要堆AI基础设施，消费者也在买AI硬件。能把分布式系统、GPU集群、RDMA/InfiniBand、模型训练与推理平台、云架构、MLOps、低延迟交易系统和工程仿真做进生产环境的人，继续吃到高薪。\n今日结论\n今天的钱，在买“设备更新、低碳燃料和AI基础设施的硬落地”。\n政府资金把设备更新变成真实采购和项目改造；开发金融支持巴西SAF，把航空减碳落到生物炼厂；Temasek等机构押注PhysicsX，说明AI正在进入工程设计深水区；Amazon用175亿美元贷款给AI资本开支留余地；SoftBank用最高750亿欧元把法国电力和土地变成欧洲AI基础设施；普通消费者的钱则流向AI硬件、手机数码、家电家居和清凉设备。\n普通人的机会不在追每一个概念，而在钱落地时必须有人做的工作：设备更新交付、低碳燃料供应链、工业仿真、数据中心建设、云和AI Infra、补贴消费运营，以及大模型工程、分布式系统和量化研究岗位。\n"},{"title":"谁在花钱日报｜2026-06-10",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-10/",
"date":"2026-06-10",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-10/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-10/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-10/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-10/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-10/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-10/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-10/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-10/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“城市更新、跨洲铁路、AI改造传统软件、AI算力金融化、数据中心REIT、清凉与运动消费、AI基础设施人才”。\n政府\n中国把970亿元投向城市更新专项资金，又安排1600亿元支持城市地下管网建设改造。\n这笔钱买的是城市的底层韧性。城市更新不只是刷墙、翻新小区，而是老旧小区、危旧房、地下管网、公共服务设施和社区运转能力一起补课。\n对普通人来说，机会在管网检测、地下空间改造、老旧小区物业、智能水务燃气、消防安全、电梯更新、社区商业和公共服务运营。能让老城区更安全、更方便、更少出事故的人，会更接近这笔钱。\n国际政府与开发资金\nADB批准7.5亿美元贷款，支持土耳其伊斯坦布尔北部铁路跨越项目。\n这个项目总成本约82.7亿美元，计划建设127公里电气化铁路，绕开伊斯坦布尔都市区瓶颈，连接两座主要机场和国家铁路网。\n开发资金买的是“欧洲和亚洲之间更顺的货运通道”。跨境供应链的效率，最后会落到铁路土建、信号系统、车站连接、项目融资、跨境物流和工程咨询这些岗位上。\n投资机构\n投资机构把2.25亿美元投给Beacon。\nBeacon做的不是单个AI应用，而是收购关键行业的小型软件和服务企业，再用AI操作系统改造工程、运营、后台和销售流程。钱买的是“AI改造传统小企业”的能力。\n普通人的机会在传统行业SaaS、垂直软件迁移、AI自动化、客户成功、财务运营、销售流程改造和小企业数字化。AI不只发生在大厂，也会钻进那些现金流稳定但技术老旧的行业软件里。\n企业\nBroadcom、Apollo和Blackstone成立AI XPV平台，首期350亿美元投向AI算力部署。\n这笔钱会把Broadcom的XPU和网络方案，与Apollo、Blackstone的长期资本打包，先支持Anthropic超过1GW的算力扩张，并为前沿AI实验室后续训练和推理容量建立融资框架。\nAI基础设施正在从“买GPU”变成“芯片、网络、数据中心、长期租约和信贷结构一起设计”。机会在AI Infra架构、网络工程、数据中心交付、能源采购、模型推理成本优化和基础设施金融。\n富豪资本\nAirTrunk筹备新加坡数据中心REIT IPO，目标融资超过10亿美元。\nAirTrunk由澳大利亚富豪Robin Khuda创办，Blackstone和CPP Investments是主要支持方。6月9日写的是AirTrunk印度数据中心投资，今天这条写的是同一资产平台的融资和退出路径。\n这说明数据中心不只是建设项目，也正在变成公开市场可以买卖的收益型基础设施资产。机会在REIT运营、投资者关系、能源成本管理、长期租约定价、跨境合规和数据中心资产管理。\n平民消费\n618的钱继续流向清凉经济和运动户外。\n抖音商城618第一阶段，参与“国补”商家的店铺平均订单量同比增长71%；空气循环扇、制冰机、手机散热器订单量分别同比增长348%、122%、167%。京东开门红4小时，近百个运动户外品牌成交额同比增长翻倍。\n昨日较火消费品牌：\n中国品牌：安踏、李宁、伯希和、麦瑞克、华为、小米\n国际品牌：FILA、adidas、Nike、Salomon、ASICS、Apple\n消费者的钱正在买“天气场景”和“功能升级”。普通人的机会在夏季小家电、运动户外、功能型内容种草、门店导购、直播选品、补贴规则运营、售后服务和本地即时零售。\n高薪职位\n中国高薪岗位：\n\n分布式系统架构师：人民币100000至150000元/月，北京，3-5年，本科，BOSS直聘样本。\n大模型工程架构师：人民币50000至80000元/月，16薪，北京，3-5年，本科，BOSS直聘样本。\n资深AI基础设施架构师：人民币90000至120000元/月，14薪，北京，10年以上，本科，猎聘样本。\n量化研究员：人民币70000至100000元/月，15薪或24薪，上海，博士或3-5年样本，BOSS直聘样本。\n\n国际高薪岗位：\n\nAI Infrastructure Engineer：美国base salary 190000至270000美元/年，加股权和福利，约15833至22500美元/月。\nGoogle AI Engineer：美国总包183000至583000美元/年，median 280000美元/年，约15250至48583美元/月总包。\nML/AI Software Engineer：美国平均总包约243000美元/年，约20250美元/月。\n\n这些岗位对应今天的钱：AI算力要降成本，企业要建更大的集群，基金要把AI能力塞进传统软件公司，数据中心要变成金融资产。能把分布式系统、GPU网络、Kubernetes、RDMA、推理服务、低延迟系统和金融数据做进生产环境的人，会继续吃到高薪。\n今日结论\n今天的钱，在买“城市韧性、跨境通道和AI基础设施的金融化”。\n政府资金继续进城市更新和地下管网，这是最接近普通生活的硬投资；开发资金支持土耳其铁路，是跨洲供应链重新布线；投资机构投Beacon，是把AI带进传统小企业；Broadcom、Apollo和Blackstone的350亿美元平台，则说明AI算力已经进入芯片、网络、租约、信贷一起设计的新阶段；AirTrunk筹备REIT IPO，说明数据中心正在成为公开市场资产；消费者的钱则继续流向清凉小家电、运动户外和功能升级产品。\n普通人的机会不在追概念，而在这些钱落地时必须有人做的环节：管网改造、铁路工程、垂直软件改造、AI集群交付、数据中心资产运营、清凉与运动消费选品，以及AI Infra和量化研究岗位。\n"},{"title":"谁在花钱日报｜2026-06-09",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-09/",
"date":"2026-06-09",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-09/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-09/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-09/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-09/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-09/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-09/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-09/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-09/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“长江水运通道、城市公共服务、AI应用后端、量子计算、印度AI数据中心和618智能消费”。\n政府\n中国把约772.08亿元投向三峡水运新通道。\n6月8日，三峡水运新通道正式开工。这是“十五五”时期开工建设的首个国家重大标志性工程，工程包括三峡枢纽新通道和葛洲坝航运扩能，建成后两大枢纽都将形成四线船闸格局。\n这笔钱买的是“内河物流的通行能力”。三峡枢纽2025年通过量已经达到1.73亿吨，远超原设计能力。新通道要解决的不是局部施工问题，而是长江上中游到长三角的长期物流瓶颈。\n普通人的机会在水运工程、船闸机电、港航调度、工程监理、物流运营、多式联运系统、绿色船舶和大宗商品供应链。能让货更快、更稳、更便宜地过江出海的人，会更接近这笔钱。\n国际政府与开发资金\n世界银行拿出1.915亿欧元，支持土耳其城市基础设施。\n这笔贷款用于Antalya和Konya等快速增长城市的公共服务现代化，重点包括公共交通、供水、卫生系统和能源效率。\n开发资金正在从“跨境大通道”延伸到“城市日常运转”。公共交通、供水和污水处理看起来不如AI热门，但它们真正决定城市居住成本、通勤效率和企业选址。\n普通人的机会在市政工程、公交系统、管网维护、水务运营、节能改造、项目融资、城市数据平台和公共服务外包。\n投资机构\n投资机构把5亿美元投给Supabase。\nSupabase完成Series F融资，投后估值达到105亿美元。它的核心位置不是做一个单点AI应用，而是提供开源Postgres开发平台和AI应用后端，让开发者更快搭建数据库、鉴权、存储、边缘函数和平台化服务。\n投资人买的是“AI应用从demo变产品的后端底座”。当AI应用越来越多，真正贵的是稳定性、数据权限、企业集成、账单、安全和扩展。\n普通人的机会在Postgres、后端工程、DevOps、SaaS平台、企业集成、AI应用数据治理、开源商业化和开发者关系。\n企业\nIBM计划未来五年向量子计算投入超过100亿美元。\n这笔钱会覆盖研发、资本开支、制造扩展、生态合作和并购，目标是推动从现有量子系统走向容错量子计算。\n和短期GPU租赁不同，量子计算是企业对下一代计算栈的长期下注。它还不一定马上转化成大众产品，但低温硬件、控制系统、芯片制造、误差校正、云端实验平台和科研软件会先形成预算和岗位。\n普通人的机会在硬件工程、物理与材料、嵌入式系统、科研软件、云端实验平台和高端制造供应链。\n富豪资本\nAirTrunk将在印度投资约210亿美元建设3GW数据中心。\nAirTrunk由澳大利亚富豪Robin Khuda创办，并由Blackstone支持。公司计划在印度Maharashtra的Raigad地区建设3GW数据中心项目，投资约2万亿卢比，约合210亿美元。\n这笔钱买的是“AI时代的土地、电力和机房位置”。数据中心不是只有服务器，背后是土地指标、电力接入、冷却、建设融资、跨境客户、税收优惠和长期租约。\n普通人的机会在数据中心设计、机电工程、电力交易、冷却系统、园区招商、项目融资、合规审批和云服务销售。\n平民消费\n618的钱继续流向AI硬件和功能型消费。\n天猫618第一阶段数据显示，超40000个品牌成交额翻倍，破亿品牌数同比增长40%。AI智能硬件整体同比增长80%，AI眼镜同比增长9倍，宠物烘焙粮同比增长超200%，变形家具同比增长超50%。\n京东开门红52小时数据显示，搭载JoyInside的AI家电家居新品成交额环比增长200%，超2000家电家居品牌成交额同比增长超100%。在政企采购侧，京东政企业务整体成交额同比增长80%，AI采购订单环比提升99%，智能眼镜和智能手表分别同比增长270%和100%。\n昨日较火消费品牌：\n中国品牌：华为、小米、美的、海尔、珀莱雅、老铺黄金\n国际品牌：Apple、Nike、adidas、Dyson、Samsung、Salomon\n消费者的钱正在买“可感知的新功能”和“更确定的服务”。普通人的机会在智能硬件销售、品牌内容、电商投放、宠物食品、家装家居、政企采购、售后服务和本地配送。\n高薪职位\n中国高薪岗位：\n\nAI Agent研发工程师 / AI Coding算法工程师：人民币约50000至80000元/月，部分样本为50-80K·15薪或16薪。主要城市是北京、上海、深圳。\n芯片SE / AI芯片工程师 / AI Runtime工程师：人民币约25000至80000元/月，高端SE样本可达50-80K·15薪。主要城市是深圳、上海、成都。\n跨境电商负责人 / 跨境平台运营负责人：人民币约30000至50000元/月，高阶负责人可叠加奖金和股权。主要城市是深圳、佛山、香港等。\n数据安全 / 信息安全 / 大模型安全工程师：人民币约40000至90000元/月。主要城市是北京、上海、深圳、杭州。\n\n国际高薪岗位：\n\nInformation Security Analyst：BLS 2024年薪中位数124910美元，约10409美元/月。\nData Scientist：BLS 2024年薪中位数112590美元，约9383美元/月。\nSoftware Developer：按BLS/OEWS公开口径，年薪中位数约14万美元量级，约11600美元/月以上。\nFinancial and Investment Analyst：按BLS/OEWS公开口径，年薪中位数约10万美元量级，约8400美元/月以上。\n\n这些岗位对应今天的钱：AI Agent和后端平台影响AI应用落地，芯片和Runtime影响算力成本，跨境负责人影响订单和现金流，安全岗位降低系统和数据风险。\n普通人更现实的入口是AI应用工程、后端数据库、安全工程、跨境运营和智能硬件运营。芯片Runtime、量子计算和顶尖算法薪资更高，但训练周期也更长。\n今日结论\n今天的钱，在买“通道、底座和算力位置”。\n中国重大工程投向三峡水运新通道，世界银行投向土耳其城市公共服务，投资机构投向Supabase这类AI应用后端，IBM把长期预算押向量子计算，AirTrunk和Blackstone系资本押注印度AI数据中心，普通消费者和企业采购则把钱投向AI智能硬件、家电家居和健康功能品类。\n普通人的机会不在追每一个大新闻，而在找到钱落地时必须有人执行的位置。让船闸和物流更顺、让城市服务更稳、让AI应用后端可用、让数据中心建成通电、让智能硬件卖出去、让安全和合规不出事的人，会更接近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-08",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-08/",
"date":"2026-06-08",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-08/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-08/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-08/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-08/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-08/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-08/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-08/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-08/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“商业航天园区、交通走廊、AI模型入口、短缺算力、SpaceX公开市场融资和AI驱动的618消费”。\n政府\n广州把约50亿元投向商业航天小镇。\n广州航天小镇一期项目已在黄埔区夏港街道西基岛开工。项目由广州建筑集团投资建设，重点聚焦可重复使用运载器、航天器和液体发动机，计划于2027年建成投产。\n这不是单个厂房项目，而是一个面向商业航天产业链的承载空间。项目规划围绕可重复使用航天运输系统、卫星制造及应用服务，未来要形成火箭制造、卫星制造和应用服务的产业生态。中科宇航项目已率先落地，相关产业链企业也在推进合作。\n这笔钱买的是“商业航天制造的落地条件”。火箭、卫星和液体发动机不只需要实验室，也需要厂房、码头运输、精密制造、测试验证、供应链、质量体系和园区运营。\n普通人的机会在航天零部件加工、材料与结构件、试验测试、设备维护、供应链采购、产业园运营、招商服务和项目管理。能把未来产业从图纸带到产线的人，会更接近这笔钱。\n国际政府与开发资金\n世界银行拿出9亿美元，支持伊拉克修道路走廊。\n这笔钱用于Iraq Transport Economic Corridors项目，重点支持伊拉克关键道路走廊建设。项目覆盖两条战略轴线：一条是连接巴格达与土耳其边境的南北轴线E2，另一条是连接巴格达、叙利亚和约旦方向的东西轴线E1。\n第一阶段包括E1关键路段修复、库尔德地区道路升级和E2初段建设。世界银行预计，项目将惠及约790万人，其中包括约300万女性和150万青年。\n这笔开发资金买的是“国家内部和跨境流通能力”。道路会改变物流成本、农产品流通、旅游、医疗抵达和制造业选址，不只是施工队受益。\n普通人的机会在道路工程、项目监理、施工设备、交通安全、物流调度、跨境贸易、供应链金融和公共项目评估。懂工程，也懂流通的人，会更有价值。\n投资机构\n投资机构把1.13亿美元投给OpenRouter，继续押注AI模型入口。\nOpenRouter完成Series B融资，CapitalG领投，NVentures、ServiceNow Ventures、MongoDB Ventures、Snowflake Ventures、Databricks Ventures等参与。公司定位是AI model exchange，为开发者和企业提供统一入口，连接Anthropic、Google、OpenAI、xAI、DeepSeek等模型生态。\nOpenRouter披露的关键数字是：已接入400多个模型，周处理量达到25万亿tokens。\n投资人买的是“模型之间的路由层”。当企业不想只押一个模型，模型接入、成本路由、稳定性、账单、权限、评测和合规就会变成基础设施。\n普通人的机会在AI应用工程、模型评测、提示词和工作流、API平台、成本优化、企业集成、AI产品运营和开发者生态。未来很多AI应用的价值，不只在模型本身，也在怎么把模型用稳、用便宜、用进业务。\n企业\nGoogle将每月向SpaceX支付9.2亿美元，锁定AI算力。\nSpaceX在SEC文件中披露，已与Google签署云服务协议。根据协议，Google将从2026年10月至2029年6月，每月支付9.2亿美元，获得约110000块NVIDIA GPUs，以及CPU、内存等相关算力组件。\n按32个月粗算，这是一笔接近294亿美元的算力承诺。协议还设置了交付约束：SpaceX需要在2026年9月30日前交付承诺GPU容量，否则Google可以在宽限期后终止协议，或按实际交付量降低月费。\n这笔钱说明，企业AI已经从“买软件”升级到“锁算力”。当Google这种级别的公司也需要外部租用GPU，短期瓶颈就不只是模型，而是电力、机房、芯片、网络和运维。\n普通人的机会在数据中心建设、GPU集群运维、云成本管理、AI平台工程、网络互联、电力配套、芯片供应链和合同管理。谁能让算力稳定交付，谁就更接近企业预算。\n富豪资本\nSpaceX计划通过IPO募资约750亿美元。\nSpaceX计划发行约5.556亿股，每股135美元，拟融资约750亿美元。这不只是火箭公司上市，而是把航天发射、Starlink连接、政府/企业服务和AI compute能力放进同一个基础设施估值框架里。\n这件事和Google算力合同放在一起看，信号更明显：富豪资本正在把“硬科技平台”变成可交易资产。IPO之后，融资、估值、客户合同、GPU交付、电力成本和监管披露，都会影响公司故事。\n普通人的机会在IPO研究、投资者关系、合规披露、航天供应链、卫星网络运营、AI基础设施财务模型和二级市场研究。会看懂“技术故事如何变成现金流”的人，会更接近这类资本流动。\n平民消费\n618的钱正在流向AI效率、专业户外和服务确定性。\n天猫披露，618第一阶段超40000个品牌成交额翻倍，破亿品牌数同比增长40%，破亿且双位数增长的直播间同比增长50%。京东首轮数据显示，AI家电家居新品成交额环比增长200%，AIPC、AI眼镜、大屏AI手机、智能学习机等消费级AI产品成交额同比增长200%，AI迷你工作站、工业感知设备等B端智能硬件成交同比增长10倍以上。\n今年618的变化不是单纯更便宜，而是平台开始用AI导购、内容生成、即时配送、会员复购和服务承诺提高效率。专业户外品牌也在继续走强，迪桑特、可隆、萨洛蒙、伯希和等品牌进入更高热度区间。\n昨日较火消费品牌：\n中国平台/品牌：华为、小米、美的、珀莱雅、京东、天猫\n国际品牌：Apple、Nike、adidas、Dyson、Samsung、Salomon\n消费者的钱正在买“省时间、省选择成本和更强功能”。普通人的机会在电商运营、直播间投放、AI导购配置、品牌会员运营、户外内容、智能硬件销售、售后服务和本地即时零售。\n高薪职位\n中国高薪岗位：\n\nAI芯片 / 高性能算子 / AI基础设施工程师：人民币约40000至80000元/月，部分样本为50-80K·16薪。主要城市是北京、上海、深圳、杭州、南京。\nAI Agent工程师 / 架构师：人民币约50000至90000元/月，3-5年经验样本可进入50K以上区间。主要城市是北京、上海、深圳、杭州。\n跨境电商运营负责人 / 跨境物流负责人 / 海外市场负责人：普通负责人岗位多集中在20-50K/月，更高阶跨境物流、货代总经理和海外市场负责人可进入年薪百万元级，对应月薪约50K至180K+。主要城市是深圳、广州、上海、杭州。\n数据安全 / 移动安全 / 网络安全大模型方向：人民币约40000至90000元/月。主要城市是北京、上海、深圳、杭州。\n\n国际高薪岗位：\n\nSoftware Developer：约12342美元/月，按BLS May 2025年均工资148100美元折算。\nInformation Security Analyst：约11043美元/月，按BLS/OEWS公开年均工资132510美元折算。\nFinancial and Investment Analyst：约9733美元/月，按BLS May 2025年均工资116800美元折算。\nBiochemist and Biophysicist：约10820美元/月，按BLS May 2025年均工资129840美元折算。\n\n这些岗位共同对应今天的钱：AI基础设施岗位影响模型成本，AI Agent岗位影响企业落地速度，跨境负责人影响订单和现金流，安全岗位降低系统和数据风险。\n普通人更现实的入口是AI应用工程、跨境运营和安全工程。AI芯片和顶尖算法薪资更高，但数学、系统工程和硬件门槛也更强；跨境与安全更适合用项目经验逐步抬高薪资。\n今日结论\n今天的钱，在买“基础设施的稀缺位置”。\n广州航天小镇买的是商业航天落地空间，世界银行买的是伊拉克道路走廊，OpenRouter的投资人买的是模型生态入口，Google买的是短缺GPU产能，SpaceX把航天、连接和AI compute带进IPO故事，618消费者则把钱投向AI效率、专业户外和服务确定性。\n普通人的机会不在追每一个热词，而在找到基础设施链条中的可执行位置。能让火箭厂投产、道路项目交付、模型接入稳定、GPU集群跑起来、IPO故事被看懂、消费转化变高的人，会更接近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-05",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-05/",
"date":"2026-06-05",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-05/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-05/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-05/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-05/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-05/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-05/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-05/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-05/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“产业平台、欧亚物流走廊、AI内容工具、AI视觉搜索云基础设施、音乐版权资本退出和AI家居消费”。\n政府\n哈尔滨新区把4.5亿元投向新材料与智能农机产业园。\n这个园区已完成竣工验收并正式投用，占地12.5万平方米，总建筑面积11.1万平方米，建成了工业厂房、宿舍、科研楼、综合楼、锂清洗车间、靶材库和配套基础设施。\n更重要的是，它已经开始承接项目。全固态电致变色电子薄膜项目正在进场改造，未来计划建设年产60万平方米智能薄膜的生产线，预计年产值约15亿元；德国科乐收高端农机SKD制造基地计划投资2000万元，投产后预计年产农机100至200台（套），年销售收入3亿元。\n这笔钱买的不是单个厂房，而是“企业来了能马上落地”的产业平台。地方产业竞争不只靠补贴，也靠厂房、科研楼、宿舍、专班、招商和达产服务。\n普通人的机会在产业园运营、设备安装、厂务工程、招商服务、农机供应链、新材料工艺、生产线调试和产业项目管理。会把企业从签约带到投产的人，会更接近这笔钱。\n国际政府与开发资金\n世界银行拿出3.72亿美元，支持格鲁吉亚建设跨里海交通走廊。\n这笔钱用于Trans-Caspian Transport Corridor - Georgia Accessibility and Transport Enhancement项目。项目总成本超过7.5亿美元，除世界银行本次批准的3.72亿美元外，还将由亚洲基础设施投资银行和亚洲开发银行等共同融资。\n钱主要花在铁路货运能力提升、关键道路现代化和交通机构改革上。项目预计直接惠及超过90万人，并带动物流、交通、农业和相关服务就业。\n这笔开发资金买的是“替代路线”。全球供应链不想只押单一路径，所以欧亚之间的铁路、港口、道路、关务、物流系统和多边融资都在升值。\n普通人的机会在国际物流、工程管理、铁路设备、道路施工、贸易合规、供应链金融和项目评估。懂基础设施，也懂跨境流通的人，会更有价值。\n投资机构\n投资机构把4亿美元投给Suno，继续押注AI音乐。\nSuno完成Series D融资，估值达到54亿美元。领投方是Bond Capital，IVP、Forerunner、Union Square Ventures、Alkeon、Quiet以及多家既有投资人参与。\n这笔钱背后的矛盾很清楚：一边是AI音乐生成工具快速增长，一边是版权诉讼持续升级。唱片公司仍在追问训练数据和授权问题，但资本市场已经在为“人人都能生成音乐”的入口提前下注。\n普通人的机会在AI内容运营、版权清理、音乐分发、创作者工具、社区增长、提示词工作流和品牌音频制作。AI内容不是只会生成，真正值钱的是生成之后的授权、分发、商业化和风险控制。\n企业\nPinterest计划向AWS投入40亿美元，升级AI视觉搜索基础设施。\n这笔云服务承诺将持续到2031年，是Pinterest史上最大的基础设施承诺。Pinterest会继续使用AWS的Trainium、Graviton等自研芯片，支持AI模型训练、推理、视觉搜索、推荐系统和平台现代化。\nPinterest月活已经超过6亿。它要解决的问题不是“有没有AI功能”，而是当数亿用户每天搜索灵感、商品和搭配时，系统能不能更快、更准、更便宜地理解图片和意图。\n普通人的机会在云架构、推荐算法、视觉搜索、MLOps、FinOps、Kubernetes迁移、广告技术和购物转化分析。会把AI体验和成本控制一起做的人，会更接近这类企业预算。\n富豪资本\nAckman的Pershing Square开始退出Universal Music Group。\n在UMG拒绝约640亿美元收购提案后，Pershing拟出售约8060万股UMG。UMG回购了其中超过1400万股，金额约2.5亿欧元。Pershing预计至少获得6亿美元投资利润。\n今天的更新点是：昨天写的是“Ackman收购UMG被拒”，今天写的是“要约失败后的股份出售、UMG回购和Ackman退出”。\n富豪资本不只靠买入赚钱，也靠退出时机、回购安排和董事会博弈赚钱。音乐版权表面是内容资产，背后是现金流、估值、上市地、股东结构和资本市场流动性。\n普通人的机会在并购交易、股权资本市场、音乐版权估值、投资者关系、回购执行、二级市场配售和媒体资产研究。\n平民消费\n618的钱继续流向建材、家装和AI家居。\n京东618开门红52小时内，超1000个建材品牌成交额同比增长超过100%。搭载JoyInside的AI家电家居新品成交额环比增长200%。\n这次更明显的信号是，AI消费正在从手机、眼镜和智能硬件，进入“住”的场景。美的AI智能浴霸P5、凯迪仕i60 Ultra AI智能锁、亚太天能J6SE AI智能门、奥普AI智能浴霸S6-AIR、童视界京东自研AI大路灯D6，进入AI新品榜前列。\n昨日较火消费品牌：\n中国平台/品牌：美的、凯迪仕、奥普、亚太天能、童视界、京东自营\n国际品牌：Apple、Samsung、Dyson、Nike、adidas、IKEA\n消费升级不是单纯买更贵的东西，而是把家变成更智能、更省心的系统。普通人的机会在家装设计、智能家居安装、门锁/照明/浴霸集成、线下交付、直播导购、售后服务和本地家居内容。\n高薪职位\n中国高薪岗位：\n\n高级量化研究员 / 高级C++量化开发：人民币约60000至120000元/月，部分样本为90-120K·16薪。主要城市是上海、北京、深圳、杭州。\nAI科学家 / AI算法研究员 / AI Agent架构师：人民币约50000至90000元/月，顶尖AI负责人可超过100000元/月。主要城市是北京、深圳、上海、杭州、南京。\n跨境电商负责人 / 海外增长负责人 / 电商广告技术TL：人民币约60000至110000元/月。主要城市是深圳、广州、杭州、上海。\n网络安全大模型 / 数据安全 / 移动安全专家：人民币约50000至90000元/月。主要城市是北京、上海、深圳、杭州。\n\n国际高薪岗位：\n\nSoftware Developer：约12342美元/月，按BLS May 2025平均年薪148100美元折算。\nInformation Security Analyst：约11043美元/月，按BLS May 2025平均年薪132510美元折算。\nFinancial and Investment Analyst：约9733美元/月，按BLS May 2025平均年薪116800美元折算。\nBiochemist and Biophysicist：约10820美元/月，按BLS May 2025平均年薪129840美元折算。\n\n这些岗位的共同点是能直接影响收入、风险或系统效率。量化赚钱，AI提升生产力，跨境增长带订单，安全降低损失。普通人更现实的入口是AI应用工程、跨境增长和安全工程；量化和顶尖AI科学家薪资更高，但数学、工程或研究门槛也更硬。\n今日结论\n今天的钱，在买“可放大的系统”。\n哈尔滨新区买的是能承接企业落地的产业平台，世界银行买的是欧亚物流替代路线，Suno的投资人买的是AI内容生产入口，Pinterest买的是AI视觉搜索基础设施，Ackman和UMG围绕音乐版权资产做退出和回购，消费者则把钱投向AI家居和更具体的居住场景。\n普通人的机会不在“热点名词”本身，而在能不能把系统跑起来。会把产业落地、物流路线、内容版权、云基础设施、资本退出、智能家居交付和高门槛技能变成可执行结果的人，更接近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-04",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-04/",
"date":"2026-06-04",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-04/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-04/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-04/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-04/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-04/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-04/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-04/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-04/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“育儿补贴、财政治理、关键矿产 AI、AI 算力基础设施、音乐版权资产和 618 AI 消费”。\n政府\n中央财政把 999 亿元投向育儿补贴。\n这笔 2026 年育儿补贴补助资金较上年增长 10.6%。如果加上地方安排，预计全年各级财政共安排补贴资金约 1100 亿元。补贴发放由各级卫生健康部门组织实施，原则上每季度至少集中发放一批。\n这笔钱买的不是一栋楼，也不是一次活动，而是直接进入家庭预算的现金流。财政资金正在用更明确的方式支持婴幼儿家庭，把生育友好从口号落到补贴审核、发放、服务承接和地方执行系统上。\n普通人的机会在补贴申请审核、地方政务系统、母婴服务、托育运营、家庭健康管理、支付风控和社区服务承接。会把政策、数据、服务和家庭需求连起来的人，会更接近这笔钱。\n国际政府与开发资金\n非洲开发银行拿出 6800 万美元，支持马达加斯加金融治理和经济韧性。\n这笔融资包括 2720 万美元 African Development Fund 优惠贷款，以及 4080 万美元 Transition Support Facility 优惠贷款。两阶段项目总投资达到 1.36 亿美元。\n开发资金这次买的不是桥、路、电站，而是政府能力：税收系统、财政治理、反腐策略、预算支持和公共资金使用效率。一个国家能不能稳定发展，最终不只取决于有没有项目，也取决于能不能收得上税、管得住账、花得准钱。\n普通人的机会在公共财政咨询、税务数字化、审计、反腐合规、项目评估、政府数据系统和国际发展项目管理。懂公共部门规则、又能做数字化和流程落地的人，会越来越有价值。\n投资机构\n投资机构把 2000 万美元投给 Terra AI，押注关键矿产勘探效率。\nTerra AI 完成 Series A 融资，由 Khosla Ventures 领投，BHP Ventures 进行战略投资。它做的是把矿业、能源和储层项目里的多类型勘探数据放进 AI 平台，生成地质模型和不确定性分析，帮助项目更早判断钻探方案、资产风险和经济性。\n这类钱买的是资源开发的“时间压缩器”。关键矿产、油气、储能材料和碳封存都离不开地下数据，但传统勘探慢、贵、误差大。谁能更早判断地下有什么、风险在哪、该不该钻，谁就能帮项目省下大量时间和资本。\n普通人的机会在地质数据工程、矿业 AI、遥感、资源金融、项目经济性分析、ESG 尽调和工业软件销售。懂地质的人如果能补 AI 和数据，懂 AI 的人如果能补矿业和能源，会更容易进入这个赛道。\n企业\nAlphabet 准备融资 800 亿美元，继续扩 AI 算力基础设施。\n这笔钱由三部分组成：300 亿美元承销公开发行，400 亿美元 ATM 发行计划，以及 100 亿美元向 Berkshire Hathaway 定向增发。Alphabet 同时披露，2026 年资本开支预计达到 1800 亿至 1900 亿美元。\n这次更新点在于：6 月 2 日已经写过 Berkshire 向 Alphabet 投入 100 亿美元，今天更重要的是 Alphabet 官方披露的整体融资结构。AI 需求已经超过现有供应，Google Cloud 的积压订单超过 4600 亿美元，算力建设正在从“用利润再投资”升级为“经营现金流、债务、股权融资一起上”。\n普通人的机会在数据中心建设、云成本管理、AI 容量规划、资本开支分析、IR、投行、服务器供应链、电力采购和财务模型。AI 不只是模型比赛，也是一场融资、供电、建设和交付能力的比赛。\n富豪资本\nBill Ackman 想用约 650 亿美元买 Universal Music Group，但被拒绝了。\nPershing Square 提出现金加股票要约，按 Reuters 计算交易价值约 557.5 亿欧元，约合 650.3 亿美元。Universal Music Group 董事会一致拒绝，认为该提案低估公司价值且不利于增长。\n这不是已经落地的成交，但它说明富豪资本正在试图重新定价音乐版权和流媒体资产。UMG 还在推进股票回购、出售部分 Spotify 持股和改善财务披露，后续也可能推动上市地变化。\n普通人的机会在版权运营、艺人经济、音乐数据分析、流媒体分发、上市地规则、并购法务和媒体资产估值。内容产业表面是娱乐，背后是版权现金流、平台分发和资本市场定价。\n平民消费\n618 首轮，消费者的钱继续流向 AI 购物、手机数码、线下门店和跨境订单。\n京东 52 小时战报显示，京东 MALL、京东 3C 数码门店、京东折扣超市等线下门店整体客流量同比增长超 70%。超 5600 家京东 3C 数码门店客流量同比增长 138%，27 家京东 MALL 销售额同比增长 53%。\n新商家也在拿钱。京东新商家数量同比增长超 62%，51 个新商家成交额破千万元，1516 个新商家成交额破百万元。iPhone 开售 1 分钟成交额破亿元，华为手机 10 分钟成交额同比增长超 5 倍。京东全球售首轮整体订单同比翻倍，高尔夫装备、电竞座椅等新潮单品订单同比增长超 10 倍。\n天猫方面，超 40000 个品牌成交额翻倍，破亿品牌数同比增长 40%。AI 智能硬件整体同比增长 80%，AI 眼镜品类同比增长 9 倍。抖音商城第一阶段里，成交额破亿元的商家数量同比增长 325%。\n昨日较火消费品牌：\n中国平台/品牌：华为、小米、蕉下、Songmont、京东自营、天猫新锐品牌\n国际品牌：Apple、MLB、Nike、adidas、Samsung、Dyson\n消费机会从“会卖便宜货”升级为“会组织场景”。会做 AI 商品推荐、门店导购、跨境选品、直播间转化、数码换新、会员运营和新商家扶持的人，更容易抓到今天的消费流量。\n高薪职位\n中国高薪岗位（参考国内招聘网站实际出价和薪资聚合平台）：\n\n量化研究员 / 量化策略研究员：人民币约 80000 至 120000 元/月；参考口径：BOSS直聘可见上海高级量化研究员 90-120K、高频量化研究员 80-110K 等样本，并用猎聘、职友集量化研究员薪资页交叉。主要城市：上海、深圳、北京。\n大模型算法 / 多模态算法 / AI Agent工程师：人民币约 50000 至 90000 元/月；参考口径：BOSS直聘可见搜推/大模型算法 50-80K、机器人多模态大模型 50-80K、AI Agent架构师 60-90K 等样本，并用职友集/看准网算法岗位薪资聚合交叉。主要城市：北京、上海、深圳、杭州。\n芯片SOC / 数字IC / 模拟IC设计工程师：人民币约 30000 至 60000 元/月，资深或架构岗位可更高；参考口径：BOSS直聘可见数字IC设计 30-60K、35-60K、模拟IC 30-50K 等样本，并用职友集、猎聘、智联芯片设计岗位交叉。主要城市：上海、深圳、北京、南京、成都。\n信息安全专家 / 数据安全专家 / 安全算法工程师：人民币约 50000 至 80000 元/月；参考口径：BOSS直聘可见网络和数据安全测试专家 50-80K、安全算法工程师 50-80K·16薪、70-100K 等样本，并用职友集、看准网、猎聘安全岗位交叉。主要城市：北京、上海、深圳、杭州。\n跨境电商负责人 / 海外增长负责人：人民币约 30000 至 90000 元/月；参考口径：BOSS直聘可见跨境电商负责人 60-90K、跨境电商运营总监 40-70K、50-60K·16薪 等样本，并用职友集、猎聘、51job跨境运营总监岗位交叉。主要城市：深圳、广州、杭州、上海。\n\n国际高薪岗位：\n\nSoftware Developer：约 12342 美元/月，按 BLS May 2025 平均年薪 148100 美元折算。\nInformation Security Analyst：约 11043 美元/月，按 BLS May 2025 平均年薪 132510 美元折算。\nFinancial and Investment Analyst：约 9733 美元/月，按 BLS May 2025 平均年薪 116800 美元折算。\nLogistician：约 7478 美元/月，按 BLS May 2025 平均年薪 89730 美元折算。\n\n薪资口径：中国岗位优先参考BOSS直聘，并交叉职友集、看准网、猎聘、智联招聘、51job等招聘/薪资平台；国际岗位为美元月薪口径，按BLS年均工资除以12折算。\n这些岗位的共同点是能直接创造收益或降低风险。普通人更适合从跨境增长、信息安全、AI应用工程切入；量化和芯片薪资更高，但数学、工程和行业门槛更硬。\n今日结论\n今天的钱，有一个共同方向：买“系统能力”。\n中央财政买的是家庭现金流和生育友好系统，AfDB 买的是政府财政治理能力，Terra AI 的投资人买的是关键矿产勘探效率，Alphabet 买的是 AI 算力供给，Ackman 想买的是音乐版权现金流，消费者买的是 AI 购物、手机数码、线下门店和跨境新场景。\n普通人的机会不在口号里，而在系统里。谁能把补贴发准、财政管好、资源找快、算力建稳、版权估明白、消费转化做出来，谁就更接近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-03",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-03/",
"date":"2026-06-03",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-03/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-03/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-03/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-03/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-03/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-03/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-03/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-03/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“产业空间、绿色智能算力、光储电力系统、核聚变、AI数据中心、家族办公室资产配置和618场景消费”。\n政府\n深圳宝安把 170.95 亿元投向 47 个重点项目。\n这批项目里，政府投资项目 24 个，总投资 16.24 亿元；社会投资项目 23 个，总投资 154.71 亿元。产业类项目 18 个，总投资 85.04 亿元，其中 4 个“工业上楼”项目总投资 47.80 亿元。宝安新一代绿色智能算力产业园总投资约 2.8 亿元，建成投产后 5 年累计产值预计 110 亿元。\n这笔钱买的不是单一大楼，而是产业承载能力：厂房、算力中心、交通改造、医院、体育公园、停车场和配套服务。地方政府现在越来越像产业运营商，要把空间、能源、审批、招商和民生服务放在同一张图上。\n普通人的机会在园区招商、厂房改造、机电工程、算力中心运维、医院信息化、体育公园配套、施工管理和安全合规。会把产业载体和工程交付连起来的人，会更靠近地方项目的钱。\n国际政府与开发资金\nEBRD 拿出 7000 万欧元，参与匈牙利 2.1 亿欧元光储融资包。\n这笔钱投向 Renalfa IPP 在匈牙利东北部的 450MW 太阳能光伏组合，以及 250MW/1GWh 共址电池储能系统。项目预计每年交付约 448GWh 可再生电力。\n开发资金买的不只是更多发电装机，而是可调度、可交易、能平滑波动的电力系统。光伏便宜之后，真正值钱的是“什么时候发电、怎么储能、怎么并网、怎么卖电、怎么稳定交付”。\n普通人的机会在储能系统集成、电力交易、并网测试、BESS 运维、光伏 EPC、项目融资和能源数据分析。新能源越来越像金融、工程和调度的交叉行业。\n投资机构\n投资机构把 2.4 亿美元投给 Focused Energy，押注激光核聚变。\nFocused Energy 完成超额认购的 Series A。公司累计私人资本约 3 亿美元，另有约 2 亿美元 grants。本轮资金来自 RWE、SPRIND、European Innovation Council Fund、Prime Movers Lab 等投资方，方向是把激光驱动核聚变从实验验证推向工程化示范。\n这类钱的耐心很长。它买的是高功率激光、精密靶丸、真空系统、自动化控制、核安全、场址和供应链。核聚变不是短周期商业项目，但一旦从科研指标走向工程指标，周边岗位和供应商会先被拉动。\n普通人的机会在高功率激光、精密制造、靶丸制造、真空系统、自动化控制、核安全合规和大型科研工程项目管理。能把科研语言翻译成工程语言的人，会更稀缺。\n企业\nSoftBank 准备在法国投最高 750 亿欧元，建设 AI 数据中心。\n计划中的总容量是 5GW。第一阶段投资 450 亿欧元，在 Hauts-de-France 区域交付 3.1GW AI 数据中心容量，地点包括 Dunkirk、Bosquel 和 Bouchain。项目还会把 EDF 的电力资源、Schneider Electric 的电气模块能力、SoftBank 的机器人化制造和 AI 基础设施需求结合起来。\n企业的 AI 钱已经不止花在模型、GPU 和软件订阅上，而是花在电力接入、土地、冷却、电气模块、自动化工厂、运维和跨国审批。AI 的下一轮竞争，会有很大一部分发生在电网、厂房和工程进度里。\n普通人的机会在数据中心电力工程、液冷、弱电网络、模块化制造、项目审批、低碳电力采购和客户交付。懂 AI 不一定要训练模型，能让算力稳定运行的人同样重要。\n富豪资本\n家族办公室的钱继续流向 AI 背后的基础设施。\nUBS 调研了 307 个 family offices。受访家族平均净资产 27 亿美元，总财富口径 6274 亿美元；每个 family office 平均管理 13 亿美元资产。报告显示，60% 的家族办公室计划未来 12 个月调整战略资产配置，65% 已经投资 AI 价值链，37% 关注或配置电力与资源，37% 关注或配置基础设施，33% 关注 AI 医疗。\n富豪资本正在把“买一个 AI 概念”拆成一条链：电力、算力、芯片、软件、医疗应用和基础设施。这说明大钱并不只追逐最热的应用，也在寻找能支撑下一轮应用的底层资产。\n普通人的机会在家族办公室研究、另类投资运营、基础设施投后管理、AI 医疗商业化、能源项目财务模型和跨币种资产配置支持。越懂长期资产、现金流和技术落地的人，越容易服务这类资金。\n平民消费\n618 首阶段，消费者的钱继续流向更具体的家庭和季节场景。\n天猫 618 第一阶段，美妆和服饰两大核心品类复购率均突破 40%，329 个入驻不超过 3 年的新锐品牌登顶各自细分赛道成交额榜首。京东服饰 52 小时内，儿童包、防晒配饰成交额同比涨超 100%，超 500 个品牌成交额同比翻倍。京东超市用户数高两位数增长，定制包销款商品成交额同比增长 40%，百亿超市频道成交额环比增长 150%。\n热门品类：\n\n防晒配饰：防晒帽、防晒伞、防晒衣和夏季户外配件。\n儿童包和家庭出行：儿童书包、出行包和亲子场景用品。\n服饰美妆：高复购、高换季、高内容种草属性继续明显。\n刚需囤货：牛奶、零食、宠物用品、日化清洁和家庭补货。\n小家电与 AI 硬件：清洁小家电、厨电、AI 玩具和机器人继续吸引尝鲜消费。\n\n昨日较火消费品牌：\n中国平台/品牌：蕉下、Songmont、小鹿蓝蓝、华西新希望、珀莱雅、小米、美的\n国际品牌：MLB、Apple、Nike、adidas、lululemon、L'Oreal、Samsung\n消费机会不只是低价，而是“场景 + 复购 + 供应链”。会做季节化选品、内容种草、会员复购、定制包销、即时零售和 AI 投放的人，比只会拼低价的人更容易抓到今天的消费钱。\n高薪职位\n中国高薪岗位：\n\nAI 数据中心电力/液冷/网络交付负责人：人民币约 60000 至 120000 元/月，核心能力是电力接入、液冷、网络、机柜、工期和客户交付。\n光储项目开发/电力交易/储能系统负责人：人民币约 35000 至 80000 元/月，核心能力是项目测算、并网、储能调度、电价机制和 EPC 协同。\n核聚变/高端激光/精密制造工程负责人：人民币约 40000 至 90000 元/月，核心能力是高功率激光、精密加工、自动化和安全合规。\n618 品牌增长/电商 AI 投放/品类运营负责人：人民币约 35000 至 90000 元/月，核心能力是货盘、内容、投放、会员复购和数据分析。\n\n国际高薪岗位：\n\nSoftware Developer：约 12342 美元/月，按 BLS May 2025 平均年薪 148100 美元折算。\nInformation Security Analyst：约 11043 美元/月，按 BLS May 2025 平均年薪 132510 美元折算。\nFinancial and Investment Analyst：约 9733 美元/月，按 BLS May 2025 平均年薪 116800 美元折算。\nLogistician：约 7478 美元/月，按 BLS May 2025 平均年薪 89730 美元折算。\n\n今天的高薪机会集中在 AI 数据中心、光储电力系统、先进能源制造、电商增长、金融与投资分析。共同点是：钱都流向复杂系统，系统越复杂，越需要能把技术、成本、客户、交付、合规和现金流连起来的人。\n今日结论\n今天的钱，有一个共同方向：买“可运行的复杂系统”。\n深圳宝安买的是产业空间和公共配套，EBRD 买的是光伏加储能的电力系统，Focused Energy 买的是核聚变工程化，SoftBank 买的是法国低碳电力支撑的 AI 数据中心，family offices 买的是 AI 背后的电力、基础设施和半导体，消费者买的是更具体的夏季、家庭和复购场景。\n普通人的机会不在概念里，而在系统交付里。谁能让园区开工、储能并网、聚变设备试验、数据中心通电、品牌复购增长、资产配置落地，谁就更接近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-02",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-02/",
"date":"2026-06-02",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-02/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-02/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-02/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-02/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-02/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-02/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-02/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-02/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“新能源固定资产、农村道路、电商履约基础设施、AI数据中心、住宅建造、AI算力融资和新能源车消费”。\n政府\n宁夏国资把72.8亿元投向固定资产，其中新能源是重点。\n前4个月，宁夏国资监管企业完成固定资产投资72.8亿元，完成年度投资计划的37.9%，超序时进度4.6个百分点。其中，盐池惠安堡光伏、300万千瓦光伏基地及配套储能电站完成投资35.7亿元。\n这笔钱买的是新能源项目的真实落地：光伏组件、储能系统、升压站、并网、运维、工程管理和融资安排。新能源不只是装设备，它还需要把电、网、项目现金流和地方产业放进同一个系统里。\n普通人的机会在新能源项目管理、EPC交付、储能集成、电站运维、并网调度、设备采购和融资风控。会把项目按预算、工期、并网和现金流要求落地的人，会更靠近这类钱。\n国际政府与开发资金\nWorld Bank给加纳5亿美元，修农村道路和市场通道。\n这笔融资投向Ghana Market Access and Connectivity Project，目标是改善农村道路连通性、加强农业价值链、扩大经济机会，并为农村社区创造短期直接就业。\n这类钱的方向很清楚：让农产品更便宜、更稳定、更快地到达市场。道路、农产品集散、冷链、运输、市场管理和小农户连接，都会被纳入同一条资金链。\n普通人的机会在道路工程、农业物流、农村就业项目管理、供应链金融、冷链和小农户数字化。会把“田间到市场”这段路变短的人，会更接近开发资金。\n投资机构\n投资机构把近2.5亿美元投给Stord，押注电商履约基础设施。\nStord完成Series F融资，估值达到30亿美元。它做的不是单一仓库，而是给独立品牌提供履约网络、软件和AI运营系统，让品牌能同时处理发货、退换货、客服、库存和线下零售合规。\n这说明消费品牌的钱不只花在流量，也花在看不见的履约底座。广告能带来订单，但订单能不能按时送到、退换货能不能便宜处理、库存能不能周转起来，决定品牌能不能赚钱。\n普通人的机会在仓配系统、库存分析、退换货运营、AI客服、DTC增长、订单履约和供应链产品经理。越懂线下复杂流程的人，越容易把AI用到真问题上。\n企业\nNVIDIA继续证明，AI的钱正在流向数据中心。\nNVIDIA一季度收入达到816.15亿美元，其中数据中心收入752亿美元。公司还新增800亿美元回购授权，并给出下一季度约910亿美元收入展望。\n这组数字背后，是企业AI预算继续流向GPU、网络、存储、供电、散热、机房建设和集群运维。模型公司、云厂商、企业客户都在买算力，但算力最后会变成机柜、线缆、网络、能源和交付能力。\n普通人的机会在GPU集群交付、数据中心网络、存储架构、液冷、能耗管理、硬件测试、客户迁移和AI基础设施售前。懂硬件、懂网络、也懂业务交付的人，会越来越值钱。\n富豪资本\nBerkshire一边买房屋建造商，一边投Alphabet。\nBerkshire以68亿美元收购Taylor Morrison，又向Alphabet投入100亿美元。与此同时，Alphabet计划通过股权融资筹集800亿美元，用于AI计算基础设施和全球算力扩张。\n这两笔钱看起来差别很大：一个是住宅建造，一个是AI基础设施。但底层逻辑接近，都是买长期资产和未来现金流。房屋需要土地、供应链、人工和利率环境；AI需要数据中心、电力、芯片、网络和客户需求。\n普通人的机会在住宅供应链、工程管理、AI数据中心、基础设施金融、项目并购、长期资产运营和成本控制。富豪资本喜欢的，不只是增长故事，而是能多年产生现金流的资产。\n平民消费\n家庭大件消费继续流向新能源车。\n比亚迪5月新能源车销量383453辆，其中乘用车376990辆，纯电198674辆，插混178316辆，出口新能源车160644辆。销量重回同比小幅增长，也说明新能源车消费不只在国内价格战里打转，海外需求正在成为重要变量。\n热门品类：\n\n新能源乘用车：家庭代步、城市通勤和置换需求继续集中在新能源车。\n纯电车型：城市用车、低使用成本和智能座舱仍是核心卖点。\n插电混动车：长途焦虑、油电兼用和家庭出行场景继续支撑需求。\n出口新能源车：海外渠道、认证、售后和本地化服务成为新增长点。\n充电与售后服务：充电网络、保险金融、维修保养和二手车残值开始影响购买决策。\n\n昨日较火消费品牌：\n中国平台/品牌：比亚迪、吉利、深蓝、小米、华为系智能车、京东\n国际品牌：Tesla、Toyota、Volkswagen、BMW、Mercedes-Benz、Apple、Samsung\n汽车消费正在变成“车+电池+补能+金融+售后+软件”的复合消费。普通人的机会在门店销售、试驾转化、保险金融、二手车残值、充电服务、出海渠道和本地售后。\n高薪职位\n中国高薪岗位：\n\n新能源电站/储能项目经理：人民币约35000至80000元/月，取决于光伏、储能、并网、EPC和项目成本经验。\nAI数据中心网络/集群交付负责人：人民币约60000至120000元/月，取决于GPU集群、网络、存储、液冷和客户交付能力。\n新能源车出海渠道/售后金融负责人：人民币约35000至90000元/月，取决于海外渠道、认证、售后体系和汽车金融经验。\n电商履约AI产品/运营负责人：人民币约40000至90000元/月，取决于仓配、库存、退换货、AI客服和DTC运营经验。\n\n国际高薪岗位：\n\nSoftware Developer：约12342美元/月，按BLS May 2025平均年薪148100美元折算。\nInformation Security Analyst：约11043美元/月，按BLS May 2025平均年薪132510美元折算。\nFinancial and Investment Analyst：约9733美元/月，按BLS May 2025平均年薪116800美元折算。\nLogistician：约7478美元/月，按BLS May 2025平均年薪89730美元折算。\n\n今天的高薪机会集中在新能源、AI数据中心、跨境汽车、电商履约和金融分析。共同点是：钱都流向复杂系统，系统越复杂，越需要能把技术、供应链、客户和财务连起来的人。\n今日结论\n今天的钱，有一个明显方向：从“买热度”转向“买可运行的基础设施”。\n宁夏国资买新能源项目，加纳拿到农村道路资金，投资机构投向电商履约基础设施，NVIDIA吃到AI数据中心订单，Berkshire同时押注住宅建造和Alphabet AI基础设施，比亚迪的销量说明家庭大件消费继续往新能源车迁移。\n普通人的机会不在概念上，而在交付上。谁能让电站并网、道路通车、仓配更快、GPU集群稳定、房屋建成、车辆卖出并维护好，谁就更接近今天的钱。\n"},{"title":"谁在花钱日报｜2026-06-01",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-06-01/",
"date":"2026-06-01",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-01/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-01/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-01/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-01/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-01/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-01/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-01/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-06-01/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“政务云、民生补贴、AI 大模型融资、AI 服务器、算力租赁、618 开门红和供应链履约”。\n政府\n广州把约 3.09 亿元投向数字政府政务云。\n广电运通控股子公司运通信息中标广州市数字政府政务云服务运维项目之政务云资源租赁服务第二阶段项目，金额约 3.09 亿元，服务期 12 个月，计划从今天开始，到 2027 年 5 月底结束。\n这笔钱买的不是一台服务器，而是城市政务系统的云底座。政务服务、数据交换、公共服务系统、城市治理平台，都需要更稳定的云资源、信创适配、安全防护和统一运维。\n普通人的机会在政务云运维、云资源调度、数据治理、网络安全、信创迁移和项目交付。会把复杂政务系统稳定搬到云上的人，会更靠近这类预算。\n国际政府与开发资金\n泰国用 1760 亿泰铢稳住居民消费和小商户现金流。\nThai Help Thai Plus 方案把钱分成两块：520 亿泰铢给 1320 万名福利卡低收入群体，把每月补助提高到 1000 泰铢；1200 亿泰铢投向 60/40 共同支付计划，目标覆盖 3000 万人。商户从今天开始可以接收付款，系统还加入 AI 工具，帮小店看销售高峰、算平均客单和管理原材料成本。\n这类政府支出很直接：钱从财政和债务计划进入居民钱包，再进入便利店、菜市场、小餐饮和社区零售。\n普通人的机会在数字支付、补贴核销、商户运营、反欺诈、零售数据分析和小店数字化。能帮小商户把补贴流量变成稳定复购的人，会更接近这笔钱。\n投资机构\nAnthropic 拿到 650 亿美元融资。\n这轮 Series H 融资把 Anthropic 的投后估值推到 9650 亿美元。领投方包括 Altimeter Capital、Dragoneer、Greenoaks 和 Sequoia Capital，资金还包括 150 亿美元此前已承诺的 hyperscaler 投资，其中 Amazon 占 50 亿美元。\nAI 的钱已经不只是投“一个模型”。它同时在买云平台、GPU、内存、存储、企业客户、开发者工具、安全研究和可解释性能力。Anthropic 说公司年化收入本月早些时候已经超过 470 亿美元，这说明企业 AI 正在从试用预算变成生产系统预算。\n普通人的机会在 AI 产品落地、企业流程改造、模型评测、安全治理、开发者工具、客户成功和行业解决方案。会把 AI 从演示变成业务流程的人，比只会讲概念的人更容易拿到钱。\n企业\nDell 把 2027 财年 AI 服务器收入预期上调到约 600 亿美元。\nAI 数据中心建设继续把订单推向服务器供应链。Dell 把年度收入展望从 1380 亿至 1420 亿美元，上调到 1650 亿至 1690 亿美元；第一季度收入达到 438.4 亿美元，基础设施解决方案集团季度收入同比增长 181%。\n这说明 AI 基础设施的钱正在从模型公司传导到硬件、内存、服务器、存储、数据中心和现场交付。客户想要的不是一批机器，而是能按时交付、能稳定运行、能应对涨价和短缺的基础设施系统。\n普通人的机会在 AI 服务器测试、GPU 集群交付、数据中心运维、供应链计划、售前架构、项目管理和基础设施财务分析。未来几年，懂硬件又懂业务交付的人会越来越值钱。\n富豪资本\nMusk 控制的 SpaceX 正把 Colossus 算力租成现金流。\n此前协议口径显示，Anthropic 每月向 SpaceX 支付 12.5 亿美元，用于使用 Memphis 的 Colossus 和 Colossus II 数据中心算力。Musk 最新表示，当前安排先按 180 天执行，之后双方有 90 天取消通知；他也说 SpaceX 正在讨论以更大规模提供 AI compute as a service。\n富豪资本不只是在买公司，也在把稀缺基础设施变成可出租资产。火箭公司、AI 公司、数据中心和模型公司正在进入同一张资金流网络。\n普通人的机会在算力定价、GPU 集群调度、能源管理、数据中心运维、合同风控、客户迁移和大型基础设施销售。谁能把昂贵资产的利用率做高，谁就能分到这类钱。\n平民消费\n618 的钱继续流向补贴、分期、AI 营销和履约速度。\n京东 618 在 5 月 30 日晚 8 点开启。开门红 4 小时，百大品牌成交额同比平均增长超 5 倍；51 个首次参加京东 618 的新商家成交额破千万元，1516 个新商家破百万元；京东全球售成交额同比翻番。\nAI 也进入了消费现场。京东数字人 JoyStreamer 开播商家同比增长 6 倍，带货成交额突破 7000 万元；白条成交额同比增长 212%；物流大模型进入超 1000 个核心场景，库存周转效率提升 30% 至 40%。\n热门品类：\n\n服饰美妆：品牌新品、功效护肤、夏季服饰继续吃大促流量。\n家电家居：空调、冰箱、清洁电器和家居用品继续叠加平台补贴。\nAI 硬件：AI 玩具、机器人、魔法打印机、智能家居和健康器械开始进入大众消费。\n全球售：摄影摄像、美妆香水、运动装备、零食特产和手机配件增长明显。\n消费金融与履约：白条、免息、库存诊断和极速配送继续提高转化。\n\n昨日较火消费品牌：\n中国平台/品牌：京东、格力、宇树机器人、凯米斯、小龙 AI、海尔、美的、小米、珀莱雅\n国际品牌：Apple、Samsung、Nike、Adidas、Dyson、Sony、Lancôme、Estée Lauder\n消费岗位的机会正在从“会卖货”升级到“会组织交易系统”。投流、选品、数字人直播、价格策略、消费金融风控、库存周转、即时配送和售后履约，都会成为品牌抢 618 预算的核心能力。\n高薪职位\n中国高薪岗位：\n\n政务云架构 / 云资源调度 / 信创云平台负责人：人民币约 45000 至 90000 元/月，取决于政务项目经验、云平台能力和安全合规经验。\nAI 服务器供应链 / 数据中心交付负责人：人民币约 60000 至 120000 元/月，取决于 GPU 集群、IDC 交付、供应链计划和客户项目规模。\n618 大促增长 / AI 营销产品 / 履约策略负责人：人民币约 40000 至 90000 元/月，取决于 GMV 规模、投放预算、数字人运营和仓配复杂度。\n\n国际高薪岗位：\n\nFinancial Manager：约 13475 美元/月，按 BLS 2024 年薪中位数 161700 美元折算。\nComputer Hardware Engineer：约 12918 美元/月，按 BLS 2024 年薪中位数 155020 美元折算。\nSoftware Developer：约 11090 美元/月，按 BLS 软件开发者 2024 年薪中位数 133080 美元折算。\nLogistician：约 6740 美元/月，按 BLS 2024 年薪中位数 80880 美元折算。\n\n今天的高薪机会集中在政务云、AI 基础设施、算力租赁、企业 AI 商业化、电商大促和供应链履约。共同点是：钱都在买“系统可运行”。\n今日结论\n今天的钱，看起来分布很散。\n广州买政务云，泰国买居民购买力和小商户现金流，投资机构给 Anthropic 继续下注，Dell 吃到 AI 服务器订单，SpaceX 把算力租给 Anthropic，消费者的钱继续流向 618 的补贴、分期、数字人和物流履约。\n但底层逻辑很一致：钱正在从概念流向基础设施。\n政务云要能跑，补贴要能核销，AI 要有算力，服务器要能交付，数据中心要能出租，618 要能即时履约。普通人的机会，也在这些基础设施的连接处。\n"},{"title":"谁在花钱日报｜2026-05-29",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-29/",
"date":"2026-05-29",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-29/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-29/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-29/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-29/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-29/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-29/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-29/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-29/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“学前教育普惠资金、多边开发银行风险转移、跨链基础设施、半导体材料产能、赌场酒店并购、618 平台补贴和履约系统”。\n政府\n中央财政把 458 亿元投向学前教育。\n这笔钱比上年增加 125.6 亿元，增长 38%，重点支持地方落实免保育教育费、补足普惠幼儿园资源、提高保教质量，并继续覆盖家庭经济困难儿童等资助。它不是一个听起来遥远的宏观数字，而是会落到幼儿园运营、普惠园改造、教师培训、儿童安全和县区教育管理里。\n普通人的机会在托幼服务、园所运营、教育信息化、儿童安全、师训服务和区域教育项目管理。能帮家庭少花钱、帮幼儿园稳运营、帮地方把政策落到具体园所的人，会更接近这笔预算。\n国际政府与开发资金\nEBRD 用 10 亿欧元贷款组合做风险转移。\n这不是直接发一笔新贷款，而是把一组私营部门贷款的部分信用风险分给机构投资者和保险机构。EBRD 把这个交易命名为 Mosaic，结构里包括 8.35 亿欧元 senior tranche、1.45 亿欧元 mezzanine tranche 和 2000 万欧元 junior tranche。\n这类钱的关键，不只是“借出去”，而是“把资产负债表腾出来，未来还能继续借”。普通人的机会在项目融资、担保、保险、评级、合规、ESG 数据和跨境基础设施咨询。\n投资机构\n跨链平台 Squid 拿到 600 万美元融资。\n金额不算巨无霸，但它背后的流量很值得看：Squid 说自己已经路由超过 60 亿美元交易量，覆盖 100 多条区块链网络、超过 400 万笔交易和 100 万名用户。新钱会投向面向普通用户的跨链产品。\n加密行业的钱正在从“讲概念”转向“降低使用门槛”。谁能让普通用户不理解底层链、不切换一堆钱包、不害怕资产转错链，谁就更容易拿到下一阶段的钱。\n企业\n奕斯伟武汉硅材料基地总投资超过 100 亿元。\n这个位于光谷科学岛的项目主体结构已经封顶，建筑面积约 19 万平方米，计划在今年四季度首批设备搬入，2027 年上半年首批产能投产，2030 年达产。钱会继续流向机电安装、洁净厂房、设备调试、材料验证、客户认证和供应链配套。\n半导体不只需要芯片设计。材料、厂务、设备、工艺、质量、EHS、供应链计划和项目管理，也都在吃产能建设的钱。\n富豪资本\nTilman Fertitta 要用 176 亿美元交易拿下 Caesars Entertainment。\n这笔交易包括约 119 亿美元 Caesars 未偿债务，股东每股拿 31 美元现金。如果交易完成，Caesars 将从纳斯达克退市，Fertitta 的酒店、餐饮、赌场和体育资产会与 Caesars 的赌场度假村、线上博彩、体育博彩和会员体系合并。\n富豪资本买的不是一个赌场招牌，而是现金流、会员体系、地产位置、博彩牌照和餐饮娱乐协同。普通人的机会在并购整合、酒店收益管理、会员增长、博彩合规、债务融资和消费场景运营。\n平民消费\n618 的钱继续从“便宜商品”流向“补贴、分期和履约”。\n国家统计局数据显示，2026 年 1-4 月社会消费品零售总额 164941 亿元，同比增长 1.9%；网上零售额 65308 亿元，同比增长 6.6%；网上服务零售额增长更快，同比增长 8.3%。\n抖音商城 618 开启 3 日后，消费券带动成交额破千万元商家数同比增长 338%，商品卡成交额破千万元商家数同比增长 321%，商城成交额破千万元商家数同比增长 217%，单场直播成交额破千万元达人数同比增长 160%。京东也临近 5 月 30 日现货开卖节点，平台补贴和分期免息继续抢预算。\n热门品类：\n\n美妆个护：功效护肤、防晒、彩妆套装继续抢预售和直播间预算。\n服饰运动：运动户外、夏季服饰和鞋服品牌继续吃大促流量。\n食品生鲜：礼盒、生鲜、源头产地好物和即时配送继续增长。\n家电数码：手机、平板、空调、冰箱继续叠加国补和平台券。\n本地生活：餐饮团购、到店核销、旅游出行和即时零售继续分走商品消费的钱。\n\n昨日较火消费品牌：\n中国平台/品牌：抖音商城、京东、淘宝天猫、美团、小米、海尔、珀莱雅、薇诺娜、安踏\n国际品牌：Apple、Samsung、Nike、Adidas、Dyson、Sony、Lancôme、Estée Lauder\n消费岗位的机会正在从“能卖货”升级到“能降低交易摩擦”。投流、选品、直播脚本、价格策略、会员运营、供应链履约、售后安装和即时配送，都会成为品牌抢 618 预算的核心能力。\n高薪职位\n中国高薪岗位：\n\n半导体材料/设备导入/厂务项目负责人：人民币约 50000 至 100000 元/月区间，取决于洁净室、设备调试、工艺验证和量产经验。\n并购整合/酒店收益管理/会员增长负责人：人民币约 40000 至 90000 元/月区间，取决于资产规模、跨区域管理和数据化定价能力。\n电商大促增长/供应链履约负责人：人民币约 35000 至 80000 元/月区间，取决于 GMV 规模、投放预算、直播渠道和履约复杂度。\n\n国际高薪岗位：\n\nFinancial Manager：约 13475 美元/月，按 BLS 2024 年薪中位数 161700 美元折算。\nComputer Hardware Engineer：约 12918 美元/月，按 BLS 2024 年薪中位数 155020 美元折算。\nSoftware Developer：约 11090 美元/月，按 BLS 2024 年薪中位数 133080 美元折算。\nLogistician：约 6740 美元/月，按 BLS 2024 年薪中位数 80880 美元折算。\n\n今天的高薪机会集中在教育运营、半导体产能建设、开发金融结构化工具、跨链产品体验、酒店博彩并购整合和电商履约。共同点是：钱都在买复杂系统的落地能力。\n今日结论\n今天的钱，表面上分布很散。\n财政补学前教育，EBRD 做 10 亿欧元风险转移，VC 给跨链平台继续投钱，湖北半导体材料项目进入设备导入前夜，Fertitta 拿 176 亿美元交易吃下 Caesars，消费者的钱继续被 618 平台补贴和即时履约吸走。\n但底层逻辑很一致：钱都在买系统。\n教育系统、开发金融系统、链上交易系统、半导体产能系统、酒店博彩会员系统和电商履约系统，都需要能把规则、资金、技术和现场执行串起来的人。普通人的机会，也在这些系统的连接处。\n"},{"title":"谁在花钱日报｜2026-05-28",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-28/",
"date":"2026-05-28",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-28/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-28/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-28/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-28/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-28/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-28/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-28/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-28/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“中小企业数智化、孟加拉开发融资、核聚变能源、AI 基础设施供应链、富豪股权转移、服务消费和 618 履约系统”。\n政府\n中央财政拿出 81 亿元，支持中小企业数智化转型。\n这笔钱分三批进入 101 个试点城市，目标是推动 4 万余家中小企业转型。它不是单个企业拿走一笔补贴，而是通过城市试点，把预算分散到转型诊断、工业软件、云服务、设备联网、数据治理和本地服务商体系里。\n普通人的机会在制造业数字化实施、ERP/MES/CRM、云迁移、设备数据采集、财务库存打通、产业带服务商和中小企业顾问。能把“AI”和“数字化”翻译成老板能看懂的订单、库存、成本和回款，才更接近这笔钱。\n国际政府与开发资金\nADB 宣布未来五年向孟加拉提供 50 亿美元融资。\n这类钱不会一天花完，而是先变成国家融资管线，再拆成基础设施、公共服务、气候韧性、政策改革和技术援助项目。2026 年已经签署 14 亿美元贷款，并安排额外政策支持。\n普通人的机会在国际工程、项目咨询、采购、合规、审计、翻译、本地运营和 ESG 报告。懂开发银行规则、会写项目文件、能把跨境项目从纸面推进到现场的人，容易接到这类资金链条上的工作。\n投资机构\n核聚变公司 Thea Energy 完成 1 亿美元 B 轮融资。\n投资人押注的是模块化磁体、能源硬科技和未来示范电厂，不是短期流量应用。能源行业的钱很慢，但一旦进入工程阶段，就会带动材料、仿真、控制系统、功率电子、供应链、质量体系和安全合规。\n普通人不一定要成为物理学家，也可以从工程软件、设备采购、项目管理、制造质量、能源数据和安全认证切入。\n企业\nAMD 围绕台湾 AI 生态投入超过 100 亿美元。\n这笔钱会流向先进封装、服务器平台、AI 基础设施和供应链。AI 的预算继续从模型训练，扩散到芯片、封装、服务器、网络、电力、冷却和交付能力。\n普通人的机会不只在算法岗。服务器平台、硬件测试、供应链计划、数据中心交付、BOM 成本控制、渠道销售和云客户成功，也在吃 AI 基础设施的钱。\n富豪资本\nJeff Bezos 转出约 3.11 亿美元量级 Amazon 股票。\nSEC 文件显示，这笔 1,253,797 股 Amazon 股票属于赠与性质，不是二级市场买入，也不是减持套现。富豪资本有时不是买公司，而是通过赠与、信托、基金会和税务安排完成财富流转。\n普通人的机会在私人财富管理、基金会运营、税务法务、资产托管、公益项目管理和家族办公室合规。\n平民消费\n消费的钱正在从“买便宜商品”，继续转向“买服务和确定性”。\n1-4 月服务零售额同比增长 5.6%。618 也不只是商品降价，而是在平台券、直播种草、货架流量、即时零售、安装售后和本地履约里继续抢预算。\n热门品类：\n\n旅游出行：机票、酒店、周边游、短途出境继续承接端午和暑期预算。\n本地生活：餐饮团购、到店核销、即时零售和配送服务继续吃流量。\n文化娱乐：电影、演出、展览和亲子活动进入暑期前预热。\n家电数码：空调、冰箱、手机、平板和电脑继续叠加国补与大促。\n服饰运动与个护美妆：运动户外、防晒、功效护肤和彩妆套装继续抢 618 预算。\n\n代表产品和服务：\n机票酒店、到店团购、演出电影、空调冰箱、手机平板、运动户外装备、功效护肤和直播间套装。\n昨日较火消费品牌：\n中国平台/品牌：京东、淘宝天猫、抖音商城、美团、小米、海尔、安踏、珀莱雅\n国际品牌：Apple、Samsung、Nike、Adidas、Dyson、Sony、Lancôme、Estée Lauder\n今天更值得看的，是消费背后的服务系统。消费者不是只买一个更便宜的 SKU，也在买更快送到、更好安装、更方便核销、更低决策成本和更确定的售后。\n高薪职位\n中国高薪岗位：\n\nAI 基础设施/数据中心交付负责人：人民币约 60000 至 120000 元/月区间，具体取决于城市、项目规模、奖金和股权。\n芯片平台/先进封装/服务器硬件负责人：人民币约 50000 至 100000 元/月区间，取决于公司平台、供应链复杂度和团队职责。\n工业数字化解决方案/服务消费增长负责人：人民币约 40000 至 80000 元/月区间，取决于行业深度、客户规模和增长目标。\n\n国际高薪岗位：\n\nComputer Hardware Engineer：约 12918 美元/月，按 BLS 年薪中位数 155020 美元折算。\nNuclear Engineer：约 10627 美元/月，按 BLS 年薪中位数 127520 美元折算。\nData Scientist：约 9383 美元/月，按 BLS 年薪中位数 112590 美元折算。\n\n今天的高薪机会集中在 AI 基础设施、先进封装、能源工程、工业数字化、开发融资项目和服务消费增长。原因很简单：今天的钱都在买复杂系统的落地能力。\n今日结论\n今天的钱没有只流向一个风口。\n中央财政在帮中小企业数智化，ADB 把 50 亿美元放进孟加拉五年融资管线，VC 押注核聚变，AMD 把超过 100 亿美元投向 AI 供应链，Bezos 把 3 亿美元量级 Amazon 股票转入赠与安排，消费者继续把钱花在服务、履约和 618 大促里。\n普通人要看的不是哪条新闻声音最大，而是哪种系统正在被钱改造。工厂系统、开发融资系统、能源系统、AI 硬件系统、财富管理系统和消费履约系统，都在给能把复杂事情落地的人发机会。\n"},{"title":"谁在花钱日报｜2026-05-27",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-27/",
"date":"2026-05-27",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-27/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-27/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-27/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-27/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-27/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-27/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-27/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-27/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向“央行流动性、机场项目债券、物流履约平台、AI 算力采购、废弃物处理资产、618 家电数码消费和 AI/数据中心/供应链岗位”。\n政府\n中国人民银行开展 1776 亿元 7 天期逆回购操作。\n这不是政府采购，而是央行把短期资金投放到银行体系。钱先影响银行间流动性、债券收益率和资金价格，再传导到企业融资、理财收益、债基波动和银行资产负债管理。\n普通人的机会在资金交易、债券销售、银行同业、财资管理、固定收益投研和金融科技风控。\n国际政府与开发资金\nEBRD 投资 5000 万欧元索非亚机场项目债券。\n这个项目总成本 4.5 亿欧元，资金用于机场再融资和未来资本开支债券，支持保加利亚最大机场特许经营项目的长期财务结构与设施升级。开发金融的钱不一定只以贷款出现，也会进入项目债券、PPP 和长期基础设施资产。\n普通人的机会在机场运营、基础设施债券、项目融资、PPP 法务、ESG 合规、交通工程、旅客服务和商业零售配套。\n投资机构\n物流创业公司 Stord 完成近 2.5 亿美元融资，估值 30 亿美元。\nStord 做的是物流履约和仓配一体化，并推出 Stord Labs，把 AI 和 physical intelligence 放进仓储、订单履约、库存管理和配送链条。AI 投资正在从“软件界面”走向“真实世界履约”。\n普通人的机会在仓储自动化、WMS/TMS、履约运营、供应链数据分析、机器人集成和跨境电商物流。\n企业\nIREN 向 Dell 采购约 16 亿美元 Nvidia Blackwell 系统。\n这笔采购用来支撑此前 34 亿美元云 AI 服务合同。系统将部署在 IREN 德州 Childress 数据中心，投产后公司年化经常性收入预计由 37 亿美元提升至 44 亿美元。\nAI 的大钱继续落在算力交付，而不是只落在应用层。GPU、服务器、网络、存储、电力、冷却、集成服务和运维都在吃预算。普通人的机会在数据中心交付、GPU 集群运维、网络工程、液冷/风冷、电力工程、采购管理和云客户成功。\n富豪资本\nBill Gates 家族办公室 Cascade Investment 买入 Republic Services 约 1.005 亿美元股票。\nCascade 在 5 月 11 日至 13 日买入约 499150 股，持股提升至约 35.7%。这类钱不是追热点，而是在买现金流稳定的公共服务资产。垃圾收运、回收、填埋场、环保合规和车队运营，是城市每天都要付钱的系统。\n普通人的机会在环保运营、路线优化、设备维护、再生资源、填埋气利用、车队电动化和市政客户管理。\n平民消费\n618 的钱继续从美妆预售和端午旅行，转向家电、数码和以旧换新。\n冰箱、洗衣机、电视、空调、电脑、热水器 6 类家电以旧换新销售 2320.5 万台，带动销售额 954.3 亿元；手机、平板等数码和智能产品购新销售 3632 万件，带动销售额 1090.5 亿元。\n热门品类：\n\n家电大件：空调、冰箱、洗衣机、电视、热水器继续吃国补和安装预算。\n电脑与办公设备：学生、家庭和中小企业趁 618 换新。\n手机和平板：购新补贴叠加平台券，推动高客单数码消费。\n智能家居：扫地机、摄像头、智能门锁、厨电和清洁电器进入组合购买。\n旧机回收和安装服务：大件换新带动回收、送装、售后和本地履约。\n\n代表产品：\n小米手机与家电、海尔冰箱/洗衣机、美的空调、格力空调、TCL 电视、联想电脑、Apple 手机和平板、Samsung 手机与电视、Dyson 清洁电器、Sony 影音设备。\n昨日较火消费品牌：\n中国平台/品牌：京东、天猫、抖音商城、小米、海尔、美的、格力、TCL、联想\n国际品牌：Apple、Samsung、Dyson、Sony、Panasonic、Siemens\n为什么火：国补、大促立减、平台券和品牌官方补贴叠加后，消费者把预算投向“换一台更贵但更省电/更智能/配送安装更确定”的大件。\n火到什么程度：6 类家电以旧换新带动销售额 954.3 亿元；手机、平板等数码和智能产品购新带动销售额 1090.5 亿元。\n高薪职位\n中国高薪岗位：\n\nAI 科学家/AI 负责人：人民币约 132796 元/月；口径为脉脉 2026 春招报告中新经济行业高薪岗位平均月薪。\n金融 InfoSec / IT Risk Director：人民币约 80000 至 125000 元/月；口径为 Morgan McKinley 2026 中国金融服务薪酬指南，上海年薪 96 万至 150 万元折算。\n数据中心交付/电力暖通/供应链履约负责人：人民币数万至十万元/月区间，具体取决于城市、项目规模、奖金和股权结构。\n\n国际高薪岗位：\n\nComputer and Information Systems Manager：美元约 14200 美元/月量级，按 BLS 年薪中位数口径折算。\nData Scientist：美元约 9383 美元/月，按 BLS 年薪中位数 112590 美元折算。\nElectrical / Computer Hardware Engineer：美元约 9000 至 12000 美元/月区间，具体取决于电力电子、服务器、半导体和数据中心方向。\n\n今天的高薪机会集中在 AI 算力、数据中心、电力冷却、供应链履约、金融流动性和环保运营。原因很直接：今天的钱都落在“系统交付”上。能让资金更稳、仓库更快、算力更早上线、家电更快送装、环保资产更高效运营的人，比只会追热点名词的人更容易拿到钱。\n今日结论\n今天的钱没有停在新闻标题里。\n央行把 1776 亿元短期流动性放进银行体系，EBRD 用 5000 万欧元买机场项目债券，VC 继续押注物流履约平台，IREN 花 16 亿美元买 Blackwell 系统，Gates 家族办公室加仓垃圾处理资产，普通消费者把 618 预算投向家电和数码以旧换新。\n普通人要看的不是“AI 还是消费”二选一，而是哪种系统正在被花钱升级。资金系统、机场系统、仓储系统、算力系统、城市环保系统、家电履约系统，都需要能把复杂工作稳定交付的人。\n"},{"title":"谁在花钱日报｜2026-05-26",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-26/",
"date":"2026-05-26",
"headings":[{"level":1,"id":"shui-zai-hua-qian-mei-ri-hua-qian-xin-wen-ri-bao","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#shui-zai-hua-qian-mei-ri-hua-qian-xin-wen-ri-bao","title":"谁在花钱｜每日花钱新闻日报","children":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-26/#jin-ri-jie-lun","title":"今日结论","children":[]}]}],
"body":"谁在花钱｜每日花钱新闻日报\n2026-05-26\n今天，全球的大钱主要流向“深圳重点项目、巴西低碳产业融资、太空能源基础设施、美国租赁住房平台、微软 AI 资产、端午旅行消费和 AI/能源/地产运营岗位”。\n政府\n深圳 2026 年第二季度新开工项目 279 个，总投资 1524.3 亿元。\n这批项目年度计划投资 390.9 亿元。其中，社会投资项目 174 个，年度计划投资占比 87.1%；产业项目 109 个，年度计划投资占比 58.0%。这说明深圳这轮钱的重点不是单纯修路盖楼，而是继续往先进制造、产业空间、城市更新和民生工程里投。\n普通人的机会在工程管理、园区招商、产业服务、设备供应、BIM、审计合规、项目融资和本地服务业。\n国际政府与开发资金\n世界银行支持巴西东北部低碳产业与能源转型，融资包合计 9.68 亿美元。\n其中，IBRD 贷款 5 亿美元作为锚点，叠加气候投资基金、绿色赠款和技术援助资金，并预计撬动超过 4.23 亿美元商业融资。钱要去的方向包括可再生能源、可持续航空燃料、肥料、绿钢和水泥。\n这类钱的特点是先搭政策和融资框架，再吸引企业进入产业链。普通人的机会在产业招商、碳核算、项目融资、绿色认证、工程设计、供应链本地化和跨境采购。\n投资机构\n太空能源公司 Star Catcher 完成 6500 万美元 A 轮融资。\n这家公司要做的不是发射另一颗普通卫星，而是建设太空能源网，为下一代卫星提供轨道供电能力。随着卫星越来越多，太空商业化会开始补基础设施：能源、通信、热控、姿态控制、任务运营和保险。\n普通人的机会在航天电源、光学/激光、功率电子、地面站软件、仿真测试和任务管理。\n企业\nEquity Residential 与 AvalonBay 合并，合并后企业价值约 690 亿美元。\n这是两家美国大型公寓 REIT 的全股票合并，目标是做大租赁住房平台，并通过规模化运营、技术系统和成本协同提高资产收益。房地产的钱没有消失，只是从开发增量转向存量资产管理、租赁运营和数字化效率。\n普通人的机会在物业运营、租金定价、维修调度、能耗管理、租户服务、资产证券化和地产数据产品。\n富豪资本\nBill Ackman 的 Pershing Square 买入微软约 21 亿美元股份。\n微软不是早期创业公司，而是 Azure、Microsoft 365、企业软件和 AI 基础设施的复合体。富豪资本买入成熟巨头，说明 AI 的钱不只在模型公司，也在云、办公软件、开发者工具、安全和渠道生态里。\n普通人的机会在 Microsoft 365 / Copilot 落地、云迁移、企业安全、数据治理、SaaS 实施和渠道销售。\n平民消费\n端午旅行消费提前启动，钱从 618 囤货切到机票、酒店和短途出境游。\n截至 5 月 22 日，端午假期国内航线预订量超过 84 万张，同比增长 4%；出境机票预订量约 45 万张，同比增长 9%。部分用户用“请 4 休 9”把小长假拉长，北京至武汉等部分航线机票约 400 元起。\n热门品类：\n\n国内机票：北京、上海、成都、广州、西安、乌鲁木齐、兰州等目的地进入预订高峰。\n短途出境：首尔、新加坡、中国香港、曼谷、中国台北等近程目的地吃到假期预算。\n酒店套餐：城市核心区、亲子酒店、主题乐园周边酒店继续抢预算。\n景区和本地玩乐：门票、接送机、租车、演出和城市体验承接二次消费。\n错峰低价票：用户开始用请假和低价航线组合，换更长假期和更低客单。\n\n昨日较火消费品牌：\n中国平台/品牌：航旅纵横、携程、飞猪、去哪儿、美团、同程旅行\n国际品牌：Booking.com、Agoda、Airbnb、Trip.com、Singapore Airlines、Marriott\n为什么火：端午假期临近，用户开始提前锁定机票和酒店。旅行消费不是一次性付款结束，后面还会带动餐饮、景区、租车、演出和本地服务。\n火到什么程度：端午国内航线预订量超过 84 万张，出境机票预订量约 45 万张；国内同比增长 4%，出境同比增长 9%。\n高薪职位\n中国高薪岗位：\n\nAI 科学家/AI 负责人：人民币约 132796 元/月；口径为脉脉 2026 春招报告中新经济行业高薪岗位平均月薪。\n金融 InfoSec / IT Risk Director：人民币约 80000 至 125000 元/月；口径为 Morgan McKinley 2026 中国金融服务薪酬指南，上海年薪 96 万至 150 万元折算。\n产业园/城市更新/物业资产运营负责人：人民币数万至十万元/月区间，具体取决于城市、资产规模、奖金和股权结构。\n\n国际高薪岗位：\n\nComputer and Information Systems Manager：美元约 14200 美元/月量级，按 BLS 年薪中位数口径折算。\nData Scientist：美元约 9383 美元/月，按 BLS 年薪中位数 112590 美元折算。\nAerospace / Electrical Engineering 相关岗位：美元约 9000 至 12000 美元/月区间，具体取决于航天、电力电子和系统工程方向。\n\n今天的高薪机会集中在 AI 云基础设施、低碳工业、城市项目管理、太空能源、地产运营和旅行消费增长。原因很简单：今天的钱都在复杂系统里。能把项目推进、能把云和 AI 落地、能把资产运营效率做高、能把旅行流量转成交的人，更容易接住这些钱。\n今日结论\n今天的钱不是只追 AI。\n深圳把 1524.3 亿元重点项目排进建设表，世界银行把 9.68 亿美元融资包投向巴西低碳产业，风险资本押注太空能源网，美国租赁住房巨头用合并做大平台，Ackman 买入微软，普通消费者开始把预算切到端午旅行。\n普通人要看的不是哪条新闻最热，而是哪条资金链离自己最近。城市建设、低碳工业、太空基础设施、云和企业软件、租赁住房运营、旅行消费，背后都在买同一类能力：能把复杂系统跑起来，并让钱变成收入、效率或长期资产。\n"},{"title":"谁在花钱日报｜2026-05-25",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-25/",
"date":"2026-05-25",
"headings":[{"level":1,"id":"shui-zai-hua-qian-mei-ri-hua-qian-xin-wen-ri-bao","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#shui-zai-hua-qian-mei-ri-hua-qian-xin-wen-ri-bao","title":"谁在花钱｜每日花钱新闻日报","children":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-25/#jin-ri-jie-lun","title":"今日结论","children":[]}]}],
"body":"谁在花钱｜每日花钱新闻日报\n2026-05-25\n今天，全球的大钱主要流向“国债融资、开发银行债券、AI 支付基础设施、油气资产、媒体控制权、美妆 618 和高薪风控/能源/数据岗位”。\n政府\n财政部完成两期国债招标，合计 3200 亿元。\n其中，30 年期超长期特别国债实际发行 1500 亿元，20 年期国债续发行 1700 亿元。这不是单个项目花钱，而是政府先把资金从债券市场筹到财政体系里。\n这类钱后面会继续沿着财政支出、项目资本金、地方配套、金融机构配置和基建产业链往下走。普通人的机会在债券销售、机构投研、财政项目管理、工程咨询、基建供应链和审计合规。\n国际政府与开发资金\nEBRD 定价 20 亿美元 5 年期全球基准债。\n这笔钱先从全球资本市场进入开发银行资产负债表，再进入后续贷款、股权投资、担保和基础设施项目。开发资金不总是先以“某地某项目获批”出现，很多时候先以多边开发银行发债出现。\n普通人的机会在主权债和开发金融债承销、项目融资、ESG 报告、基础设施建模、国际法务、跨境项目执行和开发机构采购。\n投资机构\nAI 支付公司 Primer 完成 1 亿美元 Series C。\n这笔钱要花在把 AI 放进支付流程里：支付路由、收单连接、失败交易恢复、欺诈识别、结算效率和商户后台自动化。它不是给消费者多做一个聊天界面，而是把 AI 放到钱真正流动的地方。\n这说明 AI 正在进入更硬的商业系统。普通人的机会在支付产品、风控、反欺诈、商户成功、跨境收单、合规运营和数据分析。\n企业\nMatador Resources 花约 11.43 亿美元扩张美国油气资产。\n公司在美国 BLM 联邦租赁拍卖中取得特拉华盆地相关资产，买的是未来钻探库存、地理位置和能源资产控制权。AI 很热，但能源行业仍在为优质区块、地质数据、运营效率和中后台风控付大钱。\n普通人的机会在地质工程、油服、土地租赁、能源交易、环境合规、生产数据分析和设备维护。\n富豪资本\nByron Allen 家族办公室拟用 1.2 亿美元取得 BuzzFeed 控制性股权。\n交易结构是每股 3 美元购买 4000 万股 BuzzFeed A 类普通股，交易后取得约 52% 股权。这不是买一个流量热点，而是买媒体资产的控制权。\n媒体行业的机会不只在写内容，也在品牌整合、广告销售、短视频商业化、IP 运营、会员收入、低成本内容生产和内容分发效率。\n平民消费\n618 的钱开始从大件补贴和旅行权益，转向美妆护肤预售。\n李佳琦直播间首日上架 378 款、126 个品牌，54 款单品 GMV 破 1000 万元。珀莱雅集团截至 5 月 21 日估算 GMV 约 2.37 亿元，15 款新品累计 GMV 约 1.7 亿元。\n热门品类：\n\n功效护肤：精华、面霜、修护、抗老和敏感肌产品继续吃预算。\n彩妆底妆：底妆、修容、口红和套盒彩妆进入预售爆发期。\n国货新品：新品不只是试水，而是在 618 里直接冲 GMV。\n国际大牌套装：精华、香水、面霜、礼盒和会员权益继续抢高客单。\n直播间组合装：消费者用预售机制囤套装、赠品和长期消耗品。\n\n代表产品：\n珀莱雅红宝石/双抗系列、彩棠底妆、薇诺娜修护、可复美胶原产品、毛戈平彩妆、花西子彩妆、兰蔻精华、雅诗兰黛小棕瓶、赫莲娜黑绷带、资生堂护肤、SK-II 护肤和 Dior 香氛。\n昨日较火消费品牌：\n中国平台/品牌：珀莱雅、彩棠、薇诺娜、可复美、毛戈平、花西子\n国际品牌：兰蔻、雅诗兰黛、赫莲娜、资生堂、SK-II、Dior\n为什么火：美妆是高频复购和高毛利品类，618 预售把“补货、囤货、试新品、买赠品”放到同一个场景里。消费者不是只买便宜，而是在买成分、功效、赠品、直播间信任和品牌会员权益。\n火到什么程度：头部直播间首日 54 款单品 GMV 破 1000 万元；珀莱雅集团估算 GMV 约 2.37 亿元；15 款新品累计 GMV 约 1.7 亿元。\n高薪职位\n中国高薪岗位：\n\nAI 科学家/AI 负责人：人民币 132796 元/月；口径为脉脉 2026 春招报告中新经济行业高薪岗位平均月薪。\n金融 InfoSec / IT Risk Director：人民币约 80000 至 125000 元/月；口径为 Morgan McKinley 2026 中国金融服务薪酬指南，上海年薪 96 万至 150 万元折算。\n跨境支付/商户风控/电商增长负责人：人民币数万至十万元/月区间，具体取决于公司、城市、奖金和股权结构。\n\n国际高薪岗位：\n\nPetroleum Engineer：美元约 12797 美元/月，按 BLS 年均工资 153560 美元折算。\nInformation Security Analyst：美元约 10409 美元/月，按 BLS 年薪中位数 124910 美元折算。\nData Scientist：美元约 9383 美元/月，按 BLS 年薪中位数 112590 美元折算。\n\n今天的高薪机会集中在金融风控、支付基础设施、能源工程、数据科学、电商增长和品牌投放。原因很简单：今天的钱都落在复杂系统里。国债和开发银行债要金融与项目人才，AI 支付要风控和合规，油气资产要能源工程，美妆 618 要增长、投放和供应链。\n今日结论\n今天的钱没有只追一个风口。\n政府在发债筹钱，开发银行在全球债券市场补弹药，VC 在押注 AI 进入支付后台，能源公司在买油气资产，富豪资本在买媒体控制权，消费者在 618 美妆预售里囤新品。\n普通人要看的不是哪条新闻最热，而是哪种能力离钱最近：能管资金、能控风险、能做增长、能跑供应链、能把复杂行业数字化的人，更容易接住下一笔预算。\n"},{"title":"谁在花钱日报｜2026-05-23",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-23/",
"date":"2026-05-23",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-23/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-23/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-23/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-23/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-23/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-23/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-23/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-23/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主要流向“国有大行资本补充、危机融资通道、AI云算力基础设施、广告数据资产、618消费券和AI基建高薪岗位”。\n政府\n财政部按安排发行2026年第一期中央金融机构注资特别国债，第二期将在6月12日发行，两期合计3000亿元，用于支持国有大型商业银行补充资本。\n这笔钱不会直接发到普通人手里，但它会改变银行能不能更从容地放贷、抗风险和服务实体经济。2025年已有5000亿元特别国债用于中国银行、建设银行、交通银行、邮储银行资本补充，今年的焦点转向仍未完成本轮注资的国有大行。\n普通人的机会在银行资本管理、信贷风控、科技金融、绿色金融、普惠小微、重大基建融资和不良资产处置。\n国际政府与开发资金\n27个国家正在接入世界银行危机融资工具，用来应对战争带来的能源、粮食、化肥和财政压力。\n这不是传统意义上的慢项目贷款，而是把钱提前放进“危机时可快速抽取”的工具箱。世行危机工具可提供约200亿至250亿美元预先安排融资；如果调整现有项目组合，六个月内可动员约600亿美元，长期可能扩大到约1000亿美元。\n普通人的机会在能源进口风险管理、粮食和化肥供应链、公共采购、财政应急项目、国际组织项目执行和跨境合规。\n投资机构\nBlackstone和Google要设立AI云计算合资企业，Blackstone初始投入50亿美元股权资本，目标是在2027年上线500MW数据中心容量；含杠杆的总投资价值可能达到250亿美元。\n这笔钱说明AI投资正在从“押模型公司”进入“买算力生产资料”。数据中心、电力、冷却、网络、TPU、长期客户合同和机房运营，正在成为资本愿意重仓的底层资产。\n普通人的机会在数据中心选址、供电、液冷、网络、机房运维、云成本优化、芯片平台适配和AI基础设施金融。\n企业\nPublicis拟以约22亿美元收购LiveRamp。\n广告行业的钱正在从“买流量”转向“买合规数据基础设施”。LiveRamp的核心价值不是简单卖用户数据，而是帮助企业在更安全的方式下匹配客户数据、媒体数据和营销效果。隐私监管越严，这类数据协作能力越值钱。\n普通人的机会在隐私计算、数据洁净室、客户数据平台、营销归因、跨平台身份解析、数据合规和企业级SaaS销售。\n富豪资本\n今天没有看到足够明确的富豪个人或家族办公室新现金出手，但Ryan Cohen控制下的GameStop对eBay的非约束性收购提案仍值得跟踪。\nGameStop披露的方案是以每股125美元、约555亿美元股权价值收购eBay，并已建立5%经济敞口。现金部分拟由约94亿美元现金及流动投资和最高200亿美元融资意向支持。它还不是最终交易，但显示主动资本正在寻找能被重构成本结构的大平台。\n普通人的机会在平台整合、线下履约网络、认证交易、二手消费、直播电商、并购融资和股东沟通。\n平民消费\n618的钱继续提前流动，这次重点从旅行权益切到消费券和内容电商。\n抖音商城618首轮周期里，消费券拉动成交额破亿元商家数同比增长325%，亿元级爆款单品数量同比增长300%，超15万名带货达人成交总额同比翻五倍。短视频、直播间、搜索和商城一起抢预算，说明平台不只拼价格，还在拼“能不能让消费者更快做决定”。\n热门品类：\n\n美妆护肤：防晒、精华、套装和礼盒继续吃到大促预算。\n服饰穿搭：夏装、新中式、运动户外和通勤单品靠短视频种草转化。\n3C数码：手机、耳机、平板和智能硬件继续受补贴刺激。\n家电家居：小家电、清洁电器、智能家居和厨房电器适合用消费券拉客单。\n食品饮料：零食礼盒、饮料、酒水和家庭囤货靠直播间与满减组合促成下单。\n\n昨日较火消费品牌观察名单：\n中国平台/品牌：抖音商城、京东、淘宝/天猫、华为、小米、美的、海尔、可复美。\n国外品牌观察名单：Apple、Dyson、Nike、adidas、L'Oreal、Lancome、Sony、Nintendo。\n普通人的机会在店播运营、达人分销、短视频成交、品牌投流、商品卡优化、售后履约和AI营销工具。\n高薪职位\n中国高薪岗位：\n\nAI科学家/AI负责人：人民币132796元/月；口径为脉脉2026春招报告中新经济行业高薪岗位平均月薪。\n算法研究员：人民币74441元/月；口径为脉脉2026春招报告相关报道。\nAI infra：人民币73702元/月；口径为脉脉2026春招报告相关报道。\n金融InfoSec / IT Risk Director：人民币约80000至125000元/月；口径为Morgan McKinley 2026中国金融服务薪酬指南，上海年薪96万至150万元折算。\n\n国际高薪岗位：\n\nElectronics engineer, except computer：美元约10633美元/月，年薪中位数127590美元；口径为BLS。\nData Scientist：美元约9383美元/月，年薪中位数112590美元；口径为BLS。\nElectrical engineer：美元约9326美元/月，年薪中位数111910美元；口径为BLS。\n\n今天的高薪机会集中在AI领军岗、算力调度、金融安全、电力电子和数据科学。原因很直接：钱正在买银行风险承载能力、AI算力底座、广告数据合规、内容电商转化和危机融资执行。\n今日结论\n今天最值得看的不是某一个热点词，而是钱在补什么短板。\n政府在补银行资本，国际机构在补危机融资通道，资本在补AI算力基础设施，企业在补合规数据能力，消费者在用消费券和内容电商重新分配618预算。\n普通人要抓的不是新闻热闹，而是资金落地后必须有人完成的工作：银行风控、项目融资、数据中心、电力电子、隐私数据、店播运营、AI infra和高可信交付。\n"},{"title":"谁在花钱日报｜2026-05-22",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-22/",
"date":"2026-05-22",
"headings":[{"level":1,"id":"shui-zai-hua-qian-mei-ri-hua-qian-xin-wen-ri-bao","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#shui-zai-hua-qian-mei-ri-hua-qian-xin-wen-ri-bao","title":"谁在花钱｜每日花钱新闻日报","children":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye-yu-di-fang-zhao-shang","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#qi-ye-yu-di-fang-zhao-shang","title":"企业与地方招商","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":2,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-22/#jin-ri-jie-lun","title":"今日结论","children":[]}]}],
"body":"谁在花钱｜每日花钱新闻日报\n2026-05-22\n今天，全球的大钱主要流向“量子计算、农业供应链、AI个人助理硬件、西部招商项目、暑期旅行消费和硬科技岗位”。\n政府\n美国商务部拟向9家量子计算企业提供20.13亿美元CHIPS激励，并要求美国政府获得少数、非控股股权。\n这笔钱最大的一块给IBM，金额为10亿美元，用于建立量子级超导晶圆代工子公司；GlobalFoundries拟获3.75亿美元，用于建设本土量子代工能力；Atom Computing、D-Wave、Infleqtion、PsiQuantum、Quantinuum、Rigetti和Diraq则分别获得不同额度的量子工程研发支持。\n这说明政府补贴正在变得更像产业投资组合。量子计算还没有进入普通消费者日常，但钱已经先流向晶圆、低温系统、光子封装、读出电子、半导体制造和安全合规。普通人的机会不一定是直接写量子算法，而是在材料、设备、测试、工程、项目申报和供应链岗位上接住预算。\n国际政府与开发资金\nEBRD向Dorado提供最高6000万美元贷款，支持科特迪瓦可持续腰果供应链。\n这笔钱会用于本地腰果采购、加工和出口，也会推动合作社认证、村级储蓄贷款协会、气候智能农业和供应链可追溯。它的重点不是把原料简单卖出去，而是让当地在加工、认证、金融和出口环节多留下价值。\n普通人的机会在农产品采购、食品加工、出口质检、供应链追溯、合作社运营、农村金融、ESG审计和非洲市场贸易。\n投资机构\nAI公司Hark完成7亿美元A轮融资，投后估值达到60亿美元。\nHark想做的不是又一个写代码工具，而是面向普通人的AI个人助理、模型和硬件。钱会花在硬件、产品设计、AI研究、算力和组件上。它的想象空间很大，风险也很清楚：产品还没完全公开，隐私边界、硬件形态和真实留存都还没被市场验证。\n这笔融资说明资本仍在寻找“普通人每天都会用的AI入口”。普通人的机会在端侧AI、硬件设计、语音视觉交互、隐私计算、供应链、产品设计和渠道运营。\n企业与地方招商\n第八届西洽会签约项目212个，正式合同额超过1500亿元。\n这批项目涉及先进材料、能源等多个领域，其中10亿元以上项目达到57个。西洽会还发布了277个“投资重庆机会清单”项目，重点放在先进制造、绿色低碳和数字经济。\n这类钱不是一夜之间到账，但它会带动项目落地服务、园区招商、工程建设、设备采购、能源管理、跨境商务、政策申报和投后运营。地方招商的钱越来越看重“制造+服务+低碳+数字”的组合。\n富豪资本\n今天不硬凑富豪资本。\nSpaceX IPO相关报道更多是潜在持股受益和上市结构，不是富豪个人新增出资、正式增减持或家族办公室交易。没有明确新钱，就不把“谁可能发财”写成“谁在花钱”。\n平民消费\n618的钱开始从手机家电扩散到暑期旅行。\n飞猪把今年618升级为“旅行品牌盛典”，航空、酒店、主题乐园、邮轮和亲子度假一起抢预算。很多消费者现在不一定马上出发，但会先把暑期权益、机票卡、酒店通兑和乐园门票囤下来。\n热门品类：\n\n机票卡和全球飞权益：国航、南航、东航用不含税往返卡、次卡和惊喜飞机票锁定出行预算。\n酒店通兑和会员权益：万豪、希尔顿、雅高、洲际、凯悦继续用房晚、积分和可兑换门店吸引提前购买。\n主题乐园和亲子度假：上海乐高乐园度假区铂金年卡、上海迪士尼/香港迪士尼门票、长隆住玩套票回到爆款清单。\n邮轮和跨境度假：MSC地中海邮轮、国泰航空、加拿大航空、新加坡航空等进入618旅行场。\n平台权益和直播带货：88VIP、淘金币、飞猪直播间、淘宝主播和旅游达人一起促成下单。\n\n代表产品：\n国航全球经济舱往返不含税机票卡、南航全球飞次卡、东方航空惊喜飞行机票次卡、开元森泊酒店通兑、红树林海南多店通兑、上海迪士尼度假区双人套票、香港迪士尼乐园一日门票套餐、长隆旅游度假区住玩套票、上海乐高乐园度假区铂金年卡。\n昨日较火消费品牌：\n中国平台/品牌：飞猪、国航、南航、东方航空、开元森泊、长隆、上海乐高乐园度假区\n国际品牌：国泰航空、加拿大航空、新加坡航空、万豪、希尔顿、雅高、洲际、凯悦、MSC地中海邮轮、迪士尼\n为什么火：暑期旅游是高客单、强计划消费。618把“现在不出发，先把便宜权益买下来”的心理放大，航空、酒店、乐园和邮轮都在用低价券、积分、房晚和会员权益提前锁预算。\n火到什么程度：飞猪称618报名商家数和商品数连续4年增长并再创新高；大牌“好券”截至报道时累计售出近10万张；直播带货坑位数同比增长300%以上。\n高薪职位\n中国高薪岗位：\n\nAI科学家/AI负责人：人民币132796元/月；口径为脉脉2026春招报告中新经济行业高薪岗位平均月薪。\n算法研究员：人民币74441元/月；口径为脉脉2026春招报告。\nAI infra：人民币73702元/月；口径为脉脉2026春招报告。\n金融InfoSec/IT Risk Director：人民币约80000至125000元/月；口径为Morgan McKinley 2026中国金融服务薪酬指南，上海年薪96万至150万元折算。\n\n国际高薪岗位：\n\nElectronics engineer, except computer：美元约10633美元/月，年薪中位数127590美元；口径为BLS。\nElectrical engineer：美元约9326美元/月，年薪中位数111910美元；口径为BLS。\nData Scientist：美元约9383美元/月，年薪中位数112590美元；口径为BLS。\n\n今天的高薪机会集中在量子/半导体工艺、AI硬件、端侧AI、数据科学、电力电子、供应链金融、招商项目管理和旅游收益管理。原因很简单：今天的钱都在买复杂系统落地。政府买量子制造能力，开发银行买农业供应链增值，VC买AI个人入口，地方招商买先进制造和能源项目，消费者买暑期旅行权益。\n今日结论\n今天最值得看的不是某一个热点词，而是钱在买什么能力。\n政府买硬科技主权能力，开发资金买供应链本地增值，资本买普通人的AI入口，地方招商买能落地的制造和服务项目，消费者买暑期旅行确定性。普通人要抓的不是“量子”“AI”“618”这些标签，而是能把资金变成产能、订单、体验和复购的硬能力：工程、供应链、数据、项目管理、渠道运营、金融合规和跨境贸易。\n"},{"title":"谁在花钱日报｜2026-05-21",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-21/",
"date":"2026-05-21",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-21/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-21/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-21/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-21/#qi-ye","title":"企业","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-21/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-21/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“地方债、非洲发展担保、防务科技融资、电力燃料资产、618预售消费和硬工程高薪岗位”。\n政府\n河南省政府一般债券、专项债券合计392.99亿元，5月20日招标，5月21日开始计息。\n这笔钱一部分投向老旧小区改造、保障性安居工程、新型基础设施、市政和产业园区、社会事业等项目，一部分用于偿还到期债券本金。它说明地方政府的钱正在两头用：一头维持项目建设，一头处理债务滚续。普通人的机会在市政工程、保障房、老旧小区改造、产业园区配套、项目申报、施工审计和政府资金绩效管理。\n国际政府与开发资金\n世界银行集团MIGA计划到2030年把非洲年度担保发行提高到64亿美元，未来四年预计撬动230亿美元私人资本。\n这不是直接发贷款，而是给私人资本降风险。钱会流向农业、能源、基础设施、健康、数字、金融和贸易项目。普通人的机会在项目融资、信用增强、政治风险保险、非洲电力和宽带项目、农业供应链、贸易金融、ESG尽调和跨境合规。\n投资机构\n防务科技公司Anduril完成50亿美元融资，估值升至610亿美元。\n这笔钱说明防务科技已经不只是传统军工采购，而是“政府需求+VC资金+快速制造”的混合战场。无人系统、传感器、边缘AI、低成本自主武器、军工制造和供应链安全，正在成为私募资金愿意重仓的方向。普通人的机会在无人机、传感器融合、测试验证、军工质量体系、出口管制合规和低成本制造。\n企业\nNextEra拟以13亿美元收购Caliber Resource Partners，并与Quantum Capital设立页岩资产管理安排。\nAI数据中心推高电力需求之后，电力公司开始重新补燃料和发电资产。NextEra之前的大交易已经说明电力行业在变大，这笔13亿美元页岩资产收购则更像是在补底层燃料和资产运营能力。普通人的机会在天然气资产运营、电力交易、负荷预测、数据中心供电、燃料采购、能源金融、并购整合和环保合规。\n平民消费\n618从5月21日进入天猫预售节点，平台补贴、政府补贴、AI导购和新品首发同时抢预算。\n热门品类：\n\n手机、平板和3C数码：国补最高500元，叠加平台券和新品首发。\n六类大家电和智能家电：单品最高补贴1500元，智能家电新国标抬高“真智能”门槛。\n美妆护肤与礼赠：520后接618，礼盒、精华、彩妆继续靠新品和折扣承接需求。\n家居清洁和智能卫浴：高客单新品靠首发、补贴和直播间转化。\nAI购物工具和平台服务：京东京言、淘宝千问、抖音AI主播进入大促实战。\n\n昨日较火消费品牌：\n中国平台/品牌：天猫/淘宝、京东、抖音商城、小米、可复美、九牧\n国外品牌观察名单：Dyson、TOM FORD、Tissot、WEDGWOOD、Razer、Apple\n为什么火：今年618不只拼满减，而是拼“现在买是不是更省、是不是更快、是不是更适合我”。手机、家电、美妆、清洁电器和智能卫浴都在用消费券、国补、AI导购和新品首发降低决策成本。\n火到什么程度：京东称2026年AI相关研发投入同比增长超过200%，AI能力覆盖零售、物流、健康、外卖、家政等3000多个生活场景；天猫5月21日启动618预售，手机平板等3C产品最高减500元，六类大家电单品最高补贴1500元。\n高薪职位\n中国高薪岗位：\n\nAI科学家/AI负责人：人民币132796元/月；口径为脉脉2026春招报告中新经济行业高薪岗位平均月薪。\n算法研究员：人民币74441元/月；口径为脉脉2026春招报告。\nAI infra：人民币73702元/月；口径为脉脉2026春招报告。\n金融InfoSec/IT Risk Director：人民币约80000至125000元/月；口径为Morgan McKinley 2026中国金融服务薪酬指南，上海年薪96万至150万元折算。\n\n国际高薪岗位：\n\nElectronics engineer, except computer：美元约10633美元/月，年薪中位数127590美元；口径为BLS。\nElectrical engineer：美元约9326美元/月，年薪中位数111910美元；口径为BLS。\nData Scientist：美元约9383美元/月，年薪中位数112590美元；口径为BLS。\n\n今天的结论很直接：大钱继续流向能处理硬约束的人和系统。地方债要项目落地，非洲担保要金融结构，防务科技要制造和合规，电力公司要燃料和负荷管理，618要AI导购和供应链履约。普通人要抓的不是概念，而是能接住预算的硬技能：工程、电力、数据、金融安全、防务制造、供应链和政府项目执行。\n"},{"title":"谁在花钱日报｜2026-05-20",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-20/",
"date":"2026-05-20",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-20/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-20/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-20/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-20/#qi-ye","title":"企业","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-20/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-20/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“欧洲海军军购、孟加拉LNG融资、AI开发者工具并购、AI电源芯片收购、520消费分化和硬门槛高薪岗位”。\n政府\n瑞典计划向法国Naval Group采购4艘护卫舰，交易金额超过40亿美元。\n这笔钱投向的是波罗的海安全和海军防空能力。瑞典加入北约之后，国防预算不再只是纸面数字，而是开始变成舰艇、雷达、防空系统、港口维护和长期军工供应链订单。普通人的机会在舰艇工程、雷达电子、军贸合规、复合材料、维修保养和北约供应链协同。\n国际政府与开发资金\n世界银行批准3.5亿美元追加融资，支持孟加拉在全球能源市场波动中保障LNG进口。\n这不是普通基建贷款，而是能源安全钱。孟加拉依赖进口LNG支撑发电和工业生产，能源价格一波动，就会传导到工厂开工、出口订单、外汇储备和家庭电费。普通人的机会在能源采购、贸易融资、外汇风险管理、电力调度、工业节能和供应链成本控制。\n投资机构\nAnthropic收购开发者工具公司Stainless。官方没有披露价格，但外部报道此前称交易谈判价格超过3亿美元。\nStainless做的是SDK生成、API工具和连接器，曾被OpenAI、Google、Cloudflare等公司使用。这笔钱说明，AI公司不只在买模型能力，也在买“让模型接入企业系统”的基础设施。普通人的机会在SDK、MCP连接器、API治理、企业系统集成、开发者体验和迁移服务。\n企业\nAnalog Devices同意以约15亿美元现金收购Empower Semiconductor，强化AI电源管理组合。\nAI硬件竞争不只发生在GPU上，也发生在“能不能稳定供电”上。高密度AI处理器需要更快、更高效、更靠近芯片的电源交付能力。普通人的机会在电源芯片、板级设计、封装级电源、散热、测试验证、供应链质量和数据中心工程。\n平民消费\n520消费没有单纯升温，而是在分化。\n热门品类：\n\n鲜花与即时送礼：花束仍是入口，但线下花市没有明显爆发。\n美妆护肤：520礼盒、精华、香水、口红继续靠券和会场转化。\n黄金珠宝：首饰礼赠承压，但金条金币投资需求走强。\n品牌购物卡：平台用购物卡、折扣和转赠功能降低送礼决策成本。\n本地生活和即时零售：外卖、到店团购、即时配送和电商主站交叉抢预算。\n\n昨日较火消费品牌：\n中国平台/品牌：京东、美团/美团闪购、淘宝/天猫、周大生/中国黄金、珀莱雅\n国外品牌观察名单：兰蔻、SK-II、Apple、Dyson、Givenchy\n为什么火：520仍然是送礼节点，但年轻人对高溢价浪漫符号更谨慎。平台用折扣、购物卡、即时达和场景榜单继续抢预算；高金价又把一部分钱从“首饰悦己”推向“金条金币保值”。\n火到什么程度：中国黄金协会口径显示，2026年一季度黄金首饰消费量84.62吨，同比下降37.10%；金条及金币消费量202.06吨，同比上涨46.40%。京东520礼物金榜覆盖送男友、送女友、送自己、送家人、送朋友和买赠鲜花六大场景，服饰美妆券后低至7.2折。\n最火品牌：平台侧看京东、美团、淘宝/天猫；礼赠侧看黄金珠宝、美妆护肤和鲜花；国外品牌侧重点观察兰蔻、SK-II、Apple、Dyson、Givenchy等礼赠和数码强势品牌。\n高薪职位\n中国高薪岗位：\n\nAI科学家/AI负责人：人民币132796元/月；口径为脉脉2026春招报告中新经济行业高薪岗位平均月薪。\n算法研究员：人民币74441元/月；口径为脉脉2026春招报告。\nAI infra：人民币73702元/月；口径为脉脉2026春招报告。\n金融InfoSec/IT Risk Director：人民币约80000至125000元/月；口径为Morgan McKinley 2026中国金融服务薪酬指南，上海年薪96万至150万元折算。\n\n国际高薪岗位：\n\nTruck driver owner-operator：美元约13333美元/月，年薪约160000美元；口径为Indeed 2026最佳岗位榜。\nCardiac medical tech：美元约11159美元/月，年薪约133907美元；口径为Indeed 2026最佳岗位榜。\nData Scientist：美元约9383美元/月，年薪中位数112590美元；口径为BLS。\n\n今天的结论很直接：大钱继续流向硬安全、能源安全、AI基础设施和能解决真实瓶颈的工程能力。普通人要抓的不是抽象概念，而是能接住预算的硬技能：电力、半导体供电、军工供应链、企业系统连接、金融安全、医疗认证、物流运营和云成本治理。\n"},{"title":"谁在花钱日报｜2026-05-19",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-19/",
"date":"2026-05-19",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-19/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-19/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-19/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-19/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-19/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-19/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-19/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“美国机场重建、菲律宾危机融资、Google TPU云、电力巨头并购、AI富豪资本版图、618 AI消费和硬门槛高薪岗位”。\n政府\n美国交通部称，计划重建华盛顿杜勒斯国际机场，项目估算约220亿美元。\n这笔钱还不是已经一次性拨出的财政支出，政府出资比例也没有公布，但方向很清楚：美国还在为航空枢纽、航站楼、客流效率和城市门户继续投大钱。普通人的机会在机场工程、机电系统、智慧安检、地勤调度、机场商业、项目融资和长期运维。\n国际政府与开发资金\nADB准备向菲律宾提供最高17.5亿美元额外融资支持，帮助它应对中东冲突带来的油价、化肥和商品冲击。菲律宾今年另有约20亿美元政策性贷款正在准备。\n这类钱最后会落到燃油补贴、交通、农业、社会保护、能源安全和清洁能源项目上。对普通人来说，国际冲突不是只停留在新闻里，它会穿过油价、物流、化肥和食品价格，落到家庭账单上。\n投资机构\nBlackstone计划向Google的TPU云合资公司投入50亿美元股权，并预计持有多数股权。Google提供TPU硬件、软件和服务，Blackstone出钱把它做成可出租、可融资、可规模化的AI云资产。\nAI资金正在从“谁有模型”转向“谁能稳定供算力”。相关机会会出现在TPU/GPU集群运维、云销售、数据中心财务模型、AI成本优化、算力调度和企业迁移咨询。\n企业\nNextEra计划以约668亿美元全股票交易收购Dominion。合并后的公司企业价值约4200亿美元，背后是AI数据中心对电力基础设施的需求暴涨。\n这不是普通电力公司抱团取暖，而是AI把电网、核电、燃气电厂、输电线路和公用事业监管重新推到资本市场中心。Dominion所在的北弗吉尼亚是全球最大数据中心集群之一，客户包括Alphabet、Amazon、Microsoft、Meta、Equinix、CoreWeave和CyrusOne。\n普通人的机会在电力工程、并网排队、数据中心供电、储能、电价设计、能源交易、监管事务和大型工程PMO。\n富豪资本\n法院文件披露，Sam Altman在多家与OpenAI有业务往来的公司中持有超过20亿美元权益，其中包括Helion Energy、Stripe和Retro Biosciences。\n这不是今天新增买入，而是AI核心人物的资本版图被公开照亮：能源、支付、长寿科技、芯片和企业软件，都可能成为AI公司向外依赖的关键资产。普通人看这类事件，不应只看八卦，而要看产业链里哪些环节正在被最靠近AI核心的人视为稀缺资源。\n平民消费\n618正式进入AI化、低价化、补贴化阶段。\n热门品类：\n\n手机数码和家电：京东官方直降低至5折，抖音叠加平台补、国补、店补后低至5折。\nAI智能硬件：学习灯、魔法打印机、智能床垫、炒菜机器人、智能轮椅等进入京东AI家场景。\n美妆礼赠：抖音大牌美妆低至3折，承接520和年中囤货。\n运动户外和居家囤货：抖音把运动户外、居家囤货、数码焕新列为节点重点。\n健康、本地生活和家政服务：健康问诊、家政、外卖券、酒旅券都加入618。\n\n昨日较火消费品牌：\n中国平台/品牌：京东、华为、美的、飞鹤、海尔、小米\n国外品牌观察名单：SK-II、Apple、Dyson、Nike、Adidas\n为什么火：今年618的抓手不是单一低价，而是“低价+国补+AI硬件+服务消费+直播转化”。京东把正式开卖时间定在5月30日晚8点，抖音则已经从5月15日开跑。两边都在用低至5折和百亿级补贴抢预算。\n火到什么程度：京东JoyInside已与近200个家电家居、机器人、健康、玩具品牌合作，今年计划植入超千万台智能硬件；抖音一季度累计为商家降低经营成本超85亿元。\n最火品牌：平台侧看京东和抖音；具体品牌侧看华为、美的、SK-II、飞鹤，以及618传统强势的Apple、Dyson、Nike、Adidas等外资消费品牌。\n高薪职位\n中国高薪岗位：\n\nAI科学家/AI负责人：人民币132796元/月；口径为脉脉2026春招报告中新经济行业高薪岗位平均月薪。\n算法研究员：人民币74441元/月；口径为脉脉2026春招报告。\nAI infra：人民币73702元/月；口径为脉脉2026春招报告。\n具身智能岗位：人民币61625元/月平均月薪；岗位量同比暴增15倍。\n\n国际高薪岗位：\n\nTruck driver owner-operator：美元约13333美元/月，年薪约160000美元；口径为Indeed 2026最佳岗位榜。\nCardiac medical tech：美元约11159美元/月，年薪约133907美元；口径为Indeed 2026最佳岗位榜。\nData Scientist：美元约9383美元/月，年薪中位数112590美元；口径为BLS，2024-2034就业预计增长34%。\n\n今天的结论很直接：大钱继续流向基础设施、能源、电力、AI算力和带补贴的消费场景。普通人要抓的不是“AI概念”，而是能把AI接进真实行业的硬技能：电力、数据中心、云成本、机器人、医疗数据、供应链、零售转化和企业系统。\n"},{"title":"谁在花钱日报｜2026-05-18",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-18/",
"date":"2026-05-18",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-18/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-18/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-18/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-18/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-18/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-18/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-18/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“长期资金入市、欧洲机场债、国防AI感知、欧洲AI数据中心、富豪资金换仓Microsoft、520礼赠消费和AI/医疗/安全高薪岗位”。\n政府\n证监会披露，社保、保险等中长期资金去年净买入A股超8000亿元，上市公司现金分红2.55万亿元，公募基金实现盈利2.6万亿元。\n这不是财政直接发钱，而是监管推动“长钱入市、分红回报、基金盈利”的资本市场修复主线。对普通人来说，机会不只在炒股，也在指数产品、养老金投顾、上市公司投关、基金运营、财富管理合规和长期资产配置教育。\n国际政府与开发资金\nEBRD认购5000万欧元，参与索菲亚机场4.5亿欧元融资包。资金用于机场债券、资本开支和现代化升级，包括新航站楼和基础设施更新。\n开发性金融正在帮助基础设施项目进入债券市场。更实际的机会在PPP项目融资、机场商业、工程管理、绿色改造、长期债券发行和跨境基础设施法务。\n投资机构\n国防科技公司Arkeus完成1800万美元A轮融资，用于扩张AI感知系统，并扩大美国、澳大利亚和欧洲制造能力。\nAI资金继续从软件应用外溢到“传感器+算法+制造+国防采购”。相关岗位会出现在嵌入式AI、光电传感、无人系统测试、军工合规、供应链质量和海外政府客户交付。\n企业\nArgentum AI与Boosteroid、DL Invest Group签署约25亿美元、300MW欧洲AI数据中心基础设施协议。\nAI竞争继续从模型参数转向“电力、机柜、GPU、融资、租约和客户承诺”。普通人的机会集中在数据中心工程、强弱电、制冷、GPU集群运维、能源采购、项目融资和云成本治理。\n富豪资本\nBill Ackman旗下Pershing Square新建Microsoft持仓。13F显示，一季度末持有Microsoft约565万股，季末市值约20.9亿美元。Ackman称出售Alphabet不是看空，而是为Microsoft配置资金。\n富豪资本没有离开AI，只是在模型叙事过热后转向有现金流、有企业客户、有云平台入口的大公司。普通投资和职业选择都应关注AI基础设施背后的经常性收入、企业软件粘性和云服务利润率。\n平民消费\n520礼赠进入冲刺，美妆护肤、黄金珠宝、鲜花和家电家居一起抢预算。\n热门品类：\n\n美妆护肤：520礼盒、精华、水乳套装、香水礼盒。\n黄金珠宝：加1元得黄金、黄金珠宝礼物、情侣/纪念款饰品。\n鲜花和即时送礼：鲜花卡、最快9分钟送达，解决临近节日买礼物的问题。\n家电家居：京东超级18叠加家电家居超级焕新日，小米、美的、海尔、三星、格力、海信等参与。\n\n昨日较火消费品牌：\n中国平台/品牌：京东、周大生、小米、美的、海尔\n国外品牌：YSL、雅诗兰黛、PRADA、祖玛珑、三星\n为什么火：520是强礼赠场景，平台把折扣、鲜花、黄金小赠品和即时配送绑在一起，降低临时买礼物的决策成本。\n火到什么程度：京东520礼赠会场大牌券后低至7.2折，购物卡至高折上9折，最高520元无门槛券；京东超级18从5月17日20点持续到5月18日24点。\n最火品牌：平台侧看京东；品类侧看美妆护肤、黄金珠宝和家电家居。\n高薪职位\n中国高薪岗位：\n\nAI科学家/AI负责人：人民币132796元/月；口径为脉脉2026春招报告中新经济行业高薪岗位TOP20平均月薪。\n算法研究员：人民币74441元/月；口径为脉脉报告中第二高薪岗位。\n金融信息安全/IT Risk Director：人民币约80000至125000元/月；口径为Morgan McKinley 2026中国金融服务薪酬指南中上海Director - InfoSec / IT Risk年薪96万至150万元折算。\n\n国际高薪岗位：\n\n美国医生类高薪岗位：美元约19933美元/月以上，折合人民币约143500元/月以上；口径为BLS多类医生岗位年薪不低于239200美元。\nNurse Anesthetist / 麻醉护士：美元约18601美元/月，折合人民币约133900元/月；口径为BLS麻醉护士年薪中位数223210美元折算。\nSoftware Developer / 软件开发者：美元约11090美元/月，折合人民币约79850元/月；口径为BLS软件开发者年薪中位数133080美元折算。\n\n今天最关键的数字是：8000亿元、2.55万亿元、2.6万亿元、5000万欧元、4.5亿欧元、1800万美元、25亿美元、300MW、20.9亿美元、132796元/月。资金正在流向长期权益资产、机场基础设施、国防AI、欧洲AI数据中心、Microsoft式现金流AI入口、520礼赠消费和硬门槛高薪岗位。\n"},{"title":"谁在花钱日报｜2026-05-17",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-17/",
"date":"2026-05-17",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-17/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-17/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-17/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-17/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-17/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-17/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-17/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“广州港口基建、巴西低碳工业、稳定币金融入口、AI大厂债券融资、Berkshire持仓调仓、618场景消费和AI/安全/医疗高薪岗位”。\n政府\n广州南沙港区五期工程开工，总投资约144.47亿元。项目规划建设4个20万吨级、2个10万吨级集装箱泊位，设计年通过能力600万TEU。\n这笔钱投向的是外贸效率。港口不是孤立工程，它会影响班轮航线、仓储、拖车、报关、跨境电商履约、供应链金融和港口自动化设备。对普通人来说，相关机会不只在土建施工，更在港口自动化、外贸物流、跨境电商运营、关务服务和智能调度。\n国际政府与开发资金\n世界银行批准5亿美元贷款，支持巴西东北部能源转型和就业创造，重点是以更低碳方式生产工业和农业商品。\n开发资金正在从单纯基建转向“产业竞争力+低碳约束”。未来做外贸、供应链和农产品加工，低碳认证、碳核算、ESG融资、可再生能源项目管理和拉美市场合规都会变成更实际的技能。\n投资机构\nFasset完成5100万美元B轮融资，投资方包括SBI Holdings、Investcorp、Arz Portfoy等。它做的是稳定币和数字资产金融基础设施。\n这笔钱不算超级大，但方向很明确：稳定币正在从交易所场景向跨境支付、汇款、储蓄和低银行覆盖地区的金融入口迁移。普通人想切入，重点不是炒币，而是支付合规、反洗钱、风控、跨境结算、钱包产品和本地牌照研究。\n企业\nAlphabet发行约36亿美元等值日元债。债券用途通常写作一般企业用途，但市场把它放在Alphabet持续增加AI和云基础设施资本开支的背景下理解。\nAI竞赛越来越像资本开支竞赛。数据中心、电力、GPU、网络和模型服务成本持续上升，机会也会流向数据中心建设、能源采购、债务融资、云成本管理、供应链采购和硬件运维。\n富豪资本\nBerkshire Hathaway在13F中披露一季度末持仓变化，市场关注其新建仓Alphabet、Delta和UnitedHealth等。相关新仓位合计达到数十亿美元量级。注意，13F反映的是季度末持仓，不等于5月当天买入。\n这类调仓更像长期资金的方向信号。科技、航空和医疗保险同时进入视野，说明“现金流+估值修复+行业龙头”的组合仍然吸引长期资本。普通人不要把13F当实时抄作业清单，更该看行业现金流、估值安全边际和披露滞后风险。\n平民消费\n618从“平台启动”进入具体消费场景。\n热门品类：\n\n520礼赠：美妆个护、香氛、饰品和小样礼盒。\n手机数码：手机、耳机、平板和智能眼镜。\n智能家电：节能家电、清洁电器和健康家电。\n运动户外：跑步、骑行、露营和轻户外装备。\n居家囤货：食品饮料、个护清洁和家庭日用品。\n\n昨日较火消费品牌：\n中国：京东、抖音商城、天猫、小米、华为、珀莱雅\n国外：Apple、Ray-Ban Meta、Garmin、Nike、Lululemon、L'Oreal\n今天的更新点不是“618又开始了”，而是消费正在按场景分流：520礼赠带动美妆礼盒，数码换新承接补贴和保价，智能硬件继续吃AI叙事，户外运动和居家囤货承接端午、暑期和世界杯前的生活场景。\n高薪职位\n中国高薪岗位：\n\nAI科学家/AI负责人：人民币132796元/月；口径为脉脉2026春招报告中新经济行业高薪岗位TOP20平均月薪。\nAI infra/高性能计算工程师：人民币约60000至100000元/月；口径为招聘市场估算，脉脉报告显示高性能计算工程师供需比明显紧张。\n金融IT安全高级岗：人民币约108300元/月；口径为Morgan McKinley中国金融服务薪酬指南中上海Senior Executives - IT Security平均年薪130万元折算。\n\n国际高薪岗位：\n\n美国专科医生/医生类高薪岗位：约19933美元/月以上，折合人民币约143500元/月以上；口径为BLS多类医生岗位年薪不低于239200美元折算。\nNurse Anesthetist / 麻醉护士：约18601美元/月，折合人民币约133927元/月；口径为BLS麻醉护士年薪中位数223210美元折算。\nSoftware Architect / 软件架构师：约19083美元/月，折合人民币约137400元/月；口径为Glassdoor美国总薪酬中位数229000美元折算。\n\n今天最关键的数字是：144.47亿元、600万TEU、5亿美元、5100万美元、约36亿美元、数十亿美元量级、132796元/月、223210美元/年。钱正在流向外贸物流底座、低碳工业、稳定币金融基础设施、AI资本开支、长期价值资金调仓、618场景消费和强门槛高薪岗位。\n"},{"title":"谁在花钱日报｜2026-05-15",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-15/",
"date":"2026-05-15",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-15/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-15/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-15/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-15/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-15/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-15/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-15/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“地方债化债、东盟开发融资、AI芯片IPO、OpenAI算力账单、早期风投、618内容电商和AI人才抢夺”。\n政府\n云南省5月15日计划发行411.4亿元地方政府再融资一般债券和专项债券，期限覆盖5年、7年、10年、15年和30年。其中224.9亿元再融资专项债募集资金用于置换存量隐性债务。\n这说明地方债资金仍在做两件事：一是支持项目，二是修复地方资产负债表。对普通人来说，更值得看的岗位不是泛泛“基建”，而是城投化债、债券发行服务、财务重组、项目审计和公共部门资金管理。\n国际政府与开发资金\nADB承诺到2030年为东盟旗舰项目动员300亿美元。其中，60亿美元用于深化资本市场，50亿美元用于加速ASEAN Power Grid，并属于到2035年最高100亿美元电网支持框架的一部分。\n东南亚的钱正在从单国项目转向区域互联互通。跨境电力交易、能源工程、绿色金融、东盟市场合规、AI基础设施咨询和多边项目执行，会是更实际的机会。\n投资机构\nCerebras Systems正式完成IPO定价：3000万股Class A普通股，每股185美元，募资约55.5亿美元。它5月14日在Nasdaq以CBRS交易，首日一度较发行价翻倍。\n这是5月9日“拟IPO”线索的重大更新：当时市场预期募资约35亿美元，本次实际落地升至约55.5亿美元。AI芯片开始重新获得公开市场定价，机会会向AI芯片销售、推理服务、数据中心采购、供应链金融和硬件产品管理扩散。\n企业\nMicrosoft高管在Musk v. Altman庭审中称，公司对OpenAI合作的累计投入已超过1000亿美元，主要包括原始投资、Azure基础设施建设和模型托管成本，其中直接投资约130亿美元。\n大模型商业化最贵的不是发布会，而是提前建设数据中心、GPU集群、网络和供电。AI时代更确定的岗位，会在云基础设施、GPU资源调度、FinOps、模型服务运维、企业AI采购和AI成本治理。\n富豪资本\nKevin Hartz和Bennett Siegel管理的早期风投A*关闭4.5亿美元第三期基金。新基金平均单笔投资300万至500万美元，计划投至少30家公司，方向覆盖AI应用、金融科技、医疗和安全。\n这类资金没有追逐几十亿美元级AI巨轮，而是在找“AI应用+真实行业问题”的组合。对创业者来说，垂直场景、现金流、企业客户和可交付能力，比单纯讲模型能力更重要。\n平民消费\n618进入内容电商抢跑期，智能硬件继续吃补贴红利。\n热门品类：\n\n618内容电商：抖音商城618好物节从5月15日持续到6月18日，主打百亿消费券、立减折扣和一件直降。\n货架电商低价直降：京东5月6日已启动618预热，强调官方直降、跨店满减和更长价保。\n智能眼镜：商务部口径显示，一季度重点平台智能眼镜销售额增长4.6倍。\n智能家电和健康硬件：一级能效洗衣机、智能血糖仪、户外运动装备继续受以旧换新带动。\n\n昨日较火消费品牌：\n中国平台：京东、抖音商城、快手电商、天猫、华为/小米等智能硬件品牌\n国外：Ray-Ban Meta、Apple、Garmin\n为什么火：618规则正在从“凑单算账”转向“官方直降+内容种草+即时成交”；智能眼镜则同时吃到AI硬件故事和以旧换新补贴。\n火到什么程度：京东大促周期从5月6日拉到6月18日后返场；抖音商城从5月15日开跑；一季度重点平台智能眼镜销售额增长4.6倍。\n最火品牌：中国平台看京东和抖音商城的618抢跑；具体品类看智能眼镜和智能健康硬件。\n高薪职位\n中国高薪岗位：\n\nAI科学家/AI负责人：人民币132796元/月；口径为脉脉2026春招报告中新经济行业高薪岗位TOP20平均月薪。\nAI infra/高性能计算工程师：人民币约60000至100000元/月；口径为招聘市场估算，脉脉报告显示高性能计算工程师供需比从0.99降至0.26。\n金融IT安全高级岗：人民币约108300元/月；口径为Morgan McKinley中国金融服务薪酬指南，上海Senior Executives - IT Security平均年薪130万元折算。\n\n国际高薪岗位：\n\n美国专科医生/医生类高薪岗位：美元约19933美元/月以上，折合人民币约143500元/月以上；口径为BLS多类医生岗位年薪不低于239200美元折算。\nNurse Anesthetist / 麻醉护士：美元约18601美元/月，折合人民币约133927元/月；口径为BLS麻醉护士年薪中位数223210美元折算。\nSoftware Architect / 软件架构师：美元约19083美元/月，折合人民币约137400元/月；口径为Glassdoor美国Software Architect总薪酬中位数229000美元折算。\n\n今天最关键的数字是：411.4亿元、224.9亿元、300亿美元、60亿美元、50亿美元、55.5亿美元、185美元、1000亿美元、4.5亿美元、132796元/月、4.6倍。资金正在流向地方债化债、东盟区域互联、AI芯片公开市场融资、OpenAI算力基础设施、早期AI应用投资、618内容电商和AI基础设施人才。\n"},{"title":"谁在花钱日报｜2026-05-14",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-14/",
"date":"2026-05-14",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-14/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-14/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-14/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-14/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-14/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-14/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-14/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“地方债项目资金、南亚预算支持、企业语音AI、AI营销和解、OpenAI重仓投资、小样经济与AI健康穿戴”。\n政府\n截至5月13日，2026年以来地方债券累计发行40357亿元，较2025年同期37520亿元增长8%。最新辽宁省政府专项债券七至九期总额33.82亿元，资金投向供排水、产业园区、沈阳地铁六号线一期和县域医共体等项目。地方财政资金仍在靠债券前置发力，城建、轨交、水务、县域医疗和债券项目管理会继续有项目需求。\n国际政府与开发资金\nADB同意向孟加拉提供10亿美元预算支持，用于缓冲能源价格上涨、通胀压力和外部冲击。孟加拉方面还提到，2025-26财年ADB承诺提供14亿美元。开发资金正在转向“预算支持+能源冲击缓冲”，能源进口、财政改革、外汇风险和银行改革相关岗位会更有机会。\n投资机构\n企业语音AI平台Vapi完成5000万美元Series B融资，累计融资7200万美元，投后估值约5亿美元。Peak XV领投，M12、Kleiner Perkins、Bessemer Venture Partners、YC等参投。Amazon Ring等客户已经使用Vapi处理企业语音场景，语音AI正在从演示走向真实客服和销售流程。\n企业\nApple同意支付2.5亿美元和解Siri AI功能延迟相关诉讼。部分符合条件的美国iPhone 15 Pro、iPhone 15 Pro Max和iPhone 16系列用户可能获得每台设备最高约95美元。AI发布会承诺开始形成真实现金成本，科技公司的产品交付、广告审核、法务合规和AI项目管理会变得更重要。\n富豪资本\nSoftBank 2026年1-3月季度净利润1.83万亿日元，约116亿美元，OpenAI持仓收益成为核心驱动。Vision Fund因OpenAI相关收益在当季计入3.1万亿日元收益。SoftBank称2026年将进一步向OpenAI投入300亿美元，累计投资将达646亿美元，以取得约13%股权。顶级资本仍在用集中押注争夺AI入口。\n平民消费\n618预热正在从单纯红包，转向“小样试用、直播讲解、正装转化”和AI健康穿戴。\n热门品类：\n\n小样经济：5月13日李佳琦直播间启动618“小样节”，157个品牌参与，上架271个小样产品，覆盖美妆、食品、生活日用和宠物四大品类。\n中小样与试用前置：“所有女生的快乐市集”已落地6场线下活动，覆盖4座城市，近200个品牌参与，累计派发超200万份小样，吸引超11.5万人次参与。\nAI健康穿戴：Google发布99.99美元Fitbit Air无屏健身追踪器，并将Fitbit app升级为Google Health，主打Gemini驱动的AI健康教练。\n高端/大众美妆小样专区：赫莲娜、雅诗兰黛、兰蔻、祖玛珑等品牌已在天猫等平台设立中小样专区。\n\n昨日较火消费品牌：\n中国平台：李佳琦直播间、天猫、赫莲娜、雅诗兰黛、兰蔻\n国外：Google Fitbit、WHOOP、Garmin\n正在热卖的单品/服务：\n中国平台\n\n李佳琦直播间：618小样节、百万支小样、试用前置场景\n天猫：中小样专区、618预热、520告白季承接\n赫莲娜/雅诗兰黛/兰蔻/祖玛珑：官方中小样专区和礼赠组合\n\n国外\n\nGoogle Fitbit：Fitbit Air，99.99美元无屏健身追踪器\nWHOOP：订阅制无屏健康手环，成为Fitbit Air直接对标对象\nGarmin：运动健康穿戴设备，受Google Health跨平台数据整合影响\n\n为什么火：小样降低试错成本，适合618前做“先试后买”；AI健康穿戴则把硬件、订阅和健康数据服务绑在一起，适合长期复购。\n火到什么程度：小样节开播10分钟在线人数达到平日峰值；单场活动有157个品牌、271个小样产品；Fitbit Air以99.99美元直接切入无屏健康追踪器价格带。\n最火品牌：中国平台看李佳琦直播间和天猫小样专区；国际硬件看Google Fitbit Air。\n高薪职位\n中国高薪岗位：\n\nAI科学家 / AI负责人：人民币132796元/月；薪资口径：脉脉2026春招职场洞察报告中新经济高薪岗位TOP20平均月薪。\n金融IT安全高级岗：人民币约108300元/月；薪资口径：Morgan McKinley中国金融服务薪酬指南，上海Senior Executives - IT Security平均年薪130万元折算。\n云计算架构师：人民币约41600元/月；薪资口径：51job《人力资源白皮书》，一线城市年薪接近50万元折算。\n\n国际高薪岗位：\n\n美国专科医生 / 医生类高薪岗位：美元约19933美元/月以上，折合人民币约143500元/月以上；薪资口径：BLS多类医生岗位年薪不低于239200美元折算。\nNurse Anesthetist / 麻醉护士：美元约18601美元/月，折合人民币约133927元/月；薪资口径：BLS麻醉护士年薪中位数223210美元折算。\nSoftware Architect / 软件架构师：美元约19083美元/月，折合人民币约137400元/月；薪资口径：Glassdoor美国Software Architect总薪酬中位数229000美元折算。\n\n薪资口径：国际岗位人民币折算按1美元约等于7.2元人民币估算；实际收入会受地区、经验、税费、奖金、期权和执照要求影响。\n今天最关键的数字是：40357亿元、33.82亿元、10亿美元、5000万美元、5亿美元、2.5亿美元、95美元、116亿美元、300亿美元、646亿美元、157个品牌、271个小样产品、99.99美元。资金正在流向地方债项目、南亚预算支持、语音AI、AI功能诉讼和解、OpenAI股权、直播小样经济和AI健康穿戴。个人端更值得看的方向，是地方债项目管理、能源与外汇风险、语音AI交付、AI产品合规、OpenAI生态集成、小样电商运营、健康穿戴内容和AI健康教练服务。\n"},{"title":"谁在花钱日报｜2026-05-13",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-13/",
"date":"2026-05-13",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-13/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-13/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-13/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-13/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-13/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-13/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-13/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“学前教育财政资金、关键矿产储备、空间AI数据中心融资、AI数据中心债务融资、激进收购提案、618/520消费启动和游戏/美妆/潮玩热品”。\n政府\n财政部下达2026年支持学前教育发展资金458亿元，比上年增加125.6亿元，增长38%。这笔钱重点支持免保育教育费政策、补足普惠性资源短板、提高保教质量和家庭经济困难儿童资助。“十四五”时期，中央财政累计安排学前教育发展资金1262亿元，免保育教育费政策惠及超过1400万在园儿童，减轻家庭教育支出超过200亿元。\n国际政府与开发资金\n美国进出口银行EXIM把Project Vault评为年度交易，项目包含最高100亿美元直接贷款，用于建立美国战略关键矿产储备。政策性金融正在把关键矿产当成安全资产，资金会继续流向采矿、冶炼、材料、供应链金融、仓储和合规。\n投资机构\nCowboy Space完成2.75亿美元Series B融资，投后估值20亿美元。Index Ventures领投，IVP、Blossom Capital、SAIC、Breakthrough Energy Ventures、Construct Capital、Andreessen Horowitz和NEA等参投。资本正在押注“轨道数据中心+火箭+空间AI算力”的一体化基础设施。\n企业\nMeta正为El Paso AI数据中心寻求约130亿美元融资包，融资预计以债务为主、股权为辅。Meta此前已把该项目投资提高到100亿美元，目标容量约1GW。AI数据中心建设正在从科技公司自有资本开支，进入银行、债务和股权共同参与的项目融资阶段。\n富豪资本\nGameStop对eBay提出560亿美元半现金半股票收购要约后遭拒。eBay认为该方案“不可信、也不具吸引力”。GameStop CEO Ryan Cohen仍可能直接向eBay股东推进要约，相关方案还涉及约200亿美元潜在债务融资。这个交易尚未落地，但说明传统电商和二手交易平台仍会被激进资本盯上。\n平民消费\n618红包启动，520礼赠接档，消费注意力正在从单一节日转向一个月左右的连续促销周期。\n热门品类：\n\n年中大促红包与消费券：京东618京享红包最高26618元，天猫618超级红包最高26888元，5月12日晚8点启动领取。\n520/618礼赠与大件消费：天猫5月13日至20日推进520告白季，5月21日启动618预售，消费券、店铺限时红包和官方立减继续加码。\n游戏硬件：Nintendo Switch 2截至2026年3月31日全球销量达1986万台，FY2026第四季度售出249万台。\n平价社交美妆：SHEGLAM在澳洲Kmart上架197个产品，品牌称2024年全球销量超过1亿件，#SHEGLAM话题浏览量超过200亿。\n潮玩盲盒：泡泡玛特2025年收入371.2亿元，同比增长185%，Labubu继续推动海外扩张。\n\n昨日较火消费品牌：\n中国平台：京东、天猫/淘宝、泡泡玛特\n国外：Nintendo、SHEGLAM、Apple\n正在热卖的单品/服务：\n中国平台\n\n京东：618京享红包、家电数码会场、手机/家电大件预约\n天猫/淘宝：618超级红包、520告白季、美妆服饰和数码家电消费券\n泡泡玛特：Labubu盲盒、挂件和海外热销IP周边\n\n国外\n\nNintendo：Switch 2、Mario Kart World\nSHEGLAM：Colour Bloom Liquid Blush、peel-off lip stain、lip tint\nApple：iPhone 17\n\n为什么火：618红包和520礼赠把消费注意力提前锁住，数码家电、美妆礼物、游戏主机和潮玩都适合提前加购、等券下单。\n火到什么程度：平台红包最高到26618元/26888元；Switch 2全球销量1986万台；SHEGLAM 2024年全球销量超过1亿件；泡泡玛特2025年收入371.2亿元、同比增长185%。\n最火品牌：中国平台看京东和天猫在618入口争夺最强；具体消费品牌看泡泡玛特Labubu、Nintendo Switch 2和SHEGLAM社交美妆。\n高薪职位\n中国高薪岗位：\n\nAI复合型人才 / AI工程师：人民币60738元/月；薪资口径：脉脉数据中AI岗位平均月薪。\n金融IT安全高级岗：人民币约108300元/月；薪资口径：Morgan McKinley中国金融服务薪酬指南，上海Senior Executives - IT Security平均年薪130万元折算。\n云计算架构师：人民币约41600元/月；薪资口径：51job《人力资源白皮书》，一线城市年薪接近50万元折算。\n\n国际高薪岗位：\n\n美国专科医生 / 医生类高薪岗位：美元约19933美元/月以上，折合人民币约143500元/月以上；薪资口径：BLS多类医生岗位年薪不低于239200美元折算。\nNurse Anesthetist / 麻醉护士：美元约18601美元/月，折合人民币约133927元/月；薪资口径：BLS麻醉护士年薪中位数223210美元折算。\nSoftware Architect / 软件架构师：美元约19083美元/月，折合人民币约137400元/月；薪资口径：Glassdoor美国Software Architect总薪酬中位数229000美元折算。\n\n薪资口径：国际岗位人民币折算按1美元约等于7.2元人民币估算；实际收入会受地区、经验、税费、奖金、期权和执照要求影响。\n今天最关键的数字是：458亿元、125.6亿元、1262亿元、100亿美元、2.75亿美元、20亿美元、130亿美元、560亿美元、26618元、26888元、1986万台、371.2亿元。资金正在流向普惠教育、关键矿产安全、轨道AI算力、AI数据中心融资、平台并购提案和年中大促。个人端更值得看的方向，是学前教育服务、关键矿产供应链、商业航天、数据中心项目融资、并购法务、618选品运营、游戏硬件配件、美妆短视频和潮玩二级市场。\n"},{"title":"谁在花钱日报｜2026-05-12",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-12/",
"date":"2026-05-12",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-12/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-12/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-12/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-12/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-12/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-12/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-12/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“企业出海投资、开发性融资、加密金融基础设施、AI光纤制造、创作者平台股权交易、春夏美妆和社交电商爆品”。\n政府\n商务部、国家外汇局统计显示，一季度中国全行业对外直接投资3094.5亿元，同比增长5.4%。其中，非金融类直接投资2328.6亿元；对共建“一带一路”国家非金融类直接投资612.7亿元；对外承包工程新签合同额3853亿元。\n国际政府与开发资金\n世界银行批准10亿美元融资支持埃及私营部门就业、宏观稳定和绿色转型，其中包括英国提供的2亿美元信用担保。开发资金正在从单一基建项目，转向“就业、财政、绿色转型、社会保障”打包支持。\n投资机构\na16z crypto完成22亿美元第五期基金募集，累计募集资金达到98亿美元。资金重点投向稳定币、代币化资产、永续合约、预测市场、链上金融基础设施，以及AI agents与加密交叉应用。\n企业\nNvidia与Corning达成AI数据中心光连接制造合作。Corning将把美国光连接制造能力扩大10倍，光纤产能提升50%以上，并建设3座新工厂；Nvidia据监管文件买入5亿美元Corning股票相关权利。AI基础设施的钱正在从GPU外溢到光纤、光连接、数据中心布线和制造工厂。\n富豪资本\nOnlyFans以31.5亿美元估值出售16%股权，Architect Capital出资5.35亿美元。交易发生在原控股股东Leonid Radvinsky去世后，家族信托仍保留多数控制权。创作者经济平台正在被金融基础设施资本重新定价。\n平民消费\n春夏消费正在集中到防晒底妆、社交电商护肤、清洁小家电和病毒式包袋。\n热门品类：\n\n防晒与底妆：2026年4月抖音美妆榜中，蜜丝婷凭防晒+底妆组合登顶；“第七代小黄帽防晒霜”和“夜光气垫”GMV区间均在7500万至1亿元。\n社交电商护肤：TikTok Shop 4月榜单中，medicube PDRN Pink Collagen Volume Multi Balancing Serum Set以465万美元收入排名第一，卖出254270件。\n清洁小家电：Shark两款清洁产品在TikTok Shop 4月榜单中合计约796万美元。\n病毒式包袋：3.99美元Trader Joe's托特包和8500美元Chanel Maxi Flap同时进入热门包袋讨论，平价符号和奢侈品在两端同时吸引注意力。\n\n昨日较火消费品牌：\n中国平台：蜜丝婷、蒂洛薇、韩束\n国外：medicube、Shark、Trader Joe's、Chanel\n正在热卖的单品/服务：\n中国平台\n\n蜜丝婷：第七代小黄帽防晒霜、夜光气垫、小粉帽防晒\n蒂洛薇：云雾水散粉、红毯滤镜持妆气垫\n韩束：护肤套装和抖音护肤头部单品\n\n国外\n\nmedicube：PDRN Pink Collagen Volume Multi Balancing Serum Set\nShark：PowerPro Flex Reveal Plus无线吸尘器、StainForce手持污渍清洁机\nTrader Joe's：3.99美元托特包\nChanel：Maxi Flap Bag\n\n为什么火：天气转热、出游增加，防晒、底妆、便携清洁和可晒社交平台的小物更容易转化。\n火到什么程度：蜜丝婷两款核心单品单月GMV区间均达7500万至1亿元；TikTok Shop第一名单品单月收入465万美元；Shark两款清洁产品合计接近800万美元。\n最火品牌：中国平台看蜜丝婷；国际社交电商看medicube和Shark；病毒式包袋看Trader Joe's。\n高薪职位\n中国高薪岗位：\n\nAI科学家 / AI负责人：人民币137153元/月；薪资口径：脉脉2026年1-2月中高端岗位平均月薪。\n金融IT安全高级岗：人民币约108300元/月；薪资口径：Morgan McKinley中国金融服务薪酬指南，上海Senior Executives - IT Security平均年薪130万元折算。\n智能驾驶 / 机器人算法与系统工程师：人民币约70000元/月；薪资口径：脉脉“隐形大厂”榜中Momenta、宇树科技等新发岗位平均月薪近7万元。\n\n国际高薪岗位：\n\n美国专科医生 / 医生类高薪岗位：美元约19933美元/月以上，折合人民币约143500元/月以上；薪资口径：BLS多类医生岗位年薪不低于239200美元折算。\nAirline Pilot / 航空飞行员：美元约18883美元/月，折合人民币约135960元/月；薪资口径：BLS航空飞行员年薪中位数226600美元折算。\nSoftware Architect / 软件架构师：美元约19083美元/月，折合人民币约137400元/月；薪资口径：Glassdoor美国Software Architect总薪酬中位数229000美元折算。\n\n薪资口径：国际岗位人民币折算按1美元约等于7.2元人民币估算；实际收入会受地区、经验、税费、奖金、期权和执照要求影响。\n今天最关键的数字是：3094.5亿元、2328.6亿元、3853亿元、10亿美元、22亿美元、5亿美元、5.35亿美元、31.5亿美元、7500万至1亿元、465万美元、796万美元。资金正在流向企业出海、埃及改革融资、加密金融基础设施、AI光纤制造、创作者经济股权交易和春夏社交电商爆品。个人端更值得看的方向，是出海项目运营、绿色金融、链上金融合规、AI数据中心供应链、光通信制造、创作者支付工具、防晒底妆运营和短视频电商选品。\n"},{"title":"谁在花钱日报｜2026-05-09",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-09/",
"date":"2026-05-09",
"headings":[{"level":2,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-09/#zheng-fu","title":"政府","children":[]},{"level":2,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-09/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":2,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-09/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":2,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-09/#qi-ye","title":"企业","children":[]},{"level":2,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-09/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":2,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-09/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":2,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-09/#gao-xin-zhi-wei","title":"高薪职位","children":[]}],
"body":"今天，资金主要流向“外资流入、高等级开发融资、预测市场融资、AI芯片IPO、家族办公室直投和母亲节消费”。\n政府\n商务部披露，2026年1-3月全国实际使用外资2496亿元。其中，高技术产业实际使用外资1027.3亿元，同比增长30.7%。外资总量承压，但高技术制造、研发设计、电子通信和计算机办公设备制造仍在吸引资金。\n国际政府与开发资金\nADB推出700亿美元亚洲及太平洋地区能源与数字连接投资路线图，目标到2035年支持区域连接投资。其中，泛亚洲电网计划拟动员500亿美元。跨境电网、数字基础设施和区域能源互联仍是开发资金重点。\n投资机构\n预测市场平台Kalshi完成10亿美元Series F融资，投后估值220亿美元。Coatue领投，Sequoia Capital、Andreessen Horowitz、IVP、Paradigm、Morgan Stanley和ARK Invest等参投。机构资金正在进入事件合约、预测市场和新型风险管理工具。\n企业\nCerebras拟IPO募资最高35亿美元，计划发行2800万股，价格区间115-125美元，高端估值约266亿美元。AI芯片公司正在进入公开市场定价阶段，推理算力和半导体资本市场热度继续上升。\n富豪资本\n全球家族办公室已累计部署3.83万亿美元直接投资，覆盖21702笔交易。其中，信息技术、工业和医疗三大行业合计占55%，金额约1.67万亿美元。富豪资本越来越偏向直接参与产业项目，而不是只购买基金份额。\n平民消费\n母亲节消费正在从鲜花扩展到珠宝、美妆、科技礼物和体验类服务。NRF预计美国母亲节消费将达到380亿美元，超过2025年的341亿美元，创下新高。\n热门品类：\n\n母亲节礼物：预计美国消费380亿美元\n珠宝与个性化礼物：Pandora主推Mom charms、刻字首饰和培育钻石礼物\n科技与小家电：Dyson Airwrap、Apple Watch/AirPods、Kindle、数字相框等继续上榜\n国内服饰美妆礼赠：京东服饰美妆母亲节专场覆盖美妆护肤、黄金珠宝、箱包表配和鲜花礼赠\n\n昨日较火消费品牌：\n国内：京东服饰美妆、周大福、花西子\n国外：Pandora、Dyson、Apple\n正在热卖的单品/服务：\n国内\n\n京东服饰美妆：母亲节礼盒、美妆护肤、黄金珠宝专场\n周大福：黄金首饰、母亲节珠宝礼赠\n花西子：国货美妆礼盒\n\n国外\n\nPandora：Mom charms、可刻字首饰、培育钻石礼物\nDyson：Airwrap / Airwrap i.d. Multi-Styler\nApple：Apple Watch、AirPods、iPhone相关配件\n\n为什么火：母亲节礼物从“节日鲜花”扩展到“长期可用、可表达心意、可个性化”的珠宝、美妆、健康科技和家电。\n火到什么程度：NRF预计美国母亲节消费达到380亿美元；京东和Amazon等平台都在母亲节前集中上新礼物会场和限时折扣。\n最火品牌：按平台活动和礼品场景适配度看，Pandora是母亲节珠宝礼物中最突出品牌；按高客单科技礼物看，Dyson和Apple仍然强势。\n高薪职位\n中国高薪岗位：\n\nAI科学家 / AI负责人：人民币137153元/月；参考口径：脉脉2026年1-2月中高端岗位报告，新浪财经转引。\n金融IT安全高级岗：人民币约108300元/月；参考口径：Morgan McKinley 2026 China Salary Guide，上海Senior Executives - IT Security平均年薪130万元折算。\n云计算架构师：人民币约41600元/月；参考口径：51job《人力资源白皮书》，一线城市年薪接近50万元折算。\n\n国际高薪岗位：\n\nDoctor / 医生：美元约22167美元/月，折合人民币约159600元/月；参考口径：Glassdoor年薪中位数266000美元折算。\nDentist / 牙医：美元约21250美元/月，折合人民币约153000元/月；参考口径：Glassdoor年薪中位数255000美元折算。\nAirline Pilot / 航空飞行员：美元约18883美元/月，折合人民币约135960元/月；参考口径：BLS航空飞行员年薪中位数226600美元折算。\n\n薪资口径：国际岗位人民币折算按1美元约等于7.2元人民币估算；实际收入会受地区、经验、税费、奖金和执照要求影响。\n今天最关键的数字是：2496亿元、1027.3亿元、700亿美元、500亿美元、10亿美元、220亿美元、35亿美元、3.83万亿美元、380亿美元。资金正在向高技术外资、区域电网和数字基础设施、事件交易、AI芯片IPO、家族办公室直投和母亲节礼物消费集中。个人端更值得看的方向，是高技术制造、跨境基础设施、金融数据产品、AI芯片销售与交付、财富管理和节日礼品运营岗位。\n"},{"title":"谁在花钱日报｜2026-05-08",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-08/",
"date":"2026-05-08",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-08/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-08/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-08/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-08/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-08/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-08/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-08/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-08/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主要流向“设备更新、开发债券融资、数据中心REIT、Nvidia生态合作、地热能源IPO和文旅消费”。\n政府\n国家发展改革委下达2026年第二批915亿元超长期特别国债支持设备更新资金，覆盖工业、能源电力、电子信息、交通运输、物流、教育、文旅、医疗、老旧电梯、安全生产、检验检测、节能降碳等16个领域超过6700个项目，带动总投资超过3800亿元。今年“两新”设备更新资金已累计安排1851亿元，占全年2000亿元的92%。\n国际政府与开发资金\nWorld Bank发行NZD 13亿7年期Kauri债券，为同期限最大规模交易。开发资金不只来自政府拨款，也来自高评级债券融资；这些钱最终会进入可持续发展项目、基础设施和发展中国家融资体系。\n投资机构\nBlackstone Digital Infrastructure Trust拟在美国IPO募资略超17亿美元，用于收购新建数据中心。数据中心资产正在从私募基金和项目融资，进一步进入公开市场和REIT化路径。\n企业\nIren与Nvidia推进5GW AI工厂基础设施合作，Nvidia获得五年期购股期权，最高可买入价值21亿美元的Iren股份。AI算力合作正在从“买GPU”升级为“锁能源容量、锁园区、锁股权”。\n富豪资本\nBill Gates等支持的地热能源公司Fervo Energy启动IPO，拟募资最高13亿美元，估值最高约65亿美元。AI数据中心电力需求正在把富豪资本推向地热、核电、储能和长期电力采购。\n平民消费\n五一国内出游3.25亿人次，同比增长3.6%；国内出游总花费1854.92亿元，同比增长2.9%。夜间文旅消费、演出经济和文创消费成为更具体的花钱方向。\n热门品类：\n\n国内旅游：3.25亿人次，总花费1854.92亿元\n夜间文旅消费：国家级夜间文旅消费集聚区客流8041.37万人次，同比增长6.44%\n演出经济：营业性演出3.20万场，票房24.76亿元，同比增长14.66%\n惠民活动：约1.37万场文旅消费活动，发放超2.84亿元消费券\n\n昨日较火消费品牌：\n国内：故宫文创、长隆、携程\n国外：Disney、Apple、Nike\n正在热卖的单品/服务：\n国内\n\n故宫文创：文创纪念品与展览门票\n长隆：主题乐园门票与亲子游套票\n携程：酒店、机票和跨省游产品\n\n国外\n\nDisney：上海迪士尼门票和度假区消费\nApple：旅行场景中的iPhone与Apple Watch\nNike：旅行穿搭与轻便运动鞋\n\n为什么火：五一消费从单纯出行转向“文旅+夜游+演出+文创”，体验消费比单一购物更强。\n火到什么程度：全国国内出游3.25亿人次、花费1854.92亿元；夜间文旅消费集聚区客流超8000万人次；演出票房同比增长14.66%。\n最火品牌：按官方点名热度看，上海迪士尼、北京故宫、广州长隆都在头部；如果必须选一个兼具品牌化和消费能力的，上海迪士尼最突出。\n高薪职位\n中国高薪岗位：\n\nAI科学家 / AI负责人：人民币137153元/月；参考来源：脉脉2026年1-2月中高端岗位报告，新浪财经转引。\n金融IT安全高级岗：人民币约108300元/月；参考来源：Morgan McKinley 2026 China Salary Guide，上海Senior Executives - IT Security平均年薪130万元折算。\n云计算架构师：人民币约41600元/月；参考来源：51job《人力资源白皮书》，一线城市年薪接近50万元折算。\n\n国际高薪岗位：\n\nDoctor / 医生：美元约22167美元/月，折合人民币约159600元/月；参考来源：Glassdoor年薪中位数266000美元。\nDentist / 牙医：美元约21250美元/月，折合人民币约153000元/月；参考来源：Glassdoor年薪中位数255000美元。\nAirline Pilot / 航空飞行员：美元约18883美元/月，折合人民币约135960元/月；参考来源：BLS航空飞行员年薪中位数226600美元。\n\n薪资口径：国际岗位人民币折算按1美元≈7.2元人民币估算；实际收入会受地区、经验、税费、奖金和执照要求影响。\n今天最关键的数字是：915亿元、3800亿元、1851亿元、NZD 13亿、17亿美元、21亿美元、13亿美元、1854.92亿元。资金正在向设备更新、开发债券、数据中心金融产品、AI电力合作、地热能源和体验型文旅消费集中。个人端更值得看的方向，是设备改造、数据中心资产管理、电力项目、文旅运营、云架构和金融安全岗位。\n今日结论\n今天的信号是，AI基础设施正在金融化和电力化，政府资金继续推动设备更新；消费端则从假期总人次，进一步落到夜游、演出、主题乐园和文创这些更能变现的场景。\n"},{"title":"谁在花钱日报｜2026-05-07",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-07/",
"date":"2026-05-07",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-07/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-07/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-07/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-07/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-07/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-07/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-07/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-07/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主要流向“美国财政再融资、非洲医疗开发资金、企业AI编码、AI数据中心租约、马斯克芯片工厂计划和五一支付消费”。\n政府\n美国财政部宣布发行1250亿美元国债，其中约833亿美元用于再融资5月15日到期的私人持有国债，并新增约417亿美元现金。本次发行包括580亿美元3年期国债、420亿美元10年期国债和250亿美元30年期国债。\n国际政府与开发资金\nWorld Bank批准2.25亿美元支持科特迪瓦医疗、营养和早期儿童发展服务。其中2亿美元为IDA信贷，2500万美元为Global Financing Facility赠款。医疗、营养、数字健康和基层公共服务仍是开发资金重点。\n投资机构\n自主软件开发平台Blitzy完成2亿美元融资，投后估值14亿美元，Northzone领投，PSG、Battery Ventures、Liberty Mutual Strategic Ventures等参投。资本正在押注“AI替代软件开发流程”的企业级工具。\n企业\nHut 8签署15年、价值98亿美元的AI数据中心租约，首期覆盖得州Beacon Point园区352MW IT容量。如果续约选项全部执行，合同价值最高可达251亿美元。算力基础设施正在从建设期进入长期合同锁定阶段。\n富豪资本\nSpaceX提交Terafab芯片工厂计划，初始投资550亿美元；如果后续阶段全部完成，总投资最高可达1190亿美元。该项目由SpaceX与Tesla相关体系推进，目标是把AI、自动驾驶、机器人和航天芯片供应链垂直整合起来。\n平民消费\n五一支付数据继续显示消费活跃。银联、网联共处理支付交易289.37亿笔，金额7.85万亿元，同比分别增长23.45%和2.74%。境外来华人员支付交易笔数和金额同比分别增长45.15%和36.96%。\n热门品类：\n\n跨境/入境支付：境外来华人员支付交易金额同比增长36.96%\n文旅体验：旅游游览和娱乐服务销售收入同比增长21.2%\n餐饮住宿与线下零售：餐饮销售收入同比增长31.4%\n悦己消费：化妆品、金银珠宝、工艺美术品销售收入分别增长55.8%、28.8%、57.4%\n\n昨日较火消费品牌：\n国内：支付宝、微信支付、携程\n国外：Apple、Nike、EltaMD\n正在热卖的单品/服务：\n国内\n\n支付宝：入境游客移动支付与商圈消费\n微信支付：外卡内绑、景区和演出赛事支付\n携程：跨省游、酒店与机票产品\n\n国外\n\nApple：iPhone与Apple Watch\nNike：旅行穿搭与轻便跑鞋\nEltaMD：UV Clear防晒\n\n为什么火：五一后数据确认，“体验消费+支付便利+入境游恢复”一起拉动消费，钱大量流向票务、餐饮、住宿、跨境支付和悦己商品。\n火到什么程度：支付交易金额达到7.85万亿元，交易笔数同比增长23.45%；入境游客使用支付宝在华消费金额同比增长近70%，微信支付外卡内绑交易笔数同比增长58%。\n最火品牌：按增速和场景覆盖看，支付宝在入境消费中表现最强；按商品单品看，Apple和EltaMD继续分别占据数码换新和防晒场景。\n高薪职位\n中国高薪岗位：\n\nAI科学家 / AI负责人：人民币137153元/月；参考来源：脉脉2026年1-2月中高端岗位报告，新浪财经转引。\n金融IT安全高级岗：人民币约108300元/月；参考来源：Morgan McKinley 2026 China Salary Guide，上海Senior Executives - IT Security平均年薪130万元折算。\n云计算架构师：人民币约41600元/月；参考来源：51job《人力资源白皮书》，一线城市年薪接近50万元折算。\n\n国际高薪岗位：\n\nDoctor / 医生：美元约22167美元/月，折合人民币约159600元/月；参考来源：Glassdoor年薪中位数266000美元。\nDentist / 牙医：美元约21250美元/月，折合人民币约153000元/月；参考来源：Glassdoor年薪中位数255000美元。\nAirline Pilot / 航空飞行员：美元约18883美元/月，折合人民币约135960元/月；参考来源：BLS航空飞行员年薪中位数226600美元。\n\n薪资口径：国际岗位人民币折算按1美元≈7.2元人民币估算；实际收入会受地区、经验、税费、奖金和执照要求影响。\n今天最关键的数字是：1250亿美元、2.25亿美元、2亿美元、98亿美元、251亿美元、550亿美元、1190亿美元、7.85万亿元。资金正在向政府融资、医疗公共服务、AI软件开发、算力基础设施、半导体制造和体验消费集中。个人端更值得看的方向，是AI编码工具落地、数据中心工程、半导体厂务、金融安全、跨境支付和文旅服务岗位。\n今日结论\n今天的资金线索说明两件事：AI的钱正在继续下沉到开发工具、机房和芯片工厂；消费端的钱则从“旅游人次”进一步落到支付、入境消费和体验服务。\n"},{"title":"谁在花钱日报｜2026-05-06",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-05-06/",
"date":"2026-05-06",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-06/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-06/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-06/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-06/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-06/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-06/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-06/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-05-06/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主要流向“五一消费、清洁能源开发融资、企业AI代理、数据中心电力投资和SpaceX二级市场交易”。\n政府\n商务部披露，截至5月4日，消费品以旧换新已惠及8620.4万人次，带动销售额6292.7亿元。其中，汽车以旧换新213.2万辆，带动新车销售额3423.9亿元；家电以旧换新3473.5万台，带动销售额1415.4亿元；数码和智能产品购新4933.7万件，带动销售额1453.4亿元。\n国际政府与开发资金\nWorld Bank与不丹政府签署5.15亿美元水电融资协议，用于Dorjilung 1125MW水电项目。该项目总投资约17亿美元，并预计撬动额外9亿美元私营部门融资。清洁能源、跨境电力和区域能源安全仍是开发资金重点。\n投资机构\n企业AI代理公司Sierra完成9.5亿美元融资，投后估值超过150亿美元，Tiger Global和GV领投，Benchmark、Sequoia、Greenoaks等参投。资本正在从通用大模型转向能直接替代企业工作流的AI代理。\n企业\nAmerican Electric Power将五年资本投资计划提高至780亿美元，较三个月前计划提高8%，并已签署7GW新项目协议。AI数据中心用电需求正在外溢到电网、输电和发电系统。\n富豪资本\nBlue Owl Capital披露，已按1.25万亿美元估值出售约一半SpaceX持仓，并称该投资约赚10倍。SpaceX潜在IPO估值被市场讨论至1.75万亿美元，募资规模约750亿美元。富豪资本和另类资产机构正在通过二级市场提前兑现超级独角兽收益。\n平民消费\n五一消费的钱主要流向出行、汽车换新、数码智能和住宿演出。\n热门品类：\n\n汽车换新：带动新车销售额3423.9亿元\n数码和智能产品购新：带动销售额1453.4亿元\n家电以旧换新：带动销售额1415.4亿元\n酒店住宿、租车、演出：酒店住宿同比增长18%，租车订单增长21%，演出消费增长17.6%\n\n昨日较火消费品牌：\n国内：比亚迪、华为、小米\n国外：Apple、EltaMD、Nike\n正在热卖的单品：\n国内\n\n比亚迪：20万元以上新能源车型\n华为：Pura/Mate系列手机与智能穿戴\n小米：手机、智能家电和空调换新产品\n\n国外\n\nApple：iPhone与Apple Watch\nEltaMD：UV Clear防晒\nNike：轻便跑鞋与旅行穿搭单品\n\n为什么火：五一释放的是“远途出行+补贴换新+夏季刚需”组合需求，汽车、数码、住宿、租车和防晒同时受益。\n火到什么程度：以旧换新销售额升至6292.7亿元，汽车单项带动3423.9亿元；跨城租车订单同比增长67.6%。\n最火品牌：按金额体量看，汽车换新最强，国内最有代表性的热品牌是比亚迪；按单品搜索和夏季场景看，EltaMD防晒继续具备高热度。\n高薪职位\n中国高薪岗位：\n\nAI科学家 / AI负责人：人民币137153元/月；参考来源：脉脉2026年1-2月中高端岗位报告，新浪财经转引。\n云计算架构师：人民币约41600元/月；参考来源：51job《人力资源白皮书》，一线城市年薪接近50万元折算。\n金融IT安全高级岗：人民币约108300元/月；参考来源：Morgan McKinley 2026 China Salary Guide，上海Senior Executives - IT Security平均年薪130万元折算。\n\n国际高薪岗位：\n\nDoctor / 医生：美元约22167美元/月，折合人民币约159600元/月；参考来源：Glassdoor年薪中位数266000美元。\nDentist / 牙医：美元约21250美元/月，折合人民币约153000元/月；参考来源：Glassdoor年薪中位数255000美元。\nAirline Pilot / 航空飞行员：美元约18883美元/月，折合人民币约135960元/月；参考来源：BLS航空飞行员年薪中位数226600美元。\n\n薪资口径：国际岗位人民币折算按1美元≈7.2元人民币估算；实际收入会受地区、经验、税费、奖金和执照要求影响。\n今天最关键的数字是：6292.7亿元、3423.9亿元、1453.4亿元、1415.4亿元、5.15亿美元、17亿美元、9.5亿美元、780亿美元、1.25万亿美元。资金仍在向政策补贴消费、清洁能源基础设施、企业AI代理、电力系统和超级独角兽二级市场集中。个人端更值得看的方向，是汽车与数码换新链条、数据中心电力工程、企业AI交付、云架构和金融安全岗位。\n今日结论\n5月第一期的主线很清楚：节后消费验证了补贴的拉动效果，国际开发资金继续买清洁能源，AI的钱从模型和云厂商外溢到企业代理、电网和SpaceX这样的超级资产。\n"},{"title":"谁在花钱日报｜2026-04-30",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-30/",
"date":"2026-04-30",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-30/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-30/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-30/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-30/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-30/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-30/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-30/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-30/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主要流向“超长期国债、开发贷款、金融AI、云计算资本开支、家族办公室直投和五一消费单品”。\n政府\n财政部已启动2026年超长期特别国债发行，首批发行1190亿元，全年拟发行1.3万亿元。资金继续服务“两重”“两新”等重点方向，包括国家重大战略、重点领域安全能力建设、设备更新和消费品以旧换新。\n国际政府与开发资金\n孟加拉批准19亿美元开发贷款，其中13亿美元将用于预算支持。资金来源包括ADB、JICA、AIIB和OPEC Fund等开发资金体系。新兴市场公共财政压力仍在，预算支持和基础设施贷款会继续活跃。\n投资机构\n金融AI平台Rogo完成1.6亿美元D轮融资，投资方包括Kleiner Perkins、Sequoia Capital、Thrive、Khosla Ventures和J.P. Morgan Growth Equity等。Rogo累计融资超过3亿美元，金融工作流AI正在成为资本重点押注方向。\n企业\nMicrosoft把2026年资本开支计划提高到1900亿美元，最近一个季度资本开支319亿美元，高于上年同期214亿美元。AI数据中心投入继续扩大，云计算、电力、冷却、网络和企业AI交付都会被带动。\n富豪资本\n全球家族办公室2025年直接投资达到129亿美元，同比增长123.3%。富豪资本越来越绕开基金中介，直接进入私募股权、科技、医疗、地产和金融服务项目。\n平民消费\n五一前消费热度集中在防晒、美妆、旅行服饰和数码换新。Amazon夏季美妆活动从4月27日持续到5月10日，覆盖数千个美妆折扣；国内消费品以旧换新已带动销售额超5400亿元。\n昨日较火消费品牌：\n国内：华为、小米、比亚迪\n国外：EltaMD、Biodance、Michael Kors\n正在热卖的单品：\n国内\n\n华为：Pura/Mate系列手机\n小米：手机与智能家电换新产品\n比亚迪：20万元以上新能源车型\n\n国外\n\nEltaMD：UV Clear防晒\nBiodance：Hydro Cera-nol/胶原面膜\nMichael Kors：Bryant Crossbody Bag与夏季鞋包\n\n为什么火：五一出行、母亲节礼物和夏季防晒同时启动，防晒、美妆、轻服饰和旅行用品都处在季节性需求拐点。\n火到什么程度：Amazon官方活动覆盖数千个美妆折扣；4月Amazon美国“sun care”关键词下，EltaMD UV Clear Tinted Face Sunscreen月订单超过8万单。\n最火品牌：今天可量化单品热度最强的是EltaMD，其防晒单品在“sun care”榜单中位居第一；综合高客单数码换新看，Apple仍是强势品牌。\n高薪职位\n中国高薪岗位：\n\nAI科学家 / AI负责人：人民币137153元/月；参考来源：脉脉2026年1-2月中高端岗位报告，新浪财经转引。\n大模型算法 / 算法研究员 / AIGC算法工程师：人民币约70000元/月；参考来源：脉脉春招高薪岗位口径，新浪科技/新浪财经转引。\n芯片工程师：人民币约33300元/月以上；参考来源：51job《人力资源白皮书》，年薪超40万元折算。\n\n国际高薪岗位：\n\nDoctor / 医生：美元约22167美元/月，折合人民币约159600元/月；参考来源：Glassdoor年薪中位数266000美元。\nDentist / 牙医：美元约21250美元/月，折合人民币约153000元/月；参考来源：Glassdoor年薪中位数255000美元。\nSolution Architect / 解决方案架构师：美元约18667美元/月，折合人民币约134400元/月；参考来源：Glassdoor年薪中位数224000美元。\n\n薪资口径：国际岗位人民币折算按1美元≈7.2元人民币估算；实际收入会受地区、经验、税费、奖金和执照要求影响。\n今天最关键的数字是：1190亿元、1.3万亿元、19亿美元、13亿美元、1.6亿美元、1900亿美元、319亿美元、129亿美元、5400亿元。资金仍在流向长期财政工具、AI基础设施、垂直行业AI和季节性消费。个人端更值得看的方向，是政府项目交付、数据中心工程、金融AI应用、家族办公室直投支持岗位，以及防晒美妆和数码换新相关消费链条。\n今日结论\n4月最后一天，大钱的方向很清楚：财政工具继续托底，AI基础设施继续烧钱，富豪资本更偏直投，普通消费则进入防晒、美妆和出行换新的季节性窗口。\n"},{"title":"谁在花钱日报｜2026-04-29",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-29/",
"date":"2026-04-29",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-29/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-29/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-29/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-29/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-29/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-29/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-29/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-29/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主要流向“财政支出前置、城市治理、即时服务、AI数据中心和夏季消费单品”。\n政府\n财政部披露，一季度全国一般公共预算支出7.47万亿元，支出进度为近五年最快。新增专项债券发行约1.16万亿元，拨付专项债券资金6723亿元；消费品以旧换新资金已累计下达1250亿元。地方项目、民生服务、城市更新和消费补贴链条仍有稳定资金来源。\n国际政府与开发资金\n世界银行批准2.5亿美元，用于刚果（金）金沙萨垃圾治理和就业项目。该项目将改善固废治理、防洪和就业机会，世界银行对金沙萨相关支持总额已接近9亿美元。\n投资机构\n印度即时家政平台Snabbit完成5600万美元融资，投资方包括Susquehanna Venture Capital、Mirae Asset Venture Investments和Bertelsmann India Investments。Snabbit累计融资达到1.12亿美元，资本继续押注高频、本地、可标准化的上门服务。\n企业\nReliance Industries拟投资1.6万亿卢比（约170亿美元）在印度Visakhapatnam建设1.5GW数据中心集群，并配套太阳能和储能系统。AI基础设施正在从单纯云服务扩展为“电力、土地、水、网络、运维”的综合工程。\n富豪资本\nBill Ackman旗下Pershing Square美国新基金完成50亿美元募资，并计划在纽约上市交易。明星基金经理正在把资管产品做成更容易交易的公开市场资产，但封闭式基金折价和费用结构仍需要留意。\n平民消费\n消费热度集中在夏季美妆、防晒、数码换新和补货型日用品。财政部口径显示，消费品以旧换新已带动销售额超5400亿元，惠及近7500万人次；一季度限额以上通讯器材类商品零售额同比增长20.8%。\n昨日较火消费品牌：\n国内：华为、小米、比亚迪\n国外：Apple、EltaMD、Biodance\n正在热卖的单品：\n国内\n\n华为：Pura/Mate系列手机\n小米：手机与智能家电换新产品\n比亚迪：20万元以上新能源车型\n\n国外\n\nApple：iPhone与Apple Watch\nEltaMD：防晒产品\nBiodance：胶原面膜\n\n为什么火：五一与夏季前置消费叠加，防晒、美妆、手机和智能设备同时具备“马上能用、体验明显、促销敏感”的特点。\n火到什么程度：以旧换新已带动超5400亿元销售额；Amazon夏季美妆活动覆盖K-beauty、防晒、护肤工具等多条线，折扣延续到5月10日。\n最火品牌：按确定性数据看，Apple仍是数码换新中最强品牌；按夏季消费热度看，EltaMD和Biodance在防晒与面膜场景更突出。\n高薪职位\n今天更值得关注的5个高薪岗位（跨行业）是：\n\n医生：约15.96万元/月\n牙医：约15.3万元/月\n解决方案架构师：约13.44万元/月\n航空飞行员：约10.86万元/月\n产品经理：约9.0万元/月\n\n今天最关键的数字是：7.47万亿元、1.16万亿元、6723亿元、1250亿元、2.5亿美元、5600万美元、1.6万亿卢比、50亿美元、5400亿元。资金仍在向财政托底、城市治理、服务业效率化和AI基础设施集中；个人端更现实的机会，是围绕医疗执照、云架构、航空资质、产品商业化和本地服务运营建立能力。\n今日结论\n今天的大钱仍然在做三件事：政府侧继续前置支出，产业侧继续建算力和本地服务网络，居民侧则把钱花在马上能改善体验的夏季和数码单品上。\n"},{"title":"谁在花钱日报｜2026-04-28",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-28/",
"date":"2026-04-28",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-28/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-28/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-28/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-28/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-28/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-28/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-28/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-28/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主要流向“跨境投资与国际工程、AI数据中心融资、富豪并购交易、高频消费单品”。\n政府\n商务部公布，2026年1-3月我国全行业对外直接投资3094.5亿元人民币（约445.3亿美元），同比增长5.4%。出海投资继续保持增长。\n国际政府与开发资金\n一季度我国在共建“一带一路”国家新签承包工程合同额3485.1亿元人民币（约501.5亿美元），完成营业额2186.9亿元人民币（约314.7亿美元），同比增速分别为2.4%和10%。国际工程和基础设施合作资金流动持续。\n投资机构\n黑石（Blackstone）和PIMCO等机构参与支持的密歇根Oracle相关数据中心项目，披露融资规模160亿美元。机构资金继续押注AI基础设施。\n企业\nDataBank披露获得20亿美元建设融资，并计划再通过私募筹集6亿美元，用于Oracle相关数据中心集群建设。企业端正在提前锁定推理算力供给。\n富豪资本\nFertitta对凯撒娱乐的潜在收购谈判被披露延长，交易体量约180亿美元（含债务）。富豪资本仍在加码现金流型文旅娱乐资产。\n平民消费\n热度最高的消费单品集中在：旗舰手机、运动跑鞋、日用电池和清洁补货。\n昨日较火消费品牌：\n国内：华为、小米、安踏\n国外：Apple、Nike、Amazon Basics\n正在热卖的单品：\n国内\n\n华为：Pura/Mate系列手机\n小米：扫地机器人与智能空调\n安踏：跑鞋与训练鞋系列\n\n国外\n\nApple：iPhone与Apple Watch\nNike：Zoom/Pegasus跑鞋\nAmazon Basics：AA/AAA电池补货装\n\n为什么火：这些单品同时满足“高频使用+体验提升明显+促销价格敏感”三项特征，复购和换新需求叠加。\n火到什么程度：公开榜单显示，电池、纸品、手机等高频单品持续占据热销前列，头部单品30天销售额已达数百万美元级。\n最火品牌：按高客单与话题覆盖综合看，Apple是当前热度最强品牌。\n高薪职位\n今天更值得关注的5个高薪岗位（跨行业）是：\n\n货运车主司机：约9.6万元/月（$160,000/年）\n执业护士：约8.6万元/月（$143,183/年）\n心脏医疗技师：约8.0万元/月（$133,907/年）\n临床社工：约7.2万元/月（$119,618/年）\n数据科学家：约9.2万元/月（$154,000/年）\n\n今天最关键的数字是：3094.5亿元、3485.1亿元、2186.9亿元、160亿美元、20亿美元、6亿美元、180亿美元。资金仍在向“跨境项目、算力基础设施、可持续现金流资产”集中；个人端更可执行的机会仍是围绕医疗、物流和数据能力的岗位切入。\n今日结论\n本期资金结构显示，跨境工程与AI基础设施继续是大钱主线，消费端回到高复购刚需单品，高薪机会也从单一AI扩展到医疗、运输和数据等多行业。\n"},{"title":"谁在花钱日报｜2026-04-27",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-27/",
"date":"2026-04-27",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-27/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-27/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-27/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-27/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-27/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-27/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-27/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-27/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金继续向“政策补贴、半导体与算力、机构资金回流、跨境供应链”集中。\n政府\n第二批625亿元超长期特别国债支持消费品以旧换新资金已下达。按公开口径，政策已累计带动销售额超过4332亿元，惠及超过6093万人次。\n国际政府与开发资金\n日本追加6315亿日元（约39.6亿美元）支持Rapidus研发，累计援助达到2.354万亿日元。先进制程和半导体供应链仍是各国财政投入重点。\n投资机构\n全球股票基金单周净流入487.2亿美元，创17个月新高；其中美国股票基金净流入279.8亿美元。机构增量资金仍在向科技与AI相关板块集中。\n企业\n澳洲数据中心公司NEXTDC拟融资15亿澳元（约10.7亿美元）推进悉尼S4数据中心，La Caisse追加承诺7亿澳元。算力基础设施建设强度继续上行。\n富豪资本\nSpaceX与沙特PIF被披露洽谈约50亿美元IPO锚定投资，市场传SpaceX此次IPO募资目标约750亿美元。富豪资本和主权资本仍在围绕航天与AI基础设施提前布局。\n平民消费\n消费资金继续流向运动户外、数码智能和高复购日用品。\n昨日较火消费品牌：\n国内：华为、小米、李宁\n国外：Apple、Nike、Lululemon\n正在热卖的单品：\n国内\n\n华为：Pura/Mate系列手机\n小米：扫地机器人与空调等智能家电\n李宁：赤兔/飞电系列跑鞋\n\n国外\n\nApple：iPhone与Apple Watch系列\nNike：Zoom/Pegasus系列跑鞋\nLululemon：Align系列瑜伽裤\n\n高薪职位\n目前更值得关注的5个高薪机会：\n\nAI科学家 / AI负责人：约137153元/月\n算法研究员：约70000元/月\n大模型算法工程师：约70000元/月\nAIGC算法工程师：约70000元/月\n高性能计算工程师：约65000元/月\n\n今天最关键的数字是：625亿元、4332亿元、6315亿日元、2.354万亿日元、487.2亿美元、279.8亿美元、15亿澳元、7亿澳元、50亿美元。资金仍在向“有基础设施抓手、有长期现金流、有产业协同效应”的方向集中，个人更容易承接机会的路径仍然是工程化、交付型和高需求技术岗位。\n今日结论\n政策资金继续托底内需，国际与企业资本继续加码芯片和算力，富豪资本则提前布局IPO级别交易。短期看，技术基础设施仍是“谁在花钱”最确定的主线。\n"},{"title":"谁在花钱日报｜2026-04-24",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-24/",
"date":"2026-04-24",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-24/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-24/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-24/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-24/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-24/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-24/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-24/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-24/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主要流向了“国家重大建设、国际民生修复、产业扩产与AI长期赛道”。\n政府\n国家发展改革委下达2026年第二批“两重”建设资金2168亿元，叠加前期额度后，年内累计已下达6065亿元，占全年8000亿元的76%。资金覆盖人工智能、地下管网、交通基础设施、高标准农田和高等教育提质等方向。\n国际政府与开发资金\n世界银行在4月23日批准2.25亿美元资金支持叙利亚水务和医疗系统恢复，其中水务1.5亿美元、医疗0.75亿美元。国际公共资金仍集中投向“水、医、路、电”这类高确定性民生基础设施。\n投资机构\n机构资金继续加仓私人信贷。公开信息显示，PIMCO一次性买入Blue Owl Capital发行的4亿美元债券；Golub Capital直贷基金募资约3.2亿美元。大资金在“稳现金流资产”上的配置意愿仍然很强。\n企业\n和邦生物披露拟投资77.47亿元建设年产60万吨蛋氨酸项目。国内制造业大额投入仍以“扩产+降本+稳定交付”为核心，资金更愿意流向能形成长期产能回报的项目。\n富豪资本\n公开报道显示，马斯克去年通过信托增持SpaceX股份14亿美元。富豪资本对“航天+算力基础设施”的长期押注还在继续。\n平民消费\n消费资金继续流向高频刚需与功能升级品类。2026年1-3月，全国网上零售额49774亿元，同比增长8.0%；其中实物商品网上零售额31614亿元，同比增长7.5%。分项看，线上食品增长17.2%，穿类增长11.6%，日用品增长3.6%。\n昨日较火的消费品牌：\n国内：华为、小米、安踏\n国外：Apple、Nike、Lululemon\n高薪职位\n目前更值得关注的5个高薪机会：\n\nAI科学家 / AI负责人：约137153元/月\n算法研究员：约70000元/月\n大模型算法工程师：约70000元/月\nAIGC算法工程师：约70000元/月\n高性能计算工程师：约65000元/月\n\n国内大额资金仍在加速进入“硬基建+产业升级”，国际开发资金继续投向民生修复，机构和富豪资本同步押注长期赛道。对个人来说，更容易接住这波资金的路径，仍然是围绕工程化、交付型和高需求的技术岗位提升能力并尽快入场。\n今日结论\n今天最关键的数字是：2168亿元、6065亿元、2.25亿美元、4亿美元、3.2亿美元、77.47亿元、14亿美元，以及线上零售49774亿元（+8.0%）。资金继续向“有实物落地、有现金流逻辑、有长期回报”的方向集中。\n"},{"title":"谁在花钱日报｜2026-04-23",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-23/",
"date":"2026-04-23",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-23/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-23/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-23/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-23/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-23/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-23/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-23/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-23/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金继续流向“电网基建、头部AI联盟、消费升级品类”。\n政府\n国家电网一季度固定资产投资超过1290亿元，同比增长37%，并带动上下游投资超过2500亿元。特高压与电网补强持续推进，电力基础设施链条景气度维持高位。\n国际政府与开发资金\n美国对沙特F-15后勤保障潜在军售获批，金额30亿美元。防务维护类采购仍在扩张，军工后勤与长期服务能力价值提升。\n投资机构\nAmazon与Anthropic宣布扩大合作：Amazon先投50亿美元，未来可再投至多200亿美元；Anthropic承诺未来10年在AWS支出超1000亿美元。AI头部公司与云平台的绑定进一步加深。\n企业\nOpenAI宣布完成1220亿美元融资，投后估值8520亿美元。AI基础设施与平台化竞争进入更高资金密度阶段。\n国内推理GPU厂商曦望完成超10亿元融资，累计融资约40亿元。资金将用于推理GPU量产交付和软件生态建设，国内AI算力硬件端继续加速。\n富豪资本\n加密富豪Justin Sun就美国民事欺诈案达成1000万美元和解。富豪资本在高监管行业的资金动作，不只体现在投资，也体现在合规和法律成本支出。\n平民消费\n3月消费资金继续向升级品类集中：\n\n通讯器材类：952亿元，同比增长27.3%\n文化办公用品类：407亿元，同比增长21.7%\n体育娱乐用品类：121亿元，同比增长25.4%\n家具类：151亿元，同比增长18.1%\n金银珠宝类：356亿元，同比增长11.7%\n\n同期，3月社零总额41616亿元，同比增长1.7%。消费增量更偏“功能升级与体验升级”品类。\n高薪职位\n当前更值得关注的5个高薪岗位是：\n\nAI科学家 / AI负责人：平均月薪约137153元\n算法研究员：月薪普遍约70000元\n大模型算法工程师：月薪普遍约70000元\nAIGC算法工程师：月薪普遍约70000元\nAI岗位整体：平均月薪约60738元\n\n普通人更现实的路径，是先进入AI工程化岗位，再向高阶算法岗位升级。\n今日结论\n今天最关键的数字是：电网投资1290亿元、军售30亿美元、Amazon对Anthropic新增投资50亿美元并可追加200亿美元、Anthropic承诺AWS超1000亿美元、OpenAI融资1220亿美元、曦望融资超10亿元，以及通讯器材消费952亿元（+27.3%）。资金仍在向“可落地、可持续、可形成长期回报”的方向集中。\n"},{"title":"谁在花钱日报｜2026-04-22",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-22/",
"date":"2026-04-22",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-22/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-22/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-22/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-22/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-22/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-22/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-22/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-22/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金继续向“基建兑现、科技并购融资、线下场景消费”三条线集中。\n政府\n一季度全国铁路完成固定资产投资1379亿元，同比增长5.1%。铁路建设投资继续发挥稳增长作用，重点工程推进带动施工、装备、材料和运维链条需求。\n国际政府与开发资金\n世界银行批准摩洛哥5亿美元融资，支持就业、SME和绿色增长。开发资金继续向“能带来就业和产业升级”的方向配置。\n投资机构\n盛数科技完成2亿元A轮融资，投资方包括锦秋基金、中财融商、松禾资本。资金将用于多模态大模型和Agent能力落地，AI应用层仍有充足资金支持。\n企业\nIntel宣布将斥资142亿美元回购Apollo在爱尔兰工厂49%股权。芯片龙头继续加码核心制造资产，先进制造链条景气延续。\nNeurocrine以29亿美元现金收购Soleno Therapeutics。生物医药并购继续活跃，创新药管线整合速度加快。\n富豪资本\nForbes披露，Andreessen Horowitz向亲AI超级PAC投入2500万美元。富豪资本继续通过政策资金影响AI监管和产业节奏。\n平民消费\n清明假期北京重点商圈消费金额65.3亿元，消费增量集中在百货和餐饮等线下场景：\n\n百货业态同比+12.8%\n餐饮业态同比+5.3%\n重点监测业态销售额29.5亿元\n\n资金流向显示，线下场景消费并未走弱，假日消费更偏向“社交+出行+即时体验”。\n高薪职位\n当前更值得关注的5个高薪岗位是：\n\n算法工程师：平均招聘月薪约25236元\n机器人算法岗位：平均招聘月薪约24426元\n电机工程师：平均招聘月薪约17469元\n机械结构工程师：平均招聘月薪约13729元\nAI产品经理 / AI应用型岗位：常见月薪约20000至40000元\n\n普通人更现实的路径，是以工程能力为底座，叠加AI工具能力和行业场景经验。\n今日结论\n今天最关键的数字是：铁路投资1379亿元、世行摩洛哥融资5亿美元、盛数科技融资2亿元、Intel回购142亿美元、Neurocrine并购29亿美元，以及北京重点商圈消费65.3亿元。资金仍在流向“可落地、可转化、可持续回报”的方向。\n"},{"title":"谁在花钱日报｜2026-04-21",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-21/",
"date":"2026-04-21",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-21/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-21/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-21/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-21/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-21/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-21/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-21/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-21/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金继续集中在“区域项目、AI并购融资、线上消费结构升级”三条线。\n政府\n成渝双城经济圈350个重点项目一季度完成投资1327.27亿元，超时序进度。资金重点落在基础设施、产业创新和公共服务，项目投资正在持续转化为工程量和订单。\n国际政府与开发资金\n世界银行批准向叙利亚提供2000万美元赠款，用于公共财政管理和采购体系修复。公共财政能力修复成为后续产业资金进入的前置条件。\n投资机构\nElevenLabs完成5亿美元融资，估值110亿美元。语音AI赛道继续获得大额资本支持，企业智能客服、内容本地化和AI代理应用需求上升。\n企业\nGilead宣布收购Tubulis，交易总对价最高可达50亿美元。大型药企继续通过并购补强创新药管线。\nDiginex宣布15亿美元全股票并购Resulticks。AI并购正在从底层模型扩展到企业客户运营和智能化应用场景。\n富豪资本\nForbes披露，2026年一季度富豪Miriam Adelson与George Soros分别向超级PAC投入约4000万美元和5000万美元。富豪资金持续通过政治捐赠影响政策与市场预期。\n平民消费\n从1-2月官方数据看，居民消费资金继续向线上高频品类集中：\n\n网上吃类商品：同比+20.7%\n网上穿类商品：同比+18.0%\n网上用类商品：同比+4.7%\n餐饮收入：10264亿元，同比+4.8%\n网上服务零售额：11734亿元，同比+7.3%\n\n同期，网上商品和服务零售额达到32546亿元，同比增长9.2%。当前消费更偏“高频刚需+服务体验”，不是单一爆款驱动。\n高薪职位\n当前更值得关注的5个高薪岗位是：\n\n算法工程师：平均招聘月薪约25236元\n机器人算法岗位：平均招聘月薪约24426元\n电机工程师：平均招聘月薪约17469元\n机械结构工程师：平均招聘月薪约13729元\nAI产品经理 / AI应用型岗位：常见月薪约20000至40000元\n\n普通人更现实的路径，是以工程能力为底座，再叠加AI工具和行业场景能力。\n今日结论\n今天最关键的数字是：成渝项目投资1327.27亿元、世行赠款2000万美元、ElevenLabs融资5亿美元、Gilead并购上限50亿美元、Diginex并购15亿美元，以及线上商品和服务零售额32546亿元。资金仍在流向“可落地、可转化、可持续回报”的方向。\n"},{"title":"谁在花钱日报｜2026-04-20",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-20/",
"date":"2026-04-20",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-20/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-20/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-20/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-20/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-20/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-20/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-20/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-20/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，钱继续往“政策项目、AI算力、品类分化消费”三条线集中。\n政府\n国家发展改革委下达2026年第二批“两重”建设项目清单，安排超长期特别国债资金2168亿元支持336个重大项目。叠加此前资金，年内累计安排已达6065亿元，占全年8000亿元的76%。下达进度快于去年，意味着相关工程、设备、材料和配套服务订单会更快释放。\n国际政府与开发资金\n美国批准对德潜在军售，总金额119亿美元，承包商包括洛克希德马丁和RTX。全球地缘不确定性背景下，政府大额采购继续向军工和高端制造链条集中。\n投资机构\nJane Street与CoreWeave达成约60亿美元云服务承诺，并追加10亿美元股权投资。机构资金继续大规模锁定算力资源，AI基础设施资产仍是资本重点配置方向。\n企业\nCoreWeave与Meta签署210亿美元AI云容量协议。巨头用长期合同锁定算力，显示AI基础设施投资周期仍在拉长。\n日本追加6315亿日元（约39.6亿美元）支持Rapidus研发，累计研发支持达2.354万亿日元。先进制程竞争进入“持续高投入”阶段，芯片工程、设备与材料链条景气度延续。\n富豪资本\n富豪Leo KoGuan披露买入100万股Nvidia，按当时价格约耗资1.8亿美元。富豪个人资金继续集中押注AI芯片资产。\n平民消费\n从商务部披露的1-2月消费结构看，居民消费资金正流向这些热门品类：\n\n服装鞋帽：同比+10.4%\n粮油食品：同比+10.2%\n金银珠宝：同比+13.0%\n日用品：同比+6.6%\n饮料：同比+6.0%\n\n同期，1-2月社会消费品零售总额8.61万亿元，同比增长2.8%。这说明消费并非单一热点驱动，而是“基础刚需+升级偏好”共同拉动。\n高薪职位\n当前更值得关注的5个高薪岗位是：\n\nAI科学家 / AI负责人：平均月薪约137153元\n算法研究员：月薪普遍约70000元\n大模型算法工程师：月薪普遍约70000元\nAIGC算法工程师：月薪普遍约70000元\nAI岗位整体：平均月薪约60738元\n\n普通人更现实的路径，是先进入AI工程化与应用岗位，再向高阶算法岗位升级。\n今日结论\n今天最关键的数字是：两重资金累计6065亿元、对德军售119亿美元、Jane Street对CoreWeave约70亿美元级配置、CoreWeave与Meta协议210亿美元、日本追加支持Rapidus约39.6亿美元，以及居民消费总量8.61万亿元与珠宝13.0%的品类增速。资金仍在向“可落地、可持续、可形成长期回报”的方向集中。\n"},{"title":"谁在花钱日报｜2026-04-17",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-17/",
"date":"2026-04-17",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-17/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-17/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-17/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-17/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-17/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-17/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-17/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-17/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主线是“融资托底、科技加码、消费分化”。\n政府\n一季度社会融资规模增量达到14.83万亿元，其中人民币贷款新增8.6万亿元，M2同比增长8.5%。这意味着资金总量仍在高位运行，企业融资结构继续向更市场化、更多元化方向推进。\n国际政府与开发资金\n世行SET4Jobs项目获得9.72亿美元融资包，覆盖东部和南部非洲7国，重点投向技能培训与就业转化。国际开发资金仍在强调“技能-产业-就业”联动，职业教育和产业培训仍是明确受益方向。\n投资机构\nSynera完成4000万美元B轮融资（约3500万欧元），用于推进AI工程平台国际扩张。资本对AI应用层的偏好更明确，重点是能直接服务制造与工程提效的产品。\n企业\nDocuSign宣布将股份回购授权再提高20亿美元。软件公司在现金流改善后继续加码股东回报，资本分配能力正在成为估值的重要变量。\n德意志交易所以二级市场交易方式投资Kraken 2亿美元，持股约1.5%。传统交易所继续向合规数字资产基础设施延伸，传统金融与数字资产融合加速。\n富豪资本\nSergey Brin曾披露捐赠11亿美元Alphabet股票至其慈善平台。富豪资本的“大额动作”并不只体现在并购和一级投资，也包括超大规模慈善资本配置。\n平民消费\n从国家统计局3月分项数据看，居民消费资金正在集中流向几个热门品类：\n\n通讯器材类：952亿元，同比增长27.3%\n金银珠宝类：356亿元，同比增长11.7%\n粮油食品类：2058亿元，同比增长9.5%\n烟酒类：539亿元，同比增长7.7%\n化妆品类：463亿元，同比增长8.3%\n\n同期，家电与音像器材类同比-5.0%，汽车类同比-11.8%。这说明消费不是全面回暖，而是品类分化明显，钱正在流向“有确定需求和升级动力”的商品。\n高薪职位\n当前更值得关注的5个高薪岗位是：\n\n算法工程师：平均招聘月薪约25236元\n机器人算法岗位：平均招聘月薪约24426元\n电机工程师：平均招聘月薪约17469元\n机械结构工程师：平均招聘月薪约13729元\nAI产品经理 / AI应用型岗位：常见月薪约20000至40000元\n\n普通人更现实的路径是“工程能力+AI工具能力”，尤其是在机器人、自动化和制造业场景里。\n今日结论\n今天最值得盯的数字是：社融增量14.83万亿元、世行项目9.72亿美元、Synera融资4000万美元、DocuSign新增20亿美元回购、德交所投资2亿美元，以及消费端通讯器材952亿元（+27.3%）和珠宝356亿元（+11.7%）。钱仍在流向“可落地、可转化、可持续回报”的方向。\n"},{"title":"谁在花钱日报｜2026-04-16",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-16/",
"date":"2026-04-16",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-16/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-16/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-16/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-16/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-16/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-16/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-16/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-16/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，大钱继续流向基建、算力、低碳制造和政策型消费。\n政府\nG98环岛高速公路大三亚段扩容工程持续推进，累计完成投资超过107亿元，项目概算总投资318.6亿元。作为海南自贸港重点工程，这类长周期基建项目会持续带动施工、建材、设备、运维和区域服务岗位。\n国际政府与开发资金\n欧盟关键矿产采购平台正式启动，平台建设预算为900万欧元。关键矿产联合采购的推进，意味着相关资源供应链、贸易合规、物流和采购服务需求将继续上升。\n投资机构\nNvidia参投的数据中心公司Firmus完成5.05亿美元融资，估值55亿美元。资金将用于AI数据中心扩张和算力部署。资本仍在集中押注“算力底层能力”，而不是只停留在应用层概念。\n企业\nThomson Reuters宣布新增6亿美元回购计划，并将向股东返还6.05亿美元资本，合计12.05亿美元。成熟企业继续用真金白银做股东回报，反映出现金流质量和资本纪律在当前市场环境中的优先级。\nStegra原则性达成14亿欧元融资，用于瑞典绿色钢铁工厂建设收尾。重资产制造业脱碳项目依然能拿到大额资金，低碳制造和工业工程链条继续受益。\n富豪资本\n印度富豪Azim Premji旗下Wipro以3.75亿美元收购Olam IT业务，并签下价值8亿美元、为期8年的IT服务协议。富豪资本主导的并购仍偏向“能产生持续现金流、可长期服务化”的资产。\n平民消费\n截至4月12日，2026年消费品以旧换新销售额达到5029.4亿元，惠及6977.7万人次。其中，汽车以旧换新带动销售2694.4亿元，家电和数码智能产品带动销售2335亿元以上。居民大额消费依然集中在有政策支持的耐用品升级。\n高薪职位\n当前更值得关注的5个高薪岗位是：\n\nAI科学家 / AI负责人：平均月薪约137153元\n算法研究员：月薪普遍约70000元\n大模型算法工程师：月薪普遍约70000元\nAIGC算法工程师：月薪普遍约70000元\nAI岗位整体：平均月薪约60738元\n\n普通人更现实的路径，是先进入AI工程化和应用岗位，再向高阶算法岗位升级，并同步强化行业场景和交付能力。\n今日结论\n今天最值得关注的数字是：G98项目累计投资107亿元、欧盟平台预算900万欧元、Firmus融资5.05亿美元、Thomson Reuters股东回报12.05亿美元、Stegra融资14亿欧元、Wipro并购3.75亿美元，以及以旧换新销售额5029.4亿元。资金仍在向“可落地、可运营、可持续回报”的方向集中。\n"},{"title":"谁在花钱日报｜2026-04-14",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-14/",
"date":"2026-04-14",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-14/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-14/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-14/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-14/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-14/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-14/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-14/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-14/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金继续流向硬科技、跨区域重大项目和居民长期账户优化。\n政府\n长三角一体化示范区发布163个重大建设项目。上海青浦年度计划投资416亿元，江苏吴江超600亿元，浙江嘉善211亿元，三地合计约1227亿元。资金主要投向生态环保、互联互通、产业创新和公共服务。对普通人来说，跨区域项目意味着更持续的工程订单和更稳定的本地就业机会。\n国际政府与开发资金\n世界银行批准向黑山提供4000万欧元贷款，用于固废管理改革、区域处理中心建设和污染地块修复。开发金融资金仍在流向“可持续公共服务+可落地治理”的项目，环保工程、基础设施运营和地方服务升级将持续受益。\n投资机构\nSiFive完成4亿美元融资，估值36.5亿美元，投资方包括Atreides Management、Nvidia等。资金将用于数据中心CPU与AI芯片相关布局。资本继续加码算力底层能力，而不是只追逐应用层短周期热点。\n企业\n宁德时代拟支付40.9亿元收购杭州中恒电气投资45%股权。龙头企业通过并购继续补齐绿色能源和电力系统协同能力，产业链整合趋势明显。\n群核科技（Manycore）启动港股IPO，募资约10.2亿港元（约1.3亿美元）。行业软件与空间数字化赛道依然能拿到资本支持，软件产品、实施交付和行业解决方案岗位有望持续受益。\n富豪资本\n泰国富豪Harald Link旗下B.Grimm Power收购美国水电资产2.3亿美元股权。富豪资本在能源赛道的出手，仍然偏向“现金流稳定、可长期运营”的资产。\n平民消费\n香港eMPF平台从4月起下调行政费21.6%，预计10年为成员节省500亿港元（约64亿美元），覆盖约480万名计划成员。对普通人来说，这类费率优化会直接改善长期养老金账户的复利表现。\n高薪职位\n当前更值得关注的5个高薪岗位是：\n\nAI科学家 / AI负责人：平均月薪约137153元\n算法研究员：月薪普遍约70000元\n大模型算法工程师：月薪普遍约70000元\nAIGC算法工程师：月薪普遍约70000元\nAI工程师：平均月薪约20804元\n\n对普通人来说，更现实的路径是先进入AI工程和应用岗位，再逐步向高阶算法岗位升级。\n今日结论\n今天最关键的数字是：长三角重大项目年度投资约1227亿元、世行黑山项目4000万欧元、SiFive融资4亿美元、宁德时代并购40.9亿元、Manycore募资10.2亿港元，以及香港eMPF预计10年节省500亿港元。资金仍在向“可落地、可运营、可持续回报”的方向集中。\n"},{"title":"谁在花钱日报｜2026-04-13",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-13/",
"date":"2026-04-13",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-13/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-duo-bian-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-13/#guo-ji-zheng-fu-yu-duo-bian-zi-jin","title":"国际政府与多边资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-13/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-13/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-13/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-13/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-13/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-13/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，资金主线集中在“基建稳增长、产业硬科技、居民换新消费”三个方向。\n政府\n一季度全国完成水利建设投资2070亿元，同比增长4.1%；新开工水利项目8348个。同期，地方专项债券和银行贷款落实902亿元，社会资本落实434亿元，15项重大水利工程开工，总投资规模1475亿元。水利与基础设施投资的特点是项目周期长、岗位承接面广，后续会持续带动施工、设备、材料与本地服务需求。\n国际政府与多边资金\n联合国发布《2026年可持续发展融资报告》，披露2024年官方发展援助（ODA）为2146亿美元，2025年进一步下滑23%；发展中国家SDG年度融资缺口约4万亿美元。全球发展融资趋紧的背景下，资金会更集中投向“能创造就业、可形成现金流、可衡量结果”的项目。\n投资机构\n天仪空间完成13亿元融资，投资方包括梁溪科创二期基金（博华资本管理）、图灵资本、普华资本、国新国证、湘江国投等。资金将用于卫星“造、管、用”一体化能力升级。商业航天资金继续向可组网、可交付、可商业化能力聚集。\n企业\n贵州茅台截至2026年3月底累计回购金额11.12亿元。龙头公司持续真金白银回购，股东回报导向进一步强化。\n盛和资源公告拟回购2亿元至4亿元股份。材料链企业也在通过回购稳定市场预期，释放对中长期经营的信心。\n富豪资本\n富豪资本方面，今天公开市场没有出现足够突出的新增超大额个人交易，市场焦点仍集中在产业投资和企业资本运作。\n平民消费\n一季度消费品以旧换新销售额达到4331.7亿元，惠及6093.3万人次。其中，汽车以旧换新带动销售2286.9亿元，家电、数码和智能产品带动销售2044.8亿元。居民大额消费仍主要集中在有补贴、有场景、有明确升级价值的耐用品换新。\n高薪职位\n当前更值得普通人关注的5个高薪岗位是：\n\n算法工程师：平均招聘月薪约25236元\n机器人算法岗位：平均招聘月薪约24426元\nAI工程师：平均招聘月薪约20804元\n芯片工程师：平均招聘月薪约17790元\n移动研发：平均招聘月薪约16624元\n\n普通人更现实的路径，是先进入AI工程、芯片配套、软件研发、算法应用这些大规模招聘岗位，再叠加AI工具能力和行业经验，而不是直接冲顶尖研究岗位。\n今日结论\n今天最值得关注的数字，是水利建设投资2070亿元、联合国披露ODA 2146亿美元、天仪空间融资13亿元、茅台回购11.12亿元，以及以旧换新销售额4331.7亿元。对应到就业和收入端，算法工程师月薪约25236元，AI工程师约20804元，芯片工程师约17790元。资金正持续流向“能落地、能就业、能形成长期回报”的方向。\n"},{"title":"谁在花钱日报｜2026-04-10",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-10/",
"date":"2026-04-10",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-10/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-10/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-10/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-10/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-10/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-10/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-10/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-10/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，大钱主要流向制造业升级、新能源扩产、AI基础设施和高客单价消费场景。\n政府\n浙江制造业投资继续加速。全省第一批5亿元以上制造业重大项目达到1147个，总投资22342.6亿元，年度计划投资2089.1亿元；第一批千亿技术改造投资工程项目达到5325个，计划总投资6943.4亿元，年度计划投资1597.1亿元。新能源汽车、集成电路、生物医药、高端新材料等方向最活跃。对普通人来说，这类省级制造业投资盘子更值得长期盯，因为后续会持续释放设备、自动化、材料、检测、工业软件和供应链岗位。\n国际政府与开发资金\n世界银行启动刚果盆地森林经济项目，第一阶段资金3.9483亿美元，整个多阶段项目总规模达到10.2亿美元。资金将投向森林经济、木材加工、农林复合、SME扶持和就业创业。对普通人来说，这类国际开发金融项目已经不只是做保护，也在做产业和就业，后续会带出加工、物流、培训和绿色产业链机会。\n投资机构\n韩国AI芯片公司Rebellions完成4亿美元Pre-IPO融资，累计融资额达到8.5亿美元，估值约23.4亿美元。资本继续把钱投向AI推理芯片、算力平台和数据中心基础设施，而不是只追逐应用层热点。对普通人来说，更现实的机会在芯片工程、推理部署、算力平台、系统集成和数据中心侧岗位。\n企业\n宁德时代拟以41亿元战略投资中恒科技投资，合作方向覆盖绿色ICT基础设施、交通电动化、新型电力系统和算电协同。这个信号很直接，电池龙头的钱已经明显往电力系统和算力基础设施延展。\n长虹能源拟定增募资不超过9.03亿元，其中8.03亿元投向马来西亚高倍率锂电池生产基地。制造业出海已经不只是头部巨头的动作，中型企业也在用募资方式抢海外产能。对普通人来说，外语、制造、供应链管理三种能力叠加后，会越来越值钱。\n富豪资本\n富豪资本方面，今天公开市场上没有出现足够突出的新增超大额交易，市场焦点仍然集中在产业投资、制造扩产和技术基础设施上。\n平民消费\n海南一季度离岛免税购物金额达到142.1亿元，购物人数181.6万人次，购物数量1097.7万件。高客单价消费继续向免税、跨境和旅游消费场景集中。真正受益的不只是免税店本身，也包括物流、仓储、旅游服务和零售运营。\n高薪职位\n当前更值得普通人关注的，是“AI工程+芯片+研发”这组更贴近落地的高薪岗位：\n\nAI工程师：平均招聘月薪约20804元\n芯片工程师：平均招聘月薪约17790元\n移动研发：平均招聘月薪约16624元\n软件研发：平均招聘月薪约15816元\n算法工程师：平均招聘月薪约25236元\n\n真正适合普通人切入的，不一定是门槛最高的顶尖研究岗，而是先进入AI工程、芯片配套、软件研发、移动研发这些更大规模招人的岗位，再逐步叠加AI工具能力、行业理解和工程经验。\n今日结论\n今天最值得关注的信号，是浙江22342.6亿元制造业重大项目盘子、世界银行刚果盆地项目第一阶段3.9483亿美元资金、Rebellions 4亿美元融资、宁德时代41亿元战略投资，以及海南142.1亿元离岛免税消费。对应到高薪机会，算法工程师平均月薪约25236元，AI工程师约20804元，芯片工程师约17790元。真正值得追踪的，不只是钱花到哪里，更是这些钱接下来会继续推高哪些行业、岗位和地区机会。\n"},{"title":"谁在花钱日报｜2026-04-09",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-09/",
"date":"2026-04-09",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-09/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-09/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-09/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-09/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-09/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-09/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-09/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-09/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，新的大钱主要流向地方重大项目、新能源制造、机器人平台和数字基础设施。\n政府\n重庆发布2026年市级重点项目名单，共1636个项目，总投资3.7万亿元，年度计划投资5012亿元。这种“总盘子+年度计划投资”同时明确的大项目体系，比单个招商新闻更值得盯，因为后续会持续释放工程、设备、材料、服务外包和本地就业机会。对普通人来说，真正能接住这笔钱的，往往不是最前台的概念公司，而是工程建设、设备制造、材料配套和城市服务环节。\n国际政府与开发资金\n世界银行批准西非数字一体化项目，总额1.37亿美元，覆盖贝宁、利比里亚和塞拉利昂，重点投向宽带基础设施、跨境数字服务、创业生态和数字就业。对普通人来说，这类钱释放出来后，受益的不只是程序员，也包括网络建设、数字政务、客服运营、跨境服务和本地培训。\n投资机构\n地瓜机器人宣布完成1.5亿美元B2轮融资，B轮累计融资额达到2.7亿美元。资本继续把钱投向机器人底层平台和通用能力，而不是只追逐单一概念。对普通人来说，更现实的机会在机器人软件集成、应用开发、测试验证、解决方案和交付岗位。\n企业\n亿纬锂能拟合计投资110亿元建设两大储能电池基地。这个信号很直接，新能源链条虽然波动很大，但真正确定性最强的部分，依然是设备、工程、制造和供应链。\n兴发集团拟投资13.81亿元建设10万吨/年电池级磷酸铁锂项目。储能和电池的钱，不只是往终端电池厂流，也在继续往材料端加码。对普通人来说，这类项目带来的机会更贴近化工材料、设备维护、质量管理和供应链配套。\n富豪资本\n富豪资本方面，今天公开市场上没有出现足够突出的新增超大额交易，市场焦点仍然集中在产业投资、地方项目和技术赛道扩张上。\n平民消费\n清明假期国内出游达到1.35亿人次，总花费613.67亿元。文旅和线下场景消费恢复得更稳，假日经济带动的不只是景区，也包括餐饮、县城民宿、夜游、周边交通和本地零售。\n高薪职位\n春招市场里，AI高薪岗位继续走强。当前最值得普通人关注的5个方向是：\n\nAI科学家 / AI负责人：平均月薪约137153元\n算法研究员：月薪普遍在70000元左右\n大模型算法：月薪普遍在70000元左右\nAIGC算法工程师：月薪普遍在70000元左右\nAI岗位整体：平均月薪约60738元\n\n真正适合普通人切入的，不一定是门槛最高的顶尖研究岗，而是把AI能力叠加到原岗位里。产品、运营、销售、培训、设计岗位，只要能真正把AI工具用于提效，就更容易拿到薪资溢价。工科背景的人，则更适合盯算力、云计算、机器人控制、自动化和工程化落地方向。\n今日结论\n今天最值得关注的信号，是重庆3.7万亿元项目盘子、亿纬锂能110亿元储能基地、地瓜机器人1.5亿美元融资，以及清明假期613.67亿元文旅花费。对应到高薪机会，AI科学家/负责人平均月薪已经达到137153元，算法研究员、大模型算法、AIGC算法工程师普遍在7万元左右，AI岗位整体平均月薪约60738元。真正值得追踪的，不只是钱花到哪里，更是这些钱接下来会继续推高哪些行业和岗位。\n"},{"title":"谁在花钱日报｜2026-04-08",
"url":"/blog/shui-zai-hua-qian-ri-bao-2026-04-08/",
"date":"2026-04-08",
"headings":[{"level":1,"id":"zheng-fu","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-08/#zheng-fu","title":"政府","children":[]},{"level":1,"id":"guo-ji-zheng-fu-yu-kai-fa-zi-jin","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-08/#guo-ji-zheng-fu-yu-kai-fa-zi-jin","title":"国际政府与开发资金","children":[]},{"level":1,"id":"tou-zi-ji-gou","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-08/#tou-zi-ji-gou","title":"投资机构","children":[]},{"level":1,"id":"qi-ye","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-08/#qi-ye","title":"企业","children":[]},{"level":1,"id":"fu-hao-zi-ben","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-08/#fu-hao-zi-ben","title":"富豪资本","children":[]},{"level":1,"id":"ping-min-xiao-fei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-08/#ping-min-xiao-fei","title":"平民消费","children":[]},{"level":1,"id":"gao-xin-zhi-wei","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-08/#gao-xin-zhi-wei","title":"高薪职位","children":[]},{"level":1,"id":"jin-ri-jie-lun","permalink":"https://linxz.online/blog/shui-zai-hua-qian-ri-bao-2026-04-08/#jin-ri-jie-lun","title":"今日结论","children":[]}],
"body":"今天，全球的大钱主要流向了科技基础设施、产业升级、消费刺激和稀缺内容资产。政府、投资机构、企业、富豪资本和居民消费，都在继续把钱投向更确定、能形成长期回报的方向。\n政府\n北京近期集中签约 34 个投资项目，总金额达到 619.91 亿元，覆盖科技服务、医药健康、安全应急、新能源、智慧农业等方向。同时，规模 500 亿元的国家创业投资引导基金京津冀基金项目也完成首批签约。对普通人来说，这说明京津冀的钱还在继续往硬科技、产业配套和区域升级倾斜，就业和创业机会会更多集中在智能制造、数字基建、医药器械、储能和供应链服务。\n国际政府与开发资金\n世界银行与斯里兰卡启动新一轮增长与就业合作，未来几年合计动员规模超过 20 亿美元，其中包括超过 10 亿美元投资、最高 10 亿美元优惠融资，以及首批 1 亿美元项目支持。资金将投向港口扩建、可再生能源、旅游、农业和营商环境改善。对普通人来说，这类国际资金重新加码基建和就业项目，意味着工程、能源设备、数字化服务和旅游链条的机会在增加。\n投资机构\nKKR 完成 230 亿美元北美私募股权基金募资。这说明全球大型机构仍在把大量资金投向未上市公司和并购市场。对普通人来说，公开市场的波动并不代表资本整体在退潮，长期资金仍在继续配置优质资产，未来并购整合和产业整合的机会会继续出现。\n企业\n微软宣布将在 2026 年至 2029 年向日本投入 100 亿美元，用于人工智能基础设施、云服务、网络安全和人才培训。这表明 AI 投资已经从企业竞争升级为国家级算力和数字安全竞争。对普通人来说，数据中心、电力、液冷、网络安全、AI 培训和本地化模型服务都会持续受益。\n可口可乐系统宣布到 2030 年在南非投入 176 亿兰特，约合 10.5 亿美元，重点用于扩充产能、强化分销网络和推进产品创新。这说明跨国消费品巨头依然看好高增长新兴市场的本地生产和本地消费。对普通人来说，食品饮料、零售渠道、物流配送和供应链管理依然是稳定且现实的机会方向。\n富豪资本\nBill Ackman 旗下 Pershing Square 提出收购环球音乐，整体估值约 557.5 亿欧元。这说明富豪资本最近更愿意为能够持续产生现金流的稀缺内容资产支付高价，而不是只追逐短期热点。对普通人来说，全球版权、IP、平台型内容和文化消费相关资产，仍然处在被资本长期看重的位置。\n平民消费\n中国清明假期消费继续释放，汽车以旧换新带动新车销售额 2468 亿元，家电、数码和智能产品购新带动销售额 2159.7 亿元，两项合计达到 4627.7 亿元。对普通人来说，大额消费依然集中在政策补贴能覆盖的耐用品领域。真正有用的策略不是盲目消费，而是密切关注补贴窗口、地方政策和节假日促销节点。\n高薪职位\n当前最值得普通人关注的高薪机会，主要集中在“AI 能力 + 工程化 / 产业化”岗位。按当前招聘平台和人才报告能看到的信号，值得重点盯住的 5 个方向是：\n\n算法工程师：平均招聘月薪约 25236 元\n机器人算法岗位：平均招聘月薪约 24426 元\n电机工程师：平均招聘月薪约 17469 元\n机械结构工程师：平均招聘月薪约 13729 元\nAI 产品经理 / AI 应用型岗位：市场常见月薪约 20000 元至 40000 元\n\n真正适合普通人切入的，不一定是门槛最高的大模型研发，而是三条更现实的路径。第一条是“原岗位 + AI”，比如产品、运营、销售、设计、培训，只要能把 AI 工具真正用于提效，就更容易拿到薪资溢价。第二条是“制造业 + 自动化”，比如机器人调试、电控、电机、机械结构，这类岗位和真实产线结合更紧，岗位需求也更稳定。第三条是“工程化落地”，比如模型部署、MLOps、算力优化、网络安全，这些岗位没有纯算法研究那么卷，但一样能分享到 AI 投资带来的高薪机会。\n今日结论\n中国的钱，仍在流向科技、招商和消费刺激。海外的钱，仍在流向 AI、产能和私募投资。富豪的钱，仍在流向稀缺内容和长期现金流资产。对普通人来说，最直接的信号已经很清楚：一边是汽车和家电以旧换新合计拉动 4627.7 亿元消费，另一边是算法工程师月薪约 25236 元、机器人算法岗位月薪约 24426 元、AI 应用型岗位常见月薪约 2 万到 4 万元。真正值得追踪的，不只是钱花到哪里，更是这些钱最后会把哪些岗位推成高薪岗位。\n"},{"title":"如何登录远程主机（服务器或云主机）？",
"url":"/blog/ru-he-deng-lu-yuan-cheng-zhu-ji-fu-wu-qi-huo-yun-zhu-ji/",
"date":"2025-08-25",
"headings":[{"level":1,"id":"mi-ma-deng-lu","permalink":"https://linxz.online/blog/ru-he-deng-lu-yuan-cheng-zhu-ji-fu-wu-qi-huo-yun-zhu-ji/#mi-ma-deng-lu","title":"密码登录","children":[]},{"level":1,"id":"mi-yao-dui-deng-lu","permalink":"https://linxz.online/blog/ru-he-deng-lu-yuan-cheng-zhu-ji-fu-wu-qi-huo-yun-zhu-ji/#mi-yao-dui-deng-lu","title":"密钥对登录","children":[]}],
"body":"如何登录远程主机（服务器）？\n密码登录\nssh root@公网地址\n\n输入密码即可登录。\n注意：\n\n在输入过程中，密码不会显示出来，直接敲击回车即可。\n不一定是root这种最高级别账号，也可以通过自定义用户名来登录\n\n密钥对登录\nssh -i 本地密钥地址 root@公网地址\n\n密钥生成方式参考这篇文档。\n参考：\nhttps://linxz.online/blog/aliyun-basics/#er-yuan-cheng-lian-jie\nhttps://linxz.online/blog/ssh/#she-zhi-sshd-config\n"},{"title":"云主机linux系统常见操作",
"url":"/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/",
"date":"2025-08-25",
"headings":[{"level":1,"id":"liao-jie-xi-tong-fa-xing-ban","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#liao-jie-xi-tong-fa-xing-ban","title":"了解系统发行版","children":[]},{"level":1,"id":"lie-chu-suo-you-wen-jian-bao-han-yin-cang-wen-jian","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#lie-chu-suo-you-wen-jian-bao-han-yin-cang-wen-jian","title":"列出所有文件（包含隐藏文件）","children":[]},{"level":1,"id":"xian-shi-xian-zai-de-ri-qi","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#xian-shi-xian-zai-de-ri-qi","title":"显示现在的日期","children":[]},{"level":1,"id":"xian-shi-ri-li","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#xian-shi-ri-li","title":"显示日历","children":[{"level":2,"id":"xian-shi-2024nian-ri-li","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#xian-shi-2024nian-ri-li","title":"显示2024年日历","children":[]}]},{"level":1,"id":"ji-suan-qi","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#ji-suan-qi","title":"计算器","children":[]},{"level":1,"id":"xian-shi-zhi-chi-de-yu-yan","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#xian-shi-zhi-chi-de-yu-yan","title":"显示支持的语言","children":[{"level":2,"id":"xiu-gai-yu-xi-wei-ying-wen","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#xiu-gai-yu-xi-wei-ying-wen","title":"修改语系为英文","children":[]}]},{"level":1,"id":"fan-ye","permalink":"https://linxz.online/blog/yun-zhu-ji-linuxxi-tong-chang-jian-cao-zuo/#fan-ye","title":"翻页","children":[]}],
"body":"了解系统发行版\nhostnamectl\n\n或者\ncat /etc/os-release\n\n列出所有文件（包含隐藏文件）\n列出主目录~的所有文件\nls -al ~\n\n显示现在的日期\ndate\n\n显示日历\ncal\n\n显示2024年日历\ncal 2024\n\n计算器\nbc\n\nquit离开计算器。\n显示支持的语言\nlocale\n\n修改语系为英文\nexport LC_ALL=en_US.UTF-8\n\n可以把当前会话的语言改成英文，下次开机会恢复中文。\n可以输入date，看看是否改成英文\n修改为中文：\nexport LANG=zh_CN.UTF-8\nexport LC_ALL=zh_CN.UTF-8\n\n翻页\nshift+ page up/down\n\n"},{"title":"SwiftUI本地化双语翻译实现方案",
"url":"/blog/swiftuiben-di-hua-shuang-yu-fan-yi-shi-xian-fang-an/",
"date":"2025-04-27",
"headings":[{"level":1,"id":"zai-zhu-appli-chuang-jian-languagebian-liang","permalink":"https://linxz.online/blog/swiftuiben-di-hua-shuang-yu-fan-yi-shi-xian-fang-an/#zai-zhu-appli-chuang-jian-languagebian-liang","title":"在主App里创建language变量","children":[]},{"level":1,"id":"zai-shi-tu-nei-shi-yong-languagebian-liang","permalink":"https://linxz.online/blog/swiftuiben-di-hua-shuang-yu-fan-yi-shi-xian-fang-an/#zai-shi-tu-nei-shi-yong-languagebian-liang","title":"在视图内使用language变量","children":[]},{"level":1,"id":"she-zhi-dui-ying-de-yu-yan-bao","permalink":"https://linxz.online/blog/swiftuiben-di-hua-shuang-yu-fan-yi-shi-xian-fang-an/#she-zhi-dui-ying-de-yu-yan-bao","title":"设置对应的语言包","children":[]},{"level":1,"id":"yi-wen-wei-shen-me-bu-yong-guan-fang-de-jian-dan-xing-shi","permalink":"https://linxz.online/blog/swiftuiben-di-hua-shuang-yu-fan-yi-shi-xian-fang-an/#yi-wen-wei-shen-me-bu-yong-guan-fang-de-jian-dan-xing-shi","title":"疑问：为什么不用官方的简单形式？","children":[]},{"level":1,"id":"can-kao-jiao-cheng","permalink":"https://linxz.online/blog/swiftuiben-di-hua-shuang-yu-fan-yi-shi-xian-fang-an/#can-kao-jiao-cheng","title":"参考教程","children":[]}],
"body":"在主App里创建language变量\nimport SwiftUI\n\n@main\nstruct LanguageTestApp: App {\n    @State private var language = &quot;zh&quot;\n    \n    var body: some Scene {\n        WindowGroup {\n            ContentView(language: $language)\n        }\n    }\n}\n\n在视图内使用language变量\n主要用NSLocalizedString实现功能，bundle负责引导到对应的语言包。\nimport SwiftUI\n\nstruct ContentView: View {\n    @Binding var language: String\n    @State var selection: String?\n    \n    \n    var body: some View {\n        \n        let lprojName = language == &quot;zh&quot; ? &quot;zh&quot; : &quot;en&quot;\n        let bundle = Bundle.main.path(forResource: lprojName, ofType: &quot;lproj&quot;).flatMap { Bundle(path: $0) } ?? Bundle.main\n        \n        NavigationSplitView {\n            List(selection: $language) {\n                Text(&quot;中文&quot;)\n                    .tag(&quot;zh&quot;)\n                \n                Text(&quot;English&quot;)\n                    .tag(&quot;en&quot;)\n                \n            }\n            .onChange(of: language) {\n                language = language\n            }\n        } detail: {\n            VStack(alignment: .leading, spacing: 20) {\n                Text(NSLocalizedString(&quot;language_example&quot;,tableName: &quot;Localizable&quot;, bundle: bundle, comment: &quot;Language Example&quot;))\n                \n                Text(NSLocalizedString(&quot;sample_text&quot;,tableName: &quot;Localizable&quot;, bundle: bundle, comment: &quot;Sample text&quot;))\n                    .font(.body)\n                    .lineSpacing(6)\n                    .padding()\n                    .frame(maxWidth: .infinity, alignment: .leading)\n            }\n            .navigationTitle(NSLocalizedString(&quot;content&quot;,tableName: &quot;Localizable&quot;, bundle: bundle,  comment: &quot;Content&quot;))\n            .padding()\n        }\n    }\n}\n\n#Preview(&quot;中文&quot;) {\n    ContentView(language: .constant(&quot;zh&quot;))\n}\n\n#Preview(&quot;English&quot;) {\n    ContentView(language: .constant(&quot;en&quot;))\n}\n\n设置对应的语言包\n创建新文件，文件名是Localizable.strings。中文的放到zh.lproj文件夹，英文的放到en.lproj文件夹。\n在不同的Localizable放入对应的翻译，比如英文的：\n&quot;language_selection&quot; = &quot;Language Selection&quot;;\n&quot;language_example&quot; = &quot;English Example&quot;;\n&quot;content&quot; = &quot;Content&quot;;\n&quot;sample_text&quot; = &quot;The English language is a West Germanic language that originated from Anglo-Frisian dialects brought to Britain in the mid 5th to 7th centuries AD by Anglo-Saxon migrants. With its rich vocabulary and global influence, English has become one of the world&#39;s most widely spoken languages, serving as a lingua franca in many international contexts.&quot;;\n\n中文的：\n&quot;language_selection&quot; = &quot;语言选择&quot;;\n&quot;language_example&quot; = &quot;中文示例&quot;;\n&quot;content&quot; = &quot;内容&quot;;\n&quot;sample_text&quot; = &quot;中国有着五千年的悠久历史和灿烂文化。从古至今，中华文明以其独特的哲学思想、文学艺术、科学技术等多方面成就闻名于世。汉字作为世界上最古老的文字之一，不仅是交流的工具，更承载着中华民族的智慧和情感。&quot;;\n\n疑问：为什么不用官方的简单形式？\n我在搜索官方教程的时候，发现直接用NSLocalizedString(key)的实现，就可以实现本地化，不用创建这么多文件和依赖。但是官方实现有个条件，即需要用户将系统设置语言调整。而我的方案，只需要简单点击按钮，即可实现双语切换。这样可以方便在设置页做个“语言切换”按钮。\n另外，官方其实给出了最新的本地化方法，使用Localizable.catalog，但问题同上，需要用户自己设置环境，所以我没有研究，以后有时间再迁移到新方案去。\n参考教程\nhackingWithSwift\n"},{"title":"苹果电脑Mac无法识别移动硬盘（磁盘）怎么办？",
"url":"/blog/ping-guo-dian-nao-macwu-fa-shi-bie-yi-dong-ying-pan-ci-pan-zen-me-ban/",
"date":"2025-04-18",
"headings":[{"level":1,"id":"fang-fa-1-sou-suo-ci-pan-gong-ju-jin-xing-zhuang-zai-gua-zai","permalink":"https://linxz.online/blog/ping-guo-dian-nao-macwu-fa-shi-bie-yi-dong-ying-pan-ci-pan-zen-me-ban/#fang-fa-1-sou-suo-ci-pan-gong-ju-jin-xing-zhuang-zai-gua-zai","title":"方法1：搜索“磁盘工具”，进行装载/挂载","children":[]},{"level":1,"id":"fang-fa-2-shi-yong-ming-ling-xing","permalink":"https://linxz.online/blog/ping-guo-dian-nao-macwu-fa-shi-bie-yi-dong-ying-pan-ci-pan-zen-me-ban/#fang-fa-2-shi-yong-ming-ling-xing","title":"方法2：使用命令行","children":[]},{"level":1,"id":"qi-ta-fang-fa","permalink":"https://linxz.online/blog/ping-guo-dian-nao-macwu-fa-shi-bie-yi-dong-ying-pan-ci-pan-zen-me-ban/#qi-ta-fang-fa","title":"其他方法","children":[]}],
"body":"方法1：搜索“磁盘工具”，进行装载/挂载\n\n方法2：使用命令行\n参考文章\n\n查看电脑是否能识别\n\ndiskutil list\n\n如果无法识别，直接进行下一步。\n\n查看所有磁盘检查进程\n\nps aux | grep fsck\n\n\n强制杀掉所有磁盘检查进程\n\nsudo pkill -f fsck\n\n接着搜索磁盘工具，点击急救即可。\n其他方法\nsudo diskutil mount /dev/disk2s2\n\n注意/dev/disk2s2对应的是diskutil list的结果。参考文章\n"},{"title":"如何在swiftUI上绑定快捷键",
"url":"/blog/ru-he-zai-swiftuishang-bang-ding-kuai-jie-jian/",
"date":"2025-03-10",
"headings":[{"level":2,"id":"wan-zheng-dai-ma","permalink":"https://linxz.online/blog/ru-he-zai-swiftuishang-bang-ding-kuai-jie-jian/#wan-zheng-dai-ma","title":"完整代码","children":[]}],
"body":"使用.keyboardShortcut()即可。比如Button{}.keyboardShortcut(&quot;n&quot;, modifiers: .command)代表这个button的快捷方式是cmd+n。\n完整代码\n        .toolbar {\n            ToolbarItem(placement: .primaryAction) {\n                Button {\n                    chatViewModel.createNewSession()\n                    userFinishedInput = false\n                    message = &quot;&quot;\n                } label : {\n                    Label(&quot;新会话&quot;, systemImage: &quot;plus.circle&quot;)\n                        .font(.callout)\n                }\n                .keyboardShortcut(&quot;n&quot;, modifiers: .command)\n            }\n        }\n\n"},{"title":"swiftUI列表如何按照时间排序",
"url":"/blog/swiftuilie-biao-ru-he-an-zhao-shi-jian-pai-xu/",
"date":"2025-03-10",
"headings":[],
"body":"正常的列表形式是\nForEach(chatViewModel.sessions) { session in ... }\n加上排序方式是：\nForEach(chatViewModel.sessions.sorted(by: { $0.timestamp &gt; $1.timestamp }))\n完整代码参考：\nForEach(chatViewModel.sessions.sorted(by: { $0.timestamp &gt; $1.timestamp }))  { session in\n                        Label(session.title, systemImage: &quot;figure.american.football&quot;)\n                            .tag(session)\n                        //右键修改标题\n                            .contextMenu {\n                                Button{\n                                    editingTitle = session.title\n                                    selectedSession = session\n                                    showingTitleEditor = true\n                                }label:{\n                                    Label(&quot;修改标题&quot;, systemImage: &quot;pencil&quot;)\n                                }\n                            }.labelStyle(.titleAndIcon) //右键菜单显示图标\n                    }\n\n"},{"title":"超实用！设计小白制作iOS图标icon全流程",
"url":"/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/",
"date":"2025-02-20",
"headings":[{"level":1,"id":"aiban-ben","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#aiban-ben","title":"AI版本","children":[{"level":2,"id":"zhao-chu-can-kao-tu","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#zhao-chu-can-kao-tu","title":"找出参考图","children":[]},{"level":2,"id":"aisheng-tu","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#aisheng-tu","title":"AI生图","children":[]},{"level":2,"id":"meng-ban-bian-ji","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#meng-ban-bian-ji","title":"蒙版编辑","children":[{"level":3,"id":"guan-fang-kong-jian-zhi-chi","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#guan-fang-kong-jian-zhi-chi","title":"官方控件支持","children":[]}]},{"level":2,"id":"sheng-cheng-biao-zhun-tu-biao","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#sheng-cheng-biao-zhun-tu-biao","title":"生成标准图标","children":[]},{"level":2,"id":"fang-ru-xcodeyu-lan","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#fang-ru-xcodeyu-lan","title":"放入xcode预览","children":[]}]},{"level":1,"id":"chun-shou-gong-ban-ben","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#chun-shou-gong-ban-ben","title":"纯手工版本","children":[{"level":2,"id":"bei-jing-yuan-su","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#bei-jing-yuan-su","title":"背景元素","children":[]},{"level":2,"id":"qian-jing-yuan-su","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#qian-jing-yuan-su","title":"前景元素","children":[]}]},{"level":1,"id":"guan-fang-zhi-yin","permalink":"https://linxz.online/blog/chao-shi-yong-she-ji-xiao-bai-zhi-zuo-iostu-biao-iconquan-liu-cheng/#guan-fang-zhi-yin","title":"官方指引","children":[]}],
"body":"AI版本\n找出参考图\n寻找Icon收集的网站，推荐iosicongallery。\n筛选方式：按照喜好的颜色筛选出喜欢的Icon，将Icon截图。\n\n还可以选择Canva国际站\nAI生图\n有人问，AI可以生图，为什么还要找参考图？\n因为AI本质上是一个模式学习机器，你的数据集越精确，AI生成的效果越好。\n文字和图片对比，自然是图片的学习更接近你要的结果。\n比如我通过只文字prompt，生成的结果如下：\n\n虽然效果还可以，但是它与上面参考的iOS图标还是有差距。\n首先，它没有自动做出图标的圆角矩形图案。不过，许多软件都可以自动圆角，倒也无碍，只不过可以预览到最终效果是最好的。\n第二，我尝试生成的图标效果并不好，因为元素过杂又不集中，在App群里面辣眼睛。\n通过参考图给AI，生成结果如下：\n\n可以看出，有了参考，AI生图的水平上了一个档次。\n这样，我们可以下载初始图标，进入下一个步骤。\n蒙版编辑\n这里我要介绍一个蒙版的概念。简单来说，就是你创造一个图形，可以把你的图像都塞到图形里面。\n一般的设计软件都支持蒙版操作，以下介绍一下Sketch的操作。\n首先，a键创建一个画布，选中icon类别，我一般选择是1024x1024的。\nr创建一个矩形，设置圆角。再把图片拉进去。\ncmd+g将图片和矩形分组，图片上方，矩形在下方。右键点击矩形，用作蒙版。\n通常需要shift+拉动，将图像刚好拉满整个形状，如下图：\n\n直接导出即可。\n官方控件支持\n如果你是用figma或者sketch，可以选择官方控件。\n右键与控件解绑状态。\n直接把图片复制进来，放进AppIcon的控件即可。这样就会形成蒙版效果，拉大图像即可以填满整个控件。\n\n生成标准图标\n登入wuruihong，进行Icon的裁剪。\n首先，拉入图像，选择对应的平台。\n一般icon我会进行10%的内补白。\n自动圆角我一般选择20%。不过，我们经过圆角处理，这个选项也可以忽略。补白的地方默认是透明的。\n选择完成后，点击开始生成。\n\n现在，预览效果后就可以下载了。\n\n是不是很简单呢？\n为防止挂掉，这里还推荐另一个网站appicon.co，不过这个网站并不支持自动圆角，要自己编辑好才能生成。\n放入xcode预览\n将AppIcon.appiconset文件夹放入assets里面对应的文件夹，cmd+shift+k可以清理之前的设置，cmd+R重新运行，即可以看到运行的图标。\n在Mac里面，可以一次点击上面菜单 product-archive-custom-copy ，就可以把.dmg导出来本地，看看本地效果如何。\n纯手工版本\n因为我不是设计师，所以以最简单的方式来操作。\n首先，我们观察，一个icon包括什么元素。最基本的结构是背景+前景元素\n背景元素\n基本上分两类。纯色和渐变。\n这两种也很容易实现。依照上面蒙版编辑的步骤，在sketch里面先开一个icon的画布，填充一个矩形，再给矩形填色即可。\n渐变颜色可以选择高级渐变，拉动两边的拉条可以选择渐变的方向。\n另一个软件可以选择Canva国际站，搜索iOS icon，里面有设置好的渐变模版，非常方便。\n\n前景元素\n颜色设置好后，就要加入对应的元素。\n这里推荐两个网站，一个是之前提过的Canva.com，另外一个是阿里巴巴的图标网站iconfont.cn。\n两个网站都是免费的，在sketch或者Canva软件中，都可以直接将元素拉入。\n之后的步骤，按照上面生成标准图标的步骤一样就好了。\n这是我做的一个示例。\n\n这里就多多发挥创意啦，总之是元素和颜色的组合。\n官方指引\n关于App设计的官方指引，总之就是要简洁啦。\n"},{"title":"Electron打包Mac应用的方案",
"url":"/blog/electronda-bao-macying-yong-de-fang-an/",
"date":"2025-02-19",
"headings":[],
"body":"没有Apple Developer账号怎么办？\n禁用签名，再打包\nexport CSC_IDENTITY_AUTO_DISCOVERY=false cnpm run build:mac\n\n软件会保存在dist文件夹里。\n参考image-compress应用的方案\n注意：在Mac只能打包Mac应用，如果要打包.exe需要用Windows电脑或者虚拟机。\n"},{"title":"keynote知识",
"url":"/blog/keynotezhi-shi/",
"date":"2025-02-19",
"headings":[{"level":1,"id":"diao-zheng-huan-deng-pian-hua-bu-da-xiao","permalink":"https://linxz.online/blog/keynotezhi-shi/#diao-zheng-huan-deng-pian-hua-bu-da-xiao","title":"调整幻灯片画布大小","children":[]},{"level":1,"id":"zhi-zuo-lou-kong-shu-zi","permalink":"https://linxz.online/blog/keynotezhi-shi/#zhi-zuo-lou-kong-shu-zi","title":"制作镂空数字","children":[]},{"level":1,"id":"zhao-zi-ti","permalink":"https://linxz.online/blog/keynotezhi-shi/#zhao-zi-ti","title":"找字体","children":[]},{"level":1,"id":"ru-he-bao-liu-zi-ti","permalink":"https://linxz.online/blog/keynotezhi-shi/#ru-he-bao-liu-zi-ti","title":"如何保留字体","children":[]},{"level":1,"id":"suo-fang-fang-shi","permalink":"https://linxz.online/blog/keynotezhi-shi/#suo-fang-fang-shi","title":"缩放方式","children":[]},{"level":1,"id":"tu-xing-xuan-ze","permalink":"https://linxz.online/blog/keynotezhi-shi/#tu-xing-xuan-ze","title":"图形选择","children":[]},{"level":1,"id":"zhi-zuo-ling-xing","permalink":"https://linxz.online/blog/keynotezhi-shi/#zhi-zuo-ling-xing","title":"制作菱形","children":[]},{"level":1,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/keynotezhi-shi/#tu-pian-lai-yuan","title":"图片来源","children":[]},{"level":1,"id":"tu-pian-zhe-zhao-mask","permalink":"https://linxz.online/blog/keynotezhi-shi/#tu-pian-zhe-zhao-mask","title":"图片遮罩mask","children":[]},{"level":1,"id":"tu-biao-she-ji-ling-gan","permalink":"https://linxz.online/blog/keynotezhi-shi/#tu-biao-she-ji-ling-gan","title":"图表设计灵感","children":[]},{"level":1,"id":"shi-pin-su-cai","permalink":"https://linxz.online/blog/keynotezhi-shi/#shi-pin-su-cai","title":"视频素材","children":[]}],
"body":"keynote视频教程\n调整幻灯片画布大小\n右边菜单-文稿-幻灯片大小\n\n参考\n制作镂空数字\n1-高级设置-外框\n填充模式设置为无填充。\n\n找字体\n字由\n求字体\n如何保留字体\n找到字体，保存下来，在对方电脑安装即可。\n\n缩放方式\nshift拖动：等比例缩放\noption拖动：以原中心点为中心缩放\n两者可以结合。\n图形选择\n按住cmd，支持旋转\ncmd+shift 45度旋转\n制作菱形\n正方形旋转45度。右键-使可以编辑。\n添加四个点，拉一下。\n四个角右键-制作尖点\n四条边右键-制作平滑点\n图片来源\nunsplash\npexels\n图片遮罩mask\n同时选中形状和图片，cmd+shift+m即可把图片填充到形状中。\n图表设计灵感\ndribble\nbehance\n关键词dashboard, data\n视频素材\nvimeo\n万能视频下载网站\n"},{"title":"乔布斯回应技术人员的挑衅(嘲笑)",
"url":"/blog/qiao-bu-si-hui-ying-ji-shu-ren-yuan-de-tiao-xin-chao-xiao/",
"date":"2025-02-19",
"headings":[],
"body":"视频地址\n以下是翻译稿：\n有时候你能取悦一部分的人，但是当你想要作出改变的时候，最难的是，别人在某方面做的是对的。\n我相信OpenDoc（开源技文档）肯定有一些功能，没有任何其它东西能做到。\n我其实也不太懂，我相信你肯定能做一些样品出来，可能是一个小型的app来展示它的功能。\n最难的部分是如何将那些功能塞进更大的愿景里面，例如让你每年一个产品能够卖百八十亿美元。\n我经常发现，你得从用户体验出发，倒推用什么技术，你不能从技术出发，然后去想如何才能卖出去。\n在座的没有人比我犯过更多这样的错误，我也搞到伤痕累累，我知道这就是原因，当我们尝试去为苹果思考战略和愿景，都是从能为用户带来什么巨大利益出发，我们可以给用户带来什么，而不是先找一群工程师，大家坐下来，看看我们有什么吊炸天的技术，然后怎么把它卖出去。\n我认为我们现在的道路是正确的，我记得我们做了全世界第一个小型激光打印机，那小盒子里装了很多厉害的技术，它有第一个佳能的激光打印引擎、有非常厉害的打印机控制器、有adobe postscript、有apple talk，总之就是各种厉害的配置。\n但当我看到第一张打印出来的效果，你只要拿起来看着它，你就知道我们肯定卖得出去，因为你根本不需要知道那个小盒子里装着什么，我们只要拿起这张东西，然后问你想要的是这种效果吗？要知道1984年，在有激光打印机之前，看到这样的东西是很吓人的，大家看了都会说“wow yes！”\n这就是苹果需要回到的状态，我很抱歉OpenDoc一直是个悲剧，我也承认面对世界上很多事情我也根本不知道自己在做什么，我为此道歉。\n但是在苹果，有很多人非常非常努力工作，像lve，John，Guerino，Fred他们等，大家都没日没夜地工作，他们都带着几百人的团队去执行工作，他们真的非常努力，当然这是我们应该做的。\n我们会犯很多错误，也犯过很多错，但犯错也挺好的，因为这过程中至少做了一些决定，我们会找到那些错误，纠正他们。\n现在我们应该做的是支持我们的团队，当他们那么卖命地工作的时候，很多人开出几倍的工资想挖他们，去做各种各样的事情，他们没有一个人离开，我觉得我们应该支持他们，看到他们的付出。然后他们才会做出一些厉害的app，在市场上去支持苹果。\n这是我的个人观点，错误我们犯了，有些人会很不高兴，有些人会不知道自己在做什么，但是我觉得现在的我们，比不久之前要好太多了，我们一定可以！\n"},{"title":"SwiftUI打包.dmg步骤",
"url":"/blog/swiftuida-bao-dmgbu-zou/",
"date":"2025-02-19",
"headings":[],
"body":"以下是没有Apple Developer证书的方法\n在Signing &amp; Capabilities里面选中 macOS，\nSigning Certificate 选择 Sign to Run Locally。\n构建发布版本：\n\n在 Xcode 菜单中选择 &quot;Product&quot; &gt; &quot;Archive&quot;\n等待构建完成\n在弹出的 Archives 窗口中，选择最新的归档\n点击 &quot;Distribute App&quot;，选择Custom\n选择 &quot;Copy App&quot;\n选择保存位置\n\n这样就可以打开你的App了。\n"},{"title":"swiftUI打开文件读写权限",
"url":"/blog/swiftuida-kai-wen-jian-du-xie-quan-xian/",
"date":"2025-02-19",
"headings":[],
"body":"设置 - signing &amp; Capabilities - App Sandbox - File Access\n路径\n"},{"title":"SwiftUI滑动删除功能",
"url":"/blog/swiftuihua-dong-shan-chu-gong-neng/",
"date":"2025-02-19",
"headings":[],
"body":"使用.swipeActions\nList(students){ student in\n                HStack{\n                    Text(student.name ?? &quot;Unknown&quot;)\n                    Spacer()\n                    Button(&quot;Edit&quot;){\n                        selectedStudent = student\n                        isShow.toggle()\n                    }\n                }.swipeActions(allowsFullSwipe: true) {\n                    Button(role: .destructive) {\n                        moc.delete(student)\n                        try? moc.save()\n                    } label: {\n                        Label(&quot;删除&quot;, systemImage: &quot;trash&quot;)\n                    }\n\n                }\n            }\n\n"},{"title":"SwiftUI增加空白间隙的方法",
"url":"/blog/swiftuizeng-jia-kong-bai-jian-xi-de-fang-fa/",
"date":"2025-02-19",
"headings":[],
"body":"在SwiftUI中，有几种方法可以增加按钮之间的间距：\n\n使用 Spacer() 在按钮之间添加可伸缩的空白：\n\nHStack {\n    Button(&quot;第一个按钮&quot;) {\n        // 操作\n    }\n    Spacer() // 添加可伸缩空白\n    Button(&quot;第二个按钮&quot;) {\n        // 操作\n    }\n}\n\n\n使用 padding() 修饰符给按钮添加固定间距：\n\nHStack {\n    Button(&quot;第一个按钮&quot;) {\n        // 操作\n    }\n    .padding(.trailing, 20) // 右侧添加20点间距\n    \n    Button(&quot;第二个按钮&quot;) {\n        // 操作\n    }\n}\n\n\n如果你想指定固定宽度的空白，可以使用 Spacer() 的 minLength 参数：\n\nHStack {\n    Button(&quot;第一个按钮&quot;) {\n        // 操作\n    }\n    Spacer(minLength: 50) // 指定最小长度为50\n    Button(&quot;第二个按钮&quot;) {\n        // 操作\n    }\n}\n\n选择哪种方法取决于你的具体需求：\n\n如果需要自适应的空白，使用 Spacer()\n如果需要固定的间距，使用 padding()\n如果需要特定宽度的空白，使用带 minLength 的 Spacer\n\n"},{"title":"为什么需要版式设计？",
"url":"/blog/wei-shen-me-xu-yao-ban-shi-she-ji/",
"date":"2025-02-19",
"headings":[{"level":1,"id":"mu-de-wei-liao-geng-gao-xiao-mei-guan-di-chuan-da-xin-xi","permalink":"https://linxz.online/blog/wei-shen-me-xu-yao-ban-shi-she-ji/#mu-de-wei-liao-geng-gao-xiao-mei-guan-di-chuan-da-xin-xi","title":"目的：为了更高效、美观地传达信息。","children":[{"level":2,"id":"ming-que-ban-mian-ceng-ci-jie-gou-di-yi-yan-kan-dao-shen-me-di-fang-di-er-yan-kan-dao-shen-me-di-fang","permalink":"https://linxz.online/blog/wei-shen-me-xu-yao-ban-shi-she-ji/#ming-que-ban-mian-ceng-ci-jie-gou-di-yi-yan-kan-dao-shen-me-di-fang-di-er-yan-kan-dao-shen-me-di-fang","title":"明确版面层次结构（第一眼看到什么地方，第二眼看到什么地方）","children":[]},{"level":2,"id":"mei-guan","permalink":"https://linxz.online/blog/wei-shen-me-xu-yao-ban-shi-she-ji/#mei-guan","title":"美观","children":[]}]},{"level":1,"id":"ban-shi-she-ji-si-da-yuan-ze","permalink":"https://linxz.online/blog/wei-shen-me-xu-yao-ban-shi-she-ji/#ban-shi-she-ji-si-da-yuan-ze","title":"版式设计四大原则：","children":[]},{"level":1,"id":"zhun-bei-wen-an-su-cai","permalink":"https://linxz.online/blog/wei-shen-me-xu-yao-ban-shi-she-ji/#zhun-bei-wen-an-su-cai","title":"准备文案素材","children":[]}],
"body":"版式设计教程\n目的：为了更高效、美观地传达信息。\n明确版面层次结构（第一眼看到什么地方，第二眼看到什么地方）\n层次和节奏很重要。\n字号：好的设计会有5-6种字号，大小区分明显。可以按照+4往上走\n美观\n版式设计四大原则：\n对齐、对比、亲密、重复\n准备文案素材\n文案分类\n文案分级\n文案分组\n"},{"title":"SwiftUI使用Core Data的步骤",
"url":"/blog/swiftui-coredata/",
"date":"2025-02-18",
"headings":[],
"body":"使用SwiftUI与Core Data结合时，一般遵循以下步骤：\n\n创建Core Data模型\n\n使用Xcode的.xcdatamodeld文件来创建Core Data模型，定义实体（例如，Student）及其属性（例如，id, name）。\n\n\n设置DataController\n\n创建一个DataController类，用于初始化并加载NSPersistentContainer。这个容器负责管理Core Data的所有操作，包括持久化存储和上下文的管理。\n\n\n\nclass DataController: ObservableObject {\n    let container = NSPersistentContainer(name: &quot;StudentInfo&quot;)\n    \n    init() {\n        container.loadPersistentStores { description, error in\n            if let error = error {\n                print(&quot;Core Data failed to load: \\(error.localizedDescription)&quot;)\n            }\n        }\n    }\n}\n\n\n设置Core Data上下文\n\n使用@Environment(\\.managedObjectContext)注解，将Core Data的上下文（viewContext）注入到ContentView中，使得视图可以访问和操作Core Data。\n\n\n\n@Environment(\\.managedObjectContext) var moc\n\n\n执行Fetch请求\n\n使用@FetchRequest注解从Core Data中获取数据。可以指定排序规则（如sortDescriptors）来决定数据的排序方式。\n\n\n\n@FetchRequest(sortDescriptors: []) var students: FetchedResults&lt;Student&gt;\n\n\n添加数据\n\n在Button操作中创建新的Student对象，并将其属性设置为随机的名字。之后，通过moc.save()保存更改到Core Data。\n\n\n\nButton(&quot;Add&quot;) {\n    let firstNames = [&quot;Ginny&quot;, &quot;Harry&quot;, &quot;Hermione&quot;, &quot;Luna&quot;, &quot;Ron&quot;]\n    let lastNames = [&quot;Granger&quot;, &quot;Lovegood&quot;, &quot;Potter&quot;, &quot;Wealey&quot;]\n    \n    let chosenFirstName = firstNames.randomElement()!\n    let chosenLastName = lastNames.randomElement()!\n    \n    let student = Student(context: moc)\n    student.id = UUID()\n    student.name = &quot;\\(chosenFirstName) \\(chosenLastName)&quot;\n    \n    try? moc.save()\n}\n\n\n绑定Core Data到App的视图层\n\n在@main应用程序入口点，通过.environment(\\.managedObjectContext, dataController.container.viewContext)将Core Data的上下文传递给应用的视图，使得所有的视图都能够访问并修改Core Data数据。\n\n\n\n@main\nstruct CoreData_swiftUIApp: App {\n    @StateObject private var dataController = DataController()\n    \n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .environment(\\.managedObjectContext, dataController.container.viewContext)\n        }\n    }\n}\n\n总结：\n\n\n创建NSPersistentContainer来管理Core Data的容器。\n\n\n在ContentView中通过@Environment(.managedObjectContext)和@FetchRequest来管理数据。\n\n\n在操作（如按钮点击）中创建新的NSManagedObject（例如Student），并使用上下文保存数据。\n\n\n"},{"title":"画UI软件-Sketch介绍",
"url":"/blog/hua-uiruan-jian-sketchjie-shao/",
"date":"2025-02-12",
"headings":[{"level":1,"id":"sketchneng-zuo-shen-me","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#sketchneng-zuo-shen-me","title":"Sketch能做什么","children":[]},{"level":1,"id":"sketchque-dian","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#sketchque-dian","title":"Sketch缺点","children":[]},{"level":1,"id":"sketchkuai-jie-jian","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#sketchkuai-jie-jian","title":"Sketch快捷键","children":[]},{"level":1,"id":"sketchkuai-su-tuo-zhuai-yan-se","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#sketchkuai-su-tuo-zhuai-yan-se","title":"Sketch快速拖拽颜色","children":[]},{"level":1,"id":"sketchhua-chu-biao-zhun-yuan","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#sketchhua-chu-biao-zhun-yuan","title":"Sketch画出标准圆","children":[]},{"level":1,"id":"ru-he-ba-tu-pian-fang-jin-yuan-nei","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#ru-he-ba-tu-pian-fang-jin-yuan-nei","title":"如何把图片放进圆内","children":[]},{"level":1,"id":"ru-he-geng-huan-meng-ban-nei-tu-pian","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#ru-he-geng-huan-meng-ban-nei-tu-pian","title":"如何更换蒙版内图片","children":[]},{"level":1,"id":"ru-he-ba-tu-pian-fang-zai-tu-ceng-zui-shang-fang","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#ru-he-ba-tu-pian-fang-zai-tu-ceng-zui-shang-fang","title":"如何把图片放在图层最上方","children":[]},{"level":1,"id":"ru-he-dao-chu-tu-pian","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#ru-he-dao-chu-tu-pian","title":"如何导出图片","children":[]},{"level":1,"id":"qi-ta-xuan-ze","permalink":"https://linxz.online/blog/hua-uiruan-jian-sketchjie-shao/#qi-ta-xuan-ze","title":"其他选择","children":[]}],
"body":"sketch教程\nSketch能做什么\n移动端设计、网页设计、后台设计、运营设计\n\nSketch缺点\n只兼容Mac、云服务支持不足、团队协作功能差\nSketch快捷键\n新建画板 - a\n复制画板 - cmd+c, option+拖动\n画板名字 - 双击, cmd+r\n保存画板 - cmd+s\n等比例缩放 - 按住shift\n添加字符 - t\n添加圆圈 - o\n添加矩形 - r\n锁定元素 - cmd + shift，菜单出现锁头点击即可\n编组/组成文件夹 - cmd+g\nSketch快速拖拽颜色\n换成HSB\n\n黑色：把b设置为0或者10即可\nSketch画出标准圆\no画出圆圈，设定宽高是一样的数值。\n按下锁头，按cmd+上下键可以修改比例。\n\n如何把图片放进圆内\n右键把图片和形状编组。（注意，图片要比形状上一层）\n点击形状-右键-用作蒙版，拉伸到合适大小即可\n如何更换蒙版内图片\n将图片拉入空白处。\n点击图片，从左边菜单拉进形状即可。\n如何把图片放在图层最上方\ncmd+x 剪切, cmd+v 粘贴\n或\ncmd+shift+[\n如何导出图片\n选中画布（可以多选）\n右下角「导出」，选择2x，格式选择png或jpg。\n注意，选择png时要加上白色背景。\n其他选择\nfigma教程\nfigma课程笔记\nAdobe XD\nInvision\nJS Design\nMaster GO\nPixso\nMotiff\n"},{"title":"你值多少钱？",
"url":"/blog/ni-zhi-duo-shao-qian/",
"date":"2025-02-12",
"headings":[],
"body":"这不是一个常量，甚至不是相对固定的值。\n怎么说呢？\n一个人开始参加工作和工作若干年后，工资待遇肯定不一样，这就是我说的“相对固定”。\n为什么我说没有“相对固定”呢？\n因为你的价值实际上由市场决定，而不是你的年龄或者经验。\n最好的例子就是“程序员”。在2010-2016年间，程序员的工资水涨船高，刚毕业的甚至因为都是几万的offer而踌躇不定，那时候大众创业，互联网热潮正酣，我们认为社会会永远向上发展。\n可时间转到2024，AI发展初始，人类已失去大量岗位，计算机类应届毕业生为了可以得到一份工作，可以把薪资要求压到5000以下。\n许多人到中年的程序员，以为自己会越来越值钱，谁知道等到的却是裁员的大刀。\n离开岗位后，真的有其他公司愿意开出这么多的薪水吗？\n不错，这么多年的编程经验，你收获很多知识，知道很多框架，是成长了不少，可是市场没有成长，它反过来拉低了你的身价。\n即使在同一个时期，你的价值也是浮动的。\n比如你在行业第一的公司上班，行业第二的公司为了获得你公司的秘密，出高薪把你挖过去。这时候你的价值就非常高。\n可是两个月后，你对新公司的价值所剩无几，你的薪水就岌岌可危了。\n你的价值随着公司需要你的程度变化，当然也符合市场定律。\n所以，你值多少钱，跟能力或经验无关，而是跟你在不同时间点对别人的价值有关。\n钱是一种市场计量单位。\n"},{"title":"UI设计-Figma介绍",
"url":"/blog/uishe-ji-figmajie-shao/",
"date":"2025-02-12",
"headings":[{"level":1,"id":"you-dian","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#you-dian","title":"优点","children":[]},{"level":1,"id":"an-zhuang","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#an-zhuang","title":"安装","children":[{"level":2,"id":"zi-ti-shi-bie","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#zi-ti-shi-bie","title":"字体识别","children":[]},{"level":2,"id":"yi-hua-cha-jian","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#yi-hua-cha-jian","title":"汉化插件","children":[]}]},{"level":1,"id":"fu-fei-ban","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#fu-fei-ban","title":"付费版","children":[]},{"level":1,"id":"figmaneng-gan-ma","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#figmaneng-gan-ma","title":"Figma能干嘛","children":[]},{"level":1,"id":"she-ji-mo-kuai","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#she-ji-mo-kuai","title":"设计模块","children":[]},{"level":1,"id":"figmadi-bu-xuan-fu-gong-ju-lan","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#figmadi-bu-xuan-fu-gong-ju-lan","title":"Figma底部悬浮工具栏","children":[]},{"level":1,"id":"figmashu-xing-lan","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#figmashu-xing-lan","title":"Figma属性栏","children":[]},{"level":1,"id":"bu-tong-xi-tong-de-mo-ren-zi-ti","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#bu-tong-xi-tong-de-mo-ren-zi-ti","title":"不同系统的默认字体","children":[{"level":2,"id":"zhong-wen-zi-hao-biao-zhun","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#zhong-wen-zi-hao-biao-zhun","title":"中文字号标准","children":[]}]},{"level":1,"id":"figmakuai-jie-jian","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#figmakuai-jie-jian","title":"Figma快捷键","children":[]},{"level":1,"id":"ru-he-zhi-dao-ben-yuan-su-he-qi-ta-yuan-su-de-ju-chi","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#ru-he-zhi-dao-ben-yuan-su-he-qi-ta-yuan-su-de-ju-chi","title":"如何知道本元素和其他元素的距离","children":[]},{"level":1,"id":"ru-he-bi-mian-tuo-dong-dao-qi-ta-yuan-su-shang","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#ru-he-bi-mian-tuo-dong-dao-qi-ta-yuan-su-shang","title":"如何避免拖动到其他元素上","children":[]},{"level":1,"id":"ru-he-xuan-zhong-zui-di-ceng-de-yuan-su","permalink":"https://linxz.online/blog/uishe-ji-figmajie-shao/#ru-he-xuan-zhong-zui-di-ceng-de-yuan-su","title":"如何选中最底层的元素","children":[]}],
"body":"figma教程\nfigma课程笔记\n优点\n云服务功能突出：\n网页运行、多人协作、线上分享、云端保存\n安装\nfigma官网\n注册，也可以直接使用Google账号登录。\n可以在网页端或者客户端使用。\n字体识别\n顺便安装Font installers，否则网页端无法识别本地字体。\n汉化插件\n官方没有中文版，可以通过figma.cool来安装。\n选择二：\n月维\n付费版\n教育版免费申请教程\nFigma能干嘛\n设计文件、白板文件、PPT\n\n设计模块\n设计模式 Design\n交互模式 Interaction\n开发模式 Development\n演示模式 Presentation\nFigma底部悬浮工具栏\n\nFigma属性栏\n关键记住不同的面板。\nx,y轴的位置是基于上一级的元素。\n如果没有上一级，则是基于Page元素。\n对齐的原理也是基于上一级元素。如果同时选中两个元素，则是基于两个元素的对齐。\n\n不同系统的默认字体\n\n中文字号标准\n\nFigma快捷键\n拖动画布 - 按住空格 或 h\n选择箭头 - v\n新建画板Frame - f\n新建矩形 - r\n新建圆形 - o\n新建线段 - l\n新建文本框-t\n创建一个group - cmd + g\n锁定图层 cmd+shift+l\n隐藏图层 cmd+shift+h\n新建section - shift+s\nslice切图工具 - s\n评论-c\n隐藏评论-shift+c\n如何知道本元素和其他元素的距离\n按住option，拉动鼠标到其他元素上。\n如何避免拖动到其他元素上\n按住空格拖动，就限制该元素在原上级的Frame中。\n如何选中最底层的元素\ncmd + control + 点击\n"},{"title":"我的笔记系统",
"url":"/blog/wo-de-bi-ji-xi-tong/",
"date":"2025-02-12",
"headings":[{"level":1,"id":"wei-shen-me-bo-ke","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#wei-shen-me-bo-ke","title":"为什么博客？","children":[]},{"level":1,"id":"wei-shen-me-ping-guo-bei-wang-lu","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#wei-shen-me-ping-guo-bei-wang-lu","title":"为什么苹果备忘录？","children":[]},{"level":1,"id":"bi-ji-xi-tong","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#bi-ji-xi-tong","title":"笔记系统","children":[{"level":2,"id":"pian-nian","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#pian-nian","title":"片念","children":[]},{"level":2,"id":"xiu-zhai","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#xiu-zhai","title":"修斋","children":[]},{"level":2,"id":"shu-juan","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#shu-juan","title":"书卷","children":[]}]},{"level":1,"id":"bi-ji-sou-suo","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#bi-ji-sou-suo","title":"笔记搜索","children":[]},{"level":1,"id":"guan-yu-bi-ji-ruan-jian","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#guan-yu-bi-ji-ruan-jian","title":"关于笔记软件","children":[]},{"level":1,"id":"guan-yu-ping-guo-bei-wang-lu","permalink":"https://linxz.online/blog/wo-de-bi-ji-xi-tong/#guan-yu-ping-guo-bei-wang-lu","title":"关于苹果备忘录","children":[]}],
"body":"挣扎来往多个平台，最终采取的是「博客+苹果备忘录」的形式。\n为什么博客？\n因为公开。\n公开内容，可以满足虚荣心；另外，写公开内容，会上点心。\n这是博客，不是公众号、小红书等存在潜在收益的平台，不大会水文章，缺点是不能督促日常更新，但这本就不是我的意愿。有话才说，不硬说才是自由。\n还有一点，自由。这意味着自定义结构、格式、字体，不会限制时间和内容的修改，隔段时间还可以变一下形式。\n我就是一个乐高积木的搭建人。\n为什么苹果备忘录？\n因为快。\n即使我给博客做了小程序、苹果App、Mac App、安卓App的后台，还是不如备忘录快。\n它不用考虑格式，打开就能输入。其次，软件打开速度快，开机就能用。另外，多端同步且绑定账号，不用担心数据丢失问题。\n笔记系统\n这个系统满足我的所有记录需求。以下的分类即我博客菜单的分类。\n片念\n即短想法。我一般会先在备忘录记下想法，再决定是否放入博客中。当然，有时候确定的，就直接打开后台放入博客。\n这个区块承载的是我日常的所有想法，想到什么都可以写，毫无拘束。\n修斋\n这个部分是正式文章，一般有两类。一类是技术类文章笔记，我的短想法一旦形成一定的结构，我就会放入这个类别；一类是深度文章，我经过深度的思考后编辑完成的文章。\n我用来编辑正式文章的软件，同样也是苹果备忘录。\n书卷\n记录我读过的书。我喜欢读书，但是却有个烦恼——没内容留下。我厌倦了读书后的空虚感，总想留下些什么。刚好我常阅读的平台的微信读书，笔记保存的是markdown格式，在浏览器插件中支持一键导出，非常方便。\n因此，我只需要记录下读过的书，然后从微信自动导出书签和想法即可，满足我那该死的「满足感」。\n笔记搜索\n笔记写完就没了？这可不成，搜索是非常重要的。\n我追踪过「沉浸式翻译」创始人Owen的博客，觉得挺优雅的。\n他对博客的搜索也下了一番功夫，刚好看到他的给Zola博客增加搜索功能，找到一个中文搜索的好方案，于是依葫芦画瓢，也引进了meilisearch，出奇地好用。\n具体的实现方法可以看meili search的安装方法？最好的站内搜索工具。\n因为我的正式文章以Markdown的格式编辑，因此格式固定，搜索结果会进行权重排列，依相关度显示【标题-一级标题-二级标题-三级标题-正文】的内容，当然，也可以自定义权重，自由度非常高。\n它按照我的逻辑层次搜索，精准度也很高。\n关于笔记软件\n早期我一直在尝试，印象笔记、notion、Obsidian、浮墨flomo、Mem、Heptabase都试过或用过。我用了最长时间是Heptabase，原因是它的审美我最喜欢。其次是卡片式的笔记方式，我感到很新奇。\n为什么后来不用了？一则打开速度不理想，笔记体量一大，所有软件打开速度都不如苹果备忘录快。二则记笔记慢慢变成了累赘，因为要思考卡片形式要怎么记，记什么，又有脑图等工具，表面看起来选择很多，却造成了思想负担，这不是我想要的结果。\n我需要的只有快/便利、搜索、深化沉淀，这三个需求的重要性是从前往后的。\n因为了解了需求，就不再追踪市面上的软件。\n关于苹果备忘录\n不支持Markdown格式一直被诟病，可以试试pronote，能够支持简单的Markdown格式。\n不过，我很少用这种Markdown支持软件，更喜欢手撸。因为我的博客也用Markdown，经过插件的渲染粘贴格式怕出问题。\n如果只需要显示，不需要转移，可以试试类似的工具。\n关于用苹果备忘录记笔记，最近也看到一篇好文章——我如何使用Apple Notes做笔记，作者详细介绍了他的笔记系统，现在我把他的方案用在我的文件管理上，感觉不错。\n"},{"title":"如何改变menu里面图标SystemImage的颜色？- SwiftUI",
"url":"/blog/ru-he-gai-bian-menuli-mian-tu-biao-systemimagede-yan-se-swiftui/",
"date":"2025-02-11",
"headings":[{"level":1,"id":"bei-jing","permalink":"https://linxz.online/blog/ru-he-gai-bian-menuli-mian-tu-biao-systemimagede-yan-se-swiftui/#bei-jing","title":"背景","children":[]},{"level":1,"id":"wen-ti","permalink":"https://linxz.online/blog/ru-he-gai-bian-menuli-mian-tu-biao-systemimagede-yan-se-swiftui/#wen-ti","title":"问题","children":[]},{"level":1,"id":"jie-jue-fang-an","permalink":"https://linxz.online/blog/ru-he-gai-bian-menuli-mian-tu-biao-systemimagede-yan-se-swiftui/#jie-jue-fang-an","title":"解决方案","children":[]}],
"body":"背景\n今天我在做一个Mac App，里面涉及一个右键点击的菜单。\n因为涉及二级菜单，所以我在contextMenu里面加了一层Menu\n.contextMenu{\n\tMenu {\n\t\tForEach(categories) { category in\n\t\t\tButton{\n\t\t\t\t// do something\n\t\t\t} label: {\n\t\t\t\tHStack {\n                                Image(systemName: &quot;folder.fill&quot;)\n                                Text(category.title)\n                            }\n\t\t\t}\n\t\t\t.labelStyle(.titleAndIcon)\n\t\t}\n\t} label: {\n\t\t     HStack {\n                    Image(systemName: &quot;folder&quot;)\n                    Text(&quot;Move to...&quot;)\n                }\t\n\t}\n\t.labelStyle(.titleAndIcon)\n}\n\n问题\n我需要修改文件夹，即 Image(systemName: &quot;folder.fill&quot;)的颜色，根据AI的指示，使用.foregroundStyle或者.tint，或者.background都不行。\n解决方案\n最终，我在StackOverflow找到了参考答案\n写两个color就行 ，系统会自动取第一个。\n不确定这个是否是SwiftUI的BUG，竟然这么奇怪。\n示例代码：\n.foregroundStyle(.blue, .red)\n如果不是systemImage的话，需要用到.renderingMode(.template)，Medium的参考答案\n"},{"title":"SwiftUI的不同对话框选择",
"url":"/blog/swiftuide-bu-tong-dui-hua-kuang-xuan-ze/",
"date":"2025-02-11",
"headings":[{"level":1,"id":"jing-gao","permalink":"https://linxz.online/blog/swiftuide-bu-tong-dui-hua-kuang-xuan-ze/#jing-gao","title":"警告","children":[]},{"level":1,"id":"xuan-ze-lu-jing-deng","permalink":"https://linxz.online/blog/swiftuide-bu-tong-dui-hua-kuang-xuan-ze/#xuan-ze-lu-jing-deng","title":"选择（路径等）","children":[]},{"level":1,"id":"zhu-ce-deng-lu","permalink":"https://linxz.online/blog/swiftuide-bu-tong-dui-hua-kuang-xuan-ze/#zhu-ce-deng-lu","title":"注册登录","children":[]},{"level":1,"id":"xuan-fu-cai-dan","permalink":"https://linxz.online/blog/swiftuide-bu-tong-dui-hua-kuang-xuan-ze/#xuan-fu-cai-dan","title":"悬浮菜单","children":[]},{"level":1,"id":"xuan-ze-yan-se-wai-zhi-xiao-mian-ban","permalink":"https://linxz.online/blog/swiftuide-bu-tong-dui-hua-kuang-xuan-ze/#xuan-ze-yan-se-wai-zhi-xiao-mian-ban","title":"选择颜色-外置小面板","children":[]}],
"body":"警告\n.alert\n选择（路径等）\n.confirmationDialog\n注册登录\n.sheet\n悬浮菜单\n.popover\n.toolbar{Menu{}}\n选择颜色-外置小面板\nNSPanel\n"},{"title":"SwiftUI改变Toggle和Button的大小",
"url":"/blog/swiftuigai-bian-togglehe-buttonde-da-xiao/",
"date":"2025-02-11",
"headings":[{"level":1,"id":"groupan-niu","permalink":"https://linxz.online/blog/swiftuigai-bian-togglehe-buttonde-da-xiao/#groupan-niu","title":"Group按钮","children":[]}],
"body":"controlSize属性\n.controlSize(.extraLarge)\nGroup按钮\nControlGroup {\n\tButton(&quot;First&quot;){}\n\tButton(&quot;Second&quot;){}\n\tButton(&quot;Third&quot;){}\n\n}\n\n"},{"title":"SwiftUI没有正常显示桌面图标AppIcon",
"url":"/blog/swiftuimei-you-zheng-chang-xian-shi-zhuo-mian-tu-biao-appicon/",
"date":"2025-02-11",
"headings":[],
"body":"快速绘制AppIcon图标：下载App：Bakery，不过不建议在生产环境下使用。\n如果你把生成的AppIcon图标拉进Assets文件夹，但是不能正常显示，可以按照以下方法。\n首先，cmd + shift + k 清除缓存，\ncmd + b或者cmd + r重新build一次项目即可。\n"},{"title":"SwiftUI设计可折叠(伸缩)的Section",
"url":"/blog/swiftuishe-ji-ke-zhe-die-shen-suo-de-section/",
"date":"2025-02-11",
"headings":[],
"body":"如果侧边栏信息过多，可以选择用可折叠菜单, 主要参数是isExpanded\nSection(isExpanded: $isExpanded){\n\tText(&quot;Item 1&quot;)\n\tText(&quot;Item 2&quot;)\n\tText(&quot;Item 3&quot;)\n}\n\n或者用DisclosureGroup\nDisclosureGroup(&quot;DisclosureGroup&quot;){\n\tText(&quot;Item 1&quot;)\n\tText(&quot;Item 2&quot;)\n\tText(&quot;Item 3&quot;)\n}\n\n"},{"title":"如何知道swiftUI有没重新渲染？",
"url":"/blog/ru-he-zhi-dao-swiftuiyou-mei-zhong-xin-xuan-ran/",
"date":"2025-01-25",
"headings":[],
"body":" let _ =  Self._printChanges\n注意，需要运行才能在控制台看到是否渲染，预览时看不到信息。\nimport SwiftUI\n\nstruct CounterView: View {\n    \n    @State private var counter: Int = 0\n    \n    var body: some View {\n        \n        let _ = Self._printChanges()\n        \n        VStack {\n            Text(&quot;\\(counter)&quot;)\n                .font(.largeTitle)\n            \n            Button(&quot;Increment&quot;) {\n                counter += 1\n            }\n        }.frame(maxWidth: .infinity, maxHeight: .infinity)\n    }\n}\n\n"},{"title":"swiftUI-Toggle灯泡案例",
"url":"/blog/swiftui-toggledeng-pao-an-li/",
"date":"2025-01-25",
"headings":[],
"body":"通过开关Toggle灯泡\n主要是Toggle中会用到binding值$isOn\nstruct ToggleView: View {\n    @State private var isOn: Bool = false\n    \n    var body: some View {\n        \n        let _ = Self._printChanges()\n        \n        VStack {\n            Image(systemName: isOn ? &quot;lightbulb.fill&quot; : &quot;lightbulb&quot;)\n                .font(.system(size: 62))\n                .foregroundStyle(.yellow)\n            Toggle(isOn: $isOn) {\n                EmptyView() //空白占位符\n            }\n        }.frame(maxWidth: .infinity, maxHeight: .infinity)\n    }\n}\n\n"},{"title":"swiftUI的List使用",
"url":"/blog/swiftuide-listshi-yong/",
"date":"2025-01-25",
"headings":[{"level":1,"id":"ru-he-chuang-zao-fen-lan-xiao-guo","permalink":"https://linxz.online/blog/swiftuide-listshi-yong/#ru-he-chuang-zao-fen-lan-xiao-guo","title":"如何创造分栏效果？","children":[]},{"level":1,"id":"tu-pian-he-wen-zi-bing-pai-xiao-guo","permalink":"https://linxz.online/blog/swiftuide-listshi-yong/#tu-pian-he-wen-zi-bing-pai-xiao-guo","title":"图片和文字并排效果","children":[]}],
"body":"\nlet names = [&quot;Alex&quot;, &quot;John&quot;, &quot;Mary&quot;, &quot;Steven&quot;]\n\nList(names, id: \\.self){ name in\n            Text(name)\n}\n\n如何创造分栏效果？\n#Preview {\n    NavigationView {\n        ListView()\n        Text(&quot;Detail&quot;)\n    }\n}\n\n图片和文字并排效果\n List(names, id: \\.self){ name in\n            HStack {\n                Image(name)\n                    .resizable()\n                    .frame(width: 100, height: 100)\n                 Text(name)\n            }\n\n"},{"title":"swiftUI里面EnviromentObject的用法",
"url":"/blog/swiftuili-mian-enviromentobjectde-yong-fa/",
"date":"2025-01-25",
"headings":[{"level":1,"id":"xian-she-zhi-yi-ge-settingsde-class","permalink":"https://linxz.online/blog/swiftuili-mian-enviromentobjectde-yong-fa/#xian-she-zhi-yi-ge-settingsde-class","title":"先设置一个Settings的class","children":[]},{"level":1,"id":"shi-yong-gai-bian-liang","permalink":"https://linxz.online/blog/swiftuili-mian-enviromentobjectde-yong-fa/#shi-yong-gai-bian-liang","title":"使用该变量","children":[]},{"level":1,"id":"yu-lan-shi-tu-shi-yong-enviromentobject","permalink":"https://linxz.online/blog/swiftuili-mian-enviromentobjectde-yong-fa/#yu-lan-shi-tu-shi-yong-enviromentobject","title":"预览视图使用EnviromentObject","children":[]},{"level":1,"id":"zhu-appshi-yong-enviromentobject","permalink":"https://linxz.online/blog/swiftuili-mian-enviromentobjectde-yong-fa/#zhu-appshi-yong-enviromentobject","title":"主App使用EnviromentObject","children":[]},{"level":1,"id":"wan-zheng-dai-ma-shi-li","permalink":"https://linxz.online/blog/swiftuili-mian-enviromentobjectde-yong-fa/#wan-zheng-dai-ma-shi-li","title":"完整代码示例","children":[]}],
"body":"用途：跨视图(View）传递变量并实时渲染\n先设置一个Settings的class\nclass Settings: ObservableObject{\n    @Published var counter: Int = 0\n}\n\n使用该变量\n @EnvironmentObject var settings: Settings\n\n            Text(&quot;\\(settings.counter)&quot;)\n                .font(.largeTitle)\n\n预览视图使用EnviromentObject\n#Preview {\n    CounterView().environmentObject(Settings())\n}\n\n主App使用EnviromentObject\nimport SwiftUI\n\n@main\nstruct learnSwiftUIApp: App {\n    \n    var body: some Scene {\n        WindowGroup {\n            CounterView().environmentObject(Settings())\n        }\n    }\n}\n\n完整代码示例\n\n\nimport SwiftUI\n\nclass Settings: ObservableObject{\n    @Published var counter: Int = 0\n}\n\nstruct CounterView: View {\n    \n    @EnvironmentObject var settings: Settings\n    \n    var body: some View {\n        \n        VStack {\n            Text(&quot;\\(settings.counter)&quot;)\n                .font(.largeTitle)\n            \n            Button(&quot;Increment&quot;) {\n                settings.counter += 1\n            }\n            \n            AnotherCounterView()\n        }.frame(maxWidth: .infinity, maxHeight: .infinity)\n    }\n}\n\n#Preview {\n    CounterView().environmentObject(Settings())\n}\n\n"},{"title":"swiftUI如何改变图像大小",
"url":"/blog/swiftuiru-he-gai-bian-tu-xiang-da-xiao/",
"date":"2025-01-25",
"headings":[{"level":1,"id":"ru-he-yi-bu-zhan-shi-tu-xiang","permalink":"https://linxz.online/blog/swiftuiru-he-gai-bian-tu-xiang-da-xiao/#ru-he-yi-bu-zhan-shi-tu-xiang","title":"如何异步展示图像","children":[]}],
"body":"Image()\n\t.resizable()\n\t.aspectRatio(contentMode: .fit)\n\t//.frame(width: 100, height: 100)\n\n如何异步展示图像\nAsyncImage()\n\n"},{"title":"swiftUI无限画布",
"url":"/blog/swiftuiwu-xian-hua-bu/",
"date":"2025-01-25",
"headings":[],
"body":"主要是开发Mac的时候用的。\nVStack{}.frame(maxWidth: .infinity, maxHeight: .infinity)\n\n"},{"title":"swiftUI在Preview时如何设定binding参数？",
"url":"/blog/swiftuizai-previewshi-ru-he-she-ding-bindingcan-shu/",
"date":"2025-01-25",
"headings":[],
"body":"设置一个固定值.constant()即可。\n#Preview {\n    ColorSelectedView(selectedColor: .constant(.blue))\n}\n\n"},{"title":"Flutter基础结构",
"url":"/blog/flutterji-chu-jie-gou/",
"date":"2025-01-22",
"headings":[{"level":1,"id":"materialapp","permalink":"https://linxz.online/blog/flutterji-chu-jie-gou/#materialapp","title":"MaterialApp","children":[]},{"level":1,"id":"center","permalink":"https://linxz.online/blog/flutterji-chu-jie-gou/#center","title":"Center","children":[]},{"level":1,"id":"text","permalink":"https://linxz.online/blog/flutterji-chu-jie-gou/#text","title":"Text","children":[]}],
"body":"Scaffold-class文档\nAppBar文档\nMaterialApp\n所有结构的基础。\nCenter\n居中元素\nText\nText(&quot;Hello&quot;)，文本元素\n"},{"title":"Flutter基础",
"url":"/blog/flutterji-chu/",
"date":"2025-01-17",
"headings":[{"level":1,"id":"shi-shen-me","permalink":"https://linxz.online/blog/flutterji-chu/#shi-shen-me","title":"是什么？","children":[]},{"level":1,"id":"bian-cheng-yu-yan","permalink":"https://linxz.online/blog/flutterji-chu/#bian-cheng-yu-yan","title":"编程语言","children":[]},{"level":1,"id":"gai-nian-lai-yuan","permalink":"https://linxz.online/blog/flutterji-chu/#gai-nian-lai-yuan","title":"概念来源","children":[]},{"level":1,"id":"ji-ben-gai-nian","permalink":"https://linxz.online/blog/flutterji-chu/#ji-ben-gai-nian","title":"基本概念","children":[]},{"level":1,"id":"an-zhuang","permalink":"https://linxz.online/blog/flutterji-chu/#an-zhuang","title":"安装","children":[]},{"level":1,"id":"kuai-jie-jian","permalink":"https://linxz.online/blog/flutterji-chu/#kuai-jie-jian","title":"快捷键","children":[]},{"level":1,"id":"she-ji-yuan-su","permalink":"https://linxz.online/blog/flutterji-chu/#she-ji-yuan-su","title":"设计元素","children":[]},{"level":1,"id":"guan-yu-yin-hao","permalink":"https://linxz.online/blog/flutterji-chu/#guan-yu-yin-hao","title":"关于引号","children":[]},{"level":1,"id":"kuai-su-bao-guo-widget","permalink":"https://linxz.online/blog/flutterji-chu/#kuai-su-bao-guo-widget","title":"快速包裹widget","children":[]},{"level":1,"id":"ru-he-tian-jia-ben-di-tu-pian","permalink":"https://linxz.online/blog/flutterji-chu/#ru-he-tian-jia-ben-di-tu-pian","title":"如何添加本地图片","children":[]},{"level":1,"id":"sheng-cheng-icon","permalink":"https://linxz.online/blog/flutterji-chu/#sheng-cheng-icon","title":"生成icon","children":[]},{"level":1,"id":"fang-ru-icon","permalink":"https://linxz.online/blog/flutterji-chu/#fang-ru-icon","title":"放入icon","children":[]},{"level":1,"id":"zen-me-ba-fang-iconbian-cheng-yuan-icon","permalink":"https://linxz.online/blog/flutterji-chu/#zen-me-ba-fang-iconbian-cheng-yuan-icon","title":"怎么把方icon变成圆icon","children":[]}],
"body":"是什么？\n跨平台开发框架，可以同时开发iOS和Android。\n这是开源代码。\n编程语言\nDart\n概念来源\nweb网页的缩放技术\n基本概念\n所有的东西都是一个“部件”(widget）\n就像乐高搭积木\n\n安装\n安装sdk\n安装Android studio的插件\nAndroid studio是intelliJ开发的，和开发jetbrain是同一个公司\n快捷键\n自己在Android studio里面设置\n新建flutter项目 option+shift+f \n设计元素\nmaterial\n关于引号\n建议使用单引号，而不是双引号\n快速包裹widget\nOption + Enter，选择即可。比如需要包裹到Center里面。\n如何添加本地图片\n根目录新建images文件夹。\n修改pubspec.yaml文件，加上assets的信息。注意缩进，不然会报错。参考错误\n可以添加整个文件夹images/，就不用一个个添加文件。\n编辑后，点击上方Get dependencies才会生效。\n生成icon\n访问appicon，选择你想要的平台，下载即可。\n放入icon\nAndroid的目录： app - src - main - res\niOS的目录： Runner - Assets.xcassets - AppIcon.appiconset\n怎么把方icon变成圆icon\n点击左上角 - open，选择Android文件夹。\n打开后，run一下。右键点开res文件夹 - 新建 - Image Assets\n\n\n里面拉大缩小图标即可。\n"},{"title":"Android的MVVM设计模式",
"url":"/blog/androidde-mvvmshe-ji-mo-shi/",
"date":"2025-01-16",
"headings":[{"level":1,"id":"chuang-jian-yi-ge-viewmodelde-classwen-jian","permalink":"https://linxz.online/blog/androidde-mvvmshe-ji-mo-shi/#chuang-jian-yi-ge-viewmodelde-classwen-jian","title":"创建一个ViewModel的Class文件","children":[]},{"level":1,"id":"yin-yong-viewmodelde-bian-liang","permalink":"https://linxz.online/blog/androidde-mvvmshe-ji-mo-shi/#yin-yong-viewmodelde-bian-liang","title":"引用ViewModel的变量","children":[]},{"level":1,"id":"modelde-bu-fen","permalink":"https://linxz.online/blog/androidde-mvvmshe-ji-mo-shi/#modelde-bu-fen","title":"Model的部分","children":[]}],
"body":"Model-View-ViewModel，与苹果的MVC模式基本一致。\n怎么做？\n创建一个ViewModel的Class文件\n继承ViewModel()\n注意：只改变private变量，即_count，将count暴露出去\nclass CounterViewModel: ViewModel() {\n    private val _count = mutableStateOf(0)\n\n    //Expose the count as an immutable state\n    val count: MutableState&lt;Int&gt; = _count\n\n    fun increment(){\n        _count.value++\n    }\n\n    fun decrement(){\n        _count.value--\n    }\n}\n\n引用ViewModel的变量\n在MainActivity里面引用变量\n在setContent里面声明viewModel\nsetContent {\n    val viewModel: CounterViewModel by viewModels()\n\n    CounterViewModelTheme {\n        Surface (modifier = Modifier.fillMaxSize()) {\n            TheCounterApp(viewModel)\n        }\n    }\n}\n\n在UI界面中使用\n用viewModel.count.value的形式获取变量。\n@Composable\nfun TheCounterApp(viewModel: CounterViewModel){\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        verticalArrangement = Arrangement.Center,\n        horizontalAlignment = Alignment.CenterHorizontally\n    ) {\n        Text(\n            text = &quot;Count: ${viewModel.count.value}&quot;,\n            fontSize = 24.sp,\n            fontWeight = FontWeight.Bold\n        )\n        Spacer(modifier = Modifier.height(16.dp))\n        Row{\n            Button(onClick = {viewModel.increment()}) {\n                Text(&quot;Increment&quot;)\n            }\n            Button(onClick = {viewModel.decrement()}) {\n                Text(&quot;Decrement&quot;)\n            }\n        }\n\n    }\n}\n\nModel的部分\n创造一个class文件CounterModel。\n数据是一个data class\ndata class CounterModel (\n    var count: Int\n)\n\n创建一个Repository类\nclass CounterRepository(){\n    private var _counter = CounterModel(0)\n\n    fun getCounter() = _counter\n\n    fun incrementCounter(){\n        _counter.count++\n    }\n\n    fun decrementCounter(){\n        _counter.count--\n    }\n}\n\n在viewModel中使用\nclass CounterViewModel(): ViewModel() {\n    private val _repository: CounterRepository = CounterRepository()\n    private val _count = mutableStateOf(_repository.getCounter().count)\n\n    //Expose the count as an immutable state\n    val count: MutableState&lt;Int&gt; = _count\n\n    fun increment(){\n        _repository.incrementCounter()\n        _count.value = _repository.getCounter().count\n    }\n\n    fun decrement(){\n        _count.value--\n        _repository.decrementCounter()\n        _count.value = _repository.getCounter().count\n    }\n}\n\n"},{"title":"Android的页面导航和跳转",
"url":"/blog/androidde-ye-mian-dao-hang-he-tiao-zhuan-navigation/",
"date":"2025-01-16",
"headings":[{"level":1,"id":"tian-jia-yi-lai-xiang","permalink":"https://linxz.online/blog/androidde-ye-mian-dao-hang-he-tiao-zhuan-navigation/#tian-jia-yi-lai-xiang","title":"添加依赖项","children":[]},{"level":1,"id":"zhu-ye-mian-she-zhi-tiao-zhuan-luo-ji","permalink":"https://linxz.online/blog/androidde-ye-mian-dao-hang-he-tiao-zhuan-navigation/#zhu-ye-mian-she-zhi-tiao-zhuan-luo-ji","title":"主页面设置跳转逻辑","children":[]},{"level":1,"id":"fen-ye-mian-tian-jia-tiao-zhuan-han-shu","permalink":"https://linxz.online/blog/androidde-ye-mian-dao-hang-he-tiao-zhuan-navigation/#fen-ye-mian-tian-jia-tiao-zhuan-han-shu","title":"分页面添加跳转函数","children":[]}],
"body":"官方Navigation参考\n添加依赖项\n在build.gradle.kts里面添加依赖\nval nav_version = &quot;2.8.5&quot;\n\n// Jetpack Compose integration\nimplementation(&quot;androidx.navigation:navigation-compose:$nav_version&quot;)\n\n// Views/Fragments integration\nimplementation(&quot;androidx.navigation:navigation-fragment:$nav_version&quot;)\nimplementation(&quot;androidx.navigation:navigation-ui:$nav_version&quot;)\n\n// Feature module support for Fragments\nimplementation(&quot;androidx.navigation:navigation-dynamic-features-fragment:$nav_version&quot;)\n\n// Testing Navigation\nandroidTestImplementation(&quot;androidx.navigation:navigation-testing:$nav_version&quot;)\n\n主页面设置跳转逻辑\n@Composable\nfun MyApp(modifier: Modifier = Modifier){\n    val navController = rememberNavController()\n    NavHost(navController = navController, startDestination = &quot;firstScreen&quot;){\n        composable(&quot;firstScreen&quot;){\n            FirstScreen {\n                navController.navigate(&quot;secondScreen&quot;)\n            }\n        }\n        composable(&quot;secondScreen&quot;){\n            SecondScreen {\n                navController.navigate(&quot;firstScreen&quot;)\n            }\n        }\n    }\n}\n\n分页面添加跳转函数\nnavigationToSecondScreen: ()-&gt;Unit\n@Composable\nfun FirstScreen(navigationToSecondScreen: ()-&gt;Unit){\n    var name by remember { mutableStateOf(&quot;&quot;) }\n\n    Column(\n        modifier = Modifier\n            .fillMaxSize()\n            .padding(16.dp),\n        verticalArrangement = Arrangement.Center,\n        horizontalAlignment = Alignment.CenterHorizontally\n    ) {\n        Text(&quot;This is the First Screen&quot;, fontSize = 24.sp)\n        Spacer(modifier = Modifier.height(16.dp))\n        OutlinedTextField(value = name, onValueChange = {\n            name = it\n        })\n        Button(onClick = {\n            navigationToSecondScreen()\n        }) {\n            Text(&quot;Go to Second Screen&quot;)\n        }\n    }\n}\n\n"},{"title":"Android如何连接api？",
"url":"/blog/androidru-he-lian-jie-api/",
"date":"2025-01-16",
"headings":[{"level":1,"id":"xiu-gai-gradlede-she-zhi","permalink":"https://linxz.online/blog/androidru-he-lian-jie-api/#xiu-gai-gradlede-she-zhi","title":"修改gradle的设置","children":[]},{"level":1,"id":"ding-yi-shu-ju-jie-guo","permalink":"https://linxz.online/blog/androidru-he-lian-jie-api/#ding-yi-shu-ju-jie-guo","title":"定义数据结果","children":[]},{"level":1,"id":"zhun-bei-ji-chu-lian-jie-huan-jing","permalink":"https://linxz.online/blog/androidru-he-lian-jie-api/#zhun-bei-ji-chu-lian-jie-huan-jing","title":"准备基础连接环境","children":[]},{"level":1,"id":"yun-xu-an-zhuo-shou-ji-shang-wang","permalink":"https://linxz.online/blog/androidru-he-lian-jie-api/#yun-xu-an-zhuo-shou-ji-shang-wang","title":"允许安卓手机上网","children":[]},{"level":1,"id":"fa-song-qing-qiu","permalink":"https://linxz.online/blog/androidru-he-lian-jie-api/#fa-song-qing-qiu","title":"发送请求","children":[]},{"level":1,"id":"yun-xu-httplian-jie","permalink":"https://linxz.online/blog/androidru-he-lian-jie-api/#yun-xu-httplian-jie","title":"允许http链接","children":[]}],
"body":"udemy课程资料-android-api\n修改gradle的设置\n注意是Module相关的文件\n添加第三方依赖：\ndependencies {\n\n    //Compose ViewModel\n    implementation(&quot;androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2&quot;)\n\n    //Network calls\n    implementation(&quot;com.squareup.retrofit2:retrofit:2.9.0&quot;)\n\n    //Json to Kotlin object mapping\n    implementation(&quot;com.squareup.retrofit2:converter-gson:2.9.0&quot;)\n\n    //Image loading\n    implementation(&quot;io.coil-kt:coil-compose:2.4.0&quot;)\n}\n\n修改后记得勾选sync now完成同步。\n\n定义数据结果\n创建一个data class文件叫Category\ndata class PokemonDetail(\n    val name: String,\n    val index: String,\n    val name_en: String,\n    val name_jp: String,\n    val profile: String,\n    val forms: List&lt;PokemonForm&gt;\n)\n\ndata class PokemonForm(\n    val name: String,\n    val index: String,\n    val is_mega: Boolean,\n    val is_gmax: Boolean,\n    val image: String,\n    val types: List&lt;String&gt;,\n    val genus: String\n)\n\n准备基础连接环境\n创建一个文件叫ApiService，输入以下代码：\nimport retrofit2.Retrofit\nimport retrofit2.http.GET\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.Header\n\nprivate val retrofit = Retrofit.Builder().baseUrl(&quot;http://119.91.254.77:8000/api/v1/&quot;)\n    .addConverterFactory(GsonConverterFactory.create())\n    .build()\n\n\n// 创建服务接口\nval pokemonService = retrofit.create(ApiService::class.java)\n\ninterface ApiService{\n    @GET(&quot;pokemon/0130&quot;)\n    suspend fun getPokemon(\n        @Header(&quot;x-access-key&quot;) accessKey: String = &quot;your-key&quot; // 请求头\n    ): PokemonDetail\n}\n\n\n允许安卓手机上网\nmanifests文件夹-AndroidManifest.xml，写上设置：\n&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;\n\n\n发送请求\n在主文件里面请求，使用 LaunchedEffect 来处理异步函数\nvar pokemonName by remember { mutableStateOf(&quot;&quot;) }\nvar pokemonProfile by remember { mutableStateOf(&quot;&quot;) }\nvar pokemonName_en by remember { mutableStateOf(&quot;&quot;) }\nvar pokemonName_jp by remember { mutableStateOf(&quot;&quot;) }\nvar pokemonIndex by remember { mutableStateOf(&quot;&quot;) }\nvar imageUrl by remember { mutableStateOf(&quot;&quot;) }\nvar pokemonTypes by remember { mutableStateOf&lt;List&lt;String&gt;&gt;(emptyList()) }\n\nval baseImageUrl = &quot;http://119.91.254.77:8000/static/images/&quot;\n\n// 使用 LaunchedEffect 来处理协程\nLaunchedEffect(Unit) {\n    try {\n        val response = pokemonService.getPokemon()\n        Log.d(&quot;PokemonScreen&quot;, &quot;Response: $response&quot;)  // 使用 Log.d 代替 println\n        pokemonName = response.name\n        pokemonProfile = response.profile\n        pokemonIndex = response.index\n        pokemonName_en = response.name_en\n        pokemonName_jp = response.name_jp\n\n        // 获取第一个形态的图片\n        imageUrl = if (response.forms.isNotEmpty()) {\n            baseImageUrl + response.forms[0].image\n        } else {\n            &quot;&quot;\n        }\n\n        //获取types\n        pokemonTypes = if (response.forms.isNotEmpty()) {\n            response.forms[0].types\n        } else {\n            emptyList()\n        }\n\n    } catch(e: Exception) {\n        Log.e(&quot;PokemonScreen&quot;, &quot;Error fetching data&quot;, e)\n    }\n}\n\n允许http链接\n安卓默认不允许链接http，如果需要，可以修改AndroidManifest.xml文件。\n增加网络安全规则\n&lt;application\n    android:networkSecurityConfig=&quot;@xml/network_security_config&quot;\n/&gt;\n\n在 res - xml - 创建network_security_config.xml文件，编辑以下规则：\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;network-security-config&gt;\n    &lt;base-config cleartextTrafficPermitted=&quot;true&quot;&gt;\n        &lt;trust-anchors&gt;\n            &lt;certificates src=&quot;system&quot; /&gt;\n        &lt;/trust-anchors&gt;\n    &lt;/base-config&gt;\n&lt;/network-security-config&gt;\n\n"},{"title":"Kotlin的let关键字",
"url":"/blog/kotlinde-letguan-jian-zi/",
"date":"2025-01-16",
"headings":[],
"body":"用于安全解包\n因为变量可能是null\nlet允许在安全范围内处理变量，相当于iOS里面的安全解包。\nval name: String? = &quot;Ella&quot;\nname?.let{\n\tprintln(it.toUpperCase())\n}\n\n"},{"title":"什么是Kotlin的it参数",
"url":"/blog/shen-me-shi-kotlinde-itcan-shu/",
"date":"2025-01-16",
"headings":[],
"body":"在 Kotlin 中，it 是一个隐式参数，用于单一参数的 Lambda 表达式中。当你在 Lambda 表达式中没有显式声明参数名时，Kotlin 会自动将该参数命名为 it。\n比如：\nval list = listOf(1, 2, 3, 4)\nval doubled = list.map { it * 2 }\nprintln(doubled)  // 输出: [2, 4, 6, 8]\n\n在这个例子中，map 函数接受一个 Lambda 表达式，Lambda 表达式的参数是 it，它表示列表中的每个元素。在没有显式命名参数的情况下，Kotlin 自动为该参数命名为 it。\n"},{"title":"什么是Kotlin的lambda function",
"url":"/blog/shen-me-shi-kotlinde-lambda-function/",
"date":"2025-01-16",
"headings":[{"level":1,"id":"yi-ge-jian-ji-de-lambdahan-shu-li-zi","permalink":"https://linxz.online/blog/shen-me-shi-kotlinde-lambda-function/#yi-ge-jian-ji-de-lambdahan-shu-li-zi","title":"一个简洁的lambda函数例子","children":[]}],
"body":"onEditClick: () -&gt; Unit作为函数参数。内置的OnClick其实也是一个lambda function\n指没有参数，也没有任何返回值（即Unit）。需要的时候，可以在function内部调用onEditClick，并修改它的值。\n一个简洁的lambda函数例子\n函数解释：接收Int为参数，返回Int，把数字乘以2\nval doubleNumber: (Int) -&gt; Int = { it * 2 }\n\ndoubleNumber(5)\n\n"},{"title":"android的尺寸dp",
"url":"/blog/androidde-chi-cun-dp/",
"date":"2025-01-15",
"headings":[],
"body":"因为不同的屏幕有不同的像素px，因此这样的单位不适用。\ndp是一个相对单位，比如说更大的屏幕，1dp对应的是更多的px。\n默认使用16dp，\n一般用8,16,32这样的数字\n"},{"title":"Android的state",
"url":"/blog/androidde-state/",
"date":"2025-01-15",
"headings":[{"level":1,"id":"sheng-ming-zhuang-tai","permalink":"https://linxz.online/blog/androidde-state/#sheng-ming-zhuang-tai","title":"声明状态","children":[]},{"level":1,"id":"gai-bian-bian-liang","permalink":"https://linxz.online/blog/androidde-state/#gai-bian-bian-liang","title":"改变变量","children":[{"level":2,"id":"by-bu-xu-yao-valuede-xie-fa","permalink":"https://linxz.online/blog/androidde-state/#by-bu-xu-yao-valuede-xie-fa","title":"by - 不需要.value的写法","children":[]}]},{"level":1,"id":"can-kao","permalink":"https://linxz.online/blog/androidde-state/#can-kao","title":"参考","children":[]}],
"body":"声明状态\nremember 方法 和 mutableStateOf() 方法\n改变变量\n使用.value\nval direction = remember { mutableStateOf(&quot;North&quot;) }\n\nButton( onClick = {\n\tdirection.value = &quot;East&quot;\n})\n{\n\tText(&quot;Sail East&quot;)\n}\n\nby - 不需要.value的写法\n注意这里是var，因为变量外围没有其他包裹。\nvar direction by remember { mutableStateOf(&quot;North&quot;) }\n\nButton( onClick = {\n\tdirection = &quot;East&quot;\n})\n{\n\tText(&quot;Sail East&quot;)\n}\n\n参考\nUdemy课程资料\n"},{"title":"Android的UI界面",
"url":"/blog/androidde-uijie-mian/",
"date":"2025-01-15",
"headings":[{"level":1,"id":"zong-xiang-he-heng-xiang-pai-lie","permalink":"https://linxz.online/blog/androidde-uijie-mian/#zong-xiang-he-heng-xiang-pai-lie","title":"纵向和横向排列","children":[]},{"level":1,"id":"wen-ben-kuang","permalink":"https://linxz.online/blog/androidde-uijie-mian/#wen-ben-kuang","title":"文本框","children":[]},{"level":1,"id":"an-niu-he-dan-chu-jie-mian","permalink":"https://linxz.online/blog/androidde-uijie-mian/#an-niu-he-dan-chu-jie-mian","title":"按钮和弹出界面","children":[{"level":2,"id":"zuo-yi-ge-dai-jian-tou-de-button","permalink":"https://linxz.online/blog/androidde-uijie-mian/#zuo-yi-ge-dai-jian-tou-de-button","title":"做一个带箭头的button","children":[]}]},{"level":1,"id":"dui-qi","permalink":"https://linxz.online/blog/androidde-uijie-mian/#dui-qi","title":"对齐","children":[]},{"level":1,"id":"cha-ru-kong-bai-xing","permalink":"https://linxz.online/blog/androidde-uijie-mian/#cha-ru-kong-bai-xing","title":"插入空白行","children":[]},{"level":1,"id":"modifier","permalink":"https://linxz.online/blog/androidde-uijie-mian/#modifier","title":"Modifier","children":[]},{"level":1,"id":"gai-bian-zi-ti-da-xiao","permalink":"https://linxz.online/blog/androidde-uijie-mian/#gai-bian-zi-ti-da-xiao","title":"改变字体大小","children":[]}],
"body":"主要有Jetpack Compose组成。\nudemy课件-基本布局\n纵向和横向排列\n@composable\nfun UnitConverter( modifier: Modifier = Modifier){\n\tColumn {\n\t\tRow{\n\t\t}\n\t}\n\n}\n\n文本框\ntextField, BasicTextField, OutlineTextField\n单行文本用OutlineTextField，使用方式：\nvar inputValue by remember { mutableStateOf(&quot;&quot;) }\n\nOutlinedTextField(value = inputValue, onValueChange = {\n    // Here goes what should happen, when the value changes\n\tinputValue = it\n\n})\n\n按钮和弹出界面\n实现按button，弹出界面(Toast)的功能。\nButton(onClick = { Toast\n    .makeText(context, &quot;Thanks for clicking!&quot;,\n        Toast.LENGTH_LONG).show() })\n{\n    Text(&quot;Click Me!&quot;)\n}\n\n做一个带箭头的button\nBox{\n    Button(onClick = {}){\n        Text(&quot;Select&quot;)\n        Icon(Icons.Default.ArrowDropDown, contentDescription = &quot;Arrow Down&quot;)\n    }\n}\n\n对齐\n横向和纵向对齐\nColumn(\n    modifier = Modifier.fillMaxSize(),\n    verticalArrangement = Arrangement.Center,\n    horizontalAlignment = Alignment.CenterHorizontally\n) {}\n\n插入空白行\nSpacer()\nSpacer(modifier = Modifier.height(16.dp))\n\nModifier\n负责空隙padding, 充满整个屏幕fillMaxSize()等间距调整。\nColumn(modifier = Modifier.fillMaxSize())\nSpacer(modifier = Modifier.height(16.dp)) // 横向距离用width\n改变字体大小\nstyle属性：MaterialTheme.typography\nText(&quot;Unit Converter&quot;, style = MaterialTheme.typography.headlineLarge)\n\n\n"},{"title":"Android的下拉列表",
"url":"/blog/androidde-xia-la-lie-biao/",
"date":"2025-01-15",
"headings":[],
"body":"需要配置iExpanded来显示下拉状态。\n使用DropdownMenu和DropdownMenuItem来设置。\nonDismissRequest = { iExpanded = false }代表点击空白区域收起列表。\n示例代码\nvar iExpanded by remember { mutableStateOf(false) }\n\n// Input Box\nBox{\n    // Input Button\n    Button(onClick = { iExpanded = true }){\n        Text(inputUnit)\n        Icon(Icons.Default.ArrowDropDown, contentDescription = &quot;Arrow Down&quot;)\n    }\n    DropdownMenu(expanded = iExpanded, onDismissRequest = { iExpanded = false }) {\n        DropdownMenuItem(\n            text = { Text(&quot;Centimeters&quot;) },\n            onClick = {\n                iExpanded = false\n                inputUnit = &quot;Centimeters&quot;\n                conversionFactor = 0.01\n                convertUnits()\n            }\n        )\n        DropdownMenuItem(\n            text = { Text(&quot;Meters&quot;) },\n            onClick = {\n                iExpanded = false\n                inputUnit = &quot;Meters&quot;\n                conversionFactor = 1.0\n                convertUnits()\n            }\n        )\n        DropdownMenuItem(\n            text = { Text(&quot;Feet&quot;) },\n            onClick = {\n                iExpanded = false\n                inputUnit = &quot;Feet&quot;\n                conversionFactor = 0.3048\n                convertUnits()\n            }\n        )\n        DropdownMenuItem(\n            text = { Text(&quot;Millimeters&quot;) },\n            onClick = {\n                iExpanded = false\n                inputUnit = &quot;Millimeters&quot;\n                conversionFactor = 0.001\n                convertUnits()\n            }\n        )\n    }\n}\n\n``\n\n"},{"title":"Android留出顶部菜单区域",
"url":"/blog/androidliu-chu-ding-bu-cai-dan-qu-yu/",
"date":"2025-01-15",
"headings":[],
"body":"Modifier.statusBarsPadding()\nColumn(\n    Modifier\n        .fillMaxSize()\n        .statusBarsPadding(), // 留出顶部区域\n\t  verticalArrangement = Arrangement.Center\n ){}\n\n"},{"title":"Jetpack Compose和XML",
"url":"/blog/jetpack-composehe-xml/",
"date":"2025-01-15",
"headings":[{"level":1,"id":"xml","permalink":"https://linxz.online/blog/jetpack-composehe-xml/#xml","title":"XML","children":[]},{"level":1,"id":"jetpack-compose","permalink":"https://linxz.online/blog/jetpack-composehe-xml/#jetpack-compose","title":"Jetpack Compose","children":[]},{"level":1,"id":"import","permalink":"https://linxz.online/blog/jetpack-composehe-xml/#import","title":"import","children":[]}],
"body":"XML\n不是一门编程语言，是一门结构语言。可以用来编写界面，或者数据结构。\nXML还是JSON的前任，之前人们用它来传递数据\nJetpack Compose\nGoogle用来去取代XML的语言。\nimport\nAndroid Studio UI界面所有的import都是从Jetpack Compose来的，按需引用（需要用哪个组件引用哪个）。\n之前是xml。\n确定了每个组件和布局的写法。\n"},{"title":"Kotlin的Elvis Operator",
"url":"/blog/kotlinde-elvis-operator/",
"date":"2025-01-15",
"headings":[],
"body":"?:是Elvis Operator\n作用：结果是null，返回默认值\nval inputValueDouble = inputValue.toDoubleOrNull() ?: 0.0\n\n"},{"title":"什么是Android的lazy columns？",
"url":"/blog/shen-me-shi-androidde-lazy-columns/",
"date":"2025-01-15",
"headings":[],
"body":"懒加载。\n只加载用户滑动到的内容，其他暂时不加载。\nLazyColumn(\n    modifier = Modifier.fillMaxSize().padding(16.dp)\n) {\n    items(sItems){\n    }\n}\n\n"},{"title":"Android Studio快捷键",
"url":"/blog/android-studiokuai-jie-jian/",
"date":"2025-01-14",
"headings":[],
"body":"复制上一行 cmd + d\n多行注释 cmd + option + /\n折叠代码 cmd +/-\n"},{"title":"Kotlin的Class",
"url":"/blog/kotlinde-class/",
"date":"2025-01-14",
"headings":[{"level":1,"id":"parameter-he-propertiesde-qu-bie","permalink":"https://linxz.online/blog/kotlinde-class/#parameter-he-propertiesde-qu-bie","title":"parameter 和 properties的区别","children":[]},{"level":1,"id":"mo-ren-can-shu-zhi","permalink":"https://linxz.online/blog/kotlinde-class/#mo-ren-can-shu-zhi","title":"默认参数值","children":[]},{"level":1,"id":"data-class","permalink":"https://linxz.online/blog/kotlinde-class/#data-class","title":"data class","children":[]},{"level":1,"id":"copydui-xiang","permalink":"https://linxz.online/blog/kotlinde-class/#copydui-xiang","title":"copy对象","children":[]},{"level":1,"id":"ji-cheng-class","permalink":"https://linxz.online/blog/kotlinde-class/#ji-cheng-class","title":"继承class","children":[{"level":2,"id":"fu-classxu-yao-jia-shang-openguan-jian-zi","permalink":"https://linxz.online/blog/kotlinde-class/#fu-classxu-yao-jia-shang-openguan-jian-zi","title":"父class需要加上open关键字","children":[{"level":3,"id":"shi-li","permalink":"https://linxz.online/blog/kotlinde-class/#shi-li","title":"示例","children":[]}]},{"level":2,"id":"ji-cheng-classxu-yao-jia-shang-gua-hao","permalink":"https://linxz.online/blog/kotlinde-class/#ji-cheng-classxu-yao-jia-shang-gua-hao","title":"继承class需要加上括号","children":[]},{"level":2,"id":"interface-jie-kou","permalink":"https://linxz.online/blog/kotlinde-class/#interface-jie-kou","title":"interface 接口","children":[]}]},{"level":1,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/kotlinde-class/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"parameter 和 properties的区别\nclass Dog(val name: String) {\n\t//do something\n}\n\n如果加了val，则可以在实例对象中调用；如果不加，则是parameter，不能调用\n注意，如果想要在实例中更改properties，要用var。\nval daizy = Dog(&quot;Daisy&quot;)\nprintln(daizy.name)\n\n默认参数值\n可以在定义参数时给默认值val age: Int = 0\ndata class\n如果只在当前的文件中使用，则使用data class\ndata class CoffeeDetails(\n    val sugarCount: Int,\n    val name: String,\n    val size: String,\n    val creamAmount: Int\n)\n\ncopy对象\n使用.copy方法，同时可以修改属性\nval blueRoseVase = Vase(color = &quot;Blue&quot;, design = &quot;Rose&quot;)\nval redRoseVase = blueRoseVase.copy(color = &quot;Red&quot;)\n\ndata class Vase(val color: String, val design: String)\n\n继承class\n父class需要加上open关键字\nopen class BaseClass{}\n如果需要在后面override函数，也需要加上open关键字\nopen fun thingsToOverride(){}\n示例\noverride fun role(){\n\tsuper.role() //继承所有\n\t//其他代码\n}\n\n继承class需要加上括号\nclass Secondary: BaseClass(){}\ninterface 接口\n一样是继承的概念，主要解决多重继承的问题。\n但是父亲不需要open关键字\n定义\ninterface Archer{\n\tfun archer(){\n\t\tprintln(&quot;Archer skills from Sir Secondary&quot;)\n\t}\n}\n\n使用\nclass Offsprint: Secondary(), Archer{\n}\n\n参考资料\nudemy-eu-function-and-class\n"},{"title":"kotlin的for循环",
"url":"/blog/kotlinde-forxun-huan/",
"date":"2025-01-14",
"headings":[],
"body":"基本使用\nfor (item in shoppingList){\n    println(item)\n    if (item == &quot;RAM&quot;){\n        break\n    }\n}\n\n获取index\nfor (index in 0 until shoppingList.size){\n    println(index)\n}\n\n"},{"title":"kotlin的函数function",
"url":"/blog/kotlinde-han-shu-function/",
"date":"2025-01-14",
"headings":[{"level":1,"id":"ji-ben-xie-fa","permalink":"https://linxz.online/blog/kotlinde-han-shu-function/#ji-ben-xie-fa","title":"基本写法","children":[]},{"level":1,"id":"dai-fan-hui-zhi-de-han-shu","permalink":"https://linxz.online/blog/kotlinde-han-shu-function/#dai-fan-hui-zhi-de-han-shu","title":"带返回值的函数","children":[]}],
"body":"基本写法\nfun makeCoffee(sugarCount: Int){\n\tprintLn(&quot;Coffee with $sugarCount spoons of sugar&quot;)\n}\n\n带返回值的函数\n带冒号:\nfun add(num1: Int, num2:Int):Int{\n\tval result = num1 + num2\n\treturn result\n}\n\n"},{"title":"kotlin的list",
"url":"/blog/kotlinde-list/",
"date":"2025-01-14",
"headings":[{"level":1,"id":"mapfang-fa","permalink":"https://linxz.online/blog/kotlinde-list/#mapfang-fa","title":"map方法","children":[]}],
"body":"增删查改\nfun main() {\n    // Immutable list\n    val iShoppingList = listOf(&quot;Processor&quot;, &quot;RAM&quot;, &quot;Graphics Card&quot;, &quot;SSD&quot;)\n\n    // Mutable list\n    val shoppingList = mutableListOf(&quot;Processor&quot;, &quot;RAM&quot;, &quot;Graphics Card RTX3060&quot;, &quot;SSD&quot;)\n\n    // Add items\n    shoppingList.add(&quot;Cooling System&quot;)\n\n    // Delete items\n    shoppingList.remove(&quot;Graphics Card RTX3060&quot;)\n    shoppingList.add(&quot;Graphics Card RTX4090&quot;)\n\n    // Modify items\n    /* 方法一: index */\n    shoppingList[4] = &quot;Graphics Card RT 7800XT&quot;\n    /* 方法二: set */\n    shoppingList.set(3, &quot;Water Cooling&quot;)\n\n    // find items\n    val hasSSD = shoppingList.contains(&quot;SSD&quot;)\n    println(hasSSD)\n    \n    println(shoppingList)\n}\n\nmap方法\n将每个值按照function过滤一遍\nval numbers = listOf(1,2,3)\nval doubled = numbers.map { it * 2 }\n\n"},{"title":"kotlin语法",
"url":"/blog/kotlinyu-fa/",
"date":"2025-01-14",
"headings":[{"level":1,"id":"ji-ben-shu-ju-lei-xing","permalink":"https://linxz.online/blog/kotlinyu-fa/#ji-ben-shu-ju-lei-xing","title":"基本数据类型","children":[{"level":2,"id":"number-signed-or-unsigened","permalink":"https://linxz.online/blog/kotlinyu-fa/#number-signed-or-unsigened","title":"number (signed or unsigened)","children":[{"level":3,"id":"signed-you-fu-hao-de","permalink":"https://linxz.online/blog/kotlinyu-fa/#signed-you-fu-hao-de","title":"signed 有符号的","children":[]},{"level":3,"id":"unsigned-wu-fu-hao-de","permalink":"https://linxz.online/blog/kotlinyu-fa/#unsigned-wu-fu-hao-de","title":"unsigned 无符号的","children":[]}]},{"level":2,"id":"valhe-var","permalink":"https://linxz.online/blog/kotlinyu-fa/#valhe-var","title":"val和var","children":[]},{"level":2,"id":"floathe-double","permalink":"https://linxz.online/blog/kotlinyu-fa/#floathe-double","title":"float和double","children":[]},{"level":2,"id":"charhe-string","permalink":"https://linxz.online/blog/kotlinyu-fa/#charhe-string","title":"char和string","children":[{"level":3,"id":"xu-yao-shu-ru-te-shu-fu-hao","permalink":"https://linxz.online/blog/kotlinyu-fa/#xu-yao-shu-ru-te-shu-fu-hao","title":"需要输入特殊符号","children":[]},{"level":3,"id":"stringde-fang-fa","permalink":"https://linxz.online/blog/kotlinyu-fa/#stringde-fang-fa","title":"string的方法","children":[]}]}]},{"level":1,"id":"tiao-jian-pan-duan","permalink":"https://linxz.online/blog/kotlinyu-fa/#tiao-jian-pan-duan","title":"条件判断","children":[]},{"level":1,"id":"huo-qu-yong-hu-shu-ru-readln","permalink":"https://linxz.online/blog/kotlinyu-fa/#huo-qu-yong-hu-shu-ru-readln","title":"获取用户输入readln()","children":[{"level":2,"id":"whenfu-zhi","permalink":"https://linxz.online/blog/kotlinyu-fa/#whenfu-zhi","title":"when赋值","children":[{"level":3,"id":"bian-liang-you-duo-ge-zhi","permalink":"https://linxz.online/blog/kotlinyu-fa/#bian-liang-you-duo-ge-zhi","title":"变量有多个值","children":[]},{"level":3,"id":"duo-chong-qing-kuang-pan-duan","permalink":"https://linxz.online/blog/kotlinyu-fa/#duo-chong-qing-kuang-pan-duan","title":"多种情况判断","children":[]}]}]}],
"body":"Kotlin playground\nkotlin文档\nudemy-eu-基本教程\n基本数据类型\n官方指引\nnumber (signed or unsigened)\nByte \nShort\nInt\nLong\n如果没有指定类型，默认是从Int类型开始推断，所以可能是Int或者Long\nsigned 有符号的\n\nunsigned 无符号的\nUByte\nUShort\nUInt\nULong\n\n声明时后面加个u即可\nval age = 35u\nval和var\nval定义不变的变量，比如js里面的const，var是会变的变量\npackage online.linxz.kotlinbasics\n\nfun main() {\n\n    val age = 35\n\n    var newAge = 33\n\n    newAge = 32\n\n    println(&quot;My age is $age&quot;)\n}\n\n\nfloat和double\n类型推断，默认是存储空间更大的double，可以通过以下声明改变：\n当需要简单声明float的时候，最后加个f就可以。\nval eFloat = 2.73344f\nval someFloat: Float = 2.3444f //这个复杂方法也可以\n\nchar和string\nchar单引号，string双引号\n需要输入特殊符号\n借助unicode，unicode列表\n只需要在4位unicode代码前面就是\\u即可使用\n\\代表转义字符，如果需要打出\\，需要输入两个\\\nval mychar = &#39;\\u00A9&#39;\n\nstring的方法\n比如str.lowercase(), .uppercase()\n条件判断\n|| 和 &amp;&amp; 运算符是惰性工作的，这意味着：\n如果第一个操作数是真实的，|| 运算符不会评估第二个操作数。\n如果第一个操作数是假的，&amp;&amp; 运算符不会评估第二个操作数。\n获取用户输入readln()\nfun main() {\n    println(&quot;Please enter your age&quot;)\n    val enteredValue = readln()\n    val age = enteredValue.toInt()\n    println(&quot;your age is $age&quot;)\n}\n\nwhen赋值\n类似于switch的功能。\n变量有多个值\ncomputerChoice = when (randomNumber) {\n    1 -&gt; {\n        &quot;Rock&quot;\n    }\n    2 -&gt; {\n        &quot;Paper&quot;\n    }\n    else -&gt; {\n        &quot;Scissors&quot;\n    }\n}\n\n多种情况判断\nval winner = when {\n    playerChoice == computerChoice -&gt; &quot;Tie&quot;\n    playerChoice == &quot;Rock&quot; &amp;&amp; computerChoice == &quot;Scissors&quot; -&gt; &quot;You win!&quot;\n    playerChoice == &quot;Scissors&quot; &amp;&amp; computerChoice == &quot;Paper&quot; -&gt; &quot;You win!&quot;\n    playerChoice == &quot;Paper&quot; &amp;&amp; computerChoice == &quot;Rock&quot; -&gt; &quot;You win!&quot;\n    else -&gt; &quot;You Lose! Try again.&quot;\n}\n\n"},{"title":"Android Studio常见知识",
"url":"/blog/android-studiochang-jian-zhi-shi/",
"date":"2025-01-13",
"headings":[{"level":1,"id":"chuang-jian-xiang-mu","permalink":"https://linxz.online/blog/android-studiochang-jian-zhi-shi/#chuang-jian-xiang-mu","title":"创建项目","children":[]},{"level":1,"id":"xiu-gai-zi-ti","permalink":"https://linxz.online/blog/android-studiochang-jian-zhi-shi/#xiu-gai-zi-ti","title":"修改字体","children":[{"level":2,"id":"xiu-gai-cai-dan-zi-ti","permalink":"https://linxz.online/blog/android-studiochang-jian-zhi-shi/#xiu-gai-cai-dan-zi-ti","title":"修改菜单字体","children":[]}]},{"level":1,"id":"zhong-wen-yi-hua","permalink":"https://linxz.online/blog/android-studiochang-jian-zhi-shi/#zhong-wen-yi-hua","title":"中文汉化","children":[]}],
"body":"创建项目\n创建时选择Empty Activity只能使用Kotlin语言，无法选择Java语言。\n使用Java语言，可以用Empty Views Activity。\n修改字体\n在设置中搜索font即可。一般改为18\n\n修改菜单字体\n在appearance里面修改，改为16\n\n中文汉化\n设置 - 插件 - 本地disk安装\n\n插件地址 - AndroidStudio Chinese Language Pack\n"},{"title":"Android studio提示没有安装sdk？",
"url":"/blog/android-studioti-shi-mei-you-an-zhuang-sdk/",
"date":"2025-01-13",
"headings":[],
"body":"代理问题\n&quot;Appearance and Behavior&quot; -&gt; System Settings -&gt; HTTP Proxy，自定义输入127.0.0.1，以及端口1087。可以在该页面测试链接是否可行。\n解决代理问题-stackoverflow\n"},{"title":"Android的布局",
"url":"/blog/androidde-bu-ju/",
"date":"2025-01-13",
"headings":[{"level":1,"id":"xian-xing-bu-ju-linearlayout","permalink":"https://linxz.online/blog/androidde-bu-ju/#xian-xing-bu-ju-linearlayout","title":"线性布局 LinearLayout","children":[]}],
"body":"一般在src-res文件夹下的activity_main.xml\n只有View和ViewGroup两种。\n\n线性布局 LinearLayout\nlayout_weight是权重，初始值是1，设置越大权重越大，占的面积就会越大。\ngravity：重心排列方式。center为居中排列，可以设置top|right等属性\norientation：布局方向。有horizontal和vertical两种。\n\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;\n    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;\n    xmlns:tools=&quot;http://schemas.android.com/tools&quot;\n    android:id=&quot;@+id/main&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;match_parent&quot;\n    android:gravity=&quot;center&quot;\n    android:orientation=&quot;horizontal&quot;\n    tools:context=&quot;.MainActivity&quot;&gt;\n\n    &lt;ImageView\n        android:layout_width=&quot;100dp&quot;\n        android:layout_height=&quot;100dp&quot;\n        android:background=&quot;#F00&quot; /&gt;\n\n    &lt;ImageView\n        android:layout_width=&quot;100dp&quot;\n        android:layout_height=&quot;100dp&quot;\n        android:background=&quot;#0F0&quot; /&gt;\n\n    &lt;ImageView\n        android:layout_width=&quot;100dp&quot;\n        android:layout_height=&quot;100dp&quot;\n        android:background=&quot;#00F&quot; /&gt;\n\n&lt;/LinearLayout&gt;\n\n"},{"title":"Android的文本框属性",
"url":"/blog/androidde-wen-ben-kuang-shu-xing/",
"date":"2025-01-13",
"headings":[{"level":1,"id":"wen-ben-kuan-du-he-gao-du","permalink":"https://linxz.online/blog/androidde-wen-ben-kuang-shu-xing/#wen-ben-kuan-du-he-gao-du","title":"文本宽度和高度","children":[]},{"level":1,"id":"bei-jing-se","permalink":"https://linxz.online/blog/androidde-wen-ben-kuang-shu-xing/#bei-jing-se","title":"背景色","children":[{"level":2,"id":"she-zhi-tu-pian-bei-jing","permalink":"https://linxz.online/blog/androidde-wen-ben-kuang-shu-xing/#she-zhi-tu-pian-bei-jing","title":"设置图片背景","children":[]}]},{"level":1,"id":"bian-ju","permalink":"https://linxz.online/blog/androidde-wen-ben-kuang-shu-xing/#bian-ju","title":"边距","children":[{"level":2,"id":"wai-bian-ju-margin","permalink":"https://linxz.online/blog/androidde-wen-ben-kuang-shu-xing/#wai-bian-ju-margin","title":"外边距margin","children":[]},{"level":2,"id":"nei-bian-ju-padding","permalink":"https://linxz.online/blog/androidde-wen-ben-kuang-shu-xing/#nei-bian-ju-padding","title":"内边距 padding","children":[]}]},{"level":1,"id":"que-ding-id","permalink":"https://linxz.online/blog/androidde-wen-ben-kuang-shu-xing/#que-ding-id","title":"确定id","children":[]}],
"body":"文本宽度和高度\nandroid:layout_width和android:layout_height的属性：\n一般三种写法\nmatch_parent\t父容器一样宽\nwrap_content\t包裹内容，内容多宽，它就多宽\n200dp\t固定宽度为200dp\n背景色\nandroid:background=&quot;#f00&quot;是红色背景。\n设置图片背景\nandroid:background=&quot;@mipmap/ic_launcher&quot; 设置图片。\n边距\n外边距margin\nandroid:layout_margin=&quot;20dp&quot;\n内边距 padding\nandroid:padding=&quot;20dp&quot;\n确定id\nid就是titleTableView的意思\nandroid:id=&quot;@+id/titleTv&quot;\n"},{"title":"Android项目的目录结构",
"url":"/blog/androidxiang-mu-de-mu-lu-jie-gou/",
"date":"2025-01-13",
"headings":[{"level":1,"id":"wen-jian-jie-shi","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#wen-jian-jie-shi","title":"文件解释","children":[{"level":2,"id":"appwen-jian-jia","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#appwen-jian-jia","title":"app文件夹","children":[{"level":3,"id":"build","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#build","title":"build","children":[]},{"level":3,"id":"libs","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#libs","title":"libs","children":[]},{"level":3,"id":"src","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#src","title":"src","children":[]},{"level":3,"id":"proguard-rules-pro","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#proguard-rules-pro","title":"proguard-rules.pro","children":[]}]},{"level":2,"id":"gradlewen-jian-jia","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#gradlewen-jian-jia","title":"gradle文件夹","children":[]},{"level":2,"id":"build-gradle","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#build-gradle","title":".build.gradle","children":[]},{"level":2,"id":"gradle-properties","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#gradle-properties","title":"gradle.properties","children":[]},{"level":2,"id":"gradlew","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#gradlew","title":"gradlew","children":[]},{"level":2,"id":"local-properties","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#local-properties","title":"local properties","children":[]},{"level":2,"id":"settings-gradle","permalink":"https://linxz.online/blog/androidxiang-mu-de-mu-lu-jie-gou/#settings-gradle","title":"settings.gradle","children":[]}]}],
"body":"视图中可以选择项目或者Android形式。\n如果是项目，则显示所有文件。\nAndroid的话，则展示项目分类。\n\n文件解释\n\n.gradle和.idea不需要理，编译过程自动生成的。\napp文件夹\n代码写在这里面。\nbuild\n项目生成文件，不用管。\nlibs\n我们使用的第三方的jar包\nsrc\n源代码\n\n\nandroidTest - 手机测试代码\n\n\nmain\n代码和资源文件。\nAndroidManifest.xml会配置安卓四大组件。\njava文件夹是java代码。\nres文件夹是资源，比如图片资源、布局资源、图标等。values有颜色资源，字符串资源和主题资源。\n\n\ntest[unitTest] - 电脑测试代码\n\n\nproguard-rules.pro\n配置文件。配置混淆规则，打正式包才会用到。\ngradle文件夹\n配置gradle版本，是编译器。\ngradle的所有版本\n.build.gradle\n全局的编译配置，注意和app里面的同名文件区分。后者是项目级别的。\ngradle.properties\njvm配置信息等。\ngradlew\ngradlew和gradiew.bat是创建项目自动生成的，不用管。\nlocal properties\nsdk的配置路径\t\nsettings.gradle\n项目使用哪些模块，比如用了app模块\n"},{"title":"如何新建Android的Activity？",
"url":"/blog/ru-he-xin-jian-androidde-activity/",
"date":"2025-01-13",
"headings":[{"level":1,"id":"xin-jian-yi-ge-layout-view","permalink":"https://linxz.online/blog/ru-he-xin-jian-androidde-activity/#xin-jian-yi-ge-layout-view","title":"新建一个Layout view","children":[]},{"level":1,"id":"xin-jian-yi-ge-wen-ben","permalink":"https://linxz.online/blog/ru-he-xin-jian-androidde-activity/#xin-jian-yi-ge-wen-ben","title":"新建一个文本","children":[]},{"level":1,"id":"ru-he-yun-xing-zi-ding-yi-activity","permalink":"https://linxz.online/blog/ru-he-xin-jian-androidde-activity/#ru-he-yun-xing-zi-ding-yi-activity","title":"如何运行自定义Activity？","children":[]}],
"body":"右键-新建-Activity-Empty Activity View\n新建一个Layout view\n&lt;androidx.appcompat.widget.LinearLayoutCompat&gt;\n\n新建一个文本\n&lt;TextView\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;wrap_content&quot;\n    android:text=&quot;你好呀，凡学子&quot; /&gt;\n\n如何运行自定义Activity？\n运行时指定Activity\n\n需要修改res文件夹下的AndroidManifest.xml文件。\n将exported设置为true\n\n"},{"title":"如何拥有自己域名的邮箱？",
"url":"/blog/ru-he-yong-you-zi-ji-yu-ming-de-you-xiang/",
"date":"2025-01-13",
"headings":[],
"body":"首先你需要有个域名，且已经在cloudflare里面解析。\n点击你的域名。\n左侧Email区域，点击Email Routing\ncloudflare可能会发验证邮件到你的邮箱，验证一下即可。\n\n配置一个Catch-All的规则，把所有邮件都导向你的另一个邮箱即可。\n\n教程\n"},{"title":"uni-app创建组件",
"url":"/blog/uni-appchuang-jian-zu-jian/",
"date":"2025-01-13",
"headings":[],
"body":"新建目录components\n右键-新建组件\n注意，组件一般是大写字母开头的。官方组件会用小写和-连接，比如uni-icon\n直接在页面使用即可。\n"},{"title":"uni-app的checkbox使用",
"url":"/blog/uni-appde-checkboxshi-yong/",
"date":"2025-01-13",
"headings":[],
"body":"如果让checkbox的行为影响值，可以使用checkbox-group。\n做法：把checkbox相关的所有标签放入checkbox-group标签内，绑定change事件。\n&lt;template&gt;\n\t&lt;view class=&quot;out&quot;&gt;\n\t\t&lt;checkbox-group @change=&quot;itemChange&quot;&gt;\n\t\t\t&lt;view class=&quot;item&quot; v-for=&quot;(item,index) in goods&quot; :key=&quot;item.id&quot;&gt;\n\t\t\t\t&lt;checkbox :value=&quot;item.id&quot; :checked=&quot;item.checked&quot;&gt;&lt;/checkbox&gt;\n\t\t\t\t&lt;text class=&quot;title&quot;&gt;{{item.name}}&lt;/text&gt;\n\t\t\t\t&lt;text class=&quot;price&quot;&gt;{{item.price}}元&lt;/text&gt;\n\t\t\t\t&lt;text class=&quot;del&quot; @click=&quot;remove(index)&quot;&gt;删除&lt;/text&gt;\n\t\t\t&lt;/view&gt;\n\t\t&lt;/checkbox-group&gt;\n\n\t\t&lt;view class=&quot;card&quot;&gt;\n\t\t\t&lt;view class=&quot;text&quot;&gt;选中{{totalNumber}}个，总价：{{totalPrice}}元&lt;/view&gt;\n\t\t&lt;/view&gt;\n\n\t\t{{selectGroup}}\n\t\t&lt;view&gt;---&lt;/view&gt;\n\t\t{{goods}}\n\t&lt;/view&gt;\n&lt;/template&gt;\n\n&lt;script setup&gt;\n\timport {\n\t\tcomputed,\n\t\tref\n\t} from &quot;vue&quot;;\n\tconst goods = ref([{\n\t\t\tid: &quot;11&quot;,\n\t\t\tname: &quot;小米&quot;,\n\t\t\tprice: 4999,\n\t\t\tchecked: false\n\t\t},\n\t\t{\n\t\t\tid: &quot;22&quot;,\n\t\t\tname: &quot;华为&quot;,\n\t\t\tprice: 6899,\n\t\t\tchecked: false\n\t\t},\n\t\t{\n\t\t\tid: &quot;33&quot;,\n\t\t\tname: &quot;oppo&quot;,\n\t\t\tprice: 2988,\n\t\t\tchecked: false\n\t\t},\n\t\t{\n\t\t\tid: &quot;44&quot;,\n\t\t\tname: &quot;苹果&quot;,\n\t\t\tprice: 9888,\n\t\t\tchecked: false\n\t\t},\n\t])\n\tconst selectGroup = ref([]);\n\tconst totalNumber = computed(() =&gt; selectGroup.value.length)\n\tconst totalPrice = computed(() =&gt; {\n\t\treturn goods.value.filter(item =&gt; item.checked).reduce((prev, curr) =&gt; prev + curr.price, 0)\n\t})\n\n\tfunction remove(index) {\n\t\tgoods.value.splice(index, 1)\n\t}\n\n\tfunction itemChange(e) {\n\t\tselectGroup.value = e.detail.value\n\t\tgoods.value.forEach(item =&gt; {\n\t\t\titem.checked = selectGroup.value.includes(item.id)\n\t\t})\n\t}\n&lt;/script&gt;\n\n&lt;style lang=&quot;scss&quot; scoped&gt;\n\t.out {\n\t\tpadding: 10px;\n\n\t\t.item {\n\t\t\tpadding: 10px 0;\n\n\t\t\t.price {\n\t\t\t\tmargin-left: 30px;\n\t\t\t}\n\n\t\t\t.del {\n\t\t\t\tcolor: #c00;\n\t\t\t\tmargin-left: 30px;\n\t\t\t}\n\t\t}\n\n\t\t.card {\n\t\t\tmargin-top: 30px;\n\t\t\tborder-top: 1px solid #eee;\n\t\t\tpadding: 10px 0;\n\t\t}\n\t}\n&lt;/style&gt;\n\n"},{"title":"uni-app生成安卓app",
"url":"/blog/uni-appsheng-cheng-an-zhuo-app/",
"date":"2025-01-13",
"headings":[{"level":1,"id":"xiu-gai-manifestpei-zhi","permalink":"https://linxz.online/blog/uni-appsheng-cheng-an-zhuo-app/#xiu-gai-manifestpei-zhi","title":"修改manifest配置","children":[]},{"level":1,"id":"shang-chuan-tu-biao","permalink":"https://linxz.online/blog/uni-appsheng-cheng-an-zhuo-app/#shang-chuan-tu-biao","title":"上传图标","children":[]},{"level":1,"id":"qi-dong-jie-mian","permalink":"https://linxz.online/blog/uni-appsheng-cheng-an-zhuo-app/#qi-dong-jie-mian","title":"启动界面","children":[]},{"level":1,"id":"chang-yong-qi-ta-she-zhi","permalink":"https://linxz.online/blog/uni-appsheng-cheng-an-zhuo-app/#chang-yong-qi-ta-she-zhi","title":"常用其他设置","children":[]},{"level":1,"id":"yu-lan","permalink":"https://linxz.online/blog/uni-appsheng-cheng-an-zhuo-app/#yu-lan","title":"预览","children":[]},{"level":1,"id":"fa-xing","permalink":"https://linxz.online/blog/uni-appsheng-cheng-an-zhuo-app/#fa-xing","title":"发行","children":[]}],
"body":"修改manifest配置\n加入app名字等信息\n教程\n上传图标\n点击自动生成所有图标\n\n启动界面\n勾选上使用原生隐私政策提示框\n如果不勾选，不能上架苹果或小米应用商店\n常用其他设置\n如果是模拟器预览，必须勾选x86\n预览\n选择自定义调试基座\n包名必须有唯一性，一般都是倒着的url\n\n使用云端证书\n传统打包\n运行 - 安卓基座 - 自定义基座\n如果发现没有设备可以选择，就是需要安装模拟器。\n国外： Android Studio （需要科学上网）\n国内：雷电、夜神、MuMu（mac可用）、逍遥（mac不可用）、BlueStacks（蓝叠）、腾讯模拟器（手游助手）\n发行\n发行 - 选择正式打包。\n打包需要排队，通常是10分钟左右，也可以充值快一点，20元/次。\n打包完成后会有个临时链接，只能安装5次。当然也可以直接通过链接下载下来。\n我们点击一键上传到uniCloud就可以获取链接多次下载。\n可以在uniCloud后台，点击项目的详情看到链接，通过草料二维码可以生成二维码分享给好友。\n"},{"title":"uni-app使用icons",
"url":"/blog/uni-appshi-yong-icons/",
"date":"2025-01-13",
"headings":[],
"body":"需要使用扩展组件(uni-ui）\nuni-app icons\nuni-app的icon需要跳转，下载安装\n"},{"title":"HbuilderX如何新建模版？",
"url":"/blog/hbuilderxru-he-xin-jian-mo-ban/",
"date":"2025-01-08",
"headings":[{"level":1,"id":"hbuilderxkuai-jie-jian","permalink":"https://linxz.online/blog/hbuilderxru-he-xin-jian-mo-ban/#hbuilderxkuai-jie-jian","title":"HbuilderX快捷键","children":[]}],
"body":"右键新建页面-选择自定义模版-新建一个.vue文件，将模版内容填入即可。\n\nHbuilderX快捷键\n复制上一行\ncmd + shift + r\n"},{"title":"vue监听事件event",
"url":"/blog/vuejian-ting-shi-jian-event/",
"date":"2025-01-08",
"headings":[{"level":1,"id":"kai-guan-switchyuan-su","permalink":"https://linxz.online/blog/vuejian-ting-shi-jian-event/#kai-guan-switchyuan-su","title":"开关switch元素","children":[]}],
"body":"指令为v-on:click=&quot;handler&quot;，简写为@click=&quot;handler&quot;\n如果是uni-app小程序，除了@click，还可以写成@tap=&quot;handler&quot;更直观。\n代码：\n&lt;template&gt;\n\t&lt;view @click=&quot;onClick&quot;&gt;&lt;/view&gt;\n&lt;/template&gt;\n\n&lt;script setup&gt;\nfunction onClick(){\n\tconsole.log(&quot;click!&quot;);\n}\n&lt;/script&gt;\n\n有什么事件可以用？事件映射表\n// 事件映射表，左侧为 WEB 事件，右侧为 ``uni-app`` 对应事件\n\t{\n\t\tclick: &#39;tap&#39;,\n\t\ttouchstart: &#39;touchstart&#39;,\n\t\ttouchmove: &#39;touchmove&#39;,\n\t\ttouchcancel: &#39;touchcancel&#39;,\n\t\ttouchend: &#39;touchend&#39;,\n\t\ttap: &#39;tap&#39;,\n\t\tlongtap: &#39;longtap&#39;, //推荐使用longpress代替\n\t\tinput: &#39;input&#39;,\n\t\tchange: &#39;change&#39;,\n\t\tsubmit: &#39;submit&#39;,\n\t\tblur: &#39;blur&#39;,\n\t\tfocus: &#39;focus&#39;,\n\t\treset: &#39;reset&#39;,\n\t\tconfirm: &#39;confirm&#39;,\n\t\tcolumnchange: &#39;columnchange&#39;,\n\t\tlinechange: &#39;linechange&#39;,\n\t\terror: &#39;error&#39;,\n\t\tscrolltoupper: &#39;scrolltoupper&#39;,\n\t\tscrolltolower: &#39;scrolltolower&#39;,\n\t\tscroll: &#39;scroll&#39;\n\t}\n\n\n开关switch元素\n根据switch的值改变其他元素的值。\n&lt;template&gt;\n\t&lt;switch checked @change=&quot;onChange&quot; /&gt;\n\t&lt;button type=&quot;primary&quot; :loading=&quot;isLoading&quot;&gt;按钮&lt;/button&gt;\n&lt;/template&gt;\n\n&lt;script setup&gt;\nimport {ref} from &#39;vue&#39;;\n\nconst isLoading = ref(false)\n\nfunction onChange(e){\n\tisLoading.value = e.detail.value\n}\n&lt;/script&gt;\n\n"},{"title":"vue列表渲染vue-for",
"url":"/blog/vuelie-biao-xuan-ran-vue-for/",
"date":"2025-01-08",
"headings":[{"level":1,"id":"shu-zu-yong-fa-templatebiao-qian-nei","permalink":"https://linxz.online/blog/vuelie-biao-xuan-ran-vue-for/#shu-zu-yong-fa-templatebiao-qian-nei","title":"数组用法 - template标签内","children":[]},{"level":1,"id":"dui-xiang-yong-fa-templatebiao-qian-nei","permalink":"https://linxz.online/blog/vuelie-biao-xuan-ran-vue-for/#dui-xiang-yong-fa-templatebiao-qian-nei","title":"对象用法- template标签内","children":[]},{"level":1,"id":"lie-biao-yong-fa","permalink":"https://linxz.online/blog/vuelie-biao-xuan-ran-vue-for/#lie-biao-yong-fa","title":"列表用法","children":[]},{"level":1,"id":"wei-shen-me-keyyao-yong-id","permalink":"https://linxz.online/blog/vuelie-biao-xuan-ran-vue-for/#wei-shen-me-keyyao-yong-id","title":"为什么key要用id?","children":[]}],
"body":"数组用法 - template标签内\n&lt;view v-for=&quot;(item,index) in 10&quot; :key=&quot;index&quot;&gt;v-for用法&lt;/view&gt;\n\n对象用法- template标签内\n&lt;view v-for=&quot;item in nba&quot; :key=&quot;item.id&quot;&gt;v-for对象用法&lt;/view)\n\n列表用法\n&lt;ul&gt;\n\t&lt;template v-for=&quot;item in items&quot;&gt;\n\t\t&lt;li&gt;{{ item.msg }}&lt;/li&gt;\n\t&lt;/template&gt;\n&lt;/ul&gt;\n\n为什么key要用id?\n删除数组后元素会错位。\n视频讲解\n"},{"title":"vue条件渲染if..else...",
"url":"/blog/vuetiao-jian-xuan-ran-if-else/",
"date":"2025-01-08",
"headings":[{"level":1,"id":"yu-v-showde-qu-bie","permalink":"https://linxz.online/blog/vuetiao-jian-xuan-ran-if-else/#yu-v-showde-qu-bie","title":"与v-show的区别","children":[]},{"level":1,"id":"ru-guo-bu-xiang-ying-xiang-ye-mian-jie-gou","permalink":"https://linxz.online/blog/vuetiao-jian-xuan-ran-if-else/#ru-guo-bu-xiang-ying-xiang-ye-mian-jie-gou","title":"如果不想影响页面结构","children":[]}],
"body":"v-if, v-else-if, v-else属性控制。\n注意，这几个元素之间不能插入其他元素，否则会报错。\n&lt;template&gt;\n\t&lt;view class=&quot;&quot;&gt;\n\t\t&lt;view v-if=&quot;num===1&quot;&gt;老大&lt;/view&gt;\n\t\t&lt;view v-else-if=&quot;num===2&quot;&gt;老二&lt;/view&gt;\n\t\t&lt;view v-else&gt;老三&lt;/view&gt;\n\t&lt;/view&gt;\n&lt;/template&gt;\n\n&lt;script setup&gt;\n\timport {ref} from &#39;vue&#39;;\n\tconst num = ref(3)\n&lt;/script&gt;\n\n与v-show的区别\nv-if不满足条件，不会出现在dom界面，节省加载资源的时间；\nv-show不满足条件，还是会出现，用display:none的方式隐藏，因此也会加载资源。\n如果不想影响页面结构\n可以用&lt;template&gt;标签包裹，和微信开发平台的&lt;block&gt;标签是一样作用的，不会在dom显示出来结构。\n"},{"title":"如何创建uni-app项目",
"url":"/blog/ru-he-chuang-jian-uni-appxiang-mu/",
"date":"2025-01-07",
"headings":[{"level":1,"id":"hbuilderx","permalink":"https://linxz.online/blog/ru-he-chuang-jian-uni-appxiang-mu/#hbuilderx","title":"HBuilderX","children":[{"level":2,"id":"xin-jian-xiang-mu","permalink":"https://linxz.online/blog/ru-he-chuang-jian-uni-appxiang-mu/#xin-jian-xiang-mu","title":"新建项目","children":[]},{"level":2,"id":"zen-me-rang-xiang-mu-zai-wei-xin-kai-fa-gong-ju-yun-xing","permalink":"https://linxz.online/blog/ru-he-chuang-jian-uni-appxiang-mu/#zen-me-rang-xiang-mu-zai-wei-xin-kai-fa-gong-ju-yun-xing","title":"怎么让项目在微信开发工具运行？","children":[]},{"level":2,"id":"xiao-cheng-xu-yun-xing","permalink":"https://linxz.online/blog/ru-he-chuang-jian-uni-appxiang-mu/#xiao-cheng-xu-yun-xing","title":"小程序运行","children":[]},{"level":2,"id":"wei-xin-shou-ji-yu-lan-fen-chi-chuang-kou","permalink":"https://linxz.online/blog/ru-he-chuang-jian-uni-appxiang-mu/#wei-xin-shou-ji-yu-lan-fen-chi-chuang-kou","title":"微信手机预览分离窗口","children":[]},{"level":2,"id":"shou-ji-yu-lan","permalink":"https://linxz.online/blog/ru-he-chuang-jian-uni-appxiang-mu/#shou-ji-yu-lan","title":"手机预览","children":[]}]},{"level":1,"id":"ming-ling-xing-chuang-jian","permalink":"https://linxz.online/blog/ru-he-chuang-jian-uni-appxiang-mu/#ming-ling-xing-chuang-jian","title":"命令行创建","children":[{"level":2,"id":"xia-zai-yi-lai","permalink":"https://linxz.online/blog/ru-he-chuang-jian-uni-appxiang-mu/#xia-zai-yi-lai","title":"下载依赖","children":[]}]}],
"body":"HBuilderX\n下载地址\n类似于vscode的开发工具。\n为什么要使用新的工具？因为HBuildX和uni-app都是属于Dcloud公司的产品。\n新建项目\n记住：选择vue3的版本\n\n如果需要开发app，就要勾选uni-app x\n怎么让项目在微信开发工具运行？\n工具 - 插件安装- 安装新插件 - uniapp(vue3)编译器\n小程序运行\n运行 - 小程序模拟器\n\n微信手机预览分离窗口\n点击分离窗口，然后把微信开发工具最小化即可。\n\n手机预览\n需要在manifest.json里面设置AppID\n\n命令行创建\n官方教程\nnpx degit &quot;dcloudio/uni-preset-vue#vite&quot; my-uniapp\n\n如果是ts项目\nnpx degit &quot;dcloudio/uni-preset-vue#vite-ts&quot; my-vue3-project\n\n如果网络不给力，可以使用代理\ngit config --global http.proxy http://127.0.0.1:1087\ngit config --global https.proxy http://127.0.0.1:1087\n\n下载依赖\n如果要预览，需要下载编译器，它在依赖中。\n安装国内源pnpm\nnpm install -g pnpm\n\n安装依赖\npnpm i\n\n注意：需要在manifest.json里面设置AppID\n微信预览命令\npnpm dev:mp-weixin\n\n生成dist/div/mp-weixin文件夹，需要在微信开发工具中导入。\n"},{"title":"uni-app保持图片宽高比的方式",
"url":"/blog/uni-appbao-chi-tu-pian-kuan-gao-bi-de-fang-shi/",
"date":"2025-01-07",
"headings":[],
"body":"主要是mode属性控制，可查看官方文档\n\n一般用aspectFit（会留白）和aspectFill（常用，不留白）\n&lt;image mode=&quot;aspectFill&quot; /&gt;\n\n"},{"title":"uni-app的input输入框",
"url":"/blog/uni-appde-inputshu-ru-kuang/",
"date":"2025-01-07",
"headings":[{"level":1,"id":"maxlengthshu-xing","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#maxlengthshu-xing","title":"maxlength属性","children":[]},{"level":1,"id":"confirm-typeshu-xing","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#confirm-typeshu-xing","title":"confirm-type属性","children":[]},{"level":1,"id":"an-niu-buttonzhi-shi","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#an-niu-buttonzhi-shi","title":"按钮button知识","children":[]},{"level":1,"id":"huo-qu-jiao-dian-he-chi-kai-jiao-dian","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#huo-qu-jiao-dian-he-chi-kai-jiao-dian","title":"获取焦点和离开焦点","children":[]},{"level":1,"id":"biao-dan-shuang-xiang-bang-ding-shu-ju-v-model","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#biao-dan-shuang-xiang-bang-ding-shu-ju-v-model","title":"表单双向绑定数据v-model","children":[{"level":2,"id":"huo-qu-inputfan-hui-zhi-de-fang-fa-fu-za-fang-fa","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#huo-qu-inputfan-hui-zhi-de-fang-fa-fu-za-fang-fa","title":"获取input返回值的方法 - 复杂方法","children":[]},{"level":2,"id":"huo-qu-inputfan-hui-zhi-jian-dan-fang-fa","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#huo-qu-inputfan-hui-zhi-jian-dan-fang-fa","title":"获取input返回值 - 简单方法","children":[]}]},{"level":1,"id":"que-ren-shi-jian-confirm","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#que-ren-shi-jian-confirm","title":"确认事件@confirm","children":[{"level":2,"id":"shu-zu-inputkuang-an-li-jin-qi-re-geng","permalink":"https://linxz.online/blog/uni-appde-inputshu-ru-kuang/#shu-zu-inputkuang-an-li-jin-qi-re-geng","title":"数组input框案例 - 近期热梗","children":[]}]}],
"body":"官方input组件文档\nmaxlength属性\n默认是140个字符。\n一般设置为-1，指用户可以无限输入。\nconfirm-type属性\n可以改变键盘确认键。\nsend， next，search，go，done\n按钮button知识\nplain属性有镂空效果。\n获取焦点和离开焦点\n@focus, @blur，分别在获取焦点和离开焦点的时候触发，e.detail.value就是input框里面的值，可以做逻辑判断。比如用户点击输入框，出现一只小动物在输入框上。\n表单双向绑定数据v-model\n获取input返回值的方法 - 复杂方法\n通过@input属性\n&lt;input :value=&quot;iptValue&quot; @input=&quot;e =&gt; iptValue = e.detail.value&quot; /&gt;\n\n&lt;script setup&gt;\nimport {ref} from &quot;vue&quot;;\nconst iptValue = ref(&quot;&quot;);\n&lt;/script&gt;\n\n获取input返回值 - 简单方法\n通过v-model。其实是复杂方式的语法糖。\n&lt;input v-model=&quot;iptValue&quot; /&gt;\n\n&lt;script setup&gt;\nimport {ref} from &quot;vue&quot;;\nconst iptValue = ref(&quot;&quot;);\n&lt;/script&gt;\n\n确认事件@confirm\n需要在script标签下自定义onConfirm函数，在点击确定或者手机键盘中的发送键触发。\n&lt;input @confirm=&quot;onConfirm&quot;&gt;\n\n数组input框案例 - 近期热梗\n&lt;template&gt;\n\t&lt;view class=&quot;title&quot;&gt;\n\t    近期热梗\n\t&lt;/view&gt;\n\t\n\t&lt;view class=&quot;out&quot;&gt;\t  \n\t  &lt;view class=&quot;list&quot;&gt;\n\t    &lt;view class=&quot;row&quot; v-for=&quot;(item,index) in lists&quot; :key=&quot;item.id&quot;&gt;\n\t      &lt;view class=&quot;text&quot;&gt;{{index+1}}. {{item.title}}&lt;/view&gt;\n\t      &lt;view class=&quot;close&quot; @click=&quot;onClose(index)&quot;&gt;\n\t        &lt;icon type=&quot;clear&quot; size=&quot;26&quot;/&gt;\n\t      &lt;/view&gt;\n\t    &lt;/view&gt;\n\t  &lt;/view&gt;\t\n\t  &lt;view class=&quot;count&quot;&gt;\n\t    共{{lists.length}}条梗\n\t  &lt;/view&gt;\t\n\t  &lt;view class=&quot;comment&quot;&gt;\n\t    &lt;input type=&quot;text&quot; \n\t    placeholder=&quot;请输入热梗...&quot;\t\n\t\tv-model=&quot;iptValut&quot;\n\t\t@confirm=&quot;onSubmit&quot;\n\t    /&gt;    \n\t    &lt;button size=&quot;mini&quot; type=&quot;primary&quot; :disabled=&quot;!iptValut.length&quot;  \n\t\t@click=&quot;onSubmit&quot;\n\t    &gt;发布&lt;/button&gt;\n\t  &lt;/view&gt;\t  \n\t  \n\t&lt;/view&gt;\n&lt;/template&gt;\n\n&lt;script setup&gt;\nimport {ref} from &quot;vue&quot;;\nconst lists = ref([\n\t{id:111,title:&quot;刚满18岁&quot;},\n\t{id:222,title:&quot;我不吃牛肉&quot;},\n\t{id:333,title:&quot;遥遥领先&quot;},\n\t{id:444,title:&quot;哪里贵了&quot;}\n])\n\nconst iptValut = ref(&quot;&quot;);\n\nconst onClose = function(index){\t\n\tlists.value.splice(index,1);\n}\n\nconst onSubmit= function(){\n\tlists.value.push({id:Date.now(),title:iptValut.value});\t\n\tiptValut.value = &#39;&#39;;\n}\n\n&lt;/script&gt;\n\n&lt;style lang=&quot;scss&quot; scoped&gt;\n.title{\n  font-size: 26px;\n  text-align: center;\n  color:#3c3c3c;\n  padding:30px 0 15px;\n}\n.out{\n  width: 90vw;\n  margin:15px auto;\n  box-shadow: 0 10px 20px rgba(0,0,0,0.1);\n  border-radius: 5px;\n  padding:15px;\n  box-sizing: border-box;\n  .list{\n\t  .row{\n\t\t  padding:10px 0;\n\t\t  border-bottom:1px solid #e8e8e8;\n\t\t  display: flex;\n\t\t  justify-content: space-between;\n\t\t  align-items: center;\n\t\t  font-size: 18px;\n\t\t  color:#333;\n\t\t  .text{\n\t\t\t  padding-right: 5px;\n\t\t\t  box-sizing: border-box;\n\t\t  }\n\t  }\n  }\n  .count{\n    padding:10px 0;\n    font-size: 15px;\n    color:#888;\n    text-align:center;\n  }\n  .comment{\n    display: flex;\n    margin-top:10px;\n\tinput{\n\t  flex:4;\n\t  background: #f4f4f4;\n\t  margin-right: 5px;\n\t  height: 100%; \n\t  height: 32px;\n\t  border-radius: 4px;\n\t  padding:0 10px;\n\t  color:#333;\n\t}\n\tbutton{\n\t  flex:1;\t  \n\t}\n  }  \n}\n\n&lt;/style&gt;\n\n\n"},{"title":"uni-app组件知识",
"url":"/blog/uni-appzu-jian-zhi-shi/",
"date":"2025-01-07",
"headings":[{"level":1,"id":"biao-qian-zu-jian","permalink":"https://linxz.online/blog/uni-appzu-jian-zhi-shi/#biao-qian-zu-jian","title":"标签（组件）","children":[]},{"level":1,"id":"scroll-view","permalink":"https://linxz.online/blog/uni-appzu-jian-zhi-shi/#scroll-view","title":"scroll-view","children":[{"level":2,"id":"yuan-su-tong-yi-xing-xian-shi-bu-huan-xing","permalink":"https://linxz.online/blog/uni-appzu-jian-zhi-shi/#yuan-su-tong-yi-xing-xian-shi-bu-huan-xing","title":"元素同一行显示，不换行","children":[]}]},{"level":1,"id":"swiper","permalink":"https://linxz.online/blog/uni-appzu-jian-zhi-shi/#swiper","title":"swiper","children":[{"level":2,"id":"zhan-yong-ping-mu-suo-you-kuan-du","permalink":"https://linxz.online/blog/uni-appzu-jian-zhi-shi/#zhan-yong-ping-mu-suo-you-kuan-du","title":"占用屏幕所有宽度","children":[]}]}],
"body":"标签（组件）\nview标签和text标签区别。\ntext标签可以选中文字（增加selectable属性），但是view不支持选中文字。\nscroll-view\nscroll-x 允许横向滚动\nscroll-y 允许纵向滚动\n元素同一行显示，不换行\n.scrollView{\n\twhite-space: nowrap; /*不换行*/\n\t.box{\n\t\tdisplay: inline-block /*同一行显示，block指分行显示*/\n\t}\n}\n\n## 使用scss\n\n```vue\n&lt;style lang=&quot;scss&quot;&gt;\n&lt;/style&gt;\n\nswiper\n横向轮播图效果\n&lt;swiper&gt;\n\t&lt;swiper-item&gt;&lt;/swiper-item&gt;\n&lt;/swiper&gt;\n\n占用屏幕所有宽度\nswiper{\n\twidth: 100vw; /*高度是vh*/\n}\n\n"},{"title":"Vue3基础知识",
"url":"/blog/vue3ji-chu-zhi-shi/",
"date":"2025-01-07",
"headings":[{"level":1,"id":"hua-gua-hao-ke-yi-xie-biao-da-shi-xu-yao-you-fan-hui-zhi","permalink":"https://linxz.online/blog/vue3ji-chu-zhi-shi/#hua-gua-hao-ke-yi-xie-biao-da-shi-xu-yao-you-fan-hui-zhi","title":"花括号可以写表达式（需要有返回值）","children":[]},{"level":1,"id":"han-shu-ji-ben-diao-yong","permalink":"https://linxz.online/blog/vue3ji-chu-zhi-shi/#han-shu-ji-ben-diao-yong","title":"函数基本调用","children":[]},{"level":1,"id":"xiang-ying-shi-shu-ju-ye-mian-xuan-ran","permalink":"https://linxz.online/blog/vue3ji-chu-zhi-shi/#xiang-ying-shi-shu-ju-ye-mian-xuan-ran","title":"响应式数据（页面渲染）","children":[]},{"level":1,"id":"shu-xing-shi-yong-scriptzhong-de-bian-liang","permalink":"https://linxz.online/blog/vue3ji-chu-zhi-shi/#shu-xing-shi-yong-scriptzhong-de-bian-liang","title":"属性使用script中的变量","children":[{"level":2,"id":"shu-xing-fang-biao-da-shi-ye-xu-yao-yong-v-bind","permalink":"https://linxz.online/blog/vue3ji-chu-zhi-shi/#shu-xing-fang-biao-da-shi-ye-xu-yao-yong-v-bind","title":"属性放表达式也需要用v-bind:","children":[{"level":3,"id":"nei-lian-yang-shi","permalink":"https://linxz.online/blog/vue3ji-chu-zhi-shi/#nei-lian-yang-shi","title":"内联样式","children":[]}]},{"level":2,"id":"ru-he-rang-tu-pian-xun-huan-bo-fang","permalink":"https://linxz.online/blog/vue3ji-chu-zhi-shi/#ru-he-rang-tu-pian-xun-huan-bo-fang","title":"如何让图片循环播放？","children":[]}]}],
"body":"官方快速上手\n以下是uni-app的语法示范：\n花括号可以写表达式（需要有返回值）\n&lt;template&gt;\n    {{ 2+3 }}\n    {{ a + 5 }}\n    {{ Date.now() }}\n    {{ Math.random() }}\n    {{ 1&lt;2 ? &#39;张三&#39; : &#39;李四&#39; }}\n&lt;/template&gt;\n\n函数基本调用\n函数声明：\n&lt;script setup&gt;\n\tfunction sayHello(){\n\t\treturn &quot;hello world&quot;\n\t}\n&lt;/script&gt;\n\n调用：\n&lt;view&gt;{{\\ sayHello() }}&lt;/view&gt;\n\n响应式数据（页面渲染）\n需要用ref。\n&lt;script setup&gt;\n\timport {ref} from &#39;vue&#39;;\n\n\tlet name = ref(&#39;linxz&#39;);\n\n\tfunction changeName() {\n\t\tname.value = &#39;Mary&#39;; \n\t}\n&lt;/script&gt;\n\n使用ref()的时候，取值必须通过.value完成。\n而针对对象，可以用reactive()，取值就不用加.value。不过开发中一般都是用ref()，容易记。\nlet car = reactive({ brand: &#39;benz&#39;, price: 100 })\n\n属性使用script中的变量\n使用v-bind:，或者简写方式-冒号:\n&lt;image v-bind:src=&quot;picUrl /&gt;\n//简写方式\n&lt;image :src=&quot;picUrl /&gt;\n\n&lt;script&gt;\nimport {ref} from &quot;vue&quot;;\n\ncosnt picUrl = ref(&quot;../../static/pic1.png&quot;)\n&lt;/script&gt;\n\n属性放表达式也需要用v-bind:\n&lt;div :class=&quot;{active: isActive}&quot;&gt;&lt;/div&gt;\n\n常见应用：\n若条件为true时，添加.active，否则啥也不加。\n&lt;view class=&quot;box&quot; :class=&quot;true?&#39;active&#39;:&#39;&#39;&quot;&gt;&lt;/view&gt;\n\n内联样式\n&lt;view style=&quot;width: 300px&quot;&gt;&lt;/view&gt;\n\n如果需要用变量。\n注意，纯数字比如300是不用打引号的，300px这样的表达才需要。\n&lt;view :style=&quot;{width: &#39;300px&#39;}&quot;&gt;&lt;/view&gt;\n\n如何让图片循环播放？\n取余操作即可。\nimport {ref} from &quot;vue&quot;;\nconst arrs = ref([&quot;url1&quot;, &quot;url2&quot;, &quot;url3&quot;,&quot;url4&quot;])\n\nlet i = 0;\nsetInterval(()=&gt;{\n\ti++;\n\tpicUrl.value = arrs.value[i%4]\n})\n\n"},{"title":"如何在vscode里面允许json注释",
"url":"/blog/ru-he-zai-vscodeli-mian-yun-xu-jsonzhu-shi/",
"date":"2025-01-06",
"headings":[],
"body":"一般不允许注释。\n在设置将.json改成.jsonc\n设置-文件关联-添加\n\n"},{"title":"uni-app小程序预览图片功能",
"url":"/blog/uni-appxiao-cheng-xu-yu-lan-tu-pian-gong-neng/",
"date":"2025-01-06",
"headings":[],
"body":"在uni-app使用uni.previewImage，如果只开发小程序，可以用wx.previewImage。\n&lt;template&gt;\n&lt;swiper indicator-dots circular autoplay&gt;\n\t&lt;swiper-item v-for=&quot;item in pictures&quot; :key=&quot;item.id&quot;&gt;\n\t\t&lt;image @tap=&quot;onPreviewImage(item.url)&quot; :src=&quot;item.url&quot;&gt;&lt;/image&gt;\n\t&lt;/swiper-item&gt;\n&lt;/swiper&gt;\n&lt;/template&gt;\n\n&lt;script&gt;\n\tdata(){\n\t\treturn{\n\t\t\tpictures: [\n\t\t\t\t{ id: &#39;1&#39;, url: &#39;https://xxxx&#39;},\n\t\t\t\t...\n\t\t\t]\n\t\t}\n\t}\n\n\tmethods: {\n\t\tonPreviewImage(url){\n\t\t\tuni.previewImage({\n\t\t\t\turls: this.pictures.map(v=&gt;v.url),\n\t\t\t\tcurrent: url\n\t\t\t})\n\t\t}\n\t}\n&lt;/script&gt;\n\n\n"},{"title":"vue2和vue3语法区别",
"url":"/blog/vue2he-vue3yu-fa-qu-bie/",
"date":"2025-01-06",
"headings":[{"level":1,"id":"vue3","permalink":"https://linxz.online/blog/vue2he-vue3yu-fa-qu-bie/#vue3","title":"vue3","children":[]},{"level":1,"id":"vue2","permalink":"https://linxz.online/blog/vue2he-vue3yu-fa-qu-bie/#vue2","title":"vue2","children":[]}],
"body":"vue3\n&lt;script setup&gt;\n\timport {ref} from &#39;vue&#39;;\n\n\t// 使用 ref 来确保数据是响应式的\n\tlet name = ref(&#39;linxz&#39;);\n\n\tfunction changeName() {\n\t\tname.value = &#39;Mary&#39;; \n\t}\n&lt;/script&gt;\n\nvue2\n&lt;script&gt;\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tname: &#39;linxz&#39;\n\t\t};\n\t},\n\tmethods: {\n\t\tchangeName() {\n\t\t\tthis.name = &#39;Mary&#39;; \n\t\t}\n\t}\n};\n&lt;/script&gt;\n\n"},{"title":"用vscode开发uni-app项目",
"url":"/blog/yong-vscodekai-fa-uni-appxiang-mu/",
"date":"2025-01-06",
"headings":[{"level":1,"id":"an-zhuang-uni-appxi-lie-cha-jian","permalink":"https://linxz.online/blog/yong-vscodekai-fa-uni-appxiang-mu/#an-zhuang-uni-appxi-lie-cha-jian","title":"安装uni-app系列插件","children":[]},{"level":1,"id":"tslei-xing-xiao-yan","permalink":"https://linxz.online/blog/yong-vscodekai-fa-uni-appxiang-mu/#tslei-xing-xiao-yan","title":"ts类型校验","children":[{"level":2,"id":"an-zhuang-lei-xing-sheng-ming-wen-jian","permalink":"https://linxz.online/blog/yong-vscodekai-fa-uni-appxiang-mu/#an-zhuang-lei-xing-sheng-ming-wen-jian","title":"安装类型声明文件","children":[]},{"level":2,"id":"pei-zhi-tsconfig-json","permalink":"https://linxz.online/blog/yong-vscodekai-fa-uni-appxiang-mu/#pei-zhi-tsconfig-json","title":"配置tsconfig.json","children":[]}]}],
"body":"为什么用vscode？\n因为HbuilderX对TS类型支持不完善，vscode更友好。\n安装uni-app系列插件\nuni-create-view\nuni-helper\nuniapp小程序扩展\n\nts类型校验\n安装类型声明文件\ngithub仓库地址\npnpm i -D @types/wechat-miniprogram @uni-helper/uni-app-types\n\n配置tsconfig.json\n主要是加了两个types和一个vueCompilerOptions。\ncompilerOptions报错\n{\n  &quot;extends&quot;: &quot;@vue/tsconfig/tsconfig.json&quot;,\n  &quot;compilerOptions&quot;: {\n    &quot;ignoreDeprecations&quot;: &quot;5.0&quot;,\n    &quot;preserveValueImports&quot;: false,\n    &quot;importsNotUsedAsValues&quot;: &quot;remove&quot;,\n    &quot;verbatimModuleSyntax&quot;: true,\n    &quot;sourceMap&quot;: true,\n    &quot;baseUrl&quot;: &quot;.&quot;,\n    &quot;paths&quot;: {\n      &quot;@/*&quot;: [&quot;./src/*&quot;]\n    },\n    &quot;lib&quot;: [&quot;esnext&quot;, &quot;dom&quot;],\n    &quot;types&quot;: [\n      &quot;@dcloudio/types&quot;,\n      &quot;@types/wechat-miniprogram&quot;,\n      &quot;@uni-helper/uni-app-types&quot;\n    ]\n  },\n  &quot;vueCompilerOptions&quot;: {\n    &quot;plugins&quot;: [&quot;@uni-helper/uni-app-types/volar-plugin&quot;]\n  },\n  &quot;include&quot;: [&quot;src/**/*.ts&quot;, &quot;src/**/*.d.ts&quot;, &quot;src/**/*.tsx&quot;, &quot;src/**/*.vue&quot;]\n}\n\n"},{"title":"uni-app的page.json介绍",
"url":"/blog/uni-appde-page-jsonjie-shao/",
"date":"2025-01-03",
"headings":[{"level":1,"id":"ge-wen-jian-de-gong-neng","permalink":"https://linxz.online/blog/uni-appde-page-jsonjie-shao/#ge-wen-jian-de-gong-neng","title":"各文件的功能","children":[]},{"level":1,"id":"dai-ma-li-zi","permalink":"https://linxz.online/blog/uni-appde-page-jsonjie-shao/#dai-ma-li-zi","title":"代码例子：","children":[]}],
"body":"各文件的功能\n\npage.json主要用来配置页面路由、导航栏、tabBar等页面信息。\n注意：图标属于静态资源，必须放到static文件夹。\n\n代码例子：\n{\n\t&quot;pages&quot;: [ //pages数组中第一项表示应用启动页，参考：https://uniapp.dcloud.io/collocation/pages\n\t\t{\n\t\t\t&quot;path&quot;: &quot;pages/index/index&quot;,\n\t\t\t&quot;style&quot;: {\n\t\t\t\t&quot;navigationBarTitleText&quot;: &quot;首页&quot;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t&quot;path&quot; : &quot;pages/my/my&quot;,\n\t\t\t&quot;style&quot; : \n\t\t\t{\n\t\t\t\t&quot;navigationBarTitleText&quot; : &quot;我的&quot;\n\t\t\t}\n\t\t}\n\t],\n\t&quot;globalStyle&quot;: {\n\t\t&quot;navigationBarTextStyle&quot;: &quot;white&quot;,\n\t\t&quot;navigationBarTitleText&quot;: &quot;uni-app&quot;,\n\t\t&quot;navigationBarBackgroundColor&quot;: &quot;#27ba9b&quot;,\n\t\t&quot;backgroundColor&quot;: &quot;#27ba9b&quot;\n\t},\n\t&quot;tabBar&quot;: {\n\t\t&quot;selectedColor&quot;: &quot;27ba9b&quot;,\n\t\t&quot;list&quot;: [\n\t\t\t{\n\t\t\t\t&quot;pagePath&quot;: &quot;pages/index/index&quot;,\n\t\t\t\t&quot;text&quot;: &quot;首页&quot;,\n\t\t\t\t&quot;iconPath&quot;: &quot;/static/tabs/home.png&quot;,\n\t\t\t\t&quot;selectedIconPath&quot;: &quot;/static/tabs/home-selected.png&quot;\n\t\t\t},\n\t\t\t{\n\t\t\t\t&quot;pagePath&quot;: &quot;pages/my/my&quot;,\n\t\t\t\t&quot;text&quot;: &quot;我的&quot;,\n\t\t\t\t&quot;iconPath&quot;: &quot;/static/tabs/my.png&quot;,\n\t\t\t\t&quot;selectedIconPath&quot;: &quot;/static/tabs/my-selected.png&quot;\n\t\t\t}\n\t\t]\n\t},\n\t&quot;uniIdRouter&quot;: {}\n}\n\n\n"},{"title":"微信开放能力",
"url":"/blog/wei-xin-kai-fang-neng-li/",
"date":"2025-01-03",
"headings":[{"level":1,"id":"huo-qu-yong-hu-tou-xiang","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#huo-qu-yong-hu-tou-xiang","title":"获取用户头像","children":[{"level":2,"id":"wxml","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#wxml","title":"wxml","children":[]},{"level":2,"id":"js","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#js","title":"js","children":[]}]},{"level":1,"id":"huo-qu-wei-xin-yong-hu-ni-cheng","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#huo-qu-wei-xin-yong-hu-ni-cheng","title":"获取微信用户昵称","children":[{"level":2,"id":"wxml-1","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#wxml-1","title":"wxml","children":[]},{"level":2,"id":"js-1","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#js-1","title":"js","children":[]}]},{"level":1,"id":"shi-xian-zhuan-fa-gong-neng","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#shi-xian-zhuan-fa-gong-neng","title":"实现转发功能","children":[{"level":2,"id":"wxml-2","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#wxml-2","title":"wxml","children":[]},{"level":2,"id":"js-2","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#js-2","title":"js","children":[]}]},{"level":1,"id":"fen-xiang-dao-peng-you-quan","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#fen-xiang-dao-peng-you-quan","title":"分享到朋友圈","children":[]},{"level":1,"id":"huo-qu-yan-zheng-de-shou-ji-hao","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#huo-qu-yan-zheng-de-shou-ji-hao","title":"获取验证的手机号","children":[{"level":2,"id":"wxml-3","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#wxml-3","title":"wxml","children":[]},{"level":2,"id":"js-3","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#js-3","title":"js","children":[]}]},{"level":1,"id":"ke-fu-gong-neng","permalink":"https://linxz.online/blog/wei-xin-kai-fang-neng-li/#ke-fu-gong-neng","title":"客服功能","children":[]}],
"body":"获取用户头像\n\nbutton组件open-type属性设置为chooseAvatar。\n通过bindchooseavatar事件回调获取到头像的临时路径。注意，上线版要把临时路径上传到公司的服务器，因为临时路径会有失效时间。\n\nwxml\n&lt;view&gt;\n  &lt;button class=&quot;btn&quot; open-type=&quot;chooseAvatar&quot; bindchooseavatar=&quot;chooseAvatar&quot;&gt;\n    &lt;image class=&quot;avatar&quot; src=&quot;{{avatarUrl}}&quot; mode=&quot;&quot;/&gt;\n  &lt;/button&gt;\n&lt;/view&gt;\n\n\njs\n  Page({\n    data: {\n      avatarUrl: &quot;../../assets/Jerry.png&quot; //默认头像\n    },\n\n    // 获取微信头像\n    chooseAvatar(event){\n\n      const {avatarUrl} = event.detail\n\n      this.setData({\n        avatarUrl\n      })\n    }\n\n  })\n\n获取微信用户昵称\n\n通过form组件包裹input组件和form-type为submit的button组件\ninput组件type设置为nickname，用户输入框输入时，键盘上方会展示微信昵称\n给form绑定submit事件，在事件处理函数中通过事件对象获取用户昵称\n\nwxml\n&lt;form bindsubmit=&quot;onSubmit&quot;&gt;\n  &lt;input type=&quot;nickname&quot; name=&quot;nickname&quot; placeholder=&quot;请输入昵称&quot;/&gt;\n  &lt;button type=&quot;primary&quot; plain form-type=&quot;submit&quot;&gt;点击获取昵称&lt;/button&gt;\n&lt;/form&gt;\n\njs\n    onSubmit(event){\n      // console.log(event)\n      const {nickname} = event.detail.value;\n      console.log(nickname) //获取后发给后端，后端进行存储即可\n    }\n\n实现转发功能\n有两种方式。\n\n页面.js文件必须声明 onShareAppMessage监听函数。声明后转发按钮由灰色变成绿色，允许转发。\n通过button组件设置open-type=&quot;share&quot;，用户点击按钮后触发Page.onShareAppMessage事件监听函数。\n\nwxml\n&lt;button open-type=&quot;share&quot;&gt;转发&lt;/button&gt;\n\njs\n    onShareAppMessage(obj){\n      console.log(obj)\n\n      // 自定义转发内容，也可以不写\n      return {\n        title: &quot;这是一个标题&quot;,\n        // path: &#39;/pages/cart/cart&#39;,\n        imageUrl: &#39;../../assets/Jerry.png&#39;\n      }\n    }\n\n分享到朋友圈\n注意，要开启微信认证才能获得分享功能，要交钱。在微信公众平台，即小程序后台提交认证。\n\n页面设置允许“发送给朋友”，页面.js声明onShareAppMessage\n页面设置允许“分享到朋友圈”，页面.js声明onShareTimeline\n\n    onShareTimeline(){\n      //自定义分享内容\n      return{\n        title: &#39;帮我砍一刀&#39;,\n        query: &#39;id=1&#39;,\n        imageUrl: &#39;../../assets/Jerry.png&#39;\n      }\n    }\n\n获取验证的手机号\n注意：接口仅针对非个人开发者，且需要完成认证。需要付费使用，每个账号有1000次体验额度。\n快速验证组件和实时验证组件。实时验证组件需要验证码。\n\n注意：生产环境中，需要event.detail.code来保存用户手机号的密钥，后端接到后，也需要调用api来解析手机号。\nwxml\n&lt;button\ntype=&quot;primary&quot;\nplain\nopen-type=&quot;getPhoneNumber&quot;\nbindgetphonenumber=&quot;getPhoneNumber&quot;\n&gt;快速验证手机号组件&lt;/button&gt;\n&lt;button\ntype=&quot;warn&quot; \nplain\nopen-type=&quot;getRealtimePhoneNumber&quot;\nbindgetrealtimephonenumber=&quot;getRealtimePhoneNumber&quot;\n&gt;实时验证手机号组件&lt;/button&gt;\n\njs\n    // 快速获取手机号\n    getPhoneNumber(event){\n      console.log(event)\n    },\n\n    // 实时获取手机号\n    getRealtimePhoneNumber(event){\n      console.log(event)\n    }\n\n客服功能\n\nbutton的open-type属性设置为contact\n微信公众后台，绑定客服账号，可以登录网页端客户 或者 移动端客服接收、发送客服信息。\n\n\n"},{"title":"小程序分包加载",
"url":"/blog/xiao-cheng-xu-fen-bao-jia-zai/",
"date":"2025-01-03",
"headings":[{"level":1,"id":"pei-zhi-fen-bao","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#pei-zhi-fen-bao","title":"配置分包","children":[{"level":2,"id":"app-json","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#app-json","title":"app.json","children":[]},{"level":2,"id":"zen-me-zhi-dao-fen-bao-shi-fou-cheng-gong","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#zen-me-zhi-dao-fen-bao-shi-fou-cheng-gong","title":"怎么知道分包是否成功","children":[]},{"level":2,"id":"dao-hang-dao-fen-bao-ye-mian","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#dao-hang-dao-fen-bao-ye-mian","title":"导航到分包页面","children":[]},{"level":2,"id":"fen-bao-he-yin-yong-yuan-ze","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#fen-bao-he-yin-yong-yuan-ze","title":"分包和引用原则","children":[]}]},{"level":1,"id":"du-li-fen-bao","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#du-li-fen-bao","title":"独立分包","children":[{"level":2,"id":"app-json-1","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#app-json-1","title":"app.json","children":[]}]},{"level":1,"id":"fen-bao-yu-xia-zai","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#fen-bao-yu-xia-zai","title":"分包预下载","children":[{"level":2,"id":"app-json-2","permalink":"https://linxz.online/blog/xiao-cheng-xu-fen-bao-jia-zai/#app-json-2","title":"app.json","children":[]}]}],
"body":"分包加载是小程序优化技术。\n不同功能的代码，打包成不同子包。用户使用时按需加载。\n主包：默认启动页面/TabBar页面， 所有分包需要用到的公共资源\n分包：根据开发者配置进行划分的子包。\n\n小程序启动，默认下载主包，用户进入分包某个页面，才会下载分包。\n分包大小限制：\n整个小程序所有包大小不超过20MB\n单个主包/分包不能超过2MB\n配置分包\napp.json中，通过subPackages 或者 subpackages 定义分包结构。\n每个分包包含3个常用字段：\n\n\nroot：分包的根目录，该目录下的所有文件都会被打包成一个独立的包\n\n\nname：分包的别名，用于在代码中引用该分包\n\n\npages： 指定当前分包中包含哪些页面\n\n\napp.json\n  &quot;subPackages&quot;: [\n    {\n      &quot;root&quot;: &quot;modules/goodModule&quot;,\n      &quot;name&quot;: &quot;goodModule&quot;,\n      &quot;pages&quot;: [\n        &quot;pages/list/list&quot;,\n        &quot;pages/detail/detail&quot;\n      ]\n    }\n\n怎么知道分包是否成功\n详情 - 代码依赖分析\n\n导航到分包页面\n&lt;navigator url=&quot;/modules/goodModule/pages/list/list&quot;&gt;跳转到商品列表页面&lt;/navigator&gt;\n\n分包和引用原则\n\n独立分包\n独立分包：是指能够独立于主包和其他分包运行的包\n从独立分包中页面进入小程序时，不需要下载主包，当用户进入普通分包或主包内页面时，主包才会被下载。\n开发者可以将功能相对独立的页面配置到独立分包中，因为独立分包不依赖主包就可以运行，可以很大程度上提升分包页面的启动速度。\n给 subPackages 定义的分包结构添加 independent 字段，即可声明对应分包为独立分包。\napp.json\n  &quot;subPackages&quot;: [\n    {\n      &quot;root&quot;: &quot;modules/marketModule&quot;,\n      &quot;name&quot;: &quot;marketModule&quot;,\n      &quot;pages&quot;: [\n        &quot;pages/market/market&quot;\n      ],\n      &quot;independent&quot;: true\n    }\n  ],\n\n注意：独立分包不能依赖主包或其他分包的资源；主包的app.wxss对分包无效；App只能在主包中定义，独立分包不能定义App\n分包预下载\n分包预下载是指访问小程序某个页面时，预先下载其他分包中的代码和资源，当用户需要访问分包中的页面时，已经预先下载的代码和资源，因此可以直接使用，从而提高用户的使用体验。\n小程序的分包预下载需要在 app.json 中通过preloadRule 字段设置预下载规则：\nkey-value值：key指访问哪个路径时执行预加载，value指预加载的内容。\nnetwork有两个值，all和wifi，wifi指仅在wifi网络下预加载。\n独立分包预加载主包&quot;packages&quot;: [&quot;__APP__&quot;]\napp.json\n  &quot;preloadRule&quot;: {\n    &quot;pages/index/index&quot;: {\n      &quot;network&quot;: &quot;all&quot;,\n      &quot;packages&quot;: [&quot;modules/goodModule&quot;]\n    },\n    &quot;modules/marketModule/pages/market/market&quot;: {\n      &quot;network&quot;: &quot;all&quot;,\n      &quot;packages&quot;: [&quot;__APP__&quot;]\n    }\n  }\n\n"},{"title":"小程序获取子组件的数据和方法",
"url":"/blog/xiao-cheng-xu-huo-qu-zi-zu-jian-de-shu-ju-he-fang-fa/",
"date":"2025-01-03",
"headings":[{"level":2,"id":"index-wxml","permalink":"https://linxz.online/blog/xiao-cheng-xu-huo-qu-zi-zu-jian-de-shu-ju-he-fang-fa/#index-wxml","title":"index.wxml","children":[]},{"level":2,"id":"index-js","permalink":"https://linxz.online/blog/xiao-cheng-xu-huo-qu-zi-zu-jian-de-shu-ju-he-fang-fa/#index-js","title":"index.js","children":[]}],
"body":"使用selectComponent()方法。\nindex.wxml\n&lt;button bindtap=&quot;getChild&quot;&gt;获取子组件实例对象&lt;/button&gt;\n\nindex.js\ngetChild(){\n\tconst res = this.selectComponent(.child) //提前在子组件定义类名或id\n\tconsole.log(res.data)\n}\n\n"},{"title":"小程序全局共享数据传递getApp()",
"url":"/blog/xiao-cheng-xu-quan-ju-gong-xiang-shu-ju-chuan-di-getapp/",
"date":"2025-01-03",
"headings":[],
"body":"需要用getApp()方法\n在app.js里面定义\nApp({\n\t// 全局共享数据\n\tglobalData: {\n\t\ttoken: &#39;&#39;\n\t},\n\t\n\t// 全局共享方法\n\tsetToken(token){\n\t\tthis.globalData.token = token\n\t}\n})\n\n页面.js使用token:\ncosnt appInstance = getApp()\n\nPage({\n\tlogin(){\n\t\tappInstance.setToken(&#39;adfgefwefw&#39;)\n\t}\n})\n\n验证一下token是否变化：\n到新页面.js上：\ncosnt appInstance = getApp()\n\nPage({\n\tonLoad(){\n\t\tconsole.log(appInstance.globalData.token)\n\t}\n})\n\n"},{"title":"小程序使用Component构造页面",
"url":"/blog/xiao-cheng-xu-shi-yong-componentgou-zao-ye-mian/",
"date":"2025-01-03",
"headings":[{"level":1,"id":"wei-shen-me-yao-yong-component","permalink":"https://linxz.online/blog/xiao-cheng-xu-shi-yong-componentgou-zao-ye-mian/#wei-shen-me-yao-yong-component","title":"为什么要用Component？","children":[]},{"level":1,"id":"zen-me-shi-yong","permalink":"https://linxz.online/blog/xiao-cheng-xu-shi-yong-componentgou-zao-ye-mian/#zen-me-shi-yong","title":"怎么使用？","children":[]},{"level":1,"id":"zhu-yi-shi-xiang","permalink":"https://linxz.online/blog/xiao-cheng-xu-shi-yong-componentgou-zao-ye-mian/#zhu-yi-shi-xiang","title":"注意事项：","children":[]}],
"body":"小程序页面也可以视为自定义组件，因此，可以用Component方法进行创建，以实现复杂逻辑的开发。\n为什么要用Component？\n因为功能更多，比如数据监听Observers，或者通过插件的方式让Component拥有计算属性。\n怎么使用？\n将页面.js文件的Page({})，改成Component({})即可。\n注意事项：\n\n\n要求.json 文件中必须包含 usingComponents 字段\n\n\n里面的配置项需要和 Component 中的配置项保持一致\n\n\n页面中 Page 方法有一些钩子函数、事件监听方法，这些钩子函数、事件监听方法必须放在 methods 对象中 \n\n\n组件的属性 properties 也可以接受页面的参数，在 onLoad 钩子函数中可以通过 this.data 进行获取。\n\n\n视频教程\n"},{"title":"小程序兄弟组件通信-事件总线PubSub",
"url":"/blog/xiao-cheng-xu-xiong-di-zu-jian-tong-xin-shi-jian-zong-xian-pubsub/",
"date":"2025-01-03",
"headings":[{"level":1,"id":"npman-zhuang-pubsubjs","permalink":"https://linxz.online/blog/xiao-cheng-xu-xiong-di-zu-jian-tong-xin-shi-jian-zong-xian-pubsub/#npman-zhuang-pubsubjs","title":"npm安装PubSubJS","children":[]},{"level":1,"id":"ye-mian-jsdao-ru-bao","permalink":"https://linxz.online/blog/xiao-cheng-xu-xiong-di-zu-jian-tong-xin-shi-jian-zong-xian-pubsub/#ye-mian-jsdao-ru-bao","title":"页面js导入包","children":[]},{"level":1,"id":"fa-she-shu-ju-zi-zu-jian-a","permalink":"https://linxz.online/blog/xiao-cheng-xu-xiong-di-zu-jian-tong-xin-shi-jian-zong-xian-pubsub/#fa-she-shu-ju-zi-zu-jian-a","title":"发射数据-子组件A","children":[]},{"level":1,"id":"jie-shou-shu-ju-zi-zu-jian-b","permalink":"https://linxz.online/blog/xiao-cheng-xu-xiong-di-zu-jian-tong-xin-shi-jian-zong-xian-pubsub/#jie-shou-shu-ju-zi-zu-jian-b","title":"接收数据-子组件B","children":[]}],
"body":"用于兄弟组件的数据传递。\n对发布-订阅模式的实现，借助PubSubJS的第三方包实现。\n\nnpm安装PubSubJS\nnpm init -y \nnpm install pubsub-js\n\n工具 - 构建npm\n页面js导入包\nimport PubSub from &#39;pubsub-js&#39;\n\n发射数据-子组件A\nimport PubSub from &#39;pubsub-js&#39;\n\nComponent({\n\n  data: {\n    name: &quot;Tom&quot;,\n    age: 10\n  },\n\n  methods: {\n    sendData(){\n      PubSub.publish(&#39;myevent&#39;, {name: this.data.name, age: this.data.age})\n    }\n  }\n})\n\n接收数据-子组件B\nimport PubSub from &#39;pubsub-js&#39;\n\nComponent({\n\n  data: {\n    name: &#39;&#39;,\n    age: &#39;&#39;\n  },\n\n  methods: {\n  },\n\n  lifetimes: {\n    attached(){\n      PubSub.subscribe(&#39;myevent&#39;, (msg, data) =&gt; {\n        this.setData({\n          name: data.name,\n          age: data.age\n        })\n      })\n    }\n  }\n})\n\n"},{"title":"小程序自定义导航栏",
"url":"/blog/xiao-cheng-xu-zi-ding-yi-dao-hang-lan/",
"date":"2025-01-03",
"headings":[],
"body":"若想导航栏位于顶部，就需要自定义导航栏。\n页面.json文件，配置navigationStyle属性为custom即可。\n设置以后，移除默认的导航栏，只保留右上角胶囊按钮。\n\n"},{"title":"小程序组件复用机制behaviors",
"url":"/blog/xiao-cheng-xu-zu-jian-fu-yong-ji-zhi-behaviors/",
"date":"2025-01-03",
"headings":[],
"body":"一种代码复用方式。\n提取通用的逻辑和方法，在多个组件中服用，减少代码冗余。\n需要新建一个behavior.js文件，暴露出来即可。\n视频教程\n注意，有behavior.js和原组件.js变量同名的问题，不好用。\n"},{"title":"小程序组件生命周期",
"url":"/blog/xiao-cheng-xu-zu-jian-sheng-ming-zhou-qi/",
"date":"2025-01-03",
"headings":[{"level":2,"id":"ru-he-xiao-hui-zu-jian","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-sheng-ming-zhou-qi/#ru-he-xiao-hui-zu-jian","title":"如何销毁组件?","children":[]},{"level":1,"id":"zu-jian-suo-zai-ye-mian-de-sheng-ming-zhou-qi","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-sheng-ming-zhou-qi/#zu-jian-suo-zai-ye-mian-de-sheng-ming-zhou-qi","title":"组件所在页面的生命周期","children":[{"level":2,"id":"ye-mian-js","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-sheng-ming-zhou-qi/#ye-mian-js","title":"页面.js","children":[]}]}],
"body":"指组件自身的钩子函数，在特定的时间节点自动触发。\n需要在lifetimes字段内声明。\n五个函数：created, attached, ready, moved, detached。\n\n页面.js\n  lifetimes: {\n\n    // created：组件实例被创建好以后执行\n    created () {\n      console.log(&#39;组件 created&#39;)\n\n      // 所以在 created 钩子函数中不能调用 setData\n      // 可以给组件添加一些自定义的属性，可以通过 this 的方式进行添加\n      this.test = &#39;测试&#39;\n      // this.setData({\n      //   name: &#39;jerry&#39;\n      // })\n    },\n\n    // 组件被初始化完毕，模板解析完成，已经把组件挂载到页面上\n    attached () {\n      console.log(&#39;组件 attached&#39;)\n      console.log(this.test)\n\n      // 一般页面中的交互会在 attached 钩子函数中进行执行\n      this.setData({\n        name: &#39;jerry&#39;\n      })\n    },\n\n    // 组件被销毁时\n    detached () {\n      console.log(&#39;组件 detached&#39;)\n    }\n\n  },\n\n注意，created钩子函数不能调用setData\n如何销毁组件?\n设置if条件即可。\n&lt;custom06 wx:if=&quot;{{ num === 1 }}&quot; /&gt;\n\n组件所在页面的生命周期\n组件还有一些特的生命周期，这类生命周期和组件没有很强的关联。\n主要用于组件内部监听父组件的展示、隐藏状态，从而方便组件内部执行一些业务逻辑的处理组件所在页面的生命周期有4个：show、hide、resize、 routeDone，需要在 pageLifetimes 字段内进行声明。\n\n页面.js\n  // 组件所在页面的生命周期\n  pageLifetimes: {\n\n    // 监听组件所在的页面展示(后台切前台)状态\n    show () {\n      console.log(&#39;组件所在的页面被展示&#39;)\n    },\n\n    // 监听组件所在的页面隐藏(前台切后台、点击 tabBar)状态\n    hide () {\n      console.log(&#39;组件所在的页面被隐藏&#39;)\n    }\n\n  }\n\n"},{"title":"微信小程序npm使用",
"url":"/blog/wei-xin-xiao-cheng-xu-npmshi-yong/",
"date":"2025-01-02",
"headings":[{"level":1,"id":"sheng-cheng-package-jsonpei-zhi","permalink":"https://linxz.online/blog/wei-xin-xiao-cheng-xu-npmshi-yong/#sheng-cheng-package-jsonpei-zhi","title":"生成package.json配置","children":[]},{"level":1,"id":"an-zhuang-bao","permalink":"https://linxz.online/blog/wei-xin-xiao-cheng-xu-npmshi-yong/#an-zhuang-bao","title":"安装包","children":[]},{"level":1,"id":"gou-jian-npm","permalink":"https://linxz.online/blog/wei-xin-xiao-cheng-xu-npmshi-yong/#gou-jian-npm","title":"构建npm","children":[]}],
"body":"生成package.json配置\n右键-内建终端打开\nnpm init -y\n\n安装包\nnpm i @vant/weapp\n\n安装完后，会生成node_modules文件夹。\n在package.json的dependecies也会看到包。\n但现在的包还不能正常使用，需要在小程序构建后才能用。\n构建npm\n工具 - 构建npm\n\n构建后，默认是项目根目录，生成miniprogram_npm目录。\n里面放着构建后的npm包，这个才能被小程序使用。\n注意，并不是所有的包都能在小程序环境中使用，要看作者是否支持小程序。\n如果需要发布小程序包，需要遵循官方规范\n"},{"title":"微信小程序优化目录结构到miniprogram",
"url":"/blog/wei-xin-xiao-cheng-xu-you-hua-mu-lu-jie-gou-dao-miniprogram/",
"date":"2025-01-02",
"headings":[{"level":1,"id":"ju-ti-cao-zuo","permalink":"https://linxz.online/blog/wei-xin-xiao-cheng-xu-you-hua-mu-lu-jie-gou-dao-miniprogram/#ju-ti-cao-zuo","title":"具体操作","children":[{"level":2,"id":"zeng-jia-she-zhi","permalink":"https://linxz.online/blog/wei-xin-xiao-cheng-xu-you-hua-mu-lu-jie-gou-dao-miniprogram/#zeng-jia-she-zhi","title":"增加设置","children":[]},{"level":2,"id":"zhi-xing-npmbao-an-zhuang","permalink":"https://linxz.online/blog/wei-xin-xiao-cheng-xu-you-hua-mu-lu-jie-gou-dao-miniprogram/#zhi-xing-npmbao-an-zhuang","title":"执行npm包安装","children":[]},{"level":2,"id":"xiu-gai-npmshe-zhi","permalink":"https://linxz.online/blog/wei-xin-xiao-cheng-xu-you-hua-mu-lu-jie-gou-dao-miniprogram/#xiu-gai-npmshe-zhi","title":"修改npm设置","children":[]},{"level":2,"id":"zhong-xin-gou-jian-npm","permalink":"https://linxz.online/blog/wei-xin-xiao-cheng-xu-you-hua-mu-lu-jie-gou-dao-miniprogram/#zhong-xin-gou-jian-npm","title":"重新构建npm","children":[]}]}],
"body":"文件目录繁琐，为了优化调整，可以把小程序核心源码放在miniprogram目录下，相当于react的src文件夹。\n这时候需要开发者在 project.config.json 中指定 node_modules 的位置和目标 miniprogram_npm 的位置。\n具体配置如下：\n\n\n配置 project.config.json 的 miniprogramRoot 指定小程序源码的目录\n\n\n配置 project.config.json 的 seting.packNpmManually 为 true，开启自定义 node_modules 和 miniprogram_npm 位置的构建 npm 方式\n\n\n配置 project.config.json 的 setting.packNpmRelationList 项，指定 packageJsonPath和 miniprogramNpmDistDir 的位置\n\n\n具体操作\n增加设置\nproject.config.json里添加以下代码，指定源码目录。\n &quot;miniprogramRoot&quot;: &quot;miniprogram/&quot;,\n\n执行npm包安装\n根目录npm init -y\n安装npm包，生成node_modules文件夹 npm i @vant/weapp\n此时如果工具-构建npm会报错。\n修改npm设置\nproject.config.json 的 seting.packNpmManually 和 packNpmRelationList修改对应的值\n  &quot;setting&quot;: {\n    &quot;packNpmManually&quot;: true,\n\t &quot;packNpmRelationList&quot;: [\n      {\n        &quot;packageJsonPath&quot;: &quot;./package.json&quot;,\n        &quot;miniprogramNpmDistDir&quot;: &quot;./miniprogram&quot;\n      }\n    ],\n\n}\n\n重新构建npm\n项目 - 重新打开此项目\n工具 - 构建npm\n"},{"title":"小程序的数据监听器",
"url":"/blog/xiao-cheng-xu-de-shu-ju-jian-ting-qi/",
"date":"2025-01-02",
"headings":[{"level":1,"id":"tong-shi-jian-ting-duo-ge-shu-ju","permalink":"https://linxz.online/blog/xiao-cheng-xu-de-shu-ju-jian-ting-qi/#tong-shi-jian-ting-duo-ge-shu-ju","title":"同时监听多个数据","children":[]},{"level":1,"id":"properties-he-data-xuan-ran-de-qu-bie","permalink":"https://linxz.online/blog/xiao-cheng-xu-de-shu-ju-jian-ting-qi/#properties-he-data-xuan-ran-de-qu-bie","title":"properties 和 data 渲染的区别","children":[]}],
"body":"视频教程\n监听任何属性（properties）和数据（data）的变化。当数据变化时触发对应回调函数。类似useEffect功能。\n组件中使用observers字段。\nobservers: {\n\tnum: function(newNum){\n\t\tconsole.log(newNum)\n\t}\n}\n\n同时监听多个数据\n类似于React的useEffect。\n    &#39;num, count&#39;: function (newNum, newCount) {\n      console.log(newNum, newCount)\n    }\n\nproperties 和 data 渲染的区别\nproperties: 每次编译，都会重新渲染页面，执行回调函数。\ndata： 只有数据更新后，才会渲染页面，执行回调函数。\n"},{"title":"小程序页面间通信（传送数据）",
"url":"/blog/xiao-cheng-xu-ye-mian-jian-tong-xin-chuan-song-shu-ju/",
"date":"2025-01-02",
"headings":[{"level":1,"id":"fa-she-ye-mian","permalink":"https://linxz.online/blog/xiao-cheng-xu-ye-mian-jian-tong-xin-chuan-song-shu-ju/#fa-she-ye-mian","title":"发射页面","children":[]},{"level":1,"id":"jie-shou-ye-mian","permalink":"https://linxz.online/blog/xiao-cheng-xu-ye-mian-jian-tong-xin-chuan-song-shu-ju/#jie-shou-ye-mian","title":"接收页面","children":[]}],
"body":"url传参方便，但是中文传参复杂，需要encode和decode。\n方法二：利用EventChannel对象的emit发射事件和getOpenerEventChannel()的EventChannel的on方法接收事件和参数。\n\n发射页面\n\nconst {title, date, authors, content, tags} = this.data\n\nwx.navigateTo({\n\turl: &quot;/pages/source-code/source-code&quot;,\n\tsuccess(res){\n\t\tres.eventChannel.emit(&#39;myEvent&#39;, {\n\t\t\ttitle: title,\n\t\t\tdate: date,\n\t\t\tauthors: authors,\n\t\t\tcontent: content,\n\t\t\ttags: tags\n\t\t})\n\t}\n})\n\n接收页面\nconst EventChannel = this.getOpenerEventChannel()\n\nEventChannel.on(&#39;myEvent&#39;, (res) =&gt; {\n\tconsole.log(res);\n\tconst { title, date, authors, tags, content } = res;\n\t//其他代码\n}\n\n"},{"title":"小程序组件通信",
"url":"/blog/xiao-cheng-xu-zu-jian-tong-xin/",
"date":"2025-01-02",
"headings":[{"level":1,"id":"fu-chuan-zi","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#fu-chuan-zi","title":"父传子","children":[{"level":2,"id":"checkboxli-zi","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#checkboxli-zi","title":"checkbox例子","children":[{"level":3,"id":"fu-zu-jian-js","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#fu-zu-jian-js","title":"父组件.js","children":[]},{"level":3,"id":"fu-zu-jian-wxml","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#fu-zu-jian-wxml","title":"父组件.wxml","children":[]},{"level":3,"id":"zi-zu-jian-zi-ding-yi-zu-jian-wxml","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#zi-zu-jian-zi-ding-yi-zu-jian-wxml","title":"子组件(自定义组件）.wxml","children":[]},{"level":3,"id":"zi-zu-jian-js","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#zi-zu-jian-js","title":"子组件.js","children":[]}]}]},{"level":1,"id":"zi-chuan-fu","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#zi-chuan-fu","title":"子传父","children":[{"level":2,"id":"shi-li","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#shi-li","title":"示例","children":[{"level":3,"id":"zi-zu-jian-wxml","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#zi-zu-jian-wxml","title":"子组件.wxml","children":[]},{"level":3,"id":"zi-zu-jian-js-1","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#zi-zu-jian-js-1","title":"子组件.js","children":[]},{"level":3,"id":"fu-zu-jian-wxml-1","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#fu-zu-jian-wxml-1","title":"父组件.wxml","children":[]},{"level":3,"id":"fu-zu-jian-js-1","permalink":"https://linxz.online/blog/xiao-cheng-xu-zu-jian-tong-xin/#fu-zu-jian-js-1","title":"父组件.js","children":[]}]}]}],
"body":"注意：平行页面之间的通信可以在跳转时，通过url传参的方式传递。\n父传子\n父组件wxml使用数据绑定向子组件传递数据。\n子组件使用properties接收数据。\ncheckbox例子\n父组件.js\ndata: {\n\tisChecked: false\n}\n\n父组件.wxml\n&lt;custom-checkbox checked=&quot;{{ isChecked }}&quot; /&gt;\n\n子组件(自定义组件）.wxml\n&lt;checkbox class=&quot;custom-checkbox&quot; checked bindtap=&quot;updateChecked&quot; /&gt;\n\n子组件.js\nproperties{\n    checked: {\n      type: Boolean,\n      value: false\n    }\n\n}\n\n注意，以上的办法有缺陷。因为需要updateChecked会需要修改properties的值，但是properties的值一般不建议修改，会造成数据流混乱。\n解决办法：在子组件内重新一个data叫做isChecked，通过observers数据监听把传过来的值赋给子组件的data即可。参考视频\n子传父\n自定义组件内部使用triggerEvent方法发射自定义事件，同时携带数据\n自定义组件标签通过bind方法监听发射的事件，同时绑定事件处理函数，在事件处理函数中通过事件对象获取传递的数据。\n示例\n子组件.wxml\n绑定事件函数\n&lt;button type=&quot;primary&quot; plain bindtap=&quot;sendData&quot;&gt;传递数据&lt;/button&gt;\n\n子组件.js\n第二个参数是要传递的数据。\nmethods: {\n\tsendData(){\n\t\tthis.triggerEvent(&#39;myevent&#39;, this.data.num)\n\t}\n}\n\n父组件.wxml\n&lt;custom05 bind:myevent=&quot;getData&quot; /&gt;\n\n父组件.js\n通过getData函数获取数据。\n  getData (event) {\n    // 可以通过事件对象.detail 获取子组件传递给父组件的数据\n    // console.log(event)\n    this.setData({\n      num: event.detail\n    })\n  }\n\n"},{"title":"修改小程序官方组件的样式",
"url":"/blog/xiu-gai-xiao-cheng-xu-guan-fang-zu-jian-de-yang-shi/",
"date":"2025-01-02",
"headings":[],
"body":"比如checkbox。\n需要找到微信官方的类名。\n在官方checkbox介绍里面按F12审查元素，找到类名。\n\n.wx-checkbox-input{}\n.wx-checkbox-input-checked{}\n.wx-checkbox-input-checked::before{} /*勾号的样式*/\n\n注意要加!important来增加权重。如果权重还是不够，可以尝试在外层加一层view组件，自定义一个类名custom，按照.custom .wx-checkbox-input{}的方式添加样式即可。\n如果是自定义组件，还要在js文件中解除样式隔离。\nComponent({\n  options: {\n    styleIsolation: &#39;shared&#39;\n  },\n})\n\n"},{"title":"小程序滚动条scroll-view技巧",
"url":"/blog/xiao-cheng-xu-gun-dong-tiao-scroll-viewji-qiao/",
"date":"2025-01-01",
"headings":[{"level":1,"id":"jie-jue-ye-mian-di-duan-bu-neng-xian-shi-wen-ti","permalink":"https://linxz.online/blog/xiao-cheng-xu-gun-dong-tiao-scroll-viewji-qiao/#jie-jue-ye-mian-di-duan-bu-neng-xian-shi-wen-ti","title":"解决页面底端不能显示问题","children":[]},{"level":1,"id":"dian-ji-ding-bu-hui-dao-zui-shang-fang-shu-xing","permalink":"https://linxz.online/blog/xiao-cheng-xu-gun-dong-tiao-scroll-viewji-qiao/#dian-ji-ding-bu-hui-dao-zui-shang-fang-shu-xing","title":"点击顶部回到最上方属性","children":[]}],
"body":"解决页面底端不能显示问题\n滑到底部，页面会回弹。需要给底部设置空白区域。比如：\n&lt;scroll-view scroll-y enable-back-to-top class=&quot;scroll-container&quot;&gt;\n\n&lt;block wx:for=&quot;{{articleNames}}&quot; wx:key=&quot;index&quot;&gt;\n  &lt;view \n    class=&quot;list-item&quot; \n    bindtap=&quot;onArticleClick&quot; \n    data-index=&quot;{{index}}&quot; \n  &gt;\n    &lt;text&gt;{{index + 1}}. {{item}}&lt;/text&gt;\n  &lt;/view&gt;\n&lt;/block&gt;\n\n&lt;view style=&quot;height: 500rpx&quot;&gt;&lt;/view&gt; &lt;!-- 设置底部空白，方便滚动到底部点击 --&gt;\n\n&lt;/scroll-view&gt;\n\n点击顶部回到最上方属性\nenable-back-to-top属性。可以参考官方的scroll-view知识\n"},{"title":"小程序上线发布",
"url":"/blog/xiao-cheng-xu-shang-xian-fa-bu/",
"date":"2025-01-01",
"headings":[{"level":1,"id":"liu-cheng","permalink":"https://linxz.online/blog/xiao-cheng-xu-shang-xian-fa-bu/#liu-cheng","title":"流程","children":[{"level":2,"id":"kai-fa-zhe-gong-ju-shang-chuan","permalink":"https://linxz.online/blog/xiao-cheng-xu-shang-xian-fa-bu/#kai-fa-zhe-gong-ju-shang-chuan","title":"开发者工具上传","children":[]},{"level":2,"id":"wei-xin-gong-zhong-ping-tai-she-zhi","permalink":"https://linxz.online/blog/xiao-cheng-xu-shang-xian-fa-bu/#wei-xin-gong-zhong-ping-tai-she-zhi","title":"微信公众平台设置","children":[]},{"level":2,"id":"shen-he","permalink":"https://linxz.online/blog/xiao-cheng-xu-shang-xian-fa-bu/#shen-he","title":"审核","children":[]}]}],
"body":"流程\n\n开发者工具上传\n\n注意，插件依赖不能超过2M，如果超过，要删除一些文件。\n另外，可以使用按需注入组件\n。\n代码：\n&quot;lazyCodeLoading&quot;: &quot;requiredComponents&quot;\n\n微信公众平台设置\n找到版本管理 - 开发版本 - 点击下拉箭头 - 选为体验版本\n\n审核\n注意，审核前需要备案，上传身份证、人脸识别，还要写承诺书，按手印，手续挺复杂的。\n据说体验版没有过期时间，我暂时用一下体验版先。\n"},{"title":"小程序text-area不限制字数",
"url":"/blog/xiao-cheng-xu-text-areabu-xian-zhi-zi-shu/",
"date":"2025-01-01",
"headings":[],
"body":"解决默认只能输入140个字符的问题\n设置maxlength属性为-1即可。\n&lt;textarea maxlength=&quot;-1&quot;&gt;&lt;/textarea&gt;\n\n"},{"title":"自定义组件样式隔离",
"url":"/blog/component-isolated/",
"date":"2024-12-31",
"headings":[{"level":1,"id":"dai-ma-shi-li","permalink":"https://linxz.online/blog/component-isolated/#dai-ma-shi-li","title":"代码示例","children":[]},{"level":1,"id":"wai-bu-yang-shi-lei","permalink":"https://linxz.online/blog/component-isolated/#wai-bu-yang-shi-lei","title":"外部样式类","children":[]}],
"body":"默认情况下，自定义组件样式是隔离的，即只受自身wxss的影响。\n有时候，我们希望样式使用者的样式能够影响组件。\n需要样式隔离选项styleIsolation，有三个选项。\nisolated: 互不影响，默认值\napply-shared； 父影响子\nshared: 互相影响，也会影响其他设置了apply-shared和shared的组件。\n代码示例\n自定义组件的js文件中。\nComponent({\n\toptions: {\n\t\tstyleIsolation: &quot;shared&quot; \n\t}\n})\n\n外部样式类\n如果想修改自定义组件样式，并摈除样式嵌套影响，可以使用外部样式类。\n如果styleIsolation属性是shared，那么externalClasses会失效。\nComponent({\n\texternalClasses: [],\n})\n\n"},{"title":"css的直接选择器>和间接选择器",
"url":"/blog/css-direct-selector/",
"date":"2024-12-31",
"headings":[],
"body":".content &gt; .label选中.content 下直接的Iabel 元素。\n.parent .son .test选中.parent 下任意层级的.son 下的.test 元素。\n注意，以上类名之间有空格，所以是嵌套父子关系。如果没有空格，就是平行关系（指一个同时拥有多个类名的元素，而不是父子元素）\n"},{"title":"因为错误提交token导致不能git push",
"url":"/blog/git-push-token/",
"date":"2024-12-31",
"headings":[{"level":1,"id":"jiang-wen-jian-cong-li-shi-ti-jiao-zhong-shan-chu","permalink":"https://linxz.online/blog/git-push-token/#jiang-wen-jian-cong-li-shi-ti-jiao-zhong-shan-chu","title":"将文件从历史提交中删除","children":[]},{"level":1,"id":"rebasejie-shao","permalink":"https://linxz.online/blog/git-push-token/#rebasejie-shao","title":"rebase介绍","children":[]},{"level":1,"id":"github-jin-ji-hui-fu","permalink":"https://linxz.online/blog/git-push-token/#github-jin-ji-hui-fu","title":"github 紧急恢复","children":[]}],
"body":"将文件从历史提交中删除\n查看config.js是否在历史提交中存在\ngit log --all --full-history -- config.js\n\n将文件从历史提交中删除\ngit filter-branch --force --index-filter &quot;git rm --cached --ignore-unmatch config.js&quot; --prune-empty --tag-name-filter cat -- --all\n\n如果有必要，重新验证一下：\ngit add .\ngit status\n\n看看文件是否存在。不存在，直接push就好了。\nrebase介绍\nrebase即变基，可以重新修改当次commit。\n参考链接\n查看是哪个commit出问题\ngit log\n\n复制id,比如03d69e5d3\nrebase变基：改变这次commit\ngit rebase -i &lt;COMMIT-ID&gt;~1\n\n注意，加上~1\n将第一个pick改成edit\nedit 8728dbe67 my second commit message\npick 03d69e5d3 my third commit message\npick 8053f7b27 my fourth commit message\n\n:wq保存。\n删除你的token文件，或者加上.gitignore\n重新保存\ngit add .\n\n查看status\ngit status\n\n完成commit。如果之前没有commit历史，直接跳到这一步即可。\ngit commit --amend\n\n结束变基\ngit rebase --continue\n\npush代码\ngit push\n\ngithub 紧急恢复\n如果rebase操作一通，有可能会失去一些文件。\n最好方法是提前保存，如果忘记，试试以下恢复的办法：\ngit fsck --lost-found\n\n"},{"title":"小程序组件样式注意事项",
"url":"/blog/miniprogram-component-wxss/",
"date":"2024-12-31",
"headings":[],
"body":"\n建议使用class选择器，不允许使用标签选择器、id选择器和属性选择器，因为与全局样式冲突\n\n标签选择器，比如text, view标签\nid选择器，比如id属性\n属性选择器，指标签内的所有属性，比如a[href]{}，或者[id=content]{}\n\n子选择器的父组件只能是view\n\n如果是text包住text标签，以下设置不成功。\n.content &gt; .label {\n\tcolor: green\n}\n\n\n自定义组件会继承父组件的样式\n\n比如color和style\n以下view组件定义的样式，也会被继承到custom组件中。\n&lt;view class=&quot;custom&quot;&gt;\n\t&lt;custom /&gt;\n&lt;/view&gt;\n\n\n全局样式，组件所在页面的样式都对自定义组件无效。\n\n比如app.wxss就对custom组件无效。\n\n\n不建议全局使用标签选择器，因为会影响所有页面和自定义组件。\n\n\n后代选择器尽量精确比如.son .test，不要只是.son，不然父代选择器容易受到影响\n\n\n"},{"title":"小程序自定义组件",
"url":"/blog/miniprogram-components/",
"date":"2024-12-31",
"headings":[{"level":1,"id":"chuang-jian-he-zhu-ce-zu-jian","permalink":"https://linxz.online/blog/miniprogram-components/#chuang-jian-he-zhu-ce-zu-jian","title":"创建和注册组件","children":[{"level":2,"id":"zu-jian-fen-lei","permalink":"https://linxz.online/blog/miniprogram-components/#zu-jian-fen-lei","title":"组件分类","children":[]},{"level":2,"id":"yi-ge-zu-jian-yi-ge-wen-jian-jia","permalink":"https://linxz.online/blog/miniprogram-components/#yi-ge-zu-jian-yi-ge-wen-jian-jia","title":"一个组件一个文件夹","children":[]},{"level":2,"id":"xin-jian-gong-gong-zu-jian","permalink":"https://linxz.online/blog/miniprogram-components/#xin-jian-gong-gong-zu-jian","title":"新建公共组件","children":[]},{"level":2,"id":"zu-jian-zhu-ce","permalink":"https://linxz.online/blog/miniprogram-components/#zu-jian-zhu-ce","title":"组件注册","children":[{"level":3,"id":"zhu-ce","permalink":"https://linxz.online/blog/miniprogram-components/#zhu-ce","title":"注册","children":[]},{"level":3,"id":"shi-yong","permalink":"https://linxz.online/blog/miniprogram-components/#shi-yong","title":"使用","children":[]}]},{"level":2,"id":"zu-jian-de-shu-ju-he-fang-fa","permalink":"https://linxz.online/blog/miniprogram-components/#zu-jian-de-shu-ju-he-fang-fa","title":"组件的数据和方法","children":[{"level":3,"id":"ding-yi-shu-ju","permalink":"https://linxz.online/blog/miniprogram-components/#ding-yi-shu-ju","title":"定义数据","children":[]},{"level":3,"id":"ding-yi-fang-fa","permalink":"https://linxz.online/blog/miniprogram-components/#ding-yi-fang-fa","title":"定义方法","children":[]}]},{"level":2,"id":"zu-jian-de-shu-xing","permalink":"https://linxz.online/blog/miniprogram-components/#zu-jian-de-shu-xing","title":"组件的属性","children":[{"level":3,"id":"huo-qu-shu-xing","permalink":"https://linxz.online/blog/miniprogram-components/#huo-qu-shu-xing","title":"获取属性","children":[]}]}]}],
"body":"创建和注册组件\n组件分类\n公共组件：将页面内的功能模块抽取成自定义组件，以便在不同的页面中重复使用\n页面组件：将复杂的页面拆分成多个低耦合的模块，有助于代码维护\n一个组件一个文件夹\n如果是公共组件，建议放在项目根目录的 components 文件夹中\n如果是页面组件，建议放在对应页面的目录下\n建议：一个组件一个文件夹\n新建公共组件\n\n创建完还需要注册，才能使用组件。\n组件注册\n全局注册：在 app.json 文件中配置 usingComponents 进行注册，注册后可以在任意页面使用\n局部注册：在页面的 json 文件中配置 usingComponents进行注册，注册后只能在当前页面使用\n例子：\n注册\n&quot;usingComponents&quot;: {\n\t&quot;custom-checkbox&quot;: &quot;../../components/custom-checkbox/custom-checkbox&quot;\n}\n\n使用\n&lt;custom-checkbox /&gt;\n\n组件的数据和方法\n需要在组件.js中的Component方法中定义。\n定义数据\nComponent({\n\tdata: {\n\t\tisChecked: false\n\t}\n})\n\n定义方法\nComponent({\n\tmethods: {\n\t\tupdateChecked(){\n\t\t\tthis.setData({\n\t\t\t\tisChecked: !this.data.isChecked\n\t\t\t})\n\t\t}\n\t}\n})\n\n组件的属性\nProperties属性\nComponent({\n\tproperties: {\n\t\t//label: String //简写方式\n\t\tlabel: {\n\t\t\ttype: String,\n\t\t\tvalue: &#39;&#39;      //初始值\n\t\t}\n\t}\n})\n\n获取属性\nconsole.log(this.properties.label)\n\n"},{"title":"怎么改动小程序的开发者id",
"url":"/blog/miniprogram-id/",
"date":"2024-12-31",
"headings":[],
"body":"详情 - 基本信息\n点击修改即可。\n\n"},{"title":"小程序渲染markdown和html",
"url":"/blog/miniprogram-markdown/",
"date":"2024-12-31",
"headings":[{"level":1,"id":"xia-zai-wen-jian","permalink":"https://linxz.online/blog/miniprogram-markdown/#xia-zai-wen-jian","title":"下载文件","children":[]},{"level":1,"id":"zhi-chi-markdownxian-shi","permalink":"https://linxz.online/blog/miniprogram-markdown/#zhi-chi-markdownxian-shi","title":"支持markdown显示","children":[]},{"level":1,"id":"zhi-chi-cha-jian","permalink":"https://linxz.online/blog/miniprogram-markdown/#zhi-chi-cha-jian","title":"支持插件","children":[]},{"level":1,"id":"zhong-xin-da-bao","permalink":"https://linxz.online/blog/miniprogram-markdown/#zhong-xin-da-bao","title":"重新打包","children":[]},{"level":1,"id":"shi-yong","permalink":"https://linxz.online/blog/miniprogram-markdown/#shi-yong","title":"使用","children":[{"level":2,"id":"zhu-ce-component","permalink":"https://linxz.online/blog/miniprogram-markdown/#zhu-ce-component","title":"注册component","children":[]},{"level":2,"id":"zu-jian-shi-yong","permalink":"https://linxz.online/blog/miniprogram-markdown/#zu-jian-shi-yong","title":"组件使用","children":[]}]}],
"body":"小程序渲染markdown-mp-html\n下载文件\ngithub-clone地址\n支持markdown显示\n支持插件\n下载后tools - config.js\n将markdown支持启用\n官方文档\n重新打包\nnpm install\nnpm run build:weixin\n\n参考教程\n使用\n复制dist文件夹里面需要的包，比如我需要的是微信小程序，就复制mp-weixin到components就可以了。\n注册component\n在app.json里面注册组件\n&quot;usingComponents&quot; : {\n\t  &quot;mp-weixin&quot;: &quot;./components/mp-weixin/index&quot;\n}\n\n组件使用\nmarkdown属性开启markdown预览\nuse-anchor支持目录跳转\n&lt;mp-weixin use-anchor markdown content=&quot;{{content}}&quot; /&gt;\n\n"},{"title":"小程序正确加左右边距的做法",
"url":"/blog/miniprogram-padding/",
"date":"2024-12-31",
"headings":[],
"body":"padding是不够的，需要用border-box\npage{\n  padding: 50rpx;\n  box-sizing: border-box;\n}\n\n"},{"title":"小程序只预览其中一个页面",
"url":"/blog/miniprogram-preview-single-page/",
"date":"2024-12-31",
"headings":[],
"body":"编译模式 - 添加编译模式\n\n"},{"title":"小程序组件插槽-slot",
"url":"/blog/miniprogram-slot/",
"date":"2024-12-31",
"headings":[{"level":1,"id":"dan-slotdai-ma","permalink":"https://linxz.online/blog/miniprogram-slot/#dan-slotdai-ma","title":"单slot代码","children":[{"level":2,"id":"zu-jian-ding-yi","permalink":"https://linxz.online/blog/miniprogram-slot/#zu-jian-ding-yi","title":"组件定义","children":[]},{"level":2,"id":"shi-yong","permalink":"https://linxz.online/blog/miniprogram-slot/#shi-yong","title":"使用","children":[]}]},{"level":1,"id":"yi-ge-zu-jian-mo-ren-yi-ge-cha-cao-slot","permalink":"https://linxz.online/blog/miniprogram-slot/#yi-ge-zu-jian-mo-ren-yi-ge-cha-cao-slot","title":"一个组件默认一个插槽slot","children":[]},{"level":1,"id":"duo-slot-ju-ming-cha-cao","permalink":"https://linxz.online/blog/miniprogram-slot/#duo-slot-ju-ming-cha-cao","title":"多slot - 具名插槽","children":[{"level":2,"id":"zi-ding-yi-zu-jian-js-zhu-ce-slots","permalink":"https://linxz.online/blog/miniprogram-slot/#zi-ding-yi-zu-jian-js-zhu-ce-slots","title":"自定义组件js - 注册slots","children":[]},{"level":2,"id":"zu-jian-ding-yi-1","permalink":"https://linxz.online/blog/miniprogram-slot/#zu-jian-ding-yi-1","title":"组件定义","children":[]}]},{"level":1,"id":"zu-jian-shi-yong","permalink":"https://linxz.online/blog/miniprogram-slot/#zu-jian-shi-yong","title":"组件使用","children":[]}],
"body":"作用：标签之间的内容默认不展示，如果需要展示，则需要slot节点。\n比如下面的文字内容不展示：\n&lt;custom-checkbox position=&quot;right&quot;&gt;\n\t内容不会展示\n&lt;/custom-checkbox&gt;\n\n可以比作手机卡：\n自定义组件就是读卡器，slot就是里面的卡槽。\n\n单slot代码\n组件定义\n&lt;view&gt;\n\t&lt;slot/&gt;\n&lt;/view&gt;\n\n使用\n&lt;custom&gt;加上slot后这里会显示&lt;/custom&gt;\n\n一个组件默认一个插槽slot\n如果需要扩展，要声明multipleSlots，\n同时需要给slot添加name属性区分不同的slot，所以也称为具名插槽。\n多slot - 具名插槽\n自定义组件js - 注册slots\nComponent({\n\toptions: {\n\t\tmultipleSlots: true\n\t}\n})\n\n组件定义\n&lt;view&gt;\n\t&lt;slot name=&quot;slot-top&quot;/&gt;\n\n\t&lt;!-- 默认插槽 --&gt;\n\t&lt;view&gt;&lt;slot/&gt;&lt;/view&gt;\n\n\t&lt;slot/ name=&quot;slot-bottom&quot;&gt;\n&lt;/view&gt;\n\n组件使用\n&lt;custom&gt;\n\n&lt;text slot=&quot;slot-top&quot;&gt;顶部slot内容&lt;/text&gt;\n\n默认slot后这里会显示\n\n&lt;text slot=&quot;slot-bottom&quot;&gt;底部slot内容&lt;/text&gt;\n\n&lt;/custom&gt;\n\n"},{"title":"小程序的token处理方法",
"url":"/blog/miniprogram-token/",
"date":"2024-12-31",
"headings":[{"level":1,"id":"xin-jian-config-js","permalink":"https://linxz.online/blog/miniprogram-token/#xin-jian-config-js","title":"新建config.js","children":[]},{"level":1,"id":"shi-yong-token","permalink":"https://linxz.online/blog/miniprogram-token/#shi-yong-token","title":"使用token","children":[]}],
"body":"可以用config.js, 本地数据Storage, 或者请求服务端获得的方式。服务端方式安全些。\n示例用config.js模式。\n新建config.js\n根目录下创建，把token输进去：\nmodule.exports = {\n  token: &#39;your-token&#39;\n}\n\n\n使用token\n引入模块并使用\nconst config = require(&#39;../../config&#39;)\n\n//使用token\ngithubToken: config.token,\n\n"},{"title":"微信小程序ui库",
"url":"/blog/miniprogram-ui/",
"date":"2024-12-31",
"headings":[{"level":1,"id":"weui","permalink":"https://linxz.online/blog/miniprogram-ui/#weui","title":"weui","children":[]},{"level":1,"id":"vant-weapp","permalink":"https://linxz.online/blog/miniprogram-ui/#vant-weapp","title":"vant weapp","children":[{"level":2,"id":"xiu-gai-yang-shi","permalink":"https://linxz.online/blog/miniprogram-ui/#xiu-gai-yang-shi","title":"修改样式","children":[{"level":3,"id":"yao-jia-important","permalink":"https://linxz.online/blog/miniprogram-ui/#yao-jia-important","title":"要加!important","children":[]},{"level":3,"id":"zi-ding-yi-zu-jian-zhong-xiu-gai-yang-shi","permalink":"https://linxz.online/blog/miniprogram-ui/#zi-ding-yi-zu-jian-zhong-xiu-gai-yang-shi","title":"自定义组件中修改样式","children":[]},{"level":3,"id":"ke-yi-zhi-jie-yong-wai-bu-yang-shi-lei","permalink":"https://linxz.online/blog/miniprogram-ui/#ke-yi-zhi-jie-yong-wai-bu-yang-shi-lei","title":"可以直接用外部样式类","children":[]},{"level":3,"id":"pi-liang-xiu-gai-zu-jian-yang-shi-shi-yong-cssbian-liang","permalink":"https://linxz.online/blog/miniprogram-ui/#pi-liang-xiu-gai-zu-jian-yang-shi-shi-yong-cssbian-liang","title":"批量修改组件样式 - 使用css变量","children":[]}]}]}],
"body":"weui\ngithub仓库地址\n效果预览\nvant weapp\n有赞团队的开源ui组件库\n使用视频教程\n项目地址\n需要在app.json中删掉style:v2的配置项。即不使用微信最新的ui样式。\n在app.json引入组件\n&quot;usingComponents&quot;: {\n  &quot;van-image&quot;: &quot;@vant/weapp/image/index&quot;\n}\n\n直接使用标签即可，可以参考教程\n&lt;van-image width=&quot;100&quot; height=&quot;100&quot; src=&quot;https://img.yzcdn.cn/vant/cat.jpeg&quot; /&gt;\n\n修改样式\n要加!important\n.van-button--primary {\n  font-size: 50rpx !important;\n  background-color: lightgreen !important;\n}\n\n自定义组件中修改样式\n需要接触样式隔离，设置成shared\nComponent({\n\toptions: {\n\t\tstyleIsolation: &#39;&#39;\n\t}\n})\n\n可以直接用外部样式类\n&lt;van-button custom-class=&quot;custom-class&quot;&gt;\n\n自己在wxss文件再定义.custom-class就可以了，记得加!important\n批量修改组件样式 - 使用css变量\napp.wxss定义\npage{\n\t--color: lightgreen;\n}\n\n使用变量\nbackground-color: var(--color) !important\n\n"},{"title":"小程序API-页面处理函数",
"url":"/blog/miniprogram-refresh-scroll/",
"date":"2024-12-30",
"headings":[{"level":1,"id":"shang-la-jia-zai-jia-zai-geng-duo","permalink":"https://linxz.online/blog/miniprogram-refresh-scroll/#shang-la-jia-zai-jia-zai-geng-duo","title":"上拉加载（加载更多）","children":[{"level":2,"id":"shi-xian","permalink":"https://linxz.online/blog/miniprogram-refresh-scroll/#shi-xian","title":"实现","children":[]}]},{"level":1,"id":"xia-la-shua-xin","permalink":"https://linxz.online/blog/miniprogram-refresh-scroll/#xia-la-shua-xin","title":"下拉刷新","children":[{"level":2,"id":"shi-xian-1","permalink":"https://linxz.online/blog/miniprogram-refresh-scroll/#shi-xian-1","title":"实现：","children":[]},{"level":2,"id":"she-zhi-xia-la-hou-dan-hui-qu","permalink":"https://linxz.online/blog/miniprogram-refresh-scroll/#she-zhi-xia-la-hou-dan-hui-qu","title":"设置下拉后弹回去","children":[]}]},{"level":1,"id":"shi-yong-scroll-viewshi-xian-shang-la-jia-zai-he-xia-la-shua-xin","permalink":"https://linxz.online/blog/miniprogram-refresh-scroll/#shi-yong-scroll-viewshi-xian-shang-la-jia-zai-he-xia-la-shua-xin","title":"使用scroll-view实现上拉加载和下拉刷新","children":[]}],
"body":"上拉加载和下拉刷新。\n上拉加载（加载更多）\n上拉加载是小程序中常见的一种加载方式，当用户滑动页面到底部时，会自动加载更多的内容，以便用户继续浏览\n实现\n\n\n在app.json 或者 page.json 中配置距离页面底部距离：onReachBottomDistance；默认 50px\n\n\n在页面js 中定义 onReachBottom 事件监听用户上拉加载 \n\n\nonReachBottomDistance 是指页面滚动到底部时的触发距离。\n下拉刷新\n下拉页面时，页面自动刷新。\n实现：\n\n\n在 app.json 或者 page.json 中开启允许下拉，同时可以配置窗口、loading 样式等\n\n\n在页面.js 中定义 onPullDownRefresh 事件监听用户下拉刷新\n\n\n设置下拉后弹回去\n    // 在下拉刷新以后，loading 效果有可能不会回弹回去\n    if (this.data.numList.length === 3) {\n      wx.stopPullDownRefresh()\n    }\n\n使用scroll-view实现上拉加载和下拉刷新\n上拉通过scroll-y属性实现，下拉通过refresher-enabled实现。\n界面代码：\n\n&lt;scroll-view\n  scroll-y\n  class=&quot;scroll-y&quot;\n\n  lower-threshold=&quot;100&quot;\n  bindscrolltolower=&quot;getMore&quot;\n  enable-back-to-top\n\n  refresher-enabled\n  refresher-default-style=&quot;black&quot;\n  refresher-background=&quot;#f7f7f8&quot;\n  bindrefresherrefresh=&quot;refreshHandler&quot;\n  refresher-triggered=&quot;{{isTriggered}}&quot;\n&gt;\n  \n  &lt;view wx:for=&quot;{{ numList }}&quot; wx:key=&quot;*this&quot;&gt;{{ item }}&lt;/view&gt;\n\n&lt;/scroll-view&gt;\n\njs代码\n\nPage({\n\n  data: {\n    numList: [1, 2, 3],\n    isTriggered: false\n  },\n\n  refreshHandler () {\n\n    wx.showToast({\n      title: &#39;下拉刷新...&#39;\n    })\n    \n    setTimeout(() =&gt; {\n      this.setData({\n        numList: [1, 2, 3],\n        isTriggered: false\n      })\n    }, 2000)\n\n  },\n\n\n  // scroll-view 上拉加载更多事件的事件处理函数\n  getMore () {\n\n    \n    wx.showLoading({\n      title: &#39;数据加载中...&#39;\n    })\n\n    setTimeout(() =&gt; {\n      // 获取数组的最后一项\n      const lastNum = this.data.numList[this.data.numList.length - 1]\n      // 定义需要追加的元素\n      const newArr = [lastNum + 1, lastNum + 2, lastNum + 3]\n\n      this.setData({\n        numList: [...this.data.numList, ...newArr]\n      })\n\n      wx.hideLoading()\n    }, 1500)\n\n\n  }\n\n})\n\n\n\n"},{"title":"免费的API接口-网络连接调试",
"url":"/blog/free-api/",
"date":"2024-12-27",
"headings":[],
"body":"开放api接口测试：\nhttps://api.apiopen.top/swagger/index.html#/\n获取一句名言：\napi.apiopen.top/api/sentences\n获取时间：\napi.apiopen.top/api/getTime\n获取短视频\napi.apiopen.top/api/getShortVideo\n获取图片\napi.apiopen.top/api/getImages\napi狗狗数据：\nhttps://dogapi.dog/api/v2/breeds\n测试地址：\nhttps://dogapi.dog/docs/api-v2\n其他免费api:\nhttps://free-apis.github.io/#/browse\n"},{"title":"Github API的连接方式",
"url":"/blog/github-api/",
"date":"2024-12-27",
"headings":[],
"body":"github api地址：\nhttps://api.github.com/repos/linxz-coder/zola-basic/contents/content/blog/ES6.md\nGET方法\n需要连接token:\ncurl -L \n-H &quot;Accept: application/vnd.github+json&quot; \n-H &quot;Authorization: Bearer &quot; \n-H &quot;X-GitHub-Api-Version: 2022-11-28&quot; \nhttps://api.github.com/repos/OWNER/REPO/contents/PATH\ngithub-api官方参考\n"},{"title":"小程序网络API知识",
"url":"/blog/miniprogram-api/",
"date":"2024-12-27",
"headings":[{"level":1,"id":"xiao-cheng-xu-apifen-lei","permalink":"https://linxz.online/blog/miniprogram-api/#xiao-cheng-xu-apifen-lei","title":"小程序API分类","children":[{"level":2,"id":"yi-bu-api","permalink":"https://linxz.online/blog/miniprogram-api/#yi-bu-api","title":"异步API","children":[]},{"level":2,"id":"wang-luo-qing-qiu","permalink":"https://linxz.online/blog/miniprogram-api/#wang-luo-qing-qiu","title":"网络请求","children":[]},{"level":2,"id":"loadingdai-ma","permalink":"https://linxz.online/blog/miniprogram-api/#loadingdai-ma","title":"Loading代码","children":[]},{"level":2,"id":"shi-li-dai-ma","permalink":"https://linxz.online/blog/miniprogram-api/#shi-li-dai-ma","title":"示例代码：","children":[]}]}],
"body":"几乎挂载在wx对象下，如wx.request(), wx.setStorage()等。\nwx对象是小程序宿主环境微信提供的全局对象。\n小程序API分类\n\n异步API\n小程序异步API支持 callback &amp; Promise 两种调用方式:\n\n\n当接口参数 Object 对象中不包含 success/fail/complete 时将默认返回 Promise\n\n\n部分接口如 request， uploadFile 本身就有返回值，因此不支持 Promise 风格的调用方式，它们的promisify 需要开发者自行封装。\n\n\n网络请求\n发起网络请求获取服务器的数据，需要使用wx.request（）接口 API\n注意：wx.request 请求的域名必须在微信公众平台进行配置，如果使用 wx.request 请求未配置的域名，在控制台会有相应的报错。\n\n合法域名必须经过备案，而且以https开头，关于如何配置域名\n服务器域名申请规则\n开发环境下，可以在详情-不校验合法域名取消。\n手机环境，点击菜单-开发模式即可。\n\n\nLoading代码\n可以用wx.showLoading()和wx.hideLoading()的api来完成。\nwx.hideLoading()在Complete回调函数中设置，指完成数据请求后隐藏Loading框。\n示例代码：\n    // 显示 loading 提示框\n    wx.showLoading({\n      // 用来显示提示的内容\n      // 提示的内容不会自动换行，如果提示的内容比较多，因为在同一行展示\n      // 多出来的内容就会被隐藏\n      title: &#39;数据加载中...&#39;,\n      // 是否展示透明蒙层，防止触摸穿透\n      mask: true\n    })\n\n    // 如果需要发起网络请求，需要使用 wx.request API\n    wx.request({\n      // 接口地址\n      url: &#39;https://gmall-prod.atguigu.cn/mall-api/index/findBanner&#39;,\n      // 请求方式\n      method: &#39;GET&#39;,\n      // 请求参数\n      data: {},\n      // 请求头\n      header: {},\n      // API 调用成功以后，执行的回调\n      success: (res) =&gt; {\n        // console.log(res)\n        if (res.data.code === 200) {\n          this.setData({\n            list: res.data.data\n          })\n        }\n      },\n      // API 调用失败以后，执行的回调\n      fail: (err) =&gt; {\n        console.log(err)\n      },\n      // API 不管调用成功还是失败以后，执行的回调\n      complete: (res) =&gt; {\n        // console.log(res)\n\n        // 关掉 loading 提示框\n        // hideLoading 和 showLoading 必须结合、配对使用才可以\n        wx.hideLoading()\n      }\n    })\n\n"},{"title":"小程序的生命周期",
"url":"/blog/miniprogram-lifecycle/",
"date":"2024-12-27",
"headings":[{"level":1,"id":"sheng-ming-zhou-qi-tu","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#sheng-ming-zhou-qi-tu","title":"生命周期图","children":[{"level":2,"id":"leng-qi-dong-he-re-qi-dong","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#leng-qi-dong-he-re-qi-dong","title":"冷启动和热启动","children":[]},{"level":2,"id":"qian-tai-he-hou-tai","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#qian-tai-he-hou-tai","title":"前台和后台","children":[]},{"level":2,"id":"gua-qi","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#gua-qi","title":"挂起","children":[]},{"level":2,"id":"xiao-hui","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#xiao-hui","title":"销毁","children":[]}]},{"level":1,"id":"sheng-ming-zhou-qi-gai-nian","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#sheng-ming-zhou-qi-gai-nian","title":"生命周期概念","children":[]},{"level":1,"id":"ying-yong-sheng-ming-zhou-qi","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#ying-yong-sheng-ming-zhou-qi","title":"应用生命周期","children":[{"level":2,"id":"ying-yong-sheng-ming-zhou-qi-han-shu","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#ying-yong-sheng-ming-zhou-qi-han-shu","title":"应用生命周期函数","children":[]}]},{"level":1,"id":"ye-mian-sheng-ming-zhou-qi","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#ye-mian-sheng-ming-zhou-qi","title":"页面生命周期","children":[{"level":2,"id":"ye-mian-sheng-ming-zhou-qi-han-shu","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#ye-mian-sheng-ming-zhou-qi-han-shu","title":"页面生命周期函数","children":[]}]},{"level":1,"id":"sheng-ming-zhou-qi-liang-ge-xi-jie","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#sheng-ming-zhou-qi-liang-ge-xi-jie","title":"生命周期两个细节","children":[]},{"level":1,"id":"sheng-ming-zhou-qi-da-zong-jie","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#sheng-ming-zhou-qi-da-zong-jie","title":"生命周期大总结","children":[{"level":2,"id":"xiao-cheng-xu-leng-qi-dong-gou-zi-han-shu-zhi-xing-shun-xu","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#xiao-cheng-xu-leng-qi-dong-gou-zi-han-shu-zhi-xing-shun-xu","title":"小程序冷启动，钩子函数执行顺序","children":[]},{"level":2,"id":"bao-liu-dang-qian-ye-mian-tiao-zhuan-huo-guan-bi-dang-qian-ye-mian-tiao-zhuan","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#bao-liu-dang-qian-ye-mian-tiao-zhuan-huo-guan-bi-dang-qian-ye-mian-tiao-zhuan","title":"保留当前页面跳转 或 关闭当前页面跳转","children":[]},{"level":2,"id":"xiao-cheng-xu-re-qi-dong-gou-zi-han-shu-zhi-xing-shun-xu","permalink":"https://linxz.online/blog/miniprogram-lifecycle/#xiao-cheng-xu-re-qi-dong-gou-zi-han-shu-zhi-xing-shun-xu","title":"小程序热启动，钩子函数执行顺序","children":[]}]}],
"body":"生命周期图\n冷启动和热启动\n冷启动： 刚打开\n热启动： 之前打开过\n\n前台和后台\n进入后台的方式： 关闭小程序、home键、锁屏\n\n挂起\n后台5秒后会挂起，停止线程。但如何播放音乐、后台使用地理位置，可以在后台继续运行，不会挂起。\n销毁\n后台30分钟后销毁，或者占用系统资源过多，也会被销毁。\n\n生命周期概念\n分为应用生命周期, 页面生命周期，组件生命周期。\n\n应用生命周期\n启动 -&gt; 运行 -&gt; 销毁 的过程。\n应用生命周期函数\n在app.js的App()方法定义。\nApp()方法必须在app.js内调用，用来注册小程序。\nonLaunch, onShow, onHide三个函数组成。\n注意：onLaunch只会在开始时启动，只启动一次，即冷启动触发。\n\n页面生命周期\n页面加载 -&gt; 运行 -&gt; 销毁 的过程。\n页面生命周期函数\n在Page()方法定义。\n页面跳转时，即使用navigator标签，open-type属性为navigate方法会去onHide，保留页面； redirect方法会去onUnload，删除页面。\nonLoad和onReady，每个页面只会出现一次。\n\n生命周期两个细节\n\n\ntabBar 页面之间相互切换，页面不会被销毁\n\n\n点击左上角，返回上一个页面，会销毁当前页面\n\n\n生命周期大总结\n小程序冷启动，钩子函数执行顺序\n\n保留当前页面跳转 或 关闭当前页面跳转\n\n小程序热启动，钩子函数执行顺序\n\n"},{"title":"小程序API-对话框和提示框",
"url":"/blog/miniprogram-messagebox/",
"date":"2024-12-27",
"headings":[],
"body":"wx.showModal（）：模态对话框，常用于询问用户是否执行一些操作例如：询问用户是否退出登录、是否删除该商品等\nwx.showToast（）：消息提示框，根据用户的某些操作来告知操作的结果例如：退出成功给用户提示，提示删除成功等\n注意，showModal()是异步函数，需要用到async+await的方法。\n示例代码：\n // 删除商品\n  async delHandler () {\n\n    // showModal 显示模态对话框\n    const { confirm } = await wx.showModal({\n      title: &#39;提示&#39;,\n      content: &#39;是否删除该商品 ?&#39;\n    })\n\n    if (confirm) {\n      // showToast 消息提示框\n      wx.showToast({\n        title: &#39;删除成功&#39;,\n        icon: &#39;none&#39;,\n        duration: 2000\n      })\n    } else {\n      wx.showToast({\n        title: &#39;取消删除&#39;,\n        icon: &#39;error&#39;,\n        duration: 2000\n      })\n    }\n\n  }\n\n"},{"title":"小程序的路由与通信",
"url":"/blog/miniprogram-router/",
"date":"2024-12-27",
"headings":[{"level":1,"id":"suo-you-tiao-zhuan-apishi-li","permalink":"https://linxz.online/blog/miniprogram-router/#suo-you-tiao-zhuan-apishi-li","title":"所有跳转API示例","children":[]}],
"body":"页面跳转有两种方式：\n\n\n声明式导航：navigator 组件\n\n\n编程式导航：使用小程序提供的API\n\n\n\n注意：除switchTab外，都可以通过url传参，在目标页面里面通过生命周期onLoad(options)里的options属性接收参数。\n页面参数可以通过右下角按钮查看。\n\n所有跳转API示例\nPage({\n\n\n  navigateTo() {\n\n    // 保留当前页面，跳转到应用中其他页面，不能跳转到 tabBar 页面\n    wx.navigateTo({\n      url: &#39;/pages/list/list?id=1&amp;name=tom&#39;\n      // url: &#39;/pages/cate/cate&#39;\n    })\n\n  },\n\n  redirectTo() {\n\n    // 关闭(销毁)当前页面，跳转到应用中其他页面，不能跳转到 tabBar 页面\n    wx.redirectTo({\n      url: &#39;/pages/list/list?id=1&amp;name=tom&#39;\n      // url: &#39;/pages/cate/cate&#39;\n    })\n\n  },\n\n  switchTab() {\n\n    // 跳转到 tabBar 页面，不能跳转到 非 tabBar 页面，路径后面不能传递参数\n    wx.switchTab({\n      // url: &#39;/pages/list/list&#39;\n      url: &#39;/pages/cate/cate&#39;\n    })\n\n  },\n\n  reLaunch() {\n\n    // 关闭所有的页面，然后跳转到应用中某一个页面\n    wx.reLaunch({\n      url: &#39;/pages/list/list?id=1&amp;name=tom&#39;\n      // url: &#39;/pages/cate/cate?id=1&amp;name=tom&#39;\n    })\n\n  },\n\n  navigateBack() {\n\n    // 关闭当前页面，返回上一页或者返回多级页面\n    // 默认返回上一页\n    wx.navigateBack({\n      delta: 1\n    })\n\n  },\n\n\n})\n\n\n"},{"title":"小程序的本地存储。",
"url":"/blog/miniprogram-storage/",
"date":"2024-12-27",
"headings":[{"level":1,"id":"cha-kan-cun-chu-de-shu-ju","permalink":"https://linxz.online/blog/miniprogram-storage/#cha-kan-cun-chu-de-shu-ju","title":"查看存储的数据","children":[]}],
"body":"数据存储在用户的设备上，以便启动和运行时快速读取数据。\n存储分为同步和异步的方式。\n\n查看存储的数据\n打开调试界面-Storage即可。\n代码示例：\nPage({\n\n\n  // 将数据存储到本地\n  setStorage () {\n\n    // 第一个参数：本地存储中指定的 key\n    // 第二个参数：需要存储的数据\n    // wx.setStorageSync(&#39;num&#39;, 1)\n\n    // 在小程序中\n    // 如果存储的是对象类型数据，不需要使用 JSON.stringify 和 JSON.parse 进行转换\n    // 直接进行存储和获取即可\n    // wx.setStorageSync(&#39;obj&#39;, { name: &#39;tom&#39;, age: 10 })\n\n    // ------------------- 异步 API -------------------\n    wx.setStorage({\n      key: &#39;num&#39;,\n      data: 1\n    })\n\n    wx.setStorage({\n      key: &#39;obj&#39;,\n      data: { name: &#39;jerry&#39;, age: 18 }\n    })\n\n  },\n\n  // 获取本地存储的数据\n  async getStorage () {\n\n    // 从本地存储的数据中获取指定 key 的数据、内容\n    // const num = wx.getStorageSync(&#39;num&#39;)\n    // const obj = wx.getStorageSync(&#39;obj&#39;)\n\n    // console.log(num)\n    // console.log(obj)\n\n    // ------------------- 异步 API -------------------\n\n    const { data } = await wx.getStorage({\n      key: &#39;obj&#39;\n    })\n\n    console.log(data)\n\n  },\n\n  // 删除本地存储的数据\n  removeStorage () {\n\n    // 从本地移除指定 key 的数据、内容\n    // wx.removeStorageSync(&#39;num&#39;)\n\n    // ------------------- 异步 API -------------------\n\n    wx.removeStorage({\n      key: &#39;num&#39;\n    })\n\n  },\n\n  // 清空本地存储的全部数据\n  clearStorage () {\n    // wx.clearStorageSync()\n\n    wx.clearStorage()\n  },\n\n})\n\n\n\n"},{"title":"小程序的事件绑定",
"url":"/blog/miniprogram-button-event/",
"date":"2024-12-26",
"headings":[{"level":1,"id":"an-niu","permalink":"https://linxz.online/blog/miniprogram-button-event/#an-niu","title":"按钮","children":[{"level":2,"id":"an-niu-yang-shi","permalink":"https://linxz.online/blog/miniprogram-button-event/#an-niu-yang-shi","title":"按钮样式","children":[]},{"level":2,"id":"an-niu-chi-cun","permalink":"https://linxz.online/blog/miniprogram-button-event/#an-niu-chi-cun","title":"按钮尺寸","children":[]}]},{"level":1,"id":"shi-jian-fen-lei","permalink":"https://linxz.online/blog/miniprogram-button-event/#shi-jian-fen-lei","title":"事件分类","children":[]},{"level":1,"id":"shi-jian-chuan-can","permalink":"https://linxz.online/blog/miniprogram-button-event/#shi-jian-chuan-can","title":"事件传参","children":[{"level":2,"id":"fang-fa-yi-data","permalink":"https://linxz.online/blog/miniprogram-button-event/#fang-fa-yi-data","title":"方法一：data-","children":[]},{"level":2,"id":"fang-fa-er-markbiao-ji-chuan-di-can-shu","permalink":"https://linxz.online/blog/miniprogram-button-event/#fang-fa-er-markbiao-ji-chuan-di-can-shu","title":"方法二： mark标记传递参数","children":[]}]}],
"body":"小程序中绑定事件与在网页开发中绑定事件几乎一致，只不过在小程序不能通过 on 的方式绑定事件，也没有 click 等事件，小程序中绑定事件使用 bind 方法，click 事件也需要使用 tap 事件来进行代替，绑定事件的方式有两种：\n第一种方式：bind：事件名，bind 后面需要跟上冒号，冒号后面跟上事件名，例如：&lt;view bind：tap=“fnName“&gt;&lt;view&gt; 第二种方式：bind事件名，bind 后面直接跟上事件名，例如：&lt;view bindtap=“fnName“&gt;&lt;view&gt;\n事件处理函数需要写到，js 文件中，在js 文件中需要调用小程序提供的 Page 方法来注册小程序的页面，我们可以直接在 Page 方法中创建事件处理函数。\n按钮\n按钮样式\n用type属性，有primary, warn和default\n&lt;button type=&quot;primary&quot;&gt;绑定事件&lt;/button&gt;\n\n如果需要有边框无背景的按钮，加一个plain属性就行\n按钮尺寸\n用size属性，选择mini即可。\n事件分类\n事件分为冒泡事件和非冒泡事件：\n冒泡事件：当一个组件的事件被触发后，该事件会向父节点传递，即触发父节点事件\n非冒泡事件：当一个组件的事件被触发后，该事件不会向父节点传递\n使用 bind 绑定的事件，会触发事件冒泡，如果想阻止事件冒泡，可以使用 catch 来绑定事件。\n事件传参\n方法一：data-\n在组件上通过 data-的方式定义需要传递的数据，其中是自定义的属性，例如：&lt;view data-id=“100“ bindtap=“handler”/&gt; 然后通过事件对象进行获取自定义数据。\n注意：\n如果传参带有-号，会被系统自动转成驼峰写法；但如果你传的是驼峰写法，全部会变成小写。所以，变量名最好写成全部小写。\n方法二： mark标记传递参数\n注意：可以一并获得父节点的mark数据。\n&lt;view mark:id=&quot;100&quot; bindtap=&quot;handler&quot; /&gt;\n\n"},{"title":"小程序的数据",
"url":"/blog/miniprogram-data/",
"date":"2024-12-26",
"headings":[{"level":1,"id":"sheng-ming-shu-ju-data","permalink":"https://linxz.online/blog/miniprogram-data/#sheng-ming-shu-ju-data","title":"声明数据data:","children":[]},{"level":1,"id":"xiu-gai-shu-ju-setdata","permalink":"https://linxz.online/blog/miniprogram-data/#xiu-gai-shu-ju-setdata","title":"修改数据setData()","children":[{"level":2,"id":"huo-qu-shu-ju","permalink":"https://linxz.online/blog/miniprogram-data/#huo-qu-shu-ju","title":"获取数据","children":[]},{"level":2,"id":"xiu-gai-shu-ju","permalink":"https://linxz.online/blog/miniprogram-data/#xiu-gai-shu-ju","title":"修改数据","children":[]},{"level":2,"id":"xiu-gai-dui-xiang","permalink":"https://linxz.online/blog/miniprogram-data/#xiu-gai-dui-xiang","title":"修改对象","children":[{"level":3,"id":"xin-zeng-xiu-gai-dui-xiang-shu-xing","permalink":"https://linxz.online/blog/miniprogram-data/#xin-zeng-xiu-gai-dui-xiang-shu-xing","title":"新增、修改对象属性","children":[]},{"level":3,"id":"shan-chu-dui-xiang-shu-xing","permalink":"https://linxz.online/blog/miniprogram-data/#shan-chu-dui-xiang-shu-xing","title":"删除对象属性","children":[]}]},{"level":2,"id":"xiu-gai-shu-zu","permalink":"https://linxz.online/blog/miniprogram-data/#xiu-gai-shu-zu","title":"修改数组","children":[{"level":3,"id":"zhan-shi-shu-zu","permalink":"https://linxz.online/blog/miniprogram-data/#zhan-shi-shu-zu","title":"展示数组","children":[]},{"level":3,"id":"xin-zeng-shu-zu","permalink":"https://linxz.online/blog/miniprogram-data/#xin-zeng-shu-zu","title":"新增数组","children":[]},{"level":3,"id":"xiu-gai-shu-zu-1","permalink":"https://linxz.online/blog/miniprogram-data/#xiu-gai-shu-zu-1","title":"修改数组","children":[]},{"level":3,"id":"shan-chu-shu-zu-yuan-su","permalink":"https://linxz.online/blog/miniprogram-data/#shan-chu-shu-zu-yuan-su","title":"删除数组元素","children":[]}]}]},{"level":1,"id":"xiao-cheng-xu-shu-ju-shuang-xiang-bang-ding","permalink":"https://linxz.online/blog/miniprogram-data/#xiao-cheng-xu-shu-ju-shuang-xiang-bang-ding","title":"小程序数据双向绑定","children":[{"level":2,"id":"dan-xiang-bang-ding","permalink":"https://linxz.online/blog/miniprogram-data/#dan-xiang-bang-ding","title":"单向绑定","children":[]},{"level":2,"id":"jian-yi-shuang-xiang-bang-ding","permalink":"https://linxz.online/blog/miniprogram-data/#jian-yi-shuang-xiang-bang-ding","title":"简易双向绑定","children":[]},{"level":2,"id":"zhu-yi","permalink":"https://linxz.online/blog/miniprogram-data/#zhu-yi","title":"注意","children":[]},{"level":2,"id":"ru-he-kan-dao-diao-shi-shu-ju","permalink":"https://linxz.online/blog/miniprogram-data/#ru-he-kan-dao-diao-shi-shu-ju","title":"如何看到调试数据？","children":[]}]}],
"body":"声明数据data:\n所有数据都要在Page()方法的data对象中声明。\n需要用双大括号写法{{}}\n{{}}内部可以进行简单运算，比如算数、三元、逻辑等。但只能写表达式，不能写语句。\n// index.js\nPage({\n  // 在小程序页面中所需要使用的数据均来自于 data 对象\n  data: {\n    id: 1,\n    isChecked: false,\n    school: &#39;尚硅谷&#39;,\n    obj: {\n      name: &#39;tom&#39;\n    }\n  }\n\n})\n\n\n修改数据setData()\nsetData（） 方法有两个作用：\n1． 更新数据\n2． 驱动视图\n获取数据\nconsole.log(this.data.num)\n\n修改数据\n    this.setData({\n      // key：是需要更新的数据\n      // value：是最新的值\n      num: this.data.num + 1\n    })\n\n修改对象\n新增、修改对象属性\n   this.setData({\n      // 如果给对象新增属性，可以将 key 写成数据路径的方式 a.b.c\n      &#39;userInfo.name&#39;: &#39;tom&#39;,\n      &#39;userInfo.age&#39;: 10\n    })\n\n\n如果修改的属性较多，可以用ES6的展开运算符。\n后面的属性会覆盖前面的属性。\n    const userInfo = {\n      ...this.data.userInfo,\n      name: &#39;jerry&#39;,\n      age: 18\n    }\n\n   this.setData({\n      userInfo\n    })\n\n\n也可以利用Object.assign()的方法。\n// Object.assign() 将多个对象合并为一个对象\n   const userInfo = Object.assign(this.data.userInfo, { name: &#39;jerry&#39; }, { age: 18 })\n    this.setData({\n      userInfo\n    })\n\n\n删除对象属性\n单个属性\n    // 删除单个属性\n    delete this.data.userInfo.age\n    // console.log(this.data.userInfo)\n    this.setData({\n      userInfo: this.data.userInfo\n    })\n\n\n多个属性\n使用rest关键字把需要保留的参数保留下来，再把rest赋值给userInfo\n    // 删除多个属性 rest 剩余参数\n    const { age, test, ...rest } = this.data.userInfo\n\n    this.setData({\n      userInfo: rest\n    })\n\n\n修改数组\n展示数组\n&lt;view wx:for=&quot;{{ list }}&quot; wx:key=&quot;index&quot;&gt;{{ item }}&lt;/view&gt;\n\n新增数组\npush方法\n    this.data.list.push(4)\n    this.setData({\n      list: this.data.list\n    })\n\nconcat方法\n    const newList = this.data.list.concat(4)\n    this.setData({\n      list: newList\n    })\n\n展开运算符\n    const newList = [ ...this.data.list, 4 ]\n    this.setData({\n      list: newList\n    })\n\n修改数组\n    this.setData({\n      // &#39;list[1]&#39;: 6\n      &#39;list[0].name&#39;: &#39;jerry&#39;\n    })\n\n删除数组元素\nsplice方法\n    this.data.list.splice(1, 1)\n    this.setData({\n      list: this.data.list\n    })\n\nfilter方法\n    const newList = this.data.list.filter(item =&gt; item !== 2)\n    this.setData({\n      list: newList\n    })\n\n小程序数据双向绑定\n单向绑定\n数据能影响页面，但页面不能影响数据。比如&lt;input value=&quot;{{value}}&quot;/&gt;\n简易双向绑定\n数据能影响页面，页面输入能影响数据。在属性之前加入model:前缀即可，比如`\n注意\n简易双向绑定的属性值如下限制：\n\n\n只能是一个单一字段的绑定，例如：错误用法：\\&lt;input model：value=“值为｛value｝｝“/&gt;\n\n\n尚不能写 data 路径，也就是不支持数组和对象，例如：错误用法：\\&lt;input model：value=“｛ a.b｝｝ &gt;\n\n\n如何看到调试数据？\n调试界面 - AppData\n\n"},{"title":"小程序条件渲染",
"url":"/blog/miniprogram-if/",
"date":"2024-12-26",
"headings":[{"level":1,"id":"wxifshu-xing-zu-dai-ma","permalink":"https://linxz.online/blog/miniprogram-if/#wxifshu-xing-zu-dai-ma","title":"wxif属性组代码：","children":[]},{"level":1,"id":"hiddenshu-xing-dai-ma","permalink":"https://linxz.online/blog/miniprogram-if/#hiddenshu-xing-dai-ma","title":"hidden属性代码：","children":[]}],
"body":"控制页面的展示和隐藏。\n两种方式：\n\n使用wx:if, wx:elif, wx:else属性组； \nhidden属性。\n\nwxif 和hidden 二者的区别：\n\n\nwxif：当条件为 true 时将结构展示出来，否则结构不会进行展示，通过移除/新增节点的方式来实现\n\n\nhidden：当条件为 true 时会将结构隐藏，否则结构会展示出来，通过 display 样式属性来实现的\n\n\nwxif属性组代码：\n&lt;!-- wx:if 属性组 --&gt;\n&lt;!-- wx:if wx:elif wx:else --&gt;\n&lt;!-- 只有对应的条件成立，属性所在的组件才会进行展示 --&gt;\n&lt;view wx:if=&quot;{{ num === 1 }}&quot;&gt;num 等于 {{ num }}&lt;/view&gt;\n&lt;view wx:elif=&quot;{{ num === 2 }}&quot;&gt;num 等于 {{ num }}&lt;/view&gt;\n&lt;view wx:else&gt;num 大于 2， 目前 num 等于 {{ num }}&lt;/view&gt;\n\nhidden属性代码：\n&lt;view hidden=&quot;{{ !isFlag }}&quot;&gt;如果 isFlag 是 true，展示结构，否则隐藏结构&lt;/view&gt;\n\n"},{"title":"小程序列表渲染 List",
"url":"/blog/miniprogram-list/",
"date":"2024-12-26",
"headings":[{"level":1,"id":"shi-li-dai-ma","permalink":"https://linxz.online/blog/miniprogram-list/#shi-li-dai-ma","title":"示例代码","children":[]},{"level":1,"id":"indexke-neng-zhi-xia-biao-huo-zhe-key","permalink":"https://linxz.online/blog/miniprogram-list/#indexke-neng-zhi-xia-biao-huo-zhe-key","title":"index可能指下标或者key","children":[]},{"level":1,"id":"jin-jie-yong-fa-xiu-gai-mo-ren-itemhe-index","permalink":"https://linxz.online/blog/miniprogram-list/#jin-jie-yong-fa-xiu-gai-mo-ren-itemhe-index","title":"进阶用法：修改默认item和index","children":[]},{"level":1,"id":"blockbiao-qian","permalink":"https://linxz.online/blog/miniprogram-list/#blockbiao-qian","title":"block标签","children":[]}],
"body":"wx:for绑定数组或对象，变量名默认item，下标默认index\n建议加上wx:key属性，代表唯一字符串或者数字标识：\n\n\n字符串：代表需要遍历的 array 中item 的某个属性，该属性的值需要是列表中唯一的字符串或数字，且不能动态改变\n\n\n保留关键字 *this 代表在 for 循环中的 item 本身，当 item 本身是一个唯一的字符串或者数字时可以使用\n\n\n示例代码\n&lt;!-- wx:key 的属性值不需要使用双大括号进行包裹，直接写遍历的数组 中 item 的某个属性 --&gt;\n&lt;view wx:for=&quot;{{ fruitList }}&quot; wx:key=&quot;id&quot;&gt;{{ item.name }}&lt;/view&gt;\n\n&lt;view wx:for=&quot;{{ fruitList }}&quot; wx:key=&quot;index&quot;&gt;{{ item.name }}&lt;/view&gt;\n\n&lt;view wx:for=&quot;{{ numList }}&quot; wx:key=&quot;*this&quot;&gt;{{ item }}&lt;/view&gt;\n\n\nindex可能指下标或者key\n&lt;!-- 如果渲染的是数组，item：数组的每一项，index：下标 --&gt;\n&lt;view wx:for=&quot;{{ numList }}&quot;&gt;{{ item }} - {{ index }}&lt;/view&gt;\n\n&lt;!-- 如果渲染的是对象，item：对象属性的值，index：对象属性 --&gt;\n&lt;view wx:for=&quot;{{ obj }}&quot;&gt;{{ item }} - {{ index }}&lt;/view&gt;\n\n\n进阶用法：修改默认item和index\n利用wx:for-item和wx:for-index\n&lt;view wx:for=&quot;{{ obj }}&quot; wx:key=&quot;key&quot; wx:for-item=&quot;value&quot; wx:for-index=&quot;key&quot;&gt;\n  {{ value }} - {{ key }}\n&lt;/view&gt;\n\nblock标签\n不像view标签一样是个组件，只是一个包装块，不会正式渲染。\n&lt;block wx:for=&quot;{{ fruitList }}&quot; wx:key=&quot;id&quot; wx:for-item=&quot;fruitItem&quot; wx:for-index=&quot;i&quot;&gt;\n  &lt;view&gt;名字：{{ fruitItem.name }}&lt;/view&gt;\n  &lt;view&gt;价格：{{ fruitItem.price }}&lt;/view&gt;\n&lt;/block&gt;\n\n\n"},{"title":"zola自定义语法高亮",
"url":"/blog/zola-syntax-highlight/",
"date":"2024-12-26",
"headings":[{"level":1,"id":"xiu-gai-pei-zhi-wen-jian","permalink":"https://linxz.online/blog/zola-syntax-highlight/#xiu-gai-pei-zhi-wen-jian","title":"修改配置文件","children":[]},{"level":1,"id":"xin-jian-yu-fa-gao-liang-gui-ze","permalink":"https://linxz.online/blog/zola-syntax-highlight/#xin-jian-yu-fa-gao-liang-gui-ze","title":"新建语法高亮规则","children":[]}],
"body":"修改配置文件\n修改config.toml文件。\n添加代码：\n[markdown]\nextra_syntaxes_and_themes = [&quot;syntaxes&quot;, &quot;syntaxes/wxml.sublime-syntax&quot;]\n\n新建语法高亮规则\n根据官方建议，创建一个Syntaxes文件夹，里面新建一个wxml.sublime-syntax文件（注意，需要用.sublime-syntax的后缀）。\n我找到一个靠谱的wxml语法高亮仓库。\n询问AI，需要的代码如下：\nname: WXML\nscope: text.html.wxml\nfile_extensions:\n  - wxml\n\nvariables:\n  # 定义常用的微信指令\n  wx_directives: &#39;wx:(if|elif|else|for|for-item|for-index|key|model|class|style|model-prop|model-event)&#39;\n  # 定义事件绑定\n  event_binding: &#39;bind\\w+|catch\\w+&#39;\n\ncontexts:\n  main:\n    # 标签开始\n    - match: (&lt;)(\\/?)(\\w+)\n      captures:\n        1: punctuation.definition.tag.begin.wxml\n        2: punctuation.definition.tag.begin.wxml\n        3: entity.name.tag.wxml\n      push: tag-attributes\n    \n    # 数据绑定表达式 {{}}\n    - match: &#39;{{&#39;\n      scope: punctuation.section.embedded.begin.wxml\n      push: expression\n    \n    # 注释\n    - match: &lt;!--\n      scope: punctuation.definition.comment.wxml\n      push: comment\n\n  # 标签属性上下文\n  tag-attributes:\n    # 标签结束\n    - match: &#39;/?&gt;&#39;\n      scope: punctuation.definition.tag.end.wxml\n      pop: true\n    \n    # 微信指令属性\n    - match: &#39;{{wx_directives}}&#39;\n      scope: entity.other.attribute-name.wxml keyword.control.directive.wxml\n    \n    # 事件绑定\n    - match: &#39;{{event_binding}}&#39;\n      scope: entity.other.attribute-name.wxml support.function.wxml\n    \n    # 普通属性\n    - match: &#39;\\b[\\w-]+\\b&#39;\n      scope: entity.other.attribute-name.wxml\n    \n    # 属性值\n    - match: &#39;=&#39;\n      scope: punctuation.separator.key-value.wxml\n      push: attribute-value\n\n  # 属性值上下文\n  attribute-value:\n    # 双引号字符串\n    - match: &#39;&quot;&#39;\n      scope: punctuation.definition.string.begin.wxml\n      push: double-quoted-string\n    # 单引号字符串\n    - match: &quot;&#39;&quot;\n      scope: punctuation.definition.string.begin.wxml\n      push: single-quoted-string\n\n  # 双引号字符串\n  double-quoted-string:\n    - meta_scope: string.quoted.double.wxml\n    - match: &#39;&quot;&#39;\n      scope: punctuation.definition.string.end.wxml\n      pop: true\n    - include: expression-interpolated\n\n  # 单引号字符串\n  single-quoted-string:\n    - meta_scope: string.quoted.single.wxml\n    - match: &quot;&#39;&quot;\n      scope: punctuation.definition.string.end.wxml\n      pop: true\n    - include: expression-interpolated\n\n  # 表达式内容\n  expression:\n    - meta_scope: source.wxml.embedded.expression\n    - match: &#39;}}&#39;\n      scope: punctuation.section.embedded.end.wxml\n      pop: true\n    - match: &#39;\\b(true|false|null|undefined)\\b&#39;\n      scope: constant.language.wxml\n    - match: &#39;\\b\\d+\\b&#39;\n      scope: constant.numeric.wxml\n    - match: &#39;\\b[a-zA-Z_]\\w*\\b&#39;\n      scope: variable.other.wxml\n\n  # 表达式插值\n  expression-interpolated:\n    - match: &#39;{{&#39;\n      scope: punctuation.section.embedded.begin.wxml\n      push: expression\n\n  # 注释\n  comment:\n    - meta_scope: comment.block.wxml\n    - match: &#39;--&gt;&#39;\n      scope: punctuation.definition.comment.wxml\n      pop: true\n\n"},{"title":"怎么用阿里巴巴矢量图标库",
"url":"/blog/alibaba-icon/",
"date":"2024-12-25",
"headings":[{"level":1,"id":"deng-lu","permalink":"https://linxz.online/blog/alibaba-icon/#deng-lu","title":"登录","children":[]},{"level":1,"id":"sou-suo-gua-he-de-icon","permalink":"https://linxz.online/blog/alibaba-icon/#sou-suo-gua-he-de-icon","title":"搜索适合的icon","children":[]},{"level":1,"id":"tian-jia-dao-xiang-mu","permalink":"https://linxz.online/blog/alibaba-icon/#tian-jia-dao-xiang-mu","title":"添加到项目","children":[]},{"level":1,"id":"chuang-zuo-zai-xian-lian-jie","permalink":"https://linxz.online/blog/alibaba-icon/#chuang-zuo-zai-xian-lian-jie","title":"创作在线连接","children":[]},{"level":1,"id":"importdao-zhu-csszhong","permalink":"https://linxz.online/blog/alibaba-icon/#importdao-zhu-csszhong","title":"import到主css中","children":[]},{"level":1,"id":"zai-xiang-mu-zhong-shi-yong","permalink":"https://linxz.online/blog/alibaba-icon/#zai-xiang-mu-zhong-shi-yong","title":"在项目中使用","children":[]},{"level":1,"id":"ru-guo-chu-xian-xuan-ran-ceng-cuo-wu-de-ti-shi","permalink":"https://linxz.online/blog/alibaba-icon/#ru-guo-chu-xian-xuan-ran-ceng-cuo-wu-de-ti-shi","title":"如果出现渲染层错误的提示","children":[]}],
"body":"公司设计的icon，最好也上传到此。\n登录\n用手机号+密码登录\n搜索适合的icon\n点击购物车图标（添加入库）\n添加到项目\n选择右上角购物车图标，选择添加至项目。如果没有的话，自己新建一个。\n创作在线连接\n点击查看在线连接。点击连接进入网址。\nimport到主css中\n创建一个iconfont的文件夹，并创建一个css文件叫iconfont.scss，将刚才网址的代码复制进去。\n在主css文件中导入。\n@import &quot;./iconfont/iconfont.scss&quot;; /* 导入css，必须以分号结尾 */\n\n在项目中使用\n&lt;text class=&quot;iconfont icon-icon&quot;&gt;&lt;/text&gt;\n\n如果出现渲染层错误的提示\n项目设置 - 选中Base 64，重新生成链接，复制到iconfont.scss里面，清除缓存-重新编译\n"},{"title":"小程序常用的组件",
"url":"/blog/miniprogram-regular-components/",
"date":"2024-12-25",
"headings":[{"level":1,"id":"view-zu-jian","permalink":"https://linxz.online/blog/miniprogram-regular-components/#view-zu-jian","title":"view 组件","children":[]},{"level":1,"id":"swiper-he-swiper-item-zu-jian","permalink":"https://linxz.online/blog/miniprogram-regular-components/#swiper-he-swiper-item-zu-jian","title":"swiper 和 swiper-item 组件","children":[{"level":2,"id":"zi-dong-bo-fang","permalink":"https://linxz.online/blog/miniprogram-regular-components/#zi-dong-bo-fang","title":"自动播放","children":[]}]},{"level":1,"id":"image-zu-jian","permalink":"https://linxz.online/blog/miniprogram-regular-components/#image-zu-jian","title":"image 组件","children":[{"level":2,"id":"imagezu-jian-shu-xing","permalink":"https://linxz.online/blog/miniprogram-regular-components/#imagezu-jian-shu-xing","title":"image组件属性","children":[]},{"level":2,"id":"shi-yong-yao-dian","permalink":"https://linxz.online/blog/miniprogram-regular-components/#shi-yong-yao-dian","title":"使用要点","children":[]}]},{"level":1,"id":"text-zu-jian","permalink":"https://linxz.online/blog/miniprogram-regular-components/#text-zu-jian","title":"text 组件","children":[]},{"level":1,"id":"navigator-zu-jian","permalink":"https://linxz.online/blog/miniprogram-regular-components/#navigator-zu-jian","title":"navigator 组件","children":[{"level":2,"id":"shu-xing","permalink":"https://linxz.online/blog/miniprogram-regular-components/#shu-xing","title":"属性","children":[]},{"level":2,"id":"zhu-yi-shi-xiang","permalink":"https://linxz.online/blog/miniprogram-regular-components/#zhu-yi-shi-xiang","title":"注意事项：","children":[]}]},{"level":1,"id":"scroll-view-zu-jian","permalink":"https://linxz.online/blog/miniprogram-regular-components/#scroll-view-zu-jian","title":"scroll-view 组件","children":[]},{"level":1,"id":"zi-ti-tu-biao","permalink":"https://linxz.online/blog/miniprogram-regular-components/#zi-ti-tu-biao","title":"字体图标","children":[]}],
"body":"view 组件\n相当于div使用\nswiper 和 swiper-item 组件\nswiper：滑块视图容器，其中只能放置 swiper-item 组件\nswiper-item：只可放置在swiper 组件中，宽高自动设置为100%，代表 swiper 中的每一项\n自动播放\n&lt;swiper autoplay&gt; //autoplay=&quot;true&quot;也可以\n\n规定播放时长-2秒 interval\n&lt;swiper autoplay interval=&quot;2000&quot;&gt;\n\n底下小圆点 indicator-dots\n&lt;swiper autoplay interval=&quot;2000&quot; indicator-dots&gt;\n\n\nimage 组件\nimage组件属性\nsrc属性：图片资源\nmode属性： 图片裁剪、缩放\n\n缩放：aspectFit（完整展示图片，可能留白）, aspectFill（裁剪长边，不留白）\n\n\n裁剪: top left, top...\n\nshow-menu-by-longpress: 长按图片显示菜单\n\n长按菜单：转发、收藏、保存等功能\n\nlazy-load: 图片懒加载\n使用要点\n默认宽度320px，高度240px\n就算不设置src属性，也是占据宽和高\ntext 组件\ntext组件只能嵌套text组件。\n功能：\n\n\nuser-select：文本是否可选，用于长按选择文本。\n\n\nspace：显示连续空格\n\n\nnavigator 组件\n属性\n\n\nurl：当前小程序内的跳转链接\n\n\nopen-type：跳转方式\n\n\n\nnavigate：保留当前页面，跳转到应用内的某个页面。但是不能跳到 tabbar 页面 \nredirect： 关闭当前页面，跳转到应用内的某个页面。但不能跳转到 tabbar 页面 \nswitchTab：跳转到 tabBar 页面，并关闭其他所有非 tabBar 页面\nrelaunch：关闭所有页面，打开到应用内的某个页面\nnavigateBack：关闭当前页面，返回上一页面或多级页面\n\n注意事项：\n\n\n路径后可以带参数。参数与路径之间使用？分隔，参数键与参数值用=相连，不同参数用&amp;分隔例如：list？id=10&amp;name=hua，在 onLoad（options）生命周期函数中获取传递的参数\n\n\nopen-type=“switchTab”时不支持传参\n\n\nscroll-view 组件\nscroll-x 允许横向滚动\nscroll-y 允许纵向滚动\n字体图标\n素材地址：阿里巴巴矢量图标库\n"},{"title":"小程序尺寸单位rpx",
"url":"/blog/miniprogram-rpx/",
"date":"2024-12-25",
"headings":[{"level":1,"id":"kai-fa-jian-yi","permalink":"https://linxz.online/blog/miniprogram-rpx/#kai-fa-jian-yi","title":"开发建议","children":[]}],
"body":"为了解决屏幕适配问题推出的。px单位不能实现自适应大小。\nrpx：是小程序新增的自适应单位，它可以根据不同设备的屏幕宽度进行自适应缩放。\n小程序规定任何型号手机：屏幕宽都为 750rpx\n开发建议\n\n\n开发微信小程序时设计师可以用iPhone6 作为视觉稿的标准，iPhone6 的设计稿一般是 750px\n\n\n如果用iPhone6 作为视觉稿的标准量取多少px，直接写多少 rpx 即可，开发起来更方便，也能够适配屏幕的宽度。\n\n\n设计稿宽度是 750px，而iPhone6 的手机设备宽度是375px，设计稿想完整展示到手机中，就需要缩小一倍在iPhone6 下，px 和rpx 的换算关系是：1rpx =0.5px，750rpx =375px，刚好能够填充满整个屏幕的宽度\n"},{"title":"小程序文件结构",
"url":"/blog/miniprogram-file-structure/",
"date":"2024-12-24",
"headings":[{"level":1,"id":"zhu-ti-wen-jian","permalink":"https://linxz.online/blog/miniprogram-file-structure/#zhu-ti-wen-jian","title":"主体文件","children":[]},{"level":1,"id":"ye-mian-wen-jian","permalink":"https://linxz.online/blog/miniprogram-file-structure/#ye-mian-wen-jian","title":"页面文件","children":[]},{"level":1,"id":"pei-zhi-wen-jian","permalink":"https://linxz.online/blog/miniprogram-file-structure/#pei-zhi-wen-jian","title":"配置文件","children":[{"level":2,"id":"app-jsonpei-zhi","permalink":"https://linxz.online/blog/miniprogram-file-structure/#app-jsonpei-zhi","title":"app.json配置","children":[{"level":3,"id":"pageszi-duan","permalink":"https://linxz.online/blog/miniprogram-file-structure/#pageszi-duan","title":"pages字段","children":[]},{"level":3,"id":"windowzi-duan","permalink":"https://linxz.online/blog/miniprogram-file-structure/#windowzi-duan","title":"window字段","children":[]},{"level":3,"id":"tabbarzi-duan","permalink":"https://linxz.online/blog/miniprogram-file-structure/#tabbarzi-duan","title":"tabBar字段","children":[]}]},{"level":2,"id":"ye-mian-pei-zhi","permalink":"https://linxz.online/blog/miniprogram-file-structure/#ye-mian-pei-zhi","title":"页面配置","children":[]}]},{"level":1,"id":"xuan-ran-mo-shi-skeyline-webview","permalink":"https://linxz.online/blog/miniprogram-file-structure/#xuan-ran-mo-shi-skeyline-webview","title":"渲染模式 skeyline -> WebView","children":[]},{"level":1,"id":"ru-he-xin-jian-ye-mian","permalink":"https://linxz.online/blog/miniprogram-file-structure/#ru-he-xin-jian-ye-mian","title":"如何新建页面","children":[{"level":2,"id":"fang-fa-yi-you-jian-xin-jian","permalink":"https://linxz.online/blog/miniprogram-file-structure/#fang-fa-yi-you-jian-xin-jian","title":"方法一：右键新建","children":[]},{"level":2,"id":"fang-fa-er-app-jsontian-jia","permalink":"https://linxz.online/blog/miniprogram-file-structure/#fang-fa-er-app-jsontian-jia","title":"方法二： app.json添加","children":[]}]}],
"body":"主体文件\napp js 入口\napp json 配置\napp wxss 样式\n页面文件\npages文件夹下，每个页面对应一个文件夹\n配置文件\napp.json: 全局属性配置，页面路由\n页面.json：当前页面属性\nproject.config.json: 项目的属性和开发者个人信息\nsitemap.json: 是否允许微信索引，提高被搜索到的概率\napp.json配置\npages字段\n数组第一项是首页，不管什么名字。比如&quot;pages/index/index&quot;\n也可以手动指定：\n&quot;entryPagePath&quot;: &quot;pages/index/index&quot;\n\nwindow字段\n设置状态栏、导航条、标题、窗口背景色。\n\n注意：窗口即下拉窗口，默认不展示的，用户下拉刷新后展示。\n导航条配置实例：\n  &quot;window&quot;: {\n    &quot;navigationBarTitleText&quot;: &quot;凡学子&quot;,\n    &quot;navigationBarBackgroundColor&quot;: &quot;#f3514f&quot;, //导航条颜色\n    &quot;enablePullDownRefresh&quot;: true, //支持下拉窗口\n    &quot;backgroundColor&quot;: &quot;#efefef&quot;, //下拉窗口背景色，这里设置成灰色\n    &quot;backgroundTextStyle&quot;: &quot;dark&quot;  //默认页是暗色\n  },\n\nwindow配置项文档\ntabBar字段\n定义小程序顶部、底部的tab栏，实现页面之间的快速切换\n\ntab 按数组的顺序排序，list 配置最少2个、最多 5个tab。\ntabbar官方文档\n示例代码\n  &quot;tabBar&quot;: {\n    &quot;selectedColor&quot;: &quot;#f3514f&quot;,\n    &quot;color&quot;: &quot;#666&quot;,\n    &quot;backgroundColor&quot;: &quot;#efefef&quot;,\n    &quot;borderStyle&quot;: &quot;white&quot;,\n    &quot;position&quot;: &quot;bottom&quot;,\n    &quot;list&quot;: [\n      {\n        &quot;text&quot;: &quot;首页&quot;,\n        &quot;pagePath&quot;: &quot;pages/index/index&quot;,\n        &quot;iconPath&quot;: &quot;/assets/tabbar/index.png&quot;,\n        &quot;selectedIconPath&quot;: &quot;/assets/tabbar/index-active.png&quot;\n      },\n      {\n        &quot;text&quot;: &quot;分类&quot;,\n        &quot;pagePath&quot;: &quot;pages/cate/cate&quot;,\n        &quot;iconPath&quot;: &quot;/assets/tabbar/cate.png&quot;,\n        &quot;selectedIconPath&quot;: &quot;/assets/tabbar/cate-active.png&quot;\n      },\n      {\n        &quot;text&quot;: &quot;购物车&quot;,\n        &quot;pagePath&quot;: &quot;pages/cart/cart&quot;,\n        &quot;iconPath&quot;: &quot;/assets/tabbar/cart.png&quot;,\n        &quot;selectedIconPath&quot;: &quot;/assets/tabbar/cart-active.png&quot;\n      },\n      {\n        &quot;text&quot;: &quot;我的&quot;,\n        &quot;pagePath&quot;: &quot;pages/profile/profile&quot;,\n        &quot;iconPath&quot;: &quot;/assets/tabbar/profile.png&quot;,\n        &quot;selectedIconPath&quot;: &quot;/assets/tabbar/profile-active.png&quot;\n      }\n    ]\n  },\n\n页面配置\n几乎与window属性一致，不需要额外指定window字段，出现一样的配置，会覆盖window的配置。\n页面配置\n渲染模式 skeyline -&gt; WebView\nskyline渲染还不成熟，先用WebView。\n需要改app.json：\n把render, renderoptions和components三个配置项去掉即可。\n参考视频\n如何新建页面\n方法一：右键新建\npages文件夹右键-新建文件夹-新建Page，这样会添加四个基本文件。\n注意，新建Page不用加后缀。\n方法二： app.json添加\n直接在pages数组下添加即可:\n&quot;pages/profile/profile&quot;\n\n"},{"title":"小程序开发者工具设置",
"url":"/blog/miniprogram-settings/",
"date":"2024-12-24",
"headings":[{"level":1,"id":"ru-guo-dui-yu-dai-ma-xing-gao-bu-man-yi","permalink":"https://linxz.online/blog/miniprogram-settings/#ru-guo-dui-yu-dai-ma-xing-gao-bu-man-yi","title":"如果对于代码行高不满意","children":[]},{"level":1,"id":"ru-he-ba-mo-ni-qi-yi-dao-you-ce","permalink":"https://linxz.online/blog/miniprogram-settings/#ru-he-ba-mo-ni-qi-yi-dao-you-ce","title":"如何把模拟器移到右侧","children":[]},{"level":1,"id":"ru-he-da-kai-diao-shi-debugye-mian","permalink":"https://linxz.online/blog/miniprogram-settings/#ru-he-da-kai-diao-shi-debugye-mian","title":"如何打开调试debug页面","children":[]},{"level":1,"id":"xiao-cheng-xu-kuai-jie-jian","permalink":"https://linxz.online/blog/miniprogram-settings/#xiao-cheng-xu-kuai-jie-jian","title":"小程序快捷键","children":[{"level":2,"id":"duo-guang-biao","permalink":"https://linxz.online/blog/miniprogram-settings/#duo-guang-biao","title":"多光标","children":[]},{"level":2,"id":"fu-zhi-shang-yi-xing","permalink":"https://linxz.online/blog/miniprogram-settings/#fu-zhi-shang-yi-xing","title":"复制上一行","children":[]}]}],
"body":"如果对于代码行高不满意\n设置 - 编辑器设置 - 行距20\n如何把模拟器移到右侧\n视图 - 外观 - 将模拟器移到右侧\n如何打开调试debug页面\n页面顶端 - 点击调试器\n快捷键：cmd + j\n\nStorage可以查看本地存储的数据。\n小程序快捷键\n多光标\noption+左键\n复制上一行\nshift + option + ↑\n"},{"title":"SwiftUI里的actionSheets",
"url":"/blog/swiftui-actionsheets/",
"date":"2024-12-24",
"headings":[{"level":1,"id":"actionsheetyi-jing-qi-yong","permalink":"https://linxz.online/blog/swiftui-actionsheets/#actionsheetyi-jing-qi-yong","title":"actionSheet已经弃用","children":[]},{"level":1,"id":"actionsheetshe-alertde-zhu-yao-qu-bie","permalink":"https://linxz.online/blog/swiftui-actionsheets/#actionsheetshe-alertde-zhu-yao-qu-bie","title":"actionSheets和alert的主要区别","children":[]},{"level":1,"id":"shi-li-dai-ma","permalink":"https://linxz.online/blog/swiftui-actionsheets/#shi-li-dai-ma","title":"示例代码","children":[]}],
"body":"actionSheet已经弃用\n请用confirmationDialog\nactionSheets和alert的主要区别\nactionSheets允许设计更多的按钮。底部菜单而不是中间菜单。\n示例代码\nVstack{}\n.confirmationDialog(&quot;Do you really want to delete the item?&quot;, isPresented: $showConfirmationDialog, titleVisibility: .visible) {\n    if(who==&quot;me&quot;){\n        Button(&quot;Delete&quot;){backgroundColor = .red}\n    }else{\n        Button(&quot;Share&quot;){backgroundColor = .yellow}\n        Button(&quot;Report&quot;){backgroundColor = .blue}\n    }\n} message: {\n    Text(&quot;The action cannot be undone.&quot;)\n    }\n\n"},{"title":"SwiftUI图标和渐变",
"url":"/blog/swiftui-gradient-icons/",
"date":"2024-12-24",
"headings":[{"level":1,"id":"swiftuiru-he-shi-yong-jian-bian-gradient","permalink":"https://linxz.online/blog/swiftui-gradient-icons/#swiftuiru-he-shi-yong-jian-bian-gradient","title":"swiftui如何使用渐变gradient","children":[]},{"level":1,"id":"swiftuiru-he-shi-yong-icons","permalink":"https://linxz.online/blog/swiftui-gradient-icons/#swiftuiru-he-shi-yong-icons","title":"swiftui如何使用icons","children":[{"level":2,"id":"shi-yong-yuan-cai-se-icon","permalink":"https://linxz.online/blog/swiftui-gradient-icons/#shi-yong-yuan-cai-se-icon","title":"使用原彩色icon","children":[]}]}],
"body":"swiftui如何使用渐变gradient\nRoundedRectangle(cornerRadius: 25)\n            .fill(\n                LinearGradient(gradient: Gradient(colors: [Color.teal, Color.blue]), startPoint: .topLeading, endPoint: .trailing)\n}\n\nswiftui如何使用icons\n改变大小的三种方法：.font(.largeTitle), .font(.system(size:100)), .resizable().scaledToFit().frame()\n//MARK: - 大小\n// .font(.largeTitle)\n    \n// .font(.system(size: 100))\n    \n    .resizable()\n//  .aspectRatio(contentMode: .fit)\n    .scaledToFit()\n    .frame(width: 300, height: 300)\n    \n//MARK: - 颜色\n    .foregroundStyle(.green)\n    }\n\n使用原彩色icon\n.symbolRenderingMode(.multicolor)\n\n"},{"title":"SwiftUI的提示框alert",
"url":"/blog/swiftui-alert/",
"date":"2024-12-23",
"headings":[{"level":1,"id":"alertde-ji-ben-yong-fa","permalink":"https://linxz.online/blog/swiftui-alert/#alertde-ji-ben-yong-fa","title":"alert的基本用法","children":[{"level":2,"id":"ji-ben-yang-shi-biao-ti-miao-shu-mo-ren-okan-niu","permalink":"https://linxz.online/blog/swiftui-alert/#ji-ben-yang-shi-biao-ti-miao-shu-mo-ren-okan-niu","title":"基本样式：标题+描述+默认OK按钮","children":[]},{"level":2,"id":"kuo-zhan-yang-shi-zi-ding-yi-an-niu","permalink":"https://linxz.online/blog/swiftui-alert/#kuo-zhan-yang-shi-zi-ding-yi-an-niu","title":"扩展样式：自定义按钮","children":[]}]}],
"body":"alert的基本用法\n基本样式：标题+描述+默认OK按钮\nButton{\n.alert(&quot;title&quot;, isPresented: $showAlert){\n} message: {\n\tText(&quot;This is the alert message&quot;)\n}\n\n扩展样式：自定义按钮\n.alert(&quot;Some Alert&quot;, isPresented: $showAlert) {\n    Button(&quot;Cancel&quot;, role: .cancel){\n    }\n    Button(&quot;Delete&quot;, role: .destructive) {\n        backgroundColor = .red\n    }\n} message: {\n    Text(&quot;What do you want?&quot;)\n    }\n\n"},{"title":"SwiftUI的sheets",
"url":"/blog/swiftui-sheets/",
"date":"2024-12-23",
"headings":[],
"body":"基本使用：\nimport SwiftUI\n\nstruct SheetsBootcamp: View {\n    \n    @State var showSheet: Bool = false\n    \n    var body: some View {\n        ZStack{\n            Color.green\n                .edgesIgnoringSafeArea(.all)\n            \n            Button {\n                showSheet.toggle()\n            } label: {\n                Text(&quot;Button&quot;)\n                    .foregroundStyle(.green)\n                    .font(.headline)\n                    .padding(20)\n                    .background(.white)\n                    .cornerRadius(10)\n            }\n            //MARK: - Sheet逻辑\n            .sheet(isPresented: $showSheet) {\n                //DO NOT ADD CONDITIONAL LOGIC\n                SecondScreen()\n            }\n            \n            //MARK: - 全屏画面逻辑\n//            .fullScreenCover(isPresented: $showSheet) {\n//                SecondScreen()\n//            }\n\n        }\n    }\n}\n\nstruct SecondScreen: View {\n    \n    @Environment(\\.dismiss) var dismiss\n    \n    var body: some View {\n        ZStack(alignment: .topLeading){\n            Color.red\n                .edgesIgnoringSafeArea(.all)\n            \n            Button {\n                dismiss()\n            } label: {\n                Image(systemName: &quot;xmark&quot;)\n                    .foregroundStyle(.white)\n                    .font(.largeTitle)\n                    .padding(20)\n            }\n\n        }\n    }\n}\n\n#Preview {\n    SheetsBootcamp()\n//    SecondScreen()\n}\n\n"},{"title":"SwiftUI的基础形状和颜色",
"url":"/blog/swiftui-shape-color/",
"date":"2024-12-22",
"headings":[{"level":1,"id":"yan-se","permalink":"https://linxz.online/blog/swiftui-shape-color/#yan-se","title":"颜色","children":[{"level":2,"id":"zen-me-yong-colotliteral","permalink":"https://linxz.online/blog/swiftui-shape-color/#zen-me-yong-colotliteral","title":"怎么用colotLiteral","children":[]},{"level":2,"id":"ji-ben-yan-se","permalink":"https://linxz.online/blog/swiftui-shape-color/#ji-ben-yan-se","title":"基本颜色","children":[]}]},{"level":1,"id":"xing-zhuang","permalink":"https://linxz.online/blog/swiftui-shape-color/#xing-zhuang","title":"形状","children":[]}],
"body":"颜色\n怎么用colotLiteral\n输入以下模式就可以自选颜色了。\nvar customColor = #colorLiteral(\n\n基本颜色\nstruct ColorsBootcamp: View {\n    var body: some View {\n        RoundedRectangle(cornerRadius: 25)\n            .frame(width: 300, height: 200)\n//            .foregroundStyle(.primary)\n        //MARK: - UIColor =&gt; Color from UIKit\n//            .foregroundStyle(Color(uiColor: .secondarySystemBackground))\n        //MARK: - 自定义颜色\n            .foregroundStyle(.custom)\n        //MARK: - 阴影\n            .shadow(radius: 10)\n            .shadow(color: .custom.opacity(0.3) ,radius: 10, x: -20, y: -20)\n    }\n}\n\n形状\nstruct ShapesBootcamp: View {\n    var body: some View {\n        //MARK: - 圆形\n        //        Circle()\n        //填充\n        //            .fill(.red)\n        //            .foregroundStyle(.blue)\n        \n        //描边\n        //            .stroke()\n        //            .stroke(Color.red, lineWidth: 20)\n        \n        //半圆\n        //            .trim(from: 0.5, to: 1)\n        \n        //MARK: - 椭圆形\n//        Ellipse()\n//            .frame(width: 200, height: 100)\n        \n        //MARK: - 胶囊形状\n//        Capsule(style: .circular)\n//            .frame(width: 200, height: 100)\n        \n        //MARK: - 矩形\n//        Rectangle()\n        \n        //MARK: - 圆角矩形（文本框）\n        RoundedRectangle(cornerRadius: 10)\n            .frame(width: 300, height: 200)\n    }\n}\n\n"},{"title":"SwiftUI的文字设计",
"url":"/blog/swiftui-text/",
"date":"2024-12-21",
"headings":[],
"body":"包括所有的文字设计，包括加粗、下划线、对齐等。\nimport SwiftUI\n\nstruct TextBootcamp: View {\n    var body: some View {\n        Text(&quot;Hello, World!This is a good place to stay. Welcome you. Here is good.&quot;)\n            //加粗的两种方式\n            .font(.title)\n            .bold()\n        \n            //下划线\n            .underline(color: .red)\n        \n            //斜体\n            .italic()\n        \n            //删除线\n            .strikethrough(color: .green)\n        \n            //对齐方式\n            .multilineTextAlignment(.leading)\n        \n            //自定义字体和大小\n            .font(.system(size: 24, weight: .bold, design: .monospaced))\n        \n            //颜色\n            .foregroundStyle(.gray)\n        \n            //文本框\n            .frame(width: 200, height: 100, alignment: .leading)\n            //文本框的字体自适应\n            .minimumScaleFactor(0.2)\n    }\n}\n\n#Preview {\n    TextBootcamp()\n}\n\n"},{"title":"NavigationView和NavigationLink介绍",
"url":"/blog/navigationview/",
"date":"2024-12-20",
"headings":[{"level":1,"id":"wei-shen-me-yao-yong-navigationview","permalink":"https://linxz.online/blog/navigationview/#wei-shen-me-yao-yong-navigationview","title":"为什么要用NavigationView？","children":[]},{"level":1,"id":"shi-yong-zhu-yi","permalink":"https://linxz.online/blog/navigationview/#shi-yong-zhu-yi","title":"使用注意","children":[]},{"level":1,"id":"biao-ti-lan","permalink":"https://linxz.online/blog/navigationview/#biao-ti-lan","title":"标题栏","children":[]},{"level":1,"id":"zuo-you-biao-ti-yuan-su","permalink":"https://linxz.online/blog/navigationview/#zuo-you-biao-ti-yuan-su","title":"左右标题元素","children":[]},{"level":1,"id":"navigationlink","permalink":"https://linxz.online/blog/navigationview/#navigationlink","title":"NavigationLink","children":[]},{"level":1,"id":"dai-ma-can-kao","permalink":"https://linxz.online/blog/navigationview/#dai-ma-can-kao","title":"代码参考","children":[]}],
"body":"注意：NavigationView已弃用，使用NavigationStack。参考苹果开发者手册。\n为什么要用NavigationView？\n\n可以用顶部菜单\n可以用NavigationLink跳转\n\n使用注意\n不要embed NavigationView 到另一个NavigationView上，保持只有1个。\n标题栏\n.navigationTitle(&quot;All Inboxes&quot;)\n.navigationBarTitleDisplayMode(.inline) //居中小标题\n.navigationBarHidden(true) //标题栏隐藏，仅需使用NavigationLink时用\n\n左右标题元素\nToolbarItem(placement: .topBarLeading){}\n\nToolbarItem(placement: .topBarTrailing){}\n\nNavigationLink\n页面跳转。\n.tint()给图标上色。\nNavigationLink {\n    Text(&quot;MyContacts&quot;)\n} label: {\n    Image(systemName: &quot;person.fill&quot;)\n    }\n.tint(.red)\n\n代码参考\nimport SwiftUI\n\nstruct NavigationViewBootcamp: View {\n    var body: some View {\n        NavigationView{\n            ScrollView {\n                NavigationLink(&quot;Hello, World!&quot;) {\n                    MyOtherScreen()\n                }\n                \n                Text(&quot;Hello&quot;)\n                Text(&quot;Hello&quot;)\n                Text(&quot;Hello&quot;)\n          \n            }\n            .navigationTitle(&quot;All Inboxes&quot;)\n            .toolbar {\n                //左图标\n                ToolbarItem(placement: .topBarLeading) {\n                    \n                    HStack {\n                        NavigationLink {\n                            Text(&quot;MyContacts&quot;)\n                        } label: {\n                            Image(systemName: &quot;person.fill&quot;)\n                        }\n                        .tint(.red)\n                        \n                        Image(systemName: &quot;flame.fill&quot;)\n                    } //图标颜色，.accentColor已弃用\n\n                }\n                \n                //右图标\n                ToolbarItem(placement: .topBarTrailing) {\n                    \n                    NavigationLink {\n                        Text(&quot;Settings&quot;)\n                    } label: {\n                        Image(systemName: &quot;gear&quot;)\n                    }\n                    \n                }\n                \n            }\n                \n            \n            //            .navigationBarTitleDisplayMode(.inline) //居中小标题\n            //            .navigationBarHidden(true) //标题栏隐藏，仅需使用NavigationLink时用\n        }\n    }\n}\n\n//子视图无需用NavigationView即可使用NavigationLink等特性\nstruct MyOtherScreen: View{\n    \n    //注意：presentMode已经弃用\n    @Environment(\\.dismiss) var dismiss\n    \n    var body: some View{\n        ZStack{\n            Color.green.ignoresSafeArea()\n                .navigationTitle(&quot;Green Screen&quot;)\n            \n            VStack {\n                Button(&quot;Back Button&quot;) {\n                    dismiss()\n                }\n                \n                NavigationLink(&quot;Click here&quot;){\n                    Text(&quot;Third Screen&quot;)\n                }\n                \n                NavigationLink {\n                    Text(&quot;Book&quot;)\n                } label: {\n                    Image(systemName: &quot;book.fill&quot;)\n                }\n            }\n        }\n    }\n}\n\n#Preview {\n    NavigationViewBootcamp()\n}\n\n"},{"title":"SwiftUI获取mysql数据",
"url":"/blog/swiftui-mysql/",
"date":"2024-12-20",
"headings":[{"level":1,"id":"jia-she-yi-ge-pythonhou-duan","permalink":"https://linxz.online/blog/swiftui-mysql/#jia-she-yi-ge-pythonhou-duan","title":"架设一个python后端","children":[]},{"level":1,"id":"she-zhi-yi-ge-viewmodellian-jie","permalink":"https://linxz.online/blog/swiftui-mysql/#she-zhi-yi-ge-viewmodellian-jie","title":"设置一个ViewModel连接","children":[]},{"level":1,"id":"qian-duan-dai-ma-contentview","permalink":"https://linxz.online/blog/swiftui-mysql/#qian-duan-dai-ma-contentview","title":"前端代码 - ContentView","children":[]}],
"body":"SwiftUI获取mysql数据\n架设一个python后端\nfrom flask import Flask, jsonify\nimport mysql.connector\n\napp = Flask(__name__)\n\n# 连接数据库的函数\ndef get_db_connection():\n    return mysql.connector.connect(\n        host=&#39;xxx&#39;, # 替换成你的数据库地址\n        user=&#39;lxz&#39;,  # 替换成你的数据库用户名\n        password=&#39;xxx&#39;,  # 替换成你的数据库密码\n        database=&#39;chat_history&#39;  # 替换成你的数据库名称\n    )\n\n# 获取前10个ai_response内容的接口\n@app.route(&#39;/get_ai_responses&#39;, methods=[&#39;GET&#39;])\ndef get_ai_responses():\n    connection = get_db_connection()\n    cursor = connection.cursor(dictionary=True)\n    \n    # 查询前10条ai_response内容\n    cursor.execute(&#39;SELECT ai_response FROM chat_logs LIMIT 10&#39;)\n    results = cursor.fetchall()\n    \n    # 提取ai_response列\n    ai_responses = [row[&#39;ai_response&#39;] for row in results]\n    \n    # 关闭连接\n    cursor.close()\n    connection.close()\n\n    return jsonify(ai_responses)\n\nif __name__ == &#39;__main__&#39;:\n    app.run(debug=True, host=&#39;0.0.0.0&#39;, port=5001)\n\n这个后端以数组的形式输出数据库ai_response列的前十个内容。\n设置一个ViewModel连接\n方式和api连接的方式一样。\n除了要注意decode的方式，需要根据后端返回的结果修改，可以先用Postman测试一下返回的结果，再看这么接数据。\nimport SwiftUI\n\nclass ViewModel: ObservableObject {\n    @Published var responseText: [String]? = []\n    \n    //MARK: - GET请求\n    func fetchAIResponses(){\n        //创建url\n        guard let url = URL(string: &quot;http://127.0.0.1:5001/get_ai_responses&quot;) else { return }\n        \n        //创建session\n        let session = URLSession(configuration: .default)\n        \n        //创建task\n        let task = session.dataTask(with: url) { data, response, error in\n            // 错误处理\n            guard error == nil else {\n                print(&quot;Error: \\(error!.localizedDescription)&quot;)\n                return\n            }\n            \n            // 检查响应状态\n            guard let httpResponse = response as? HTTPURLResponse,\n                  httpResponse.statusCode == 200 else {\n                print(&quot;Invalid response&quot;)\n                return\n            }\n            \n            guard let data = data else {\n                print(&quot;No data received&quot;)\n                return\n            }\n            \n            // 解析 JSON 数据 - 数组\n            guard let content = try? JSONDecoder().decode([String].self, from: data) else {\n                print(&quot;JSON Parsing Error or unexpected structure&quot;)\n                return\n            }\n            \n            //测试返回值\n            print(content)\n            \n            DispatchQueue.main.async {\n                self.responseText = content  // 更新界面上的文字内容\n            }\n        }\n        \n        task.resume()\n    }\n}\n\n前端代码 - ContentView\nimport SwiftUI\n\nstruct ContentView: View {\n    \n    @StateObject var viewModel = ViewModel()\n    \n    var body: some View {\n        \n        VStack {\n            if let responses = viewModel.responseText{\n                List(responses, id: \\.self) { response in\n                    Text(response)\n                }\n                .listRowSpacing(20)\n            } else {\n                Text(&quot;没有数据&quot;)\n            }\n            \n            Button {\n                viewModel.fetchAIResponses()\n            } label: {\n                Text(&quot;点击获取数据库数据&quot;)\n            }\n\n        }\n        \n    }\n}\n\n#Preview {\n    ContentView()\n}\n\n"},{"title":"SwiftUI如何使用StateObject和ObservedObject",
"url":"/blog/swiftui-stateobject-observedobject/",
"date":"2024-12-20",
"headings":[{"level":1,"id":"shu-ju-duan-viewmodel","permalink":"https://linxz.online/blog/swiftui-stateobject-observedobject/#shu-ju-duan-viewmodel","title":"数据端 - ViewModel","children":[]},{"level":1,"id":"uiduan-contentview","permalink":"https://linxz.online/blog/swiftui-stateobject-observedobject/#uiduan-contentview","title":"UI端 - ContentView","children":[]}],
"body":"数据端 - ViewModel\n\n使用ObservableObject的protocol\n使用@Publish标注变量\n\nclass FruitViewModel: ObservableObject{\n    //Publish与State一样\n    @Published var fruitArray: [FruitModel] = []\n    @Published var isLoading: Bool = false\n}\n\nUI端 - ContentView\n\n主视图使用@StateObject，可以不必多次渲染数据。\n子视图使用@ObservedObject，方便实时更新数据。\n\n主视图：\n@StateObject var fruitViewModel: FruitViewModel = FruitViewModel()\n\n子视图：\n@ObservedObject var fruitViewModel: FruitViewModel\n\n"},{"title":"SwiftUI如何调试暗夜模式Dark Mode？",
"url":"/blog/swiftui-darkmode/",
"date":"2024-12-19",
"headings":[{"level":1,"id":"cha-kan-an-ye-mo-shi","permalink":"https://linxz.online/blog/swiftui-darkmode/#cha-kan-an-ye-mo-shi","title":"查看暗夜模式","children":[]},{"level":1,"id":"swiftuiru-he-kai-qi-ming-an-liang-ge-mo-shi-yu-lan","permalink":"https://linxz.online/blog/swiftui-darkmode/#swiftuiru-he-kai-qi-ming-an-liang-ge-mo-shi-yu-lan","title":"SwiftUI如何开启明暗两个模式预览？","children":[]},{"level":1,"id":"chu-li-an-ye-mo-shi-de-san-chong-yan-se-fang-an","permalink":"https://linxz.online/blog/swiftui-darkmode/#chu-li-an-ye-mo-shi-de-san-chong-yan-se-fang-an","title":"处理暗夜模式的三种颜色方案","children":[{"level":2,"id":"primaryyan-se-shu-xing","permalink":"https://linxz.online/blog/swiftui-darkmode/#primaryyan-se-shu-xing","title":"PRIMARY颜色属性","children":[]},{"level":2,"id":"tian-jia-colorset","permalink":"https://linxz.online/blog/swiftui-darkmode/#tian-jia-colorset","title":"添加ColorSet","children":[]},{"level":2,"id":"shi-yong-enviromentvalue-colorscheme","permalink":"https://linxz.online/blog/swiftui-darkmode/#shi-yong-enviromentvalue-colorscheme","title":"使用EnviromentValue - colorScheme","children":[]},{"level":2,"id":"dai-ma-can-kao","permalink":"https://linxz.online/blog/swiftui-darkmode/#dai-ma-can-kao","title":"代码参考：","children":[]}]}],
"body":"查看暗夜模式\n手机下的小按钮 - ColorScheme\n\nSwiftUI如何开启明暗两个模式预览？\n写两个Preview代码即可\n#Preview {\n    DarkModeBootCamp()\n        .preferredColorScheme(.dark)\n}\n\n#Preview {\n    DarkModeBootCamp()\n        .preferredColorScheme(.light)\n}\n\n\n处理暗夜模式的三种颜色方案\nPRIMARY颜色属性\n.primary \n默认情况下，在白色背景下是黑色，在黑色背景下是白色\n.secondary\n一直是灰色\n颜色层次的知识\n添加ColorSet\nAssets - 右键添加ColorSet - 打开inspectors窗口 - 选择白天暗夜的颜色 \n颜色会全局自适应。\n使用EnviromentValue - colorScheme\n@Environment(\\.colorScheme) private var colorScheme\n\nText(&quot;This color is locally adaptive!&quot;)\n                        .foregroundStyle(colorScheme == .light ? .green : .yellow)\n\n代码参考：\nimport SwiftUI\n\nstruct DarkModeBootCamp: View {\n    \n    @Environment(\\.colorScheme) private var colorScheme\n    \n    var body: some View {\n        NavigationView{\n            ScrollView{\n                VStack(spacing:20){\n                    Text(&quot;This text is PRIMARY&quot;)\n                        .foregroundStyle(.primary)\n                    Text(&quot;This text is SECONDARY&quot;)\n                        .foregroundStyle(.secondary)\n                    Text(&quot;This text is BLACK&quot;)\n                        .foregroundStyle(.black)\n                    Text(&quot;This text is WHITE&quot;)\n                        .foregroundStyle(.white)\n                    Text(&quot;This color is globally adaptive!&quot;)\n                        .foregroundStyle(.adaptive)\n                    Text(&quot;This color is locally adaptive!&quot;)\n                        .foregroundStyle(colorScheme == .light ? .green : .yellow)\n                }\n            }\n            .navigationTitle(&quot;Dark Mode Bootcamp&quot;)\n        }\n    }\n}\n\n#Preview {\n    DarkModeBootCamp()\n        .preferredColorScheme(.dark)\n}\n\n#Preview {\n    DarkModeBootCamp()\n        .preferredColorScheme(.light)\n}\n\n\n"},{"title":"SwiftUI的环境变量EnvironmentValues",
"url":"/blog/swiftui-environmentvalues/",
"date":"2024-12-19",
"headings":[{"level":1,"id":"dismiss-dai-ma-shi-li","permalink":"https://linxz.online/blog/swiftui-environmentvalues/#dismiss-dai-ma-shi-li","title":"dismiss()代码示例","children":[]},{"level":1,"id":"yu-environmentobjectde-qu-bie","permalink":"https://linxz.online/blog/swiftui-environmentvalues/#yu-environmentobjectde-qu-bie","title":"与@EnvironmentObject的区别","children":[{"level":2,"id":"yong-fa","permalink":"https://linxz.online/blog/swiftui-environmentvalues/#yong-fa","title":"用法","children":[]}]}],
"body":"用于共享系统提供的变量，修改系统配置如黑夜模式、退出页面等\n@Environment：适用于访问系统提供的、或父视图通过 .environment() 提供的环境值，通常是一些比较简单的数据（如颜色模式、语言环境等），它不需要显式的对象创建，而是自动获取。\ndismiss()代码示例\n用于立即退出当前编辑页面\n@Environment(\\.dismiss) private var dismiss\n\n .navigationBarItems(\n                leading: Button(&quot;取消&quot;) {\n                    dismiss()\n                }\n\ndismiss-environmentValues官方参考网址\n与@EnvironmentObject的区别\n@EnvironmentObject：适用于传递和共享自定义的、复杂的对象状态，通常是一些全局的、跨越多个视图共享的状态。你需要显式地注入对象并使用它。\n用法\n@EnvironmentObject 更适合于共享复杂的应用状态，而 @Environment 主要用于系统环境信息和较轻量级的共享数据。\n"},{"title":"如何在手机上调试iOS的API链接?",
"url":"/blog/swiftui-mobile-api/",
"date":"2024-12-19",
"headings":[],
"body":"打开Targets - Info - App Transport Security Settings\n添加\nAllow Arbitary Loads，值为YES即可\n\n"},{"title":"swiftUI滚动页面ScrollView基本使用",
"url":"/blog/swiftui-scrollview/",
"date":"2024-12-19",
"headings":[{"level":1,"id":"netflixxiao-guo","permalink":"https://linxz.online/blog/swiftui-scrollview/#netflixxiao-guo","title":"NetFlix效果","children":[]}],
"body":"ScrollView(.horizontal, showIndicators: false){}\n        //showIndicators滚动条\n        ScrollView(.horizontal, showsIndicators: true) {\n            HStack{\n                ForEach(0..&lt;50){ index in\n                    Rectangle()\n                        .fill(.blue)\n                        .frame(width: 300, height: 300)\n                }\n\n            }\n        }\n\nNetFlix效果\n这里用到懒加载LazyVStack，就可以边scroll，边加载数据。避免数据量过大造成崩溃。\nimport SwiftUI\n\nstruct ScrollViewBootcamp: View {\n    var body: some View {\n        ScrollView{\n            LazyVStack{\n                ForEach(0..&lt;10){ index in\n                    ScrollView(.horizontal, showsIndicators: false) {\n                        HStack{\n                            ForEach(0..&lt;20){ index in\n                                RoundedRectangle(cornerRadius: 25)\n                                    .fill(.white)\n                                    .frame(width: 200, height: 150)\n                                    .shadow(radius: 10)\n                                    .padding()\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\n#Preview {\n    ScrollViewBootcamp()\n}\n\n\n"},{"title":"SwiftData的增删改查",
"url":"/blog/swiftdata/",
"date":"2024-12-18",
"headings":[{"level":1,"id":"zhu-wen-jian-pei-zhi","permalink":"https://linxz.online/blog/swiftdata/#zhu-wen-jian-pei-zhi","title":"主文件配置","children":[{"level":2,"id":"ru-guo-xu-yao-cun-chu-liang-ge-biao-zen-me-ban","permalink":"https://linxz.online/blog/swiftdata/#ru-guo-xu-yao-cun-chu-liang-ge-biao-zen-me-ban","title":"如果需要存储两个表怎么办？","children":[]},{"level":2,"id":"ru-he-yu-lan-swiftdatali-mian-de-shu-ju","permalink":"https://linxz.online/blog/swiftdata/#ru-he-yu-lan-swiftdatali-mian-de-shu-ju","title":"如何预览SwiftData里面的数据？","children":[]}]},{"level":1,"id":"tian-jia-shu-ju","permalink":"https://linxz.online/blog/swiftdata/#tian-jia-shu-ju","title":"添加数据","children":[]},{"level":1,"id":"zhan-shi-shu-ju","permalink":"https://linxz.online/blog/swiftdata/#zhan-shi-shu-ju","title":"展示数据","children":[]},{"level":1,"id":"xiu-gai-shu-ju","permalink":"https://linxz.online/blog/swiftdata/#xiu-gai-shu-ju","title":"修改数据","children":[]},{"level":1,"id":"shan-chu-shu-ju","permalink":"https://linxz.online/blog/swiftdata/#shan-chu-shu-ju","title":"删除数据","children":[]},{"level":1,"id":"swiftdatade-jiao-cheng","permalink":"https://linxz.online/blog/swiftdata/#swiftdatade-jiao-cheng","title":"SwiftData的教程","children":[]}],
"body":"如果要实现数据库的实时更新，必须要context.save()。\n主文件配置\n关键是modelContainer的配置和print路径配置。\nimport SwiftUI\n\n@main\nstruct Todoey_swiftDataApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n        .modelContainer(for: Item.self)\n    }\n    \n    init(){\n        print(URL.applicationSupportDirectory.path(percentEncoded: false))\n    }\n}\n\n如果需要存储两个表怎么办？\nItem.self是一个表的名字，如果需要增加表，则modelContainer要改成数组形式，如modelContainer(for: [Item.self, Category.self])。\n如何预览SwiftData里面的数据？\n根据print(URL.applicationSupportDirectory.path(percentEncoded: false))，运行程序后会打印出数据库的路径，然后用DB Browser for SQLite打开这个路径下的数据库文件，就可以看到数据了。\n添加数据\ncontext.insert()\n\n定义context\n\n@Environment(\\.modelContext) private var context\n\n\n保存数据\n\nButton(&quot;添加&quot;) {\n                    let newItem = Item(title: title, done: done)\n                    context.insert(newItem)\n                    do {\n                        try context.save()  // 保存上下文的所有更改\n                        isPresented = false\n                    } catch {\n                        print(&quot;保存数据时出错: \\(error)&quot;)\n                    }\n\n\n数据结构\n\n重点是@Model\nimport SwiftData\n\n@Model\nclass Item{\n    var title: String\n    var done: Bool\n    \n        init(\n            title: String,\n            done: Bool\n        ){\n            self.title = title\n            self.done = done\n        }\n}\n\n展示数据\n\n定义context和数据\n\nimport SwiftData\n@Environment(\\.modelContext) private var context\n@Query(sort: \\Item.title) private var items: [Item]\n\n\n展示数据\n\nList{\n\tForEach(items){ item in\n\t\tText(item.title)\n\t}\n}\n\n修改数据\n用getter和setter辅助修改\nForEach(items) { item in\n                        Toggle(item.title, isOn: Binding(\n                            //获取当前.done的值\n                            get: { item.done },\n                            //.done的值变化时，操作数据库\n                            set: { newValue in\n                                item.done = newValue\n                                do {\n                                    try context.save()\n                                } catch {\n                                    print(&quot;保存数据时出错: \\(error)&quot;)\n                                }\n                                \n                            }\n                        ))\n\n删除数据\ncontext.delete()\n                        .swipeActions(edge: .trailing, allowsFullSwipe: true) {\n                            Button(role: .destructive) {\n                                context.delete(item)\n                                do {\n                                    try context.save()  // 提交更改\n                                } catch {\n                                    print(&quot;删除项目时出错: \\(error)&quot;)\n                                }\n                            } label: {\n                                Label(&quot;删除&quot;, systemImage: &quot;trash&quot;)\n                            }\n                        }\n\nSwiftData的教程\nswiftData教程-Paul Hudson-HackingWithSwift\n以上的教程还有CoreData版本\n更多教程，可以参考100天SwiftUI\n"},{"title":"swiftUI如何添加背景颜色？",
"url":"/blog/swiftui-background/",
"date":"2024-12-18",
"headings":[{"level":1,"id":"stacks","permalink":"https://linxz.online/blog/swiftui-background/#stacks","title":"stacks","children":[]},{"level":1,"id":"xing-zhuang","permalink":"https://linxz.online/blog/swiftui-background/#xing-zhuang","title":"形状","children":[]}],
"body":"stacks\n.background(.red)\nVStack()\n\t.background(.black)\n\n形状\n.fill(.red)\nRectangle()\n\t.fill(.red)\n\t.frame(width:50, height:50)\n\n"},{"title":"SwiftUI文字效果",
"url":"/blog/swiftui-fonts/",
"date":"2024-12-18",
"headings":[{"level":1,"id":"fang-da-zi-ti","permalink":"https://linxz.online/blog/swiftui-fonts/#fang-da-zi-ti","title":"放大字体","children":[]},{"level":1,"id":"wen-zi-yan-se","permalink":"https://linxz.online/blog/swiftui-fonts/#wen-zi-yan-se","title":"文字颜色","children":[]}],
"body":"放大字体\n.font(.largeTitle)\n\n文字颜色\n.foregroundColor(.red)\n\n"},{"title":"SwiftUI的ForEach的基本使用",
"url":"/blog/swiftui-list-foreach/",
"date":"2024-12-18",
"headings":[{"level":1,"id":"xu-yao-yong-dao-indexde-qing-kuang","permalink":"https://linxz.online/blog/swiftui-list-foreach/#xu-yao-yong-dao-indexde-qing-kuang","title":"需要用到index的情况。","children":[]},{"level":1,"id":"xu-yao-yong-dao-idde-qing-kuang","permalink":"https://linxz.online/blog/swiftui-list-foreach/#xu-yao-yong-dao-idde-qing-kuang","title":"需要用到id的情况","children":[{"level":2,"id":"zi-ji-zhun-bei-id","permalink":"https://linxz.online/blog/swiftui-list-foreach/#zi-ji-zhun-bei-id","title":"自己准备id","children":[]},{"level":2,"id":"jie-gou-ti-ben-shen-han-you-id","permalink":"https://linxz.online/blog/swiftui-list-foreach/#jie-gou-ti-ben-shen-han-you-id","title":"结构体本身含有id","children":[]}]}],
"body":"语法：\nForEach(次数）{index in sth} 或 ForEach(数组, id）{item in sth}\n0..&lt;10指重复10次，index从0到9\n ForEach(0..&lt;10) { index in\n                Text(&quot;Hi: \\(index)&quot;)\n            }\n\n需要用到index的情况。\n ForEach(data.indices) { index in\n                Text(&quot;\\(data[index]): \\(index)&quot;)\n            }\n\n需要用到id的情况\n什么情况需要用id呢？比如需要删除元素的情况。\n自己准备id\n\nstruct Item: Identifiable{\n    var id = UUID()\n    var title = &quot;&quot;\n    var done = false\n}\n\nlet items = [\n        Item(title: &quot;item1&quot;,done: false),\n        Item(title: &quot;item2&quot;,done:true),\n        Item(title: &quot;item3&quot;,done:false)\n    ]\n\nForEach(items) { item in\n\tText(&quot;\\(item.title): \\(item.id)&quot;)\n}\n\n结构体本身含有id\n比如realm\nimport RealmSwift\n\nclass Item: Object, Identifiable{\n    @Persisted var title: String = &quot;&quot;\n    @Persisted var done: Bool = false\n}\n\nForEach(items, id: \\.self) { item in\n\tText(&quot;\\(item.title): \\(item.done ? &quot;Done&quot; : &quot;Not Done&quot;)&quot;)\n}\n\n"},{"title":"SwiftUI的Stacks应用",
"url":"/blog/swiftui-stacks/",
"date":"2024-12-18",
"headings":[{"level":1,"id":"chong-lei","permalink":"https://linxz.online/blog/swiftui-stacks/#chong-lei","title":"种类","children":[]},{"level":1,"id":"zstacksyao-dian","permalink":"https://linxz.online/blog/swiftui-stacks/#zstacksyao-dian","title":"Zstacks要点","children":[{"level":2,"id":"shun-xu-zui-xia-mian-de-shi-zai-zui-qian-mian","permalink":"https://linxz.online/blog/swiftui-stacks/#shun-xu-zui-xia-mian-de-shi-zai-zui-qian-mian","title":"顺序：最下面的是在最前面。","children":[]},{"level":2,"id":"zstackke-yi-ti-dai-bei-jing-background","permalink":"https://linxz.online/blog/swiftui-stacks/#zstackke-yi-ti-dai-bei-jing-background","title":"ZStack可以替代背景.background()","children":[]}]},{"level":1,"id":"dui-qi-fang-shi-he-jian-ju","permalink":"https://linxz.online/blog/swiftui-stacks/#dui-qi-fang-shi-he-jian-ju","title":"对齐方式和间距","children":[]}],
"body":"种类\nVstacks -&gt; Vertical\nHstacks -&gt; Horizontal\nZstacks -&gt; zIndex (back to front)\nZstacks要点\n顺序：最下面的是在最前面。\n        ZStack{\n            Rectangle()\n                .fill(.red)\n                .frame(width: 150, height:150)\n            Rectangle()\n                .fill(.green)\n                .frame(width: 130, height:130)\n            Rectangle()\n                .fill(.orange)\n                .frame(width: 100, height:100)\n        }\n\n\nZStack可以替代背景.background()\nZStack{\n\tCircle()\n\t\t.frame(width: 100, height: 100)\n\n\tText(&quot;1&quot;)\n\t\t.foregroundColor(.white)\n}\n\n与下列代码一致：\nText(&quot;1&quot;)\n\t.foregroundColor(.white)\n\t.background(\n\t\tCircle()\n\t\t\t.frame(width: 100, height: 100)\n\t)\n\n对齐方式和间距\nspacing是间距，alignment是对齐方式，有.center, .leading（左对齐）, .trailing（右对齐）；\n如果是HStack，对齐方式是.top, .bottom, .center。\n如果是ZStack，没有spacing，对齐方式是top, bottom, center, topleading(左上角）等。\nVStack(alignment: .center, spacing: 0)\n\n"},{"title":"Binding和@Binding的区别",
"url":"/blog/binding-binding-swiftui/",
"date":"2024-12-17",
"headings":[{"level":1,"id":"bindingde-jie-shao","permalink":"https://linxz.online/blog/binding-binding-swiftui/#bindingde-jie-shao","title":"@Binding的介绍","children":[]},{"level":1,"id":"bindingde-jie-shao-1","permalink":"https://linxz.online/blog/binding-binding-swiftui/#bindingde-jie-shao-1","title":"Binding的介绍","children":[]}],
"body":"均用在SwiftUI中。\n@Binding的介绍\n用于父子视图的通信。使用方法：\n\n在子视图定义binding变量。\n子视图Binding变量必须作为父子通信的形参。\n父视图的State变量必须作为父子通信的实参，且要加上$符号。\n\nimport SwiftUI\n\nstruct BindingView: View {\n    \n    @State var backgroundColor: Color = Color.green\n    @State var title: String = &quot;Title&quot;\n    \n    \n    var body: some View {\n        ZStack{\n            backgroundColor\n                .edgesIgnoringSafeArea(.all)\n            \n            VStack {\n                Text(title)\n                    .foregroundColor(.white)\n                ButtonView(backgroundColor: $backgroundColor, title: $title)\n            }\n        }\n    }\n}\n\n#Preview {\n    BindingView()\n}\n\nstruct ButtonView: View {\n    \n    @Binding var backgroundColor: Color\n    @State var buttonColor: Color = Color.blue\n    @Binding var title: String\n    \n    var body: some View {\n        Button(action: {\n            backgroundColor = Color.orange\n            buttonColor = Color.pink\n            title = &quot;Change my parent&#39;s title!&quot;\n        }, label: {\n            Text(&quot;Button&quot;)\n                .foregroundColor(.white)\n                .padding()\n                .padding(.horizontal)\n                .background(buttonColor)\n                .cornerRadius(10.0)\n        })\n    }\n}\n\n\nBinding的介绍\n本视图下，变量变化时，需要做操作的情况。（比如操作数据库）\nToggle(item.title, isOn: Binding(\n\tget : { item.done },\n\tset: { newValue in\n\t\tif let thawedItem = item.thaw() {\n\t\t\ttry? thawedItem.realm?.write{\n\t\t\t\tthawedItem.done = newValue\n\t\t\t}\n\t\t}\n\t}\n))\n\n说明：\nBinding()是一个元素，取代本应在此$variable。\nget和set是参数。\nget是指获取.done的值，以更新View。\nset是指获取值后，即newValue，进行后续的操作。本例中后续将这个值赋给.done，以更新数据库数据。\n"},{"title":"swiftUI如何做button？",
"url":"/blog/swiftui-button/",
"date":"2024-12-17",
"headings":[{"level":1,"id":"buttonliang-chong-ji-ben-sheng-cheng-fang-shi","permalink":"https://linxz.online/blog/swiftui-button/#buttonliang-chong-ji-ben-sheng-cheng-fang-shi","title":"button两种基本生成方式","children":[{"level":2,"id":"xing-shi-yi-button-string","permalink":"https://linxz.online/blog/swiftui-button/#xing-shi-yi-button-string","title":"形式一：Button(String)","children":[]},{"level":2,"id":"xing-shi-er-button-action-label","permalink":"https://linxz.online/blog/swiftui-button/#xing-shi-er-button-action-label","title":"形式二：Button {action} label:","children":[]}]},{"level":1,"id":"buttonshu-xing","permalink":"https://linxz.online/blog/swiftui-button/#buttonshu-xing","title":"button属性","children":[{"level":2,"id":"xing-zhuang","permalink":"https://linxz.online/blog/swiftui-button/#xing-zhuang","title":"形状","children":[{"level":3,"id":"fu-gai-xing-zhuang","permalink":"https://linxz.online/blog/swiftui-button/#fu-gai-xing-zhuang","title":"覆盖形状","children":[]}]},{"level":2,"id":"bian-ju","permalink":"https://linxz.online/blog/swiftui-button/#bian-ju","title":"边距","children":[{"level":3,"id":"zuo-you-bian-ju","permalink":"https://linxz.online/blog/swiftui-button/#zuo-you-bian-ju","title":"左右边距","children":[]}]},{"level":2,"id":"zi-ti","permalink":"https://linxz.online/blog/swiftui-button/#zi-ti","title":"字体","children":[]},{"level":2,"id":"yan-se","permalink":"https://linxz.online/blog/swiftui-button/#yan-se","title":"颜色","children":[{"level":3,"id":"zi-ding-yi-yan-se","permalink":"https://linxz.online/blog/swiftui-button/#zi-ding-yi-yan-se","title":"自定义颜色","children":[]}]},{"level":2,"id":"yuan-jiao","permalink":"https://linxz.online/blog/swiftui-button/#yuan-jiao","title":"圆角","children":[]},{"level":2,"id":"yin-ying","permalink":"https://linxz.online/blog/swiftui-button/#yin-ying","title":"阴影","children":[]}]},{"level":1,"id":"an-li","permalink":"https://linxz.online/blog/swiftui-button/#an-li","title":"案例","children":[]}],
"body":"button两种基本生成方式\n文字Button用形式一，其他类型（如图片）Button用形式二。\n形式一：Button(String)\nButton(&quot;Press me!&quot;) {\n                title = &quot;Button was pressed.&quot;\n}\n.accentColor(.red) //button颜色\n\n形式二：Button {action} label:\n            Button {\n                title = &quot;Button #2 was pressed&quot;\n            } label: {\n                //Text(&quot;Button #2&quot;)\n                Image(systemName: &quot;plus&quot;)\n            }\n\nbutton属性\n形状\nCircle()\n.frame(width: 75, height: 75)\nCapsule()\n.stroke(.gray, lineWidth:2)\n覆盖形状\nCircle()\n.frame(width: 75, height: 75)\n.overlay{\nImage(systemName: &quot;heart.fill&quot;)\t\n}\n边距\n.padding()\n左右边距\n.padding(.horizontal, 20)\n字体\n.font(.headline)\n.fontWeight(.semibold)\n颜色\n.foregroundColor(.white)\n.background(.blue)\n自定义颜色\n注意：swiftUI中，RGB颜色是从0到1的数，所以都要除以255\n.foregroundColor(Color(red: 139/255, green: 33/255, blue: 17/255))\n圆角\n.cornerRadius(10)\n阴影\n.shadow(radius: 10)\n案例\nimport SwiftUI\n\nstruct ButtonBootCamp: View {\n    \n    @State var title: String = &quot;This is my title.&quot;\n    \n    var body: some View {\n        VStack(spacing:20) {\n            Text(title)\n            \n            // 文本Button\n            Button(&quot;Press me!&quot;) {\n                title = &quot;Button was pressed.&quot;\n            }\n            .accentColor(.red) //button颜色\n            \n            // 形状Button\n            Button {\n                title = &quot;Button #2 was pressed&quot;\n            } label: {\n                //Text(&quot;Button #2&quot;)\n                Image(systemName: &quot;plus&quot;)\n            }\n            \n            // 测试Button属性1\n            Button {\n                title = &quot;Button #3 was pressed&quot;\n            } label: {\n                Text(&quot;save&quot;.uppercased())\n                    .font(.headline) //加粗\n                    .fontWeight(.semibold)\n                    .foregroundColor(.white)\n                    .padding()\n                    .padding(.horizontal, 20)\n                    .background(.blue)\n                    .cornerRadius(10)\n                    .shadow(radius: 10)\n            }\n            \n            //测试Button属性2\n            Button {\n                title = &quot;Button #4 was pressed.&quot;\n            } label: {\n                Circle()\n                    .fill(.white)\n                    .frame(width: 75, height: 75)\n                    .shadow(radius: 10)\n                    .overlay {\n                        Image(systemName: &quot;heart.fill&quot;)\n                            .font(.largeTitle) //增大图标\n                            .foregroundColor(Color(red: 139/255, green: 33/255, blue: 17/255))\n                    }\n            }\n            \n            //测试Button属性3\n            Button {\n                title = &quot;Button #5 was pressed.&quot;\n            } label: {\n                Text(&quot;Finish&quot;.uppercased())\n                    .font(.caption)\n                    .bold()\n                    .foregroundColor(.gray)\n                    .padding()\n                    .padding(.horizontal, 10)\n                    .background(\n                        Capsule()\n                            .stroke(.gray,lineWidth: 2)\n                    )\n            }\n        }\n    }\n}\n\n#Preview {\n    ButtonBootCamp()\n}\n\n"},{"title":"什么是computed properties",
"url":"/blog/swiftui-computed-properties/",
"date":"2024-12-17",
"headings":[{"level":1,"id":"shen-me-shi-getterhe-setter","permalink":"https://linxz.online/blog/swiftui-computed-properties/#shen-me-shi-getterhe-setter","title":"什么是getter和setter？","children":[]},{"level":1,"id":"observeshu-xing","permalink":"https://linxz.online/blog/swiftui-computed-properties/#observeshu-xing","title":"observe属性？","children":[]}],
"body":"computed properties 作用：通过计算实时更新值，与function结果一致，但代码较简单。\n主要实现方式：Getter和Setter\n什么是getter和setter？\nget实现了数值的计算逻辑，set实现了根据数值变化，即时呈现效果。\nimport UIKit\n\nlet pizzaInInches: Int = 10\n\n//MARK: - computed properties\n//作用：通过计算实时更新值，与function结果一致，但代码较简单\n\n/*\n 1. 需要用var，而不是let关键字;\n 2. 需要指定类型，比如Int\n    \n*/\n\n//简短版本\nvar numberOfSlices: Int{\n    return pizzaInInches - 4\n}\n\n//MARK: - Getter only\n//作用：计算值\n\n//复杂版本 - getter\nvar numberOfSlices: Int{\n    get{\n        return pizzaInInches - 4\n    }\n}\n\n\n//MARK: - Getter + Setter\n//作用：值一变化，就会更新\n\nvar numberOfSlices: Int{\n    get{\n        return pizzaInInches - 4\n    }\n    set{\n        print(&quot;numberOfSlices now has a new value which is \\(newValue)&quot;)\n    }\n}\n\nnumberOfSlices = 12\n\nprint(numberOfSlices)\n\nobserve属性？\n如果你不需要计算属性，即不需要get，只需要set的时候。\n主要是willSet和didSet两个属性，一个是newValue，一个oldValue。\ndidSet一个用法是，通过条件判断来改变值。\nimport UIKit\n\nvar pizzaInInches: Int = 10 {\n   //before changes\n   willSet{\n       print(pizzaInInches) //10\n       print(newValue) //8\n   }\n   //after changes\n   didSet{\n       print(oldValue) //10\n       print(pizzaInInches) //8\n       \n       if pizzaInInches &gt;= 18 {\n           print(&quot;Invalid size specified, pizzaInInches set to 18.&quot;)\n           pizzaInInches = 18\n       }\n   }\n}\n\npizzaInInches = 8\n\npizzaInInches = 33\nprint(pizzaInInches) //18\n\n"},{"title":"swiftUI 如何添加新页面？",
"url":"/blog/swiftui-newpage/",
"date":"2024-12-17",
"headings":[{"level":1,"id":"tian-jia-xin-bian-liang","permalink":"https://linxz.online/blog/swiftui-newpage/#tian-jia-xin-bian-liang","title":"添加新变量","children":[]},{"level":1,"id":"tian-jia-sheet","permalink":"https://linxz.online/blog/swiftui-newpage/#tian-jia-sheet","title":"添加.sheet","children":[]},{"level":1,"id":"wan-zheng-dai-ma-can-kao","permalink":"https://linxz.online/blog/swiftui-newpage/#wan-zheng-dai-ma-can-kao","title":"完整代码参考","children":[]},{"level":1,"id":"can-kao-xiang-mu","permalink":"https://linxz.online/blog/swiftui-newpage/#can-kao-xiang-mu","title":"参考项目","children":[]}],
"body":"添加新变量\n在view的前面添加@State变量。\n@State private var showingAddSheet = false\n\n添加.sheet\n在NavigationStack或者NavigationView的属性添加.sheet\nNavigationStack{}\n.sheet(isPresented: $showingAddSheet){\n\tAddItemView(isPresented: $showingAddSheet)\n}\n\n完整代码参考\nimport SwiftUI\nimport RealmSwift\n\nstruct ContentView: View {\n    @ObservedResults(Item.self) var items\n    @State private var showingAddSheet = false\n    \n    var body: some View {\n        NavigationStack {\n            VStack {\n                HStack {\n                    Text(&quot;待办清单&quot;)\n                        .font(.largeTitle)\n                        .padding(.leading, 20)\n                    \n                    Spacer()\n                    \n                    Button {\n                        print(&quot;Button tapped&quot;)\n                        showingAddSheet.toggle()\n                    } label: {\n                        Image(systemName: &quot;plus&quot;)\n                            .font(.system(size: 22))\n                            .foregroundColor(.blue)\n                    }\n                    .padding(.trailing, 20)\n                }\n                .padding(.top, 60)\n                .padding(.bottom, 10)\n                \n                // 列表内容\n                List {\n                    ForEach(items, id: \\.self) { item in\n                        Toggle(item.title, isOn: Binding(\n                            get: { item.done },\n                            set: { newValue in\n                                if let thawedItem = item.thaw() {\n                                    try? thawedItem.realm?.write {\n                                        thawedItem.done = newValue\n                                    }\n                                }\n                            }\n                        ))\n                        .toggleStyle(CheckboxToggleStyle())\n                        .frame(height: 60)\n                        .swipeActions(edge: .trailing, allowsFullSwipe: true) {\n                            Button(role: .destructive) {\n                                if let thawedItem = item.thaw() {\n                                    try? thawedItem.realm?.write {\n                                        thawedItem.realm?.delete(thawedItem)\n                                    }\n                                }\n                            } label: {\n                                Label(&quot;删除&quot;, systemImage: &quot;trash&quot;)\n                            }\n                        }\n                    }\n                }\n            }\n            .navigationBarHidden(true)  // 隐藏默认导航栏\n        }\n        .sheet(isPresented: $showingAddSheet) {\n            AddItemView(isPresented: $showingAddSheet)\n        }\n    }\n}\n\n#Preview {\n    ContentView()\n}\n\n参考项目\nTodoey-swiftui-realm\n"},{"title":"swiftUI如何使用realm?",
"url":"/blog/swiftui-realm/",
"date":"2024-12-17",
"headings":[{"level":1,"id":"zhan-shi-xiang-mu","permalink":"https://linxz.online/blog/swiftui-realm/#zhan-shi-xiang-mu","title":"展示项目","children":[{"level":2,"id":"ding-yi-xi-xiang-de-jie-gou","permalink":"https://linxz.online/blog/swiftui-realm/#ding-yi-xi-xiang-de-jie-gou","title":"定义细项的结构","children":[]},{"level":2,"id":"zhan-shi-jie-mian","permalink":"https://linxz.online/blog/swiftui-realm/#zhan-shi-jie-mian","title":"展示界面","children":[]}]},{"level":1,"id":"tian-jia-xiang-mu","permalink":"https://linxz.online/blog/swiftui-realm/#tian-jia-xiang-mu","title":"添加项目","children":[]},{"level":1,"id":"xiu-gai-xiang-mu","permalink":"https://linxz.online/blog/swiftui-realm/#xiu-gai-xiang-mu","title":"修改项目","children":[]},{"level":1,"id":"shan-chu-xiang-mu","permalink":"https://linxz.online/blog/swiftui-realm/#shan-chu-xiang-mu","title":"删除项目","children":[]},{"level":1,"id":"can-kao","permalink":"https://linxz.online/blog/swiftui-realm/#can-kao","title":"参考","children":[]}],
"body":"swiftUI-realm教程\n展示项目\n定义细项的结构\n用@Persisted关键字确定项目需要保存。\nimport RealmSwift\n\nclass Item: Object, Identifiable{\n    @Persisted var title: String = &quot;&quot;\n    @Persisted var done: Bool = false\n}\n\n展示界面\n用@ObservedResults()关键字确定项目是动态修改的。\n@ObservedResults(Item.self) var items\n\n用List来展示数据\nList{\n\tForEach(items, id: \\.selft) { item in\n\t\tText(item.title)\n\t}\n}\n\n添加项目\n通过realm.write和realm.add实现\nNavigationView{}\n.navigationBarItems(\n\ttrailing: Button(&quot;添加&quot;){\n\t\tlet realm = try! Realm()\n\t\ttry! reaml.write{\n\t\t\tlet newItem = Item()\n\t\t\tnewItem.title = title\n\t\t\tnewItem.done = false\n\t\t\trealm.add(newItem)\n\t\t}\n\t}\n)\n\n完整代码参考：\nimport SwiftUI\nimport RealmSwift\n\nstruct AddItemView: View {\n    @Binding var isPresented: Bool\n    @State private var title = &quot;&quot;\n    \n    var body: some View {\n        NavigationView {\n            Form {\n                TextField(&quot;项目名称&quot;, text: $title)\n            }\n            .navigationTitle(&quot;添加新项目&quot;)\n            .navigationBarItems(\n                leading: Button(&quot;取消&quot;) {\n                    isPresented = false\n                },\n                trailing: Button(&quot;添加&quot;) {\n                    let realm = try! Realm()\n                    try! realm.write {\n                        let newItem = Item()\n                        newItem.title = title\n                        newItem.done = false\n                        realm.add(newItem)\n                    }\n                    isPresented = false\n                }\n                .disabled(title.isEmpty)\n            )\n        }\n    }\n}\n\n\n修改项目\n比如修改.done属性，需要解冻项目.thaw()\n            List {\n                    ForEach(items, id: \\.self) { item in\n                        Toggle(item.title, isOn: Binding(\n                            get: { item.done },\n                            set: { newValue in\n                                if let thawedItem = item.thaw() {\n                                    try? thawedItem.realm?.write {\n                                        thawedItem.done = newValue\n                                    }\n                                }\n                            }\n                        ))\n\t\t}\n\n删除项目\n也需要解冻项目.thaw()\nButton(role: .destructive) {\n                                if let thawedItem = item.thaw() {\n                                    try? thawedItem.realm?.write {\n                                        thawedItem.realm?.delete(thawedItem)\n                                    }\n                                }\n                            } label: {\n                                Label(&quot;删除&quot;, systemImage: &quot;trash&quot;)\n}\n\n参考\nTodoey-swiftui-realm\n"},{"title":"什么是SwiftUI的State？",
"url":"/blog/swiftui-state/",
"date":"2024-12-17",
"headings":[],
"body":"类似react的useState，该变量一旦变化，就重新渲染View。\nimport SwiftUI\n\nstruct StateBootCamp: View {\n    \n    //@State:告诉View，监督这个变量，它变化，view就变化\n    //类似useState\n    @State var backgroundColor: Color = .green\n    @State var myTitle: String = &quot;my Title&quot;\n    @State var count: Int = 0\n    \n    var body: some View {\n        ZStack{\n            //background\n            backgroundColor\n                .edgesIgnoringSafeArea(.all)\n            \n            VStack(spacing: 20){\n                Text(myTitle)\n                    .font(.title)\n                Text(&quot;Count: \\(count)&quot;)\n                    .font(.headline)\n                    .underline()\n                \n                HStack(spacing:20){\n                    Button(&quot;Button 1&quot;) {\n                        backgroundColor = .red\n                        myTitle = &quot;Button 1 was Pressed.&quot;\n                        count += 1\n                    }\n                    \n                    Button(&quot;Button2&quot;) {\n                        backgroundColor = .purple\n                    }\n                }\n            }\n            .foregroundStyle(.white)\n        }\n    }\n}\n\n#Preview {\n    StateBootCamp()\n}\n\n\n"},{"title":"swiftUI如何swipe删除item？",
"url":"/blog/swiftui-swipe-delete/",
"date":"2024-12-17",
"headings":[{"level":1,"id":"pu-tong-shan-chu-mo-shi","permalink":"https://linxz.online/blog/swiftui-swipe-delete/#pu-tong-shan-chu-mo-shi","title":"普通删除模式","children":[]},{"level":1,"id":"realmshu-ju-ku-shan-chu-mo-shi","permalink":"https://linxz.online/blog/swiftui-swipe-delete/#realmshu-ju-ku-shan-chu-mo-shi","title":"realm数据库删除模式","children":[]}],
"body":"普通数据模式下（不需要删除数据库数据），可以参考网页用editActions的方法。\n普通删除模式\nstruct ContentView: View {\n    @State private var users = [&quot;Glenn&quot;, &quot;Malcolm&quot;, &quot;Nicola&quot;, &quot;Terri&quot;]\n\n    var body: some View {\n        NavigationStack {\n            List($users, id: \\.self, editActions: .delete) { $user in\n                Text(user)\n            }\n        }\n    }\n}\n\n\nrealm数据库删除模式\n使用swipeActions，模式是.destructive进行删除。\n以下以realm数据库举例。\nToggle()\n.swipeActions(edge: .trailing, allowsFullSwipe: true) {\n    Button(role: .destructive) {\n          if let thawedItem = item.thaw() {\n                 try? thawedItem.realm?.write {\n                       thawedItem.realm?.delete(thawedItem)\n                 }\n           }\n       } label: {\n             Label(&quot;删除&quot;, systemImage: &quot;trash&quot;)\n     }\n}\n\n"},{"title":"如何在swiftUI上完成checkbox？",
"url":"/blog/swiftui-checkbox/",
"date":"2024-12-16",
"headings":[{"level":1,"id":"shi-xian-fang-shi","permalink":"https://linxz.online/blog/swiftui-checkbox/#shi-xian-fang-shi","title":"实现方式","children":[]},{"level":1,"id":"yang-shi","permalink":"https://linxz.online/blog/swiftui-checkbox/#yang-shi","title":"样式","children":[{"level":2,"id":"zi-ding-yi-yang-shi-you-ce-da-gou","permalink":"https://linxz.online/blog/swiftui-checkbox/#zi-ding-yi-yang-shi-you-ce-da-gou","title":"自定义样式 - 右侧打勾","children":[]},{"level":2,"id":"switchyang-shi-jing-dian-toggleyang-shi","permalink":"https://linxz.online/blog/swiftui-checkbox/#switchyang-shi-jing-dian-toggleyang-shi","title":"switch样式 - 经典toggle样式","children":[]},{"level":2,"id":"buttonyang-shi-an-niu-yang-shi","permalink":"https://linxz.online/blog/swiftui-checkbox/#buttonyang-shi-an-niu-yang-shi","title":"button样式 - 按钮样式","children":[]}]},{"level":1,"id":"can-kao","permalink":"https://linxz.online/blog/swiftui-checkbox/#can-kao","title":"参考","children":[]}],
"body":"如何在swiftUI上完成checkbox？\n实现方式\n需要用Toggle标签来包裹，比如：\nList(data.indices, id: \\.self) { index in\n    Toggle(data[index].title, isOn: $data[index].done)\n         .toggleStyle(CheckboxToggleStyle())\n         .frame(height: 60)  // 设置每行高度为 60\n}\n\n样式\n自定义样式 - 右侧打勾\nimport SwiftUI\n\nstruct CheckboxToggleStyle: ToggleStyle {\n    @State private var isPressed = false  // 添加状态来跟踪点击\n    \n    func makeBody(configuration: Configuration) -&gt; some View {\n        HStack {\n            configuration.label\n            Spacer()\n            \n            if configuration.isOn {\n                Image(systemName: &quot;checkmark&quot;)\n                    .foregroundColor(.green)\n                    .font(.system(size: 20))\n            }\n        }\n        .frame(height: 60)\n        .background(isPressed ? Color.gray.opacity(0.2) : Color.clear)  // 点击时显示灰色背景\n        .onTapGesture {\n            // 点击时的动画效果\n            withAnimation(.easeInOut(duration: 0.1)) {\n                isPressed = true\n                \n                // 0.1秒后恢复\n                DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {\n                    withAnimation {\n                        isPressed = false\n                    }\n                }\n                \n                configuration.isOn.toggle()\n            }\n        }\n    }\n}\n\nswitch样式 - 经典toggle样式\n\nbutton样式 - 按钮样式\n\n参考\n官方文档\n民间参考\n"},{"title":"swiftUI怎么print",
"url":"/blog/swiftui-print/",
"date":"2024-12-16",
"headings":[{"level":1,"id":"zai-viewli-sheng-ming-bian-liang","permalink":"https://linxz.online/blog/swiftui-print/#zai-viewli-sheng-ming-bian-liang","title":"在view里声明变量","children":[]},{"level":1,"id":"zai-buttonxia-mian-zhi-jie-print","permalink":"https://linxz.online/blog/swiftui-print/#zai-buttonxia-mian-zhi-jie-print","title":"在Button下面直接print","children":[]}],
"body":"在view里声明变量\n输入let _ = print()\nvar body: some View {\n        let _ = print(Realm.Configuration.defaultConfiguration.fileURL)\n}\n\n在Button下面直接print\nButton {\n    print(&quot;Button tapped&quot;)\n} label: {\n    Image(systemName: &quot;plus&quot;)\n}\n\n参考链接\n"},{"title":"xcode可以用电脑模拟器，不能用手机模拟器",
"url":"/blog/swift-mobile-simulator/",
"date":"2024-12-13",
"headings":[],
"body":"使用realm模块时会有这个问题。\n检查设置的package，是否embed &amp; sign\n\n"},{"title":"利用realm数据库管理swift数据",
"url":"/blog/swift-realm/",
"date":"2024-12-12",
"headings":[{"level":1,"id":"jie-shao","permalink":"https://linxz.online/blog/swift-realm/#jie-shao","title":"介绍","children":[]},{"level":1,"id":"can-kao-wang-zhan","permalink":"https://linxz.online/blog/swift-realm/#can-kao-wang-zhan","title":"参考网站：","children":[]},{"level":1,"id":"cha-kan-shu-ju","permalink":"https://linxz.online/blog/swift-realm/#cha-kan-shu-ju","title":"查看数据","children":[]},{"level":1,"id":"realman-zhuang","permalink":"https://linxz.online/blog/swift-realm/#realman-zhuang","title":"realm安装","children":[]},{"level":1,"id":"ji-chu-pei-zhi-ke-xuan","permalink":"https://linxz.online/blog/swift-realm/#ji-chu-pei-zhi-ke-xuan","title":"基础配置（可选）","children":[]},{"level":1,"id":"chuang-jian-shu-ju-wen-jian-class","permalink":"https://linxz.online/blog/swift-realm/#chuang-jian-shu-ju-wen-jian-class","title":"创建数据文件class","children":[]},{"level":1,"id":"tian-jia-shu-ju-create-savedata","permalink":"https://linxz.online/blog/swift-realm/#tian-jia-shu-ju-create-savedata","title":"添加数据 Create - saveData","children":[]},{"level":1,"id":"du-qu-shu-ju-read-loaddata","permalink":"https://linxz.online/blog/swift-realm/#du-qu-shu-ju-read-loaddata","title":"读取数据 Read - loadData","children":[]},{"level":1,"id":"geng-xin-shu-ju-update","permalink":"https://linxz.online/blog/swift-realm/#geng-xin-shu-ju-update","title":"更新数据 update","children":[]},{"level":1,"id":"shan-chu-shu-ju-delete","permalink":"https://linxz.online/blog/swift-realm/#shan-chu-shu-ju-delete","title":"删除数据 delete","children":[]},{"level":1,"id":"sou-suo-shu-ju-sort","permalink":"https://linxz.online/blog/swift-realm/#sou-suo-shu-ju-sort","title":"搜索数据 sort","children":[]},{"level":1,"id":"zeng-jia-shu-xing-xu-yao-shan-chu-appzhong-lai","permalink":"https://linxz.online/blog/swift-realm/#zeng-jia-shu-xing-xu-yao-shan-chu-appzhong-lai","title":"增加属性需要删除app重来","children":[]},{"level":1,"id":"qi-ta-ti-dai-shu-ju-ku","permalink":"https://linxz.online/blog/swift-realm/#qi-ta-ti-dai-shu-ju-ku","title":"其他替代数据库","children":[]}],
"body":"介绍\nrealm是移动数据库，基于SQLite。\n2019年被MongoDB收购，更名为Atlas SDK， 2024年9月正式弃用（不再更新） 。\n参考网站：\nrealm的github网站\nMongoDB的不更新声明\nAltas Device SDKs\n查看数据\n以前用realm browser，现在最新工具是realm-studio\nrealm安装\n用SPM安装。地址就是github网站的地址。\nrealm或者realmswift安装包选一个，不能两个都选，会报错。\n我选的是realswift。\n基础配置（可选）\n打开AppDelegate，在didFinishLaunchingWithOptions下面输入：\n//打印数据文件的地址，通常是一个default.realm文件，用real-studio打开\nprint(Realm.Configuration.defaultConfiguration.fileURL)\n\n创建数据文件class\n创建新的swift文件，比如CategoryTitle.swift\nimport Foundation\nimport RealmSwift\n\nclass CategoryTitle: Object{\n    @objc dynamic var name: String = &quot;&quot;\n    \n    //后向关系\n    let items = List&lt;Item&gt;()\n}\n\n比如里面有items，可以定义Item.swift\nimport Foundation\nimport RealmSwift\n\nclass Item: Object{\n    @objc dynamic var title: String = &quot;&quot;\n    @objc dynamic var done: Bool = false\n    \n    //前向关系\n    var parentCategory = LinkingObjects(fromType: CategoryTitle.self, property: &quot;items&quot;)\n}\n\n添加数据 Create - saveData\nimport RealmSwift\n\n在vieController声明：\nlet realm = try! Realm()\n\nvar categories:Results&lt;CategoryTitle&gt;? //使用realm的Results变量\n\naddButton里面添加：\nlet newCategory = CategoryTitle()\n                \nnewCategory.name = textField.text!\n                \nself.save(category: newCategory)\n\nsave()的声明\n func save(category: CategoryTitle){\n        do{\n            try realm.write{\n                realm.add(category)\n            }\n        } catch {\n            print(&quot;Error Saving CategoryTitles \\(error)&quot;)\n        }\n        \n        tableView.reloadData()\n    }\n\n读取数据 Read - loadData\n用realm.objects()\n    func loadCategories(){\n        \n        categories = realm.objects(CategoryTitle.self)\n        \n        tableView.reloadData()\n    }\n\n更新数据 update\n用realm.write{}\nif let item = todoItems?[indexPath.row]{\n            do{\n                try realm.write{\n                    item.done = !item.done\n                }\n            }catch{\n                print(&quot;Error saving done status, \\(error)&quot;)\n            }\n        }\n        \n        tableView.reloadData()\n\n删除数据 delete\n用realm.write{remove.delete(item)}\nif let item = todoItems?[indexPath.row]{\n            do{\n                try realm.write{\n                    realm.delete(item)\n                }\n            }catch{\n                print(&quot;Error saving done status, \\(error)&quot;)\n            }\n        }\n        \n        tableView.reloadData()\n\n搜索数据 sort\n过滤关键字逻辑和CoreData一致。\n        todoItems = todoItems?.filter(&quot;title CONTAINS[cd] %@&quot;, searchBar.text!).sorted(byKeyPath: &quot;dateCreated&quot;, ascending: true)\n        \n        tableView.reloadData()\n\n增加属性需要删除app重来\n注意，如果你增加属性后，xcode会报错。解决方案是删除目前这个app，重新run一次。旧的数据就会被删除，启用新数据库。\n其他替代数据库\n2023年推出swiftData，特别适配SwiftUI\nGRDB\nFirebase\n参考:\nswiftData vs Realm vs coreData\n"},{"title":"swift滑动删除效果实现",
"url":"/blog/swift-swipe/",
"date":"2024-12-12",
"headings":[{"level":1,"id":"an-zhuang-cha-jian","permalink":"https://linxz.online/blog/swift-swipe/#an-zhuang-cha-jian","title":"安装插件","children":[]},{"level":1,"id":"jiang-cellgai-cheng-swipetableviewcell","permalink":"https://linxz.online/blog/swift-swipe/#jiang-cellgai-cheng-swipetableviewcell","title":"将cell改成 SwipeTableViewCell","children":[]},{"level":1,"id":"dai-ma-zeng-jia","permalink":"https://linxz.online/blog/swift-swipe/#dai-ma-zeng-jia","title":"代码增加","children":[{"level":2,"id":"swipetableviewcelllei-xing","permalink":"https://linxz.online/blog/swift-swipe/#swipetableviewcelllei-xing","title":"SwipeTableViewCell类型","children":[]},{"level":2,"id":"shan-chu-gong-neng","permalink":"https://linxz.online/blog/swift-swipe/#shan-chu-gong-neng","title":"删除功能","children":[]},{"level":2,"id":"you-hua-shan-chu","permalink":"https://linxz.online/blog/swift-swipe/#you-hua-shan-chu","title":"右划删除","children":[]}]}],
"body":"安装插件\nswipecellkit，可以用SPM安装。\n将cell改成 SwipeTableViewCell\n在属性窗口里面改Class。\nModule改为SwipeCellKit。\n\n代码增加\nSwipeTableViewCell类型\noverride func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n    let cell = tableView.dequeueReusableCell(withIdentifier: &quot;Cell&quot;) as! SwipeTableViewCell\n    cell.delegate = self\n    return cell\n}\n\n删除功能\n删除功能的实现，取决于你的数据结构和选取的数据库。\nfunc tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -&gt; [SwipeAction]? {\n    guard orientation == .right else { return nil }\n\n    let deleteAction = SwipeAction(style: .destructive, title: &quot;Delete&quot;) { action, indexPath in\n        // handle action by updating model with deletion\n    }\n\n    // customize the action appearance\n    deleteAction.image = UIImage(named: &quot;delete&quot;)\n\n    return [deleteAction]\n}\n\n右划删除\n如果需要向右滑动，.destructive风格\nfunc tableView(_ tableView: UITableView, editActionsOptionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -&gt; SwipeOptions {\n    var options = SwipeOptions()\n    options.expansionStyle = .destructive\n    options.transitionStyle = .border\n    return options\n}\n\n"},{"title":"swiftUI键盘Done标签实现",
"url":"/blog/swift-keyboard-done/",
"date":"2024-12-11",
"headings":[{"level":1,"id":"ding-yi-focusstate","permalink":"https://linxz.online/blog/swift-keyboard-done/#ding-yi-focusstate","title":"定义@FocusState","children":[]},{"level":1,"id":"tian-jia-navigationview","permalink":"https://linxz.online/blog/swift-keyboard-done/#tian-jia-navigationview","title":"添加NavigationView","children":[]},{"level":1,"id":"tian-jia-focusedshu-xing-he-toolbar","permalink":"https://linxz.online/blog/swift-keyboard-done/#tian-jia-focusedshu-xing-he-toolbar","title":"添加focused属性和toolbar","children":[]},{"level":1,"id":"you-shang-jiao-donean-niu","permalink":"https://linxz.online/blog/swift-keyboard-done/#you-shang-jiao-donean-niu","title":"右上角Done按钮","children":[]},{"level":1,"id":"zui-xiao-shi-xian-dai-ma-shi-li","permalink":"https://linxz.online/blog/swift-keyboard-done/#zui-xiao-shi-xian-dai-ma-shi-li","title":"最小实现代码示例","children":[]},{"level":1,"id":"iosru-he-tong-shi-shou-qi-jian-pan-he-guang-biao","permalink":"https://linxz.online/blog/swift-keyboard-done/#iosru-he-tong-shi-shou-qi-jian-pan-he-guang-biao","title":"ios如何同时收起键盘和光标：","children":[{"level":2,"id":"dispatchqueue-main-async-de-zuo-yong","permalink":"https://linxz.online/blog/swift-keyboard-done/#dispatchqueue-main-async-de-zuo-yong","title":"DispatchQueue.main.async 的作用：","children":[]},{"level":2,"id":"ioscheng-xu-de-duo-xian-cheng","permalink":"https://linxz.online/blog/swift-keyboard-done/#ioscheng-xu-de-duo-xian-cheng","title":"ios程序的多线程","children":[]}]}],
"body":"定义@FocusState\n@FocusState var isFocused: Bool\n\n添加NavigationView\n注意，因为键盘视图要用到.toolbar，它的实现需要依赖NavigationView\nNavigationView {\n\t...你的代码\n}\n\n添加focused属性和toolbar\n.focused属性用来定义键盘是否消失，false状态下键盘消失。\n因为要加一个空白将按钮推到右边，所以用ToolbarItemGroup，而不是ToolbarItem。\nTextField(&quot;Title&quot;, text: $text)\n\t.focused($isFocused)\n\t.toolbar{\n\t\tToolbarItemGroup(placement: .keyboard) {\n                        Spacer()\n                        Button(&quot;Done&quot;) {\n                            isFocused = false\n                        }\n                    }\n\t}\n\n右上角Done按钮\n如果键盘上面的按键被利用了，可以把Done按键放到右上角。\n这个if条件指键盘出来时，才出现Done按钮。这样一来，键盘不出现时，navigationBarTrailing即右上角区域可以有其他东西，比如品牌logo，设置按钮等。\nToolbarItem(placement: .navigationBarTrailing) {\n                        if isFocused {\n                            Button(&quot;Done&quot;) {\n                                isFocused = false\n                            }\n                        }\n                    }\n\n最小实现代码示例\nimport SwiftUI\n\nstruct ContentView: View {\n    @FocusState var isFocused: Bool\n    @State var text = &quot;&quot;\n    \n    var body: some View {\n        NavigationView {  // 添加NavigationView\n\n            TextField(&quot;Title&quot;, text: $text)\n                .font(.largeTitle)\n                .multilineTextAlignment(.center)\n                .focused($isFocused)\n                .padding()\n                .toolbar {\n                    //右上角Done标签\n                    ToolbarItem(placement: .navigationBarTrailing) {\n                        if isFocused {\n                            Button(&quot;Done&quot;) {\n                                isFocused = false\n                            }\n                        }\n                    }\n                    //键盘上Done标签\n                    ToolbarItemGroup(placement: .keyboard) {\n                        Spacer()\n                        Button(&quot;Done&quot;) {\n                            isFocused = false\n                        }\n                    }\n                }\n        }\n    }\n}\n\n#Preview {\n    ContentView()\n}\n\n\nios如何同时收起键盘和光标：\n            DispatchQueue.main.async {\n                searchBar.resignFirstResponder()\n            }\n\nDispatchQueue.main.async 的作用：\n强制代码块在主线程上异步执行。 因为涉及到UI的更新，一定要在主线程上操作，否则可能产生问题。\nsearchBar.resignFirstResponder() 用于取消 searchBar 的第一响应者状态，通常会导致键盘收起。该操作本身需要在主线程上完成，否则可能不会生效。\nios程序的多线程\n每个线程都是一个Thread。\n网络请求通常都是在Background运行，以致不影响到main Thread。\n\n"},{"title":"swiftUI的文本框TextField的最小实现",
"url":"/blog/swift-textfield/",
"date":"2024-12-11",
"headings":[],
"body":"@State var 定义的是Binding&lt;String&gt;，即双向连接，方便在视图之间共享和同步数据。使用时需要带$符号。\n可以理解成React里面的useState。\nstruct ContentView: View {\n    @State var text = &quot;&quot;\n    \n    var body: some View {\n            TextField(&quot;Title&quot;, text:$text)\n                .font(.largeTitle)\n                .multilineTextAlignment(.center) // 文本内容居中\n    }\n}\n\n"},{"title":"利用CoreData来存储数据",
"url":"/blog/coredata-swift/",
"date":"2024-12-10",
"headings":[{"level":1,"id":"ming-ci-jie-shi","permalink":"https://linxz.online/blog/coredata-swift/#ming-ci-jie-shi","title":"名词解释","children":[]},{"level":1,"id":"cao-zuo-guo-cheng","permalink":"https://linxz.online/blog/coredata-swift/#cao-zuo-guo-cheng","title":"操作过程","children":[]},{"level":1,"id":"tian-jia-coredata","permalink":"https://linxz.online/blog/coredata-swift/#tian-jia-coredata","title":"添加CoreData","children":[{"level":2,"id":"chuang-jian-xin-xiang-mu","permalink":"https://linxz.online/blog/coredata-swift/#chuang-jian-xin-xiang-mu","title":"创建新项目","children":[]},{"level":2,"id":"tian-jia-wen-jian","permalink":"https://linxz.online/blog/coredata-swift/#tian-jia-wen-jian","title":"添加文件","children":[{"level":3,"id":"tian-jia-appdelegatede-coredatafang-fa","permalink":"https://linxz.online/blog/coredata-swift/#tian-jia-appdelegatede-coredatafang-fa","title":"添加AppDelegate的CoreData方法","children":[]},{"level":3,"id":"xiu-gai-shang-mian-de-persistentcontainerde-ming-zi","permalink":"https://linxz.online/blog/coredata-swift/#xiu-gai-shang-mian-de-persistentcontainerde-ming-zi","title":"修改上面的PersistentContainer的名字","children":[]}]}]},{"level":1,"id":"tian-jia-xin-biao","permalink":"https://linxz.online/blog/coredata-swift/#tian-jia-xin-biao","title":"添加新表","children":[{"level":2,"id":"jiang-biao-she-zhi-wei-dang-qian-xiang-mu","permalink":"https://linxz.online/blog/coredata-swift/#jiang-biao-she-zhi-wei-dang-qian-xiang-mu","title":"将表设置为当前项目","children":[]}]},{"level":1,"id":"tian-jia-attribute-column","permalink":"https://linxz.online/blog/coredata-swift/#tian-jia-attribute-column","title":"添加attribute (column)","children":[]},{"level":1,"id":"tian-jia-shu-ju-create","permalink":"https://linxz.online/blog/coredata-swift/#tian-jia-shu-ju-create","title":"添加数据 Create","children":[{"level":2,"id":"she-zhi-contextbian-liang","permalink":"https://linxz.online/blog/coredata-swift/#she-zhi-contextbian-liang","title":"设置context变量","children":[]},{"level":2,"id":"zai-add-buttonxia-mian-tian-jia-shu-ju","permalink":"https://linxz.online/blog/coredata-swift/#zai-add-buttonxia-mian-tian-jia-shu-ju","title":"在add button下面添加数据","children":[]},{"level":2,"id":"gui-ding-saveitem","permalink":"https://linxz.online/blog/coredata-swift/#gui-ding-saveitem","title":"规定saveItem()","children":[]}]},{"level":1,"id":"du-qu-shu-ju-read","permalink":"https://linxz.online/blog/coredata-swift/#du-qu-shu-ju-read","title":"读取数据 Read","children":[]},{"level":1,"id":"geng-xin-shu-ju-update","permalink":"https://linxz.online/blog/coredata-swift/#geng-xin-shu-ju-update","title":"更新数据 Update","children":[]},{"level":1,"id":"shan-chu-shu-ju-delete","permalink":"https://linxz.online/blog/coredata-swift/#shan-chu-shu-ju-delete","title":"删除数据 Delete","children":[]},{"level":1,"id":"cha-xun-shu-ju","permalink":"https://linxz.online/blog/coredata-swift/#cha-xun-shu-ju","title":"查询数据","children":[]}],
"body":"CRUD操作：\nCreate\nRead\nUpdate\nDestroy\n名词解释\nEntity 可以理解成Table或者Class\nAttribute 可以理解成properties\nNSPersistentContainer 实际上一个SQLite Database，之所以不直接叫SQLite，因为你还可以用其他数据库，比如XML等。\ncontext类似github的暂存区stash，直到你满意了，才提交修改到永久保存区。\nNSObject 等于一个row。\n类比图：\n\n操作过程\n\n添加CoreData\n两种方式：创建新项目或者添加文件\n创建新项目\n在新建项目中，storage选中CoreData。\n添加文件\ncmd + N 添加新文件，选择DataModel。\n\n添加AppDelegate的CoreData方法\n\timport CoreData\n\n    // MARK: - Core Data stack\n\n    lazy var persistentContainer: NSPersistentContainer = {\n        /*\n         The persistent container for the application. This implementation\n         creates and returns a container, having loaded the store for the\n         application to it. This property is optional since there are legitimate\n         error conditions that could cause the creation of the store to fail.\n        */\n        let container = NSPersistentContainer(name: &quot;CoreDataTest&quot;)\n        container.loadPersistentStores(completionHandler: { (storeDescription, error) in\n            if let error = error as NSError? {\n                // Replace this implementation with code to handle the error appropriately.\n                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.\n                 \n                /*\n                 Typical reasons for an error here include:\n                 * The parent directory does not exist, cannot be created, or disallows writing.\n                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.\n                 * The device is out of space.\n                 * The store could not be migrated to the current model version.\n                 Check the error message to determine what the actual problem was.\n                 */\n                fatalError(&quot;Unresolved error \\(error), \\(error.userInfo)&quot;)\n            }\n        })\n        return container\n    }()\n\n    // MARK: - Core Data Saving support\n\n    func saveContext () {\n        let context = persistentContainer.viewContext\n        if context.hasChanges {\n            do {\n                try context.save()\n            } catch {\n                // Replace this implementation with code to handle the error appropriately.\n                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.\n                let nserror = error as NSError\n                fatalError(&quot;Unresolved error \\(nserror), \\(nserror.userInfo)&quot;)\n            }\n        }\n    }\n\n修改上面的PersistentContainer的名字\n需要和你创建的DataModel的文件名一样。\n let container = NSPersistentContainer(name: &quot;DataModel&quot;)\n\n添加新表\n在DataModel下方的+号，点击Add Entity。\n双击Entity，可以修改名字。\n\n将表设置为当前项目\ninspector菜单 - Current Product Module\n\n添加attribute (column)\n\n如果是optional，即可选项；如果不勾选，则表示必须有值。\n添加数据 Create\n设置context变量\n    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext\n\n在add button下面添加数据\n                let newItem = Item(context: self.context)\n                \n                newItem.title = textField.text!\n                newItem.done = false\n\nsaveItem()\n\n规定saveItem()\nfunc saveItems(){\n        do{\n            try context.save()\n        } catch {\n            print(&quot;Error Saving Context \\(error)&quot;)\n        }\n    }\n\n读取数据 Read\n\n\n首先建立一个request，这里不能类型推断，要定义好类型。\n\n\n保存好context.fetch()\n\n\n直接在viewDidLoad里面loadItems即可。\n\n\n func loadItems(){\n        let request : NSFetchRequest&lt;Item&gt; = Item.fetchRequest()\n        do{\n            itemArray = try context.fetch(request)\n        } catch {\n            print(&quot;Error fetching data from context. \\(error)&quot;)\n        }\n    }\n\n更新数据 Update\n直接修改属性即可。\nitemArray[indexPath.row].done = !itemArray[indexPath.row].done\n\n删除数据 Delete\n注意：顺序不能弄错，要先删除数据库，再删除视图UI。\n        //删除数据（需要按照顺序）\n        context.delete(itemArray[indexPath.row]) //从数据库删除\n        itemArray.remove(at: indexPath.row) //从视图删除\n\n查询数据\n需要用到NSPredicate。搜索语法参考：\n参考网站\ncheatsheet\n简单版\nextension TodoListViewController: UISearchBarDelegate{\n    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {\n        let request : NSFetchRequest&lt;Item&gt; = Item.fetchRequest()\n        \n        //[cd]指对大小写Capital和变音diacritic不敏感\n        request.predicate = NSPredicate(format: &quot;title CONTAINS[cd] %@&quot;, searchBar.text!)\n        \n        request.sortDescriptors = [NSSortDescriptor(key: &quot;title&quot;, ascending: true)] //只有一个rule\n        \n        loadItems(request)\n    }\n}\n\nloadItem()改造。\n    func loadItems(_ request: NSFetchRequest&lt;Item&gt; = Item.fetchRequest()){\n        do{\n            itemArray = try context.fetch(request)\n        } catch {\n            print(&quot;Error fetching data from context. \\(error)&quot;)\n        }\n        \n        tableView.reloadData()\n    }\n\n"},{"title":"如何用swift保存数据 - NSCoder",
"url":"/blog/swift-nscoder/",
"date":"2024-12-10",
"headings":[{"level":1,"id":"wei-shen-me-shu-ju-yao-encodehe-decode","permalink":"https://linxz.online/blog/swift-nscoder/#wei-shen-me-shu-ju-yao-encodehe-decode","title":"为什么数据要encode和decode？","children":[]},{"level":1,"id":"lian-jie-yong-hu-de-documentswen-jian-jia","permalink":"https://linxz.online/blog/swift-nscoder/#lian-jie-yong-hu-de-documentswen-jian-jia","title":"连接用户的Documents文件夹","children":[]},{"level":1,"id":"shu-ju-yao-bao-cun-cheng-codable","permalink":"https://linxz.online/blog/swift-nscoder/#shu-ju-yao-bao-cun-cheng-codable","title":"数据要保存成Codable","children":[]},{"level":1,"id":"bao-cun-shu-ju","permalink":"https://linxz.online/blog/swift-nscoder/#bao-cun-shu-ju","title":"保存数据","children":[{"level":2,"id":"ding-yi-saveitems","permalink":"https://linxz.online/blog/swift-nscoder/#ding-yi-saveitems","title":"定义saveItems()","children":[]},{"level":2,"id":"shi-yong-savveitems","permalink":"https://linxz.online/blog/swift-nscoder/#shi-yong-savveitems","title":"使用savveItems()","children":[]}]},{"level":1,"id":"videdidloadzhong-du-qu-shu-ju","permalink":"https://linxz.online/blog/swift-nscoder/#videdidloadzhong-du-qu-shu-ju","title":"videDidLoad中读取数据","children":[{"level":2,"id":"ding-yi-loaditem","permalink":"https://linxz.online/blog/swift-nscoder/#ding-yi-loaditem","title":"定义loadItem()","children":[]}]}],
"body":"结果：保存在用户的Documents文件夹下。\n为什么数据要encode和decode？\n因为数据的样式是系统不认识的，即不是基本数据类型，比如struct或者class。想象成把音乐做成黑胶唱片，就是encode的过程。而用播放设备播放音乐，就是把黑胶唱片还原成音乐，是decode的过程。\n连接用户的Documents文件夹\nlet dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent(&quot;Items.plist&quot;)\n\n数据要保存成Codable\nimport Foundation\n\nclass Item: Codable{\n    var title: String = &quot;&quot;\n    var done: Bool = false\n}\n\n保存数据\n定义saveItems()\n    func saveItems(){\n        let encoder = PropertyListEncoder()\n        \n        do{\n            let data = try encoder.encode(itemArray)\n            try data.write(to: dataFilePath!)\n        } catch {\n            print(&quot;Error encoding item array, \\(error)&quot;)\n        }\n    }\n\n使用savveItems()\n    @IBAction func addButtonPressed(_ sender: UIBarButtonItem) {\n        \n        var textField = UITextField()\n        \n        \n        let alert = UIAlertController(title: &quot;Add New Todoey Item&quot;, message: &quot;&quot;, preferredStyle: .alert)\n        \n        let action = UIAlertAction(title: &quot;Add Item&quot;, style: .default)\n            { (action) in\n                \n                let newItem = Item()\n                \n                newItem.title = textField.text!\n                \n                self.itemArray.append(newItem)\n                \n                self.saveItems()\n                \n                //重新渲染tableView\n                self.tableView.reloadData()\n            }\n        \n        alert.addTextField { (alertTextField) in\n            alertTextField.placeholder = &quot;Create New Item&quot;\n            textField = alertTextField\n        }\n        \n        alert.addAction(action)\n        \n        present(alert, animated: true)\n    }\n\nvideDidLoad中读取数据\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        print(dataFilePath!)\n        \n        loadItems()\n    }\n\n定义loadItem()\nfunc loadItems(){\n        if let data = try? Data(contentsOf: dataFilePath!) {\n            let decoder = PropertyListDecoder()\n            do{\n                itemArray = try decoder.decode([Item].self, from: data)\n            } catch {\n                print(&quot;Error decoding item array, \\(error)&quot;)\n            }\n        }\n    }\n\n"},{"title":"Angela的学习建议",
"url":"/blog/tips-from-angela/",
"date":"2024-12-09",
"headings":[{"level":2,"id":"when-life-gives-you-lemons-make-lemonade","permalink":"https://linxz.online/blog/tips-from-angela/#when-life-gives-you-lemons-make-lemonade","title":"when life gives you lemons, make lemonade","children":[]}],
"body":"让编程动作成为习惯\n在日历上画直线（让直线持续下去）\n在提醒事项里写入 待完成事项 \n利用习惯完成习惯\n用已完成的习惯来养成另外一个习惯。\n比如，每天刷牙后跑步30分钟。\n抵抗分心\n手机调成勿扰模式，或者放入抽屉。\n困难的事才值得做\n没有人天生会某种技能。\n如果你不健身，不会变得强壮；你不写代码，你就不会写程序。\n你努力过后，所得到的结果和赢彩票感觉不一样，更爽。\n如何抵抗拖延\n工作之前的准备工作实际上是拖延时间，比如泡茶、整理桌面等。\n拖延是成瘾的。\n只有在完成工作后才奖励自己，不要在完成工作前。\n番茄工作法，工作45分钟，休息的5分钟可以用来放松。\n正确设定期望\n编程不简单。\n编程简单的部分只是在开始时，比如设置变量，加一个2之类的。\n但是，掌握编程绝对不简单，学会逻辑关系，模块调度。\n我学不会编程，因为我很蠢吗？不是，因为编程很难。\n编程需要一个天才吗？\nyoutube上的开发者都是正常人，像你我一样的普通人。\n所以，编程不简单，也不难。但完全可以学会。\n20分钟方法\n欺骗自己，告诉自己只工作20分钟。\n一旦你开始，你就不只做20分钟。\n最难的事情是开始。\n实践比观察重要\n为什么看着别人做很简单，自己却不会？\n因为观察和实践使用的是不同的技能。观察时，你只需要看着或者跟着就好了，就像画画一样。当你实践时，你需要思考如何做事，并且把脑袋所想拉出来。\n多练习，多提取知识，提前做教程的任务。这样比跟着做学到得更多。\n吃饭前先工作\n把困难的事情先做了，才吃饭。因为碳水化合物会让脑筋迟钝。\n没什么进步怎么办\n和以前的自己对比，不要和别人对比。\n没有谁能够知道所有事。\n回去看看刚开始的课程，回答那些初学者的问题，你会发现自己其实也懂得很多。\n联系既有的知识\n混合你所学的概念，使用出来。\n比如做一个程序，把条件和循环都做出来，你更容易巩固自己的知识。\n感到焦虑怎么办\n休息一下，你可能只是写代码写久了，脑子缺氧。\n即使你一直盯着自己的名字，名字也会变得奇怪。\n如果脑子一直只想着一件事情，很容易钻牛角尖。\n很多时候，睡过一觉后，事情反而有了解决方案。好像大脑在睡觉时工作一样。\n不睡觉，快走或者跑步、游泳也可以。\n睡觉很重要\n真的有人只睡2小时吗？\n我试着做，但发现只能做死记硬背的事情，但不能做创意工作，很难学习。\n我为什么要变成一具僵尸？\n当我有充足睡觉时，我的脾气会变得更好。\n设置你的“睡觉闹钟”，告诉你该睡觉了。\n巩固知识的方法\n教别人知识。为什么？\n可能你发现自己并不知道，所以去查更多资料；\n另外，你需要把所知的以文本的形式表达出来，这又是一次重新的组织。\n这样，就完成了一次巩固。\n使用类比。\n间隔重复\n有间隔时间的重复，会让你记住事情。\n有意识地回顾，一天、一周、一月，你就会记住它。\n使用你的知识，做一个程序。\n设置工作地点\n设置一个固定的工作地点。\n如果你在一个地点做很多事情，你的大脑会觉得疑惑，会很容易分心。\n比如，你有一张桌子，只用来学习。\nwhen life gives you lemons, make lemonade\n遇到逆境，那是别人给你设置的障碍，你也不可改变，不关你的事情。你要做的事，把生活过好，就是最大的反击。\n"},{"title":"SwiftUI变量state设置步骤",
"url":"/blog/swift-state/",
"date":"2024-12-06",
"headings":[{"level":1,"id":"statebiao-zhu","permalink":"https://linxz.online/blog/swift-state/#statebiao-zhu","title":"state标注","children":[]},{"level":1,"id":"classtian-jia-observableobjectde-protocol","permalink":"https://linxz.online/blog/swift-state/#classtian-jia-observableobjectde-protocol","title":"class添加ObservableObject的protocol","children":[]},{"level":1,"id":"xu-yao-bao-lu-de-bian-liang-shi-yong-published","permalink":"https://linxz.online/blog/swift-state/#xu-yao-bao-lu-de-bian-liang-shi-yong-published","title":"需要暴露的变量，使用@Published","children":[]}],
"body":"state标注\n改变后需要重新渲染的变量使用@state标注，如果是object则用@StateObject。\n@State var showingSettings = false\n@StateObject var viewModel = ContentViewModel()\n\nclass添加ObservableObject的protocol\nclass ContentViewModel: ObservableObject {\n}\n\n需要暴露的变量，使用@Published\nclass ContentViewModel: ObservableObject {\n\t@Published var title = &quot;&quot;\n}\n\n"},{"title":"Cloudflare Pages的免费版额度",
"url":"/blog/cloudflare-pages-free/",
"date":"2024-12-05",
"headings":[],
"body":"\n\n并发构建数：1（如果有多个pages，同一时刻只能进行其中一个的构建） \n\n\n每月构建数：500（每个月只能帮你构建500次，即你的博客每月只能修改500次）\n\n\n自定义域名：100个\n\n\n一个pages最多20，000个文件\n\n\n最大单个文件限制：25MB\n\n\n每日限制函数请求数：100，000次（超出后会失败）\n\n\n静态文件请求次数：无限\n\n\n\n参考网站\ncloudflare官方产品定价\n"},{"title":"xcode提示App IDs已经超出限制？",
"url":"/blog/xcode-limits/",
"date":"2024-12-05",
"headings":[{"level":1,"id":"jie-jue-fang-an","permalink":"https://linxz.online/blog/xcode-limits/#jie-jue-fang-an","title":"解决方案：","children":[]}],
"body":"解决方案：\n找到以前的项目，统统使用相同的Bundle Identifier。\n比如，我的是：\nonline.linxz.I-am-Poor\n参考答案\n"},{"title":"swift代码联想前面的英文字母的意思",
"url":"/blog/swift-code-completion/",
"date":"2024-12-04",
"headings":[],
"body":"参考\n"},{"title":"swift如何设置初始界面？",
"url":"/blog/swift-initial-window/",
"date":"2024-12-04",
"headings":[{"level":1,"id":"xiu-gai-viewcontroller-swift","permalink":"https://linxz.online/blog/swift-initial-window/#xiu-gai-viewcontroller-swift","title":"修改ViewController.swift","children":[]},{"level":1,"id":"lian-jie-tu-xing","permalink":"https://linxz.online/blog/swift-initial-window/#lian-jie-tu-xing","title":"连接图形","children":[]}],
"body":"首先，新建一个viewController，可以TableViewController\n两个办法：移动箭头 或 修改属性。\n\n修改ViewController.swift\n修改type和文件名（可选）\n\n连接图形\n修改属性中的Custom Class。\n\n"},{"title":"swift-利用defaults来保存数据到本地",
"url":"/blog/swift-local-storage/",
"date":"2024-12-04",
"headings":[{"level":1,"id":"shen-me-shi-userdefaults","permalink":"https://linxz.online/blog/swift-local-storage/#shen-me-shi-userdefaults","title":"什么是UserDefaults?","children":[{"level":2,"id":"chu-shi-hua","permalink":"https://linxz.online/blog/swift-local-storage/#chu-shi-hua","title":"初始化","children":[]},{"level":2,"id":"cun-chu","permalink":"https://linxz.online/blog/swift-local-storage/#cun-chu","title":"存储","children":[]},{"level":2,"id":"ti-qu","permalink":"https://linxz.online/blog/swift-local-storage/#ti-qu","title":"提取","children":[]}]},{"level":1,"id":"ying-yong","permalink":"https://linxz.online/blog/swift-local-storage/#ying-yong","title":"应用","children":[{"level":2,"id":"zai-an-niu-jia-yi-ge-closure-li-mian-jia-shang-dai-ma","permalink":"https://linxz.online/blog/swift-local-storage/#zai-an-niu-jia-yi-ge-closure-li-mian-jia-shang-dai-ma","title":"在按钮加一个closure，里面加上代码","children":[]},{"level":2,"id":"zai-viewcontrollerli-mian-sheng-ming-bian-liang","permalink":"https://linxz.online/blog/swift-local-storage/#zai-viewcontrollerli-mian-sheng-ming-bian-liang","title":"在ViewController里面声明变量：","children":[]},{"level":2,"id":"zai-viewdidloadli-mian-geng-xin-item","permalink":"https://linxz.online/blog/swift-local-storage/#zai-viewdidloadli-mian-geng-xin-item","title":"在viewDidLoad里面更新item:","children":[]},{"level":2,"id":"kan-dao-shu-ju-bian-hua","permalink":"https://linxz.online/blog/swift-local-storage/#kan-dao-shu-ju-bian-hua","title":"看到数据变化","children":[]},{"level":2,"id":"zheng-ti-dai-ma-shi-li","permalink":"https://linxz.online/blog/swift-local-storage/#zheng-ti-dai-ma-shi-li","title":"整体代码示例：","children":[]}]}],
"body":"什么是UserDefaults?\n一个本地存储的plist，可以供App在开始时读取。\n初始化\nlet defaults = UserDefaults.standard\n\n存储\ndefaluts.set(value, forKey: &quot;key&quot;)\n\n提取\n这里要看存储的值是什么，就用什么类型提取。比如这个例子要提取的值是float类型。\nlet volume = defaults.float(forKey: &quot;key&quot;)\n\n/*\n 1. UserDefaults不是数据库，只适合存放少量数据。\n 2. 每次加载程序时，整个UserDefaults plist都会加载，因此越大的数据，程序运行越慢。\n */\n\nimport UIKit\n\nlet defaults = UserDefaults.standard\n\n\nlet dictionaryKey = &quot;myDict&quot;\n\n// 格式 - key: &quot;Volume&quot; value: 0.24\ndefaults.set(0.24, forKey: &quot;Volume&quot;)\ndefaults.set(true, forKey: &quot;MusicOn&quot;)\ndefaults.set(&quot;Angela&quot;, forKey: &quot;PlayerName&quot;)\ndefaults.set(Date(), forKey: &quot;AppLastOpenedByUser&quot;)\n\nlet array = [1,2,3]\ndefaults.set(array, forKey: &quot;myArray&quot;)\n\nlet dictionary = [&quot;name&quot;: &quot;Angela&quot;]\ndefaults.set(dictionary, forKey: dictionaryKey)\n\n\nlet volume = defaults.float(forKey: &quot;Volume&quot;)\nprint(volume)\n\nlet appLastOpen = defaults.object(forKey: &quot;AppLastOpenedByUser&quot;) //用object，因为对应的是Any?\nprint(appLastOpen!)\n\nlet myArray = defaults.array(forKey: &quot;myArray&quot;)\nprint(myArray!)\n\nlet myDict = defaults.dictionary(forKey: dictionaryKey)\nprint(myDict!)\n\n应用\n在按钮加一个closure，里面加上代码\nself.defaults.set(self.itemArray, forKey: &quot;TodoListArray&quot;)\n\n在ViewController里面声明变量：\n let defaults = UserDefaults.standard\n\n在viewDidLoad里面更新item:\n if let items = defaults.array(forKey: &quot;TodoListArray&quot;) as? [String] {\n            itemArray = items\n }\n\n看到数据变化\ndelegate.swift输入以下代码：\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&gt; Bool {\n        \n        print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String)\n        \n        return true\n    }\n\n文档路径里面找到preferences里面的plist，通过退出应用看看是否有增加的key-value对。\n整体代码示例：\nimport UIKit\n\nclass TodoListViewController: UITableViewController {\n    \n    var itemArray = [&quot;Find Mike&quot;, &quot;Buy Eggos&quot;, &quot;Destory Demogorgon&quot;]\n    \n    let defaults = UserDefaults.standard\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        if let items = defaults.array(forKey: &quot;TodoListArray&quot;) as? [String] {\n            itemArray = items\n        }\n    }\n    \n    //每个分区section有多少行row\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {\n        return itemArray.count\n    }\n    \n    //用哪个cell；indexPath即对应上面的row\n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: &quot;ToDoItemCell&quot;, for: indexPath)\n        cell.textLabel?.text = itemArray[indexPath.row]\n        return cell\n    }\n    \n    //选择cell会发生的事情\n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n//        print(itemArray[indexPath.row])\n        \n        //checkmark\n        if tableView.cellForRow(at: indexPath)?.accessoryType == .checkmark{\n            tableView.cellForRow(at: indexPath)?.accessoryType = .none\n        } else {\n            tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark\n        }\n        \n        //选择后背景色会消失\n        tableView.deselectRow(at: indexPath, animated: true)\n    }\n    \n    //MARK: - add new items\n    @IBAction func addButtonPressed(_ sender: UIBarButtonItem) {\n        \n        var textField = UITextField()\n        \n        \n        let alert = UIAlertController(title: &quot;Add New Todoey Item&quot;, message: &quot;&quot;, preferredStyle: .alert)\n        \n        let action = UIAlertAction(title: &quot;Add Item&quot;, style: .default)\n            { (action) in\n                // what will happen once the user clicks the Add Item button on our UIAlert\n                guard let safeTextField = textField.text else {return}\n                self.itemArray.append(safeTextField)\n                \n                self.defaults.set(self.itemArray, forKey: &quot;TodoListArray&quot;)\n                \n                //重新渲染tableView\n                self.tableView.reloadData()\n            }\n        \n        alert.addTextField { (alertTextField) in\n            alertTextField.placeholder = &quot;Create New Item&quot;\n            textField = alertTextField\n        }\n        \n        alert.addAction(action)\n        \n        present(alert, animated: true)\n    }\n    \n}\n\n"},{"title":"swift手机界面如何出现头顶菜单？",
"url":"/blog/swift-menubar/",
"date":"2024-12-04",
"headings":[{"level":1,"id":"gai-bian-tou-ding-cai-dan-de-yan-se","permalink":"https://linxz.online/blog/swift-menubar/#gai-bian-tou-ding-cai-dan-de-yan-se","title":"改变头顶菜单的颜色","children":[]},{"level":1,"id":"zheng-ge-tou-bu-huan-diao-yan-se","permalink":"https://linxz.online/blog/swift-menubar/#zheng-ge-tou-bu-huan-diao-yan-se","title":"整个头部换掉颜色","children":[]}],
"body":"选中界面-Editor-Embed in-Navigation Controller.\n注意，Tab Bar Controller是底部菜单。\n\n改变头顶菜单的颜色\n属性-Background\n\n整个头部换掉颜色\nNavigation Bar属性\nAppearance 勾选 Standard 和 Scroll Edge。\n两者背景色设置成同一个颜色\n\n参考答案\n"},{"title":"git知识",
"url":"/blog/git/",
"date":"2024-12-03",
"headings":[{"level":1,"id":"liu-cheng-shi-li","permalink":"https://linxz.online/blog/git/#liu-cheng-shi-li","title":"流程实例","children":[]},{"level":1,"id":"gitna-li-qu-liao","permalink":"https://linxz.online/blog/git/#gitna-li-qu-liao","title":".git哪里去了","children":[]},{"level":1,"id":"shu-yu","permalink":"https://linxz.online/blog/git/#shu-yu","title":"术语","children":[]},{"level":1,"id":"zhi-dao-huan-mei-gen-zong-de-nei-rong","permalink":"https://linxz.online/blog/git/#zhi-dao-huan-mei-gen-zong-de-nei-rong","title":"知道还没跟踪的内容","children":[]},{"level":1,"id":"zhui-zong-mei-ci-commit","permalink":"https://linxz.online/blog/git/#zhui-zong-mei-ci-commit","title":"追踪每次commit","children":[]},{"level":1,"id":"cha-kan-mei-ti-jiao-qian-de-gai-bian","permalink":"https://linxz.online/blog/git/#cha-kan-mei-ti-jiao-qian-de-gai-bian","title":"查看没提交前的改变","children":[]},{"level":1,"id":"hui-gun-ban-ben","permalink":"https://linxz.online/blog/git/#hui-gun-ban-ben","title":"回滚版本","children":[]},{"level":1,"id":"lian-jie-yuan-duan-cang-ku","permalink":"https://linxz.online/blog/git/#lian-jie-yuan-duan-cang-ku","title":"连接远端仓库","children":[]},{"level":1,"id":"jiang-pushde-dong-zuo-lian-jie-dao-yuan-duan-cang-ku","permalink":"https://linxz.online/blog/git/#jiang-pushde-dong-zuo-lian-jie-dao-yuan-duan-cang-ku","title":"将push的动作连接到远端仓库","children":[]},{"level":1,"id":"zai-gihubshang-cha-kan-ti-jiao-de-commits","permalink":"https://linxz.online/blog/git/#zai-gihubshang-cha-kan-ti-jiao-de-commits","title":"在gihub上查看提交的commits","children":[]},{"level":1,"id":"git-pushzai-gan-shen-me","permalink":"https://linxz.online/blog/git/#git-pushzai-gan-shen-me","title":"git push在干什么？","children":[]},{"level":1,"id":"gitignorexu-yao-de-she-zhi","permalink":"https://linxz.online/blog/git/#gitignorexu-yao-de-she-zhi","title":".gitignore需要的设置","children":[{"level":2,"id":"gitignoreyu-fa","permalink":"https://linxz.online/blog/git/#gitignoreyu-fa","title":".gitignore语法","children":[]},{"level":2,"id":"kuai-su-tian-jia-gitignore","permalink":"https://linxz.online/blog/git/#kuai-su-tian-jia-gitignore","title":"快速添加.gitignore","children":[]},{"level":2,"id":"gitignoremo-ban","permalink":"https://linxz.online/blog/git/#gitignoremo-ban","title":".gitignore模版","children":[]}]},{"level":1,"id":"fen-zhi-branchde-gai-nian","permalink":"https://linxz.online/blog/git/#fen-zhi-branchde-gai-nian","title":"分支branch的概念","children":[]},{"level":1,"id":"git-branchming-ling","permalink":"https://linxz.online/blog/git/#git-branchming-ling","title":"git branch命令","children":[]},{"level":1,"id":"mergefen-zhi","permalink":"https://linxz.online/blog/git/#mergefen-zhi","title":"merge分支","children":[]},{"level":1,"id":"fork-fen-zhi","permalink":"https://linxz.online/blog/git/#fork-fen-zhi","title":"Fork 分支","children":[]},{"level":1,"id":"cha-kan-dui-ying-de-yuan-duan-cang-ku","permalink":"https://linxz.online/blog/git/#cha-kan-dui-ying-de-yuan-duan-cang-ku","title":"查看对应的远端仓库","children":[{"level":2,"id":"gai-bian-yuan-duan-cang-ku","permalink":"https://linxz.online/blog/git/#gai-bian-yuan-duan-cang-ku","title":"改变远端仓库","children":[]}]}],
"body":"流程实例\n\n.git哪里去了\n查看隐藏文件夹\nls -a\n\n术语\nstaging area 暂存区\n知道还没跟踪的内容\ngit status\n\n追踪每次commit\ngit log\n\n结果示例：\ncommit 74f0838dc51567bbc9ac125440ef94ea0cc69faf (HEAD -&gt; main)\nAuthor: linxz-coder &lt;234692261@qq.com&gt;\nDate:   Tue Dec 3 17:38:05 2024 +0800\n\n    test\n\ncommit 9794ef9593fde4415e980aac1f08c1cbd853006c (origin/main)\nAuthor: linxz-coder &lt;234692261@qq.com&gt;\nDate:   Tue Dec 3 17:25:29 2024 +0800\n\n    mac\n\ncommit 7afaf22f676785789a259b7aaa69c839bb3b932b\nAuthor: linxz-coder &lt;234692261@qq.com&gt;\nDate:   Tue Dec 3 14:02:50 2024 +0800\n\n    first commit\n\n注意：commit后面是一段hash，是一个唯一标识码。\n查看没提交前的改变\ngit diff &lt;文件路径&gt;\n\n回滚版本\ngit checkout &lt;文件路径&gt;\n\n连接远端仓库\ngit remote add origin &lt;仓库地址&gt;\n\n将push的动作连接到远端仓库\ngit push -u origin main\n\n注意，origin就是远端仓库的别名，你也可以叫其他名字，但是传统上就是origin\n在gihub上查看提交的commits\nInsights-Network\n\ngit push在干什么？\n建立本地仓库和远端仓库的联系\n\n.gitignore需要的设置\n将暂存区的所有文件删除\ngit rm --cached -rf .\n\ngit add .\n\ngit status \n\n查看暂存区文件，确认没有不想上传的文件才执行commit操作。\n.gitignore语法\n.DS_Store\nsecrets.txt\n\n# 使用井号注释\n\n# 可以使用通配符\n*.txt\n\n\n快速添加.gitignore\ntouch .gitignore\nopen .gitignore\n\n.gitignore模版\ngithub-gitignore仓库\n分支branch的概念\n当你想要添加新功能，但不想影响现有的软件，可以先放入branch，等测试妥当后，直接merge就可以。\n\ngit branch命令\ngit branch &lt;分支名称&gt;\n\n查看branch \ngit branch\n\n转移到branch上\ngit checkout branchName\n\nmerge分支\n先回到main分支\ngit checkout main\n\nmerge命令\ngit merge branchName\n\n打开merge信息窗口，可以写入一些信息。:wq\n或者不写任何信息，直接:q!退出。\n如果在网页端，merge需要使用pull request命令。\n网页端merge教程\nFork 分支\n作用：如果你想要更改原项目的代码，用Fork\n\nclone到本地，本地修改后可以提交pull request\n\n要pull request，需要登录github界面，点击pull request。\npull request教程\n查看对应的远端仓库\ngit remote -v\n\n改变远端仓库\ngit remote set-url origin https://github.com/newusername/newrepository.git\n\n"},{"title":"Hacker News API",
"url":"/blog/hacker-news-api/",
"date":"2024-12-03",
"headings":[],
"body":"algolia\n"},{"title":"如何让iOS App在Mac上运行？",
"url":"/blog/ios-mac/",
"date":"2024-12-03",
"headings":[],
"body":"如何让iOS App在Mac上运行？\n\n项目设置 - 添加&quot;Mac Catalyst&quot;\n\n\n\n确定Signing &amp; Capabilities里面的Signing Certificate是Development状态。而不是run locally。\n\n\n\n在预览前选择My Mac(Mac Catalyst)就可以实现Mac的预览了。\n\n"},{"title":"swift的weak和weakSelf",
"url":"/blog/swift-weak-weakself/",
"date":"2024-12-03",
"headings":[{"level":1,"id":"strong-vs-weak","permalink":"https://linxz.online/blog/swift-weak-weakself/#strong-vs-weak","title":"strong vs weak","children":[]},{"level":1,"id":"weakselfshi-li","permalink":"https://linxz.online/blog/swift-weak-weakself/#weakselfshi-li","title":"weakself示例","children":[]},{"level":1,"id":"can-kao-shi-pin","permalink":"https://linxz.online/blog/swift-weak-weakself/#can-kao-shi-pin","title":"参考视频","children":[]}],
"body":"strong vs weak\n与内存管理有关。\n\n默认是strong，不用写关键词。\n\nvar str = &quot;hello&quot;\n\n\n如果是weak，需要在前面注明：\nweak var str = &quot;hello&quot;\n\n例子：\nclass Child {\n\tweak var balloon = &quot;hello&quot;\n}\n\nvar joe = Child()\n\n如果joe不见了，那么weak变量balloon也会从内存消失。\nweakself示例\nimport UIKit\n\nclass ViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        print(&quot;hello&quot;)\n        \n        view.backgroundColor = UIColor(.white)\n        \n    }\n    \n    override func viewDidAppear(_ animated: Bool) {\n        super.viewDidAppear(animated)\n        \n        let alert = UIAlertController(title: &quot;Title&quot;, message: &quot;Message&quot;, preferredStyle: .alert)\n        \n        alert.addAction(UIAlertAction(title: &quot;Done&quot;, style: .cancel, handler: { [weak self] _ in\n            self?.doSomething()\n        }))\n        \n        present(alert, animated: true)\n    }\n    \n    private func doSomething(){\n        print(&quot;something&quot;)\n    }\n\n}\n\n说明：\n如果不用weak self，当viewController声明了alert，因此进行了引用；alert在closure中又声明了self中的function，即引用了viewController。\n相互引用，因此系统无法回收内存，造成「内存泄露」，即这些内存永远无法被重新利用。\n加上weak self，alert消失后，由于不是强引用viewController，内存会自然释放。\n参考视频\nweak self\nweak vs strong swift\n"},{"title":"guard在ios-optional里面的用法",
"url":"/blog/guard-ios/",
"date":"2024-12-02",
"headings":[{"level":1,"id":"guard-letyu-if-letde-qu-bie","permalink":"https://linxz.online/blog/guard-ios/#guard-letyu-if-letde-qu-bie","title":"guard let与if let的区别","children":[]},{"level":1,"id":"can-kao-wang-zhi","permalink":"https://linxz.online/blog/guard-ios/#can-kao-wang-zhi","title":"参考网址","children":[]}],
"body":"guard let与if let的区别\nguard let 和 if let 都是处理optional的方法。\n两者区别是：\n\n\n从用法上说，guard 主要解决的是 if let 产生的 多重嵌套的问题。\n\n\n从语法上说，if let {} else {} 是一个条件判断，50/50的含义；而guard let else {} 是一个错误判断，告诉其他程序员else后面是错误，要小心。\n\n\nif let 可以return，guard let 必须return\n\n\nguard 规定的变量作用范围不只是 if 内的范围，scope外的代码都可以用。\n\n\n比如：\nguard let filename = titleInput.text, !filename.isEmpty else { return }\n\n上面代码的意思是，如果titleInput.text有值，且不为空时，才继续执行代码，否则直接跳出程序。\nfilename可以继续在下面的代码中当做参数使用。\n以上代码也可以用if let实现，不过if let容易产生多重循环。\nif let示例\nlet newUser = User()\n\nfunc showGreeting(){\n    if let nickname = newUser.nickname{\n        // do something\n    }\n}\n\nguard 示例\n\nlet newUser = User()\n\nfunc showGreeting(){\n    guard let nickname = newUser.nickname else {return}\n    // do something\n}\n\n参考网址\nstackoverflow-iflet-guardlet\n"},{"title":"如何上架app store?",
"url":"/blog/ios-submit/",
"date":"2024-12-02",
"headings":[{"level":1,"id":"qian-qi-zhun-bei","permalink":"https://linxz.online/blog/ios-submit/#qian-qi-zhun-bei","title":"前期准备","children":[]},{"level":1,"id":"chuang-jian-shou-ji-jie-tu","permalink":"https://linxz.online/blog/ios-submit/#chuang-jian-shou-ji-jie-tu","title":"创建手机截图","children":[]},{"level":1,"id":"ios-iconde-cun-chu","permalink":"https://linxz.online/blog/ios-submit/#ios-iconde-cun-chu","title":"ios-icon的存储","children":[]}],
"body":"需要给苹果交钱，每年99美金。\n免费的开发者账号：\n测试软件只能存在7天\n测试设备只有2台\n不能在app store上发布app\n前期准备\n准备好app的截图和app的icon。\n想好discription - 可参考Angela的marketing课程\n创建手机截图\nmockupphone\nios-icon的存储\nmakeappicon\n"},{"title":"SwiftUI介绍",
"url":"/blog/swift-ui/",
"date":"2024-12-02",
"headings":[{"level":1,"id":"ru-he-kai-shi-swiftuixiang-mu","permalink":"https://linxz.online/blog/swift-ui/#ru-he-kai-shi-swiftuixiang-mu","title":"如何开始swiftUI项目？","children":[{"level":2,"id":"jiang-dai-ma-xiao-chuang-kou-qu-diao","permalink":"https://linxz.online/blog/swift-ui/#jiang-dai-ma-xiao-chuang-kou-qu-diao","title":"将代码小窗口去掉","children":[]},{"level":2,"id":"tuo-dong-yuan-su-gai-bian-zi-ti","permalink":"https://linxz.online/blog/swift-ui/#tuo-dong-yuan-su-gai-bian-zi-ti","title":"拖动元素改变字体","children":[]},{"level":2,"id":"she-zhi-bei-jing-se","permalink":"https://linxz.online/blog/swift-ui/#she-zhi-bei-jing-se","title":"设置背景色","children":[]},{"level":2,"id":"bing-lie-liang-ge-yuan-su","permalink":"https://linxz.online/blog/swift-ui/#bing-lie-liang-ge-yuan-su","title":"并列两个元素","children":[]}]},{"level":1,"id":"uiyan-se-ling-gan","permalink":"https://linxz.online/blog/swift-ui/#uiyan-se-ling-gan","title":"UI颜色灵感","children":[{"level":2,"id":"yan-se-zhuan-huan-hext-to-rgb","permalink":"https://linxz.online/blog/swift-ui/#yan-se-zhuan-huan-hext-to-rgb","title":"颜色转换 hext to rgb","children":[]}]},{"level":1,"id":"zi-ti-xuan-ze","permalink":"https://linxz.online/blog/swift-ui/#zi-ti-xuan-ze","title":"字体选择","children":[{"level":2,"id":"tian-jia-zi-ding-yi-zi-ti","permalink":"https://linxz.online/blog/swift-ui/#tian-jia-zi-ding-yi-zi-ti","title":"添加自定义字体","children":[]}]},{"level":1,"id":"ru-he-fu-yong-yuan-su","permalink":"https://linxz.online/blog/swift-ui/#ru-he-fu-yong-yuan-su","title":"如何复用元素","children":[]},{"level":1,"id":"swiftuide-list","permalink":"https://linxz.online/blog/swift-ui/#swiftuide-list","title":"swiftUI的list","children":[]},{"level":1,"id":"ru-he-shua-xin-yu-lan","permalink":"https://linxz.online/blog/swift-ui/#ru-he-shua-xin-yu-lan","title":"如何刷新预览","children":[]},{"level":1,"id":"swifthuo-qu-api","permalink":"https://linxz.online/blog/swift-ui/#swifthuo-qu-api","title":"swift获取api","children":[]}],
"body":"2019年推出。\n为了让初学者更快掌握swift。\n与swiftUI相对的，就是稳定的UIKit。\n特点：\n\n拖动图标，自动生成代码。\n复用component\nlive preview\n多平台:Mac, watch等等\n\n如何开始swiftUI项目？\nInterface 改成 swiftUI即可。\n将代码小窗口去掉\nEditor - minimap, 勾选去掉即可。\n拖动元素改变字体\n通过object library（+号）查找font关键词即可。将它拖动到代码侧。\n\n设置背景色\n查找color，将颜色和其他元素设置成zstack，可以通过ctrl+单击选中元素，选择ZStack即可。\nimport SwiftUI\n\n//content部分\nstruct ContentView: View {\n    var body: some View {\n        ZStack{\n            //设置背景色，覆盖safe area\n            Color(.systemTeal).edgesIgnoringSafeArea(.all)\n\t\t//其他元素\n\t\t...\n\t}\n\n并列两个元素\n选择vstack。放到一起：\nimport SwiftUI\n\n//content部分\nstruct ContentView: View {\n    var body: some View {\n        ZStack{\n            //设置背景色，覆盖safe area\n            Color(.systemTeal).edgesIgnoringSafeArea(.all)\n            \n            //修改字体颜色\n            VStack {\n                Text(&quot;I am Rich&quot;)\n                    .font(.system(size: 40))\n                    .fontWeight(.bold)\n                    .foregroundColor(Color.white)\n                Image(&quot;diamond&quot;)\n                    .resizable()\n                    .aspectRatio(contentMode: .fit)\n                    .frame(width: 200, height: 200, alignment: .center)\n            }\n        }\n    }\n}\n\n//preview部分\n#Preview {\n    ContentView()\n}\n\nUI颜色灵感\nflatuicolors\n颜色转换 hext to rgb\nrapidtables\n字体选择\ngoogle字体\n添加自定义字体\n重点：在Info里面添加字体信息。\n\n如何复用元素\nctrl + 单击 -&gt; Extract Subview\n\nswiftUI的list\nList{\n\t//元素\n}\n\n如何刷新预览\ncmd + option + P\nswift获取api\n    func fetchData(){\n        guard let url = URL(string: &quot;https://hn.algolia.com/api/v1/search?tags=front_page&quot;) else {return}\n        let session = URLSession(configuration: .default)\n        let task = session.dataTask(with: url) {(data, response, error) in\n            guard error == nil else {return}\n            let decoder = JSONDecoder()\n            guard let safeData = data else {return}\n            do{\n                let result = try decoder.decode(Results.self, from: safeData)\n            } catch {\n                print(error)\n            }\n        }\n        task.resume()\n    } \n\n"},{"title":"ios-自动隐藏键盘方案",
"url":"/blog/ios-hide-keyboard/",
"date":"2024-11-29",
"headings":[{"level":1,"id":"zuo-yong","permalink":"https://linxz.online/blog/ios-hide-keyboard/#zuo-yong","title":"作用","children":[]},{"level":1,"id":"shi-yong-swift-package-managerxia-zai-dui-ying-de-bao","permalink":"https://linxz.online/blog/ios-hide-keyboard/#shi-yong-swift-package-managerxia-zai-dui-ying-de-bao","title":"使用swift package manager下载对应的包","children":[]},{"level":1,"id":"zai-appdelegate-swifttian-jia-dai-ma","permalink":"https://linxz.online/blog/ios-hide-keyboard/#zai-appdelegate-swifttian-jia-dai-ma","title":"在AppDelegate.swift添加代码：","children":[]},{"level":1,"id":"shi-yong-qi-zhong-de-shu-xing","permalink":"https://linxz.online/blog/ios-hide-keyboard/#shi-yong-qi-zhong-de-shu-xing","title":"使用其中的属性","children":[{"level":2,"id":"xiang-yao-chu-xian-donede-biao-qian","permalink":"https://linxz.online/blog/ios-hide-keyboard/#xiang-yao-chu-xian-donede-biao-qian","title":"想要出现done的标签。","children":[]},{"level":2,"id":"dian-ji-jian-pan-wai-qu-yu-tui-chu-jian-pan","permalink":"https://linxz.online/blog/ios-hide-keyboard/#dian-ji-jian-pan-wai-qu-yu-tui-chu-jian-pan","title":"点击键盘外区域退出键盘","children":[]}]}],
"body":"作用\n防止键盘挡掉页面的内容\n\n使用swift package manager下载对应的包\nIQKeyboardManagerSwift\ngithub地址\n在AppDelegate.swift添加代码：\n在第一个function下面添加以下代码：\nIQKeyboardManager.shared.isEnabled = true\n\n示例代码：\n注意以下代码整合了firebase和IQKeyboardManager。\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&gt; Bool {\n        //设置http代理，firebase不支持socks5代理\n        setenv(&quot;grpc_proxy&quot;, &quot;http://127.0.0.1:1087&quot;, 1)\n        \n        FirebaseApp.configure()\n        let db = Firestore.firestore()\n        \n        print(db) //测试是否成功，要出现&lt;FIRFirestore: 0x600002129c70&gt;字样\n        \n        IQKeyboardManager.shared.isEnabled = true\n\n        \n        return true\n    }\n\n使用其中的属性\n想要出现done的标签。\nIQKeyboardManager.shared.enableAutoToolbar = true\n\n注意，以上办法已经废弃，应该这样使用：\nimport IQKeyboardToolbarManager\nIQKeyboardToolbarManager.shared.isEnabled = true\n\n其他属性参考\n点击键盘外区域退出键盘\nIQKeyboardManager.shared.resignOnTouchOutside = true\n\n"},{"title":"ViewController生命周期lifeCycle",
"url":"/blog/ios-lifecycle/",
"date":"2024-11-29",
"headings":[{"level":1,"id":"ios-application-lifecycle-sheng-ming-zhou-qi","permalink":"https://linxz.online/blog/ios-lifecycle/#ios-application-lifecycle-sheng-ming-zhou-qi","title":"ios Application lifeCycle 生命周期","children":[{"level":2,"id":"appdelegate","permalink":"https://linxz.online/blog/ios-lifecycle/#appdelegate","title":"AppDelegate","children":[]},{"level":2,"id":"scenedelegate","permalink":"https://linxz.online/blog/ios-lifecycle/#scenedelegate","title":"SceneDelegate","children":[]}]}],
"body":"viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear\n注意：viewDidLoad只会运行一次，即首次启动时运行，之后不会再运行。\n\nViewController-lifeCycle介绍视频\nios Application lifeCycle 生命周期\n\nApplication lifeCycle介绍视频\n体现在AppDelegate.swift和SceneDelegate.swift两个文件中。\nSceneDelegate主要处理不同窗口的优先度的。因为iPad可以允许多窗口运行，它要知道哪些窗口是靠前的。iOS12前是没有这个文件的，因为不允许多窗口运行。\nAppDelegate\ndidFinishLaunchingWithOptions：App开始\ndidDiscardSceneSessions： 用户往上推出这个程序\nSceneDelegate\nsceneWillResignActive: 用户接电话等中断时的操作，比如可以停止播放音乐。\nsceneDidEnterBackground：用户打开了另外的app，app进入后台。\nsceneWillEnterForeground：App重新进入前台。\n"},{"title":"如何让swift package manager走代理？",
"url":"/blog/swift-package-manager/",
"date":"2024-11-29",
"headings":[{"level":1,"id":"ming-ling-xing-dai-li","permalink":"https://linxz.online/blog/swift-package-manager/#ming-ling-xing-dai-li","title":"命令行代理","children":[]},{"level":1,"id":"geng-xin-spmde-yi-lai-ku","permalink":"https://linxz.online/blog/swift-package-manager/#geng-xin-spmde-yi-lai-ku","title":"更新SPM的依赖库","children":[]},{"level":1,"id":"shu-ru-wang-zhi-zi-dong-xia-zai","permalink":"https://linxz.online/blog/swift-package-manager/#shu-ru-wang-zhi-zi-dong-xia-zai","title":"输入网址自动下载","children":[]},{"level":1,"id":"guan-bi-xcode","permalink":"https://linxz.online/blog/swift-package-manager/#guan-bi-xcode","title":"关闭xcode","children":[]},{"level":1,"id":"can-kao-lian-jie","permalink":"https://linxz.online/blog/swift-package-manager/#can-kao-lian-jie","title":"参考链接","children":[]}],
"body":"命令行代理\nexport all_proxy=http://127.0.0.1:1087\n\n更新SPM的依赖库\n自动更新成代理命令行网络代理模式\nxcodebuild -resolvePackageDependencies -scmProvider system\n\n输入网址自动下载\nfile - add package dependencies\n比如，输入https://github.com/hackiftekhar/IQKeyboardManager.git，马上就会显示对应的包。\n\n关闭xcode\n设置完代理后，可能也找不到包，这个时候关闭xcode，重新打开软件，再添加包即可。\n参考链接\n掘金\n"},{"title":"如何使用Firebase的数据库Firestore",
"url":"/blog/firebase-firestore/",
"date":"2024-11-28",
"headings":[{"level":1,"id":"chuang-jian-database","permalink":"https://linxz.online/blog/firebase-firestore/#chuang-jian-database","title":"创建Database","children":[]},{"level":1,"id":"gai-bian-appdelegatepei-zhi","permalink":"https://linxz.online/blog/firebase-firestore/#gai-bian-appdelegatepei-zhi","title":"改变AppDelegate配置","children":[]},{"level":1,"id":"ru-guo-yin-wei-wang-luo-lian-jie-bu-cheng-gong-ke-yi-she-zhi-httpdai-li","permalink":"https://linxz.online/blog/firebase-firestore/#ru-guo-yin-wei-wang-luo-lian-jie-bu-cheng-gong-ke-yi-she-zhi-httpdai-li","title":"如果因为网络连接不成功，可以设置http代理：","children":[]},{"level":1,"id":"tian-jia-shu-ju-jin-shu-ju-ku","permalink":"https://linxz.online/blog/firebase-firestore/#tian-jia-shu-ju-jin-shu-ju-ku","title":"添加数据进数据库","children":[]},{"level":1,"id":"tuo-zhan-dai-li-wen-ti","permalink":"https://linxz.online/blog/firebase-firestore/#tuo-zhan-dai-li-wen-ti","title":"拓展：代理问题","children":[]},{"level":1,"id":"firestorehuo-qu-shu-ju","permalink":"https://linxz.online/blog/firebase-firestore/#firestorehuo-qu-shu-ju","title":"firestore获取数据","children":[]},{"level":1,"id":"ru-guo-xu-yao-shi-shi-tong-bu-ui","permalink":"https://linxz.online/blog/firebase-firestore/#ru-guo-xu-yao-shi-shi-tong-bu-ui","title":"如果需要实时同步UI","children":[]},{"level":1,"id":"an-shi-jian-chuo-shun-xu","permalink":"https://linxz.online/blog/firebase-firestore/#an-shi-jian-chuo-shun-xu","title":"按时间戳顺序","children":[]},{"level":1,"id":"tuo-zhan-guo-nei-dui-biao-firebasede-ping-tai","permalink":"https://linxz.online/blog/firebase-firestore/#tuo-zhan-guo-nei-dui-biao-firebasede-ping-tai","title":"拓展：国内对标Firebase的平台","children":[{"level":2,"id":"qi-ta-xuan-ze","permalink":"https://linxz.online/blog/firebase-firestore/#qi-ta-xuan-ze","title":"其他选择","children":[]}]}],
"body":"用来存储数据，是个数据库。\nCloud Firestore官方文档。\n创建Database\n在console-选中项目-Firestore Database下，选择create database\n\n选定区域后（我选的香港），选择test mode。后面可以改成production mode的，只是为了方便调试。在你明确数据管理人和规则后，可以选择后一种模式。\n\n改变AppDelegate配置\nimport FirebaseCore\nimport FirebaseFirestore\n\n//第一个func下面\nfunc aplication(....)\n        FirebaseApp.configure()\n        let db = Firestore.firestore()\n\t  print(db) //测试是否成功，要出现&lt;FIRFirestore: 0x600002129c70&gt;字样\n\n如果因为网络连接不成功，可以设置http代理：\n改变AppDelegate配置。\nsetenv(&quot;grpc_proxy&quot;, &quot;http://127.0.0.1:1087&quot;, 1)\n\n//其他firebase的设置\n\n添加数据进数据库\n    @IBAction func sendPressed(_ sender: UIButton) {\n        //Auth提供的访问用户名的方法\n        if let messageBody = messageTextfield.text, let messageSender = Auth.auth().currentUser?.email{\n            db.collection(K.FStore.collectionName).addDocument(data: [K.FStore.senderField: messageSender, K.FStore.bodyField: messageBody]) {error in\n                if let error {\n                    print(&quot;There is an issue saving data to firestore, \\(error)&quot;)\n                } else {\n                    print(&quot;Successfully saved data.&quot;)\n                }\n            }\n        }\n    }\n\nK.swift参考：\n    struct FStore {\n        static let collectionName = &quot;messages&quot;\n        static let senderField = &quot;sender&quot;\n        static let bodyField = &quot;body&quot;\n        static let dateField = &quot;date&quot;\n    }\n\n拓展：代理问题\n其实我本来就设置了代理，但是默认是socks5，firebase不支持。可以看看中国人提出的问题和设置环境变量的解释\nfirestore获取数据\n需要用到async await的方法\n    func loadMessages() async{\n        messages = []\n        do {\n            let snapshot = try await db.collection(K.FStore.collectionName).getDocuments()\n            for document in snapshot.documents {\n//                print(&quot;\\(document.documentID) =&gt; \\(document.data())&quot;)\n                let data = document.data()\n                if let messageSender = data[K.FStore.senderField] as? String, let messageBody = data[K.FStore.bodyField] as? String{\n                    let newMessage = Message(sender: messageSender, body: messageBody)\n                    messages.append(newMessage)\n                    \n                    //后台运行异步任务\n                    DispatchQueue.main.async {\n                        self.tableView.reloadData()\n                    }\n                    \n                }\n            }\n        } catch {\n            print(&quot;Error getting documents: \\(error)&quot;)\n        }\n    }\n\n注意，在call function的时候需要包裹在Task里面，因为ViewDidLoad无法覆盖成async方法\n        Task {\n            await loadMessages()\n        }\n\n如果需要实时同步UI\n    func loadMessages() async{\n        \n        //实时更新信息 - addSnapshotListener\n        db.collection(K.FStore.collectionName).addSnapshotListener { (querySnapshot, error) in\n            \n            self.messages = []\n            \n            if let error{\n                print(&quot;There was an isssue retrieving data from Firestore, \\(error)&quot;)\n            } else {\n                if let snapshotDocuments = querySnapshot?.documents{\n                    for document in snapshotDocuments {\n                        //                print(&quot;\\(document.documentID) =&gt; \\(document.data())&quot;)\n                        let data = document.data()\n                        if let messageSender = data[K.FStore.senderField] as? String, let messageBody = data[K.FStore.bodyField] as? String{\n                            let newMessage = Message(sender: messageSender, body: messageBody)\n                            self.messages.append(newMessage)\n                            \n                            //后台运行异步任务\n                            DispatchQueue.main.async {\n                                self.tableView.reloadData()\n                            }\n                            \n                        }\n                    }\n                }\n            }\n        }\n    }\n\n注意，可能不是预想的顺序，因为retrieve data是按照id的顺序，而不是添加时间的顺序，我们需要做一个按照时间戳顺序的方式。\n按时间戳顺序\nfirestore的order方法\n加一个.order即可：\n db.collection(K.FStore.collectionName)\n            .order(by: K.FStore.dateField)\n            .addSnapshotListener{...\n\nfirestore数据库的安全规则rules\n文档\n在console里面写明规则，再publish即可。\n\n拓展：国内对标Firebase的平台\nLeanCloud，也是个baas(backend as a service)平台。解决用户的后端需求，包括用户注册登录、存储数据库、短信发送等服务。\n也有iOS sdk。\n其他选择\n腾讯云开发cloud base：缺点是没有iOS的sdk，用不了移动端。好像有Flutter的？\n"},{"title":"ios如何自定义聊天气泡-UITableView-cells",
"url":"/blog/ios-chat-bubble/",
"date":"2024-11-28",
"headings":[{"level":2,"id":"labelyun-xu-huan-xing","permalink":"https://linxz.online/blog/ios-chat-bubble/#labelyun-xu-huan-xing","title":"label允许换行","children":[]},{"level":2,"id":"gei-qi-pao-viewjia-shang-hu-du","permalink":"https://linxz.online/blog/ios-chat-bubble/#gei-qi-pao-viewjia-shang-hu-du","title":"给气泡view加上弧度","children":[]},{"level":1,"id":"bu-rang-yong-hu-xuan-ze-cell","permalink":"https://linxz.online/blog/ios-chat-bubble/#bu-rang-yong-hu-xuan-ze-cell","title":"不让用户选择cell","children":[]},{"level":1,"id":"dui-hua-qi-pao","permalink":"https://linxz.online/blog/ios-chat-bubble/#dui-hua-qi-pao","title":"对话气泡","children":[{"level":2,"id":"tiao-jian-xuan-ze","permalink":"https://linxz.online/blog/ios-chat-bubble/#tiao-jian-xuan-ze","title":"条件选择","children":[]}]},{"level":1,"id":"ru-he-mei-ci-zi-dong-tiao-dao-zui-xia-mian-de-dui-hua","permalink":"https://linxz.online/blog/ios-chat-bubble/#ru-he-mei-ci-zi-dong-tiao-dao-zui-xia-mian-de-dui-hua","title":"如何每次自动跳到最下面的对话","children":[]}],
"body":"在Views文件夹新建一个Cocoa Touch Class，记得勾选.xlb文件，以获取UI界面。\n\n在里面添加元素。\n聊天软件一般是需要一个气泡view和ImageView(可以在Image属性里改成Avatar头像)\n这两个需要组成一个stack，stack的constraints设计成上下左右各10px。\nImageView强制宽和高40x40.\n在气泡view里面加上Label，constraints同样设计成上下左右各10px。\n如图：\n\nlabel允许换行\n将lines属性设置成0即可。\n\n此时，对齐会显得奇怪，将stack的对齐方式(alignment)设置成Top即可。\n给气泡view加上弧度\n在MessageCell的awakeFromNib加上以下内容即可：\nmessageBubble.layer.cornerRadius = messageBubble.frame.size.height / 8\n\n调整弧度：调整分母即可。分母越大，弧度越小。\n\n不让用户选择cell\n即选中时不会呈现灰色背景。\ninspectors - Interaction - 不要勾选User Interation Enabled即可\n\n对话气泡\n首先，做一个左右的对话UI\n\n条件选择\n根据登陆者是当前账号或者其他账号，显示不同的UI，以及隐藏左边/右边的头像。\n//每个cell都使用的方法\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        \n        let message = messages[indexPath.row]\n        \n        let cell = tableView.dequeueReusableCell(withIdentifier: K.cellIdentifier, for:indexPath) as! MessageCell //as!强制类型下降\n        cell.label.text = message.body\n        \n        // This is a message from the current user\n        if message.sender == Auth.auth().currentUser?.email {\n            cell.leftImageView.isHidden = true\n            cell.rightImageView.isHidden = false\n            cell.messageBubble.backgroundColor = UIColor(named: K.BrandColors.lightPurple)\n            cell.label.textColor = UIColor(named: K.BrandColors.purple)\n        } else {\n            // This is a message from the another sender.\n            cell.leftImageView.isHidden = false\n            cell.rightImageView.isHidden = true\n            cell.messageBubble.backgroundColor = UIColor(named: K.BrandColors.purple)\n            cell.label.textColor = UIColor(named: K.BrandColors.lightPurple)\n        }\n        \n\n        return cell\n        \n    }\n\n如何每次自动跳到最下面的对话\n在loadMessages()里面加上这个代码即可。\n//后台运行异步任务\nDispatchQueue.main.async {\n   self.tableView.reloadData()\n                                \n   //表格可以区分不同section，像apple设置里面一样，我们没有设置，所以是0\n   let indexPath = IndexPath(row: self.messages.count - 1, section: 0)\n                                \n   self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)\n}\n\n"},{"title":"ios-app设计灵感网站",
"url":"/blog/ios-design-reference/",
"date":"2024-11-28",
"headings":[{"level":1,"id":"she-ji-yuan-xing","permalink":"https://linxz.online/blog/ios-design-reference/#she-ji-yuan-xing","title":"设计原型","children":[]}],
"body":"dribble, figma\n设计原型\nfigma\nsketch\n"},{"title":"iOS类型的提升和下降 - as的用法",
"url":"/blog/swift-as/",
"date":"2024-11-28",
"headings":[{"level":1,"id":"as","permalink":"https://linxz.online/blog/swift-as/#as","title":"as","children":[]},{"level":1,"id":"as-1","permalink":"https://linxz.online/blog/swift-as/#as-1","title":"as!","children":[]},{"level":1,"id":"as-2","permalink":"https://linxz.online/blog/swift-as/#as-2","title":"as?","children":[{"level":2,"id":"tuo-zhan-swiftde-anylei-xing","permalink":"https://linxz.online/blog/swift-as/#tuo-zhan-swiftde-anylei-xing","title":"拓展：swift的Any类型","children":[]}]}],
"body":"as 是做什么的？type-casting\nas\n强制类型提升（子类-&gt;父类）\nas!\n强制类型下降（父类-&gt;子类）\nas?\n安全类型下降（父类-&gt;子类）\n示例代码：\nimport Foundation\n\nclass Animal {\n    var name: String\n    \n    init(n: String){\n        name = n\n    }\n}\n\nclass Human: Animal {\n    func code(){\n        print(&quot;Typing away...&quot;)\n    }\n}\n\nclass Nohuman{\n    func shout(){\n        print(&quot;zzzz....&quot;)\n    }\n}\n\nclass Fish: Animal{\n    func breatheUnderWater(){\n        print(&quot;Breathing under water.&quot;)\n    }\n}\n\nlet angela = Human(n: &quot;Angela Yu&quot;)\nlet jack = Human(n: &quot;Jack Bauer&quot;)\nlet nemo = Fish(n: &quot;Nemo&quot;)\nlet noman = Nohuman()\n\n//这三个之所以可以组成Array，因为它们都是Animal\nlet neighbours = [angela, jack, nemo]\n//let neighbours = [angela, jack, nemo, noman] //报错\n\n//is: 检查一个实例是否某个class (for type checking)\nif neighbours[0] is Human{\n    print(&quot;First neighbour is a Human.&quot;)\n}\n\nfunc findNemo(from animals:[Animal]){\n    for animal in animals{\n        if animal is Fish{\n            print(animal.name)\n            let fish = animal as! Fish //强制类型下降 as!强制cast down到Fish类型\n            fish.breatheUnderWater()\n            \n            let animalFish = fish as Animal //强制类型提升\n        }\n    }\n}\n\nfindNemo(from: neighbours)\n\nlet fish = neighbours[1] as? Fish //安全类型下降 as?\nfish?.breatheUnderWater() //不会crash，只是不执行\n\n//安全执行\nif let fish2 = neighbours[1] as? Fish{\n    fish2.breatheUnderWater()\n} else {\n    print(&quot;Casting has failed&quot;)\n}\n\n\nlet num = 12\n//Any就可以拼凑一个Array\nlet neighbours2: [Any] = [angela, jack, nemo, num]\n\n//AnyObject只可以拼凑Object在一起\nlet neighbours3: [AnyObject] = [angela, jack, nemo, noman]\n\n拓展：swift的Any类型\nAny是最大的，下面是AnyObject。\n苹果的Object，即在Foundation模块下，都是NSObject\n\n"},{"title":"swift-ios-tableview和tablefield区别",
"url":"/blog/tableview-tablefield/",
"date":"2024-11-28",
"headings":[],
"body":"tablefield是单行文本框，支持placeholder，可以无边框，不支持文本换行。\ntableview是多行文本框，不支持place holder，支持换行。\n"},{"title":"ios如何创建contants file",
"url":"/blog/ios-constants-file/",
"date":"2024-11-27",
"headings":[{"level":2,"id":"tuo-zhan-staticde-zuo-yong","permalink":"https://linxz.online/blog/ios-constants-file/#tuo-zhan-staticde-zuo-yong","title":"拓展：static的作用","children":[]}],
"body":"用处：减少程序员自己输入String的次数，减少错误。\n在主目录创建Constants.swift或者K.swift文件：\n在let前面加上static方法。\nstruct Constants{\n    static let registerSegue = &quot;RegisterToChat&quot;\n    static let loginSegue = &quot;LoginToChat&quot;\n}\n\n\n现在就可以使用Constants.xx的形式了，会有提示，不容易出错。\n拓展：static的作用\n利用static，可以直接使用class或者struct里面的property，不需要实例化，即MyClass = SomeClass()之后再使用它的属性，大大地方便了使用。\n注意， static也可以用在func的前面 。\n"},{"title":"Firebase介绍",
"url":"/blog/ios-firebase/",
"date":"2024-11-27",
"headings":[{"level":1,"id":"xin-jian-xiang-mu","permalink":"https://linxz.online/blog/ios-firebase/#xin-jian-xiang-mu","title":"新建项目","children":[]},{"level":1,"id":"xia-zai-configwen-jian","permalink":"https://linxz.online/blog/ios-firebase/#xia-zai-configwen-jian","title":"下载config文件","children":[]},{"level":1,"id":"xiu-gai-podfilewen-jian","permalink":"https://linxz.online/blog/ios-firebase/#xiu-gai-podfilewen-jian","title":"修改Podfile文件","children":[]},{"level":1,"id":"an-zhuang","permalink":"https://linxz.online/blog/ios-firebase/#an-zhuang","title":"安装","children":[]},{"level":1,"id":"xiu-gai-appdelegatewen-jian","permalink":"https://linxz.online/blog/ios-firebase/#xiu-gai-appdelegatewen-jian","title":"修改AppDelegate文件","children":[]},{"level":1,"id":"ios-authentication","permalink":"https://linxz.online/blog/ios-firebase/#ios-authentication","title":"ios-Authentication","children":[]}],
"body":"google推出的app工具，可以存储对话，实现验证等功能。\n新建项目\n到官网，用自己的google账号打开右上角console。\ncreate new project，暂时我们不需要google analytic，所以里面的都可以不勾选。创建项目即可。\n\n点击正中间的&quot;ios+&quot;按钮，加入一个ios-app。\n输入你的bundle ID，一般是一个倒着的URL，比如online.linxz\n下载config文件\n注意，这个文件需要放在项目的根目录下，和Info.plist一个目录。\n\n修改Podfile文件\npod &#39;FirebaseAuth&#39;\npod &#39;FirebaseFirestore&#39;\n\n参考链接\n安装\npod install\n\n修改AppDelegate文件\n实际上就是加上import FirebaseCore和FirebaseApp.configure()\nimport UIKit\nimport FirebaseCore\n\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&gt; Bool {\n        // Override point for customization after application launch.\n        FirebaseApp.configure()\n        return true\n    }\n\nfirebase文档查看使用方式。\nios-Authentication\nPassword Authentication操作指引\n在console里面勾选emali/password，enable就可以了。\n\n在需要使用代码的地方：\nAuth.auth().createUser(withEmail: email, password: password) { authResult, error in\n  // ...\n}\n\n示例代码：\n@IBAction func registerPressed(_ sender: UIButton) {\n        \n        if let email = emailTextfield.text,let password = passwordTextfield.text{\n            Auth.auth().createUser(withEmail: email, password: password) { authResult, error in\n                if let error {\n                    print(error)\n                } else{\n                    //Navigate to the ChatViewController\n                    self.performSegue(withIdentifier: &quot;RegisterToChat&quot;, sender: self)\n                }\n            }\n\n        }\n        \n    }\n\n当完成注册后，账号代码也会在console里面显示：\n\n"},{"title":"ios-设置标题UI元素",
"url":"/blog/ios-title-element/",
"date":"2024-11-27",
"headings":[{"level":1,"id":"she-zhi-logout-button","permalink":"https://linxz.online/blog/ios-title-element/#she-zhi-logout-button","title":"设置Logout button","children":[]},{"level":1,"id":"yin-cang-zuo-shang-jiao-backan-niu","permalink":"https://linxz.online/blog/ios-title-element/#yin-cang-zuo-shang-jiao-backan-niu","title":"隐藏左上角Back按钮","children":[]},{"level":1,"id":"zeng-jia-shang-mian-zhong-jian-de-title","permalink":"https://linxz.online/blog/ios-title-element/#zeng-jia-shang-mian-zhong-jian-de-title","title":"增加上面中间的title","children":[]},{"level":1,"id":"swiftgai-bian-dao-hang-tiao-yan-se","permalink":"https://linxz.online/blog/ios-title-element/#swiftgai-bian-dao-hang-tiao-yan-se","title":"swift改变导航条颜色：","children":[{"level":2,"id":"gai-bian-ben-ye-dao-hang-tiao-yan-se","permalink":"https://linxz.online/blog/ios-title-element/#gai-bian-ben-ye-dao-hang-tiao-yan-se","title":"改变本页导航条颜色","children":[]},{"level":2,"id":"hui-fu-shang-yi-ye-dao-hang-tiao-yan-se","permalink":"https://linxz.online/blog/ios-title-element/#hui-fu-shang-yi-ye-dao-hang-tiao-yan-se","title":"恢复上一页导航条颜色","children":[]},{"level":2,"id":"gai-bian-qi-ta-yuan-su-yan-se","permalink":"https://linxz.online/blog/ios-title-element/#gai-bian-qi-ta-yuan-su-yan-se","title":"改变其他元素颜色","children":[{"level":3,"id":"backan-niu","permalink":"https://linxz.online/blog/ios-title-element/#backan-niu","title":"back按钮","children":[]},{"level":3,"id":"dao-hang-tiao-biao-ti","permalink":"https://linxz.online/blog/ios-title-element/#dao-hang-tiao-biao-ti","title":"导航条标题","children":[]}]}]},{"level":1,"id":"quan-ju-she-zhi-navigation-bar","permalink":"https://linxz.online/blog/ios-title-element/#quan-ju-she-zhi-navigation-bar","title":"全局设置navigation bar","children":[]}],
"body":"首先要embed in Navigate Controller:\n选中第一个界面 - Editor - embed in - Navigate Controller\n\n设置Logout button\n添加元素bar button\n改成名字-Logout\n隐藏左上角Back按钮\n在viewDidLoad里面增加：\nnavigationItem.hidesBackButton = true\n\n增加上面中间的title\n在viewDidLoad里面增加：\ntitle = &quot;⚡️FlashChat&quot;\n\nswift改变导航条颜色：\n改变本页导航条颜色\n在viewWillAppear里面设置。\n为什么不设置在viewDidLoad？因为它会快于导航条的渲染。而viewWillAppear出现在导航条渲染后。\nvar defaultAppearance: UINavigationBarAppearance?\n\noverride func viewWillAppear(_ animated: Bool) {\n\tguard let navBar = navigationController?.navigationBar else {fatalError(&quot;Navigation controller does not exist&quot;)}\n            \n            // 保存默认外观配置，以便后续恢复\n            defaultAppearance = navBar.standardAppearance.copy()\n            \n            let appearance = UINavigationBarAppearance()\n            appearance.backgroundColor = .red\n            navBar.standardAppearance = appearance\n            navBar.scrollEdgeAppearance = appearance\n}\n\n恢复上一页导航条颜色\n在viewWillDisappear里面设置。\noverride func viewWillDisappear(_ animated: Bool) {\n        super.viewWillDisappear(animated)\n        \n        // 恢复默认外观\n        if let defaultAppearance = defaultAppearance,\n           let navBar = navigationController?.navigationBar {\n            navBar.standardAppearance = defaultAppearance\n            navBar.scrollEdgeAppearance = defaultAppearance\n        }\n    }\n\n改变其他元素颜色\nback按钮\n.tintColor\n导航条标题\nappearance.titleTextAttributes\n代码示例：\n guard let menuColor = UIColor(hexString: colorHex) else {\n                fatalError(&quot;Error color&quot;)}\n            \n            // 保存默认外观配置，以便后续恢复\n            defaultAppearance = navBar.standardAppearance.copy()\n            \n            let appearance = UINavigationBarAppearance()\n            appearance.backgroundColor = UIColor(hexString: colorHex)\n            \n            //改变back按钮颜色\n            navBar.tintColor = UIColor(contrastingBlackOrWhiteColorOn: menuColor , isFlat: true)\n            \n            //改变标题颜色\n            appearance.titleTextAttributes = [.foregroundColor: UIColor(contrastingBlackOrWhiteColorOn: menuColor, isFlat: true)]\n            \n            // 设置 Large Title 的颜色\n              appearance.largeTitleTextAttributes = [.foregroundColor: UIColor(contrastingBlackOrWhiteColorOn: menuColor, isFlat: true)]\n            \n            navBar.standardAppearance = appearance\n            navBar.scrollEdgeAppearance = appearance\n            \n\n            \n            searchBar.barTintColor = UIColor(hexString: colorHex)\n\n全局设置navigation bar\n在AppDelegate的第一个func里面输入：\n //全局样式-顶部菜单颜色\n        let appearance = UINavigationBarAppearance()\n        appearance.backgroundColor = UIColor(named: K.BrandColors.blue)  // 设置背景色\n        \n        // 设置标题字体和颜色\n        appearance.titleTextAttributes = [\n            .font: UIFont.systemFont(ofSize: 25, weight: .black),  // 设置字号为28\n            .foregroundColor: UIColor.white        // 设置颜色为白色\n        ]\n        \n        UINavigationBar.appearance().standardAppearance = appearance\n        UINavigationBar.appearance().scrollEdgeAppearance = appearance\n        UINavigationBar.appearance().compactAppearance = appearance\n\n"},{"title":"ios如何创建聊天窗口-UITableView",
"url":"/blog/ios-uitableview/",
"date":"2024-11-27",
"headings":[{"level":1,"id":"shi-yong-tableview","permalink":"https://linxz.online/blog/ios-uitableview/#shi-yong-tableview","title":"使用tableView","children":[{"level":2,"id":"zhu-yi-uitableviewdelegatede-shi-yong","permalink":"https://linxz.online/blog/ios-uitableview/#zhu-yi-uitableviewdelegatede-shi-yong","title":"注意：UITableViewDelegate的使用","children":[]}]},{"level":1,"id":"qu-xiao-yong-hu-xuan-ze-xiao-guo-bian-hui","permalink":"https://linxz.online/blog/ios-uitableview/#qu-xiao-yong-hu-xuan-ze-xiao-guo-bian-hui","title":"取消用户选择效果-变灰","children":[]},{"level":1,"id":"shi-yong-tableviewcontroller","permalink":"https://linxz.online/blog/ios-uitableview/#shi-yong-tableviewcontroller","title":"使用TableViewController","children":[]},{"level":1,"id":"swiftru-he-gei-cellyou-bian-jia-gou-xuan-fu-hao","permalink":"https://linxz.online/blog/ios-uitableview/#swiftru-he-gei-cellyou-bian-jia-gou-xuan-fu-hao","title":"swift如何给cell右边加勾选符号？","children":[]}],
"body":"按+号搜索&quot;Table View&quot;。\n信息展示搜索&quot;Table View Cell&quot;\n使用tableView\n实际上就是delegate的实现。\nviewDidLoad里面完成delegate，这里是dataSource\nregister用于注册我们后面要使用的cell。用nibName来区分是哪个风格cell，为的是寻找对应的.xlb文件（一般也是Class的名字），这个可以复用。而identifier则不可以复用。一个nibName可以对应多个identifier。\ntableView.dataSource = self\n\ntableView.register(UINib(nibName: K.cellNibName, bundle: nil), forCellReuseIdentifier: K.cellIdentifier)\n\n最后面创建一个extension来用protocol:\n//MARK: - UITableViewDataSource\nextension ChatViewController: UITableViewDataSource{\n    //有多少行\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {\n        return messages.count\n    }\n    \n    //用哪个cell\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: K.cellIdentifier, for:indexPath)\n        cell.textLabel?.text = messages[indexPath.row].body\n        return cell\n        \n    }\n}\n\n注意：UITableViewDelegate的使用\n为什么用DataSource这个protocol？因为是输入数据。\n如果需要在选择数据时做相应的操作，才需要用Delegate这个protocol。\n取消用户选择效果-变灰\nstoryboard里面选中cell，将selection设置为none即可。现在用户就不可以选择每个cell了，这是聊天软件的正常行为，而不是像信息软件或者邮件软件那样。\n使用TableViewController\n非常简单，不需要delegate和protocol。\nimport UIKit\n\nclass TodoListViewController: UITableViewController {\n    \n    let itemArray = [&quot;Find Mike&quot;, &quot;Buy Eggos&quot;, &quot;Destory Demogorgon&quot;]\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n    \n    //每个分区section有多少行row\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {\n        return itemArray.count\n    }\n    \n    //用哪个cell；indexPath即对应上面的row\n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: &quot;ToDoItemCell&quot;, for: indexPath)\n        cell.textLabel?.text = itemArray[indexPath.row]\n        return cell   \n    }\n}\n\nswift如何给cell右边加勾选符号？\nstoryboard中选中cell - 属性界面 - Accessory - Checkmark\n\nswift 如何添加+按钮？\n添加bar Button，将System Item属性改为Add。\n\n"},{"title":"swift异步任务",
"url":"/blog/swift-async/",
"date":"2024-11-26",
"headings":[{"level":1,"id":"ge-xmiao-hong-fa","permalink":"https://linxz.online/blog/swift-async/#ge-xmiao-hong-fa","title":"隔x秒触发","children":[]}],
"body":"必须包裹在DispatchQueue.main.async里面。\n必须在开头添加self.\nDispatchQueue.main.async{\n    self.cityLabel.text = weather.cityName\n    self.temperatureLabel.text = weather.temperaturestring\n    self.conditionImageView.image = UIImage(named: weather.conditionName)\n}\n\n隔x秒触发\nasyncAfter(.now()+2) 指隔2秒触发。\nDispatchQueue.main.asyncAfter(deadline: .now() + 2) {\n    myText = &quot;This is the new text!&quot;\n    }\n\n"},{"title":"swift如何让导航的页面出现back按钮",
"url":"/blog/swift-back/",
"date":"2024-11-26",
"headings":[],
"body":"示意：\n\n必须是show(push)模式，而不是present modal模式。\n操作：\n在主页面操作-editor-embed in-navigate controller\n\n"},{"title":"swift第三方库/包管理器cocoapods",
"url":"/blog/swift-cocoapods/",
"date":"2024-11-26",
"headings":[{"level":1,"id":"an-zhuang-cocoapods","permalink":"https://linxz.online/blog/swift-cocoapods/#an-zhuang-cocoapods","title":"安装cocoapods","children":[{"level":2,"id":"ru-guo-xian-shi-rubyde-ban-ben-tai-jiu-bi-ru-2-x-xban-ben-xu-yao-sheng-ji","permalink":"https://linxz.online/blog/swift-cocoapods/#ru-guo-xian-shi-rubyde-ban-ben-tai-jiu-bi-ru-2-x-xban-ben-xu-yao-sheng-ji","title":"如果显示ruby的版本太久，比如2.x.x版本，需要升级：","children":[]},{"level":2,"id":"ke-xuan-guo-nei-an-zhuang-su-du-man-ke-yi-huan-cheng-guo-nei-yuan","permalink":"https://linxz.online/blog/swift-cocoapods/#ke-xuan-guo-nei-an-zhuang-su-du-man-ke-yi-huan-cheng-guo-nei-yuan","title":"可选：国内安装速度慢，可以换成国内源：","children":[]},{"level":2,"id":"cha-kan-shi-fou-an-zhuang-cheng-gong","permalink":"https://linxz.online/blog/swift-cocoapods/#cha-kan-shi-fou-an-zhuang-cheng-gong","title":"查看是否安装成功","children":[]}]},{"level":1,"id":"shi-yong-cocoapods","permalink":"https://linxz.online/blog/swift-cocoapods/#shi-yong-cocoapods","title":"使用cocoapods","children":[{"level":2,"id":"sheng-cheng-podfile","permalink":"https://linxz.online/blog/swift-cocoapods/#sheng-cheng-podfile","title":"生成Podfile","children":[]},{"level":2,"id":"an-zhuang-bao","permalink":"https://linxz.online/blog/swift-cocoapods/#an-zhuang-bao","title":"安装包","children":[{"level":3,"id":"an-zhuang-xian-shi-ban-ben-bu-jian-rong","permalink":"https://linxz.online/blog/swift-cocoapods/#an-zhuang-xian-shi-ban-ben-bu-jian-rong","title":"安装显示版本不兼容","children":[]}]},{"level":2,"id":"shi-yong","permalink":"https://linxz.online/blog/swift-cocoapods/#shi-yong","title":"使用","children":[{"level":3,"id":"buildshi-bai","permalink":"https://linxz.online/blog/swift-cocoapods/#buildshi-bai","title":"build失败","children":[]}]},{"level":2,"id":"xie-zai-bao","permalink":"https://linxz.online/blog/swift-cocoapods/#xie-zai-bao","title":"卸载包","children":[]}]},{"level":1,"id":"qi-ta-bao-guan-li-qi-xuan-ze","permalink":"https://linxz.online/blog/swift-cocoapods/#qi-ta-bao-guan-li-qi-xuan-ze","title":"其他包管理器选择","children":[{"level":2,"id":"swift-package-manager","permalink":"https://linxz.online/blog/swift-cocoapods/#swift-package-manager","title":"Swift Package Manager","children":[]},{"level":2,"id":"carthage","permalink":"https://linxz.online/blog/swift-cocoapods/#carthage","title":"Carthage","children":[]}]}],
"body":"cocoapods\n安装cocoapods\n加上-V，指verbose，可以看到安装过程，不然会看到屏幕突然停住。\nsudo gem stall cocoapods -V\n\npod setup --verbose\n\n如果因为网络原因，可以引入代理：\nexport http_proxy=http://127.0.0.1:1087\nexport https_proxy=http://127.0.0.1:1087\n\n如果想保持代理长期有效，可以考虑放到~/.zshrc里面。\n如果显示ruby的版本太久，比如2.x.x版本，需要升级：\n安装rvm\ncurl -sSL https://get.rvm.io | bash -s stable\n\n重新加载 RVM\nsource ~/.rvm/scripts/rvm\n\n安装ruby新版本\nrvm install 3.2.2 --with-openssl-dir=$(brew --prefix openssl@3)\n\n验证ruby版本\nruby -v\n\n重新安装cocoapods\nsudo gem install cocoapods -V\n\n可选：国内安装速度慢，可以换成国内源：\n这个是网上找的方法，我实践下来不如代理好用。也装不了。\n# 先删除默认源\ngem sources --remove https://rubygems.org/\n\n# 添加国内镜像源\ngem sources --add https://gems.ruby-china.com/\n\n# 安装 CocoaPods\nsudo gem install cocoapods\n\n解决方案\n查看是否安装成功\npod --version\n\n使用cocoapods\n生成Podfile\npod init\n\n我们要安装CLTypingLabel这个包。\n找到Podfile，右键用xcode来打开\nplatform :ios, &#39;9.0&#39;\n\ntarget &#39;Flash Chat iOS13&#39; do\n  use_frameworks!\n\n  # Pods for Flash Chat iOS13\n  \n  pod &#39;CLTypingLabel&#39;\n\nend\n\n安装包\npod install\n\n安装显示版本不兼容\n需要到项目配置页，修改项目配置到Xcode 16.0。\n参考教程\n\n使用\n打开.xcworkspace文件，白色的（非原来蓝色的）文件。之后的项目在这里操作。\n\nbuild失败\n如果提示sandbox问题，可以在target - build setting里面-查找enable_user，将yes改为no即可。\nstackoverflow\n\n卸载包\n\n把配置改回正常，比如把CLTyping类别改回UILabel类别\nPodfile删除该包\n重新pod install即可\n\n其他包管理器选择\nSwift Package Manager\n如何看出是否可以用SPM？如果项目有Package.swift，就可以用\n\n引入：\nFile - Add Package dependency\n\nCarthage\n"},{"title":"swift extension介绍",
"url":"/blog/swift-extention/",
"date":"2024-11-26",
"headings":[{"level":2,"id":"extend-the-protocol","permalink":"https://linxz.online/blog/swift-extention/#extend-the-protocol","title":"extend the protocol","children":[]}],
"body":"用法：extend现有的type\n格式\nextension someType{\n  //Add new functionality\n}\n\n示例：实现四舍五入指定位数\nextension Double{\n    func round(to places: Int)-&gt;Double{\n        let preciseNumber = pow(10, Double(places))\n        var n = self\n        n = n * preciseNumber\n        n.round()\n        n = n / preciseNumber\n        return n\n    }\n}\n\nvar myDouble = 3.14159\n\nmyDouble.round(to: 3)\n\n示例：扩展UIButton，画出圆形按钮\nextension UIButton{\n    func makeCircular(){\n        self.clipsToBounds = true\n        self.layer.cornerRadius = self.frame.size.width / 2\n    }\n}\n\nlet button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))\nbutton.backgroundColor = .red\n\nbutton.makeCircular()\n\nextend the protocol\nentension SomeProtocol{\n  //Define default behaviour\n}\n\n"},{"title":"swift使用内置的icon",
"url":"/blog/swift-icon/",
"date":"2024-11-26",
"headings":[],
"body":"UIImage(systemName: xxx)\nself.conditionImageView.image = UIImage(systemName: weather.conditionName)\n\n"},{"title":"swift访问用户位置地址",
"url":"/blog/swift-location/",
"date":"2024-11-26",
"headings":[{"level":2,"id":"tian-jia-info-plistde-xin-xi","permalink":"https://linxz.online/blog/swift-location/#tian-jia-info-plistde-xin-xi","title":"添加Info.plist的信息","children":[]},{"level":2,"id":"xu-yao-zai-mo-ni-qi-she-zhi-di-zhi","permalink":"https://linxz.online/blog/swift-location/#xu-yao-zai-mo-ni-qi-she-zhi-di-zhi","title":"需要在模拟器设置地址","children":[]}],
"body":"一旦用户允许了，下次不会弹出通知。如果你想再次弹出通知，可以点击设置-隐私-需要通知\nimport CoreLocation\nlet locationManager = CLLocationManager()\n\noverride func viewDidLoad() {\n       //先delegate才不会crash\n        locationManager.delegate = self\n        locationManager.requestWhenInUseAuthorization()\n        locationManager.requestLocation()\n}\n\n//MARK: - LocationManagerDelegate\nextension WeatherViewController: CLLocationManagerDelegate{\n    \n    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {\n        if let location = locations.last{\n            let lat = location.coordinate.latitude\n            let lon = location.coordinate.longitude\n            weatherManager.fetchWeather(latitude:lat, longtitude:lon)\n        }\n    }\n    \n    func locationManager(_ manager: CLLocationManager, didFailWithError error: any Error) {\n        print(&quot;error&quot;)\n    }\n}\n\n添加Info.plist的信息\n在Information Property List中，按+号；\n选中Privacy - Location When In Use Usage Description\nvalue填写为什么需要用户给予位置权限。\n\n\n需要在模拟器设置地址\ndebug-设置地址\n\n"},{"title":"swift实现打字机动画",
"url":"/blog/swift-print-effect/",
"date":"2024-11-26",
"headings":[{"level":1,"id":"fang-fa-yi-for-loopshi-xian","permalink":"https://linxz.online/blog/swift-print-effect/#fang-fa-yi-for-loopshi-xian","title":"方法一：for loop实现","children":[]},{"level":1,"id":"fang-fa-er-yin-ru-pods-cltypinglabel","permalink":"https://linxz.online/blog/swift-print-effect/#fang-fa-er-yin-ru-pods-cltypinglabel","title":"方法二： 引入pods - CLTypingLabel","children":[]}],
"body":"方法一：for loop实现\n基本思路：\nfor loop打印每个字出来，每个字出现需要间隔（设定定时器）。\n每次的间隔不同，可以用0.1 * index来实现时间间隔的不同。\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        titleLabel.text = &quot;&quot;\n        var charIndex = 0.0\n        let titleText = &quot;⚡️FlashChat&quot;\n        for letter in titleText{\n            Timer.scheduledTimer(withTimeInterval: 0.1 * charIndex, repeats: false) { (timer) in\n                self.titleLabel.text?.append(letter)\n            }\n            charIndex += 1\n        }\n\n方法二： 引入pods - CLTypingLabel\nimport CLTypingLabel\n\n@IBOutlet weak var titleLabel: CLTypingLabel!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        titleLabel.text = &quot;⚡️FlashChat&quot;\n}\n\n"},{"title":"ios-closure闭包函数介绍",
"url":"/blog/ios-closure/",
"date":"2024-11-25",
"headings":[{"level":1,"id":"yi-ge-han-shu-zuo-wei-can-shu-de-bi-bao-closure","permalink":"https://linxz.online/blog/ios-closure/#yi-ge-han-shu-zuo-wei-can-shu-de-bi-bao-closure","title":"一个函数作为参数的闭包closure","children":[]}],
"body":"closure： 匿名函数或没有名称的函数。\n用处：让代码变得简洁（但不易懂）。\n格式：\n不需要func+name，花括号{}提前，中间加入一个in即可。\n{(n1: Int, n2: Int) -&gt; Int in\n   return n1 + n2\n}\n\n\n示例代码：\nfunc calculator (n1: Int, n2: Int, operation:(Int, Int) -&gt; Int) -&gt; Int {\n    return operation(n1,n2)\n}\n\nfunc add (no1: Int, no2: Int) -&gt; Int{\n    return no1 + no2\n}\n\n\n//使用正常function\ncalculator(n1: 2, n2: 3, operation: add)\n\n//使用closure\n//calculator(n1: 2, n2: 3, operation: {(no1: Int, no2: Int) -&gt; Int in\n//    return no1 * no2\n//})\n\n\n//closure简易版\n//利用类型推断，不用输入Int\n//返回值、return可以去掉，也是自动推断\n// $0代表第一个参数，$1代表第二个参数\n// 可以省略operation:\nlet result = calculator(n1: 2, n2: 3) { $0 * $1 }\nprint(result)\n\n\n//应用\nlet array = [6,2,3,9,4,1]\n\n/*\n 要求：\n 给每个元素都+1，可以用for loop这个复杂方法，也可以用closure\n */\n\nlet addOne = array.map() {$0 + 1}\nprint(addOne)\n\n//将所有元素转换为String\n\nlet newArray = array.map {&quot;\\($0)&quot;}\nprint(newArray)\n\n\n一个函数作为参数的闭包closure\n如果只有一个参数，参数还是一个function，function后面不带括号：\nalert.addTextField { (alertTextField) in\n            alertTextField.placeholder = &quot;Create New Item&quot;\n            textField = alertTextField\n}\n\n"},{"title":"swift如何make api call?",
"url":"/blog/swift-api/",
"date":"2024-11-25",
"headings":[{"level":1,"id":"getqing-qiu-si-bu","permalink":"https://linxz.online/blog/swift-api/#getqing-qiu-si-bu","title":"GET请求四步：","children":[]},{"level":1,"id":"postqing-qiu","permalink":"https://linxz.online/blog/swift-api/#postqing-qiu","title":"POST请求","children":[]},{"level":1,"id":"getqing-qiu-huo-qu-yi-ju-ming-yan-an-li","permalink":"https://linxz.online/blog/swift-api/#getqing-qiu-huo-qu-yi-ju-ming-yan-an-li","title":"GET请求-获取一句名言案例","children":[{"level":2,"id":"chuang-jian-viewmodel","permalink":"https://linxz.online/blog/swift-api/#chuang-jian-viewmodel","title":"创建ViewModel","children":[]},{"level":2,"id":"shi-yong-viewmodel","permalink":"https://linxz.online/blog/swift-api/#shi-yong-viewmodel","title":"使用ViewModel","children":[]},{"level":2,"id":"viewmodelsi-bu-lian-jie","permalink":"https://linxz.online/blog/swift-api/#viewmodelsi-bu-lian-jie","title":"ViewModel四步连接","children":[{"level":3,"id":"chuang-jian-url","permalink":"https://linxz.online/blog/swift-api/#chuang-jian-url","title":"创建url","children":[]},{"level":3,"id":"chuang-jian-session","permalink":"https://linxz.online/blog/swift-api/#chuang-jian-session","title":"创建session","children":[]},{"level":3,"id":"chuang-jian-task","permalink":"https://linxz.online/blog/swift-api/#chuang-jian-task","title":"创建task","children":[]},{"level":3,"id":"kai-shi-task","permalink":"https://linxz.online/blog/swift-api/#kai-shi-task","title":"开始task","children":[]},{"level":3,"id":"wan-zheng-dai-ma-can-kao","permalink":"https://linxz.online/blog/swift-api/#wan-zheng-dai-ma-can-kao","title":"完整代码参考","children":[]}]}]},{"level":1,"id":"postan-li-jsonupload","permalink":"https://linxz.online/blog/swift-api/#postan-li-jsonupload","title":"POST案例-JSONUpload","children":[{"level":2,"id":"uploadviewdai-ma-shi-li","permalink":"https://linxz.online/blog/swift-api/#uploadviewdai-ma-shi-li","title":"uploadView代码示例","children":[]},{"level":2,"id":"contentviewdai-ma","permalink":"https://linxz.online/blog/swift-api/#contentviewdai-ma","title":"ContentView代码","children":[]}]},{"level":1,"id":"qi-ta-an-li-dai-ma","permalink":"https://linxz.online/blog/swift-api/#qi-ta-an-li-dai-ma","title":"其他案例代码：","children":[]}],
"body":"GET请求四步：\nurl - session - task - task.resume()\n\nPOST请求\n第一项url内容要求更多：url+method+header+content，其他一致。\nGET请求-获取一句名言案例\n创建ViewModel\n需要是一个class, 而且遵循ObservableObject的protocol，方便在视图间调用。\n把response变量用@Published暴露出来。\nclass ViewModel: ObservableObject {\n    @Published var responseText = &quot;&quot;\n}\n\n使用ViewModel\n@StateObject var viewModel = ViewModel()\n\n```swift\nButton {\n    viewModel.fetchData()\n} label: {\n    Text(&quot;获取一句名言&quot;)\n}\n\nViewModel四步连接\n创建url\nguard let url = URL(string: &quot;https://api.apiopen.top/api/sentences&quot;) else { return }\n\n创建session\nlet session = URLSession(configuration: .default)\n\n创建task\nlet task = session.dataTask(with: url) { data, response, error in\n            // 错误处理\n            guard error == nil else {\n                print(&quot;Error: \\(error!.localizedDescription)&quot;)\n                return\n            }\n            \n            // 检查响应状态\n            guard let httpResponse = response as? HTTPURLResponse,\n                  httpResponse.statusCode == 200 else {\n                print(&quot;Invalid response&quot;)\n                return\n            }\n            \n            guard let data = data else {\n                print(&quot;No data received&quot;)\n                return\n            }\n            \n            // 解析 JSON 数据\n            guard let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],\n                  let result = json[&quot;result&quot;] as? [String: Any],\n                  let content = result[&quot;name&quot;] as? String else {\n                print(&quot;JSON Parsing Error or unexpected structure&quot;)\n                return\n            }\n            \n            //测试返回值\n            print(json)\n            \n            DispatchQueue.main.async {\n                self.responseText = content  // 更新界面上的文字内容\n            }\n        }\n\n开始task\n因为task创造时属于挂起状态，所以启用时有恢复的意思，这符合操作系统的用词习惯，因此这里用的是resume。\ntask.resume()\n\n完整代码参考\nimport SwiftUI\n\nclass ViewModel: ObservableObject {\n    @Published var responseText = &quot;&quot;\n    \n    //MARK: - GET请求\n    func fetchData(){\n        //创建url\n        guard let url = URL(string: &quot;https://api.apiopen.top/api/sentences&quot;) else { return }\n        \n        //创建session\n        let session = URLSession(configuration: .default)\n        \n        //创建task\n        let task = session.dataTask(with: url) { data, response, error in\n            // 错误处理\n            guard error == nil else {\n                print(&quot;Error: \\(error!.localizedDescription)&quot;)\n                return\n            }\n            \n            // 检查响应状态\n            guard let httpResponse = response as? HTTPURLResponse,\n                  httpResponse.statusCode == 200 else {\n                print(&quot;Invalid response&quot;)\n                return\n            }\n            \n            guard let data = data else {\n                print(&quot;No data received&quot;)\n                return\n            }\n            \n            // 解析 JSON 数据\n            guard let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],\n                  let result = json[&quot;result&quot;] as? [String: Any],\n                  let content = result[&quot;name&quot;] as? String else {\n                print(&quot;JSON Parsing Error or unexpected structure&quot;)\n                return\n            }\n            \n            //测试返回值\n            print(json)\n            \n            DispatchQueue.main.async {\n                self.responseText = content  // 更新界面上的文字内容\n            }\n        }\n        \n        task.resume()\n    }\n}\n\n参考项目-LoveTalkApi\nPOST案例-JSONUpload\n//MARK: - POST请求\n    func postData(title:String, content:String) {\n            //创建url\n            guard let url = URL(string: &quot;https://jsonplaceholder.typicode.com/posts&quot;) else { return }\n            \n            //创建请求\n            //1.url\n            var request = URLRequest(url: url)\n            //2.method\n            request.httpMethod = &quot;POST&quot;\n            //3.header\n            request.setValue(&quot;application/json&quot;, forHTTPHeaderField: &quot;Content-Type&quot;)\n            \n            //4.content(data)\n            let postData: [String: Any] = [\n                &quot;title&quot;: title,\n                &quot;content&quot;: content,\n                &quot;userId&quot;: 1\n            ]\n            \n            //将数据转换为JSON格式\n            guard let jsonData = try? JSONSerialization.data(withJSONObject: postData) else {\n                print(&quot;Failed to convert data to JSON&quot;)\n                return\n            }\n            \n            request.httpBody = jsonData\n            \n            //创建session\n            let session = URLSession(configuration: .default)\n            \n            //创建task\n            let task = session.dataTask(with: request) { data, response, error in\n                // 错误处理\n                guard error == nil else {\n                    print(&quot;Error: \\(error!.localizedDescription)&quot;)\n                    return\n                }\n                \n                // 检查响应状态\n                guard let httpResponse = response as? HTTPURLResponse,\n                      httpResponse.statusCode == 201 else {  // POST成功通常返回201\n                    print(&quot;Invalid response&quot;)\n                    return\n                }\n                \n                guard let data = data else {\n                    print(&quot;No data received&quot;)\n                    return\n                }\n                \n                // 解析返回的 JSON 数据\n                guard let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],\n                      let title = json[&quot;title&quot;] as? String else {\n                    print(&quot;JSON Parsing Error or unexpected structure&quot;)\n                    return\n                }\n                \n                //测试返回值\n                print(json)\n                \n                DispatchQueue.main.async {\n                    self.responseText = &quot;发布成功：\\(title)&quot;  // 更新界面上的文字内容\n                }\n            }\n            \n            task.resume()\n        }\n\nuploadView代码示例\n关键设置@ObservableObject观察viewModel的值\nimport SwiftUI\n\nstruct UploadView: View {\n    \n    @Environment(\\.dismiss) var dismiss\n    @ObservedObject var viewModel: ViewModel\n    \n    @State private var title = &quot;&quot; // 标题输入\n    @State private var content = &quot;&quot; // 内容输入\n    \n    var body: some View {\n        \n        Form {\n            Section(header: Text(&quot;输入数据&quot;)) {\n                TextField(&quot;标题&quot;, text: $title)\n                TextEditor(text: $content)\n                    .frame(height: 100)\n            }\n        }\n        .navigationTitle(&quot;数据上传&quot;)\n        .navigationBarItems(\n            trailing: Button(&quot;提交&quot;) {\n                viewModel.postData(title: title, content: content)\n                dismiss()\n                // 清空输入\n                title = &quot;&quot;\n                content = &quot;&quot;\n            }\n        )\n    }\n}\n\n\n#Preview {\n    UploadView(viewModel: ViewModel())\n}\n\nContentView代码\nimport SwiftUI\n\nstruct ContentView: View {\n    \n    @StateObject var viewModel = ViewModel()\n    \n    var body: some View {\n        NavigationView {\n            VStack {\n                \n                Text(viewModel.responseText)\n                    .font(.largeTitle)\n                \n                Button {\n                    viewModel.fetchData()\n                } label: {\n                    Text(&quot;获取一句名言&quot;)\n                        .font(.headline)\n                        .padding()\n                        .padding(.horizontal)\n                        .background(.blue)\n                        .foregroundStyle(.white)\n                        .cornerRadius(10)\n                }\n                \n                NavigationLink {\n                    UploadView(viewModel: viewModel)\n                } label: {\n                    Text(&quot;上传数据&quot;)\n                        .font(.headline)\n                        .padding()\n                        .padding(.horizontal)\n                        .background(.green)\n                        .foregroundStyle(.white)\n                        .cornerRadius(10)\n                }\n                \n            }\n            .padding()\n        }\n    }\n}\n\n#Preview {\n    ContentView()\n}\n\n其他案例代码：\nimport Foundation\n\nstruct WeatherManager {\n    let weatherURL =\n    &quot;https://api.openweathermap.org/data/2.5/weather?appid={your-api-key}&amp;&amp;units=metric&amp;lang=zh_cn&quot;\n    \n    func fetchWeather(cityName: String){\n        let urlString = &quot;\\(weatherURL)&amp;q=\\(cityName)&quot;\n        performRequest(urlString: urlString)\n    }\n    \n    func performRequest(urlString: String){\n        //1.Create a url\n        if let url = URL(string: urlString){\n            //2.Create a URLSession\n            let session = URLSession(configuration: .default)\n            \n            //3.Give the session a task\n            let task = session.dataTask(with: url, completionHandler: handle(data:response:error:))\n            \n            //4.Start the task\n            task.resume()\n        }\n    }\n    \n    func handle(data: Data?, response: URLResponse?, error: Error?) -&gt; Void{\n        if error != nil{\n            print(error!)\n            return\n        }\n        \n        if let safeData = data {\n            let dataString = String(data: safeData, encoding: .utf8)\n            print(dataString!)\n        }\n        \n    }\n}\n\n\n应用闭包+json解析：\nimport Foundation\n\nstruct WeatherManager {\n    let weatherURL =\n    &quot;https://api.openweathermap.org/data/2.5/weather?appid={your-api-key}&amp;&amp;units=metric&amp;lang=zh_cn&quot;\n    \n    func fetchWeather(cityName: String){\n        let urlString = &quot;\\(weatherURL)&amp;q=\\(cityName)&quot;\n        performRequest(urlString: urlString)\n    }\n    \n    func performRequest(urlString: String){\n        //1.Create a url\n        if let url = URL(string: urlString){\n            //2.Create a URLSession\n            let session = URLSession(configuration: .default)\n            \n            //3.Give the session a task\n            let task = session.dataTask(with: url) {(data, response, error) in\n                if error != nil{\n                    print(error!)\n                    return\n                }\n                \n                if let safeData = data {\n                    self.parseJSON(weatherData: safeData) //在closure里面要加self.\n                    \n                    //测试响应\n                    //let dataString = String(data: safeData, encoding: .utf8)\n                    //print(dataString!)\n                }\n            }\n            \n            //4.Start the task\n            task.resume()\n        }\n    }\n    \n    func parseJSON (weatherData: Data){\n        let decoder = JSONDecoder()\n        do{\n            let decoderData = try decoder.decode(WeatherData.self, from: weatherData)\n            print(decoderData.main.temp)\n            print(decoderData.weather[0].description)\n        } catch{\n            print(error)\n        }\n    }\n}\n\n\n在Model文件夹中定义数据结构：\nimport Foundation\n\nstruct WeatherData: Decodable {\n    let name: String\n    let main: Main\n    let weather: [Weather]\n    \n}\n\nstruct Main: Decodable{\n    let temp: Double\n}\n\nstruct Weather: Decodable{\n    let description: String\n}\n\napi返回示例：\n{\n    &quot;coord&quot;: {\n        &quot;lon&quot;: -0.1257,\n        &quot;lat&quot;: 51.5085\n    },\n    &quot;weather&quot;: [\n        {\n            &quot;id&quot;: 804,\n            &quot;main&quot;: &quot;Clouds&quot;,\n            &quot;description&quot;: &quot;阴，多云&quot;,\n            &quot;icon&quot;: &quot;04n&quot;\n        }\n    ],\n    &quot;base&quot;: &quot;stations&quot;,\n    &quot;main&quot;: {\n        &quot;temp&quot;: 10.62,\n        &quot;feels_like&quot;: 10.06,\n        &quot;temp_min&quot;: 9.39,\n        &quot;temp_max&quot;: 11.19,\n        &quot;pressure&quot;: 997,\n        &quot;humidity&quot;: 89,\n        &quot;sea_level&quot;: 997,\n        &quot;grnd_level&quot;: 993\n    },\n    &quot;visibility&quot;: 10000,\n    &quot;wind&quot;: {\n        &quot;speed&quot;: 3.6,\n        &quot;deg&quot;: 210\n    },\n    &quot;clouds&quot;: {\n        &quot;all&quot;: 100\n    },\n    &quot;dt&quot;: 1732517346,\n    &quot;sys&quot;: {\n        &quot;type&quot;: 2,\n        &quot;id&quot;: 2075535,\n        &quot;country&quot;: &quot;GB&quot;,\n        &quot;sunrise&quot;: 1732520140,\n        &quot;sunset&quot;: 1732550395\n    },\n    &quot;timezone&quot;: 0,\n    &quot;id&quot;: 2643743,\n    &quot;name&quot;: &quot;London&quot;,\n    &quot;cod&quot;: 200\n}\n\n"},{"title":"查询天气api - openweather",
"url":"/blog/weather-api/",
"date":"2024-11-25",
"headings":[],
"body":"openweathermap.org\napi网址\n文档\n刚开通，一个小时才能用。否则会返回401错误。\nstackoverflow-401\n注意：需要输入账号、密码，获取自己的api-key。\n格式：\nhttps://api.openweathermap.org/data/2.5/weather?appid={your-api-key}&amp;&amp;units=metric&amp;lang=zh_cn&amp;q=London\n\nunits=metric代表摄氏度，lang是语言，q是城市\n"},{"title":"xcode运行时出现-1错误",
"url":"/blog/xcode-error/",
"date":"2024-11-25",
"headings":[],
"body":"xcode使用MacOS的command line tool调试时出现错误：\nMessage from debugger: Error 1\nProgram ended with exit code: -1\n\n解决方案：\n修改项目设置 signing &amp; Capabilities - macOS - signin to Run Locally\n\n参考链接\n"},{"title":"关于ios的暗夜模式",
"url":"/blog/ios-darkmode/",
"date":"2024-11-24",
"headings":[{"level":1,"id":"ru-he-zi-ding-yi-dark-color","permalink":"https://linxz.online/blog/ios-darkmode/#ru-he-zi-ding-yi-dark-color","title":"如何自定义dark color？","children":[]},{"level":1,"id":"ru-he-bao-cun-se-pan-yan-se","permalink":"https://linxz.online/blog/ios-darkmode/#ru-he-bao-cun-se-pan-yan-se","title":"如何保存色盘颜色","children":[]},{"level":1,"id":"diao-shi-hei-ye-mo-shi","permalink":"https://linxz.online/blog/ios-darkmode/#diao-shi-hei-ye-mo-shi","title":"调试黑夜模式","children":[]}],
"body":"如果你使用的是system color，会自动switch到暗夜模式。\n如何自定义dark color？\nAssets右键 - New color set\n\n如何保存色盘颜色\n直接拖动到右边保存。\n\n点击最上方name可以起名。名字起完后，就可以在颜色中选取这组颜色了。\n调试黑夜模式\n在模拟器的设置里面-开发者-深色模式勾选即可。\n"},{"title":"什么是ios的delegate",
"url":"/blog/ios-delegate/",
"date":"2024-11-24",
"headings":[{"level":1,"id":"delegate-shi-shen-me","permalink":"https://linxz.online/blog/ios-delegate/#delegate-shi-shen-me","title":"delegate 是什么？","children":[{"level":2,"id":"guan-jian-dian","permalink":"https://linxz.online/blog/ios-delegate/#guan-jian-dian","title":"关键点：","children":[]}]},{"level":1,"id":"delegatede-shi-yong-fang-shi","permalink":"https://linxz.online/blog/ios-delegate/#delegatede-shi-yong-fang-shi","title":"delegate的使用方式","children":[{"level":2,"id":"zai-videdidloadli-mian-ding-yi","permalink":"https://linxz.online/blog/ios-delegate/#zai-videdidloadli-mian-ding-yi","title":"在videDidLoad里面定义","children":[]},{"level":2,"id":"zhi-jie-zai-storyboardli-mian-lian-jie","permalink":"https://linxz.online/blog/ios-delegate/#zhi-jie-zai-storyboardli-mian-lian-jie","title":"直接在storyboard里面连接","children":[]}]},{"level":1,"id":"delegatede-ying-yong","permalink":"https://linxz.online/blog/ios-delegate/#delegatede-ying-yong","title":"delegate的应用","children":[{"level":2,"id":"uitextviewdui-protocolde-ying-yong","permalink":"https://linxz.online/blog/ios-delegate/#uitextviewdui-protocolde-ying-yong","title":"UITextView对protocol的应用","children":[{"level":3,"id":"delegatenei-bu-de-fang-fa-ye-ke-yi-shi-ke-xuan-de-optional","permalink":"https://linxz.online/blog/ios-delegate/#delegatenei-bu-de-fang-fa-ye-ke-yi-shi-ke-xuan-de-optional","title":"delegate内部的方法也可以是可选的Optional","children":[]}]},{"level":2,"id":"uitextfieldde-nei-bu-jie-gou","permalink":"https://linxz.online/blog/ios-delegate/#uitextfieldde-nei-bu-jie-gou","title":"UITextField的内部结构","children":[]},{"level":2,"id":"uitextfielddelegatede-ju-ti-shi-xian","permalink":"https://linxz.online/blog/ios-delegate/#uitextfielddelegatede-ju-ti-shi-xian","title":"UITextFieldDelegate的具体实现","children":[]},{"level":2,"id":"delegatede-ji-jiu-an-li","permalink":"https://linxz.online/blog/ios-delegate/#delegatede-ji-jiu-an-li","title":"delegate的急救案例","children":[]}]}],
"body":"delegate 是什么？\n通过定义协议（protocol），一个对象可以通知另一个对象某些事件的发生或者请求其执行某些操作。\n苹果预设了许多方法，比如UITextFieldDelegate，UITableViewDelegate，UICollectionViewDelegate等等，这些方法可以让我们在特定的事件发生时，执行我们自己的代码。\n比如，在UITextFieldDelegate中，有textFieldDidBeginEditing，textFieldDidEndEditing等方法，可以让我们在文本框开始编辑和结束编辑时，执行我们自己的代码。\n关键点：\n\nUITextFieldDelegate 协议定义了能做什么，即have the functions.\nWeatherViewController 实现这些方法定义了怎么做，即define the function.\ndelegate = self 告诉 UITextField 谁来做，即call the function.\n\n过程示例：\n\ndelegate的使用方式\ndelegate使用的两种方法\n在videDidLoad里面定义\nsearchBar.delegate = self\n\n直接在storyboard里面连接\n\ndelegate的应用\nUITextView对protocol的应用\nprotocol CanDealWithUITextFields{\n\tfunc textFieldDidBeginEditing()\n}\n\n这样一来，每个应用这个protocol的子类就必须拥有这些textField的生命周期function，而且必须在自己类的内部定义。\n事实上，这个protocol叫做UITextFieldDelegate。\nprotocol UITextFieldDelegate{\n\tfunc textFieldDidBeginEditing()\n}\n\ndelegate内部的方法也可以是可选的Optional\n// UITextFieldDelegate 的简化定义（实际上是 Objective-C 定义的）\n@objc protocol UITextFieldDelegate: NSObjectProtocol {\n    // 注意 @objc optional 关键字\n    @objc optional func textFieldShouldBeginEditing(_ textField: UITextField) -&gt; Bool\n    @objc optional func textFieldDidBeginEditing(_ textField: UITextField)\n    @objc optional func textFieldShouldEndEditing(_ textField: UITextField) -&gt; Bool\n    @objc optional func textFieldDidEndEditing(_ textField: UITextField)\n    // ... 还有更多方法\n}\n\nUITextField的内部结构\n这样一来，所有UITextField就可以复用这些method\nvar delegate: UITextFieldDelegate //property\ndelegate.textFieldDidBeginEditing() //method\n\nUITextFieldDelegate的具体实现\nlet textField = UITextField()\ntextField.delegate = self //即等于类自己，所以可以重新定义protocol的相关方法\nfunc textFieldDidBeginEditing(){\n\t//do something\n}\n\ndelegate的急救案例\nprotocol AdvancedLifeSupport{\n    func performCPR()\n}\n\nclass EmergencyCallHandler{\n    var delegate: AdvancedLifeSupport?\n    \n    func assessSituation(){\n        print(&quot;Can you tell me what happened?&quot;)\n    }\n    \n    func medicalEmergency(){\n        delegate?.performCPR()\n    }\n}\n\nstruct Parametic: AdvancedLifeSupport{\n    init(handler: EmergencyCallHandler){\n        handler.delegate = self\n    }\n    \n    func performCPR() {\n        print(&quot;The paramedic does chest compressions, 30 per second.&quot;)\n    }\n}\n\nclass Doctor: AdvancedLifeSupport{\n    init(handler: EmergencyCallHandler){\n        handler.delegate = self\n    }\n    \n    func performCPR() {\n        print(&quot;The doctor does chest compressions, 30 per second.&quot;)\n    }\n    \n    func useStethescope(){\n        print(&quot;Listening for heart sounds.&quot;)\n    }\n}\n\nclass Surgeon: Doctor{\n    \n    override func performCPR() {\n        super.performCPR()\n        print(&quot;Sings stying alive by the BeeGees.&quot;)\n    }\n    \n    func useElectricDrill(){\n        print(&quot;Whirr..&quot;)\n    }\n}\n\nlet emilio = EmergencyCallHandler()\n//let pete = Parametic(handler: emilio)\n\nlet angela = Surgeon(handler: emilio)\n\nemilio.assessSituation()\nemilio.medicalEmergency()\n\n"},{"title":"苹果官方的ios-icon 图标 ",
"url":"/blog/ios-icon/",
"date":"2024-11-24",
"headings":[],
"body":"SF Symbols app\n下载地址\n下载之后，图标就可以在右侧inspector菜单 - Image - System菜单内看到。\n可以在app查看好图标，再在xcode里面选择相应的名字。\n\n"},{"title":"iOS-swift的输入框",
"url":"/blog/ios-input/",
"date":"2024-11-24",
"headings":[{"level":1,"id":"text-field","permalink":"https://linxz.online/blog/ios-input/#text-field","title":"Text Field","children":[]},{"level":1,"id":"mo-ni-shi-tu-chu-xian-keyboard","permalink":"https://linxz.online/blog/ios-input/#mo-ni-shi-tu-chu-xian-keyboard","title":"模拟视图出现keyboard","children":[]},{"level":1,"id":"swiftshu-ru-kuang-textfieldde-sheng-ming-zhou-qi","permalink":"https://linxz.online/blog/ios-input/#swiftshu-ru-kuang-textfieldde-sheng-ming-zhou-qi","title":"swift输入框textField的生命周期","children":[{"level":2,"id":"shouldreturn","permalink":"https://linxz.online/blog/ios-input/#shouldreturn","title":"ShouldReturn:","children":[]},{"level":2,"id":"shouldendediting","permalink":"https://linxz.online/blog/ios-input/#shouldendediting","title":"ShouldEndEditing:","children":[]},{"level":2,"id":"didendediting","permalink":"https://linxz.online/blog/ios-input/#didendediting","title":"DidEndEditing:","children":[]},{"level":2,"id":"shi-li-dai-ma","permalink":"https://linxz.online/blog/ios-input/#shi-li-dai-ma","title":"示例代码：","children":[]}]}],
"body":"Text Field\n可以输入内容、自动大写、密码隐藏。设置Return Key\n\n模拟视图出现keyboard\ncmd + k\nswift输入框textField的生命周期\n有用的生命周期:\nShouldReturn:\n判断键盘是否敲了回车，如果是，做点事情，比如隐藏键盘。\nShouldEndEditing:\n判断用户是否结束编辑，比如看看输入框是否有内容，如果没有，则不结束编辑\nDidEndEditing:\n用户已结束编辑，做点事情，比如清空输入框。\n示例代码：\n// textfield生命周期：处理键盘回车\n    func textFieldShouldReturn(_ textField: UITextField) -&gt; Bool {\n        print(searchTextField.text!)\n        //keyboard退出\n        searchTextField.endEditing(true)\n        return true\n    }\n    \n    //textfield生命周期：验证是否应该结束编辑\n    func textFieldShouldEndEditing(_ textField: UITextField) -&gt; Bool {\n        if textField.text != &quot;&quot; {\n            return true\n        } else {\n            //如果未输入内容，不应该结束编辑，返回false\n            textField.placeholder = &quot;Type something&quot;\n            return false\n        }\n    }\n    \n    //textfield生命周期：完成编辑\n    func textFieldDidEndEditing(_ textField: UITextField) {\n        // Use searchTextFied.text to get the weather for that city.\n        //清空输入框\n        searchTextField.text = &quot;&quot;\n    }\n\n"},{"title":"swift的protocol",
"url":"/blog/ios-protocol/",
"date":"2024-11-24",
"headings":[{"level":2,"id":"uitextfielddelegateshi-yi-ge-protocol","permalink":"https://linxz.online/blog/ios-protocol/#uitextfielddelegateshi-yi-ge-protocol","title":"UITExtFieldDelegate是一个protocol","children":[]}],
"body":"swift的protocol\n协议，约定固定的功能，类似与取得某个function的证书。\n用于子类和父类function不能简单继承的情况。比如企鹅是鸟，但是不能飞。所以不能把飞这个function安装在鸟里面，需要子类自定义这个function。\n如果有这个证书，则可以用某些function，且这些function需要子类来自定义。\n\nUITExtFieldDelegate是一个protocol\nprotocol在class里面的格式：\nclass Eagle: Bird, FirstProtocol, SecondProtocol…{\n}\n\n在struct里面的格式：\nstruct Eagle: FirstProtocol, SecondProtocol…{\n}\n\n例子：\nclass WeatherViewController: UIViewController, UITextFieldDelegate {}\n\n\n"},{"title":"如何运用矢量图以不损失画面细节-ios",
"url":"/blog/ios-vector-img/",
"date":"2024-11-24",
"headings":[{"level":1,"id":"shi-yong-shi-liang-tu-bi-ru-pdfge-shi-er-bu-shi-jpghuo-zhe-pngge-shi","permalink":"https://linxz.online/blog/ios-vector-img/#shi-yong-shi-liang-tu-bi-ru-pdfge-shi-er-bu-shi-jpghuo-zhe-pngge-shi","title":"使用矢量图，比如.pdf格式，而不是.jpg或者.png格式。","children":[]},{"level":1,"id":"xuan-ze-hei-ye-mo-shi-de-tu-pian","permalink":"https://linxz.online/blog/ios-vector-img/#xuan-ze-hei-ye-mo-shi-de-tu-pian","title":"选择黑夜模式的图片","children":[]}],
"body":"使用矢量图，比如.pdf格式，而不是.jpg或者.png格式。\n选择Resizing - Preserve Vector Data\nScales - Single Scale （统一矢量尺寸）\n\n选择黑夜模式的图片\nAppearances - Any, Light, Dark\n以上步骤操作完，就可以把pdf文件删除掉了。\n"},{"title":"学习的秘密：记忆和练习",
"url":"/blog/learning-secret-memory-practice/",
"date":"2024-11-22",
"headings":[],
"body":"知识武装大脑，要怎么做呢？判断一个知识是否在大脑里，不是读过一遍，也不是印在书本，也不是在AI答复中，而是“要用的时候记得”。比如，如果考试时遇到题目记得该题，而且可以检索出来，那么知识就在你的脑中。\n这样一来，就依赖于人的记忆能力，于是乎就有各种记忆法门。比如说“记忆宫殿”的方法，将自己记忆中的所有内容都藏在大脑中的一座宫殿内，给宫殿设置多个抽屉，最好再通过一些能记忆的标签储存，更厉害者，是编织了一个个故事，辅助大脑的记忆。如果不喜欢这个法门，也可以试试种种记忆笔记或者记忆方法，比如3天、7天、21天循环记忆的法子。我又想，其实“实践”也是记忆的一环，你自己做过，印象就深了，无非加强记忆罢了。你看别人的笔记，和自己做题不是一回事儿。自己写出来的知识，总归印象更深刻些。\n记忆如此，就万事大吉了吗？不然，还有“练习”。上文说了，“实践”只不过是辅助记忆，而“练习”不是“实践”的一种吗？非也。\n“练习”正是字面意思，在你知道了某个知识后，单凭记忆无法让你确知是否能施展出来。比如说游泳，理论知识再好，记忆的知识再多，总归要游一趟，游得越多越熟练。第一，你要验证记忆的内容是否为真；第二，你要确认肌肉是否能与你记忆的方式一样，施展出来。这和“记住知识”是两个门类，两者配合才能真正实现“学习”。\n你会说，我只需要“练习”就好，何须记忆？既然已经会了，我记这些知识作甚？记忆知识不为别的，正是为了让你“持续地把动作做出来”。做得出来一次，下次未必做得出来。但是每次动作前，你的大脑都有“蓝图”，而肌肉能够控制到位，自然就能施展出来。时间一久，仅凭“肌肉记忆”就可以做出来，但这也还是记忆，只不过是肌肉帮你大脑忙了而已。\n"},{"title":"swift的optional语法",
"url":"/blog/swift-optional/",
"date":"2024-11-22",
"headings":[{"level":1,"id":"1-force-unwrapping-qiang-zhi-jie-bao","permalink":"https://linxz.online/blog/swift-optional/#1-force-unwrapping-qiang-zhi-jie-bao","title":"1. Force Unwrapping - 强制解包\t","children":[]},{"level":1,"id":"2-check-for-nil-value","permalink":"https://linxz.online/blog/swift-optional/#2-check-for-nil-value","title":"2. Check for nil value\t","children":[]},{"level":1,"id":"3-optional-binding","permalink":"https://linxz.online/blog/swift-optional/#3-optional-binding","title":"3. Optional Binding\t\t","children":[]},{"level":1,"id":"4-nil-coalescing-operator","permalink":"https://linxz.online/blog/swift-optional/#4-nil-coalescing-operator","title":"4. Nil Coalescing Operator\t","children":[]},{"level":1,"id":"5-optional-chaining","permalink":"https://linxz.online/blog/swift-optional/#5-optional-chaining","title":"5. Optional Chaining\t","children":[]}],
"body":"处理Optional的五种方式\n1. Force Unwrapping - 强制解包\t\noptional!\n\n2. Check for nil value\t\nif optional ! = nil { option!}\n\n3. Optional Binding\t\t\nif let safeOptional = optioanal{safeOptional}\n\n4. Nil Coalescing Operator\t\noptional ?? defalutValue\n\n5. Optional Chaining\t\noptional?.property / optioanl?.method\n\n示例代码：\nlet myOptional: String?\n\nmyOptional = nil\n\n// 1. Force UnWrapping - nil值会在运行中崩溃\n//let text: String = myOptional! //myOptional是nil，所以即使debug模式没错误，也会crash at runtime\n\n// 2. check for nil value - 赋值时要加感叹号\nif myOptional != nil{\n    let text: String = myOptional!\n    let text2: String = myOptional! //缺点：每一次都要加感叹号!\n} else {\n    print(&quot;myOptional was found to be nil&quot;)\n}\n\n//3. Optional Binding - 赋值时不用加感叹号\nif let safeOtional = myOptional{\n    let text: String = safeOtional\n    let text2: String = safeOtional\n    print(safeOtional)\n} else {\n    print(&quot;myOptional was found to be nil&quot;)\n}\n\n//4. Nil Coalescing Operator - 提供默认值\nlet text: String = myOptional ?? &quot;I am the default value&quot;\nprint(text)\n\n//5. Optional Chaining - 处理optional是struct或者class的情况\nstruct MyOptional2{\n    var property = 123\n    func method(){\n        print(&quot;I am the struct method.&quot;)\n    }\n}\n\nlet myoptional2: MyOptional2?\n\nmyoptional2 = MyOptional2()\n\nprint(myoptional2?.property) //如果不是nil，才往下执行\n\n"},{"title":"swift如何连接第二屏Segue",
"url":"/blog/swift-segue/",
"date":"2024-11-22",
"headings":[{"level":1,"id":"storyboard-seguetiao-zhuan-de-zhi-shi-hui-zong","permalink":"https://linxz.online/blog/swift-segue/#storyboard-seguetiao-zhuan-de-zhi-shi-hui-zong","title":"storyboard-segue跳转的知识汇总","children":[{"level":2,"id":"seguede-si-chong-tiao-zhuan-fang-shi","permalink":"https://linxz.online/blog/swift-segue/#seguede-si-chong-tiao-zhuan-fang-shi","title":"segue的四种跳转方式","children":[]},{"level":2,"id":"seguede-tiao-zhuan-dai-ma","permalink":"https://linxz.online/blog/swift-segue/#seguede-tiao-zhuan-dai-ma","title":"segue的跳转代码","children":[]},{"level":2,"id":"seguede-hui-tou-dai-ma","permalink":"https://linxz.online/blog/swift-segue/#seguede-hui-tou-dai-ma","title":"segue的回头代码","children":[]},{"level":2,"id":"segueshu-ju-tong-xin","permalink":"https://linxz.online/blog/swift-segue/#segueshu-ju-tong-xin","title":"segue数据通信","children":[]}]},{"level":1,"id":"swiftuiye-mian-qie-huan","permalink":"https://linxz.online/blog/swift-segue/#swiftuiye-mian-qie-huan","title":"swiftUI页面切换","children":[{"level":2,"id":"tong-guo-navigationlinktiao-zhuan","permalink":"https://linxz.online/blog/swift-segue/#tong-guo-navigationlinktiao-zhuan","title":"通过navigationLink跳转","children":[]},{"level":2,"id":"tong-guo-statehe-sheettiao-jian-tiao-zhuan","permalink":"https://linxz.online/blog/swift-segue/#tong-guo-statehe-sheettiao-jian-tiao-zhuan","title":"通过@state和.sheet条件跳转","children":[]}]},{"level":1,"id":"fang-fa-yi-xin-jian-cocoa-touchlei","permalink":"https://linxz.online/blog/swift-segue/#fang-fa-yi-xin-jian-cocoa-touchlei","title":"方法一：新建Cocoa touch类","children":[{"level":2,"id":"li-yong-storyboardchuang-jian-di-er-ping-de-jie-gou","permalink":"https://linxz.online/blog/swift-segue/#li-yong-storyboardchuang-jian-di-er-ping-de-jie-gou","title":"利用storyboard创建第二屏的结构","children":[]},{"level":2,"id":"cocoa-touch-class","permalink":"https://linxz.online/blog/swift-segue/#cocoa-touch-class","title":"cocoa touch class","children":[{"level":3,"id":"she-zhi-identitylian-jie","permalink":"https://linxz.online/blog/swift-segue/#she-zhi-identitylian-jie","title":"设置identity连接","children":[]},{"level":3,"id":"cao-zuo-dai-ma","permalink":"https://linxz.online/blog/swift-segue/#cao-zuo-dai-ma","title":"操作代码","children":[]}]},{"level":2,"id":"lian-jie-tu-xing","permalink":"https://linxz.online/blog/swift-segue/#lian-jie-tu-xing","title":"连接图形","children":[]},{"level":2,"id":"geng-gai-ming-zi-identifier","permalink":"https://linxz.online/blog/swift-segue/#geng-gai-ming-zi-identifier","title":"更改名字Identifier","children":[]},{"level":2,"id":"zai-uiviewcontrollerlian-jie","permalink":"https://linxz.online/blog/swift-segue/#zai-uiviewcontrollerlian-jie","title":"在UIViewController连接","children":[]},{"level":2,"id":"zai-uiviewcontrollerli-mian-zhun-bei-preparefunction","permalink":"https://linxz.online/blog/swift-segue/#zai-uiviewcontrollerli-mian-zhun-bei-preparefunction","title":"在UIViewController里面准备preparefunction","children":[]},{"level":2,"id":"ru-he-tui-hou-dao-di-yi-ping","permalink":"https://linxz.online/blog/swift-segue/#ru-he-tui-hou-dao-di-yi-ping","title":"如何退后到第一屏？","children":[]},{"level":2,"id":"ru-he-kan-dao-duo-ping-mu-de-3dshi-jiao","permalink":"https://linxz.online/blog/swift-segue/#ru-he-kan-dao-duo-ping-mu-de-3dshi-jiao","title":"如何看到多屏幕的3D视角？","children":[]}]},{"level":1,"id":"fang-fa-er-tong-guo-dai-ma-chuang-jian-di-er-ping","permalink":"https://linxz.online/blog/swift-segue/#fang-fa-er-tong-guo-dai-ma-chuang-jian-di-er-ping","title":"方法二：通过代码创建第二屏","children":[]}],
"body":"storyboard-segue跳转的知识汇总\nsegue的四种跳转方式\nshow：切换至第二屏，需要和Navigation Controller配合使用，否则和present modally一样效果。\nNavigation Controller需要点中主屏幕黄点，Editor-Embed in-Navigation Controller设置。\npresent modally： 新一屏覆盖上一屏，下拉消失。\nshow detail：右侧详情设置\npresent as popover：小窗口，一般是iPad用到。\n四种方式的gif展示\nsegue的跳转代码\nperformSegue(withIdentifier: &quot;goToSecond&quot;, sender: self)\n\nsegue的回头代码\n当segue是present modally才是有效的。\nself.dismiss(animated: true)\n\nsegue数据通信\n通过prepare函数进行：\n override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        if segue.identifier == &quot;goToSecond&quot; {\n            if let secondVC = segue.destination as? SecondViewController {\n                secondVC.secondValue = &quot;Hell&quot;\n            }\n        }\n    }\n\n为什么不在performSegue中一同进行，还有多加个函数？因为performSegue是指Storyboard传递，不能直接由代码传递，因此识别不了页面切换外的代码。\nswiftUI页面切换\n通过navigationLink跳转\n优点：直观。\n缺点：必须通过NavigationView，结构不简洁。\n        NavigationView {\n            NavigationLink(destination: SecondView()) {\n                Text(&quot;跳转&quot;)\n                    .font(.largeTitle)\n            }\n        }\n\n通过@state和.sheet条件跳转\n优点：适合条件跳转。\n缺点：代码复杂。\n    @State var showSecondView = false\n    \n    var body: some View {\n        Button(&quot;跳转&quot;){\n            showSecondView = true\n        }\n        .font(.largeTitle)\n        .sheet(isPresented: $showSecondView){\n            SecondView()\n        }\n    }\n\n\n方法一：新建Cocoa touch类\n利用storyboard创建第二屏的结构\n选择ViewController插入。\n\ncocoa touch class\n比用代码创建更方便\nsubclass: UIViewController\n设置identity连接\n点击main-storyboard里面黄色按钮，输入cmd+option+4，调出inspector菜单。\n在Class里面输入之前设置的Class即可。\n\n操作代码\ncmd+ctl+option + Enter，可以出现assistant view，就可以调试代码和storyboard窗口，按住ctrl拖动元素到代码窗口了。\n连接图形\n按住ctrl，拉动第一屏的黄色方形按钮，连接第二屏。\n\n选择Present Modally\n或者选择某一个按钮，直接拉到其他屏幕上：\n\n更改名字Identifier\n选中箭头，在inspector窗口(cmd+option+5)里面修改Identifier。\n\n在UIViewController连接\nself.performSegue(withIdentifier: &quot;goToResult&quot;, sender: self)\n\n在UIViewController里面准备preparefunction\n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        if segue.identifier == &quot;goToResult&quot;{\n            let destinationVC = segue.destination as! ResultsViewController //为什么要as!?因为downcasting，即告诉它降级到子class-ResultsViewController，而不是原本的UIViewController\n            destinationVC.bimValue = &quot;0.0&quot;\n        }\n    }\n\n如何退后到第一屏？\n在第二屏设置：\n    @IBAction func recalculatePressed(_ sender: UIButton) {\n        self.dismiss(animated: true)\n    }\n\n如何看到多屏幕的3D视角？\n运行程序时，点击左下角的多屏幕图标。\n\n方法二：通过代码创建第二屏\n创建SecondViewController的class\nimport UIKit\n\nclass SecondViewController: UIViewController {\n    \n    var bmiValue = &quot;0.0&quot;\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        view.backgroundColor = .red //等于UIColor.red，前面可省略\n        \n        let label = UILabel()\n        label.text = bmiValue\n        label.frame = CGRect(x: 0, y: 0, width: 100, height: 50)\n        view.addSubview(label)\n    }\n}\n\n在UIViewController里面使用\nlet secondVC = SecondViewController()\n        \n        secondVC.bmiValue = String(format:&quot;%.1f&quot;,bmi)\n\n"},{"title":"「分享到微信朋友圈」链接正常显示的方法",
"url":"/blog/wechat-share/",
"date":"2024-11-22",
"headings":[],
"body":"利用safari先发送到文件传输助手，再分享到朋友圈。\n参考网站\n需要加三个meta信息\n参考网站\n"},{"title":"xcode自定义颜色的方法",
"url":"/blog/xcode-color/",
"date":"2024-11-22",
"headings":[{"level":1,"id":"colorliteral","permalink":"https://linxz.online/blog/xcode-color/#colorliteral","title":"colorLiteral","children":[]},{"level":1,"id":"uicolor-red-uicolor","permalink":"https://linxz.online/blog/xcode-color/#uicolor-red-uicolor","title":"UIcolor.red / UIcolor()","children":[]}],
"body":"colorLiteral\n这种写法最方便，可以调出xcode的调色盘，自己选颜色，不用输入RGB数值。\nlet color = #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1)\n\nUIcolor.red / UIcolor()\n另外两种写法：\n// 视图背景色\nview.backgroundColor = .red  // 使用系统预设颜色，省略.前面的UIColor\nview.backgroundColor = UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0) // RGB值设置\n\n\n"},{"title":"BMI计算公式",
"url":"/blog/bmi/",
"date":"2024-11-21",
"headings":[{"level":2,"id":"bmiqu-jian","permalink":"https://linxz.online/blog/bmi/#bmiqu-jian","title":"BMI区间","children":[]}],
"body":"BMI即体脂计算，用体重和身高一同计算的指标。\n以下是计算公式\n$$ \nBMI = \\frac{Weight(kg)}{Height(m)^2}\n$$\nBMI区间\n\n"},{"title":"数学符号运算顺序-BODMAS",
"url":"/blog/bodmas/",
"date":"2024-11-21",
"headings":[],
"body":"\n"},{"title":"Jave位运算符",
"url":"/blog/java-bit-operation/",
"date":"2024-11-21",
"headings":[{"level":2,"id":"zen-me-qu-fen-he-shi-wei-yun-suan-fu-huan-shi-luo-ji-yun-suan-fu","permalink":"https://linxz.online/blog/java-bit-operation/#zen-me-qu-fen-he-shi-wei-yun-suan-fu-huan-shi-luo-ji-yun-suan-fu","title":"怎么区分&和|是位运算符，还是逻辑运算符？","children":[]}],
"body":"怎么区分&amp;和|是位运算符，还是逻辑运算符？\n答：看左右两边的数。\n数字，位运算符；布尔值，逻辑运算符。\n\n/*\n位运算符\n\n1. &lt;&lt; &gt;&gt; &gt;&gt;&gt; &amp; | ^ ~\n\n2.说明：\n\n① &lt;&lt; &gt;&gt; &gt;&gt;&gt; &amp; | ^ ~：针对数值类型的变量或常量进行运算，运算的结果也是数值；\n②\n&lt;&lt; ：左移符号。在一定范围内，每向左移动一位，结果就在原有的基础上*2。对于正数负数都适用。\n&gt;&gt; ：右移符号。在一定范围内，每向右移动一位，结果就在原有的基础上/2。对于正数负数都适用。注意：不能整除，向下取整。\n\n3.面试题：用计算机觉得高效的方式计算2*8？低效方式8+8，或2+2+2+2+2+2+2+2\n高效：2 &lt;&lt; 3 或 8 &lt;&lt; 1\n*/\n\npublic class BitTest {\n    public static void main(String[] args) {\n        int num1 = 7;\n        System.out.println(&quot;num1 &lt;&lt; 1 : &quot; + (num1 &lt;&lt; 1)); //14(7*2)\n        System.out.println(&quot;num1 &lt;&lt; 2 : &quot; + (num1 &lt;&lt; 2)); //28(7*2*2)\n        System.out.println(&quot;num1 &lt;&lt; 3 : &quot; + (num1 &lt;&lt; 3)); //56(7*2*2*2)\n        System.out.println(&quot;num1 &lt;&lt; 28 : &quot; + (num1 &lt;&lt; 28));\n        System.out.println(&quot;num1 &lt;&lt; 29 : &quot; + (num1 &lt;&lt; 29)); //过犹不及\n\n\n        int num2 = -7;\n        System.out.println(&quot;num2 &lt;&lt; 1 : &quot; + (num2 &lt;&lt; 1)); //-14(-7*2)\n        System.out.println(&quot;num2 &lt;&lt; 2 : &quot; + (num2 &lt;&lt; 2)); //-28(-7*2*2)\n        System.out.println(&quot;num2 &lt;&lt; 3 : &quot; + (num2 &lt;&lt; 3)); //-56(-7*2*2*2)\n    }\n}\n\n"},{"title":"如何计算n天后是周几？",
"url":"/blog/java-weekday/",
"date":"2024-11-21",
"headings":[],
"body":"主要涉及%7的计算，用java代码演示：\n//今天是周四，10天以后是周几？\n\nint weekDay = 4;\n\nweekDay += 10;\n\nweekDay %= 7;\n\nSystem.out.println(&quot;今天是周四，10天以后是周&quot; + ((weekDay == 0) ? &quot;日&quot; : weekDay));\n\n"},{"title":"App设计模式-MVC",
"url":"/blog/mvc/",
"date":"2024-11-21",
"headings":[{"level":2,"id":"model-data-logic","permalink":"https://linxz.online/blog/mvc/#model-data-logic","title":"Model: Data & Logic","children":[]},{"level":2,"id":"view-user-interface","permalink":"https://linxz.online/blog/mvc/#view-user-interface","title":"View: User Interface","children":[]},{"level":2,"id":"controller-mediator","permalink":"https://linxz.online/blog/mvc/#controller-mediator","title":"Controller: Mediator","children":[]},{"level":1,"id":"wei-shen-me-swiftuimei-you-controller","permalink":"https://linxz.online/blog/mvc/#wei-shen-me-swiftuimei-you-controller","title":"为什么swiftui没有controller？","children":[]}],
"body":"App有很多种设计模式，MVC是其中的一种。\nmodel - view - controller\n\nModel: Data &amp; Logic\n数据定义和函数\nView: User Interface\nUI元素\nController: Mediator\n也可以成为Conductor，即指挥者\n控制什么时候UI界面要更新。\n\nView和Model不会互相通信，总是通过Controller通信。\n为什么swiftui没有controller？\n因为用了很多属性包装器，比如@State, @ObservedObject等来管控UI状态。\n"},{"title":"swift的类class",
"url":"/blog/swift-class/",
"date":"2024-11-21",
"headings":[{"level":2,"id":"ding-yi-lei","permalink":"https://linxz.online/blog/swift-class/#ding-yi-lei","title":"定义类","children":[]},{"level":2,"id":"ji-cheng-lei","permalink":"https://linxz.online/blog/swift-class/#ji-cheng-lei","title":"继承类","children":[]},{"level":2,"id":"shi-yong-lei","permalink":"https://linxz.online/blog/swift-class/#shi-yong-lei","title":"使用类","children":[]},{"level":2,"id":"ping-guo-de-ui-class","permalink":"https://linxz.online/blog/swift-class/#ping-guo-de-ui-class","title":"苹果的UI class","children":[]},{"level":2,"id":"swiftde-structhe-classde-qu-bie","permalink":"https://linxz.online/blog/swift-class/#swiftde-structhe-classde-qu-bie","title":"swift的struct和class的区别","children":[]}],
"body":"定义类\nclass Enemy{\n    var health = 100\n    var attackStrength = 10\n    \n    func move(){\n        print(&quot;Walk forward&quot;)\n    }\n    \n    func attack(){\n        print(&quot;Land a hit, does \\(attackStrength) damage.&quot;)\n    }\n}\n\n继承类\nclass Dragon: Enemy {\n    var wingSpan = 2\n    \n    func talk(speech: String){\n        print(&quot;Says: \\(speech)&quot;)\n    }\n    \n    override func move() {\n        print(&quot;Fly forward&quot;)\n    }\n    \n    override func attack() {\n        super.attack()\n        print(&quot;Spits fire, does 10 damage&quot;)\n    }\n}\n\n使用类\nlet skeleton = Enemy()\nprint(skeleton.health)\nskeleton.move()\nskeleton.attack()\n\nlet dragon = Dragon()\ndragon.wingSpan = 5\ndragon.attackStrength = 15\ndragon.talk(speech: &quot;My teeth are swords! My claws are spears! My wings are a hurricane&quot;)\ndragon.move()\ndragon.attack()\n\n苹果的UI class\n\nswift的struct和class的区别\n\nstruct不能继承，class可以。\nclass需要init()，即self.health=health，struct不需要init()。\nstruct修改property时，需要mutating func，而class不用。\nclass是浅拷贝，s2=s1会对应同一个对象；stuct是深拷贝，不会互相影响。\n\n因为安全拷贝的原因，苹果推荐优先使用Struct，可以参考Choosing Between Structures and Classes\n"},{"title":"swift里面的private是什么意思？",
"url":"/blog/swift-private/",
"date":"2024-11-21",
"headings":[{"level":2,"id":"dai-private","permalink":"https://linxz.online/blog/swift-private/#dai-private","title":"带private","children":[]},{"level":2,"id":"bu-dai-private-ke-yi-zai-classwai-bu-fang-wen-bu-an-quan","permalink":"https://linxz.online/blog/swift-private/#bu-dai-private-ke-yi-zai-classwai-bu-fang-wen-bu-an-quan","title":"不带private：可以在class外部访问，不安全","children":[]}],
"body":"只能在class内部访问，而不能在外部访问。\n带private\nclass MyClass {\n    private let filenameTextField: UITextField = UITextField()\n    \n    func configureTextField() {\n        filenameTextField.placeholder = &quot;Enter filename&quot;\n    }\n}\n\n不带private：可以在class外部访问，不安全\nclass MyClass {\n    let filenameTextField: UITextField = UITextField()\n}\n\nlet myClass = MyClass()\nmyClass.filenameTextField.text = &quot;Some text&quot; // 外部可以直接访问和修改\n\n"},{"title":"swift如何设置进度条progressBar",
"url":"/blog/swift-progressbar/",
"date":"2024-11-21",
"headings":[],
"body":"利用progress属性。它的数据类型是Float\n记住，要把分母和分子都设成Float类型，计算结果才对。不然会先计算成Int类型，再取Float值，造成结果错误。\nprogressBar.progress = Float(questionNumber) / Float(quiz.count)\n\n"},{"title":"什么是苹果的UIKit?",
"url":"/blog/swift-uikit/",
"date":"2024-11-21",
"headings":[],
"body":"苹果提供的UI接口，通过它可以访问UIViewController, UIButton, UILabel等元素。\nimport UIKit\n\nclass SecondViewController: UIViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let label = UILabel()\n    }\n}\n\n"},{"title":"如何在xcode中查看苹果帮助文档？",
"url":"/blog/xcode-help/",
"date":"2024-11-21",
"headings":[],
"body":"顶部菜单Help - Developer Documentation\n\n"},{"title":"swift如何自定义数据类型Struct",
"url":"/blog/swift-struct/",
"date":"2024-11-20",
"headings":[{"level":2,"id":"cheng-zhen-structshi-li","permalink":"https://linxz.online/blog/swift-struct/#cheng-zhen-structshi-li","title":"城镇struct示例：","children":[]},{"level":2,"id":"initialization","permalink":"https://linxz.online/blog/swift-struct/#initialization","title":"initialization","children":[]},{"level":2,"id":"mutating-func","permalink":"https://linxz.online/blog/swift-struct/#mutating-func","title":"mutating func","children":[]},{"level":2,"id":"ioszai-structnei-dui-bian-liang-jin-xing-ji-suan-compute","permalink":"https://linxz.online/blog/swift-struct/#ioszai-structnei-dui-bian-liang-jin-xing-ji-suan-compute","title":"ios在struct内对变量进行计算compute","children":[]}],
"body":"城镇struct示例：\nstruct Town{\n    let name = &quot;Linland&quot;\n    var citizens = [&quot;Lin&quot;,&quot;Jack&quot;]\n    var resources = [&quot;Grain&quot;: 100, &quot;Ore&quot;:42, &quot;Wool&quot;:72]\n    \n    func fortify(){\n        print(&quot;Defences increased!&quot;)\n    }\n}\n\nvar myTown = Town()\n\nprint(myTown.citizens)\nprint(&quot;\\(myTown.name) has \\(myTown.resources[&quot;Grain&quot;]!) bags of grain.&quot;)\n\n//增加元素\nmyTown.citizens.append(&quot;Louis&quot;)\nprint(myTown.citizens.count)\n\n//调用method\nmyTown.fortify()\n\n\ninitialization\nstruct Town{\n    let name: String\n    var citizens: [String]\n    var resources: [String: Int]\n    \n    init(name: String, citizens: [String], resources: [String : Int]) {\n        self.name = name\n        self.citizens = citizens\n        self.resources = resources\n    }\n}\n\nvar anotherTown = Town(name: &quot;Nameless Island&quot;, citizens: [&quot;Tom Hanks&quot;], resources: [&quot;Coconut&quot;: 100])\n\nprint(anotherTown.name)\n\nanotherTown.citizens.append(&quot;Wilson&quot;)\nprint(anotherTown.citizens)\n\nmutating func\nswift struct内部不可更改属性property，哪怕是用var定义的。\n比如：\nstruct QuizBrain{\nvar questionNumber = 0\nquestionNumber = 1 //这一行会报错\n}\n\n如果一定要更改，可以用mutating放在func的前面\nstruct QuizBrain{\n var questionNumber = 0\n mutating func changeNumber(){\n\tquestionNumber = 1 \n } \n}\n\nios在struct内对变量进行计算compute\n可以定义一个变量叫做conditionName，通过switch不同的conditionId获取不一样的值。\n\nstruct WeatherModel {\n    let conditionId: Int\n    let cityName: String\n    let temperature: Double\n    \n    var conditionName: String{\n        switch conditionId {\n        case 200...299:\n            return &quot;cloud.bolt&quot;\n        case 300...399:\n            return &quot;cloud.drizzle&quot;\n        case 500...599:\n            return &quot;cloud.rain&quot;\n        case 600...699:\n            return &quot;snowflake&quot;\n        case 700...799:\n            return &quot;cloud.fog&quot;\n        case 800:\n            return &quot;sun.max&quot;\n        case 800-804:\n            return &quot;cloud&quot;\n        default:\n            return &quot;cloud.bolt&quot;\n        }\n    }\n    \n}\n\n\n"},{"title":"xcode设置环境变量，存储TOKEN",
"url":"/blog/xcode-env-configuration/",
"date":"2024-11-20",
"headings":[{"level":1,"id":"chuang-jian-config-xcconfigwen-jian","permalink":"https://linxz.online/blog/xcode-env-configuration/#chuang-jian-config-xcconfigwen-jian","title":"创建Config.xcconfig文件","children":[]},{"level":1,"id":"chuang-jian-shi-li-wen-jian-config-xcconfig-example","permalink":"https://linxz.online/blog/xcode-env-configuration/#chuang-jian-shi-li-wen-jian-config-xcconfig-example","title":"创建示例文件Config.xcconfig.example","children":[]},{"level":1,"id":"chuang-jian-gitignorewen-jian","permalink":"https://linxz.online/blog/xcode-env-configuration/#chuang-jian-gitignorewen-jian","title":"创建.gitignore文件","children":[]},{"level":1,"id":"info-plistli-mian-tian-jia-key-valuedui","permalink":"https://linxz.online/blog/xcode-env-configuration/#info-plistli-mian-tian-jia-key-valuedui","title":"info.plist里面添加key-value对","children":[]},{"level":1,"id":"configurationsshe-zhi-debugjia-shang-huan-jing-wen-jian","permalink":"https://linxz.online/blog/xcode-env-configuration/#configurationsshe-zhi-debugjia-shang-huan-jing-wen-jian","title":"Configurations设置Debug加上环境文件：","children":[]}],
"body":"创建Config.xcconfig文件\nGITHUB_API_TOKEN = &lt;your-token&gt;\n\n创建示例文件Config.xcconfig.example\nGITHUB_API_TOKEN = your_github_token_here\n\n创建.gitignore文件\n# 实际配置有可能在项目文件下面\nZola-Mobile/Config.xcconfig\n\n# 忽略实际配置文件\nConfig.xcconfig\n\n# 但保留示例文件\n!Config.xcconfig.example\n\ninfo.plist里面添加key-value对\nkey: GITHUB_API_TOKEN\nvalue: $(GITHUB_API_TOKEN)\n\nConfigurations设置Debug加上环境文件：\n注意：你通常不想在release（正式版）里面加上环境文件，通常是用户自己输入token，因此这里选择Debug就够了。\n\n"},{"title":"Java运算符",
"url":"/blog/java-operator/",
"date":"2024-11-19",
"headings":[{"level":1,"id":"suan-shu-yun-suan-fu","permalink":"https://linxz.online/blog/java-operator/#suan-shu-yun-suan-fu","title":"算术运算符","children":[]},{"level":1,"id":"luo-ji-yun-suan-fu","permalink":"https://linxz.online/blog/java-operator/#luo-ji-yun-suan-fu","title":"逻辑运算符","children":[]},{"level":1,"id":"fu-zhi-yun-suan-fu","permalink":"https://linxz.online/blog/java-operator/#fu-zhi-yun-suan-fu","title":"赋值运算符","children":[]}],
"body":"算术运算符\na++：先运算（或赋值），后自增1\n++a：先自增1，后运算（或赋值）\n逻辑运算符\n&amp;: 逻辑与，且的关系\n&amp;&amp;: 短路与\n|：逻辑或\n||：短路或\n!: 非\n^：异或，追求的是异；即a和b真假不一样时为true，如果一样时则为false\n关系：\n\n/*\n逻辑运算符\n\n1. &amp; &amp;&amp; | || ! ^\n\n2.说明\n① 逻辑运算符针对的都是boolean类型的变量进行操作\n② 逻辑运算符运算的结果也是boolean类型。\n③ 逻辑运算符常用于条件判断、循环结构中\n\n*/\n\npublic class LogicTest {\n    public static void main(String[] args) {\n        /*\n        区分 &amp; 和 &amp;&amp;\n\n        1、相同点：两个符号表达的都是“且”的关系，只有当符号两边类型均为true时，结果才为true\n\n        2、执行过程：\n            1）如果符号左边是true，则&amp;、&amp;&amp;都会执行符号右边的操作；\n            2）如果符号左边是false，则 &amp; 会继续执行符号右边的操作，而\n                                   &amp;&amp; 不会执行符号右边的操作\n        3、开发中，我们推荐使用&amp;&amp;\n        */\n\n        // &amp;与\n        boolean b1 = true;\n        b1 = false;\n        int num1 = 10;\n\n        if(b1 &amp; (num1++ &gt; 0)){\n            System.out.println(&quot;床前明月光&quot;);\n        }else{\n            System.out.println(&quot;我叫郭德纲&quot;);\n        }\n\n        System.out.println(&quot;num1 = &quot; + num1);\n\n        // &amp;&amp; 短路与\n        boolean b2 = true;\n        b2 = false;\n        int num2 = 10;\n        //当b2为false时，后面的运算不会执行\n        if(b2 &amp;&amp; (num2++ &gt; 0)){\n            System.out.println(&quot;床前明月光&quot;);\n        }else{\n            System.out.println(&quot;我叫郭德纲&quot;);\n        }\n\n        System.out.println(&quot;num2 = &quot; + num2);\n\n        //**************************************\n        /*\n        区分 | 和 ||\n\n        1、相同点：两个符号表达的都是“或”的关系，只要符号两边类型存在true时，结果就为true\n\n        2、执行过程：\n            1）如果符号左边是false，则|、||都会执行符号右边的操作；\n            2）如果符号左边是true，则 | 会继续执行符号右边的操作，而\n                                   || 不会执行符号右边的操作\n        3、开发中，我们推荐使用||\n        */\n    }\n}\n\n赋值运算符\nJava赋值运算符\n\n```java\n/*\n赋值运算符：\n1. = += -= *= /= %=\n\n2.说明：\n① 当两侧数据类型不一致，可以使用`自动类型转换`或者`强制类型转换`。\n② 支持连续赋值\n③ += -= *= /= %=操作，不会改变变量本身的数据类型。\n*/\n\npublic class SetValueTest {\n    public static void main(String[] args) {\n        int i = 5;\n        long l = 10; //自动类型提升 int -&gt; long\n        byte b = (byte)i; //强制类型转换 int -&gt; byte\n\n        //连续赋值\n        int a2,b2;\n        a2 = b2 = 10;\n        System.out.println(&quot;a2 = &quot; + a2 + &quot;, b2 = &quot; + b2);\n\n        int a3=10, b3=20;\n        System.out.println(&quot;a3 = &quot; + a3 + &quot;, b3 = &quot; + b3);\n\n        //+=使用\n        int m1 = 10;\n        m1 += 5; //类似m1 = m1 + 5\n        System.out.println(&quot;m1 = &quot; + m1);\n\n        byte by = 10;\n        by += 5; //by=by+5编译报错，应为`by=byte(by+5)`才能成功；而by+=5成功\n        System.out.println(&quot;by = &quot; + by);\n    }\n}\n\n\n\n"},{"title":"Zola使用数学公式",
"url":"/blog/zola-math/",
"date":"2024-11-18",
"headings":[],
"body":"zola博客支持latex语法，安装katex就可以了。\n{# templates/base.html #}\n\n&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n&lt;head&gt;\n    &lt;!-- 添加 KaTeX CSS --&gt;\n    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css&quot;&gt;\n    &lt;!-- 添加 KaTeX JS --&gt;\n    &lt;script defer src=&quot;https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js&quot;&gt;&lt;/script&gt;\n    &lt;!-- 添加 auto-render 扩展，用于自动渲染页面中的数学公式 --&gt;\n    &lt;script defer src=&quot;https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js&quot;&gt;&lt;/script&gt;\n    \n    &lt;!-- 其他头部内容 --&gt;\n    {% block head %}{% endblock %}\n&lt;/head&gt;\n&lt;body&gt;\n    {% block content %}{% endblock %}\n    \n    &lt;!-- 配置 KaTeX 自动渲染 --&gt;\n    &lt;script&gt;\n        document.addEventListener(&quot;DOMContentLoaded&quot;, function() {\n            renderMathInElement(document.body, {\n                delimiters: [\n                    {left: &quot;$$&quot;, right: &quot;$$&quot;, display: true},\n                    {left: &quot;$&quot;, right: &quot;$&quot;, display: false},\n                    {left: &quot;\\\\[&quot;, right: &quot;\\\\]&quot;, display: true},\n                    {left: &quot;\\\\(&quot;, right: &quot;\\\\)&quot;, display: false}\n                ],\n                throwOnError: false\n            });\n        });\n    &lt;/script&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n\n在你的 Markdown 文件中，你可以用以下方式写数学公式：\n\n行内公式：使用单个美元符号，如 $E=mc^2$\n独立公式：使用双美元符号，如 $$E=mc^2$$\n也支持 LaTeX 风格的 ( ) 和 [ ] 分隔符\n如果需要在公式中使用反斜杠，要使用双反斜杠\n注意：乘号不要用*，要用\\times\n\n"},{"title":"进制表示和转换",
"url":"/blog/binary-convert/",
"date":"2024-11-17",
"headings":[{"level":1,"id":"jin-zhi-ji-ben-zhi-shi","permalink":"https://linxz.online/blog/binary-convert/#jin-zhi-ji-ben-zhi-shi","title":"进制基本知识","children":[{"level":2,"id":"shi-jin-zhi-decimal","permalink":"https://linxz.online/blog/binary-convert/#shi-jin-zhi-decimal","title":"十进制（decimal）","children":[]},{"level":2,"id":"er-jin-zhi-binary","permalink":"https://linxz.online/blog/binary-convert/#er-jin-zhi-binary","title":"二进制（binary）","children":[]},{"level":2,"id":"ba-jin-zhi-octal","permalink":"https://linxz.online/blog/binary-convert/#ba-jin-zhi-octal","title":"八进制（octal）","children":[]},{"level":2,"id":"shi-liu-jin-zhi","permalink":"https://linxz.online/blog/binary-convert/#shi-liu-jin-zhi","title":"十六进制","children":[]}]},{"level":1,"id":"er-jin-zhi-de-xiao-hua","permalink":"https://linxz.online/blog/binary-convert/#er-jin-zhi-de-xiao-hua","title":"二进制的笑话","children":[]},{"level":1,"id":"jin-zhi-zhuan-huan","permalink":"https://linxz.online/blog/binary-convert/#jin-zhi-zhuan-huan","title":"进制转换","children":[{"level":2,"id":"jin-zhi-zhuan-huan-de-kuai-su-fang-fa","permalink":"https://linxz.online/blog/binary-convert/#jin-zhi-zhuan-huan-de-kuai-su-fang-fa","title":"进制转换的快速方法","children":[]},{"level":2,"id":"er-jin-zhi-zhuan-shi-jin-zhi","permalink":"https://linxz.online/blog/binary-convert/#er-jin-zhi-zhuan-shi-jin-zhi","title":"二进制转十进制","children":[{"level":3,"id":"shi-li","permalink":"https://linxz.online/blog/binary-convert/#shi-li","title":"示例","children":[]},{"level":3,"id":"kuai-su-ji-suan","permalink":"https://linxz.online/blog/binary-convert/#kuai-su-ji-suan","title":"快速计算","children":[]},{"level":3,"id":"ju-ti-ji-suan","permalink":"https://linxz.online/blog/binary-convert/#ju-ti-ji-suan","title":"具体计算","children":[]}]},{"level":2,"id":"er-jin-zhi-zhuan-shi-liu-jin-zhi","permalink":"https://linxz.online/blog/binary-convert/#er-jin-zhi-zhuan-shi-liu-jin-zhi","title":"二进制转十六进制","children":[]},{"level":2,"id":"er-jin-zhi-zhuan-ba-jin-zhi","permalink":"https://linxz.online/blog/binary-convert/#er-jin-zhi-zhuan-ba-jin-zhi","title":"二进制转八进制","children":[]},{"level":2,"id":"shi-jin-zhi-zhuan-er-jin-zhi","permalink":"https://linxz.online/blog/binary-convert/#shi-jin-zhi-zhuan-er-jin-zhi","title":"十进制转二进制","children":[{"level":3,"id":"kuai-su-ji-suan-pin-cou-fa","permalink":"https://linxz.online/blog/binary-convert/#kuai-su-ji-suan-pin-cou-fa","title":"快速计算：拼凑法","children":[]},{"level":3,"id":"zheng-chang-ji-suan-shou-suan","permalink":"https://linxz.online/blog/binary-convert/#zheng-chang-ji-suan-shou-suan","title":"正常计算-手算","children":[]}]},{"level":2,"id":"shi-jin-zhi-zhuan-ba-jin-zhi","permalink":"https://linxz.online/blog/binary-convert/#shi-jin-zhi-zhuan-ba-jin-zhi","title":"十进制转八进制","children":[{"level":3,"id":"shou-suan","permalink":"https://linxz.online/blog/binary-convert/#shou-suan","title":"手算","children":[]}]},{"level":2,"id":"shi-jin-zhi-zhuan-shi-liu-jin-zhi","permalink":"https://linxz.online/blog/binary-convert/#shi-jin-zhi-zhuan-shi-liu-jin-zhi","title":"十进制转十六进制","children":[{"level":3,"id":"shou-suan-1","permalink":"https://linxz.online/blog/binary-convert/#shou-suan-1","title":"手算","children":[]}]}]},{"level":1,"id":"dai-fu-hao-de-er-jin-zhi-shu-zi-yuan-ma-fan-ma-bu-ma","permalink":"https://linxz.online/blog/binary-convert/#dai-fu-hao-de-er-jin-zhi-shu-zi-yuan-ma-fan-ma-bu-ma","title":"带符号的二进制数字：原码 反码 补码","children":[{"level":2,"id":"11de-bu-ma-biao-shi","permalink":"https://linxz.online/blog/binary-convert/#11de-bu-ma-biao-shi","title":"-11的补码表示","children":[]},{"level":2,"id":"gen-ju-bu-ma-qiu-shi-jin-zhi-shu","permalink":"https://linxz.online/blog/binary-convert/#gen-ju-bu-ma-qiu-shi-jin-zhi-shu","title":"根据补码求十进制数","children":[]}]}],
"body":"进制基本知识\n计算机只有二进制，所有数据最后都要转成二进制。\n十进制（decimal）\n\n数字组成：0-9\n进位规则：满十进一\n\n二进制（binary）\n\n数字组成：0-1\n进位规则：满二进一，以0b或0B开头\n\n八进制（octal）\n\n数字组成：0-7\n进位规则：满八进一，以数字0开头 \n\n十六进制\n\n数字组成：0-9，a-f\n进位规则：满十六进一，以0x或0X开头\n\n二进制的笑话\n世界上有10种人，认识和不认识二进制的。\n进制转换\n进制转换的快速方法\n各进制与二进制的转化都比较快，所以可把该进制·转成二进制，再互相转化。\n\n二进制转十进制\n快速方法：记住每个位权的值，直接相加即可\n-3位-2位-1位1位2位3位4位5位6位7位8位9位10位11位12位\n0.1250.250.5124816326412825651210242048\n\n比如：\n101\n涉及3位和1位，那么就是4+1=5。\n示例\n10010010.110\n快速计算\n涉及到第2、5、8、-1、-2位。即2、16、128、0.5、0.25，相加得146.75\n具体计算\n$$1\\times2^7+1\\times2^4+1\\times2^1+1\\times2^{-1}+1\\times2^{-2}=146.75$$\n二进制转十六进制\n特点：每4个数是一个位\n0111 1011\n每四位都是一个位。0111=7 1011=11，即十六进制的b。\n所以对应的是0x7b\n二进制转八进制\n特点：每3个数是一个位\n001 111 011\n因此对应的就是001=1，111=7，011=3\n所以对应的是0173\n十进制转二进制\n快速计算：拼凑法\n方法：先把所有数据列举出来，快速拼凑出数据。\n13位12位11位10位9位8位7位6位5位4位3位2位1位-1位-2位\n40962048102451225612864321684210.50.25\n\n比如，260.75\n即256+4+0.75，所以是第9位、第3位、第-1位、第-2位。所以结果是\n100000100.11\n正常计算-手算\n整数部分：将十进制数字不断取余，并从后往前写出数字。\n小数部分：将小数不断乘以2，取整数部分。\n比如，260.75\n整数部分：\n260/2，余数0；\n130/2，余数0；\n65/2，余数1；\n32/2，余数0；\n16/2，余数0；\n8/2，余数0；\n4/2，余数0；\n2/2，余数0；\n1/2，余数1\n整数部分，从后往前数是100000100\n小数部分：\n0.75x2=1.5，整数位1，小数位0.5；\n0.5x2=1，整数位1，小数位0;结束\n取整数位11\n所以，整体结果是100000100.11\n十进制转八进制\n手算\n将十进制数字不断除以8，取余，并从后往前写出数字。\n比如，123\n123/8，余数3；\n15/8，余数7；\n1/8，余数1\n所以，从后往前写是173，八进制表示是0173\n十进制转十六进制\n手算\n将十进制数字不断除以16，取余，并从后往前写出数字。\n比如，123\n123/16，余数11;\n7/16，余数7；\n所以，从后往前写是7b，十进制表示是0x7b\n带符号的二进制数字：原码 反码 补码\n计算机数据存储采取补码形式存储，最高位是符号位。\n正数的原码、补码、反码都一样。\n负数的原码：十进制转二进制，最高位设置为1\n负数的反码：原码的基础上，最高位不变，其他位取反（0变1,1变0）\n负数的补码：反码+1\n-11的补码表示\n如果是8位系统。\n-11的原码为：\n10001011，其中第一位是符号位，0是整数，1是负数。\n-11的补反码为：原码取反，符号位不变。\n11110100\n-11的补码：反码+1\n11110101\n如果对补码有疑问，可以参考为什么计算机要用补码表示-方便电路运算\n根据补码求十进制数\n1110 1011是多少？\n思考：\n如果是正数，符号为0，正数三码合一反而简单。\n题目中是负数，这个是补码。因为计算机底层是用补码存储的。\n求反码：-1即可\n1110 1010\n求原码：取反，符号位不变\n1001 0101\n二进制转十进制：\n-21\n"},{"title":"安卓Android介绍",
"url":"/blog/android-intro/",
"date":"2024-11-16",
"headings":[{"level":1,"id":"androidshi-shen-me","permalink":"https://linxz.online/blog/android-intro/#androidshi-shen-me","title":"Android是什么？","children":[]},{"level":1,"id":"androidkai-fa-yu-yan","permalink":"https://linxz.online/blog/android-intro/#androidkai-fa-yu-yan","title":"Android开发语言","children":[{"level":2,"id":"wei-shen-me-java","permalink":"https://linxz.online/blog/android-intro/#wei-shen-me-java","title":"为什么Java？","children":[]}]},{"level":1,"id":"androidsuo-you-ban-ben","permalink":"https://linxz.online/blog/android-intro/#androidsuo-you-ban-ben","title":"Android所有版本","children":[]},{"level":1,"id":"kai-fa-gong-ju","permalink":"https://linxz.online/blog/android-intro/#kai-fa-gong-ju","title":"开发工具","children":[]},{"level":1,"id":"chuang-jian-xiang-mu","permalink":"https://linxz.online/blog/android-intro/#chuang-jian-xiang-mu","title":"创建项目","children":[]},{"level":1,"id":"shi-pin-jiao-cheng","permalink":"https://linxz.online/blog/android-intro/#shi-pin-jiao-cheng","title":"视频教程","children":[]}],
"body":"Android是什么？\n\n基于Linux的开源操作系统\n用于智能设备，如智能手机、平板电脑、智能电视、智能手表、智能家具等\nGoogle公司领头开发并推广，2008年推出第一个版本\n安卓之父Andy Rubin，2003年开发\n\nAndroid开发语言\nJava, Kotlin(Java的超集）\n为什么Java？\n当时很多人使用Java语言，为了让Android快速流行起来。\n现在主流已经变成Kotlin了。\nKotlin对于Java，就等于C++对于C语言。只有会C语言了，才能会C++。\nAndroid所有版本\n一个是版本号，一个是API号。\nAndroid几乎每年发布一个大版本。\n\n开发工具\nAndroid Studio，基于IntelliJ IDEA演变而来。\n下载地址\n创建项目\n如果想使用Java来开发。\n选择empty views activity创建项目。为什么要views activity而不是empty activity?\n视频教程\n2022Andorid开发视频\n已过时视频：\n尚硅谷视频教程\n"},{"title":"Android的日志",
"url":"/blog/android-log/",
"date":"2024-11-16",
"headings":[],
"body":"五个等级。\n• Log.e：表示错误信息，比如可能导致程序崩溃的异常。\n• Log.w：表示警告信息。\n• Log.i：表示一般消息。\n• Log.d：表示调试信息，可把程序运行时的变量值打印出来，方便跟踪调试。\n• Log.v：表示冗余信息。\n代码：\nLog.d(&quot;ning&quot;, &quot;OnCreate&quot;);\n\n在左下角点击LogCat窗口可以打开，查看日志。\n可以筛选日志：\n\n通过package:mine过滤我的项目的日志。\n通过tag:...过滤具体的某个日志。\n\n通过level:error来看不同级别的日志，比如error代表错误级别。\n"},{"title":"关于期待",
"url":"/blog/expectation-about/",
"date":"2024-11-15",
"headings":[{"level":1,"id":"guan-yu-qi-dai","permalink":"https://linxz.online/blog/expectation-about/#guan-yu-qi-dai","title":"关于期待","children":[{"level":2,"id":"dui-bie-ren-you-qi-dai","permalink":"https://linxz.online/blog/expectation-about/#dui-bie-ren-you-qi-dai","title":"对别人有期待","children":[]},{"level":2,"id":"dui-zi-ji-you-qi-dai","permalink":"https://linxz.online/blog/expectation-about/#dui-zi-ji-you-qi-dai","title":"对自己有期待","children":[]},{"level":2,"id":"man-yi-du-yu-qi-dai","permalink":"https://linxz.online/blog/expectation-about/#man-yi-du-yu-qi-dai","title":"满意度与期待","children":[]},{"level":2,"id":"qi-dai-yu-qian-de-guan-xi","permalink":"https://linxz.online/blog/expectation-about/#qi-dai-yu-qian-de-guan-xi","title":"期待与钱的关系","children":[]},{"level":2,"id":"man-yi-du-he-xing-fu","permalink":"https://linxz.online/blog/expectation-about/#man-yi-du-he-xing-fu","title":"满意度和幸福","children":[]},{"level":2,"id":"wu-suo-qi-dai-zui-hao","permalink":"https://linxz.online/blog/expectation-about/#wu-suo-qi-dai-zui-hao","title":"无所期待最好？","children":[]}]}],
"body":"关于期待\n我们生活中很多问题都是期待过高引起的。\n对别人有期待\n如果对方带不出你想要的结果，比如伴侣、同事、下属，你会伤心、难过、愤怒等。源于你对对方有错误的期待。\n对自己有期待\n对自己期待过高，往往会对自己所做的一切感到难受，认为作品 做不到最好 ，对自己产生失望的心情。\n对自己的期待过高怎么办？你可以这么想，反正临死前你也要接受自己原本的样子，还不如现在开始接受自己。不必给自己太多的期待，免得临死还对自己有太多的懊悔。\n这样一来，反而能够把生活重心聚焦到现在，做好现在的事情。\n满意度与期待\n满意度与期待有关，如果客户对你有期待，你做不到，那么满意度就低。如果客户对你没期待，但你做出来了，满意度就很高。这个往往和客观标准没啥关系。比如，在一个苍蝇小馆吃到很好吃的食物，往往会带来很高的评价。比如在五星级酒店得到一点不顺心的服务，往往会留下极低的评级。\n期待与钱的关系\n价钱越高，人们的期待越大。正如人们对于高薪人员，自然是怀有高期待，因此他们的风险也很高。人们花了大价钱，就希望得到很好的服务，因此不能接受大厂的草台班子，却很容易歌颂街边的卖艺者。\n满意度和幸福\n看过一个幸福公式，幸福度=能力/期待。能力越大，满意度容易高，因此自由多了。但是，如果你对自己期待过高，一样会不满意。\n在这一层次上，满意度=幸福。当然这样说也过于简单，满意度往往与一次事件有关，全局满意度才会等于幸福。一个幸福的人要学会接受很多的不满意。\n无所期待最好？\n无所期待，我的观点是好的，但是一般人做不到。\n无所期待就是无欲无求，这在佛教中是一种至高境界。\n一般人做到降低期待就不错了，千万不要无所期待，期望自己无所期待，反而弄巧成拙，变成期待过高了。\n"},{"title":"ios如何对齐元素？",
"url":"/blog/ios-alignment/",
"date":"2024-11-15",
"headings":[{"level":2,"id":"fang-shi-yi-cha-ru-viewzu-jian","permalink":"https://linxz.online/blog/ios-alignment/#fang-shi-yi-cha-ru-viewzu-jian","title":"方式一：插入View组件","children":[]},{"level":2,"id":"fang-shi-er-ding-bu-cai-dan-xuan-ze","permalink":"https://linxz.online/blog/ios-alignment/#fang-shi-er-ding-bu-cai-dan-xuan-ze","title":"方式二：顶部菜单选择","children":[]},{"level":2,"id":"fang-shi-san-di-bu-cai-dan-xuan-ze","permalink":"https://linxz.online/blog/ios-alignment/#fang-shi-san-di-bu-cai-dan-xuan-ze","title":"方式三：底部菜单选择","children":[]},{"level":1,"id":"ru-he-gei-viewrong-qi-gai-ming-zi","permalink":"https://linxz.online/blog/ios-alignment/#ru-he-gei-viewrong-qi-gai-ming-zi","title":"如何给View容器改名字？","children":[]},{"level":1,"id":"ru-he-dui-qi-san-ge-viewrong-qi-stack-view","permalink":"https://linxz.online/blog/ios-alignment/#ru-he-dui-qi-san-ge-viewrong-qi-stack-view","title":"如何对齐三个View容器 - stack view","children":[]},{"level":1,"id":"she-zhi-stack-viewde-constraints","permalink":"https://linxz.online/blog/ios-alignment/#she-zhi-stack-viewde-constraints","title":"设置stack view的constraints","children":[]},{"level":1,"id":"xiu-gai-bottomde-constraints-shi-zhi-xiang-dui-yu-safe-area","permalink":"https://linxz.online/blog/ios-alignment/#xiu-gai-bottomde-constraints-shi-zhi-xiang-dui-yu-safe-area","title":"修改bottom的constraints，使之相对于safe area","children":[]},{"level":1,"id":"xiu-zheng-stackde-zong-xiang-dui-qi","permalink":"https://linxz.online/blog/ios-alignment/#xiu-zheng-stackde-zong-xiang-dui-qi","title":"修正stack的纵向对齐","children":[]},{"level":1,"id":"ru-he-dui-qi-liang-ge-tou-zi-yuan-su","permalink":"https://linxz.online/blog/ios-alignment/#ru-he-dui-qi-liang-ge-tou-zi-yuan-su","title":"如何对齐两个骰子元素？","children":[]},{"level":1,"id":"ru-he-xiao-chu-containerde-yan-se","permalink":"https://linxz.online/blog/ios-alignment/#ru-he-xiao-chu-containerde-yan-se","title":"如何消除container的颜色？","children":[]},{"level":1,"id":"ru-he-gai-bian-constraintsde-zui-xiao-kuan-du","permalink":"https://linxz.online/blog/ios-alignment/#ru-he-gai-bian-constraintsde-zui-xiao-kuan-du","title":"如何改变constraints的最小宽度？","children":[]}],
"body":"比如，可以让所有元素其分为三等分的View组件。\n\n我们可以插入三个view组件，作为3个container。\n方式一：插入View组件\n\n输入UIView可以找到View组件，插入即可。\n\n\n\n把logo拉到View组件的下方，使得我们可以看到logo\n\n\n方式二：顶部菜单选择\nEditor - Embed in - View\n\n方式三：底部菜单选择\nEmbed in - View\n\n如何给View容器改名字？\ncmd+option+1打开右边菜单 - identity inspector - 改变Label的值即可。\n\n如何对齐三个View容器 - stack view\n\n设置stack view的constraints\n设置离safe area的值，不要设置离view的值。\n\n修改bottom的constraints，使之相对于safe area\n\n修正stack的纵向对齐\n打开inspectors窗口，找到属性，选择Fill Equally，也可以调整间距Spacing。\n\n如何对齐两个骰子元素？\n思路：先stackview，再相对于父容器居中对齐即可。\n\n如何消除container的颜色？\n选择三个View，换成default的颜色即可。\n\n如何改变constraints的最小宽度？\n右下角点击constraints，设定一个固定宽度和高度。\n点击左侧菜单，弹出的inspectors菜单内，调整Relation到Greater than or Equal。\n\n"},{"title":"ios-autoLayout 自适应画面",
"url":"/blog/ios-autolayout/",
"date":"2024-11-14",
"headings":[{"level":1,"id":"diao-zheng-bei-jing-tu-constraints","permalink":"https://linxz.online/blog/ios-autolayout/#diao-zheng-bei-jing-tu-constraints","title":"调整背景图-constraints","children":[{"level":2,"id":"bu-yong-diao-zheng-superview-fu-shi-tu-de-fang-fa","permalink":"https://linxz.online/blog/ios-autolayout/#bu-yong-diao-zheng-superview-fu-shi-tu-de-fang-fa","title":"不用调整superview（父视图）的方法","children":[]},{"level":2,"id":"ji-huo-constraint","permalink":"https://linxz.online/blog/ios-autolayout/#ji-huo-constraint","title":"激活constraint","children":[]}]},{"level":1,"id":"diao-zheng-logowei-zhi-alignment","permalink":"https://linxz.online/blog/ios-autolayout/#diao-zheng-logowei-zhi-alignment","title":"调整logo位置-alignment","children":[]},{"level":1,"id":"gai-bian-liang-ge-tu-pian-de-xiang-dui-ju-chi","permalink":"https://linxz.online/blog/ios-autolayout/#gai-bian-liang-ge-tu-pian-de-xiang-dui-ju-chi","title":"改变两个图片的相对距离","children":[]},{"level":1,"id":"constraint-he-alignmentde-qu-bie","permalink":"https://linxz.online/blog/ios-autolayout/#constraint-he-alignmentde-qu-bie","title":"constraint 和 alignment的区别","children":[]}],
"body":"如何实现ios的自适应画面？\n综合运用constraints和alignment。\n调整背景图-constraints\n作用：调整四周的距离。\n上下左右都调整成0，并点击红色工字线激活。\n\n不用调整superview（父视图）的方法\n要想背景图布满屏幕，只需要在调整constraints的时候选择view，而不是safe area。\n\n激活constraint\n\n为了上下全屏，去掉安全区域（如菜单区域），选择superview。\n\n注意，如果不奏效，留意constraints的值是否为0。\n调整logo位置-alignment\n让logo居中显示，点击右下角Align，勾选horizon和vertical选项，均为0即可。\n\n改变两个图片的相对距离\nconstraint下面可以点选，选中其他图片，再填写距离的数字，比如30px，就可以了。\n\nconstraint 和 alignment的区别\nconstraint是绝对距离，指离边框的距离。\n\n但是横向的有可能问题：\n\nalignment指从中心向外侧的偏移，适用于不同屏幕状态的居中或者保持元素间的相对距离。\n\n"},{"title":"ios-APP如何设置整体背景图？",
"url":"/blog/ios-background/",
"date":"2024-11-13",
"headings":[{"level":1,"id":"sun-shi-zong-heng-bi","permalink":"https://linxz.online/blog/ios-background/#sun-shi-zong-heng-bi","title":"损失纵横比：","children":[]},{"level":1,"id":"bao-chi-zong-heng-bi","permalink":"https://linxz.online/blog/ios-background/#bao-chi-zong-heng-bi","title":"保持纵横比：","children":[]},{"level":1,"id":"ru-he-fu-zhi-tu-xing","permalink":"https://linxz.online/blog/ios-background/#ru-he-fu-zhi-tu-xing","title":"如何复制图形","children":[]}],
"body":"利用xcode开发。\n按右上角+号，选择imageView插入图片，拉满整个空间。\n损失纵横比：\n右边属性 - Content Mode - scale to fill\n保持纵横比：\nAspect fill\n\n两种fill的对比\n\n如何复制图形\n安装option键，拉动图形就可以复制。\n"},{"title":"ios开发 - storyboard和code的交互",
"url":"/blog/ios-storyboard-code/",
"date":"2024-11-13",
"headings":[{"level":1,"id":"shen-me-shi-hou-xu-yao-shi-yong-dai-ma-er-bu-shi-uijie-mian-bian-ji","permalink":"https://linxz.online/blog/ios-storyboard-code/#shen-me-shi-hou-xu-yao-shi-yong-dai-ma-er-bu-shi-uijie-mian-bian-ji","title":"什么时候需要使用代码，而不是UI界面编辑？","children":[]},{"level":1,"id":"dai-ma-wen-jian","permalink":"https://linxz.online/blog/ios-storyboard-code/#dai-ma-wen-jian","title":"代码文件","children":[]},{"level":1,"id":"ru-he-ba-mainjie-mian-he-dai-ma-jie-mian-rong-he","permalink":"https://linxz.online/blog/ios-storyboard-code/#ru-he-ba-mainjie-mian-he-dai-ma-jie-mian-rong-he","title":"如何把main界面和代码界面融合？","children":[]},{"level":1,"id":"ru-he-cha-kan-mian-storyboardde-dai-ma-xing-shi","permalink":"https://linxz.online/blog/ios-storyboard-code/#ru-he-cha-kan-mian-storyboardde-dai-ma-xing-shi","title":"如何查看mian storyboard的代码形式？","children":[]},{"level":1,"id":"mainhe-swiftdai-ma-bian-liang-ming-bu-xiang-fu-shi","permalink":"https://linxz.online/blog/ios-storyboard-code/#mainhe-swiftdai-ma-bian-liang-ming-bu-xiang-fu-shi","title":"main和swift代码变量名不相符时：","children":[{"level":2,"id":"ios-ibactionzui-hao-de-zhong-ming-ming-fang-shi","permalink":"https://linxz.online/blog/ios-storyboard-code/#ios-ibactionzui-hao-de-zhong-ming-ming-fang-shi","title":"iOS-IBAction最好的重命名方式","children":[]},{"level":2,"id":"zen-me-zhi-dao-na-ge-bian-liang-ming-dai-biao-na-ge-yuan-su","permalink":"https://linxz.online/blog/ios-storyboard-code/#zen-me-zhi-dao-na-ge-bian-liang-ming-dai-biao-na-ge-yuan-su","title":"怎么知道哪个变量名代表哪个元素？","children":[]}]},{"level":1,"id":"gai-bian-bian-liang-shu-xing-de-yu-fa","permalink":"https://linxz.online/blog/ios-storyboard-code/#gai-bian-bian-liang-shu-xing-de-yu-fa","title":"改变变量属性的语法","children":[]},{"level":1,"id":"zen-me-zhi-dao-you-duo-shao-chong-shu-xing","permalink":"https://linxz.online/blog/ios-storyboard-code/#zen-me-zhi-dao-you-duo-shao-chong-shu-xing","title":"怎么知道有多少种属性","children":[]},{"level":1,"id":"viewdidloadshi-sha-yi-si","permalink":"https://linxz.online/blog/ios-storyboard-code/#viewdidloadshi-sha-yi-si","title":"viewDidLoad是啥意思？","children":[]},{"level":1,"id":"ios-buttonde-dian-ji-shi-jian-she-zhi","permalink":"https://linxz.online/blog/ios-storyboard-code/#ios-buttonde-dian-ji-shi-jian-she-zhi","title":"ios-button的点击事件设置","children":[]},{"level":1,"id":"iboutlethe-ibactionde-qu-bie","permalink":"https://linxz.online/blog/ios-storyboard-code/#iboutlethe-ibactionde-qu-bie","title":"IBOutlet和IBAction的区别","children":[]}],
"body":"什么时候需要使用代码，而不是UI界面编辑？\n当我们需要动态修改图片时，比如用户按下一个按钮，改变界面上的图片。\n代码文件\nViewController.swift\n如何把main界面和代码界面融合？\n在main界面右上角，选择三条杠的菜单，点击assistant，右侧就会出现对应的代码界面。\n快捷键cmd+option+control + 回车\n\n按住control键，就可以把元素改成代码形式拖入代码文件中。\n这样就会出现IBOutlet（Interface Builder Outlet）的代码：\n @IBOutlet weak var diceImageView1: UIImageView!\n\n如何查看mian storyboard的代码形式？\n右键 - open as - source code\n\nmain和swift代码变量名不相符时：\n选择元素-右键-删除连接-重新连接即可\n\niOS-IBAction最好的重命名方式\n选中变量名-右键-refactor-rename\n\n怎么知道哪个变量名代表哪个元素？\n移动到代码前面的小点点即可知道。\n\n改变变量属性的语法\nwho.what=newValue\n\n怎么知道有多少种属性\ncmd+option+5可以打开属性窗口，上面的名字就是属性。\n\nviewDidLoad是啥意思？\n页面一加载，就会执行以下代码。\n\nios-button的点击事件设置\n生成一个IBAction（系统会根据Button来自动判断），而不是IBOutlet。属性设置如下：\ntype - UIButton\nEvent - Touch Up Inside\n\nIBOutlet和IBAction的区别\n方向不同。\nIBOutlet是从代码侧影响UI侧；\nIBAction是从UI侧影响代码侧。\n\n"},{"title":"微信开发者工具界面介绍-小程序开发",
"url":"/blog/mini-program-layout/",
"date":"2024-11-13",
"headings":[{"level":1,"id":"zhu-yao-jie-mian","permalink":"https://linxz.online/blog/mini-program-layout/#zhu-yao-jie-mian","title":"主要界面","children":[]},{"level":1,"id":"yu-lan-hua-mian","permalink":"https://linxz.online/blog/mini-program-layout/#yu-lan-hua-mian","title":"预览画面","children":[]},{"level":1,"id":"xiao-cheng-xu-diao-shi-jie-mian","permalink":"https://linxz.online/blog/mini-program-layout/#xiao-cheng-xu-diao-shi-jie-mian","title":"小程序调试界面","children":[]}],
"body":"主要界面\n可以toggle\n模拟器 - 右侧手机画面\n编辑器 - 代码画面\n调试器 - console等画面\n预览画面\n编译 - 刷新预览\n预览 - 直接手机查看\n真机调试 - 手机查看，电脑看console\n清除缓存 - 清掉之前的记录\n\n小程序调试界面\n\n"},{"title":"小程序注册须知",
"url":"/blog/mini-program-register/",
"date":"2024-11-13",
"headings":[{"level":3,"id":"1-ren-shi-shen-me-shi-xiao-cheng-xu","permalink":"https://linxz.online/blog/mini-program-register/#1-ren-shi-shen-me-shi-xiao-cheng-xu","title":"1. 认识什么是小程序","children":[]},{"level":3,"id":"2-wei-xin-xiao-cheng-xu-zhang-hao-zhu-ce","permalink":"https://linxz.online/blog/mini-program-register/#2-wei-xin-xiao-cheng-xu-zhang-hao-zhu-ce","title":"2. 微信小程序账号注册","children":[]},{"level":3,"id":"3-wan-shan-xiao-cheng-xu-zhang-hao-xin-xi","permalink":"https://linxz.online/blog/mini-program-register/#3-wan-shan-xiao-cheng-xu-zhang-hao-xin-xi","title":"3. 完善小程序账号信息","children":[]},{"level":3,"id":"4-xiao-cheng-xu-kai-fa-zhe-id","permalink":"https://linxz.online/blog/mini-program-register/#4-xiao-cheng-xu-kai-fa-zhe-id","title":"4. 小程序开发者 ID","children":[]},{"level":3,"id":"5-kai-fa-cheng-yuan-he-ti-yan-cheng-yuan","permalink":"https://linxz.online/blog/mini-program-register/#5-kai-fa-cheng-yuan-he-ti-yan-cheng-yuan","title":"5. 开发成员和体验成员","children":[]},{"level":3,"id":"6-wei-xin-kai-fa-zhe-gong-ju","permalink":"https://linxz.online/blog/mini-program-register/#6-wei-xin-kai-fa-zhe-gong-ju","title":"6. 微信开发者工具","children":[]},{"level":3,"id":"8-chuang-jian-xiao-cheng-xu-xiang-mu","permalink":"https://linxz.online/blog/mini-program-register/#8-chuang-jian-xiao-cheng-xu-xiang-mu","title":"8. 创建小程序项目","children":[]},{"level":3,"id":"9-xiao-cheng-xu-mu-lu-jie-gou-he-wen-jian-jie-shao","permalink":"https://linxz.online/blog/mini-program-register/#9-xiao-cheng-xu-mu-lu-jie-gou-he-wen-jian-jie-shao","title":"9. 小程序目录结构和文件介绍","children":[]},{"level":3,"id":"10-ru-he-diao-shi-xiao-cheng-xu","permalink":"https://linxz.online/blog/mini-program-register/#10-ru-he-diao-shi-xiao-cheng-xu","title":"10. 如何调试小程序","children":[]},{"level":3,"id":"11-ru-he-xin-jian-ye-mian","permalink":"https://linxz.online/blog/mini-program-register/#11-ru-he-xin-jian-ye-mian","title":"11. 如何新建页面","children":[]},{"level":3,"id":"12-diao-shi-ji-chu-ku","permalink":"https://linxz.online/blog/mini-program-register/#12-diao-shi-ji-chu-ku","title":"12. 调试基础库","children":[]}],
"body":"注意：以下文档来源于尚硅谷教程。\n1. 认识什么是小程序\n什么是微信小程序\n微信小程序是一种运行在微信内部的 轻量级 应用程序。\n在使用小程序时 不需要下载安装，用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念，用户不用关心安装太多应用的问题。它实现了应用“触手可及”的梦想，应用无处不在，随时可用，但又 无须安装卸载。\n\n特点:\n小程序的四大特性：无须安装、用完即走、无须卸载、触手可及\n\n无须安装：体积小，用户感知不到下载的过程\n触手可及：用户 扫一扫 或 搜一下 即可打开应用，通过下拉能访问使用的小程序\n用完即走，无须卸载\n\n\n2. 微信小程序账号注册\n小程序开发 与 网页开发不一样，在开始微信小程序开发之前，需要访问 微信公众平台，注册一个微信小程序账号。\n在拥有了小程序的账号以后，我们才可以开发和管理小程序，后续可以通过该账号进行开发信息的设置、成员的添加，也可以用该账号查看、运营小程序的相关数据。\n\n📌 注意事项：\n在申请账号前，我们需要先准备一个邮箱，该邮箱要求：\n1️⃣ 未被微信公众平台注册❗\n2️⃣ 未被微信开放平台注册❗\n3️⃣ **未被个人微信号绑定过 ！**如果被绑定了需要解绑 或 使用其他邮箱 ❗\n\n\n\n打开 微信公众平台，点击立即注册\n\n\n\n选择注册的帐号类型，在这里我们需要 选择小程序\n\n\n\n输入账号信息\n\n\n\n邮箱激活，需要进入邮箱进行激活\n\n\n\n\n信息登记，注册类型 (需要选择中国大陆和个人，企业其他需要资质认证)\n\n\n\n主体信息登记与确认\n\n📌 注意:\n​    在进行管理员身份验证的时候，推荐使用自已的微信进行扫码，\n​    将自已设置为小程序账号的管理员，方便以后对小程序进行开发、成员等相关的设置\n\n\n\n\n\n小程序注册完成，点击前往小程序，即可进入小程序后台\n\n\n\n\n3. 完善小程序账号信息\n在完成小程序账号的注册后，你便可以打开微信公众平台对小程序账号进行一些设置，这是你开发前的准备工作，完善后才可以进入后续的开发步骤，这是因为小程序在后续进行提交审核的时候，小程序账号信息是必填项，因此在注册小程序以后，需要补充小程序的基本信息，如名称、图标、描述等。\n\n📌 注意事项：\n​\t在填写小程序类目时不要选择游戏类型，否则微信官方将会视为小游戏开发 ❗\n\n\n点击 前往填写，填写小程序基本信息即可\n\n点击 前往设置 , 设置小程序类目信息\n\n\n点击右上角添加类目\n\n\n\n管理员授权\n\n\n\n手机微信进行认证\n\n\n\n添加小程序类目，注意：选择类目的时候不要选择小游戏类目 ！！！！\n\n\n\n\n4. 小程序开发者 ID\n小程序的开发者账号是免费的，只要开发者满足开发资质就可以免费注册，并且会获得对应的开发者 ID\n一个完整的开发者 ID 由 **小程序 ID（AppID）**和一个 **小程序密钥（AppSecret）**组成。\n小程序 ID 即 AppId  是小程序在整个微信账号体系内的唯一身份凭证，后续在很多地方都会用到，例如：新建小程序项目、真机调试、发布小程序等操作时，必须有小程序 ID。\n小程序密钥 是开发者对小程序拥有所有权的凭证，在进行 微信登录、微信支付，或进行发送消息等高级操作时会使用到\n在微信公众后台，单击左侧开发标签，选择 &quot;开发管理&quot;，在新的页面中点击 &quot;开发设置&quot;，就可以看到开发者 ID 信息。请妥善保管你的小程序 ID 和小程序密钥，在后续的开发中会经常使用到，获取位置见下图：\n\n5. 开发成员和体验成员\n小程序提供了两种不同的成员角色：项目成员 和 体验成员\n项目成员：参与小程序开发、运营的成员，可登陆小程序管理后台，包括运营者、开发者及数据分析者。管理员可在“成员管理”中添加、删除项目成员，并设置项目成员的角色。\n体验成员：参与小程序内测体验的成员，可使用体验版小程序，但不属于项目成员。管理员及项目成员均可添加、删除体验成员。\n\n\n6. 微信开发者工具\n为了帮助开发者简单和高效地开发和调试微信小程序，微信官方提供了 微信开发者工具，利用开发者工具可以很方便地进行小程序开发、代码查看以及编辑、预览和发布等功能。\n在 微信开发者工具 下载页面，可以看到微信开发者工具包含三个版本：\n\n\n稳定版：稳定性高，开发中一般推荐大家使用稳定版本\n\n\n预发布版：稳定性尚可，一般包含新的、大的特性，通过了内部测试\n\n\n开发版：稳定性差，主要用于尽快修复缺陷和敏捷上线小的特性，如果想体验新特性，可以使用这个版本\n\n\n\n选择合适的版本进行下载，在下载完成后，双击下载好的微信开发者工具安装包，根据引导点击下一步、我接受、直至安装完成。第一次使用微信开发者工具的时候，需要使用手机微信扫码登录，登录成功即可进入项目选择界面\n\n📌 注意事项：\n​\t微信开发者工具必须联网使用 ❗\n\n\n\n8. 创建小程序项目\n创建项目\n使用小程序开发者工具创建一个新的项目，步骤如下：\n\n\n打开微信开发者工具，左侧选择小程序，点击 + 号即可新建项目\n\n\n\n在弹出的新页面，填写项目信息\n\n项目名称：输入项目名称\n目录：选择小程序开发文件夹，注意：小程序的目录建议是空目录，否则官方会有提示，见下图\nAppID：填写自己申请的小程序 AppID\n开发模式：选择小程序\n后端服务：选择不使用云服务\n模板选择：选择不使用模板\n\n\n\n\n\n点击确定，如果能够看到小程序的开发主界面，说明小程序项目已经创建成功\n\n\n\n开发者工具设置\n为了后续高效的对小程序项目进行开发，我们需要对微信开发者工具进行一些个性化的设置，例如：设置模拟器位置、编辑器主题、编辑区行高等，当然你可以继续使用官方默认的，也可以按照自己的喜好设置，设置步骤如下：\n\n\n将小程序模拟器移动右侧：点击菜单栏的 视图 ➡ 外观 ➡ 将模拟器移到右侧，小程序模拟器即可调整到右侧\n\n\n\n\n小程序主题设置，点击菜单栏的 设置 ➡ 外观设置 ➡ 在弹框中将主题和调试工具选择为深色\n\n\n\n\n编辑区的设置，点击菜单栏的 设置 ➡ 编辑器设置 ➡ 按照自己的洗好调整行距和字号，或者其他设置\n\n\n\n9. 小程序目录结构和文件介绍\n在将小程序项目创建好以后，我们先来熟悉小程序项目的目录结构，如下图：\n\n一个完整的小程序项目分为两个部分：主体文件、页面文件\n主体文件 又称小程序全局文件，顾名思义，全局文件能够作用于整个小程序，影响到小程序的每个页面，且主体文件必须放到项目的根目录下，主要由三部分组成：\n文件名作用是否必须\napp.js小程序入口文件必须\napp.json小程序的全局配置必须\napp.wxss小程序的全局样式非必须\n\n页面文件 是每个页面所需的文件，小程序页面文件都存放在 pages 目录下，一个页面一个文件夹，每个页面通常由四个文件组成，每个文件只对当前页面有效：\n文件名作用是否必须\n.js页面逻辑必须\n.wxml页面结构必须\n.wxss页面样式非必须\n.json页面配置非必须\n\n\n📌 注意事项：\n\n页面文件，wxss、json 文件能够覆盖主体文件中的样式和配置\n强烈建议：页面文件夹名称和页面文件名称要保持一致 感叹号\n\n\n新建小程序文件和文件夹作用清单：\n├─pages\t                    ➡ 小程序页面存放目录\n│\n│  ├─index\t\t\t\t   ➡ index 文件夹代表是 index 页面所需的文件\n│  │      index.js          ➡ index 页面逻辑\n│  │      index.json        ➡ index 页面配置\n│  │      index.wxml        ➡ index 页面结构\n│  │      index.wxss        ➡ index 页面样式\n│  .eslintrc.js              ➡ Eslint 配置文件\n│  app.js                    ➡ 小程序入口，即打开小程序首页执行的项目\n│  app.json                  ➡ 小程序的全局配置\n│  app.wxss                  ➡ 小程序的全局样式\n│  project.config.json       ➡ 小程序开发者工具配置\n│  project.private.config.json\n│  sitemap.json              ➡ 小程序搜索优化\n\n\n10. 如何调试小程序\n在进行项目开发的时候，不可避免的需要进行调试，那么如何调试小程序呢 ?\n\n📌 注意事项：\n微信开发者工具缓存非常严重❗❗❗❗\n如果发现代码和预期不一样，先点击编译❗\n编译后还是没有达到预期的效果，就需要清除缓存❗ 甚至重启项目才可以❗\n\n\n\n11. 如何新建页面\n第一种方式：\n\n\n在 pages 目录上 点击右键 新建文件夹，输入页面目录的名称，例如：list\n\n\n在 list  目录上 点击右键 点击 page，输入页面文件的名称，例如：list\n\n\n\n📌 注意事项：\n\n在输入页面文件名称的时候，不要输入后缀名 ❗\n新建页面成功以后，会在 app.json 的 pages 选项中新增页面路径\n\n\n第二种方式：\n在 app.json 的 pages 选项中，新增页面路径即可\n在新增页面目录以后，会自动在 pages 目录下生成页面文件\n12. 调试基础库\n小程序调试基础库是指 微信开发者工具中可以选择的微信基础库版本。\n微信基础库是指小程序的运行环境，给小程序提供了运行所需的各种 API 和工具，以及基础框架和运行逻辑等。\n小程序开发者可以在微信开发者工具中选择所需的微信基础库版本，作为运行和调试小程序时的运行环境。\n每个小程序有自己所允许使用的基础库最低版本要求，开发者需要选择要兼容的基础库版本，从而确保小程序的功能正常运行。\n\n"},{"title":"swift语法介绍",
"url":"/blog/swift-ios-syntax/",
"date":"2024-11-13",
"headings":[{"level":1,"id":"swiftji-ben-yu-fa","permalink":"https://linxz.online/blog/swift-ios-syntax/#swiftji-ben-yu-fa","title":"swift基本语法","children":[]},{"level":1,"id":"swiftde-shu-zu","permalink":"https://linxz.online/blog/swift-ios-syntax/#swiftde-shu-zu","title":"swift的数组","children":[{"level":2,"id":"ru-he-ding-yi-shu-zu","permalink":"https://linxz.online/blog/swift-ios-syntax/#ru-he-ding-yi-shu-zu","title":"如何定义数组","children":[]}]},{"level":1,"id":"swiftru-he-sheng-cheng-yi-ge-sui-ji-shu","permalink":"https://linxz.online/blog/swift-ios-syntax/#swiftru-he-sheng-cheng-yi-ge-sui-ji-shu","title":"swift如何生成一个随机数","children":[{"level":2,"id":"fang-fa-yi-int-random","permalink":"https://linxz.online/blog/swift-ios-syntax/#fang-fa-yi-int-random","title":"方法一：Int.random()","children":[]},{"level":2,"id":"fang-fa-er-array-randomelement","permalink":"https://linxz.online/blog/swift-ios-syntax/#fang-fa-er-array-randomelement","title":"方法二： Array.randomElement()","children":[]}]},{"level":1,"id":"ru-he-zai-swiftde-printli-mian-cha-ru-bian-liang","permalink":"https://linxz.online/blog/swift-ios-syntax/#ru-he-zai-swiftde-printli-mian-cha-ru-bian-liang","title":"如何在swift的print里面插入变量？","children":[{"level":2,"id":"li-yong-fan-xie-gang","permalink":"https://linxz.online/blog/swift-ios-syntax/#li-yong-fan-xie-gang","title":"利用反斜杠","children":[]}]},{"level":1,"id":"swiftde-function","permalink":"https://linxz.online/blog/swift-ios-syntax/#swiftde-function","title":"swift的function","children":[]},{"level":1,"id":"swiftde-externalhe-internalcan-shu","permalink":"https://linxz.online/blog/swift-ios-syntax/#swiftde-externalhe-internalcan-shu","title":"swift的external和internal参数","children":[{"level":2,"id":"sheng-lue-can-shu-ming-cheng-de-fang-fa","permalink":"https://linxz.online/blog/swift-ios-syntax/#sheng-lue-can-shu-ming-cheng-de-fang-fa","title":"省略参数名称的方法：","children":[{"level":3,"id":"ye-ke-yi-shi-yong-from","permalink":"https://linxz.online/blog/swift-ios-syntax/#ye-ke-yi-shi-yong-from","title":"也可以使用from:","children":[]}]}]},{"level":1,"id":"swift-iosde-dictionary","permalink":"https://linxz.online/blog/swift-ios-syntax/#swift-iosde-dictionary","title":"swift-ios的dictionary","children":[{"level":2,"id":"yi-lai-lei-xing-tui-duan","permalink":"https://linxz.online/blog/swift-ios-syntax/#yi-lai-lei-xing-tui-duan","title":"依赖类型推断","children":[]},{"level":2,"id":"zhi-ding-lei-xing","permalink":"https://linxz.online/blog/swift-ios-syntax/#zhi-ding-lei-xing","title":"指定类型","children":[]}]},{"level":1,"id":"swift-iosde-switchyu-fa","permalink":"https://linxz.online/blog/swift-ios-syntax/#swift-iosde-switchyu-fa","title":"swift-ios的switch语法","children":[]},{"level":1,"id":"swifttiao-jian-pan-duan-if-else","permalink":"https://linxz.online/blog/swift-ios-syntax/#swifttiao-jian-pan-duan-if-else","title":"swift条件判断if...else","children":[]},{"level":1,"id":"swift-iosde-kai-qu-jian-he-bi-qu-jian","permalink":"https://linxz.online/blog/swift-ios-syntax/#swift-iosde-kai-qu-jian-he-bi-qu-jian","title":"swift-ios的开区间和闭区间","children":[{"level":2,"id":"kai-qu-jian","permalink":"https://linxz.online/blog/swift-ios-syntax/#kai-qu-jian","title":"开区间","children":[]},{"level":2,"id":"bi-qu-jian","permalink":"https://linxz.online/blog/swift-ios-syntax/#bi-qu-jian","title":"闭区间","children":[]},{"level":2,"id":"dan-fang-xiang-qu-jian","permalink":"https://linxz.online/blog/swift-ios-syntax/#dan-fang-xiang-qu-jian","title":"单方向区间","children":[]}]},{"level":1,"id":"swift-loopyu-fa","permalink":"https://linxz.online/blog/swift-ios-syntax/#swift-loopyu-fa","title":"swift loop语法","children":[{"level":2,"id":"for-in-loops","permalink":"https://linxz.online/blog/swift-ios-syntax/#for-in-loops","title":"For In Loops","children":[]},{"level":2,"id":"while-loop","permalink":"https://linxz.online/blog/swift-ios-syntax/#while-loop","title":"while loop","children":[]}]},{"level":1,"id":"swiftde-optinalyu-fa","permalink":"https://linxz.online/blog/swift-ios-syntax/#swiftde-optinalyu-fa","title":"swift的Optinal语法?!","children":[{"level":2,"id":"wen-hao","permalink":"https://linxz.online/blog/swift-ios-syntax/#wen-hao","title":"问号：","children":[{"level":3,"id":"an-quan-jie-bao","permalink":"https://linxz.online/blog/swift-ios-syntax/#an-quan-jie-bao","title":"安全解包：","children":[]}]},{"level":2,"id":"gan-tan-hao","permalink":"https://linxz.online/blog/swift-ios-syntax/#gan-tan-hao","title":"感叹号：","children":[{"level":3,"id":"qiang-zhi-jie-bao","permalink":"https://linxz.online/blog/swift-ios-syntax/#qiang-zhi-jie-bao","title":"强制解包","children":[]}]}]},{"level":1,"id":"ios-swift-codeshun-xu","permalink":"https://linxz.online/blog/swift-ios-syntax/#ios-swift-codeshun-xu","title":"IOS-swift-code顺序","children":[]}],
"body":"swift基本语法\n\nswift的数组\n如何定义数组\nlet diceImages = [\n    UIImage(named: &quot;DiceOne&quot;),\n    UIImage(named: &quot;DiceTwo&quot;),\n    UIImage(named: &quot;DiceThree&quot;),\n    UIImage(named: &quot;DiceFour&quot;),\n    UIImage(named: &quot;DiceFive&quot;),\n    UIImage(named: &quot;DiceSix&quot;)\n]\n\n注意，var指可变的变量，let指不变的变量，类似const\nswift如何生成一个随机数\n方法一：Int.random()\nInt.random(in: 0...5)\n\n范围：从0到5的随机整数\n方法二： Array.randomElement()\n let diceImages = [\n            UIImage(named: &quot;DiceOne&quot;)!, //!代表非空\n            UIImage(named: &quot;DiceTwo&quot;)!,\n            UIImage(named: &quot;DiceThree&quot;)!,\n            UIImage(named: &quot;DiceFour&quot;)!,\n            UIImage(named: &quot;DiceFive&quot;)!,\n            UIImage(named: &quot;DiceSix&quot;)!\n  ]\n        \n        diceImageView1.image = diceImages.randomElement()\n\n注意，因为数组元素是UIImage，系统会进行安全检查，认为这里可能是空值。即UIImage?，加上一个Optional的条件。\n加上感叹号意思是强制解包，否则会报错。\n告诉编译器， 我确定这里有值 ，这样，执行randomElement()才不会报错。\n如何在swift的print里面插入变量？\n利用反斜杠\npritn(“Text \\(2+3) Text”)\n\n示例代码：\nvar a = 4\nprint(&quot;The result of 2 + 2 = \\(2+2)&quot;)\nprint(&quot;The result of 2 + 2 = \\(a)”)\n\nswift的function\n格式：\nfunc getMilk(){ //do stuff }\n\nswift的external和internal参数\nexternal参数用在call function的时候；\ninternal参数放在定义function的时候。\n\n省略参数名称的方法：\n只要把external参数设为下划线_即可，就不用输入name: value，只需要输入value即可。\n\n也可以使用from:\n用from可以很直观地使用内部参数，输入from: value即可以，不用输入name: value。\nfunc findNemo(from animals: [Animal]) {\n    print(animals)\n}\n\n\n//调用时\nfindNemo(from: animals)\n\nswift-ios的dictionary\nKey - value对\n依赖类型推断\nvar dict = [&quot;Brewery”: “a place where beer is made”]\n\n指定类型\nvar dict : [String: Int] = [“Angela”: 7712345678, “Philipp”: 7787654321]\n\nswift-ios的switch语法\nswitch hardness {\ncase &quot;Soft&quot;:\n    print(5)\ncase &quot;Medium&quot;:\n    print(7)\ncase &quot;Hard&quot;:\n    print(12)\ndefault:\n    print(&quot;Error&quot;)\n}\n \n\nswift条件判断if...else\nfunc loveCalculator(){\n    let loveScore = Int.random(in: 0...1);\n    print(loveScore)\n    if(loveScore==1){\n        print(&quot;You love each other like Kanye loves Kanye&quot;)\n    } else{\n        print(&quot;You&#39;ll be forever alone.&quot;)\n    }\n    \n}\n\nloveCalculator()\n\n\nswift-ios的开区间和闭区间\n\n开区间\nInt.random(in: 0...100)\n\n闭区间\nInt.random(in: 0..&lt;100) \n\n单方向区间\nlet numbers = [1, 2, 3, 4, 5]\nlet slice = numbers[...3]  // 包含索引 0 到 3 的元素 [1, 2, 3, 4]\n\nswift loop语法\nFor In Loops\nlet names = [&quot;Anna&quot;, &quot;Alex&quot;, &quot;Brian&quot;, &quot;Jack&quot;]\nfor name in names {\n\tprint(&quot;Hello, \\(name)!&quot;)\n}\n\nfor number in 1…5{\n\t//do something\n}\n\n//简单写法\nfor _ in 1…5{}\n\n不同数据类型的for…in loop写法\nlet fruits: Array = [&quot;Apple&quot;, &quot;Pear&quot;, &quot;Orange&quot;] //这里type也可以是Set，但是Set打印出来就不按顺序\nlet contacts = [&quot;Adam&quot;: 123456789, &quot;James&quot;: 987654321, &quot;Amy&quot;:912837365]\nlet word = &quot;supercalifragilisticexplaindocious&quot;\nlet halfOpenRange = 1..&lt;5\nlet closeRange = 1...5\n\nfor fruit in fruits {\n    print(fruit)\n}\n\nfor person in contacts{\n    print(person.key)\n    print(person.value)\n}\n\nfor letter in word{\n    print(letter)\n}\n\nfor number in halfOpenRange{\n    print(number)\n}\n\nfor number in closeRange{\n    print(number)\n}\n\n\nwhile loop\nwhile somethingIsTrue{\n\t//do something\n}\n\n示例代码\nimport Foundation\nvar now = Date().timeIntervalSince1970\n\nlet oneSecondFromNow = now + 1\n\nwhile now &lt; oneSecondFromNow {\n    now = Date().timeIntervalSince1970\n    print(&quot;waiting&quot;)\n}\n\nswift的Optinal语法?!\nOptional是用来处理不知道是否有值存在的情况，防止程序因为空值崩溃。\n//var playerUsername: String = nil //不能直接赋值nil\n\nvar playerUsername: String? = nil\n\nplayerUsername = &quot;Jack&quot;\n\nvar unwrappedP1Username = playerUsername!\n\nprint(playerUsername) //optional(&quot;Jack&quot;)\nprint(playerUsername!) //Jack\nprint(unwrappedP1Username) //Jack\n\nplayerUsername = nil\n//print(playerUsername!) //报错，因为强制解包nil值\n\n//怎么办？\n\n/* 方法一：条件检查*/\nif playerUsername != nil {\n    print(playerUsername!)\n}\n\n\n\nOptional解决的是值为空时，会抛出错误中断程序的问题。\n问号：\n代表Optional类型，即可能有值，可能是nil：\nvar name: String? // name 可以是 String 或 nil\n\n安全解包：\nvar petName: String? = &quot;Buddy&quot;\nprint(petName?.uppercased()) // 如果 petName 有值，输出大写；否则输出 nil\n\n感叹号：\n代表一定有值。但是若值为空时则抛出错误。\nvar name: String? = &quot;孝中&quot;\nprint(name!) // 输出：孝中\n\n强制解包\n若值为nil时，程序崩溃。\nvar nickname: String? = nil\nprint(nickname!) // 运行时崩溃\n\nIOS-swift-code顺序\n//1.import\nimport UIKit\nimport AVFoundation\n\n\nclass ViewController: UIViewController {\n    \n\t//2.声明变量\n    var player: AVAudioPlayer!\n    var totalTime = 0\n    var secondsPassed = 0\n    var timer = Timer()\n    \n    let eggTimes = [\n        &quot;Soft&quot;: 3,\n        &quot;Medium&quot;: 4,\n        &quot;Hard&quot;: 7\n    ]\n    \n\t//3.IB操作：IBOutlet和IBAction\n    @IBOutlet weak var doneLabel: UILabel!\n    \n    @IBOutlet weak var progressBar: UIProgressView!\n    \n    @IBAction func hardnessSelector(_ sender: UIButton) {\n        \n        let hardness = sender.currentTitle!\n        \n        timer.invalidate() //取消timer每次点击都会触发，现在仅触发1次\n        \n        progressBar.progress = 0.0\n        secondsPassed = 0\n        \n        doneLabel.text = hardness\n        \n        totalTime = eggTimes[hardness]!\n        \n        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)\n        \n    }\n    \n\t//4.function定义\n    @objc func updateTimer(){\n        if secondsPassed &lt; totalTime {\n            \n            secondsPassed += 1\n            \n            progressBar.progress = Float(secondsPassed) / Float(totalTime)\n            print(Float(secondsPassed) / Float(totalTime))\n            \n            \n        } else {\n            timer.invalidate() // 停止定时器\n            doneLabel.text = &quot;Done.&quot; // 更新标签文字\n            playSound()\n        }\n    }\n    \n//    播放声音\n    func playSound() {\n            let url = Bundle.main.url(forResource: &quot;alarm_sound&quot;, withExtension: &quot;mp3&quot;)\n            player = try! AVAudioPlayer(contentsOf: url!)\n            player.play()\n                    \n        }\n    \n\n}\n\n\n"},{"title":"如何在xcode测试-发起new playground",
"url":"/blog/swift-test-playground/",
"date":"2024-11-13",
"headings":[{"level":1,"id":"fang-shi-yi-playground","permalink":"https://linxz.online/blog/swift-test-playground/#fang-shi-yi-playground","title":"方式一：playground","children":[]},{"level":1,"id":"fang-shi-er-command-line-tool","permalink":"https://linxz.online/blog/swift-test-playground/#fang-shi-er-command-line-tool","title":"方式二：command line tool","children":[]}],
"body":"方式一：playground\nfile - new - playground\n快捷键：\ncmd + option + shift + n\n方式二：command line tool\ncmd + shift + n 新建project\n选择macos - command line tool\n就可以在main上测试了。\n我倾向于这种方法，因为可以用快捷键cmd+r运行。\n"},{"title":"变量名命名的三种方法",
"url":"/blog/variable-all/",
"date":"2024-11-13",
"headings":[],
"body":"camelCase\nkebab-case\nsnake_case\n\n"},{"title":"xcode如何动态更换图片？- imageLiteral",
"url":"/blog/xcode-imageliteral/",
"date":"2024-11-13",
"headings":[],
"body":"在Xcode的最新版本中，#imageLiteral的自动补全功能可能有所变化，导致无法直接插入图片字面量。您可以尝试以下方法：\n\n\n手动输入：在代码中输入#imageLiteral(，然后按下回车键，Xcode会插入一个占位符，双击该占位符即可选择项目中的图片资源。 (Stack Overflow)\n\n\n使用UIImage初始化方法：直接使用UIImage的初始化方法加载图片，例如：\n\n\nlet image = UIImage(named: &quot;image_name&quot;)\n\n或者：\nlet image = UIImage(imageLiteralResourceName: &quot;DiceOne&quot;)\n\n其中，&quot;image_name&quot;是您在项目资源中添加的图片名称。\n请确保您已将所需的图片资源添加到项目的Assets.xcassets中，以便在代码中正确引用。\n"},{"title":"xcode快捷键",
"url":"/blog/xcode-shortcut/",
"date":"2024-11-13",
"headings":[{"level":1,"id":"yun-xing-xiang-mu","permalink":"https://linxz.online/blog/xcode-shortcut/#yun-xing-xiang-mu","title":"运行项目：","children":[]},{"level":1,"id":"ting-zhi-xiang-mu","permalink":"https://linxz.online/blog/xcode-shortcut/#ting-zhi-xiang-mu","title":"停止项目：","children":[]},{"level":1,"id":"buildxiang-mu","permalink":"https://linxz.online/blog/xcode-shortcut/#buildxiang-mu","title":"build项目：","children":[]},{"level":1,"id":"fu-zhi-zheng-xing","permalink":"https://linxz.online/blog/xcode-shortcut/#fu-zhi-zheng-xing","title":"复制整行：","children":[]},{"level":1,"id":"xuan-zhong-duo-xing","permalink":"https://linxz.online/blog/xcode-shortcut/#xuan-zhong-duo-xing","title":"选中多行：","children":[]},{"level":1,"id":"zhong-xin-indentsuo-jin-diao-zheng-ge-shi","permalink":"https://linxz.online/blog/xcode-shortcut/#zhong-xin-indentsuo-jin-diao-zheng-ge-shi","title":"重新indent缩进,调整格式","children":[]}],
"body":"运行项目：\ncmd + r\n停止项目：\ncmd + .\nbuild项目：\ncmd + b\n复制整行：\ncmd+d\n选中多行：\ncontrol + shift + 上下\n重新indent缩进,调整格式\ncontrol + i\n"},{"title":"如何让浏览器无视缓存，强制刷新css？",
"url":"/blog/css-force-refresh/",
"date":"2024-11-12",
"headings":[],
"body":"很多浏览器会保留css缓存记录，强制刷新也没用。这个时候最简单的方法是给css文件加上版本号。\n这样一来，就骗过浏览器，认为这是一个完全不同的css文件。\n方法：\n将引入的css后面加个版本号即可，格式是?v=时间戳\n  &lt;link rel=&quot;stylesheet&quot; href=&quot;/css/tailwind-like.css?v=20241112140800&quot;&gt;\n\nv后面是时间戳。\n"},{"title":"SwiftUI介绍",
"url":"/blog/swiftui/",
"date":"2024-11-12",
"headings":[{"level":1,"id":"swiftuihe-uikit","permalink":"https://linxz.online/blog/swiftui/#swiftuihe-uikit","title":"SwiftUI和UIKit","children":[]},{"level":1,"id":"wei-shen-me-huan-zai-yong-uikit","permalink":"https://linxz.online/blog/swiftui/#wei-shen-me-huan-zai-yong-uikit","title":"为什么还在用UIKit？","children":[]},{"level":1,"id":"swiftguan-wang","permalink":"https://linxz.online/blog/swiftui/#swiftguan-wang","title":"swift官网","children":[]},{"level":1,"id":"shi-pin-jiao-cheng","permalink":"https://linxz.online/blog/swiftui/#shi-pin-jiao-cheng","title":"视频教程","children":[]}],
"body":"SwiftUI由swift语言编写，前身是Objective-C。\nSwiftUI和UIKit\nUIKit是SwiftUI的前身，2008年就有。SwiftUI是2019年才有的。\n为什么还在用UIKit？\n\nSwiftUI适用于iOS 13或更高版本，向下不兼容。\nUIKit更成熟稳定。\nUIKit旧代码维护。\n\nswift官网\n苹果官方网站\n中文内容较简单，需要看英文版\n中文翻译网站\n视频教程\nudemy付费课程-英文\nApp Brewery课程课件\n"},{"title":"xcode界面介绍",
"url":"/blog/xcode-intro/",
"date":"2024-11-12",
"headings":[{"level":1,"id":"zheng-ti-jie-gou","permalink":"https://linxz.online/blog/xcode-intro/#zheng-ti-jie-gou","title":"整体结构","children":[]},{"level":1,"id":"pei-zhi-wen-jian","permalink":"https://linxz.online/blog/xcode-intro/#pei-zhi-wen-jian","title":"配置文件","children":[]},{"level":1,"id":"tian-jia-she-ji-zu-jian","permalink":"https://linxz.online/blog/xcode-intro/#tian-jia-she-ji-zu-jian","title":"添加设计组件","children":[]},{"level":1,"id":"xiu-gai-she-ji-zu-jian-de-shu-xing","permalink":"https://linxz.online/blog/xcode-intro/#xiu-gai-she-ji-zu-jian-de-shu-xing","title":"修改设计组件的属性","children":[]},{"level":1,"id":"she-ji-zu-jian-tu-ceng-jie-gou","permalink":"https://linxz.online/blog/xcode-intro/#she-ji-zu-jian-tu-ceng-jie-gou","title":"设计组件图层结构","children":[]},{"level":1,"id":"debugchuang-kou","permalink":"https://linxz.online/blog/xcode-intro/#debugchuang-kou","title":"debug窗口","children":[]},{"level":1,"id":"xcodekuai-jie-jian","permalink":"https://linxz.online/blog/xcode-intro/#xcodekuai-jie-jian","title":"xcode快捷键","children":[]},{"level":1,"id":"launchscreenhe-mainde-qu-bie","permalink":"https://linxz.online/blog/xcode-intro/#launchscreenhe-mainde-qu-bie","title":"# LaunchScreen和Main的区别","children":[]},{"level":1,"id":"ru-he-ba-shou-ji-zhong-xin-ju-zhong","permalink":"https://linxz.online/blog/xcode-intro/#ru-he-ba-shou-ji-zhong-xin-ju-zhong","title":"如何把手机重新居中？","children":[]},{"level":1,"id":"yan-se-ling-gan","permalink":"https://linxz.online/blog/xcode-intro/#yan-se-ling-gan","title":"颜色灵感","children":[]},{"level":1,"id":"ru-he-que-ding-yuan-su-de-zuo-biao","permalink":"https://linxz.online/blog/xcode-intro/#ru-he-que-ding-yuan-su-de-zuo-biao","title":"如何确定元素的坐标","children":[]},{"level":1,"id":"ru-he-dao-ru-tu-pian","permalink":"https://linxz.online/blog/xcode-intro/#ru-he-dao-ru-tu-pian","title":"如何导入图片","children":[{"level":2,"id":"1x-2x-3xxiang-su-shi-sha-yi-si","permalink":"https://linxz.online/blog/xcode-intro/#1x-2x-3xxiang-su-shi-sha-yi-si","title":"1x 2x 3x像素是啥意思","children":[]}]},{"level":1,"id":"app-iconsheng-cheng","permalink":"https://linxz.online/blog/xcode-intro/#app-iconsheng-cheng","title":"app icon生成","children":[]},{"level":1,"id":"yu-lan","permalink":"https://linxz.online/blog/xcode-intro/#yu-lan","title":"预览","children":[{"level":2,"id":"dian-nao-yu-lan","permalink":"https://linxz.online/blog/xcode-intro/#dian-nao-yu-lan","title":"电脑预览","children":[]},{"level":2,"id":"shou-ji-yu-lan","permalink":"https://linxz.online/blog/xcode-intro/#shou-ji-yu-lan","title":"手机预览","children":[{"level":3,"id":"xin-ren-she-bei","permalink":"https://linxz.online/blog/xcode-intro/#xin-ren-she-bei","title":"信任设备","children":[]}]}]},{"level":1,"id":"xcodede-blockxian-shi-swift","permalink":"https://linxz.online/blog/xcode-intro/#xcodede-blockxian-shi-swift","title":"xcode的block显示-swift","children":[]},{"level":1,"id":"xcodede-cuo-wu-error","permalink":"https://linxz.online/blog/xcode-intro/#xcodede-cuo-wu-error","title":"xcode的错误Error","children":[{"level":2,"id":"no-assistant-results","permalink":"https://linxz.online/blog/xcode-intro/#no-assistant-results","title":"no assistant results","children":[]}]}],
"body":"xcode界面介绍\n整体结构\n\n配置文件\n左上角是项目配置文件。\nGeneral可以设置：\n\n最低使用的ios版本\n是否随着手机上下摆动\n\n\n添加设计组件\n比如添加一个label\n\n修改设计组件的属性\n右侧菜单栏是inspector，负责修改设计组件的属性。\n比如，修改label的颜色。\n如果需要修改label在主屏幕的位置，点击右侧三角形size inspector，调整x, y轴的位置。\n\n设计组件图层结构\n中间的竖框是document outlines，显示的是整体设计组件的结构。\n\ndebug窗口\n最下层窗口\ncmd + shift + c 激活\ncmd + shift + y 隐藏\n也可以通过view-debug area激活。\nxcode快捷键\n\n参考网页\n# LaunchScreen和Main的区别\nLaunchScreen是开屏画面，常用于展示Logo;\nMain是主要的App界面。\n如何把手机重新居中？\n双击View Controller Scene。\n\n颜色灵感\ncolorhunt\n如何确定元素的坐标\nx轴是离左边框多远，y轴是离上边框多远。\n\n宽和高是元素本身的大小。\n可以参考iPhone的尺寸确定位置。\n如何导入图片\n找到左边菜单Assets文件夹，将图片拖入里面。\n\n1x 2x 3x像素是啥意思\n倍数越大，像素越多，越清晰。\n\n苹果来决定你的图片应该呈现多大，但是你上传的尺寸是显示时的最大尺寸。\n\n怎么生成不同尺寸的图片？\nappicon\napp icon生成\n只需要用上面提到的appicon网站，选择需要的app icon尺寸就可以自动生成了。\nappicon-icon\n方法，你只需要上传一张1024x1024的图片即可。\n如何生成这样的图片，可以用canva。\ncanva英文网生成一张1024x1024的画布，然后随意发挥吧。\n通过appicon网站，将生成的app icon保存下来，只需要勾选iPhone和iPad即可。\n在原项目的AppIcon文件夹右键，选择show in Finder，把下载来的文件拖进去即可。\n预览\n电脑预览\n最上面选择合适的手机尺寸，单机左上角播放按钮。\n\n手机预览\n\n查看xcode和手机的版本是否兼容。总原则是两者版本尽量都高一点。\n登记开发者账号。在settings-accounts，加入自己的苹果账号。\napp签名。在文档配置页，signing &amp; Capability 里面，选择自己的账号即可。\n\n\n\nUSB连接你的iPhone\n\n首先需要在手机打开开发者模式。Settings -&gt; Privacy &amp; Security，点击启动开发者模式。\n选择我的iPhone，点击左上角播放按钮，就会自动进入build流程。\n注意，如果一直提示要打开开发者模式，需要拔掉USB插头查新插。\n信任设备\n手机打开通用-VPN与设备管理，然后选择信任开发者就行。\n故障排除，查找trouble shooting关键词。\n\n无线连接\n\n首先确保有线连接完成，xcode有了你手机的资料，才可以用无线连接。\n无线连接方式应该是默认连接的，USB线拔掉后可以试一下，如果不行，可以遵照以下步骤：\n顶部菜单-window-Devices and Simulators，在connect via network处打钩即可。\n\nxcode的block显示-swift\n如果你双击大括号结束的右边，就会高亮左边的大括号。\n\n如果双击大括号的左边，就会选择所有大括号内的内容。\n\nxcode的错误Error\nno assistant results\n错误表现：\nxcode main无法连接代码，错误显示no assistant results。\n通常，退出xcode，重新打开项目即可。\nstackoverflow\n"},{"title":"收集漂亮字体",
"url":"/blog/font/",
"date":"2024-11-11",
"headings":[{"level":1,"id":"ping-fang-zi-ti","permalink":"https://linxz.online/blog/font/#ping-fang-zi-ti","title":"苹方字体？","children":[]}],
"body":"苹方字体？\n风格简约，适合说明文档。\n\n"},{"title":"治疗脚气、脚藓、真菌感染",
"url":"/blog/foot-infection/",
"date":"2024-11-11",
"headings":[{"level":1,"id":"nei-rong-lian-jie","permalink":"https://linxz.online/blog/foot-infection/#nei-rong-lian-jie","title":"内容链接","children":[]},{"level":1,"id":"yao-wu-zhi-shi","permalink":"https://linxz.online/blog/foot-infection/#yao-wu-zhi-shi","title":"药物知识","children":[{"level":2,"id":"bing-xi-e-lei","permalink":"https://linxz.online/blog/foot-infection/#bing-xi-e-lei","title":"丙烯胺类：","children":[]},{"level":2,"id":"zuo-lei","permalink":"https://linxz.online/blog/foot-infection/#zuo-lei","title":"唑类：","children":[]},{"level":2,"id":"bi-ge-tong-lei","permalink":"https://linxz.online/blog/foot-infection/#bi-ge-tong-lei","title":"吡咯酮类：","children":[]}]},{"level":1,"id":"qi-ta-hu-li-zhi-shi","permalink":"https://linxz.online/blog/foot-infection/#qi-ta-hu-li-zhi-shi","title":"其他护理知识","children":[]}],
"body":"最近脚趾缝有破皮的现象，以前似乎也发生过一回，在医院医生会剪掉一块皮做化验，结果是「真菌感染」，于是我就搜了一下脚气、真菌感染有关的内容。\n内容链接\n丁香医生\n药物知识\n丙烯胺类：\n盐酸特比萘芬 - 目前杀菌效果最好\n布替萘芬\n唑类：\n达克宁（软膏属于唑类药物，药效不行，但它也有除盐酸特比萘芬的喷雾）\n吡咯酮类：\n效果也不好\n其他护理知识\n\n洗脚时要洗净，尤其是趾缝，洗完后及时擦干。\n鞋子要透气。\n容易出脚汗的可以用止汗走珠、止汗喷雾等止汗剂。\n\n"},{"title":"Java如何切换多JDK环境",
"url":"/blog/java-multi-jdks/",
"date":"2024-11-11",
"headings":[{"level":1,"id":"an-zhuang","permalink":"https://linxz.online/blog/java-multi-jdks/#an-zhuang","title":"安装","children":[]},{"level":1,"id":"jiang-jenvlu-jing-fang-dao-zshpei-zhi-li-mian","permalink":"https://linxz.online/blog/java-multi-jdks/#jiang-jenvlu-jing-fang-dao-zshpei-zhi-li-mian","title":"将jenv路径放到zsh配置里面","children":[]},{"level":1,"id":"jiang-jdkan-zhuang-dao-jenvzhong","permalink":"https://linxz.online/blog/java-multi-jdks/#jiang-jdkan-zhuang-dao-jenvzhong","title":"将JDK安装到jenv中","children":[]},{"level":1,"id":"qie-huan-cheng-java-17ban-ben","permalink":"https://linxz.online/blog/java-multi-jdks/#qie-huan-cheng-java-17ban-ben","title":"切换成Java 17版本：","children":[]},{"level":1,"id":"ru-guo-zhi-shi-xiang-dang-qian-mu-lu-qie-huan-cheng-java17","permalink":"https://linxz.online/blog/java-multi-jdks/#ru-guo-zhi-shi-xiang-dang-qian-mu-lu-qie-huan-cheng-java17","title":"如果只是想当前目录切换成Java17：","children":[]},{"level":1,"id":"yan-zheng-javaban-ben","permalink":"https://linxz.online/blog/java-multi-jdks/#yan-zheng-javaban-ben","title":"验证Java版本","children":[]}],
"body":"Java如何切换多JDK环境——安装jenv\n安装\nbrew install jenv\n\n将jenv路径放到zsh配置里面\nexport PATH=&quot;$HOME/.jenv/bin:$PATH&quot;\neval &quot;$(jenv init -)&quot;\n\n更新\nsource ~/.zshrc   # 如果你用的是 zsh\n\n将JDK安装到jenv中\njenv add /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home\n\n切换成Java 17版本：\njenv global 17.0.13\n\n如果只是想当前目录切换成Java17：\njenv local 17.0.13\n\n验证Java版本\njava -version\n\n"},{"title":"React Native介绍",
"url":"/blog/react-native/",
"date":"2024-11-11",
"headings":[{"level":1,"id":"yi-dong-appde-kai-fa-mo-shi","permalink":"https://linxz.online/blog/react-native/#yi-dong-appde-kai-fa-mo-shi","title":"移动App的开发模式","children":[{"level":2,"id":"yuan-sheng-vs-hun-he","permalink":"https://linxz.online/blog/react-native/#yuan-sheng-vs-hun-he","title":"原生 VS 混合","children":[]}]},{"level":1,"id":"kuang-jia","permalink":"https://linxz.online/blog/react-native/#kuang-jia","title":"框架","children":[{"level":2,"id":"expo","permalink":"https://linxz.online/blog/react-native/#expo","title":"Expo","children":[]}]},{"level":1,"id":"jing-zheng-dui-shou","permalink":"https://linxz.online/blog/react-native/#jing-zheng-dui-shou","title":"竞争对手","children":[{"level":2,"id":"react-native-weex-flutterdui-bi","permalink":"https://linxz.online/blog/react-native/#react-native-weex-flutterdui-bi","title":"React Native, Weex, Flutter对比","children":[]}]},{"level":1,"id":"expohuan-jing-an-zhuang","permalink":"https://linxz.online/blog/react-native/#expohuan-jing-an-zhuang","title":"Expo环境安装","children":[{"level":2,"id":"shi-yong-expoan-zhuang-xiang-mu","permalink":"https://linxz.online/blog/react-native/#shi-yong-expoan-zhuang-xiang-mu","title":"使用Expo安装项目","children":[]},{"level":2,"id":"yu-lan","permalink":"https://linxz.online/blog/react-native/#yu-lan","title":"预览","children":[{"level":3,"id":"an-zhuo-mo-ni-qi-yu-lan","permalink":"https://linxz.online/blog/react-native/#an-zhuo-mo-ni-qi-yu-lan","title":"安卓模拟器预览","children":[]},{"level":3,"id":"iphonemo-ni-qi-yu-lan","permalink":"https://linxz.online/blog/react-native/#iphonemo-ni-qi-yu-lan","title":"iPhone模拟器预览","children":[]}]},{"level":2,"id":"watchmancuo-wu","permalink":"https://linxz.online/blog/react-native/#watchmancuo-wu","title":"watchman错误","children":[]}]},{"level":1,"id":"react-nativeji-chu-huan-jing-da-jian","permalink":"https://linxz.online/blog/react-native/#react-nativeji-chu-huan-jing-da-jian","title":"React native基础环境搭建","children":[]},{"level":1,"id":"an-zhuang-node-js","permalink":"https://linxz.online/blog/react-native/#an-zhuang-node-js","title":"安装Node.js","children":[]},{"level":1,"id":"pei-zhi-guo-nei-npmzi-yuan-jing-xiang","permalink":"https://linxz.online/blog/react-native/#pei-zhi-guo-nei-npmzi-yuan-jing-xiang","title":"配置国内npm资源镜像","children":[]},{"level":1,"id":"an-zhuang-yarn","permalink":"https://linxz.online/blog/react-native/#an-zhuang-yarn","title":"安装yarn","children":[]},{"level":1,"id":"an-zhuang-react-nativejiao-shou-jia","permalink":"https://linxz.online/blog/react-native/#an-zhuang-react-nativejiao-shou-jia","title":"安装React Native脚手架","children":[]},{"level":1,"id":"wei-shen-me-xu-yao-da-jian-san-chong-huan-jing","permalink":"https://linxz.online/blog/react-native/#wei-shen-me-xu-yao-da-jian-san-chong-huan-jing","title":"为什么需要搭建三种环境","children":[]},{"level":1,"id":"da-jian-androidhuan-jing","permalink":"https://linxz.online/blog/react-native/#da-jian-androidhuan-jing","title":"搭建Android环境","children":[{"level":2,"id":"an-zhuang-jdk","permalink":"https://linxz.online/blog/react-native/#an-zhuang-jdk","title":"安装JDK","children":[]},{"level":2,"id":"an-zhuang-android-studio","permalink":"https://linxz.online/blog/react-native/#an-zhuang-android-studio","title":"安装Android Studio","children":[]},{"level":2,"id":"an-zhuang-android-sdk","permalink":"https://linxz.online/blog/react-native/#an-zhuang-android-sdk","title":"安装Android SDK","children":[]},{"level":2,"id":"pei-zhi-huan-jing-bian-liang","permalink":"https://linxz.online/blog/react-native/#pei-zhi-huan-jing-bian-liang","title":"配置环境变量","children":[{"level":3,"id":"pei-zhi-android-homehuan-jing-bian-liang","permalink":"https://linxz.online/blog/react-native/#pei-zhi-android-homehuan-jing-bian-liang","title":"配置ANDROID_HOME环境变量","children":[]},{"level":3,"id":"cha-kan-ming-ling-shi-fou-sheng-xiao","permalink":"https://linxz.online/blog/react-native/#cha-kan-ming-ling-shi-fou-sheng-xiao","title":"查看命令是否生效","children":[]},{"level":3,"id":"shan-chu-jiu-ban-ben-de-react-native-cli","permalink":"https://linxz.online/blog/react-native/#shan-chu-jiu-ban-ben-de-react-native-cli","title":"删除旧版本的react-native cli","children":[]},{"level":3,"id":"xin-jian-xiang-mu","permalink":"https://linxz.online/blog/react-native/#xin-jian-xiang-mu","title":"新建项目","children":[]},{"level":3,"id":"to-many-filescuo-wu","permalink":"https://linxz.online/blog/react-native/#to-many-filescuo-wu","title":"to many files错误","children":[]},{"level":3,"id":"gradlexia-zai-cuo-wu","permalink":"https://linxz.online/blog/react-native/#gradlexia-zai-cuo-wu","title":"gradle下载错误","children":[]},{"level":3,"id":"tian-jia-dai-li-she-zhi","permalink":"https://linxz.online/blog/react-native/#tian-jia-dai-li-she-zhi","title":"添加代理设置","children":[]}]},{"level":2,"id":"an-zhuang-vscodecha-jian","permalink":"https://linxz.online/blog/react-native/#an-zhuang-vscodecha-jian","title":"安装vscode插件","children":[]}]},{"level":1,"id":"da-jian-ioshuan-jing","permalink":"https://linxz.online/blog/react-native/#da-jian-ioshuan-jing","title":"搭建iOS环境","children":[{"level":2,"id":"an-zhuang-watchman","permalink":"https://linxz.online/blog/react-native/#an-zhuang-watchman","title":"安装Watchman","children":[]},{"level":2,"id":"an-zhuang-xcode","permalink":"https://linxz.online/blog/react-native/#an-zhuang-xcode","title":"安装Xcode","children":[]},{"level":2,"id":"an-zhuang-cocoapods","permalink":"https://linxz.online/blog/react-native/#an-zhuang-cocoapods","title":"安装CocoaPods","children":[]}]},{"level":1,"id":"chu-shi-hua-react-nativexiang-mu","permalink":"https://linxz.online/blog/react-native/#chu-shi-hua-react-nativexiang-mu","title":"初始化React Native项目","children":[{"level":2,"id":"chuang-jian-xiang-mu","permalink":"https://linxz.online/blog/react-native/#chuang-jian-xiang-mu","title":"创建项目","children":[{"level":3,"id":"chu-shi-hua-xiang-mu","permalink":"https://linxz.online/blog/react-native/#chu-shi-hua-xiang-mu","title":"初始化项目","children":[]},{"level":3,"id":"jin-ru-xiang-mu","permalink":"https://linxz.online/blog/react-native/#jin-ru-xiang-mu","title":"进入项目","children":[]},{"level":3,"id":"yun-xing-xiang-mu","permalink":"https://linxz.online/blog/react-native/#yun-xing-xiang-mu","title":"运行项目","children":[]}]},{"level":2,"id":"an-zhuang-vs-codecha-jian","permalink":"https://linxz.online/blog/react-native/#an-zhuang-vs-codecha-jian","title":"安装VS CODE插件","children":[]},{"level":2,"id":"diao-shi-gong-ju","permalink":"https://linxz.online/blog/react-native/#diao-shi-gong-ju","title":"调试工具","children":[]}]},{"level":1,"id":"wang-luo-shi-pin-jiao-cheng","permalink":"https://linxz.online/blog/react-native/#wang-luo-shi-pin-jiao-cheng","title":"网络视频教程","children":[]}],
"body":"2015年Facebook提出的开源框架。\n允许通过React语法，开发iOS和Android原生应用\n移动App的开发模式\n原生 VS 混合\n\n\n官网\n中文网\nGithub\n框架\n\n\nExpo\n\n简单\n\n\n\nReact native\n\n原生\n需要配置的条件有点多\n\n\n\nReact native 和 Expo的关系，相当于React和nextjs的关系，是在原有基础上，继续封装。\nExpo\nExpo官网\n竞争对手\n\nFlutter（Google推出）\n\nhttps://flutter.dev/\nhttps://flutter.cn/\n\n\nUniapp（基于Vue.js，推荐）\nWeex（基于Vue.js，阿里出品，很少维护）\nXamarin\nCordova\nIonic\nNativeScript\n\nReact Native, Weex, Flutter对比\n\nExpo环境安装\nReact Native Udemy 课件\n推荐使用expo来安装react Native。\n这是一个第三方工具，但是完全免费。\n封装许多功能，让你少写很多代码。\n随时都可以转换成原生。\n为什么使用expo？\n\nReact Native官网环境搭建 - React Native中文网\nReact Native英文官网\n使用Expo安装项目\n之所以用pnpx，就是要用到pnpm，这个在国内下包比较快，而且有处理过程。\n另外，如果下载速度慢，需要切换到国外代理。\npnpx create-expo-app RNCourse --template blank\n\n注意，如果不用blank的模版，会包括typescript。我们暂时不想要这么复杂。\n预览\n下载Expo Go这个App\nnpm start启动应用，出现一个二维码。\n如果是苹果手机，打开相机扫描二维码，选择从Expo Go打开链接。\n安卓模拟器预览\n选择支持play store的模拟器。按a即可开启预览。\niPhone模拟器预览\n按i即可。\nwatchman错误\n新建.watchmanconfig文件，输入\n{\n    &quot;root&quot;: true\n}\n\n\n重新启动watchman\nwatchman shutdown-server \npnpm start --reset-cache\n\n参考答案\nReact native基础环境搭建\n因为React Native还在测试阶段，还没有1.0版本，所以经常会变，建议参考官方教程：\n官方搭建环境教程\n安装Node.js\n版本必须&gt;=12\n配置国内npm资源镜像\nnpm config set registry https://registry.npm.taobao.org\n\n安装yarn\nfacebook推出的\nnpm install -g yarn\n\n安装React Native脚手架\nnpm install -g react-native-cli\n\n为什么需要搭建三种环境\n注意，Windows下只能搭建Android开发环境\n\n搭建Android环境\n安装JDK\n参考Java JDK的安装\n目前不支持高于Java17的JDK版本\n更新：直接按照官方教程用Homebrew安装。\nbrew install --cask zulu@17\n\n# Get path to where cask was installed to double-click installer\nbrew info --cask zulu@17\n\n安装完需要进到文件夹双击安装包，进行java17的安装。\n安装Android Studio\n下载Android Studio\n这是下载官网,需要科学上网。\n安装完占8个G的空间\n安装Android SDK\n虽然Android Studio会安装最新的SDK，但是React Native需要Android 14的SDK\n配置环境变量\n通过setting-Languages &amp; Framework-Android SDK查看sdk的位置：\n/Users/lxz/Library/Android/sdk\n\n配置ANDROID_HOME环境变量\n# 如果你不是通过Android Studio安装的sdk，则其路径可能不同，请自行确定清楚\nexport ANDROID_HOME=$HOME/Library/Android/sdk\nexport PATH=$PATH:$ANDROID_HOME/emulator\nexport PATH=$PATH:$ANDROID_HOME/platform-tools\nsource $HOME/.zshrc\n\n查看命令是否生效\necho $ANDROID_HOME\n\n删除旧版本的react-native cli\nnpm uninstall -g react-native-cli @react-native-community/cli\n\n新建项目\nnpx @react-native-community/cli@latest init AwesomeProject\n\n最新版本可能失效，参考cli官方版本。\n如果遇到latest错误，需要指定版本：\nnpx @react-native-community/cli@latest init MyApp --version 0.75.2\n\n官网参考\nto many files错误\n需要在根目录创建一个.vscode文件夹，再创建settings.json文件，输入以下配置：\n{\n    &quot;files.watcherExclude&quot;: {\n      &quot;**/node_modules/**&quot;: true,\n      &quot;**/dist/**&quot;: true\n    }\n  }\n\n\ngradle下载错误\n在android文件夹下，找到build.gradle，加上阿里源：\n    repositories {\n        maven { url &#39;https://maven.aliyun.com/repository/gradle-plugin&#39; }\n        google()\n        mavenCentral()\n    }\n\n添加代理设置\n找到gradle.properties文件，添加一下代码进去：\n# 添加代理设置\nsystemProp.http.proxyHost=127.0.0.1\nsystemProp.http.proxyPort=1087  \nsystemProp.https.proxyHost=127.0.0.1\nsystemProp.https.proxyPort=1087\n\n\n安装vscode插件\nES7 React/Redux/GraphQL/React-Native\n搭建iOS环境\n安装Watchman\nFacebook推出的，监控文件变化的工具。\n安装Xcode\n安装CocoaPods\n初始化React Native项目\n创建项目\n初始化项目\nreact-native init &lt;myproject&gt;\n\n进入项目\ncd myproject\n\n运行项目\nAndorid项目直接运行：\nyarn android\n\niOS项目需要先安装pod依赖，再运行\ncd ios &amp;&amp; pod install &amp;&amp; cd ../\nyarn ios\n\n安装VS CODE插件\n调试工具\n网络视频教程\n小马教程\n拉勾教育\n"},{"title":"uni-app介绍",
"url":"/blog/uni-app/",
"date":"2024-11-11",
"headings":[{"level":1,"id":"uni-appji-shu-zhan","permalink":"https://linxz.online/blog/uni-app/#uni-appji-shu-zhan","title":"uni-app技术栈","children":[]},{"level":1,"id":"shi-pin-jiao-cheng","permalink":"https://linxz.online/blog/uni-app/#shi-pin-jiao-cheng","title":"视频教程","children":[]},{"level":1,"id":"uni-apphe-yuan-sheng-xiao-cheng-xu-qu-bie","permalink":"https://linxz.online/blog/uni-app/#uni-apphe-yuan-sheng-xiao-cheng-xu-qu-bie","title":"uni-app和原生小程序区别","children":[{"level":2,"id":"shu-xing-bang-ding","permalink":"https://linxz.online/blog/uni-app/#shu-xing-bang-ding","title":"属性绑定","children":[]},{"level":2,"id":"shi-jian-bang-ding","permalink":"https://linxz.online/blog/uni-app/#shi-jian-bang-ding","title":"事件绑定","children":[]},{"level":2,"id":"zhi-chi-vue-chang-yong-zhi-ling","permalink":"https://linxz.online/blog/uni-app/#zhi-chi-vue-chang-yong-zhi-ling","title":"支持Vue 常用指令","children":[]},{"level":2,"id":"diao-yong-jie-kou-neng-li","permalink":"https://linxz.online/blog/uni-app/#diao-yong-jie-kou-neng-li","title":"调用接口能力","children":[]}]}],
"body":"开发移动端跨端应用。优点是支持小程序和H5。\nuni-app官网\n官方示例代码\nuni-app技术栈\n\n视频教程\n黑马教程\n课件\n咸虾米uni-app教程\n咸虾米项目\n咸虾米免费api接口\nuni-app和原生小程序区别\n每个页面是.vue文件，使用Vue.js规范。而不是.wxml文件。\n属性绑定\nsrc=&quot;{{url}}&quot; 升级成 :src=&quot;url&quot;\n事件绑定\nbindtap=&quot;eventName&quot; 升级成 @tap=&quot;eventName&quot;，支持（）传参。\n支持Vue 常用指令\nv-for, v-if, v-show, v-model等。\n调用接口能力\n建议前缀wx替换成uni，支持多端开发。\n"},{"title":"npm命令说明",
"url":"/blog/npm/",
"date":"2024-11-10",
"headings":[{"level":1,"id":"yun-yong-npman-zhuang","permalink":"https://linxz.online/blog/npm/#yun-yong-npman-zhuang","title":"运用npm安装","children":[{"level":2,"id":"yun-yong-yarnan-zhuang","permalink":"https://linxz.online/blog/npm/#yun-yong-yarnan-zhuang","title":"运用yarn安装","children":[]},{"level":2,"id":"yun-yong-cnpman-zhuang","permalink":"https://linxz.online/blog/npm/#yun-yong-cnpman-zhuang","title":"运用cnpm安装","children":[]}]},{"level":1,"id":"dde-yi-si","permalink":"https://linxz.online/blog/npm/#dde-yi-si","title":"-D的意思","children":[]}],
"body":"npm是JavaScript的包管理工具，yarn也是类似的。\n运用npm安装\nnpm install &lt;package&gt;\n\nor\nnpm i &lt;package&gt;\n\n运用yarn安装\nyarn add &lt;package&gt;\n\n运用cnpm安装\n如果npm和yarn因为网络环境不好，安装速度过慢，可以用国内的包管理工作cnpm，用法与npm一样。\n-D的意思\n简单来说，就是只将包安装在开发环境，一般用于只会用于开发环境的包，比如实时预览开发效果功能的包。\n\n\nnpm install -D 或 npm install --save-dev：会将依赖包添加到 devDependencies 中，适合开发环境使用的工具或库（如测试工具、打包工具等）。在生产环境中执行 npm install --production 时，这些依赖不会被安装。\n\n\nnpm install （不加 -D）：会将依赖包添加到 dependencies 中，适用于生产环境和开发环境都需要的库。无论是否指定 --production，生产环境都会安装这些依赖。\n\n\n"},{"title":"各编程语言的字符串String",
"url":"/blog/all-string/",
"date":"2024-11-08",
"headings":[{"level":1,"id":"rustde-string","permalink":"https://linxz.online/blog/all-string/#rustde-string","title":"Rust的String","children":[{"level":2,"id":"jing-tai-fang-shi","permalink":"https://linxz.online/blog/all-string/#jing-tai-fang-shi","title":"静态方式","children":[]},{"level":2,"id":"dong-tai-fang-shi","permalink":"https://linxz.online/blog/all-string/#dong-tai-fang-shi","title":"动态方式","children":[]}]},{"level":1,"id":"pythonhe-javascriptde-string","permalink":"https://linxz.online/blog/all-string/#pythonhe-javascriptde-string","title":"Python和JavaScript的String","children":[]},{"level":1,"id":"javade-string","permalink":"https://linxz.online/blog/all-string/#javade-string","title":"Java的String","children":[{"level":2,"id":"bu-ke-bian-xing","permalink":"https://linxz.online/blog/all-string/#bu-ke-bian-xing","title":"不可变性","children":[{"level":3,"id":"concatfang-fa","permalink":"https://linxz.online/blog/all-string/#concatfang-fa","title":"concat方法","children":[]},{"level":3,"id":"yun-suan-fu","permalink":"https://linxz.online/blog/all-string/#yun-suan-fu","title":"+运算符","children":[]}]},{"level":2,"id":"zi-fu-chuan-chang-liang-chi","permalink":"https://linxz.online/blog/all-string/#zi-fu-chuan-chang-liang-chi","title":"字符串常量池","children":[]},{"level":2,"id":"zi-fu-chuan-bi-jiao","permalink":"https://linxz.online/blog/all-string/#zi-fu-chuan-bi-jiao","title":"字符串比较","children":[]},{"level":2,"id":"zi-fu-chuan-bian-liang","permalink":"https://linxz.online/blog/all-string/#zi-fu-chuan-bian-liang","title":"字符串+变量","children":[]},{"level":2,"id":"zi-fu-chuan-fen-ge","permalink":"https://linxz.online/blog/all-string/#zi-fu-chuan-fen-ge","title":"字符串分割","children":[]},{"level":2,"id":"zi-fu-chuan-zhuan-cheng-int","permalink":"https://linxz.online/blog/all-string/#zi-fu-chuan-zhuan-cheng-int","title":"字符串转成int","children":[]}]}],
"body":"Rust的String\nRust没有专门的字符串基本类型，但 字符串切片(&amp;str)和字符串(String) 在Rust中广泛使用：\n静态方式\n字符串切片（&amp;str）：不可变的字符串类型，通常用于存储静态或引用字符串。\nlet greeting: &amp;str = &quot;Hello, Rust!&quot;;\n\n动态方式\n字符串（String）：可变的字符串类型，用于动态生成和修改的字符串内容。\nlet mut name = String::from(&quot;Rustacean&quot;);\nname.push_str(&quot;!&quot;);\n\nPython和JavaScript的String\n这两个编程语言，String都是一种基本数据类型，没有啥讨论的，用就是了。\nJava的String\n不可变性\nJava中，String对象是不可变的，利用concat方法或者+运算符进行连接。\nconcat方法\nString greeting = &quot;Hello&quot;;\ngreeting.concat(&quot;, world!&quot;); // 尝试添加&quot;, world!&quot;，但不会改变greeting\nSystem.out.println(greeting); // 输出仍然是 &quot;Hello&quot;\n\n+运算符\n注意，String和其他数据类型只能做连接运算，所以只能用+号，不能用减、乘、除号。\nString first = &quot;Hello&quot;;\nString second = &quot;World&quot;;\nString greeting = first + &quot; &quot; + second; // 生成新的字符串对象\n\n字符串常量池\n如果创建了相同的字符串字面量，Java不会在堆内存中创建新的对象，而是直接引用常量池中的现有对象，从而提高内存效率。\nString a = &quot;Hello&quot;;\nString b = &quot;Hello&quot;;\nSystem.out.println(a == b); // 输出 true，因为a和b指向同一个常量池对象\n\n字符串比较\n字符串在Java中可以用equals()方法或==操作符来比较。如果比较地址，就用==操作符；如果比较值，用equals()方法：\nString a = new String(&quot;Hello&quot;);\nString b = new String(&quot;Hello&quot;);\nSystem.out.println(a == b); // 输出 false，不同对象\nSystem.out.println(a.equals(b)); // 输出 true，内容相同\n\n字符串+变量\nJava提供String.format()方法来格式化字符串，与printf相似。\nString name = &quot;Alice&quot;;\nint age = 30;\nString formatted = String.format(&quot;Name: %s, Age: %d&quot;, name, age);\n\n也可以直接用+运算：\nString a = &quot;hello&quot;;\nString name = &quot;Alice&quot;;\nint age = 30;\nSystem.out.println(a+&quot; world,I am &quot; + name +&quot;,age is &quot;+age);\n\n字符串分割\nsplit(String regex)方法可以按指定的正则表达式将字符串拆分成数组。\nString sentence = &quot;Hello,World,Java&quot;;\nString[] words = sentence.split(&quot;,&quot;);\n\n字符串转成int\n借助Integer类。\n// string to number\nString s = &quot;123&quot;;\nint num = Integer.parseInt(s);\nSystem.out.println(num);\n\n"},{"title":"各编程语言的基本数据类型",
"url":"/blog/data-type/",
"date":"2024-11-08",
"headings":[{"level":1,"id":"ji-ben-shu-ju-lei-xing-he-yin-yong-shu-ju-lei-xing","permalink":"https://linxz.online/blog/data-type/#ji-ben-shu-ju-lei-xing-he-yin-yong-shu-ju-lei-xing","title":"基本数据类型和引用数据类型","children":[{"level":2,"id":"ji-ben-shu-ju-lei-xing-primitive","permalink":"https://linxz.online/blog/data-type/#ji-ben-shu-ju-lei-xing-primitive","title":"基本数据类型（Primitive）","children":[]},{"level":2,"id":"yin-yong-shu-ju-lei-xing-reference","permalink":"https://linxz.online/blog/data-type/#yin-yong-shu-ju-lei-xing-reference","title":"引用数据类型（Reference)","children":[]}]},{"level":1,"id":"javashu-ju-lei-xing","permalink":"https://linxz.online/blog/data-type/#javashu-ju-lei-xing","title":"Java数据类型","children":[{"level":2,"id":"zheng-xing","permalink":"https://linxz.online/blog/data-type/#zheng-xing","title":"整型","children":[]},{"level":2,"id":"fu-dian-xing","permalink":"https://linxz.online/blog/data-type/#fu-dian-xing","title":"浮点型","children":[]},{"level":2,"id":"charzi-fu-xing","permalink":"https://linxz.online/blog/data-type/#charzi-fu-xing","title":"char字符型","children":[]},{"level":2,"id":"booleanlei-xing","permalink":"https://linxz.online/blog/data-type/#booleanlei-xing","title":"boolean类型","children":[]},{"level":2,"id":"ji-ben-shu-ju-lei-xing-ji-suan","permalink":"https://linxz.online/blog/data-type/#ji-ben-shu-ju-lei-xing-ji-suan","title":"基本数据类型计算","children":[]},{"level":2,"id":"yun-suan-gui-ze","permalink":"https://linxz.online/blog/data-type/#yun-suan-gui-ze","title":"运算规则","children":[{"level":3,"id":"zi-dong-lei-xing-ti-sheng-zi-dong-shi-xian","permalink":"https://linxz.online/blog/data-type/#zi-dong-lei-xing-ti-sheng-zi-dong-shi-xian","title":"自动类型提升（自动实现）","children":[]},{"level":3,"id":"qiang-zhi-lei-xing-zhuan-huan-shou-dong-shi-xian","permalink":"https://linxz.online/blog/data-type/#qiang-zhi-lei-xing-zhuan-huan-shou-dong-shi-xian","title":"强制类型转换（手动实现）","children":[]}]}]},{"level":1,"id":"javascriptji-ben-shu-ju-lei-xing","permalink":"https://linxz.online/blog/data-type/#javascriptji-ben-shu-ju-lei-xing","title":"JavaScript基本数据类型","children":[]},{"level":1,"id":"pythonji-ben-shu-ju-lei-xing","permalink":"https://linxz.online/blog/data-type/#pythonji-ben-shu-ju-lei-xing","title":"Python基本数据类型","children":[{"level":2,"id":"qi-ta-pythonchang-yong-shu-ju-lei-xing","permalink":"https://linxz.online/blog/data-type/#qi-ta-pythonchang-yong-shu-ju-lei-xing","title":"其他Python常用数据类型","children":[]}]},{"level":1,"id":"rustde-ji-ben-shu-ju-lei-xing","permalink":"https://linxz.online/blog/data-type/#rustde-ji-ben-shu-ju-lei-xing","title":"Rust的基本数据类型","children":[]},{"level":1,"id":"swiftshu-ju-lei-xing","permalink":"https://linxz.online/blog/data-type/#swiftshu-ju-lei-xing","title":"Swift数据类型","children":[]}],
"body":"基本数据类型和引用数据类型\n基本数据类型（Primitive）\n基本数据类型是最基础的数据单位，存储的是具体的值。常见的基本数据类型包括：int, float, char, boolean等。\n基本数据类型直接存储在内存栈中，操作它们时直接访问数据的值，通常在栈上分配内存，效率较高。\n引用数据类型（Reference)\n引用数据类型存储的是数据的引用（或地址），而不是数据本身。引用数据类型的例子包括：Array, Class, Interface, String（某些语言是基本数据类型）等。\n引用数据类型在内存中存储的是对象的地址，实际数据存储在堆内存中。引用数据类型允许更多的灵活性和复杂的数据结构，但访问和操作时需要额外的内存操作（例如指针引用）。\nJava数据类型\n\nJava有8种基本数据类型:byte, short, char, int, long, float, double, boolean\n整型\nbyte short int long\nbyte(1 byte) short(2 bytes) int(4 bytes) long(8 bytes)\n￼\n一般都用int，如果int搞不定了，采用long.\n声明long类型时，需要l或者L作为后缀\nlong l1 = 123123123L\n\n浮点型\nfloat(4 byte) double(8 byte)\n定义float类型时，需要f或者F作为后缀\n定义浮点类型时，一般都用double，因为精度更高。\n￼\n浮点类型float、double的数据不适合在不容许舍入误差的金融计算领域。如果需要精确数字计算或保留指定位数的精度，需要使用BigDecimal类。\nchar字符型\n占用2个字节。\n三种形式：\n\n形式1：使用单引号(' ')括起来的单个字符。 例如：char c1 = 'a'; char c2 = '中'; char c3 = '9';\n形式2：直接使用 Unicode值来表示字符型常量：‘\\uXXXX’。其中，XXXX代表一个十六进制整数。 例如：\\u0023 表示 '#'。\n形式3：Java中还允许使用转义字符‘\\’来将其后的字符转变为特殊字符型常量。 例如：char c3 = '\\n'; // '\\n'表示换行符\n隐藏形式4： char c4 = 97，实际输出是'a'，这是ASCII码的值。\n\nboolean类型\n占用4个字节。因为true会看成1，false看成0，和int类型一样。\n只有true和false\n基本数据类型计算\n可以做运算的是7种类型，不包含boolean类型\n运算规则\n自动类型提升（自动实现）\n容量小的变量与容量大的变量运算时，容量小的自动提升成容量大的数据类型。\nbyte、short、char —&gt; int —&gt; long —&gt; float —&gt; double\n特别的：byte、short、char类型之间的变量做运算，结果是int类型。\n注意：容量大小并非指占用内存空间的大小，而是指表示数据范围的大小。\n比如，浮点型float(4 bytes）表示的数据范围比整型long(8 bytes)大。\n强制类型转换（手动实现）\n常用场景：将容量大的变量转换成容量小的。\n注意：可能有精度丢失的问题。\ndouble d1 = 12;\nint i1 = (int)d1;\nSystem.out.println(i1)\n\nJavaScript基本数据类型\n\nNumber - 数字类型，包含整数和浮点数。\nBigInt - 大整数类型，用于表示超过Number范围的整数。\nString - 字符串类型。\nBoolean - 布尔类型，只有true和false两个值。\nUndefined - 未定义类型，当变量声明但未赋值时，值为undefined。\nNull - 空值类型，表示空对象引用。\nSymbol - 符号类型，用于创建唯一的标识符。\nObject - 非基本数据类型，是引用类型，存储复杂的数据结构\n\nPython基本数据类型\n\nint - 正数\nfloat - 浮点数\nboolean - 布尔值\nstr - 字符串\nNoneType - 空值 empty_value = None\ncomplex - 复数，格式为a+bj，其中a和b是实数，j是虚数单位。\n\n其他Python常用数据类型\n\n列表（list）：用于存储多个元素的有序集合。\n\nmy_list = [1, 2, 3]\n\n\n元组(tuple)：与列表类似，但元素不可修改\n\nmy_tuple = (1, 2, 3)\n\n\n集合(set)：用于存储不重复的无须元素集合\n\nmy_set = {1, 2, 3}\n\n\n字典(dict)：用于存储键值对的数据结构\n\nmy_dict = {&#39;name&#39;: &#39;Alice&#39;, &#39;age&#39;: 30}\n\nRust的基本数据类型\n\n整型。\n\n用于存储整数，分为有符号和无符号两种，每种类型根据大小有不同的位数（8、16、32、64、128位），还有isize和usize两种根据平台大小自动调整的整型。\nlet a: i32 = 42;  // 有符号32位整数\nlet b: u64 = 123; // 无符号64位整数\n\n\n浮点型。\n\n用于存储带小数的数字，有f32和f64两种精度。\nlet x: f32 = 3.14;  // 32位浮点数\nlet y: f64 = 2.718; // 64位浮点数（默认类型）\n\n\n布尔型\n\n用于表示逻辑值，只有true和false两个值。\nlet is_active: bool = true;\n\n\n字符型（Character)\n\n用于表示单个字符，支持Unicode字符，用char表示，占4个字节。\nlet letter: char = &#39;A&#39;;\nlet emoji: char = &#39;😊&#39;;\n\n\n单元类型（Unit Type)\n\n用作空值类似物，表示空的返回值，使用()表示。\nlet unit: () = ();\n\n\n数组\n\n用于存储固定长度的同种类型数据。数组的长度是固定的，一旦定义不可更改。\nlet numbers: [i32; 3] = [1, 2, 3];\n\n\n元组(Tuple)\n\n用于存储多种类型的固定长度数据结构。\nlet person: (i32, &amp;str, bool) = (30, &quot;Alice&quot;, true);\n\nSwift数据类型\n\n整型Int\n浮点型Float\n浮点型Double\n布尔型Bool\n字符串String\n数组Array\n字典Dictionary\n\n"},{"title":"Electron介绍",
"url":"/blog/electron-intro/",
"date":"2024-11-08",
"headings":[{"level":1,"id":"electronliu-cheng-mo-xing","permalink":"https://linxz.online/blog/electron-intro/#electronliu-cheng-mo-xing","title":"Electron流程模型","children":[{"level":2,"id":"wei-shen-me-mei-you-liu-lan-qi-ye-ke-yi-yun-xing-htmlsan-jian-tao","permalink":"https://linxz.online/blog/electron-intro/#wei-shen-me-mei-you-liu-lan-qi-ye-ke-yi-yun-xing-htmlsan-jian-tao","title":"为什么没有浏览器也可以运行html三件套？","children":[]},{"level":2,"id":"yi-ge-chuang-kou-ye-mian-dui-ying-yi-ge-xuan-ran-jin-cheng","permalink":"https://linxz.online/blog/electron-intro/#yi-ge-chuang-kou-ye-mian-dui-ying-yi-ge-xuan-ran-jin-cheng","title":"一个窗口（页面）对应一个渲染进程","children":[]}]},{"level":1,"id":"electronan-zhuang","permalink":"https://linxz.online/blog/electron-intro/#electronan-zhuang","title":"Electron安装","children":[]},{"level":1,"id":"electronda-kai-kong-zhi-tai","permalink":"https://linxz.online/blog/electron-intro/#electronda-kai-kong-zhi-tai","title":"Electron打开控制台","children":[]},{"level":1,"id":"an-zhuang-nodemon","permalink":"https://linxz.online/blog/electron-intro/#an-zhuang-nodemon","title":"安装nodemon","children":[{"level":2,"id":"gai-package-json","permalink":"https://linxz.online/blog/electron-intro/#gai-package-json","title":"改package.json","children":[]}]},{"level":1,"id":"zhu-jin-cheng-main-jshe-xuan-ran-jin-cheng-render-jszhi-jian-de-tong-xin","permalink":"https://linxz.online/blog/electron-intro/#zhu-jin-cheng-main-jshe-xuan-ran-jin-cheng-render-jszhi-jian-de-tong-xin","title":"主进程main.js和渲染进程render.js之间的通信","children":[]},{"level":1,"id":"da-bao","permalink":"https://linxz.online/blog/electron-intro/#da-bao","title":"打包","children":[]},{"level":1,"id":"shi-yong-vue","permalink":"https://linxz.online/blog/electron-intro/#shi-yong-vue","title":"使用vue","children":[]},{"level":1,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/electron-intro/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"一款应用广泛的跨平台的桌面应用开发框架。\n意味着无论是windows, mac，还是linux，一套代码软件，就可以跑多个系统。\n使用html, css, js等web技术构建桌面应用程序。\n本质是结合了Node.js和Chromium，以及Native API.\nNode.js负责后台，Chromium负责前端页面，Native API负责和系统交互，比如发系统级别的通知。\nElectron流程模型\n为什么没有浏览器也可以运行html三件套？\n因为安装时已经把chromium内核安装了。等于有了浏览器环境。\n一个窗口（页面）对应一个渲染进程\n\nElectron安装\n官网安装\nElectron打开控制台\ncmd + option + i\n安装nodemon\n自动预览效果\ncnpm i nodemon -D\n\n改package.json\n  &quot;scripts&quot;: {\n    &quot;start&quot;: &quot;nodemon --exec electron .&quot;\n  },\n\n主进程main.js和渲染进程render.js之间的通信\n靠preload.js\n因为main.js有nodejs的api，比如.__dirname, process.version，但没有浏览器api，比如window, alert()。反过来，render.js也不能访问Nodejs的api，比如fs（访问文件夹）等。\npreload.js介于两者之间，位于render.js的环境中，但可以访问部分node.js的api。\n打包\ncnpm i electron-builder -D\n\n如果打包不成功，可能是网络问题，多试几次命令。或者换成代理：\n# 检查当前代理设置 \necho $http_proxy \necho $https_proxy \n# 如果需要设置代理 \nexport http_proxy=http://127.0.0.1:xxxx \nexport https_proxy=http://127.0.0.1:xxxx\n\n使用vue\n查看electron-vite教程。\n参考资料\nElectron视频教程\n"},{"title":"如何定义函数-多编程语言",
"url":"/blog/function-all/",
"date":"2024-11-08",
"headings":[{"level":1,"id":"javahan-shu","permalink":"https://linxz.online/blog/function-all/#javahan-shu","title":"Java函数","children":[]},{"level":1,"id":"rusthan-shu","permalink":"https://linxz.online/blog/function-all/#rusthan-shu","title":"Rust函数","children":[]},{"level":1,"id":"pythonhan-shu","permalink":"https://linxz.online/blog/function-all/#pythonhan-shu","title":"python函数","children":[]},{"level":1,"id":"javascripthan-shu","permalink":"https://linxz.online/blog/function-all/#javascripthan-shu","title":"JavaScript函数","children":[]},{"level":1,"id":"swifthan-shu","permalink":"https://linxz.online/blog/function-all/#swifthan-shu","title":"swift函数","children":[]},{"level":1,"id":"wei-shen-me-javahe-rustde-dai-ma-geng-fu-za","permalink":"https://linxz.online/blog/function-all/#wei-shen-me-javahe-rustde-dai-ma-geng-fu-za","title":"为什么Java和Rust的代码更复杂？","children":[{"level":2,"id":"bian-yi-xing-he-jie-shi-xing-yu-yan","permalink":"https://linxz.online/blog/function-all/#bian-yi-xing-he-jie-shi-xing-yu-yan","title":"编译型和解释性语言","children":[]}]}],
"body":"Java函数\n定义一个返回int值的函数：\npublic class Example{\n    public int add(int a, int b){\n        return a + b;\n    }\n}\n\npublic static void main(String[] args){\n    Example example = new Example();\n    int result = example.add(5,3);\n    System.out.println(&quot;结果是：&quot;+result);\n}\n\nRust函数\n定义一个返回int值的函数：\nfn add(a: i32, b: i32) -&gt; i32{\n    a + b\n}\n\nfn main(){\n    let result = add(5,3);\n    println!(&quot;结果是：{}&quot;, result);\n}\n\npython函数\ndef add(a,b):\n    return a + b\n\nresult = add(5,3)\nprint(&quot;5+3的结果是：&quot;, result)\n\nJavaScript函数\nfunction add(a,b){\n    return a + b;\n}\n\nlet result = add(5,3);\nconsole.log(&quot;5+3的结果是：&quot;, result);\n\nJavaScript还有箭头函数()=&gt;{}的形式。\nswift函数\nfunc greeting2(whoToGreet: String){\n    print(&quot;Hello \\(whoToGreet)&quot;)\n    \n}\n\ngreeting2(whoToGreet: &quot;Linxz&quot;)\n\n\n为什么Java和Rust的代码更复杂？\n编译型和解释性语言\nJava和Rust属于编译型语言，需要把它编译成机器代码，所以需要严格检查编写时的类型和内存管理，更多工作交给代码本身。\nPython和JavaScript属于解释型语言，不用直接编译成机器代码，可以在运行时编译和进行内存管理，所以写起来比较简单，更多工具交给解释器。\n"},{"title":"堆、内存、指针的关系",
"url":"/blog/pointer-memory/",
"date":"2024-11-08",
"headings":[],
"body":"在定义变量时，如果不能提前知道它所占内存的大小，比如想要扩展的字符串或者数组，我们就不能用栈（Stack,系统自动定义内存大小），而要用堆（Heap，程序员手动定义内存）。\n而为了找到这个变量，我们无法通过具体的某个位置找到（因为它不是定长，是动态改变的），因为我们需要指针（pointer）来指向这个变量的起始位置，以代表这个变量。\n"},{"title":"为什么大多数编程语言的变量名都不允许数字开头？",
"url":"/blog/variable-rules/",
"date":"2024-11-08",
"headings":[{"level":1,"id":"wei-shen-me-bu-yun-xu-bian-liang-ming-shi-shu-zi-kai-tou","permalink":"https://linxz.online/blog/variable-rules/#wei-shen-me-bu-yun-xu-bian-liang-ming-shi-shu-zi-kai-tou","title":"为什么不允许变量名是数字开头？","children":[]}],
"body":"为什么不允许变量名是数字开头？\n看不清赋值是数字还是变量名。以java语言举例：\nint 123L = 12;\nlong 16 = 123L;\n\n首先，系统不是123L是你声明的变量，还是long类型的数字。第二，就算编译可以通过，你把12赋值给了16，也是很奇怪。\n"},{"title":"计算机为何要设计补码，而不是绝对值？",
"url":"/blog/complement-code/",
"date":"2024-11-07",
"headings":[{"level":2,"id":"jie-lun","permalink":"https://linxz.online/blog/complement-code/#jie-lun","title":"结论","children":[]},{"level":2,"id":"wei-shen-me-127-1-128","permalink":"https://linxz.online/blog/complement-code/#wei-shen-me-127-1-128","title":"为什么127+1=-128？","children":[{"level":3,"id":"bu-ma-de-jiao-du","permalink":"https://linxz.online/blog/complement-code/#bu-ma-de-jiao-du","title":"补码的角度","children":[]},{"level":3,"id":"ji-suan-de-jiao-du","permalink":"https://linxz.online/blog/complement-code/#ji-suan-de-jiao-du","title":"计算的角度","children":[]}]},{"level":1,"id":"bu-ma-de-kuai-su-yun-suan","permalink":"https://linxz.online/blog/complement-code/#bu-ma-de-kuai-su-yun-suan","title":"补码的快速运算","children":[{"level":2,"id":"jian-dan-suan-fa","permalink":"https://linxz.online/blog/complement-code/#jian-dan-suan-fa","title":"简单算法","children":[]},{"level":2,"id":"fu-za-suan-fa","permalink":"https://linxz.online/blog/complement-code/#fu-za-suan-fa","title":"复杂算法","children":[]}]}],
"body":"我之所有有这个疑问，是发现Java中的8字节（32位）的整型long，为什么只能代表$-2^{31}$ ~ $2^{31}-1$？\n为什么正数这边要-1呢？不是1个符号位，剩下31个代表数字（取绝对值正反值）就好了？\n不过，我的第一个想法是，那么0怎么办？正负0有两个呀，那个才是0呀。\n当然，不只我想到的这个问题，还有其他问题，都可以用补码去解决。\n符号-绝对值表示法（Sign-Magnitude Representation），在这种表示法中：\n\n第一位是符号位：0 表示正数，1 表示负数。\n后面 31 位表示数值的大小（绝对值）。\n\n \n这种方法在理论上是可行的，但补码表示法有几个关键的优势，使得它在计算机系统中更适合：\n \n\n简化了加减运算\n\n\n在补码表示法中，加减法的运算可以直接使用硬件电路完成，而不需要区分符号位。\n补码的表示方法使得负数的加法和减法可以通过简单的加法电路来实现，不需要额外的判断逻辑。\n例如，用补码表示法时，-1 + 1 可以通过直接相加得到 0，不需要特殊处理符号位。\n \n\n\n唯一的零表示\n\n\n在符号-绝对值表示法中，0 有两种表示方法：+0（0000...0000）和 -0（1000...0000），这就会导致在比较和判断相等时需要额外的逻辑。\n补码表示法只有一种零的表示，即 0000...0000，不存在正零和负零的区别，简化了处理。\n \n\n\n符合二进制溢出的规则\n \n\n\n补码表示法的正数和负数在二进制中是连续的，循环溢出时会自动变成负数。\n例如，对于 8 位补码，当最大值 127（01111111）再加 1 时会变成 -128（10000000），自然地回到了负数，符合计算的自然规律。\n在符号-绝对值表示法中，溢出时会导致符号和数值同时变化，需要额外处理。\n \n\n\n硬件设计方便\n\n\n补码表示法使得硬件设计更加统一，简化了 ALU（算术逻辑单元）的设计，使加法和减法能够用同一套电路实现。\n符号-绝对值表示法则需要更复杂的电路来分别处理符号位和数值部分，增加了硬件成本。\n \n\n结论\n \n虽然符号-绝对值表示法在直观上更简单，但补码表示法的这些优点使得它在计算机系统中成为首选。补码的表示方式不仅有效地解决了符号问题，还简化了计算、硬件设计以及处理逻辑，这也是为什么现代计算机体系结构广泛采用补码的原因。\n为什么127+1=-128？\n补码的角度\n带符号的运算，计算机底层都是用补码来存储的。两者的补码形式如下：\n\n计算的角度\n由于01111111是127，127+1是10000000。\n以上都是补码。\n由于补码的最高位可以参与运算，即又代表符号，又能运算。\n因此，\n$$\n-1\\times2^7+0\\times2^6+...=-128\n$$\n补码的快速运算\n补码的最高位参与运算。例子：\n1001 1001\n简单算法\n直接计算。\n-128 + 16 + 8 + 1 = -103\n复杂算法\n取反码，再取原码，再转换。\n减一得反码\n1001 1000\n取反得原码\n1110 0111\n算数\n-（64+32+4+2+1）=-103\n"},{"title":"浅拷贝和深拷贝的区别",
"url":"/blog/copy-method/",
"date":"2024-11-07",
"headings":[{"level":1,"id":"qian-kao-bei-shallow-copy","permalink":"https://linxz.online/blog/copy-method/#qian-kao-bei-shallow-copy","title":"浅拷贝 shallow_copy：","children":[]},{"level":1,"id":"shen-kao-bei-deep-copy","permalink":"https://linxz.online/blog/copy-method/#shen-kao-bei-deep-copy","title":"深拷贝 deep_copy：","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/copy-method/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"浅拷贝和深拷贝\n浅拷贝 shallow_copy：\n只复制指针，不复制值。因此两个变量会指向同一个地址。修改一个对象，会影响另一个对象。\n\n深拷贝 deep_copy：\n复制值，两者指针分别指向不同的地址。修改一个对象，不会影响另一个对象。\n\n参考资料\nrust的所有权解释\n"},{"title":"浮点型的精度探讨",
"url":"/blog/float-precision/",
"date":"2024-11-07",
"headings":[{"level":1,"id":"shen-me-shi-fu-dian-shu-de-jing-du-wen-ti","permalink":"https://linxz.online/blog/float-precision/#shen-me-shi-fu-dian-shu-de-jing-du-wen-ti","title":"什么是浮点数的精度问题？","children":[]},{"level":1,"id":"fu-dian-xing-de-jing-du","permalink":"https://linxz.online/blog/float-precision/#fu-dian-xing-de-jing-du","title":"浮点型的精度","children":[]},{"level":1,"id":"jie-jue-fang-an","permalink":"https://linxz.online/blog/float-precision/#jie-jue-fang-an","title":"解决方案","children":[]},{"level":1,"id":"32wei-fu-dian-shu-float","permalink":"https://linxz.online/blog/float-precision/#32wei-fu-dian-shu-float","title":"32位浮点数-float","children":[{"level":2,"id":"you-xiao-jing-du-ji-suan","permalink":"https://linxz.online/blog/float-precision/#you-xiao-jing-du-ji-suan","title":"有效精度计算","children":[]},{"level":2,"id":"wu-chai-he-jing-du","permalink":"https://linxz.online/blog/float-precision/#wu-chai-he-jing-du","title":"误差和精度","children":[]}]}],
"body":"什么是浮点数的精度问题？\nSystem.out.println(0.1 + 0.2); //0.30000000000000004\n\n以上是一个Java代码，小数相加默认精度是不足，因为0.1和0.2被系统识别为浮点型。\n浮点型的精度\n任何编程语言都无法避开浮点型精度不足的问题。\n因为浮点型本来就是为了存储更大的数据，而牺牲精度。\n比如4位比特1010，本来最多存储$2^4$个数字（无符号数），$2^3-1$（有符号数，之所以-1，与补码的设计有关）。\n现在，我把第一位设计成符号位，第二位设计成指数位，即$2^x$（注意，这里不是$10^x$，精度不准主要是它的锅，随着指数上升，数字是不可控，尾数不是都是0），其他位设计成正常的位数，这样就可以表示更多的数。\n比如，1110代表了负数（1），指数位（$2^1$)，尾数位(二进制1.10，需要加上隐含的1在左侧）\n尾数位二进制1.10转成十进制\n$$ 1\\times2^0+1\\times2^{-1}+0\\times2^2=1.5 $$\n所以根据浮点数计算规则&quot;$符号位\\times指数位\\times尾数位$ &quot;，就是结果，因此1010比特的结果是-3\n$$-1 \\times 2^1 \\times 1.5 = -3$$\n可以想象，如果位数变多，为了代表尽可能多的位数，必然要舍弃一些精度，因为已经不是用数字本身来表示它自身了。\n解决方案\n浮点类型float、double的数据不适合在不容许舍入误差的金融计算领域。如果需要精确数字计算或保留指定位数的精度，Java语言可以使用BigDecimal类。\n32位浮点数-float\n精度为何是6-7位？\n32位浮点数（即单精度浮点数）在IEEE 754标准下被定义为：\n1位符号位\n\n8位指数位\n\n23位尾数（也称为小数部分或有效位）\n\n尾数部分实际上表示一个24位的二进制数，因为在标准化形式下隐含了一个前导的1。因此，23位的尾数加上隐含的1位，实际是24位的二进制有效位。\n有效精度计算\n二进制数的24位相当于十进制的几位呢？我们需要将二进制的24位转换成十进制的位数。这个转换并不是直接的位数转换，而是需要考虑数的范围和精度。\n一个n位的二进制数可以表示 ($2^n$) 个不同的数。因此，24位的二进制数可以表示 ($2^{24}$) 个不同的数。为了找到其等效的十进制位数，我们需要找到一个m，使得 ($10^m \\approx 2^{24}$)。\n利用对数来转换：\n$$[ m \\cdot \\log_{10}(10) \\approx 24 \\cdot \\log_{10}(2) ]$$\n因为 $(\\log_{10}(10) = 1)$，所以：\n$$[ m \\approx 24 \\cdot \\log_{10}(2) ]$$\n已知 $(\\log_{10}(2) \\approx 0.3010)$，代入计算：\n$$[ m \\approx 24 \\cdot 0.3010 ]$$\n$$[ m \\approx 7.224 ]$$\n因此，24位二进制数相当于大约7.224位的十进制数。这就是为什么32位浮点数（单精度浮点数）的有效精度大约是6-7位十进制数的原因。\n误差和精度\n在实际计算中，由于二进制浮点数只能表示有限精度的数值，因此在进行数值计算时可能会出现舍入误差。这些误差会导致计算结果的有效精度约为6到7位。这也意味着在使用单精度浮点数进行计算时，结果通常在第6到第7位十进制数时可能会出现不准确的情况。\n"},{"title":"斐波那契数列-多编程语言版",
"url":"/blog/fibonacci/",
"date":"2024-11-06",
"headings":[{"level":1,"id":"pythonban-ben","permalink":"https://linxz.online/blog/fibonacci/#pythonban-ben","title":"python版本","children":[]},{"level":1,"id":"javascriptban-ben","permalink":"https://linxz.online/blog/fibonacci/#javascriptban-ben","title":"JavaScript版本","children":[]},{"level":1,"id":"javaban-ben","permalink":"https://linxz.online/blog/fibonacci/#javaban-ben","title":"Java版本","children":[]},{"level":1,"id":"rustban-ben","permalink":"https://linxz.online/blog/fibonacci/#rustban-ben","title":"Rust版本","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/fibonacci/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"今天刚接触斐波那契数列的概念：\n后面一个数是前面两个数之和。\n示例：\n[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]\n\n通过不同语言来写它的数组实现。\n注意，还有很多实现，比如说递归实现。但是一个我想找到一个实现起来容易理解的方法，二个我想将所有值都保留，所以选了数组实现。\npython版本\ndef fib_array(n):\n      # 处理特殊情况\n    if n &lt;= 0:\n        return []\n    if n == 1:\n        return [0]\n    \n    # 初始化数组，包含序列的前两个数\n    fib = [0, 1]\n    \n    # 循环生成剩余的数\n    for i in range(2, n):\n        fib.append(fib[i-1] + fib[i-2])\n        \n    return fib\n\nprint(fib_array(10))\n\nJavaScript版本\nfunction fibArray(n){\n    let arr = [0, 1];\n    for(let i = 2; i &lt; n; i++){\n        arr[i] = arr[i - 1] + arr[i - 2];\n    }\n    console.log(arr);\n}\nfibArray(10);\n\nJava版本\npublic class Fibonacci{\n    public static void main(String[] args) {\n\n        int n = 10;\n        \n        // 创建固定长度的数组\n        int[] fibonacci = new int[n];\n\n        // 设置前两个数\n        fibonacci[0] = 0;\n        fibonacci[1] = 1;\n        \n        // 生成剩余的斐波那契数\n        for (int i = 2; i &lt; n; i++) {\n            fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];\n        }\n        \n        // 打印\n        for (int i = 0; i &lt; fibonacci.length; i++) {\n            System.out.print(fibonacci[i] + &quot; &quot;);\n        }\n        System.out.println(); // 换行\n    }\n}\n\nRust版本\nfn main() {\n    let n = 10;\n    \n    // 创建固定长度的数组，初始化为0\n    let mut fibonacci = vec![0; n];\n    \n    // 设置前两个数\n    fibonacci[0] = 0;\n    fibonacci[1] = 1;\n    \n    // 生成剩余的斐波那契数\n    for i in 2..n {\n        fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];\n    }\n    \n    // 打印\n    for i in 0..fibonacci.len() {\n        print!(&quot;{} &quot;, fibonacci[i]);\n    }\n    println!(); // 换行\n}\n\n参考资料\n斐波那契数列\n"},{"title":"rust控制流-条件及循环",
"url":"/blog/rust-control/",
"date":"2024-11-06",
"headings":[{"level":1,"id":"ifbiao-da-shi","permalink":"https://linxz.online/blog/rust-control/#ifbiao-da-shi","title":"if表达式","children":[{"level":2,"id":"zai-letyu-ju-zhong-shi-yong-if","permalink":"https://linxz.online/blog/rust-control/#zai-letyu-ju-zhong-shi-yong-if","title":"在let语句中使用if","children":[]}]},{"level":1,"id":"xun-huan","permalink":"https://linxz.online/blog/rust-control/#xun-huan","title":"循环","children":[{"level":2,"id":"shi-yong-loopxun-huan","permalink":"https://linxz.online/blog/rust-control/#shi-yong-loopxun-huan","title":"使用loop循环","children":[]},{"level":2,"id":"shi-yong-whilexun-huan","permalink":"https://linxz.online/blog/rust-control/#shi-yong-whilexun-huan","title":"使用while循环","children":[]},{"level":2,"id":"shi-yong-forxun-huan","permalink":"https://linxz.online/blog/rust-control/#shi-yong-forxun-huan","title":"使用for循环","children":[]}]}],
"body":"rust控制流\nif表达式\nfn main() {\n    let number = 3;\n\n    if number &lt; 5 {\n        println!(&quot;condition was true&quot;);\n    } else {\n        println!(&quot;condition was false&quot;);\n    }\n}\n\n在let语句中使用if\nfn main() {\n    let condition = true;\n    let number = if condition { 5 } else { 6 };\n\n    println!(&quot;The value of number is: {number}&quot;);\n}\n\n如果在JavaScript中，需要通过三目表达式来完成。如：\nlet number = condition ? 5 : 6;\n\n循环\n使用loop循环\nfn main() {\n    loop {\n        println!(&quot;again!&quot;);\n    }\n}\n\n注意，以上代码会无限循环，需要在适当时候break:\nfn main() {\n    let mut counter = 0;\n\n    let result = loop {\n        counter += 1;\n\n        if counter == 10 {\n            break counter * 2;\n        }\n    };\n\n    println!(&quot;The result is {result}&quot;);\n}\n\n使用while循环\nfn main() {\n    let mut number = 3;\n\n    while number != 0 {\n        println!(&quot;{number}!&quot;);\n\n        number -= 1;\n    }\n\n    println!(&quot;LIFTOFF!!!&quot;);\n}\n\n使用for循环\nfn main() {\n    let a = [10, 20, 30, 40, 50];\n\n    for element in a {\n        println!(&quot;the value is: {element}&quot;);\n    }\n}\n\n"},{"title":"Rust的数据类型",
"url":"/blog/rust-datatype/",
"date":"2024-11-06",
"headings":[{"level":1,"id":"rustshu-ju-lei-xing","permalink":"https://linxz.online/blog/rust-datatype/#rustshu-ju-lei-xing","title":"rust数据类型","children":[]},{"level":1,"id":"biao-liang","permalink":"https://linxz.online/blog/rust-datatype/#biao-liang","title":"标量","children":[{"level":2,"id":"zheng-xing","permalink":"https://linxz.online/blog/rust-datatype/#zheng-xing","title":"整型","children":[]},{"level":2,"id":"fu-dian-xing","permalink":"https://linxz.online/blog/rust-datatype/#fu-dian-xing","title":"浮点型","children":[]}]},{"level":1,"id":"fu-he-lei-xing","permalink":"https://linxz.online/blog/rust-datatype/#fu-he-lei-xing","title":"复合类型","children":[{"level":2,"id":"yuan-zu","permalink":"https://linxz.online/blog/rust-datatype/#yuan-zu","title":"元组","children":[]},{"level":2,"id":"shu-zu","permalink":"https://linxz.online/blog/rust-datatype/#shu-zu","title":"数组","children":[]},{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/rust-datatype/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"rust数据类型\n两大类：标量scalar， 复合compound\n标量\n标量（scalar）类型代表一个单独的值。Rust 有四种基本的标量类型：整型、浮点型、布尔类型和字符类型。你可能在其他语言中见过它们。让我们深入了解它们在 Rust 中是如何工作的。\n整型\ni 开头的数据类型：表示有符号整数signed integer，可以存储正数和负数。\nu 开头的数据类型：表示无符号整数unsigned integer，只能存储非负整数。\nrust默认数字的数据类型是i32\n浮点型\nf32和f64\n复合类型\n原生复合类型：元组（tuple）和数组（array）\n元组\n元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定：一旦声明，其长度不会增大或缩小。\nfn main() {\n    let tup: (i32, f64, u8) = (500, 6.4, 1);\n}\n\n数组\n与元组不同，数组中的每个元素的类型必须相同。\nRust 中的数组长度是固定的。\nlet a: [i32; 5] = [1, 2, 3, 4, 5];\n\n这里，i32 是每个元素的类型。分号之后，数字 5 表明该数组包含五个元素。\n参考资料\nrust数据类型参考\n"},{"title":"什么是Rust的所有权？",
"url":"/blog/rust-ownership/",
"date":"2024-11-06",
"headings":[{"level":1,"id":"rustsuo-you-quan-ownership","permalink":"https://linxz.online/blog/rust-ownership/#rustsuo-you-quan-ownership","title":"Rust所有权 ownership","children":[]},{"level":1,"id":"dui-bi-qi-ta-yu-yan","permalink":"https://linxz.online/blog/rust-ownership/#dui-bi-qi-ta-yu-yan","title":"对比其他语言：","children":[]},{"level":1,"id":"zhan-stackhe-dui-heapzhi-shi-hui-gu","permalink":"https://linxz.online/blog/rust-ownership/#zhan-stackhe-dui-heapzhi-shi-hui-gu","title":"栈stack和堆heap知识回顾","children":[{"level":2,"id":"suo-you-quan-guan-li-de-shi-dui-shu-ju","permalink":"https://linxz.online/blog/rust-ownership/#suo-you-quan-guan-li-de-shi-dui-shu-ju","title":"所有权管理的是堆数据","children":[]}]},{"level":1,"id":"suo-you-quan-gui-ze","permalink":"https://linxz.online/blog/rust-ownership/#suo-you-quan-gui-ze","title":"所有权规则","children":[]},{"level":1,"id":"zuo-yong-yu","permalink":"https://linxz.online/blog/rust-ownership/#zuo-yong-yu","title":"作用域","children":[]},{"level":1,"id":"suo-you-quan-he-stringshu-ju-lei-xing","permalink":"https://linxz.online/blog/rust-ownership/#suo-you-quan-he-stringshu-ju-lei-xing","title":"所有权和string数据类型","children":[]},{"level":1,"id":"suo-you-quan-he-han-shu","permalink":"https://linxz.online/blog/rust-ownership/#suo-you-quan-he-han-shu","title":"所有权和函数","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/rust-ownership/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"Rust所有权 ownership\n作用：\nRust不用内存回收，时刻都知道内存给谁用。\n对比其他语言：\nJava有垃圾回收机制，程序运行时不断寻找不再使用的内存。\nC语言中，程序员要亲自分配和释放内存。\nRust通过所有权系统管理内存，编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则，程序都不能编译。在运行时，所有权系统的任何功能都不会减慢程序。\n栈stack和堆heap知识回顾\n\n栈：后进先出。\n堆：堆想要使用内存，需要开辟内存；栈不需要，因为栈的内存是提前开辟好的。堆需要单独分配，用完需要释放。\n\n入栈比在堆上分配内存要快。\n我们听说过stackoverflow，但是不存在heapoverflow。因为堆内存分配，只会出现系统内存不够用。\n访问堆上的数据比访问栈上的数据慢，因为必须通过指针来访问。\n所有权管理的是堆数据\n跟踪哪部分代码正在使用堆上的哪些数据，最大限度的减少堆上的重复数据的数量，以及清理堆上不再使用的数据确保不会耗尽空间，这些问题正是所有权系统要处理的。\n所有权规则\n\nRust 中的每一个值都有一个 所有者（owner）。\n值在任一时刻有且只有一个所有者。\n当所有者（变量）离开作用域，这个值将被丢弃。\n\n解释：内存的生命周期和所有者有关。如果所有者结束了生命周期，内存使用的生命周期也结束。\nC和C++内存和指针的使用是分裂的，所以出现“野指针”的现象（内存被回收了，但是指针空了），甚至“内存泄露”（出现了一块被使用的内存，但是没有任何指针指向它）。\n作用域\n代码仅在大括号里面有用。\n{\n    let c = &quot;hello&quot;\n}\n\n所有权和string数据类型\nRust会在作用域结束自动释放内存：\n    {\n        let s = String::from(&quot;hello&quot;); // 从此处起，s 是有效的\n\n        // 使用 s\n    }                                  // 此作用域已结束，\n                                       // s 不再有效\n\nRust永远不会进行深拷贝，因此不会浪费内存空间或出现内存泄露的问题。\nlet s1 = String::from(&quot;hello&quot;);\n    let s2 = s1; // s1 is moved to s2\n    println!(&quot;{}, world!&quot;, s1); //报错，s1已经不在了\n\n如果确实需要拷贝，可以使用let s2=s1.clone();。\n所有权和函数\n当字符串的变量s变成takes_ownership()函数的参数时，它的生命周期就会消失。\nfn main() {\n    let s = String::from(&quot;hello&quot;);  // s 进入作用域\n\n    takes_ownership(s);             // s 的值移动到函数里 ...\n                                    // ... 所以到这里不再有效\n\n    let x = 5;                      // x 进入作用域\n\n    makes_copy(x);                  // x 应该移动函数里，\n                                    // 但 i32 是 Copy 的，\n                                    // 所以在后面可继续使用 x\n\n} // 这里，x 先移出了作用域，然后是 s。但因为 s 的值已被移走，\n  // 没有特殊之处\n\nfn takes_ownership(some_string: String) { // some_string 进入作用域\n    println!(&quot;{some_string}&quot;);\n} // 这里，some_string 移出作用域并调用 `drop` 方法。\n  // 占用的内存被释放\n\nfn makes_copy(some_integer: i32) { // some_integer 进入作用域\n    println!(&quot;{some_integer}&quot;);\n} // 这里，some_integer 移出作用域。没有特殊之处\n\n参考资料\nRust所有权知识\n"},{"title":"Java基本知识",
"url":"/blog/java-intro/",
"date":"2024-11-05",
"headings":[{"level":1,"id":"javalei-classde-gui-ze","permalink":"https://linxz.online/blog/java-intro/#javalei-classde-gui-ze","title":"Java类class的规则","children":[]},{"level":1,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/java-intro/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"Java类class的规则\n一个源文件中可以声明多个类，但是最多只能有一个类使用public进行声明。 且要求声明为public的类的类名与源文件名相同。\npublic class HelloWord{\n    public static void main(String[] args){\n    }\n\n    public static void main1(String[] args){\n    }\n}\n\npublic class Second{}\n\n以上代码报错，因为有两个public的类。但可以有两个public static...。\n参考资料\n尚硅谷Java视频课程\nJava课件资料\n"},{"title":"rust-cargo是什么？",
"url":"/blog/rust-cargo/",
"date":"2024-11-05",
"headings":[{"level":1,"id":"an-zhuang-cargo","permalink":"https://linxz.online/blog/rust-cargo/#an-zhuang-cargo","title":"安装cargo","children":[]},{"level":1,"id":"yong-cargochuang-jian-xin-xiang-mu","permalink":"https://linxz.online/blog/rust-cargo/#yong-cargochuang-jian-xin-xiang-mu","title":"用cargo创建新项目","children":[]},{"level":1,"id":"cargobian-yi","permalink":"https://linxz.online/blog/rust-cargo/#cargobian-yi","title":"cargo编译","children":[]},{"level":1,"id":"cargoyun-xing-cheng-xu","permalink":"https://linxz.online/blog/rust-cargo/#cargoyun-xing-cheng-xu","title":"cargo运行程序","children":[]},{"level":1,"id":"bian-yi-dai-yun-xing-de-kuai-jie-fang-shi","permalink":"https://linxz.online/blog/rust-cargo/#bian-yi-dai-yun-xing-de-kuai-jie-fang-shi","title":"编译带运行的快捷方式","children":[]},{"level":1,"id":"kuai-su-jian-cha","permalink":"https://linxz.online/blog/rust-cargo/#kuai-su-jian-cha","title":"快速检查","children":[]},{"level":1,"id":"cargofa-bu-sheng-chan-huan-jing","permalink":"https://linxz.online/blog/rust-cargo/#cargofa-bu-sheng-chan-huan-jing","title":"cargo发布生产环境","children":[]}],
"body":"Cargo 是内置的依赖管理器和构建工具，它能轻松增加、编译和管理依赖，并使依赖在 Rust 生态系统中保持一致。\n类似于JavaScript的NPM（包管理工具）。\n用Cargo的优势：不管你用什么操作系统，操作命令都是一样的。\n安装cargo\ncargo version\n\n用cargo创建新项目\ncargo new hello_cargo\n\ncargo编译\ncargo build\n\ncargo运行程序\n./target/debug/hello_cargo\n\n编译带运行的快捷方式\n可以不用build和手动运行，直接run。\ncargo run\n\n快速检查\ncargo check\n\ncargo发布生产环境\ncargo build release\n\n"},{"title":"Rust如何调用函数？",
"url":"/blog/rust-function/",
"date":"2024-11-05",
"headings":[{"level":1,"id":"rustli-mian-liang-ge-mou-hao-shi-sha-yi-si","permalink":"https://linxz.online/blog/rust-function/#rustli-mian-liang-ge-mou-hao-shi-sha-yi-si","title":"rust里面两个冒号是啥意思？","children":[]},{"level":1,"id":"han-shu-ge-shi","permalink":"https://linxz.online/blog/rust-function/#han-shu-ge-shi","title":"函数格式","children":[{"level":2,"id":"ru-he-chuan-can-shu","permalink":"https://linxz.online/blog/rust-function/#ru-he-chuan-can-shu","title":"如何传参数","children":[]},{"level":2,"id":"yu-ju-he-biao-da-shi","permalink":"https://linxz.online/blog/rust-function/#yu-ju-he-biao-da-shi","title":"语句和表达式。","children":[]},{"level":2,"id":"ju-you-fan-hui-zhi-de-han-shu","permalink":"https://linxz.online/blog/rust-function/#ju-you-fan-hui-zhi-de-han-shu","title":"具有返回值的函数","children":[]}]}],
"body":"\n使用std库里面的io库里面的stdin()函数并调用。\n使用.read_line方法\n&amp;mut guess 指引用的是可变的guess地址，也可以是不可变的&amp;guess。注意，引用符号是不能去掉的，否则无法再使用guess变量。这在rust所有权里面会详细介绍。\n\nuse std :: io\nio::stdin()           // 1. 调用 io 库的 stdin() 函数,获取标准输入句柄\n    .read_line(&amp;mut guess)    // 2. 调用句柄的 read_line 方法来读取一行输入\n    .expect(&quot;Failed to read line&quot;);    // 3. 处理可能的错误\n\nrust里面两个冒号是啥意思？\nuse std::io;\n\n调用std库里面的io库。\n两个冒号指的是“父子关系”。\n函数格式\nfn 开头，入口函数是main函数。\n如何传参数\nfn another_function(x: i32){\n\tprintln!(&quot;The value of x is: {x}&quot;);\n}\n\n语句和表达式。\n语句没有返回值。函数定义、定义变量都是语句。\n表达式有返回值。函数调用时一个表达式。\n这是一个表达式：\n{\n\tlet x = 3;\n\tx +1\n}\n\n值得注意的是，x+1后面没有分号，如果有，就会变成语句。现在的返回值是4。\n具有返回值的函数\n格式如下，需要通过-&gt;制定返回值的类型，可以在函数写return或者不写。\n函数默认的返回值不是undefined，是最后一个表达式的值。\nfn five() -&gt; i32 {\n    5\n}\n\n注意，如果最后是5;，则认为它是语句，而不是表达式。默认没有返回值，这点要切记。\n"},{"title":"Rust如何声明变量",
"url":"/blog/rust-variable/",
"date":"2024-11-05",
"headings":[{"level":1,"id":"mutguan-jian-zi","permalink":"https://linxz.online/blog/rust-variable/#mutguan-jian-zi","title":"mut关键字","children":[]},{"level":1,"id":"chang-liang-const","permalink":"https://linxz.online/blog/rust-variable/#chang-liang-const","title":"常量const","children":[]},{"level":1,"id":"shadowing","permalink":"https://linxz.online/blog/rust-variable/#shadowing","title":"shadowing","children":[]}],
"body":"创建新字符串示例：\nlet mut guess = String :: new();\n\n\nmut是一个关键字，表示变量是可以赋值的，即mutable（可变的）\n这是一个String类型，从String库里new一个实例出来。\n\n如果要创建带内容的字符串：\nlet s1 = String::from(&quot;hello&quot;);\n\nmut关键字\nrust变量默认不可变，除非加上mut\n// rust变量默认是不可变的\n    let x = 5;\n    println!(&quot;The value of x is: {}&quot;, x);\n    // x = 6; // error: cannot assign twice to immutable variable `x`\n\n    // 使用mut关键字定义可变变量\n    let mut y = 4;\n    println!(&quot;The value of y is: {}&quot;, y);\n    y = 5; //注意这里没有let\n    println!(&quot;The value of y+1 is: {}&quot;, y+1);\n\n常量const\n // rust常量\n const MAX_POINTS: u32 = 100000; //常量必须注明类型，如u32；常量名约定大写，用下划线分隔单词；不能使用mut关键字\nprintln!(&quot;The value of MAX_POINTS is: {}&quot;, MAX_POINTS);\n\nshadowing\n允许用let关键字改变变量，分配新的内存。\n传统做法：声明变量即分配内存，之后变量必须要保持同类型（比如整型），因为如果换成其他类型，内存分配大小会不符合。\nrust做法：每次使用let关键字重新声明变量x时，实际上创建了一个新的变量，并不是在原有的内存地址上直接修改值。这样会更加灵活。\nlet x = 5;\nlet x = x + 1; // 覆盖原来的x，产生一个新的绑定\nlet x = &quot;Hello&quot;; // 再次覆盖x，类型可以不同\nprintln!(&quot;The value of x is: {}&quot;, x);\n\n"},{"title":"Java编译步骤",
"url":"/blog/java-compile/",
"date":"2024-11-04",
"headings":[{"level":1,"id":"bian-yi-shi-li-dai-ma","permalink":"https://linxz.online/blog/java-compile/#bian-yi-shi-li-dai-ma","title":"编译实例代码","children":[{"level":2,"id":"bian-yi","permalink":"https://linxz.online/blog/java-compile/#bian-yi","title":"编译","children":[]},{"level":2,"id":"yun-xing","permalink":"https://linxz.online/blog/java-compile/#yun-xing","title":"运行","children":[]}]}],
"body":"要想让Java代码运行起来，需要进行编译。编译步骤：\n编写-编译-运行\n编写.java -&gt; bin/javac编译成字节码 -&gt; bin/java运行\n\n编译实例代码\n编译\njavac HelloWorld.java\n\n运行\njava HelloWorld\n\n"},{"title":"Java各版本知识",
"url":"/blog/java-versions/",
"date":"2024-11-04",
"headings":[{"level":1,"id":"java-you-duo-shao-ge-ban-ben","permalink":"https://linxz.online/blog/java-versions/#java-you-duo-shao-ge-ban-ben","title":"Java 有多少个版本？","children":[]},{"level":1,"id":"jdk","permalink":"https://linxz.online/blog/java-versions/#jdk","title":"JDK","children":[{"level":2,"id":"8-0he-1-8shi-yi-ge-ban-ben","permalink":"https://linxz.online/blog/java-versions/#8-0he-1-8shi-yi-ge-ban-ben","title":"8.0和1.8是一个版本","children":[]},{"level":2,"id":"ban-ben-hao-xuan-ze","permalink":"https://linxz.online/blog/java-versions/#ban-ben-hao-xuan-ze","title":"版本号选择","children":[]}]},{"level":1,"id":"jdk-jre-jvm","permalink":"https://linxz.online/blog/java-versions/#jdk-jre-jvm","title":"JDK > JRE > JVM","children":[]}],
"body":"Java 有多少个版本？\nJAVA SE 标准版（桌面软件）\nJAVA EE 后台版（服务器端软件）\nJAVA ME 迷你版-（移动设备软件）\nJDK\n注意，最好安装LTS版本（长期支持版本）\nJDK官方下载链接\n8.0和1.8是一个版本\n8.0即1.8版本。1.5出来的时候，因为改动太大，命名为5.0，之后数字也大了。\n版本号选择\n目前最新的版本是23。最新的LTS版本是21。\nJDK &gt; JRE &gt; JVM\nJDK：开发工具包；\nJRE：开发环境；\nJVM：Java虚拟机，为各个系统配置Java运行的环境。\n\n"},{"title":"rust语言介绍",
"url":"/blog/rust/",
"date":"2024-11-04",
"headings":[{"level":1,"id":"rustshi-shen-me","permalink":"https://linxz.online/blog/rust/#rustshi-shen-me","title":"rust是什么","children":[]},{"level":1,"id":"rustcong-na-li-lai","permalink":"https://linxz.online/blog/rust/#rustcong-na-li-lai","title":"rust从哪里来？","children":[{"level":2,"id":"rustshe-ji-zhe-xue","permalink":"https://linxz.online/blog/rust/#rustshe-ji-zhe-xue","title":"rust设计哲学","children":[]}]},{"level":1,"id":"an-zhuang-rust","permalink":"https://linxz.online/blog/rust/#an-zhuang-rust","title":"安装rust","children":[{"level":2,"id":"an-zhuang-rustup","permalink":"https://linxz.online/blog/rust/#an-zhuang-rustup","title":"安装rustup:","children":[]},{"level":2,"id":"an-zhuang-cyu-yan-bian-yi-qi","permalink":"https://linxz.online/blog/rust/#an-zhuang-cyu-yan-bian-yi-qi","title":"安装c语言编译器：","children":[]},{"level":2,"id":"ce-shi-shi-fou-an-zhuang-cheng-gong","permalink":"https://linxz.online/blog/rust/#ce-shi-shi-fou-an-zhuang-cheng-gong","title":"测试是否安装成功：","children":[]},{"level":2,"id":"cha-kan-ben-di-wen-dang","permalink":"https://linxz.online/blog/rust/#cha-kan-ben-di-wen-dang","title":"查看本地文档","children":[]}]},{"level":1,"id":"bian-xie-bing-yun-xing-rustcheng-xu","permalink":"https://linxz.online/blog/rust/#bian-xie-bing-yun-xing-rustcheng-xu","title":"编写并运行Rust程序","children":[]},{"level":1,"id":"bian-xie","permalink":"https://linxz.online/blog/rust/#bian-xie","title":"编写","children":[]},{"level":1,"id":"bian-yi","permalink":"https://linxz.online/blog/rust/#bian-yi","title":"编译","children":[]},{"level":1,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/rust/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"rust是什么\nrust是新时代的C语言。\nrust的安全方案主要针对的是C语言的不足。\n\nrust是”面向过程”的编程语言，和C语言一样。\nRust 是 WASI（WebAssembly System Interface）推广和普及的背后推手。\nrust从哪里来？\n任何一门语言的诞生，都是解决一个编程问题。\n2006年，Graydon Hoare开发出来rust。\n兼顾安全、性能、广泛特性\nrust含义: trust robust\nrust设计哲学\n\n安装rust\n安装rustup:\ncurl --proto &#39;=https&#39; --tlsv1.2 https://sh.rustup.rs -sSf | sh\n\n安装c语言编译器：\nxcode-select --install\n\n注意，mac上通常已经安装过编译器了。\n测试是否安装成功：\nrustup\n\n更新一下\nrustup update\n\n查看本地文档\nrustup doc\n\n编写并运行Rust程序\n编写\n新建文件名：main.rs\nfn main() {\n    println!(&quot;Hello, world!&quot;);\n}\n\n编译\n$ rustc main.rs\n$ ./main\nHello, world!\n\n参考资料\n\nrust书籍推荐 - 《rust编程之道》\nrust视频教程-极客时间\nRust程序设计语言中文版\n\n"},{"title":"腰突者如何正确地弯腰？",
"url":"/blog/bend-down/",
"date":"2024-11-03",
"headings":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/bend-down/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"搬重物时容易闪到腰。\n在搬重物的时候，往往是腰背部弯曲、双腿直立的姿势，腰背部长时间受力过多进而受伤。\n使用这种姿势搬重物，腰部会作为发力的主力军。这个时候，腰部承受的压力会不均匀地分散在椎间盘和腰部的肌肉中， 导致椎间盘的一侧被挤压收缩，而另一侧会被强制性地伸展。\n长此以往，就容易造成纤维环内髓核的移动，压迫脊神经造成腰痛，从而导致腰突。对于已经有腰突症的忠者，可能会出现加重腰突症的情况。\n因此，在搬重物的时候，要尽量保持整个脊柱处于中立位， 不要依常腰背力量，而是用腿部的力量将重物搬起来。正确的搬重物姿势如图3-11所示。\n\n\n\n靠近要搬的重物，两腿分开站稳；\n\n\n保持腰背部直立，腰部前倾屈膝接近重物；\n\n\n上身向前探，握紧重物，使其尽量靠近身体；\n\n\n直立上身以保特平衡，并通过腿部的力量将重物搬起。\n\n\n注意：动作要平稳，不要猛然用力。\n\n\n这样可以避免弯腰用力搬重物时腰部用力过猛，发生腰部肌肉和韧带的扭伤。\n尤其是腰突忠者，在搬重物的时候，要格外注意使用正确的姿势，以减少腰部的发力，从而避免加重症状或导致症状复发。\n而且，在搬重物吋，尽量不要一个人逞强， 最好找家人或朋友来帮忙。\n参考资料\n每日一动，远离疼痛 - 罗炜樑，李梅\n"},{"title":"腰突者如何调整睡姿？",
"url":"/blog/lumbar-disc-herniation/",
"date":"2024-11-03",
"headings":[{"level":1,"id":"yi-yang-wo-shui-ji-qiao","permalink":"https://linxz.online/blog/lumbar-disc-herniation/#yi-yang-wo-shui-ji-qiao","title":"（一）仰卧睡技巧","children":[]},{"level":1,"id":"er-ce-wo-shui-ji-qiao","permalink":"https://linxz.online/blog/lumbar-disc-herniation/#er-ce-wo-shui-ji-qiao","title":"(二）侧卧睡技巧","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/lumbar-disc-herniation/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"仰卧睡觉时，你会不会发觉腰下方空得慌，而且常常在起床的时候感觉腰酸背痛？这可能是睡姿不良引起的。\n正常的人体脊椎从侧面看类似一个反“S”形，如图3-5 所示。\n\n腰椎呈现向前凸的形状。对于腰突的朋友，以普通的睡姿睡觉时，往往因难以维持自然的腰椎生理曲度，容易在起床时吋出现腰部僵硬、腰酸背痛的感觉。那么，我们该如何调整睡姿呢？\n下面我会介绍一些调整睡姿的小技巧。\n（一）仰卧睡技巧\n仰卧睡是最受欢迎的睡姿。\n当我们直接仰躺在床上时，臀部、背部和头部可以完全被床垫支撑。但由于腰椎生理曲度“向前凸”的缘故，仰卧睡姿对腰部的支撑反而是比较小的，尤其是对于伴随腰椎生理曲度变大的人。这会导致在睡眼过程中有种“腰部悬空“的感觉， 让腰部无法放松，一直处于伸展活动状态，无法得到充足的休息。\n\n有研究发现，腰椎间盘在仰卧位微微屈膝时的压力要比完全伸直腿的压力小。所以，我们可以这样做：仰卧，在腰部下方放置一个合适的腰枕，双膝下方垫1～2个枕头，让双膝微微弯曲。\n这样不仅可以让腰椎得到适当的支撑，避免腰部肌肉被过度伸展，还可以保持腰椎的正常生理曲度，减轻腰椎间盘的压力。\n\n另外，对于颈椎也有问题的朋友，需要注意枕头的高度， 应该能维持正常的领椎生理曲度。\n(二）侧卧睡技巧\n侧卧睡是最流行的睡姿之一。侧卧时，脊桂可以很容易地维持自然的“S”形状，这是很多人首选侧卧睡姿的主要原因。 但是，侧卧睡有两个较为明显的缺点：\n（1）侧卧时，由于重力的作用，腰椎容易往腹部方向过度前凸。\n（2）侧卧时，当下肢膝关节无法与臀部在同一高度，腰椎容易出现扭转与侧弯。\n\n这两个缺点，均会增加腰椎的压力，容易引起腰部疼痛或不适。但我们可以这样调整：侧卧时，在腰下方垫一个腰枕， 双膝之间夹一个枕头。\n这样可以维护腰椎的自然生理曲度，减轻脊柱在睡觉时受到的压力，预防腰椎过度凸出、旋转与侧弯带来的不适。\n\n对于颈椎也有问题的朋友，需要让枕头同时支撑头部与颈部的重量。\n此外，太硬或者太软的床垫也会导致睡姿不佳。\n参考资料\n每日一动，远离疼痛 - 罗炜樑，李梅\n"},{"title":"颈椎劳累看过来，肩保健操做起来",
"url":"/blog/neck-massage/",
"date":"2024-11-03",
"headings":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/neck-massage/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"下面介绍一套简单的肩颈保健操，动作应轻柔，呼吸自然，每个动作重复3~5次。\n\n\n先缓慢深呼吸，头向左转眼看左肩，再向右转眼看右肩，然后下巴前后伸缩以松弛颈肌。\n\n\n两肩向耳部耸起，挺直背部，然后使两肩尽可能下垂。\n\n\n双肩分别做圆周运动，先抬肩向前转动，再向后转动。\n\n\n坐着将双手平放在大腿上，下巴慢慢垂到胸部，使头从左向右，再从右到左转圈，同时深吸气，深呼气，使头颈部在缓慢转动中感到舒畅。\n\n\n将头偏向左肩，左手越过头顶放在头右边，另一只手放在右肩上，轻柔地试将头问左拉；再将头偏向右肩，做同样的动作。\n\n\n结束动作时，将手按在脖子背后，即头发与头皮结合线上边，从上向下按摩，或用双手食指和中指分别压在脖子后面两边，自上而下按摩至肩部。\n\n\n参考资料\n颈椎病康复指南 - 陈选宁\n"},{"title":"办公室可以做的运动",
"url":"/blog/office-sports/",
"date":"2024-11-03",
"headings":[{"level":1,"id":"yi-zuo-wei-yao-bu-qian-la-shen-yun-dong","permalink":"https://linxz.online/blog/office-sports/#yi-zuo-wei-yao-bu-qian-la-shen-yun-dong","title":"（一）坐位腰部前拉伸运动","children":[]},{"level":1,"id":"er-zuo-wei-zhuan-yao-la-shen-yun-dong","permalink":"https://linxz.online/blog/office-sports/#er-zuo-wei-zhuan-yao-la-shen-yun-dong","title":"（二）坐位转腰拉伸运动","children":[]},{"level":1,"id":"san-zuo-wei-qian-hou-bai-bi-yun-dong","permalink":"https://linxz.online/blog/office-sports/#san-zuo-wei-qian-hou-bai-bi-yun-dong","title":"（三）坐位前后摆臂运动","children":[]},{"level":1,"id":"si-zuo-wei-tun-bu-la-shen-yun-dong","permalink":"https://linxz.online/blog/office-sports/#si-zuo-wei-tun-bu-la-shen-yun-dong","title":"（四）坐位臀部拉伸运动","children":[]},{"level":1,"id":"wu-zuo-wei-da-tui-la-shen-yun-dong","permalink":"https://linxz.online/blog/office-sports/#wu-zuo-wei-da-tui-la-shen-yun-dong","title":"（五）坐位大腿拉伸运动","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/office-sports/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"分享五个在办公室可以做的运动。\n（一）坐位腰部前拉伸运动\n(1）坐姿，腰部前倾，尽可能让胸部贴近大腿；\n(2）直到腰背部有轻度拉伸感，保持10～30 秒。\n\n（二）坐位转腰拉伸运动\n(1）坐姿，始终保持腰背挺直；\n(2）身体向左侧旋转，其中左手放在椅背上，右手固定膝关节；\n(3）直到腰背部有轻度拉伸感，保持10~30 秒，换侧重复。\n注意：进行该运动应保持腰背直立，不能弯腰。\n\n（三）坐位前后摆臂运动\n(1）坐姿，始终保持腰背挺直；\n(2）双手自然垂直在身体两侧，进行小幅度的前后摆臂运动，摆动10次。\n\n（四）坐位臀部拉伸运动\n(1）坐姿，保持腰背挺直；\n(2）抬起有症状的腿，并搭在另一条腿上；\n(3）双手自然放在膝盖上，用手微微往下按压上方的腿，感到臀部外侧有拉伸感即可。动作保特10~30 秒。\n注意：如果压下左腿，臀部外侧仍没有拉伸感，身体可稍微向前倾，直到臀部外侧有拉伸感。\n此运动可以放松臀部肌肉，减少紧张的臀部肌肉对神经造成的刺激，以缓解腿痛、腿麻症状。\n\n（五）坐位大腿拉伸运动\n(1）坐姿，保持腰背挺直：\n(2）向前伸直有症状的腿，脚跟者地，注意膝关节伸直；\n(3）身体微微前倾，直到感觉大腿后侧有拉伸感；\n(4）动作保持10~30 秒。\n注意：运动过程中腰背要挺直，忌弯腰。\n此运动主要是拉伸放松大腿后侧肌肉（腘绳肌），以防止肌肉紧张对神经造成过度刺激，缓解腿痛、腿麻症状。\n\n参考资料\n每日一动，远离疼痛 - 罗炜樑，李梅\n"},{"title":"Python: 什么是装饰器（Decorator）",
"url":"/blog/python-decorator/",
"date":"2024-11-03",
"headings":[],
"body":"作用：不修改原func，增加func功能\n让我们通过一个简单的例子来理解装饰器：\n假设你有一个打印“Hello, World!”的函数：\ndef greet():\n    print(&quot;Hello, World!&quot;)\n\n现在，你想在调用 greet 函数之前和之后打印一些额外的信息（比如日志），但又不想修改 greet 函数本身。这时，你可以使用装饰器来实现：\ndef my_decorator(func):\n    def wrapper():\n        print(&quot;Something is happening before the function is called.&quot;)\n        func()\n        print(&quot;Something is happening after the function is called.&quot;)\n    return wrapper\n\n@my_decorator\ndef greet():\n    print(&quot;Hello, World!&quot;)\n\n当你使用 @my_decorator 语法（这称为“装饰”）应用于 greet 函数时，实际上是用 wrapper 函数来“包装”了 greet 函数。因此，当你调用 greet() 时，它不仅会执行 greet 函数本身的内容，还会执行额外的打印操作。\n当你运行以下代码：\ngreet()\n\n输出将会是：\nSomething is happening before the function is called.\nHello, World!\nSomething is happening after the function is called.\n\n这在很多场景下非常有用，比如添加日志、性能测试、事务处理、缓存等。\n"},{"title":"python-defaultdict ()和默认dict{}的区别",
"url":"/blog/python-dict/",
"date":"2024-11-03",
"headings":[{"level":1,"id":"shi-yong-dict","permalink":"https://linxz.online/blog/python-dict/#shi-yong-dict","title":"使用 dict()","children":[]},{"level":1,"id":"shi-yong-defaultdict","permalink":"https://linxz.online/blog/python-dict/#shi-yong-defaultdict","title":"使用 defaultdict","children":[]}],
"body":"区别：\ndefaultdict会自动给key赋予初始value是0，不用处理key不在dict()的异常情况。\n举个例子：\n使用 dict()\n当使用普通字典时，如果尝试访问或修改一个不存在的键，你需要手动处理这种情况。例如，在统计字符出现次数的例子中，使用普通字典需要额外的代码来检查键是否存在：\ntext = &quot;hello world&quot;\nchar_count = {}\n\nfor char in text:\n    if char in char_count:\n        char_count[char] += 1\n    else:\n        char_count[char] = 1\n\nprint(char_count)\n\n在这个例子中，你必须使用if-else语句来检查每个字符是否已经在字典中。如果字符不在字典中，你需要先初始化它的计数为1，然后才能进行累加操作。\n使用 defaultdict\n相比之下，defaultdict自动处理不存在的键。如果你尝试访问或修改一个不存在的键，defaultdict会使用提供的工厂函数来为该键创建一个默认值，然后返回这个值。这样可以减少代码量并提高可读性：\nfrom collections import defaultdict\n\ntext = &quot;hello world&quot;\nchar_count = defaultdict(int)  # 默认值是0\nprint(char_count)\n\nfor char in text:\n    char_count[char] += 1\n    print(char_count)\n\nprint(char_count)\n\n在这个例子中，你不需要检查字符是否已经存在于字典中。如果字符不存在，defaultdict会自动创建一个值为0的条目，然后进行累加操作。这使得代码更加简洁和直观。\n上述的代码会输出hello world各个字母出现的次数，结果是：\ndefaultdict(&lt;class &#39;int&#39;&gt;, {})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 2})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 2, &#39;o&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 2, &#39;o&#39;: 1, &#39; &#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 2, &#39;o&#39;: 1, &#39; &#39;: 1, &#39;w&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 2, &#39;o&#39;: 2, &#39; &#39;: 1, &#39;w&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 2, &#39;o&#39;: 2, &#39; &#39;: 1, &#39;w&#39;: 1, &#39;r&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 3, &#39;o&#39;: 2, &#39; &#39;: 1, &#39;w&#39;: 1, &#39;r&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 3, &#39;o&#39;: 2, &#39; &#39;: 1, &#39;w&#39;: 1, &#39;r&#39;: 1, &#39;d&#39;: 1})\ndefaultdict(&lt;class &#39;int&#39;&gt;, {&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 3, &#39;o&#39;: 2, &#39; &#39;: 1, &#39;w&#39;: 1, &#39;r&#39;: 1, &#39;d&#39;: 1})\n\n"},{"title":"什么是工厂函数（Factory Function）",
"url":"/blog/python-factory/",
"date":"2024-11-03",
"headings":[{"level":1,"id":"shi-yong-lei-de-gou-zao-han-shu","permalink":"https://linxz.online/blog/python-factory/#shi-yong-lei-de-gou-zao-han-shu","title":"使用类的构造函数","children":[]},{"level":1,"id":"shi-yong-gong-han-han-shu","permalink":"https://linxz.online/blog/python-factory/#shi-yong-gong-han-han-shu","title":"使用工厂函数","children":[]}],
"body":"工厂函数指不需要直接创建class，就可以引用class的function。\n举个例子：\n假设有一个表示“交通工具”的场景。\n使用类的构造函数\nclass Car:\n    def __init__(self, brand):\n        self.brand = brand\n\nclass Bike:\n    def __init__(self, type):\n        self.type = type\n\n# 创建对象\nmy_car = Car(&quot;Toyota&quot;)\nmy_bike = Bike(&quot;Mountain&quot;)\n\n在这个例子中，我们直接使用各自的构造函数来创建Car和Bike对象。\n使用工厂函数\nclass Car:\n    def __init__(self, brand):\n        self.brand = brand\n\nclass Bike:\n    def __init__(self, type):\n        self.type = type\n\ndef vehicle_factory(vehicle_type, attribute):\n    if vehicle_type == &quot;car&quot;:\n        return Car(attribute)\n    elif vehicle_type == &quot;bike&quot;:\n        return Bike(attribute)\n\n# 创建对象\nmy_vehicle1 = vehicle_factory(&quot;car&quot;, &quot;Toyota&quot;)\nmy_vehicle2 = vehicle_factory(&quot;bike&quot;, &quot;Mountain&quot;)\n\n在这个例子中，vehicle_factory是一个工厂函数，根据传入的vehicle_type参数来决定创建Car还是Bike对象。这种方式更加灵活和抽象，因为调用者不需要直接与具体的Car或Bike类打交道。\n"},{"title":"Python: humanize获取文件大小",
"url":"/blog/python-humanize/",
"date":"2024-11-03",
"headings":[],
"body":"作用：字节转MB\n我们一般获取文件大小会获取字节，比如2,980,470 字节，但如果想要更人性化的方式表示，比如xxMB, xxGB，就需要用humanize\n代码如下：\nimport os\nimport humanize\n\n# 文件路径\nfile_path = &quot;/Users/lxz/Downloads/言语治疗中心三折页.pdf&quot;\n\n# 获取文件大小\nfile_size = os.path.getsize(file_path)\n\n# 使用 humanize.naturalsize 格式化文件大小\n# binary=true指除以1024，false指除以1000\nreadable_size = humanize.naturalsize(file_size, binary=True)\n\nprint(readable_size)\n\n"},{"title":"Python从本文件夹导入模块",
"url":"/blog/python-import/",
"date":"2024-11-03",
"headings":[],
"body":"遇到这个代码：\nfrom .embeddable import EmbeddableExtractor\n\n查了一下，.代表就是本文件夹，embeddable.py位于本文件夹下面。\nEmbeddableExtractor是embeddable.py里面的一个class.\n"},{"title":"站立伸展运动-办公室可以做的运动",
"url":"/blog/stand-up-sports/",
"date":"2024-11-03",
"headings":[{"level":1,"id":"yi-zhan-li-yao-bu-qian-shen-zhan-yun-dong","permalink":"https://linxz.online/blog/stand-up-sports/#yi-zhan-li-yao-bu-qian-shen-zhan-yun-dong","title":"（一）站立腰部前伸展运动","children":[]},{"level":1,"id":"er-zhan-li-yao-bu-hou-shen-zhan-yun-dong","permalink":"https://linxz.online/blog/stand-up-sports/#er-zhan-li-yao-bu-hou-shen-zhan-yun-dong","title":"（二）站立腰部后伸展运动","children":[]},{"level":1,"id":"san-zhan-li-tui-bu-shen-zhan-yun-dong","permalink":"https://linxz.online/blog/stand-up-sports/#san-zhan-li-tui-bu-shen-zhan-yun-dong","title":"（三）站立腿部伸展运动","children":[]},{"level":1,"id":"si-zhan-li-xiao-tui-la-shen-yun-dong","permalink":"https://linxz.online/blog/stand-up-sports/#si-zhan-li-xiao-tui-la-shen-yun-dong","title":"（四）站立小腿拉伸运动","children":[]},{"level":1,"id":"wu-gu-si-tou-ji-la-shen-yun-dong","permalink":"https://linxz.online/blog/stand-up-sports/#wu-gu-si-tou-ji-la-shen-yun-dong","title":"（五）股四头肌拉伸运动","children":[]},{"level":1,"id":"liu-jiao-zhi-bei-dong-la-shen-yun-dong","permalink":"https://linxz.online/blog/stand-up-sports/#liu-jiao-zhi-bei-dong-la-shen-yun-dong","title":"（六）脚趾被动拉伸运动","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/stand-up-sports/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"介绍6个动作。\n（一）站立腰部前伸展运动\n\n（1）站位，双腿保持直立；\n（2）双手向前仲展，保持腰部直立向前倾；\n（3）尽可能使颈、肩、背、臀在同一直线上；\n（4）腰背部有放松伸展的感受后，保持10~30秒。\n注意：如果疼痛度较高，可减小前倾幅度，并在动作之间进行休息。\n（二）站立腰部后伸展运动\n\n（1）站位，双腿分开与肩同宽；\n（2）双手叉腰，拇指位于后背，帮助稳定腰部；\n（3）慢慢地向后弯腰，直到腰背部有放松伸展的感觉，保持10～30秒。\n注意：如果终痛度较高，可降低后弯腰的幅度，并在动作之间进行休息，或者直接暂停该动作。\n（三）站立腿部伸展运动\n\n（1） 站位，抬起一条腿；\n（2） 像钟摆一样，由后向前摆动；\n（3）运动过程中，会觉得大腿后侧有轻度拉伸感。\n注意：如果终痛度较高，可降低摆动的幅度，并在动作之间进行休息，或者直接暂停该动作。\n（四）站立小腿拉伸运动\n\n（1）两腿保持前后站立；\n（2）前腿屈膝，身体往前倾拉伸后腿，直到后腿小腿肚有拉伸感，注意后腿脚跟不可离地；\n（3）保持拉伸姿势 10～30秒：\n（4）放松后交换两腿位置，重复以上动作。\n（五）股四头肌拉伸运动\n\n（1）单腿站立，可伸出左手扶墙以保持身体平衡；\n（2）屈膝，同时向后伸出右手握住右脚踝；\n（3）尽量向上拉脚跟以接近臀部，同时大腿尽量向后倾， 左腿保持伸直；\n（4）保持拉伸姿势10～30秒。\n注意：拉伸的目标不是让脚后跟接触臀部，而是要感觉大腿肌肉逐渐伸展。如果你不能在伸展时抓住脚踝，可以尝试使用毛巾绕着脚踝，并抓住毛巾两端进行拉伸。\n（六）脚趾被动拉伸运动\n\n（1）保持上半身直立，双膝跪地，弯曲脚趾支撑足部；\n（2）慢慢蹲坐在脚跟上直到足底有拉伸感，保持15秒；\n（3）返回起始位置。\n注意：做此运动时上半身需保持直立，脚趾需保持弯曲。\n以上运动，若出现运动加重症状，建议降低运动幅度或暂停该运动。\n参考资料\n每日一动，远离疼痛 - 罗炜樑，李梅\n"},{"title":"Java语言的优缺点",
"url":"/blog/java-good-and-bad/",
"date":"2024-11-02",
"headings":[{"level":1,"id":"you-dian","permalink":"https://linxz.online/blog/java-good-and-bad/#you-dian","title":"优点","children":[{"level":2,"id":"kua-ping-tai-xing","permalink":"https://linxz.online/blog/java-good-and-bad/#kua-ping-tai-xing","title":"跨平台性","children":[]},{"level":2,"id":"mian-xiang-dui-xiang-xing","permalink":"https://linxz.online/blog/java-good-and-bad/#mian-xiang-dui-xiang-xing","title":"面向对象性","children":[]},{"level":2,"id":"jian-zhuang-xing","permalink":"https://linxz.online/blog/java-good-and-bad/#jian-zhuang-xing","title":"健壮性","children":[]},{"level":2,"id":"an-quan-xing-gao","permalink":"https://linxz.online/blog/java-good-and-bad/#an-quan-xing-gao","title":"安全性高","children":[]},{"level":2,"id":"jian-dan-xing","permalink":"https://linxz.online/blog/java-good-and-bad/#jian-dan-xing","title":"简单性","children":[]},{"level":2,"id":"gao-xing-neng","permalink":"https://linxz.online/blog/java-good-and-bad/#gao-xing-neng","title":"高性能","children":[]}]},{"level":1,"id":"que-dian","permalink":"https://linxz.online/blog/java-good-and-bad/#que-dian","title":"缺点","children":[]}],
"body":"Java继承了C和C++很多成分。\n可以看成是类C语言衍生的产物。\n青出于蓝，而胜于蓝。\n优点\n跨平台性\nJava编写的程序，在不同系统平台都可以运行。Write Once, Run anywhre.\n\n原理：只需要在操作系统上，先安装一个java虚拟机（JVM，java virtual machine），由JVM负责java代码在该系统的运行。\n面向对象性\n面向对象是一种程序设计技术，非常适合大型软件的设计和开发。面向对象编程支持封装、继承、多态等特性，让程序更好达到高内聚，低耦合的标准。\n健壮性\n吸收了C/C++语言的优点，但去掉了其影响程序健壮性的部分（如指针、内存的申请与释放等），提供了一个相对安全的内存管理和访问机制。\n安全性高\nJava适合于网络/分布式环境，需要提供一个安全机制以防恶意代码的攻击。如：安全防范机制（ClassLoader类加载器），可以分配不同的命名空间以防替代本地的同名类、字节代码检查。\n简单性\nJava就是C++语法的简化版，我们也可以将Java称之为“C++--”。比如：头文件，指针运算，结构，联合，操作符重载，虚基类等。\n高性能\n\nJava最初发展阶段，总是被人诟病“性能低”；客观上，高级语言运行效率总是低于低级语言的，这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如，通过JIT(JUST IN TIME)即时编译技术提高运行效率。\nJava低性能的短腿，已经被完全解决了。业界发展上，我们也看到很多C++应用转到Java开发，很多C++程序员转型为Java程序员。\n\n缺点\n\n语法过于复杂、严谨，对程序员的约束比较多，与python、php等相比入门较难。但是一旦学会了，就业岗位需求量大，而且薪资待遇节节攀升。\n一般适用于大型网站开发，整个架构会比较重，对于初创公司开发和维护人员的成本比较高（即薪资高），选择用Java语言开发网站或应用系统的需要一定的经济实力。\n并非适用于所有领域。比如，Objective C、Swift在iOS设备上就有着无可取代的地位。浏览器中的处理几乎完全由JavaScript掌控。Windows程序通常都用C++或C#编写。Java在服务器端编程和跨平台客户端应用领域则很有优势。\n\n"},{"title":"JavaScript的数组方法",
"url":"/blog/js-array/",
"date":"2024-11-02",
"headings":[{"level":1,"id":"mu-lu","permalink":"https://linxz.online/blog/js-array/#mu-lu","title":"目录","children":[]},{"level":1,"id":"shi-fou-gai-bian-yuan-shu-zu","permalink":"https://linxz.online/blog/js-array/#shi-fou-gai-bian-yuan-shu-zu","title":"是否改变原数组","children":[{"level":2,"id":"gai-bian-yuan-shu-zu-de-fang-fa","permalink":"https://linxz.online/blog/js-array/#gai-bian-yuan-shu-zu-de-fang-fa","title":"改变原数组的方法","children":[]},{"level":2,"id":"bu-gai-bian-yuan-shu-zu-de-fang-fa","permalink":"https://linxz.online/blog/js-array/#bu-gai-bian-yuan-shu-zu-de-fang-fa","title":"不改变原数组的方法","children":[]}]},{"level":1,"id":"map","permalink":"https://linxz.online/blog/js-array/#map","title":"map()","children":[{"level":2,"id":"mapan-li-rang-suo-you-yuan-su-cheng-yi-2","permalink":"https://linxz.online/blog/js-array/#mapan-li-rang-suo-you-yuan-su-cheng-yi-2","title":"map案例：让所有元素乘以2","children":[]}]},{"level":1,"id":"foreach","permalink":"https://linxz.online/blog/js-array/#foreach","title":"forEach()","children":[{"level":2,"id":"foreach-he-map-shi-yong-de-chang-jing","permalink":"https://linxz.online/blog/js-array/#foreach-he-map-shi-yong-de-chang-jing","title":"forEach() 和 map() 使用的场景：","children":[]}]},{"level":1,"id":"slice","permalink":"https://linxz.online/blog/js-array/#slice","title":"slice()","children":[{"level":2,"id":"jian-qie-shu-zu-ju-li","permalink":"https://linxz.online/blog/js-array/#jian-qie-shu-zu-ju-li","title":"剪切数组举例","children":[]},{"level":2,"id":"fu-zhi-shu-zu-ju-li","permalink":"https://linxz.online/blog/js-array/#fu-zhi-shu-zu-ju-li","title":"复制数组举例","children":[]}]},{"level":1,"id":"splice","permalink":"https://linxz.online/blog/js-array/#splice","title":"splice()","children":[{"level":2,"id":"tian-jia-shu-zu-yuan-su-ju-li","permalink":"https://linxz.online/blog/js-array/#tian-jia-shu-zu-yuan-su-ju-li","title":"添加数组元素举例","children":[]},{"level":2,"id":"ti-huan-shu-zu-yuan-su-ju-li","permalink":"https://linxz.online/blog/js-array/#ti-huan-shu-zu-yuan-su-ju-li","title":"替换数组元素举例","children":[]}]},{"level":1,"id":"find","permalink":"https://linxz.online/blog/js-array/#find","title":"find()","children":[{"level":2,"id":"findyong-fa-ju-li","permalink":"https://linxz.online/blog/js-array/#findyong-fa-ju-li","title":"find用法举例","children":[]}]},{"level":1,"id":"filter","permalink":"https://linxz.online/blog/js-array/#filter","title":"filter()","children":[{"level":2,"id":"filteran-li-wo-yao-suo-you-da-yu-10de-yuan-su","permalink":"https://linxz.online/blog/js-array/#filteran-li-wo-yao-suo-you-da-yu-10de-yuan-su","title":"filter案例：我要所有大于10的元素","children":[]}]},{"level":1,"id":"shift","permalink":"https://linxz.online/blog/js-array/#shift","title":"shift()","children":[{"level":2,"id":"gai-bian-yuan-shu-zu-chang-du-ju-li","permalink":"https://linxz.online/blog/js-array/#gai-bian-yuan-shu-zu-chang-du-ju-li","title":"改变原数组长度举例","children":[]}]},{"level":1,"id":"reference","permalink":"https://linxz.online/blog/js-array/#reference","title":"参考","children":[]}],
"body":"目录\n\nmap()\nforEach()\nfilter()\nfind()\nshift()\nslice()\nsplice()\n参考\n\n是否改变原数组\n改变原数组的方法\n\nshift 删除数组第一个元素，返回该元素的值。\nsplice 添加或替换数组元素，返回新数组。\nslice 剪切或复制数组，返回新数组。\n\n不改变原数组的方法\n\nmap 创建新数组，由函数返回值组成。\nforEach 让数组各元素调用函数，返回undefined.\nfilter 创建新数组，由符合条件（函数）组成。\nfind 找到符合条件（函数）的第一个值，返回改值。\n\nmap()\nArray.prototype.map()\nmap()创建一个新数组，由原来数组每个元素调用一次函数的返回值组成。\n注意，如果使用if条件判断，若元素套入函数没有返回值，JavaScript默认的返回值为undefine。\n因此，涉及条件判断最好使用filter，否则会出现意想不到的结果。\nmap案例：让所有元素乘以2\nconst array1 = [1, 4, 9, 16];\n\n// Pass a function to map\nconst map1 = array1.map((x) =&gt; x * 2);\n\nconsole.log(map1);\n// Expected output: Array [2, 8, 18, 32]\n\nforEach()\n与map功能基本一致，都是让数组每个元素调用函数，区别是没有返回值，实际返回值应该是undefined。\nforEach() 和 map() 使用的场景：\n\nforEach() 适合的场景：\n\nconst users = [&#39;Alice&#39;, &#39;Bob&#39;, &#39;Charlie&#39;];\nusers.forEach(user =&gt; {\n    sendEmail(user); // 发送邮件这种操作不需要返回值\n});\n\n\nmap()适合的场景：\n\nconst users = [\n    { name: &#39;Alice&#39;, age: 25 },\n    { name: &#39;Bob&#39;, age: 30 }\n];\nconst userNames = users.map(user =&gt; user.name);\n// userNames = [&#39;Alice&#39;, &#39;Bob&#39;]\n\n简单来说：\n\n\n如果你只需要执行操作而不需要新数组，用 forEach()\n\n\n如果你需要基于原数组创建新数组，用 map()\n\n\nslice()\n剪切数组/复制数组，返回一个新数组，\n参数有两个：start和end，包含从start，但不包含end的新数组。\n如果不输入参数，有复制一个一模一样的新数组的功能。\n剪切数组举例\nconst animals = [&#39;ant&#39;, &#39;bison&#39;, &#39;camel&#39;, &#39;duck&#39;, &#39;elephant&#39;];\n\nconsole.log(animals.slice(2));\n// Expected output: Array [&quot;camel&quot;, &quot;duck&quot;, &quot;elephant&quot;]\n\nconsole.log(animals.slice(2, 4));\n// Expected output: Array [&quot;camel&quot;, &quot;duck&quot;]\n\nconsole.log(animals.slice(1, 5));\n// Expected output: Array [&quot;bison&quot;, &quot;camel&quot;, &quot;duck&quot;, &quot;elephant&quot;]\n\nconsole.log(animals.slice(-2));\n// Expected output: Array [&quot;duck&quot;, &quot;elephant&quot;]\n\nconsole.log(animals.slice(2, -1));\n// Expected output: Array [&quot;camel&quot;, &quot;duck&quot;]\n\n复制数组举例\nconst animals = [&#39;ant&#39;, &#39;bison&#39;, &#39;camel&#39;, &#39;duck&#39;, &#39;elephant&#39;];\n\nconsole.log(animals.slice());\n// Expected output: Array [&quot;ant&quot;, &quot;bison&quot;, &quot;camel&quot;, &quot;duck&quot;, &quot;elephant&quot;]\n\nsplice()\n给数组添加元素或替换元素。改变原数组。\n三个参数。\n第一个参数指需要改变的index，第二个参数指需要删除的元素个数，0指不需要删除，第三个参数指替换的新值。\n添加数组元素举例\nconst months = [&#39;Jan&#39;, &#39;March&#39;, &#39;April&#39;, &#39;June&#39;];\nmonths.splice(1, 0, &#39;Feb&#39;);\n// Inserts at index 1\nconsole.log(months);\n// Expected output: Array [&quot;Jan&quot;, &quot;Feb&quot;, &quot;March&quot;, &quot;April&quot;, &quot;June&quot;]\n\n替换数组元素举例\nmonths.splice(4, 1, &#39;May&#39;);\n// Replaces 1 element at index 4\nconsole.log(months);\n// Expected output: Array [&quot;Jan&quot;, &quot;Feb&quot;, &quot;March&quot;, &quot;April&quot;, &quot;May&quot;]\n\nfind()\n找到符合条件的第一个元素。\n注意，想要找到所有符合条件（函数）的值，可以用filter方法。\nfind用法举例\nconst array1 = [5, 12, 8, 130, 44];\n\nconst found = array1.find((element) =&gt; element &gt; 10);\n\nconsole.log(found);\n// Expected output: 12\n\nfilter()\n作用是过滤。\n若元素在给定的函数中，返回true结，则返回元素；如元素在给定函数中，返回false，则不返回元素。\n所有返回元素组成一个新数组。\nfilter案例：我要所有大于10的元素\nfunction isBigEnough(value) {\n  return value &gt;= 10;\n}\n\nconst filtered = [12, 5, 8, 130, 44].filter(isBigEnough);\n// filtered is [12, 130, 44]\n\nshift()\n用法：改变原数组长度。\n返回值：从数组中删除第一个元素，并返回该元素的值。\n改变原数组长度举例\nconst array1 = [1, 2, 3];\n\nconst firstElement = array1.shift();\n\nconsole.log(array1);\n// Expected output: Array [2, 3]\n\nconsole.log(firstElement);\n// Expected output: 1\n\n参考\nMDN Array知识\n"},{"title":"麦肯基七步颈部锻炼法",
"url":"/blog/mckenzie-neck/",
"date":"2024-10-31",
"headings":[{"level":1,"id":"yi-shou-xia-ba-da-fa","permalink":"https://linxz.online/blog/mckenzie-neck/#yi-shou-xia-ba-da-fa","title":"一.收下巴大法","children":[]},{"level":1,"id":"er-yang-tou-zuo-you-bai","permalink":"https://linxz.online/blog/mckenzie-neck/#er-yang-tou-zuo-you-bai","title":"二.仰头左右摆","children":[]},{"level":1,"id":"san-ping-tang-shou-suo","permalink":"https://linxz.online/blog/mckenzie-neck/#san-ping-tang-shou-suo","title":"三.平躺收缩","children":[]},{"level":1,"id":"si-ping-tang-zuo-you-bai","permalink":"https://linxz.online/blog/mckenzie-neck/#si-ping-tang-zuo-you-bai","title":"四.平躺左右摆","children":[]},{"level":1,"id":"wu-jing-bu-ce-wan-yun-dong","permalink":"https://linxz.online/blog/mckenzie-neck/#wu-jing-bu-ce-wan-yun-dong","title":"五.颈部侧弯运动","children":[]},{"level":1,"id":"liu-jing-bu-xuan-zhuan-yun-dong","permalink":"https://linxz.online/blog/mckenzie-neck/#liu-jing-bu-xuan-zhuan-yun-dong","title":"六.颈部旋转运动","children":[]},{"level":1,"id":"qi-zuo-shi-jing-bu-wan-qu-yun-dong","permalink":"https://linxz.online/blog/mckenzie-neck/#qi-zuo-shi-jing-bu-wan-qu-yun-dong","title":"七.坐式颈部弯曲运动","children":[]}],
"body":"编者注：\n麦肯基颈部锻炼法是享誉全球的颈部锻炼方法，适用范围很广。但是，这并不代表适合每一个人，请大家按照自己的实际情况锻炼。\n如果感觉疼痛请自觉减少锻炼的幅度（比如后仰角度过大，可以调小角度）或者寻找其他的锻炼方法。\n另外，我在实践麦肯基锻炼的过程中，发现缩下巴才是这套锻炼的精髓，请试着每个动作前都把下巴收起来（即做每步动作前都先做第一步），这有助于保持脊柱中立，提高颈椎的稳定性。\n一.收下巴大法\n\n\n\n平视前方，头部自然前倾。\n\n\n收下巴到极限，双手放在下巴上并下压，注意平视前方。\n\n\n二.仰头左右摆\n\n\n\n头自然回缩，头部后仰，一定要根据自己的情況后仰。\n\n\n缓慢向左向右摆动\n\n\n三.平躺收缩\n\n\n\n本项练习主要用于急性颈部疼痛的治疗。如果练习1和练习2对你没有什么效果，那么你可以试一试本项练习。\n\n\n如果疼痛集中或者强度减轻, 你应当每天练习6到-8组，每组10次。（既然你晚上时会躺在床上，那么晚上就是一个练习的绝佳时机。）\n\n\n四.平躺左右摆\n\n\n\n本项练习主要用于急性颈部疼痛的治疗。如果练习1 和练习2 对你没有什么效果，那么你可以试一试本项练习。\n\n\n将脖子放在床沿上，用一只手支撑住头部的同时，缓慢地仰头。逐步把手移开，让头尽可能后仰。\n\n\n保持这个动作，缓慢地左右摆动头部。\n\n\n五.颈部侧弯运动\n\n\n\n颈部向一侧弯曲，让一只耳朵靠近肩膀。（不要摆动头部）\n\n\n弯曲直到最大幅度，保持几秒，再反方向，每天6到8组，每组10次。\n\n\n\n\n\n进阶玩法：你也可以将手放在头部一侧，轻轻地将头部进一步向疼痛的一侧扳，这样将使练习更加有效。保持这个姿势几秒钟，然后恢复到开始的姿势。\n\n\n记得在做这个动作时头部一定要保持回缩的姿势。\n\n\n六.颈部旋转运动\n\n\n\n旋转头部，尽量转动到最大幅度，同时保持头部回缩的姿势，再相反方向。\n\n\n如果你在转向一侧时感觉到的疼痛比转向另一侧时大，你可以只做转向疼痛一侧的动作。随着练习的继续，这种疼痛应该会集中到中部，或者逐渐消退。\n\n\n\n\n进阶玩法：在转动时使用双手慢慢地进一步加大头部的运动的幅度会使练习更加有效。将转动到最大幅度的姿势保持几秒钟，然后恢复到开始时的状态。\n\n七.坐式颈部弯曲运动\n\n\n\n低头含胸，让下巴靠近胸部，保持2到3秒后放松。\n\n\n本项练习主要用于治疗头痛，并对急性发作恢复之后残留的颈部疼痛和僵硬感也有一定的效果。不论是哪种情况，本项练习都应当每天做6到8组，每组2到3次。\n\n\n"},{"title":"TypeScript介绍",
"url":"/blog/typescript-intro/",
"date":"2024-10-31",
"headings":[{"level":1,"id":"shen-me-shi-typescript","permalink":"https://linxz.online/blog/typescript-intro/#shen-me-shi-typescript","title":"什么是TypeScript","children":[]},{"level":1,"id":"wei-shen-me-xu-yao-ts","permalink":"https://linxz.online/blog/typescript-intro/#wei-shen-me-xu-yao-ts","title":"为什么需要TS","children":[]},{"level":1,"id":"jing-tai-lei-xing-jian-cha","permalink":"https://linxz.online/blog/typescript-intro/#jing-tai-lei-xing-jian-cha","title":"静态类型检查","children":[]},{"level":1,"id":"ru-he-bian-yi-ts","permalink":"https://linxz.online/blog/typescript-intro/#ru-he-bian-yi-ts","title":"如何编译TS","children":[{"level":2,"id":"ming-ling-xing-bian-yi","permalink":"https://linxz.online/blog/typescript-intro/#ming-ling-xing-bian-yi","title":"命令行编译","children":[]},{"level":2,"id":"zi-dong-hua-bian-yi","permalink":"https://linxz.online/blog/typescript-intro/#zi-dong-hua-bian-yi","title":"自动化编译","children":[]}]},{"level":1,"id":"lei-xing-sheng-ming","permalink":"https://linxz.online/blog/typescript-intro/#lei-xing-sheng-ming","title":"类型声明","children":[]},{"level":1,"id":"lei-xing-tui-duan","permalink":"https://linxz.online/blog/typescript-intro/#lei-xing-tui-duan","title":"类型推断","children":[]},{"level":1,"id":"lei-xing-zong-lan","permalink":"https://linxz.online/blog/typescript-intro/#lei-xing-zong-lan","title":"类型总览","children":[{"level":2,"id":"javascriptde-lei-xing-zong-lan","permalink":"https://linxz.online/blog/typescript-intro/#javascriptde-lei-xing-zong-lan","title":"JavaScript的类型总览：","children":[]},{"level":2,"id":"typescriptde-lei-xing-zong-lan","permalink":"https://linxz.online/blog/typescript-intro/#typescriptde-lei-xing-zong-lan","title":"TypeScript的类型总览：","children":[]},{"level":2,"id":"bao-zhuang-dui-xiang-vs-yuan-shi-lei-xing","permalink":"https://linxz.online/blog/typescript-intro/#bao-zhuang-dui-xiang-vs-yuan-shi-lei-xing","title":"包装对象 vs 原始类型","children":[]}]},{"level":1,"id":"chang-yong-lei-xing","permalink":"https://linxz.online/blog/typescript-intro/#chang-yong-lei-xing","title":"常用类型","children":[{"level":2,"id":"any","permalink":"https://linxz.online/blog/typescript-intro/#any","title":"any","children":[]},{"level":2,"id":"unknown","permalink":"https://linxz.online/blog/typescript-intro/#unknown","title":"unknown","children":[]},{"level":2,"id":"never","permalink":"https://linxz.online/blog/typescript-intro/#never","title":"never","children":[]},{"level":2,"id":"void","permalink":"https://linxz.online/blog/typescript-intro/#void","title":"void","children":[]},{"level":2,"id":"object","permalink":"https://linxz.online/blog/typescript-intro/#object","title":"object","children":[{"level":3,"id":"xiao-objecthe-da-objectyi-ban-bu-yong","permalink":"https://linxz.online/blog/typescript-intro/#xiao-objecthe-da-objectyi-ban-bu-yong","title":"小object和大Object一般不用","children":[]},{"level":3,"id":"zen-me-sheng-ming-dui-xiang","permalink":"https://linxz.online/blog/typescript-intro/#zen-me-sheng-ming-dui-xiang","title":"怎么声明对象？","children":[]},{"level":3,"id":"sheng-ming-dui-xiang-zhui-jia-shu-xing","permalink":"https://linxz.online/blog/typescript-intro/#sheng-ming-dui-xiang-zhui-jia-shu-xing","title":"声明对象追加属性","children":[]},{"level":3,"id":"sheng-ming-han-shu-lei-xing","permalink":"https://linxz.online/blog/typescript-intro/#sheng-ming-han-shu-lei-xing","title":"声明函数类型","children":[]},{"level":3,"id":"sheng-ming-shu-zu-lei-xing","permalink":"https://linxz.online/blog/typescript-intro/#sheng-ming-shu-zu-lei-xing","title":"声明数组类型","children":[]}]},{"level":2,"id":"tuple","permalink":"https://linxz.online/blog/typescript-intro/#tuple","title":"tuple","children":[]},{"level":2,"id":"enum","permalink":"https://linxz.online/blog/typescript-intro/#enum","title":"enum","children":[{"level":3,"id":"shu-zi-mei-ju","permalink":"https://linxz.online/blog/typescript-intro/#shu-zi-mei-ju","title":"数字枚举","children":[]},{"level":3,"id":"zi-fu-chuan-mei-ju","permalink":"https://linxz.online/blog/typescript-intro/#zi-fu-chuan-mei-ju","title":"字符串枚举","children":[]},{"level":3,"id":"chang-liang-mei-ju","permalink":"https://linxz.online/blog/typescript-intro/#chang-liang-mei-ju","title":"常量枚举","children":[]}]},{"level":2,"id":"type","permalink":"https://linxz.online/blog/typescript-intro/#type","title":"type","children":[{"level":3,"id":"lian-he-lei-xing-huo","permalink":"https://linxz.online/blog/typescript-intro/#lian-he-lei-xing-huo","title":"联合类型（“或”）","children":[]},{"level":3,"id":"jiao-cha-lei-xing-bing-qie","permalink":"https://linxz.online/blog/typescript-intro/#jiao-cha-lei-xing-bing-qie","title":"交叉类型（“并且”）","children":[]},{"level":3,"id":"yi-chong-li-wai-qing-kuang","permalink":"https://linxz.online/blog/typescript-intro/#yi-chong-li-wai-qing-kuang","title":"一种例外情况","children":[]}]}]},{"level":1,"id":"lei-class","permalink":"https://linxz.online/blog/typescript-intro/#lei-class","title":"类class","children":[]},{"level":1,"id":"shu-xing-xiu-shi-fu","permalink":"https://linxz.online/blog/typescript-intro/#shu-xing-xiu-shi-fu","title":"属性修饰符","children":[{"level":2,"id":"publicxiu-shi-fu","permalink":"https://linxz.online/blog/typescript-intro/#publicxiu-shi-fu","title":"public修饰符","children":[]},{"level":2,"id":"shu-xing-de-jian-xie-xing-shi","permalink":"https://linxz.online/blog/typescript-intro/#shu-xing-de-jian-xie-xing-shi","title":"属性的简写形式","children":[]},{"level":2,"id":"protectedxiu-shi-fu","permalink":"https://linxz.online/blog/typescript-intro/#protectedxiu-shi-fu","title":"protected修饰符","children":[]},{"level":2,"id":"privatexiu-shi-fu","permalink":"https://linxz.online/blog/typescript-intro/#privatexiu-shi-fu","title":"private修饰符","children":[]},{"level":2,"id":"readonlyxiu-shi-fu","permalink":"https://linxz.online/blog/typescript-intro/#readonlyxiu-shi-fu","title":"readonly修饰符","children":[]}]},{"level":1,"id":"chou-xiang-lei","permalink":"https://linxz.online/blog/typescript-intro/#chou-xiang-lei","title":"抽象类","children":[]},{"level":1,"id":"interface-jie-kou","permalink":"https://linxz.online/blog/typescript-intro/#interface-jie-kou","title":"interface （接口）","children":[{"level":2,"id":"jie-kou-ding-yi-lei-jie-gou","permalink":"https://linxz.online/blog/typescript-intro/#jie-kou-ding-yi-lei-jie-gou","title":"接口定义类结构","children":[]},{"level":2,"id":"jie-kou-ding-yi-dui-xiang-jie-gou","permalink":"https://linxz.online/blog/typescript-intro/#jie-kou-ding-yi-dui-xiang-jie-gou","title":"接口定义对象结构","children":[]},{"level":2,"id":"jie-kou-ding-yi-han-shu-jie-gou","permalink":"https://linxz.online/blog/typescript-intro/#jie-kou-ding-yi-han-shu-jie-gou","title":"接口定义函数结构","children":[]},{"level":2,"id":"jie-kou-zhi-jian-de-ji-cheng","permalink":"https://linxz.online/blog/typescript-intro/#jie-kou-zhi-jian-de-ji-cheng","title":"接口之间的继承","children":[]},{"level":2,"id":"jie-kou-de-zi-dong-he-bing","permalink":"https://linxz.online/blog/typescript-intro/#jie-kou-de-zi-dong-he-bing","title":"接口的自动合并","children":[]},{"level":2,"id":"he-shi-shi-yong-jie-kou","permalink":"https://linxz.online/blog/typescript-intro/#he-shi-shi-yong-jie-kou","title":"何时使用接口？","children":[]}]},{"level":1,"id":"yi-xie-xiang-si-de-gai-nian","permalink":"https://linxz.online/blog/typescript-intro/#yi-xie-xiang-si-de-gai-nian","title":"一些相似的概念","children":[{"level":2,"id":"interfacehe-typede-qu-bie","permalink":"https://linxz.online/blog/typescript-intro/#interfacehe-typede-qu-bie","title":"interface和type的区别","children":[]},{"level":2,"id":"interfaceyu-chou-xiang-lei-de-qu-bie","permalink":"https://linxz.online/blog/typescript-intro/#interfaceyu-chou-xiang-lei-de-qu-bie","title":"interface与抽象类的区别","children":[]}]},{"level":1,"id":"fan-xing","permalink":"https://linxz.online/blog/typescript-intro/#fan-xing","title":"泛型","children":[{"level":2,"id":"fan-xing-han-shu","permalink":"https://linxz.online/blog/typescript-intro/#fan-xing-han-shu","title":"泛型函数","children":[]},{"level":2,"id":"fan-xing-ke-yi-you-duo-ge","permalink":"https://linxz.online/blog/typescript-intro/#fan-xing-ke-yi-you-duo-ge","title":"泛型可以有多个","children":[]},{"level":2,"id":"fan-xing-jie-kou","permalink":"https://linxz.online/blog/typescript-intro/#fan-xing-jie-kou","title":"泛型接口","children":[]}]},{"level":1,"id":"lei-xing-sheng-ming-wen-jian","permalink":"https://linxz.online/blog/typescript-intro/#lei-xing-sheng-ming-wen-jian","title":"类型声明文件","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/typescript-intro/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"什么是TypeScript\n微软开发的。\nTypeScript是JavaScript的一个超集，支持ES6标准，可以编译成纯JavaScript运行在任何浏览器上。适用于大型项目。\n\n为什么需要TS\nJS地位变得重要，代码量变多，但是JS出生简陋，有许多困扰：\n\n不清不楚的数据类型\n\n如果其他人给你数据，但是你不知道数据类型，可能就会错误使用：\nlet welcome = &#39;hello&#39;\nwelcome() //报错，welcome is not a function\n\n\nJS不会汇报逻辑错误\n\n比如以下代码，偶数部分的逻辑是永远不可能进入的：\nconst str = Date.now() % 2 ? &#39;奇数&#39; : &#39;偶数&#39;\n\nif (str !== &#39;奇数&#39;）{\n\talert(&#39;hello&#39;)\n} else if (str === &#39;偶数&#39;){\n\talert(&#39;world&#39;)\n}\n\n\n访问不存在属性时不会报错\n低级的拼写错误不会报错\n\n静态类型检查\n代码运行前检查，发现代码的错误或不合理之处，减少运行异常出现的概率。\n简言之，把运行时的错误前置。\n但是，这会造成TS的代码量比JS的大很多。不过在维护方面，TS远胜于JS。\n如何编译TS\n需要把.ts编译成.js\n命令行编译\nnpm i typescript -g\n\n安装完后，全局出现一个新命令tsc，即typescript compiler。\ntsc index //.ts可以省略\n\n编译后，出现一个.js文件。\n自动化编译\n初始化：\ntsc —init\n\n多了一个文件叫tsconfig.json。\n监视项目：\ntsc —watch\n\n如果希望不出错时不编译，可以在tsconfig.json中解开注释：\n&quot;noEmitOnError&quot;: true,\n\n还可以通过webpack进行编译。\n类型声明\n每个变量/参数/函数返回值都需要通过冒号来声明类型。\nlet a: string = &#39;Hello World&#39;;\nlet b: number = 10;\nlet c: boolean = true;\nlet d: &quot;hello&quot; // 字面量类型，只能赋值为 &#39;hello&#39;\n\na = 9; // Error: Type &#39;9&#39; is not assignable to type &#39;string&#39;.\na = false; // Error: Type &#39;false&#39; is not assignable to type &#39;string&#39;.\na = &#39;Hello&#39;; // OK\n\nb = 99; // OK\nc = false; // OK\n\nfunction count(x: number, y: number): number {\n  return x + y;\n}\n\nlet result = count(1, 2);\nconsole.log(result); // 3\n\ncount(1); // Error: Expected 2 arguments, but got 1.\n\nd = &#39;hell&#39;; // Error: Type &#39;&quot;hell&quot;&#39; is not assignable to type &#39;&quot;hello&quot;&#39;.\n\n类型推断\n// 类型推断\n\nlet d = -99; // 类型推断为 number\n\nd = &#39;hello&#39;; // 因为 d 已经被推断为 number 类型，所以这里会报错\n\n类型总览\nJavaScript的类型总览：\n\nstring\nnumber\nboolean\nnull\nundefined\nbiginit\nsymbol\nobject\n\n备注：其中object包含：Array, Function, Date, Error 等......\nTypeScript的类型总览：\n\n上述所有JavaScript类型\n六个新类型\n① any\n② unknown\n③ never\n④ void\n⑤ tuple\n⑥ enum\n两个自定义类型的方式\n① type\n② interface \n\n注意：\n在 Javascript 中的这些内置构造函数： Number String Boolean，它们用于创建对应的包装对象，在日常开发时很少使用，在 TypeScript 中也是同理，所以在 TypeScript 中进行类型声明时，通常都是用小写的 number、string、boolean。\n包装对象 vs 原始类型\nstring是原始类型，String是包装对象，我们通常用的是原始类型。\n// 类型总览\n\nlet str1: string; // TS官方推荐的写法\nstr1 = &#39;Hello World&#39;;\nstr1 = new String(&#39;hello&#39;); // 错误。不能把一个String对象赋值给一个string类型的变量\n\nlet str2: String;\nstr2 = &#39;hello&#39;;\nstr2 = new String(&#39;hello&#39;); // 正确。String对象可以赋值给String类型的变量\n\ntypeof(str1); // string\ntypeof(str2); // object\n\n常用类型\nany\n任意类型。放弃变量的类型检查。\n可以显式声明和隐式声明：\n// 常用数据类型\n\nlet p: any; // 显式any\n\np = 10;\np = &#39;hello&#39;;\np = true;\n\nlet q; // 隐式any\nq = 10;\n\nq = 10;\nq = &#39;hello&#39;;\nq = true;\n\nany的坑：any类型的值可以赋给任何数据类型\nlet q; // 隐式any\nq = 10;\n\nlet x: string;\nx = q; // 不会报错，因为 q 是 any 类型\n\nunknown\n可以理解为一个类型安全的any，适用于不确定数据的具体类型。\nunknown和any不一样，因为不会踩any的坑，即不能赋值给任何数据类型。\nlet a: unknown;\n\na = 99;\na = false;\na = &#39;hello&#39;;\n\nlet x: string;\nx = a; // 报错。不能将类型“unknown”分配给类型“string”\n\n如何让ts放心的把unknown类型的值赋给其他类型的变量呢？\n// 第一种：if判断\nif (typeof a === &#39;string&#39;) {\n    x = a;\n}\n\n// 第二种：类型断言的第一种写法\nx = a as string;\n\n// 第三种：类型断言的第二种写法\nx = &lt;string&gt;a;\n\nunknown也不能使用任何方法，any则相反：\nlet str1: string;\nstr1 = &#39;Hello World&#39;;\nstr1.toUpperCase();\n\nlet str2: any;\nstr2 = &#39;Hello TypeScript&#39;;\nstr2.toUpperCase();\n\nlet str3: unknown;\nstr3 = &#39;Hello TypeScript&#39;;\nstr3.toUpperCase(); // 报错。unknown不能调用string类型的方法\n\nnever\nnever用来限制函数的返回值，让函数不返回任何值。注意：一般函数至少会返回undefined，除非抛出错误。\nfunction demo(): never{\n    throw new Error(&#39;程序运行异常！&#39;); // 函数会抛出异常，不会有返回值；正常函数至少会返回undefined\n}\n\nvoid\n和never类似，也是用于函数的返回值。区别是void可以接受undefined。\n// void可以接受的“空”值：undefined\n\nfunction logMessage(msg:string): void {\n    console.log(msg);\n}\n\nfunction logMessage2(msg:string): void {\n    console.log(msg);\n    return;\n}\n\nfunction logMessage3(msg:string): void {\n    console.log(msg);\n    return undefined;\n}\n\nobject\n小object和大Object一般不用\n因为太宽泛了。\n// object 类型\n\nlet a: object; //a能存储的类型是【非原始类型】\nlet b: Object; //b能存储的类型是可以调用到Object上所有方法的类型\n\n\n// a能存储的类型\na = {};\na = {name: &#39;lison&#39;};\na = function () {};\na = new String(&#39;aaa&#39;);\nclass Person {}\na = new Person();\n\n// a不能存储的类型\na = 1;\na = &#39;aaa&#39;;\na = true;\na = undefined;\na = null;\n\n// b能存储的类型\nb = {};\nb = {name: &#39;lison&#39;};\nb = function () {};\nb = new String(&#39;aaa&#39;);\nb = new Person();\nb = 1;\nb = &#39;aaa&#39;;\nb = true;\n\n// b不能存储的类型\nb = undefined;\nb = null;\n\n怎么声明对象？\nlet person: {name: string, age?: number}; //?代表age属性是可选的\n\nperson = {name: &#39;Jack&#39;, age: 32};\n\n声明对象追加属性\nlet person: {\n    name: string\n    age?: number //?代表age属性是可选的\n    [key: string]: any //含义：除了name和age属性外，还可以有其他任意属性，属性名是字符串类型，属性值是任意类型\n}; \n\nperson = {name: &#39;Jack&#39;, age: 32, gender: &#39;男&#39;, height: 180};\n\n声明函数类型\nlet count: (a: number, b: number) =&gt; number;\n\ncount = (a, b) =&gt; {\n    return a + b;\n}\n\n声明数组类型\nlet arr: string[]; //第一种方式\nlet arr2: Array&lt;string&gt;; //第二种方式，泛型方式\n\narr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];\narr2 = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];\n\ntuple\n元组(tuple)是一种特殊的数组类型，它限定了数组的长度和每个元素的类型。\n// tuple是一种特殊的数组，它限定了数组的长度和每个元素的类型\nlet arr1: [string, number];\nlet arr2: [string, boolean?];\nlet arr3: [number, ...string[]]; //含义：你可以有任意多个string类型的元素，但是第一个元素必顼是number类型\n\narr1 = [&#39;Hello&#39;, 10];\narr2 = [&#39;Hello&#39;];\narr3 = [10, &#39;Hello&#39;, &#39;World&#39;];\n\nenum\n枚举(enum)可以定义一组命名常量，作用是增强代码的可读性，让代码更好维护。\n数字枚举\nenum Direction {\n    Up,\n    Down,\n    Left,\n    Right\n}\n\nconsole.log(Direction); // Direction是一个对象 { &#39;0&#39;: &#39;Up&#39;, &#39;1&#39;: &#39;Down&#39;, &#39;2&#39;: &#39;Left&#39;, &#39;3&#39;: &#39;Right&#39;, Up: 0, Down: 1, Left: 2, Right: 3 }\nconsole.log(Direction.Up); // 0\nconsole.log(Direction.Down); // 1\nconsole.log(Direction.Left); // 2\nconsole.log(Direction.Right); // 3\n\nconsole.log(Direction[0]); // Up\nconsole.log(Direction[1]); // Down\nconsole.log(Direction[2]); // Left\nconsole.log(Direction[3]); // Right\n\nfunction walk(data:Direction){\n    if (data === Direction.Up){ //避免直接使用字符串，避免写错\n        console.log(&quot;向【上】走&quot;);\n    } else if (data === Direction.Down){\n        console.log(&quot;向【下】走&quot;);\n    } else if (data === Direction.Left){\n        console.log(&quot;向【左】走&quot;);\n    } else if (data === Direction.Right){\n        console.log(&quot;向【右】走&quot;);\n    } else {\n        console.log(&quot;未知&quot;);\n    }\n}\n\nwalk(Direction.Up); // 向【上】走\n\n字符串枚举\nenum Direction {\n    Up = &quot;up&quot;,\n    Down = &quot;down&quot;,\n    Left = &quot;left&quot;,\n    Right = &quot;right&quot;\n}\n\n常量枚举\n把枚举包在一个常量const中。\n作用：ts编译成js后，只输出使用的枚举属性，比如Up，其他属性不输出，简化js代码。\nconst enum Direction {\n    Up,\n    Down,\n    Left,\n    Right\n}\n\nconsole.log(Direction.Up);\n\ntype\n能为任意多种数据类型创建别名。\n联合类型（“或”）\ntype Status = number | string;\ntype Gender = &quot;男&quot; | &quot;女&quot;;\n\nfunction printStatus(status: Status): void {\n  console.log(status);\n}\n\nprintStatus(200); // 200\n\n\nfunction printGender(gender: Gender): void  {\n  console.log(gender);\n}\n\nprintGender(&quot;不男不女&quot;); // 报错\n\n交叉类型（“并且”）\n// 面积\ntype Area = {\n    width: number;\n    height: number;\n}\n\n// 地址\ntype Address = {\n    city: string;\n    country: string;\n    room: number;\n}\n\ntype House = Area &amp; Address;\n\nconst house: House = {\n    width: 100,\n    height: 200,\n    city: &#39;Beijing&#39;,\n    country: &#39;China&#39;,\n    room: 505\n}\n\n一种例外情况\ntype定义的函数，返回void的定义是无效的。\ntype LogFunc = () =&gt; void;\n\nconst f1: LogFunc = () =&gt; {\n    // return undefined;\n    return 999; // 没有报错，因为没做限制；如果做限制，箭头函数默认返回值可能不是undefined，会报错，就不能使用箭头函数。\n}\n\n可查看TypeScript视频教学具体了解情况，TypeScript官网上也有详细的案例解析。\n类class\nclass Person {\n    name: string;\n    age: number;\n    constructor(name: string, age: number) {\n        this.name = name;\n        this.age = age;   \n    }\n    speak() {\n        console.log(`My name is ${this.name} and I am ${this.age} years old.`);\n    }\n}\n\nconst p1 = new Person(&#39;Alice&#39;, 30);\nconsole.log(p1);\np1.speak();\n\nclass Student extends Person {\n    grade: string;\n    constructor(name: string, age: number, grade: string) {\n        super(name, age);\n        this.grade = grade;\n    }\n    study() {\n        console.log(`${this.name} is studying.`);\n    }\n    override speak() { // 重写父类方法\n        console.log(`My name is ${this.name} and I am ${this.age} years old. I am in grade ${this.grade}.`);\n    }\n}\n\nconst s1 = new Student(&#39;Bob&#39;, 20, &#39;高三&#39;);\nconsole.log(s1);\ns1.study();\ns1.speak();\n\n属性修饰符\n如果有C和Java基础，很容易理解：public, protected, private, readonly:\n\npublic修饰符\n在类的外部、内部、子类都能访问到，默认情况下(不加public)，就是public的修饰符。\nclass Person {\n    public name: string;\n    public age: number;\n    constructor(name: string, age: number) {\n        this.name = name;\n        this.age = age;   \n    }\n    speak() {\n        console.log(`My name is ${this.name} and I am ${this.age} years old.`); //在类的内部使用name\n    }\n}\n\nclass Student extends Person {\n    study() {\n        console.log(`${this.name} is studying.`); //在子类中使用name\n    }\n}\n\nconst p1 = new Person(&#39;Alice&#39;, 20);\nconsole.log(p1.name); //在类的外部使用name\n\n属性的简写形式\nclass Person {\n    constructor(public name: string, public age: number) {}\n}\n\nprotected修饰符\n只能在类内部、子类访问。\nclass Person {\n    constructor(\n        protected name: string, \n        protected age: number\n    ) {}\n\n    protected getDetails() {\n        return `${this.name} is ${this.age} years old`;\n    }\n\n    introduce(){\n        console.log(this.getDetails())\n    }\n}\n\nconst p1 = new Person(&#39;John&#39;, 30);\np1.name; // 不能访问，属于外部访问。\np1.age; // 不能访问，属于外部访问。\np1.getDetails(); // 不能访问，属于外部访问。\np1.introduce(); // 可以访问\n\nclass Student extends Person {\n    study(){\n        this.introduce(); // introduce可以访问\n        console.log(`${this.name} is studying`); // protected name可以访问\n    }\n}\n\nprivate修饰符\n只能在类内部访问。\nclass Person {\n    constructor(\n        public name: string, \n        public age: number,\n        private IDcard: string\n    ) {}\n\n    private getPrivateInfo(){\n        return `身份证号码：${this.IDcard}`\n    }\n\n    getInfo(){\n        return `姓名：${this.name}，年龄：${this.age}`\n    }\n\n    getFullInfo(){\n        return this.getInfo() + &#39;,&#39; + this.getPrivateInfo()\n    }\n}\n\nconst p1 = new Person(&#39;张三&#39;, 18, &#39;123456789&#39;)\np1.name; // &#39;张三&#39;\np1.age; // 18\np1.IDcard; // 错误，无法访问\np1.getInfo(); // &#39;姓名：张三，年龄：18&#39;\np1.getPriavteInfo(); // 错误，无法访问\np1.getFullInfo(); // &#39;姓名：张三，年龄：18，身份证号码：123456789&#39;\n\nreadonly修饰符\n只读属性，一旦实例确定值，不可更改。\nclass Person {\n    constructor(\n        public name: string, \n        public readonly age: number,\n    ) {}\n}\n\nconst p1 = new Person(&#39;Mark&#39;, 39);\nconsole.log(p1); // Person { name: &#39;Mark&#39;, age: 39 }\np1.age = 22; // Error: Cannot assign to &#39;age&#39; because it is a read-only property.\n\n抽象类\n无法被实例化的类。即不能new出一个对象。\n抽象类的意义是别人可以继承它。\nabstract class Package {\n    //构造方法\n    constructor(public weight: number) {\n    }\n\n    //抽象方法\n    abstract calculate(): void;\n\n    //具体方法\n    printPackage() {\n        console.log(`Package weight: ${this.weight}, cost: ${this.calculate()}`);\n    }\n\n}\n\nconst p1 = new Package(); // Error: Cannot create an instance of an abstract class.\n\nclass StandardPackage extends Package {\n    constructor(\n        weight: number,\n        public unitPrice: number\n    ) {super(weight);}\n\n    calculate() {\n        return this.weight * this.unitPrice;\n    }\n}\n\nconst s1 = new StandardPackage(10, 2);\ns1.printPackage(); // Package weight: 10, cost: 20\n\ninterface （接口）\n定义结构的一种方式。\n针对类、对象、函数等规定一种契约。\n只能定义格式，不能包含任何实现。\n接口定义类结构\n// PersonInterface 接口\ninterface PersonInterface {\n    name: string;\n    age: number;\n    speak(n: number): void;\n}\n\nclass Person implements PersonInterface {\n\n    constructor(public name: string, public age: number) {}\n\n    speak(n: number): void {\n        for (let i = 0; i &lt; n; i++) {\n            console.log(&#39;Hello, my name is &#39; + this.name);\n            console.log(&#39;I am &#39; + this.age + &#39; years old&#39;);\n        }\n    }\n}\n\n接口定义对象结构\n接口可以当数据类型用。\ninterface UserInterface{\n    name: string;\n    readonly gender: string; // 只读属性\n    age?: number; // 可选属性\n    run: (n: number) =&gt; void;\n}\n\nconst user: UserInterface = {\n    name: &#39;zhangsan&#39;,\n    gender: &#39;male&#39;,\n    age: 18,\n    run(n) {\n        console.log(`I am running ${n}m`);\n    }\n}\n\n接口定义函数结构\ninterface CountInterface {\n    (a: number, b: number): number;\n}\n\nconst count: CountInterface = (a, b) =&gt; a + b;\n\n接口之间的继承\n类似类（class）的继承。\ninterface PersonInterface {\n    name: string;\n    age: number;\n}\n\ninterface StudentInterface extends PersonInterface {\n    grade: number; //年级\n}\n\n接口的自动合并\n同名的接口会自动合并。\ninterface PersonInterface {\n    name: string;\n    age: number;\n}\n\ninterface PersonInterface {\n    gender: string;\n}\n\nconst person: PersonInterface = {\n    name: &#39;John Doe&#39;,\n    age: 30,\n    gender: &quot;male&quot;\n};\n\n何时使用接口？\n\n定义对象的格式。描述数据模型，api相应格式，配置对象。\n类的契约。指定一个类需要的属性和方法。\n自动合并。扩展第三方库可能会用到，用在大型项目比较多。\n\n一些相似的概念\ninterface和type的区别\n相同点：interface和type都可以定义对象结构，两者在许多场景都可以互换。\n不同点：\ninterface: 更专注于定义对象和类的结构，支持继承、合并；\ntype：可以定义类型别名、联合类型、交叉类型，不支持继承、合并。\ninterface与抽象类的区别\n相同点：都用于定义一个类的格式（应该遵循的契约）\n不同点：\ninterface: 只能描述结构，不能有任何实现代码。一个类可以有多个接口。\n抽象类：既可以包括抽象方法，也可以包括具体方法。一个类只能继承一个抽象类。\n泛型\n定义函数、类或接口时，允许未指定的类型。\n使用时，才指定具体的类型。\n加个T标签就可以实现，以下是泛型函数举例：\n泛型函数\nfunction logData&lt;T&gt;(data: T){\n    console.log(data);\n}\n\nlogData&lt;number&gt;(1);\nlogData&lt;string&gt;(&#39;Hello&#39;);\n\n泛型可以有多个\nfunction logData&lt;T, U&gt;(data1: T, data2: U) {\n    Date.now() % 2 ？ console.log(data1) : console.log(data2);\n}\n\nlogData&lt;number, boolean&gt;(1, true);\nlogData&lt;string, number&gt;(&#39;Hello&#39;, 2);\n\n泛型接口\ninterface PersonInterface &lt;T&gt; {\n    name: string;\n    age: number;\n    extraInfo: T;\n}\n\nlet p: PersonInterface&lt;string&gt; = {\n    name: &#39;John&#39;,\n    age: 30,\n    extraInfo: &#39;Hello&#39;\n}\n\n类型声明文件\n类型声明文件是 TypeScript 中的一种特殊文件，通常以.d.ts作为扩展名。它的主要作用是为现有的 JavaScript 代码提供类型信息，使得 TypeScript 能够在使用这些 JavaScript 库或模块时进行类型检查和提示。\n简言之，主要用于ts文件引入js文件造成的数据类型丢失。\njs本身不定义数据类型，如果要在ts文件内引入demo.js，还需要创建一个demo.d.ts，在该文件里面声明数据类型即可，这样浏览器就不会报错。\n这个文件通常保存在@types文件夹。\n参考资料\n禹神：三小时快速上手TypeScript\n"},{"title":"nuxt的介绍",
"url":"/blog/nuxt/",
"date":"2024-10-30",
"headings":[{"level":1,"id":"nuxtshi-shen-me","permalink":"https://linxz.online/blog/nuxt/#nuxtshi-shen-me","title":"NUXT是什么？","children":[]},{"level":1,"id":"shen-me-shi-fu-wu-duan-xuan-ran","permalink":"https://linxz.online/blog/nuxt/#shen-me-shi-fu-wu-duan-xuan-ran","title":"什么是服务端渲染？","children":[{"level":2,"id":"nuxt-ssrshi-yi-tu","permalink":"https://linxz.online/blog/nuxt/#nuxt-ssrshi-yi-tu","title":"NUXT-SSR示意图","children":[]},{"level":2,"id":"nuxtan-zhuang","permalink":"https://linxz.online/blog/nuxt/#nuxtan-zhuang","title":"NUXT安装","children":[]}]},{"level":1,"id":"nuxtmu-lu-jie-gou","permalink":"https://linxz.online/blog/nuxt/#nuxtmu-lu-jie-gou","title":"NUXT目录结构","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/nuxt/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"NUXT是什么？\nvue的SSR渲染模式对应的是NUXT技术，react的SSR渲染对应的是NEXT(nextjs)。\n什么是服务端渲染？\n服务端渲染又称SSR（Server Side Render）是在服务端完成页面的内容，而不是在客户端通过AJAX获取数据。\n服务器端渲染（SSR）的优势主要在于：更好的SEO，由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面。\n如果你的应用程序初始展示 loading 菊花图，然后通过 Ajax获取内容，抓取工具并不会等待异步完成后再进行页面内容的抓取。也就是说，如果SEO 对你的站点至关重要，而你的页面又是异步获取内容，则你可能需要服务器端渲染（SSR）解决此问题。\n另外，使用服务器端渲染，我们可以获得更快的内容到达时间（time-to-content），无需等待所有的 JavaScript 都完成下载并执行，产生更好的用户体验，对于那些「内容到达时间（time-to-content）与转化率直接相关」的应用程序而言，服务器端渲染（SSR）至关重要。\nNUXT-SSR示意图\n\nNUXT安装\n参考NUXT中文网。\nnpx create-nuxt-app nuxt-tutorial\n\n完成一些选择即可，官网有完整指引。\n运行：\nnpm run dev\n\n生产环境：\nnpm run build\nnpm run start\n\nNUXT目录结构\n.nuxt ——编译后的文件\nassets——未编译的静态资源，如js和css文件\nlayouts ——网页布局文件.vue (现在默认不生成了）\nstatic ——静态资源（不需要被编译，直接映射到根目录下），比如图片，robot.txt\ncomponents ——项目组件\npages ——路由组件（各个页面）\nstore ——Vuex状态树文件\nnuxt.config.js ——项目核心配置文件\nnuxt的目录结构-官网\n参考资料\n尚硅谷NUXT教程\n"},{"title":"react组件间通信的方法",
"url":"/blog/react-communication/",
"date":"2024-10-30",
"headings":[{"level":1,"id":"zu-jian-jian-guan-xi","permalink":"https://linxz.online/blog/react-communication/#zu-jian-jian-guan-xi","title":"组件间关系","children":[]},{"level":1,"id":"ji-chong-tong-xin-fang-shi","permalink":"https://linxz.online/blog/react-communication/#ji-chong-tong-xin-fang-shi","title":"几种通信方式","children":[{"level":2,"id":"props","permalink":"https://linxz.online/blog/react-communication/#props","title":"props","children":[]},{"level":2,"id":"xiao-xi-ding-yue-fa-bu","permalink":"https://linxz.online/blog/react-communication/#xiao-xi-ding-yue-fa-bu","title":"消息订阅-发布","children":[]},{"level":2,"id":"ji-zhong-shi-guan-li","permalink":"https://linxz.online/blog/react-communication/#ji-zhong-shi-guan-li","title":"集中式管理","children":[]},{"level":2,"id":"context","permalink":"https://linxz.online/blog/react-communication/#context","title":"Context","children":[]}]},{"level":1,"id":"bi-jiao-hao-de-da-pei-fang-shi","permalink":"https://linxz.online/blog/react-communication/#bi-jiao-hao-de-da-pei-fang-shi","title":"比较好的搭配方式：","children":[]}],
"body":"组件间关系\n\n父子组件\n兄弟组件（非嵌套组件）\n祖孙组件（跨级组件）\n\n几种通信方式\nprops\n消息订阅-发布\npubs-sub, event等等\n集中式管理\nredux, dva等等\nContext\n生产者-消费者模式\n比较好的搭配方式：\n父子组件：props\n兄弟组件：消息订阅-发布、集中式管理\n祖孙组件（跨级组件）：消息订阅-发布、集中式管理、Context（开发用得少，封装插件用得多）\n"},{"title":"什么是react的Lazyload(懒加载）",
"url":"/blog/react-lazyload/",
"date":"2024-10-30",
"headings":[],
"body":"懒加载，简单来说就是，使用的时候加载，不用的时候不加载，减少系统负担，增快网页浏览速度。\n假如你有100个子网页，我们可以先加载用到的。所以，懒加载一般用在多页面的网页，即router组件里面。\n懒加载需要引入Suspense和lazy模块：\nimport React, { Component, lazy, Suspense } from &#39;react&#39;\n\n//不用import引入router模块，而是lazy()\nconst About = lazy(() =&gt; import(&#39;./About&#39;))\nconst Home = lazy(() =&gt; import(&#39;./Home&#39;))\n\n//使用懒加载\n{/* loading也可以重新写一个组件，加点样式 */}\n&lt;Suspense fallback={&lt;h1&gt;Loading...&lt;/h1&gt;}&gt; \n{/* 注册路由 */}\n    &lt;Routes&gt;\n        &lt;Route path=&quot;/about&quot; element={&lt;About /&gt;} /&gt;\n        &lt;Route path=&quot;/home&quot; element={&lt;Home /&gt;} /&gt;\n    &lt;/Routes&gt;\n&lt;/Suspense&gt;\n\n跳转路由：\nimport { NavLink, Route, Routes } from &#39;react-router-dom&#39;\n{/* 在React中靠路由链接实现切换组件 */}\n{/* 编写路由链接 */}\n  &lt;NavLink className=&quot;list-group-item&quot; to=&quot;/about&quot;&gt;About&lt;/NavLink&gt;\n  &lt;NavLink className=&quot;list-group-item&quot; to=&quot;/home&quot;&gt;Home&lt;/NavLink&gt;\n\n这样，在跳转的时候才会加载资源，加速了网页的浏览速度。\n"},{"title":"webpack介绍",
"url":"/blog/webpack/",
"date":"2024-10-30",
"headings":[{"level":1,"id":"wei-shen-me-xu-yao-da-bao-gong-ju","permalink":"https://linxz.online/blog/webpack/#wei-shen-me-xu-yao-da-bao-gong-ju","title":"为什么需要打包工具？","children":[]},{"level":1,"id":"you-shen-me-da-bao-gong-ju","permalink":"https://linxz.online/blog/webpack/#you-shen-me-da-bao-gong-ju","title":"有什么打包工具？","children":[]},{"level":1,"id":"webpackchu-shi-hua","permalink":"https://linxz.online/blog/webpack/#webpackchu-shi-hua","title":"webpack初始化","children":[]},{"level":1,"id":"xia-zai-webpack","permalink":"https://linxz.online/blog/webpack/#xia-zai-webpack","title":"下载webpack","children":[]},{"level":1,"id":"zhi-xing-webpackzhi-ling","permalink":"https://linxz.online/blog/webpack/#zhi-xing-webpackzhi-ling","title":"执行webpack指令","children":[]},{"level":1,"id":"webpackyu-csszi-yuan","permalink":"https://linxz.online/blog/webpack/#webpackyu-csszi-yuan","title":"webpack与css资源","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/webpack/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"webpack是一种打包工具。\n为什么需要打包工具？\n主要是编译，把我们写的代码编译成浏览器看得懂的代码。\n开发时，我们会使用框架（React、Vue），ES6 模块化语法，Less/Sass 等 css 预处理器等语法进行开发。\n这样的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、Css 等语法，才能运行。\n打包工具的其他功能：打包工具还能压缩代码（在生产环境下）、做兼容性处理、提升代码性能等。\n有什么打包工具？\n\nGrunt\nGulp\nParcel\nWebpack\nRollup\nVite\n...\n\n目前市面上最流量的是 Webpack，所以我们主要以 Webpack 来介绍使用打包工具。\nwebpack初始化\nnpm init -y //生成package.json\n\n注意，项目名称不能叫webpack，否则不能下载webpack。\n下载webpack\nnpm i webpack webpack-cli -D\n\n-D指下载到开发依赖中，-D 参数是 --save-dev 的简写，用于将依赖安装到项目的 devDependencies 中，而不是 dependencies 中。这样安装的依赖只在开发环境中使用，不会在生产环境中打包。安装完成后，这些依赖会记录在 package.json 文件的 devDependencies 部分。\n执行webpack指令\nnpx webpack ./src/main.js —mode=development //生产环境变成production就行\n\nnpx 是 npm 附带的一个命令运行工具，用于直接执行项目中的本地模块或从 npm 仓库临时下载并执行模块。它可以简化命令，避免全局安装依赖，常用于一次性执行脚本或运行开发依赖中的命令。\n比如，你可以使用 npx webpack 来执行本地安装的 webpack，即使它没有全局安装。\nwebpack与css资源\nwebpack本身只能处理js文件，不能处理css文件，需要借助loader。\n不同的loader处理的资源不一样，我们可以先上webpack-loader官方文档搜索，如果找不到，可以寻找github的公共资源。\n打包.css资源配置参考：\nconst path = require(&#39;path&#39;); // node.js的path模块，专门用来处理路径问题\n\nmodule.exports = {\n    // 入口\n    entry: &quot;./src/main.js&quot;, //相对路径\n    // 输出\n    output: {\n        // 输出路径，这里需要使用绝对路径\n        path: path.resolve(__dirname, &#39;dist&#39;), // __dirname是node.js中的一个全局变量，它指当前文件夹\n        // 输出文件名\n        filename: &#39;main.js&#39;,\n    },\n    // 加载器\n    module: {\n      rules: [\n        // loader配置\n        {\n            test: /\\.css$/i, //只对css文件生效，\\是转义字符，$是以.css结尾，i指insensitive，不区分大小写\n            use: [\n                &#39;style-loader&#39;,  //将js中css通过创建&lt;style&gt;标签插入到html文件的head中\n                &#39;css-loader&#39; //将css文件编译成commonjs模块到js文件中\n            ], // 执行顺序：从右到左，先css-loader再style-loader\n        },\n      ],\n    },\n    // 插件\n    plugins: [\n        // 插件配置\n    ],\n    // 模式\n    mode: &quot;development&quot;,\n  };\n\n参考资料\n尚硅谷webpack5教程\n尚硅谷webpack 5课件-在线版\n尚硅谷webpack 5课件- github版\n"},{"title":"什么是react的Context",
"url":"/blog/react-context/",
"date":"2024-10-29",
"headings":[{"level":1,"id":"contextshi-li-dai-ma","permalink":"https://linxz.online/blog/react-context/#contextshi-li-dai-ma","title":"context示例代码","children":[]},{"level":1,"id":"usercontext-hookfang-shi","permalink":"https://linxz.online/blog/react-context/#usercontext-hookfang-shi","title":"userContext hook方式","children":[]}],
"body":"react-context是一种组件间的通信方式，常用于【祖组件】与【后代组件】通信。\n开发用得少，但是封装组件用得多，比如说react-redux。\ncontext示例代码\n基本思路：\n使用createContext()来设置MyContext，取出Provider和Consumer标签，通过标签内传递参数。\nimport React, { Component } from &#39;react&#39;\nimport &#39;./index.css&#39;\n\n// 创建Context对象\nconst MyContext = React.createContext()\nconst {Provider, Consumer} = MyContext\n\nexport default class A extends Component {\n\n    state = {username: &#39;tom&#39;,age: 18}\n\n  render() {\n    const {username,age} = this.state\n\n    return (\n      &lt;div className=&#39;parent&#39;&gt;\n        &lt;h3&gt;我是A组件&lt;/h3&gt;\n        &lt;h4&gt;我的用户名是：{username}&lt;/h4&gt;\n        &lt;Provider value={{username,age}}&gt;\n            &lt;B /&gt;\n        &lt;/Provider&gt;\n      &lt;/div&gt;\n    )\n  }\n}\n\nclass B extends Component {\n  render() {\n    return (\n      &lt;div className=&#39;child&#39;&gt;\n        &lt;h3&gt;我是B组件&lt;/h3&gt;\n        &lt;C /&gt;\n      &lt;/div&gt;\n    )\n  }\n}\n\n/* class C extends Component {\n    // 声明接收context\n    static contextType = MyContext\n\n  render() {\n    const {username,age} = this.context\n    return (\n      &lt;div className=&#39;grandChild&#39;&gt;\n        &lt;h3&gt;我是C组件&lt;/h3&gt;\n        &lt;h4&gt;我从A组件接收到的用户名是：{username}, 年龄是：{age}&lt;/h4&gt;\n      &lt;/div&gt;\n    )\n  }\n} */\n\nfunction C() {\n    return (\n        &lt;div className=&#39;grandChild&#39;&gt;\n            &lt;h3&gt;我是C组件&lt;/h3&gt;\n            &lt;h4&gt;我从A组件接收到的用户名是：\n                &lt;Consumer&gt;\n                    {value =&gt; `${value.username}, 年龄是：${value.age}`}\n                &lt;/Consumer&gt;\n            &lt;/h4&gt;\n        &lt;/div&gt;\n    )\n}\n\nuserContext hook方式\n渲染方式：\n规定了依赖元素改变，context内部的组件会重新渲染。不同于useEffect的全局重新渲染。\n因此，useEffect的功能，可以考虑换成useContext。\n\nconst ThemeContext = createContext(null);\n\nfunction MyPage() {\n  const [theme, setTheme] = useState(&#39;dark&#39;);\n  \n  return (\n    &lt;ThemeContext.Provider value={theme}&gt;\n      &lt;Form /&gt;\n      &lt;Button onClick={() =&gt; {\n        setTheme(&#39;light&#39;);\n      }}&gt;\n       Switch to light theme\n      &lt;/Button&gt;\n    &lt;/ThemeContext.Provider&gt;\n  );\n}\n\n参考的是react的context教程。\n"},{"title":"react外层包裹的Fragment组件",
"url":"/blog/react-fragment/",
"date":"2024-10-29",
"headings":[{"level":1,"id":"shi-yong-fang-fa","permalink":"https://linxz.online/blog/react-fragment/#shi-yong-fang-fa","title":"使用方法","children":[]},{"level":1,"id":"fragmenthe-kong-biao-qian","permalink":"https://linxz.online/blog/react-fragment/#fragmenthe-kong-biao-qian","title":"Fragment和空标签","children":[]}],
"body":"玩过react的都知道，在return里面不允许直接写超过一层的html标签，如果有多层标签，必须要用&lt;div&gt;包裹。\n但是用div包裹有个问题：如果你按F12审查元素，会发现网页层级非常深，包着一层层的div，要找数据不容易。\n还有什么办法？\n这时候，就用隆重请出&lt;Fragment&gt;标签了。\n使用方法\nimport {Fragment} from &#39;react&#39;\n\nreturn(\n    &lt;Fragment&gt;\n        &lt;input/&gt;\n        &lt;input/&gt;\n    &lt;Fragment/&gt;\n)\n\n最终渲染后，Fragment会被react丢弃。\nFragment和空标签\n相信大家也看过这种形式：\nreturn(\n    &lt;&gt;\n        &lt;input/&gt;\n        &lt;input/&gt;\n    &lt;/&gt;\n)\n\n这就是空标签，起的作用和Fragment是一样的。那么，什么时候用哪一种呢？\n如果你需要唯一标识key，比如遍历的时候，你就需要用Fragment，其他时候就用空标签就可以了。注意：Fragment标签不允许有除key以外的任何属性。\n"},{"title":"react-Component渲染效率问题",
"url":"/blog/react-render-efficiency/",
"date":"2024-10-29",
"headings":[{"level":1,"id":"jie-jue-fang-an-classzu-jian","permalink":"https://linxz.online/blog/react-render-efficiency/#jie-jue-fang-an-classzu-jian","title":"解决方案-class组件","children":[{"level":2,"id":"xiu-gai-shouldcomponentupdatehan-shu","permalink":"https://linxz.online/blog/react-render-efficiency/#xiu-gai-shouldcomponentupdatehan-shu","title":"修改shouldComponentUpdate函数","children":[]},{"level":2,"id":"purecomponent-er-bu-shi-component","permalink":"https://linxz.online/blog/react-render-efficiency/#purecomponent-er-bu-shi-component","title":"PureComponent，而不是Component","children":[]}]},{"level":1,"id":"jie-jue-fang-an-han-shu-zu-jian","permalink":"https://linxz.online/blog/react-render-efficiency/#jie-jue-fang-an-han-shu-zu-jian","title":"解决方案-函数组件","children":[{"level":2,"id":"memo","permalink":"https://linxz.online/blog/react-render-efficiency/#memo","title":"memo()","children":[]},{"level":2,"id":"usememohe-usecallback","permalink":"https://linxz.online/blog/react-render-efficiency/#usememohe-usecallback","title":"useMemo和useCallback","children":[]}]}],
"body":"Component渲染有两个问题：\n\n只要执行setState(),即使不改变状态数据, 组件也会重新render() ==&gt; 效率低\n只当前组件重新render(), 就会自动重新render子组件，纵使子组件没有用到父组件的任何数据 ==&gt; 效率低\n\n我们想要的结果：\n只有当组件的state或props数据发生改变时才重新render()。\n解决方案-class组件\n修改shouldComponentUpdate函数\nshouldComponentUpdate(nextProps, nextState) {\n    console.log(this.props, this.state); //目前的props和state\n    console.log(nextProps, nextState); //接下要变化的目标props和state\n    // return true // true: 更新  false: 不更新\n\n    return this.props.carName !== nextProps.carName\n}\n\nPureComponent，而不是Component\nexport default class Parent extends PureComponent\n\n解决方案-函数组件\n一共三种方法：memo(), useMemo(), useCallback()，可以把三种方法组合起来。\nmemo()\nmemo相当于PureComponent，memo()最适合用在纯展示性组件上，这些组件接收简单的props并且很少更新。\nimport React, { memo } from &#39;react&#39;\n\n// 基础版本\nconst MyComponent = memo(function MyComponent(props) {\n  /* render logic */\n  return (\n    &lt;div&gt;{props.name}&lt;/div&gt;\n  )\n})\n\n// 自定义比较逻辑版本\nconst MyComponent = memo(function MyComponent(props) {\n  return (\n    &lt;div&gt;{props.name}&lt;/div&gt;\n  )\n}, (prevProps, nextProps) =&gt; {\n  // 返回true则不重新渲染，返回false则重新渲染\n  return prevProps.name === nextProps.name\n})\n\nuseMemo和useCallback\nuseCallback缓存函数\n// 使用useCallback缓存函数 \nconst handleClick = useCallback(() =&gt; { setCount(c =&gt; c + 1) }, []) // 空依赖数组，函数永远不会重新创建\n\nuseMemo缓存计算结果或者组件\nimport React, { useMemo } from &#39;react&#39;\n\nfunction MyComponent({ data }) {\n  const expensiveValue = useMemo(() =&gt; {\n    // 进行复杂计算\n    return computeExpensiveValue(data)\n  }, [data]) // 只有data改变时才重新计算\n\n  return &lt;div&gt;{expensiveValue}&lt;/div&gt;\n}\n\n使用这些优化方案的建议：\n\n不要过度优化。只在确实遇到性能问题时才使用这些优化方法。\nmemo()最适合用在纯展示性组件上，这些组件接收简单的props并且很少更新。\nuseMemo()适用于计算量大的操作，或者需要保持引用一致性的场景。\nuseCallback()主要用于传递给使用memo的子组件的回调函数。\n最后要注意的是，这些优化方法本身也有开销，如果滥用反而可能导致性能下降。建议在实际开发中先写出可工作的代码，然后使用React DevTools等工具检测性能问题，再有针对性地进行优化。\n\n"},{"title":"react如何获取组件标签中的内容？",
"url":"/blog/react-tag-content/",
"date":"2024-10-29",
"headings":[],
"body":"不知道大家有没在组件标签中写过内容，比如：\n&lt;A&gt;Hello&lt;A/&gt;\n\n这个时候，Hello这个字符并不会在首页显示出来。\n我们需要借助props.children来显示。\n需要在A组件中加上以下代码：\n{/* 其他内容 */}\n{this.props.children}\n\n这样，Hello才能够正常显示。\n"},{"title":"Linux有多少个发行版？",
"url":"/blog/linux-versions/",
"date":"2024-10-28",
"headings":[{"level":1,"id":"shen-me-shi-linuxde-fa-xing-ban","permalink":"https://linxz.online/blog/linux-versions/#shen-me-shi-linuxde-fa-xing-ban","title":"什么是Linux的发行版？","children":[]},{"level":1,"id":"fa-xing-ban-liang-da-zhen-ying","permalink":"https://linxz.online/blog/linux-versions/#fa-xing-ban-liang-da-zhen-ying","title":"发行版两大阵营","children":[{"level":2,"id":"shang-ye-ban-huan-shi-she-qun-ban","permalink":"https://linxz.online/blog/linux-versions/#shang-ye-ban-huan-shi-she-qun-ban","title":"商业版还是社群版?","children":[]}]},{"level":1,"id":"linuxzhuo-mian-ban","permalink":"https://linxz.online/blog/linux-versions/#linuxzhuo-mian-ban","title":"Linux桌面版","children":[]}],
"body":"Linux有多少个版本？首先，Linux是一个内核程序，由Unix操作系统发展而来，它只有一个版本。而Linux系统（发行版）则有多个版本。\n什么是Linux的发行版？\n由于Linux只是一个内核，需要加上软件、工具、文档而成一个操作系统。所以，就有了基于Linux内核的各个版本。\n发行版两大阵营\n以软件安装方式分，RPM VS DPKG；\n以运营方式分，商业公司vs社群\n\n鸟哥认为，完全相容商业版RHEL的CentOS是不错的选择。\n商业版还是社群版?\n商业版稳定，社群版更新快。\n到底是要买商业版还是社群版的Linux distribution呢？\n如果是要装在个人计算机上面做为桌面电脑用的，建议使用社群版， 包括Fedora, Ubuntu, OpenSuSE等等。如果是用在服务器上面的，建议使用商业版本，包括Red Hat, SuSE等。 这是因为社群版通常开发者会加入最新的软件，这些软件可能会有一些bug存在。至于商业版则是经过一段时间的磨合后， 才将稳定的软件放进去。\n举例来说，Fedora兜出来的软件套件经过一段时间的维护后，等到该软件稳定到不容易发生错误后， Red Hat才将该软件放到他们最新的释出版本中。\n所以，Fedora的软件比较经常改版，Red Hat的软件就较少更版。\nLinux桌面版\nFedora/Ubuntu等Desktop版本是不错的选择。\n"},{"title":"什么是react-hooks",
"url":"/blog/react-hooks/",
"date":"2024-10-28",
"headings":[{"level":1,"id":"usestateyong-fa","permalink":"https://linxz.online/blog/react-hooks/#usestateyong-fa","title":"useState用法","children":[]},{"level":1,"id":"useeffect","permalink":"https://linxz.online/blog/react-hooks/#useeffect","title":"useEffect","children":[{"level":2,"id":"fu-zuo-yong","permalink":"https://linxz.online/blog/react-hooks/#fu-zuo-yong","title":"副作用","children":[]},{"level":2,"id":"useeffectdiao-yong-liang-ci-de-wen-ti","permalink":"https://linxz.online/blog/react-hooks/#useeffectdiao-yong-liang-ci-de-wen-ti","title":"useEffect调用两次的问题","children":[]}]},{"level":1,"id":"useref","permalink":"https://linxz.online/blog/react-hooks/#useref","title":"useRef","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/react-hooks/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"是什么？好处是什么？\nHook是React 16.8.0版本增加的新特性/新语法。可以让你在函数组件中使用 state 以及其他的 React 特性（比如生命周期钩子）。\n在此之前，函数组件比class组件差劲很多，因为缺乏this的调用，只能完成一些简单的功能。\n三个主要hooks是useState, useEffect, useRef\nuseState用法\nimport {useState} from &#39;react&#39;\n\nexport default function Demo() {\n\n    const [count, setCount] = useState(0)\n\n    const add = () =&gt; {\n        setCount(count + 1);\n    }\n\n  return (\n    &lt;div&gt;\n        &lt;h2&gt;当前求和为：{count}&lt;/h2&gt;\n        &lt;button onClick={add}&gt;点我加1&lt;/button&gt;\n    &lt;/div&gt;\n  )\n}\n\nuseEffect\n由于函数式组件不能用生命周期钩子，比如ComponentDidMount，就可以借助useEffect来模拟类组件的生命周期钩子。\n副作用\nuseEffect是用来解决副作用的，什么是副作用操作？\n\n发ajax请求数据获取\n设置订阅 / 启动定时器\n手动更改真实DOM（比如卸载组件）\n\n// 模拟componentDidMount和componentDidUpdate，到底要模拟哪个，看第二个参数怎么传\n// 不写空数组，指谁也不监测，渲染后、更新后都会执行\n// 写空数组，只监测第一次渲染，只执行一次\n// 写Count，监测Count，只要Count变化，就会执行\nuseEffect(() =&gt; {\n    console.log(&#39;useEffect()&#39;)\n}, [count])\n\nuseEffect调用两次的问题\n双重调用可以帮助定位一些BUG，比如调用函数两次，可以发现上次函数是否有清理结果；比如说fetch api后，能够看到后一次结果是否会覆盖前一次结果，是否是你预期的。\n总之，在调试模式下的双重调用，是React故意的，方便发现BUG的。\n彻底解决双重调用：\n\n仅会在调试模式调用2次，生产模式不会；\n使用了严格模式，可以选择删除严格模式，即index.js里面的&lt;React.StrictMode&gt;来恢复正常。\n\nuseRef\n由input框的ref属性延伸的，可以看这篇react的refs。\n作用：Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据。功能与createRef()类似。\nconst myRef = useRef()\n\nconst show = () =&gt; {\n        alert(myRef.current.value)\n    }\n\n&lt;button onClick={show}&gt;点我提示数据&lt;/button&gt;\n\n参考资料\n尚硅谷react扩展视频\n"},{"title":"什么是react的refs？",
"url":"/blog/react-refs/",
"date":"2024-10-25",
"headings":[{"level":1,"id":"wei-shen-me-you-refs","permalink":"https://linxz.online/blog/react-refs/#wei-shen-me-you-refs","title":"为什么有refs？","children":[]},{"level":1,"id":"zi-fu-chuan-xing-shi-de-ref-yi-guo-shi","permalink":"https://linxz.online/blog/react-refs/#zi-fu-chuan-xing-shi-de-ref-yi-guo-shi","title":"字符串形式的ref（已过时）","children":[]},{"level":1,"id":"hui-diao-han-shu-xing-shi-de-ref","permalink":"https://linxz.online/blog/react-refs/#hui-diao-han-shu-xing-shi-de-ref","title":"回调函数形式的ref","children":[]},{"level":1,"id":"createrefxing-shi-de-ref","permalink":"https://linxz.online/blog/react-refs/#createrefxing-shi-de-ref","title":"createRef形式的ref","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/react-refs/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"react组件实例有三大属性state, props, refs。 state不必说，状态管理，props是数据传送，唯有ref不是很清楚。\n使用方式分别是this.state, this.props, this.refs。\n为什么有refs？\n我们经常会在html做输入框，或者叫input框。\n&lt;input placeholder=&quot;点击输入数据&quot;/&gt;\n\n我们如何获取输入框的值，照理来说就是xxx.value，对吗？但是，我们怎么知道你要获取的是哪个输入框呢？这时候就需要id了。\n&lt;input id=&quot;input1&quot; placeholder=&quot;点击输入数据&quot;/&gt;\n\n我们要怎么获取它的值呢？自然要用Dom了。\nconst input = document.getElementById(&#39;input1&#39;)\nconsole.log(input.value)\n\n这样就能够拿到了。等等，我们用react的目的不就是有虚拟DOM，不用操作真实DOM吗？所以，一定有其他方法。这就是今天介绍的refs了。\n字符串形式的ref（已过时）\n我们可以用ref属性获取input的值。\n&lt;input ref=&#39;input1&#39; placeholder=&quot;点击输入数据&quot;/&gt;\n\n获取出来的值：\nconsole.log(this.refs.input1) //获取按钮\nconst {input1} = this.refs //解构赋值\nconsole.log(input1.value)\n\n注意，每个ref都是refs对象里面的key-value值，即this.refs={input1:input, button1:button...}\n回调函数形式的ref\n有字符串形式的ref好像已经够了，为什么需要有回调函数形式的呢？\n因为react官方已经废弃掉字符串形式了，参见过时 API：String 类型的 Refs，官方说明会造成一些问题，问题讨论得比较复杂，简单来说，调用会出现一些效率问题。\n取代字符串形式的ref有两种方法，一种是回调函数形式的ref，一种是createRef方法。\n我们看看回调函数怎么写。\n回调函数有三大特点：1. 你定义的函数；2. 你没有调用；3. 最终被他人调用。\n&lt;input ref={(currentNode)=&gt;{console.log(currentNode.value)}} placeholder=&quot;点击输入数据&quot;/&gt;\n\n我们在ref里面随便传入一个参数，不管是a还是我写的currentNode，console.log之后就会发现是当前节点, 这个时候.value就可以拿到值了。\n简单的写法可以是这样的：\n&lt;input ref={c=&gt;console.log(c.value)} placeholder=&quot;点击输入数据&quot;/&gt;\n\n怎么在function里面拿到它的值呢？首先要将该input框抽出来。\n&lt;input ref={c=&gt;this.selectNumber=c} placeholder=&quot;点击输入数据&quot;/&gt;\n\n这里我们在class component里面定义了一个selectNumber的值，让它等于抽出来的input，这里把currentNode简写成c。\n那么我们可以在其他函数里面利用input的值，像这样：\nfunction addNumber(){\n  const {value} = this.selectNumber\n}\n\ncreateRef形式的ref\n下次再分享。\n参考资料\n\n\n尚硅谷的react教程中Ref部分。\n\n\n我的ref教程代码\n\n\n"},{"title":"如何连接supabase普通数据库？",
"url":"/blog/supabase-normal/",
"date":"2024-10-25",
"headings":[{"level":1,"id":"zhun-bei-lian-jie","permalink":"https://linxz.online/blog/supabase-normal/#zhun-bei-lian-jie","title":"准备连接","children":[]},{"level":1,"id":"show-table","permalink":"https://linxz.online/blog/supabase-normal/#show-table","title":"show table","children":[]},{"level":1,"id":"insert-data","permalink":"https://linxz.online/blog/supabase-normal/#insert-data","title":"Insert data","children":[]}],
"body":"以下的代码以jupyter notebook格式为例，文件是.ipynb格式。可以自己改造成.py格式的python文件。\n注意：国内连接不畅，有时候需要多连几遍才会成功。\n准备连接\nimport os\n\n# 设置环境变量\nos.environ[&quot;SUPABASE_URL&quot;] = &quot;your-url&quot;\nos.environ[&quot;SUPABASE_KEY&quot;] = &quot;your-key&quot;\n\nimport os\nfrom supabase import create_client, Client\n\nurl: str = os.environ.get(&quot;SUPABASE_URL&quot;)\nkey: str = os.environ.get(&quot;SUPABASE_KEY&quot;)\nsupabase: Client = create_client(url, key)\n\nshow table\nresponse = supabase.table(&quot;chat_logs&quot;).select(&quot;*&quot;).execute()\nresponse\n\nInsert data\nfrom datetime import datetime\n\n# 示例数据\ndata = [\n    {\n        &quot;chat_id&quot;: &quot;chat123&quot;,\n        &quot;chat_title&quot;: &quot;First Chat&quot;,\n        &quot;sequence&quot;: 1,\n        &quot;user_message&quot;: &quot;Hello, how are you?&quot;,\n        &quot;ai_response&quot;: &quot;I am fine, thank you!&quot;,\n        &quot;timestamp&quot;: datetime.now().isoformat()\n    },\n    {\n        &quot;chat_id&quot;: &quot;chat124&quot;,\n        &quot;chat_title&quot;: &quot;Second Chat&quot;,\n        &quot;sequence&quot;: 2,\n        &quot;user_message&quot;: &quot;What&#39;s the weather like?&quot;,\n        &quot;ai_response&quot;: &quot;It&#39;s sunny today.&quot;,\n        &quot;timestamp&quot;: datetime.now().isoformat()\n    },\n    {\n        &quot;chat_id&quot;: &quot;chat125&quot;,\n        &quot;chat_title&quot;: &quot;Third Chat&quot;,\n        &quot;sequence&quot;: 3,\n        &quot;user_message&quot;: &quot;Tell me a joke.&quot;,\n        &quot;ai_response&quot;: &quot;Why don&#39;t scientists trust atoms? Because they make up everything!&quot;,\n        &quot;timestamp&quot;: datetime.now().isoformat()\n    }\n]\n\nresponse = supabase.table(&quot;chat_logs&quot;).insert(data).execute()\nprint(response)\n\n"},{"title":"ES6的新特性",
"url":"/blog/es6/",
"date":"2024-10-24",
"headings":[{"level":1,"id":"mu-lu","permalink":"https://linxz.online/blog/es6/#mu-lu","title":"目录","children":[]},{"level":1,"id":"what-is-es","permalink":"https://linxz.online/blog/es6/#what-is-es","title":"ES是什么","children":[]},{"level":1,"id":"why-es6","permalink":"https://linxz.online/blog/es6/#why-es6","title":"为什么要学习 ES6？","children":[]},{"level":1,"id":"let","permalink":"https://linxz.online/blog/es6/#let","title":"let变量特性","children":[]},{"level":1,"id":"const","permalink":"https://linxz.online/blog/es6/#const","title":"cosnt常量特性","children":[]},{"level":1,"id":"deconstruct","permalink":"https://linxz.online/blog/es6/#deconstruct","title":"ES6解构赋值","children":[]},{"level":1,"id":"template-string","permalink":"https://linxz.online/blog/es6/#template-string","title":"ES6模版字符串","children":[]},{"level":1,"id":"object-simple","permalink":"https://linxz.online/blog/es6/#object-simple","title":"ES6简化对象写法","children":[]},{"level":1,"id":"arrow-function","permalink":"https://linxz.online/blog/es6/#arrow-function","title":"ES6箭头函数","children":[{"level":3,"id":"kuo-zhan-jsde-han-shu-fan-hui-zhi","permalink":"https://linxz.online/blog/es6/#kuo-zhan-jsde-han-shu-fan-hui-zhi","title":"扩展：JS的函数返回值","children":[]},{"level":2,"id":"an-li-fan-hui-shu-zu-de-ou-shu-xiang","permalink":"https://linxz.online/blog/es6/#an-li-fan-hui-shu-zu-de-ou-shu-xiang","title":"案例-返回数组的偶数项","children":[]},{"level":2,"id":"jian-tou-han-shu-bu-gua-he-yu-thisyou-guan-de-hui-diao","permalink":"https://linxz.online/blog/es6/#jian-tou-han-shu-bu-gua-he-yu-thisyou-guan-de-hui-diao","title":"箭头函数不适合与this有关的回调","children":[]}]},{"level":1,"id":"default-argument","permalink":"https://linxz.online/blog/es6/#default-argument","title":"ES6允许参数的初始值","children":[]},{"level":1,"id":"rest","permalink":"https://linxz.online/blog/es6/#rest","title":"ES6 rest参数，即省略号 - 参数转数组","children":[]},{"level":1,"id":"spread-operator","permalink":"https://linxz.online/blog/es6/#spread-operator","title":"ES6扩展运算符 - 数组转参数","children":[{"level":2,"id":"kuo-zhan-yun-suan-fu-de-yun-yong","permalink":"https://linxz.online/blog/es6/#kuo-zhan-yun-suan-fu-de-yun-yong","title":"扩展运算符的运用","children":[]}]},{"level":1,"id":"module","permalink":"https://linxz.online/blog/es6/#module","title":"ES模块化","children":[{"level":2,"id":"mo-kuai-hua-de-hao-chu","permalink":"https://linxz.online/blog/es6/#mo-kuai-hua-de-hao-chu","title":"模块化的好处","children":[]},{"level":2,"id":"mo-kuai-hua-gui-fan-chan-pin","permalink":"https://linxz.online/blog/es6/#mo-kuai-hua-gui-fan-chan-pin","title":"模块化规范产品","children":[]},{"level":2,"id":"es6mo-kuai-hua-yu-fa","permalink":"https://linxz.online/blog/es6/#es6mo-kuai-hua-yu-fa","title":"ES6模块化语法","children":[{"level":3,"id":"es6bao-lu-yu-fa-gui-ze","permalink":"https://linxz.online/blog/es6/#es6bao-lu-yu-fa-gui-ze","title":"ES6暴露语法规则","children":[]},{"level":3,"id":"es6yin-ru-yu-fa-gui-ze","permalink":"https://linxz.online/blog/es6/#es6yin-ru-yu-fa-gui-ze","title":"ES6引入语法规则","children":[]}]}]}],
"body":"前端要会ES6，那么什么是传说中的ES6。\n视频教程推荐尚硅谷的教程。另推荐阮一峰的ECMAScript 入门，一本开源书。\n以下是我的总结：\n目录\nES是什么\n为什么要学习 ES6\nlet变量特性\ncosnt常量特性\nES6解构赋值\nES6模版字符串\nES6简化对象写法 \nES6箭头函数\nES6允许参数的初始值\nES6 rest参数，即省略号 - 参数转数组\nES6扩展运算符 - 数组转参数\nES是什么\nES是ECMAScript的简称，ECMAScript是脚本语言的规范。而我们所使用的JavaScript是ECMAScript的一种实现。\nECMAScript 是由 Ecma 国际通过ECMA-262 标准化的脚本程序设计语言。\n为什么要学习 ES6？\nES6 的版本变动内容最多，具有里程碑意义。\n如果发生了兼容问题，babel可以把ES6编译成ES5，解决部分落后浏览器不兼容的问题。\nlet变量特性\n\n变量不能重复声明\n\nlet star = ‘罗志祥’\nlet star = ‘小猪’\n//不被允许\n\n\n块级作用域\n\n//if else while for\n// {\n// let girl = ‘周扬青’\n// }\nconsole.log(girl) //undefined\n\n\n不允许变量申明前使用\n\nconsole.log(song)\nlet song = ‘恋爱达人’\n//不允许使用\n\ncosnt常量特性\n\n必须有初始值\n\nconst A; //失败\n\n\n一般常量用大写\n\nconst A = 100;\n\n\n\n常量的值不能更改\n\n\n块级作用域\n\n\n对于数组和对象的元素修改，不算对常量的修改，不会报错。\n\n\nconst TEAM = [‘UZI’, ‘MXLG’, ‘MING’];\nTEAM.push(‘MEIKO’)\n//因为常量对应的引用地址（指针）没变，因此不会报错。\n\nES6解构赋值\n//数组结构\nconst F4 = [‘小沈阳’, ‘刘能’, ‘赵四’, ‘宋小宝’];\nlet [xiao, liu, zhao, song] = F4;\nconsole.log(xiao);\nconsole.log(liu);\nconsole.log(zhao);\nconsole.log(song);\n\n//对象结构\nconst zhao = {\n\tname: ‘赵本山’，\n\tage: 18,\n\txiaopin: function(){console.log(‘我可以演小品’};\n}\n\nlet {name, age, xiaopin} = zhao\ncosole.log(name);\ncosole.log(age);\nconsole.log(xiaopin);\n\nxiaopin(); //如果不解构赋值，要zhao.xiaopin()触发\n\nES6模版字符串\nES6模版字符串``\n用``框起来的，和''以及&quot;&quot;是一样的，类型都是字符串。\n特点：\n\n可以直接出现换行符\n\nlet str = `&lt;ul&gt;\n&lt;li&gt;沈腾&lt;/li&gt;\n&lt;li&gt;玛丽&lt;/li&gt;\n&lt;/ul&gt;`\n\n\n实现变量的拼接\n\nlet lovest = ‘魏翔’;\nlet out = `${lovest}是我心目中最搞笑的演员。`\n\nES6简化对象写法\n允许大括号里面，直接写入变量和函数。不用写冒号。\nlet name = ‘尚硅谷’;\nlet change = function(){console.log(‘我们可以改变你!”)}\n\nconst school = {name, change, improve({console.log(“improve”)}}\n\n//正确写法应该是name: name, change:change, improve:function(){}， 只要key和value相同，就可以简写。 冒号和function也可以省略。\n\nES6箭头函数\n什么是箭头函数的形式？\nlet fn = () =&gt;{}\n\n箭头函数与传统函数function()的区别：\n\nthis是静态的，始终指向函数声明时所在作用域下的this的值。传统函数的this是动态的，谁调用我，我就指向谁。\n\nfunction getName(){console.log(this.name)}\n\nlet getName2 =  () =&gt; {console.log(this.name)}\n\n//设置window对象的name属性\nwindow.name = “尚硅谷”;\nconst school = {name: “ATGUIGU”}\n\n//直接调用\ngetName();\ngetName2();\n//以上结果都一样，都是“尚硅谷”。\n\n//call方法调用：call方法是可以改变this指向的值的\ngetName.call(school); //ATGUIGU\ngetName2.call(school); //尚硅谷\n\n\n不能作为构造函数去实例化对象\n\nlet Person = (name, age) =&gt; {this.name = name; this.age = age;}\n\nlet me = new Person(‘xiao’, 30);\nconsole.log(me); //报错，Person不是一个构造器constructor\n\n\n不能使用arguments变量\n\nlet fn = () =&gt; {console.log(arguments)};\nfn(1,2,3); //报错\n\n\n箭头函数的简写\n\n\n省略小括号，当形参有且只有一个。\n\nlet add = n =&gt; {return n+n};\n\n\n省略花括号，当代码体只有一条语句的时候。此时’return’必须省略。而且语句的执行结果就是函数的返回值。\n\nlet pow = n =&gt; n*n;\n\n扩展：JS的函数返回值\n\n如果规定了return，则返回值是return的结果；\n如果没有规定return，则默认返回值是undefined;\n箭头函数的代码体只有一句语句时，语句的执行结果就是函数的返回值；\n\n案例-返回数组的偶数项\nconst arr = [1,6,9,10,100,25]\n\n//传统做法:\nconst result = arr.filter(function(item){\n\tif(item%2===0){\n\t\treturn true;\n\t}else{\n\t\treturn false\t\n}\n})\n\n//箭头函数做法\ncosnt result = arr.filter(item =&gt; item % 2 === 0);\n//只要是偶数的值，就返回。\n\n箭头函数不适合与this有关的回调\n比如（点击）事件回调，对象的方法\n{name: ‘atguigu’,\ngetName: function(){\n\tthis.name}}\n\n//这个this是值当前对象的this，而不是外层函数的this。\n//箭头函数的this指的是创建时的this，即外层函数的this。\n//不适合，不是不能\n\nES6允许参数的初始值\n\n形参初始值\n\n//具有默认值的参数，一般位置靠后。\nfunction add(a,b,c=10){\n\treturn a+b+c\n}\n\nresult = add(1,2) //这里不用传入c\nconsole.log(result);\n\n\n与解构赋值结合\n\nfunction connect({host,username,password}){\n\tconsole.log(host);\n\tconsole.log(username);\n\tconsole.log(password);\n\tconsole.log(port)\n}\n\nconnect({\n\thost: ‘localhost’,\n\tusername: ‘root’,\n\tpassword: ‘root’,\n\tport: 3306\n})\n\nES6 rest参数，即省略号 - 参数转数组\n\n可以快速获取arguments，而且是数组的形式\n\nfunction date(…args){\n\tconsole.log(args); //因为结果是数组，可以用数组方法比如filter some every map\n}\n\ndate(‘阿娇’,’柏芝’, ‘思慧’)\n\n\nrest参数必须放到参数最后\n\nfunction fn(a,b,…args){\nconsole.log(a);\nconsole.log(b);\nconsole.log(args);\n}\n\nfn(1,2,3,4,5,6)\n\nES6扩展运算符 - 数组转参数\n将[数组]转换为逗号分隔的[参数序列]。\n//声明一个数组\nconst tfboys = [‘易烊千玺’, ‘王源’, ‘王俊凯’];\n\n//声明一个函数\nfunction chunwan(){\n\tconsole.log(arguments);\n}\n\nchunwan(…tfboys); //等同于chunwan(‘易烊千玺,’王源’,’王俊凯’)，1个数组元素变3个参数。\n\n扩展运算符的运用\n\n数组的合并\n\nconst kuaizi = [‘王太利’,’肖央’]：\nconst fenghuang = [‘曾毅’,’玲花’];\n\n//传统方法\n//const zuixuanxiaopingguo = kuaizi.concat(fenghuang)\n\n//扩展运算符方法\nconst zuixuanxiaopingguo = […kuaizi, …fenghuang]\n\nconsole.log(zuixuanxiaopingguo)\n\n\n数组的克隆\n\nconst sanzhihua = [‘E’, ‘G’, ‘M’]\nconst sanyecao = […sanzhihua];\n\n\n将伪数组转化为真正的数组。\n\nconst divs = document.querySelectorAll(‘div’)\nconst divArr = […divs];\n\nES模块化\n模块化是指将一个大的程序文件，拆分成许多小的文件，然后将小文件组合起来。\n模块化的好处\n\n\n防止命名冲突。把大文件分为若干小文件，小文件中的代码命名是互不干扰的。\n\n\n代码复用。封装功能代码，暴露一个接口即可。下一个项目就可以复用这个功能。\n\n\n高维护性。允许多人同时修改一个项目，升级时也只变动某些模块即可。\n\n\n模块化规范产品\nES6之前的模块化规范，主要是社区推出的：\n\n\nCommonJS =&gt; NodeJS, Browserify\n\n\nAMD =&gt; requireJS\n\n\nCMD =&gt; seaJS\n\n\nES6模块化语法\n主要是两个命令：exprt import\nES6暴露语法规则\n\n分别暴露\n\n// 分别暴露\nexport let school = &#39;MIT&#39;;\n\nexport function teach() {\n  console.log(&#39;teach&#39;);\n}\n\n\n统一暴露\n\n// 统一暴露\n\nlet school = &#39;MIT&#39;;\n\nfunction findJob() {\n  console.log(&#39;we can help you find a job&#39;);\n}\n\nexport {school, findJob};\n\n\n默认暴露\n\n// 默认暴露\n\nexport default {\n    school: &#39;MIT&#39;,\n    change() {\n        console.log(&#39;we can change the world&#39;);\n    }\n}\n\nES6引入语法规则\n\n三种引入方式：通用的导入方式、解构赋值的方式导入、简便导入方式（仅针对默认暴露）\n\n\n&lt;script type=&quot;module&quot;&gt;\n// 1. 通用的导入方式\n/*         //引入m1.js模块内容\nimport * as m1 from &#39;./js/m1.js&#39;;\n\n// 引入m2.js模块内容\nimport * as m2 from &#39;./js/m2.js&#39;;\n\n// 引入m3.js模块内容\nimport * as m3 from &#39;./js/m3.js&#39;;\n\n//调用m3.js模块中的方法\nm3.default.change(); */\n\n// 2. 解构赋值的方式导入\n/*         import {school, teach} from &#39;./js/m1.js&#39;;\nimport {school as guigu, findJob} from &#39;./js/m2.js&#39;; //school重名，起别名guigu\nimport {default as m3} from &#39;./js/m3.js&#39;; //default为m3.js中的默认导出\n*/\n\n// 3. 简便导入方式 - 只针对默认暴露\nimport m3 from &#39;./js/m3.js&#39;;\n\n// console.log(school);\n// teach();\n\n// console.log(guigu);\n// findJob();\n\nconsole.log(m3.school);\nm3.change();\n\n&lt;/script&gt;\n\n\n入口文件方式\n\nhtml引入app.js:\n&lt;script src=&quot;./js/app.js&quot; type=&quot;module&quot;&gt;&#39;\n\napp.js再引入其他js文件：\n// 入口文件\n\n// 模块引入\nimport * as m1 from &#39;./m1.js&#39;;\nimport * as m2 from &#39;./m2.js&#39;;\nimport * as m3 from &#39;./m3.js&#39;;\n\nconsole.log(m1);\nconsole.log(m2);\nconsole.log(m3);\n\n\nBabel方式\n\nBabel是一个JavaScript编译器，可以把ES6语法转化为更具兼容性的ES5语法，使浏览器的显示正常。\nbabel方式教学视频。\n"},{"title":"git/github如何回滚/回退版本",
"url":"/blog/github-revert/",
"date":"2024-10-24",
"headings":[{"level":1,"id":"hui-gun-git","permalink":"https://linxz.online/blog/github-revert/#hui-gun-git","title":"回滚git","children":[{"level":2,"id":"cha-kan-log","permalink":"https://linxz.online/blog/github-revert/#cha-kan-log","title":"查看log","children":[]},{"level":2,"id":"git-reset","permalink":"https://linxz.online/blog/github-revert/#git-reset","title":"git reset","children":[]}]},{"level":1,"id":"hui-gun-vercelbu-shu-wang-ye","permalink":"https://linxz.online/blog/github-revert/#hui-gun-vercelbu-shu-wang-ye","title":"回滚vercel部署网页","children":[]}],
"body":"今天我翻到一个“尘封已久”的文件夹，想要删掉，突然发现没有备份。于是，我按照正常流程git add, git commit, git push，然后准备删掉这个文件夹。\n等到我上github网站一看，不妙，这个仓库是和我的线上托管平台vercel项目绑定在一起的，我之前改过一些测试API的地址，会影响到这个项目的部署。\n果不其然，这个项目已经被vercel检测到更新，变成了一个新页面，api目前无法访问了。\n于是，我就需要做两件事：回滚git版本+回滚vercel部署。\n回滚git\n我试了下，官方推荐的是git revert &lt;commit-hash&gt;的方式，但是这个方法需要对比两个版本的不同点，手动调整。由于我不知道改过什么，而且改动的点还挺多，这个方法不适合我。\n我需要直接回滚，放弃掉之后的修改。\n查看log\ngit log\n\n这里可以看到所有的github提交记录，我们需要把上次提交的hash值复制下来，作为commit-hash，这告诉了git需要回滚的版本。按q键退出log。\ngit reset\ngit reset --hard &lt;想回退到的commit-hash&gt;\ngit push -f origin main\n\n我们使用git reset --hard就可以回退到特定的版本了。但是这里还没完，还要push一下本地代码，让云端github网站与本地保持一致才可以。\n这样就可以了吗？不行。\n回滚vercel部署网页\n我发现vercel托管的网站并没有更新，进入vercel后才发现，因为它没有监测到github的更新提交（回退不算），它不会重新部署deploy。\n此时，我们有两种方法：一种是直接在vercel回退一个版本（非pro会员只能回退一个版本），一种就是随便更改一个文件，本地重新push提交，让vercel检测到github仓库的变化。\n由于我之前不知道vercel不能检测回退的操作，主动redeploy了一次，因此回退也只能回退到上一个新版本，没什么用，所以只能采取第二个方法。\n我在README.md文件里面随便加了一句话，push上去，现在vercel托管网站就恢复正常啦！\n"},{"title":"孩子说，别人怎么比我们有钱。怎么回答？",
"url":"/blog/more-money/",
"date":"2024-10-23",
"headings":[],
"body":"不知道大家是怎么向孩子传递「别人家比我们有钱」的观念？\n当孩子跑过来问你，“爸爸，为什么大熊家放暑假可以去他们家的海边度假屋，而我们没有？”、“爸爸，为什么我们没有钱呢？”\n你会选择告诉他，“是的，是爸爸不够好，赚钱不够多”，还是采取「欺骗策略」：“度假屋没什么好的，我们去公园里，公园更好玩”？\n可汗学院的老师的方法是，对比其他事物。“是啊，他们家很富有，在钱的部分。但是我们家也很富有，在爱的部分。爸爸妈妈每天都可以陪着你。”\n我也想起电影“佐贺的超级阿嬷”，昭广家非常穷，小时候被寄养到佐贺的阿嬷家，别人该有的他一件没有，甚至连鞋子都是烂的。\n但是，阿嬷从来不在他面前表现得沮丧，反而想起很多“生活妙招”，解决了经济不济带来的一些问题。\n比如腰间系上绳子，撞上磁铁来走路吸废品，比如在河下游去捞祭品用的水果。\n日常生活中，阿嬷总是很吝啬，因为她需要拥有足够的资源活下来。\n但是，当昭广运动表现优异时，阿嬷也拿出所有积蓄给他买了一双跑鞋，因为这某种程度上帮助佐贺迈向更好的未来，在这点上她毫不吝啬。\n阿嬷真诚对待每一个对她好的人，不向生活低头，这给昭广树立了一个好榜样，让他不再惧怕生活的困难。\n阿嬷不必讲什么道理，她就是道理本身。\n"},{"title":"什么是react组件的生命周期？",
"url":"/blog/react-lifecycle/",
"date":"2024-10-23",
"headings":[{"level":1,"id":"jie-duan-hua-fen","permalink":"https://linxz.online/blog/react-lifecycle/#jie-duan-hua-fen","title":"阶段划分","children":[{"level":2,"id":"chu-shi-hua-jie-duan-you-reactdom-render-hong-fa","permalink":"https://linxz.online/blog/react-lifecycle/#chu-shi-hua-jie-duan-you-reactdom-render-hong-fa","title":"初始化阶段：由ReactDom.render()触发 ——","children":[]},{"level":2,"id":"geng-xin-jie-duan-you-zu-jian-nei-bu-this-setstate-huo-fu-zu-jian-zhong-xin-renderhong-fa","permalink":"https://linxz.online/blog/react-lifecycle/#geng-xin-jie-duan-you-zu-jian-nei-bu-this-setstate-huo-fu-zu-jian-zhong-xin-renderhong-fa","title":"更新阶段：由组件内部this.setState()或父组件重新render触发","children":[]},{"level":2,"id":"xie-zai-jie-duan-you-reactdom-unmountcomponentatnode-hong-fa","permalink":"https://linxz.online/blog/react-lifecycle/#xie-zai-jie-duan-you-reactdom-unmountcomponentatnode-hong-fa","title":"卸载阶段：由ReactDOM.unmountComponentAtNode()触发","children":[]}]},{"level":1,"id":"chang-yong-de-sheng-ming-zhou-qi","permalink":"https://linxz.online/blog/react-lifecycle/#chang-yong-de-sheng-ming-zhou-qi","title":"常用的生命周期","children":[]},{"level":1,"id":"dai-ma-shi-li","permalink":"https://linxz.online/blog/react-lifecycle/#dai-ma-shi-li","title":"代码示例","children":[]}],
"body":"组件的生命周期这个概念挺懵的，我学了好几遍。\n不过怎么学习，都需要这个下面这个图片（注意：这是react 17后的示意图，之前版本的生命周期略有不同）。\n\n组件的生命周期和挂载Mount、卸载Unmount、更新Update有关。\n阶段划分\n初始化阶段：由ReactDom.render()触发 ——\n\nConstructor()\ngetDerivedStateFromProps\nrender()\ncomponentDidMount()\n\n更新阶段：由组件内部this.setState()或父组件重新render触发\n\ngetDerivedStateFromProps\nshouldComponentUpdate()\nrender()\ngetSnapshotBeforeUpdate\ncomponentDidUpdate()\n\n卸载阶段：由ReactDOM.unmountComponentAtNode()触发\n\ncomponentWillUnmount()\n\n常用的生命周期\ncomponentDidMount -  组件初始化状态\ncomponentWillUnmount - 处理收尾的事情\nrender - 必须出现\n代码示例\n&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;!-- 移动端适配的 --&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;\n    &lt;title&gt;3_react生命周期-新&lt;/title&gt;\n&lt;/head&gt;\n&lt;body&gt;\n    &lt;!-- 必须准备好一个容器 --&gt;\n    &lt;div id=&quot;test&quot;&gt;&lt;/div&gt;\n    \n    &lt;!-- 引入react核心库 --&gt;\n     &lt;script type=&quot;text/javascript&quot; src=&quot;../js/j17.0.1/react.development.js&quot;&gt;&lt;/script&gt;\n    &lt;!-- 引入react-dom，用于支持react操作DOM --&gt;\n     &lt;script type=&quot;text/javascript&quot; src=&quot;../js/j17.0.1/react-dom.development.js&quot;&gt;&lt;/script&gt;\n    &lt;!-- 引入babel，用于将jsx转为js --&gt;\n    &lt;script type=&quot;text/javascript&quot; src=&quot;../js/j17.0.1/babel.min.js&quot;&gt;&lt;/script&gt;\n\n    &lt;!-- text/babel表示里面不是js，而是jsx --&gt;\n    &lt;script type=&quot;text/babel&quot;&gt; \n        // 1.创建组件\n        class Count extends React.Component{\n            // 构造器\n            constructor(props){\n                super(props)\n                console.log(&#39;Count-constructor构造器调用了&#39;)\n                this.state = {count:0}\n            }\n\n            add = ()=&gt;{\n                let {count} = this.state\n                this.setState({count:count+1})\n            }\n\n            // 组件挂载完毕\n            componentDidMount(){\n                console.log(&#39;Count-componentDidMount组件挂载完毕&#39;)\n            }\n\n            // 控制组件更新的阀门-组件是否要更新\n            shouldComponentUpdate(){\n                console.log(&#39;Count-shouldComponentUpdate组件是否要更新&#39;)\n                return true\n            }\n\n            /* 凡是带will的（除了willUnmount），都需要带上UNSAFE_标签，因为可能会在未来版本弃用。这与安全性无关。 */\n            // 组件将要更新\n            // UNSAFE_componentWillUpdate(){\n            //     console.log(&#39;Count-componentWillUpdate组件将要更新&#39;)\n            // }\n\n            // 组件更新完毕\n            componentDidUpdate(prevProps, prevState, snapshotValue){\n                console.log(&#39;Count-componentDidUpdate组件更新完毕&#39;,prevProps,prevState,snapshotValue)\n            }\n\n            // 卸载组件\n            unmount = ()=&gt;{\n                ReactDOM.unmountComponentAtNode(document.getElementById(&#39;test&#39;))\n            }\n\n            // 强制更新\n            force = ()=&gt;{\n                this.forceUpdate()\n            }\n\n            // 组件将要接收外界传递的新的props\n            static getDerivedStateFromProps(props,state){\n                console.log(&#39;Count-getDerivedStateFromProps&#39;,props,state)\n                return null\n                //return props // 返回的对象就是state，且不会再更新state，仅用于state完全取决于props的情况\n            }\n            \n            // 在更新之前获取快照\n            getSnapshotBeforeUpdate(){\n                console.log(&#39;Count-getSnapshotBeforeUpdate&#39;)\n                return &#39;haha&#39;\n            }\n            \n            render(){\n                console.log(&#39;Count-render渲染调用了&#39;)\n                const {count} = this.state\n                return(\n                    &lt;div&gt;\n                        &lt;h1&gt;当前求和为：{count}&lt;/h1&gt;\n                        &lt;button onClick={this.add}&gt;点我+1&lt;/button&gt;\n                        &lt;button onClick={this.unmount}&gt;点我卸载组件&lt;/button&gt;\n                        &lt;button onClick={this.force}&gt;不更改任何状态的数据，强制更新！！！&lt;/button&gt;\n                    &lt;/div&gt;\n                )\n            }\n        } \n\n        // 2.渲染组件\n        ReactDOM.render(&lt;Count count={199}/&gt;,document.getElementById(&#39;test&#39;))\n        // ReactDOM.render(&lt;A/&gt;,document.getElementById(&#39;test&#39;))\n    &lt;/script&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n\n"},{"title":"什么是Vue的生命周期？",
"url":"/blog/vue-lifecycle/",
"date":"2024-10-23",
"headings":[{"level":1,"id":"vue3sheng-ming-zhou-qi-shi-li-dai-ma","permalink":"https://linxz.online/blog/vue-lifecycle/#vue3sheng-ming-zhou-qi-shi-li-dai-ma","title":"vue3生命周期示例代码","children":[]},{"level":1,"id":"vue2sheng-ming-zhou-qi-shi-li-dai-ma","permalink":"https://linxz.online/blog/vue-lifecycle/#vue2sheng-ming-zhou-qi-shi-li-dai-ma","title":"vue2生命周期示例代码","children":[]}],
"body":"vue常用生命周期4个阶段：创建、挂载、更新、销毁，包含8个函数，但是生命周期不止8个函数。\n\nvue3生命周期示例代码\n&lt;template&gt;\n  &lt;div class=&quot;person&quot;&gt;\n    &lt;h2&gt;当前求和为：{{ sum }}&lt;/h2&gt;\n    &lt;button @click=&quot;changeSum&quot;&gt;点我sum+1&lt;/button&gt;\n  &lt;/div&gt;\n&lt;/template&gt;\n\n&lt;script lang=&quot;ts&quot; setup&gt;\nimport { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from &#39;vue&#39;\n\n// 数据\nlet sum = ref(0)\n\n// 方法\nfunction changeSum() {\n  sum.value += 1\n}\n\n// 创建\nconsole.log(&#39;创建&#39;)\n\n\n// 挂载前\nonBeforeMount(() =&gt; {\n  console.log(&#39;挂载前&#39;)\n})\n\n// 挂载后，子先挂载，再父挂载\nonMounted(() =&gt; {\n  console.log(&#39;子————挂载后&#39;)\n})\n\n// 更新前\nonBeforeUpdate(() =&gt; {\n  console.log(&#39;更新前&#39;)\n})\n\n// 更新后\nonUpdated(() =&gt; {\n  console.log(&#39;更新后&#39;)\n})\n\n// 卸载前\nonBeforeUnmount(() =&gt; {\n  console.log(&#39;卸载前&#39;)\n})\n\n// 卸载后\nonUnmounted(() =&gt; {\n  console.log(&#39;卸载后&#39;)\n})\n\n&lt;/script&gt;\n\n&lt;style scoped&gt;\n.person {\n  background-color: skyblue;\n  box-shadow: 0 0 10px;\n  border-radius: 10px;\n  padding: 20px;\n}\n\nbutton {\n  margin: 0 5px;\n  /* 上下0 左右5px */\n}\n\nli {\n  font-size: 20px;\n}\n&lt;/style&gt;\n\nvue2生命周期示例代码\n&lt;template&gt;\n    &lt;div class=&quot;person&quot;&gt;\n        &lt;h2&gt;当前求和为：{{ sum }}&lt;/h2&gt;\n        &lt;button @click=&quot;changeSum&quot;&gt;点我sum+1&lt;/button&gt;\n    &lt;/div&gt;\n&lt;/template&gt;\n\n&lt;script&gt;\n\n\nexport default {\n    /* eslint-disable */\n    name: &#39;Person&#39;,\n    data() {\n        return {\n            sum: 1\n        }\n    },\n    methods: {\n        changeSum() {\n            this.sum += 1\n        }\n    },\n    // 创建前的钩子\n    beforeCreate() {\n        console.log(&#39;beforeCreate()&#39;)\n    },\n    // 创建后的钩子\n    created() {\n        console.log(&#39;created()&#39;)\n    },\n    // 挂载前的钩子\n    beforeMount() {\n        console.log(&#39;beforeMount()&#39;)\n    },\n    // 挂载后的钩子\n    mounted() {\n        console.log(&#39;mounted()&#39;)\n    },\n    // 更新前的钩子\n    beforeUpdate() {\n        console.log(&#39;beforeUpdate()&#39;)\n    },\n    // 更新后的钩子\n    updated() {\n        console.log(&#39;updated()&#39;)\n    },\n    // 销毁前的钩子\n    beforeDestroy() {\n        console.log(&#39;beforeDestroy()&#39;)\n    },\n    // 销毁后的钩子\n    destroyed() {\n        console.log(&#39;destroyed()&#39;)\n    }\n}\n&lt;/script&gt;\n\n&lt;style scoped&gt;\n.person {\n    background-color: skyblue;\n    border-radius: 10px;\n    padding: 20px;\n    box-shadow: 0 0 10px;\n}\n&lt;/style&gt;\n\n"},{"title":"zola如何做标签tag？",
"url":"/blog/zola-tags/",
"date":"2024-10-22",
"headings":[{"level":1,"id":"xiu-gai-pei-zhi-wen-jian","permalink":"https://linxz.online/blog/zola-tags/#xiu-gai-pei-zhi-wen-jian","title":"修改配置文件","children":[]},{"level":1,"id":"wen-zhang-jia-biao-qian-tags","permalink":"https://linxz.online/blog/zola-tags/#wen-zhang-jia-biao-qian-tags","title":"文章加标签tags","children":[]},{"level":1,"id":"templatewen-jian-jia-jia-shang-liang-ge-html","permalink":"https://linxz.online/blog/zola-tags/#templatewen-jian-jia-jia-shang-liang-ge-html","title":"template文件夹加上两个html","children":[{"level":2,"id":"taxonomy-list-html","permalink":"https://linxz.online/blog/zola-tags/#taxonomy-list-html","title":"taxonomy_list.html","children":[]},{"level":2,"id":"taxonomy-single-html","permalink":"https://linxz.online/blog/zola-tags/#taxonomy-single-html","title":"taxonomy_single.html","children":[]},{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/zola-tags/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"修改配置文件\n修改配置文件：config.toml，添加一下：\ntaxonomies = [\n    {name = &quot;tags&quot;},\n]\n\n文章加标签tags\n+++\n...\n[taxonomies] \ntags = [&quot;老钱和新钱&quot;, &quot;投资&quot;]\n+++\n\ntemplate文件夹加上两个html\ntaxonomy_list.html\n{% extends &quot;base.html&quot; %}\n\n{% block content %}\n&lt;h1&gt;{{ taxonomy.name }}&lt;/h1&gt;\n\n&lt;ul&gt;\n    {% for term in terms %}\n    &lt;li&gt;&lt;a href=&quot;{{ term.permalink }}&quot;&gt;{{ term.name }}&lt;/a&gt; ({{ term.pages | length }} 篇文章)&lt;/li&gt;\n    {% endfor %}\n&lt;/ul&gt;\n{% endblock content %}\n\ntaxonomy_single.html\n{% extends &quot;base.html&quot; %}\n\n{% block content %}\n&lt;h1&gt;{{ term.name }}&lt;/h1&gt;\n\n&lt;ul&gt;\n    {% for page in term.pages %}\n    &lt;li&gt;\n        &lt;a href=&quot;{{ page.permalink }}&quot;&gt;{{ page.title }}&lt;/a&gt;\n        {% if page.date %}\n        &lt;span class=&quot;date&quot;&gt;{{ page.date | date(format=&quot;%Y-%m-%d&quot;) }}&lt;/span&gt;\n        {% endif %}\n    &lt;/li&gt;\n    {% endfor %}\n&lt;/ul&gt;\n{% endblock content %}\n\n现在你可以通过我的tags页面来访问tags。\n参考资料\n我的terminal-blog仓库有tag页面\nzola的taxonomies介绍\n"},{"title":"Promise从入门到精通",
"url":"/blog/promise/",
"date":"2024-10-21",
"headings":[{"level":1,"id":"promiseshi-shen-me","permalink":"https://linxz.online/blog/promise/#promiseshi-shen-me","title":"Promise是什么？","children":[]},{"level":1,"id":"promisehao-chu","permalink":"https://linxz.online/blog/promise/#promisehao-chu","title":"Promise好处","children":[]},{"level":1,"id":"yi-bu-bian-cheng-ju-li","permalink":"https://linxz.online/blog/promise/#yi-bu-bian-cheng-ju-li","title":"异步编程举例","children":[]},{"level":1,"id":"hui-diao-han-shu-fang-shi","permalink":"https://linxz.online/blog/promise/#hui-diao-han-shu-fang-shi","title":"回调函数方式","children":[]},{"level":1,"id":"promisedai-ma-shi-li","permalink":"https://linxz.online/blog/promise/#promisedai-ma-shi-li","title":"Promise代码示例","children":[{"level":2,"id":"thenfang-fa-de-lian-shi-hui-diao","permalink":"https://linxz.online/blog/promise/#thenfang-fa-de-lian-shi-hui-diao","title":"then方法的链式回调","children":[]},{"level":2,"id":"catchfang-fa","permalink":"https://linxz.online/blog/promise/#catchfang-fa","title":"catch方法","children":[]}]},{"level":1,"id":"shi-pin-jiao-cheng","permalink":"https://linxz.online/blog/promise/#shi-pin-jiao-cheng","title":"视频教程","children":[]}],
"body":"Promise是什么？\n是ES6引入的异步编程的新解决方案。\n旧解决方案是回调函数。\n从语法来说，是一个构造函数，可以用来实例化对象。\n从功能来说，Promise对象可以封装一个异步操作，获取成功或失败的结果。\nPromise好处\nPromise支持链式调用，解决回调地狱问题。还可以指定多个回调函数。\n异步编程举例\n\nfs文件操作\n数据库操作\nAJAX网络请求\n定时器setTimeOut\n\n回调函数方式\nrequire(‘fs’).readFile(‘./index.html’, (err.data)=&gt;{})\n\n容易造成回调地狱：代码不断套娃，套多个回调任务。特点是不利于阅读、不利于错误处理。\n\nPromise代码示例\n // Promise\n// resolve 成功的回调函数, reject 失败的回调函数\nlet p = new Promise((resolve, reject) =&gt; {\n    setTimeout(() =&gt; {\n        // 获取从1-100的一个随机数\n        let n = rand(1, 100);\n        // 判断是否中奖\n        if(n &lt;= 30){\n            resolve(); //将promise状态设置为成功\n        }else{\n            reject(); //将promise状态设置为失败\n        }\n    }, 1000);\n});\n\n// then方法\np.then(() =&gt; {\n    alert(&#39;恭喜恭喜，奖品为 10万 RMB&#39;);\n}, ()=&gt;{\n    alert(&#39;很遗憾，未中奖&#39;);\n});\n\nthen方法的链式回调\n说明：Promise.prototype.then()通常是跟着一个异步任务，异步任务后面也可以跟异步任务。这样就是解决回调地狱的问题。\n// then方法的链式回调\np.then((value) =&gt; {\n    console.log(value);\n    return &#39;第一个then的返回值&#39;;\n}).then((value) =&gt; {\n    console.log(value);\n    return &#39;第二个then的返回值&#39;;\n}).then((value) =&gt; {\n    console.log(value);\n});\n\ncatch方法\n指定失败状态返回的值。\nconst p = new Promise((resolve, reject) =&gt; {\n   setTimeout(() =&gt; {\n        //设置p对象的状态为失败，并设置失败的值\n       reject(&#39;失败&#39;);\n   }, 1000);\n});\n\n//catch方法，参数是一个函数，函数的参数是失败的值\np.then((value) =&gt; {\n    console.log(value);\n}).catch((reason) =&gt; {\n    console.warn(reason);\n});\n\n视频教程\n\n\n尚硅谷-Promise从入门到精通教程。\n\n\n尚硅谷-ES6 Promise部分教材\n\n\n"},{"title":"什么是jsx语法-react知识",
"url":"/blog/react-jsx/",
"date":"2024-10-20",
"headings":[{"level":1,"id":"shen-me-shi-jsx","permalink":"https://linxz.online/blog/react-jsx/#shen-me-shi-jsx","title":"什么是jsx?","children":[]},{"level":1,"id":"jsxyu-fa-gui-ze","permalink":"https://linxz.online/blog/react-jsx/#jsxyu-fa-gui-ze","title":"jsx语法规则","children":[{"level":2,"id":"da-gua-hao-li-mian-zhi-neng-fang-biao-da-shi-bu-neng-fang-jsdai-ma","permalink":"https://linxz.online/blog/react-jsx/#da-gua-hao-li-mian-zhi-neng-fang-biao-da-shi-bu-neng-fang-jsdai-ma","title":"大括号{}里面只能放表达式，不能放js代码","children":[{"level":3,"id":"biao-da-shi-yi-ge-biao-da-shi-hui-chan-sheng-yi-ge-zhi-ke-yi-fang-zai-ren-he-yi-ge-xu-yao-zhi-de-di-fang","permalink":"https://linxz.online/blog/react-jsx/#biao-da-shi-yi-ge-biao-da-shi-hui-chan-sheng-yi-ge-zhi-ke-yi-fang-zai-ren-he-yi-ge-xu-yao-zhi-de-di-fang","title":"表达式：一个表达式会产生一个值，可以放在任何一个需要值的地方","children":[]},{"level":3,"id":"yu-ju-dai-ma","permalink":"https://linxz.online/blog/react-jsx/#yu-ju-dai-ma","title":"语句(代码)：","children":[]}]}]},{"level":1,"id":"jsxru-he-bian-li","permalink":"https://linxz.online/blog/react-jsx/#jsxru-he-bian-li","title":"jsx如何遍历？","children":[]},{"level":1,"id":"jsxru-he-zuo-tiao-jian-pan-duan","permalink":"https://linxz.online/blog/react-jsx/#jsxru-he-zuo-tiao-jian-pan-duan","title":"jsx如何做条件判断？","children":[]}],
"body":"我总是觉得vue比react容易学习，一个理由就是vue不用重新学习一套语法，还是html和js一把梭，但是react需要学习一个新的语法，叫做jsx。\n什么是jsx?\n全称JavaScript XML，XML早期用于存储和传输数据，后来用json取代。\n\njsx语法规则\n const VDOM = (\n    &lt;div&gt;\n        &lt;h2 className=&#39;title&#39; id={myId.toLowerCase()}&gt;\n            &lt;span style={{color:&#39;white&#39;, fontSize:&#39;20px&#39;}}&gt;{myData.toLowerCase()}&lt;/span&gt;\n        &lt;/h2&gt;\n        &lt;input type=&quot;text&quot; value=&quot;hello react&quot;/&gt;\n    &lt;/div&gt;\n        )\n\n\n\n定义虚拟DOM时，不要写引号。因为会被当做字符串string处理。\n\n\n标签中混入js表达式时要用{} \n\n\n样式类名指定不要用class，要用className \n\n\n内联样式要用双括号style={{key:value}}的形式去写 \n\n\n虚拟DOM只能有一个根标签，比如&lt;&gt;&lt;/&gt;或者&lt;div&gt;&lt;div/&gt; \n\n\n标签必须闭合 \n\n\n标签首字母：\n\n\n\n\n若小写字母开头，比如&lt;input&gt;，则将标签转为html同名元素，若html中无该元素，则报错。\n\n\n若大写字母开头，比如&lt;Search/&gt;，react就去渲染对应的组件，若组件没有定义，则报错。\n\n\n大括号{}里面只能放表达式，不能放js代码\n一定注意区分：js语句(代码)与js表达式\n表达式：一个表达式会产生一个值，可以放在任何一个需要值的地方\n下面这些都是表达式：\n(1).a\n(2). a+b\n(3). demo(1)\n(4). arr.map()\n(5). function test () {}\n语句(代码)：\n下面这些都是语句(代码)：\n(1).if(){}\n(2).for(){}\n(3).switch(){case:xxxx}\njsx如何遍历？\n代码示例：\nusers.map((userObj) =&gt; {\n   return (\n     &lt;div key={userObj.id} className=&quot;card&quot;&gt;\n         &lt;a rel=&quot;noreferrer&quot; href={userObj.html_url} target=&quot;_blank&quot;&gt;\n           &lt;img alt=&quot;avatar&quot; src={userObj.avatar_url} style={{width: &#39;100px&#39;}}/&gt;\n         &lt;/a&gt;\n         &lt;p className=&quot;card-text&quot;&gt;{userObj.login}&lt;/p&gt;\n     &lt;/div&gt;\n   )\n})\n\n核心思想：使用map方法遍历对象或者数组，注意遍历时需要指定id或者index来作为唯一值。\njsx如何做条件判断？\n代码示例：\n{\n    isFirst ? &lt;h2&gt;欢迎使用，输入关键字搜索&lt;/h2&gt; :\n    isLoading ? &lt;h2&gt;Loading...&lt;/h2&gt; :\n    err ? &lt;h2 style={{color:&#39;red&#39;}}&gt;{err}&lt;/h2&gt; :\n    users.map((userObj) =&gt; {\n        return (\n          &lt;div key={userObj.id} className=&quot;card&quot;&gt;\n              &lt;a rel=&quot;noreferrer&quot; href={userObj.html_url} target=&quot;_blank&quot;&gt;\n                &lt;img alt=&quot;avatar&quot; src={userObj.avatar_url} style={{width: &#39;100px&#39;}}/&gt;\n              &lt;/a&gt;\n              &lt;p className=&quot;card-text&quot;&gt;{userObj.login}&lt;/p&gt;\n            &lt;/div&gt;\n        )\n    })\n}\n\n代码解释：\n以上代码是展示搜索结果的一个示例。\n如果是第一次使用，显示欢迎语；如果搜索中，显示Loading...，如果错误，显示错误信息；否则，则显示用户的信息。\n这里关键是，jsx不能用if语句，要用表达式?和:来进行判断。\n"},{"title":"常用Linux命令",
"url":"/blog/linux-command/",
"date":"2024-10-18",
"headings":[{"level":1,"id":"shan-chu-wen-jian-jia","permalink":"https://linxz.online/blog/linux-command/#shan-chu-wen-jian-jia","title":"删除文件夹","children":[]},{"level":1,"id":"shan-chu-wen-jian","permalink":"https://linxz.online/blog/linux-command/#shan-chu-wen-jian","title":"删除文件","children":[]},{"level":1,"id":"xin-jian-wen-jian","permalink":"https://linxz.online/blog/linux-command/#xin-jian-wen-jian","title":"新建文件","children":[]},{"level":1,"id":"xin-jian-wen-jian-jia","permalink":"https://linxz.online/blog/linux-command/#xin-jian-wen-jian-jia","title":"新建文件夹","children":[]}],
"body":"删除文件夹\nrm -rf directory\n\n强制删除文件夹，-f代表不询问，-r代表递归删除文件。\n删除文件\nrm document\n\n新建文件\ntouch document\n\n新建文件夹\nmkdir directory\n\n"},{"title":"如何开始一个react项目",
"url":"/blog/react-app/",
"date":"2024-10-18",
"headings":[{"level":1,"id":"wei-shen-me-yao-yong-react","permalink":"https://linxz.online/blog/react-app/#wei-shen-me-yao-yong-react","title":"为什么要用react?","children":[]},{"level":1,"id":"shi-yong-npmhuo-zhe-yarnkai-shi","permalink":"https://linxz.online/blog/react-app/#shi-yong-npmhuo-zhe-yarnkai-shi","title":"使用npm或者yarn开始","children":[{"level":2,"id":"yarnan-zhuang","permalink":"https://linxz.online/blog/react-app/#yarnan-zhuang","title":"yarn安装","children":[]},{"level":2,"id":"npman-zhuang","permalink":"https://linxz.online/blog/react-app/#npman-zhuang","title":"npm安装","children":[]}]},{"level":1,"id":"reactxiang-mu-jie-gou","permalink":"https://linxz.online/blog/react-app/#reactxiang-mu-jie-gou","title":"react项目结构","children":[{"level":2,"id":"publicfu-ze-suo-you-wang-zhan-jing-tai-zi-yuan","permalink":"https://linxz.online/blog/react-app/#publicfu-ze-suo-you-wang-zhan-jing-tai-zi-yuan","title":"public负责所有网站静态资源","children":[]},{"level":2,"id":"srcfu-ze-zhu-yao-dai-ma","permalink":"https://linxz.online/blog/react-app/#srcfu-ze-zhu-yao-dai-ma","title":"src负责主要代码","children":[]}]},{"level":1,"id":"reactzen-me-fang-wen-kua-yu-de-fu-wu-qi","permalink":"https://linxz.online/blog/react-app/#reactzen-me-fang-wen-kua-yu-de-fu-wu-qi","title":"react怎么访问跨域的服务器？","children":[{"level":2,"id":"zai-package-jsonli-mian-tian-jia-proxy","permalink":"https://linxz.online/blog/react-app/#zai-package-jsonli-mian-tian-jia-proxy","title":"在package.json里面添加proxy","children":[]},{"level":2,"id":"setupproxy","permalink":"https://linxz.online/blog/react-app/#setupproxy","title":"setupProxy","children":[]}]},{"level":1,"id":"ru-he-que-ding-state-usestatefang-zai-na-li","permalink":"https://linxz.online/blog/react-app/#ru-he-que-ding-state-usestatefang-zai-na-li","title":"如何确定state/useState放在哪里？","children":[{"level":2,"id":"fang-fa-functionfang-zai-na-li","permalink":"https://linxz.online/blog/react-app/#fang-fa-functionfang-zai-na-li","title":"方法function放在哪里？","children":[]}]},{"level":1,"id":"zu-jian-jian-tong-xin","permalink":"https://linxz.online/blog/react-app/#zu-jian-jian-tong-xin","title":"组件间通信","children":[{"level":2,"id":"fu-chuan-zi","permalink":"https://linxz.online/blog/react-app/#fu-chuan-zi","title":"父传子","children":[]},{"level":2,"id":"zi-chuan-fu","permalink":"https://linxz.online/blog/react-app/#zi-chuan-fu","title":"子传父","children":[]},{"level":2,"id":"xiong-di-zu-jian-chuan-di","permalink":"https://linxz.online/blog/react-app/#xiong-di-zu-jian-chuan-di","title":"兄弟组件传递","children":[{"level":3,"id":"chuan-tong-fang-shi","permalink":"https://linxz.online/blog/react-app/#chuan-tong-fang-shi","title":"传统方式","children":[]},{"level":3,"id":"pubsubgong-ju","permalink":"https://linxz.online/blog/react-app/#pubsubgong-ju","title":"PubSub工具","children":[]},{"level":3,"id":"an-zhuang","permalink":"https://linxz.online/blog/react-app/#an-zhuang","title":"安装","children":[]},{"level":3,"id":"shi-yong","permalink":"https://linxz.online/blog/react-app/#shi-yong","title":"使用","children":[]}]}]},{"level":1,"id":"reactshi-xian-lu-you-routeye-mian-qie-huan","permalink":"https://linxz.online/blog/react-app/#reactshi-xian-lu-you-routeye-mian-qie-huan","title":"react实现路由route页面切换","children":[{"level":2,"id":"an-zhuang-react-router-domku","permalink":"https://linxz.online/blog/react-app/#an-zhuang-react-router-domku","title":"安装react-router-dom库","children":[]},{"level":2,"id":"shi-yong-react-router-dom","permalink":"https://linxz.online/blog/react-app/#shi-yong-react-router-dom","title":"使用react-router-dom","children":[{"level":3,"id":"zai-zui-wai-ceng-bao-yi-ceng-browserrouter","permalink":"https://linxz.online/blog/react-app/#zai-zui-wai-ceng-bao-yi-ceng-browserrouter","title":"在最外层包一层<BrowserRouter>","children":[]},{"level":3,"id":"zai-fu-zu-jian-zhong-shi-yong-routes","permalink":"https://linxz.online/blog/react-app/#zai-fu-zu-jian-zhong-shi-yong-routes","title":"在父组件中使用routes","children":[]},{"level":3,"id":"gao-liang-biao-qian","permalink":"https://linxz.online/blog/react-app/#gao-liang-biao-qian","title":"高亮标签","children":[]},{"level":3,"id":"browserrouterhe-hashrouter","permalink":"https://linxz.online/blog/react-app/#browserrouterhe-hashrouter","title":"BrowserRouter和HashRouter","children":[]}]}]},{"level":1,"id":"ru-he-ce-shi-reactde-shang-xian-xiao-guo","permalink":"https://linxz.online/blog/react-app/#ru-he-ce-shi-reactde-shang-xian-xiao-guo","title":"如何测试react的上线效果？","children":[]}],
"body":"官方推荐以框架开始，比如nextjs。但是，为了学习，我这里介绍的是纯血react开场。\n为什么要用react?\n简单来说，就是大家都用呗。\n复杂来讲，为什么大家用呢？因为react对前端页面渲染相对于传统JS更高效。利用了虚拟DOM技术+diffing算法，传统JS用的是真实DOM技术。\n真实DOM的缺点是：不能复用之前的数据，每一次都是刷新重新来。\n\n虚拟DOM：复用了原来的DOM，只需要渲染改变的那个数据。\n\n使用npm或者yarn开始\nyarn安装\n推荐yarn，因为经过测试，速度比较快：\nyarn create react-app your-app-name\n\nnpm安装\n推荐npx来安装，比较快：\nnpx create-react-app your-app-name\n\n如果失败了，可以换成国内源，但我测试下来，并没有帮助。老老实实用yarn就好了。\nreact项目结构\n最重要的是public和src文件夹。一个典型的react项目：\n\npublic负责所有网站静态资源\n包含网站页签图标favicon、主页面index.html、所有css文件、图片等\nsrc负责主要代码\n包含App.jsx(也可以是.js或.ts或.tsx), App.css,index.css, index.js(入口文件）,components等文件\nreact怎么访问跨域的服务器？\n跨域指不同源，比如3000端口访问5000端口的服务器。\n在package.json里面添加proxy\n在package.json文件添加以下代码：\n&quot;proxy&quot;: &quot;http://localhost:5000&quot;\n\n修改前端代码改向3000端口请求：\n axios.get(&#39;http://localhost:3000/students&#39;).then(\n      // 成功的回调\n      response =&gt; {console.log(&#39;成功了&#39;, response.data)},\n      // 失败的回调\n      error =&gt; {console.log(&#39;失败了&#39;, error)}\n    )\n\n这个方法通过直接重定向3000请求到5000，解决跨域请求的问题。但是只能用一个服务器，如果有多个跨域服务器请求，就用以下setupProxy的方式。\nsetupProxy\n新建文件setupProxy.js（注意：名称不能变）在src文件夹下，添加以下代码：\nconst {createProxyMiddleware} = require(&quot;http-proxy-middleware&quot;);\n\nmodule.exports = function(app){\n    app.use(\n      &#39;/api1&#39;,\n      createProxyMiddleware({\n        target:&#39;http://localhost:5000&#39;,\n        changeOrigin:true,\n      })\n    );\n}\n\n说明：所有访问3000/api1的都会重定向到5000端口上，因此避免了跨域问题。\n这个办法是通过同源策略来保证访问到服务器，可参考官方文档，跨域方法还可以在服务端设置CORS，可查看跨域和同源介绍。\n如何确定state/useState放在哪里？\n\n如果数据只在某个组件用，就放到自身的state里面。\n如果数据是共用的，就放到父组件的state里面。官方称此为状态提升。\n\n比如下图中的数据state，是子组件components中Search和List共用的，就放到父组件App里面。\n\n方法function放在哪里？\n状态state在哪里，方法就在哪里。\n组件间通信\n父传子\n通过props传递。\n子传父\n通过props传递，要求父提前给子传递一个函数。\n兄弟组件传递\n传统方式\n兄弟给父传递，参照【子传父】，再由父传递给另一个兄弟，参照【父传子】。\nPubSub工具\n任意两个组件的沟通，都可以借助PubSub工具。\n安装\nyarn add pubsub-js\n\n使用\n接收数据方订阅Subscribe，发送数据方发布Publish即可。\n假设&lt;List&gt;组件是接收方，&lt;Search&gt;组件是发送方。\n我们先看&lt;List/&gt;组件：\nimport PubSub from &#39;pubsub-js&#39;\n\nstate = {// 初始化状态\nusers:[], //users初始值为数组\nisFirst:true, //是否为第一次打开页面\nisLoading:false, //标识是否处于加载中\nerr:&#39;&#39; //存储请求相关的错误信息\n}\n\ncomponentDidMount() {\n// _表示不使用这个参数，这个参数是msg，现在只是占位。\nthis.token = PubSub.subscribe(&#39;communication&#39;, (_,stateObj)=&gt;{\n   console.log(&#39;List组件收到数据了&#39;, stateObj);\n    this.setState(stateObj)\n})\n}\n\ncomponentWillUnmount() {\nPubSub.unsubscribe(this.token)\n}\n\n基本思路：\n\n组件加载时，订阅组件，取好订阅的名称，比如communication，确定接收到的数据，比如stateObje，setState改变状态。\n组件卸载时，删除订阅。\n格式是PubSub('name',data)。\n数据state放在订阅方。\n\n再看&lt;Search/&gt;组件：\nimport PubSub from &#39;pubsub-js&#39;\n\n// 发送请求前通知List更新状态\nPubSub.publish(&#39;communication&#39;, {isFirst:false, isLoading:true})\n\n/* 发送api请求，比如axios */\n// 发送请求前通知List更新状态\nPubSub.publish(&#39;communication&#39;, {isFirst:false, isLoading:true})\n// 发送网络请求\naxios.get(`http://localhost:3000/api1/search/users?q=${KeyWord}`).then(\n  response =&gt; {\n    // 请求成功后通知List更新状态\n    PubSub.publish(&#39;communication&#39;, {isLoading:false, users:response.data.items})\n  },\n  error =&gt; {\n    console.log(&#39;失败了&#39;, error)\n    // 请求失败后通知List更新状态\n    PubSub.publish(&#39;communication&#39;, {isLoading:false, err:error.message})\n  }\n)\n\n格式是PubSub.publish('name', data)。\nreact实现路由route页面切换\n思路：\n\n\n明确导航区和展示区。\n\n\n导航区的a标签改为Link标签；展示区Route标签进行路径的匹配。\n\n\n最外层套一层BrowserRouter就行。\n\n\n注意：\n\n\n路由组件比如&lt;About /&gt;要放在pages文件夹，而不是components文件夹\n\n\n如果需要点击高亮，不用Link标签，用NavLink标签。\n\n\n安装react-router-dom库\n安装方法可以见react-router-dom官方文档，用yarn安装：\nyarn add react-router-dom\n\n使用react-router-dom\n在最外层包一层&lt;BrowserRouter&gt;\n打开index.js，包在最外层：\n// 引入react-router-dom库\nimport { BrowserRouter } from &#39;react-router-dom&#39;;\n\n\n// 渲染App组件到页面\nconst root = ReactDOM.createRoot(document.getElementById(&#39;root&#39;));\nroot.render(\n  &lt;BrowserRouter&gt;\n    &lt;React.StrictMode&gt; {/* StrictMode检查React代码不合理的地方 */}\n      &lt;App /&gt;\n    &lt;/React.StrictMode&gt;\n  &lt;/BrowserRouter&gt;\n);\n\n在父组件中使用routes\nimport { Link, Route, Routes } from &#39;react-router-dom&#39;\n\n{/* 在React中靠路由链接实现切换组件 */}\n{/* 编写路由链接 */}\n&lt;Link className=&quot;list-group-item&quot; to=&quot;/about&quot;&gt;About&lt;/Link&gt;\n&lt;Link className=&quot;list-group-item&quot; to=&quot;/home&quot;&gt;Home&lt;/Link&gt;\n\n{/* 注册路由 */}\n&lt;Routes&gt;\n    &lt;Route path=&quot;/about&quot; element={&lt;About /&gt;} /&gt;\n    &lt;Route path=&quot;/home&quot; element={&lt;Home /&gt;} /&gt;\n&lt;/Routes&gt;\n\n这样就可以实现多页面的切换了。\n高亮标签\n使用NavLink标签，示例代码：\nimport { NavLink, Route, Routes } from &#39;react-router-dom&#39;\n\n&lt;NavLink className={({isActive}) =&gt; &#39;list-group-item&#39; + (isActive ?&#39; atguigu&#39; : &#39;&#39;)} to=&quot;/about&quot;&gt;About&lt;/NavLink&gt; \n&lt;NavLink className={({isActive}) =&gt; &#39;list-group-item&#39; + (isActive ?&#39; atguigu&#39; : &#39;&#39;)} to=&quot;/home&quot;&gt;Home&lt;/NavLink&gt;\n\nBrowserRouter和HashRouter\n两者都可以用。HashRouter的路径会带井号#。比如localhost:3000/#About\n区别是井号#后面的值是哈希值，是不会作为资源发送给服务器的。一般用BrowserRouter就可以。\n如何测试react的上线效果？\n我们用serve这个库就行。\n全局安装：\nnpm i serve -g\n\n生成build文件：\nnpm run build\n\n在项目路径下使用serve命令：\nserve build\n\n这样，就能在本地3000或者5000端口来模拟服务器运行网站的效果了。\n"},{"title":"如何给wordpress网站备份backup？",
"url":"/blog/wordpress-backup/",
"date":"2024-10-17",
"headings":[{"level":1,"id":"wordpresswen-jian-jia-bei-fen","permalink":"https://linxz.online/blog/wordpress-backup/#wordpresswen-jian-jia-bei-fen","title":"wordpress文件夹备份","children":[{"level":2,"id":"bei-fen-wen-jian-jia","permalink":"https://linxz.online/blog/wordpress-backup/#bei-fen-wen-jian-jia","title":"备份文件夹","children":[]},{"level":2,"id":"zhuan-yi-wen-jian-jia-dao-ben-di-dian-nao","permalink":"https://linxz.online/blog/wordpress-backup/#zhuan-yi-wen-jian-jia-dao-ben-di-dian-nao","title":"转移文件夹到本地电脑","children":[]}]},{"level":1,"id":"shu-ju-ku-mysqlbei-fen","permalink":"https://linxz.online/blog/wordpress-backup/#shu-ju-ku-mysqlbei-fen","title":"数据库mysql备份","children":[{"level":2,"id":"bei-fen-mysql","permalink":"https://linxz.online/blog/wordpress-backup/#bei-fen-mysql","title":"备份mysql","children":[]},{"level":2,"id":"zhuan-yi-wen-jian-jia-dao-ben-di-dian-nao-1","permalink":"https://linxz.online/blog/wordpress-backup/#zhuan-yi-wen-jian-jia-dao-ben-di-dian-nao-1","title":"转移文件夹到本地电脑","children":[]}]}],
"body":"总共分为两步：wordpress文件夹备份+数据库备份\nwordpress文件夹备份\n找到wordpress所放的文件夹，我的腾讯云地址是：\n/usr/local/lighthouse/softwares/wordpress\n\n备份文件夹\nsudo tar -czvf wordpress_backup.tar.gz .\n\n这条命令的作用是：在当前目录下创建一个名为wordpress_backup.tar.gz的压缩tar存档，包含当前目录下的所有文件和子目录，使用gzip进行压缩，并在过程中显示每个被处理文件的详细信息。\n转移文件夹到本地电脑\nscp root@your-server-ip:/usr/local/lighthouse/softwares/wordpress/wordpress_backup.tar.gz /Users/lxz/Downloads/\n\n数据库mysql备份\n找到mysql的文件夹，我的腾讯云服务器上的地址是：\n/www/server/mysql/\n\n备份mysql\nmysqldump -u root -p wordpress &gt; backup.sql\n\n使用 mysqldump 工具将名为 wordpress 的MySQL数据库备份当前文件夹下到一个名为 backup.sql 的文件。\n转移文件夹到本地电脑\nscp root@your-server-ip:/www/server/mysql/backup.sql /Users/lxz/Downloads/\n\n这样就大功告成了。接下来迁移wordpress可以看我这篇wordpress迁移到阿里云。\n"},{"title":"经济学梗概-小岛故事",
"url":"/blog/island-economy-story/",
"date":"2024-10-16",
"headings":[{"level":1,"id":"yi-xiao-dao-he-bu-yu-qi","permalink":"https://linxz.online/blog/island-economy-story/#yi-xiao-dao-he-bu-yu-qi","title":"一、小岛和捕鱼器","children":[]},{"level":1,"id":"er-jie-yu-ke-yi-ma","permalink":"https://linxz.online/blog/island-economy-story/#er-jie-yu-ke-yi-ma","title":"二、借鱼可以吗？","children":[]},{"level":1,"id":"san-ju-xing-bu-yu-qi","permalink":"https://linxz.online/blog/island-economy-story/#san-ju-xing-bu-yu-qi","title":"三、巨型捕鱼器","children":[]},{"level":1,"id":"si-yong-yu-lai-jiao-huan-ba","permalink":"https://linxz.online/blog/island-economy-story/#si-yong-yu-lai-jiao-huan-ba","title":"四、用鱼来交换吧","children":[]},{"level":1,"id":"wu-ba-yu-cun-zai-wo-zhe-li-ba","permalink":"https://linxz.online/blog/island-economy-story/#wu-ba-yu-cun-zai-wo-zhe-li-ba","title":"五、把鱼存在我这里吧","children":[]},{"level":1,"id":"liu-li-xi-wo-lai-ding-ba","permalink":"https://linxz.online/blog/island-economy-story/#liu-li-xi-wo-lai-ding-ba","title":"六、利息我来定吧","children":[]}],
"body":"今天看了一本书，叫做小岛经济学。\n书中以一个啥都没有的小岛象征人类原始社会，层层发展出经济学。\n我心想，这个为我了解经济学的梗概很有帮助呀，所以决定把这个故事写下来。\n一、小岛和捕鱼器\n很久很久以前，有一个荒芜的小岛，岛上啥也没有，只能靠吃鱼。\n生活在岛上的人，力气不怎么大，一天只能捕到一条鱼。\n岛上有三个人，聪聪、本本、东东。\n聪聪就想，每天总是捕鱼也不是办法，我想干点别的，比如去冲浪呀，所以我得提高一下自己的生产力。有天，他真的想到一个办法。\n他一大早起来找材料，开始织网。本本和东东看不明白，你织网干啥呀？你现在不捕鱼，等下饿肚子，我们可不会分给你哟。\n聪聪不理会他们，从早忙到晚，果然来不及捕鱼，因为其他人不愿意分给他食物，所以他头天饿着肚子入睡，非常痛苦。\n值得庆幸的是，隔天，聪聪就把捕鱼器做好了。现在他一天可以捕到2条鱼。\n虽然只有聪聪一个人提升了效率，但对于整座岛而言，整座岛的生产力提高了。\n现在聪聪捕的鱼可以吃到第二天，因此他可以利用第二天的时间做点别的，不用天天捕鱼了。\n\n\n虽然聪聪最后开发出了捕鱼器，提高了生产力，改善了他的生活。但他付出的是「挨饿」和「风险」。因为他有一天不能吃鱼，而且万一他的捕鱼网无效，可能还要承受更多天的饥饿。还没算上，如果他借了别人的鱼，那么还要还的这部分。所以，创业是高风险的。\n生产力是由欲望驱动的，如果聪聪安安分分地捕鱼吃鱼，小岛不会有任何改变。\n\n二、借鱼可以吗？\n看到聪聪的捕鱼器，本本和东东坐不住了。“老兄，有福同享呗。”两个人厚着脸皮和聪聪说。\n聪聪说，不行，先不说你们嘲笑过我，如果用完渔网不换给我，或者弄破了，我怎么办？\n本本见聪聪不愿意让步，就说，这样行不行，你把多余的鱼先借给我们吃，我们自己来织网。弄好了就还给你鱼，这样成不？\n聪聪说，凭什么要我给你们好处？何况我借给你们了，你们不去织网，不还给我，我不就亏大了？\n东东想出了个办法。这样，你借给我一条鱼，明天我还给你两条，怎样？这样你也不吃亏。\n聪聪心想，行啊，这个回报不错，借出2条鱼，回报4条鱼，于是就答应了。\n\n\n借贷利息的兴起源于借款人意识到的不平等。我为什么要把钱借给你呢？如果我可以在未来获得好处（高收益），我就可以承受借给你的风险（高风险）。如此看来，风险和收益总是并存的。\n\n三、巨型捕鱼器\n聪聪借给本本和东东鱼后，他们也做好了自己的渔网。\n现在，大家每天都可以捕2条鱼了，整个岛的生产力提高了。大家可以做一些娱乐活动，但是，我们想要更多呀，我们想要画画、写书这些费时间的活动呀。\n怎么办？扩大生产力呗。聪聪准备整一个巨型捕鱼器，放在水底下，固定给他批量抓鱼。但是，单凭他一个人不够，需要准备材料、搭架子、建造等工程。\n于是，聪聪决定拉本本和东东入伙，我们一起来办个公司吧。我们拿出储蓄，花一整年时间来把巨型捕鱼器做好。\n虽然要冒很大的风险，但三人对未来都充满信心。终于，巨型捕鱼器做好了，也大获成功。现在，他们每周可以自动捕20条鱼了。\n后来，他们又做了几个类似的捕鱼器，可以腾出手做别的事情。\n聪聪做了个冲浪板公司，本本做了个服装公司，东东做了个独木舟，也准备设计手推车。\n\n\n生产力的提高，解放了人们的时间。人们生活可以丰富起来。\n\n四、用鱼来交换吧\n岛上生产力提高了，移民也多了起来。大家都喜欢这里，有漂亮的衣服，可以冲浪，交通也很便携。\n这样以后，大家可以选择自己喜欢的生活方式。假如你生得高大强壮，也许运输鱼比捕鱼挣得更多，为聪聪他们公司服务，每月可以得到大量的鱼。\n不过，如果你是一个伐木匠，你不能拿木头和人家交换，人家不缺木头呀。\n唯一可以确定的是，岛上的人都吃鱼，因此，你需要把木头换成鱼，之后才能换别的东西。\n久而久之，人们觉得太复杂了。还不如直接换算，比如一捆木头相当于4条鱼，这样就清楚了。\n这样就诞生了价格。\n五、把鱼存在我这里吧\n大量的交换必然导致储蓄，鱼放久了会坏，怎么办呢？\n一个聪明的人叫贝尔，他租了一个房子，植入了调整温度和湿度的技术，使得鱼可以长期保存，这样，他的储蓄就一直不会减少。\n他心想，这么好的东西，别人也要吧，于是他推广出去，别人来这里储蓄，那么就每个月交一点鱼就可以了。\n生意好起来后，他想，我有这么多鱼，而有些人又着急要鱼，我可以先给他们用呀，之后要求他们还更多的鱼就好了。\n于是，大鱼贷款公司也成立，与大鱼银行一起工作。\n这后来，人们把鱼存进来大鱼银行不需要交鱼了，反而是贝尔每月给鱼给那些人，为什么呢？因为贝尔需要大量的鱼贷款给别人，这就是银行利息的开始。\n六、利息我来定吧\n由于大家的钱都在大鱼银行，大鱼银行又负责把钱借出去。自然而然，大家就接受大鱼银行制定的利率。\n虽然权力这么大，但是贝尔也不能为所欲为，还是受市场规律影响。\n比如说，仓库有很多鱼，那么就要降息，避免人们送鱼进来。如果借贷利率太高，也会导致人们不敢借钱，但如果一段时间很多人借钱不还，那么就要适当抬高利率。\n"},{"title":"neovim技巧-如何查找替换？",
"url":"/blog/neovim-find/",
"date":"2024-10-14",
"headings":[],
"body":"查找和替换语法：\n:%s/查找内容/替换内容/g\n\n% 表示在整个文件中执行\ns 是substitute(替换)的缩写\ng 表示全局替换(每行所有匹配)\n"},{"title":"如何给neovim加代码片段(snippet)",
"url":"/blog/neovim-snippet/",
"date":"2024-10-14",
"headings":[{"level":1,"id":"chuang-jian-dai-ma-pian-duan-wen-jian-jia","permalink":"https://linxz.online/blog/neovim-snippet/#chuang-jian-dai-ma-pian-duan-wen-jian-jia","title":"创建代码片段文件夹","children":[]},{"level":1,"id":"xiu-gai-plugins-lua","permalink":"https://linxz.online/blog/neovim-snippet/#xiu-gai-plugins-lua","title":"修改plugins.lua","children":[]}],
"body":"注意：前提是你安装了luasnip的插件，我用的插件管理器是lazy，可以参考我之前的neovim设置，这里就不再赘述。\n创建代码片段文件夹\nmkdir -p ~/.config/nvim/lua/snippets\ntouch ~/.config/nvim/lua/snippets/markdown.lua\n\n打开 ~/.config/nvim/lua/snippets/markdown.lua 文件，添加以下内容：\nlocal ls = require(&quot;luasnip&quot;)\nlocal s = ls.snippet\nlocal t = ls.text_node\nlocal i = ls.insert_node\nlocal f = ls.function_node\n\nlocal date = function() return {os.date(&#39;%Y-%m-%d&#39;)} end\n\nls.add_snippets(&quot;markdown&quot;, {\n  s(&quot;zfm&quot;, {\n    t(&quot;+++&quot;),\n    t({&quot;&quot;, &quot;title = \\&quot;&quot;}), i(1), t(&quot;\\&quot;&quot;),\n    t({&quot;&quot;, &quot;date = &quot;}), f(date),\n    t({&quot;&quot;, &quot;+++&quot;, &quot;&quot;}),\n    i(0),\n  }),\n})\n\n修改plugins.lua\n找到LuaSnip的配置部分，并修改如下：\n{\n    &quot;L3MON4D3/LuaSnip&quot;,\n    version = &quot;v2.*&quot;,\n    build = &quot;make install_jsregexp&quot;,\n    dependencies = { &quot;rafamadriz/friendly-snippets&quot; },\n    config = function()\n        -- 加载Vscode-like snippet\n        require(&quot;luasnip.loaders.from_vscode&quot;).lazy_load()\n        -- 加载自定义snippets\n        require(&quot;snippets.markdown&quot;)\n    end,\n},\n\n:wq保存并退出。\n现在，当你在Markdown文件中输入 zfm 并触发补全（通常是按Tab键），应该会自动展开为你定义的frontmatter模板。\n"},{"title":"Neovim如何预览markdown文件？",
"url":"/blog/neovim-markdown-preview/",
"date":"2024-10-13",
"headings":[{"level":1,"id":"an-zhuang-markdown-previewcha-jian","permalink":"https://linxz.online/blog/neovim-markdown-preview/#an-zhuang-markdown-previewcha-jian","title":"安装markdown-preview插件","children":[]},{"level":1,"id":"ce-shi-yu-lan-xiao-guo","permalink":"https://linxz.online/blog/neovim-markdown-preview/#ce-shi-yu-lan-xiao-guo","title":"测试预览效果","children":[]},{"level":1,"id":"cha-kan-ri-zhi","permalink":"https://linxz.online/blog/neovim-markdown-preview/#cha-kan-ri-zhi","title":"查看日志","children":[{"level":2,"id":"an-zhuang-tslibmo-kuai","permalink":"https://linxz.online/blog/neovim-markdown-preview/#an-zhuang-tslibmo-kuai","title":"安装tslib模块","children":[]},{"level":2,"id":"cha-kan-package-jsonwen-jian","permalink":"https://linxz.online/blog/neovim-markdown-preview/#cha-kan-package-jsonwen-jian","title":"查看package.json文件","children":[]}]},{"level":1,"id":"zheng-shi-shi-yong","permalink":"https://linxz.online/blog/neovim-markdown-preview/#zheng-shi-shi-yong","title":"正式使用","children":[]},{"level":1,"id":"qi-ta","permalink":"https://linxz.online/blog/neovim-markdown-preview/#qi-ta","title":"其他","children":[]}],
"body":"注意：我使用的插件管理器是lazy，lazy集成在~/.config/nvim/lua/plugins.lua里面。\n安装markdown-preview插件\n在~/.config/nvim/lua/plugins.lua里面添加如下代码：\n  {\n    &quot;iamcco/markdown-preview.nvim&quot;,\n    cmd = { &quot;MarkdownPreview&quot;, &quot;MarkdownPreviewStop&quot; },\n    build = function() vim.fn[&quot;mkdp#util#install&quot;]() end,\n    init = function()\n      vim.g.mkdp_filetypes = { &quot;markdown&quot; }\n   end,\n   ft = { &quot;markdown&quot; },\n  },\n\n按:wq退出，重新按nvim进入就会自动安装插件。\n测试预览效果\n这个插件的使用方式是:MarkdownPreview和:MarkdownPreviewStop来分别表示预览和预览结束。\n我点击了，没有任何反应。\n查看日志\n我询问了claude，让我通过:messages来查看日志。显示Cannot find module 'tslib'，这是因为缺少了一个node.js的模块。\n安装tslib模块\ncd ~/.local/share/nvim/lazy/markdown-preview.nvim/app\nnpm install tslib\n\n安装完后，你发现还是无法运行。\n查看package.json文件\n查看 ~/.local/share/nvim/lazy/markdown-preview.nvim/package.json 文件，手动添加依赖：\n&quot;dependencies&quot;: {\n  &quot;tslib&quot;: &quot;^2.3.0&quot;\n}\n\n这样一来，问题就解决了。\n正式使用\n:MarkdownPreview就是预览。\n:MarkdownPreviewStop就是预览结束。\n其他\nclaude提示我，还可以进一步让预览自动化，但我还没设置，代码参考：\nvim.g.mkdp_auto_start = 0  -- 在打开 markdown 文件时自动打开预览窗口\nvim.g.mkdp_auto_close = 1  -- 在离开 markdown 缓冲区时自动关闭预览窗口\nvim.g.mkdp_refresh_slow = 0  -- 实时预览\nvim.g.mkdp_command_for_global = 0  -- 使命令在全局范围内可用\nvim.g.mkdp_open_to_the_world = 0  -- 预览服务器可以被任意计算机访问\nvim.g.mkdp_open_ip = &#39;&#39;  -- 在网络中预览时使用的 IP 地址\nvim.g.mkdp_browser = &#39;&#39;  -- 指定预览使用的浏览器\nvim.g.mkdp_echo_preview_url = 0  -- 在命令行回显预览页面的 URL\nvim.g.mkdp_browserfunc = &#39;&#39;  -- 自定义打开预览页面的函数名\n\n"},{"title":"远程控制软件推荐",
"url":"/blog/distant-control/",
"date":"2024-10-12",
"headings":[{"level":1,"id":"todesk","permalink":"https://linxz.online/blog/distant-control/#todesk","title":"ToDesk","children":[]}],
"body":"ToDesk\nToDesk 是一款远程控制软件，支持Windows、Mac、Linux、iOS、Android等多个平台，国内的软件。\n安装结束后，可以邀请对方控制电脑：\n\n点击对方给你的链接，输入临时密码就可以控制对方电脑。\n"},{"title":"Neovim自动补全snippet（代码）插件",
"url":"/blog/neovim-auto-snippet/",
"date":"2024-10-12",
"headings":[{"level":1,"id":"an-zhuang","permalink":"https://linxz.online/blog/neovim-auto-snippet/#an-zhuang","title":"安装","children":[{"level":2,"id":"zai-nvim-cmpde-yi-lai-zhong-tian-jia-luasnip","permalink":"https://linxz.online/blog/neovim-auto-snippet/#zai-nvim-cmpde-yi-lai-zhong-tian-jia-luasnip","title":"在nvim-cmp的依赖中添加LuaSnip","children":[]}]},{"level":1,"id":"tian-jia-zolade-snippetpian-duan","permalink":"https://linxz.online/blog/neovim-auto-snippet/#tian-jia-zolade-snippetpian-duan","title":"添加zola的snippet片段","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/neovim-auto-snippet/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"首先，我们选用的插件是LuaSnip，采用的插件管理包是lazy。\n安装\n在我的~/.config/nvim/lua/plugins.lua文件中添加如下代码：\nrequire(&quot;lazy&quot;).setup({\n     -- 代码片段snippet \n    -- 安装LuaSnip\n    {\n        &quot;L3MON4D3/LuaSnip&quot;,\n        -- follow latest release.\n        version = &quot;v2.*&quot;, -- Replace &lt;CurrentMajor&gt; by the latest released major (first number of latest release)\n        -- install jsregexp (optional!).\n        build = &quot;make install_jsregexp&quot;,\n        dependencies = { &quot;rafamadriz/friendly-snippets&quot; },\n        config = function()\n            -- 安装Vscode-like snippet\n            require(&quot;luasnip.loaders.from_vscode&quot;).lazy_load()\n        end,\n    },\n})\n\n注意，我们还添加了一个依赖rafamadriz/friendly-snippets，通过luasnip.loads.from_vscode来访问Vscode-like的代码片段。\n在nvim-cmp的依赖中添加LuaSnip\n这一步是为了让nvim-cmp支持LuaSnip的代码片段。\n我之前没想到这一步，浪费了很多时间，因为代码片段依赖代码补全插件，如果不通过cmp来触发，那么代码片段永远不会出现。\n我在这里得到了启发。\n-- Auto-completion engine\n{\n    &quot;hrsh7th/nvim-cmp&quot;,\n    dependencies = {\n        &quot;lspkind.nvim&quot;,\n        &quot;hrsh7th/cmp-nvim-lsp&quot;, -- lsp auto-completion\n        &quot;hrsh7th/cmp-buffer&quot;, -- buffer auto-completion\n        &quot;hrsh7th/cmp-path&quot;, -- path auto-completion\n        &quot;hrsh7th/cmp-cmdline&quot;, -- cmdline auto-completion\n        &quot;saadparwaiz1/cmp_luasnip&quot;, --自动补全代码snippet，这里是关键\n    },\n    config = function()\n        require(&quot;config.nvim-cmp&quot;)\n    end,\n},\n\n现在，当你输入html5的时候，就会触发代码片段，html5的代码片段（模版）了。\n添加zola的snippet片段\nlocal ls = require(&quot;luasnip&quot;)\nlocal s = ls.snippet\nlocal t = ls.text_node\nlocal i = ls.insert_node\nlocal f = ls.function_node\n\nlocal date = function() return {os.date(&#39;%Y-%m-%d&#39;)} end\n\nls.add_snippets(&quot;markdown&quot;, {\n  -- 原有的 zfm snippet\n  s(&quot;zfm&quot;, {\n    t(&quot;+++&quot;),\n    t({&quot;&quot;, &quot;title = \\&quot;&quot;}), i(1), t(&quot;\\&quot;&quot;),\n    t({&quot;&quot;, &quot;date = &quot;}), f(date),\n    t({&quot;&quot;, &quot;+++&quot;, &quot;&quot;}),\n    i(0),\n  }),\n  \n  -- 新增的 zfms snippet\n  s(&quot;zfms&quot;, {\n    t(&quot;+++&quot;),\n    t({&quot;&quot;, &quot;title = \\&quot;&quot;}), i(1), t(&quot;\\&quot;&quot;),\n    t({&quot;&quot;, &quot;date = &quot;}), f(date),\n    t({&quot;&quot;, &quot;authors = [\\&quot;小中\\&quot;]&quot;}),\n    t({&quot;&quot;, &quot;[taxonomies]&quot;}),\n    t({&quot;&quot;, &quot;tags = [\\&quot;&quot;}), i(2), t(&quot;\\&quot;]&quot;),\n    t({&quot;&quot;, &quot;+++&quot;, &quot;&quot;}),\n    i(0),\n  }),\n})\n\n参考资料\nreddit讨论\n别人配置好的dotfiles\n"},{"title":"如何导出微信读书的笔记？",
"url":"/blog/wechat-books/",
"date":"2024-10-12",
"headings":[{"level":1,"id":"an-zhuang-cha-jian","permalink":"https://linxz.online/blog/wechat-books/#an-zhuang-cha-jian","title":"安装插件","children":[]},{"level":1,"id":"shi-yong-cha-jian","permalink":"https://linxz.online/blog/wechat-books/#shi-yong-cha-jian","title":"使用插件","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/wechat-books/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"最简单的方法，就是安装一个浏览器插件，叫做微信读书助手，然后在微信读书的网页版上，点击导出按钮，就可以导出笔记了。\n安装插件\n点击chrome浏览器的三个点，选择更多工具，再选择扩展程序，选择chrome商店，然后在搜索框中输入微信读书助手，点击安装即可。\n\n使用插件\n打开微信读书网页版，点击笔记按钮，选择获取标注，然后选择导出，就可以复制笔记的markdown格式到剪贴板了。\n\n参考资料\nDemoChen - 如何导出微信读书笔记？\n"},{"title":"收集不错的博客主题",
"url":"/blog/blog-theme/",
"date":"2024-10-11",
"headings":[{"level":1,"id":"hugozhu-ti","permalink":"https://linxz.online/blog/blog-theme/#hugozhu-ti","title":"HUGO主题","children":[{"level":2,"id":"zhu-ti-dolt","permalink":"https://linxz.online/blog/blog-theme/#zhu-ti-dolt","title":"主题：Dolt","children":[]},{"level":2,"id":"zhu-ti-ladder","permalink":"https://linxz.online/blog/blog-theme/#zhu-ti-ladder","title":"主题：Ladder","children":[]}]}],
"body":"HUGO主题\n主题：Dolt\n\n博客地址：https://martinlwx.github.io/zh-cn/posts/\n主题：Ladder\n\n博客地址1：https://demochen.com/posts/20230804/\n博客地址2：https://guangzhengli.com/blog/zh/vector-database/\n"},{"title":"什么是dotfile？",
"url":"/blog/dotfile/",
"date":"2024-10-11",
"headings":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/dotfile/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"dotfile 是指在类 Unix 系统（如 Linux、macOS）中以点（.）开头的隐藏文件或目录。这些文件通常用于存储用户特定的配置信息。以下是一些关键点：\n\n\n用途：dotfile 主要用于存储各种程序和系统组件的配置设置。\n\n\n隐藏性：在默认情况下，以点开头的文件在文件管理器或 ls 命令中是不可见的，除非使用特定选项。\n\n\n常见示例：\n\n.bashrc：Bash shell 的配置文件\n.vimrc：Vim 编辑器的配置文件\n.gitconfig：Git 版本控制系统的全局配置\n\n\n\n位置：dotfile 通常位于用户的主目录（home directory ~）中。\n\n\n管理：许多用户选择将其 dotfile 存储在版本控制系统（如github)中，以便在多台机器间同步配置。\n\n\n查看方法：可以使用 ls -a 命令来查看包括 dotfile 在内的所有文件。\n\n\n参考资料\nclaude\n"},{"title":"如何调用大模型LLM的api？",
"url":"/blog/llmapi/",
"date":"2024-10-11",
"headings":[{"level":1,"id":"guo-chan","permalink":"https://linxz.online/blog/llmapi/#guo-chan","title":"国产","children":[{"level":2,"id":"deepseek-shen-du-qiu-suo","permalink":"https://linxz.online/blog/llmapi/#deepseek-shen-du-qiu-suo","title":"deepseek 深度求索","children":[]},{"level":2,"id":"siliconflow-huo-ji-liu-dong","permalink":"https://linxz.online/blog/llmapi/#siliconflow-huo-ji-liu-dong","title":"siliconflow 硅基流动","children":[]},{"level":2,"id":"chatglm-zhi-pu","permalink":"https://linxz.online/blog/llmapi/#chatglm-zhi-pu","title":"chatGLM 智谱","children":[{"level":3,"id":"jian-rong-openaide-diao-yong","permalink":"https://linxz.online/blog/llmapi/#jian-rong-openaide-diao-yong","title":"兼容OpenAI的调用","children":[]},{"level":3,"id":"tong-bu-diao-yong","permalink":"https://linxz.online/blog/llmapi/#tong-bu-diao-yong","title":"同步调用","children":[]},{"level":3,"id":"yi-bu-diao-yong","permalink":"https://linxz.online/blog/llmapi/#yi-bu-diao-yong","title":"异步调用","children":[]},{"level":3,"id":"ssediao-yong-liu-shi-shu-chu","permalink":"https://linxz.online/blog/llmapi/#ssediao-yong-liu-shi-shu-chu","title":"SSE调用（流式输出）","children":[]}]},{"level":2,"id":"yue-zhi-an-mian-monnshot","permalink":"https://linxz.online/blog/llmapi/#yue-zhi-an-mian-monnshot","title":"月之暗面 monnshot","children":[]},{"level":2,"id":"a-li-tong-yi-qian-wen-qwen","permalink":"https://linxz.online/blog/llmapi/#a-li-tong-yi-qian-wen-qwen","title":"阿里通义千问 qwen","children":[]},{"level":2,"id":"minimax","permalink":"https://linxz.online/blog/llmapi/#minimax","title":"minimax","children":[]},{"level":2,"id":"bai-chuan","permalink":"https://linxz.online/blog/llmapi/#bai-chuan","title":"百川","children":[]}]}],
"body":"国产\n简要说明:\n我选择的大多是兼容OpenAI的API，为了跨区域跨平台的使用方便。官方还有其他的调用方式，我就不一一罗列了。\ndeepseek 深度求索\n# python3\n# Please install OpenAI SDK first：`pip3 install openai`\nfrom openai import OpenAI\n\nclient = OpenAI(api_key=&quot;your-api-key&quot;, base_url=&quot;https://api.deepseek.com&quot;)\n\nresponse = client.chat.completions.create(\n    model=&quot;deepseek-chat&quot;,\n    messages=[\n        {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;You are a helpful assistant&quot;},\n        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你是什么模型？你属于哪个公司开发的？&quot;},\n    ],\n    stream=False\n)\n\nprint(response.choices[0].message.content)\n\ndeepseek文档\nsiliconflow 硅基流动\nfrom openai import OpenAI\n\nclient = OpenAI(api_key=&quot;your-api-key&quot;, base_url=&quot;https://api.siliconflow.cn/v1&quot;)\n\nresponse = client.chat.completions.create(\n    model=&#39;alibaba/Qwen1.5-7B-Chat&#39;,\n    messages=[\n        {&#39;role&#39;: &#39;user&#39;, &#39;content&#39;: &quot;写一个hello world的js代码&quot;}\n    ],\n    stream=True,\n)\n\nfor chunk in response:\n    print(chunk.choices[0].delta.content, end=&#39;&#39;)\n\nprint(response.choices[0].message.content)\n\nchatGLM 智谱\n兼容OpenAI的调用\nfrom openai import OpenAI \n\nclient = OpenAI(\n    api_key=&quot;your-api-key&quot;,\n    base_url=&quot;https://open.bigmodel.cn/api/paas/v4/&quot;\n) \n\ncompletion = client.chat.completions.create(\n    model=&quot;glm-4&quot;,  \n    messages=[    \n        {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;你是一个很有帮助的AI助手&quot;},    \n        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你是谁？&quot;} \n    ],\n    top_p=0.7,\n    temperature=0.9\n ) \n\nprint(completion.choices[0].message.content)\n\n同步调用\n#pip install --upgrade zhipuai\nfrom zhipuai import ZhipuAI\nclient = ZhipuAI(api_key=&quot;your-api-key&quot;) # 填写您自己的APIKey\nresponse = client.chat.completions.create(\n    model=&quot;glm-4&quot;,  # 填写需要调用的模型名称\n    messages=[\n        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;作为一名营销专家，请为我的产品创作一个吸引人的slogan&quot;},\n        {&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;当然，为了创作一个吸引人的slogan，请告诉我一些关于您产品的信息&quot;},\n        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;智谱AI开放平台&quot;},\n        {&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;智启未来，谱绘无限一智谱AI，让创新触手可及!&quot;},\n        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;创造一个更精准、吸引人的slogan&quot;}\n    ],\n)\nprint(response.choices[0].message)\n\n异步调用\nfrom zhipuai import ZhipuAI\n\nclient = ZhipuAI(api_key=&quot;your-api-key&quot;) # 请填写您自己的APIKey\nresponse = client.chat.asyncCompletions.create(\n    model=&quot;glm-4&quot;,  # 填写需要调用的模型名称\n    messages=[\n        {\n            &quot;role&quot;: &quot;user&quot;,\n            &quot;content&quot;: &quot;请你作为童话故事大王，写一篇短篇童话故事，故事的主题是要永远保持一颗善良的心，要能够激发儿童的学习兴趣和想象力，同时也能够帮助儿童更好地理解和接受故事中所蕴含的道理和价值观。&quot;\n        }\n    ],\n)\nprint(response)\n\nSSE调用（流式输出）\nfrom zhipuai import ZhipuAI\nclient = ZhipuAI(api_key=&quot;your-api-key&quot;) # 请填写您自己的APIKey\nresponse = client.chat.completions.create(\n  model=&quot;glm-4&quot;,  # 填写需要调用的模型名称\n    messages=[\n        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你好！你叫什么名字&quot;},\n    ],\n    stream=True,\n    )\nfor chunk in response:\n    print(chunk.choices[0].delta)\n\n智谱文档\n月之暗面 monnshot\nfrom openai import OpenAI\n \nclient = OpenAI(\n    api_key = &quot;your-api-key&quot;,\n    base_url = &quot;https://api.moonshot.cn/v1&quot;,\n)\n \ncompletion = client.chat.completions.create(\n    model = &quot;moonshot-v1-8k&quot;,\n    messages = [\n        {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;你是 Kimi，由 Moonshot AI 提供的人工智能助手，你更擅长中文和英文的对话。你会为用户提供安全，有帮助，准确的回答。同时，你会拒绝一切涉及恐怖主义，种族歧视，黄色暴力等问题的回答。Moonshot AI 为专有名词，不可翻译成其他语言。&quot;},\n        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你好，我叫李雷，1+1等于多少？&quot;}\n    ],\n    temperature = 0.3,\n)\n \nprint(completion.choices[0].message.content)\n\n月之暗面文档\n阿里通义千问 qwen\n# 如果下述命令报错，请将pip替换为pip3\n#!pip install -U openai\nimport os\nos.environ[&quot;DASHSCOPE_API_KEY&quot;]= &#39;your-api-key&#39;\nfrom openai import OpenAI\nimport os\nimport json\nclient = OpenAI(\n    api_key=os.getenv(&quot;DASHSCOPE_API_KEY&quot;), # 如果您没有配置环境变量，请在此处用您的API Key进行替换\n    base_url=&quot;https://dashscope.aliyuncs.com/compatible-mode/v1&quot;,  # 填写DashScope SDK的base_url\n)\ncompletion = client.chat.completions.create(\n    model=&quot;qwen-plus&quot;,\n    messages=[{&#39;role&#39;: &#39;system&#39;, &#39;content&#39;: &#39;You are a helpful assistant.&#39;},\n              {&#39;role&#39;: &#39;user&#39;, &#39;content&#39;: &#39;现在的人可以有多少个老婆？&#39;}]\n    )\n#print(completion.model_dump_json())\n\ndata=json.loads(completion.model_dump_json())\n# Extract the content\ncontent = data[&#39;choices&#39;][0][&#39;message&#39;][&#39;content&#39;]\nprint(content)\n\nminimax\nimport requests\n\ngroup_id=&quot;your-group-id&quot;\napi_key=&quot;your-api-key&quot;\n\nurl = &quot;https://api.minimax.chat/v1/text/chatcompletion_pro?GroupId=&quot; + group_id\nheaders = {&quot;Content-Type&quot;:&quot;application/json&quot;, &quot;Authorization&quot;:&quot;Bearer &quot; + api_key}\n\npayload = {\n    &quot;bot_setting&quot;:[\n        {\n            &quot;bot_name&quot;:&quot;MM智能助理&quot;,\n            &quot;content&quot;:&quot;MM智能助理是一款由MiniMax自研的，没有调用其他产品的接口的大型语言模型。MiniMax是一家中国科技公司，一直致力于进行大模型相关的研究。&quot;,\n        }\n    ],\n    &quot;messages&quot;:[{&quot;sender_type&quot;:&quot;USER&quot;, &quot;sender_name&quot;:&quot;小明&quot;, &quot;text&quot;:&quot;帮我用英文翻译下面这句话：我是谁&quot;}],\n    &quot;reply_constraints&quot;:{&quot;sender_type&quot;:&quot;BOT&quot;, &quot;sender_name&quot;:&quot;MM智能助理&quot;},\n    &quot;model&quot;:&quot;abab6.5s-chat&quot;,\n    &quot;tokens_to_generate&quot;:2048,\n    &quot;temperature&quot;:0.01,\n    &quot;top_p&quot;:0.95,\n}\n\nresponse = requests.request(&quot;POST&quot;, url, headers=headers, json=payload)\n\nprint(response.status_code)\nprint(response.text)\n\nimport json\n# 将JSON字符串转换为Python字典\ndata = json.loads(response.text)\nstring = data[&#39;choices&#39;][0][&#39;messages&#39;][0][&#39;text&#39;]\nprint(string)\n\nminimax文档\n百川\nfrom openai import OpenAI\n\nclient = OpenAI(\n    api_key=&quot;your-api-key&quot;,\n    base_url=&quot;https://api.baichuan-ai.com/v1/&quot;,\n)\n\ncompletion = client.chat.completions.create(\n    model=&quot;Baichuan2-Turbo&quot;,\n    messages=[\n        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;西游记里有多少妖怪？&quot;}\n    ],\n    temperature=0.3,\n    stream=False,\n)\n\n#for chunk in completion:\n#    print(chunk.choices[0].delta)\n\nprint(completion.choices[0].message.content)\n\n百川文档\n"},{"title":"如何改变neovim主题？",
"url":"/blog/neovim-theme/",
"date":"2024-10-11",
"headings":[{"level":1,"id":"an-zhuang-cha-jian-guan-li-qi","permalink":"https://linxz.online/blog/neovim-theme/#an-zhuang-cha-jian-guan-li-qi","title":"安装插件管理器","children":[]},{"level":1,"id":"zhu-ti-pei-zhi","permalink":"https://linxz.online/blog/neovim-theme/#zhu-ti-pei-zhi","title":"主题配置","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/neovim-theme/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"安装插件管理器\nneovim有许多插件管理器，比如vim-plug、lazy.vim、packer.nvim等，我这里选择最流行的lazy.vim\n新建 ~/.config/nvim/lua/plugins.lua 文件并放入如下内容。下面的模板只完成了 lazy.nvim 自身的安装，还没有指定其他第三方插件.\nlocal lazypath = vim.fn.stdpath(&quot;data&quot;) .. &quot;/lazy/lazy.nvim&quot;\nif not (vim.uv or vim.loop).fs_stat(lazypath) then\n  vim.fn.system({\n    &quot;git&quot;,\n    &quot;clone&quot;,\n    &quot;--filter=blob:none&quot;,\n    &quot;https://github.com/folke/lazy.nvim.git&quot;,\n    &quot;--branch=stable&quot;, -- latest stable release\n    lazypath,\n  })\nend\nvim.opt.rtp:prepend(lazypath)\n\nrequire(&quot;lazy&quot;).setup({})\n\n然后再 ~/.config/nvim/init.lua 文件中添加如下内容\nrequire(&quot;plugins&quot;)\n\n此时你重启 Nvim 会发现黑屏没显示，这是因为 lazy.nvim 在安装自己，静待片刻即可☕️。等待 Dashboard 出现之后，可以输入 :Lazy 试试，如果看到了弹出了 lazy.nvim 的窗口，那就安装成功了🎉\nTip：用 :q 退出 lazy.nvim 的窗口\n主题配置\n注意：\nmacOS 自带的 Terminal.app 只支持 ANSI 256，在安装完 monokai 主题后，你可能会发现显示整个画面变成蓝色。使用颜色支持更丰富的 Terminal 可以解决这个问题（比如 iTerm2、Kitty）\n这里用的主题是monokai.nvim，在 plugins.lua 进行修改。\n... -- 省略其他行\nrequire(&quot;lazy&quot;).setup({\n    &quot;tanvirtin/monokai.nvim&quot;,\n})\n\n:wq保存更改并重启就可以看到 lazy.nvim 在帮我们安装插件了，新建并编辑 ~/.config/nvim/lua/colorscheme.lua 文件\n-- define your colorscheme here\nlocal colorscheme = &#39;monokai_pro&#39;\n\nlocal is_ok, _ = pcall(vim.cmd, &quot;colorscheme &quot; .. colorscheme)\nif not is_ok then\n    vim.notify(&#39;colorscheme &#39; .. colorscheme .. &#39; not found!&#39;)\n    return\nend\n\n最后在 init.lua 文件里面导入就行.\n... -- 省略其他行\nrequire(&#39;colorscheme&#39;)\n\n我的所有nvim配置文件都放在~/.config/nvim目录下，已经上传到github，在任何电脑上，都可以克隆我的配置。\n参考资料\nMartinLwx's blog - 从零开始配置 Neovim(Nvim)\n注：还可以参考此教程的代码补全部分。\n"},{"title":"如何给neovim配置文件树-用lazy.nvim插件",
"url":"/blog/neovim-tree/",
"date":"2024-10-11",
"headings":[{"level":1,"id":"an-zhuang-nvim-treecha-jian-li-yong-lazy-nvimcha-jian-guan-li-bao","permalink":"https://linxz.online/blog/neovim-tree/#an-zhuang-nvim-treecha-jian-li-yong-lazy-nvimcha-jian-guan-li-bao","title":"安装nvim-tree插件 - 利用lazy.nvim插件管理包","children":[]},{"level":1,"id":"she-zhi-kuai-jie-jian-f2kuai-su-da-kai-guan-bi-wen-jian-shu","permalink":"https://linxz.online/blog/neovim-tree/#she-zhi-kuai-jie-jian-f2kuai-su-da-kai-guan-bi-wen-jian-shu","title":"设置快捷键F2快速打开/关闭文件树","children":[]},{"level":1,"id":"kuai-su-dao-hang-chuang-kou","permalink":"https://linxz.online/blog/neovim-tree/#kuai-su-dao-hang-chuang-kou","title":"快速导航窗口","children":[]},{"level":1,"id":"wen-jian-gai-ming","permalink":"https://linxz.online/blog/neovim-tree/#wen-jian-gai-ming","title":"文件改名","children":[]},{"level":1,"id":"xian-shi-tu-biao","permalink":"https://linxz.online/blog/neovim-tree/#xian-shi-tu-biao","title":"显示图标","children":[]}],
"body":"首先，我的文件夹结构是\n~/.config/nvim/init.lua，\n~/.config/nvim/lua/plugins.lua，\n~/.config/nvim/lua/colorscheme.lua\n~/.config/nvim/lua/keymaps.lua\n安装nvim-tree插件 - 利用lazy.nvim插件管理包\n我们要安装的插件是nvim-tree.lua，不同插件管理包的安装方法。\n我会把nvim-tree.lua放在~/.config/nvim/lua目录下，然后在plugins.lua中添加如下内容：\n -- nvim-tree 配置\n    {\n        &quot;nvim-tree/nvim-tree.lua&quot;,\n        version = &quot;*&quot;,\n        lazy = false,\n        dependencies = {\n            &quot;nvim-tree/nvim-web-devicons&quot;,\n        },\n        config = function()\n            require(&quot;nvim-tree&quot;).setup {}\n        end,\n    },\n\n因为我把所有的插件都放在lazy中，而lazy占据了整个plugins.lua文件，所以放出整个plugins.lua文件以供参考：\nlocal lazypath = vim.fn.stdpath(&quot;data&quot;) .. &quot;/lazy/lazy.nvim&quot;\nif not (vim.uv or vim.loop).fs_stat(lazypath) then\n  vim.fn.system({\n    &quot;git&quot;,\n    &quot;clone&quot;,\n    &quot;--filter=blob:none&quot;,\n    &quot;https://github.com/folke/lazy.nvim.git&quot;,\n    &quot;--branch=stable&quot;, -- latest stable release\n    lazypath,\n  })\nend\nvim.opt.rtp:prepend(lazypath)\n\nrequire(&quot;lazy&quot;).setup({\n    -- 主题\n    &quot;tanvirtin/monokai.nvim&quot;,\n\n    -- 新添加的 nvim-tree 配置\n    {\n        &quot;nvim-tree/nvim-tree.lua&quot;,\n        version = &quot;*&quot;,\n        lazy = false,\n        dependencies = {\n            &quot;nvim-tree/nvim-web-devicons&quot;,\n        },\n        config = function()\n            require(&quot;nvim-tree&quot;).setup {}\n        end,\n    },\n    \n    -- LSP manager\n\t&quot;williamboman/mason.nvim&quot;,\n\t&quot;williamboman/mason-lspconfig.nvim&quot;,\n\t&quot;neovim/nvim-lspconfig&quot;,\n\n\n\t-- Vscode-like pictograms\n\t{\n\t\t&quot;onsails/lspkind.nvim&quot;,\n\t\tevent = { &quot;VimEnter&quot; },\n\t},\n\t-- Auto-completion engine\n\t{\n\t\t&quot;hrsh7th/nvim-cmp&quot;,\n\t\tdependencies = {\n\t\t\t&quot;lspkind.nvim&quot;,\n\t\t\t&quot;hrsh7th/cmp-nvim-lsp&quot;, -- lsp auto-completion\n\t\t\t&quot;hrsh7th/cmp-buffer&quot;, -- buffer auto-completion\n\t\t\t&quot;hrsh7th/cmp-path&quot;, -- path auto-completion\n\t\t\t&quot;hrsh7th/cmp-cmdline&quot;, -- cmdline auto-completion\n\t\t},\n\t\tconfig = function()\n\t\t\trequire(&quot;config.nvim-cmp&quot;)\n\t\tend,\n\t},\n\t-- Code snippet engine\n\t{\n\t\t&quot;L3MON4D3/LuaSnip&quot;,\n\t\tversion = &quot;v2.*&quot;,\n\t},\n})\n\n设置快捷键F2快速打开/关闭文件树\n在keymaps.lua中添加如下内容：\nvim.keymap.set(&#39;n&#39;, &#39;&lt;F2&gt;&#39;, &#39;:NvimTreeToggle&lt;CR&gt;&#39;, { noremap = true, silent = true })\n\nnoremap = tree 代表非递归映射，不会层层引用；silent = true 代表不显示命令行的信息。\n这样，按F2就可以打开或关闭文件树。\n快速导航窗口\n在keymaps.lua中添加如下内容：\n-- Better window navigation\nvim.keymap.set(&#39;n&#39;, &#39;&lt;C-h&gt;&#39;, &#39;&lt;C-w&gt;h&#39;, opts)\nvim.keymap.set(&#39;n&#39;, &#39;&lt;C-j&gt;&#39;, &#39;&lt;C-w&gt;j&#39;, opts)\nvim.keymap.set(&#39;n&#39;, &#39;&lt;C-k&gt;&#39;, &#39;&lt;C-w&gt;k&#39;, opts)\nvim.keymap.set(&#39;n&#39;, &#39;&lt;C-l&gt;&#39;, &#39;&lt;C-w&gt;l&#39;, opts)\n\n这样，按Ctrl+h、Ctrl+j、Ctrl+k、Ctrl+l就可以在窗口之间快速导航。h是左，j是下，k是上，l是右。\n文件改名\n只要导航到文件夹窗口，按r即可。\n显示图标\n按F2打开文件树时，你会发现图标不能正常显示。你需要下载一个nerd font，选择一个喜欢的下载就行了。\n下载后是.zip文件，直接解压会出现很多类型的字体，随便安装一个就行了。\n下一步是打开iTerm2，设置字体。在Profile-text-Font里面可以设置，换成刚刚下载的字体即可。\n重新用nvim打开neovim，会发现文件夹图标正常显示了。\n"},{"title":"如何使用neovim",
"url":"/blog/neovim/",
"date":"2024-10-10",
"headings":[{"level":1,"id":"shen-me-shi-neovim","permalink":"https://linxz.online/blog/neovim/#shen-me-shi-neovim","title":"什么是neovim","children":[]},{"level":1,"id":"kuai-su-zhu-shi","permalink":"https://linxz.online/blog/neovim/#kuai-su-zhu-shi","title":"快速注释","children":[]},{"level":1,"id":"an-zhuang-neovim","permalink":"https://linxz.online/blog/neovim/#an-zhuang-neovim","title":"安装neovim","children":[]},{"level":1,"id":"shi-yong-neovim","permalink":"https://linxz.online/blog/neovim/#shi-yong-neovim","title":"使用neovim","children":[]},{"level":1,"id":"an-zhuang-cha-jian","permalink":"https://linxz.online/blog/neovim/#an-zhuang-cha-jian","title":"安装插件","children":[{"level":2,"id":"an-zhuang-cha-jian-guan-li-qi-vim-plug","permalink":"https://linxz.online/blog/neovim/#an-zhuang-cha-jian-guan-li-qi-vim-plug","title":"安装插件管理器vim-plug","children":[]},{"level":2,"id":"an-zhuang-cha-jian-nerdtree","permalink":"https://linxz.online/blog/neovim/#an-zhuang-cha-jian-nerdtree","title":"安装插件nerdtree","children":[]},{"level":2,"id":"kuai-jie-jian-bang-ding","permalink":"https://linxz.online/blog/neovim/#kuai-jie-jian-bang-ding","title":"快捷键绑定","children":[]},{"level":2,"id":"wen-jian-shu-nerdtreede-shi-yong","permalink":"https://linxz.online/blog/neovim/#wen-jian-shu-nerdtreede-shi-yong","title":"文件树nerdtree的使用","children":[{"level":3,"id":"xin-jian-wen-jian","permalink":"https://linxz.online/blog/neovim/#xin-jian-wen-jian","title":"新建文件","children":[]},{"level":3,"id":"shan-chu-wen-jian","permalink":"https://linxz.online/blog/neovim/#shan-chu-wen-jian","title":"删除文件","children":[]}]}]},{"level":1,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/neovim/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"什么是neovim\nneovim是vim的一个分支，给程序员写代码的IDE，喜欢vim的程序员可以用它来取代vscode。\n快速注释\n点击gcc可以注释或者取消注释，gc+enter可以达到一样的效果。\n安装neovim\n可以选择直接下载安装包，也可以用brew安装。\nbrew install neovim\n\n这是安装教程。\n使用neovim\n安装结束后，直接输入nvim就可以打开neovim。\n不过，现在的neovim还不是完全体，需要安装插件，比如可以查看文件树的nerdtree插件。\n安装插件\n安装插件管理器vim-plug\n安装插件需要用到vim-plug，可以点击github教程，安装方法如下：\nsh -c &#39;curl -fLo &quot;${XDG_DATA_HOME:-$HOME/.local/share}&quot;/nvim/site/autoload/plug.vim --create-dirs \\\n       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim&#39;\n\n这里规定，插件都放在~/.local/share/nvim/plugged目录下。\n安装完vim-plug后，可以在~/.config/nvim/init.vim中添加插件，比如：\ncall plug#begin(&#39;~/.local/share/nvim/plugged&#39;)\n\nPlug &#39;preservim/nerdtree&#39;\n\ncall plug#end()\n\n安装插件nerdtree\n配置完插件后，可以用nvim打开neovim，在最下方输入:PlugInstall来安装插件。\n快捷键绑定\n在~/.config/nvim/init.vim中添加快捷键绑定，比如：\nmap &lt;F2&gt; :NERDTreeToggle&lt;CR&gt;\n\n这样，按F2就可以打开或关闭文件树。\n文件树nerdtree的使用\n新建文件\n新建文件按m-a，如果是文件夹要在后面加/，比如src/\n删除文件\n在文件上按m-d，然后按y确认删除。\n参考资料\nneovim的配置\n"},{"title":"网站被微信拦截怎么办？",
"url":"/blog/wechat-limit/",
"date":"2024-10-10",
"headings":[],
"body":"今天在微信里打开我的网站，发现不是直接跳转，而是显示网站无备案，需要用户点击继续浏览。\n我心想，那是应该要备案了。\n不过我看到owen的博客，在站长工具-备案查询里面并没有备案记录，但在微信里面正常访问，因此，我想应该有其他办法。\n我试着点击了我要申诉，提示我需要将一个.txt文件放入网站根目录。这个简单，我是zola网站，直接放在statc文件夹下就可以了。如果是vue或者react，可以放在public文件夹下。\n操作结束，用https://linxz.online/xxx.txt测试一下，发现可以正常访问这个文档，于是又在微信里面打开我的网站，发现还是被拦截。\n这次显示网站不是微信官方认证的网站，需要用户点击继续浏览。\n这次，我发现下面有个恢复访问的按钮，点进去输入网站的域名，然后提交，就可以正常访问了。\n"},{"title":"如何用git pull命令？",
"url":"/blog/git-pull/",
"date":"2024-10-02",
"headings":[{"level":1,"id":"ru-guo-ben-di-he-yuan-duan-du-you-geng-xin-yong-stash-zan-cun","permalink":"https://linxz.online/blog/git-pull/#ru-guo-ben-di-he-yuan-duan-du-you-geng-xin-yong-stash-zan-cun","title":"如果本地和远端都有更新，用stash（暂存）","children":[]}],
"body":"git pull命令用于从远程仓库拉取最新的代码到本地仓库。使用方法如下：\n# 拉取远程仓库的最新代码\ngit pull\n\n如果本地和远端都有更新，用stash（暂存）\n# 暂存本地修改\ngit pull --autostash\n\n然后，在直接git push提交就可以将本地修改推送到远程仓库。\n"},{"title":"如何设置github的个人主页（自我介绍）？",
"url":"/blog/github-intro/",
"date":"2024-10-02",
"headings":[{"level":1,"id":"chuang-jian-yi-ge-he-ni-de-yong-hu-ming-yi-yang-de-cang-ku","permalink":"https://linxz.online/blog/github-intro/#chuang-jian-yi-ge-he-ni-de-yong-hu-ming-yi-yang-de-cang-ku","title":"创建一个和你的用户名一样的仓库","children":[]},{"level":1,"id":"zai-cang-ku-zhong-chuang-jian-yi-ge-readme-mdwen-jian","permalink":"https://linxz.online/blog/github-intro/#zai-cang-ku-zhong-chuang-jian-yi-ge-readme-mdwen-jian","title":"在仓库中创建一个README.md文件","children":[]}],
"body":"你是否也想自定义个人主页，展示自己的作品和技能？比如这样：\n\n那么，你可以按照以下步骤来设置你的github个人主页：\n创建一个和你的用户名一样的仓库\n比如我的用户名是linxz-coder，那么我就需要创建一个名为linxz-coder的仓库。\n在仓库中创建一个README.md文件\n在仓库中创建一个README.md文件，这个文件就是你的个人主页的内容。\n"},{"title":"如何用Gunicorn部署python-Flask应用？",
"url":"/blog/gunicorn/",
"date":"2024-10-02",
"headings":[{"level":1,"id":"wei-shen-me-yao-yong-gunicorn","permalink":"https://linxz.online/blog/gunicorn/#wei-shen-me-yao-yong-gunicorn","title":"为什么要用Gunicorn？","children":[]},{"level":1,"id":"an-zhuang-gunicorn","permalink":"https://linxz.online/blog/gunicorn/#an-zhuang-gunicorn","title":"安装Gunicorn","children":[]},{"level":1,"id":"jian-cha-shi-fou-you-gunicornwen-jian-zai-yun-xing","permalink":"https://linxz.online/blog/gunicorn/#jian-cha-shi-fou-you-gunicornwen-jian-zai-yun-xing","title":"检查是否有gunicorn文件在运行","children":[]},{"level":1,"id":"sha-diao-gunicornjin-cheng","permalink":"https://linxz.online/blog/gunicorn/#sha-diao-gunicornjin-cheng","title":"杀掉gunicorn进程","children":[]},{"level":1,"id":"shi-yun-xing-ni-de-pythonying-yong","permalink":"https://linxz.online/blog/gunicorn/#shi-yun-xing-ni-de-pythonying-yong","title":"试运行你的python应用","children":[]},{"level":1,"id":"yong-gunicornyun-xing-ni-de-pythonying-yong","permalink":"https://linxz.online/blog/gunicorn/#yong-gunicornyun-xing-ni-de-pythonying-yong","title":"用Gunicorn运行你的python应用","children":[]}],
"body":"为什么要用Gunicorn？\nflask是python应用，一般来说，直接用python app.py就可以启动服务了。\n但是，为了可以让应用在服务器上长时间运行（即使关掉服务器交互页面页不影响），我们需要用到Gunicorn。\n安装Gunicorn\npip install gunicorn\n\n检查是否有gunicorn文件在运行\nps aux | grep gunicorn\n\n杀掉gunicorn进程\npkill -f &#39;gunicorn.*no-function-calling&#39;\n\n杀掉特定的进程，在我的例子中，是杀掉和no-function-calling有关的进程。\n试运行你的python应用\npython no-function-calling.py\n\n试运行你的python应用，看看是否有问题。\n用Gunicorn运行你的python应用\nnohup gunicorn --certfile /root/.acme.sh/commonlearner.com_ecc/fullchain.cer --keyfile /root/.acme.sh/commonlearner.com_ecc/commonlearner.com.key -b 0.0.0.0:5328 -w 4 no-function-calling:app\n\n代码解释：\n\nnohup是让程序在后台运行。\n--certfile和--keyfile是ssl证书的路径。\nb是绑定的ip和端口。\nw是worker的数量。一般是cpu核心数的2倍。4代表4个worker，即4个gunicon进程。\nno-function-calling:app是你的python文件名和app对象。\n\n"},{"title":"如何用pm2管理nextjs应用（nextjs网站部署上线）",
"url":"/blog/pm2/",
"date":"2024-10-02",
"headings":[{"level":1,"id":"wei-shen-me-yao-yong-pm2","permalink":"https://linxz.online/blog/pm2/#wei-shen-me-yao-yong-pm2","title":"为什么要用pm2？","children":[]},{"level":1,"id":"an-zhuang-pm2","permalink":"https://linxz.online/blog/pm2/#an-zhuang-pm2","title":"安装pm2","children":[]},{"level":1,"id":"qi-dong-nextjsying-yong","permalink":"https://linxz.online/blog/pm2/#qi-dong-nextjsying-yong","title":"启动nextjs应用","children":[]},{"level":1,"id":"cha-kan-jin-cheng","permalink":"https://linxz.online/blog/pm2/#cha-kan-jin-cheng","title":"查看进程","children":[]},{"level":1,"id":"ting-zhi-jin-cheng","permalink":"https://linxz.online/blog/pm2/#ting-zhi-jin-cheng","title":"停止进程","children":[]},{"level":1,"id":"shan-chu-jin-cheng","permalink":"https://linxz.online/blog/pm2/#shan-chu-jin-cheng","title":"删除进程","children":[]},{"level":1,"id":"zhong-qi-jin-cheng","permalink":"https://linxz.online/blog/pm2/#zhong-qi-jin-cheng","title":"重启进程","children":[]},{"level":1,"id":"bao-cun-bing-zi-dong-zhong-qi-ying-yong","permalink":"https://linxz.online/blog/pm2/#bao-cun-bing-zi-dong-zhong-qi-ying-yong","title":"保存并自动重启应用","children":[]},{"level":1,"id":"xiu-gai-nextjsying-yong-hou-zi-dong-zhong-qi","permalink":"https://linxz.online/blog/pm2/#xiu-gai-nextjsying-yong-hou-zi-dong-zhong-qi","title":"修改nextjs应用后自动重启","children":[]},{"level":1,"id":"hui-fu-bao-cun-de-jin-cheng-lie-biao","permalink":"https://linxz.online/blog/pm2/#hui-fu-bao-cun-de-jin-cheng-lie-biao","title":"恢复保存的进程列表","children":[]},{"level":1,"id":"guan-yu-nextjscheng-xu-de-nginxshe-zhi","permalink":"https://linxz.online/blog/pm2/#guan-yu-nextjscheng-xu-de-nginxshe-zhi","title":"关于nextjs程序的nginx设置","children":[]}],
"body":"为什么要用pm2？\n在生产环境中，pm2通常取代npm run start来启动应用程序。pm2是一个进程管理器，它可以在后台进行，帮助我们管理应用程序的生命周期，包括启动、停止、重启、监控等。\n安装pm2\nnpm install -g pm2\n\n启动nextjs应用\npm2 start npm --name &quot;terminal-blog-nomodule&quot; -- run start\n\n这里--name参数是给进程起一个名字，--后面的是npm的参数，run start表示运行package.json中的start脚本。\n查看进程\npm2 list\n\n停止进程\npm2 stop app_name_or_id\n\n删除进程\npm2 delete app_name_or_id\n\n重启进程\npm2 restart app_name_or_id\n\n保存并自动重启应用\npm2 save\npm2 startup\n\n修改nextjs应用后自动重启\nnpm run build\npm2 restart app_name_or_id\n\n注意，这里需要先运行npm run build，因为nextjs是一个ssr框架，需要先编译成html文件，否则会一直显示旧的内容。\n恢复保存的进程列表\n如果服务器发生重启，可以快速恢复之前保存的进程列表。\npm2 resurrect\n\n关于nextjs程序的nginx设置\nnextjs不是通过html文件，而是通过Node.js服务器动态渲染。因此不会出现index.html的重定向。反而重定向是localhost:3000。\n核心是HTTPS的重定向\nlocation / {\n    proxy_pass http://localhost:3000;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n}\n\n"},{"title":"python虚拟环境搭建-venv",
"url":"/blog/python-venv/",
"date":"2024-10-02",
"headings":[],
"body":"如何创建一个python虚拟环境？输入以下代码即可：\n# 创建一个虚拟环境\npython3 -m venv venv\n\n# 激活虚拟环境\nsource venv/bin/activate\n\n# 在虚拟环境中安装插件，如\npip install markdown\n\n# 运行脚本\npython md-html.py\n\n# 退出虚拟环境\ndeactivate\n"},{"title":"如何用VSCode登录服务器？",
"url":"/blog/server-vscode/",
"date":"2024-10-02",
"headings":[{"level":1,"id":"xia-zai-cha-jian","permalink":"https://linxz.online/blog/server-vscode/#xia-zai-cha-jian","title":"下载插件","children":[]},{"level":1,"id":"pei-zhi-xin-zhu-ji","permalink":"https://linxz.online/blog/server-vscode/#pei-zhi-xin-zhu-ji","title":"配置新主机","children":[]},{"level":1,"id":"xiu-gai-pei-zhi-wen-jian","permalink":"https://linxz.online/blog/server-vscode/#xiu-gai-pei-zhi-wen-jian","title":"修改配置文件","children":[]},{"level":1,"id":"lian-jie-xin-zhu-ji","permalink":"https://linxz.online/blog/server-vscode/#lian-jie-xin-zhu-ji","title":"连接新主机","children":[]}],
"body":"下载插件\n搜索Remote - SSH，安装。\n配置新主机\n按ctrl+shift+p，输入Remote-SSH: Connect to Host，选择Configure SSH Hosts（打开配置文件），配置文件叫做~/.ssh/config。\n修改配置文件\n输入你的主机名、用户名、密钥文件路径。\n  Host &lt;yourIP&gt;\n    HostName &lt;yourIP&gt;\n    User root\n    IdentityFile &lt;path-to-your-key&gt;\n\n连接新主机\n按ctrl+shift+p，输入Remote-SSH: Connect to Host，选择你的主机名。\n这样，你就可以在VSCode中编辑服务器文件了。\n"},{"title":"vue如何进行api请求-axios土味情话",
"url":"/blog/vue-axios/",
"date":"2024-10-02",
"headings":[{"level":1,"id":"an-zhuang-axios","permalink":"https://linxz.online/blog/vue-axios/#an-zhuang-axios","title":"安装axios","children":[]},{"level":1,"id":"shi-yong-axios","permalink":"https://linxz.online/blog/vue-axios/#shi-yong-axios","title":"使用axios","children":[]},{"level":1,"id":"fa-song-qing-qiu","permalink":"https://linxz.online/blog/vue-axios/#fa-song-qing-qiu","title":"发送请求","children":[]},{"level":1,"id":"wan-zheng-dai-ma","permalink":"https://linxz.online/blog/vue-axios/#wan-zheng-dai-ma","title":"完整代码","children":[]}],
"body":"重点是async和await，属于js的基本功。\n需要用到的模块是axios。\n安装axios\nnpm install axios\n\n使用axios\nimport axios from &#39;axios&#39;\n\n发送请求\nasync和await是js的异步操作，用于处理异步请求。\nasync function fetchLoveTalk() {\n  let result = await axios.get(&#39;https://api.uomg.com/api/rand.qinghua?format=json&#39;)\n  console.log(result.data)\n  loveTalk.value = result.data.content\n}\n\n完整代码\n/* App.vue */\n&lt;template&gt;\n  &lt;div class=&quot;container&quot;&gt;\n    &lt;h1&gt;土味情话自动更新&lt;/h1&gt;\n    &lt;h2 class=&quot;love-talk&quot;&gt;{{ loveTalk }}&lt;/h2&gt;\n    &lt;button class=&quot;btn&quot; @click=&quot;fetchLoveTalk&quot;&gt;点击显示土味情话&lt;/button&gt;\n  &lt;/div&gt;\n&lt;/template&gt;\n\n&lt;script setup lang=&quot;ts&quot; name=&quot;App&quot;&gt;\nimport { ref } from &#39;vue&#39;\nimport axios from &#39;axios&#39;\n\n//数据\nlet loveTalk = ref(&#39;&#39;)\n\n\n//方法\nasync function fetchLoveTalk() {\n  let result = await axios.get(&#39;https://api.uomg.com/api/rand.qinghua?format=json&#39;)\n  console.log(result.data)\n  loveTalk.value = result.data.content\n}\n\n&lt;/script&gt;\n\n&lt;style scoped&gt;\n.container {\n  max-width: 600px;\n  margin: 50px auto;\n  padding: 20px;\n  background-color: #fff;\n  border-radius: 10px;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n  text-align: center;\n}\n\nh1 {\n  font-size: 24px;\n  color: #333;\n  margin-bottom: 20px;\n}\n\n.love-talk {\n  font-size: 20px;\n  color: #007BFF;\n  margin-bottom: 30px;\n}\n\n.btn {\n  padding: 10px 20px;\n  font-size: 16px;\n  font-weight: bold;\n  color: #fff;\n  background-color: #007BFF;\n  border: none;\n  border-radius: 5px;\n  cursor: pointer;\n  transition: background-color 0.3s ease;\n}\n\n.btn:hover {\n  background-color: #0056b3;\n}\n&lt;/style&gt;\n\n"},{"title":"如何创建一个vue项目？",
"url":"/blog/vue-init/",
"date":"2024-10-02",
"headings":[{"level":1,"id":"vue3","permalink":"https://linxz.online/blog/vue-init/#vue3","title":"vue3","children":[]},{"level":1,"id":"vue2","permalink":"https://linxz.online/blog/vue-init/#vue2","title":"vue2","children":[]}],
"body":"vue3\nnpm create vue@latest\n\n接下来照着选择选项即可。\n如果想要预览项目，需要先安装依赖-vite\nnpm i\n\n然后运行项目\nnpm run dev\n\nvue2\nnpm install -g @vue/cli\n\n接着\nvue create vue2_test\n\n"},{"title":"数据原则",
"url":"/blog/data-principle/",
"date":"2024-09-30",
"headings":[{"level":1,"id":"qian-yan","permalink":"https://linxz.online/blog/data-principle/#qian-yan","title":"前言","children":[]},{"level":1,"id":"shu-ju-zheng-li","permalink":"https://linxz.online/blog/data-principle/#shu-ju-zheng-li","title":"数据整理","children":[{"level":2,"id":"yuan-ze-yi-yong-shi-ji-shu-ju-bu-yong-tui-ce-shu-ju","permalink":"https://linxz.online/blog/data-principle/#yuan-ze-yi-yong-shi-ji-shu-ju-bu-yong-tui-ce-shu-ju","title":"原则一：用实际数据，不用推测数据","children":[]},{"level":2,"id":"yuan-ze-er-zhao-zui-zhun-que-de-shu-ju","permalink":"https://linxz.online/blog/data-principle/#yuan-ze-er-zhao-zui-zhun-que-de-shu-ju","title":"原则二：找最准确的数据","children":[]},{"level":2,"id":"yuan-ze-san-zong-shi-xian-shi-dan-wei","permalink":"https://linxz.online/blog/data-principle/#yuan-ze-san-zong-shi-xian-shi-dan-wei","title":"原则三：总是显示单位","children":[]},{"level":2,"id":"yuan-ze-si-rang-dui-fang-fu-chu-zui-xiao-nu-li","permalink":"https://linxz.online/blog/data-principle/#yuan-ze-si-rang-dui-fang-fu-chu-zui-xiao-nu-li","title":"原则四：让对方付出最小努力","children":[]},{"level":2,"id":"yuan-ze-wu-zhong-yao-shu-ju-bao-mi","permalink":"https://linxz.online/blog/data-principle/#yuan-ze-wu-zhong-yao-shu-ju-bao-mi","title":"原则五：重要数据保密","children":[]},{"level":2,"id":"yuan-ze-liu-pi-pei-wei-yi-shu-ju","permalink":"https://linxz.online/blog/data-principle/#yuan-ze-liu-pi-pei-wei-yi-shu-ju","title":"原则六：匹配唯一数据","children":[]},{"level":2,"id":"yuan-ze-qi-bao-liu-yuan-shi-shu-ju","permalink":"https://linxz.online/blog/data-principle/#yuan-ze-qi-bao-liu-yuan-shi-shu-ju","title":"原则七：保留原始数据","children":[]},{"level":2,"id":"yuan-ze-ba-shu-ju-ju-ti-qie-ke-jian-cha","permalink":"https://linxz.online/blog/data-principle/#yuan-ze-ba-shu-ju-ju-ti-qie-ke-jian-cha","title":"原则八：数据具体且可检查","children":[]}]}],
"body":"这是我自己在做数据工作的时候总结出来的一些原则，还待补充。\n前言\n本手册汇总数据工作的原则，包含数据整理、数据分析、数据可视化、数据开发等方面的内容。\n\n数据整理\n原则一：用实际数据，不用推测数据\n\n原因\n推测数据的准确性不高，需要考虑的因素太多，容易引起计算错误或引起误解。\n\n做法\n如果不确定是否有实际数据，应尝试与财务、人力、运营等部门沟通，确认是否有实际数据。\n\n例子\n你需要知道员工的4月平均薪酬数据。\n❌不要：\n\n\n根据3月份的薪酬数据，推测4月份的薪酬数据。\n\n\n根据员工的薪酬结构，推测平均薪酬。\n\n\n✅要：\n\n直接找财务部门，导出上一月份的平均薪酬。\n\n\n原则二：找最准确的数据\n\n原因\n通常而言，找到数据的方式不只一种。但是，不同来源同一标签的数据往往不一样。\n比如，系统的“课时确认”与”课时汇总“都能导出课时，但是，”课时确认“与薪资挂钩，准确度较高。\n\n做法\n有的时候，获取准确数据会遇到很多问题，比如你要的数据，只能由各中心提交，但是时间紧迫，很难在规定的时间内完成任务。\n我们还是需要做两手准备，一边收集最准确的数据，一边找其他方式。\n但总而言之，我们需要最准确的数据。\n\n例子\n你需要知道员工的4月课时。\n❌不要：\n\n随意找课时汇总。\n\n✅要：\n\n找到与薪酬挂靠的课时。\n\n\n原则三：总是显示单位\n\n原因\n根据不同的用途，数据的存储单位也不同。\n比如薪酬计算时，我们可能按照小时计算。但是，客户服务时，可能以课时（45分钟）计算。\n因为存在两套计算逻辑，因此不同数据源呈现的单位可能不一致，而数据源作者不一样注意得到。\n\n做法\n我们需要判断数据源的单位，并标注清楚，以防造成误解。\n\n原则四：让对方付出最小努力\n\n原因\n收集数据时，特别是需要他人帮忙时，往往会碰到很多困难。\n比如对方时间不够、对方合作意愿低、数据收集的规定时间太短等。\n\n做法\n我们能做的是，在要求数据准确的情况下，让对方付出最小努力。\n比如合理规划，只需要对方提供必要的信息，或者减少对方需要思考的数据，提前把公式设定好。\n\n原则五：重要数据保密\n\n原因\n我们会接触到核心数据，不管从公司利益出发，还是从职业道德考虑，你都不应该故意或无意泄露重要数据。\n比如薪酬数据、个人隐私数据等等。\n\n做法\n涉及到此类数据，应对数据表格加密。\n\n原则六：匹配唯一数据\n\n原因\n做数据匹配时，比如采用Excel的vlookup函数，会出现多个重复值，例如姓名重复。\n\n做法\n我们需要匹配唯一值，比如匹配工号，不要匹配姓名。\n如果无法出现唯一值，可以考虑将两个字段结合，形成唯一值。比如员工A有三门课程，分别是中级、高级、资深。\n我们可以将唯一值设定为A中级、A高级、A资深，这样也方便函数的查找，比如vlookup函数的查找。\n\n原则七：保留原始数据\n\n原因\n数据收集完成，并不代表数据收集的终点。因为各种原因，已有的数据可能会出错（比如系统出错、人工出错等等）。\n因此，我们必须保留原始数据，以便后续查验。\n\n做法\n尽量让保留表格中的原始数据，如果需要做计算，尽量用数据链接。\n这样一来，未来原始数据发生变动，其他对应数据也能随之变动。\n\n原则八：数据具体且可检查\n\n原因\n接收数据任务时，往往对方的需求会比较简单。比如某个中心的营收完成情况。\n但是，有时候我们的数据源并非是准确的，常常需要和对方进行查验。这时候，我们就需要有明细的数据。\n比如，某个中心的营收情况可能会涉及到多个课程，我们需要知道每个课程的营收情况，甚至每天每个人的营收情况。\n这样，如果未来对方质疑数据的准确性，我们可以有一份可核对的数据，而不是”黑箱数据“。\n\n做法\n导出数据时，我们需要有数据明细，最好具体到几点几分，具体到每个人的贡献数值等等。\n"},{"title":"如何读取多对象json",
"url":"/blog/how-to-build-simple-chatgpt/",
"date":"2024-09-30",
"headings":[{"level":1,"id":"1-zhao-dao-ji-shu-zhan","permalink":"https://linxz.online/blog/how-to-build-simple-chatgpt/#1-zhao-dao-ji-shu-zhan","title":"1.找到技术栈","children":[]},{"level":1,"id":"2-cha-kan-chatgptguan-wang","permalink":"https://linxz.online/blog/how-to-build-simple-chatgpt/#2-cha-kan-chatgptguan-wang","title":"2.查看ChatGPT官网","children":[]},{"level":1,"id":"3-cha-kan-yuan-dai-ma","permalink":"https://linxz.online/blog/how-to-build-simple-chatgpt/#3-cha-kan-yuan-dai-ma","title":"3.查看源代码","children":[]},{"level":1,"id":"4-qi-ta-bian-ti","permalink":"https://linxz.online/blog/how-to-build-simple-chatgpt/#4-qi-ta-bian-ti","title":"4.其他变体","children":[]},{"level":1,"id":"5-dai-ma","permalink":"https://linxz.online/blog/how-to-build-simple-chatgpt/#5-dai-ma","title":"5.代码","children":[]}],
"body":"今天闲来无事，研究一下如何实现ChatGPT网页，从搭建框架开始吧。\n如何画出这样的框架呢？\n1.找到技术栈\n我在tailwindcss的官网找到OpenAI的案例，那么很有可能它的实现方式也是它。关于如何开始用tailwindcss，可以参考这篇文章。\n\n2.查看ChatGPT官网\n两个矩形连在一起，无非就是一个flex布局。\n我先实验了一下&quot;flex-auto&quot;（参考div的宽度自动排列），发现大小和官网上的不一致。\n我查阅了flex相关的页面,陆续实验了”flex-1&quot;（无视div的宽度自动排列）和&quot;flex-none&quot;（固定宽度，不自动调整大小）,都达不到想要的效果。\n我在想会不会和&quot;flex-row&quot;和&quot;flew-col&quot;有关，于是查阅了页面，也不对。\n我又查阅了宽度相关的页面,了解了&quot;w-1/2&quot;可以设置比例，但是也不能达成一样的效果。\n当然，我也问了ChatGPT啦，不过一样没啥效果。\n\n3.查看源代码\n于是，我去ChatGPT首页上看了一下源代码。打开网页，按F12，定位到代码所在元素，如下图：\n发现它用了“flex-shrink-0“，于是我查阅了文档，发现这个可以使菜单栏固定不动，即左边的菜单栏一直是一个大小。\n查看源代码，发现它设定了“260px&quot;的宽度，以及gray-900的颜色，所以不用说，抄就完了。\n这里还有一个点，外围使用”flex&quot;包围起来的div，需要用“h-screen&quot;才能让方框占满屏幕。\n\n4.其他变体\n做出框架后，我又模拟了ChatUI做了三个矩形的版本，如下图：\n\n5.代码\n在index.tsx文件中复制以下代码即可实现以上的效果：\nexport default function Home() {\n  return (\n    &lt;div className=&#39;flex h-screen&#39;&gt;\n      &lt;div className=&#39;flex-shrink-0 bg-gray-900 text-white&#39; style={{width: &#39;260px&#39;}} &gt;\n        &lt;div className=&quot;flex items-center justify-center w-full h-full text-5xl&quot;&gt;\n          01\n        &lt;/div&gt;\n      &lt;/div&gt;\n      &lt;div className=&#39;flex-auto bg-white&#39;&gt;\n        {/* items-center横向居中 justify-cent纵向居中 */}\n        &lt;div className=&quot;flex items-center justify-center w-full h-full text-5xl&quot;&gt;\n          02\n        &lt;/div&gt;\n      &lt;/div&gt;\n      &lt;div className=&#39;flex-shrink-0 bg-custom-color text-white&#39; style={{width: &#39;260px&#39;}}&gt;\n        &lt;div className=&quot;flex items-center justify-center w-full h-full text-5xl&quot;&gt;\n          03\n        &lt;/div&gt;\n      &lt;/div&gt;\n    &lt;/div&gt;\n  )\n}\n\n代码解释：\n\n\nflex: 这个类名创建了一个 flex container，允许你使用 flex 布局，即子元素可在这个元素内按照你设定的方式灵活布局。\n\n\nh-screen: 这个类名设置元素的高度等于屏幕的高度。\n\n\nflex-shrink-0: 这个类名阻止元素在 flex container 中收缩。默认情况下，当 flex container 的空间不足时，所有子元素都会等比例收缩，但使用了 flex-shrink-0 的元素则不会收缩。\n\n\nbg-gray-900、bg-white 和 bg-custom-color: 这些类名分别设置了元素的背景色。bg-gray-900是深灰色，bg-white是白色，bg-custom-color是自定义的颜色。\n\n\ntext-white: 这个类名设置了元素内文本的颜色为白色。\n\n\nitems-center: 在一个 flex container 中，这个类名使所有的子元素在交叉轴（cross axis）上居中。在默认情况下，交叉轴是垂直方向。\n\n\njustify-center: 在一个 flex container 中，这个类名使所有的子元素在主轴（main axis）上居中。在默认情况下，主轴是水平方向。\n\n\nw-full 和 h-full: 这些类名分别设置了元素的宽度和高度为父元素的宽度和高度。\n\n\ntext-5xl: 这个类名设置了元素内文本的字体大小。5xl表示很大的字体大小。\n\n\n这里的&quot;bg-custom-color&quot;是自定义的颜色，因为我一开始没看首页，没发现颜色是&quot;gray-900&quot;，所以用取色器取下来一样的颜色，这个颜色可以在”tailwind.config.js“中配置：\n    extend: {\n      colors: {\n        &#39;custom-color&#39;: &#39;#202123&#39;,\n      },\n\n针对以上例子，不配置也没问题，只需要改为&quot;bg-gray-900&quot;即可。\n"},{"title":"如何使用Tailwind CSS画漂亮的导航条？",
"url":"/blog/how-to-draw-navbar-tailwind-css/",
"date":"2024-09-30",
"headings":[{"level":2,"id":"dao-hang-tiao-yi-jian-bian-zhu-ti","permalink":"https://linxz.online/blog/how-to-draw-navbar-tailwind-css/#dao-hang-tiao-yi-jian-bian-zhu-ti","title":"导航条一：渐变主题","children":[]},{"level":2,"id":"dao-hang-tiao-2-jian-ji-zhu-ti","permalink":"https://linxz.online/blog/how-to-draw-navbar-tailwind-css/#dao-hang-tiao-2-jian-ji-zhu-ti","title":"导航条2：简洁主题","children":[]}],
"body":"在上一篇文章中，我介绍了”如何用TailwindCSS画漂亮的按钮“，这篇文章着重是画导航条。\n由于如何利用nextjs和tailwindcss创建一个app已经在上一篇文章中介绍过了，这里就不再赘述。需要补课的同学可以看看上一篇文章。\n导航条一：渐变主题\n代码如下：\n      &lt;nav className=&quot;container mx-auto px-6 py-2 flex justify-between items-center bg-gradient-to-r from-purple-500 to-indigo-500 rounded-lg&quot;&gt;\n        &lt;div className=&quot;font-bold text-xl text-white&quot;&gt;\n          凡学子\n        &lt;/div&gt;\n\n        &lt;div className=&quot;flex space-x-4&quot;&gt;\n          &lt;a href=&quot;#&quot; className=&quot;flex items-center justify-center text-white text-md bg-white bg-opacity-25 px-4 py-2 rounded-lg hover:bg-opacity-50 transition duration-300 w-24&quot;&gt;首页&lt;/a&gt;\n          &lt;a href=&quot;#&quot; className=&quot;flex items-center justify-center text-white text-md bg-white bg-opacity-25 px-4 py-2 rounded-lg hover:bg-opacity-50 transition duration-300 w-24&quot;&gt;历史文章&lt;/a&gt;\n          &lt;a href=&quot;#&quot; className=&quot;flex items-center justify-center text-white text-md bg-white bg-opacity-25 px-4 py-2 rounded-lg hover:bg-opacity-50 transition duration-300 w-24&quot;&gt;有趣的事&lt;/a&gt;\n          &lt;a href=&quot;#&quot; className=&quot;flex items-center justify-center text-white text-md bg-white bg-opacity-25 px-4 py-2 rounded-lg hover:bg-opacity-50 transition duration-300 w-24&quot;&gt;联系我&lt;/a&gt;\n        &lt;/div&gt;\n      &lt;/nav&gt;\n\n代码解释：\n\ncontainer: 在容器元素上应用了 Tailwind CSS 的样式类，用于设置最大宽度和水平居中。\nmx-auto: 在容器元素上应用了 Tailwind CSS 的样式类，用于设置水平居中。\npx-6: 在容器元素上应用了 Tailwind CSS 的样式类，用于设置水平内边距。\npy-2: 在容器元素上应用了 Tailwind CSS 的样式类，用于设置垂直内边距。\nflex: 在容器元素上应用了 Tailwind CSS 的样式类，用于使用 Flexbox 布局。\njustify-between: 在容器元素上应用了 Tailwind CSS 的样式类，用于在 Flexbox 布局中使子元素水平分布。\nitems-center: 在容器元素上应用了 Tailwind CSS 的样式类，用于在 Flexbox 布局中使子元素垂直居中。\nbg-gradient-to-r: 在容器元素上应用了 Tailwind CSS 的样式类，用于创建从左到右的背景渐变效果。\nfrom-purple-500: 在容器元素上应用了 Tailwind CSS 的样式类，用于指定背景渐变的起始颜色为紫色（品牌颜色500级别）。\nto-indigo-500: 在容器元素上应用了 Tailwind CSS 的样式类，用于指定背景渐变的结束颜色为靛蓝色（品牌颜色500级别）。\nrounded-lg: 在容器元素上应用了 Tailwind CSS 的样式类，用于添加圆角边框。\nfont-bold: 在  元素上应用了 Tailwind CSS 的样式类，用于设置粗体字体。\ntext-xl: 在  元素上应用了 Tailwind CSS 的样式类，用于设置文本大小为 extra large。\ntext-white: 在  元素上应用了 Tailwind CSS 的样式类，用于设置文本颜色为白色。\nspace-x-4: 在  元素上应用了 Tailwind CSS 的样式类，用于设置子元素之间的水平间距为 4。\n\n\n导航条2：简洁主题\n代码如下：\n      &lt;nav className=&quot;container mx-auto px-6 py-2 flex justify-between items-center&quot;&gt;\n        &lt;div className=&quot;flex items-center&quot;&gt;\n          &lt;svg t=&quot;1684593262099&quot; class=&quot;icon&quot; viewBox=&quot;0 0 1024 1024&quot; version=&quot;1.1&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; p-id=&quot;1780&quot; width=&quot;48&quot; height=&quot;48&quot;&gt;&lt;path d=&quot;M704 192c-68.693333 0-148.992 77.866667-192 128-43.008-50.133333-123.306667-128-192-128C198.442667 192 128 286.805333 128 407.466667c0 133.674667 128 275.2 384 424.533333 256-149.333333 384-288 384-416 0-120.661333-70.442667-224-192-224z&quot; fill=&quot;#c76abf&quot; opacity=&quot;.3&quot; p-id=&quot;1781&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M512 832C256 682.666667 128 541.141333 128 407.466667 128 286.805333 198.442667 192 320 192c68.693333 0 148.992 77.866667 192 128v512z&quot; fill=&quot;#c76abf&quot; p-id=&quot;1782&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n          &lt;div className=&quot;font-bold text-xl text-black ml-2&quot;&gt;凡学子&lt;/div&gt;\n        &lt;/div&gt;\n\n        &lt;div className=&quot;flex space-x-4&quot;&gt;\n          &lt;a href=&quot;#&quot; className=&quot;flex items-center justify-center text-black text-md bg-white px-4 py-2 rounded-lg&quot;&gt;\n            首页\n          &lt;/a&gt;\n          &lt;a href=&quot;#&quot; className=&quot;flex items-center justify-center text-black text-md bg-white px-4 py-2 rounded-lg&quot;&gt;\n            历史文章 &lt;span className=&quot;ml-1&quot;&gt;&amp;#9662;&lt;/span&gt;\n          &lt;/a&gt;\n          &lt;a href=&quot;#&quot; className=&quot;flex items-center justify-center text-black text-md bg-white px-4 py-2 rounded-lg&quot;&gt;\n            有趣的事 &lt;span className=&quot;ml-1&quot;&gt;&amp;#9662;&lt;/span&gt;\n          &lt;/a&gt;\n          &lt;a href=&quot;#&quot; className=&quot;flex items-center justify-center text-black text-md bg-white px-4 py-2 rounded-lg&quot;&gt;\n            联系我 &lt;span className=&quot;ml-1&quot;&gt;&amp;#9662;&lt;/span&gt;\n          &lt;/a&gt;\n          &lt;button className=&quot;flex items-center justify-center bg-violet-500 text-white px-4 py-2 rounded-lg&quot;&gt;\n            免费注册\n          &lt;/button&gt;\n          &lt;button className=&quot;flex items-center justify-center bg-indigo-50 text-violet-500 px-4 py-2 rounded-lg&quot;&gt;\n            登录\n          &lt;/button&gt;\n        &lt;/div&gt;\n      &lt;/nav&gt;\n\n代码解释：\n上面解释过的代码不重复介绍。\n\nsvg和/svg之间的代码不用看，只是为了导入我的logo。\n▾代表下拉三角形，是一种一个十进制的HTML字符实体。其中&quot;&amp;#&quot;开始，然后是一串数字，最后是一个分号。这串数字代表了Unicode字符的十进制代码。9662是这个特定字符（下箭头）在Unicode标准中的位置。Unicode是一种计算机编码标准，用于在所有系统和平台中统一表示和处理文字。Unicode为世界上所有的字符、符号和表情等分配了一个唯一的数字，这个数字就是Unicode代码点。所以，当你在HTML中输入&quot;▾&quot;时，浏览器会解析这个字符实体，并显示出对应的下箭头符号。\n\n"},{"title":"如何读取多对象json",
"url":"/blog/how-to-read-multiobject-json/",
"date":"2024-09-30",
"headings":[],
"body":"朋友今日传来一个json文件，说无法读取。\n我很好奇，到底什么json文件，竟然无法读取？\n我试着按照朋友指示的路径下载，发现这个文件竟然有1G多，颠覆了我对json文件”小而美“的认知。\n我试着用python读取:\nimport json\n\n# 打开JSON文件并读取内容\nwith open(&#39;data.json&#39;, &#39;r&#39;) as file:\n    json_data = file.read()\n\n# 解析JSON数据\ndata = json.loads(json_data)\n\n报错如下：\n于是，我用vscode查看了这个文档：\n我发现，这是一个多对象json文件，每个对象单独成为一个json，中间并没有逗号分隔，难怪python无法读取。\n应该怎么做呢？\n我试着问ChatGPT。它给了一个办法，就是在每个对象后面加上逗号，效果大致如下：\n{\n    &quot;id&quot;: 1,\n    &quot;name&quot;: &quot;A green door&quot;,\n    &quot;price&quot;: 12.50,\n    &quot;tags&quot;: [&quot;home&quot;, &quot;green&quot;]\n},\n{\n    &quot;id&quot;: 2,\n    &quot;name&quot;: &quot;A red door&quot;,\n    &quot;price&quot;: 12.50,\n    &quot;tags&quot;: [&quot;home&quot;, &quot;red&quot;]\n}\n\n可是，加逗号的过程一塌糊涂，首尾不该加逗号的地方加了，中间该加逗号的地方没加，文件过大经不起折腾，我只得放弃。\n我突然想，是否有办法遍历这个多对象json呢？\n谷歌了一下，还真的找到一个办法，代码如下：\nimport json\n\nwith open(&#39;data.json&#39;, &#39;r&#39;) as file:\n    text = file.read()\n\nobjs = text.splitlines()\nprint(len(objs))\n\n上面这段代码使用splitlines() 方法，可以将文件内容拆分为行的列表。\n比如，原本的json对象是这样的：\n{&quot;id&quot;: 1, &quot;name&quot;: &quot;A green door&quot;, &quot;price&quot;: 12.50, &quot;tags&quot;: [&quot;home&quot;, &quot;green&quot;]}\n{&quot;id&quot;: 2, &quot;name&quot;: &quot;A red door&quot;, &quot;price&quot;: 12.50, &quot;tags&quot;: [&quot;home&quot;, &quot;red&quot;]}\n\n使用splitlines()后，变成这样：\n[\n    {&quot;id&quot;: 1, &quot;name&quot;: &quot;A green door&quot;, &quot;price&quot;: 12.50, &quot;tags&quot;: [&quot;home&quot;, &quot;green&quot;]},\n    {&quot;id&quot;: 2, &quot;name&quot;: &quot;A red door&quot;, &quot;price&quot;: 12.50, &quot;tags&quot;: [&quot;home&quot;, &quot;red&quot;]}\n]\n\n这样我就可以读取里面的数据了！\n我把objs[1]打印出来：\nprint(objs[1])\n\n结果如下：\n{&quot;id&quot;: 2, &quot;name&quot;: &quot;A red door&quot;, &quot;price&quot;: 12.50, &quot;tags&quot;: [&quot;home&quot;, &quot;red&quot;]}\n\n接下来就可以用json.loads()方法读取了。\nfor item in objs:\n    data = json.loads(item)\n    print(data[&quot;id&quot;])\n\n结束！撒花！\n"},{"title":"如何使用sanity？",
"url":"/blog/how-to-use-sanity/",
"date":"2024-09-30",
"headings":[{"level":1,"id":"1-an-zhuang-sanity","permalink":"https://linxz.online/blog/how-to-use-sanity/#1-an-zhuang-sanity","title":"1.安装sanity","children":[]},{"level":1,"id":"2-diao-zheng-hou-tai-can-shu","permalink":"https://linxz.online/blog/how-to-use-sanity/#2-diao-zheng-hou-tai-can-shu","title":"2.调整后台参数","children":[]},{"level":1,"id":"3-fa-bu-wen-zhang","permalink":"https://linxz.online/blog/how-to-use-sanity/#3-fa-bu-wen-zhang","title":"3.发布文章","children":[]},{"level":1,"id":"4-bu-shu-hou-tai","permalink":"https://linxz.online/blog/how-to-use-sanity/#4-bu-shu-hou-tai","title":"4.部署后台","children":[]},{"level":1,"id":"5-huo-qu-shu-ju","permalink":"https://linxz.online/blog/how-to-use-sanity/#5-huo-qu-shu-ju","title":"5.获取数据","children":[]},{"level":1,"id":"6-jian-she-wang-zhan","permalink":"https://linxz.online/blog/how-to-use-sanity/#6-jian-she-wang-zhan","title":"6.建设网站","children":[]}],
"body":"如何不用CMS（内容管理系统，又称”网页后台“），又具备CMS的功能？答案是使用sanity。\n\n1.安装sanity\nnpm create sanity@latest\n\n这会在触发一系列命令，选择：\n\nSelect project? Create new project\nYour project name: 输入项目名称\nUse the default dataset configurations? Yes\nProject output path: 默认即可\nUse typescript? Yes\nPackage manager? npm\ntemplate? Blog\n\n如图：\n选择完毕后，在默认文件夹下会生成新文件夹，名称是你输入的项目名称（我的是&quot;coolstuff&quot;），进入该文件夹，运行：\ncd coolstuff\nnpm run dev\n\n即可进入网页后台，网页后台的地址是：http://localhost:3333/desk\n参考：\nsanity crash course 教程\n\n2.调整后台参数\n这一步是可选的。\n我们可以用vscode打开”coolstuff&quot;文件夹，在&quot;schemmas-author.ts&quot;文件中，修改作者的信息，如下图：\n我们可以看到，我在代码中添加了“昵称”的输入框，后台内容与我们的修改同步，如图：\n当然，你完全可以不用管代码的参数，原后台的内容已经足够丰富。这个步骤是给爱折腾的人准备的。\n\n3.发布文章\n在后台左侧，点击“Post”，输入文章标题，链接后缀（slug），作者，文章内容，如图：\n值得注意的是，我们上传图片后是可以裁剪图片的，会出现一个圆点，这是聚焦点。我们可以通过拖动圆点，调整图片的聚焦，这样可以保证无论图片大小如何，重点都在聚焦点上。如图：\n完成以上步骤后，我们就算完成文章的发布了。\n那么文章发布在哪里呢？且慢，我们先教如何部署后台，即deploy。\n\n4.部署后台\n安装sanity以使用sanity命令：\nnpm install -g sanity@latest\n\n完成安装后，输入：\nsanity deploy  \n\n中间会弹出消息，让你输入一个域名前缀，随便输入一个，只要不和他们现有的前缀冲突即可，我的是&quot;gptcrash&quot;,所以我现就在可以在 https://gptcrash.sanity.studio/desk/ \n直接访问我的网站后台了。\n如图：\n这意味着什么呢？意味着你把网页托管在sanity的云服务器上，随时打开这个网页就能管理你的网站。\n那网站呢？别急，我们首先要学会获取数据。\n\n5.获取数据\n我们使用sanity来管理网站，不仅是需要它的后台，还需要它帮我们托管数据。数据存储在sanity的云上。那我们怎么获取这些数据呢？\n答案是使用数据获取语言“GROQ”。它是sanity的一种语言，类似SQL语言，它可以帮助我们获取数据。\n打开后台的“Vision&quot;标签，即会来到GROQ的界面，如图：\n以上演示了如何获取文章的标题和内容。\n知道如何获取数据后，我们就可以开始建设网站了。\n\n6.建设网站\n我们如何开始？\n\n官方给了一个github仓库，我们可以用来做模版：\n\ngit clone https://github.com/sanity-io/get-started-sanity-nextjs.git\n\n\n安装依赖项和nextjs工具包：\n\nnpm install\nnpm i next-sanity\n\n\n添加代码：\n\nimport { createClient } from &quot;next-sanity&quot;;\n\nconst client = createClient({\n  projectId: &quot;lqz08o01&quot;,\n  dataset: &quot;production&quot;,\n  apiVersion: &quot;2022-03-25&quot;,\n  useCdn: false\n});\n\nconst pets = await client.fetch(`*[_type == &quot;pet&quot;]`);\n\n代码添加位置在后面的教程链接有详细说明。\n\n运行网站\n\nnpm run dev\n\n这样就可以看到网站了。如图：\n这是我的网站页面，对官方的代码进行了部分修改，也把我的代码贴在下方，方便参考：\nimport { createClient } from &quot;next-sanity&quot;;\n\nconst client = createClient({\n  projectId: &quot;your-project-id&quot;,\n  dataset: &quot;production&quot;,\n  apiVersion: &quot;2023-05-23&quot;,\n  useCdn: false\n});\n\nexport default function IndexPage({ posts, contents }) {\n  return (\n    &lt;&gt;\n      &lt;header&gt;\n        &lt;h1&gt;凡学子&lt;/h1&gt;\n      &lt;/header&gt;\n      &lt;main&gt;\n        &lt;h2&gt;Blogs&lt;/h2&gt;\n        {console.log(&quot;posts:&quot;, posts)}\n        {posts.length &gt; 0 &amp;&amp; (\n          &lt;ul&gt;\n            {posts.map((post) =&gt; (\n              &lt;li key={post._id}&gt;{post?.title}&lt;/li&gt; //?会抛出undefine，避免程序错误\n            ))}\n          &lt;/ul&gt;\n        )}\n        {!posts.length &gt; 0 &amp;&amp; &lt;p&gt;No posts to show&lt;/p&gt;}\n        {posts.length &gt; 0 &amp;&amp; (\n          &lt;div&gt;\n            {/*console.log(&quot;contents:&quot;, contents)*/}\n            &lt;ul&gt;\n                {contents.map((content) =&gt; (\n                  &lt;li key={content._key}&gt;{content?.text}&lt;/li&gt;\n                ))}\n            &lt;/ul&gt;\n            {/* &lt;p&gt;{contents[0].text}&lt;/p&gt; */}\n          &lt;/div&gt;\n        )}\n        {!posts.length &gt; 0 &amp;&amp; (\n          &lt;div&gt;\n            nothing.\n          &lt;/div&gt;\n        )}\n      &lt;/main&gt;\n    &lt;/&gt;\n  );\n}\n\nexport async function getStaticProps() {\n  const posts = await client.fetch(`\n  *[_type == &quot;post&quot;]{\n    title,\n  }\n  `);;\n\n  const contents = await client.fetch(`\n  *[_type == &quot;post&quot;][].body[].children[]\n  `);;\n\n  return {\n    props: {\n      posts,\n      contents\n    }\n  };\n}\n\n注：\n\nprojectid可以在”https://www.sanity.io/manage“中点击项目名称找到，其他的设置可以维持默认，api获取日期填最新的日期即可（通常是今天）。\n如果用到的组件，官方解释需要把 Next.js 的 URL 添加到你的 CORS 源中。同样是到&quot;manage&quot;的页面，找到”api“，然后添加网址到CORS中即可。因为浏览器带有安全功能，可防止代码注入从您的 cookie 中窃取信息并将其传递给第三方。这被称为 CORS。\nsanity连接nextjs网站教程：\nhttps://www.sanity.io/docs/connect-your-content-to-next-js\n\n完成以上步骤，基本上就完成前后台连接了，撒花！\n"},{"title":"我的prompt整理",
"url":"/blog/prompt-recommendation/",
"date":"2024-09-30",
"headings":[{"level":1,"id":"midjourney-stable-diffusion","permalink":"https://linxz.online/blog/prompt-recommendation/#midjourney-stable-diffusion","title":"Midjourney & Stable Diffusion","children":[{"level":2,"id":"prompt-hero","permalink":"https://linxz.online/blog/prompt-recommendation/#prompt-hero","title":"prompt hero","children":[]},{"level":2,"id":"midjourneyxue-xi-da-quan","permalink":"https://linxz.online/blog/prompt-recommendation/#midjourneyxue-xi-da-quan","title":"midjourney学习大全","children":[]},{"level":2,"id":"midjourneyguan-fang-promptzhi-dao","permalink":"https://linxz.online/blog/prompt-recommendation/#midjourneyguan-fang-promptzhi-dao","title":"midjourney官方prompt指导","children":[]},{"level":2,"id":"midlibrary","permalink":"https://linxz.online/blog/prompt-recommendation/#midlibrary","title":"midlibrary","children":[]},{"level":2,"id":"promptfan-yi-wang-zhan","permalink":"https://linxz.online/blog/prompt-recommendation/#promptfan-yi-wang-zhan","title":"prompt翻译网站","children":[]},{"level":2,"id":"tui-te-da-shen-kris-kashtanova","permalink":"https://linxz.online/blog/prompt-recommendation/#tui-te-da-shen-kris-kashtanova","title":"推特大神：Kris Kashtanova","children":[]},{"level":2,"id":"tui-te-da-shen-nick-st-pierre","permalink":"https://linxz.online/blog/prompt-recommendation/#tui-te-da-shen-nick-st-pierre","title":"推特大神：Nick St. Pierre","children":[]},{"level":2,"id":"ren-xiang-zi-dong-sheng-cheng-prompt","permalink":"https://linxz.online/blog/prompt-recommendation/#ren-xiang-zi-dong-sheng-cheng-prompt","title":"人像自动生成prompt","children":[]}]},{"level":1,"id":"chatgpt","permalink":"https://linxz.online/blog/prompt-recommendation/#chatgpt","title":"chatGPT","children":[{"level":2,"id":"flowgpt","permalink":"https://linxz.online/blog/prompt-recommendation/#flowgpt","title":"flowGPT","children":[]},{"level":2,"id":"xie-zuo-promptshi-li","permalink":"https://linxz.online/blog/prompt-recommendation/#xie-zuo-promptshi-li","title":"写作prompt示例","children":[]},{"level":2,"id":"chu-ji-cheng-xu-yuan-yong-prompt","permalink":"https://linxz.online/blog/prompt-recommendation/#chu-ji-cheng-xu-yuan-yong-prompt","title":"初级程序员用prompt","children":[]},{"level":2,"id":"jie-ge-prompt","permalink":"https://linxz.online/blog/prompt-recommendation/#jie-ge-prompt","title":"接歌prompt","children":[]},{"level":2,"id":"zuo-wang-zhan","permalink":"https://linxz.online/blog/prompt-recommendation/#zuo-wang-zhan","title":"做网站","children":[]},{"level":2,"id":"jian-dan-gou-tong","permalink":"https://linxz.online/blog/prompt-recommendation/#jian-dan-gou-tong","title":"简单沟通","children":[]}]},{"level":1,"id":"promptji-qiao","permalink":"https://linxz.online/blog/prompt-recommendation/#promptji-qiao","title":"prompt技巧","children":[{"level":2,"id":"ni-xiang-prompt","permalink":"https://linxz.online/blog/prompt-recommendation/#ni-xiang-prompt","title":"逆向prompt","children":[]},{"level":2,"id":"guan-yu-promptde-shen-ru-si-kao","permalink":"https://linxz.online/blog/prompt-recommendation/#guan-yu-promptde-shen-ru-si-kao","title":"关于prompt的深入思考","children":[]},{"level":2,"id":"promptgong-cheng-shi-zhi-nan","permalink":"https://linxz.online/blog/prompt-recommendation/#promptgong-cheng-shi-zhi-nan","title":"prompt工程师指南","children":[]},{"level":2,"id":"fen-xiang","permalink":"https://linxz.online/blog/prompt-recommendation/#fen-xiang","title":"分享","children":[]}]}],
"body":"是时候分享我压箱底的好货了！\n整理了手头的prompt资料，分好类别，请食用。\nMidjourney &amp; Stable Diffusion\nprompt hero\n界面漂亮，可文字检索，汇集了不同软件。比如chatGPT，midjourney，stable diffusion等\n地址：https://prompthero.com/\nmidjourney学习大全\n内容非常详细，基本涵盖midjourney的方方面面。包括怎么注册，如何使用midjourney。可以当做字典用，哪里不会点哪里。\n地址：https://learningprompt.wiki/docs/midjourney-learning-path\nmidjourney官方prompt指导\n官方的风格和排版就是漂亮。\n地址：https://docs.midjourney.com/docs/multi-prompts\nmidlibrary\n汇集了2000多种风格，全英文网站。缺点是排版比较混乱。\n地址：https://www.midlibrary.io/styles\nprompt翻译网站\n网站支持将中文prompt翻译成英文，玩midjourney时有用。\n地址：\nhttps://moonvy.com/apps/ops/\n推特大神：Kris Kashtanova\n地址：推特关注人名\n每天都会分享midjourney图片，附有prompt\n推特大神：Nick St. Pierre\n地址：推特关注人名\n持续分享midjourney人像类图片，附有prompt\n人像自动生成prompt\n地址：https://promptbuilder.tiiny.site/\n这个是一个职业人像摄影师的网站,随机生成prompt出摄影人像,质量很有保证\nchatGPT\nflowGPT\n许多有创意的prompt，还可以白嫖GPT。\n地址：https://flowgpt.com/\n写作prompt示例\n写出专业作家水准的文章\n&gt;分析xx写作风格，并按照上述xx的写作风格写一篇关于外星人入侵地球的文章。\n初级程序员用prompt\n这是来自Mckay Wrigley的一条推，他正在收集有用的prompt，我发现对初级很有用，摘抄一个：\n&gt;“如何编写一个ios app？我希望你给出非常详细的，一步一步的指南，你要带着我构建所需的所有步骤。我只会按照你告诉我的去做。请记住我以前从未编写过代码，你不能指望我理解任何代码或技术术语。在我们开始之前，我希望你问我任何必要的问题，以便让你了解所需的所有背景，然后开始指导我。”\n地址：https://twitter.com/mckaywrigley/status/1646512259378843659\n接歌prompt\n\n你现在是专业的接歌机器人，歌曲是卢冠廷的一生所爱。这是参考歌词：&quot;&quot;\n下面，我将说出一句歌词，你接下一句。注意，只接一句歌词，不要有其他文字和标点符号。听懂请回答“是”\n\n我尝试让GPT接歌，部分热门歌曲GPT能够直接给出下一句，但不大稳定，因此我还是给了它歌词。\n如果想要它稳定接出歌曲，最佳方法应该是直接导入所有歌词到API后台。\n杰伦的部分，我用的是POE的自主训练机器人。\n做网站\n\n你是一个世界级的软件工程师。我想要你建设一个项目:利用openai的api，做一个和chatGPT一样的网站。\n想象你每一步会如何做.\n输出你的每个步骤，用组织良好的markdown格式输出。\n然后，我会回复 &quot;开始建造&quot; ，你就执行每个步骤, 写下所有需要的代码。我有时会告诉你“继续”，只是为了让你继续讲下去，你要继续讲下去直到项目完成。\n\n我真的让它做了一个网站，网站地址：www.commonlearner.com\n简单沟通\n我发现很多人跟GPT交流，会打很多没有必要的字。其实它能很简单理解你的需求，比如接歌、找BUG、翻译、总结等，不用说多余的话。\n&gt;翻译 (复制粘贴就好了)\nprompt技巧\n逆向prompt\n根据已经生成的内容，逆向让GPT解读规则，以后可以直接生成一样的内容，用魔法生成魔法！\n地址：https://mp.weixin.qq.com/s/BP6TN-vLxZPeY2MmNfIhkg\n关于prompt的深入思考\n作者是从业人员，给了很多角度的示例，对理解prompt有很大益处。\n地址：https://mp.weixin.qq.com/s/AizUBFssilX2S9aRfuz3_g\nprompt工程师指南\n这份是流传在推特上出名的prompt文档，比较学术。\n地址：https://www.promptingguide.ai/zh/techniques\n分享\n以下是分享我见过的有用的prompt技巧或知识，分享到我的群里的。\n01/\nreddit看到的mj prompt技巧。简单翻译一下：\n\n单词越前面，权重越大，因此最想要的东西请写在前面。语法不大重要\n逗号是软分隔，::是硬分隔，影响mj努力将两者融合在一起的程度\n::n是权重，如果::10就是告诉mj，其他词都不重要\n选择适合的纵横比, ar:, 没啥说的\n如果你想要特定的风格，最好写出这个艺术家的名字\n写长文可，其实起重要可能只有几个关键词\n图像+文字prompt，能相对保证效果\n可以通过一张或多张图像去让mj学习它没有给出的风格\n描述更具体，比如&quot;beautiful face&quot;，不如&quot;symmetrical beautiful face&quot;\n--no 抛弃某个元素\n\n02/\nmidjourney prompt：\n来自推特网友\n&gt;长得像奥黛丽赫本的中国女性，prompt：A Chinese 20-year-old Woman, looking like Audrey Hepburn, Black hair, standing on 2023 Tokyo street, hyper realistic portrait photography, pale skin, dress, wide shot, natural lighting, kodak portra 800, 105 mm f1. 8， 32k --ar 16:9 --v 5 --s 750 --q 2\n\n03/\n李彦宏采访：\n“在我看来，AI native 的特征是 prompt，就是提示词，过去没有这个行当，我们也不觉得跟计算机交互有那么多讲究。未来，就要考虑怎么写 prompt 才能把大模型的能力给萃取出来，这是一个我觉得非常有意思的行业，也是一个我认为将来最容易出现新的工作机会的地方。我有一个比较大的推测，10 年之后人类一半的工作都会跟提示词有关。”\n04/\n问：prompt是什么？\n华哥：\n“标签，AI对海量数据或者元素都打了标签，给出prompt后，相当于缩小了它的随机选择范围，更多的prompt给出了更精确的范围，在这个范围里AI去生成图像。”\n注：以上部分网站可能需要梯子。\n本来想放个推荐指数的，比如推荐指数：⭐️⭐️⭐️⭐️⭐️，但是整理后才发现，都是五颗星，都是我自己觉得好才放上来的，就不加了。\n"},{"title":"如何使用SD（stable diffusion）？",
"url":"/blog/stable-diffusion-colab-tutorial/",
"date":"2024-09-30",
"headings":[{"level":2,"id":"di-yi-bu-mo-xing-wang-zhi","permalink":"https://linxz.online/blog/stable-diffusion-colab-tutorial/#di-yi-bu-mo-xing-wang-zhi","title":"第一步 模型网址","children":[]},{"level":2,"id":"di-er-bu-gu-ge-deng-lu","permalink":"https://linxz.online/blog/stable-diffusion-colab-tutorial/#di-er-bu-gu-ge-deng-lu","title":"第二步  谷歌登录","children":[]},{"level":2,"id":"di-san-bu-yun-xing-mo-xing","permalink":"https://linxz.online/blog/stable-diffusion-colab-tutorial/#di-san-bu-yun-xing-mo-xing","title":"第三步 运行模型","children":[]},{"level":2,"id":"di-si-bu-kai-shi-wan-liao","permalink":"https://linxz.online/blog/stable-diffusion-colab-tutorial/#di-si-bu-kai-shi-wan-liao","title":"第四步 开始玩了","children":[]},{"level":2,"id":"di-wu-bu-gao-wan-ji-qiao","permalink":"https://linxz.online/blog/stable-diffusion-colab-tutorial/#di-wu-bu-gao-wan-ji-qiao","title":"第五步 高玩技巧","children":[]}],
"body":"如何生成SD上的美女图？\n没错，stable diffusion。\nSD模型对显卡的要求劝退了不少人，其实，SD可以在云端上跑，完全不用本地的显卡。\n首先，你需要科学上网。因为会借助谷歌的账号来登录google colab。\n第一步 模型网址\n点开这个网址：\nhttps://github.com/camenduru/stable-diffusion-webui-colab\n下拉网页，找到chilloutmix模型，点击&quot;stable&quot;版本。\n（注：适合生成亚洲脸的模型）\n\n第二步  谷歌登录\n进入谷歌colab页面，点击sign in：\n如果你没有谷歌账号，点击create account：\n如果已有谷歌账号，可能需要你进行两步验证。\n方法：谷歌会把验证信息发到你手机上的youtube app，点击确认即可：\n\n第三步 运行模型\n点击左上角类似”播放”的按钮，就可以开始跑模型了，一般需要等待8-10分钟：\n下拉页面，直到生成几个url。随便点击一个url即可到达SD的部署界面：\n\n第四步 开始玩了\n这就是基础的SD模型界面，在左上角输入prompt，点击&quot;Generate&quot;，就会在右下角出图，出图需要等待1-2分钟。\n\n第五步 高玩技巧\n如果你需要更多的prompt技巧，可以到下面网站去：\nhttps://prompthero.com/stable-diffusion-prompts\n如果你想要实现人脸控制，比如lora或者ControlNet模型，可以在C站去：\nhttps://civitai.com/\n"},{"title":"如何安装Tailwind CSS？",
"url":"/blog/tailwindcss-tutorial/",
"date":"2024-09-30",
"headings":[{"level":1,"id":"tailwind-css-jiao-cheng-shi-xian-bu-zou","permalink":"https://linxz.online/blog/tailwindcss-tutorial/#tailwind-css-jiao-cheng-shi-xian-bu-zou","title":"Tailwind CSS 教程（实现步骤）","children":[]}],
"body":"Tailwind CSS 教程（实现步骤）\n\n\nterminal进入根目录，initial文件\nnpm init\n\n结束后将创建package.json文件\n\n\n\n安装TailWind CSS\nnpm install tailwindcss --save\n\n\n\n\n创建main.css，给代码：\n@tailwind base;\n\n@tailwind components;\n\n@tailwind utilities;\n\n\n\n\n创建tailwind.config.js \nnpx tailwindcss init\n\n\n\n\ntailwind.config.js 的 plugins 加上：\nrequire(&#39;tailwindcss&#39;),\nrequire(&#39;autoprefixer&#39;),\n\n\n\n\noutput CSS\nnpx tailwindcss build main.css -o output.css\n\n\n\n\n实时更新watch\npackage.json里面的&quot;scripts&quot;填入:\ntailwindcss build main.css -o output.css\n\n\n\n\n实现实时更新\nterminal里面输入：\nnpm run watch  \n\n\n\n"},{"title":"什么是同源和跨域请求CORS",
"url":"/blog/cors/",
"date":"2024-09-29",
"headings":[{"level":1,"id":"tong-yuan","permalink":"https://linxz.online/blog/cors/#tong-yuan","title":"同源","children":[]},{"level":1,"id":"kua-yu","permalink":"https://linxz.online/blog/cors/#kua-yu","title":"跨域","children":[]},{"level":1,"id":"jie-jue-kua-yu-wen-ti","permalink":"https://linxz.online/blog/cors/#jie-jue-kua-yu-wen-ti","title":"解决跨域问题","children":[{"level":2,"id":"cors","permalink":"https://linxz.online/blog/cors/#cors","title":"CORS","children":[]},{"level":2,"id":"jsonp","permalink":"https://linxz.online/blog/cors/#jsonp","title":"JSONP","children":[]}]}],
"body":"同源\nSame-Origin Policy，最早是Netscape公司提出，是浏览器的安全策略。\n同源： 协议、域名、端口号必须完全相同。\n所以，localhost:3000 和 localhost:3001 是不同源的。\n跨域\n违背同源策略就是跨域。\najax是默认遵循同源策略的，即跨域就没法发送请求。\n解决跨域问题\n一般有两种方法：第一种是服务端设置CORS，第二种是使用JSONP。\nCORS\n官方推荐。\nCORS是Cross-Origin Resource Sharing的缩写，跨域资源共享。\n这是官方解决方案。不需要客户端操作，完全服务器来做。方法是新增一组HTTP头，允许服务器声明哪些源站可以通过浏览器有权限访问哪些资源。\n比如：\nresponse.setHeader(&#39;Access-Control-Allow-Origin&#39;, &#39;*&#39;); \n\n这些HTTP响应头有多个选择，可以参考MDN-CORS。\nJSONP\n不推荐。\nJSONP是JSON with Padding的缩写，非官方解决方案，程序员自己开发出来的，只支持GET请求。\n它利用script标签来实现跨域。因为script标签生来就可以跨域，没有条件。\n实现起来比较麻烦，需要客户端声明函数，服务器端返回这个函数调用，最后客户端执行这个函数。\n具体实现方法可以看我的github仓库。\n"},{"title":"什么是HTTP",
"url":"/blog/http-intro/",
"date":"2024-09-28",
"headings":[{"level":1,"id":"shen-me-yue-ding","permalink":"https://linxz.online/blog/http-intro/#shen-me-yue-ding","title":"什么约定","children":[{"level":2,"id":"qing-qiu-bao-wen","permalink":"https://linxz.online/blog/http-intro/#qing-qiu-bao-wen","title":"请求报文","children":[]},{"level":2,"id":"xiang-ying-bao-wen","permalink":"https://linxz.online/blog/http-intro/#xiang-ying-bao-wen","title":"响应报文","children":[]}]}],
"body":"hypertext transport protocol，即超文本传输协议。\n这是一种协议，一种约定，一种规则。\n什么约定\n约定两块内容，一是请求报文，二是响应报文。\n重点是四大块，行、头、空行、体。\n可以通过浏览器的开发者工具-&gt;network查看，详细信息可以勾选原始.\n请求报文\n请求行：GET/URL/HTTP/1.1\n很少字，通常就是GET，URL，200这些.\n请求头：Host/User-Agent/Referer/Accept/Connection...\n很多字，是浏览器显示请求内容的最大篇幅部分。\n空行：空行\n要求必须有，但是浏览器不显示。\n请求体：username=linxz&amp;password=123\nPOST请求时，数据放在请求体中。GET请求可以没有。\n响应报文\n响应行：HTTP/1.1 200 OK\n200是状态码，OK是响应字符串。\n响应头：Content-Type/Content-Length/Date...\n空行：空行\n响应体：html/css/js内容\n"},{"title":"如何用node.js搭建一个简单的服务器且自动重启刷新-nodemon",
"url":"/blog/node-server/",
"date":"2024-09-28",
"headings":[{"level":2,"id":"an-zhuang-express","permalink":"https://linxz.online/blog/node-server/#an-zhuang-express","title":"安装express","children":[]},{"level":2,"id":"chuang-jian-yi-ge-npmxiang-mu","permalink":"https://linxz.online/blog/node-server/#chuang-jian-yi-ge-npmxiang-mu","title":"创建一个npm项目","children":[]},{"level":2,"id":"bian-xie-server-js","permalink":"https://linxz.online/blog/node-server/#bian-xie-server-js","title":"编写server.js","children":[]},{"level":2,"id":"qi-dong-fu-wu-qi","permalink":"https://linxz.online/blog/node-server/#qi-dong-fu-wu-qi","title":"启动服务器","children":[]},{"level":2,"id":"shi-shi-shua-xin-fu-wu-qi","permalink":"https://linxz.online/blog/node-server/#shi-shi-shua-xin-fu-wu-qi","title":"实时刷新服务器","children":[]},{"level":2,"id":"an-zhuang-nodemon","permalink":"https://linxz.online/blog/node-server/#an-zhuang-nodemon","title":"安装nodemon","children":[]},{"level":2,"id":"yong-nodemonqi-dong-fu-wu-qi","permalink":"https://linxz.online/blog/node-server/#yong-nodemonqi-dong-fu-wu-qi","title":"用nodemon启动服务器","children":[]}],
"body":"我们会用到Express框架，它是基于nodejs平台的web框架，可以用来架设服务器。\n注意，先要安装node.js，安装方法可以参考官网。我一般用homebrew安装，命令如下：\nbrew install node\n\n安装express\nnpm i -g express\n\n创建一个npm项目\nnpm init -yes\n\n这样，会生成一个package.json文件，里面包含了项目的基本信息。\n编写server.js\n// 引入express\nconst express = require(&#39;express&#39;);\n\n// 创建express实例\nconst app = express();\n\n// 创建路由规则\n// request是对请求报文的封装\n// response是对响应报文的封装\napp.get(&#39;/&#39;, (request, response) =&gt; {\n    // 设置响应\n    response.send(&#39;Hello Express&#39;);\n})\n\n// 监听端口启动服务\napp.listen(8000, () =&gt; {\n    console.log(&#39;服务已启动，8000端口监听中&#39;);\n    }\n)\n\n启动服务器\nnode server.js\n\n实时刷新服务器\n在使用服务器的过程中，我还有实时刷新的需求，这样可以在修改代码后，不用重启服务器，就可以看到效果。这时候，我们可以使用nodemon，它可以监视文件的变化，自动重启服务器。\n安装nodemon\nnpm install -g nodemon\n\n用nodemon启动服务器\nnodemon server.js\n\n这样，server.js文件一旦发生变化，不用你手动重启服务器，nodemon会自动帮你重启。\n"},{"title":"AJAX基础知识",
"url":"/blog/ajax-basic/",
"date":"2024-09-27",
"headings":[{"level":1,"id":"shen-me-shi-ajax","permalink":"https://linxz.online/blog/ajax-basic/#shen-me-shi-ajax","title":"什么是AJAX","children":[]},{"level":1,"id":"ajaxbu-shi-shen-me","permalink":"https://linxz.online/blog/ajax-basic/#ajaxbu-shi-shen-me","title":"AJAX不是什么？","children":[]},{"level":1,"id":"ajaxke-yi-gan-shen-me","permalink":"https://linxz.online/blog/ajax-basic/#ajaxke-yi-gan-shen-me","title":"AJAX可以干什么？","children":[]},{"level":1,"id":"ajaxde-que-dian","permalink":"https://linxz.online/blog/ajax-basic/#ajaxde-que-dian","title":"AJAX的缺点","children":[]},{"level":1,"id":"ajaxying-yong-shi-li","permalink":"https://linxz.online/blog/ajax-basic/#ajaxying-yong-shi-li","title":"AJAX应用示例","children":[]},{"level":1,"id":"ajaxde-shi-yong-fang-fa","permalink":"https://linxz.online/blog/ajax-basic/#ajaxde-shi-yong-fang-fa","title":"AJAX的使用方法","children":[{"level":2,"id":"xhryuan-sheng-fang-shi","permalink":"https://linxz.online/blog/ajax-basic/#xhryuan-sheng-fang-shi","title":"xhr原生方式","children":[{"level":3,"id":"xhr-promise","permalink":"https://linxz.online/blog/ajax-basic/#xhr-promise","title":"xhr + Promise","children":[]}]},{"level":2,"id":"axiosfang-shi","permalink":"https://linxz.online/blog/ajax-basic/#axiosfang-shi","title":"axios方式","children":[]},{"level":2,"id":"fetchfang-shi","permalink":"https://linxz.online/blog/ajax-basic/#fetchfang-shi","title":"fetch方式","children":[]}]},{"level":1,"id":"async-he-await-fang-shi-jie-shao","permalink":"https://linxz.online/blog/ajax-basic/#async-he-await-fang-shi-jie-shao","title":"async 和 await 方式介绍","children":[{"level":2,"id":"asyncdai-ma-shi-li","permalink":"https://linxz.online/blog/ajax-basic/#asyncdai-ma-shi-li","title":"async代码示例","children":[]},{"level":2,"id":"awaitbiao-da-shi","permalink":"https://linxz.online/blog/ajax-basic/#awaitbiao-da-shi","title":"await表达式","children":[{"level":3,"id":"async-await-try-catch","permalink":"https://linxz.online/blog/ajax-basic/#async-await-try-catch","title":"async + await + try catch","children":[]}]}]}],
"body":"什么是AJAX\nAJAX，即Asynchronous JavaScript and XML。\n简单说就是：异步js与xml。\nAJAX不是什么？\n不是新的语言，还是用js。只是把现有标准组合在一起的方式。\nAJAX可以干什么？\n无刷新获取数据：可以在不刷新页面的情况下发送http请求，得到http响应。\n无刷新更新页面：根据用户事件来更新部分内容。\nAJAX的缺点\n\n没有浏览历史，不能后退\n有跨域问题（需要同源）\nSEO不友好（爬虫是爬不到的）\n\nAJAX应用示例\n\n注册页面时，检测用户名不可用。\n搜索时出现的下拉框和关键字。\n鼠标悬停出现二级分类。比如京东购物界面。如果不悬停，不会向服务端发送请求。\n这叫懒加载：用则加载，不用则不加载.\n新闻网站页面滚到底，重新生成新的内容（比如今日头条）。\n\nAJAX的使用方法\n原生方式xhr, jQuery，axios方式、内置fetch方式。\n无论是哪些方式，都是对原生方式xhr的封装，为了让请求更简单和易用。\n\naxios兼容promise风格，更现代化。\nfetch不是第三方库，可以直接使用，方便。\n\nxhr原生方式\n// 获取button元素\nvar btn = document.querySelector(&#39;button&#39;);\n// 绑定事件\nbtn.onclick = function(){\n    // 创建xhr对象\n    var xhr = new XMLHttpRequest();\n    // 初始化：设置请求方法和url\n    xhr.open(&#39;GET&#39;, &#39;http://127.0.0.1:8000/server?a=100&amp;b=200&amp;c=300&#39;, true);\n    // 发送请求\n    xhr.send();\n    // 事件绑定，处理服务端返回结果\n    xhr.onreadystatechange = function(){\n        if(xhr.readyState === 4 &amp;&amp; xhr.status &gt;= 200 &amp;&amp; xhr.status &lt; 300){ // readystate: 1未初始化 2已经发送 3正在接收 4完成; status: 200+都是成功\n            // 1.响应行\n            console.log(xhr.status); //状态码\n            console.log(xhr.statusText); //状态文本\n            // 2.响应头\n            console.log(xhr.getAllResponseHeaders());\n            // 3.响应体\n            console.log(xhr.response);\n            // 获取服务端返回的数据\n            var data = xhr.responseText; //responseText将响应体变成Text格式\n            // 获取result元素\n            var result = document.querySelector(&#39;#result&#39;);\n            // 将数据显示到result元素中\n            result.innerHTML = data;\n        }\n    }\n}\n\nxhr + Promise\n注意,简单的代码，Promise封装会加大代码的复杂度，但是在无限回调（回调地狱）的情形下很好用，能把代码组织得更好。\n// 实例化promise对象，参数是一个函数，函数有两个参数，一个是成功的回调，一个是失败的回调\nconst p = new Promise((resolve, reject) =&gt; {\n    // 异步操作\n    const xhr = new XMLHttpRequest();\n    xhr.open(&#39;GET&#39;, &#39;https://api.apiopen.top/api/sentences&#39;); //api地址：https://api.apiopen.top/swagger/index.html#/%E5%BC%80%E6%94%BE%E6%8E%A5%E5%8F%A3/get_api_sentences\n    xhr.send();\n    xhr.onreadystatechange = function() {\n        if (xhr.readyState === 4) {\n            if (xhr.status === 200) {\n                resolve(xhr.responseText);\n            } else {\n                reject(&#39;失败&#39;);\n            }\n        }\n    }\n});\n\n// then方法，参数是两个函数，第一个是成功的回调，第二个是失败的回调\np.then((value) =&gt; {\n    console.log(value);\n}, (reason) =&gt; {\n    console.log(reason);\n});\n\naxios方式\n我总结在axios基础知识。\nfetch方式\n注意，用fetch的时候，因为用了await方法，函数名必须加上async。\n因为老版的浏览器不支持fetch，因此工作中一般不用，用以上三种xhr的方法居多。jQuery被逐渐淘汰，而原生xhr太难用，实际上用axios最多。\ntry {\n    const response = await fetch(`http://localhost:3000/api1/search/users2?q=${KeyWord}`)\n    const data = await response.json()\n    // console.log(data);\n    PubSub.publish(&#39;communication&#39;, {isLoading:false, users:data.items})\n} catch (error) {\n    console.log(&#39;请求出错了&#39;, error);\n    PubSub.publish(&#39;communication&#39;, {isLoading:false, err:error.message})\n}\n\n可以参考fetch的使用方法。\nasync 和 await 方式介绍\n这是ES8的新特性。也是一种异步编程的解决方案。\nasync函数的返回值是promise对象。\npromise对象的结果由async函数执行的返回值决定。\nasync代码示例\nasync function fn() {\n// 关于promise对象的返回结果：\n// 返回的结果只要不是promise对象，都是成功的结果，即Promise状态是resolve/fufilled状态\n// 返回的结果是promise对象，才会根据promise对象的状态来决定\n    return &#39;成功&#39;;\n// 返回结果也可以抛出异常，Promise状态是rejected\n// throw &#39;失败&#39;;\n}\n\n\nconst result = fn();\nconsole.log(result);\n\nresult.then((value) =&gt; {\n    console.log(value);\n}).catch((reason) =&gt; {\n    console.log(reason);\n});\n\nawait表达式\n\n\nawait 必须写在 async 函数里。\n\n\nawait 右边表达式一般为 Promise 对象\n\n\nawait 返回的是 promise 成功的值。\n\n\nawait 的 promise 失败了，会抛出异常，需要通过try...catch捕获处理。\n\n\nasync + await + try catch\nconst p = new Promise((resolve, reject) =&gt; {\n    setTimeout(() =&gt; {\n        // resolve(&#39;成功&#39;);\n        reject(&#39;失败&#39;);\n    }, 1000);\n});\n\n// await 要放在 async 函数中\nasync function main(){\n    try{\n        let result = await p;\n        console.log(result);\n    }catch(e){\n        console.log(e);\n    }\n}\n\n// 调用 async 函数\nmain();\n\n"},{"title":"axios基础知识",
"url":"/blog/axios-basic/",
"date":"2024-09-27",
"headings":[{"level":1,"id":"axiosyou-shen-me-yong","permalink":"https://linxz.online/blog/axios-basic/#axiosyou-shen-me-yong","title":"axios有什么用？","children":[]},{"level":1,"id":"htmlshi-yong","permalink":"https://linxz.online/blog/axios-basic/#htmlshi-yong","title":"html使用","children":[{"level":2,"id":"zai-htmlzhong-yin-ru-axios","permalink":"https://linxz.online/blog/axios-basic/#zai-htmlzhong-yin-ru-axios","title":"在html中引入axios","children":[]},{"level":2,"id":"zai-wang-ye-fa-song-qing-qiu","permalink":"https://linxz.online/blog/axios-basic/#zai-wang-ye-fa-song-qing-qiu","title":"在网页发送请求","children":[]},{"level":2,"id":"mo-ren-pei-zhi","permalink":"https://linxz.online/blog/axios-basic/#mo-ren-pei-zhi","title":"默认配置","children":[]}]},{"level":1,"id":"guan-yu-diao-shi","permalink":"https://linxz.online/blog/axios-basic/#guan-yu-diao-shi","title":"关于调试","children":[{"level":2,"id":"cha-kan-wang-luo-qing-qiu","permalink":"https://linxz.online/blog/axios-basic/#cha-kan-wang-luo-qing-qiu","title":"查看网络请求","children":[]},{"level":2,"id":"cha-kan-qing-qiu-tou","permalink":"https://linxz.online/blog/axios-basic/#cha-kan-qing-qiu-tou","title":"查看请求头","children":[]}]},{"level":1,"id":"axiosde-githubdi-zhi","permalink":"https://linxz.online/blog/axios-basic/#axiosde-githubdi-zhi","title":"axios的github地址","children":[]}],
"body":"axios有什么用？\naxios是一个基于promise的HTTP客户端，可以用在浏览器和node.js中。主要用来访问api接口，主要的方法有四种：GET、POST、PUT、DELETE。\nGET方法用来获取数据，POST方法用来提交数据，PUT方法用来更新数据，DELETE方法用来删除数据。\nhtml使用\n在html中引入axios\n&lt;head&gt;\n&lt;script src=&quot;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js&quot;&gt;&lt;/script&gt;\n&lt;/head&gt;\n\n在网页发送请求\n&lt;script&gt;\n // 获取按钮\nconst btns = document.querySelectorAll(&#39;button&#39;);\n\n// 第一个\nbtns[0].onclick = function() {\n    // 发送 AJAX 请求\n    axios({\n        //请求类型\n        method: &#39;GET&#39;,\n        //请求地址\n        url: &#39;http://localhost:3000/posts&#39;,\n        //请求参数\n        params: {\n            id: 1,\n        }\n    }).then(res =&gt; {\n        console.log(res);\n    }).catch(err =&gt; {\n        console.log(err);\n    });\n}\n&lt;/script&gt;\n\n默认配置\n使用axios.defaults可以设置默认配置，这样在发送请求时就不用每次都写一遍配置了。\n &lt;script&gt;\n    // 获取按钮\n    const btns = document.querySelectorAll(&#39;button&#39;);\n    btns[0].onclick = function() {\n        // 默认配置\n        axios.defaults.method = &#39;GET&#39;; // 默认请求方式为GET\n        axios.defaults.baseURL = &#39;http://localhost:3000&#39;; // 默认请求地址\n        axios.defaults.params = { // 默认请求参数\n            id: 1,\n        }\n        // 设置默认超时时间\n        axios.defaults.timeout = 3000; // 默认超时时间为3s\n\n        axios({\n            url: &#39;/posts&#39;\n        }).then(res =&gt; {\n            console.log(res);\n        }).catch(err =&gt; {\n            console.log(err);\n        })\n    }\n\n&lt;/script&gt;\n\n关于调试\n查看网络请求\nPOST, PUT, DELETE的请求不会显示出来，需要打开Network面板，然后打钩保留日志和停用缓存，这样就可以看到请求的详细信息了。\n\n查看请求头\n在Network面板中，点击请求，然后点击Headers（标头），勾选原始,就可以看到请求头的详细信息了，可以看出是GET请求。\n\naxios的github地址\n基本上所有的用法都在这里，可以作为工具书查阅。\naxios\n"},{"title":"如何在vscode中使用markdown快捷snippet",
"url":"/blog/mdplus/",
"date":"2024-09-27",
"headings":[{"level":2,"id":"she-zhi-kuai-jie-snippet","permalink":"https://linxz.online/blog/mdplus/#she-zhi-kuai-jie-snippet","title":"设置快捷snippet","children":[]}],
"body":"由于我使用的是zola博客，所以我在vscode中写markdown的时候，固定要添加头部信息，比如标题、日期等。这些信息在zola中是必须的。\n以下是在vscode设置快捷snippet的方法：\n设置快捷snippet\n打开vscode，按下Ctrl+Shift+P，输入snippets，选择Preferences: Configure User Snippets，即`配置代码片段.\n注意：如果你开启PicGo（一个图床工具），那么Ctrl+Shift+P会被占用，你可以在PicGo的设置中，将快捷键改为其他的。\n打开后，选择markdown，然后添加如下代码：\n&quot;Markdown Frontmatter&quot;: {\n    &quot;prefix&quot;: &quot;zfm&quot;,\n    &quot;body&quot;: [\n        &quot;+++&quot;,\n        &quot;title = \\&quot;$1\\&quot;&quot;,\n        &quot;date = ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}&quot;,\n        &quot;+++&quot;,\n        &quot;$0&quot;\n    ],\n    &quot;description&quot;: &quot;Insert Markdown frontmatter&quot;\n}\n\n这个配置文件的意思是，当你在markdown文件中输入zfm，然后按下Tab键，就会自动插入如下内容：\n+++\ntitle = &quot;&quot;\ndate = {当前日期}\n+++\n\n不过，实践下来，我发现输入zfm后，按下Tab键，不会自动插入内容。搜索一圈后，在stackoverflow上找到解决方法。\n方案就是按下Ctrl+Space，然后选择zfm，然后按下Tab键，就会自动插入内容了。\n不过，我的电脑上，按下Ctrl+Space后，会弹出输入法的选择框，需要改动快捷键。\n打开菜单-首选项-键盘快捷方式，搜索suggestion trigger或者触发建议，然后修改快捷键为Ctrl+Alt+Space。\n\n↓\n\n现在，你输入zfm后，按下Ctrl+Alt+Space，然后按下Tab键，就会自动插入内容了。\n"},{"title":"不用鼠标浏览网页-Vimium C介绍",
"url":"/blog/vimium-c/",
"date":"2024-09-27",
"headings":[{"level":1,"id":"vimium-cjie-shao","permalink":"https://linxz.online/blog/vimium-c/#vimium-cjie-shao","title":"Vimium C介绍","children":[]},{"level":1,"id":"an-zhuang","permalink":"https://linxz.online/blog/vimium-c/#an-zhuang","title":"安装","children":[]},{"level":1,"id":"shi-yong","permalink":"https://linxz.online/blog/vimium-c/#shi-yong","title":"使用","children":[]},{"level":1,"id":"pai-chu-te-ding-wang-zhan","permalink":"https://linxz.online/blog/vimium-c/#pai-chu-te-ding-wang-zhan","title":"排除特定网站","children":[]},{"level":1,"id":"xiang-mu-di-zhi","permalink":"https://linxz.online/blog/vimium-c/#xiang-mu-di-zhi","title":"项目地址","children":[]}],
"body":"Vimium C介绍\nVimium C 是一款 Chrome 浏览器插件，可以让你不用鼠标浏览网页，提高浏览效率。\n它其实是Vimium的扩展，也就是进化版，两者是一个东西。\n安装\n在 Chrome 应用商店搜索Vimium C，点击安装即可。\n\n使用\n安装完成后，点击插件图标，会显示快捷键列表。\n基本操作如下：\nf : 列出网页上可以点击的元素，输入对应的字母即可点击。这比以前的tab tab tab高效多了。\nd : 对应scroll down，向下滚动半页。\nj : 对应scroll down little bit，向下滚动一行。\nu : 对应scroll up，向上滚动半页。\nk : 对应scroll up little bit，向上滚动一行。\nx : 关闭当前标签页。与Ctrl + w效果一样。\nshift+x : 恢复关闭的标签页。与Ctrl + shift + t效果一样。\ngg : 跳转到页面顶部。\nG : 跳转到页面底部。\n以上就是我常用的按键，更多功能可以查看插件的快捷键列表。\n排除特定网站\n如果需要排除特定网站，需要输入:https://www.youtube.com/这样的形式，如果需要排除所有快捷键，则后面内容留空即可。\n这样一来，可以解决特定网站快捷键冲突的问题。\n\n项目地址\n项目是开源的。\n项目github地址\n"},{"title":"如何设置阿里云OSS图床",
"url":"/blog/aliyun-oss/",
"date":"2024-09-26",
"headings":[{"level":1,"id":"gou-mai-osskong-jian","permalink":"https://linxz.online/blog/aliyun-oss/#gou-mai-osskong-jian","title":"购买OSS空间","children":[]},{"level":1,"id":"chuang-jian-yong-hu-ji-qi-pei-zhi-ossquan-xian","permalink":"https://linxz.online/blog/aliyun-oss/#chuang-jian-yong-hu-ji-qi-pei-zhi-ossquan-xian","title":"创建用户及其配置OSS权限","children":[{"level":2,"id":"chuang-jian-yong-hu","permalink":"https://linxz.online/blog/aliyun-oss/#chuang-jian-yong-hu","title":"创建用户","children":[]},{"level":2,"id":"pei-zhi-ossquan-xian","permalink":"https://linxz.online/blog/aliyun-oss/#pei-zhi-ossquan-xian","title":"配置OSS权限","children":[]}]},{"level":1,"id":"pei-zhi-oss","permalink":"https://linxz.online/blog/aliyun-oss/#pei-zhi-oss","title":"配置OSS","children":[{"level":2,"id":"chuang-jian-bucket","permalink":"https://linxz.online/blog/aliyun-oss/#chuang-jian-bucket","title":"创建Bucket","children":[]},{"level":2,"id":"chuang-jian-wen-jian-jia-ke-xuan","permalink":"https://linxz.online/blog/aliyun-oss/#chuang-jian-wen-jian-jia-ke-xuan","title":"创建文件夹（可选）","children":[]},{"level":2,"id":"pei-zhi-yu-ming-ke-xuan","permalink":"https://linxz.online/blog/aliyun-oss/#pei-zhi-yu-ming-ke-xuan","title":"配置域名（可选）","children":[]}]},{"level":1,"id":"ke-xuan-pei-zhi-picgo","permalink":"https://linxz.online/blog/aliyun-oss/#ke-xuan-pei-zhi-picgo","title":"可选-配置PicGo","children":[]},{"level":1,"id":"kai-tong-quan-qiu-jia-su","permalink":"https://linxz.online/blog/aliyun-oss/#kai-tong-quan-qiu-jia-su","title":"开通全球加速","children":[{"level":2,"id":"can-kao","permalink":"https://linxz.online/blog/aliyun-oss/#can-kao","title":"参考","children":[]}]}],
"body":"购买OSS空间\n在阿里云首页，输入对象存储OSS，进入对象存储OSS页面。\n新用户可以试用3个月，20G空间，之后需要付费。\n付费可以选40G空间的，6个月，4.98元。（实际上是40+元/年，可以看后面加个备注）\n免费试用的套餐：\n\n付费价格：\n选择OSS资源包-40G。\n\n价格备注-2024年10月更新：\n注意，我续费的时候发现，成本并非是4元，而是40+。\n因为除了存储容量，还要买流量和请求包，不然不让请求。\n我的总成本是：\n20G资源包 1年 25元（变贵了）\n下行流量包 1年 14元\n请求包\t1年 2元\n总成本40+元/年\n创建用户及其配置OSS权限\n创建用户\n因为默认用户拥有最高权限，可以操作你的所有阿里云资源，所以不推荐使用默认用户。\n我们需要创建一个子用户，然后给这个子用户配置OSS权限。\n选择你的头像-AccessKey管理-新建AccessKey-开始使用子用户AccessKey-创建用户。\n随便起个名字，选择OpenAPI的权限即可。\n\n配置OSS权限\n在OSS页面，点击用户-添加权限-新增授权，选择所有和OSS有关的权限。\n\n配置OSS\n创建Bucket\nBucket是OSS的基本存储单元，类似于文件夹。\n进入OSS控制台，点击Bucket列表-创建Bucket，随便改个名字，选择存储区域，其他默认即可。\n注意选择”公共读“，这样你上传的图片才能被访问。\n选择“本地冗余存储”，而不是“同城冗余存储”，因为后者是收费的。\n\n创建文件夹（可选）\n点击Bucket名字，新建目录，起个名字叫images就可以了，当然，你也可以取其他名字。\n\n配置域名（可选）\nBucket配置-域名管理，这里可以输入你的已备案的域名，好处是Bucket名称或者地区变了，图片的地址就不需要变了。\n可选-配置PicGo\nPicGo是一个图床工具，可以实现本地快速上传，自动复制链接到剪贴板。\n存储区域就是你的OSS区域，比如oss-cn-shenzhen。\n按照下图配置即可。\n\n开通全球加速\n如果开通时，选择的是大陆地区（比如我选了深圳），\n国外是无法访问的。\n解决方案是传输加速。\n打开Bucket列表，选择开启传输加速即可，不过流量费会增加。\n\n开通后，默认的链接比如yourname.oss-cn-shenzhen.aliyuncs.com还能用，但如果要全球访问，要换一个yourname.accelerate.com的链接。\n原理很简单，阿里本来有分布全球的CDN，但是不能免费给你用，用了就要流量收费。\n还是CloudFlare佛心啊。\n参考\n阿里云教程\nPicGo配置教程\n"},{"title":"如何在vue中实现代码高亮-使用highlight.js",
"url":"/blog/highlightjs-vue/",
"date":"2024-09-26",
"headings":[{"level":2,"id":"an-zhuang-highlight-js","permalink":"https://linxz.online/blog/highlightjs-vue/#an-zhuang-highlight-js","title":"安装highlight.js","children":[]},{"level":2,"id":"yin-ru-highlight-js","permalink":"https://linxz.online/blog/highlightjs-vue/#yin-ru-highlight-js","title":"引入highlight.js","children":[]},{"level":2,"id":"shi-yong-highlight-js","permalink":"https://linxz.online/blog/highlightjs-vue/#shi-yong-highlight-js","title":"使用highlight.js","children":[]},{"level":2,"id":"can-kao","permalink":"https://linxz.online/blog/highlightjs-vue/#can-kao","title":"参考","children":[]}],
"body":"安装highlight.js\n首先，使用 npm 安装 highlight.js：\nnpm install highlight.js @highlightjs/vue-plugin\n\n引入highlight.js\n在 main.js 中引入 highlight.js：\nimport &#39;highlight.js/styles/stackoverflow-light.css&#39;\nimport &#39;highlight.js/lib/common&#39;;\nimport hljsVuePlugin from &quot;@highlightjs/vue-plugin&quot;;\n\n\napp.use(hljsVuePlugin)\napp.mount(&#39;#app&#39;)   //最后挂载应用，顺序不能倒过来。\n\n使用highlight.js\n在需要高亮的地方使用 &lt;Highlight&gt; 组件：\n&lt;template&gt;\n    &lt;highlightjs language=&quot;js&quot; code=&quot;console.log(&#39;Hello World&#39;);&quot;\n    /&gt;\n&lt;/template&gt;\n\n参考\ngithub地址\nhighlightjs-vue操作指引\nhighlight.js官网\n"},{"title":"如何快速搭建测试服务器-json-server",
"url":"/blog/json-server/",
"date":"2024-09-26",
"headings":[{"level":1,"id":"an-zhuang-json-server","permalink":"https://linxz.online/blog/json-server/#an-zhuang-json-server","title":"安装json-server","children":[]},{"level":1,"id":"chuang-jian-jsonwen-jian-jiao-db-json","permalink":"https://linxz.online/blog/json-server/#chuang-jian-jsonwen-jian-jiao-db-json","title":"创建json文件叫db.json","children":[]},{"level":1,"id":"qi-dong-json-server","permalink":"https://linxz.online/blog/json-server/#qi-dong-json-server","title":"启动json-server","children":[]},{"level":1,"id":"can-kao","permalink":"https://linxz.online/blog/json-server/#can-kao","title":"参考","children":[]}],
"body":"安装json-server\nnpm install json-server\n\n创建json文件叫db.json\n{\n  &quot;posts&quot;: [\n    { &quot;id&quot;: &quot;1&quot;, &quot;title&quot;: &quot;a title&quot;, &quot;views&quot;: 100 },\n    { &quot;id&quot;: &quot;2&quot;, &quot;title&quot;: &quot;another title&quot;, &quot;views&quot;: 200 }\n  ],\n  &quot;comments&quot;: [\n    { &quot;id&quot;: &quot;1&quot;, &quot;text&quot;: &quot;a comment about post 1&quot;, &quot;postId&quot;: &quot;1&quot; },\n    { &quot;id&quot;: &quot;2&quot;, &quot;text&quot;: &quot;another comment about post 1&quot;, &quot;postId&quot;: &quot;1&quot; }\n  ],\n  &quot;profile&quot;: {\n    &quot;name&quot;: &quot;typicode&quot;\n  }\n}\n\n启动json-server\nnpx json-server db.json\n\n此时如果出现以下文字：\nJSON Server started on PORT :3000\nPress CTRL-C to stop\nWatching db.json...\n\n♡⸜(˶˃ ᵕ ˂˶)⸝♡\n\nIndex:\nhttp://localhost:3000/\n\nStatic files:\nServing ./public directory if it exists\n\nEndpoints:\nhttp://localhost:3000/posts\nhttp://localhost:3000/comments\nhttp://localhost:3000/profile\n\n这样就证明成功了。\n直接访问http://localhost:3000/posts，就可以看到json文件的内容了，\n如果想看到第一篇文章的内容，访问http://localhost:3000/posts/1。\npost命令可以新增文章，其他命令和RESTful API一样。\n参考\njson-server的github官网\n"},{"title":"meili search的安装方法？最好的站内搜索工具",
"url":"/blog/meili-search/",
"date":"2024-09-26",
"headings":[{"level":1,"id":"fu-wu-qi-duan-an-zhuang-meili-search","permalink":"https://linxz.online/blog/meili-search/#fu-wu-qi-duan-an-zhuang-meili-search","title":"服务器端安装meili-search","children":[{"level":2,"id":"ben-di-zuo-wei-fu-wu-qi","permalink":"https://linxz.online/blog/meili-search/#ben-di-zuo-wei-fu-wu-qi","title":"本地作为服务器","children":[{"level":3,"id":"an-zhuang-meili-search","permalink":"https://linxz.online/blog/meili-search/#an-zhuang-meili-search","title":"安装meili-search","children":[]},{"level":3,"id":"yun-xing-meili-search","permalink":"https://linxz.online/blog/meili-search/#yun-xing-meili-search","title":"运行meili-search","children":[]}]}]},{"level":1,"id":"sao-miao-wang-zhan-sheng-cheng-index","permalink":"https://linxz.online/blog/meili-search/#sao-miao-wang-zhan-sheng-cheng-index","title":"扫描网站，生成index","children":[{"level":2,"id":"bian-xie-gong-sao-miao-de-pei-zhi-wen-jian","permalink":"https://linxz.online/blog/meili-search/#bian-xie-gong-sao-miao-de-pei-zhi-wen-jian","title":"编写供扫描的配置文件","children":[]},{"level":2,"id":"yun-xing-scrapper","permalink":"https://linxz.online/blog/meili-search/#yun-xing-scrapper","title":"运行Scrapper","children":[]}]},{"level":1,"id":"qian-duan-an-zhuang-jshe-css","permalink":"https://linxz.online/blog/meili-search/#qian-duan-an-zhuang-jshe-css","title":"前端安装js和css","children":[{"level":2,"id":"an-zhuang-docs-searchbar-js","permalink":"https://linxz.online/blog/meili-search/#an-zhuang-docs-searchbar-js","title":"安装docs-searchbar.js","children":[{"level":3,"id":"an-zhuang-ku","permalink":"https://linxz.online/blog/meili-search/#an-zhuang-ku","title":"安装库","children":[]},{"level":3,"id":"zai-htmlli-mian-yin-ru","permalink":"https://linxz.online/blog/meili-search/#zai-htmlli-mian-yin-ru","title":"在html里面引入","children":[]}]},{"level":2,"id":"htmlye-mian-tian-jia-yuan-su","permalink":"https://linxz.online/blog/meili-search/#htmlye-mian-tian-jia-yuan-su","title":"html页面添加元素","children":[{"level":3,"id":"tian-jia-sou-suo-kuang","permalink":"https://linxz.online/blog/meili-search/#tian-jia-sou-suo-kuang","title":"添加搜索框：","children":[]},{"level":3,"id":"tian-jia-jsdai-ma","permalink":"https://linxz.online/blog/meili-search/#tian-jia-jsdai-ma","title":"添加js代码：","children":[]},{"level":3,"id":"tian-jia-cssyang-shi","permalink":"https://linxz.online/blog/meili-search/#tian-jia-cssyang-shi","title":"添加css样式","children":[]}]}]},{"level":1,"id":"yun-zhu-ji-zuo-wei-fu-wu-qi","permalink":"https://linxz.online/blog/meili-search/#yun-zhu-ji-zuo-wei-fu-wu-qi","title":"云主机作为服务器","children":[{"level":2,"id":"an-zhuang-meili-search-zou-bu-tong","permalink":"https://linxz.online/blog/meili-search/#an-zhuang-meili-search-zou-bu-tong","title":"安装meili-search-走不通","children":[]},{"level":2,"id":"an-zhuang-docker","permalink":"https://linxz.online/blog/meili-search/#an-zhuang-docker","title":"安装docker","children":[]},{"level":2,"id":"qi-dong-docker","permalink":"https://linxz.online/blog/meili-search/#qi-dong-docker","title":"启动docker","children":[]},{"level":2,"id":"yun-xing-meili-search-1","permalink":"https://linxz.online/blog/meili-search/#yun-xing-meili-search-1","title":"运行meili-search","children":[{"level":3,"id":"cha-kan-yun-xing-zhuang-tai","permalink":"https://linxz.online/blog/meili-search/#cha-kan-yun-xing-zhuang-tai","title":"查看运行状态","children":[]}]},{"level":2,"id":"xiu-gai-nginxpei-zhi","permalink":"https://linxz.online/blog/meili-search/#xiu-gai-nginxpei-zhi","title":"修改nginx配置","children":[]},{"level":2,"id":"xiu-gai-qian-duan-jsdai-ma","permalink":"https://linxz.online/blog/meili-search/#xiu-gai-qian-duan-jsdai-ma","title":"修改前端js代码：","children":[]},{"level":2,"id":"she-zhi-github-actionzi-dong-hua","permalink":"https://linxz.online/blog/meili-search/#she-zhi-github-actionzi-dong-hua","title":"设置github action自动化","children":[]}]},{"level":1,"id":"can-kao","permalink":"https://linxz.online/blog/meili-search/#can-kao","title":"参考","children":[]}],
"body":"服务器端安装meili-search\n本地作为服务器\n安装meili-search\nbrew install meilisearch\n\n其他安装方法见官网\n运行meili-search\nmeilisearch --master-key &lt;your-key&gt;\n\n你应该有个master-key，如果没有，直接运行meilisearch，会生成一个。\n项目会运行在http://localhost:7700\n扫描网站，生成index\n接下来，我们需要扫描网站，生成index。这里用到一个工具是meilisearch的docs-scraper.\n编写供扫描的配置文件\n以下是简单的示例。值得注意的是，我把zola放在本地的1111端口里面，希望它扫描blog页面的文档，所以需要指向本地端口。\n因为后面要用到docker，docker里面的本地表示不一样，所以需要用host.docker.internal来代替localhost。\n{\n    &quot;index_uid&quot;: &quot;docs&quot;,\n    &quot;start_urls&quot;: [&quot;http://host.docker.internal:1111/blog/&quot;],\n    &quot;sitemap_urls&quot;: [&quot;http://host.docker.internal:1111/sitemap.xml&quot;],\n    &quot;stop_urls&quot;: [],\n    &quot;selectors&quot;: {\n      &quot;lvl0&quot;: &quot;h1&quot;,\n      &quot;lvl1&quot;: &quot;h2&quot;,\n      &quot;lvl2&quot;: &quot;h3&quot;,\n      &quot;text&quot;: &quot;p, li&quot;\n    }\n  }\n\n运行Scrapper\n这里要用到docker，所以需要先安装docker desktop。\ndocker run -t --rm \\\n  -e MEILISEARCH_HOST_URL=&quot;http://host.docker.internal:7700&quot; \\\n  -e MEILISEARCH_API_KEY=&quot;yourkey&quot; \\\n  -v /Users/lxz/Desktop/zola-basic/meili.json:/docs-scraper/config.json \\\n  --network host \\\n  getmeili/docs-scraper:latest pipenv run ./docs_scraper config.json\n\n由于是在本地运行，所以需要加上--network host，这样docker才能访问到本地的端口。\n另外，我用docker pull的image是getmeili/docs-scraper:latest，我实践过程，指定版本不行，会显示禁止POST访问，但是官网推荐生产环境要用指定版本。\n出现以下信息，表示成功：\n&gt; Docs-Scraper: http://host.docker.internal:1111/blog/ 27 records)\n\nNb hits: 27\n\n上面信息表示，扫描了27个文档。\n前端安装js和css\n安装docs-searchbar.js\n接下来，我们正式在前端要搜索了，需要安装一个搜索工具，这里用到的是meilisearch的docs-searchbar.js\n安装库\nyarn add docs-searchbar.js\n\n在html里面引入\n&lt;script src=&quot;https://cdn.jsdelivr.net/npm/docs-searchbar.js@latest/dist/cdn/docs-searchbar.min.js&quot;&gt;&lt;/script&gt;\n\n如果直接在html里面引入，可以不安装库。与前面步骤是二选一的关系。\nhtml页面添加元素\n添加搜索框：\n&lt;input type=&quot;search&quot; id=&quot;search-bar-input&quot; /&gt;\n\n添加js代码：\n  &lt;script&gt;\n    docsSearchBar({\n      hostUrl: &#39;http://127.0.0.1:7700&#39;,\n      apiKey: &#39;your-key&#39;,\n      indexUid: &#39;docs&#39;,\n      inputSelector: &#39;#search-bar-input&#39;,\n      debug: false, // Set debug to true if you want to inspect the dropdown\n    })\n  &lt;/script&gt;\n\n添加css样式\n&lt;link\n  rel=&quot;stylesheet&quot;\n  href=&quot;https://cdn.jsdelivr.net/npm/docs-searchbar.js@latest/dist/cdn/docs-searchbar.min.css&quot;\n/&gt;\n\n好了，可以测试一下了。\n注意，当你的zola网站是本地生成时，即用zola serve来预览的，索引的结果会特别少，因为meili-search只能扫描线上的网站？（待验证）。\n后来，我把网站部署到cloudflare pages上，再扫描，索引的结果就正常了。\n\n云主机作为服务器\n安装meili-search-走不通\n# Install Meilisearch\ncurl -L https://install.meilisearch.com | sh\n\n# Launch Meilisearch\n./meilisearch\n\n文件大概有115M，国内服务器太慢了，下载不了。后来我换了一个国外的服务器，一下子就搞定了。\n官网云服务器架设教程\n本地架设参考\n但是，因为编译问题，我还是用了docker。\n安装docker\nsudo yum install -y yum-utils\nsudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\nsudo yum install docker-ce docker-ce-cli containerd.io\n\n启动docker\nsudo systemctl start docker\nsudo systemctl enable docker\n\n运行meili-search\nsudo docker run -d --name meilisearch \\\n  -p 7700:7700 \\\n  getmeili/meilisearch \\\n  meilisearch --master-key &quot;your-key&quot;\n\n-d代表后台运行，所以即使关掉终端，也不会停止。\n查看运行状态\ndocker ps\n\n修改nginx配置\n以下可以参考：\nserver {\n    listen 80;\n    listen [::]:80;\n    server_name meilisearch.linxz.online;\n    return 301 https://$server_name$request_uri;\n}\n\nserver {\n    listen 443 ssl http2;\n    listen [::]:443 ssl http2;\n    server_name meilisearch.linxz.online;\n\n    ssl_certificate /etc/letsencrypt/live/meilisearch.linxz.online/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/meilisearch.linxz.online/privkey.pem;\n    include /etc/letsencrypt/options-ssl-nginx.conf;\n    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;\n\n    location / {\n        proxy_pass http://localhost:7700;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n\n还要给我这个二级域名添加证书，参考这里\n之后，再在DNS服务商（我是cloudflare）添加A记录，指向云服务器的IP地址。\n这样，你输入meilisearch.linxz.online就可以访问到meili-search了，因为7700端口自动转发到443端口。\n不过，如果是cloudflare pages的话，注意要把SSL模式换成“完全”，而不是“灵活”，否则会出现”重定向过多“的错误。\n修改前端js代码：\n  &lt;script&gt;\n    docsSearchBar({\n      hostUrl: &#39;https://meilisearch.linxz.online&#39;,\n      ... // 其他参数\n    })\n  &lt;/script&gt;\n\n将hostUrl改为你的域名即可。\n设置github action自动化\n由于我希望一改动网站（通常是更新文章），就自动索引，所以我设置了github action。\n首先，在.github/workflows文件夹下，新建一个yaml文件，比如build.yml。\n这里是我的代码：\nname: Update Search Index\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n\njobs:\n  update-search-index:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      \n      - name: Wait for Cloudflare Pages to update\n        run: sleep 2m\n      \n      - name: Run docs-scraper\n        env:\n          HOST_URL: ${{ secrets.MEILISEARCH_URL }}\n          API_KEY: ${{ secrets.MEILISEARCH_API_KEY }}\n          CONFIG_FILE_PATH: ${{ github.workspace }}/meilisearch-docs-scraper-config.json\n        run: |\n          docker run -t --rm \\\n            -e MEILISEARCH_HOST_URL=$HOST_URL \\\n            -e MEILISEARCH_API_KEY=$API_KEY \\\n            -v $CONFIG_FILE_PATH:/docs-scraper/config.json \\\n            getmeili/docs-scraper:v0.12.12 pipenv run ./docs_scraper config.json\n\n脚本在push到main分支时运行，会等待2分钟，然后运行docs-scraper。自动索引我的文章，配置文件是meilisearch-docs-scraper-config.json。里面是索引规则。\n参考\n\n为什么我知道meili-search?-owen的博客\nowen设置的自动化脚本-github\nowen的配置json-config.json\n\n"},{"title":"如何使用picGO的图床功能？（七牛云图床）",
"url":"/blog/pic-repo/",
"date":"2024-09-26",
"headings":[{"level":1,"id":"wei-shen-me-xuan-ze-picgo","permalink":"https://linxz.online/blog/pic-repo/#wei-shen-me-xuan-ze-picgo","title":"为什么选择picGO？","children":[]},{"level":1,"id":"xia-zai-picgo","permalink":"https://linxz.online/blog/pic-repo/#xia-zai-picgo","title":"下载picGO","children":[]},{"level":1,"id":"jie-jue-wen-jian-yi-sun-pi-cuo-wu","permalink":"https://linxz.online/blog/pic-repo/#jie-jue-wen-jian-yi-sun-pi-cuo-wu","title":"解决【文件已损坏】错误","children":[]},{"level":1,"id":"pei-zhi-qi-niu-yun-tu-chuang","permalink":"https://linxz.online/blog/pic-repo/#pei-zhi-qi-niu-yun-tu-chuang","title":"配置七牛云图床","children":[{"level":2,"id":"huo-qu-accesskeyhe-secretkey","permalink":"https://linxz.online/blog/pic-repo/#huo-qu-accesskeyhe-secretkey","title":"获取AccessKey和SecretKey","children":[]},{"level":2,"id":"huo-qu-bucketming-zi","permalink":"https://linxz.online/blog/pic-repo/#huo-qu-bucketming-zi","title":"获取Bucket名字","children":[]},{"level":2,"id":"huo-qu-cun-chu-qu-yu","permalink":"https://linxz.online/blog/pic-repo/#huo-qu-cun-chu-qu-yu","title":"获取存储区域","children":[]},{"level":2,"id":"huo-qu-yu-ming","permalink":"https://linxz.online/blog/pic-repo/#huo-qu-yu-ming","title":"获取域名","children":[]},{"level":2,"id":"pei-zhi-wai-lian-yu-ming","permalink":"https://linxz.online/blog/pic-repo/#pei-zhi-wai-lian-yu-ming","title":"配置外链域名","children":[]}]},{"level":1,"id":"shang-chuan-tu-pian","permalink":"https://linxz.online/blog/pic-repo/#shang-chuan-tu-pian","title":"上传图片","children":[{"level":2,"id":"qi-niu-yun-tu-chuang-ce-shi","permalink":"https://linxz.online/blog/pic-repo/#qi-niu-yun-tu-chuang-ce-shi","title":"七牛云图床测试","children":[]}]},{"level":1,"id":"qi-ta-xuan-ze-picx","permalink":"https://linxz.online/blog/pic-repo/#qi-ta-xuan-ze-picx","title":"其他选择-picX","children":[{"level":2,"id":"shang-chuan-tu-pian-wang-zhi","permalink":"https://linxz.online/blog/pic-repo/#shang-chuan-tu-pian-wang-zhi","title":"上传图片网址","children":[]},{"level":2,"id":"ce-shi-xiao-guo","permalink":"https://linxz.online/blog/pic-repo/#ce-shi-xiao-guo","title":"测试效果","children":[{"level":3,"id":"pic-x","permalink":"https://linxz.online/blog/pic-repo/#pic-x","title":"pic-X","children":[]}]},{"level":2,"id":"zhu-yi-yao-qu-githubna-ge-token","permalink":"https://linxz.online/blog/pic-repo/#zhu-yi-yao-qu-githubna-ge-token","title":"注意：要去github拿个token","children":[]}]},{"level":1,"id":"qi-ta-xuan-ze-imgur","permalink":"https://linxz.online/blog/pic-repo/#qi-ta-xuan-ze-imgur","title":"其他选择-imgur","children":[{"level":2,"id":"she-zhi-wen-ti","permalink":"https://linxz.online/blog/pic-repo/#she-zhi-wen-ti","title":"设置问题","children":[]}]}],
"body":"为什么选择picGO？\n图床选择很多，但我觉得picGO最好。\n一是因为它上传简单且快，只要把图片拉到顶部菜单就完成上传，剪切板可以用cmd+shift+p来上传。\n二是因为可以用国内的图床，比如我这次要介绍的七牛云图床。\n下载picGO\ngithub下载地址\n选择正式版下载，下载完成后安装。\n解决【文件已损坏】错误\nmac下载后，会遇到【文件已损坏】错误，解决方法如下：\n在terminal中输入以下命令：\nsudo spctl --master-disable\n\n会提示输入密码。\n随后，放行picGo，输入：\nxattr -cr /Applications/PicGo.app\n\n现在就可以打开了。\n解决参考链接\n配置七牛云图床\n\n可以参考官网教程：\n获取AccessKey和SecretKey\n登录七牛云官网，进行注册和登录。\n点击【个人头像】-【密钥管理】，将两个key分别复制下来。\npicGO官网\n获取Bucket名字\n点击【对象存储】-【空间管理】，新建一个空间，这个空间名就是Bucket的名字。\n获取存储区域\n新加坡对应as0。国内地址需要备案，所以我选了个东南亚的。\n存储区域代号看千牛云对象存储区域。\n获取域名\n千牛云创建完【对象存储】（即图床）后，会给你一个临时的域名，可用30天。\n稳妥起见，最好准备自己的域名。\n点击自己的对象存储空间-【域名管理】，点击【绑定域名】。\n注意，这里的域名不能输入整个域名，而是二级域名。\n比如我的网址linxz.online是整个域名，我尝试过绑定，不能成功访问。\n而cdn.linxz.online、image.linxz.online这样的才是二级域名。\n推荐绑定证书（HTTPS）的方式，因为有些网站会拒绝展示HTTP内容，图片会显示不出来。\n其他的选项保持默认就好。\nHTTPS需要单独提供证书，我的做法是在服务器申请好证书，然后直接把fullchain.cer和linxz.online.key里面的值复制到七牛云里面。\n\n配置外链域名\n点击【文件管理】，选择你的域名即可。\n上传图片\n我一般是剪切，用cmd+shift+p的快捷键上传，地址会自动复制到剪贴板。\n还有就是，可以直接把图片拖到右上角picGo的图标上，也会自动完成上传，并复制链接。\n当然，也可以登录七牛云网站，可以直接在七牛云的【文件管理】上传。\n七牛云图床测试\n\n其他选择-picX\n注意，picX上传到github服务器上，国内访问速度较慢。\n上传图片网址\nhttps://picx.xpoet.cn/#/upload\n测试效果\npic-X\n注意：以下是github图床，地址是raw.githubusercontent.com的地址：\n\n注意：要去github拿个token\nhttps://github.com/settings/tokens\n配置过程就不啰嗦了，跟picGo差不多。\n其他选择-imgur\n由于我的七牛云图床是亚太地区的，经常有图片打不开，用国内的需要备案，很麻烦，所以我又找了一个图床。\n这个是国外的图床，需要代理。\n需要先注册，注册地址\n获取你的Client ID，然后在picGo中配置。\n教程\n设置问题\n如果不用代理，可能不能上传，所以需要设置代理。我用的端口是1087。如果没有，就不推荐用了。\n\n"},{"title":"如何实现url的重定向（域名跳转）",
"url":"/blog/redirect-url/",
"date":"2024-09-26",
"headings":[{"level":2,"id":"xiu-gai-nginxpei-zhi-wen-jian","permalink":"https://linxz.online/blog/redirect-url/#xiu-gai-nginxpei-zhi-wen-jian","title":"修改nginx配置文件","children":[]},{"level":2,"id":"dnsjie-xi","permalink":"https://linxz.online/blog/redirect-url/#dnsjie-xi","title":"DNS解析","children":[{"level":3,"id":"wei-shen-me-xu-yao-dnsjie-xi","permalink":"https://linxz.online/blog/redirect-url/#wei-shen-me-xu-yao-dnsjie-xi","title":"为什么需要DNS解析？","children":[]}]}],
"body":"我想实现b.club跳转到b.com，怎么做？\n修改nginx配置文件\n以下是个示例文件，你可以根据自己的需求修改。\n主要是return 301 https://$host$request_uri;这一行，其中https://是跳转到https，$host是原域名，$request_uri是原请求路径。\n可以看到，所有b.club的请求都会被重定向到b.com。\n# HTTP 80端口的重定向\nserver {\n    listen 80;\n    server_name b.com www.b.com;\n    # 所有 HTTP 请求重定向到 HTTPS\n    return 301 https://$host$request_uri;\n}\n\n# 将 b.club 的 HTTP 请求重定向到 b.com\nserver {\n    listen 80;\n    server_name b.club www.b.club;\n    return 301 https://b.com$request_uri;\n}\n\n# HTTPS 443端口的主站点配置 (b.com)\nserver {\n    listen 443 ssl;\n    server_tokens off;\n    server_name b.com www.b.com;\n\n    # SSL证书配置\n    ssl_certificate /etc/letsencrypt/live/b.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/b.com/privkey.pem;\n\n    include enable-php-74.conf;\n    include /www/server/panel/vhost/rewrite/wordpress.local.conf;\n\n    location ~ ^/(\\.user.ini|\\.htaccess|\\.git|\\.svn|\\.project|LICENSE|README.md) {\n        return 404;\n    }\n\n    location ~ \\.well-known {\n        allow all;\n    }\n\n    access_log /www/wwwlogs/wordpress.local.log;\n    error_log /www/wwwlogs/wordpress.local.error.log;\n}\n\n# HTTPS 443端口的 b.club 重定向到 b.com\nserver {\n    listen 443 ssl;\n    server_name b.club www.b.club;\n\n    # SSL证书配置\n    ssl_certificate /etc/letsencrypt/live/b.club/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/b.club/privkey.pem;\n\n    # 所有 HTTPS 请求重定向到 b.com\n    return 301 https://b.com$request_uri;\n}\n\n怎么找到nginx的配置文件-nginx.conf？\n可以看我这篇文章：\nhttps://linxiaozhong.cn/nginx/\nDNS解析\n在域名解析中，将b.club的A记录指向服务器IP。\n或者设置两条CNAME记录，b.club将@和www结果指向b.com。\n为什么需要DNS解析？\nDNS解析是将域名解析为IP地址的过程，这样浏览器才能找到服务器。\n所以，访问服务器是第一步，之后才会进行执行重定向请求。\n"},{"title":"如何使用rust的引擎模版tera",
"url":"/blog/rust-tera/",
"date":"2024-09-26",
"headings":[{"level":1,"id":"terashi-shen-me","permalink":"https://linxz.online/blog/rust-tera/#terashi-shen-me","title":"tera是什么","children":[]},{"level":1,"id":"xin-jian-yi-ge-rustxiang-mu","permalink":"https://linxz.online/blog/rust-tera/#xin-jian-yi-ge-rustxiang-mu","title":"新建一个rust项目","children":[]},{"level":1,"id":"tian-jia-terayi-lai","permalink":"https://linxz.online/blog/rust-tera/#tian-jia-terayi-lai","title":"添加tera依赖","children":[]},{"level":1,"id":"chuang-jian-yi-ge-htmlmo-ban","permalink":"https://linxz.online/blog/rust-tera/#chuang-jian-yi-ge-htmlmo-ban","title":"创建一个html模版","children":[]},{"level":1,"id":"xiu-gai-main-rswen-jian","permalink":"https://linxz.online/blog/rust-tera/#xiu-gai-main-rswen-jian","title":"修改main.rs文件","children":[]},{"level":1,"id":"an-zhuang-cargo-watch","permalink":"https://linxz.online/blog/rust-tera/#an-zhuang-cargo-watch","title":"安装cargo-watch","children":[]},{"level":1,"id":"yun-xing-xiang-mu","permalink":"https://linxz.online/blog/rust-tera/#yun-xing-xiang-mu","title":"运行项目","children":[]}],
"body":"tera是什么\ntera是一个用于渲染模板的引擎，类似于jinja2。它可以使用rust语言编写html模版，然后渲染成正式的html文件。\n而jinjia2是python的模板引擎，可以使用python语言渲染html模版。\n好处是，可以在html中使用rust的语法，比如if else，for循环等。\n新建一个rust项目\ncargo new tera-demo\ncd tera-demo\n\n添加tera依赖\n在Cargo.toml中添加tera依赖：\n[dependencies]\ntera = &quot;1.20.0&quot;\nactix-web = &quot;4.4.0&quot;\n\nactix-web是为了可以在浏览器中实时查看渲染后的html文件。\n创建一个html模版\n在根目录下新建一个templates目录，然后新建一个hello.html文件：\n&lt;h1&gt;虽然，非常开心, 你好， {{ name }}!&lt;/h1&gt;\n\n修改main.rs文件\n在src目录下新建一个main.rs文件，然后添加以下代码：\nuse actix_web::{get, App, HttpResponse, HttpServer, Responder};\nuse tera::Tera;\nuse std::sync::Mutex;\n\nstruct AppState {\n    tera: Mutex&lt;Tera&gt;,\n}\n\n#[get(&quot;/&quot;)]\nasync fn index(data: actix_web::web::Data&lt;AppState&gt;) -&gt; impl Responder {\n    let tera = data.tera.lock().unwrap();\n    let mut context = tera::Context::new();\n    context.insert(&quot;name&quot;, &quot;世界&quot;);\n\n    match tera.render(&quot;hello.html&quot;, &amp;context) {\n        Ok(rendered) =&gt; HttpResponse::Ok()\n            .content_type(&quot;text/html; charset=utf-8&quot;)\n            .body(rendered),\n        Err(e) =&gt; HttpResponse::InternalServerError().body(format!(&quot;Rendering error: {}&quot;, e)),\n    }\n}\n\n#[actix_web::main]\nasync fn main() -&gt; std::io::Result&lt;()&gt; {\n    let tera = match Tera::new(&quot;templates/**/*&quot;) {\n        Ok(t) =&gt; t,\n        Err(e) =&gt; {\n            println!(&quot;Parsing error(s): {}&quot;, e);\n            std::process::exit(1);\n        }\n    };\n\n    println!(&quot;Server running at http://localhost:8080&quot;);\n\n    HttpServer::new(move || {\n        App::new()\n            .app_data(actix_web::web::Data::new(AppState {\n                tera: Mutex::new(tera.clone()),\n            }))\n            .service(index)\n    })\n    .bind(&quot;127.0.0.1:8080&quot;)?\n    .run()\n    .await\n}\n\n安装cargo-watch\ncargo install cargo-watch\n\n运行项目\ncargo watch -x run\n\n现在，打开浏览器，输入http://localhost:8080，就可以看到渲染后的html文件了。\n注意，更新代码后浏览器并不会自动刷新，需要手动刷新。\n"},{"title":"从零开始自动申请Let's Encrypt证书（三个月有效，自动续期）",
"url":"/blog/certbot/",
"date":"2024-09-25",
"headings":[{"level":1,"id":"an-zhuang-nginx","permalink":"https://linxz.online/blog/certbot/#an-zhuang-nginx","title":"安装nginx","children":[{"level":2,"id":"an-zhuang-ruan-jian-bao","permalink":"https://linxz.online/blog/certbot/#an-zhuang-ruan-jian-bao","title":"安装软件包","children":[]},{"level":2,"id":"qi-dong-nginx","permalink":"https://linxz.online/blog/certbot/#qi-dong-nginx","title":"启动nginx","children":[]},{"level":2,"id":"kai-ji-qi-dong-nginx","permalink":"https://linxz.online/blog/certbot/#kai-ji-qi-dong-nginx","title":"开机启动nginx","children":[]},{"level":2,"id":"cha-kan-nginxzhuang-tai","permalink":"https://linxz.online/blog/certbot/#cha-kan-nginxzhuang-tai","title":"查看nginx状态","children":[]},{"level":2,"id":"cha-kan-nginxpei-zhi-wen-jian","permalink":"https://linxz.online/blog/certbot/#cha-kan-nginxpei-zhi-wen-jian","title":"查看nginx配置文件","children":[]}]},{"level":1,"id":"pei-zhi-yu-ming-he-server","permalink":"https://linxz.online/blog/certbot/#pei-zhi-yu-ming-he-server","title":"配置域名和server","children":[{"level":2,"id":"jie-xi-yu-ming-tian-jia-yi-ge-aji-lu","permalink":"https://linxz.online/blog/certbot/#jie-xi-yu-ming-tian-jia-yi-ge-aji-lu","title":"解析域名-添加一个A记录","children":[]},{"level":2,"id":"cha-kan-shi-fou-cheng-gong","permalink":"https://linxz.online/blog/certbot/#cha-kan-shi-fou-cheng-gong","title":"查看是否成功","children":[]},{"level":2,"id":"jia-she-yi-ge-jian-dan-de-webfu-wu","permalink":"https://linxz.online/blog/certbot/#jia-she-yi-ge-jian-dan-de-webfu-wu","title":"架设一个简单的web服务","children":[]},{"level":2,"id":"zhong-qi-nginx","permalink":"https://linxz.online/blog/certbot/#zhong-qi-nginx","title":"重启nginx","children":[]}]},{"level":1,"id":"pei-zhi-sslzheng-shu","permalink":"https://linxz.online/blog/certbot/#pei-zhi-sslzheng-shu","title":"配置SSL证书","children":[{"level":2,"id":"an-zhuang-acme","permalink":"https://linxz.online/blog/certbot/#an-zhuang-acme","title":"安装acme","children":[]},{"level":2,"id":"gei-acme-shshe-zhi-bie-ming","permalink":"https://linxz.online/blog/certbot/#gei-acme-shshe-zhi-bie-ming","title":"给acme.sh设置别名","children":[]},{"level":2,"id":"qie-huan-fu-wu-qi-dao-letsencrypt","permalink":"https://linxz.online/blog/certbot/#qie-huan-fu-wu-qi-dao-letsencrypt","title":"切换服务器到letsencrypt","children":[]},{"level":2,"id":"zhu-ce-zhang-hao","permalink":"https://linxz.online/blog/certbot/#zhu-ce-zhang-hao","title":"注册账号","children":[]},{"level":2,"id":"she-zhi-access-key","permalink":"https://linxz.online/blog/certbot/#she-zhi-access-key","title":"设置access key","children":[{"level":3,"id":"deng-lu-a-li-yun-wang-zhan","permalink":"https://linxz.online/blog/certbot/#deng-lu-a-li-yun-wang-zhan","title":"登录阿里云网站","children":[]},{"level":3,"id":"she-zhi-huan-jing-bian-liang","permalink":"https://linxz.online/blog/certbot/#she-zhi-huan-jing-bian-liang","title":"设置环境变量","children":[]}]},{"level":2,"id":"sheng-cheng-zheng-shu","permalink":"https://linxz.online/blog/certbot/#sheng-cheng-zheng-shu","title":"生成证书","children":[]},{"level":2,"id":"pei-zhi-zheng-shu","permalink":"https://linxz.online/blog/certbot/#pei-zhi-zheng-shu","title":"配置证书","children":[{"level":3,"id":"wan-cheng-nginx-443duan-kou-pei-zhi","permalink":"https://linxz.online/blog/certbot/#wan-cheng-nginx-443duan-kou-pei-zhi","title":"完成nginx-443端口配置","children":[]},{"level":3,"id":"zhong-qi-nginx-1","permalink":"https://linxz.online/blog/certbot/#zhong-qi-nginx-1","title":"重启nginx","children":[]},{"level":3,"id":"ce-shi","permalink":"https://linxz.online/blog/certbot/#ce-shi","title":"测试","children":[]}]},{"level":2,"id":"an-zhuang-zheng-shu-zi-dong-geng-xin","permalink":"https://linxz.online/blog/certbot/#an-zhuang-zheng-shu-zi-dong-geng-xin","title":"安装证书自动更新","children":[]}]},{"level":1,"id":"zi-dong-geng-xin","permalink":"https://linxz.online/blog/certbot/#zi-dong-geng-xin","title":"自动更新","children":[{"level":2,"id":"cha-kan-ding-shi-ren-wu","permalink":"https://linxz.online/blog/certbot/#cha-kan-ding-shi-ren-wu","title":"查看定时任务","children":[]},{"level":2,"id":"zi-dong-geng-xin-acme-sh","permalink":"https://linxz.online/blog/certbot/#zi-dong-geng-xin-acme-sh","title":"自动更新acme.sh","children":[]},{"level":2,"id":"can-kao","permalink":"https://linxz.online/blog/certbot/#can-kao","title":"参考","children":[]}]}],
"body":"安装nginx\n安装软件包\n为什么要安装nginx？一开始我看教程不懂，以为只是要测试证书是否成功，所以需要一个web服务器。\n其实，nginx在这里的用途是，配置证书。如果不进入nginx配置，证书是无法生效的。\n基于CentOs系统，安装：\nsudo yum install epel-release\nsudo yum install nginx\n\nNginx不包含在默认的仓库中，所以你需要添加EPEL仓库。\n启动nginx\nsudo systemctl start nginx\n\n开机启动nginx\nsudo systemctl enable nginx\n\n查看nginx状态\nsudo systemctl status nginx\n\n查看nginx配置文件\nsudo nginx -t\n\n通常在/etc/nginx/nginx.conf中。\n配置域名和server\n解析域名-添加一个A记录\n指向你的服务器IP地址。\n查看是否成功\nping yourdomain.com\n\n出现你的服务器IP地址，说明解析成功。\n架设一个简单的web服务\nsudo vim /etc/nginx/nginx.conf\n\n看看root的路径，一般是/usr/share/nginx/html。\n在root设置下方，输入 index index.html.\n同时，server_name设置为你的域名。\nserver {\n    listen       80;\n    server_name  yourdomain.com;\n    root         /usr/share/nginx/html;\n    index        index.html;\n}\n\n:wq退出，输入：\necho &#39;Hello, World!&#39; | sudo tee /usr/share/nginx/html/index.html\n\n重启nginx\nsudo systemctl restart nginx\n\n现在，访问你的域名，应该可以看到Hello, World!。\n实测，chrome可能不会正常显示，可以试试firefox。我最后是用curl命令测试的：\ncurl yourdomain.com\n\n如果出现Hello, World!，说明你的web服务已经架设成功。\n配置SSL证书\n安装acme\ncurl https://get.acme.sh | sh -s email=my@example.com\n\n这里的email是你的邮箱地址。\n给acme.sh设置别名\nsudo vim ~/.bashrc\n\n加上：\nalias acme.sh=&#39;/root/.acme.sh/acme.sh&#39;\n\n然后：\nsource ~/.bashrc\n\n这样，就可以直接用acme.sh命令了。\n切换服务器到letsencrypt\nacme.sh  --set-default-ca --server letsencrypt\n\nacme.sh默认的是ZeroSSL，但是ZeroSSL不大稳定，所以我们切换到letsencrypt。\n当然，你也可以不切换，直接用ZeroSSL。但你可以看看网上对ZeroSSL延时的不满。\n注册账号\nacme.sh --register-account -m my@example.com\n\n实测下来，国内服务器时间可能会花得比较久，可以试一下这个方法：\nsudo vim ~/.acme.sh/account.conf\n\n将邮箱填入即可。\n设置access key\n由于我们接下来需要DNS验证，所以需要获取access key。由于我是阿里云解析的，就说阿里云的步骤：\n登录阿里云网站\nhttps://ram.console.aliyun.com/manage/ak\n生成一个 key 和 secret\n设置环境变量\nexport Ali_Key=&quot;yourkey&quot;\nexport Ali_Secret=&quot;yoursecret&quot;\n\n生成证书\nacme.sh --issue --dns dns_ali -d linxz.online -d *.linxz.online\n\n成功后，会提示你证书的位置。通常在/root/.acme.sh/yourdomain.com。\n有用的是两个文件：fullchain.cer和yourdomain.com.key。\n配置证书\n完成nginx-443端口配置\n打开nginx配置文件：\nsudo vim /etc/nginx/nginx.conf\n\n完成443端口的配置：\nserver {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n    \n    server_name linxz.online;\n    ssl_certificate /home/lighthouse/.acme.sh/linxz.online_ecc/fullchain.cer;\n    ssl_certificate_key /home/lighthouse/.acme.sh/linxz.online_ecc/linxz.online.key;\n    client_max_body_size 100m;\n\n    location / {\n        root  /usr/share/nginx/html;\n        index index.html;\n    }\n}\n\n重启nginx\nsudo systemctl restart nginx\n\n测试\n再次通过curl命令测试：\ncurl https://linxz.online\n\n如果出现Hello, World!，说明你的证书配置成功。\n安装证书自动更新\nacme.sh --installcert -d linxz.online --key-file /home/lighthouse/.acme.sh/linxz.online_ecc/linxz.online.key --fullchain-file /home/lighthouse/.acme.sh/linxz.online_ecc/fullchain.cer --reloadcmd &quot;sudo systemctl reload nginx&quot;\n\n自动更新\n查看定时任务\ncrontab -l\n\n你可以看到以下命令：\n45 12 * * * &quot;/home/lighthouse/.acme.sh&quot;/acme.sh --cron --home &quot;/home/lighthouse/.acme.sh&quot; &gt; /dev/null\n\n这个命令的意思是，每天12:45，自动更新证书。\n自动更新acme.sh\nacme.sh --upgrade --auto-upgrade\n\n这样，acme.sh就会自动更新了。\n参考\n\n古时的风筝-用这个方法，免费、无限期使用 SSL(HTTPS)证书，从此实现证书自由了\n\n"},{"title":"如何无服务器上线网站？- Cloudflare Pages",
"url":"/blog/cloudflare-pages/",
"date":"2024-09-25",
"headings":[{"level":1,"id":"shang-chuan-wang-zhan-dao-github","permalink":"https://linxz.online/blog/cloudflare-pages/#shang-chuan-wang-zhan-dao-github","title":"上传网站到github","children":[]},{"level":1,"id":"chuang-jian-cloudflare-pagesxiang-mu","permalink":"https://linxz.online/blog/cloudflare-pages/#chuang-jian-cloudflare-pagesxiang-mu","title":"创建cloudflare pages项目","children":[{"level":2,"id":"deng-lu-cloudflarewang-zhan","permalink":"https://linxz.online/blog/cloudflare-pages/#deng-lu-cloudflarewang-zhan","title":"登录cloudflare网站","children":[]},{"level":2,"id":"pei-zhi-xiang-mu","permalink":"https://linxz.online/blog/cloudflare-pages/#pei-zhi-xiang-mu","title":"配置项目","children":[{"level":3,"id":"keng-yi-xu-yao-jia-huan-jing-bian-liang","permalink":"https://linxz.online/blog/cloudflare-pages/#keng-yi-xu-yao-jia-huan-jing-bian-liang","title":"坑一：需要加环境变量","children":[]},{"level":3,"id":"keng-er-xu-yao-shi-yong-npm","permalink":"https://linxz.online/blog/cloudflare-pages/#keng-er-xu-yao-shi-yong-npm","title":"坑二：需要使用npm","children":[]}]}]},{"level":1,"id":"pei-zhi-yu-ming","permalink":"https://linxz.online/blog/cloudflare-pages/#pei-zhi-yu-ming","title":"配置域名","children":[]}],
"body":"cloudflare pages是一个无服务器的网站托管服务，可以帮助你快速上线网站。\n它支持多种前端和静态网站生成器，如React、Vue、Angular、Svelte、Eleventy、Hugo、Jekyll、zola等。\n下面，我以zoal为例，介绍如何用cloudflare pages上线网站。\n上传网站到github\n首先，你需要把zola网站代码上传到github。可以不必使用zola build命令，因为cloudflare pages会自动构建。\n创建cloudflare pages项目\n登录cloudflare网站\n到达cloudflare官网，选择Workers and Pages。选择创建 - 连接到git，导入你的github项目。\n配置项目\n选择项目的框架，这里选择zola。再选择默认的构建命令zola build。输出目录是public。\n坑一：需要加环境变量\n注意：zola有个坑。直接部署是不成功的，需要加一个环境变量UNSTABLE_PRE_BUILD，值为asdf plugin add zola https://github.com/salasrod/asdf-zola &amp;&amp; asdf install zola 0.18.0 &amp;&amp; asdf global zola 0.18.0\n原因是cloudflare只支持v1的zola，而最新已经到v2了。具体构建可以见zola官方解释\n坑二：需要使用npm\n如果你的zola项目是用yarn管理依赖，不知为啥会反复报错。在与AI一同调试后也没用，我随删除了yarn.lock文件，改用npm install，自动生成package-lock.json，重新push一下仓库，就成功了。\n配置域名\n选择项目中的自定义域，就可以选择域名了。注意，这里的域名指在cloudflare解析的域名。这意味着，你需要把DNS解析的服务器指向cloudflare。\n"},{"title":"Docker Desktop国内访问速度慢？代理设置方式",
"url":"/blog/docker-desktop/",
"date":"2024-09-25",
"headings":[{"level":1,"id":"docker-desktopjia-su-xia-zai","permalink":"https://linxz.online/blog/docker-desktop/#docker-desktopjia-su-xia-zai","title":"Docker Desktop加速下载","children":[]},{"level":1,"id":"docker-pulljia-su","permalink":"https://linxz.online/blog/docker-desktop/#docker-pulljia-su","title":"Docker pull加速","children":[]},{"level":1,"id":"docker-huan-jing-xiang-yuan","permalink":"https://linxz.online/blog/docker-desktop/#docker-huan-jing-xiang-yuan","title":"Docker 换镜像源","children":[]}],
"body":"Docker Desktop加速下载\n国内官网下载太慢了，这里有个国内的下载点，速度还不错。\nDocker pull加速\n发现docker从docker hub里面pull镜像也很慢，可以设置代理。\n方法是在Docker Desktop，选中右上角的齿轮-Preferences-Resources-Proxies，设置代理。\n注意，HTTPS里面的代理也要设置成http://的地址，一开始我不知道，就没有成功。\n我的地址是http://127.0.0.1:1087，可以根据你的实际代理情况设置。注意，不是socks5的地址，我的是1080，但是设置了也不行。\n\n教程参考\nDocker 换镜像源\n我看到还有一种方法，是换国内的镜像源，但是测试了一下，发现没啥用。教程参考\n"},{"title":"如何用ssh钥匙对登录远程主机（服务器）？",
"url":"/blog/ssh/",
"date":"2024-09-25",
"headings":[{"level":2,"id":"sheng-cheng-mi-yao-dui","permalink":"https://linxz.online/blog/ssh/#sheng-cheng-mi-yao-dui","title":"生成密钥对","children":[]},{"level":2,"id":"cha-kan-gong-yao","permalink":"https://linxz.online/blog/ssh/#cha-kan-gong-yao","title":"查看公钥","children":[]},{"level":2,"id":"cha-kan-si-yao","permalink":"https://linxz.online/blog/ssh/#cha-kan-si-yao","title":"查看私钥","children":[]},{"level":2,"id":"deng-lu-yuan-cheng-zhu-ji-bing-tian-jia-gong-yao","permalink":"https://linxz.online/blog/ssh/#deng-lu-yuan-cheng-zhu-ji-bing-tian-jia-gong-yao","title":"登录远程主机并添加公钥","children":[]},{"level":2,"id":"she-zhi-sshd-config","permalink":"https://linxz.online/blog/ssh/#she-zhi-sshd-config","title":"设置sshd_config","children":[]},{"level":2,"id":"zhong-qi-sshdfu-wu","permalink":"https://linxz.online/blog/ssh/#zhong-qi-sshdfu-wu","title":"重启sshd服务","children":[]}],
"body":"首先，你需要一个公钥和私钥，如果没有，可以使用ssh-keygen命令生成。\n生成密钥对\nssh-keygen -t rsa -b 4096 -C &quot;\n\n代码中的-t表示密钥类型，-b表示密钥长度，-C表示注释，可以不填。\n查看公钥\ncat ~/.ssh/id_rsa.pub\n\n查看私钥\ncat ~/.ssh/id_rsa\n\n登录远程主机并添加公钥\ncd ~/.ssh\n\n传入公钥，我这里的公钥名字是authorized_keys\n设置sshd_config\n/etc/ssh/sshd_config\nPubkeyAuthentication yes\nPasswordAuthentication yes\n\n允许公钥登录。\n实测，也可以保留密码登录。\n重启sshd服务\nsudo systemctl restart sshd\n\n"},{"title":"如何用vue的UI库-element-plus里面的icon？",
"url":"/blog/element-plus-icon/",
"date":"2024-09-24",
"headings":[{"level":2,"id":"an-zhuang-icons-vue","permalink":"https://linxz.online/blog/element-plus-icon/#an-zhuang-icons-vue","title":"安装icons-vue","children":[]},{"level":2,"id":"zai-main-tszhong-yin-ru","permalink":"https://linxz.online/blog/element-plus-icon/#zai-main-tszhong-yin-ru","title":"在main.ts中引入","children":[]},{"level":2,"id":"shi-yong-shi-li","permalink":"https://linxz.online/blog/element-plus-icon/#shi-yong-shi-li","title":"使用示例","children":[]},{"level":2,"id":"icontu-biao-ji-jin-ji-shi-yong-fang-fa","permalink":"https://linxz.online/blog/element-plus-icon/#icontu-biao-ji-jin-ji-shi-yong-fang-fa","title":"icon图标集锦及使用方法","children":[]}],
"body":"安装icons-vue\nnpm install @element-plus/icons-vue\n\n在main.ts中引入\nimport * as ElementPlusIconsVue from &#39;@element-plus/icons-vue&#39;\n\nconst app = createApp(App)\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\n  app.component(key, component)\n}\napp.mount(&#39;#app&#39;)\n\n使用示例\n&lt;el-button circle @click=&quot;toggleSidebar&quot;&gt;\n  &lt;el-icon&gt;\n    &lt;Close /&gt;\n  &lt;/el-icon&gt;\n&lt;/el-button&gt;\n\nicon图标集锦及使用方法\nhttps://element-plus.org/zh-CN/component/icon.html#%E6%B3%A8%E5%86%8C%E6%89%80%E6%9C%89%E5%9B%BE%E6%A0%87\n"},{"title":"如何用vue的UI库-element-plus",
"url":"/blog/element-plus/",
"date":"2024-09-24",
"headings":[{"level":2,"id":"kai-qi-yi-ge-vuexiang-mu","permalink":"https://linxz.online/blog/element-plus/#kai-qi-yi-ge-vuexiang-mu","title":"开启一个vue项目","children":[]},{"level":2,"id":"an-zhuang-element-plus","permalink":"https://linxz.online/blog/element-plus/#an-zhuang-element-plus","title":"安装element-plus","children":[]},{"level":2,"id":"wan-zheng-yin-ru","permalink":"https://linxz.online/blog/element-plus/#wan-zheng-yin-ru","title":"完整引入","children":[]},{"level":2,"id":"volarzhi-chi","permalink":"https://linxz.online/blog/element-plus/#volarzhi-chi","title":"Volar支持","children":[]},{"level":2,"id":"shi-yong-an-niu-xiao-guo","permalink":"https://linxz.online/blog/element-plus/#shi-yong-an-niu-xiao-guo","title":"使用按钮效果","children":[]},{"level":2,"id":"guan-fang-jiao-cheng","permalink":"https://linxz.online/blog/element-plus/#guan-fang-jiao-cheng","title":"官方教程","children":[]}],
"body":"开启一个vue项目\nnpm create vue@latest\n\n安装element-plus\nnpm install element-plus\n\n完整引入\nimport { createApp } from &#39;vue&#39;\nimport App from &#39;./App.vue&#39;\nimport ElementPlus from &#39;element-plus&#39;\nimport &#39;element-plus/dist/index.css&#39;\n\nconst app = createApp(App)\napp.mount(&#39;#app&#39;)\napp.use(ElementPlus)\n//app.use(ElementPlus, { size: &#39;small&#39;, zIndex: 3000 })\n\n{ size: 'small', zIndex: 3000 }可加可不加。\nsize 用于设置表单组件的默认尺寸，zIndex 用于设置弹出组件的层级，zIndex 的默认值为 2000。\nVolar支持\n如果你使用vs code, 为了语法高亮，一般会安装volar插件。这时候需要增加支持。\n// tsconfig.json\n{\n  &quot;compilerOptions&quot;: {\n    // ...\n    &quot;types&quot;: [&quot;element-plus/global&quot;]\n  }\n}\n\n使用按钮效果\n&lt;template&gt;\n  &lt;div class=&quot;mb-10&quot;&gt;\n    &lt;el-button plain&gt;Plain&lt;/el-button&gt;\n    &lt;el-button type=&quot;primary&quot; plain&gt;Primary&lt;/el-button&gt;\n    &lt;el-button type=&quot;success&quot; plain&gt;Success&lt;/el-button&gt;\n    &lt;el-button type=&quot;info&quot; plain&gt;Info&lt;/el-button&gt;\n    &lt;el-button type=&quot;warning&quot; plain&gt;Warning&lt;/el-button&gt;\n    &lt;el-button type=&quot;danger&quot; plain&gt;Danger&lt;/el-button&gt;\n  &lt;/div&gt;\n&lt;/template&gt;\n\n&lt;script setup lang=&quot;ts&quot; name=&quot;App&quot;&gt;\n&lt;/script&gt;\n\n&lt;style scoped&gt;&lt;/style&gt;\n\n这是一个简单的按钮效果，可以看到按钮的颜色和样式都是element-plus的。\n官方教程\nhttps://element-plus.org/zh-CN/guide/quickstart.html\n"},{"title":"如何用python-flask框架架设一个api后端",
"url":"/blog/flask-backend/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"xie-yi-ge-jian-dan-de-python-flaskde-api","permalink":"https://linxz.online/blog/flask-backend/#xie-yi-ge-jian-dan-de-python-flaskde-api","title":"写一个简单的python flask的api","children":[]},{"level":2,"id":"jia-she-pythonxu-ni-huan-jing-bing-an-zhuang-flask","permalink":"https://linxz.online/blog/flask-backend/#jia-she-pythonxu-ni-huan-jing-bing-an-zhuang-flask","title":"架设python虚拟环境并安装flask","children":[]},{"level":2,"id":"yun-xing-mock-server-py","permalink":"https://linxz.online/blog/flask-backend/#yun-xing-mock-server-py","title":"运行mock_server.py","children":[]}],
"body":"写一个简单的python flask的api\n# mock_server.py\nfrom flask import Flask, request, Response, jsonify\nfrom flask_cors import CORS\nimport time\nimport json\n\napp = Flask(__name__)\nCORS(app)\n\n# 模拟数据库\nmock_responses = {\n    &quot;default&quot;: &quot;这是一个默认的回答。我可以回答各种问题，请随意提问！&quot;,\n    &quot;你好&quot;: &quot;你好！很高兴见到你。我是一个AI助手，有什么我可以帮助你的吗？&quot;,\n    &quot;天气&quot;: &quot;今天天气晴朗，温度适宜。不过我是一个AI，没有实时的天气数据，建议您查看专业的天气预报哦。&quot;,\n    &quot;时间&quot;: lambda: f&quot;现在的时间是 {time.strftime(&#39;%H:%M:%S&#39;)}。请注意，这是基于服务器时间的，可能与您的本地时间有所不同。&quot;,\n}\n\ndef get_response(content):\n    # 检查是否有完全匹配的关键词\n    if content in mock_responses:\n        response = mock_responses[content]\n        return response() if callable(response) else response\n    \n    # 检查是否包含某个关键词\n    for key, value in mock_responses.items():\n        if key in content:\n            response = value\n            return response() if callable(response) else response\n    \n    # 如果没有匹配，返回默认回答\n    return mock_responses[&quot;default&quot;]\n\n@app.route(&#39;/api/python&#39;, methods=[&#39;POST&#39;])\ndef mock_api():\n    data = request.json\n    content = data.get(&#39;content&#39;, &#39;&#39;)\n    chat_history = data.get(&#39;chatHistory&#39;, &#39;[]&#39;)\n    \n    # 这里可以使用 chat_history 来实现更复杂的上下文相关回答\n    # 现在我们只是简单地打印它\n    print(f&quot;Received chat history: {chat_history}&quot;)\n\n    response = get_response(content)\n\n    def generate():\n        for i in range(0, len(response), 5):\n            chunk = response[i:i+5]\n            yield chunk\n            time.sleep(0.1)  # 模拟延迟\n\n    return Response(generate(), mimetype=&#39;text/plain&#39;)\n\nif __name__ == &#39;__main__&#39;:\n    app.run(port=5328, debug=True)\n\n架设python虚拟环境并安装flask\npython -m venv venv\nsource venv/bin/activate\npip install flask flask-cors\n\n运行mock_server.py\npython mock_server.py\n\n现在，你可以用curl或者postman等工具来测试这个api了。\ncurl -X POST http://127.0.0.1:5328/api/python -H &quot;Content-Type: application/json&quot; -d &#39;{&quot;content&quot;: &quot;你好&quot;}&#39;\n\n注意，postman也是直接输入以上的curl命令即可。\n"},{"title":"如何用flex布局-横向竖向排列",
"url":"/blog/flex/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"heng-xiang-pai-lie","permalink":"https://linxz.online/blog/flex/#heng-xiang-pai-lie","title":"横向排列","children":[{"level":3,"id":"cong-zuo-dao-you-pai-lie-flex-flex-row","permalink":"https://linxz.online/blog/flex/#cong-zuo-dao-you-pai-lie-flex-flex-row","title":"从左到右排列：flex flex-row","children":[]},{"level":3,"id":"cong-you-dao-zuo-pai-lie-flex-flex-row-reverse","permalink":"https://linxz.online/blog/flex/#cong-you-dao-zuo-pai-lie-flex-flex-row-reverse","title":"从右到左排列：flex flex-row-reverse","children":[]},{"level":3,"id":"ju-zhong-pai-lie-flex-justify-center","permalink":"https://linxz.online/blog/flex/#ju-zhong-pai-lie-flex-justify-center","title":"居中排列：flex justify-center","children":[]},{"level":3,"id":"liang-duan-dui-qi-flex-justify-between","permalink":"https://linxz.online/blog/flex/#liang-duan-dui-qi-flex-justify-between","title":"两端对齐：flex justify-between","children":[]}]},{"level":2,"id":"shu-zhi-pai-lie","permalink":"https://linxz.online/blog/flex/#shu-zhi-pai-lie","title":"竖直排列","children":[{"level":3,"id":"cong-shang-dao-xia-pai-lie-flex-flex-col","permalink":"https://linxz.online/blog/flex/#cong-shang-dao-xia-pai-lie-flex-flex-col","title":"从上到下排列：flex flex-col","children":[]},{"level":3,"id":"cong-xia-dao-shang-pai-lie-flex-flex-col-reverse","permalink":"https://linxz.online/blog/flex/#cong-xia-dao-shang-pai-lie-flex-flex-col-reverse","title":"从下到上排列：flex flex-col-reverse","children":[]}]},{"level":2,"id":"zi-dong-kuo-zhan-da-xiao-flex-1","permalink":"https://linxz.online/blog/flex/#zi-dong-kuo-zhan-da-xiao-flex-1","title":"自动扩展大小：flex-1","children":[]},{"level":2,"id":"can-kao-lian-jie","permalink":"https://linxz.online/blog/flex/#can-kao-lian-jie","title":"参考链接","children":[]}],
"body":"注意，这里的flex布局用的是tailwindcss的flex类，而不是css的flex属性。道理是一样的，只是写法不同。\n\n横向排列\n从左到右排列：flex flex-row\n实践下来，发现flex flex-row是默认的，不用写也可以。\n&lt;div class=&quot;flex flex-row&quot;&gt;\n  &lt;div&gt;01&lt;/div&gt;\n  &lt;div&gt;02&lt;/div&gt;\n  &lt;div&gt;03&lt;/div&gt;\n&lt;/div&gt;\n\n从右到左排列：flex flex-row-reverse\n&lt;div class=&quot;flex flex-row-reverse&quot;&gt;\n  &lt;div&gt;01&lt;/div&gt;\n  &lt;div&gt;02&lt;/div&gt;\n  &lt;div&gt;03&lt;/div&gt;\n&lt;/div&gt;\n\n居中排列：flex justify-center\n&lt;div class=&quot;flex justify-center&quot;&gt;\n  &lt;div&gt;01&lt;/div&gt;\n  &lt;div&gt;02&lt;/div&gt;\n  &lt;div&gt;03&lt;/div&gt;\n&lt;/div&gt;\n\n两端对齐：flex justify-between\n&lt;div class=&quot;flex justify-between&quot;&gt;\n  &lt;div&gt;01&lt;/div&gt;\n  &lt;div&gt;02&lt;/div&gt;\n  &lt;div&gt;03&lt;/div&gt;\n&lt;/div&gt;\n\n\n竖直排列\n从上到下排列：flex flex-col\n&lt;div class=&quot;flex flex-col&quot;&gt;\n  &lt;div&gt;01&lt;/div&gt;\n  &lt;div&gt;02&lt;/div&gt;\n  &lt;div&gt;03&lt;/div&gt;\n&lt;/div&gt;\n\n从下到上排列：flex flex-col-reverse\n&lt;div class=&quot;flex flex-col-reverse&quot;&gt;\n  &lt;div&gt;01&lt;/div&gt;\n  &lt;div&gt;02&lt;/div&gt;\n  &lt;div&gt;03&lt;/div&gt;\n&lt;/div&gt;\n\n\n自动扩展大小：flex-1\n &lt;div class=&#39;flex&#39;&gt;\n    &lt;div class=&#39;flex-1&#39;&gt;01&lt;/div&gt;\n    &lt;div class=&#39;flex-1&#39;&gt;02&lt;/div&gt;\n    &lt;div class=&#39;flex-1&#39;&gt;03&lt;/div&gt;\n &lt;/div&gt;\n\n\n参考链接\nhttps://tailwindcss.com/docs/flex-direction\nhttps://tailwindcss.com/docs/flex#flex-1\n"},{"title":"如何查找中国各省市的GDP和人口数据？",
"url":"/blog/gdp-population/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"lian-jie-tui-jian","permalink":"https://linxz.online/blog/gdp-population/#lian-jie-tui-jian","title":"链接推荐","children":[]},{"level":2,"id":"guan-yu-chu-sheng-ren-kou-shu-ju","permalink":"https://linxz.online/blog/gdp-population/#guan-yu-chu-sheng-ren-kou-shu-ju","title":"关于出生人口数据","children":[]},{"level":2,"id":"sou-suo-yin-qing-fang-fa","permalink":"https://linxz.online/blog/gdp-population/#sou-suo-yin-qing-fang-fa","title":"搜索引擎方法","children":[]}],
"body":"这篇文章无关编程，只是简单介绍获取中国各省市的GDP和人口数据的方法。\n先推荐一些免费有用的链接：\n链接推荐\n\n红黑统计公报库：这个网站收集了各省市的统计公报，包括GDP、人口、出生率等数据，内容免费。\n中国统计年鉴：国家统计局资料，内容大而全。\n红黑人口库：特别关注人口和GDP数据，界面简单。\n\n关于出生人口数据\n出生人口数据一般包括出生人口数量和出生率。\n但是，在我搜索中发现，很多统计数据不会直接给出出生人口数量，需要自己计算。\n计算方式：\n\n出生人口数量 = 出生率 * 人口总数\n\n注意，出生率是指每千人口中出生人口的数量。出生率是一个比例，通常以千分之几‰表示（注意百分号后面还有一个o，这是千分号）。\n搜索引擎方法\n首先，你可以打开搜索引擎，搜索《国民经济和社会发展统计公报》。这是国家统计局每年发布的一份重要统计数据，其中包含了各省市的GDP和人口数据。\n具体到每一年、每个省、市，《XX年XX省/市国民经济和社会发展统计公报》。\n关于时间，一般来说，国家统计局会在每年的3月份发布上一年的数据。比如2022年的数据，会在2023年3月份发布。\n例子：\n这是2023年广东省国民经济和社会发展统计公报，根据同样的关键词，可以查询到2022年、2021年的统计公报。\n根据以上资料，可以得知，广东省出生人口数量：\n2023年出生人口103万人，出生率8.12‰；生产总值135673.16亿元。\n2022年出生人口105.20 万人，出生率 8.30‰；生产总值129118.58 亿元。\n2021年出生人口118.31万人，出生率9.35‰；生产总值124369.67亿元。\n"},{"title":"如何给github仓库重命名",
"url":"/blog/github-rename/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"zhong-ming-ming-cang-ku","permalink":"https://linxz.online/blog/github-rename/#zhong-ming-ming-cang-ku","title":"重命名仓库","children":[]},{"level":2,"id":"xiu-gai-ben-di-cang-ku-de-yuan-cheng-di-zhi","permalink":"https://linxz.online/blog/github-rename/#xiu-gai-ben-di-cang-ku-de-yuan-cheng-di-zhi","title":"修改本地仓库的远程地址","children":[]}],
"body":"重命名仓库\ngithub主页 -&gt; 仓库 -&gt; Settings -&gt; 重命名仓库\n修改本地仓库的远程地址\ngit remote set-url origin &lt;new-url&gt;\n\n值得注意的是，即使你不修改本地仓库的远程地址，git push暂时也能使用，但是时间久了会出现问题，所以建议修改。\n"},{"title":"如何使用github actions？",
"url":"/blog/gitub-actions-tutorial/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"huo-qu-yi-ge-github-actionsquan-xian-de-toekn","permalink":"https://linxz.online/blog/gitub-actions-tutorial/#huo-qu-yi-ge-github-actionsquan-xian-de-toekn","title":"获取一个github actions权限的toekn","children":[]},{"level":2,"id":"xiang-mu-zhong-da-kai-workflowquan-xian","permalink":"https://linxz.online/blog/gitub-actions-tutorial/#xiang-mu-zhong-da-kai-workflowquan-xian","title":"项目中打开workflow权限","children":[]},{"level":2,"id":"zai-cang-ku-zhong-tian-jia-token-gei-github-actionsquan-xian","permalink":"https://linxz.online/blog/gitub-actions-tutorial/#zai-cang-ku-zhong-tian-jia-token-gei-github-actionsquan-xian","title":"在仓库中添加token，给github actions权限","children":[]},{"level":2,"id":"chuang-jian-workflowwen-jian","permalink":"https://linxz.online/blog/gitub-actions-tutorial/#chuang-jian-workflowwen-jian","title":"创建workflow文件","children":[]},{"level":2,"id":"bian-xie-pythonjiao-ben","permalink":"https://linxz.online/blog/gitub-actions-tutorial/#bian-xie-pythonjiao-ben","title":"编写python脚本","children":[]},{"level":2,"id":"can-kao","permalink":"https://linxz.online/blog/gitub-actions-tutorial/#can-kao","title":"参考","children":[]}],
"body":"获取一个github actions权限的toekn\ngithub首页 -&gt; settings -&gt; Developer settings -&gt; Personal access tokens -&gt; Generate new token\n勾选actions即可，这样会生成token，请保存下来。（我选择token有效期为永久，具体根据自己需求）\n项目中打开workflow权限\n在项目中，选择settings -&gt; Actions -&gt; General -&gt; 勾选 Read and write permissions\n在仓库中添加token，给github actions权限\n在项目中，选择settings -&gt; Secrets and variables -&gt; actions -&gt; New repository secret\n随便改一个名字，比如我的是ACTIONS_PAT，然后把刚才生成的token粘贴进去。\n创建workflow文件\n在项目中，新建.github/workflows文件夹，然后新建一个.yml文件，比如generate_readme.yml。\n我需要实现一个功能，每次push代码时，自动更新README.md文件，作为我的博客目录。\nname: Generate README\n\non:\n  push:\n    branches:\n      - main  # 当推送到主分支时触发\n  pull_request:\n    branches:\n      - main\n\njobs:\n  generate-readme:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v2\n\n      - name: Install Python\n        uses: actions/setup-python@v2\n        with:\n          python-version: 3.x\n\n      - name: Install dependencies\n        run: |\n          pip install markdown\n          pip install PyYAML\n\n      - name: Generate README\n        run: python generate_readme.py\n\n      - name: Commit and push changes\n        env:\n          GITHUB_TOKEN: ${{ secrets.ACTIONS_PAT }}\n        run: |\n          git config --local user.email &quot;your-email@example.com&quot;\n          git config --local user.name &quot;github-actions[bot]&quot;\n          git add README.md\n          git commit -m &quot;Auto-generate README with md file index&quot;\n          git push\n\n编写python脚本\n在项目中，新建一个generate_readme.py文件，用于生成README.md文件。\nimport os\nimport yaml\n\ndef extract_info_from_md(md_file):\n    with open(md_file, &#39;r&#39;, encoding=&#39;utf-8&#39;) as file:\n        lines = file.readlines()\n    \n    # 提取 front matter 部分\n    if lines[0].strip() == &quot;---&quot;:\n        front_matter = []\n        for line in lines[1:]:\n            if line.strip() == &quot;---&quot;:\n                break\n            front_matter.append(line)\n        front_matter = yaml.safe_load(&#39;&#39;.join(front_matter))\n        return front_matter\n    return None\n\ndef generate_readme(md_files):\n    readme_content = &quot;# 项目文档目录\\n\\n&quot;\n    for md_file in md_files:\n        info = extract_info_from_md(md_file)\n        if info:\n            title = info.get(&#39;title&#39;, &#39;无标题&#39;)\n            # 这里使用 GitHub 仓库中的相对路径生成 URL\n            url = f&quot;./{md_file}&quot;\n            readme_content += f&quot;- [{title}]({url})\\n&quot;\n    return readme_content\n\ndef main():\n    md_files = [f for f in os.listdir(&#39;.&#39;) if f.endswith(&#39;.md&#39;) and f != &#39;README.md&#39;]\n    readme_content = generate_readme(md_files)\n    \n    with open(&#39;README.md&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f:\n        f.write(readme_content)\n\nif __name__ == &quot;__main__&quot;:\n    main()\n\n这样一来，每次push代码时，github actions会自动运行workflow，自动生成README.md文件。\n参考\n\nGitHub Actions Documentation\n阮一峰的 GitHub Actions 入门教程\n\n"},{"title":"怎么使用nanoid?uuid的替代方案",
"url":"/blog/nanoid/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"shen-me-shi-nanoid","permalink":"https://linxz.online/blog/nanoid/#shen-me-shi-nanoid","title":"什么是nanoid?","children":[]},{"level":2,"id":"an-zhuang-nanoid","permalink":"https://linxz.online/blog/nanoid/#an-zhuang-nanoid","title":"安装nanoid","children":[]},{"level":2,"id":"shi-yong-nanoid","permalink":"https://linxz.online/blog/nanoid/#shi-yong-nanoid","title":"使用nanoid","children":[]}],
"body":"什么是nanoid?\nnanoid其实是uuid的替代品，是一个轻量化版本。\n它可以生成一个不重复的随机字符串，用于标识数据。\nnanoid的特点是短小、不重复、URL友好，适合用于生成短链接、短ID等场景。\n安装nanoid\nnpm install nanoid\n\n使用nanoid\n这里介绍的是在vue3中使用nanoid的方法。\nimport { nanoid } from &#39;nanoid&#39;;\nconst currentChatId = ref(nanoid())\n\n"},{"title":"nginx常用命令",
"url":"/blog/nginx/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"zen-me-zhao-dao-nginxde-pei-zhi-wen-jian-nginx-conf","permalink":"https://linxz.online/blog/nginx/#zen-me-zhao-dao-nginxde-pei-zhi-wen-jian-nginx-conf","title":"怎么找到nginx的配置文件-nginx.conf","children":[{"level":3,"id":"fang-fa-yi-tong-guo-nginx-tming-ling","permalink":"https://linxz.online/blog/nginx/#fang-fa-yi-tong-guo-nginx-tming-ling","title":"方法一：通过nginx -t命令","children":[]},{"level":3,"id":"fang-fa-er-tong-guo-findming-ling","permalink":"https://linxz.online/blog/nginx/#fang-fa-er-tong-guo-findming-ling","title":"方法二：通过find命令","children":[]}]},{"level":2,"id":"an-zhuang-nginx","permalink":"https://linxz.online/blog/nginx/#an-zhuang-nginx","title":"安装nginx","children":[{"level":3,"id":"dui-yu-ubuntu-debianxi-tong","permalink":"https://linxz.online/blog/nginx/#dui-yu-ubuntu-debianxi-tong","title":"对于Ubuntu/Debian系统","children":[]},{"level":3,"id":"dui-yu-centos-rhelxi-tong","permalink":"https://linxz.online/blog/nginx/#dui-yu-centos-rhelxi-tong","title":"对于CentOS/RHEL系统","children":[]}]},{"level":2,"id":"qi-dong-nginx","permalink":"https://linxz.online/blog/nginx/#qi-dong-nginx","title":"启动nginx","children":[]},{"level":2,"id":"kai-ji-qi-dong-nginx","permalink":"https://linxz.online/blog/nginx/#kai-ji-qi-dong-nginx","title":"开机启动nginx","children":[]},{"level":2,"id":"cha-kan-nginxzhuang-tai","permalink":"https://linxz.online/blog/nginx/#cha-kan-nginxzhuang-tai","title":"查看nginx状态","children":[]},{"level":2,"id":"cha-kan-xiu-gai-hou-de-pei-zhi-shi-fou-zheng-que","permalink":"https://linxz.online/blog/nginx/#cha-kan-xiu-gai-hou-de-pei-zhi-shi-fou-zheng-que","title":"查看修改后的配置是否正确","children":[]},{"level":2,"id":"zhong-qi-nginx","permalink":"https://linxz.online/blog/nginx/#zhong-qi-nginx","title":"重启nginx","children":[]}],
"body":"nginx是常用的web服务器，替代的web服务器还有apache。\n怎么找到nginx的配置文件-nginx.conf\n方法一：通过nginx -t命令\nnginx -t\n\n方法二：通过find命令\nsudo find / -name nginx.conf\n\n意思是从根目录/开始查找nginx.conf文件。\n安装nginx\n对于Ubuntu/Debian系统\nsudo apt update\nsudo apt-get install nginx\n\n需要先更新apt-get，然后再安装nginx。\n对于CentOS/RHEL系统\nsudo yum install epel-release\nsudo yum install nginx\n\nNginx不包含在默认的仓库中，所以你需要添加EPEL仓库。\n启动nginx\nsudo systemctl start nginx\n\n开机启动nginx\nsudo systemctl enable nginx\n\n查看nginx状态\nsudo systemctl status nginx\n\n查看修改后的配置是否正确\nsudo nginx -t\n\n重启nginx\nsudo systemctl restart nginx\n\n这里的restart是重启，reload是重新加载配置文件。实践下来，两者差不多。\n"},{"title":"tera的基本语法",
"url":"/blog/tera/",
"date":"2024-09-21",
"headings":[{"level":1,"id":"terade-ji-ben-yu-fa","permalink":"https://linxz.online/blog/tera/#terade-ji-ben-yu-fa","title":"tera的基本语法","children":[]},{"level":1,"id":"rawkuai","permalink":"https://linxz.online/blog/tera/#rawkuai","title":"raw块","children":[]},{"level":1,"id":"bian-liang","permalink":"https://linxz.online/blog/tera/#bian-liang","title":"变量","children":[]},{"level":1,"id":"kong-bai-kong-zhi","permalink":"https://linxz.online/blog/tera/#kong-bai-kong-zhi","title":"空白控制","children":[{"level":2,"id":"tian-jia-kong-bai","permalink":"https://linxz.online/blog/tera/#tian-jia-kong-bai","title":"添加空白","children":[]},{"level":2,"id":"shan-chu-kong-bai","permalink":"https://linxz.online/blog/tera/#shan-chu-kong-bai","title":"删除空白","children":[]}]},{"level":1,"id":"zhu-shi","permalink":"https://linxz.online/blog/tera/#zhu-shi","title":"注释","children":[]},{"level":1,"id":"lian-jie","permalink":"https://linxz.online/blog/tera/#lian-jie","title":"连接","children":[]},{"level":1,"id":"inpan-duan","permalink":"https://linxz.online/blog/tera/#inpan-duan","title":"in判断","children":[]},{"level":1,"id":"ifpan-duan","permalink":"https://linxz.online/blog/tera/#ifpan-duan","title":"if判断","children":[]},{"level":1,"id":"forxun-huan","permalink":"https://linxz.online/blog/tera/#forxun-huan","title":"for循环","children":[]},{"level":1,"id":"include","permalink":"https://linxz.online/blog/tera/#include","title":"include","children":[]},{"level":1,"id":"ji-cheng","permalink":"https://linxz.online/blog/tera/#ji-cheng","title":"继承","children":[{"level":2,"id":"shi-yong-block-super-lai-ji-cheng-fu-mo-ban-de-nei-rong","permalink":"https://linxz.online/blog/tera/#shi-yong-block-super-lai-ji-cheng-fu-mo-ban-de-nei-rong","title":"使用{{ block.super }}来继承父模版的内容。","children":[]}]},{"level":1,"id":"hong","permalink":"https://linxz.online/blog/tera/#hong","title":"宏","children":[]},{"level":1,"id":"han-shu-he-guo-lu-qi-filter","permalink":"https://linxz.online/blog/tera/#han-shu-he-guo-lu-qi-filter","title":"函数和过滤器filter","children":[]},{"level":1,"id":"can-kao","permalink":"https://linxz.online/blog/tera/#can-kao","title":"参考","children":[]}],
"body":"tera的基本语法\n{{ and }} 表达式（expressions） \n{% and %} 声明语句（statements）\n{# and #} 注释（comments）\nraw块\n避免被渲染\n{% raw %}\n    {{ 这段内容不会被Tera解析 }}\n{% endraw %}\n\n变量\n\n用set声明变量.\n在循环和宏中的变量拥有作用域。\n循环变量在循环结束后不再可用。在其他地方设置的变量在整个模板中可用。如果想要在循环中设置全局变量，用set_global。\n\n{% set name = &quot;Tera&quot; %}\n{{ name }}\n\n空白控制\n添加空白\n可以在html代码中加入&amp;nbsp;达成，比如&amp;nbsp;&amp;nbsp;代表两个空白。\n删除空白\ntera不会主动删除空白，需要用减号-来删除。\n{%-if foo-%}...{%-endif-%}\n\n注意：-号前后不能有空格。\n注释\ntera不会渲染注释。\n也可以用html注释。\n{# 这是注释 #}\n&lt;!--这是html的注释--&gt;\n\n连接\n可以用波浪号~连接字符串、数字和变量。\n{{ &quot;Hello&quot; ~ &quot;world&quot; }}\n\nin判断\n用in判断是否在列表中，返回true或false。\n{% if &quot;foo&quot; in [&quot;foo&quot;, &quot;bar&quot;] %}\n    foo is in the list\n{% endif %}\n\nif判断\n{% if foo %}\n    foo is true\n{% elif bar %}\n    bar is true\n{% else %}\n    foo and bar are false\n{% endif %}\n\n使用and, or, not来组合条件，而不是&amp;&amp;, ||, !。\n{% if foo and bar %}\n    foo and bar are true\n{% endif %}\n\nfor循环\n数据通常在后端传递给模板。\n{% for user in users %}\n    {{ user.name }}\n{% endfor %}\n\ninclude\ninclude可以引入其他html文件，相当于叠加。\n文件名后面加上ignore missing，如果文件不存在，不会报错。\n{% include &quot;header.html&quot; %}\n\n继承\n定义一个父模版，然后在子模版通过block继承。\n&lt;!-- 子模版 --&gt;\n{% extends &quot;base.html&quot; %}\n\n使用{{ block.super }}来继承父模版的内容。\n{% block content %}\n    {{ block.super }}\n    &lt;p&gt;子模版的内容&lt;/p&gt;\n{% endblock %}\n\n宏\n只能在模版最上面一行引入宏，否则会发生错误\n{% import &quot;macros.html&quot; as macros %}\n\n参考教程：B站砸松果-tera的基本语法\n函数和过滤器filter\n参考教程：B站砸松果-函数和过滤器\n参考\n\nB站砸松果\n\n"},{"title":"vue如何做对话框？",
"url":"/blog/vue-chatui/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"classde-liang-chong-xie-fa-dai-shu-zu-he-bu-dai-shu-zu","permalink":"https://linxz.online/blog/vue-chatui/#classde-liang-chong-xie-fa-dai-shu-zu-he-bu-dai-shu-zu","title":":class的两种写法：带数组和不带数组","children":[{"level":3,"id":"fang-shi-yi-dai-shu-zu-de-xie-fa","permalink":"https://linxz.online/blog/vue-chatui/#fang-shi-yi-dai-shu-zu-de-xie-fa","title":"方式一：带数组的写法","children":[]},{"level":3,"id":"fang-shi-er-bu-dai-shu-zu-de-xie-fa-chun-dui-xiang","permalink":"https://linxz.online/blog/vue-chatui/#fang-shi-er-bu-dai-shu-zu-de-xie-fa-chun-dui-xiang","title":"方式二：不带数组的写法:纯对象","children":[]}]}],
"body":"我想做出两个对话框，一个是用户的询问，一个是机器人的回答。怎么做呢？\n我想到的主要是用flex和flex-row-reverse来控制头像和对话框的方向。\n最简单的方法是做两个组件，一个是用户头像+用户对话框，一个是AI头像+AI对话框。但是，这两个组件实际上是重复的，只是方向不同。\n比如，机器人的头像在左边，用户的头像在右边；对话框紧挨着头像。\n所以，其实我只需要一个组件，通过不同的class来控制方向。\n我做了一个示例代码。注意，以下代码用了Tailwindcss作为样式库。\n&lt;template&gt;\n  &lt;div v-for=&quot;(message, index) in messages&quot; :key=&quot;index&quot;\n    :class=&quot;[&#39;flex&#39;, { &#39;flex-row-reverse&#39;: message.user === &#39;user&#39; }]&quot;&gt;\n    &lt;div class=&#39;min-w-[40px] min-h-[40px]&#39;&gt;\n      &lt;img :src=&quot;message.user === &#39;ai&#39; ? &#39;/robot_ai.png&#39; : &#39;/me.png&#39;&quot; class=&quot;rounded-full&quot; width=40 height=40\n        alt=&quot;avatar&quot; /&gt;\n    &lt;/div&gt;\n    &lt;div\n        :class=&quot;{ &#39;flex flex-col mb-5&#39;: true, &#39;mr-14 ml-3&#39;: message.user === &#39;ai&#39;, &#39;mr-3 ml-14&#39;: message.user === &#39;user&#39; }&quot;&gt;\n      &lt;div\n        :class=&quot;{ &#39;px-4 py-2 rounded-lg shadow-lg md:max-w-fit&#39;: true, &#39;bg-white text-black&#39;: message.user === &#39;ai&#39;, &#39;bg-green-500 text-white&#39;: message.user === &#39;user&#39; }&quot;&gt;\n        {{ message.content }}\n      &lt;/div&gt;\n    &lt;/div&gt;\n  &lt;/div&gt;\n&lt;/template&gt;\n\n代码解释：\n\nv-for循环渲染消息列表。以index为key，遍历messages数组。\n:class动态绑定class。根据message.user的值，决定对话框的方向。如果用户是'ai'，则仅采用flex布局，使对话框从左向右排列；如果用户是'user'，则增加采用flex-row-reverse布局，使对话框从右向左排列。\nimg标签显示头像。根据message.user的值，决定显示机器人头像还是用户头像。\n对话框边距控制，如果是机器人对话框，右边距大，左边距小(mr-14,ml-3)；如果是用户对话框，右边距小，左边距大(mr-3,ml-14)。\n对话框内容。根据message.user的值，决定对话框的样式。机器人对话框是白色背景，黑色文字；用户对话框是绿色背景，白色文字。另外，值为true的class则总是会被应用。\n\n:class的两种写法：带数组和不带数组\n我故意在上面的代码用了两种方式。\n方式一：带数组的写法\n&lt;div :class=&quot;[&#39;总是显示的class&#39;, { &#39;条件class&#39; : 条件 }]&quot;&gt;\n\n方式二：不带数组的写法:纯对象\n&lt;div :class=&quot;{ &#39;总是显示的class&#39;: true, &#39;条件class1&#39; : 条件1,&#39;条件class2&#39;:条件2 }&quot;&gt;\n\n我个人更喜欢第二种写法，因为少了一个数组，看起来更简洁。\n"},{"title":"vue应用如何上线",
"url":"/blog/vue-production/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"an-zhuang-yi-lai-rang-xi-tong-ke-yi-bian-ren-vuewen-jian","permalink":"https://linxz.online/blog/vue-production/#an-zhuang-yi-lai-rang-xi-tong-ke-yi-bian-ren-vuewen-jian","title":"安装依赖，让系统可以辨认.vue文件","children":[]},{"level":2,"id":"pei-zhi-shims-vue-d-tswen-jian","permalink":"https://linxz.online/blog/vue-production/#pei-zhi-shims-vue-d-tswen-jian","title":"配置shims-vue.d.ts文件","children":[]},{"level":2,"id":"gou-jian-ying-yong","permalink":"https://linxz.online/blog/vue-production/#gou-jian-ying-yong","title":"构建应用","children":[]},{"level":2,"id":"ben-di-yu-lan","permalink":"https://linxz.online/blog/vue-production/#ben-di-yu-lan","title":"本地预览","children":[]},{"level":2,"id":"shang-chuan-distmu-lu-dao-fu-wu-qi","permalink":"https://linxz.online/blog/vue-production/#shang-chuan-distmu-lu-dao-fu-wu-qi","title":"上传dist目录到服务器","children":[]},{"level":2,"id":"pei-zhi-nginx","permalink":"https://linxz.online/blog/vue-production/#pei-zhi-nginx","title":"配置nginx","children":[{"level":3,"id":"zhao-dao-nginxde-pei-zhi-wen-jian","permalink":"https://linxz.online/blog/vue-production/#zhao-dao-nginxde-pei-zhi-wen-jian","title":"找到nginx的配置文件","children":[]},{"level":3,"id":"da-kai-pei-zhi-wen-jian","permalink":"https://linxz.online/blog/vue-production/#da-kai-pei-zhi-wen-jian","title":"打开配置文件","children":[]},{"level":3,"id":"zai-httpmo-kuai-zhong-tian-jia-yi-xia-pei-zhi","permalink":"https://linxz.online/blog/vue-production/#zai-httpmo-kuai-zhong-tian-jia-yi-xia-pei-zhi","title":"在http模块中添加以下配置","children":[]},{"level":3,"id":"zhong-qi-nginx","permalink":"https://linxz.online/blog/vue-production/#zhong-qi-nginx","title":"重启nginx","children":[]}]},{"level":2,"id":"can-kao","permalink":"https://linxz.online/blog/vue-production/#can-kao","title":"参考","children":[]}],
"body":"安装依赖，让系统可以辨认.vue文件\nnpm install @vue/runtime-core --save-dev\n\n配置shims-vue.d.ts文件\n在项目的 src 目录下，创建或检查是否有一个 shims-vue.d.ts 文件。确保它包含以下内容：\ndeclare module &#39;*.vue&#39; {\n  import { DefineComponent } from &#39;vue&#39;\n  const component: DefineComponent&lt;{}, {}, any&gt;\n  export default component\n}\n\n这个文件告诉 TypeScript 如何处理 .vue 文件。\n构建应用\nnpm run build\n\n这会生成一个 dist 目录，里面包含了所有的静态资源，可以直接部署到服务器上。\n本地预览\nnpm install -g serve\nserve -s dist\n\n这样，就可以通过 http://localhost:3000/ 访问你的应用了。\n上传dist目录到服务器\n例如：\nscp -r your-path/dist root@IP:/var/www/dist\n\n将本地dist目录上传到服务器的/var/www/dist目录下。\n踩坑注意：请勿上传到root目录下，这样会导致nginx因权限不够无法访问到dist目录。\n配置nginx\n找到nginx的配置文件\nsudo nginx -t\n\n打开配置文件\nvim /etc/nginx/nginx.conf\n\n在http模块中添加以下配置\nserver {\n    listen 80;\n    server_name your-domain.com;\n    root /var/www/dist;\n    index index.html;\n}\n\n重启nginx\nsudo systemctl restart nginx\n\n打开浏览器，输入你的域名，就可以看到你的vue应用了。\n参考\nhttps://cli.vuejs.org/zh/guide/deployment.html#%E4%BD%BF%E7%94%A8-history-pushstate-%E7%9A%84%E8%B7%AF%E7%94%B1\nhttps://blog.csdn.net/weixin_49577940/article/details/118181242\n"},{"title":"zola首页如何展示文章？",
"url":"/blog/zola-index/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"can-kao","permalink":"https://linxz.online/blog/zola-index/#can-kao","title":"参考","children":[]}],
"body":"zola官方给的代码：\n&lt;div class=&quot;posts&quot;&gt;\n    {% for page in paginator.pages %}\n        &lt;article class=&quot;post&quot;&gt;\n            {{ post_macros::title(page=page) }}\n            &lt;div class=&quot;post__summary&quot;&gt;\n                {{ page.summary | safe }}\n            &lt;/div&gt;\n            &lt;div class=&quot;read-more&quot;&gt;\n                &lt;a href=&quot;{{ page.permalink }}&quot;&gt;Read more...&lt;/a&gt;\n            &lt;/div&gt;\n        &lt;/article&gt;\n    {% endfor %}\n&lt;/div&gt;\n&lt;nav class=&quot;pagination&quot;&gt;\n    {% if paginator.previous %}\n        &lt;a class=&quot;previous&quot; href=&quot;{{ paginator.previous }}&quot;&gt;‹ Previous&lt;/a&gt;\n    {% endif %}\n    {% if paginator.next %}\n        &lt;a class=&quot;next&quot; href=&quot;{{ paginator.next }}&quot;&gt;Next ›&lt;/a&gt;\n    {% endif %}\n&lt;/nav&gt;\n\n但是，这个代码有个问题，就是只能读取根目录下的文章。\n内置变量paginator对应的就是content文件夹下的section，对应的模版文档是_index.md文件。\n如果你的文章不在content文件夹下，那么这个代码就不适用了。\n我的代码是在/content/blog文件夹下，所以我需要修改这个代码。写个新的变量，获取新的section，然后遍历这个section。\n{% set blog_pages = get_section(path=&quot;blog/_index.md&quot;) %}\n{% for page in blog_pages.pages %}\n\n以上就是关键的代码。\n完整代码如下：\n{% extends &quot;base.html&quot; %}\n\n{% block content %}\n\n&lt;h1 class=&quot;title&quot; style=&quot;font-family: &#39;Taipei-Sans-TC-Beta-Light-2&#39;;&quot;&gt;\n  一榻梦生琴上月，百花香入案头诗。\n&lt;/h1&gt;\n\n&lt;div class=&quot;posts&quot;&gt;\n  {% set blog_pages = get_section(path=&quot;blog/_index.md&quot;) %}\n  {% for page in blog_pages.pages %}\n      &lt;article class=&quot;post&quot;&gt;\n        &lt;div class=&quot;post-title&quot;&gt;&lt;a href=&quot;{{page.permalink}}&quot; class=&quot;post-title-link&quot;&gt;{{ page.title }}&lt;/a&gt;&lt;/div&gt;\n        &lt;div&gt;\n          {# summary #}\n          {{ page.content | striptags | truncate(length=150) | safe }}\n        &lt;/div&gt;\n        &lt;div class=&quot;read-more&quot;&gt;\n            &lt;a&gt;未完待续...&lt;/a&gt;\n        &lt;/div&gt;\n      &lt;/article&gt;\n  {% endfor %}\n&lt;/div&gt;\n\n{% endblock content %}\n\n参考\nzola论坛\nzola官方文档\n"},{"title":"zola如何采用主题",
"url":"/blog/zola-theme/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"an-zhuang-zhu-ti","permalink":"https://linxz.online/blog/zola-theme/#an-zhuang-zhu-ti","title":"安装主题","children":[]},{"level":2,"id":"shi-yong-zhu-ti","permalink":"https://linxz.online/blog/zola-theme/#shi-yong-zhu-ti","title":"使用主题","children":[]},{"level":2,"id":"shi-yong-zhu-ti-hui-yu-dao-de-wen-ti","permalink":"https://linxz.online/blog/zola-theme/#shi-yong-zhu-ti-hui-yu-dao-de-wen-ti","title":"使用主题会遇到的问题","children":[]},{"level":2,"id":"xia-zai-zhu-ti","permalink":"https://linxz.online/blog/zola-theme/#xia-zai-zhu-ti","title":"下载主题","children":[]}],
"body":"安装主题\ncd themes\ngit clone &lt;theme repository URL&gt;\n\n可以参考官方教程：\nhttps://www.getzola.org/documentation/themes/installing-and-using-themes/\n使用主题\n在config.toml中添加theme字段\n注意：要放在最上方。不要在[extra]下面。\ntheme = &quot;Seje2&quot;\n\n使用主题会遇到的问题\n\n\ncontent通常要复制点东西.\n我实践下来，应该是把themes文件夹里面content文件夹里面的东西复制到项目的content文件夹里面。\n注意：需要参考主题本身的教程。\n\n\n文件通常带有标签tag，要修改config.toml。\nbase_url = &quot;https://example.com&quot;\ntaxonomies = [\n {name = &quot;tags&quot;},\n]\n\n注意taxonomies所在的位置，在base_url的下面。\n\n\n通常要修改config.toml。\n自定义变量要放在[extra]下面：\n[extra]\nseje2_menu_links = [\n{url = &quot;$BASE_URL&quot;, name = &quot;Home&quot;},\n{url = &quot;$BASE_URL/categories&quot;, name = &quot;Categories&quot;},\n{url = &quot;$BASE_URL/tags&quot;, name = &quot;Tags&quot;},\n{url = &quot;https://google.com&quot;, name = &quot;Google&quot;},\n]\n\n\n\n下载主题\nhttps://www.getzola.org/themes/\n官方主题库，里面有主题和安装方法。\n"},{"title":"zola搭建教程-如何开始一个zola项目",
"url":"/blog/zola/",
"date":"2024-09-21",
"headings":[{"level":2,"id":"an-zhuang-zola-brew","permalink":"https://linxz.online/blog/zola/#an-zhuang-zola-brew","title":"安装zola - brew","children":[]},{"level":2,"id":"chuang-jian-yi-ge-zolaxiang-mu","permalink":"https://linxz.online/blog/zola/#chuang-jian-yi-ge-zolaxiang-mu","title":"创建一个zola项目","children":[{"level":3,"id":"guan-yu-xuan-xiang","permalink":"https://linxz.online/blog/zola/#guan-yu-xuan-xiang","title":"关于选项","children":[]}]},{"level":2,"id":"yun-xing-xiang-mu","permalink":"https://linxz.online/blog/zola/#yun-xing-xiang-mu","title":"运行项目","children":[]},{"level":2,"id":"zolade-mu-lu-jie-gou","permalink":"https://linxz.online/blog/zola/#zolade-mu-lu-jie-gou","title":"zola的目录结构","children":[{"level":3,"id":"templates","permalink":"https://linxz.online/blog/zola/#templates","title":"templates","children":[{"level":4,"id":"base-html","permalink":"https://linxz.online/blog/zola/#base-html","title":"base.html","children":[]},{"level":4,"id":"index-html","permalink":"https://linxz.online/blog/zola/#index-html","title":"index.html","children":[]},{"level":4,"id":"section-html","permalink":"https://linxz.online/blog/zola/#section-html","title":"section.html","children":[]},{"level":4,"id":"page-html","permalink":"https://linxz.online/blog/zola/#page-html","title":"page.html","children":[]}]},{"level":3,"id":"content","permalink":"https://linxz.online/blog/zola/#content","title":"content","children":[{"level":4,"id":"index-md","permalink":"https://linxz.online/blog/zola/#index-md","title":"_index.md","children":[]},{"level":4,"id":"nei-rong-md","permalink":"https://linxz.online/blog/zola/#nei-rong-md","title":"内容.md","children":[]}]}]},{"level":2,"id":"zolazhu-yao-kuang-jia","permalink":"https://linxz.online/blog/zola/#zolazhu-yao-kuang-jia","title":"zola主要框架","children":[]},{"level":1,"id":"zolaru-he-lian-jie-dao-nei-bu-wen-zhang","permalink":"https://linxz.online/blog/zola/#zolaru-he-lian-jie-dao-nei-bu-wen-zhang","title":"zola如何链接到内部文章","children":[{"level":2,"id":"can-kao-jiao-cheng","permalink":"https://linxz.online/blog/zola/#can-kao-jiao-cheng","title":"参考教程","children":[]}]}],
"body":"zola是一种ssg技术，即static site generator （静态网站生成器）\n安装zola - brew\nbrew install zola\n\n创建一个zola项目\nzola init myblog\n\n完成几个选项，即可开始项目。\n关于选项\n关于url的配置，可以选择默认，之后再在config.toml中配置\n如果不想用增强版CSS，可以不选Sass\n后两项是语法高亮和搜索索引。\n运行项目\nzola serve\n\n然后你就可以在浏览器输入http://127.0.0.1:1111来访问刚才生成的站点，可以看到Welcome to Zola\n注意：\nzola serve只是为了便于本地管理站点，真实的站点还是需要用专业的web server来提供服务的。\n因为zola生成的是一个纯静态网站，所以部署时可选的方案很多，最简单的就是用nginx来配置一个静态网站，把content目录复制到线上即可。\nzola的目录结构\ntemplates\n负责所有页面输出的模版。\nbase.html\n所有的元数据，比如标签、&lt;head&gt;这些\n&lt;!DOCTYPE html&gt;\n\n&lt;html lang=&quot;en&quot;&gt;\n\n&lt;head&gt;\n  &lt;meta charset=&quot;utf-8&quot;&gt;\n  &lt;title&gt;MyBlog&lt;/title&gt;\n&lt;/head&gt;\n\n&lt;body&gt;\n  &lt;section class=&quot;section&quot;&gt;\n    &lt;div class=&quot;container&quot;&gt;\n      {% block content %} {% endblock %}\n    &lt;/div&gt;\n  &lt;/section&gt;\n&lt;/body&gt;\n\nindex.html\n网站首页内容和跳转标题。\n\n{% extends &quot;base.html&quot; %}\n\n{% block content %}\n\n&lt;h1 class=&quot;title&quot;&gt;\n  This is my blog made with Zola.\n&lt;/h1&gt;\n{# 避免被zola解析，get_url写多了\\ #}\n&lt;p&gt;Click &lt;a href=&quot;{{ get\\_url(path=&#39;@/blog/_index.md&#39;) }}&quot;&gt;here&lt;/a&gt; to see my posts.&lt;/p&gt;\n{% endblock content %}\n\nsection.html\n博客的目录（菜单）\n{% extends &quot;base.html&quot; %}\n\n{% block content %}\n\n&lt;h1 class=&quot;title&quot;&gt;\n  {{ section.title }}\n&lt;/h1&gt;\n&lt;ul&gt;\n  &lt;!-- If you are using pagination, section.pages will be empty. You need to use the paginator object --&gt;    {% for page in section.pages %}\n  &lt;li&gt;&lt;a href=&quot;{{ page.permalink | safe }}&quot;&gt;{{ page.title }}&lt;/a&gt;&lt;/li&gt;\n  {% endfor %}\n&lt;/ul&gt;\n{% endblock content %}\n\npage.html\n文章的主题内容\n{% extends &quot;base.html&quot; %}\n\n{% block content %}\n\n&lt;nav&gt;\n  &lt;a href=&quot;/&quot;&gt;首页&lt;/a&gt;\n  &lt;a href=&quot;/blog/&quot;&gt;目录页&lt;/a&gt;\n&lt;/nav&gt;\n&lt;h1 class=&quot;title&quot;&gt;\n  {{ page.title }}\n&lt;/h1&gt;\n&lt;p class=&quot;subtitle&quot;&gt;&lt;strong&gt;{{ page.date }}&lt;/strong&gt;&lt;/p&gt;\n{{ page.content | safe }}\n{% endblock content %}\n\ncontent\ncontent-blog里面的文件夹\n使用的是toml语法，包裹在.md文件里面。+++后面说明的是配置。\n_index.md\n定义了博客的目录。\n只要文件夹里面有_index.md，就会成为一个section。\n+++\ntitle = &quot;List of blog posts&quot;\nsort_by = &quot;date&quot;\ntemplate = &quot;section.html&quot;\npage_template = &quot;page.html&quot;\n+++\n\n内容.md\n博客的具体内容。\n+++\ntitle = &quot;My first post&quot;\ndate = 2019-11-27\n+++\n# 奇怪杂谈\n\n昨天的运动。\n\nzola主要框架\n大括号加百分号 {% %} 是 rust-Tera模版（类python-Jinja2 模板）引擎中的语法，用于在 HTML 文件中嵌入动态内容。\nzola如何链接到内部文章\n如果需要链接到其他文章，@代表是content目录，在下面有个文件夹是blog，之后再输入要链接的.md文件全称即可。\n[我要链接到zola文章](@/blog/zola.md)\n\n参考教程\n"},{"title":"vue中的computed属性有什么用？",
"url":"/blog/vue-computed/",
"date":"2024-09-20",
"headings":[{"level":2,"id":"computedshu-xing-de-yong-tu","permalink":"https://linxz.online/blog/vue-computed/#computedshu-xing-de-yong-tu","title":"computed属性的用途","children":[{"level":3,"id":"yi-huan-cun-ji-suan-jie-guo-bi-mian-zhong-fu-ji-suan","permalink":"https://linxz.online/blog/vue-computed/#yi-huan-cun-ji-suan-jie-guo-bi-mian-zhong-fu-ji-suan","title":"一、缓存计算结果，避免重复计算。","children":[]},{"level":3,"id":"er-duo-ge-xiang-ying-shi-shu-ju-de-ji-suan","permalink":"https://linxz.online/blog/vue-computed/#er-duo-ge-xiang-ying-shi-shu-ju-de-ji-suan","title":"二、多个响应式数据的计算","children":[]}]}],
"body":"computed属性有两个特点：\n\n响应式：当依赖的数据发生变化时，computed属性会自动更新。\n缓存：只有依赖的数据发生变化时，computed属性才会重新计算。\n\ncomputed属性的用途\n一、缓存计算结果，避免重复计算。\n比如缓存日期格式化的结果：\nconst date = ref(new Date())\nconst formattedDate = computed(() =&gt; {\n  return date.value.toLocaleDateString()\n})\n\n这样一来，只有date发生变化时，formattedDate才会重新计算。类似于React中的useMemo。\n直观来说，你在template模版中调用formattedDate三次，它只会调用一次函数，与不使用computed时需要调用三次相比，大大提高了性能。\n二、多个响应式数据的计算\nconst a = ref(1)\nconst b = ref(2)\nconst sum = computed(() =&gt; {\n  return a.value + b.value\n})\n\n这样一来，只要a或b发生变化，sum就会自动更新。\n如果你不用computed(),而是直接采用sum = a + b，那么只会在第一次渲染时计算一次，之后不会再更新。\n当然，你也可以把a+b放在花括号中，在template标签里面呈现，而不是用sum。但这也是computed的优点，即把模版层臃肿的表达式变简单。\n"},{"title":"如何用手机预览vue开发的应用？",
"url":"/blog/vue-mobile-preview/",
"date":"2024-09-20",
"headings":[{"level":2,"id":"cha-kan-ben-di-ju-yu-wang-de-ipdi-zhi","permalink":"https://linxz.online/blog/vue-mobile-preview/#cha-kan-ben-di-ju-yu-wang-de-ipdi-zhi","title":"查看本地局域网的ip地址","children":[]},{"level":2,"id":"xiu-gai-vite-config-js","permalink":"https://linxz.online/blog/vue-mobile-preview/#xiu-gai-vite-config-js","title":"修改vite.config.js","children":[]},{"level":2,"id":"da-kai-shou-ji-liu-lan-qi","permalink":"https://linxz.online/blog/vue-mobile-preview/#da-kai-shou-ji-liu-lan-qi","title":"打开手机浏览器","children":[]}],
"body":"首先，手机和电脑要在同一个局域网内。\n查看本地局域网的ip地址\nmac下，wifi设置-详细信息-复制IP地址\n修改vite.config.js\n因为默认情况下，vite只允许本地访问即127.0.0.1，所以需要修改配置文件，允许外部所有设备访问，即0。0.0.0。\nexport default defineConfig({\n  。。。,\n  server: {\n    host: &#39;0.0.0.0&#39;, // 允许外部设备（如手机）访问\n    port: 5173, // 你使用的端口\n    open: true // 启动时自动打开浏览器\n  }\n})\n\n打开手机浏览器\n输入http://你的ip地址:5173，即可查看。\n"},{"title":"如何在vue中使用tailwindcss",
"url":"/blog/vue-tailwindcss/",
"date":"2024-09-20",
"headings":[{"level":2,"id":"kai-qi-yi-ge-vuexiang-mu","permalink":"https://linxz.online/blog/vue-tailwindcss/#kai-qi-yi-ge-vuexiang-mu","title":"开启一个vue项目","children":[]},{"level":2,"id":"an-zhuang-tailwindcss","permalink":"https://linxz.online/blog/vue-tailwindcss/#an-zhuang-tailwindcss","title":"安装tailwindcss","children":[]},{"level":2,"id":"pei-zhi-tailwindcss","permalink":"https://linxz.online/blog/vue-tailwindcss/#pei-zhi-tailwindcss","title":"配置tailwindcss","children":[]},{"level":2,"id":"shi-yong-tailwindcss","permalink":"https://linxz.online/blog/vue-tailwindcss/#shi-yong-tailwindcss","title":"使用tailwindcss","children":[]},{"level":2,"id":"can-kao-jiao-cheng","permalink":"https://linxz.online/blog/vue-tailwindcss/#can-kao-jiao-cheng","title":"参考教程","children":[]},{"level":2,"id":"shi-li-githubxiang-mu","permalink":"https://linxz.online/blog/vue-tailwindcss/#shi-li-githubxiang-mu","title":"示例github项目","children":[]}],
"body":"开启一个vue项目\nnpm create vue@latest\n\n安装tailwindcss\n首先，使用 NPM 安装 Tailwind 以及其它依赖项:\nnpm install -D tailwindcss@latest postcss@latest autoprefixer@latest\n\n安装后，使用 npx 命令生成 tailwind.config.js 和 postcss.config.js 配置文件：\nnpx tailwindcss init -p\n\n配置tailwindcss\n接下来，先配置 Tailwind 来移除生产环境下没有使用到的样式声明：\n// tailwind.config.js\n/** @type {import(&#39;tailwindcss&#39;).Config} */\nexport default {\n  content: [&#39;./index.html&#39;, &#39;./src/**/*.{vue,js,ts,jsx,tsx}&#39;],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n\n创建 ./src/index.css 文件并填充以下内容：\n/* ./src/index.css */\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n最后，将 ./src/index.css 文件导入到 ./src/main.js或main.ts 文件中：\n// ./src/main.js\nimport { createApp } from &#39;vue&#39;\nimport App from &#39;./App.vue&#39;\nimport &#39;./index.css&#39;\n\ncreateApp(App).mount(&#39;#app&#39;)\n\n使用tailwindcss\n&lt;template&gt; \n  &lt;h1 class=&quot;text-3xl font-bold underline&quot;&gt; Hello world! &lt;/h1&gt; \n&lt;/template&gt;\n\n参考教程\nhttps://blog.in-x.cc/tech/frontend/tailwindcss-vue3-vite\nhttps://juejin.cn/post/7270534122609819660\n示例github项目\nhttps://github.com/linxz-coder/vue-tailwindcss\n"},{"title":"如果使用wordpress的api来自动上传文章？",
"url":"/blog/wp-api/",
"date":"2024-09-20",
"headings":[{"level":2,"id":"qian-yan","permalink":"https://linxz.online/blog/wp-api/#qian-yan","title":"前言","children":[]},{"level":2,"id":"xin-zeng-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#xin-zeng-wen-zhang","title":"新增文章","children":[]},{"level":2,"id":"huo-qu-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#huo-qu-wen-zhang","title":"获取文章","children":[]},{"level":2,"id":"geng-xin-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#geng-xin-wen-zhang","title":"更新文章","children":[]},{"level":2,"id":"shan-chu-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#shan-chu-wen-zhang","title":"删除文章","children":[]},{"level":2,"id":"guan-yu-ti-tu","permalink":"https://linxz.online/blog/wp-api/#guan-yu-ti-tu","title":"关于题图","children":[]},{"level":2,"id":"guan-yu-tu-pian","permalink":"https://linxz.online/blog/wp-api/#guan-yu-tu-pian","title":"关于图片","children":[]},{"level":2,"id":"qi-ta-apizhi-shi","permalink":"https://linxz.online/blog/wp-api/#qi-ta-apizhi-shi","title":"其他api知识","children":[{"level":3,"id":"cha-kan-geng-duo-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#cha-kan-geng-duo-wen-zhang","title":"查看更多文章","children":[]},{"level":3,"id":"zhi-yao-qiu-fan-hui-mou-xie-zi-duan-fields","permalink":"https://linxz.online/blog/wp-api/#zhi-yao-qiu-fan-hui-mou-xie-zi-duan-fields","title":"只要求返回某些字段?_fields=","children":[]},{"level":3,"id":"wen-zhang-pai-xu","permalink":"https://linxz.online/blog/wp-api/#wen-zhang-pai-xu","title":"文章排序","children":[]},{"level":3,"id":"sou-suo-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#sou-suo-wen-zhang","title":"搜索文章","children":[]},{"level":3,"id":"huo-qu-fen-lei-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#huo-qu-fen-lei-wen-zhang","title":"获取分类文章","children":[]},{"level":3,"id":"huo-qu-biao-qian-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#huo-qu-biao-qian-wen-zhang","title":"获取标签文章","children":[]}]},{"level":2,"id":"can-kao-wen-zhang","permalink":"https://linxz.online/blog/wp-api/#can-kao-wen-zhang","title":"参考文章","children":[]},{"level":2,"id":"can-kao-shi-pin","permalink":"https://linxz.online/blog/wp-api/#can-kao-shi-pin","title":"参考视频","children":[]}],
"body":"前言\n通常，我们在wordpress网站上写文章，都是在后台写的。\n但是，后台系统因为网络等原因不能满足我的需要，总的来说就是不够快不够方便。（程序员的偏见-后台不是给我们准备的！）\n如果我们想要在本地写文章，然后上传到wordpress网站上，就需要用到wordpress的api了。\nwordpress的api是基于restful的，所以使用起来非常方便。\n以下是用curl命令来操作wordpress的api的例子，我一般是用postman这个app，也非常方便。\n新增文章\ncurl -X POST https://your-wordpress.com/wp-json/wp/v2/posts \\\n--user admin:&quot;your-password&quot; \\\n-H &quot;Content-Type: application/json&quot; \\\n-d &#39;{\n  &quot;title&quot;: &quot;#新帖标题&quot;,\n  &quot;content&quot;: &quot;这是新帖的内容。&quot;,\n  &quot;status&quot;: &quot;publish&quot;\n}&#39;\n\n注意，密码不是wordpress的后台密码，是应用程序密码。\n获取密码：\n在wordpress后台，打开’用户’-‘个人资料’，拉到最下面，输入密码名称（随便取），点击’新增的应用程序密码’即可。\n获取文章\ncurl -X GET https://your-wordpress.com/wp-json/wp/v2/posts\n\n更新文章\ncurl -X POST https://your-wordpress.com/wp-json/wp/v2/posts/id \\\n--user admin:&quot;your-password&quot; \\\n-H &quot;Content-Type: application/json&quot; \\\n-d &#39;{\n  &quot;title&quot;: &quot;#新帖标题&quot;,\n  &quot;content&quot;: &quot;这是新帖的内容。&quot;,\n  &quot;status&quot;: &quot;publish&quot;,\n  &quot;featured_media&quot;: 1125\n}&#39;\n\n关键是要找出文章的id，可以在获取文章的时候找到。\n删除文章\ncurl -X DELETE https://your-wordpress.com/wp-json/wp/v2/posts/id\n\n同样，关键是要找出文章的id，可以在获取文章的时候找到。\n关于题图\n也可以说是特色图片，这个是文章的一个属性“feature_media&quot;，可以用来显示在文章列表中。我在【更新文章】中已经提到了, 1125是图片的id。你以往上传的图片都会在wordpress的媒体库中找到,有一个唯一的id。\n关于图片\n由于我用的自动化工具Publish Markdown，它会自动上传图片，所以我就没有研究。\n不过，我发现所有wordpress的图片都是在https://your-wordpress.com/wp-content/uploads文件夹下面，所以应该可以用curl命令上传图片。思路是先upload到对应月份的文件夹，然后在扒下来，按照这个格式放到文章里面。\n看所有的wordpress图片资源。\ncurl -X GET https://your-wordpress.com/wp-json/wp/v2/media\n\n其他api知识\n查看更多文章\n默认GET方法只会返回10个文章，如果想要更多，可以用per_page参数。\ncurl -X GET https://your-wordpress.com/wp-json/wp/v2/posts?per_page=100\n\n这样就会返回100个文章。\n只要求返回某些字段?_fields=\ncurl -X GET https://your-wordpress.com/wp-json/wp/v2/posts?_fields=authod.id,excerpt,title,link\n\n这样就只会返回这些字段，特别简洁好用。\n文章排序\ncurl -X GET https://your-wordpress.com/wp-json/wp/v2/posts?orderby=title&amp;order=asc\n\n默认是按照时间排序的，如果想要按照标题排序，就可以这样。\n搜索文章\ncurl -X GET https://your-wordpress.com/wp-json/wp/v2/posts?search=关键词\n\n获取分类文章\ncurl -X GET https://your-wordpress.com/wp-json/wp/v2/posts?categories=1\n\n这样就会返回分类为1的文章。如果分类是0就是未分类。\n获取标签文章\ncurl -X GET https://your-wordpress.com/wp-json/wp/v2/posts?tags=1\n\n这样就会返回标签为1的文章。\n参考文章\n这是官方的文档：\nhttps://developer.wordpress.org/rest-api/reference/posts/\n参考视频\nhttps://www.youtube.com/watch?v=jo1wphDCu3k\nhttps://www.youtube.com/watch?v=XeNm_gxGuY8\n"},{"title":"本地Markdown文档上传wordpress网站",
"url":"/blog/wp-md/",
"date":"2024-09-20",
"headings":[{"level":2,"id":"qian-yan","permalink":"https://linxz.online/blog/wp-md/#qian-yan","title":"前言","children":[]},{"level":2,"id":"an-zhuang-bu-zou","permalink":"https://linxz.online/blog/wp-md/#an-zhuang-bu-zou","title":"安装步骤","children":[{"level":3,"id":"xia-zai-ruan-jian","permalink":"https://linxz.online/blog/wp-md/#xia-zai-ruan-jian","title":"下载软件","children":[]},{"level":3,"id":"she-zhi-ruan-jian","permalink":"https://linxz.online/blog/wp-md/#she-zhi-ruan-jian","title":"设置软件","children":[{"level":4,"id":"wordpressduan","permalink":"https://linxz.online/blog/wp-md/#wordpressduan","title":"wordpress端：","children":[]},{"level":4,"id":"ruan-jian-duan","permalink":"https://linxz.online/blog/wp-md/#ruan-jian-duan","title":"软件端：","children":[]}]},{"level":3,"id":"xin-jian-wen-zhang","permalink":"https://linxz.online/blog/wp-md/#xin-jian-wen-zhang","title":"新建文章","children":[]},{"level":3,"id":"shang-chuan-wen-zhang","permalink":"https://linxz.online/blog/wp-md/#shang-chuan-wen-zhang","title":"上传文章","children":[]},{"level":3,"id":"yi-dian-wen-ti","permalink":"https://linxz.online/blog/wp-md/#yi-dian-wen-ti","title":"一点问题","children":[]},{"level":3,"id":"zui-hou","permalink":"https://linxz.online/blog/wp-md/#zui-hou","title":"最后","children":[]}]}],
"body":"前言\n需要用的软件叫做Publish Markdown，启用xmlrpc方式。所以需要验证一下。\n输入以下网址：\nyour-wordpress.com/xmlrpc.php\n结果要出现：\nXML-RPC server accepts POST requests only.\n\n安装步骤\n下载软件\nhttps://github.com/jzj1993/PublishMarkdown/releases\n软件图片：\n\n设置软件\n输入网址：\nyour-wordpress.com/xmlrpc.php\n另外，你的用户名和密码。\n注意，密码不是wordpress的后台密码，是应用程序密码。\n获取密码：\n在wordpress后台，打开’用户’-‘个人资料’，拉到最下面，输入密码名称（随便取），点击’新增的应用程序密码’即可。\nwordpress端：\n\n软件端：\n\n新建文章\n可以开始写文章啦。\n记得加一些注释在前面，注释使用”—“来前后框住的。\n比如，我的这个文章注释是这样的:\n---\ntitle: 本地Markdown文档上传wordpress网站\nurl: wp-markdown\ncategory:\n- 后端学习\ntags:\n- wordpress\n- markdown\n---\n\n之后再接着写其他内容。\n注释怎么写，可以看看”帮助“-”示例文档“。\n其他东西，就是markdown的语法了。\n\n这里的url建议填上。因为这个软件是靠url来区分是不是同样一篇文档的。如果涉及修改文档，就要写一样的url。而这个url，不是一般的网址形式，就是一个单词，自己写就行。之后不要重复。\n\n上传文章\n上传前注意保存command + s （我是mac党，windows是ctrl）\n上传快捷键command + p，也可以手动选择”文件“-”发布“。\n里面都是简单的选项，选择完成就发布成功啦。\n一点问题\n我作者软件仓库里面看到issue有人提出，是不是没办法上传“特色图片”（题图），作者也没有回应。\n这个功能，估计需要动手能力强的wper来出力了，或者我有空研究一下。待续。\n最后\n我也收集了除这个软件外的解决方案，或许未来会动手实现一下，立个flag。\nhttps://blog.csdn.net/IAMoldpan/article/details/83317463\n"},{"title":"指针pointer的本质——一个快捷方式",
"url":"/blog/pointer-basic/",
"date":"2024-05-05",
"headings":[],
"body":"最近在学C语言，发现“指针”真的很重要。\n弄懂指针，才能清楚内存控制，才能弄懂链表。它是所有知识的线索。\n指针的本质是指向地址的地址。是一个快捷方式。\n指针是为了方便和灵活操作内存。\n\n比如0x1004的位置，存放了0x1000的位置。\n通过*p指针，能够找到0x1000的值。\n因此p=0x1000, *p=4\naddress of p是0x1004，value of p是0x1000。\naddress of *p是0x1000，value of *p是4。\n"},{"title":"python - __all__在python里面代表”导出限制“？",
"url":"/blog/python-all/",
"date":"2023-11-16",
"headings":[],
"body":"之所以有这个疑问，是因为碰到这个代码：\n__all__ = [&#39;ParseError&#39;, &#39;parser_factory&#39;]\n\n这行代码是用于定义一个模块（module）中应该被导出（export）的内容，也就是”导出限制“。\n确保只有ParseError和parser_factory这两个名称在模块被其他地方导入时被包含，当使用from module import *这样的语句导入时，只有在__all__列表中的名称会被导入到当前的命名空间。\n"},{"title":"什么是hasattr？",
"url":"/blog/python-hasattr/",
"date":"2023-11-16",
"headings":[],
"body":"这是在python的class自定义的方法，指·、has attribute。\n举例：\nclass MyObject:\n    attribute = &quot;value&quot;\n\nobj = MyObject()\n\n# 检查 obj 是否有名为 &#39;attribute&#39; 的属性\nprint(hasattr(obj, &#39;attribute&#39;))  # 输出 True\n\n# 检查 obj 是否有名为 &#39;other_attribute&#39; 的属性\nprint(hasattr(obj, &#39;other_attribute&#39;))  # 输出 False\n\n在这个例子中，MyObject 类定义了一个名为 attribute 的属性。所以，当我们用 hasattr 检查 obj 对象是否有这个属性时，它返回 True。而当我们检查不存在的属性 other_attribute 时，它返回 False。\n"},{"title":"python - `__`init`__`.py是什么文件？",
"url":"/blog/python-init/",
"date":"2023-11-16",
"headings":[],
"body":"__init__.py是python文件包（文件夹）的初始化文件，在import后就直接运行。\n举个例子：\n假设你有一个名为 my_package 的文件夹，其结构如下所示：\nmy_package/\n|-- __init__.py\n|-- module1.py\n|-- module2.py\n\n在 __init__.py 中，你定义了一个函数：\n# my_package/__init__.py\n\ndef hello_world():\n    print(&quot;Hello, world from my_package!&quot;)\n\n当你导入 my_package 时，你可以直接调用 hello_world() 函数，无需通过模块名引用：\nimport my_package\n\nmy_package.hello_world()  # 输出: Hello, world from my_package!\n\n如果引用时想省略前缀my_package，可以用from…import…：\nfrom my_package import hello_world\n\nhello_world()  # 直接调用函数，无需前缀\n\n"},{"title":"python - class ParseError(Exception)提高处理错误的可读性、扩展性和精确性？",
"url":"/blog/python-parseerror/",
"date":"2023-11-16",
"headings":[],
"body":"今天看到一个exceptions.py的文件，里面只有短短两行字：\nclass ParseError(Exception):\n    pass\n\n从字面理解，我知道是处理错误的，但是不知道为什么这么写。\nParseError 是继承了一个Python内置的处理错误的class，即Exception，pass的意思是继承里面的所有功能，不更改。\n使用方法如下：\nif some_condition:\n    raise ParseError(&quot;There was an error parsing the data&quot;)\n\n我就很好奇，为什么不直接用Exception就算了？于是问了一下GPT，得到以下的答复：\n\n可读性和清晰性：通过定义一个特定名称的异常（如 ParseError），你可以使代码的意图更加清晰。当其他开发者阅读或维护这段代码时，他们可以立即知道这个异常是与解析错误相关的，而不是一个更一般的错误。这增加了代码的可读性。\n错误分类：在大型应用或库中，可能需要处理许多不同类型的错误。通过创建特定的异常类，你可以更有效地组织和分类这些错误。例如，ParseError 可以专门用于处理解析相关的问题，而其他异常类可以用于不同的错误情况。\n未来的扩展性：虽然目前 ParseError 只是简单地使用了 pass，但这种设计允许你在未来轻松地扩展这个类。如果以后需要添加额外的日志记录、错误信息格式化或其他特定于解析错误的功能，你可以直接在 ParseError 类中添加这些功能，而不必修改使用了 Exception 的其他代码部分。\n异常处理的精确性：在异常处理时，你可能希望根据异常的具体类型来采取不同的应对措施。通过定义 ParseError，你可以在 try-except 块中精确地捕获和处理这种特定类型的异常，而不是捕获所有类型的 Exception。\n\ntry:\n    # code that might raise a ParseError\nexcept ParseError:\n    # handle parse error specifically\n\n"},{"title":"python - def __repr__(self)和def __eq__(self, other)是什么？",
"url":"/blog/python-repr/",
"date":"2023-11-16",
"headings":[],
"body":"这两个东西都是在类（class）内使用的。\nrepr代表representation，输入repr(obj)，会显示指定字符串：\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy import Column, Integer, String\n\nBase = declarative_base()\n\nclass User(Base):\n    __tablename__ = &#39;customer&#39;\n\n    id = Column(Integer, primary_key=True)\n    name = Column(String)\n    fullname = Column(String)\n    nickname = Column(String)\n\n    def __repr__(self):\n        return f&quot;&lt;User(name=&#39;{self.name}&#39;, fullname=&#39;{self.fullname}&#39;, nickname=&#39;{self.nickname}&#39;)&gt;&quot;\n\n# 创建表\nBase.metadata.create_all(engine)\n\nrepr使用：\nnew_cu=User(name=&#39;小中&#39;, fullname=&#39;linxz&#39;, nickname=&#39;xz&#39;)\nrepr(new_cu)\n\nrepr输出：\n&lt;User(name=&#39;小中&#39;, fullname=&#39;linxz&#39;, nickname=&#39;xz&#39;)&gt;\n\neq代表equal，强制使两个同参数的对象等同。\ndef __eq__(self, other):\n    return repr(self) == repr(other)\n\n例子：\n# 创建两个具有相同属性的 Summary 实例\nsummary1 = Summary(&quot;http://example.com&quot;, &quot;This is a summary.&quot;)\nsummary2 = Summary(&quot;http://example.com&quot;, &quot;This is a summary.&quot;)\n\n# 创建一个具有不同属性的 Summary 实例\nsummary3 = Summary(&quot;http://different.com&quot;, &quot;A different summary.&quot;)\n\n# 比较\nprint(summary1 == summary2)  # 输出 True，因为它们的字符串表示相同\nprint(summary1 == summary3)  # 输出 False，因为它们的字符串表示不同\n\n解释，原本实例summary1和summary2是不等同的，因为虽然是同样的对象obj，但是是不同的实例。但是因为在class内用了–eq–，现在就等同了。\n"},{"title":"python - 如何使用Python的枚举Enum()？",
"url":"/blog/python-enum/",
"date":"2023-11-15",
"headings":[],
"body":"枚举（Enum），是一种特殊的类。在枚举中，每个成员都有一个名称（类似key）和一个值（类似value).\n可以理解是一个字典dict。\n注意：枚举不是必要的数据类型，只是为了避免程序员打错字，比如green会打成gerrn这样的错误，才推出的，完全可以不用。\n如何使用：\nfrom enum import Enum\n\nclass Color(Enum):\n    RED = &quot;red&quot;\n    GREEN = &quot;green&quot;\n    BLUE = &quot;blue&quot;\n\n# 使用枚举\ncolor = Color.RED\n\n# 比较时直接与字符串进行比较\nif color == Color.RED:\n    print(&quot;The color is red.&quot;)\n\n"},{"title":"数据库 - 如何使用 SQLalchemy？",
"url":"/blog/sqlalchemy/",
"date":"2023-11-15",
"headings":[{"level":1,"id":"an-zhuang-sqlalchemy","permalink":"https://linxz.online/blog/sqlalchemy/#an-zhuang-sqlalchemy","title":"安装sqlalchemy：","children":[]},{"level":1,"id":"jian-li-yin-qing","permalink":"https://linxz.online/blog/sqlalchemy/#jian-li-yin-qing","title":"建立引擎：","children":[]},{"level":1,"id":"jian-li-biao-ge","permalink":"https://linxz.online/blog/sqlalchemy/#jian-li-biao-ge","title":"建立表格：","children":[]},{"level":1,"id":"cha-ru-shu-ju","permalink":"https://linxz.online/blog/sqlalchemy/#cha-ru-shu-ju","title":"插入数据：","children":[]}],
"body":"使用SQLalchemy可以在本地简单架设数据库，使用SQLite来建设。\n实现代码如下：\n安装sqlalchemy：\npip install sqlalchemy\n\n建立引擎：\nfrom sqlalchemy import create_engine\nimport os\n\n# 获取当前用户的主目录\nhome = os.path.expanduser(&#39;~&#39;)\nprint(home)\n\n# 设置数据库文件的路径\ndb_path = os.path.join(home, &#39;Downloads&#39;, &#39;sql_alchemy.db&#39;)\nprint(db_path)\n\n# 创建连接到 SQLite 数据库文件的引擎\nengine = create_engine(f&#39;sqlite:///{db_path}&#39;, echo=True)\n\n建立表格：\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy import Column, Integer, String\n\nBase = declarative_base()\n\nclass User(Base):\n    __tablename__ = &#39;customer&#39;\n\n    id = Column(Integer, primary_key=True)\n    name = Column(String)\n    fullname = Column(String)\n    nickname = Column(String)\n\n    def __repr__(self):\n        return f&quot;&lt;User(name=&#39;{self.name}&#39;, fullname=&#39;{self.fullname}&#39;, nickname=&#39;{self.nickname}&#39;)&gt;&quot;\n\n# 创建表\nBase.metadata.create_all(engine)\n\n插入数据：\nfrom sqlalchemy.orm import sessionmaker\n\nSession = sessionmaker(bind=engine)\nsession = Session()\n\nnew_customer = User(name=&#39;张三&#39;, fullname=&#39;Zhang San&#39;, nickname=&#39;zhang&#39;)\nsession.add(new_customer)\nsession.commit()\n\n我使用的是mac，可以用DB Browser for SQLite来查看数据。\n"},{"title":"Python：如何使用BeautifulSoup的selecter?",
"url":"/blog/python-beautifulsoup/",
"date":"2023-11-14",
"headings":[],
"body":"网络爬虫中，BeautifulSoup是一个非常有用的库，可以帮助你获取HTML内容，并帮你精准定位想要的元素。\n使用方法如下：\nfrom bs4 import BeautifulSoup\nimport requests\n\n# 假设这是我们要解析的网页URL\nurl = &#39;http://example.com&#39;\n\n# 使用requests库获取网页内容\nresponse = requests.get(url)\ncontent = response.content #或者.text\n\n# 使用BeautifulSoup和lxml解析器解析HTML内容\nsoup = BeautifulSoup(content, &#39;lxml&#39;)\n\n# 查找所有的&lt;a&gt;标签\nlinks = soup.find_all(&#39;a&#39;)\n\n# 打印每个链接的href属性\nfor link in links:\n    print(link.get(&#39;href&#39;))\n\nselect 方法的基本语法：\nsoup.select(&quot;selector&quot;)\n\n常用的CSS选择器：\n\n元素选择器：\n例如：soup.select('p') 会选择所有的（段落）元素。\n类选择器：\n使用点.表示。例如：soup.select('.myclass') 会选择所有具有class=&quot;myclass&quot;的元素。\nID选择器：\n使用井号#表示。例如：soup.select('#myid') 会选择具有id=&quot;myid&quot;的元素。\n属性选择器：\n使用方括号[]。例如：soup.select('a[href]') 会选择所有带有href属性的a标签。\n后代选择器：\n使用空格分隔。例如：soup.select('div span') 会选择所有位于div标签内部的span标签。\n子元素选择器：\n使用&gt;。例如：soup.select('ul &gt; li') 会选择所有直接位于ul标签下的li标签。\n组合选择器：\n使用逗号,分隔。例如：soup.select('div.myclass, span.otherclass') 会选择所有class=&quot;myclass&quot;的div标签和class=&quot;otherclass&quot;的span标签。\n\n例子分析：\ndom = BS(content, features=&quot;lxml&quot;)\ndom.select(&#39;table tr table tr.athing&#39;)):\n\n在CSS选择器语法中，table tr table tr.athing 代表了一系列嵌套规则，用于选择HTML元素。让我们分解这个选择器：\n\n\ntable：\n这代表选择所有的table元素。\n\n\ntable tr：\n这里的空格是一个后代选择器。它意味着选择所有位于table元素内部的tr元素（即表格的行）。\n\n\n再次的 table tr：\n这一部分再次应用同样的规则，表示选择位于tr元素内部的另一个table元素的所有tr行。这表明我们正在处理嵌套的表格结构。\n\n\n.athing：\n这是一个类选择器，表示选择具有类名athing的元素。\n\n\n将这些组合起来，table tr table tr.athing 的意思是：在一个table内部的tr元素内部，找到另一个table，然后在这个内部table中找到所有具有类名athing的tr行。这通常用于处理复杂且嵌套的表格结构，在数据抓取和网页分析时特别有用。\n"},{"title":"Python如何使用enumerate()",
"url":"/blog/python-enumerate/",
"date":"2023-11-14",
"headings":[],
"body":"enumerate() 用来找出数列[]里面的index和值。\n假设我们有一个水果列表，我们想要打印出每种水果及其在列表中的位置（索引）。下面是如何使用enumerate来实现这一点的例子：\nfruits = [&#39;苹果&#39;, &#39;香蕉&#39;, &#39;橘子&#39;, &#39;葡萄&#39;]\n\nfor index, fruit in enumerate(fruits):\n    print(f&quot;水果 {fruit} 的位置是 {index}&quot;)\n\n这段代码会遍历fruits列表，enumerate函数会生成每个元素的索引（index）和值（fruit）。然后，我们打印出每种水果及其索引。输出结果会是这样的：\n水果 苹果 的位置是 0\n水果 香蕉 的位置是 1\n水果 橘子 的位置是 2\n水果 葡萄 的位置是 3\n\n"},{"title":"Python：如何使用urlsplit分解url？",
"url":"/blog/python-urlsplit/",
"date":"2023-11-14",
"headings":[],
"body":"urlsplit是个分解url的工具，下面介绍使用方法：\nfrom urllib.parse import urljoin, urlsplit\nurl = &quot;www.fly.faa.gov/adv/adv_spt.jsp?hi#no&quot;\nus = urlsplit(url.lower())\nprint(&#39;us&#39;, us)\nprint(&#39;hostname&#39;, us.hostname)\n\n输出结果：\nus SplitResult(scheme=&#39;https&#39;, netloc=&#39;www.fly.faa.gov&#39;, path=&#39;/adv/adv_spt.jsp&#39;, query=&#39;hi&#39;, fragment=&#39;no&#39;)\n\nhostname www.fly.faa.gov\n\n"},{"title":"如何用python获取hacker news内容？",
"url":"/blog/hack-news-python/",
"date":"2023-11-13",
"headings":[],
"body":"网络上有很多获取api的方法，在这里我介绍更“原生态”的方法，直接用GET方法。\n代码如下：\nimport requests\nsession = requests.Session()\n\ndef get_and_save(url, filename):\n    # 获取网页内容\n    response = session.get(url)\n    text = response.text\n\n    # 将内容写入文件\n    with open(filename, &#39;w&#39;, encoding=&#39;utf-8&#39;) as file:\n        file.write(text)\n\n    return text\n\n# 使用函数并指定文件名\nget_and_save(&#39;https://news.ycombinator.com/&#39;, &#39;hacker_news.html&#39;)\n\n该方法会把内容保存成hacker_news.html，直接用浏览器打开就行。\n之所以用requests.Session()，而不是直接requests.get()，原因在于：\n使用 requests.get() 和使用 requests.Session().get() 之间的主要区别在于会话管理和状态保持。\n\n简单请求 - requests.get():\n\n当你使用 requests.get() 发送请求时，每次调用都是独立的。这意味着每次请求都会建立新的连接，且不会在请求之间保存状态（如cookies、headers等）。\n这适用于简单的、一次性的请求，尤其是在不需要在多个请求之间维持状态时。\n\n会话管理 - requests.Session().get():\n\n使用 requests.Session() 创建的会话对象允许你在多个请求之间保持某些状态。这意味着它可以保持 cookies，并且能够为每个随后的请求保留某些参数（如 headers）。\n会话还可以优化性能。当你使用相同的 Session 对象发出多个请求到同一服务器时，底层的 TCP 连接会被重用，而不是每次请求都重新建立，这可以减少延迟。\n在需要登录认证的场景中特别有用，你可以首先发送登录请求，会话将保持登录状态，使得后续的请求能够访问需要认证的页面或功能。\n会话还可以自定义更多的持久化行为，例如错误重试策略、连接池大小等。\n\n总结来说，如果你只是需要发送一两个独立的请求，requests.get() 就足够了。但是，如果你要处理多个相关联的请求，尤其是当这些请求之间需要保持 cookies、headers 或其他状态时，使用 requests.Session() 会更加高效和方便。\n\nhacker news本质上是用表格的形式来储存网页，非常直观。示例代码如下：\n&lt;table&gt;代表表格，&lt;tr&gt;代表row，&lt;td&gt;代表内容table-data：\n&lt;html lang=&quot;en&quot; op=&quot;news&quot;&gt;\n\n&lt;head&gt;\n    &lt;meta name=&quot;referrer&quot; content=&quot;origin&quot;&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;\n    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;news.css?zIjpThVbr6MtVJZBrLeK&quot;&gt;\n    &lt;link rel=&quot;shortcut icon&quot; href=&quot;favicon.ico&quot;&gt;\n    &lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;RSS&quot; href=&quot;rss&quot;&gt;\n    &lt;title&gt;Hacker News&lt;/title&gt;\n&lt;/head&gt;\n\n&lt;body&gt;\n    &lt;center&gt;\n        &lt;table id=&quot;hnmain&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;85%&quot; bgcolor=&quot;#f6f6ef&quot;&gt;\n            &lt;tr&gt;\n                &lt;td bgcolor=&quot;#ff6600&quot;&gt;\n                    &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot; style=&quot;padding:2px&quot;&gt;\n                        &lt;tr&gt;\n                            &lt;td style=&quot;width:18px;padding-right:4px&quot;&gt;&lt;a href=&quot;https://news.ycombinator.com&quot;&gt;&lt;img\n                                        src=&quot;y18.svg&quot; width=&quot;18&quot; height=&quot;18&quot;\n                                        style=&quot;border:1px white solid; display:block&quot;&gt;&lt;/a&gt;&lt;/td&gt;\n                            &lt;td style=&quot;line-height:12pt; height:10px;&quot;&gt;&lt;span class=&quot;pagetop&quot;&gt;&lt;b class=&quot;hnname&quot;&gt;&lt;a\n                                            href=&quot;news&quot;&gt;Hacker News&lt;/a&gt;&lt;/b&gt;\n                                    &lt;a href=&quot;newest&quot;&gt;new&lt;/a&gt; | &lt;a href=&quot;front&quot;&gt;past&lt;/a&gt; | &lt;a\n                                        href=&quot;newcomments&quot;&gt;comments&lt;/a&gt; | &lt;a href=&quot;ask&quot;&gt;ask&lt;/a&gt; | &lt;a\n                                        href=&quot;show&quot;&gt;show&lt;/a&gt; | &lt;a href=&quot;jobs&quot;&gt;jobs&lt;/a&gt; | &lt;a href=&quot;submit&quot;&gt;submit&lt;/a&gt;\n                                &lt;/span&gt;&lt;/td&gt;\n                            &lt;td style=&quot;text-align:right;padding-right:4px;&quot;&gt;&lt;span class=&quot;pagetop&quot;&gt;\n                                    &lt;a href=&quot;login?goto=news&quot;&gt;login&lt;/a&gt;\n                                &lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                    &lt;/table&gt;\n                &lt;/td&gt;\n            &lt;/tr&gt;\n            &lt;tr id=&quot;pagespace&quot; title=&quot;&quot; style=&quot;height:10px&quot;&gt;&lt;/tr&gt;\n            &lt;tr&gt;\n                &lt;td&gt;\n                    &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38249214&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;1.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38249214&#39; href=&#39;vote?id=38249214&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.canva.dev/blog/engineering/ship-shape/&quot; rel=&quot;noreferrer&quot;&gt;Ship\n                                        Shape&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=canva.dev&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;canva.dev&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38249214&quot;&gt;37 points&lt;/span&gt; by &lt;a href=&quot;user?id=SerCe&quot;\n                                        class=&quot;hnuser&quot;&gt;SerCe&lt;/a&gt; &lt;span class=&quot;age&quot; title=&quot;2023-11-13T11:51:00&quot;&gt;&lt;a\n                                            href=&quot;item?id=38249214&quot;&gt;47 minutes ago&lt;/a&gt;&lt;/span&gt; &lt;span\n                                        id=&quot;unv_38249214&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38249214&amp;goto=news&quot;&gt;hide&lt;/a&gt; |\n                                    &lt;a href=&quot;item?id=38249214&quot;&gt;1 comment&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38247964&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;2.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38247964&#39; href=&#39;vote?id=38247964&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://virtuallyfun.com/2023/11/12/dont-waste-money-on-a-math-coprocessor-they-said/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Don&#39;t waste money on a math coprocessor they said&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=virtuallyfun.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;virtuallyfun.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38247964&quot;&gt;131 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=jandeboevrie&quot; class=&quot;hnuser&quot;&gt;jandeboevrie&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T07:51:00&quot;&gt;&lt;a href=&quot;item?id=38247964&quot;&gt;4 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38247964&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38247964&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38247964&quot;&gt;42 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38248532&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;3.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38248532&#39; href=&#39;vote?id=38248532&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://web.williams.edu/Mathematics/lg5/Rota.pdf&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Lessons I wish I had learned before teaching differential\n                                        equations [pdf] (1997)&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=williams.edu&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;williams.edu&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38248532&quot;&gt;84 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=itronitron&quot; class=&quot;hnuser&quot;&gt;itronitron&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T09:36:16&quot;&gt;&lt;a href=&quot;item?id=38248532&quot;&gt;3 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38248532&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38248532&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38248532&quot;&gt;52 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38230532&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;4.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38230532&#39; href=&#39;vote?id=38230532&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://gmkeros.wordpress.com/2011/09/02/terry-pratchett-and-the-maggi-soup-adverts/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Terry Pratchett and the Maggi Soup Adverts (2011)&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=gmkeros.wordpress.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;gmkeros.wordpress.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38230532&quot;&gt;57 points&lt;/span&gt; by &lt;a href=&quot;user?id=tosh&quot;\n                                        class=&quot;hnuser&quot;&gt;tosh&lt;/a&gt; &lt;span class=&quot;age&quot; title=&quot;2023-11-11T14:26:58&quot;&gt;&lt;a\n                                            href=&quot;item?id=38230532&quot;&gt;4 hours ago&lt;/a&gt;&lt;/span&gt; &lt;span\n                                        id=&quot;unv_38230532&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38230532&amp;goto=news&quot;&gt;hide&lt;/a&gt; |\n                                    &lt;a href=&quot;item?id=38230532&quot;&gt;20 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38228310&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;5.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38228310&#39; href=&#39;vote?id=38228310&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.thestack.technology/rfc9420-ietf-mls-standard/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;RFC 9420 – A Messaging Layer Security Overview&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=thestack.technology&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;thestack.technology&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38228310&quot;&gt;52 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=todsacerdoti&quot; class=&quot;hnuser&quot;&gt;todsacerdoti&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-11T07:34:13&quot;&gt;&lt;a href=&quot;item?id=38228310&quot;&gt;6 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38228310&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38228310&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38228310&quot;&gt;2 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38245935&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;6.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38245935&#39; href=&#39;vote?id=38245935&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a href=&quot;https://www.troyhunt.com/beg-bounties/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Beg Bounties (2021)&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=troyhunt.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;troyhunt.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38245935&quot;&gt;217 points&lt;/span&gt; by &lt;a href=&quot;user?id=eiiot&quot;\n                                        class=&quot;hnuser&quot;&gt;eiiot&lt;/a&gt; &lt;span class=&quot;age&quot; title=&quot;2023-11-13T01:39:37&quot;&gt;&lt;a\n                                            href=&quot;item?id=38245935&quot;&gt;11 hours ago&lt;/a&gt;&lt;/span&gt; &lt;span\n                                        id=&quot;unv_38245935&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38245935&amp;goto=news&quot;&gt;hide&lt;/a&gt; |\n                                    &lt;a href=&quot;item?id=38245935&quot;&gt;99 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38236128&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;7.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38236128&#39; href=&#39;vote?id=38236128&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.youtube.com/watch?v=eQOOx4mmY6I&quot;&gt;Hacking a 25 Year Old Game to\n                                        Make It Work &lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=youtube.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;youtube.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38236128&quot;&gt;100 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=gus_massa&quot; class=&quot;hnuser&quot;&gt;gus_massa&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-12T00:45:29&quot;&gt;&lt;a href=&quot;item?id=38236128&quot;&gt;7 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38236128&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38236128&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38236128&quot;&gt;7 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38230008&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;8.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38230008&#39; href=&#39;vote?id=38230008&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://ammarmian.substack.com/p/122820-get-offended-more&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Get Offended More (2020)&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=ammarmian.substack.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;ammarmian.substack.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38230008&quot;&gt;15 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=lpcrealmadrid&quot; class=&quot;hnuser&quot;&gt;lpcrealmadrid&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-11T13:09:56&quot;&gt;&lt;a href=&quot;item?id=38230008&quot;&gt;3 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38230008&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38230008&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38230008&quot;&gt;12 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38248900&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;9.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38248900&#39; href=&#39;vote?id=38248900&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.loro.dev/blog/loro-now-open-source&quot;\n                                        rel=&quot;nofollow noreferrer&quot;&gt;Loro: Reimagine state management with CRDTs&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=loro.dev&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;loro.dev&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38248900&quot;&gt;12 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=czx111331&quot; class=&quot;hnuser&quot;&gt;czx111331&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T10:51:20&quot;&gt;&lt;a href=&quot;item?id=38248900&quot;&gt;1 hour ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38248900&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38248900&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38248900&quot;&gt;1 comment&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38230161&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;10.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38230161&#39; href=&#39;vote?id=38230161&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.phoronix.com/news/Linux-6.7-RISC-V&quot; rel=&quot;noreferrer&quot;&gt;RISC-V\n                                        with Linux 6.7 Gains Optimized TLB Flushing, Software Shadow Call\n                                        Stacks&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=phoronix.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;phoronix.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38230161&quot;&gt;106 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=rbanffy&quot; class=&quot;hnuser&quot;&gt;rbanffy&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-11T13:33:59&quot;&gt;&lt;a href=&quot;item?id=38230161&quot;&gt;10 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38230161&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38230161&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38230161&quot;&gt;2 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38247423&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;11.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38247423&#39; href=&#39;vote?id=38247423&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://journals.sagepub.com/doi/full/10.1177/0003122420912941&quot;\n                                        rel=&quot;noreferrer&quot;&gt;From Aristocratic to Ordinary: Shifting Modes of Elite\n                                        Distinction (2020)&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=sagepub.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;sagepub.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38247423&quot;&gt;43 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=benbreen&quot; class=&quot;hnuser&quot;&gt;benbreen&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T05:54:01&quot;&gt;&lt;a href=&quot;item?id=38247423&quot;&gt;6 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38247423&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38247423&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38247423&quot;&gt;39 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38231160&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;12.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38231160&#39; href=&#39;vote?id=38231160&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://staysaasy.com/startups/2023/11/10/imprecise-asks.html&quot;\n                                        rel=&quot;nofollow noreferrer&quot;&gt;Your small imprecise ask is a big waste of their\n                                        time&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=staysaasy.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;staysaasy.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38231160&quot;&gt;6 points&lt;/span&gt; by &lt;a href=&quot;user?id=zdw&quot;\n                                        class=&quot;hnuser&quot;&gt;zdw&lt;/a&gt; &lt;span class=&quot;age&quot; title=&quot;2023-11-11T15:30:16&quot;&gt;&lt;a\n                                            href=&quot;item?id=38231160&quot;&gt;2 hours ago&lt;/a&gt;&lt;/span&gt; &lt;span\n                                        id=&quot;unv_38231160&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38231160&amp;goto=news&quot;&gt;hide&lt;/a&gt; |\n                                    &lt;a href=&quot;item?id=38231160&quot;&gt;discuss&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38249316&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;13.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38249316&#39; href=&#39;vote?id=38249316&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://hyperallergic.com/855658/pistachio-billionaires-lynda-stewart-resnick-accused-of-artwashing-california-water-crisis/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Pistachio Billionaires Accused of Artwashing California&#39;s\n                                        Water Crisis&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=hyperallergic.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;hyperallergic.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38249316&quot;&gt;7 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=Geekette&quot; class=&quot;hnuser&quot;&gt;Geekette&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T12:10:07&quot;&gt;&lt;a href=&quot;item?id=38249316&quot;&gt;39 minutes ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38249316&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38249316&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38249316&quot;&gt;discuss&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38245198&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;14.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38245198&#39; href=&#39;vote?id=38245198&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.davidrevoy.com/article1002/how-a-kernel-developer-made-my-styluses-work-again&quot;\n                                        rel=&quot;noreferrer&quot;&gt;A kernel developer made my styluses work again on newer\n                                        kernels&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=davidrevoy.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;davidrevoy.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38245198&quot;&gt;124 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=sohkamyung&quot; class=&quot;hnuser&quot;&gt;sohkamyung&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-12T23:26:31&quot;&gt;&lt;a href=&quot;item?id=38245198&quot;&gt;12 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38245198&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38245198&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38245198&quot;&gt;4 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38246668&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;15.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38246668&#39; href=&#39;vote?id=38246668&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.secondstate.io/articles/fast-llm-inference/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Run LLMs on my own Mac fast and efficient Only 2 MBs&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=secondstate.io&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;secondstate.io&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38246668&quot;&gt;271 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=3Sophons&quot; class=&quot;hnuser&quot;&gt;3Sophons&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T03:48:44&quot;&gt;&lt;a href=&quot;item?id=38246668&quot;&gt;9 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38246668&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38246668&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38246668&quot;&gt;78 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38247339&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;16.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38247339&#39; href=&#39;vote?id=38247339&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://herbsutter.com/2023/11/11/trip-report-autumn-iso-c-standards-meeting-kona-hi-usa/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Trip Autumn ISO C++ standards meeting&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=herbsutter.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;herbsutter.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38247339&quot;&gt;28 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=signa11&quot; class=&quot;hnuser&quot;&gt;signa11&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T05:41:01&quot;&gt;&lt;a href=&quot;item?id=38247339&quot;&gt;7 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38247339&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38247339&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38247339&quot;&gt;3 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38248421&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;17.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38248421&#39; href=&#39;vote?id=38248421&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.youtube.com/watch?v=HDKUEXBF3B4&quot;&gt;Ruby on Rails: The\n                                        Documentary &lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=youtube.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;youtube.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38248421&quot;&gt;104 points&lt;/span&gt; by &lt;a href=&quot;user?id=541&quot;\n                                        class=&quot;hnuser&quot;&gt;541&lt;/a&gt; &lt;span class=&quot;age&quot; title=&quot;2023-11-13T09:18:21&quot;&gt;&lt;a\n                                            href=&quot;item?id=38248421&quot;&gt;3 hours ago&lt;/a&gt;&lt;/span&gt; &lt;span\n                                        id=&quot;unv_38248421&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38248421&amp;goto=news&quot;&gt;hide&lt;/a&gt; |\n                                    &lt;a href=&quot;item?id=38248421&quot;&gt;6 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38228320&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;18.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38228320&#39; href=&#39;vote?id=38228320&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.nature.com/articles/s41586-023-06647-8&quot; rel=&quot;noreferrer&quot;&gt;Role\n                                        play with large language models&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=nature.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;nature.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38228320&quot;&gt;47 points&lt;/span&gt; by &lt;a href=&quot;user?id=m_kos&quot;\n                                        class=&quot;hnuser&quot;&gt;m_kos&lt;/a&gt; &lt;span class=&quot;age&quot; title=&quot;2023-11-11T07:37:03&quot;&gt;&lt;a\n                                            href=&quot;item?id=38228320&quot;&gt;8 hours ago&lt;/a&gt;&lt;/span&gt; &lt;span\n                                        id=&quot;unv_38228320&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38228320&amp;goto=news&quot;&gt;hide&lt;/a&gt; |\n                                    &lt;a href=&quot;item?id=38228320&quot;&gt;34 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38236198&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;19.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38236198&#39; href=&#39;vote?id=38236198&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://github.com/Dicklesworthstone/bulk_transcribe_youtube_videos_from_playlist&quot;&gt;Show\n                                        HN: Bulk Creation of Transcripts from YouTube Playlists with Whisper&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=github.com/dicklesworthstone&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;github.com/dicklesworthstone&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38236198&quot;&gt;59 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=eigenvalue&quot; class=&quot;hnuser&quot;&gt;eigenvalue&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-12T00:57:16&quot;&gt;&lt;a href=&quot;item?id=38236198&quot;&gt;10 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38236198&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38236198&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38236198&quot;&gt;24 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38230176&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;20.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38230176&#39; href=&#39;vote?id=38230176&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://cod.pressbooks.pub/communication/chapter/13-3-small-group-dynamics/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Small Group Dynamics&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=pressbooks.pub&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;pressbooks.pub&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38230176&quot;&gt;14 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=yamrzou&quot; class=&quot;hnuser&quot;&gt;yamrzou&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-11T13:36:00&quot;&gt;&lt;a href=&quot;item?id=38230176&quot;&gt;5 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38230176&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38230176&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38230176&quot;&gt;4 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38243949&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;21.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38243949&#39; href=&#39;vote?id=38243949&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a href=&quot;https://github.com/Jcparkyn/dpoint&quot;&gt;Show\n                                        HN: Open-source digital stylus with six degrees of freedom&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=github.com/jcparkyn&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;github.com/jcparkyn&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38243949&quot;&gt;492 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=jcparkyn&quot; class=&quot;hnuser&quot;&gt;jcparkyn&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-12T20:48:30&quot;&gt;&lt;a href=&quot;item?id=38243949&quot;&gt;16 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38243949&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38243949&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38243949&quot;&gt;88 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38246082&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;22.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38246082&#39; href=&#39;vote?id=38246082&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://staff.science.uva.nl/a.j.p.heck/Courses/Mastercourse2005/tutorial.pdf&quot;\n                                        rel=&quot;noreferrer&quot;&gt;Learn PostScript by Doing (2005) [pdf]&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=uva.nl&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;uva.nl&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38246082&quot;&gt;45 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=todsacerdoti&quot; class=&quot;hnuser&quot;&gt;todsacerdoti&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T02:04:12&quot;&gt;&lt;a href=&quot;item?id=38246082&quot;&gt;10 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38246082&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38246082&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38246082&quot;&gt;4 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38249202&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;23.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38249202&#39; href=&#39;vote?id=38249202&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.tomshardware.com/news/youtube-may-face-criminal-complaint-for-adblock-detecting&quot;\n                                        rel=&quot;noreferrer&quot;&gt;YouTube May Face Criminal Complaints in EU for Using Ad-Block\n                                        Detection Scripts&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=tomshardware.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;tomshardware.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38249202&quot;&gt;11 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=giuliomagnifico&quot; class=&quot;hnuser&quot;&gt;giuliomagnifico&lt;/a&gt; &lt;span\n                                        class=&quot;age&quot; title=&quot;2023-11-13T11:49:17&quot;&gt;&lt;a href=&quot;item?id=38249202&quot;&gt;1 hour\n                                            ago&lt;/a&gt;&lt;/span&gt; &lt;span id=&quot;unv_38249202&quot;&gt;&lt;/span&gt; | &lt;a\n                                        href=&quot;hide?id=38249202&amp;goto=news&quot;&gt;hide&lt;/a&gt; | &lt;a\n                                        href=&quot;item?id=38249202&quot;&gt;1 comment&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38246032&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;24.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38246032&#39; href=&#39;vote?id=38246032&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://spectrum.ieee.org/generative-ai-training&quot; rel=&quot;noreferrer&quot;&gt;MLPerf\n                                        training tests put Nvidia ahead, Intel close, and Google well behind&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=ieee.org&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;ieee.org&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38246032&quot;&gt;69 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=vissidarte_choi&quot; class=&quot;hnuser&quot;&gt;vissidarte_choi&lt;/a&gt; &lt;span\n                                        class=&quot;age&quot; title=&quot;2023-11-13T01:57:35&quot;&gt;&lt;a href=&quot;item?id=38246032&quot;&gt;10 hours\n                                            ago&lt;/a&gt;&lt;/span&gt; &lt;span id=&quot;unv_38246032&quot;&gt;&lt;/span&gt; | &lt;a\n                                        href=&quot;hide?id=38246032&amp;goto=news&quot;&gt;hide&lt;/a&gt; | &lt;a\n                                        href=&quot;item?id=38246032&quot;&gt;30 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38247767&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;25.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38247767&#39; href=&#39;vote?id=38247767&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://semiengineering.com/sram-in-ai-the-future-of-memory/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;SRAM in AI: The Future of Memory&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=semiengineering.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;semiengineering.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38247767&quot;&gt;19 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=PaulHoule&quot; class=&quot;hnuser&quot;&gt;PaulHoule&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-13T07:11:55&quot;&gt;&lt;a href=&quot;item?id=38247767&quot;&gt;5 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38247767&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38247767&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38247767&quot;&gt;2 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38241674&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;26.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38241674&#39; href=&#39;vote?id=38241674&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://lcamtuf.substack.com/p/the-evolution-of-expert-communities&quot;\n                                        rel=&quot;noreferrer&quot;&gt;The evolution of expert communities&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=lcamtuf.substack.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;lcamtuf.substack.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38241674&quot;&gt;106 points&lt;/span&gt; by &lt;a href=&quot;user?id=zdw&quot;\n                                        class=&quot;hnuser&quot;&gt;zdw&lt;/a&gt; &lt;span class=&quot;age&quot; title=&quot;2023-11-12T16:36:00&quot;&gt;&lt;a\n                                            href=&quot;item?id=38241674&quot;&gt;15 hours ago&lt;/a&gt;&lt;/span&gt; &lt;span\n                                        id=&quot;unv_38241674&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38241674&amp;goto=news&quot;&gt;hide&lt;/a&gt; |\n                                    &lt;a href=&quot;item?id=38241674&quot;&gt;43 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38244927&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;27.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38244927&#39; href=&#39;vote?id=38244927&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.computer.org/csdl/magazine/mi/2021/06/09623432/1yJTxgRWQgg&quot;\n                                        rel=&quot;noreferrer&quot;&gt;The Apollo Guidance Computer&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt;\n                                        (&lt;a href=&quot;from?site=computer.org&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;computer.org&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38244927&quot;&gt;93 points&lt;/span&gt; by &lt;a href=&quot;user?id=sam345&quot;\n                                        class=&quot;hnuser&quot;&gt;sam345&lt;/a&gt; &lt;span class=&quot;age&quot; title=&quot;2023-11-12T22:49:33&quot;&gt;&lt;a\n                                            href=&quot;item?id=38244927&quot;&gt;12 hours ago&lt;/a&gt;&lt;/span&gt; &lt;span\n                                        id=&quot;unv_38244927&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38244927&amp;goto=news&quot;&gt;hide&lt;/a&gt; |\n                                    &lt;a href=&quot;item?id=38244927&quot;&gt;34 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38242946&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;28.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38242946&#39; href=&#39;vote?id=38242946&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://grossack.site/2023/11/08/37-median.html&quot; rel=&quot;noreferrer&quot;&gt;37, the\n                                        median value for the second prime factor of an integer&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=grossack.site&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;grossack.site&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38242946&quot;&gt;405 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=sacrosanct&quot; class=&quot;hnuser&quot;&gt;sacrosanct&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-12T18:45:48&quot;&gt;&lt;a href=&quot;item?id=38242946&quot;&gt;18 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38242946&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38242946&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38242946&quot;&gt;183 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38245240&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;29.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38245240&#39; href=&#39;vote?id=38245240&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a href=&quot;https://fabiensanglard.net/blog/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;0XReasons to Write and Publish&lt;/a&gt;&lt;span\n                                        class=&quot;sitebit comhead&quot;&gt; (&lt;a href=&quot;from?site=fabiensanglard.net&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;fabiensanglard.net&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38245240&quot;&gt;39 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=signa11&quot; class=&quot;hnuser&quot;&gt;signa11&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-12T23:33:31&quot;&gt;&lt;a href=&quot;item?id=38245240&quot;&gt;13 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38245240&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38245240&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38245240&quot;&gt;10 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&#39;athing&#39; id=&#39;38230141&#39;&gt;\n                            &lt;td align=&quot;right&quot; valign=&quot;top&quot; class=&quot;title&quot;&gt;&lt;span class=&quot;rank&quot;&gt;30.&lt;/span&gt;&lt;/td&gt;\n                            &lt;td valign=&quot;top&quot; class=&quot;votelinks&quot;&gt;\n                                &lt;center&gt;&lt;a id=&#39;up_38230141&#39; href=&#39;vote?id=38230141&amp;how=up&amp;goto=news&#39;&gt;\n                                        &lt;div class=&#39;votearrow&#39; title=&#39;upvote&#39;&gt;&lt;/div&gt;\n                                    &lt;/a&gt;&lt;/center&gt;\n                            &lt;/td&gt;\n                            &lt;td class=&quot;title&quot;&gt;&lt;span class=&quot;titleline&quot;&gt;&lt;a\n                                        href=&quot;https://www.nextplatform.com/2023/11/08/you-can-load-up-on-cheap-cores-with-updated-milan-epycs/&quot;\n                                        rel=&quot;noreferrer&quot;&gt;You Can Load Up on Cheap Cores with Updated Milan\n                                        Epycs&lt;/a&gt;&lt;span class=&quot;sitebit comhead&quot;&gt; (&lt;a\n                                            href=&quot;from?site=nextplatform.com&quot;&gt;&lt;span\n                                                class=&quot;sitestr&quot;&gt;nextplatform.com&lt;/span&gt;&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&quot;subtext&quot;&gt;&lt;span class=&quot;subline&quot;&gt;\n                                    &lt;span class=&quot;score&quot; id=&quot;score_38230141&quot;&gt;51 points&lt;/span&gt; by &lt;a\n                                        href=&quot;user?id=rbanffy&quot; class=&quot;hnuser&quot;&gt;rbanffy&lt;/a&gt; &lt;span class=&quot;age&quot;\n                                        title=&quot;2023-11-11T13:31:43&quot;&gt;&lt;a href=&quot;item?id=38230141&quot;&gt;13 hours ago&lt;/a&gt;&lt;/span&gt;\n                                    &lt;span id=&quot;unv_38230141&quot;&gt;&lt;/span&gt; | &lt;a href=&quot;hide?id=38230141&amp;goto=news&quot;&gt;hide&lt;/a&gt;\n                                    | &lt;a href=&quot;item?id=38230141&quot;&gt;19 comments&lt;/a&gt; &lt;/span&gt;\n                            &lt;/td&gt;\n                        &lt;/tr&gt;\n                        &lt;tr class=&quot;spacer&quot; style=&quot;height:5px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr class=&quot;morespace&quot; style=&quot;height:10px&quot;&gt;&lt;/tr&gt;\n                        &lt;tr&gt;\n                            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;\n                            &lt;td class=&#39;title&#39;&gt;&lt;a href=&#39;?p=2&#39; class=&#39;morelink&#39; rel=&#39;next&#39;&gt;More&lt;/a&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                    &lt;/table&gt;\n                &lt;/td&gt;\n            &lt;/tr&gt;\n            &lt;tr&gt;\n                &lt;td&gt;&lt;img src=&quot;s.gif&quot; height=&quot;10&quot; width=&quot;0&quot;&gt;\n                    &lt;table width=&quot;100%&quot; cellspacing=&quot;0&quot; cellpadding=&quot;1&quot;&gt;\n                        &lt;tr&gt;\n                            &lt;td bgcolor=&quot;#ff6600&quot;&gt;&lt;/td&gt;\n                        &lt;/tr&gt;\n                    &lt;/table&gt;&lt;br&gt;\n                    &lt;center&gt;&lt;span class=&quot;yclinks&quot;&gt;&lt;a href=&quot;newsguidelines.html&quot;&gt;Guidelines&lt;/a&gt; | &lt;a\n                                href=&quot;newsfaq.html&quot;&gt;FAQ&lt;/a&gt; | &lt;a href=&quot;lists&quot;&gt;Lists&lt;/a&gt; | &lt;a\n                                href=&quot;https://github.com/HackerNews/API&quot;&gt;API&lt;/a&gt; | &lt;a href=&quot;security.html&quot;&gt;Security&lt;/a&gt;\n                            | &lt;a href=&quot;https://www.ycombinator.com/legal/&quot;&gt;Legal&lt;/a&gt; | &lt;a\n                                href=&quot;https://www.ycombinator.com/apply/&quot;&gt;Apply to YC&lt;/a&gt; | &lt;a\n                                href=&quot;mailto:hn@ycombinator.com&quot;&gt;Contact&lt;/a&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;\n                        &lt;form method=&quot;get&quot; action=&quot;//hn.algolia.com/&quot;&gt;Search: &lt;input type=&quot;text&quot; name=&quot;q&quot; size=&quot;17&quot;\n                                autocorrect=&quot;off&quot; spellcheck=&quot;false&quot; autocapitalize=&quot;off&quot; autocomplete=&quot;false&quot;&gt;&lt;/form&gt;\n                    &lt;/center&gt;\n                &lt;/td&gt;\n            &lt;/tr&gt;\n        &lt;/table&gt;\n    &lt;/center&gt;\n&lt;/body&gt;\n&lt;script type=&#39;text/javascript&#39; src=&#39;hn.js?zIjpThVbr6MtVJZBrLeK&#39;&gt;&lt;/script&gt;\n\n&lt;/html&gt;\n\n"},{"title":"如何使用jinja2生成html页面？-Python",
"url":"/blog/jinja2-html/",
"date":"2023-11-13",
"headings":[],
"body":"Jinja2 是一个流行的模板引擎，用于 Python。Environment 对象在 Jinja2 中起着核心作用，它是模板系统的中心，负责存储配置参数和全局对象，并用于从文件系统或其他位置加载模板。\n首先，安装Jinja2：\npip install Jinja2\n\n创建一个app.py文件：\nfrom jinja2 import Environment, FileSystemLoader\n\n#用浏览器打开\nimport webbrowser\nimport os\n\n# 设置模板文件的目录\nenv = Environment(loader=FileSystemLoader(&#39;templates&#39;))\n\ntemplate = env.get_template(&#39;hello.html&#39;)\n\ndata = {&#39;name&#39;: &#39;Linxz&#39;}\nprint(template.render(data))\n\n# 生成html文件\nhtml_content = template.render(data)\n\n# 保存到一个临时文件\nwith open(&#39;output.html&#39;, &#39;w&#39;) as file:\n    file.write(html_content)\n\n# 在浏览器中打开\nwebbrowser.open(&#39;file://&#39; + os.path.realpath(&#39;output.html&#39;))\n\n以上代码创建了一个环境env，并在templates文件夹中使用hello.html作为模版。\nhello.html的代码如下：\n&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;title&gt;Example&lt;/title&gt;\n&lt;/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;Hello {{ name }}!&lt;/h1&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n\n输出会自动将{{name}}替换成自定义字符”Linx”。\n完成后使用python app.py即可以用浏览器打开网页。\n"},{"title":"如何要求用户在terminal输入python脚本参数？",
"url":"/blog/python-args/",
"date":"2023-11-13",
"headings":[],
"body":"比如：\npython run.py hello\n\n需要用到argparse库，run.py的代码如下：\nimport argparse\n\ndef main():\n    parser = argparse.ArgumentParser(description=&quot;请输入hello或者yes&quot;)\n    parser.add_argument(&quot;command&quot;, choices=[&#39;hello&#39;, &#39;yes&#39;], \n                        help=&quot;Command to execute: &#39;hello&#39; or &#39;yes&#39;&quot;)\n    \n    args = parser.parse_args()\n\n    if args.command == &#39;hello&#39;:\n        print(&quot;hello world&quot;)\n    elif args.command == &#39;yes&#39;:\n        print(&quot;yes man&quot;)\n\nif __name__ == &quot;__main__&quot;:\n    main()\n\n以上代码指用户可以输入hello或者yes获取不同的输出。\n以上功能可以用sys模块来完成，但是sys实现起来比较功能比较少，一般很少用，仅供参考：\nimport sys\n\ndef main():\n    if len(sys.argv) ! = 2:\n        print(&quot;Usage: python fun.py [hello/yes]&quot;)\n        sys.exit(1)\n\n    command = sys.argv[1]\n\n    if command == &#39;hello&#39;:\n        print(&quot;hello world&quot;)\n    elif command == &#39;yes&#39;:\n        print(&quot;yes man&quot;)\n    else:\n        print(&quot;Invalid command. Use &#39;hello&#39; or &#39;yes&#39;.&quot;)\n\nif __name__ == &quot;__main__&quot;:\n    main()\n\n"},{"title":"如何在python文件加log？",
"url":"/blog/python-log/",
"date":"2023-11-13",
"headings":[],
"body":"运用logging模块：\nimport logging\nfrom datetime import datetime\n\n # 设置日志记录器，才会在控制台显示，否则只显示WARNING以上级别的日志\n    logging.basicConfig(level=logging.INFO, format=&#39;%(message)s&#39;)\n    # %（message)s 代表日志本身\n    # 输出更具体的时间：logging.basicConfig(level=logging.INFO, format=&#39;%(asctime)s - %(levelname)s - %(message)s&#39;)\n   \n    # 获取日志记录器\n    logger = logging.getLogger(__name__)\n    \n    # 记录消息\n    logger.info(f&#39;程序运行于: {datetime.now()}&#39;)\n\n以上代码会在控制台输出INFO级别的日志：\nopenai/argparse  &gt; python run.py hello\n\nhello world\n\n程序运行于: 2023-11-13 18:07:56.924422\n\n"},{"title":"如何托管mysql至阿里云RDS？",
"url":"/blog/aliyun-rds-migration/",
"date":"2023-10-23",
"headings":[{"level":1,"id":"wei-zi-jian-mysqlchuang-jian-zhang-hao-bing-she-zhi-binlog","permalink":"https://linxz.online/blog/aliyun-rds-migration/#wei-zi-jian-mysqlchuang-jian-zhang-hao-bing-she-zhi-binlog","title":"为自建MySQL创建账号并设置binlog","children":[{"level":2,"id":"xin-jian-yi-ge-yong-yi-shu-ju-qian-yi-de-zhang-hao","permalink":"https://linxz.online/blog/aliyun-rds-migration/#xin-jian-yi-ge-yong-yi-shu-ju-qian-yi-de-zhang-hao","title":"新建一个用以数据迁移的账号：","children":[]},{"level":2,"id":"shou-yu-yong-hu-quan-xian","permalink":"https://linxz.online/blog/aliyun-rds-migration/#shou-yu-yong-hu-quan-xian","title":"授予用户权限：","children":[]},{"level":2,"id":"binlogshe-zhi","permalink":"https://linxz.online/blog/aliyun-rds-migration/#binlogshe-zhi","title":"binlog设置：","children":[]}]},{"level":1,"id":"rdsshe-zhi","permalink":"https://linxz.online/blog/aliyun-rds-migration/#rdsshe-zhi","title":"RDS设置","children":[]},{"level":1,"id":"xiu-gai-wp-config-php","permalink":"https://linxz.online/blog/aliyun-rds-migration/#xiu-gai-wp-config-php","title":"修改wp-config.php","children":[]}],
"body":"除自建mysql外，mysql托管方案有两种，一种是托管专业的数据服务器（RDS），一种是自建服务器并安装mysql。\n下面介绍的是RDS，具体来说，即把wordpress的mysql数据库转移到阿里云的RDS上。\n先贴一个官方教程，教程分为几大部分：\n为自建MySQL创建账号并设置binlog\n可以参照这个帖子。\n新建一个用以数据迁移的账号：\nCREATE USER &#39;rds&#39;@&#39;%&#39; IDENTIFIED BY &#39;rds777&#39;;\n\n以上新建一个rds的用户，允许这个用户从任何主机连接（%），密码是rds777\n授予用户权限：\nGRANT ALL privileges ON wordpress.* TO &#39;rds&#39;@&#39;%&#39; WITH GRANT OPTION; #给用户wordpress里所有表格的权限\nGRANT CREATE ON *.* TO &#39;rds&#39;@&#39;%&#39; WITH GRANT OPTION; #给用户创造表格的权限\n\nbinlog设置：\n找到my.cnf文件。用这个指令：\nsudo find / -name my.cnf\n\n我发现我的my.cnf是空的，include了两个文件，于是看看哪个文件是主设置，看到了这个：\nvim /etc/mysql/mysql.conf.d/mysqld.cnf\n\n注，你的情况可能会不一定，耐心找一找，不是空设置的文件。\n添加以下的参数：\nlog_bin=mysql_bin\nbinlog_format=row\nserver_id=2 #建议设置为大于1的整数\nbinlog_row_image=full #当自建MySQL的版本大于5.6时，则必须设置该项。\n\n另外，这里还需要修改一个bind-address的参数，原本的值是127.0.01，即只允许本地连接，需要设置成0.0.0.0，允许所有主机连接：\nbind-address = 0.0.0.0\n\n这一步教程没有讲，但是不设置的话，数据迁移测试就过不了。\nRDS设置\n选择一个RDS配置购买，我选的是1G内存1核的低配版本，每月18元。\n进入数据传输控制台。\n选择“数据迁移”-“创建任务”。\n到这里，先别急着接下去做，先进入RDS控制台，选“账号管理”，新建一个RDS数据库的账号，设置密码。这里和源数据库的账号密码是不一样的，所以要分别设置。\n另外，我在“白名单和安全组”设置了一个“rds”组，里面加上这些地址。\n这个部分也不知道为啥，教程上让加的：\n112.74.211.0/24\n112.74.242.0/24\n112.74.245.162\n112.74.245.185\n112.74.245.37\n112.74.246.0/24\n112.74.247.0/24\n112.74.247.198\n112.74.247.208\n112.74.250.0/24\n112.74.44.0/24\n112.74.97.0/24\n112.74.98.0/24\n118.31.243.0/24\n119.23.104.0/24\n119.23.186.0/24\n119.23.189.0/24\n119.23.66.0/24\n120.24.160.0/24\n120.24.173.0/24\n120.24.174.0/24\n120.24.177.0/24\n120.24.214.0/24\n120.24.223.0/24\n120.24.40.0/24\n120.24.64.0/24\n120.24.65.0/24\n120.24.67.0/24\n120.25.105.0/24\n120.25.107.0/24\n120.25.123.0/24\n120.25.124.0/24\n120.25.150.0/24\n120.25.215.0/24\n120.25.248.0/24\n120.25.79.0/24\n120.55.129.0/24\n120.76.218.0/24\n120.76.231.0/24\n120.76.91.0/24\n120.77.195.128/26\n120.77.195.192/26\n120.77.234.0/24\n120.77.28.0/24\n120.77.61.0/24\n120.77.68.0/24\n120.77.69.0/24\n120.77.73.0/24\n120.78.179.0/24\n120.78.184.0/24\n120.78.5.0/24\n120.78.6.0/24\n120.79.101.0/24\n120.79.175.0/24\n120.79.188.0/24\n120.79.26.0/24\n120.79.68.0/24\n120.79.71.0/24\n120.79.72.0/24\n120.79.74.0/24\n203.88.163.0/24\n39.108.110.0/24\n39.108.120.0/24\n39.108.66.0/24\n47.101.109.0/24\n47.102.181.0/24\n47.102.234.0/24\n47.106.10.0/24\n47.106.221.0/24\n47.106.37.0/24\n47.106.38.0/24\n47.106.63.192/26\n47.107.101.0/24\n47.107.118.0/24\n47.107.224.0/24\n47.107.29.0/24\n47.107.66.0/24\n47.107.86.0/24\n47.112.103.0/24\n47.112.115.0/24\n47.112.160.0/24\n47.113.76.0/24\n47.115.161.0/24\n47.115.162.0/24\n47.115.165.0/24\n47.115.166.0/24\n47.243.0.32/28\n47.243.9.0/24\n47.244.33.0/24\n47.244.35.0/24\n47.52.111.0/24\n47.52.166.0/24\n47.52.166.98\n47.52.23.0/24\n47.52.25.0/24\n47.52.25.202\n47.89.12.0/24\n47.89.39.0/24\n47.90.37.0/24\n47.90.38.0/24\n47.91.155.0/24\n47.91.228.0/24\n47.91.228.249\n\n全部完成后，就可以接着“数据传输”了。\n因为是阿里云服务器，我的源主机输入的是公网IP。目标库输入的是RDS实例ID。两边各输入自己的账号和密码，选择“非加密连接”，然后就一直点击下一步，完成了。\n修改wp-config.php\n最后，为了能让wordpress连上RDS数据库，需要更新wp-config.php。我的在/var/www/html下，你的可能会不一样。\n文件是这样设置的：\ndefine(&#39;DB_NAME&#39;, &#39;wordpress&#39;);\n\n/** MySQL数据库用户名 */\ndefine(&#39;DB_USER&#39;, &#39;rds&#39;);\n\n/** MySQL数据库密码 */\ndefine(&#39;DB_PASSWORD&#39;, &#39;[rds里设置的密码]&#39;);\n\n/** MySQL主机 */\ndefine(&#39;DB_HOST&#39;, &#39;rm-wz900c93wo.mysql.rds.aliyuncs.com&#39;);\n\n/** 创建数据表时默认的文字编码 */\ndefine(&#39;DB_CHARSET&#39;, &#39;utf8&#39;);\n\n/** 数据库整理类型。如不确定请勿更改 */\ndefine(&#39;DB_COLLATE&#39;, &#39;&#39;);\n\n成功，撒花！\n"},{"title":"关闭谷歌chrome自动重定向https",
"url":"/blog/chrome-shutdown-https/",
"date":"2023-10-22",
"headings":[],
"body":"在chrome如果登录过https的网站，比如我的网站https://www.183441.xyz，就会自动记住，清除缓存都没用。今天看到一个方法：\n打开Chrome并在地址栏输入：\nchrome://net-internals/#hsts\n\n在出现的页面选择：Delete domain security policies\n下面的Domain写上你的网址：183441.xyz，就可以清除https自动重定向。\n\n这对于调试很有帮助。\n亲测有效。\n另外，其实你可以换别的浏览器，firefox或者safari，看看是否chrome的问题，或者直接不用chrome?\n"},{"title":"mysql占用内存太高怎么办？",
"url":"/blog/mysql-is-too-big/",
"date":"2023-10-22",
"headings":[],
"body":"当然是钞能力解决，买个云服务器专门来放mysql，或者托管。\n但是咱不是有钱人，还是技术解决吧。\n我转移了自己wordpress博客网站后，发现内存使用率从百分之10几飙升至百分之40，试用了各种方法，均没有用。偶然看到stackoverflow，试了下，竟然有效。\n基本就是修改一个小点:\ncd /etc/mysql/mysql.conf.d\nvim mysqld.cnf #找到你系统中这个文件，非常关键\n\n加上这行就OK了：\nperformance_schema = 0\n\n完整的代码：\n#\n# The MySQL database server configuration file.\n#\n# One can use all long options that the program supports.\n# Run program with --help to get a list of available options and with\n# --print-defaults to see which it would actually understand and use.\n#\n# For explanations see\n# http://dev.mysql.com/doc/mysql/en/server-system-variables.html\n\n# Here is entries for some specific programs\n# The following values assume you have at least 32M ram\n\n[mysqld]\n#\n# * Basic Settings\n#\nuser            = mysql\n# pid-file      = /var/run/mysqld/mysqld.pid\n# socket        = /var/run/mysqld/mysqld.sock\n# port          = 3306\n# datadir       = /var/lib/mysql\ninnodb_buffer_pool_size = 128M  # 调整为所需的值\ninnodb_buffer_pool_instances=4  # 例如，对于 4GB 的 buffer pool size\nperformance_schema = 0 #stackoverflow推荐\n\n# If MySQL is running as a replication slave, this should be\n# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir\n# tmpdir                = /tmp\n#\n# Instead of skip-networking the default is now to listen only on\n# localhost which is more compatible and is not less secure.\nbind-address            = 127.0.0.1\nmysqlx-bind-address     = 127.0.0.1\n#\n# * Fine Tuning\n#\nkey_buffer_size         = 16M\n# max_allowed_packet    = 64M\n# thread_stack          = 256K\n\n# thread_cache_size       = -1\n\n# This replaces the startup script and checks MyISAM tables if needed\n# the first time they are touched\nmyisam-recover-options  = BACKUP\n\n# max_connections        = 151\n\n# table_open_cache       = 4000\n\n#\n# * Logging and Replication\n#\n# Both location gets rotated by the cronjob.\n#\n# Log all queries\n# Be aware that this log type is a performance killer.\n# general_log_file        = /var/log/mysql/query.log\n# general_log             = 1\n#\n# Error log - should be very few entries.\n#\nlog_error = /var/log/mysql/error.log\n#\n# Here you can see queries with especially long duration\n# slow_query_log                = 1\n# slow_query_log_file   = /var/log/mysql/mysql-slow.log\n# long_query_time = 2\n# log-queries-not-using-indexes\n#\n# The following can be used as easy to replay backup logs or for replication.\n# note: if you are setting up a replication slave, see README.Debian about\n#       other settings you may need to change.\n# server-id             = 1\n# log_bin                       = /var/log/mysql/mysql-bin.log\n# binlog_expire_logs_seconds    = 2592000\nmax_binlog_size   = 100M\n# binlog_do_db          = include_database_name\n# binlog_ignore_db      = include_database_name\n\n基本上会从40%一下子降到10%几，但是你会发现图片上传能力会变弱。很多大图片无法上传。\n各有取舍吧。\n我现在就把图片裁剪一下才上传。\n"},{"title":"wordpress转移到阿里云（非wordpress镜像）需要注意什么？",
"url":"/blog/wordpress-aliyun/",
"date":"2023-10-22",
"headings":[{"level":1,"id":"xin-zhu-ji-an-zhuang-mysql","permalink":"https://linxz.online/blog/wordpress-aliyun/#xin-zhu-ji-an-zhuang-mysql","title":"新主机安装mysql","children":[]},{"level":1,"id":"chuang-jian-shu-ju-ku-wordpress","permalink":"https://linxz.online/blog/wordpress-aliyun/#chuang-jian-shu-ju-ku-wordpress","title":"创建数据库wordpress","children":[{"level":2,"id":"ce-shi-shi-fou-chuang-jian-cheng-gong","permalink":"https://linxz.online/blog/wordpress-aliyun/#ce-shi-shi-fou-chuang-jian-cheng-gong","title":"测试是否创建成功","children":[]}]},{"level":1,"id":"an-zhuang-php","permalink":"https://linxz.online/blog/wordpress-aliyun/#an-zhuang-php","title":"安装PHP","children":[]},{"level":1,"id":"ke-xuan-bu-zou-an-zhuang-wordpress","permalink":"https://linxz.online/blog/wordpress-aliyun/#ke-xuan-bu-zou-an-zhuang-wordpress","title":"可选步骤：安装wordpress","children":[]},{"level":1,"id":"bei-fen-shu-ju-ku-he-wordpresswen-jian-jia","permalink":"https://linxz.online/blog/wordpress-aliyun/#bei-fen-shu-ju-ku-he-wordpresswen-jian-jia","title":"备份数据库和wordpress文件夹","children":[]},{"level":1,"id":"tui-song-bei-fen-dao-xin-zhu-ji","permalink":"https://linxz.online/blog/wordpress-aliyun/#tui-song-bei-fen-dao-xin-zhu-ji","title":"推送备份到新主机","children":[]},{"level":1,"id":"she-ding-wen-jian-jia-var-www-html","permalink":"https://linxz.online/blog/wordpress-aliyun/#she-ding-wen-jian-jia-var-www-html","title":"设定文件夹 /var/www/html","children":[]},{"level":1,"id":"nginxshe-zhi","permalink":"https://linxz.online/blog/wordpress-aliyun/#nginxshe-zhi","title":"Nginx设置","children":[{"level":2,"id":"ru-guo-nginxmei-you-yun-xing","permalink":"https://linxz.online/blog/wordpress-aliyun/#ru-guo-nginxmei-you-yun-xing","title":"如果nginx没有运行","children":[]},{"level":2,"id":"nginxqi-dong-bu-liao","permalink":"https://linxz.online/blog/wordpress-aliyun/#nginxqi-dong-bu-liao","title":"Nginx启动不了？","children":[]}]},{"level":1,"id":"gai-bian-shu-ju-ku-mo-ren-deng-lu-fang-shi","permalink":"https://linxz.online/blog/wordpress-aliyun/#gai-bian-shu-ju-ku-mo-ren-deng-lu-fang-shi","title":"改变数据库默认登录方式","children":[]},{"level":1,"id":"shou-dong-gai-bian-wordpresszhu-ti-de-shou-ye-lian-jie","permalink":"https://linxz.online/blog/wordpress-aliyun/#shou-dong-gai-bian-wordpresszhu-ti-de-shou-ye-lian-jie","title":"手动改变wordpress主题的首页链接","children":[]},{"level":1,"id":"wp-adminwu-fa-deng-lu","permalink":"https://linxz.online/blog/wordpress-aliyun/#wp-adminwu-fa-deng-lu","title":"wp-admin无法登录？","children":[]},{"level":1,"id":"qi-ta-wordpresscuo-wu","permalink":"https://linxz.online/blog/wordpress-aliyun/#qi-ta-wordpresscuo-wu","title":"其他wordpress错误","children":[]}],
"body":"首先要安装mysql和php，这是wordpress必备项。\n新主机安装mysql\n由于wordpress默认的数据库配置是mysql，因此需要在新主机提前安装。\n首先需要确保 Ubuntu 的包列表是最新的：\nsudo apt update\n\n安装 MySQL 服务器:\nsudo apt install mysql-server\n\n配置 MySQL:\n这个工具将会提示你设置 root 用户的密码、删除匿名用户、禁止 root 远程登录和删除测试数据库。对于大多数情况，推荐选择默认配置（通常是输入 “y”）。\n我在这里设置用户是root，密码是”，你可以根据实际情况设置。\nsudo mysql_secure_installation\n\n启动和启用 MySQL 服务:\nsudo systemctl status mysql\n\n确保 MySQL 服务在开机时自动启动：\nsudo systemctl enable mysql\n\n登录 MySQL:\nsudo mysql -u root -p\n\n输入你在 mysql_secure_installation 中设置的密码。\n可选：这里可以选择在安全组里面打开3306，这是mysql默认使用的端口，暂没发现如果没打开这个端口会有什么问题。\n创建数据库wordpress\n在mysql界面，直接创建：\nCREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n\n这里的[database_name]通常是wordpress，注意要带上分号；，不然命令会不成功。\nCHARACTER和COLLATE其实是输出的是默认项，即utf8，上面mb4不影响。\n测试是否创建成功\n登录mysql后，连接数据库：\nUSE wordpress;\n\n显示表格：\nSHOW TABLES;\n\n这一步就会显示出所有的表名。\n退出MYSQL：\nEXIT #或者quit\n\n如果在mysql输入错误，点击ctrl+c可以返回上一步。\n安装PHP\n更新包列表：\nsudo apt update\n\n安装php：\n使用以下命令安装PHP及其常用模块：\nsudo apt install php php-cli php-fpm php-json php-common php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear\n\n验证安装：\nphp -v\n\n可选步骤：安装wordpress\n如果你把备份的wordpress拷贝过去，一般不需要操作这一步。但是如果你发现新的文件有各种各样的问题，或者文件损坏，这时候最好就安装新的wordpress，再把wp-content和wp-admin文件夹的内容拷贝过去。\n下载WordPress:\ncd /tmp\nwget https://wordpress.org/latest.tar.gz\ntar xzvf latest.tar.gz\n\n将WordPress文件复制到web服务器的文档根目录下：\nsudo cp -a /tmp/wordpress/. /var/www/html\n\n配置文件权限:\n为了确保WordPress能够正确地工作，您需要更改文件和目录的所有权：\nsudo chown -R www-data:www-data /var/www/html\n\n注：wordpress默认用户是www-data，所以在给它设置文件夹的权限。这个用户名也会体现在Nginx的配置中。\n备份数据库和wordpress文件夹\n针对原主机上，在terminal上执行下面的操作以备份数据库到本地：\n scp root@149.129.84.1:/home/admin/backup.sql /Users/lxz/Desktop\n\n执行下面操作备份wordpress文件夹：\nscp root@149.129.84.1:/data/wwwroot/wordpress/wordpress_backup.tar.gz /Users/lxz/Downloads\n\n这个步骤会比较久，因为文件比较大。\n推送备份到新主机\n数据库备份：\nscp /Users/lxz/Downloads/backup.sql root@8.217.65.15:/root\n\nwordpress备份：\nscp /Users/lxz/Downloads/wordpress_backup.tar.gz root@8.217.65.15:/root\n\n同样，文件大了，这个过程会比较久。\n当然，有人肯定注意到了，其实不需要经过本地这个“二道贩子”，直接云主机间传输的。我这次没有尝试这个方式，下次会试一下。\n好了，这样一来，新主机就有源主机的wordpress配置信息和数据库了。下面的操作都是在新主机完成的了。\n设定文件夹 /var/www/html\n上面的流程，我们把备份文件放在了root文件夹，这不是最佳实际，最好是放在/var/www/html文件夹内。移动文件夹：\nsudo mv /root/* /var/www/html/\n\n如果你需要的是拷贝：\nsudo cp -r /root/* /var/www/html\n\n将root下面的文件全部复制到/var/www/html中去。\n设置适当的权限：\nsudo chown -R www-data:www-data /var/www/html/\nsudo find /var/www/html/ -type d -exec chmod 755 {} \\;\nsudo find /var/www/html/ -type f -exec chmod 644 {} \\;\n\nNginx设置\n由于我使用的nginx，所以下面都是Nginx的配置，aphache请自行GPT。\n我的nginx.conf配置如下：\n关键点有三个：\n\n\n设定server_name，root文件夹，和要用作主页的index\n\n\n设定location里的index.php\n\n\n设定php的路径\n\n\nuser www-data;\n#user root;\nworker_processes auto;\npid /run/nginx.pid;\ninclude /etc/nginx/modules-enabled/*.conf;\n\nevents {\n        worker_connections 768;\n        # multi_accept on;\n}\n\nhttp {\n\n        ##\n        # Basic Settings\n        ##\n\n        sendfile on;\n        tcp_nopush on;\n        types_hash_max_size 2048;\n        # server_tokens off;\n\n        # server_names_hash_bucket_size 64;\n        # server_name_in_redirect off;\n\n        include /etc/nginx/mime.types;\n        default_type application/octet-stream;\n\n        ##\n        # SSL Settings\n        ##\n\n        server {\n        #listen 443 ssl;\n        listen 80;\n        #server_name 183441.xyz;\n        server_name 183441.xyz;\n        root /var/www/html;\n        index index.php;\n        #index index.html index.php;\n\n\n\n        location / {\n        try_files $uri $uri/ /index.php?$args;\n\n\n        #       proxy_pass http://localhost:3000;\n        #       proxy_pass https://commonlearner.com;\n        #       proxy_set_header Host $host;\n        #       proxy_set_header X-Real-IP $remote_addr;\n        #       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        #        proxy_set_header X-Forwarded-Proto $scheme;\n        }\n\n        #处理php\n        location ~ \\.php$ {\n         include snippets/fastcgi-php.conf;\n        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 请注意这里使用了 8.1 的套接字\n        # fastcgi_index index.php;\n        }\n\n        location /phpMyAdmin {\n        root /var/www/html;\n        index index.php index.html index.htm;\n        }\n\n        ##\n        # Logging Settings\n        ##\n\n        access_log /var/log/nginx/access.log;\n        error_log /var/log/nginx/error.log;\n\n        ##\n        # Gzip Settings\n        ##\n\n        gzip on;\n\n        include /etc/nginx/conf.d/*.conf;\n        include /etc/nginx/sites-enabled/*;\n}\n\n注：phpmyadmin可以根据需要设置，非必要\n如果nginx没有运行\n确认Nginx是否正在运行：\nps aux | grep nginx\n\n如果不是active的状态，启动Nginx：\nsudo systemctl start nginx\n\n重新加载nginx配置：\nsudo nginx -s reload\n\n如果问题还存在，检查nginx配置中的错误：\nsudo nginx -t\n\nNginx启动不了？\n通常是别的服务占用了80端口，可能是apache，找出正在使用端口80的进程：\nsudo netstat -tuln | grep :80\n\n杀死占用端口80的进程：\nsudo kill -9 [PID]\n\n再次查看占用的程序：\nsudo lsof -i :80\n\n再次启动Nginx：\nsudo systemctl start nginx\n\n改变数据库默认登录方式\n这一步非常关键！！！！特别是Ubuntu系统要看。我在这一步卡了两天。\n因为连接到主机IP地址后，总是显示“数据库连接错误”，各种排查都找不到原因。最后还是无意中GPT提到的这个方法——改变数据库默认登录方式，从私钥验证改成密码验证，就成功了。\n首先登录mysql，这里username是root，-p是输入密码的意思。我的密码是空，所以接着按回车就可以；\nmysql -u root -p\n\n接着将mysql默认的身份验证方式改成密码验证，我没设置密码，因此是空字符”；\nALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED WITH &#39;mysql_native_password&#39; BY &#39;&#39;;\n\n手动改变wordpress主题的首页链接\n因为发现首页会自动跳转到以前的旧网址，一排查原因发现是主题内设定了自定义链接。\n在后台进入主题设置，改变主页地址，从www.linxiaozhong.club改到183441.xyz就可以了。\nwp-admin无法登录？\n通常是wp_options的问题，这个可以在mysql里面改。\n主机登录mysql后，\n检查当前siteurl和home的值：\nSELECT option_name, option_value FROM wp_options WHERE option_name=&#39;siteurl&#39; OR option_name=&#39;home&#39;;\n\n更新siteurl和home值:\nUPDATE wp_options SET option_value=&#39;http://your_domain_or_IP&#39; WHERE option_name=&#39;siteurl&#39;;\nUPDATE wp_options SET option_value=&#39;http://your_domain_or_IP&#39; WHERE option_name=&#39;home&#39;;\n\n退出MySQL:\nexit;\n\n通常这就搞定了。\n其他wordpress错误\n可以通过日志了解。\n将wp-config.php文件里的debug设置为true，可以给你更多的信息。\ndefine(&#39;WP_DEBUG&#39;, true);\n\n"},{"title":"如何绕过wordpress编辑器上传图片",
"url":"/blog/wordpress-image-upload/",
"date":"2023-10-22",
"headings":[{"level":1,"id":"an-zhuang-add-from-servercha-jian","permalink":"https://linxz.online/blog/wordpress-image-upload/#an-zhuang-add-from-servercha-jian","title":"安装Add From Server插件","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/wordpress-image-upload/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"有段时间，托管wordpress的服务器系统负载过大，CPU使用率总是显示100%，几乎不能编辑任何文章。\n后来，我发现了是系统性能问题，我是1G内存的阿里云轻量服务器，购买了2G内存的腾讯云轻量服务器解决了这个问题。\n其实，系统负载过大大部分时间是图片上传问题，我有个办法可以绕过wordpress的编辑器上传图片，就不会让服务器系统过载，从而导致死机。\n安装Add From Server插件\n在wordpress后台，下载 Add From Server 这个插件，直接把图片上传到服务器，再通过插件转移到媒体库，直接引用媒体库图片即可。\n可参考：\nscp -r  /Users/lxz/Downloads/from-server root@your-server-IP:/var/www/html/wp-content/uploads\n\n参考资料\nwordpress论坛\n"},{"title":"如何使用curl命令？",
"url":"/blog/how-to-use-curl/",
"date":"2023-10-20",
"headings":[{"level":1,"id":"huo-qu-wang-ye-nei-rong-get","permalink":"https://linxz.online/blog/how-to-use-curl/#huo-qu-wang-ye-nei-rong-get","title":"获取网页内容 GET","children":[]},{"level":1,"id":"shang-chuan-xu-qiu-post","permalink":"https://linxz.online/blog/how-to-use-curl/#shang-chuan-xu-qiu-post","title":"上传需求 POST","children":[]},{"level":1,"id":"xia-zai-wen-jian","permalink":"https://linxz.online/blog/how-to-use-curl/#xia-zai-wen-jian","title":"下载文件","children":[]},{"level":1,"id":"shang-chuan-wen-jian","permalink":"https://linxz.online/blog/how-to-use-curl/#shang-chuan-wen-jian","title":"上传文件","children":[]},{"level":1,"id":"curl-zhuan-huan-gong-ju","permalink":"https://linxz.online/blog/how-to-use-curl/#curl-zhuan-huan-gong-ju","title":"curl 转换工具","children":[]}],
"body":"为了验证网页是否正常或者api是否能够成功，经常使用curl命令。\ncurl在mac是内置工具。\n获取网页内容 GET\ncurl www.linxiaozhong.club\n\n等同于以下：\ncurl -X GET &quot;www.linxiaozhong.club&quot;\n\n\n\n引号说明：如果有时候没响应，可以加上引号，有时候是zsh/bash无法读取该格式的原因\n\n\n默认的请求方法是GET，所以-X GET 通常可以省略。\n\n\n上传需求 POST\ncurl -X POST -d &quot;param1=value1&amp;p2=value2&quot; https://www.example.com\n\n\n\n这个命令会向 www.example.com 发送一个POST请求，其中包含两个参数param1和p2。\n\n\n-X指指定的方法，这里是POST，其他还有GET, PUT, DELETE, OPTION等\n\n\n-d指允许你发送POST请求的数据。它可以是一个字符串或一个文件。在这种情况下，它是一个字符串。\n\n\n下载文件\ncurl -O https://www.example.com/path/to/file\n\n上传文件\ncurl -T file.txt ftp://ftp.example.com/mydir\n\ncurl 转换工具\n介绍一个有用的工具curl converter，可以把curl命令转换为几乎所有的变成语言。\n"},{"title":"阿里云服务器怎么买最划算",
"url":"/blog/aliyun-buy/",
"date":"2023-10-19",
"headings":[{"level":1,"id":"fu-fei-lei-xing","permalink":"https://linxz.online/blog/aliyun-buy/#fu-fei-lei-xing","title":"付费类型","children":[]},{"level":1,"id":"di-yu","permalink":"https://linxz.online/blog/aliyun-buy/#di-yu","title":"地域","children":[]},{"level":1,"id":"shi-li","permalink":"https://linxz.online/blog/aliyun-buy/#shi-li","title":"实例","children":[]},{"level":1,"id":"jing-xiang","permalink":"https://linxz.online/blog/aliyun-buy/#jing-xiang","title":"镜像","children":[]},{"level":1,"id":"xi-tong-pan","permalink":"https://linxz.online/blog/aliyun-buy/#xi-tong-pan","title":"系统盘","children":[]},{"level":1,"id":"gong-wang-ip","permalink":"https://linxz.online/blog/aliyun-buy/#gong-wang-ip","title":"公网IP","children":[]},{"level":1,"id":"dai-kuan-ji-fei-mo-shi","permalink":"https://linxz.online/blog/aliyun-buy/#dai-kuan-ji-fei-mo-shi","title":"带宽计费模式","children":[]},{"level":1,"id":"guan-li-she-zhi","permalink":"https://linxz.online/blog/aliyun-buy/#guan-li-she-zhi","title":"管理设置","children":[]},{"level":1,"id":"pei-zhi-zong-lan","permalink":"https://linxz.online/blog/aliyun-buy/#pei-zhi-zong-lan","title":"配置总览","children":[]},{"level":1,"id":"jie-yu","permalink":"https://linxz.online/blog/aliyun-buy/#jie-yu","title":"结语","children":[]}],
"body":"最便宜的服务器通常是ECS服务器。\n付费类型\n如果你是短期用一用，比如就用1-2天，那么付费类型选择”按量使用“；\n如果是长期用，比如一个月以上，付费类型选择”包年包月“\n\n地域\n越偏远越便宜，比如新疆地区。但也要考虑访问速度，选新疆意味着西北访问速度快，其他地区访问速度较差。\n考虑到国内的服务器涉及备案，我通常选择的是香港。\n实例\n我一般选择1CPU和1G内存，实测下来够装两个应用（一个网页和一个后端服务）。\n如果是0.5G内存，构建nextjs build环节可能会出错。\n当然，也要看你具体应用情况，一个html网页0.5G肯定绰绰有余。\n”规格族“这里，一般选择”突发性能实例t5“，性价比更高。\n另外，CPU和内存都可以随时升级，请放心选择。\n镜像\n我习惯用ubuntu，这个看个人。\n系统盘\n最低可选20G，实测下来够用。\n系统盘同样支持随时升级，可放心选择。\n公网IP\n这里我习惯勾选上，这样就可以有固定可用的IP，因为我的网站用得上。\n带宽计费模式\n这里注意，如果你估摸着应用是你玩玩，没多少人（流量）连接的话，最好选择”按使用流量“\n带宽峰值，随你喜欢，为了不限制应用表现，我会直接调到最高。\n\n管理设置\n可以设置之后再设置密码，或者直接设置密码\n配置总览\n\n结语\n如果你按照以上的设置（地区：香港），那么你的实例价格应该是42.15元/月左右，实测下来性价比最高。\n另外要在阿里云余额充钱，我充了10元，因为里面有使用流量的计费。我是半个月才被扣了0.1元，也是挺划算的。如果你没充钱，阿里云会一直提醒你欠费，可能会面临停机的风险。\n"},{"title":"如何下载各个公司标签页logo（favicon）",
"url":"/blog/how-to-get-favicon/",
"date":"2023-10-19",
"headings":[],
"body":"通常就是xxx.com/favicon.ico即可\n我的技术栈是nextjs，一般nextjs的favicon会放到public文件夹(如果是静态网站比如zola，会放在static文件夹），public文件夹默认是公开的，用户可以下载的。\n比如我的favicon，可以通过linxz.fun/favicon.ico获取。\n我测试过openai.com, x.com, taobao.com, facebook.com, google.com, poe.com，都可以正常下载他们的favicon。\n其中，x.com很有趣，favicon还是twitter标志性的小鸟，所以它后面技术应该不是用nextjs？\n更新：2024年测试过，小鸟的图标已经换成了X。\n"},{"title":"怎么在一个服务器塞两个域名（nginx）",
"url":"/blog/two-domains-one-server/",
"date":"2023-10-19",
"headings":[{"level":1,"id":"xiu-gai-dns","permalink":"https://linxz.online/blog/two-domains-one-server/#xiu-gai-dns","title":"修改DNS","children":[]},{"level":1,"id":"nginx-confshe-zhi","permalink":"https://linxz.online/blog/two-domains-one-server/#nginx-confshe-zhi","title":"Nginx.conf设置","children":[]}],
"body":"修改DNS\n将DNS的A记录中@和www都改为相同服务器的IP。\nNginx.conf设置\n使用nginx。主要思路是塞三个server设置，一个server处理两个域名的80端口，都重定向到各自的https（443端口），一个server处理linxz.fun的SSL证书，一个server处理commonlearner.com的SSL证书。\n下面是/etc/nginx/nginx.conf的设置：\nroot@iZj6cbu3y55famglsids2zZ:/etc/nginx# cat nginx.conf\nuser www-data;\nworker_processes auto;\npid /run/nginx.pid;\ninclude /etc/nginx/modules-enabled/*.conf;\n\nevents {\n        worker_connections 768;\n        # multi_accept on;\n}\n\nhttp {\n\n        ##\n        # Basic Settings\n        ##\n\n        sendfile on;\n        tcp_nopush on;\n        types_hash_max_size 2048;\n        # server_tokens off;\n\n        # server_names_hash_bucket_size 64;\n        # server_name_in_redirect off;\n\n        include /etc/nginx/mime.types;\n        default_type application/octet-stream;\n\n        ## linxz.fun server\n        server {\n            listen 80;\n            server_name linxz.fun www.linxz.fun commonlearner.com www.commonlearner.com;\n\n            location / {\n                return 301 https://$host$request_uri;\n             }\n        }\n\n        # linxz.fun SSL\n        server {\n            listen 443 ssl;\n            server_name linxz.fun www.linxz.fun;\n\n            ssl_certificate /etc/nginx/cert2/linxz.fun.pem;\n            ssl_certificate_key /etc/nginx/cert2/linxz.fun.key;\n\n            location / {\n                proxy_pass http://localhost:3000;\n                proxy_set_header Host $host;\n                proxy_set_header X-Real-IP $remote_addr;\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n                proxy_set_header X-Forwarded-Proto $scheme;\n            }\n        }\n\n        ##\n        # SSL Settings\n        ##\n        server {\n        listen 443 ssl;\n        server_name commonlearner.com www.commonlearner.com;\n\n\n        ssl_certificate /etc/nginx/cert/commonlearner.com.pem;\n        ssl_certificate_key /etc/nginx/cert/commonlearner.com.key;\n\n         location / {\n                proxy_pass http://localhost:3000;\n                proxy_set_header Host $host;\n                proxy_set_header X-Real-IP $remote_addr;\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n                proxy_set_header X-Forwarded-Proto $scheme;\n        }\n\n\n\n        ssl_session_cache shared:SSL:1m;\n        ssl_session_timeout 5m;\n\n        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE\n        ssl_prefer_server_ciphers on;\n        }\n        ##\n\n        # 添加 CORS 全局配置\n        add_header Access-Control-Allow-Origin &quot;*&quot;; \n        add_header Access-Control-Allow-Methods &quot;GET, POST, OPTIONS&quot;;\n\n        # Logging Settings\n        ##\n\n        access_log /var/log/nginx/access.log;\n        error_log /var/log/nginx/error.log;\n\n        ##\n        # Gzip Settings\n        ##\n\n        gzip on;\n\n\n        include /etc/nginx/conf.d/*.conf;\n        include /etc/nginx/sites-enabled/*;\n}\n\n"},{"title":"如何把本地镜像Image push到Docker Hub",
"url":"/blog/docker-hub-image/",
"date":"2023-10-18",
"headings":[{"level":1,"id":"cha-kan-images","permalink":"https://linxz.online/blog/docker-hub-image/#cha-kan-images","title":"查看images","children":[]},{"level":1,"id":"deng-lu-docker","permalink":"https://linxz.online/blog/docker-hub-image/#deng-lu-docker","title":"登录Docker","children":[]},{"level":1,"id":"yuan-cheng-guan-lian-cang-ku","permalink":"https://linxz.online/blog/docker-hub-image/#yuan-cheng-guan-lian-cang-ku","title":"远程关联仓库","children":[]},{"level":1,"id":"pushcang-ku","permalink":"https://linxz.online/blog/docker-hub-image/#pushcang-ku","title":"push仓库","children":[]},{"level":1,"id":"pullcang-ku","permalink":"https://linxz.online/blog/docker-hub-image/#pullcang-ku","title":"pull仓库","children":[]},{"level":1,"id":"shou-dong-qian-yi","permalink":"https://linxz.online/blog/docker-hub-image/#shou-dong-qian-yi","title":"手动迁移","children":[{"level":2,"id":"shou-dong-qian-yi-docker-jing-xiang","permalink":"https://linxz.online/blog/docker-hub-image/#shou-dong-qian-yi-docker-jing-xiang","title":"手动迁移 Docker 镜像：","children":[]},{"level":2,"id":"1-zai-yuan-yun-zhu-ji-shang","permalink":"https://linxz.online/blog/docker-hub-image/#1-zai-yuan-yun-zhu-ji-shang","title":"1. 在源云主机上：","children":[{"level":3,"id":"a-chuang-jian-docker-jing-xiang","permalink":"https://linxz.online/blog/docker-hub-image/#a-chuang-jian-docker-jing-xiang","title":"a. 创建 Docker 镜像","children":[]},{"level":3,"id":"b-bao-cun-docker-jing-xiang-wei-tar-wen-jian","permalink":"https://linxz.online/blog/docker-hub-image/#b-bao-cun-docker-jing-xiang-wei-tar-wen-jian","title":"b. 保存 Docker 镜像为 tar 文件","children":[]},{"level":3,"id":"c-chuan-shu-tar-wen-jian-dao-mu-biao-yun-zhu-ji","permalink":"https://linxz.online/blog/docker-hub-image/#c-chuan-shu-tar-wen-jian-dao-mu-biao-yun-zhu-ji","title":"c. 传输 tar 文件到目标云主机","children":[]}]},{"level":2,"id":"2-zai-mu-biao-yun-zhu-ji-shang","permalink":"https://linxz.online/blog/docker-hub-image/#2-zai-mu-biao-yun-zhu-ji-shang","title":"2. 在目标云主机上：","children":[{"level":3,"id":"a-jia-zai-docker-jing-xiang","permalink":"https://linxz.online/blog/docker-hub-image/#a-jia-zai-docker-jing-xiang","title":"a. 加载 Docker 镜像","children":[]},{"level":3,"id":"b-yun-xing-rong-qi","permalink":"https://linxz.online/blog/docker-hub-image/#b-yun-xing-rong-qi","title":"b. 运行容器","children":[]}]}]}],
"body":"实测下来，跟 github 的原理差不多，少了很多复杂工序，比如init、add、commit等。\n首先注册一个 Docker Hub 的用户名和密码。\n新建一个 repository，随便命名，选择 public（注：private只允许放一个，多的要钱）\n打开terminal：\n查看images\ndocker images\n\n登录Docker\ndocker login\n\n按照要求输入用户名和密码即可\n远程关联仓库\n docker tag &lt;本地repository名称&gt;:&lt;本地TAG&gt; &lt;Docker用户名&gt;/&lt;远程repository名称&gt;:&lt;远程TAG&gt;\n\n注意TAG名称一般是latest之类的，有的人会标注版本号；repository名称即对应Image Name，而不是id\n例子：\ndocker tag terminal-blog-nomodule:latest  commonlearner/terminal-blog:latest\n\npush仓库\ndocker push &lt;Docker用户名&gt;/&lt;远程repository名称&gt;:&lt;远程TAG&gt;\n\n例子：\ndocker push commonlearner/terminal-blog:latest\n\npull仓库\n需要在新主机上登录：\ndocker login\n\n再pull\ndocker pull &lt;dockerhub_username&gt;/&lt;repository_name&gt;:&lt;tag&gt;\n\n例子：\ndocker pull commonlearner/terminal-blog:latest\n\n手动迁移\n不使用Dockerhub也能实现image的复制：直接手动传输 Docker 镜像的 tar 文件。\n手动迁移 Docker 镜像：\n1. 在源云主机上：\na. 创建 Docker 镜像\n首先，需要将容器提交为一个新的 Docker 镜像。使用 docker commit 命令：\ndocker commit &lt;container_id_or_name&gt; &lt;new_image_name&gt;:&lt;tag&gt;\n\n例如：\ndocker commit my_container my_image:v1\n\nb. 保存 Docker 镜像为 tar 文件\n使用 docker save 命令：\ndocker save -o &lt;path_to_save_image.tar&gt; &lt;new_image_name&gt;:&lt;tag&gt;\n\n例如：\ndocker save -o my_image_v1.tar my_image:v1\n\nc. 传输 tar 文件到目标云主机\n可以使用 scp, rsync 或其他方法将 tar 文件传输到目标主机。\n例如使用 scp：\nscp my_image_v1.tar username@target_host:/path/on/target/host\n\n2. 在目标云主机上：\na. 加载 Docker 镜像\n首先，需要从 tar 文件中加载 Docker 镜像。使用 docker load 命令：\ndocker load -i &lt;path_to_save_image.tar&gt;\n\n例如：\ndocker load -i /path/on/target/host/my_image_v1.tar\n\nb. 运行容器\n现在，你可以使用 docker run 命令从新加载的镜像启动容器。\n例如：\ndocker run -d &lt;other_options&gt; my_image:v1\n\n注意\n\n在迁移过程中，你迁移的是容器的当前状态。这意味着在容器内进行的任何非持久化更改（例如，容器内部的临时文件）都会被保存并迁移到新的主机。\n如果你的应用有持久化存储需求（如数据库数据），还需要额外迁移这些数据。一种方法是使用数据卷或绑定挂载，并单独迁移这些数据。\n这种迁移方法更适合临时、测试或开发环境。对于生产环境，推荐使用 Docker Registry 进行镜像的存储和传输，这样可以更容易地管理和分发 Docker 镜像。\n\n"},{"title":"如何把一个网址重定向到另一个网址（分属不同的服务器）",
"url":"/blog/url-redirect/",
"date":"2023-10-18",
"headings":[],
"body":"需求：将 linxz.fun 映射到 commonlearner.com\n方法：需要用到nginx\n首先我们看/etc/nginx/sites-available/default，它的作用是把HTTP（80口）映射到HTTPS（443口）：\n# Default server configuration\n#\n# HTTP configuration (for redirection to HTTPS)\nserver {\n        listen 80;\n        listen [::]:80;\n\n        server_name linxz.fun;\n\n        location / {\n                # Redirect all HTTP requests to HTTPS\n                return 301 https://$host$request_uri;\n        }\n}\n\n主要修改/etc/nginx/nginx.conf，主要是做SSL重定向location / {}\nuser www-data;\nworker_processes auto;\npid /run/nginx.pid;\ninclude /etc/nginx/modules-enabled/*.conf;\n\nevents {\n        worker_connections 768;\n        # multi_accept on;\n}\n\nhttp {\n\n        ##\n        # Basic Settings\n        ##\n\n        sendfile on;\n        tcp_nopush on;\n        types_hash_max_size 2048;\n        # server_tokens off;\n\n        # server_names_hash_bucket_size 64;\n        # server_name_in_redirect off;\n\n        include /etc/nginx/mime.types;\n        default_type application/octet-stream;\n\n        ##\n        # SSL Settings\n        ##\n\n        server {\n        listen 443 ssl;\n        server_name linxz.fun;\n\n\n        location / {\n        #       proxy_pass http://localhost:3000;\n                proxy_pass https://commonlearner.com;\n                proxy_set_header Host $host;\n                proxy_set_header X-Real-IP $remote_addr;\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n                proxy_set_header X-Forwarded-Proto $scheme;\n        }\n\n\n        ssl_certificate /etc/nginx/cert/linxz.fun.pem;\n        ssl_certificate_key /etc/nginx/cert/linxz.fun.key;\n\n        ssl_session_cache shared:SSL:1m;\n        ssl_session_timeout 5m;\n\n        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE\n        ssl_prefer_server_ciphers on;\n        }\n\n\n        access_log /var/log/nginx/access.log;\n        error_log /var/log/nginx/error.log;\n\n        ##\n        # Gzip Settings\n        ##\n\n        gzip on;\n\n\n        include /etc/nginx/conf.d/*.conf;\n        include /etc/nginx/sites-enabled/*;\n}\n\n"},{"title":"怎么在阿里云用docker",
"url":"/blog/aliyun-docker/",
"date":"2023-10-17",
"headings":[{"level":1,"id":"an-zhuang-docker","permalink":"https://linxz.online/blog/aliyun-docker/#an-zhuang-docker","title":"安装docker","children":[]},{"level":1,"id":"tian-jia-dockerfile","permalink":"https://linxz.online/blog/aliyun-docker/#tian-jia-dockerfile","title":"添加Dockerfile","children":[]},{"level":1,"id":"docker-build","permalink":"https://linxz.online/blog/aliyun-docker/#docker-build","title":"docker build","children":[]},{"level":1,"id":"docker-run","permalink":"https://linxz.online/blog/aliyun-docker/#docker-run","title":"docker run","children":[]},{"level":1,"id":"cha-kan-suo-you-yun-xing-de-rong-qi","permalink":"https://linxz.online/blog/aliyun-docker/#cha-kan-suo-you-yun-xing-de-rong-qi","title":"查看所有运行的容器","children":[{"level":2,"id":"cha-kan-bao-gua-yi-tui-chu-de-rong-qi","permalink":"https://linxz.online/blog/aliyun-docker/#cha-kan-bao-gua-yi-tui-chu-de-rong-qi","title":"查看包括已退出的容器","children":[]}]},{"level":1,"id":"docker-ps-a","permalink":"https://linxz.online/blog/aliyun-docker/#docker-ps-a","title":"docker ps -a","children":[]},{"level":1,"id":"cha-kan-mou-jing-xiang-nei-suo-you-rong-qi","permalink":"https://linxz.online/blog/aliyun-docker/#cha-kan-mou-jing-xiang-nei-suo-you-rong-qi","title":"查看某镜像内所有容器","children":[]},{"level":1,"id":"cha-kan-jing-xiang","permalink":"https://linxz.online/blog/aliyun-docker/#cha-kan-jing-xiang","title":"查看镜像","children":[]},{"level":1,"id":"shan-chu-jing-xiang","permalink":"https://linxz.online/blog/aliyun-docker/#shan-chu-jing-xiang","title":"删除镜像","children":[]},{"level":1,"id":"cha-kan-dockerri-zhi","permalink":"https://linxz.online/blog/aliyun-docker/#cha-kan-dockerri-zhi","title":"查看docker日志","children":[]},{"level":1,"id":"tian-jia-nextjswang-zhan-dao-dockerbu-zou","permalink":"https://linxz.online/blog/aliyun-docker/#tian-jia-nextjswang-zhan-dao-dockerbu-zou","title":"添加nextjs网站到docker步骤","children":[]},{"level":1,"id":"ru-he-zhong-xin-kai-shi-dockerying-yong","permalink":"https://linxz.online/blog/aliyun-docker/#ru-he-zhong-xin-kai-shi-dockerying-yong","title":"如何重新开始docker应用","children":[]}],
"body":"docker的好处是创建一个完全隔离的空间，所以依赖项不会互相冲突，今天就来试一下吧。\n安装docker\nsudo apt update\nsudo apt install docker.io\n\n开始docker并设置开机自启动\nsudo systemctl start docker\nsudo systemctl enable docker\n\n现在可以试下\ndocker container run hello-world\n\n添加Dockerfile\n在项目的根目录添加Dockerfile，注意项目里面要用到的文件需要COPY进这个文件里面，最终Dockerfile是这样的\nFROM python:3.8-slim\n\nWORKDIR /app\n\nCOPY requirements.txt requirements.txt\nRUN pip install --no-cache-dir -r requirements.txt\n# 在Dockerfile中添加Pandas安装命令\nRUN pip install pandas\nRUN pip install gunicorn\n\nCOPY index.py /app/\nCOPY .env .env\nCOPY commonlearner.com.pem .\nCOPY commonlearner.com.key .\n\n#CMD [&quot;python&quot;, &quot;index.py&quot;]\nCMD [&quot;gunicorn&quot;, &quot;--certfile&quot;, &quot;commonlearner.com.pem&quot;,&quot;--keyfile&quot;, &quot;commonlearner.com.key&quot;, &quot;-b&quot;, &quot;0.0.0.0:5328&quot;, &quot;-w&quot;, &quot;4&quot;,&quot;index:app&quot;]\n\n注意：\n\n\n以上requirements.txt里面的pandas发生错误，所以单独install\n\n\ngunicorn用来转为https命令的，vercel的后端仅接受https传输数据\n\n\nindex.py需要传入app文件夹，证书也有在根目录内，COPY进Dockerfile\n\n\n最后运行gunicorn指令运行python后端。\n\n\n如果你是http请求，非vercel程序，可以用CMD[“python”, “index.py”]命令\n\n\ndocker build\ndocker build -t server-autism /root/server-autism\n\n代码解释：\n\ndocker build: 这是 Docker 命令的起始部分，表示你要执行构建镜像的操作。\n-t server-a: 这是一个选项（参数），用于为新构建的镜像指定一个名称（tag）。在这里，镜像名称被设置为 “server-a”。标签可以帮助你对不同版本或不同配置的镜像进行标识。\n/root/server-autism: 这是 Docker 构建上下文（build context）的路径。构建上下文是一个包含用于构建 Docker 镜像的文件和目录的路径。在这个例子中，构建上下文的路径是 /root/server-autism，意味着 Docker 将在该路径下查找 Dockerfile 和其他构建所需的文件。\n\ndocker run\ndocker run -d -p 5328:5328 server-autism\n\n代码解释：\n\ndocker run: 这是 Docker 命令的起始部分，表示你要运行一个容器。\n-d: 这是一个选项（参数），代表 “detached” 模式。当你使用 -d 选项时，容器将会在后台运行，而不会占用当前终端的控制权。这意味着你可以在终端中继续执行其他命令，而容器仍然在后台运行。\n-p 8080:3000: 这是一个选项（参数），用于指定端口映射。具体来说，它将容器内部的端口3000映射到主机（宿主机）上的端口8080。这意味着容器内的应用程序可以通过主机的8080端口进行访问。\n左侧的8080表示主机上的端口，这是你将要用来访问容器内应用程序的端口。\n右侧的3000表示容器内部的端口，这是容器内应用程序实际监听的端口。\nmy-web-app: 这是要运行的 Docker 镜像的名称或标签。你运行的容器将基于这个镜像创建。\n\n查看所有运行的容器\ndocker ps\n\n查看包括已退出的容器\ndocker ps -a\n\ndocker ps -a\ndocker stop [id]\ndocker rm [id]\n\n查看某镜像内所有容器\ndocker ps -a | grep server-autism\n\n查看镜像\ndocker images\ndocker images -a #包含中间images\n\n删除镜像\ndocker rmi server-autism\n\ndocker image prune\ndocker image prune -a #删除所有未使用的image\n\n查看docker日志\ndocker logs [id]\n\n添加nextjs网站到docker步骤\n同样，在根目录下添加Dockerfile\ntouch Dockerfile\nvim Dockerfile\n\nDockerfile里面内容：\nFROM node:16-slim\n\nWORKDIR /app\n\nCOPY package*.json ./\nRUN npm install\n\nCOPY . .\n\nCMD [&quot;npm&quot;, &quot;run&quot;, &quot;start&quot;]\n\n注意，放入Dockerfile之前，我已经执行过npm run build了，如果没有执行，应该要在Dockerfile重新执行一次。\n执行Docker build container 和 run 的动作：\ndocker build -t  terminal-blog-nomodule  . #在本文件夹下\ndocker build -t  terminal-blog-nomodule  /root/terminal-blog-nomodule\ndocker run -d -p 3000:3000 terminal-blog-nomodule\n\n如何重新开始docker应用\n查看哪些应用在运行\ndocker ps #查看当前运行的应用\ndocker ps -a #查看退出的应用\n\n查看结果\nroot@iZj6cbu3y55famglsids2zZ:~# docker ps\nCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\nroot@iZj6cbu3y55famglsids2zZ:~# docker ps -a\nCONTAINER ID   IMAGE           COMMAND                  CREATED       STATUS                    PORTS     NAMES\n9729682ea764   terminal-b      &quot;docker-entrypoint.s…&quot;   12 days ago   Exited (1) 28 hours ago             compassionate_bose\nc4ffe60c6f1f   server-a        &quot;gunicorn --certfile…&quot;   13 days ago   Exited (0) 28 hours ago             ecstatic_tharp\n33b47e589667   71fd1256c003    &quot;docker-entrypoint.s…&quot;   13 days ago   Created                             hopeful_khorana\n8349468a3c6e   71fd1256c003    &quot;docker-entrypoint.s…&quot;   13 days ago   Created                             focused_aryabhata\n3bc316876340   server-autism   &quot;gunicorn --certfile…&quot;   13 days ago   Exited (0) 13 days ago              optimistic_einstein\n\n重新开始应用\ndocker start compassionate_bose\ndocker start ecstatic_tharp\n\n这里，我们使用了容器的名称（如 compassionate_bose 和 ecstatic_tharp）来启动它们。你也可以使用容器的ID来达到同样的效果。\n"},{"title":"如何把两个程序放入阿里云服务器？",
"url":"/blog/aliyun-two-programs/",
"date":"2023-10-15",
"headings":[],
"body":"我有两个阿里云服务器，一个负责chatFUN的flask后台，主要任务就是作为聊天机器人的后端，连接openai的api，要求要快；一个是nextjs程序，运行我的官网。\n有一天我想，为什么不直接放在一个得了？\n说干就干，我把nextjs所有环境布置后，然后得到一个BUS ERROR，即内存不足。所以我升级内存到2G，这次就成功了。\n贴上我的nginx.conf设置：\nroot@iZj6cbu3y55famglsids2zZ:/etc/nginx# cat nginx.conf\nuser www-data;\nworker_processes auto;\npid /run/nginx.pid;\ninclude /etc/nginx/modules-enabled/*.conf;\n\nevents {\n        worker_connections 768;\n        # multi_accept on;\n}\n\nhttp {\n\n        ##\n        # Basic Settings\n        ##\n\n        sendfile on;\n        tcp_nopush on;\n        types_hash_max_size 2048;\n        # server_tokens off;\n\n        # server_names_hash_bucket_size 64;\n        # server_name_in_redirect off;\n\n        include /etc/nginx/mime.types;\n        default_type application/octet-stream;\n\n        ##\n        # SSL Settings\n        ##\n        server {\n        listen 443 ssl;\n        server_name commonlearner.com;\n\n         location / {\n                proxy_pass http://localhost:3000;\n                proxy_set_header Host $host;\n                proxy_set_header X-Real-IP $remote_addr;\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n                proxy_set_header X-Forwarded-Proto $scheme;\n        }\n\n\n        ssl_certificate /etc/nginx/cert/commonlearner.com.pem;\n        ssl_certificate_key /etc/nginx/cert/commonlearner.com.key;\n\n        ssl_session_cache shared:SSL:1m;\n        ssl_session_timeout 5m;\n\n        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE\n        ssl_prefer_server_ciphers on;\n        }\n        ##\n\n        # 添加 CORS 全局配置\n        add_header Access-Control-Allow-Origin &quot;*&quot;; \n        add_header Access-Control-Allow-Methods &quot;GET, POST, OPTIONS&quot;;\n\n        # Logging Settings\n        ##\n\n        access_log /var/log/nginx/access.log;\n        error_log /var/log/nginx/error.log;\n\n        ##\n        # Gzip Settings\n        ##\n\n        gzip on;\n\n\n        include /etc/nginx/conf.d/*.conf;\n        include /etc/nginx/sites-enabled/*;\n}\n\nnginx.conf 负责SSL证书和转3000口。\n再贴我的/etc/nginx/sites-available/default：\nroot@iZj6cbu3y55famglsids2zZ:/etc/nginx/sites-available# cat default\n##\n# You should look at the following URL&#39;s in order to grasp a solid understanding\n# of Nginx configuration files in order to fully unleash the power of Nginx.\n# https://www.nginx.com/resources/wiki/start/\n# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/\n# https://wiki.debian.org/Nginx/DirectoryStructure\n#\n# In most cases, administrators will remove this file from sites-enabled/ and\n# leave it as reference inside of sites-available where it will continue to be\n# updated by the nginx packaging team.\n#\n# This file will automatically load configuration files provided by other\n# applications, such as Drupal or WordPress. These applications will be made\n# available underneath a path with that package name, such as /drupal8.\n#\n# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.\n##\n\n# Default server configuration\n#\nserver {\n        listen 80 default_server;\n        listen [::]:80 default_server;\n\n        location / {\n                # Redirect all HTTP requests to HTTPS\n                return 301 https://$host$request_uri;\n        }\n\n\n        server_name commonlearner.com;\n\n        #location / {\n                # First attempt to serve request as file, then\n                # as directory, then fall back to displaying a 404.\n                #try_files $uri $uri/ =404;\n        #}\n\n        # pass PHP scripts to FastCGI server\n        #\n        #location ~ \\.php$ {\n        #       include snippets/fastcgi-php.conf;\n        #\n        #       # With php-fpm (or other unix sockets):\n        #       fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n        #       # With php-cgi (or other tcp sockets):\n        #       fastcgi_pass 127.0.0.1:9000;\n        #}\n\n        # deny access to .htaccess files, if Apache&#39;s document root\n        # concurs with nginx&#39;s one\n        #\n        #location ~ /\\.ht {\n        #       deny all;\n        #}\n}\n\n\n# Virtual Host configuration for example.com\n#\n# You can move that to a different file under sites-available/ and symlink that\n# to sites-enabled/ to enable it.\n#\n#server {\n#       listen 80;\n#       listen [::]:80;\n#\n#       server_name example.com;\n#\n#       root /var/www/example.com;\n#       index index.html;\n#\n#       location / {\n#               try_files $uri $uri/ =404;\n#       }\n#}\n\nsites-available/default 只负责80口，即HTTP转成HTTPS，server_name设置为公网IP或者绑定的域名即可，其他不要设置。\n这样一来，我的flask应用是commonlearner.com:5328的地址，nextjs程序是commonlearner.com:3000（实际会被重定向为https://commonlearner.com）两者运行的端口不同，互不干扰。\n剩下的就是永久启动了。nextjs程序我用的是pm2，具体可以参考我nextjs系列的文章。flask应用我用的是gunicorn。\n"},{"title":"linux知识-如何使用vim/neovim编辑器？",
"url":"/blog/vim/",
"date":"2023-10-14",
"headings":[{"level":1,"id":"fu-zhi-nian-tie","permalink":"https://linxz.online/blog/vim/#fu-zhi-nian-tie","title":"复制粘贴","children":[{"level":2,"id":"fu-zhi-bu-fen-wen-ben","permalink":"https://linxz.online/blog/vim/#fu-zhi-bu-fen-wen-ben","title":"复制部分文本","children":[]},{"level":2,"id":"fu-zhi-dang-ye","permalink":"https://linxz.online/blog/vim/#fu-zhi-dang-ye","title":"复制当页","children":[]},{"level":2,"id":"fu-zhi-quan-wen","permalink":"https://linxz.online/blog/vim/#fu-zhi-quan-wen","title":"复制全文","children":[]}]},{"level":1,"id":"shan-chu","permalink":"https://linxz.online/blog/vim/#shan-chu","title":"删除","children":[{"level":2,"id":"quan-bu-shan-chu","permalink":"https://linxz.online/blog/vim/#quan-bu-shan-chu","title":"全部删除","children":[]}]},{"level":1,"id":"fan-hui-shang-yi-bu","permalink":"https://linxz.online/blog/vim/#fan-hui-shang-yi-bu","title":"返回上一步","children":[]},{"level":1,"id":"duo-xing-suo-jin","permalink":"https://linxz.online/blog/vim/#duo-xing-suo-jin","title":"多行缩进","children":[]},{"level":1,"id":"yu-shang-yi-xing-suo-jin-bao-chi-yi-zhi","permalink":"https://linxz.online/blog/vim/#yu-shang-yi-xing-suo-jin-bao-chi-yi-zhi","title":"与上一行缩进保持一致","children":[]},{"level":1,"id":"cha-zhao","permalink":"https://linxz.online/blog/vim/#cha-zhao","title":"查找","children":[]},{"level":1,"id":"yi-dao-zui-hou-yi-xing","permalink":"https://linxz.online/blog/vim/#yi-dao-zui-hou-yi-xing","title":"移到最后一行","children":[]},{"level":1,"id":"yi-dao-zui-hou-yi-ge-zi","permalink":"https://linxz.online/blog/vim/#yi-dao-zui-hou-yi-ge-zi","title":"移到最后一个字","children":[]},{"level":1,"id":"guang-biao-yi-dao-shou-xing","permalink":"https://linxz.online/blog/vim/#guang-biao-yi-dao-shou-xing","title":"光标移到首行","children":[]},{"level":1,"id":"dan-ci-jian-yi-dong","permalink":"https://linxz.online/blog/vim/#dan-ci-jian-yi-dong","title":"单词间移动","children":[]},{"level":1,"id":"vim-guang-biao-xuan-zhong-duo-xing","permalink":"https://linxz.online/blog/vim/#vim-guang-biao-xuan-zhong-duo-xing","title":"vim 光标选中多行","children":[]},{"level":1,"id":"hui-dao-shang-yi-bu","permalink":"https://linxz.online/blog/vim/#hui-dao-shang-yi-bu","title":"回到上一步","children":[]},{"level":1,"id":"hui-dao-xia-yi-bu","permalink":"https://linxz.online/blog/vim/#hui-dao-xia-yi-bu","title":"回到下一步","children":[]}],
"body":"阿里云内置vim编辑器，用来编辑文件很方便。在这里写一些简单的操作。\n输入i进入插入模式，可以插入信息\n按下esc进入一般模式\n复制粘贴\n在一般模式下\ny - 复制\nyy - 复制一行\n7yy - 复制七行（在第一行的位置输入7yy）\np - 粘贴文本\n复制部分文本\n按v进入可视模式，选择多行，按y或者&quot;+y（复制到系统剪贴板）\n复制当页\nyG复制当页的内容。如果复制不全，按command-缩小页面\n复制全文\nggVG - 选中全文\nggVGy - 复制全文\n&quot;+y - 复制到系统剪贴板\n删除\ndd - 删除行\n7dd - 删除七行\n全部删除\ndG\n返回上一步\n一般模式下，按u\n多行缩进\n按v或者V进入visual模式\n上下键选中多行\nshift+&lt; 左缩进\nshift+&gt; 右缩进\n与上一行缩进保持一致\nv进入visual模式\n按↓来选中需要缩进的行\n按=保持与未选中的上一行一样的距离\n查找\n输入/，输入查找内容，按回车\nn是查找下一个，N是查找上一个。\n移到最后一行\n输入大写G即可\n移到最后一个字\ng_\n光标移到首行\n输入gg\n单词间移动\nw(word) - 移动到下一个单词 头\nb(begin) - 移动到本单词上一个单词 头\ne(end) - 移动到本单词/下一个单词 尾\nvim 光标选中多行\nctrl + v 进入visual模式\n用j/k键可以上下选中多行\n按d删除选中的内容\n按大写的I进入编辑模式，可批量输入内容。\n回到上一步\n在普通模式下，按u\n回到下一步\nctrl + r\n"},{"title":"nextjs 网站搬上阿里云需要什么？",
"url":"/blog/nextjs-aliyun/",
"date":"2023-10-13",
"headings":[{"level":1,"id":"1-shou-xian-ni-xu-yao-yi-ge-wang-zhan-fei-hua","permalink":"https://linxz.online/blog/nextjs-aliyun/#1-shou-xian-ni-xu-yao-yi-ge-wang-zhan-fei-hua","title":"1.首先你需要一个网站（废话）","children":[]},{"level":1,"id":"2-ni-xu-yao-yi-ge-a-li-yun-fu-wu-qi-fei-hua","permalink":"https://linxz.online/blog/nextjs-aliyun/#2-ni-xu-yao-yi-ge-a-li-yun-fu-wu-qi-fei-hua","title":"2.你需要一个阿里云服务器（废话）","children":[]},{"level":1,"id":"3-npm-installman-jie-jue-fang-fa","permalink":"https://linxz.online/blog/nextjs-aliyun/#3-npm-installman-jie-jue-fang-fa","title":"3.npm install慢解决方法","children":[]},{"level":1,"id":"4-yun-zhu-ji-bi-yao-an-zhuang","permalink":"https://linxz.online/blog/nextjs-aliyun/#4-yun-zhu-ji-bi-yao-an-zhuang","title":"4.云主机必要安装","children":[]},{"level":1,"id":"5-mai-ge-yu-ming","permalink":"https://linxz.online/blog/nextjs-aliyun/#5-mai-ge-yu-ming","title":"5.买个域名","children":[]},{"level":1,"id":"6-npm-run-build","permalink":"https://linxz.online/blog/nextjs-aliyun/#6-npm-run-build","title":"6.npm run build","children":[]},{"level":1,"id":"7-rang-wang-zhan-yi-zhi-yun-xing","permalink":"https://linxz.online/blog/nextjs-aliyun/#7-rang-wang-zhan-yi-zhi-yun-xing","title":"7.让网站一直运行","children":[{"level":2,"id":"shi-yong-pm2","permalink":"https://linxz.online/blog/nextjs-aliyun/#shi-yong-pm2","title":"使用 PM2","children":[]}]},{"level":1,"id":"8-xia-yi-bu","permalink":"https://linxz.online/blog/nextjs-aliyun/#8-xia-yi-bu","title":"8.下一步","children":[]},{"level":1,"id":"9-bus-error","permalink":"https://linxz.online/blog/nextjs-aliyun/#9-bus-error","title":"9.BUS ERROR","children":[]}],
"body":"1.首先你需要一个网站（废话）\n2.你需要一个阿里云服务器（废话）\n阿里云服务器选择最低配，但是注意cpu不要选择0.5核的，实测下来下载速度贼慢。\n特别是在npm install的时候。\n3.npm install慢解决方法\nhttps://developer.aliyun.com/article/834193\n用国内的镜像，通过这三步：\n换上阿里巴巴镜像\nnpm config set registry https://registry.npmmirror.com\n\n实测下来，这个镜像有时候也很慢，不知道是不是因为我的服务器在香港的缘故，下面淘宝镜像我还没试，可以一试：\n可选\nnpm config set registry https://registry.npm.taobao.org\n\n查看是否更换成功\nnpm config get registry\n\n可以办正事了\nnpm i\n\n4.云主机必要安装\n必须安装npm和node\nsudo apt install nodejs npm\n\n检查是否安装成功\nnode -v\nnpm -v\n\n5.买个域名\n可以在namesilo或者阿里云购买，注意阿里云购买需要实名认证，上传身份证并验证（大约需要20分钟），namesilo买则很丝滑。\n但我发现阿里云买更便宜，买了个.life后缀的域名，10年180+，很划算。\n阿里云买域名后要自己解析，用阿里云的DNS解析地址：\nns1.alidns.com\nns2.alidns.com\n再添加两条A记录，一条主机记录是@，一条主机记录是www，都指向你的云主机公网IP即可。\n6.npm run build\nnpm i之后，执行npm run build，成功后就可以执行npm start了！\nnpm start成功后，程序会运行在3000端口，记得在阿里云安全规则中打开3000接口，允许所有计算机访问（0.0.0.0/0），这样外网才能访问到这个应用。\n但是，现在用户用通过 公网IP:3000 才能访问到你的应用。所以我们还需要通过nginx设置来让用户直接访问你的网站。\n通常，你可以在 /etc/nginx/sites-available/ 下找到默认的 Nginx 配置，通常命名为 default。使用你喜欢的文本编辑器编辑它：\nsudo vim /etc/nginx/sites-available/default\n\n在 server 块中，你可以添加或修改 location 指令以设置反向代理。例如，将所有请求代理到在 3000 端口运行的 Next.js 应用程序：\nserver {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n\n    server_name your_domain_or_ip;  # 替换为你的域名或 IP 地址\n\n    location / {\n        proxy_pass http://localhost:3000;  # 将请求代理到本地的 3000 端口\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection &#39;upgrade&#39;;\n        proxy_set_header Host $host;\n        proxy_cache_bypass $http_upgrade;\n    }\n}\n\n重新加载 Nginx：\n保存并关闭配置文件后，重新加载 Nginx 以应用更改：\nsudo systemctl reload nginx\n\n现在，重新执行 npm start 已经可以正常在公网IP上访问你的网站了，原理是直接访问你HTTP口（prot:80），nginx通过反向代理转到localhost:3000，所以就成功了。\n7.让网站一直运行\n使用 PM2\nPM2 是一个流行的 Node.js 进程管理器，可以使应用持续运行，自动重启应用程序如果它崩溃了，并在系统重启后启动应用程序。\n安装：\nnpm install pm2 -g\n\n启动：\npm2 start npm --name &quot;my-next-app&quot; -- start\n\npm2 startup\npm2 startup\n\n保存当前的 PM2 进程列表\npm2 save\n\n查看pm2进程\npm2 list\n\n停止pm2进程\npm2 stop &lt;app_name_or_id&gt;\npm2 stop all #停止所有\n\n重启pm2\npm2 restart &lt;app_name_or_id&gt;\n\n彻底删除pm2\npm2 delete &lt;app_name_or_id&gt;\n\n8.下一步\n获取SSL证书，把网址变成HTTPS安全模式。\n探索下来，最终配置要放在/etc/nginx/nginx.conf比较靠谱，贴下我最终的代码：\nroot@iZj6c6gq7umdxx4foh861kZ:/etc/nginx# cat nginx.conf\n\nuser www-data;\nworker_processes auto;\npid /run/nginx.pid;\ninclude /etc/nginx/modules-enabled/*.conf;\n\nevents {\n        worker_connections 768;\n        # multi_accept on;\n}\n\nhttp {\n\n        ##\n        # Basic Settings\n        ##\n\n        sendfile on;\n        tcp_nopush on;\n        types_hash_max_size 2048;\n        # server_tokens off;\n\n        # server_names_hash_bucket_size 64;\n        # server_name_in_redirect off;\n\n        include /etc/nginx/mime.types;\n        default_type application/octet-stream;\n\n        ##\n        # SSL Settings\n        ##\n\n        server {\n        listen 443 ssl;\n        server_name linxz.fun;\n\n\n        location / {\n                proxy_pass http://localhost:3000;\n                proxy_set_header Host $host;\n                proxy_set_header X-Real-IP $remote_addr;\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n                 proxy_set_header X-Forwarded-Proto $scheme;\n        }\n\n        # ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE\n        # ssl_prefer_server_ciphers on;\n\n        ssl_certificate /etc/nginx/cert/linxz.fun.pem;\n        ssl_certificate_key /etc/nginx/cert/linxz.fun.key;\n\n        ssl_session_cache shared:SSL:1m;\n        ssl_session_timeout 5m;\n\n        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE\n        ssl_prefer_server_ciphers on;\n        }\n\n\n        # ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE\n        # ssl_prefer_server_ciphers on;\n\n        ##\n        # Logging Settings\n        ##\n\n        access_log /var/log/nginx/access.log;\n        error_log /var/log/nginx/error.log;\n\n        ##\n        # Gzip Settings\n        ##\n\n        gzip on;\n\n        # gzip_vary on;\n        # gzip_proxied any;\n        # gzip_comp_level 6;\n        # gzip_buffers 16 8k;\n        # gzip_http_version 1.1;\n        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;\n\n        ##\n        # Virtual Host Configs\n        ##\n\n        include /etc/nginx/conf.d/*.conf;\n        include /etc/nginx/sites-enabled/*;\n}\n\n\n#mail {\n#       # See sample authentication script at:\n#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript\n#\n#       # auth_http localhost/auth.php;\n#       # pop3_capabilities &quot;TOP&quot; &quot;USER&quot;;\n#       # imap_capabilities &quot;IMAP4rev1&quot; &quot;UIDPLUS&quot;;\n#\n#       server {\n#               listen     localhost:110;\n#               protocol   pop3;\n#               proxy      on;\n#       }\n#\n#       server {\n#               listen     localhost:143;\n#               protocol   imap;\n#               proxy      on;\n#       }\n#}\n\n同时贴一下/etc/nginx/sites-available/default的配置：\nroot@iZj6c6gq7umdxx4foh861kZ:/etc/nginx/sites-available# cat default\n##\n# You should look at the following URL&#39;s in order to grasp a solid understanding\n# of Nginx configuration files in order to fully unleash the power of Nginx.\n# https://www.nginx.com/resources/wiki/start/\n# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/\n# https://wiki.debian.org/Nginx/DirectoryStructure\n#\n# In most cases, administrators will remove this file from sites-enabled/ and\n# leave it as reference inside of sites-available where it will continue to be\n# updated by the nginx packaging team.\n#\n# This file will automatically load configuration files provided by other\n# applications, such as Drupal or WordPress. These applications will be made\n# available underneath a path with that package name, such as /drupal8.\n#\n# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.\n##\n\n# Default server configuration\n#\n# HTTP configuration (for redirection to HTTPS)\nserver {\n        listen 80;\n        listen [::]:80;\n\n        server_name linxz.fun;\n\n        location / {\n                # Redirect all HTTP requests to HTTPS\n                return 301 https://$host$request_uri;\n        }\n}\n\n# HTTPS configuration\n#server {\n        #listen 443 ssl;\n        #listen [::]:443 ssl;\n\n        # SSL certificates\n        # ssl_certificate /etc/nginx/cert/linxz.fun.pem;\n        #ssl_certificate_key /etc/nginx/cert/linxz.fun.key;\n        #ssl_session_cache shared:SSL:1m;\n        #ssl_session_timeout 5m;\n        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;\n        #ssl_prefer_server_ciphers on;\n\n        # root /var/www/html;\n        # index index.html index.htm index.nginx-debian.html;\n\n        # server_name linxz.fun;\n\n#        location / {\n #               proxy_pass http://localhost:3000;\n  #              proxy_http_version 1.1;\n   #             proxy_set_header Upgrade $http_upgrade;\n    #            proxy_set_header Connection &#39;upgrade&#39;;\n     #           proxy_set_header Host $host;\n      #          proxy_cache_bypass $http_upgrade;\n       # }\n\n        # Optional, only if you plan to use PHP\n        #location ~ \\.php$ {\n        #       include snippets/fastcgi-php.conf;\n        #       fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n        #}\n\n        # Deny access to .htaccess files (if you&#39;re using them)\n        #location ~ /\\.ht {\n        #       deny all;\n        #}\n#}\n\n\n# Virtual Host configuration for example.com\n#\n# You can move that to a different file under sites-available/ and symlink that\n# to sites-enabled/ to enable it.\n#\n#server {\n#       listen 80;\n#       listen [::]:80;\n#\n#       server_name example.com;\n#\n#       root /var/www/example.com;\n#       index index.html;\n#\n#       location / {\n#               try_files $uri $uri/ =404;\n#       }\n#}\n\n本服务器的nginx配置分析：\nnginx.conf解决HTTPS配置问题。它是主配置文件，影响服务器所有文件。里面的设置比较重要，这里主要解决443端口，即HTTPS链接到localhost:3000端口的问题，以及SSL证书配置问题。\nsites-available解决HTTP重定向问题。它其实是网页设置，解决80端口（即HTTP）重定向到443端口（即HTTPS）的问题。\n我一般用vim修改，每次修改完要重启一下nginx，命令是：\nsudo nginx -s reload\n\n一般nginx都能识别自己的目录，阿里云官网这个步骤太复杂，可以不用：\ncd /usr/local/nginx/sbin  #进入Nginx服务的可执行目录。\n./nginx -s reload  #重新载入配置文件。\n\n9.BUS ERROR\n运行 npm run build 遇到这个错误：\n Creating an optimized production build  ..Bus error (core dumped)\n\n这是指你的云主机内存不足，需要加内存了。\n你可以通过free -h命令来查看剩余内存，通过df -h来查看剩余磁盘空间，我的free -h结果：\nroot@iZj6cbu3y55famglsids2zZ:~/terminal-blog-nomodule# free -h\n               total        used        free      shared  buff/cache   available\nMem:           957Mi       652Mi        70Mi       2.0Mi       234Mi       149Mi\nSwap:             0B          0B          0B\n\n我的df -h结果:\nroot@iZj6cbu3y55famglsids2zZ:~/terminal-blog-nomodule# df -h\nFilesystem      Size  Used Avail Use% Mounted on\ntmpfs            96M  1.1M   95M   2% /run\n/dev/vda3        40G  5.0G   33G  14% /\ntmpfs           479M     0  479M   0% /dev/shm\ntmpfs           5.0M     0  5.0M   0% /run/lock\n/dev/vda2       197M  6.1M  191M   4% /boot/efi\ntmpfs            50M     0   50M   0% /usr/local/aegis/cgroup\ntmpfs            96M  4.0K   96M   1% /run/user/0\n\n可以在available中，看出我的硬盘空间还可以，但是内存空间明显不足，只剩下100多M，不足够执行一次npm run build。\n我继续查看占用巨大空间的应用，使用top命令，或htop命令。推荐使用htop，更直观，可以点击MEM，按内存使用来排名：\n安装htop：\nsudo apt-get install htop\n\n在终端中输入htop并按Enter，可以点击MEM列，查看排名。我这边是因为使用了一个python后端，所以导致内存使用过高。所以，1G内存下，既要运行一个后端，又要运行一个前端有点吃紧，需要升级内存。\n在阿里云看，从1G内存升级到2G需要多少钱，8.93元，果断升级。\n增加内存后还是bus error？\n这是缓存问题，需要删掉.next文件和node_modules文件：\n在应用目录下：\nrm -r .next\nrm -r node_modules\n\n重新运行npm run build\n"},{"title":"有多少种 embedding 模型？",
"url":"/blog/embedding-models-how-many/",
"date":"2023-10-12",
"headings":[{"level":1,"id":"zi-ce-san-chong-mo-xing","permalink":"https://linxz.online/blog/embedding-models-how-many/#zi-ce-san-chong-mo-xing","title":"自测三种模型","children":[{"level":2,"id":"ru-he-diao-yong-yi-shang-san-chong-mo-xing","permalink":"https://linxz.online/blog/embedding-models-how-many/#ru-he-diao-yong-yi-shang-san-chong-mo-xing","title":"如何调用以上三种模型？","children":[]}]},{"level":1,"id":"tong-wei-du-mo-xing-bu-neng-hun-yong","permalink":"https://linxz.online/blog/embedding-models-how-many/#tong-wei-du-mo-xing-bu-neng-hun-yong","title":"同维度模型不能混用","children":[]},{"level":1,"id":"langchainde-ming-dan","permalink":"https://linxz.online/blog/embedding-models-how-many/#langchainde-ming-dan","title":"langchain的名单","children":[{"level":2,"id":"can-kao-lian-jie","permalink":"https://linxz.online/blog/embedding-models-how-many/#can-kao-lian-jie","title":"参考链接","children":[]}]}],
"body":"答：我不知道。google 不知道。GPT 也不知道。\n这是 GPT 搜索网络后，给我的答案。看得出它很努力，通过许多网站找到这些模型：\n我的 prompt:\n列出主流的embedding model，列出10个\nGPT 回答：\nHere is a list of 10 mainstream embedding models as of 2023, sourced from different references:\n\nST5-XXL, GTR-XXL, SGPT-5.8B-msmarco: These models are mentioned in the Massive Text Embedding Benchmark (MTEB) by Hugging Face as multi-billion parameter models dominating on MTEB, with SGPT-5.8B-msmarco specifically noted for producing 4096-dimensional embeddings​1​.\n\nNew Embedding Model by OpenAI: Mentioned by OpenAI as a more powerful tool for natural language processing and code tasks, achieving better or similar performance as the old Davinci models at a much lower price​2​.\n\nGTE (General Text Embedding): A general-purpose text embedding model trained with multi-stage contrastive learning as per a submission on Arxiv​3​.\n\nTF-IDF (Term Frequency-Inverse Document Frequency): A statistical measure used to evaluate the importance of a word in a document or corpus.\n\nWord2Vec: A group of related models that are used to produce word embeddings.\n\nGloVe (Global Vectors for Word Representation): An unsupervised learning algorithm for obtaining vector representations for words.\n\nFastText: An open-source, free, lightweight library that allows users to learn text representations and text classifiers.\n\nELMO (Embeddings from Language Models): A novel way to represent words in vectors or embeddings.\n\nCoVe (Context Vectors): Learns a representation of words by training on a large corpus of text.\n\nBERT (Bidirectional Encoder Representations from Transformers) and RoBERTa (A Robustly Optimized BERT Pretraining Approach): Models that learn word representations bidirectionally, which is considered more powerful than unidirectional or independently learned word representations​4​.\n\nThese models represent a mix of traditional, evolving, and novel approaches to text embeddings, each with its own strengths and use cases across different NLP tasks and applications.\n\nThese models represent a mix of traditional, evolving, and novel approaches to text embeddings, each with its own strengths and use cases across different NLP tasks and applications.\n自测三种模型\n我自己用过三个模型openai、minimax、SentenceTransformers，测试的是中文结果搜索。总的来说，openai 的 ada 模型表现最好，几乎每次都能命中我想要的答案。minimax 效果次之，但也够用。SentenceTransformers （即SBERT）的效果最差。\nSentenceTransformers是免费的，其他两个模型不是。\nSentenceTransformers是768维的，openai和minimax是1536维的。\n如何调用以上三种模型？\n可以参考我之前的文章。\n同维度模型不能混用\n需要注意的是，即使维度相同（比如openai和minimax都是1536维），embedding模型不能混用。比如你用openai的模型embedding，但是用minimax模型来query，效果往往不好。我猜想是每家embedding都是用不同的算法，以致搜索出来的向量位置是不一样的。\nlangchain的名单\nlangchain 提供了一系列能用的text_embedding模型，这应该算是比较完整的主流榜单了。\n参考链接\nSentenceTransformers 官方文档\n"},{"title":"flex 应用：如何让居中的元素左对齐？",
"url":"/blog/flex-left-align/",
"date":"2023-10-12",
"headings":[{"level":2,"id":"can-kao-lian-jie","permalink":"https://linxz.online/blog/flex-left-align/#can-kao-lian-jie","title":"参考链接","children":[]}],
"body":"实现效果：\n\n解释：\n1.最外层用flex来使用flex布局，items-center和justify-center保证居中元素效果\n2.次外层用flex flex-col来使用flex布局，items-start保证左对齐效果\n&lt;div className=&quot;flex items-center justify-center min-h-screen bg-gray-800&quot;&gt;\n  &lt;div className=&quot;flex flex-col items-start ml-10&quot;&gt;\n    &lt;h1 className={&quot;text-xl md:text-3xl font-bold text-purple-400 &quot; + ps2.className}&gt;\n      linxz:$ \n        &lt;span className=&quot;text-gray-500&quot;&gt; type help to start&lt;/span&gt;\n    &lt;/h1&gt;\n\n    &lt;p className=&quot;text-base text-gray-300 mt-10&quot;&gt;\n      Visit &lt;a href=&quot;https://www.linxiaozhong.club&quot; className=&quot;text-teal-200&quot;&gt;Normal Website&lt;/a&gt;\n    &lt;/p&gt;\n\n    &lt;p className={&quot;text-[8px] md:text-base text-gray-300 mt-10 &quot; + ps2.className}&gt;\n      θ/007 ~ &lt;span className=&quot;text-teal-200&quot;&gt;{&#39;&gt;&gt; $  &#39;}&lt;/span&gt;\n      &lt;input \n        ref={firstInputRef}\n        className=&quot;mt-4 bg-gray-800 text-white p-2 rounded focus:outline-none&quot;\n        value={firstInputValue} \n        onChange={handleFirstInputChange} \n      /&gt;\n    &lt;/p&gt;\n  &lt;/div&gt;\n&lt;/div&gt;\n\n参考链接\nTailwindCSS align-items\n"},{"title":"如何做知识库检索机器人（RAG检索）",
"url":"/blog/rag/",
"date":"2023-10-12",
"headings":[{"level":1,"id":"shen-me-shi-zhi-shi-ku-jian-suo","permalink":"https://linxz.online/blog/rag/#shen-me-shi-zhi-shi-ku-jian-suo","title":"什么是知识库检索？","children":[{"level":4,"id":"tu-pian-by-guangzheng-li","permalink":"https://linxz.online/blog/rag/#tu-pian-by-guangzheng-li","title":"图片 by Guangzheng Li","children":[]}]},{"level":1,"id":"ji-ben-bu-zou","permalink":"https://linxz.online/blog/rag/#ji-ben-bu-zou","title":"基本步骤","children":[{"level":2,"id":"1-xiang-liang-cun-chu-zhi-shi","permalink":"https://linxz.online/blog/rag/#1-xiang-liang-cun-chu-zhi-shi","title":"1.向量存储知识","children":[]},{"level":2,"id":"2-xiang-liang-zhuan-hua-wen-ti","permalink":"https://linxz.online/blog/rag/#2-xiang-liang-zhuan-hua-wen-ti","title":"2.向量转化问题","children":[]},{"level":2,"id":"3-ti-qu-xiang-jin-zhi","permalink":"https://linxz.online/blog/rag/#3-ti-qu-xiang-jin-zhi","title":"3.提取相近值","children":[]},{"level":2,"id":"4-llm-guo-lu","permalink":"https://linxz.online/blog/rag/#4-llm-guo-lu","title":"4.LLM 过滤","children":[]}]},{"level":1,"id":"guo-du-jian-suo-wen-ti","permalink":"https://linxz.online/blog/rag/#guo-du-jian-suo-wen-ti","title":"“过度检索”问题","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/rag/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"什么是知识库检索？\n知识库检索，又称为“检索增强生成”（RAG），是2020年MetaAI研究人员提出的概念。因为 LLM 的知识在训练之后，即变成静态的，无法适应时间的变化。\n因此，更新的知识只能通过两种方法：1.重新训练模型；2.链接外部的知识库。\n由于方法一既耗时又耗钱，所以我们就用方法二为主，这就是知识库检索——将外部知识库链接给LLM，让LLM来检索。\n而检索效率上，又以向量检索准确度最高，所以通常辅以“向量检索”的知识。\n知识库检索的一般流程如下：\n\n图片 by Guangzheng Li\n基本步骤\n1.向量存储知识\n将文件（Document）的文字提出出来，分解成块（chunk），再用 embedding 模型将之存储起来，通常会存储在向量数据库中（vectore stores）。\n2.向量转化问题\n将用户的问题通过 embedding 模型转化为向量。\n3.提取相近值\n将“问题向量”和“知识库向量“做比对，通过计算找到距离最近的”知识库向量“，再把”知识库向量”里的文字提取出来。\n4.LLM 过滤\n由于提取出来的结果未必切题，所以把“用户问题”和“提取结果”最后提交给LLM，要求LLM以“提取结果”为参考，输出最终答案。\n“过度检索”问题\n如果你按照以上方法操作，或早或晚你会碰到“过度检索”的问题。什么意思？意思就是每一次你的问题，不管是否在知识库内，系统都会去检索知识库，这样又费时，效果又变差。\n怎么办呢？\n解决方法就是“function calling”。众所周知，我们可以通过调用函数，增强 GPT 的能力，这里也是借用它的思想——将知识库函数化，由 LLM 自己判断是否要检索知识库。\nopenai function calling 的文章可以参考这两篇：\nstream 版 或 非 stream 版\nminimax版\n参考资料\n向量知识库知识\n知识库检索概念\n"},{"title":"如何在 Tailwind CSS 里面设置响应式布局？",
"url":"/blog/tailwind-responsive/",
"date":"2023-10-12",
"headings":[{"level":1,"id":"bu-tong-chi-cun-da-xiao-can-kao","permalink":"https://linxz.online/blog/tailwind-responsive/#bu-tong-chi-cun-da-xiao-can-kao","title":"不同尺寸大小参考","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/tailwind-responsive/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"响应式布局，即响应不同屏幕大小的界面，运用不同大小的元素（文字、画框等）\n最简单的就是改变sm、md、lg大小，我们可以这样设置：\nclassName = &quot;hidden md:block md:w-[300px]&quot;\n\n以上的代码意思为——\n当屏幕尺寸为sm（small）时，该元素隐藏（hidden），而当md（medium）以上时，显示（block），且元素宽度固定为 300px。\n注意：\n因为响应式布局是从小到大覆盖的，所以一般不会用到sm:，一般是md或者lg以上设置状态\n不同尺寸大小参考\n/** @type {import(&#39;tailwindcss&#39;).Config} */\nmodule.exports = {\n  theme: {\n    screens: {\n      &#39;sm&#39;: &#39;640px&#39;,\n      // =&gt; @media (min-width: 640px) { ... }\n\n      &#39;md&#39;: &#39;768px&#39;,\n      // =&gt; @media (min-width: 768px) { ... }\n\n      &#39;lg&#39;: &#39;1024px&#39;,\n      // =&gt; @media (min-width: 1024px) { ... }\n\n      &#39;xl&#39;: &#39;1280px&#39;,\n      // =&gt; @media (min-width: 1280px) { ... }\n\n      &#39;2xl&#39;: &#39;1536px&#39;,\n      // =&gt; @media (min-width: 1536px) { ... }\n    }\n  }\n}\n\n这个尺寸也是可以自定义的，按照官网链接设置即可。\n参考资料\nTailwindCSS 官网 – 响应式设计\n"},{"title":"如何在 nextjs 项目里面使用 google font？",
"url":"/blog/nextjs-google-font/",
"date":"2023-10-11",
"headings":[{"level":1,"id":"import-zi-ti","permalink":"https://linxz.online/blog/nextjs-google-font/#import-zi-ti","title":"import 字体","children":[]},{"level":1,"id":"she-ding-zi-ti-shu-xing","permalink":"https://linxz.online/blog/nextjs-google-font/#she-ding-zi-ti-shu-xing","title":"设定字体属性","children":[]},{"level":1,"id":"fang-ru-classname","permalink":"https://linxz.online/blog/nextjs-google-font/#fang-ru-classname","title":"放入className","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/nextjs-google-font/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"我使用的 google font 是Press Start 2P。\nimport 字体\nimport { Press_Start_2P } from &quot;next/font/google&quot;;\n\n设定字体属性\nconst ps2 = Press_Start_2P({ subsets: [&quot;latin&quot;], weight:&#39;400&#39;});\n\nsubsets：只需要引进子集，减少空间浪费，比如只引进标准latin字母即可。\nweight：字体粗细。\n放入className\n&lt;h1 className={&quot;text-3xl font-bold text-purple-400 &quot; + ps2.className}&gt;\n\n完整代码如下：\nimport { Press_Start_2P } from &quot;next/font/google&quot;;\nconst ps2 = Press_Start_2P({ subsets: [&quot;latin&quot;], weight:&#39;400&#39;});\n\nexport default function Home() {\n  return (\n    &lt;div className=&quot;flex flex-col items-center justify-center min-h-screen py-2 bg-gray-800&quot;&gt;\n      &lt;h1 className={&quot;text-3xl font-bold text-purple-400 &quot; + ps2.className}&gt;\n        linxz:$ \n          &lt;span className=&quot;text-gray-500&quot;&gt; type help to start&lt;/span&gt;\n      &lt;/h1&gt;\n\n      &lt;div className=&quot;w-full max-w-2xl rounded-lg bg-gray-800 text-gray-100 p-4&quot;&gt;\n        {/* 终端内容 */}\n      &lt;/div&gt;\n    &lt;/div&gt;\n  )\n}\n\n注意三个点：\n\n\n原字体名字是Press Start 2P，带空格的，nextjs代码处理上，需要统一把空格变成下划线，即Press_Start_2P；\n\n\n必须加上 weight 属性；\n\n\n将className框起来时，注意后面要留空格，比如上面的text-purple-400后面带空格，这一块我可是debug了很久，不知道为啥字体不生效。\n\n\n参考资料\nnextjs 官网字体功能\ngoogle fonts\n"},{"title":"Tailwind CSS 常用功能参考",
"url":"/blog/tailwind-css/",
"date":"2023-10-11",
"headings":[{"level":1,"id":"zi-ti","permalink":"https://linxz.online/blog/tailwind-css/#zi-ti","title":"字体","children":[{"level":2,"id":"zi-ti-da-xiao-font-size","permalink":"https://linxz.online/blog/tailwind-css/#zi-ti-da-xiao-font-size","title":"字体大小 Font Size","children":[]},{"level":2,"id":"zi-ti-yan-se-text-color","permalink":"https://linxz.online/blog/tailwind-css/#zi-ti-yan-se-text-color","title":"字体颜色 Text Color","children":[]},{"level":2,"id":"zi-ti-dui-qi-text-center","permalink":"https://linxz.online/blog/tailwind-css/#zi-ti-dui-qi-text-center","title":"字体对齐 Text Center","children":[]},{"level":2,"id":"zi-ti-jia-cu-font-weight","permalink":"https://linxz.online/blog/tailwind-css/#zi-ti-jia-cu-font-weight","title":"字体加粗 Font Weight","children":[]}]},{"level":1,"id":"shu-ru-kuang","permalink":"https://linxz.online/blog/tailwind-css/#shu-ru-kuang","title":"输入框","children":[]}],
"body":"因为每次做网站的时候都需要参考 Tailwind CSS，所以将常用的粘贴在这里，以供参考：\n字体\n字体大小 Font Size\ntext-base text-lg text-3xl\nhttps://tailwindcss.com/docs/font-size\n字体颜色 Text Color\ntext-red-700\nhttps://tailwindcss.com/docs/text-color\n字体对齐 Text Center\ntext-center text-left\nhttps://tailwindcss.com/docs/text-align\n字体加粗 Font Weight\nfont-bold\nhttps://tailwindcss.com/docs/font-weight\n输入框\n输入框input去边框\n\nfocus:outline-none\nhttps://tailwindcss.com/docs/hover-focus-and-other-states\n"},{"title":"如何自动生成python的requiremnt文件",
"url":"/blog/python-requirement/",
"date":"2023-10-09",
"headings":[{"level":1,"id":"fang-fa-yi-pip-freeze","permalink":"https://linxz.online/blog/python-requirement/#fang-fa-yi-pip-freeze","title":"方法一：pip freeze","children":[]},{"level":1,"id":"fang-fa-er-pip-install-pipreqs","permalink":"https://linxz.online/blog/python-requirement/#fang-fa-er-pip-install-pipreqs","title":"方法二：pip install pipreqs","children":[]}],
"body":"方法一：pip freeze\n如果你的项目在虚拟环境（或者云主机环境）中，你可以使用pip freeze命令来列出所有已安装的库及其版本号。请注意，这将列出所有库，不仅仅是你的app.py文件所依赖的库。\npip freeze &gt; requirements.txt\n\n方法二：pip install pipreqs\n有一些工具可以帮助你自动识别Python文件的依赖项，例如pipreqs。你可以安装和使用它来生成requirements.txt文件。\npip install pipreqs\npipreqs\n\n这将在你的项目目录中生成一个requirements.txt文件，列出所有依赖项及其版本号。\n"},{"title":"如何连接 supabase 向量数据库",
"url":"/blog/supabase-vector/",
"date":"2023-10-09",
"headings":[{"level":1,"id":"guan-fang-lian-jie-tui-jian-adapter","permalink":"https://linxz.online/blog/supabase-vector/#guan-fang-lian-jie-tui-jian-adapter","title":"官方连接推荐 – adapter","children":[{"level":2,"id":"1-import-openai","permalink":"https://linxz.online/blog/supabase-vector/#1-import-openai","title":"1.import openai","children":[]},{"level":2,"id":"2-du-qu-csvwen-jian","permalink":"https://linxz.online/blog/supabase-vector/#2-du-qu-csvwen-jian","title":"2.读取csv文件","children":[]},{"level":2,"id":"3-embedding","permalink":"https://linxz.online/blog/supabase-vector/#3-embedding","title":"3.embedding","children":[]},{"level":2,"id":"4-lian-jie-vecs-shu-ju-ku","permalink":"https://linxz.online/blog/supabase-vector/#4-lian-jie-vecs-shu-ju-ku","title":"4.连接 vecs 数据库","children":[]},{"level":2,"id":"5-upsert-data","permalink":"https://linxz.online/blog/supabase-vector/#5-upsert-data","title":"5.upsert data","children":[]},{"level":2,"id":"6-query","permalink":"https://linxz.online/blog/supabase-vector/#6-query","title":"6. query","children":[]}]},{"level":1,"id":"langchain-lian-jie","permalink":"https://linxz.online/blog/supabase-vector/#langchain-lian-jie","title":"langchain 连接","children":[{"level":2,"id":"1-an-zhuang-ku","permalink":"https://linxz.online/blog/supabase-vector/#1-an-zhuang-ku","title":"1.安装库","children":[]},{"level":2,"id":"2-lian-jie-client","permalink":"https://linxz.online/blog/supabase-vector/#2-lian-jie-client","title":"2.连接 client","children":[]},{"level":2,"id":"3-chu-li-wen-jian","permalink":"https://linxz.online/blog/supabase-vector/#3-chu-li-wen-jian","title":"3.处理文件","children":[]},{"level":2,"id":"4-embedding","permalink":"https://linxz.online/blog/supabase-vector/#4-embedding","title":"4.embedding","children":[]},{"level":2,"id":"5-query","permalink":"https://linxz.online/blog/supabase-vector/#5-query","title":"5.query","children":[]},{"level":2,"id":"6-jie-guo-chu-li","permalink":"https://linxz.online/blog/supabase-vector/#6-jie-guo-chu-li","title":"6.结果处理","children":[]}]},{"level":1,"id":"jie-yu","permalink":"https://linxz.online/blog/supabase-vector/#jie-yu","title":"结语","children":[]}],
"body":"supabase 用的是传统的 PostgreSQL，向量数据库用的是 PostgreSQL 的扩展 pgvector。\n官方连接推荐 – adapter\n为什么用 adapter？因为这样就不用和向量打交道，直接用文字即可。相当于自动化文字转向量的过程。\n1.import openai\nimport openai\nopenai.api_key = &#39;your-openai-key&#39;\n\n2.读取csv文件\nimport pandas as pd\ndf = pd.read_csv(&#39;/Users/lxz/Desktop/openai/data/医学数据集/短数据集/whoIam.csv&#39;)\ndataset = &quot;question:&quot; + df[&#39;question&#39;] + &quot; &quot; + &quot;answer:&quot; + df[&#39;answer&#39;]\n\n3.embedding\nembeddings = []\n\nfor sentence in dataset:\n    response = openai.Embedding.create(\n        model=&quot;text-embedding-ada-002&quot;,\n        input=[sentence]\n    )\n    embeddings.append((sentence, response[&quot;data&quot;][0][&quot;embedding&quot;], {}))\n\nembedding的结果是一个array，里面包含许多个tuple，示例：\n[(&#39;question:我是谁 answer:我是康复专家&#39;, [0.018805526196956635, -0.010052630677819252, 0.009883394464850426...],{}),....]\n\n4.连接 vecs 数据库\nimport vecs\n\nDB_CONNECTION = &quot;postgresql://[user]:[password]@[host]:[port]/[db_name]&quot; #Project Settings - Database - URI\n\n# create vector store client\nvx = vecs.Client(DB_CONNECTION)\n\n# create a collection named &#39;sentences&#39; with 1536 dimensional vectors (default dimension for text-embedding-ada-002)\nsentences = vx.get_or_create_collection(name=&quot;sentences&quot;, dimension=1536)\n\n5.upsert data\n# upsert the embeddings into the &#39;sentences&#39; collection\nsentences.upsert(records=embeddings)\n\n# create an index for the &#39;sentences&#39; collection\nsentences.create_index()\n\nIndexes 可以在 Database 下找到，schema 选择 ‘vecs’；同样，table也要选 ‘vecs’。\n注意，在table下面查看，会发现内容被放到id下面，如下图：\n\n如果介意的话，可以把你的内容放入metadata，单独用一个’text’的key也行。不过，不修改也不影响效果。\n6. query\nquery_sentence = &quot;你擅长什么&quot;\n\n# create an embedding for the query sentence\nresponse = openai.Embedding.create(\n    model=&quot;text-embedding-ada-002&quot;,\n    input=[query_sentence]\n)\nquery_embedding = response[&quot;data&quot;][0][&quot;embedding&quot;]\n\n# query the &#39;sentences&#39; collection for the most similar sentences\nresults = sentences.query(\n    data=query_embedding,\n    limit=2,\n    include_value = True\n)\n\n# print the results\nfor result in results:\n    print(result)\n\n返回结果示例：\n(&#39;我擅长什么 我擅长回答自闭症干预知识，含发展行为、ST、OT学科的知识&#39;, 0.146888512843058) (&#39;我喜欢什么 我喜欢看到孩子的笑容&#39;, 0.19340037048458)\n\n因此，我们转化一下最终结果：\nresults[0][0]\n\n我擅长什么 我擅长回答自闭症干预知识，含发展行为、ST、OT学科的知识\n\nlangchain 连接\n1.安装库\n!pip install supabase\n\n2.连接 client\nfrom supabase.client import Client, create_client\n\nsupabase_url = &quot;your-url&quot;\nsupabase_key = &quot;your-key&quot;\nsupabase: Client = create_client(supabase_url, supabase_key)\n\n3.处理文件\nfrom langchain.embeddings.openai import OpenAIEmbeddings\nfrom langchain.text_splitter import CharacterTextSplitter\nfrom langchain.vectorstores import SupabaseVectorStore\nfrom langchain.document_loaders import TextLoader\nfrom langchain.document_loaders import CSVLoader\n\nloader = CSVLoader(&quot;/Users/lxz/Desktop/openai/data/autism_supabase.csv&quot;, encoding=&#39;GB18030&#39;)\ndocuments = loader.load()\n\ntext_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\ndocs = text_splitter.split_documents(documents)\n\n4.embedding\nembeddings = OpenAIEmbeddings(openai_api_key=&quot;your-key&quot;)\nvector_store = SupabaseVectorStore.from_documents(docs, embeddings, client=supabase)\n\n5.query\nquery = &quot;自闭症属于残疾吗？&quot;\nmatched_docs = vector_store.similarity_search(query)\nprint(matched_docs[0].page_content)\n\n示例结果：\nquestion: 医生,您好.我于今年3月早产(孕34周破水急产,造成宝宝重度缺氧缺血性脑病夭折),是顺产.现在时隔三个月发现又怀孕了,请问我能顺利要这个宝宝吗?这次还会不会再发生早产呢?我要注意什么呢? answer: 你好原则上是需要至少是避孕半年的，现在既然是怀孕了可以保留和定期的孕检如果知道第一次异常的原因现在进行治疗和预防为好。 chunk_number: 1\n\n6.结果处理\nk = matched_docs[0].page_content\n\nimport re\nmatch = re.search(r&#39;answer: (.*?)\\n&#39;, k)\nif match:\n    answer = match.group(1)\n    print(answer)\nelse:\n    print(&quot;答案未找到&quot;)\n\n示例结果：\n你好原则上是需要至少是避孕半年的，现在既然是怀孕了可以保留和定期的孕检如果知道第一次异常的原因现在进行治疗和预防为好。\n\n结语\n相对来说，langchain 的方式更简单，但自由度较低。我在生产环境测试（即连上云服务器），发现langchain 的 supabase 无法工作，总是提示少了某个模块，而本地开发环境则没问题。所以，不推荐在生产环境使用 langchain 来连接。\n"},{"title":"如何连接Pinecone向量数据库？",
"url":"/blog/pinecone/",
"date":"2023-10-07",
"headings":[{"level":1,"id":"zhi-jie-lian-jie-guan-wang-tui-jian","permalink":"https://linxz.online/blog/pinecone/#zhi-jie-lian-jie-guan-wang-tui-jian","title":"直接连接-官网推荐","children":[{"level":2,"id":"1-importhe-she-zhi-xi-tong-bian-liang","permalink":"https://linxz.online/blog/pinecone/#1-importhe-she-zhi-xi-tong-bian-liang","title":"1.import和设置系统变量","children":[]},{"level":2,"id":"2-lian-jie-pinecone","permalink":"https://linxz.online/blog/pinecone/#2-lian-jie-pinecone","title":"2.连接 Pinecone","children":[]},{"level":2,"id":"3-du-qu-csv-wen-jian-jia-ru-embedding-lie","permalink":"https://linxz.online/blog/pinecone/#3-du-qu-csv-wen-jian-jia-ru-embedding-lie","title":"3.读取 CSV 文件，加入 embedding 列","children":[]},{"level":2,"id":"4-insert-data-to-pinecone","permalink":"https://linxz.online/blog/pinecone/#4-insert-data-to-pinecone","title":"4.insert data to Pinecone","children":[]},{"level":2,"id":"5-query","permalink":"https://linxz.online/blog/pinecone/#5-query","title":"5.query","children":[]}]},{"level":1,"id":"tong-guo-langchainlian-jie","permalink":"https://linxz.online/blog/pinecone/#tong-guo-langchainlian-jie","title":"通过langchain连接","children":[{"level":2,"id":"1-importhe-she-zhi-xi-tong-bian-liang-1","permalink":"https://linxz.online/blog/pinecone/#1-importhe-she-zhi-xi-tong-bian-liang-1","title":"1.import和设置系统变量","children":[]},{"level":2,"id":"2-du-qu-wen-dang","permalink":"https://linxz.online/blog/pinecone/#2-du-qu-wen-dang","title":"2.读取文档","children":[]},{"level":2,"id":"3-lian-jie-pinecone","permalink":"https://linxz.online/blog/pinecone/#3-lian-jie-pinecone","title":"3.连接 Pinecone","children":[]}]},{"level":1,"id":"jie-yu","permalink":"https://linxz.online/blog/pinecone/#jie-yu","title":"结语","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/pinecone/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"Pinecone 控制台如图：\n\n直接连接-官网推荐\n1.import和设置系统变量\nimport os\nos.environ[&quot;PINECONE_API_KEY&quot;] = &quot;your-pinecone-key&quot;\nos.environ[&quot;PINECONE_ENV&quot;] = &quot;your-pinecone-env&quot;\n\n!echo $PINECONE_API_KEY #看看是否能够读取\n\n2.连接 Pinecone\nimport pinecone\n\npinecone.init(api_key=os.getenv(&quot;PINECONE_API_KEY&quot;), environment=os.getenv(&quot;PINECONE_ENV&quot;))\npinecone.list_indexes() #列出所有indexes，免费版的只有1个，付费至少需要$70/月\n\nindex = pinecone.Index(&#39;openai&#39;)\nindex.describe_index_stats()\n\n示例结果：\n{&#39;dimension&#39;: 1536, &#39;index_fullness&#39;: 0.0, &#39;namespaces&#39;: {&#39;&#39;: {&#39;vector_count&#39;: 13}}, &#39;total_vector_count&#39;: 13}\n\n3.读取 CSV 文件，加入 embedding 列\nimport pandas as pd\ndf = pd.read_csv(&#39;/Users/lxz/Desktop/openai/data/qa1-10.csv&#39;) #输入你的文件夹路径\ndf\n\nimport openai\nopenai.api_key = &quot;your-api-key&quot;\n\nfrom openai.embeddings_utils import get_embedding\ndf[&#39;ada_v2&#39;] = df[&quot;question&quot;].apply(lambda x : get_embedding(x, engine = &#39;text-embedding-ada-002&#39;)) #给question列每一行数据都做embedding\n\ndf.to_csv(&quot;qa1-10_vectors.csv&quot;,index=False) #输出文件，不要自动加最前面一列\n\ndf = pd.read_csv(&#39;/Users/lxz/Desktop/openai/data/qa1-10_vectors.csv&#39;)\ndf\n\n4.insert data to Pinecone\nformatted_data = []\nfor _, row in df.iterrows():\n    # ID\n    entry_id = str(row[&#39;id&#39;])\n    \n    # ada_v2转为列表\n    ada_v2 = eval(row[&#39;ada_v2&#39;])\n    \n    # question和answer组合\n    text = &quot;question: &quot; + row[&#39;question&#39;] + &quot;\\nanswer:&quot; + row[&#39;answer&#39;]\n    \n    formatted_data.append((entry_id, ada_v2, {&quot;text&quot;: text}))\n\nformatted_data #形成pinecone所需数组\n\nindex.upsert(formatted_data)\n\n示例结果：\n{&#39;upserted_count&#39;: 10}\n\n5.query\nquery = &quot;你喜欢什么&quot;\nfrom openai.embeddings_utils import get_embedding\nquery_embed = get_embedding(query, engine = &#39;text-embedding-ada-002&#39;)\nquery_embed\n\nresult = index.query(\n    vector = query_embed,\n    top_k=3,\n    include_metadata=True\n)\nresult\n\nresult_text = result[&#39;matches&#39;][0].metadata[&#39;text&#39;] #包含question和answer\n\nstart_idx = result_text.find(&#39;answer:&#39;) + len(&#39;answer:&#39;)\nanswer = result_text[start_idx:].strip()\nprint(answer)\n\n通过langchain连接\n1.import和设置系统变量\nfrom langchain.embeddings.openai import OpenAIEmbeddings\nos.environ[&quot;OPENAI_API_KEY&quot;] = &quot;your_key&quot;\nembeddings = OpenAIEmbeddings()\n\nos.environ[&quot;PINECONE_API_KEY&quot;]=&#39;4fece4fd-b099-48a4-89e8-284f57b32097&#39;\nos.environ[&quot;PINECONE_ENV&quot;]=&#39;asia-southeast1-gcp-free&#39;\n\nfrom langchain.vectorstores import Pinecone\n\n2.读取文档\nfrom langchain.document_loaders import CSVLoader  #读取csv文档\nfrom langchain.text_splitter import CharacterTextSplitter\nloader = CSVLoader(&#39;/your/path/example.csv&#39;)\ndocuments = loader.load()\n\n# split it into chunks\ntext_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\ndocs = text_splitter.split_documents(documents)\n\ndocs\n\n3.连接 Pinecone\n注意，提前在Pinecone后台创建 index，否则连接速度会很慢，且会连接超时。因为Pinecone后台首次创建 index 时需要较长时间。\nimport pinecone\n\n# initialize pinecone\npinecone.init(\n    api_key=os.getenv(&quot;PINECONE_API_KEY&quot;), \n    environment=os.getenv(&quot;PINECONE_ENV&quot;),  \n)\n\nindex_name = &quot;openai&quot; #your_name\n\n# if you already have an index, you can load it like this\ndocsearch = Pinecone.from_existing_index(index_name, embeddings)\n\nquery = &quot;你是什么角色？&quot;\nresult = docsearch.similarity_search(query)\n\nprint(result[0].page_content)\n\n结语\n虽然 langchain 连接看起来简单，但我最终放弃了它。原因是它的可定制性太差，而如果需要改变 class 的话，不如官网直接连接简单。\n参考资料\nPinecone 文档\n"},{"title":"如何用阿里云解析域名？",
"url":"/blog/aliyun-dns/",
"date":"2023-10-06",
"headings":[],
"body":"进入阿里云管理平台：\n\n\n搜索域名解析\n\n\n点击解析设置，修改DNS地址为以下地址：\n\n\nns1.alidns.com\nns2.alidns.com\n\n添加A记录和CNAME记录\n\n添加两条A记录，一条是www，一条是@，指向公网IP。\n\n"},{"title":"如何在cloudflare解析域名？",
"url":"/blog/cloudflare-dns/",
"date":"2023-10-06",
"headings":[],
"body":"\n\n注册cloudflare账号\n\n\n点击添加站点\n\n\n\n\n选择免费计划\n\n\n\n改变nameserver\n\n\n\n\n5.稍等几分钟，完成全过程。\n实测下来，有时候速度也很慢。我阿里云的解析过去，需要半小时。半小时后，cloudflare会发邮件给你。\n如果你的网站涉及vercel的解析，可能还需要半小时-1小时，vercel完成解析会发邮件给你。\n所以不要干等和刷新，干点别的先。\n值得注意的是，最后你要需要调整一下cloudflare的SSL/TLS，从”灵活“改成”完全“，否则会出现”重定向过多“的错误。\n\n如果中间有邮件告诉你，网址已经被cloudflare删除。这个也不用担心，完全是正常现象。\n\n"},{"title":"解决vercel域名被墙",
"url":"/blog/vercel-block/",
"date":"2023-10-06",
"headings":[{"level":1,"id":"fang-fa-yi-shi-yong-vercelguo-nei-zhuan-gong-de-aji-lu-he-cnameji-lu","permalink":"https://linxz.online/blog/vercel-block/#fang-fa-yi-shi-yong-vercelguo-nei-zhuan-gong-de-aji-lu-he-cnameji-lu","title":"方法一：使用vercel国内专供的A记录和CNAME记录","children":[]},{"level":1,"id":"fang-fa-er-yu-ming-jie-xi-dao-cloudflare","permalink":"https://linxz.online/blog/vercel-block/#fang-fa-er-yu-ming-jie-xi-dao-cloudflare","title":"方法二：域名解析到cloudflare","children":[]}],
"body":"两种方法：\n方法一：使用vercel国内专供的A记录和CNAME记录\nA记录地址：76.223.126.88\nCNAME 记录地址：cname-china.vercel-dns.com\n可以用阿里云来解析。\n实验下来，这个方法也是很容易被墙，我的域名坚持了一天就不行了，请使用方法二吧。\n方法二：域名解析到cloudflare\n因为cloudflare会随机改变用户访问的DNS地址，而不是原本被访问到的vercel地址。\ncloudflare的解析教程\n"},{"title":"console.log 如何提高可读性",
"url":"/blog/console-log-better/",
"date":"2023-10-01",
"headings":[],
"body":"我们知道，js 代码中，console.log 用得好，可以有效 debug。\n但是，我们在操作数组或者 object 的时候，常常碰到打印到控制台的结果太长或太复杂的问题。\n如果你只想控制台输出 [1, 2, 3…] 或者 [name: Peter, age: 18, occupation: doctor] 这样的结果，你需要用上 JSON.stringify()，比如以下代码：\nconsole.log((&quot;sessions in search&quot; + JSON.stringify(sessions))) //输出一个object\n\n或者这样来输出一个 array：\nconsole.log(&quot;sessions to array&quot;, JSON.stringify(Object.entries(sessions)))\n\nObject.entries 主要来帮助 object/dict 转换为 array 的，具体用法可以参考这篇文章：js 如何把 object 转换为数组 array ？\n"},{"title":"js 如何简单实现搜索功能",
"url":"/blog/js-search/",
"date":"2023-10-01",
"headings":[{"level":1,"id":"sou-suo-kuang-qian-duan-dai-ma","permalink":"https://linxz.online/blog/js-search/#sou-suo-kuang-qian-duan-dai-ma","title":"搜索框前端代码","children":[]}],
"body":"功能：根据关键字返回搜索结果相关的菜单栏。\n代码如下：\n      // 搜索框输入内容\n    const handleSearchChange = (e) =&gt; {\n      setSearchQuery(e.target.value);\n  \n      if (e.target.value.trim() === &#39;&#39;) {\n        setSearchResults([]);\n        return;\n      }\n  \n      // 对比搜索关键字\n      const keyword = e.target.value.toLowerCase();\n      // _ 指我们不需要在 function 中使用 key，用来当占位符，以告诉系统 sessionData 是 value\n      const results = Object.entries(sessions).filter(([_, sessionData]) =&gt; {\n        return sessionData.chatTitle.toLowerCase().includes(keyword) ||\n               sessionData.messages.some(msg =&gt; msg.content.toLowerCase().includes(keyword));\n      });\n      \n      setSearchResults(results);\n\n代码解释：\n\n\nhandleSearchChange 接收用户输入，如果输入内容为空，那么返回空结果[]；\n\n\n如果输入内容不为空，将所有的用户输入变为小写字母，再将所有的 object 转为数组，以方便遍历数组，看看是否存在；\n\n\n关于转换为数组的方法，是Object.entries；关于如何把搜索结果形成新数组，用的是 .filter 和 .some，它们的用法请参考这篇文章：js 如何把 object 转换为数组 array ？\n\n\n将新数组 result 的结果更新至 SearchResults。\n\n\n我们先来看搜索结果的展示页面：\n        {/* 聊天列表 ChatItem*/}\n        &lt;div className=&quot;overflow-auto&quot;&gt;\n        {searchQuery ? \n          searchResults.length &gt; 0 ? \n            searchResults.map(([sessionId, sessionData]) =&gt; (\n              &lt;ChatItem \n                key={sessionId} \n                chatTitle={sessionData.chatTitle} \n                messages={sessionData.messages} \n                startTime={sessionData.startTime}\n                onSelectChat={selectSession}\n                chatId={sessionId}\n              /&gt;\n            )) : &lt;div className=&#39;pl-5&#39;&gt;无相关搜索结果&lt;/div&gt;\n        :\n          Object.entries(sessions).map(([sessionId, sessionData]) =&gt; (\n            &lt;ChatItem \n              key={sessionId} \n              chatTitle={sessionData.chatTitle} \n              messages={sessionData.messages} \n              startTime={sessionData.startTime}\n              onSelectChat={selectSession}\n              chatId={sessionId}\n            /&gt;\n          ))\n        }\n        &lt;/div&gt;\n\n代码解释：\n如果出现 searchQuery，而且 searchResults 这个数组的长度不为0时，searchResults 会根据 id 和 搜索 value 来展示菜单栏&lt;ChatItem /&gt;；否则，则直接显示”无相关搜索结果“；\n当没有 searchQuery 的时候，直接显示菜单栏&lt;ChatItem /&gt;\n搜索框前端代码\n前端代码是这样的：\n    import Image from &#39;next/image&#39;;\n    \n    return (\n      &lt;div className=&quot;flex-1 justify-between items-center h-10 flex rounded-lg border&quot;&gt;\n          &lt;input \n              type=&quot;text&quot;\n              className=&quot;h-full border-none outline-none pl-3&quot; \n              placeholder=&quot;搜索&quot;\n              value={searchQuery}\n              onChange={handleSearchChange}\n          /&gt;\n          {searchQuery &amp;&amp; (\n              &lt;span onClick={clearSearch} className=&quot;cursor-pointer mr-1&quot;&gt;\n                  ×\n              &lt;/span&gt;\n          )}\n          &lt;Image \n              src=&quot;search.svg&quot;\n              className=&quot;w-5 h-5 mr-1&quot; \n              width={20}\n              height={20}\n              alt=&quot;search-icon&quot; \n          /&gt;\n      &lt;/div&gt;  \n    )\n\n我们需要在&lt;input /&gt;里面增加一个onChange来接收用户输入的内容。\n"},{"title":"阿里云基本操作-远程连接、上传文件、删除文件",
"url":"/blog/aliyun-basics/",
"date":"2023-09-30",
"headings":[{"level":1,"id":"yi-deng-lu-a-li-yun","permalink":"https://linxz.online/blog/aliyun-basics/#yi-deng-lu-a-li-yun","title":"一、登录阿里云","children":[]},{"level":1,"id":"er-yuan-cheng-lian-jie","permalink":"https://linxz.online/blog/aliyun-basics/#er-yuan-cheng-lian-jie","title":"二、远程连接","children":[{"level":2,"id":"guan-wang-yuan-cheng-lian-jie","permalink":"https://linxz.online/blog/aliyun-basics/#guan-wang-yuan-cheng-lian-jie","title":"官网远程连接","children":[]},{"level":2,"id":"ben-di-terminal-lian-jie","permalink":"https://linxz.online/blog/aliyun-basics/#ben-di-terminal-lian-jie","title":"本地 terminal 连接","children":[]}]},{"level":1,"id":"san-shang-chuan-wen-jian","permalink":"https://linxz.online/blog/aliyun-basics/#san-shang-chuan-wen-jian","title":"三、上传文件","children":[{"level":2,"id":"yuan-cheng-wen-dang-xia-zai-dao-ben-di","permalink":"https://linxz.online/blog/aliyun-basics/#yuan-cheng-wen-dang-xia-zai-dao-ben-di","title":"远程文档下载到本地","children":[]}]},{"level":1,"id":"si-shan-chu-wen-jian","permalink":"https://linxz.online/blog/aliyun-basics/#si-shan-chu-wen-jian","title":"四、删除文件","children":[]}],
"body":"一、登录阿里云\n用支付宝/钉钉/阿里云 app均可以扫码登录阿里云\n二、远程连接\n远程连接有两种方法：官网远程连接和本地 terminal 连接。\n官网远程连接\n1.官网直接点击&quot;远程连接&quot;。\n2.点击 Workbench 远程连接。\n选择公网连接，输入用户名和密码即可。\n本地 terminal 连接\nssh root@公网地址\n\n输入密码即可连接。\n不过，测试下来，Workbench连接比本地terminal快和稳定。\n三、上传文件\n以下需要在本地 terminal 中操作。\nscp 本地文档位置 user@公网IP: 远程文档位置\nscp /Users/lxz/Downloads/test.txt root@1.118.72.177:/root\n\n注意：需要输入远程主机密码才能上传成功。如果要上传文件夹，而不是文件，要加-r，比如：\nscp -r /Users/lxz/Downloads/test root@1.118.72.177:/root\n\n远程文档下载到本地\nscp user@公网IP: 远程文档位置 本地文档位置\nscp root@1.118.72.177:/root/requirements.txt /Users/lxz/Desktop\n\n四、删除文件\n远程登录主机后，执行rm指令：\nrm test.txt\n\n"},{"title":"如何在阿里云主机启动flask服务？",
"url":"/blog/aliyun-flask/",
"date":"2023-09-30",
"headings":[{"level":1,"id":"1-yuan-cheng-lian-jie-zhu-ji","permalink":"https://linxz.online/blog/aliyun-flask/#1-yuan-cheng-lian-jie-zhu-ji","title":"1.远程连接主机","children":[]},{"level":1,"id":"2-she-ding-xu-ni-huan-jing","permalink":"https://linxz.online/blog/aliyun-flask/#2-she-ding-xu-ni-huan-jing","title":"2.设定虚拟环境","children":[]},{"level":1,"id":"3-jian-cha-duan-kou-zhan-yong-qing-kuang","permalink":"https://linxz.online/blog/aliyun-flask/#3-jian-cha-duan-kou-zhan-yong-qing-kuang","title":"3.检查端口占用情况","children":[]},{"level":1,"id":"4-sha-si-zhan-yong-duan-kou-jin-cheng","permalink":"https://linxz.online/blog/aliyun-flask/#4-sha-si-zhan-yong-duan-kou-jin-cheng","title":"4.杀死占用端口进程","children":[]},{"level":1,"id":"5-kai-qi-fu-wu","permalink":"https://linxz.online/blog/aliyun-flask/#5-kai-qi-fu-wu","title":"5.开启服务","children":[]},{"level":1,"id":"6-ru-he-rang-flaskying-yong-yi-zhi-zai-xian","permalink":"https://linxz.online/blog/aliyun-flask/#6-ru-he-rang-flaskying-yong-yi-zhi-zai-xian","title":"6.如何让flask应用一直在线？","children":[]},{"level":1,"id":"7-ru-he-yong-httpsfa-qi-api","permalink":"https://linxz.online/blog/aliyun-flask/#7-ru-he-yong-httpsfa-qi-api","title":"7.如何用https发起api","children":[]}],
"body":"1.远程连接主机\nssh root@你的公网IP\n\n如果是Workbench连接，可省略这一步，直接在阿里云官网登录。\n2.设定虚拟环境\nsource venv/bin/activate\n\n这一步其实不是必要的。但是，我们在远程主机通常不只需要启动一项服务，如果存在多项服务，可能会产生 python 依赖项冲突，开启虚拟环境可以防止冲突。\n接下来，可以安装依赖项，使用以下命令：\npip install -r requirements.txt\n\n3.检查端口占用情况\nsudo lsof -i:5328\n\n有时候，你会发现flask占用的端口无法开启服务，是因为端口已经被占用。检查端口占用情况是个好习惯。\n4.杀死占用端口进程\nsudo kill -9 19450 19605\n\n如果你不想换端口的话，就需要杀死占用端口的进程。比如，我需要用的端口是5328，占用端口的进程pid 分别是19450和19605。\n5.开启服务\n需要一个应用服务器来让flask运行在主机上，我们选用的是gunicorn\ngunicorn -w 2 -b 0.0.0.0:5328 index:app\n\n\n-b 0.0.0.0:5328：这个参数指定了 Gunicorn 应该绑定（监听）哪个 IP 地址和端口。在这里，0.0.0.0 表示 Gunicorn 应该监听所有可用的网络接口，而 5328 是它应该监听的端口号。\n-w 或 --workers ：这个参数用于指定 Gunicorn 应该创建多少个工作进程。指定更多的工作进程可以让 Gunicorn 并发处理更多的请求，但也会增加系统的资源消耗（如内存和CPU）。选择适当的工作进程数需要考虑系统的资源限制、应用的性能特征和预期的负载等因素。\n2：这个值是指定的工作进程数。在这个例子中，Gunicorn 将创建 2 个工作进程来处理请求。\n\n简而言之，gunicorn -w 2 命令将启动 Gunicorn，并创建 2 个工作进程来并发处理 HTTP 请求。\n6.如何让flask应用一直在线？\n我们发现，当关掉远程主机后，应用就不在线了，而我们选用云主机的目的是，让应用一直在线，怎么办呢？\n这时候需要用nohup：\nnohup gunicorn --certfile /etc/nginx/cert/commonlearner.com.pem --keyfile /etc/nginx/cert/commonlearner.com.key -b 0.0.0.0:5328 -w 4 index:app\n\n这样就可以保证应用一直在线。\n7.如何用https发起api\n如果你注意看，上面的gunicorn命令有 cert 字样，这是因为我绑定了 ssl 证书，这是 https 网址要求的。由于 vercel 网站只能接受 https 的 api 请求，所以如果你有 https 的需求，需要这样改写代码：\ngunicorn --certfile /etc/nginx/cert/commonlearner.com.pem --keyfile /etc/nginx/cert/commonlearner.com.key -b 0.0.0.0:5328 -w 4 index:app\n\n如果你需要查看 log，可以这样写代码：\ngunicorn --certfile /etc/nginx/cert/commonlearner.com.pem --keyfile /etc/nginx/cert/commonlearner.com.key -b 0.0.0.0:5328 index:app --log-level debug\n\n这样一来，你的前端 fetch api 代码就需要改成 https 样式，由于阿里云绑定免费 ssl 证书目前只支持域名，而不支持 ip，因此我们需要将公网ip绑定一个域名（怎么做看下一篇文章），然后直接请求https，如下图：\nconst response = await fetch(&quot;https://www.commonlearner.com:5328/api/python&quot;, {\n  method: &quot;POST&quot;,\n  headers: {\n    &quot;Content-Type&quot;: &quot;application/json&quot;,\n  },\n  body: JSON.stringify({ content: content, chatHistory: chatHistoryStr }),\n});\n\n"},{"title":"如何一键部署网站 – vercel",
"url":"/blog/vercel/",
"date":"2023-09-26",
"headings":[{"level":1,"id":"ru-he-bang-ding-yu-ming","permalink":"https://linxz.online/blog/vercel/#ru-he-bang-ding-yu-ming","title":"如何绑定域名：","children":[]}],
"body":"首先，vercel会提供一个域名，需要科学上网才能访问。所以，请自己看下是否符合需求。\n最简单的方式是将项目托管到 github，直接连接 github 一键部署，以下是步骤：\n进入 vercel 首页，点击”Add New…”和”Project”\n\n输入你想要部署的 github 项目，点击”import”：\n\n输入项目名字和系统变量（即.env里面的变量），点击”deploy”即可完成，过程耗时1-2分钟。\n\n如何绑定域名：\n在 vercel project 上的 domain 输入 域名:\n\n下一步是去 namesilo，点击“蓝色小星球”，把 A TYPE 和 CNAME TYPE 都写上：\n\n\n最后改一下server name：\nvercel通知：\n\nnamesilo可以直接点击domain的名字，进入以下页面改动：\n\n等待5分钟左右，即成功。如果不成功，检查一下vercel-Domains页面：\n\n\n"},{"title":"手机如何连接 flask 后端？",
"url":"/blog/mobile-flask/",
"date":"2023-09-22",
"headings":[{"level":1,"id":"package-json","permalink":"https://linxz.online/blog/mobile-flask/#package-json","title":"package.json","children":[]},{"level":1,"id":"message-tsx","permalink":"https://linxz.online/blog/mobile-flask/#message-tsx","title":"Message.tsx","children":[]}],
"body":"以下文章针对的是 nextjs 程序。\n需要修改两个文件，一个是package.json，一个是 fetch api 的前端文件，我的是component，名字是Message.tsx。\npackage.json\n核心是 “flask-dev” 项目，需要加上”-h 0.0.0.0″，意思是监听所有端口，所以运行后会发现 flask 运行在两个端口上，一个是本地 127.0.0.1，一个是局域网IP 192.168.1.x。\n后端信息显示如下：\n\n全部代码如下：\n{\n  &quot;name&quot;: &quot;purple&quot;,\n  &quot;version&quot;: &quot;0.1.0&quot;,\n  &quot;private&quot;: true,\n  &quot;scripts&quot;: {\n    &quot;flask-dev&quot;: &quot;FLASK_DEBUG=1 pip install -r requirements.txt &amp;&amp; python -m flask --app api/index run -h 0.0.0.0 -p 5328&quot;,\n    &quot;next-dev&quot;: &quot;next dev&quot;,\n    &quot;dev&quot;: &quot;concurrently \\&quot;npm run next-dev\\&quot; \\&quot;npm run flask-dev\\&quot;&quot;,\n    &quot;build&quot;: &quot;next build&quot;,\n    &quot;start&quot;: &quot;next start&quot;,\n    &quot;lint&quot;: &quot;next lint&quot;\n  },\n  &quot;dependencies&quot;: {\n    &quot;@types/node&quot;: &quot;20.4.7&quot;,\n    &quot;@types/react&quot;: &quot;18.2.18&quot;,\n    &quot;@types/react-dom&quot;: &quot;18.2.7&quot;,\n    &quot;autoprefixer&quot;: &quot;10.4.14&quot;,\n    &quot;concurrently&quot;: &quot;^8.2.1&quot;,\n    &quot;cors&quot;: &quot;^2.8.5&quot;,\n    &quot;dotenv&quot;: &quot;^16.3.1&quot;,\n    &quot;eslint&quot;: &quot;8.46.0&quot;,\n    &quot;eslint-config-next&quot;: &quot;13.4.12&quot;,\n    &quot;next&quot;: &quot;13.4.12&quot;,\n    &quot;openai&quot;: &quot;^3.3.0&quot;,\n    &quot;postcss&quot;: &quot;8.4.27&quot;,\n    &quot;react&quot;: &quot;18.2.0&quot;,\n    &quot;react-dom&quot;: &quot;18.2.0&quot;,\n    &quot;react-markdown&quot;: &quot;^8.0.7&quot;,\n    &quot;react-syntax-highlighter&quot;: &quot;^15.5.0&quot;,\n    &quot;rehype-raw&quot;: &quot;^7.0.0&quot;,\n    &quot;remark-gfm&quot;: &quot;^3.0.1&quot;,\n    &quot;tailwindcss&quot;: &quot;3.3.3&quot;,\n    &quot;typescript&quot;: &quot;5.1.6&quot;,\n    &quot;uuid&quot;: &quot;^9.0.0&quot;,\n    &quot;zhipuai&quot;: &quot;^0.1.0&quot;\n  },\n  &quot;devDependencies&quot;: {\n    &quot;@types/uuid&quot;: &quot;^9.0.4&quot;\n  }\n}\n\nMessage.tsx\n这是前端文件，需要把 127.0.0.1 改成局域网IP 192.168.1.x，代码如下：\n  useEffect(() =&gt; {\n\n  if (ai &amp;&amp; content &amp;&amp; !isHistory) {\n    const generate = async () =&gt; {\n      try {\n        //将chatHistory转为string\n        const chatHistoryStr = JSON.stringify(chatHistory); \n\n        // Fetch the response from the OpenAI API with the signal from AbortController\n          const response = await fetch(&quot;http://192.168.1.18:5328/api/python&quot;, {\n            method: &quot;POST&quot;,\n            headers: {\n              &quot;Content-Type&quot;: &quot;application/json&quot;,\n            },\n            body: JSON.stringify({ content: content, chatHistory: chatHistoryStr }),\n          });\n\n         // 处理streaming response\n         const reader = response.body.getReader();\n         const decoder = new TextDecoder(&quot;utf-8&quot;);\n         let accumulatedText = &quot;&quot;;\n\n         while (true) {\n           const { done, value } = await reader.read();\n           if (done) {\n            onAIReply &amp;&amp; onAIReply(accumulatedText);  // &lt;-- 当AI的回复生成时，通知父组件\n            break;\n           }\n           // Massage and parse the chunk of data\n           const chunk = decoder.decode(value);\n\n           accumulatedText += chunk;\n\n           setResultText(accumulatedText);  // 使用setState更新状态\n         }\n       } catch (error) {\n             console.error(&quot;Error occurred while generating:&quot;, error.message);\n       }\n      };\n      generate();\n    }\n\n    }, [ai, content]);\n\n另外，注意一点，为了把所有路径都导向正常的后端，nextjs 需要改动 next.config.js 文件，这里的路径不必修改：\nconst nextConfig = {\n  rewrites: async () =&gt; {\n    return [\n      {\n        source: &#39;/api/:path*&#39;,\n        destination:\n          process.env.NODE_ENV === &#39;development&#39;\n            ? &#39;http://127.0.0.1:5328/api/:path*&#39;\n            : &#39;/api/&#39;,\n      },\n    ]\n  },\n}\n\nmodule.exports = nextConfig\n\n以上的两个文件修改后，使用127.0.0.1:3000 或者 192.168.1.x:3000 都能访问前端，且顺利连接 api。\n手机连接的网址就是 192.168.1.x:3000\n"},{"title":"js 如何把 object 转换为数组 array ？",
"url":"/blog/object-to-array/",
"date":"2023-09-22",
"headings":[{"level":1,"id":"object-entries-filter-filter-function-yong-fa","permalink":"https://linxz.online/blog/object-to-array/#object-entries-filter-filter-function-yong-fa","title":"object.entries().filter(filter-function) 用法","children":[]},{"level":1,"id":"some-yu-filter-dui-bi","permalink":"https://linxz.online/blog/object-to-array/#some-yu-filter-dui-bi","title":".some 与 .filter 对比","children":[]}],
"body":"使用 Object.entries()\n作用：\n把 object {key1: value1, key2: value2} 转化为数组array [['key1', 'value1'], ['key2', 'value2']]\n使用 javascript 的例子：\nconst object1 = {\n  a: &#39;somestring&#39;,\n  b: 42\n};\n\nconst result = Object.entries(object1);\nconsole.log(result);\n// output: [[&#39;a&#39;, &#39;somestring&#39;], [&#39;b&#39;, 42]]\n\nobject.entries().filter(filter-function) 用法\nobject.entries() 会返回一个数组[example]\nfilter 会将 [example] 里面的元素一一放入 filter-fuction 中，如果返回结果是 true，那么就将它放入新数组；如果返回结果是 false，该元素会被排除出新数组。\n示例代码：\nconst numbers = [1, 2, 3, 4, 5, 6];\n\n// 定义一个函数来检查一个数字是否大于 3\nconst isGreaterThanThree = (num) =&gt; num &gt; 3;\n\n// 使用 filter 方法来创建一个新数组，其中包含所有大于 3 的数字\nconst filteredNumbers = numbers.filter(isGreaterThanThree);\n\n// 输出：[4, 5, 6]\nconsole.log(filteredNumbers);\n\n.some 与 .filter 对比\n.some 输出 true or false\nconst array = [1, 2, 3, 4, 5];\n\n// 测试函数，检查一个数是否大于 3\nconst isGreaterThanThree = (number) =&gt; number &gt; 3;\n\n// 使用 .some() 方法检查数组中是否至少有一个元素大于 3\nconst result = array.some(isGreaterThanThree);\n\nconsole.log(result); // 输出: true\n\n.filter 输出符合条件的数组 [filter-elements]\n注意区分输出结果，.some 常常可以放入.filter中作为判断条件。\n试着举一个例子，说明object.entries()，如果有key-value对，如下：\nkey: &quot;75afdbac-4643-4afb-8f83-2780f861183e&quot;\n\nvalue: {messages: Array(2), chatTitle: &quot;闲聊&quot;, startTime: &quot;20:30&quot;}\n\n// 转换后应为这样的形态：[[key, value],...]\n\n所以，以上代码转化结果是：\n[[\n&quot;75afdbac-4643-4afb-8f83-2780f861183e&quot;,\n{&quot;messages&quot;:[{&quot;user&quot;:true,&quot;content&quot;:&quot;你好&quot;},{&quot;user&quot;:false,&quot;content&quot;:&quot;你好！我是豆豆&quot;}],&quot;chatTitle&quot;:&quot;闲聊&quot;,&quot;startTime&quot;:&quot;20:30&quot;}\n]]\n\n之所有有两个[]号，因为假设有多个 objects。\n"},{"title":"如何改变 nextjs app 的网页标签favicon？",
"url":"/blog/nextjs-favicon/",
"date":"2023-09-21",
"headings":[{"level":1,"id":"tu-biao","permalink":"https://linxz.online/blog/nextjs-favicon/#tu-biao","title":"图标","children":[]},{"level":1,"id":"wen-zi","permalink":"https://linxz.online/blog/nextjs-favicon/#wen-zi","title":"文字","children":[]}],
"body":"如何改变 nextjs 的 title？涉及图标和文字。\n图标\n将图标放在 app 文件夹下的 favicon.ico\n\n注意，必须是.ico的格式，可以在这个网站转换图片格式。\n文字\n改变 app 下的 layout.tsx，如下图：\n\n主要改变 title 里面的内容。\n最后效果如下：\n\n"},{"title":"如何使用 LangSmith",
"url":"/blog/langsmith/",
"date":"2023-09-20",
"headings":[{"level":1,"id":"an-zhuang-bao","permalink":"https://linxz.online/blog/langsmith/#an-zhuang-bao","title":"安装包","children":[]},{"level":1,"id":"she-zhi-huan-jing-bian-liang","permalink":"https://linxz.online/blog/langsmith/#she-zhi-huan-jing-bian-liang","title":"设置环境变量","children":[]},{"level":1,"id":"shi-yun-xing","permalink":"https://linxz.online/blog/langsmith/#shi-yun-xing","title":"试运行","children":[]},{"level":1,"id":"yun-xing-jie-guo","permalink":"https://linxz.online/blog/langsmith/#yun-xing-jie-guo","title":"运行结果","children":[]}],
"body":"LangSmith 是一个 LangChain 工具，方便查看 LangChain 各模块运行的状态。以下是使用方法：\n安装包\n在控制台输入或jupyter notebook输入（ notebook 前面需要加!号）\npip install -U langchain\n\n设置环境变量\n其中，project 的名称是你的 LangSmith 官网自己设置的名称。\nimport os\n\nos.environ[&quot;LANGCHAIN_TRACING_V2&quot;] = &quot;true&quot;\nos.environ[&quot;LANGCHAIN_ENDPOINT&quot;] = &quot;https://api.smith.langchain.com&quot;\nos.environ[&quot;LANGCHAIN_API_KEY&quot;] = &quot;your-langchain-key&quot;\nos.environ[&quot;LANGCHAIN_PROJECT&quot;] = &quot;memory_test&quot;\nos.environ[&quot;OPENAI_API_KEY&quot;] = &quot;your-openai-key&quot;\n\n试运行\nfrom langchain.chat_models import ChatOpenAI\n\nllm = ChatOpenAI()\nllm.predict(&quot;谁是最漂亮的人&quot;)\n\n运行结果\n项目页：\n\n详情页：\n\n"},{"title":"python 如何把 string 导出成 word 文档",
"url":"/blog/string-to-word/",
"date":"2023-09-20",
"headings":[],
"body":"要将字符串导出为 Word 文档，你可以使用 python-docx 这个库。它提供了一个简单的方式来创建、查询和修改 Microsoft Word 文件。\n以下是一个简单的例子说明如何使用 python-docx 将字符串导出到 Word 文档：\n\n首先，你需要安装 python-docx:\n\npip install python-docx\n\n\n接下来，你可以使用以下的代码把字符串导出为 Word 文档:\n\nfrom docx import Document\n\ndef string_to_word(string, file_name):\n    # 创建一个新的文档\n    doc = Document()\n\n    # 添加内容到文档\n    doc.add_paragraph(string)\n\n    # 保存文档\n    doc.save(file_name)\n\n# 使用函数\nmy_string = &quot;这是一个测试字符串&quot;\nfile_name = &quot;output.docx&quot;\nstring_to_word(my_string, file_name)\n\n上面的代码会创建一个名为 output.docx 的 Word 文档，并将 my_string 中的文本添加到文档中。你可以根据需要修改这些参数。\n除了基本文本外，python-docx 还提供了丰富的格式化选项和功能，可以创建更复杂的 Word 文档，比如改变文档标题、创建表格等，你可以查阅其官方文档来学习。\n"},{"title":"如何在 nextjs 里面改变 svg 图标的颜色？",
"url":"/blog/nextjs-svg/",
"date":"2023-09-18",
"headings":[],
"body":"方法是定位到 svg 文件，比如send.svg，找到里面的fill属性，做更改即可。\nfill 属性一般是currentColor，意思是随父元素的颜色改变。但可能有个问题，父元素可能会大于 svg 本身的大小，比如这样：\n  &lt;img \n    src=&quot;send.svg&quot;\n    className=&quot;w-5 h-5 mr-1 bg-red-300&quot; \n    onClick={handleClick} \n    style={{cursor: &#39;pointer&#39;}}\n  /&gt;\n\n我们把父元素 img 的背景颜色设置为橙红色bg-red-300，但是效果却如下所示：\n\n所以，我们需要到 svg 元素的代码去，直接改变 fill 的值。比如：\n&lt;svg t=&quot;1691147928837&quot; class=&quot;icon&quot; viewBox=&quot;0 0 1025 1024&quot; version=&quot;1.1&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;#FF0000&quot; p-id=&quot;1736&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; width=&quot;200.1953125&quot; height=&quot;200&quot;&gt;&lt;path d=&quot;M1008.00076 6.285714q18.857143 13.714286 15.428571 36.571429l-146.285714 877.714286q-2.857143 16.571429-18.285714 25.714286-8 4.571429-17.714286 4.571429-6.285714 0-13.714286-2.857143l-258.857143-105.714286-138.285714 168.571429q-10.285714 13.142857-28 13.142857-7.428571 0-12.571429-2.285714-10.857143-4-17.428571-13.428571t-6.571429-20.857143l0-199.428571 493.714286-605.142857-610.857143 528.571429-225.714286-92.571429q-21.142857-8-22.857143-31.428571-1.142857-22.857143 18.285714-33.714286l950.857143-548.571429q8.571429-5.142857 18.285714-5.142857 11.428571 0 20.571429 6.285714z&quot; p-id=&quot;1737&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n\n以上，我们直接把 fill 调整为 #FF0000，即红色的十六进制代码（如果想改成其他颜色，输入相应的十六进制代码即可），效果如下：\n\n这样就完美改变了 svg 图标的颜色了。\n值得注意的是，nextjs 修改 fill 的属性后不会自动刷新，需要手动 command + R 刷新一下。\n"},{"title":"如何调用 embedding 模型？(openai、minimax、SentenceTransformer）",
"url":"/blog/embedding-models/",
"date":"2023-09-15",
"headings":[{"level":1,"id":"openaiembeddings","permalink":"https://linxz.online/blog/embedding-models/#openaiembeddings","title":"OpenAIEmbeddings","children":[]},{"level":1,"id":"minimaxembeddings","permalink":"https://linxz.online/blog/embedding-models/#minimaxembeddings","title":"MinimaxEmbeddings","children":[]},{"level":1,"id":"sentencetransformer-all-minilm-l6-v2","permalink":"https://linxz.online/blog/embedding-models/#sentencetransformer-all-minilm-l6-v2","title":"SentenceTransformer ( all-MiniLM-L6-v2 )","children":[]}],
"body":"embedding 模型有哪些？\n主要有 OpenAI、Minimax、SentenceTransformer 库的all-MiniLM-L6-v2模型。下面一一介绍：\nOpenAIEmbeddings\n通过 langchain 调用：\nfrom langchain.embeddings.openai import OpenAIEmbeddings\nembedding_function = OpenAIEmbeddings(openai_api_key=&quot;your-api-key&quot;)\n\nMinimaxEmbeddings\n国产模型，收费。\n通过 langchain 调用：\nimport os\n\nos.environ[&quot;MINIMAX_GROUP_ID&quot;] = &quot;your-groupid&quot;\nos.environ[&quot;MINIMAX_API_KEY&quot;] = &quot;your-api-key&quot;\n\nfrom langchain.embeddings import MiniMaxEmbeddings\nembeddings = MiniMaxEmbeddings()\n\nSentenceTransformer ( all-MiniLM-L6-v2 )\nPython 库，免费使用。\n通过 langchain 调用：\nfrom langchain.embeddings.sentence_transformer import SentenceTransformerEmbeddings\n\nembedding_function = SentenceTransformerEmbeddings(model_name=&quot;all-MiniLM-L6-v2&quot;)\ndb = Chroma.from_documents(docs, embedding_function)\nquery = &quot;血压高怎么办&quot;\ndocs = db.similarity_search(query)\nprint(docs[0].page_content)\n\nSentenceTransformers 库介绍\n"},{"title":"nextjs 如何 make api call?",
"url":"/blog/nextjs-api-call/",
"date":"2023-09-15",
"headings":[],
"body":"首先，如果你升级到 nextjs 13，即有src文件夹，而不是page文件夹，注意api文件的摆放。\nsrc/app/api\n可以在api下面放你想要的路径，比如search，那就是\nsrc/app/api/search\n但是后面必须跟route.ts/js。\n完成的文档结构应该是这样的：\n\n另外，必须明确指出使用的方法，比如GET:\nexport async function GET(request) {\n   return new Response(&#39;[&quot;apple&quot;, &quot;banana&quot;, &quot;orange&quot;]&#39;);\n}\n\n可以参考stackoverflow和nextjs官网参考。\n另外，如果是flask的需求，那么不要把端口设置成5000，容易出现403错误，可以设置成8000，可以参考stackoverflow帖子。\n一个简单的 nextjs 搜索应用，后端是 python。三个文件如下：\npage.tsx:\n&#39;use client&#39;\nimport { useEffect, useState } from &quot;react&quot;;\n\nexport default function Home() {\n  const [query, setQuery] = useState(&quot;&quot;);\n  const [results, setResults] = useState([]);\n\n  const handleSearch = async () =&gt; {\n    const res = await fetch(`/api/search?query=${query}`);\n    const data = await res.json();\n    setResults(data);\n  };\n\n  return (\n    &lt;div&gt;\n      &lt;input\n        value={query}\n        onChange={(e) =&gt; setQuery(e.target.value)}\n        placeholder=&quot;Search...&quot;\n      /&gt;\n      &lt;button onClick={handleSearch}&gt;Search&lt;/button&gt;\n      &lt;ul&gt;\n        {results.map((result, index) =&gt; (\n          &lt;li key={index}&gt;{result}&lt;/li&gt;\n        ))}\n      &lt;/ul&gt;\n    &lt;/div&gt;\n  );\n}\n\nroute.js\nexport async function GET(request) {\n    // console.log(&quot;search.js runs&quot;);\n    // console.log(request);\n    // console.log(request.url);\n\n\n    const { searchParams } = new URL(request.url)\n    const query = searchParams.get(&#39;query&#39;)\n    console.log(query);\n    const response = await fetch(`http://localhost:8000/search?query=${query}`);\n    // console.log(response);\n    const data = await response.json();\n    console.log(&quot;data: &quot;, data);\n    return new Response(JSON.stringify(data));\n\n\n\n    // return new Response(&#39;[&quot;apple&quot;, &quot;banana&quot;, &quot;orange&quot;]&#39;);\n  \n\n    // return new Response(JSON.stringify(data));\n\n};\n\napp.py\nfrom flask import Flask, request, jsonify\nfrom flask_cors import CORS\n\napp = Flask(__name__)\nCORS(app, origins=&quot;*&quot;)\n\n@app.route(&#39;/search&#39;, methods=[&#39;GET&#39;])\n\ndef search():\n    print(&quot;hello&quot;)\n    query = request.args.get(&#39;query&#39;, &#39;&#39;)\n    print(query)\n    # 这里只是模拟一个搜索，你可以添加更复杂的逻辑\n    data = [&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;, &quot;date&quot;, &quot;fig&quot;, &quot;grape&quot;]\n    results = [fruit for fruit in data if query in fruit]\n    return jsonify(results)\n\nif __name__ == &#39;__main__&#39;:\n    app.run(port=8000, debug=True)\n\n另外，如果你要看后端是否设置成功，可以跑一下 curl :\ncurl &quot;http://localhost:8000/search?query=apple&quot;\n\n注意：这里必须用双引号，不然?号会被处理的别的信息，导致GET失败。\n"},{"title":"如何用 openai stream 做 Function calling？",
"url":"/blog/openai-stream-function-calling/",
"date":"2023-09-15",
"headings":[{"level":1,"id":"qian-duan-message-tsx","permalink":"https://linxz.online/blog/openai-stream-function-calling/#qian-duan-message-tsx","title":"前端 Message.tsx","children":[]},{"level":1,"id":"hou-duan-index-py","permalink":"https://linxz.online/blog/openai-stream-function-calling/#hou-duan-index-py","title":"后端 index.py","children":[]}],
"body":"前段时间介绍了如何用 openai 做 Function calling，有朋友就问，如果我需要采用流式输出(stream)，那要怎么办呢？\n今天就介绍一下 stream + Function calling。\n思路其实和 no stream 的时候一样，同样是“如果用户问正常的问题，不用通过知识库搜索答案；如果用户问自闭症相关问题，openai 主动通过知识库搜索后，结合 LLM 返回结果。”\n区别主要是 stream 会回复数个 response ，包含数个delta结果，而正常的 response 只有一个，choices 的结果也只有一个。\nno stream 结果：\nresponse_message: \n{\n  &quot;role&quot;: &quot;assistant&quot;,\n  &quot;content&quot;: null,\n  &quot;function_call&quot;: {\n    &quot;name&quot;: &quot;autism_expert&quot;,\n    &quot;arguments&quot;: &quot;{\\n  \\&quot;question\\&quot;: \\&quot;自闭症孩子自伤怎么办?&quot;\\n}&quot;\n  }\n}\n\nstream 结果：\nres: \n[1] {\n[1]   &quot;id&quot;: &quot;chatcmpl-7yxY0oU9KIhBSe9Ju1CcXouszL2zd&quot;,\n[1]   &quot;object&quot;: &quot;chat.completion.chunk&quot;,\n[1]   &quot;created&quot;: 1694762936,\n[1]   &quot;model&quot;: &quot;gpt-3.5-turbo-0613&quot;,\n[1]   &quot;choices&quot;: [\n[1]     {\n[1]       &quot;index&quot;: 0,\n[1]       &quot;delta&quot;: {\n[1]         &quot;role&quot;: &quot;assistant&quot;,\n[1]         &quot;content&quot;: null,\n[1]         &quot;function_call&quot;: {\n[1]           &quot;name&quot;: &quot;autism_expert&quot;,\n[1]           &quot;arguments&quot;: &quot;&quot;\n[1]         }\n[1]       },\n[1]       &quot;finish_reason&quot;: null\n[1]     }\n[1]   ]\n[1] }\n\n因此，我们的任务是在 stream 开始时便分流，如果 openai 判断不用过知识库（即没有function_call 参数），直接输出结果，并设置一个 flag，让它不用再走知识库。 如果判断需要走知识库，在 stream 结束后提取知识库的内容，根据知识库回答，调整 prompt，并再次唤起 LLM。\n主要代码如下：\n前端 Message.tsx\n&quot;use client&quot;\nimport React from &#39;react&#39;;\nimport { useState, useEffect } from &#39;react&#39;;\n\nexport default function Message({ai, user, content}: {ai: boolean, user: boolean, content: string}){\n  \n  \n  const [resultText, setResultText] = useState(&#39;&#39;);  // 使用useState来保存结果\n\n  useEffect(() =&gt; {\n\n  if (ai &amp;&amp; content) {\n    const generate = async () =&gt; {\n      try {\n        // Fetch the response from the OpenAI API with the signal from AbortController\n          const response = await fetch(&quot;http://localhost:5328/api/python&quot;, {\n            method: &quot;POST&quot;,\n            headers: {\n              &quot;Content-Type&quot;: &quot;application/json&quot;,\n            },\n            body: JSON.stringify({ content: content }),\n          });\n          \n          // 处理streaming response\n          const reader = response.body.getReader();\n          const decoder = new TextDecoder(&quot;utf-8&quot;);\n\n          while (true) {\n            const { done, value } = await reader.read();\n            if (done) {\n              break;\n            }\n            // Massage and parse the chunk of data\n            const chunk = decoder.decode(value);\n            console.log(&quot;Original chunk:&quot;, chunk);\n            setResultText(prevText =&gt; prevText + chunk);  // 使用setState更新状态\n            // console.log(&quot;Result text:&quot;, resultText);\n          }\n        } catch (error) {\n              console.error(&quot;Error occurred while generating:&quot;, error.message);\n        }\n      };\n      generate();\n    }\n\n    }, [ai, content]);\n\n    let messageContent = user ? content : (ai ? resultText : &#39;有什么可以帮你的吗？&#39;);\n\n    \n    return (\n        &lt;div className={`flex ${user ? &#39;flex-row-reverse&#39; : &#39;&#39;}`}&gt;\n          &lt;img \n            src=&quot;robot_ai.png&quot;\n            className=&quot;w-10 h-10 rounded-full&quot;  \n          /&gt;\n    \n          &lt;div className=&quot;flex flex-col ml-4&quot;&gt;\n            &lt;div className=&quot;px-4 py-2 rounded-lg&quot;&gt;\n              &lt;p&gt;{messageContent}&lt;/p&gt;\n            &lt;/div&gt;\n    \n            &lt;div className=&quot;text-gray-500 text-sm mt-2 flex justify-between invisible group-hover:visible&quot;&gt;\n              &lt;div&gt;时间&lt;/div&gt;\n              &lt;div className=&quot;flex&quot;&gt;\n                {/* &lt;CopyButton /&gt; */}\n              &lt;/div&gt;\n            &lt;/div&gt;\n          &lt;/div&gt;\n        &lt;/div&gt;\n      )\n}\n\n后端 index.py\n# index.py\nfrom flask import Flask, request, Response\nimport os, json, re\nfrom dotenv import load_dotenv\nfrom flask_cors import CORS\nimport openai\n\nfrom supabase.client import create_client\nfrom langchain.embeddings import MiniMaxEmbeddings\nfrom langchain.vectorstores import SupabaseVectorStore\n\nload_dotenv()  # 加载 .env 文件中的变量\n\napp = Flask(__name__)\nCORS(app, origins=&quot;*&quot;)\nopenai.api_key = os.getenv(&quot;OPENAI_API_KEY&quot;)  # 从环境变量中获取 API 密钥\nSUPABASE_URL = os.getenv(&quot;SUPABASE_URL&quot;)\nSUPABASE_PRIVATE_KEY = os.getenv(&quot;SUPABASE_PRIVATE_KEY&quot;)\nMINIMAX_API_KEY = os.getenv(&quot;MINIMAX_API_KEY&quot;)\nMINIMAX_GROUP_ID = os.getenv(&quot;MINIMAX_GROUP_ID&quot;)\n\n\nsupabase_client = create_client(SUPABASE_URL, SUPABASE_PRIVATE_KEY)\nembeddings = MiniMaxEmbeddings(minimax_api_key=MINIMAX_API_KEY, minimax_group_id=MINIMAX_GROUP_ID)\n\n\n@app.route(&quot;/api/python&quot;, methods=[&quot;POST&quot;])\ndef generate():\n\n    content = request.json.get(&#39;content&#39;)\n\n    def autism_expert(question):\n        &quot;&quot;&quot;当用户问自闭症问题时，搜索专业答案&quot;&quot;&quot;\n        vector_store = SupabaseVectorStore(\n            client=supabase_client,\n            embedding=embeddings,\n            table_name=&quot;documents&quot;,\n            query_name=&quot;match_documents&quot;,\n        )\n        match_documents = vector_store.similarity_search(question)\n        expert_result = match_documents[0].page_content\n        #print(&quot;expert_result: &quot; + expert_result)\n        \n        return expert_result\n\n    def run_conversation():\n        # Step 1: send the conversation and available functions to GPT\n        messages = [{&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;你是自闭症康复专家&quot;},{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: content}]\n        functions = [\n            {\n                &quot;name&quot;: &quot;autism_expert&quot;,\n                &quot;description&quot;: &quot;当用户咨询自闭症类问题有用&quot;,\n                &quot;parameters&quot;: {\n                    &quot;type&quot;: &quot;object&quot;,\n                    &quot;properties&quot;: {\n                        &quot;question&quot;: {\n                            &quot;type&quot;: &quot;string&quot;,\n                            &quot;description&quot;: &quot;用户的问题&quot;,\n                        },\n                    },\n                    &quot;required&quot;: [&quot;question&quot;],\n                },\n            }\n        ]\n\n        flag_executed = False\n\n        for res in openai.ChatCompletion.create(\n            model=&quot;gpt-3.5-turbo-0613&quot;,\n            messages=messages,\n            functions=functions,\n            function_call=&quot;auto&quot;,  # auto is default, but we&#39;ll be explicit\n            stream=True\n        ):\n            print(&quot;res: &quot;)\n            print(res)\n            print(&quot;====================&quot;)\n            delta = res.choices[0].delta\n            # print(&quot;delta: &quot;)\n            # print(delta)\n            # print(&quot;====================&quot;)\n\n            if &quot;function_call&quot; not in delta and &#39;content&#39; in delta:\n                print(&quot;delta.content&quot;)\n                print(delta.content)\n                print(&quot;====================&quot;)\n                if &#39;content&#39; in delta:\n                    yield delta.content\n                    flag_executed = True\n            \n        if not flag_executed:\n            function_name = &quot;autism_expert&quot;\n            fuction_to_call = autism_expert\n            function_response = fuction_to_call(\n                question=content,\n            )\n\n            messages.append(\n                {\n                    &quot;role&quot;: &quot;function&quot;,\n                    &quot;name&quot;: function_name,\n                    &quot;content&quot;: function_response,\n                }\n            )  # extend conversation with function response\n            print(&quot;function_message: &quot;)\n            print(messages)\n            print(&quot;====================&quot;)   \n\n            search_result = messages[2][&#39;content&#39;] \n            answer_match = re.search(r&#39;answer: (.*)&#39;, search_result, re.DOTALL)\n            if answer_match:\n                answer = answer_match.group(1)\n                print(&quot;answer: &quot; + answer)\n                print(&quot;====================&quot;)\n            \n            prompt = f&quot;&quot;&quot;\n            根据用户的问题，参考背景信息，输出回答。要求回答简短切题，且尽可能有趣地回复。用户问题和参考背景信息会用{{}}来表示。\n            用户问题：{content}, 参考背景信息：{answer}\n            &quot;&quot;&quot;\n            \n            for chunk in openai.ChatCompletion.create(\n                model=&#39;gpt-3.5-turbo&#39;,\n                messages=[\n                    {&#39;role&#39;: &#39;user&#39;, &#39;content&#39;: prompt}\n                ],\n                temperature=0,\n                stream=True  # this time, we set stream=True\n            ):\n                # 有的chunk没有content\n                if &#39;content&#39; in chunk.choices[0].delta:\n                    print(chunk.choices[0].delta.content)\n                    yield chunk.choices[0].delta.content\n                   \n    return Response(run_conversation(), mimetype=&#39;text/event-stream&#39;)\n\nif __name__ == &#39;__main__&#39;:\n    app.run(port=5328,debug=True)\n\n"},{"title":"如何在 nextjs 里面使用 markdown 格式输出？",
"url":"/blog/nextjs-markdown/",
"date":"2023-09-13",
"headings":[{"level":1,"id":"biao-ge-shu-chu","permalink":"https://linxz.online/blog/nextjs-markdown/#biao-ge-shu-chu","title":"表格输出","children":[]},{"level":1,"id":"shi-yong-tailwindcss-hou-markdown-shi-xiao","permalink":"https://linxz.online/blog/nextjs-markdown/#shi-yong-tailwindcss-hou-markdown-shi-xiao","title":"使用 TailwindCSS 后 markdown 失效","children":[]},{"level":1,"id":"ru-he-xian-shi-code-block","permalink":"https://linxz.online/blog/nextjs-markdown/#ru-he-xian-shi-code-block","title":"如何显示 code block","children":[]},{"level":1,"id":"dai-ma-zi-dong-huan-xing","permalink":"https://linxz.online/blog/nextjs-markdown/#dai-ma-zi-dong-huan-xing","title":"代码自动换行","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/nextjs-markdown/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"需要使用一个叫“react-markdown”的库。\n首先安装库：\nnpm i react-markdown\n\nimport 库：\nimport ReactMarkdown from &#39;react-markdown&#39;;\n\n使用 markdown 的模块：\n&lt;ReactMarkdown&gt;{yourContent}&lt;/ReactMarkdown&gt;\n\n如果需要使用 html 模块，比如&lt;br/&gt;，需要添加 Plugins rehypeRaw：\n&lt;ReactMarkdown rehypePlugins={[rehypeRaw]}&gt;{yourContent}&lt;/ReactMarkdown&gt;\n\n如果需要使用不常用的markdown语法，需要使用插件remark-gfm，用法与其他 Plugins 一致。\n&lt;ReactMarkdown remarkPlugins={[remarkGfm]}&gt;{yourContent}&lt;/ReactMarkdown&gt;\n\n官网解释remark-gfm：\n&lt;ReactMarkdown&gt; 支持的语法: \na, blockquote, br, code, em, h1, h2, h3, h4, h5, h6, hr, img, li, ol, p, pre, strong, and ul.\nremark-gfm Plugin 支持的语法: \ndel, input, table, tbody, td, th, thead, and tr.\n表格输出\n除了使用 remark-gfm Plugin 外，还需要额外添加 CSS 语法。这样一来，才会显示表格的边框。\n以 openai 的输出为例，主要影响的是th表头和td表格内容。需要添加在globals.css里面：\nth {\n  background-color: #b3e5fc; /* 表头是浅蓝色的 */\n  color: #333;\n  font-weight: bold;\n  text-align: center; /* 居中 */\n}\n\ntd {\n  text-align: center;\n}\n\n使用 TailwindCSS 后 markdown 失效\n如果你在使用 TailwindCSS，请注意 markdown 效果不能正常显示。因为 TailwindCSS 会改变所有 html 的元素效果，可以参考这个stackoverflow 帖子。\n解决方法是在 globals.css 新增一个类，叫做 markdown，代码如下：\n .markdown &gt; * {\n  all: revert;\n}\n\n这个代码会消除已有的 html 效果，所以只需要在 ReactMarkdown 上添加这个类即可：\n&lt;ReactMarkdown className=&#39;markdown&#39;&gt;{messageContent}&lt;/ReactMarkdown&gt;\n\n如何显示 code block\ncode block 需要用到 react-syntax-highlighter，首先是安装：\nnpm install react-syntax-highlighter\n\n需要 import 两个库，一个是 react-syntax-highlighter，一个是代码风格：\nimport {Prism as SyntaxHighlighter} from &#39;react-syntax-highlighter&#39;\nimport {vscDarkPlus} from &#39;react-syntax-highlighter/dist/esm/styles/prism&#39;\n\n在 return 里面，输出以下代码：\n&lt;ReactMarkdown className=&#39;markdown&#39; rehypePlugins={[rehypeRaw]} \n   components={{\n      code({node, inline, className, children, ...props}) {\n      const match = /language-(\\w+)/.exec(className || &#39;&#39;)\n      return !inline &amp;&amp; match ? (\n        &lt;SyntaxHighlighter\n          {...props}\n          children={String(children).replace(/\\n$/, &#39;&#39;)}\n          style={vscDarkPlus}\n          language={match[1]}\n          PreTag=&quot;div&quot;\n        /&gt;\n      ) : (\n        &lt;code {...props} className={className}&gt;\n          {children}\n        &lt;/code&gt;\n      )\n      }\n    }}\n&gt;{messageContent}&lt;/ReactMarkdown&gt;\n\n这样可以实现检测出代码时，以代码的形式输出，效果如下图：\n\n以上代码主要参考 react-markdown 官网中 react-syntax-highlighter 模块。\n代码自动换行\n如何让代码自动换行：\nwrapLongLines={true}\nreact-syntax-highlighter的参数可查阅github链接。\n代码：\n&lt;SyntaxHighlighter\n  {...props}\n  children={String(children).replace(/\\n$/, &#39;&#39;)}\n  style={vscDarkPlus}\n  language={match[1]}\n  PreTag=&quot;div&quot;\n  wrapLongLines={true}\n/&gt;\n\n效果如下：\n\n参考资料\n\n\nreact-markdown 官网\n\n\nreact-syntax-highlighter style 预览\n\n\nreact-syntax-highlighter style 各类别名称\n\n\nReact Markdown: A Thorough Guide With Markdown Examples\n\n\nreact-syntax-highlighter 个人经验\n\n\n"},{"title":"如何用 Minimax 做 Function calling？",
"url":"/blog/minimax-function-calling/",
"date":"2023-09-11",
"headings":[{"level":1,"id":"shen-me-shi-function-calling","permalink":"https://linxz.online/blog/minimax-function-calling/#shen-me-shi-function-calling","title":"什么是 Function calling?","children":[]},{"level":1,"id":"function-name-bi-description-geng-zhong-yao","permalink":"https://linxz.online/blog/minimax-function-calling/#function-name-bi-description-geng-zhong-yao","title":"function name 比 description 更重要","children":[]}],
"body":"什么是 Function calling?\nFunction calling 是将自创函数作为调用ChatGPT等大模型的参数，补足大模型的能力不足。在函数中我们可以做任何事情，例如获取网络上的数据，查询自己的数据库等。\nMinimax 是少数可以做 Function calling 的国产大模型，在这个例子中，我设置了一个天气 function，输出一个固定值（实际应用中应接入天气应用的 api），以下介绍使用它 Function calling 的方法：\nimport requests\nimport json\n\ngroup_id=&quot;your-id&quot;\napi_key=&quot;your-key&quot;\n\ncontent = &quot;深圳天气如何&quot;\n\n# 1. 定义自己的function实现\n\n\ndef getweather(location):\n    weather = &quot;晴天，28度&quot;\n#     print(weather)\n    return weather\n\n\n# 2. 使用functions选项调用ccp接口\n\nurl = f&quot;https://api.minimax.chat/v1/text/chatcompletion_pro?GroupId={group_id}&quot;\nheaders = {&quot;Authorization&quot;: f&quot;Bearer {api_key}&quot;, &quot;Content-Type&quot;: &quot;application/json&quot;}\npayload = {\n    &quot;bot_setting&quot;: [\n        {\n            &quot;bot_name&quot;: &quot;MM智能助理&quot;,\n            &quot;content&quot;: &quot;MM智能助理是一款由MiniMax自研的，没有调用其他产品的接口的大型语言模型。MiniMax是一家中国科技公司，一直致力于进行大模型相关的研究。&quot;,\n        }\n    ],\n    &quot;reply_constraints&quot;: {&quot;sender_type&quot;: &quot;BOT&quot;, &quot;sender_name&quot;: &quot;MM智能助理&quot;},\n    &quot;plugins&quot;: [],\n    &quot;functions&quot;: [\n        {\n            &quot;name&quot;: &quot;get_weather&quot;,\n            &quot;description&quot;: &quot;获取天气信息&quot;,\n            &quot;parameters&quot;: {\n                &quot;type&quot;: &quot;object&quot;,\n                &quot;properties&quot;: {&quot;location&quot;: {&quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;要获得天气的地点&quot;}},\n                &quot;required&quot;: [&quot;location&quot;],\n            },\n        }\n    ],\n    &quot;sample_messages&quot;: [],\n    &quot;messages&quot;: [\n        {&quot;sender_type&quot;: &quot;USER&quot;, &quot;sender_name&quot;: &quot;小明&quot;, &quot;text&quot;: content}\n    ],\n    &quot;model&quot;: &quot;abab5.5-chat&quot;,\n    &quot;tokens_to_generate&quot;: 1000,\n    &quot;temperature&quot;: 0.01,\n    &quot;top_p&quot;: 0.95,\n    &quot;stream&quot;: False,\n}\n\nresponse = requests.post(url, headers=headers, json=payload)\n\nprint(response.status_code)\n# print(response.text)\n\n# 3. 解析ccp接口的响应，并调用自己的function\n\njson_resp = response.json()\n\nif &quot;function_call&quot; not in json_resp:\n    print(&quot;\\n&quot;)\n    print(&quot;======================&quot;)\n    print(&quot;没有经过function call: &quot;)\n    print(json_resp[&#39;reply&#39;])\n    print(&quot;======================&quot;)\n    \nelse:\n    arguments = json.loads(json_resp[&quot;function_call&quot;][&quot;arguments&quot;])\n    func_resp = getweather(arguments[&quot;location&quot;])\n    print(&quot;\\n&quot;)\n    print(&quot;======================&quot;)\n    print(&quot;function call 结果: &quot;)\n    print(func_resp)\n    print(&quot;======================&quot;)\n    \n    answer = func_resp\n\n    # 4. second llm response\n    prompt = f&#39;&#39;&#39;\n    根据知识库答案，用有趣的语气回答用户问题。\n    用户问题{content}\n    知识库答案{answer}\n    &#39;&#39;&#39;\n    \n    payload2 = {\n    &quot;bot_setting&quot;: [\n        {\n            &quot;bot_name&quot;: &quot;米豆&quot;,\n            &quot;content&quot;: &quot;我是米豆，专门解答各种问题&quot;,\n        }\n    ],\n    &quot;messages&quot;: [{&quot;sender_type&quot;: &quot;USER&quot;, &quot;sender_name&quot;: &quot;小中&quot;, &quot;text&quot;: prompt}],\n    &quot;reply_constraints&quot;: {&quot;sender_type&quot;: &quot;BOT&quot;, &quot;sender_name&quot;: &quot;米豆&quot;},\n    &quot;model&quot;: &quot;abab5.5-chat&quot;,\n    &quot;tokens_to_generate&quot;: 1034,\n    &quot;temperature&quot;: 0.01,\n    &quot;top_p&quot;: 0.95,\n    }\n    \n    headers2 = {&quot;Content-Type&quot;: &quot;application/json&quot;, &quot;Authorization&quot;: &quot;Bearer &quot; + api_key}\n    response2 = requests.request(&quot;POST&quot;, url, headers=headers2, json=payload2)\n\n    print(response2.text)\n\n输出结果示例：\n200\n======================\nfunction call 结果: \n晴天，28度\n======================\n{&quot;created&quot;:1694415844,&quot;model&quot;:&quot;abab5.5-chat&quot;,&quot;reply&quot;:&quot;深圳的天气非常棒哦，阳光明媚，温度适宜，大约28度左右，非常适合外出游玩呢！&quot;,&quot;choices&quot;:[{&quot;finish_reason&quot;:&quot;stop&quot;,&quot;messages&quot;:[{&quot;sender_type&quot;:&quot;BOT&quot;,&quot;sender_name&quot;:&quot;米豆&quot;,&quot;text&quot;:&quot;深圳的天气非常棒哦，阳光明媚，温度适宜，大约28度左右，非常适合外出游玩呢！&quot;}]}],&quot;usage&quot;:{&quot;total_tokens&quot;:203},&quot;input_sensitive&quot;:false,&quot;output_sensitive&quot;:false,&quot;id&quot;:&quot;014deee3fe3960f8a40499a642b5c796&quot;,&quot;base_resp&quot;:{&quot;status_code&quot;:0,&quot;status_msg&quot;:&quot;&quot;}}\n\n提取内容：\njson.loads(response2.text)[&#39;reply&#39;]\n\n输出结果：\n&#39;深圳的天气非常棒哦，阳光明媚，温度适宜，大约28度左右，非常适合外出游玩呢！&#39;\n\nfunction name 比 description 更重要\n如果你的 function calling 有时灵，有时不灵，那就是 function name 的问题。\n我有个自闭症搜索应用，用到 minimax 的 function calling，改了无数 description，达不到想要的效果。咨询了客服，原来是改变 function_name 有奇效！\n例子：把函数 name 从 “autism_expert” 修改为 “Autism_Problem_Search” 能够更好地搜索到自闭症知识库。\n"},{"title":"如何用 openai 做 Function calling",
"url":"/blog/openai-function-calling/",
"date":"2023-09-11",
"headings":[{"level":1,"id":"import-yi-lai-xiang","permalink":"https://linxz.online/blog/openai-function-calling/#import-yi-lai-xiang","title":"import 依赖项","children":[]},{"level":1,"id":"ding-yi-retrieval-function","permalink":"https://linxz.online/blog/openai-function-calling/#ding-yi-retrieval-function","title":"定义 retrieval function","children":[]},{"level":1,"id":"wen-zi-bi-zheng-wen-ti","permalink":"https://linxz.online/blog/openai-function-calling/#wen-zi-bi-zheng-wen-ti","title":"问自闭症问题","children":[]},{"level":1,"id":"wen-zheng-chang-wen-ti","permalink":"https://linxz.online/blog/openai-function-calling/#wen-zheng-chang-wen-ti","title":"问正常问题","children":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/openai-function-calling/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"这是一个例子：用 openai 做 agent，自己判断是否进行自闭症知识库搜索。\n具体来说，如果用户问正常的问题，不用通过知识库搜索答案；如果用户问自闭症相关问题，openai 主动通过知识库搜索后，结合 LLM 返回结果。\nimport 依赖项\nimport os\nos.environ[&quot;OPENAI_API_KEY&quot;] = &quot;your-api-key&quot; # 放入 python 的环境变量\n\nimport openai\n\n定义 retrieval function\n这里使用 supabase 作为知识库，minimax 作为 embedding 模型（便宜些）。\nSUPABASE_PRIVATE_KEY = &quot;your-key&quot;\nSUPABASE_URL = &quot;your-url&quot;\nMINIMAX_GROUP_ID=&quot;your-id&quot;\nMINIMAX_API_KEY=&quot;your-key&quot;\n\nfrom supabase.client import create_client\nfrom langchain.embeddings import MiniMaxEmbeddings\nfrom langchain.vectorstores import SupabaseVectorStore\n\nsupabase_client = create_client(SUPABASE_URL, SUPABASE_PRIVATE_KEY)\nembeddings = MiniMaxEmbeddings(minimax_api_key=MINIMAX_API_KEY, minimax_group_id=MINIMAX_GROUP_ID)\n\n# function\ndef autism_expert(question):\n    &quot;&quot;&quot;当用户问自闭症问题时，搜索专业答案&quot;&quot;&quot;\n    vector_store = SupabaseVectorStore(\n        client=supabase_client,\n        embedding=embeddings,\n        table_name=&quot;documents&quot;,\n        query_name=&quot;match_documents&quot;,\n    )\n    match_documents = vector_store.similarity_search(question)\n    expert_result = match_documents[0].page_content\n    \n    return expert_result\n\n问自闭症问题\nimport re\ncontent = &quot;自闭症孩子自伤怎么办?&quot;\n\ndef run_conversation():\n    # Step 1: send the conversation and available functions to GPT\n    messages = [{&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;你是自闭症康复专家&quot;},{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: content}]\n    functions = [\n        {\n            &quot;name&quot;: &quot;autism_expert&quot;,\n            &quot;description&quot;: &quot;当用户咨询自闭症类问题有用&quot;,\n            &quot;parameters&quot;: {\n                &quot;type&quot;: &quot;object&quot;,\n                &quot;properties&quot;: {\n                    &quot;question&quot;: {\n                        &quot;type&quot;: &quot;string&quot;,\n                        &quot;description&quot;: &quot;用户的问题&quot;,\n                    },\n                },\n                &quot;required&quot;: [&quot;question&quot;],\n            },\n        }\n    ]\n    response = openai.ChatCompletion.create(\n        model=&quot;gpt-3.5-turbo-0613&quot;,\n        messages=messages,\n        functions=functions,\n        function_call=&quot;auto&quot;,  # auto is default, but we&#39;ll be explicit\n    )\n    response_message = response[&quot;choices&quot;][0][&quot;message&quot;]\n    print(&quot;response_message: &quot;)\n    print(response_message)\n    print(&quot;====================&quot;)\n\n    # Step 2: check if GPT wanted to call a function\n    if response_message.get(&quot;function_call&quot;):\n        # Step 3: call the function\n        # Note: the JSON response may not always be valid; be sure to handle errors\n        available_functions = {\n            &quot;autism_expert&quot;: autism_expert,\n        }  # only one function in this example, but you can have multiple\n        function_name = response_message[&quot;function_call&quot;][&quot;name&quot;]\n        fuction_to_call = available_functions[function_name]\n        function_args = json.loads(response_message[&quot;function_call&quot;][&quot;arguments&quot;])\n        function_response = fuction_to_call(\n            question=function_args.get(&quot;question&quot;),\n        )\n\n        # Step 4: send the info on the function call and function response to GPT\n        messages.append(response_message)  # extend conversation with assistant&#39;s reply\n        messages.append(\n            {\n                &quot;role&quot;: &quot;function&quot;,\n                &quot;name&quot;: function_name,\n                &quot;content&quot;: function_response,\n            }\n        )  # extend conversation with function response\n        print(&quot;function_message: &quot;)\n        print(messages)\n        print(&quot;====================&quot;)\n        \n        search_result = messages[3][&#39;content&#39;] #加了system就是3，否则就是2\n        answer_match = re.search(r&#39;answer: (.*)&#39;, search_result, re.DOTALL)\n        if answer_match:\n            answer = answer_match.group(1)\n            print(&quot;answer: &quot; + answer)\n            print(&quot;====================&quot;)\n            \n            prompt = f&quot;&quot;&quot;\n                    根据用户的问题，参考背景信息，输出回答。要求回答简短切题，且尽可能有趣地回复。用户问题和参考背景信息会用{{}}来表示。\n                    用户问题：{content}, 参考背景信息：{answer}\n                    &quot;&quot;&quot;\n        \n            second_response = openai.ChatCompletion.create(\n                model=&quot;gpt-3.5-turbo&quot;,\n                messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: prompt}],\n                temperature=0\n            )  # get a new response from GPT where it can see the function response\n            return second_response[&#39;choices&#39;][0][&#39;message&#39;][&#39;content&#39;]\n    else:\n        return response_message[&#39;content&#39;]\nprint(run_conversation())\n\n返回结果示例：\nresponse_message: \n{\n  &quot;role&quot;: &quot;assistant&quot;,\n  &quot;content&quot;: null,\n  &quot;function_call&quot;: {\n    &quot;name&quot;: &quot;autism_expert&quot;,\n    &quot;arguments&quot;: &quot;{\\n  \\&quot;question\\&quot;: \\&quot;自闭症孩子自伤怎么办?&quot;\\n}&quot;\n  }\n}\n====================\nfunction_message: \n[{&#39;role&#39;: &#39;system&#39;, &#39;content&#39;: &#39;你是自闭症康复专家&#39;}, {&#39;role&#39;: &#39;user&#39;, &#39;content&#39;: &#39;自闭症孩子自伤怎么办?&#39;}, &lt;OpenAIObject at 0x10caf2750&gt; JSON: {\n  &quot;role&quot;: &quot;assistant&quot;,\n  &quot;content&quot;: null,\n  &quot;function_call&quot;: {\n    &quot;name&quot;: &quot;autism_expert&quot;,\n    &quot;arguments&quot;: &quot;{\\n  \\&quot;question\\&quot;: \\&quot;自闭症孩子自伤怎么办?&quot;\\n}&quot;\n  }\n}, {&#39;role&#39;: &#39;function&#39;, &#39;name&#39;: &#39;autism_expert&#39;, &#39;content&#39;: &#39;question: 自闭症孩子自伤怎么办？\\nanswer: 自闭症孩子自伤可能是因为他们感到沮丧、无助、焦虑或者无法表达自己的情感。作为家长或者监护人，我们需要尽快采取行动，帮助孩子缓解情绪。以下是一些可能有用的方法：\\n\\n1. 寻求专业帮助：带孩子去看专业医生或者心理医生，他们可以给予专业的建议和治疗。\\n\\n2. 找到合适的方式表达情感：有时候，孩子自伤可能是因为他们无法有效地表达自己的情感。帮助孩子找到适合他们的方式来表达情感，比如画画、写日记等。\\n\\n3. 建立安全的环境：孩子自伤的情况可能会在一些安全的环境下发生，因此我们需要确保孩子的周围环境是安全的。\\n\\n4. 培养积极的情感：鼓励孩子做一些积极的事情，比如参加运动、社交活动等，帮助他们建立积极的情感。\\n\\n5. 提供支持和理解：让孩子知道你在他们身边，支持他们，理解他们的感受。同时，也要教育他们正确的行为方式和应对策略。&#39;}]\n====================\nanswer: 自闭症孩子自伤可能是因为他们感到沮丧、无助、焦虑或者无法表达自己的情感。作为家长或者监护人，我们需要尽快采取行动，帮助孩子缓解情绪。以下是一些可能有用的方法：\n\n1. 寻求专业帮助：带孩子去看专业医生或者心理医生，他们可以给予专业的建议和治疗。\n\n2. 找到合适的方式表达情感：有时候，孩子自伤可能是因为他们无法有效地表达自己的情感。帮助孩子找到适合他们的方式来表达情感，比如画画、写日记等。\n\n3. 建立安全的环境：孩子自伤的情况可能会在一些安全的环境下发生，因此我们需要确保孩子的周围环境是安全的。\n\n4. 培养积极的情感：鼓励孩子做一些积极的事情，比如参加运动、社交活动等，帮助他们建立积极的情感。\n\n5. 提供支持和理解：让孩子知道你在他们身边，支持他们，理解他们的感受。同时，也要教育他们正确的行为方式和应对策略。\n====================\n对于自闭症孩子自伤的问题，我们可以采取以下方法来帮助他们：\n\n1. 寻求专业帮助，让专业医生或心理医生给予专业建议和治疗，他们会是你的得力助手。\n\n2. 帮助孩子找到适合他们的方式来表达情感，比如画画、写日记，让他们用自己的方式来宣泄情绪。\n\n3. 确保孩子的周围环境是安全的，这样可以减少自伤的可能性。\n\n4. 鼓励孩子参加一些积极的活动，比如运动、社交活动，帮助他们建立积极的情感。\n\n5. 让孩子知道你在他们身边，支持他们，理解他们的感受。同时，教育他们正确的行为方式和应对策略。\n\n希望这些方法能对你有所帮助，祝愿你和孩子都能度过困难时期。\n\n问正常问题\nimport re\ncontent = &quot;你是谁?&quot;\n\ndef run_conversation():\n    # Step 1: send the conversation and available functions to GPT\n    messages = [{&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;你是自闭症康复专家&quot;},{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: content}]\n    functions = [\n        {\n            &quot;name&quot;: &quot;autism_expert&quot;,\n            &quot;description&quot;: &quot;当用户咨询自闭症类问题有用&quot;,\n            &quot;parameters&quot;: {\n                &quot;type&quot;: &quot;object&quot;,\n                &quot;properties&quot;: {\n                    &quot;question&quot;: {\n                        &quot;type&quot;: &quot;string&quot;,\n                        &quot;description&quot;: &quot;用户的问题&quot;,\n                    },\n                },\n                &quot;required&quot;: [&quot;question&quot;],\n            },\n        }\n    ]\n    response = openai.ChatCompletion.create(\n        model=&quot;gpt-3.5-turbo-0613&quot;,\n        messages=messages,\n        functions=functions,\n        function_call=&quot;auto&quot;,  # auto is default, but we&#39;ll be explicit\n    )\n    response_message = response[&quot;choices&quot;][0][&quot;message&quot;]\n    print(&quot;response_message: &quot;)\n    print(response_message)\n    print(&quot;====================&quot;)\n\n    # Step 2: check if GPT wanted to call a function\n    if response_message.get(&quot;function_call&quot;):\n        # Step 3: call the function\n        # Note: the JSON response may not always be valid; be sure to handle errors\n        available_functions = {\n            &quot;autism_expert&quot;: autism_expert,\n        }  # only one function in this example, but you can have multiple\n        function_name = response_message[&quot;function_call&quot;][&quot;name&quot;]\n        fuction_to_call = available_functions[function_name]\n        function_args = json.loads(response_message[&quot;function_call&quot;][&quot;arguments&quot;])\n        function_response = fuction_to_call(\n            question=function_args.get(&quot;question&quot;),\n        )\n\n        # Step 4: send the info on the function call and function response to GPT\n        messages.append(response_message)  # extend conversation with assistant&#39;s reply\n        messages.append(\n            {\n                &quot;role&quot;: &quot;function&quot;,\n                &quot;name&quot;: function_name,\n                &quot;content&quot;: function_response,\n            }\n        )  # extend conversation with function response\n        print(&quot;function_message: &quot;)\n        print(messages)\n        print(&quot;====================&quot;)\n        \n        search_result = messages[3][&#39;content&#39;] #加了system就是3，否则就是2\n        answer_match = re.search(r&#39;answer: (.*)&#39;, search_result, re.DOTALL)\n        if answer_match:\n            answer = answer_match.group(1)\n            print(&quot;answer: &quot; + answer)\n            print(&quot;====================&quot;)\n            \n            prompt = f&quot;&quot;&quot;\n                    根据用户的问题，参考背景信息，输出回答。要求回答简短切题，且尽可能有趣地回复。用户问题和参考背景信息会用{{}}来表示。\n                    用户问题：{content}, 参考背景信息：{answer}\n                    &quot;&quot;&quot;\n        \n            second_response = openai.ChatCompletion.create(\n                model=&quot;gpt-3.5-turbo&quot;,\n                messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: prompt}],\n                temperature=0\n            )  # get a new response from GPT where it can see the function response\n            return second_response[&#39;choices&#39;][0][&#39;message&#39;][&#39;content&#39;]\n    else:\n        return response_message[&#39;content&#39;]\nprint(run_conversation())\n\n返回结果示例：\nresponse_message: \n{\n  &quot;role&quot;: &quot;assistant&quot;,\n  &quot;content&quot;: &quot;我是自闭症康复专家。可以为您提供康复方面的建议和帮助。如果您有任何问题或需要咨询，都可以随时向我提问。&quot;\n}\n====================\n我是自闭症康复专家。可以为您提供康复方面的建议和帮助。如果您有任何问题或需要咨询，都可以随时向我提问。\n\n参考资料\nopenai Function calling 官网\n"},{"title":"如何在 openai 的应用填入 api key？",
"url":"/blog/openai-api-key/",
"date":"2023-09-06",
"headings":[{"level":1,"id":"python-pian","permalink":"https://linxz.online/blog/openai-api-key/#python-pian","title":"Python 篇","children":[{"level":2,"id":"zhi-jie-tian","permalink":"https://linxz.online/blog/openai-api-key/#zhi-jie-tian","title":"直接填","children":[]},{"level":2,"id":"huan-jing-bian-liang-she-zhi","permalink":"https://linxz.online/blog/openai-api-key/#huan-jing-bian-liang-she-zhi","title":"环境变量设置","children":[]},{"level":2,"id":"env-wen-jian-she-zhi","permalink":"https://linxz.online/blog/openai-api-key/#env-wen-jian-she-zhi","title":".env 文件设置","children":[]},{"level":2,"id":"qi-ta-shuo-ming","permalink":"https://linxz.online/blog/openai-api-key/#qi-ta-shuo-ming","title":"其他说明","children":[]},{"level":2,"id":"azure-openai-diao-yong","permalink":"https://linxz.online/blog/openai-api-key/#azure-openai-diao-yong","title":"Azure openai 调用","children":[]}]},{"level":1,"id":"javascript-pian","permalink":"https://linxz.online/blog/openai-api-key/#javascript-pian","title":"Javascript 篇","children":[]}],
"body":"Python 篇\n有三种方法：直接填、环境变量设置、.env文件设置\n直接填\n优点是简单直接，不过若是设置在应用中，会有暴露的风险。另外一个缺点是假设多次调用 api，需要填写多遍。\n官方例子：\nimport openai\nopenai.api_key = &quot;your-api-key&quot;\n\nopenai.Completion.create(\n  model=&quot;text-davinci-003&quot;,\n  prompt=&quot;Say this is a test&quot;,\n  max_tokens=7,\n  temperature=0\n)\n\nlangchain 例子：\nfrom langchain.embeddings.openai import OpenAIEmbeddings\nembedding_function = OpenAIEmbeddings(openai_api_key=&quot;your-api-key&quot;)\n\n环境变量设置\n如果你用 jupyter notebook 调试代码，推荐使用这种方式，因为便捷。同样，在应用环境中，会有泄露 api 的风险。例子：\nimport os\nos.environ[&quot;OPENAI_API_KEY&quot;] = &quot;your-api-key&quot; # 放入python 的环境变量\n\n注意：如果你需要使用import openai，请确保它在这段代码的后面，否则它不会读取到该环境变量。\n!echo $OPENAI_API_KEY # 在 jupyter notebook 里面可以用此命令看看是否设置成功\n\n# import openai here if nedded\nembedding_function = OpenAIEmbeddings()\n\n.env 文件设置\n方法是在同一文件夹内新建 .env 文件，输入 OPENAI_API_KEY = “your-api-key”。\n如果你是在应用环境中，推荐你使用这种方式，能够保证 api-key 不泄露。\n另外，如果你是需要上传代码到 github 去，需要在.gitignore 文件里面去掉.env 文件\n调用代码如下：\nimport os\nimport openai\n\nfrom dotenv import load_dotenv, find_dotenv\n_ = load_dotenv(find_dotenv()) # read local .env file；\nprint(_)\n\nopenai.api_key = os.getenv(&quot;OPENAI_API_KEY&quot;)\nprint(openai.api_key)\n\nembedding_function = OpenAIEmbeddings()\n\n# _ 代表之后不会再使用到的变量名，你可以用任何自己喜欢的变量名\n# 如果能够找到.env且文件不为空, _的值应为True，可以检验是否读取成功\n\n其他说明\n我经常看到有些教程会让你把 api-key 放到系统的环境变量（mac电脑的话，就是放在用户文档中的.bashrc或者.zshrc文件夹中，通常是隐藏文件夹），代码是：\n!export OPENAI_API_KEY=xxx #注意等号左右不能有空格\n\n我非常不推荐。\n首先，我们的 api-key 因为可能泄露或者分配用途不同原因，经常会变，这样做 api-key 的更改很麻烦。其次，这个命令在 jupyter 设置后，因为不是全局系统变量，所以只能在 bash 或者 shell 环境下生效，在 python 环境并不生效，等于设置了个寂寞。\nAzure openai 调用\nazure 调用方式和 openai 不同，复杂一点：\nembeddings = OpenAIEmbeddings(deployment=&#39;text-embedding-ada-002&#39;, # your deployment name\n                            openai_api_base=&#39;https://xxx.openai.azure.com&#39;, # your resource name\n                            openai_api_type=&#39;azure&#39;,\n                            openai_api_key=&#39;your-api-key&#39;,\n                            chunk_size=1)\n\nchunk_size = 1 是必要的，否则会报错。\nfrom langchain.llms import AzureOpenAI\nfrom langchain.chains import RetrievalQA\nfrom langchain import PromptTemplate\n\n#一般的chain_type是stuff\n\nqa = RetrievalQA.from_chain_type(\n    llm=AzureOpenAI(\n        deployment_name=&quot;your-deployment-name&quot;, \n        openai_api_version=&#39;2023-05-15&#39;,\n        openai_api_key=&quot;your-api-key&quot;,\n        temperature=0,\n        best_of=1,\n        n=1,\n        streaming=True), \n    chain_type=&quot;map_rerank&quot;, \n    retriever=retriever,\n    verbose=False,\n)\n\nJavascript 篇\n未来会新增 js 的设置教程，未完待续。\n"},{"title":"如何调用 Chroma?",
"url":"/blog/chroma/",
"date":"2023-09-05",
"headings":[{"level":1,"id":"chroma-in-langchain","permalink":"https://linxz.online/blog/chroma/#chroma-in-langchain","title":"Chroma in langchain","children":[{"level":2,"id":"embedding-cun-chu-xiang-liang","permalink":"https://linxz.online/blog/chroma/#embedding-cun-chu-xiang-liang","title":"embedding 存储向量","children":[{"level":3,"id":"1-du-qu-wen-dang","permalink":"https://linxz.online/blog/chroma/#1-du-qu-wen-dang","title":"1.读取文档","children":[]},{"level":3,"id":"2-chu-li-wen-dang","permalink":"https://linxz.online/blog/chroma/#2-chu-li-wen-dang","title":"2.处理文档","children":[]},{"level":3,"id":"3-xiang-liang-hua","permalink":"https://linxz.online/blog/chroma/#3-xiang-liang-hua","title":"3.向量化","children":[]}]},{"level":2,"id":"retrieval-du-qu-shu-ju-ku","permalink":"https://linxz.online/blog/chroma/#retrieval-du-qu-shu-ju-ku","title":"retrieval 读取数据库","children":[]},{"level":2,"id":"zhi-xing-xiang-si-du-cha-xun","permalink":"https://linxz.online/blog/chroma/#zhi-xing-xiang-si-du-cha-xun","title":"执行相似度查询","children":[]}]},{"level":1,"id":"chroma-official","permalink":"https://linxz.online/blog/chroma/#chroma-official","title":"Chroma official","children":[{"level":2,"id":"embedding-cun-chu-xiang-liang-1","permalink":"https://linxz.online/blog/chroma/#embedding-cun-chu-xiang-liang-1","title":"embedding 存储向量","children":[{"level":3,"id":"1-create-chromadb","permalink":"https://linxz.online/blog/chroma/#1-create-chromadb","title":"1.create chromadb","children":[]},{"level":3,"id":"2-create-collection","permalink":"https://linxz.online/blog/chroma/#2-create-collection","title":"2.create collection","children":[]},{"level":3,"id":"3-get-embedding","permalink":"https://linxz.online/blog/chroma/#3-get-embedding","title":"3.get embedding","children":[]},{"level":3,"id":"4-add-embedding-to-collection","permalink":"https://linxz.online/blog/chroma/#4-add-embedding-to-collection","title":"4.add embedding to collection","children":[]},{"level":3,"id":"5-check-collection","permalink":"https://linxz.online/blog/chroma/#5-check-collection","title":"5.check collection","children":[]}]},{"level":2,"id":"retrieval-du-qu-shu-ju-ku-1","permalink":"https://linxz.online/blog/chroma/#retrieval-du-qu-shu-ju-ku-1","title":"retrieval 读取数据库","children":[]},{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/chroma/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"本文介绍如何调用流行的向量数据库 Chroma 的两种方式，分别是 Chroma in langchain 和 Chroma official。\nChroma in langchain\nembedding 存储向量\n以 csv 文档 为例：\n1.读取文档\nfrom langchain.document_loaders import CSVLoader  #读取csv文档\nloader = CSVLoader(&#39;./your_path/example.csv&#39;)\ndocuments = loader.load()\n\n2.处理文档\nfrom langchain.text_splitter import CharacterTextSplitter\n# split it into chunks\ntext_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)\ndocs = text_splitter.split_documents(documents)\n\n3.向量化\nfrom langchain.embeddings.openai import OpenAIEmbeddings\nfrom langchain.vectorstores import Chroma\n\nembedding_function = OpenAIEmbeddings(openai_api_key=&quot;your-api-key&quot;)\n\ndb = Chroma.from_documents(docs, embedding_function, persist_directory=&quot;./your-local-directory&quot;)\ndb.persist() #save locally\n\ndb.get() #check status\n\nretrieval 读取数据库\n读取本地已保存的数据库文件：\nembedding_function = OpenAIEmbeddings(openai_api_key=&quot;your-api-key&quot;)\ndb = Chroma(embedding_function=embedding_function, persist_directory=&quot;./your-local-directory&quot;)\n\n注意，可不输入 embedding_function，但 langchain 默认调用的 embedding_function 是 SentenceTransformerEmbeddings，向量的维数与 openai 维数不一致，若用 OpenAIEmbeddings 会导致出错。\n执行相似度查询\nquery = &quot;感到头晕怎么办？&quot;\ndocs = db.similarity_search(query)\nprint(docs[0].page_content) # 返回查询结果\n\n注意，以上我在 openai 的 function 直接写入了 api-key，其实这对于上传代码或者生产环境都不大安全。放 api-key 还有更好的办法，可参考我的文章：《如何在 openai 的应用填入 api key？》\nChroma official\nembedding 存储向量\n1.create chromadb\nimport chromadb\nfrom chromadb.config import Settings\n\nchroma_client = chromadb.Client()\n\nclient = chromadb.Client(\n     Settings(\n         persist_directory=&quot;your-directory&quot;, # Directory to store persisted Chroma data. \n         chroma_db_impl=&quot;duckdb+parquet&quot;,\n     )\n)\n\n2.create collection\nembedding_function = OpenAIEmbeddings(openai_api_key=&quot;your-api-key&quot;)\nquestion_collection = chroma_client.create_collection(name=&#39;question&#39;, embedding_function=embedding_function)\n\n3.get embedding\n假设你的数据结构是 csv 格式，有 ‘id’、’question’ 、 ‘answer’ 列。\nimport pandas as pd\nfrom openai.embeddings_utils import get_embedding\n\ndf = pd.read_csv(&#39;your-directory/example.csv&#39;)\ndf[&#39;ada_v2&#39;] = df[&quot;question&quot;].apply(lambda x : get_embedding(x, engine = &#39;text-embedding-ada-002&#39;)) # get embedding from &#39;question&#39;, and store in &#39;ada_v2&#39;\n\ndf.to_csv(&quot;new_example.csv&quot;) # new document including &#39;ada_v2&#39;\n\n4.add embedding to collection\n需要把 csv 文档 embedding 列的string格式改成list，把 id 列的格式改成string\nfrom ast import literal_eval\n\n# Read vectors from strings back into a list\ndf[&#39;ada_v2&#39;] =df.ada_v2.apply(literal_eval)\n\n# Set vector_id to be a string\ndf[&#39;id&#39;] = df[&#39;id&#39;].apply(str)\n\nquestion_collection.add(\n    ids=df.id.tolist(),\n    embeddings=df.ada_v2.tolist(),\n)\n\n5.check collection\nquestion_collection # return Collection(name=question)\nquestion_collection.get() # check the number of ids\nquestion_collection.peek() # check everything\n\nretrieval 读取数据库\ndef query_collection(collection, query, max_results, dataframe):\n    results = collection.query(query_texts=query, n_results=max_results, include=[&#39;distances&#39;]) \n    df = pd.DataFrame({\n                &#39;id&#39;:results[&#39;ids&#39;][0], \n                &#39;score&#39;:results[&#39;distances&#39;][0],\n                &#39;question&#39;: dataframe[dataframe.id.isin(results[&#39;ids&#39;][0])][&#39;question&#39;],\n                })\n    \n    return df\n\nquery = &quot;经常感觉心慌气短，尤其在走路时上述症状加重，是气胸的后遗症吗？&quot;\n\nquestion_query_result = query_collection(\n    collection=question_collection,\n    query=query,\n    max_results=10,\n    dataframe=df,\n)\n\nquestion_query_result\n\n搜索结果示例如下，分数越低，代表向量距离越近，也就是越接近的结果。\n\n参考资料\n\n\nlangchain.vectorstores.chroma 介绍\n\n\nchroma 官网\n\n\n"},{"title":"向量数据库汇总",
"url":"/blog/vector-database/",
"date":"2023-08-25",
"headings":[{"level":1,"id":"wei-shen-me-you-xiang-liang-shu-ju-ku","permalink":"https://linxz.online/blog/vector-database/#wei-shen-me-you-xiang-liang-shu-ju-ku","title":"为什么有向量数据库？","children":[]},{"level":1,"id":"xiang-liang-jian-suo-fang-shi","permalink":"https://linxz.online/blog/vector-database/#xiang-liang-jian-suo-fang-shi","title":"向量检索方式","children":[]},{"level":1,"id":"xiang-liang-shu-ju-ku","permalink":"https://linxz.online/blog/vector-database/#xiang-liang-shu-ju-ku","title":"向量数据库","children":[{"level":2,"id":"supabase","permalink":"https://linxz.online/blog/vector-database/#supabase","title":"supabase","children":[]}]},{"level":1,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/vector-database/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"为什么有向量数据库？\n\n语言模型 LLM 有输入 token 的限制，导致对话上下文限制，因此我们要做到一个方法尽可能压缩上下文，向量是个好方式，因为它占内存小；\n目前 LLM 模型的调用需要收费，特别是 GPT-4，上下文数量一多，价格非普通人可以承受。\n\n向量检索方式\n\n【知识库向量】\n【问题向量】\n【问题向量】匹配【知识库向量】\n匹配相应文本 -&gt; 输出文本\n\n其中，【知识库向量】就会存放在向量数据库中。\n\n向量数据库\n本文列举常见的向量数据库(vector store)，分为国外和国内的。\n数据库名称推荐度特点可视化程度收费易于修改程度\nSupabase⭐⭐⭐⭐⭐可视化、低代码、易维护⭐⭐⭐⭐⭐免费：2个数据库；收费：$25/月⭐⭐⭐⭐⭐\nChroma⭐⭐⭐开源、本地⭐⭐免费不能修改\nPinecone⭐⭐⭐⭐⭐仅云⭐⭐⭐⭐⭐免费：1个index；收费：$70/月⭐⭐⭐⭐⭐\nMilvus-Zilliz⭐⭐⭐本地+云⭐⭐⭐⭐⭐收费：$65/月不能修改\nQdrant⭐⭐本地+云⭐⭐⭐收费：$9/月不能修改\nWeaviate⭐⭐界面复杂；本地+云⭐收费：$25/月不能修改\n\n国外部分：\nsupabase\n地址：https://supabase.com/\n是否兼容langchain: 是\n特点：可视化、低代码、易维护\n文档：清晰易懂，带视频\n截图：\n\n国内部分：\n另外有各自的操作指南。（未完待续）\n参考资料\nguangzhengli.com\n特别推荐读一下这篇文章，非常专业和细致。\n榜单\n我根据这份榜单选择的向量数据库\n"},{"title":"如何把代码push到Github上？",
"url":"/blog/github-push/",
"date":"2023-08-16",
"headings":[{"level":1,"id":"1-git-init","permalink":"https://linxz.online/blog/github-push/#1-git-init","title":"1.git init","children":[]},{"level":1,"id":"2-git-add","permalink":"https://linxz.online/blog/github-push/#2-git-add","title":"2. git add .","children":[{"level":2,"id":"git-reset","permalink":"https://linxz.online/blog/github-push/#git-reset","title":"git reset","children":[]}]},{"level":1,"id":"3-git-commit-m-first-commit","permalink":"https://linxz.online/blog/github-push/#3-git-commit-m-first-commit","title":"3. git commit -m “first commit”","children":[]},{"level":1,"id":"4-git-remote-add-origin","permalink":"https://linxz.online/blog/github-push/#4-git-remote-add-origin","title":"4. git remote add origin","children":[]},{"level":1,"id":"5-git-push-u-origin-main","permalink":"https://linxz.online/blog/github-push/#5-git-push-u-origin-main","title":"5. git push -u origin main","children":[]},{"level":1,"id":"6-yi-wen-githubcang-ku-shi-kong-wen-jian-jia","permalink":"https://linxz.online/blog/github-push/#6-yi-wen-githubcang-ku-shi-kong-wen-jian-jia","title":"6. 疑问：github仓库是空文件夹？","children":[]},{"level":1,"id":"7-yi-wen-pushyi-zhi-shi-bai-zen-me-ban","permalink":"https://linxz.online/blog/github-push/#7-yi-wen-pushyi-zhi-shi-bai-zen-me-ban","title":"7. 疑问：push一直失败怎么办？","children":[]},{"level":1,"id":"8-yi-wen-wo-xiang-cha-kan-xiu-gai-li-shi-zen-me-kan","permalink":"https://linxz.online/blog/github-push/#8-yi-wen-wo-xiang-cha-kan-xiu-gai-li-shi-zen-me-kan","title":"8. 疑问：我想查看修改历史，怎么看？","children":[]},{"level":1,"id":"9-yi-wen-wo-xiang-ke-long-bie-ren-de-cang-ku","permalink":"https://linxz.online/blog/github-push/#9-yi-wen-wo-xiang-ke-long-bie-ren-de-cang-ku","title":"9. 疑问：我想克隆别人的仓库？","children":[]},{"level":1,"id":"10-yi-wen-wo-fa-xian-cang-ku-ming-shi-master-er-bu-shi-main","permalink":"https://linxz.online/blog/github-push/#10-yi-wen-wo-fa-xian-cang-ku-ming-shi-master-er-bu-shi-main","title":"10. 疑问：我发现仓库名是”master”，而不是”main”？","children":[]},{"level":1,"id":"11-ru-guo-cuo-wu-ti-jiao-liao-wen-jian-ru-he-cai-zan-cun-qu-shan-chu","permalink":"https://linxz.online/blog/github-push/#11-ru-guo-cuo-wu-ti-jiao-liao-wen-jian-ru-he-cai-zan-cun-qu-shan-chu","title":"11. 如果错误提交了文件，如何才暂存区删除？","children":[]}],
"body":"\n注：&quot;push&quot;这个词，一般指&quot;复制本地代码到远端仓库&quot;去，为了行文方便，以下都直接用&quot;push&quot;。\n\nGithub是一个代码托管平台，相信大家都看到很多大神把代码放到这个平台上，他们是怎么做的呢？\n要把代码push到Github，首先要在本地创建一个文件夹，比如我的文件夹叫做”new folder”，把代码放到其中。\n对应的，需要在Github新建一个仓库，仓库名随意，先不要加README文件或.gitignore或license等文件，否则影响之后的正常上传。\n然后回到本地的terminal，输入以下命令：\n1.git init\n打开terminal，进入该文件夹，输入：\ngit init\n\n这样初始化一个github仓库，会在”new folder”中创建一个隐藏文件夹”.git”，这个文件夹里面存放了一些配置信息。\n2. git add .\n输入：\ngit add .\n\n这样就把”new folder”中的所有文件都添加到了暂存区。\ngit reset\n如果发现不小心添加了秘密文档，比如.env，可以用git rest撤回命令。或者忘记添加.gitignore，导致上传文档内容太大，都可以用这个命令撤回暂存区的文件。\n3. git commit -m “first commit”\n输入：\ngit commit -m &quot;first commit&quot;\n\n这样就把暂存区的文件提交到了本地仓库。\n如果你之前没有登录过，此时会显示需要你登录用户名和邮箱：\ngit config --global user.email &quot;email@example.com&quot;\ngit config --global user.name &quot;your-github-name&quot;\n\n修改过后，就可以commit了。\n4. git remote add origin\n输入：\ngit remote add origin [你的仓库地址]\n\n这样就把本地仓库和远程仓库关联起来了。\n我的一个remote地址示例：\nhttps://github.com/linxz-coder/vue-love-talk.git\n5. git push -u origin main\n输入：\ngit push -u origin main\n\n这里可能会遇到网络问题，可以开代理解决：\n先取消github本身的代理：\ngit config --global --unset http.proxy\ngit config --global --unset https.proxy\n\n运气好这一步就可以解决问题。如果不行，则设置本地的代理：\ngit config --global http.proxy http://127.0.0.1:1087\ngit config --global https.proxy http://127.0.0.1:1087\n\n示例代理：\n1080是sock5的端口，1087是http端口。\n接下来需要输入用户名和密码了：\n注意，github密码早就失效了，这里的密码需要输入token，token可以在这里获得。\n注意保存，只会显示一次，丢失了只能重新生成。\n输入用户名和token，这样就把本地仓库的文件push到了远程仓库。\n如果push失败，通常是远程仓库已经有了文件，比如README.md或者LICENSE，可以无条件pull来本地先：\ngit pull origin main --allow-unrelated-histories\n\npull完后，需要你需要信息确认。然后重新push一次即可。\n多说一句，”-u origin main”的意思是，把本地仓库的main分支和远程仓库的main分支关联起来，仅需要在第一次push代码时使用，之后更新只需要输入git push即可。\n以上，基本就是push代码的流程了。\n6. 疑问：github仓库是空文件夹？\n如果你发现push代码上去成功，但文件夹是空的（带白色箭头）。\n这是因为这个仓库是别人创建的，很可能是你clone的，所以你并没有权限push代码。\n怎么办呢？\n我们可以输入 ⌘+shift+. 来显示隐藏文件，删除文件夹里面的.git文件夹。这样就可以删掉作者的配置信息。最后直接执行：\ngit push -u origin main\n\n这样就可以push成功了。\n7. 疑问：push一直失败怎么办？\n如果显示系统问题，首先检查你的用户名和密码。出于安全原因，这里密码并不是Github登录密码，而是Github的token。\n可以在这里查看token设置：https://github.com/settings/tokens/\n如果以上步骤都没错，有可能是本地仓库和远程仓库不一致，比如你在远程仓库创建了一个 README.md 或者 LICENSE 文件，但本地仓库没有，这时候就会push失败。\n解决办法是先pull一下远程仓库的文件，再push：\ngit pull origin main --allow-unrelated-histories\n\n这样就可以把远程仓库的文件拉下来，重新push即可。\n8. 疑问：我想查看修改历史，怎么看？\n输入：\ngit log\n\n可以查看修改历史，但你会发现画面卡住了，这是因为git log是一个分页显示的命令，按下空格键可以翻页，按下q键可以退出。\n9. 疑问：我想克隆别人的仓库？\n很简单，输入：\ngit clone [仓库地址]\n\n就可以把别人的仓库克隆到本地了。\n10. 疑问：我发现仓库名是”master”，而不是”main”？\nGithub之前默认的仓库主分支是”master”，因为“black lives matter”运动，“master”有奴隶主的意思，政治不正确，因此被Github改成了”main”。\n我们可以修改过来：\ngit branch -m master main\n\n这样就把本地仓库的master分支改成main分支了。\n11. 如果错误提交了文件，如何才暂存区删除？\ngit rm --cached file.txt\n\n如果是文件夹，比如node_modules，从暂存区删除：\n# 比如误提交了 node_modules\ngit rm --cached -r node_modules/\necho &quot;node_modules/&quot; &gt;&gt; .gitignore\ngit commit -m &quot;Remove node_modules from git tracking&quot;\n\n这样push以后就不会有这个文件夹了。\n有的时候.gitignore没有生效，可以：\n# 有时候 .gitignore 没有生效，可以：\ngit rm --cached -r .\ngit add .\ngit commit -m &quot;Reset git cache&quot;\n\n特别说明：\n\n--cached 选项表示只从 Git 仓库中删除，保留本地文件\n不带 --cached 的 git rm 会同时删除文件和 Git 跟踪\n-r 选项用于递归删除目录\n删除后记得更新 .gitignore 以防止文件再次被追踪\n操作后需要提交更改才能生效\n可以用git status检查将要发生的变更。\n\n"},{"title":"如何快速提取Github的代码？使用LangChain的GitLoader！",
"url":"/blog/gitloader/",
"date":"2023-05-19",
"headings":[{"level":1,"id":"di-yi-bu-an-zhuang-langchainku","permalink":"https://linxz.online/blog/gitloader/#di-yi-bu-an-zhuang-langchainku","title":"第一步 安装langchain库","children":[]},{"level":1,"id":"di-er-bu-lian-jie-githubcang-ku","permalink":"https://linxz.online/blog/gitloader/#di-er-bu-lian-jie-githubcang-ku","title":"第二步 连接Github仓库","children":[]},{"level":1,"id":"di-san-bu-cha-kan-wen-jian-ji-dai-ma","permalink":"https://linxz.online/blog/gitloader/#di-san-bu-cha-kan-wen-jian-ji-dai-ma","title":"第三步 查看文件及代码","children":[]},{"level":1,"id":"cai-dan-ti-qu-ipynbwen-jian","permalink":"https://linxz.online/blog/gitloader/#cai-dan-ti-qu-ipynbwen-jian","title":"彩蛋：提取.ipynb文件","children":[]},{"level":1,"id":"cai-dan-plus-cha-kan-githubwen-jian-shu","permalink":"https://linxz.online/blog/gitloader/#cai-dan-plus-cha-kan-githubwen-jian-shu","title":"彩蛋plus：查看Github文件树","children":[]}],
"body":"提取Github代码一般有两种方式：\n使用 git clone 命令，直接下载到本地后复制；\n直接在网页端查看 raw 文件，复制到本地。\n但是，这两种方式都不够快，特别是需要 ChatGPT 来交互时，涉及大量的代码，需要更快的方式来提取 Github 代码。\n这里介绍一种更快的方式，使用 langchain 的 GitLoader，快速把代码扒下来。\n以下是步骤：\n第一步 安装langchain库\npip install langchain\nfrom langchain.document_loaders import GitLoader\n\n第二步 连接Github仓库\nloader = GitLoader(\n    clone_url = &#39;https://github.com/openai/openai-cookbook.git&#39;,\n    repo_path=&quot;Github_files&quot;, \n    branch=&#39;main&#39;)\ndata = loader.load()\n\n代码说明：\n\nclone_url 是 Github 的网址，上面网址是 openai 的 cookbook，可以换成其他的 Github 网址；\nrepo_path 是本地文件夹的路径，如果保持默认，即下载到当前文件夹里面的”Github_files”文档；\nbranch 是 Github 的分支，一般为“mian”或者“master”。\n\n第三步 查看文件及代码\nlen(data)\nfor doc in data:\n    filename = doc.metadata[&#39;file_name&#39;]\n    print(filename)\nprint(data[20].page_content)\n\n代码说明：\n\nlen(data)是查看文件夹里面有多少个文件，除图片外，每个文件都是一个document；\nfor 循环是查看每个文件的名称；\ndata[20].page_content是查看第20个文件的代码。具体数字可以自己根据文件夹里面的文件数量来调整。\n\n彩蛋：提取.ipynb文件\n很多人不知道怎么快速提取.ipynb文件的 python 代码，这里提供一个方法。\n其实.ipynb文件本质上是 json 格式，我们可以先将其转为 json 格式，然后再提取代码。\n刚好，openai cookbook 第20个文档是.ipynb文件，我们拿来示范一下。\n首先将字符串转为 json 格式：\nimport json\njson_file = json.loads(data[20].page_content) #将str转为json\njson_file\n\n遍历每个 cell，如果是 code 类型，就将代码提取出来:\ncode_cells = []\nfor cell in json_file[&#39;cells&#39;]:\n    if cell[&#39;cell_type&#39;] == &#39;code&#39;:\n        code = &#39;&#39;.join(cell[&#39;source&#39;])\n        code_cells.append(code)\n        print(code)\n\n这样我们就可以快速提取里面所有的代码了。\n如果要把代码保存为 python 文件呢？这里也提供一个方法:\n# 设置保存的文件名\nfile_name = &#39;output.py&#39;\n\n# 将代码写入文件\nwith open(file_name, &#39;w&#39;) as f:\n    for code in code_cells:\n        f.write(code)\n        f.write(&#39;\\n&#39;)\n\nprint(f&quot;代码已保存到文件: {file_name}&quot;)\n\n这样，代码就保存到了 output.py 文件里面了。\n彩蛋plus：查看Github文件树\n还有更直观查看 Github 文件夹的方法，那就是查看文件树。\n首先安装文件树的库 tree 。以下命令需要进入命令行，用 homebrew 工具安装，如果没有 homebrew，则先安装 homebrew。\nbrew install tree\n\n用 tree 命令查看：\ntree github_files\n\n效果如下：\n\n好了，这就是如何快速提取 Github 代码的方法，希望对你有帮助。\n"},{"title":"如何连接OpenAI的api？做自己的ChatGPT!",
"url":"/blog/connect-openai-api/",
"date":"2023-05-18",
"headings":[{"level":1,"id":"1-shen-qing-openaide-api-key","permalink":"https://linxz.online/blog/connect-openai-api/#1-shen-qing-openaide-api-key","title":"1. 申请OpenAI的api_key","children":[]},{"level":1,"id":"2-an-zhuang-openaide-pythonbao","permalink":"https://linxz.online/blog/connect-openai-api/#2-an-zhuang-openaide-pythonbao","title":"2. 安装OpenAI的python包","children":[]},{"level":1,"id":"3-lian-jie-openaide-api","permalink":"https://linxz.online/blog/connect-openai-api/#3-lian-jie-openaide-api","title":"3. 连接OpenAI的api","children":[]},{"level":1,"id":"4-wan-cheng-prompt","permalink":"https://linxz.online/blog/connect-openai-api/#4-wan-cheng-prompt","title":"4. 完成prompt","children":[]},{"level":1,"id":"geng-xin","permalink":"https://linxz.online/blog/connect-openai-api/#geng-xin","title":"更新","children":[{"level":2,"id":"chat-model-he-instruct-model","permalink":"https://linxz.online/blog/connect-openai-api/#chat-model-he-instruct-model","title":"chat model 和 instruct model","children":[{"level":3,"id":"chat-model","permalink":"https://linxz.online/blog/connect-openai-api/#chat-model","title":"chat model","children":[]},{"level":3,"id":"instruct-model","permalink":"https://linxz.online/blog/connect-openai-api/#instruct-model","title":"instruct model","children":[]}]},{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/connect-openai-api/#can-kao-zi-liao","title":"参考资料","children":[]}]}],
"body":"1. 申请OpenAI的api_key\n前提是你已拥有ChatGPT的账号，api_key的申请地址。\n2. 安装OpenAI的python包\n在命令行中输入：\npip install openai\n\n3. 连接OpenAI的api\n连接api key的方法有两种.\n方法一：\nimport os\nos.environ[&quot;OPENAI_API_KEY&quot;] = &quot;替换成你的api_key&quot;\n\n方法二：\nimport openai\nopenai.api_key = &quot;替换成你的api_key&quot;\n\n以上两种选其一即可。\n4. 完成prompt\nresponse = openai.ChatCompletion.create(\n\n    model=&#39;gpt-3.5-turbo&#39;,\n\n    messages=[\n\n        {&#39;role&#39;: &#39;user&#39;, &#39;content&#39;: &#39;小学生春游去植物园，写篇300字的文章。&#39;}\n\n    ],\n\n    temperature=0,\n\n)\n\nprint(response.choices[0].message[&quot;content&quot;])\n\ncontent内的内容替换成你的prompt，即可完成。\n注意：\n\n这里的model是gpt-3.5-turbo，即免费版本，如果你是plus，可以选gpt-4。\n这里的role是user，即用户，这是最简单的prompt方式，另外可选的还有system 和 assistant。其他的role会放到下一篇文章中介绍。\n\n更新\n以上内容因为旧编辑器格式原因，还没来得及修改，可以直接看下面的：\nchat model 和 instruct model\nchat model 是用来优化聊天的，因此更加啰嗦；\ninstruct model 是用来命令的，因此比较简洁。\n关于 instruct model，你可以想象，让大模型做一个函数。对任意输入，做有限输出。\n两种 model 有不同 call 的方式：\nchat model\n    response = openai.ChatCompletion.create(\n        model=&quot;gpt-3.5-turbo&quot;,\n        messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你好&quot;}],\n        temperature=0,\n    )\n\n    return response.choices[0].message[&#39;content&#39;]\n\ninstruct model\n    response = openai.Completion.create(\n        model=&quot;gpt-3.5-turbo-instruct&quot;,\n        prompt=&quot;你好&quot;,\n        temperature=0,\n    )\n\n    return response.choices[0].text\n\n参考资料\nopenai的completion教程\n"},{"title":"如何用Tailwind CSS画一个漂亮的按钮？",
"url":"/blog/tailwind-button/",
"date":"2023-05-18",
"headings":[{"level":1,"id":"1-chuang-jian-yi-ge-nextjs-app","permalink":"https://linxz.online/blog/tailwind-button/#1-chuang-jian-yi-ge-nextjs-app","title":"1.创建一个nextjs app","children":[]},{"level":1,"id":"2-jin-ru-wen-jian-jia","permalink":"https://linxz.online/blog/tailwind-button/#2-jin-ru-wen-jian-jia","title":"2.进入文件夹","children":[]},{"level":1,"id":"3-da-kai-codebian-ji-qi","permalink":"https://linxz.online/blog/tailwind-button/#3-da-kai-codebian-ji-qi","title":"3.打开code编辑器","children":[]},{"level":1,"id":"4-xiu-gai-index-tsx","permalink":"https://linxz.online/blog/tailwind-button/#4-xiu-gai-index-tsx","title":"4.修改index.tsx","children":[]},{"level":1,"id":"5-yun-xing-app","permalink":"https://linxz.online/blog/tailwind-button/#5-yun-xing-app","title":"5.运行app","children":[]},{"level":1,"id":"6-da-kai-wang-zhi","permalink":"https://linxz.online/blog/tailwind-button/#6-da-kai-wang-zhi","title":"6.打开网址","children":[]}],
"body":"如何用Tailwind CSS画按钮？效果如下：\n\n点击后的效果如下：\n\n以下是具体步骤：\n1.创建一个nextjs app\nnpx create-next-app --typescript --tailwind button\n\n这将创建一个nextjs app，同时包含typescript和tailwindcss。app的名字叫做”button”。\n2.进入文件夹\ncd button\n\n3.打开code编辑器\n打开你的vs code或者其他code编辑器。\n4.修改index.tsx\n一般在pages文件夹下的index.tsx文件是网站首页，在这里修改。\n将源代码删除，复制以下代码：\nexport default function Home() {\n  return (\n    &lt;div className=&quot;max-w-3xl mx-auto py-8 px-4&quot;&gt;\n          &lt;button className=&quot;bg-violet-500 hover:bg-violet-600 active:bg-violet-700 focus:ring focus:ring-violet-300 rounded-md py-2 px-4 text-white font-semibold shadow-md&quot;&gt;\n            提交方案\n          &lt;/button&gt;\n    &lt;/div&gt;\n  )\n}\n\n代码解释：\n\nmax-w-3xl：最大宽度为3xl，3xl是tailwindcss的尺寸，相当于最大宽度为1920px。\nmx-auto：水平居中。\npy-8：上下padding为8。\npx-4：左右padding为4。\nbg-violet-500：背景色为violet-500，violet-500是tailwindcss的颜色，相当于#7F00FF。\nhover:bg-violet-600：鼠标悬停时背景色为violet-600。\nactive:bg-violet-700：鼠标点击时背景色为violet-700。\nfocus:ring：聚焦时有一个光圈。\nfocus:ring-violet-300：聚焦时光圈颜色为violet-300。\nrounded-md：圆角为md，md是tailwindcss的尺寸，相当于4px。\npy-2：上下padding为2。\npx-4：左右padding为4。\ntext-white：文字颜色为白色。\nfont-semibold：字体粗度为semibold，相当于font-weight是600。\nshadow-md：阴影为md，md是tailwindcss的尺寸，相当于4px。\n\n5.运行app\nnpm run dev\n\n6.打开网址\n打开 http://localhost:3000 查看页面效果。\n"},{"title":"如何让Claude-100k读取PDF文档？",
"url":"/blog/claude-100k/",
"date":"2023-05-17",
"headings":[{"level":1,"id":"1-huo-qu-wen-ben","permalink":"https://linxz.online/blog/claude-100k/#1-huo-qu-wen-ben","title":"1. 获取文本","children":[]},{"level":1,"id":"2-huo-qu-wen-ben-chang-du","permalink":"https://linxz.online/blog/claude-100k/#2-huo-qu-wen-ben-chang-du","title":"2. 获取文本长度","children":[]},{"level":1,"id":"3-ti-qu-qian-5mo-zi","permalink":"https://linxz.online/blog/claude-100k/#3-ti-qu-qian-5mo-zi","title":"3. 提取前5万字","children":[]},{"level":1,"id":"4-bao-cun-wei-txtwen-jian","permalink":"https://linxz.online/blog/claude-100k/#4-bao-cun-wei-txtwen-jian","title":"4. 保存为txt文件","children":[]}],
"body":"Claude –100k刚刚发布，意味着什么？意味着我们再也不用忍受GPT的字数限制，可以读取长文档了！\n那么，如何读取长文档呢？比如你有一个PDF，怎么把文本提取出来，再交给Claude –100k总结呢？\n我们可以用python来实现这个功能，具体步骤如下：\n1. 获取文本\nimport re\nimport textract\n# Extract the raw text from each PDF using textract\ntext = textract.process(&#39;data/cannot_hurt_me.pdf&#39;, method=&#39;pdfminer&#39;).decode(&#39;utf-8&#39;)\n# Replace all consecutive spaces with a single space\nclean_text = re.sub(r&#39;\\s+&#39;, &#39; &#39;, text)\n# Replace all newline characters with a space\nclean_text = clean_text.replace(&#39;\\n&#39;, &#39; &#39;)\n\n2. 获取文本长度\nlen(clean_text)\n\n3. 提取前5万字\nfirst_50k = clean_text[:50000]\n\n如果你需要提取后8万字，可以用下面的代码：\nlast_80k = clean_text[-80000:]\n\n我做过测试，100k token的Claude，可以处理大约8万字的英文文本。中文应该是5万字左右。\n4. 保存为txt文件\n&lt;&gt;\nwith open(&#39;last_80k.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f:\n    f.write(last_80k)\nf.close()\n\n这样，我们就可以直接在txt里面复制文本，交给Claude–100k总结了。\n我试着让Claude–100k读了我一直想读的英文书——&quot;CAN'T HURT ME&quot;，结果如下：\n这本书主要讲述了作者小时候成长于一个残酷且充满暴力的环境中。他的父亲是一个富有且黑心的生意人,经营一个乐队酒吧并肆意虐待作者的母亲和孩子。他经常毒打作者和他的哥哥。\n作者和他的母亲为生存而努力。作者的母亲虽然必须依赖父亲,但后来她决定离开。她逃跑时面临种种困难,但仍然坚持。她把孩子带到了爱人那里。\n在新环境中,作者的老师仍然对他采取严格的态度以促进他的学习。然而,新的老师们考虑将他分到特殊学校,这加剧了他的焦虑。他开始结巴,头发稀疏,还被诊断出了注意力不集中过动障碍。\n整个故事都反映了作者在暴力环境下成长,以及逃离暴力后仍然面临心理阴影及挑战的主题。这帮助了他理解痛苦并变得更加坚韧。\n希望以上的总结对您有帮助!\n"},{"title":"如何创建一个nextjs app？",
"url":"/blog/how-to-start-nextjs-app/",
"date":"2023-05-16",
"headings":[{"level":1,"id":"kuai-su-kai-shi","permalink":"https://linxz.online/blog/how-to-start-nextjs-app/#kuai-su-kai-shi","title":"快速开始","children":[]},{"level":1,"id":"cong-mo-ban-chuang-jian","permalink":"https://linxz.online/blog/how-to-start-nextjs-app/#cong-mo-ban-chuang-jian","title":"从模版创建","children":[{"level":2,"id":"yu-tyscripttong-shi-chuang-jian","permalink":"https://linxz.online/blog/how-to-start-nextjs-app/#yu-tyscripttong-shi-chuang-jian","title":"与tyscript同时创建","children":[]},{"level":2,"id":"yu-tailwindcsstong-shi-chuang-jian","permalink":"https://linxz.online/blog/how-to-start-nextjs-app/#yu-tailwindcsstong-shi-chuang-jian","title":"与tailwindCSS同时创建","children":[]},{"level":2,"id":"bao-han-tailwindcssmo-ban","permalink":"https://linxz.online/blog/how-to-start-nextjs-app/#bao-han-tailwindcssmo-ban","title":"包含tailwindcss模版","children":[]}]},{"level":1,"id":"jin-ru-wen-jian-jia","permalink":"https://linxz.online/blog/how-to-start-nextjs-app/#jin-ru-wen-jian-jia","title":"进入文件夹","children":[]},{"level":1,"id":"qi-dong","permalink":"https://linxz.online/blog/how-to-start-nextjs-app/#qi-dong","title":"启动","children":[]}],
"body":"快速开始\nnpx create-next-app myblog\n\n注意，项目名称不能用大写，比如Myblog，我也不知道为啥有这么奇葩的规定。可以看官方说明。\n从模版创建\nnpx create-next-app@latest nextjs-blog --use-npm --example &quot;https://github.com/vercel/next-learn/tree/master/basics/learn-starter&quot;\n\n注：—use-npm 指用npm安装依赖包，默认是yarn。可以使用其他模板。\n与tyscript同时创建\nnpx create-next-app --typescript myblog\n\n与tailwindCSS同时创建\nnpx create-next-app --tailwind myblog\n\n包含tailwindcss模版\nnpx create next-app --example with-tailwindcss my-project\n\n注意，也可以创建后再安装tailwindcss。\n进入文件夹\ncd myblog\n\n启动\nnpm run dev\n\n打开 http://localhost:3000 页面，查看效果，相当 beautiful。\n"},{"title":"李沐教pytorch第一课-被虚拟环境逼疯",
"url":"/blog/pytorch-python-venv/",
"date":"2023-05-16",
"headings":[{"level":1,"id":"qian-yan","permalink":"https://linxz.online/blog/pytorch-python-venv/#qian-yan","title":"前言","children":[]},{"level":1,"id":"1-wei-shen-me-bu-yong-python","permalink":"https://linxz.online/blog/pytorch-python-venv/#1-wei-shen-me-bu-yong-python","title":"1.为什么不用Python?","children":[]},{"level":1,"id":"2-an-zhuang-kuang-jia-de-fang-shi","permalink":"https://linxz.online/blog/pytorch-python-venv/#2-an-zhuang-kuang-jia-de-fang-shi","title":"2.安装框架的方式","children":[]},{"level":1,"id":"3-ruan-jian-bu-jian-rong","permalink":"https://linxz.online/blog/pytorch-python-venv/#3-ruan-jian-bu-jian-rong","title":"3.软件不兼容","children":[]},{"level":1,"id":"4-sha-shi-xu-ni-huan-jing","permalink":"https://linxz.online/blog/pytorch-python-venv/#4-sha-shi-xu-ni-huan-jing","title":"4.啥是虚拟环境？","children":[]},{"level":1,"id":"5-qi-dong-xu-ni-huan-jing","permalink":"https://linxz.online/blog/pytorch-python-venv/#5-qi-dong-xu-ni-huan-jing","title":"5.启动虚拟环境","children":[]},{"level":1,"id":"6-zai-xu-ni-huan-jing-zhong-gan-sha","permalink":"https://linxz.online/blog/pytorch-python-venv/#6-zai-xu-ni-huan-jing-zhong-gan-sha","title":"6.在虚拟环境中干啥？","children":[{"level":2,"id":"6-1-an-zhuang-ruan-jian","permalink":"https://linxz.online/blog/pytorch-python-venv/#6-1-an-zhuang-ruan-jian","title":"6.1 安装软件","children":[]},{"level":2,"id":"6-2-zhi-xing-dai-ma","permalink":"https://linxz.online/blog/pytorch-python-venv/#6-2-zhi-xing-dai-ma","title":"6.2 执行代码","children":[]}]},{"level":1,"id":"7-tui-chu-xu-ni-huan-jing","permalink":"https://linxz.online/blog/pytorch-python-venv/#7-tui-chu-xu-ni-huan-jing","title":"7.退出虚拟环境","children":[]}],
"body":"前言\n这是B站李沐《动手学pytorch》课程的笔记，本文是第一课的笔记-环境安装。本文可能会解决：\n1.虚拟环境是什么？\n2.软件依赖是什么？\n3.深度学习框架是什么？\n4.import pytorch报错\n5.安装pytorch报错\n如果你在学习机器学习，一定听说过tensorflow, pytorch, 百度飞桨等框架，这些框架的作用是方便你调用模型。\n1.为什么不用Python?\n没错，python是机器学习的编程语言，也可以制作模型，不过需要从0开始。\n以造车做比喻，Python相当于原材料，框架相当于做好用Python做好了底盘和轮胎，直接用框架效率更高。\n2.安装框架的方式\npip install pytorch\n\n那么，这样就万事大吉了吗？当然没有。\n你将遇到机器学习的第一个拦路虎——软件兼容（或者叫“软件依赖”）。\n3.软件不兼容\n当你兴冲冲地打开Jupyter notebook，准备大战身手时，你会发现——用不了。你输入：\nimport torch\n\n报错，不断地报错。\n于是你上网找答案，大神们告诉你计算机里面的Python版本错了，需要重新安装，有人却说是pytorch的版本太新，你的Python不兼容。\n等等，到底是谁的错？\n其实，并不是谁的错，就是婚姻结束，往往不是一个人的错误，是搭配在一起的错误。一般低级版本的Python配不上高级的pytorch，高级的Python不兼容低级的pytorch。\n于是，你找解决方法，发现方法是———搭建虚拟环境。\n4.啥是虚拟环境？\n环境即不同软件生存的地方。\n比如你的电脑安装了python，pytorch，photoshop等，它们共同存在于这个环境当中。那么，如果他们不能共存怎么办？\n比如上文说到的，高级程序看不起低级程序，不肯合作来运行软件咋办？\n那么，我们就搭建一个虚拟环境。让高级的程序和高级的程序在一起，低级和低级在一起。当然，电脑兼容不一定是这样搭配，总之，我们是把适合在一起的程序放到一起。\n怎么放呢？\n下面我们搭建一个虚拟环境（默认安装了conda或Anaconda）：\nconda create --name my_env python=3.9 -y\n\n代码解释：\nconda是用来装软件的工具，和pip是一样的，只要安装了Anaconda就可以使用此命令\n（一般安装jupyter notebook就会装这个软件，不展开讲）\n\ncreate –name 创建名为xx的虚拟环境\nmy_env 虚拟环境的名字，可以随便起，英文的即可\npython=3.9 指定环境中python的版本，如果需要低版本的python，就更换版本号\n-y yes，即不用征求你的同意，不会跳出来选择让你“点击下一步”\n\n5.启动虚拟环境\n安装完虚拟环境了，可以启动了，输入一下代码：\nconda activate my_env\n\n此时，如果你在进入terminal(或shell），前面会出现一个括号，显示你已进入虚拟环境，类似如此：\n(d2l) lxz/Desktop &gt;\n\n6.在虚拟环境中干啥？\n6.1 安装软件\n虚拟环境就是一个空壳，现在你可以往里填东西。填什么东西呢？即那些互相兼容的软件（或者软件版本），你可以自由搭配软件，比如：\npip install torch==1.12.0\n\npip install torchvision==0.13.0\n\npip install d2l==0.17.6\n\n没错，以上代码是李沐《动手学深度学习》的安装代码，==后面代表是版本号，解决的是前文提到的兼容问题。\n为什么版本号有大有小呢？因为不同软件开发的团队不同，版本号也用的不一致。我们只需要知道上面这三个软件对应三个版本号能够兼容即可。\n如何能知道哪些版本的软件兼容呢？答案是我也不知道。\n软件行业是动态发展的，每天都几乎有新版本出现，淘汰旧版本。如果停留在旧版本的软件，就跟不上潮流。就像iPhone 4的很多程序无法在iPhone 14手机上运行一样，因为ios程序已更迭多代。\n6.2 执行代码\n如果安装完所需的框架和软件包，就可以愉快地玩耍了。用以下代码打开jupyter notebook:\njupyter notebook\n\n7.退出虚拟环境\n最后，要退出本环境，回到最初的设定，执行代码：\nconda deactivate\n\n"},{"title":"计算机为何能“看懂”编程语言？",
"url":"/blog/how-computer-see/",
"date":"2021-01-17",
"headings":[{"level":2,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/how-computer-see/#tu-pian-lai-yuan","title":"图片来源","children":[]}],
"body":"1.计算机主要大脑 (cup) 的构造是晶体管，晶体管用“亮”和“灭”来代表不同的数据。\n2.计算机世界里面，用 1 代表“亮”，用 0 代表“灭”。\n\n3.1 和 0 的数字表达是一种二进制表达，二进制可以转换为十进制表达（人们习惯采用的数字表达方式），比如用 10 代表 2，用 100 代表 4，因此计算机表达数字成为可能。\n4.计算机可以表达数字，而数字又可以表达字符。\n5.数字表达字符采用国际标准，比如 ASCII 及 Unicode，即 A = 65（十进制） = 01000001（二进制），这让计算机得以表达英文字母。\n6.英文字母可以发展成字符串（即字符的连接），这让计算机可以表达单词或句子。\n7.英文是一种语言，数字也是一种语言，联合起来可以代表人类想要表达的所有事情，例如颜色可以用十六进制表示，#FFB6C1 代表了一种粉红，同样音乐可以用这种代表方式。\n8.事实上，编程语言是一种高级语言，用英文输出，离计算机理解 (1010101111….) 还有一段距离，因此需要一种低级语言 (compiler) 与计算沟通，compiler（编译器）正是做了以上七步的工作。\n9.计算机理解程序语言的步骤就是 程序语言（program languages）=&gt; 编译器（compiler）=&gt; 1010111…\n图片来源\nunsplash\n"},{"title":"前端面试题-['1', '2', '3'].map(parseInt) 的结果？",
"url":"/blog/js-map/",
"date":"2020-09-03",
"headings":[{"level":1,"id":"zhi-jue-da-ti-si-lu","permalink":"https://linxz.online/blog/js-map/#zhi-jue-da-ti-si-lu","title":"直觉答题思路","children":[]},{"level":1,"id":"parseint-wo-dui-ni-de-li-jie-bu-gou-shen","permalink":"https://linxz.online/blog/js-map/#parseint-wo-dui-ni-de-li-jie-bu-gou-shen","title":"parseInt，我对你的理解不够深","children":[]},{"level":1,"id":"mo-e-de-radix","permalink":"https://linxz.online/blog/js-map/#mo-e-de-radix","title":"万恶的radix","children":[]},{"level":1,"id":"mo-e-de-di-er-ge-fu-zhi","permalink":"https://linxz.online/blog/js-map/#mo-e-de-di-er-ge-fu-zhi","title":"万恶的第二个赋值","children":[]},{"level":1,"id":"luo-ji-jie-ti","permalink":"https://linxz.online/blog/js-map/#luo-ji-jie-ti","title":"逻辑解题","children":[]},{"level":1,"id":"zai-yi-ge-li-zi","permalink":"https://linxz.online/blog/js-map/#zai-yi-ge-li-zi","title":"再一个例子","children":[]},{"level":1,"id":"tuo-zhan-yue-du","permalink":"https://linxz.online/blog/js-map/#tuo-zhan-yue-du","title":"拓展阅读","children":[{"level":2,"id":"fang-fa-yi-zhi-ding-shu-ru-de-can-shu","permalink":"https://linxz.online/blog/js-map/#fang-fa-yi-zhi-ding-shu-ru-de-can-shu","title":"方法一：指定输入的参数","children":[]},{"level":2,"id":"fang-fa-er-shi-yong-numberhan-shu-bi-kai-parseinthan-shu","permalink":"https://linxz.online/blog/js-map/#fang-fa-er-shi-yong-numberhan-shu-bi-kai-parseinthan-shu","title":"方法二：使用Number函数，避开parseInt函数","children":[]},{"level":2,"id":"fang-fa-san-fang-fa-yi-bian-xing","permalink":"https://linxz.online/blog/js-map/#fang-fa-san-fang-fa-yi-bian-xing","title":"方法三：方法一变形","children":[]},{"level":2,"id":"can-kao-lian-jie","permalink":"https://linxz.online/blog/js-map/#can-kao-lian-jie","title":"参考链接","children":[]},{"level":2,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/js-map/#tu-pian-lai-yuan","title":"图片来源","children":[]}]}],
"body":"[‘1’, ‘2’, ‘3’].map(parseInt)的结果是？\n\n直觉答题思路\n我是一名前端，map( )和parseInt( )再熟悉不过了。\nmap( )是新建一个数列，parseInt( )是将字符串转换成数字。\n因此[‘1’, ‘2’, ‘3’].map(parseInt)的结果就是：\n[1, 2, 3] （配上一脸自信）\n答案马上出来——错！运用你的逻辑！\nparseInt，我对你的理解不够深\n咦，为啥？\n翻开MDN，parseInt是有两个参数（arguements）的，所以一般用到parseInt的时候，应该是parseInt (item, radix)。\n为什么我们平时用parseInt就直接忽略了第二个参数radix，比如我们要转换‘’100‘’，直接就输入parseInt(“100”)，结果就是100。\n万恶的radix\n噔噔！我们又翻开MDN，如果我们没有指定radix的值，JavaScript会假定以下情况：\n\n1.如果输入的 string以 “0x”或 “0x”（一个0，后面是小写或大写的X）开头，那么radix被假定为16，字符串的其余部分被当做十六进制数去解析。\n\n\n2.如果输入的 string以 “0”（0）开头， radix被假定为8（八进制）或10（十进制）。具体选择哪一个radix取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制)，但不是所有的浏览器都支持。因此，在使用 parseInt 时，一定要指定一个 radix。\n\n\n3.如果输入的 string 以任何其他值开头， radix 是 10 (十进制)。\n\n因此，在我们一般没有输入radix值的情况下，一般情况下就是返回十进制的数字，通常就是我们想要的结果。\n且慢，这不就对了吗？[‘1’, ‘2’, ‘3’].map(parseInt)中，我们并没有赋值给第二个参数radix啊，map方法形成了新的数列，所以按照十进制结果就是1、2、3呀！\n万恶的第二个赋值\n问题就在“我们并没有赋值给第二个参数”，我们很容易遗忘了，其实数列自带两个参数，一个是字符串（string），一个是索引（index），我们在创造新的数列的同时，悄悄地把索引（index）赋值给了parseInt。\n逻辑解题\n我们看一下逻辑性解题思路：\n[‘1’, ‘2’, ‘3’].map(parseInt) 的分步计算——\nparseInt(‘1’, 0) -&gt; 1\n因为Array的index = 0, 返回十进制的1\nparseInt(‘2’, 1) -&gt; NaN\n因为Array的index = 1, 返回一进制的2，因为一进制（eg. 1111）里面没有2，则返回NaN\nparseInt(‘3’, 2) -&gt; NaN\n因为Array的index = 2, 返回二进制的3，因为二进制(eg. 101011)里面没有3，则返回NaN\n因此，原题的结果应该是\n[1, NaN, NaN]\n再一个例子\n我们再看一个例子\n[‘10’, ‘10’, ‘10’].map(parseInt) 的分步计算——\nparseInt(‘10’, 0) -&gt; 10\n因为Array的index = 0, 返回十进制的10\nparseInt(‘10’, 1) -&gt; NaN\n因为Array的index = 1, 返回一进制的10，因为一进制（eg. 111）里面没有10，则返回NaN\nparseInt(‘10’, 2) -&gt; 2\n因为Array的index = 2, 返回二进制的’10’，因为二进制转（十进制）数字(‘10’ = 0x2^0+1×2^1= 2)，则返回2\n因此，结果就是[10, NaN, 2]\n所以，只要不指定第二个参数radix，JavaScript就会寻找可能替代的第二个元素，偷偷给我们加上去。因此，上面引用的MDN文件中，有一句话请大家一定要记住——在使用 parseInt 时，一定要指定一个 radix！！！\n拓展阅读\n我们如何解决以上的问题，即如何让数列中的数字等于字符串的数字？\n方法一：指定输入的参数\n如：\n[‘1’, ‘2’, ‘3’].map( str =&gt; parseInt(str) );\n\n方法二：使用Number函数，避开parseInt函数\n[‘1’, ‘2’, ‘3’].map(Number);\n\n方法三：方法一变形\nfunction returnInt(element) {\n\n  return parseInt(element, 10);\n\n}\n\n[‘1’, ‘2’, ‘3’].map(returnInt);\n\n注意：方法二可能输出小数点或者其他非正常数字的情况，比如2.33333333或10e+20，因此还是推荐方法一和三，方法一毕竟是ES6方法，懒人必备，推荐！！\n参考链接\nArray + parseInt()的MDN解释\nparseInt()的MDN解释\nGithub 上对本题的讨论\n进制转换工具\n图片来源\npixabay\n"},{"title":"我们的电脑是如何互通互联的？-OSI网络7层模型详解",
"url":"/blog/osi-network/",
"date":"2020-09-01",
"headings":[{"level":1,"id":"7-application-ying-yong-ceng","permalink":"https://linxz.online/blog/osi-network/#7-application-ying-yong-ceng","title":"7.Application 应用层","children":[{"level":2,"id":"gong-neng-cheng-xian-shu-ju","permalink":"https://linxz.online/blog/osi-network/#gong-neng-cheng-xian-shu-ju","title":"功能：呈现数据","children":[]},{"level":2,"id":"zhong-yao-xie-yi","permalink":"https://linxz.online/blog/osi-network/#zhong-yao-xie-yi","title":"重要协议","children":[]}]},{"level":1,"id":"6-presentation-biao-shi-ceng","permalink":"https://linxz.online/blog/osi-network/#6-presentation-biao-shi-ceng","title":"6.Presentation 表示层","children":[{"level":2,"id":"gong-neng-zhuan-huan-ya-suo-he-jia-mi","permalink":"https://linxz.online/blog/osi-network/#gong-neng-zhuan-huan-ya-suo-he-jia-mi","title":"功能：转换、压缩和加密","children":[]},{"level":2,"id":"zhong-yao-xie-yi-1","permalink":"https://linxz.online/blog/osi-network/#zhong-yao-xie-yi-1","title":"重要协议：","children":[]}]},{"level":1,"id":"5-session-hui-hua-ceng","permalink":"https://linxz.online/blog/osi-network/#5-session-hui-hua-ceng","title":"5.Session 会话层","children":[{"level":2,"id":"zhong-yao-gai-nian","permalink":"https://linxz.online/blog/osi-network/#zhong-yao-gai-nian","title":"重要概念：","children":[]},{"level":2,"id":"gong-neng-2-guan-li-he-que-ding-chuan-shu-mo-shi","permalink":"https://linxz.online/blog/osi-network/#gong-neng-2-guan-li-he-que-ding-chuan-shu-mo-shi","title":"功能2：管理和确定传输模式","children":[]}]},{"level":1,"id":"4-transfer-chuan-shu-ceng","permalink":"https://linxz.online/blog/osi-network/#4-transfer-chuan-shu-ceng","title":"4.Transfer 传输层","children":[{"level":2,"id":"zhong-yao-xie-yi-2","permalink":"https://linxz.online/blog/osi-network/#zhong-yao-xie-yi-2","title":"重要协议：","children":[]}]},{"level":1,"id":"3-network-wang-luo-ceng","permalink":"https://linxz.online/blog/osi-network/#3-network-wang-luo-ceng","title":"3.Network 网络层","children":[{"level":2,"id":"zuo-yong","permalink":"https://linxz.online/blog/osi-network/#zuo-yong","title":"作用：","children":[]},{"level":2,"id":"gong-neng","permalink":"https://linxz.online/blog/osi-network/#gong-neng","title":"功能：","children":[]},{"level":2,"id":"zhong-yao-xie-yi-3","permalink":"https://linxz.online/blog/osi-network/#zhong-yao-xie-yi-3","title":"重要协议：","children":[]}]},{"level":1,"id":"2-data-shu-ju-lian-lu-ceng","permalink":"https://linxz.online/blog/osi-network/#2-data-shu-ju-lian-lu-ceng","title":"2.Data 数据链路层","children":[{"level":2,"id":"zhong-yao-zai-ti","permalink":"https://linxz.online/blog/osi-network/#zhong-yao-zai-ti","title":"重要载体：","children":[]},{"level":2,"id":"zhong-yao-gai-nian-1","permalink":"https://linxz.online/blog/osi-network/#zhong-yao-gai-nian-1","title":"重要概念：","children":[]}]},{"level":1,"id":"1-physical-wu-li-ceng","permalink":"https://linxz.online/blog/osi-network/#1-physical-wu-li-ceng","title":"1.Physical 物理层","children":[{"level":2,"id":"zhong-yao-zai-ti-1","permalink":"https://linxz.online/blog/osi-network/#zhong-yao-zai-ti-1","title":"重要载体：","children":[]},{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/osi-network/#can-kao-zi-liao","title":"参考资料：","children":[]},{"level":2,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/osi-network/#tu-pian-lai-yuan","title":"图片来源：","children":[]}]}],
"body":"一直以来，我都非常好奇，到底我们电脑与互联网，或者说电脑与电脑之间是如何实现互通互连的。于是，我带着这个问题google了一下，得出以下历史：\n一开始，我们的电脑是通过实体线缆互通互联的。大家最初也意识不到电脑可以远距离传输，即尚未发现互联网。但是，当时仅仅因为互连就遇到一个问题：不同系统之间的电脑如何互连？\n比如，一台Mac系统的电脑和Windows系统的电脑，它们之间就算用线缆连接起来，也互相不能认得对方的代码，因此就不能实现交流互连的目的。这个时候，我们就需要一种协议，利用协议统一大家的连接标准，只要大家有同样的连接标准，那么两台不同电脑就可以互相连接起来。\nOSI就是这么一个标准，它是1984年由ISO提出的全球互连标准，使得不同系统的互联成为可能，进而使互联网成为可能。\n\nOSI全称是Open Systems Interconncection，即开放系统互联。在OSI标准上，数据的传输主要通过七层网络，分别为：\n7.Application 应用层\n6.Presentation 表示层\n5.Session 会话层\n4.Transfer 传输层\n3.Network 网络层\n2.Data 数据链路层\n1.Physical 物理层\n（英语速记：All People Seem To Need Data Processing ）\nOSI数据发送和接收的方向：\n数据发送时，数据从最高层走到最底层（7-1），最后经由物理层发送出去；接收方的物理层接收数据后，层层往上，从最底层走到最高层（1-7），最后分发到应用进程中。\nOSI数据处理：\n在数据层层向下的过程中，每一层都会对数据进行一些封装处理（如打包或者编码）；而在数据层层向上的过程中，每一层都会对数据进行一些逆处理（如解包或者解码）。这些对数据的处理和逆处理的过程就是为了实现该层的服务。\n下面是各层的详解：\n7.Application 应用层\n功能：呈现数据\n如：\n-浏览器：chrome, IE, firefox\n-数据传输：office, e-mail, skype\n重要协议\nHTTP/HTTPS协议：下载页面内容\nDNS协议 ：利用DNS提供的域名解析服务，来获取网址对应的IP地址\nFTP协议：文件传输协议，用来在客户机和FTP服务器之间传输文件。\nDHCP协议：动态主机配置协议，DHCP服务器为客户机动态分配IP地址。\nPOP协议：邮件接收协议，用于从POP3服务器接收邮件。\nSMTP协议：邮件发送协议，用户通过SMTP服务器发送邮件。\n6.Presentation 表示层\n功能：转换、压缩和加密\n\n将“搜索xxx”转换成“10101110”，将5M压缩成2.5M，加密SSL\n\n重要协议：\nSSL协议：Secure Sockets Layer 加密协议\n5.Session 会话层\n#功能1：两个应用程序间的会话，验证身份authentication，授权authorization\n重要概念：\nAPI：Application Program Interface，应用程序编程接口\n功能2：管理和确定传输模式\nSimplex 单向：数据只可以单向传输。\nHalf-Duplex 半双工：允许数据单向传输，但是一个时刻只能有一个方向传输，不能同时双向传输。\nFull-Duplex 全双工：数据可以同时双向传输。\n4.Transfer 传输层\n#功能1：主机对主机（End to End）传输，将Data分解成（Data Unit1, Data Unit2, Data Unit3）\n#功能2：Error Control (ARR: Automatic Repeat Request)\n重要协议：\nTCP协议：Transmission Control Protocol，传输控制协议\nTCP在传输数据之前必须先建立一个连接。TCP做了很多工作来提供可靠的数据传输，包括建立、管理和终止连接，确认和重传。同时TCP还提供分段和重组，流量控制（Flow Control）等。\nUDP协议：User Datagram Protocol，用户数据报协议\nUDP是一种简单的传输层协议，所以它并不能提供可靠的数据传输。简单地说，UDP只是把应用程序发给它的数据打包成一个UDP数据报（UDP Datagram），然后再把这个数据报传给IP。\n端口Port：一个16位的二进制整数，其取值范围是0~65535\n由于可能有很多应用程序同时在使用TCP/UDP，它们都会把数据交给TCP/UDP，而TCP/UDP也会接收来自IP的、包含指向不同应用程序的数据，所以就需要有一种方法来区别（标识）应用程序，这种方法就是通过端口号（Port）来进行多路复用或多路分解。\n3.Network 网络层\n作用：\n如何把数据从一个设备发送到另一个设备(packets)\n功能：\n地址、路由、分段和重组（eg.路由器和电脑的连接）\n重要协议：\nIP协议：Internet Protocol\nIPv4：32位二进制地址\nIPv4的地址表示方法一般为用点隔开的4个数字，每个数字的取值范围是0~255，即一个字节的大小，如192.168.1.1。\nIPv6：128位二进制地址\nIPv6的表示方法为用冒号隔开的8个字（word，16位二进制），每个字都用十六进制来表示，如2012:0000:4528:7D76:3C2B:05AD:3F57:1C98\n2.Data 数据链路层\n#作用：如何把数据发送到本地网络中\n重要载体：\nLAN（Local Area Network，局域网）\n以太网（Ethernet）\n令牌环网（Token Ring）\n光纤分布数据接口（FDDI）\n802.11（WiFi）\n重要概念：\nMAC地址：每一个网卡（Network Interface Card）都有一个唯一的MAC地址，数据链路层通过MAC地址来确保数据能够正确被发送到目标设备。MAC地址是一个48位二进制整数，通常的表示方法是用-隔开的6个十六进制整数，如14-FE-B5-B0-2B-96。\n1.Physical 物理层\n#作用：所有其他层的数据最终都必须经由物理层才能发送出去\n重要载体：\n电缆、连接器、无线接收器、网卡、集线器（hub）\n参考资料：\n\n掘金\nyoutube\n\n图片来源：\nvietnaminsider.vn\n"},{"title":"敬畏「新建文件夹」，敬畏科技",
"url":"/blog/new-document/",
"date":"2020-07-15",
"headings":[{"level":2,"id":"zhe-ge-gong-neng-shi-ru-he-shi-xian-de-ni","permalink":"https://linxz.online/blog/new-document/#zhe-ge-gong-neng-shi-ru-he-shi-xian-de-ni","title":"这个功能是如何实现的呢？","children":[]},{"level":2,"id":"na-me-wo-men-ke-yi-jie-jian-shen-me-ni","permalink":"https://linxz.online/blog/new-document/#na-me-wo-men-ke-yi-jie-jian-shen-me-ni","title":"那么，我们可以借鉴什么呢？","children":[]}],
"body":"想象一下，你在使用电脑，显示着你的电脑桌面。\n\n你单击鼠标右键，选择“新建文件夹”。然后，毫无声响地，一个新文件夹就诞生了！这个文件夹有棱有角，黄色或蓝色皮肤，跟现实文件夹的轮廓几乎一致。\n更神奇的是，你继续点击鼠标右键，继续选择“新建文件夹”，又有一个文件夹出现了！跟前面的一模一样，只是名字后面可能加了（1），用来区分不同文件夹。这之后，你不停地创建文件夹，不断有文件夹出现在你的眼前，这个游戏可以不停地玩下去……\n这难道不是很神奇的事情吗？\n\n这就像在现实中，只要你说“我要一个新文件包”，然后一个文件包就空投到你的旁边，然后你又说“我要一个新文件包”，“嘣！”又一个出现在你眼前。然后你不断地讲，不断有文件包出现，直到文件包把你淹没……\n这当然不可能在现实生活中出现，因为制作一个文件包要经历做模（第一个需要）-收集材料-编织材料-机器压线等步骤，你说“我要一个新文件包”等于下单，下单到文件包到货至少需要几天的时间。这之后，模型固定，流程固定好的话，那么文件包到你手上的时间也会缩短，但无法达到下单即达的速度。\n是什么让虚拟的世界这么神奇呢？为什么你一说指令，完整的产品就完成了呢？其实，这里面有很多我们不知道的步骤，只不过计算机的速度实在太快，快到我们都感受不到其中的“制作过程”。\n\n很久以前，计算机并不像我们今天看到的样子。它是一门程序语言，你只能够通过敲击键盘上，组成一定的代码，才能看到计算机返回的信息。而计算机返回的信息，一开始也只有文字。\n渐渐地，人们发现代码交流过于复杂，门槛过高，才慢慢设计出了图形界面。那么，图形是如何出来的？文件夹是如何新建出来的呢？\n最初，人们只发现计算的功能——计算，比如2+2=4，5*8=40，只要你输入这些等式，计算机就能返回正确的结果。无论等式有多难，计算机都能立即处理出结果。\n渐渐地，人们发现，有些等式出现的概率很高，比如24-x/60，这是人们根据使用的分钟数算出剩余时间会使用的公式。于是，人们就把这个功能固定下来，变成一个固定的对象Rhour()，以后不用敲击一长串数字，直接Rhour(x)就可以了。\n这个功能是如何实现的呢？\n编程专业里面有个词汇叫“OOP”（Object-oriented programming），即面向对象的程序设计。在计算机代码的世界，万事万物都可以成为对象。对象指什么？对象指可以重复利用的功能。比如刚才提到的“24-x/60”，计算机可以做出这样的等式“Rhour(x)=24-x/60”，Rhour()就是一个对象。之后每次看到Rhour（x），那么计算机就会自动搜索等式，如果按文件包制作的过程比喻，每次你呼叫“Rhour()”，那么计算机后台就会自动制作文件包。因为制作文件包的速度飞快，所以你会觉得计算机凭空变出了一个文件夹。实际上，这一切都在后台通过代码悄悄地完成。\n只要有重复利用的功能，你告诉计算机（类似于开模），计算机就自动记忆起来。所以，所有重复的事项都会因为计算机的加入变得迅速起来，你甚至不能感受到“制作过程”的存在。计算机慢慢加入所有世界上所有的“对象”，即所有有规律的事物，速度慢慢变得更加地快。\n回到“新建文件夹”的惊叹，现在我们明白了，每当你发出“新建文件夹”的指令，计算机其实在搜寻一个对象，因为这个对象曾经被人存储起来。所有通过这个对象制作出来的文件夹，都有一样的棱角，一样的颜色，一样的大小。它们并不是实时出现在你的眼前，而是因为“制作过程无穷快”，“配送速度无穷短”，所以才让计算机变得像魔术师一样神奇。\n那么，我们可以借鉴什么呢？\n首先，对象思维。只要是可以重复利用的东西，都应该成为一个对象。为了提高效率，我们不重复同样的动作。程序员有个规则叫“DRY”（Don’t repeat yourself），即不要重复你自己。能够一次说清楚的事情，制作一个指令，让所有人得知，尽量一次解决。如果是今后会使用的对象，那么就将它储存起来，告诉计算机，避免下次写同样的指令。\n其次，虚拟世界的速度更快，快得难以想象。能用机器解决的事情，不要使用人力，两者速度不在一个量级。\n\n我们是应该敬畏科技的，科技都为我们做了原本可望而不可及的事情，不仅仅是给予人们前所未有的计算速度，还告诉了人类对象思维的强大。即使仅仅是新建一个文件夹，就蕴含着巨大的科技力量。\n"},{"title":"人可能不知道自己想要什么",
"url":"/blog/what-i-want/",
"date":"2020-06-21",
"headings":[{"level":2,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/what-i-want/#tu-pian-lai-yuan","title":"图片来源","children":[]}],
"body":"看了一个视频，关于一个亚裔女工程师的自白。她说自己是一个“Yappie”，意思是“Young Asian Professional”，中文翻译是年轻亚裔专业人士。\n这是一群居住在美国的专业人士，大部分是软件工程师。他们大多有稳定高收入的工作，不要去冒险，永远可以待在“舒适圈”。\n老实说，这几乎是我理想的生活。不愁吃穿，可以一直专注干一件事。但是，她坦承这可能不是她想要的生活——一辈子当工程师？\n当然，她说并不是她不喜欢这样，她也追求这些美好的生活：上一个好学校，找一个离家近的工作、拥有一份不错的收入、能够照顾家人。\n以上“愿望”属于有形的愿望，她一直都知道要达成这些目标。这些事可以说出来的，甚至有些已经做到。\n但冰山下呢？她的心底里呢？她一直被一股无形的力量牵扯的。她有一些“无形”的愿望，比如说认识更多的人、听到更多的故事、为世界作出积极的贡献等等。\n这些东西好像可以说出来，但你不知道怎么实现。如果你不去做出某些改变，这又好像变成你心中永远的刺，时不时出来扎你一下。\n\n她怎么办呢？她也不知道，但她在尝试按照自己微弱的想法做一些事情，比如她开设了一个视频频道。她也不知道未来会发生什么，但她觉得这是很重要的事情。\n对于“有形”和“无形”，我开始在思考另一个问题：到底我们是否知道自己想要什么？\n比如今天我买了一串葡萄，我去买葡萄前是否已经知道我想要怎样的葡萄了呢？比如，我喜欢甜里带酸的，但是老板能否理解我的甜里带酸呢？或者，我明确的说，如果糖度有10分，我想要8分糖，但是2分酸的葡萄。这样，老板就能按照我想要的糖度和酸度给我选葡萄了吗？\n当然不可能。首先，老板没空按照我的要求测试糖度和酸度，更不可能按照我的这种要求来种这样的葡萄。其次，我的甜里带酸其实只是一种感觉，是一种“无形的”东西。\n当你把它具象化，比如8分糖2分酸后，到底是不是你想要的，不尽然。只是你需要把它变成“有形的”东西，所以才需要有标准。但是，这个标准却无法达成你想要的目的。\n真实的你，想要什么样的葡萄，你根本不会想好，你只是有大概的印象。如果吃到的葡萄符合你的印象，那你很容易感到愉悦；如果不符合，你下次不会不买。\n所以，水果摊老板要满足一个人是很难的，因为每个人对于特定的水果印象是不同的，也很难描述。\n这跟做设计一样，你仅仅能描述一个印象，但当设计师把稿件画出来后，你又觉得不是这样。如果要你自己去画，你又很难画出来。\n因此，设计的含金量高并不是它能描绘出你想要的样子。而是，它能通过一次次地具象化无限靠近你的印象，让你感到愉悦。\n\n讲到这里，感觉我们绕了一大圈。从“有形的”愿望、“无形的”愿望到买葡萄，到设计。\n其实，这里面都有一个共同点。那就是“人不知道自己想要什么”，但是当他拿到符合一定预期的产品，又会从心里感到愉悦。\n因此，我们要做的，其实并不是活出自己想要的样子，或者得到自己想要的东西，因为你根本就不知道这些“样子”“想要的东西”是什么，有时候甚至连形状都没有。\n重要的反而是从“不知道要什么”到“符合一定预期”的过程，这个过程也是最磨人和痛苦的。\n因为这个过程一定包含“尝试”，里面就有一定几率有“失败”。因此，你有机会感到愉悦或者气馁。但是，总比一直“不知道要什么”强。\n所以不管怎样，你需要慢慢尝试，慢慢靠近“无形的愿望”。\n最后……如果你对原文提到的女工程师（mayuko，是一名netflix的女工程师）的观点有兴趣，欢迎观看视频：\n点击观看视频\n（注：油管链接，需要科学上网）\n图片来源\nPhoto by KyleGlenn on Unsplash\nPhoto by SimonMigaj on Unsplash\n"},{"title":"怎样才能想开点？",
"url":"/blog/how-to-open-mind/",
"date":"2020-05-23",
"headings":[{"level":2,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/how-to-open-mind/#tu-pian-lai-yuan","title":"图片来源","children":[]}],
"body":"在我们伤心或者抑郁的时候，经常有亲人朋友过来告诉我们说想开点。可往往他们的安慰往往浮于表面、不痛不痒。谁都知道应该想开点，可到底什么是想开点，怎样想开点呢？\n首先，在抑郁的情绪中，感情是放纵的，也是局限的。怎么说呢？因为抑郁意味着你任由悲观的感情控制自己而不受理性影响，所以是放纵的；但是被情感控制的同时不允许你踏向此项情感的反面——即乐观，因此你会不断地在悲观的情绪中不断打转，既走不出去也停不下来。\n“想开点”虽然是简单的三个字，对于罹患抑郁恶症的人确是极难做到的。首先他要意识到自己是被困住的，而不是其他的因素在作怪。另外，他要跳脱出熟悉的思维方式，换个方式看待自己，甚至去习惯陌生的思维，去重新学习，这是十分复杂的。\n\n我不知道怎么去传达这种复杂的感受，就像你一直生活得好好的，突然你能意识到自己生活的空间很小，外面有很大的世界。你想走出去看看，但是父母（过去的习惯）会告诉你很危险，这带给你恐惧。另外，你也会觉得外面的世界应该就像你生活的世界一样，仅仅是一个扩大版，没什么好看的。\n这仅仅会是第一步，很多人在第一步就放弃了探索。\n接着，你有幸在某个时刻接触到外面世界的新鲜事物（比如说你从来没听说过的食物），你冒险试了一口，你发现还行。这个时候，你可能仍然会回到原来的生活环境，想想这仅仅是一次旅游，生活还是应该像从前一样的，这种外来食物毕竟很难获得。\n或者，你下定决心要做出改变，希望走出去尝试一下，可是你发现食物再怎么特别，仍然有苦涩的味道，同样不能激发你生活的乐趣，你也可能不再尝试。这就使自己止步不前，继续在原有的空间打转。\n\n直到一次，你不再怀有任何目的，不再想这是旅游还是人生，你不去想食物本身是苦的还是能如何做成甜的，你就带着眼睛去看，带着耳朵去听，去好奇别人的生活，去好奇一件事物如何成长成另一件事物，然后抬起你颤抖的手，去试，同样不要带有目的，看看是否能做成脑中所有的样子。\n失败了，看看是哪里掉链了，重新再来。你会发现，人们好像越来越喜欢你，仅仅因为你愿意去尝试，也不对，因为你愿意不停地去尝试。你不会停止尝试，转而去想这事为何需要做和如何做，你就是在做。你给予其他停止尝试的人以勇气，以信心，尽管这不是你的本意，但你做到了，帮助了自己，也帮助了别人。\n\n那到底这段不带任何目的去做的时间何时才会到来呢？不是靠自己，因为自己的力量没这么大。靠别人？抑郁的人最不想就是依靠别人。\n靠的是偶然，但我要说，“偶然”一定会砸中你，给你一个交代。只要有一天，命运让你看到与以往不同的风景，“偶然”就开始给你机会了。\n\n你不需要抓住机会，真的不需要。你只需要放松，然后向前跨出一步，然后，让以后每一步自然地跨出来。千万别再去想跨左脚还是右脚，如何跨，这会干扰你的尝试。你看看周围的人，参考一下自己的习惯，随便跨，任意调整。只是，不要停……\n图片来源\nunsplash\n"},{"title":"当我得了「神经病」",
"url":"/blog/when-i-got-psycho/",
"date":"2020-05-22",
"headings":[{"level":2,"id":"di-yi-jie-duan-bie-ren-du-yi-wei-ni-zai-tou-lan","permalink":"https://linxz.online/blog/when-i-got-psycho/#di-yi-jie-duan-bie-ren-du-yi-wei-ni-zai-tou-lan","title":"第一阶段：别人都以为你在偷懒。","children":[]},{"level":2,"id":"di-er-jie-duan-ni-you-bing-yao-chi-yao","permalink":"https://linxz.online/blog/when-i-got-psycho/#di-er-jie-duan-ni-you-bing-yao-chi-yao","title":"第二阶段：“你有病，要吃药。”","children":[]},{"level":2,"id":"di-san-jie-duan-wo-you-bing-yao-chi-yao","permalink":"https://linxz.online/blog/when-i-got-psycho/#di-san-jie-duan-wo-you-bing-yao-chi-yao","title":"第三阶段：我有病，要吃药","children":[]},{"level":2,"id":"di-si-jie-duan-xun-qiu-zi-wo-jiu-shu","permalink":"https://linxz.online/blog/when-i-got-psycho/#di-si-jie-duan-xun-qiu-zi-wo-jiu-shu","title":"第四阶段：寻求自我救赎","children":[{"level":6,"id":"zhong-ying-wen-ban-ben-tai-tmcheng-gong-xue-feng-mian-liao","permalink":"https://linxz.online/blog/when-i-got-psycho/#zhong-ying-wen-ban-ben-tai-tmcheng-gong-xue-feng-mian-liao","title":"（中英文版本，太TM成功学封面了）","children":[]}]},{"level":2,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/when-i-got-psycho/#tu-pian-lai-yuan","title":"图片来源","children":[]}],
"body":"​有一本书我一直都很想推荐，这篇文章算是推书前的序言吧。\n当你疑似“抑郁症”或者别人口中说的，你得了“神经病”。你会经历哪些过程？\n下面，我会介绍一个抑郁症或疑似抑郁症的人会遇到的典型情况。\n\n第一阶段：别人都以为你在偷懒。\n事实上，有些人确实是偷懒，比如他的工作或者生活有某些方面让他太疲劳了，他急需一个借口来摆脱目前情况，即需要一个“病症”来让自己休息。\n不过，要小心的是，想偷懒但最后“偷鸡不成蚀把米”——即懒着懒着发现自己无价值，最后竟因自己无所事事开始怀疑自己的价值，继而“抑郁”起来。\n对于这一阶段，我建议各位都需要有一个基本认知：人是需要休息的。\n说实话，我学习这句话也学习了好多年。我一直认为自己是那种要休息马上就能休息，要学习可以三天三夜不睡觉的人。但多次的惨痛经历都让我发现，我的“意志”是无法战胜个人的生理缺陷。\n你就是需要充足的睡眠，就是无法集中精神超过2小时，就是要放松，就是要休息，才能表现得更好。\n所以，你的休息不是偷懒，不需要寻找任何借口。\n\n第二阶段：“你有病，要吃药。”\n经过一个阶段来自他人和自我的质疑，你自己会慢慢开始认为，完了，我是不是有病？\n首先从他人的角度看，如果真正关心你的人，特别是家长，通常会觉得有病嘛，找最好的医院和医生，治好它。虽然会有“面子问题”（怕被别人以为自己或自己家人是“神经病”），避免和他人分享此类事项，但依然会尽最大可能找到所谓“神医”或者看似专业的精神病院。\n作为个人而言，我有很深的感触。个人对于这样的事情，一定是很难接受的。我真的有病？我真的是“神经病”吗？完了，我这辈子完了。我要永远都活在这样的痛苦中了。天底下这么多人，为什么偏偏是我得？为什么要这么不公平？\n在这种情况下，加上本身身体的疲劳，自然不愿意长途跋涉去看所谓的“神医”，或者旁人推荐的医院或者“诊所”。所有这一切，你都需要怀疑。\n因为万一我有“神经病”，我怎么面对我自己？\n\n第三阶段：我有病，要吃药\n好了，我承认“我有病”，该吃药了，可药有副作用啊。\n我不知道是不是每个人都有我这样的疑心病，身体上的疾病还好，精神上的药物，可能是宣传或者电视节目看多了，我总认为有很多副作用。换言之，它会“伤害”我的身体。所以，在我的潜意识中，一直拒绝吃这些医生的药。\n然而，连我这样“拒不配合”的人，也吃过两次精神科医生开的药，但这是后来我了解了成分和副作用后。当影响自己的睡眠时，适当吃了具有“安眠”副作用的药（舍曲林）。那个时候，我就不这么惧怕了。\n总的来说，药物是有副作用的，但你对它的认识越多，你越不会惧怕。不过，要学习每种药物的好与坏，对很多人来说都是困难的，因为毕竟涉及很多药理的知识。（我的粗浅认知来自于网络及我推荐的书，里面有一章详细地讲解所有的药物和可能副作用）\n我读过一篇关于抑郁药物的文章，说是美国人反而很喜欢药物，因为药物是一种“速效”的疗法，吃下去立刻就能放松和稳定。可能因为文化的差异，同时中国有中医的文化，让一部分人对西药会有天然的质疑，特别是精神类的西药。但我的质疑不只来自这个方向，于我本人而言，因为在此就接收过心理咨询方面的一些知识授课，所以一直相信，一定有一种“无害”的方法来“治疗”抑郁。\n\n第四阶段：寻求自我救赎\n我的方法很简单，做精神分析。\n我曾在长达一年多的时间断断续续地做团体和个人的精神分析（花了不少钱），也花了时间学习过心理咨询的理论知识（大部分是精神分析），我当时笃定自己会变成一个心理咨询师，但是必须要先帮助自己，才能帮助别人。所以，我在这个漫长的一年一直等自己能够成长。\n我有过“误入歧途”的经历，比如上过类似传销课程或者某些大师课，这个以后我另外再写文章。但是，我也是非常幸运的，我觉得我在考证的时候遇到了比较靠谱的同学，然后又认识了比较靠谱的老师，所以找到一个相对专业的方式进入到心理咨询领域，明白基础精神分析和动力学取向精神分析的理论基础。之后，我自己也买了很多书，看了很多文章，想办法以文案的方式进入了我当时认为还算靠谱的公司，想要继续向前进发。\n不得不说，长时间对我自己的探索，对我身边关系的探索，对精神分析领域的投入学习，确实让我对自己的认识更加了解。但这些都无法阻止我偶然冒出的痛苦想法——我是一个没有价值的人，所以活着没有任何意义。\n有时候，你在往事中在关系上纠葛很深（精神分析师喜欢用的方法），反而造成思想上的重大负担。你要花费很多的精神来探索，再释怀。真正让我开始怀疑这种方法的用处，是我遇到职业和人生的交叉选择时，我发现自己瞬间是这么无力。两股重担同时向我袭来，我变得无力招架。\n我站起来，重新去找我的咨询师，她又重新跟我讨论我的过去，安慰我的情感。但是这一次，我无法说服自己，这是一个有效的办法。我已经拖着一个疲惫的身躯，费劲心力地大老远跑过去，我们度过了50分钟，竟然对我现在的决定一点帮助都没。\n所以，我决定离开。\n\n因缘巧合下，我的一位长辈（某公司CEO），是一位重度抑郁症患者，病史超过十年。她跟我分享了她在“寻医”经历，得出的结论是中国的精神病医生没有靠谱的。\n她的选择就是自己查医书，自己吃药。我在康宁查出轻度抑郁的时候，想要咨询她的时候，她就马上从包里拿出几种药让我选，并拿了一本书给我，让我一阵惊诧。她告诉我，药的东西，如果能不吃就不吃，实在没办法，吃点安眠的就好了。后来，我就真的没吃。（但是，我并不建议盲目听从“不吃药”的建议。有研究证明，重度抑郁症是必须吃药的。）\n不管怎样，我拿了她给我的书就回去了。这本书便是今天的主角，它是那种你在书店看到或者推荐榜单上看到，十有八九都不会买回家的书，主要是标题太烂了。\n《新情绪疗法》，这又是什么成功学方法？（英语原版的大标题是“Feeling good”，副标题是“新情绪疗法”）。而且封面的设计特别烂，看起来就像盗版书。光看书的设计，你已经没有欲望看下去了。\n重要的是，这本书很厚，比我大学的教科书都厚，又大，真的有人会看吗？\n\n（中英文版本，太TM成功学封面了）\n然而，我看了，对我帮助很大，大到我觉得在我最困难的时候可以摆脱其他方法的帮助。\n究其原因，并不是这本书神奇，而是书中的思维比较西方和理性，恰恰是我们东方人很少有的思维（当然，西方人也常在“偷”我们的思维）。\n全书聚焦在一个认知行为治疗（CBT）的方法，撰写书的前言是CBT之父Aaron. T. Beck，他介绍了CBT的疗法，如下：\n“CBT疗法主要对付抑郁症病人的‘不合理想法’（或者说‘不正常的想法’）。它帮助病人评估、挑战和重塑他们的不合理信念（重建认知）。某种程度上促进行为的改变，提高人们正常生活的能力。”\nCBT治疗师像老师，教导病人学会用新的思考办法来处理给他们带来压力的情境。关键是，阅读CBT疗法书籍本身也能算一种疗法。\n如果你在寻求一个不一样的方法，听我说，不妨试一试。\n图片来源\nunsplash\n"},{"title":"抑郁「药」——常想一二，不思八九",
"url":"/blog/one-two-eight-night/",
"date":"2020-05-21",
"headings":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/one-two-eight-night/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"​“常想一二，不思八九”\n遇见这句话也是意外，我在台湾某综艺节目上看到，这是萧淑慎爸爸送给她“重新开始”的话。\n萧淑慎是台湾的女明星，最早我对她的印象是出现在光良的《第一次》MTV中（这个真的暴露年龄T-T），之后她吸毒被抓。我看的这个节目恰好是她出狱的第一个通告，在重新开始她的事业前，萧淑慎爸爸对她说的就是“常想一二，不思八九”。\n什么意思呢？人生不如意事十之八九，如意事仅有一二。人生这么痛苦，怎么办呢？\n我们可以调整自己的目光，聚焦在真正让自己快乐、幸福的“一二”事情上。\n\n在我们伤心痛苦的时候，我们经常能听到家人朋友的安慰，比如说“这没什么大不了的”“想开点，很快就过去了”“啊，对吼，她就是坏”等等，但是这真的有效吗？\n首先，抑郁者心理多多少少埋藏着这个信念——“他们不懂我”，所以要么觉得安慰话说得轻巧——“不是你的经历，你当然可以胡说八道”，要么对自己产生深深的愧疚（其实抑郁者大多属于这种）——“怎么别人那么用力地劝说我了，我就是没办法被说通呢？我真没用！”\n其实，这不是你的问题，这仅仅是一个注意力的问题。\n虽然我们活在大千世界中，但我们能看到仅数种事物。为什么呢？因为人的注意力有限——人只会注意ta在意的东西，其他都会视而不见。我们很容易发现，一个女人怀孕了，她就会发现原来到处都是母婴用品。\n“注意力是大脑的领导。注意力走到哪里，大脑的其他部位就会跟到哪里”，Amishi Jha 博士在“如何驯服注意力”的演讲中这样解释注意力。\n\n另外，Amishi提到了一个有趣的问题，如果“注意力”是大脑的领导，它真的领导得好吗？虽然紧接着Amishi探讨的是注意力分散和集中的问题，我却被她理论的其他层面吸引住了。\n我想，如果注意力真的领导我们大脑的话，那么注意力是否也正在主宰大脑中控制情绪的“下丘脑”（Hypothalamus）、“海马体”（Hippocampus）、“杏仁体”（Amygdala）和“边缘系统”（Limbic cortex）呢？你看到注意力想要你看到的东西，你在看“对”的东西吗？\n其实，在体验快乐和幸福层面上，普通人的常识也能够解释。你想想，经常想开心的事情，不想不开心的事，那自然快乐多一些，伤心少一点了。\n可问题来了，怎么才能经常想开心的事情呢？我没有开心的事情怎么办呢？\n\n我先回答第二个问题，一个美国畅销书作家Mark Manson在他的网站上做出了解答。\n他在五年内去过55个不同国家和地区，认识了各国各地的人，最终他把学到的知识浓缩为“5件事”，其中第1件事就是“快乐是一个很简单的事情”。\n他说，“通过旅游，他学习到降低快乐阈值”。当从美国出发时，他想着最快乐的事情是举办很多派对、碰到很多有趣的人以及拥有很多冒险的经历。\n但走过许多国家后，他却发现，人是极容易适应环境的动物，在任何环境都能找到乐子。他见到贫民区的孩子有自己的玩物，居民区的人们也有快乐的方式，在海滩在山峰，甚至在沙漠中人们都能找到乐子，只要你让自己融入到自己周边的环境。\n我再举个个人的例子。有段时间我特别迷电子游戏，我总认为，离开电子游戏，我应该就找不到真正的快乐。可以说，从小学开始，我就开始玩电子游戏，至今至少持续二十年，我以为这是一项“戒不断”的乐子，而且很可能是极少可以让我快乐的东西。很高兴的是，我发现我错了。从去年年中开始，到今年我已有一年没有碰电子游戏，但我的快乐有增无减。我开始在别处寻找乐子，甚至发现学习英语居然也乐趣无穷。\n因此，我认为快乐是一种没有“限制”的东西，在任何环境、缺少任何具体玩物，也不会阻碍超强适应能力的高级动物——人获得快乐。\n\n当然，这里有个阻碍。因为抑郁者有个特点——喜欢向内求，不好外。什么意思？抑郁者总爱考虑自己，不爱考虑环境。\n在“Feeling good”这本书里面，Dr. Burns使用CBT疗法来帮助抑郁症病人看到自身的优势，也即“你对自己感到自豪的地方”。病人报告说他看不到自己值得欣赏的地方，Dr.Burns回复，“不，有个地方至少你应该欣赏自己。那就是诚实。”\n“你至少诚实地面对自己的问题，而不是选择欺骗自己”。我们何不从这里开始？\n\n另外，回到第一个问题，也是抑郁者一定会问的问题。我怎么才能经常想快乐的事呢？\n这也是我最近一年在练习的“功课”，有一点心得可以分享给大家。\n首先，我很推荐哈佛的“幸福课”，网易公开课可以直接观看。Tal老师介绍了一些方法，我印象中有至少“表达感激”和“写日记”两个办法。\n我个人“训练”自己的方法是这样的——“看人想好”，我训练自己，看到配偶，那么就想她最吸引我和做得最好的东西，看到父母，就想父母身上最好的品质，想到爷爷奶奶，也只想起二老所有的优点。\n\n当然，事情不会这么顺利，每个人都有缺陷或者不好的一面，我可能短时间地被“人的缺点”卷进去，但我会逼自己走出来，训练自己的“闪光”注意力。这是我自己的方法，我觉得对自己比较有效。我认为每个人都需要不同的方法，所以感兴趣的话可以参考幸福课Tal的推荐。\n另外，每个人很有可能都暴露在消极的环境中，这是无法回避的。比如你随便和身边的人聊天，很容易就有这些信息“谁谁不好”“谁谁老是偷我的东西”“谁谁老是不礼貌”，而这些人也有可能是你的亲人，你的配偶，你的兄弟姐妹。大部分人都在无意识地随时随地都在储存不愉快的信息，然后随意地倾泻出来。\n可以说，闲聊家常的话，我真的很常能够感受到人生不如意事，确实十之八九。有些人确实能够通过倾诉痛苦，然后自己得到释放。可是你呢？你收获了很多的情绪垃圾，你可能会认同ta说的话，把这些“垃圾”也装在自己身上，去相信世事和别人的“坏”。\n\n我的建议是，不要去理会别人的闲言闲语（不要去唠叨家长里短），特别是你自身抑郁的情况下。如果把注意力比作“投资”的话，不要投资在这种回报率为负数的情绪身上，可以多去接触更为积极的观点，强迫自己塑造习惯，让自己看到事情的光明面。我们常说，硬币有两面，我们还有机会选择另外一面。\n请记得，“常想一二，不思八九”。\n参考资料\n\nHow to tame your wandering mind-Amishi Jha，如果对如何集中注意力有兴趣，这个TED视频也值得一看。\n5 LIFE LESSONS FROM 5 YEARS OF TRAVELING THE WORLD-Mark Manson\nWhat Part of the Brain Controls Emotions?\n哈佛幸福课-网易公开课\nFeeling good-David D. Burns\n\n"},{"title":"抑郁者，你不需要「动力」",
"url":"/blog/depression-motivation/",
"date":"2020-05-20",
"headings":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/depression-motivation/#can-kao-zi-liao","title":"参考资料","children":[]},{"level":2,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/depression-motivation/#tu-pian-lai-yuan","title":"图片来源","children":[]}],
"body":"为什么成功学无效？成功学的书籍、录音、大会总是让人热血沸腾，但沸腾过后，总是重回原点。\n我们在成功学大会上，在放下成功学的书籍后，曾扬言要改变生活，洋洋洒洒地列了很多生活的“小目标”（比如赚它一个亿）。可隔天一起床，你又丧失了所有动力，又陷入“生活没意思”的怀抱中。\n问题在哪里？\n问题在于，这些“成功”的建议从不教你“如何做”，它们在试图教你“如何让感觉更良好”或“如何更有动力”。但是它们从不教你，应该“如何做”。\n要知道，“如何做”以及“如何让你有动力”是两回事。\n\n设想一下，你在自己的低潮期，心情极度郁闷和糟糕。有一天早晨，你发现自己无法起床。其实更准确的说法是，你发现自己没有动力起床或者说你很难起床。\n这并不是说，你只要坐起来，穿好衣服然后克服它就完事了，抑郁患者知道这不是简单的事情。\n但如果是成功学专家呢？他十有八九会建议你克服自己的坏情绪，想想积极的事情，告诉自己很棒，让你自己感觉好起来，然后就有动力起床了。\n我们有个固有的思维定式，有“动力”才能把事情做成。你看，由成功学专家来帮助一个抑郁者起床，真的成吗？\n让我们转换一下思维，问自己另一个问题：谁说一定要有“动力”，谁说一定要“感觉好”、“积极”才能做事？我们大部分人的问题在于，我们认为人需要有“动力”，才能好好做事。这似乎是每个人从出生起就被教授的课程。你要有远大的目标、你需要有责任感等等，有了这些，才能真正开始打拼事业。\n但是，真的需要这些吗？一个人真的需要变得很积极，拥有远大的目标，成为一个负责任的人，才能开始做事吗？你在低潮期、你很消极怎么办？\n\n我们的心情就像天气，有晴天有阴天。晴天人会容易变得开朗，阴天人会变得比较郁闷。（当然，有人是相反的）人需要学会与自己的心情共存。\n一个有趣的事情是，人可以仅仅凭着习惯就成功地做许多事情，比“动力”强多了。那些完成很多作品的人，很少在吹嘘自己很“积极”，目标多么远大。相反，他们总是强调事情的做法，他们一点都不在乎当下心情如何，却很在乎每天完成固定的动作。\n\n英国小说家安东尼·特洛勒普（Anthony Trollope）每天在上班前会进行3个小时的写作。如果他在3个小时内能够写完一部小说，他马上接着写下一部。（他的一生，完成了47部长篇小说）\n这一点上，所有的成功作家几乎都是相似的，不管是查尔斯·达尔文还是约翰·格里森姆(John Grisham, 美国作家），他们只强调自己特定的写作时间和写作的数量。不管他们有没“动力”，是否“感觉良好”，“积极”还是“消极”，他们都在写作。\n因此，当我们真的想要做点什么的时候，先不要去想“我没有精神或动力”，试着先和自己的“阴天”共处。换言之，开始之前，你不需要所谓的“动力”，只顾开始就可以了。\n参考资料\nThe Antidote: Happiness for people who can’t stand positive thinking – Oliver Burkeman\n图片来源\nunsplash\n"},{"title":"害羞？内向？情绪化？别被骗了！你只是「高敏感族」",
"url":"/blog/highly-sensitive/",
"date":"2020-05-20",
"headings":[{"level":1,"id":"shen-me-shi-gao-min-gan-zu","permalink":"https://linxz.online/blog/highly-sensitive/#shen-me-shi-gao-min-gan-zu","title":"什么是“高敏感族”？","children":[]},{"level":1,"id":"tian-sheng-gao-min-gan-zu","permalink":"https://linxz.online/blog/highly-sensitive/#tian-sheng-gao-min-gan-zu","title":"天生“高敏感族”","children":[]},{"level":1,"id":"shen-qi-de-xie-qing-su","permalink":"https://linxz.online/blog/highly-sensitive/#shen-qi-de-xie-qing-su","title":"神奇的”血清素”","children":[]},{"level":1,"id":"gao-min-gan-zu-ru-he-bu-shou-shang","permalink":"https://linxz.online/blog/highly-sensitive/#gao-min-gan-zu-ru-he-bu-shou-shang","title":"“高敏感族”如何不受伤？","children":[{"level":2,"id":"yi-zuo-zi-ji-de-fu-mu","permalink":"https://linxz.online/blog/highly-sensitive/#yi-zuo-zi-ji-de-fu-mu","title":"一、做自己的“父母”","children":[]},{"level":2,"id":"er-zhang-wo-dun-tao-shu","permalink":"https://linxz.online/blog/highly-sensitive/#er-zhang-wo-dun-tao-shu","title":"二、掌握“遁逃术”","children":[]},{"level":2,"id":"san-ji-xia-zi-ji-de-xiang-fa","permalink":"https://linxz.online/blog/highly-sensitive/#san-ji-xia-zi-ji-de-xiang-fa","title":"三、记下自己的想法","children":[]},{"level":2,"id":"si-she-li-jie-xian","permalink":"https://linxz.online/blog/highly-sensitive/#si-she-li-jie-xian","title":"四、设立界限","children":[]},{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/highly-sensitive/#can-kao-zi-liao","title":"参考资料","children":[]},{"level":2,"id":"tu-pian-lai-yuan","permalink":"https://linxz.online/blog/highly-sensitive/#tu-pian-lai-yuan","title":"图片来源","children":[]}]}],
"body":"\n​小时候，你的老师或者家长是否常常会将你描述为敏感、害羞的孩子？\n你是否很容易受到强光、浓烈气味、粗糙平面、警报声的影响，并且常常因此烦躁不安？\n你是否容易手忙脚乱、不知所措，常常是因为被要求短时间完成多项工作？\n你是否会避开暴力的电影或电视节目？\n在繁忙的工作过后，你是否必须回到隐秘的私人空间，享受只有自己的时光？\n你是否会刻意避开给你带来烦恼的事情，并将之作为优先事项？\n你是否经常会注意特殊的艺术细节、特殊气味或声音？\n你是否拥有一个丰富和复杂的内心世界？\n\n\n一直以来，我都觉得自己有些与众不同。这个与众不同并不是通常意义的褒义，比如我具有特殊天分之类的，对我来说更多的是困扰——我总认为自己有很多方面比别人差，但自尊心却莫名其妙比别人强，很容易“玻璃心”。\n虽然不愿意承认，但很多劣质的煽情片段都能轻松赚取我的眼泪；常常被他人归为“想太多”的那类人，竟然把赚钱的时间用来做“无谓”的思考，大大的失败者（loser）。\n\n因为这样的特点，经常被吐槽“不像射手座”，没有大家所热爱的射手座自由、无所畏惧品质。\n我一直在寻找形成这种气质的原因，也很想理解为何我喜欢探索的事情或者感到快乐的事情总集中在一些奇怪的方向，常常偏离了社会主流。\n最近，我似乎找到了原因。原来，我属于“高敏感族”。\n什么是“高敏感族”？\n“高敏感族群”（Highly Sensitive Person）的概念是由美国精神分析学者Dr. Elaine Aron于1996年提出的。透过她大量的访谈和研究发现，高敏感者很容易被外在环境刺激和打扰，所有被打扰的感觉都会被放大，他们的感受会比一般人还来的强烈，每天都像在与周遭人事物打心理战，甚至因此身心俱疲。\n\n举例来说，高敏感族如果待在变动太多的环境下，会不自觉很想逃离，短时间内一心多任务的情况让他们感到非常疲累，总觉得别人在看自己，容易无法专心从而犯错等等。\n然而，旁人根本很难察觉，就连自己也以为是能力问题或者太过忙碌的缘故，这就是高敏感族总是在面对的失落黑洞。\n据研究，世界上大约有20%的人口可归属于“高敏感族”。有趣的是，大约有一百种动物也有类似的族群，比如鸟、老鼠、猴子等等。\n天生“高敏感族”\n让我们来一起看一对双胞胎。\nRob和Rebecca是一对异卵双胞胎，Rob是一个男孩，Rebecca是一个女孩。从他们出生的第一天起，每个人都能明显地感受到他们之间的不同。\nRob是一个“高敏感族”，而Rebecca是一个“正常人”。他们出生于同样的环境，拥有同样的父母。\nRob从很小开始，入睡就十分困难；而Rebecca总是很容易入睡，不经常起床。特别是遇到一些环境的变化——比如来客人、外出旅游等，Rob会不肯睡觉且一直哭闹。这个时候，他们的父母总是需要专门地拍打、摇晃或者给Rob唱歌，让他慢慢镇静下来。\n\n出门在外时，墨西哥餐厅里的乐团常常会吸引住Rebecca，而Rob却会被吓哭。听到海浪声、剪发声、过山车的声音，都会激发起Rebecca的好奇心，让她跃跃欲试，而Rob一开始一定会先感觉到害怕，甚至在上学时、生日派对或者假日时，过度的刺激都会让Rob感觉到手足无措。\n不管是毛毛虫、床上的音乐、枕头套上的卡通，都可能让他感到害怕。我们会认为他的害怕非常荒谬，但对他来说，这是实实在在的恐惧。\n当Rob感到手足无措时，他很容易就会激动得流泪；当看到恐怖或者悲伤的电影，他有时闭着眼睛或者罩住他的耳朵，甚至需要离开现场。他总是靠着父母的安慰来度过——“这只是一部电影”“结局还不错，没这么可怕”。\n\n体育运动方面，他从小就学得比较慢，肢体非常不协调。他很想跟别的小男孩一起玩，让其他人也接受他，但这对他来说是一场持续的挣扎。\n总的来说，Rob的童年过得不大容易，当然，他的父母也不容易。\n考虑到Rob的独特气质，他有另外一个毫不让人觉得奇怪的特点：他有很好的想象力。他喜欢许多美学活动，特别是音乐。他的父母说，在他三岁的时候，就“像一个律师一样思考”。他能很快发现物体的细节，关心他人的情绪。当然，他的姐姐Rebecca也有属于她的特点。\n神奇的”血清素”\n究竟是什么造就了这样的气质呢？\n在Stephen Suomi的一项实验中，发现了少部分的恒河猴有一个特定的“紧张”特质，他们会更容易在压力下受到影响。进一步的研究发现，像部分人类一样，他们在头脑中存储更少的“血清素”（serotonin）。因此，在压力下他们会更容易焦虑和抑郁。\n\n“血清素”是一种重要的抗抑郁药的组成物质。市面上流行的抑郁药（SSRI类）大多数是通过改变血清素来帮助患者，比如氟西汀。科学发现，血清素至少对大脑中的十七处功能有帮助，它帮助大脑传递信息。\n这些猴子本身就缺少“血清素”，再加上经常处于紧张的环境，供求不足，让头脑中的血清素越来越少，因此比平常的猴子更为焦虑和抑郁。相关的实验也在人类身上开展，也得到类似的结果。\n尽管如此，Eliane博士认为，这些实验一直在探讨血清素少和抑郁的关系，却没有聚焦这种特质的优点。根据进化论理论，一定有什么理由让这样的基因得以延续。\n果然，新的研究发现，这些大脑里拥有更少“血清素”的人拥有更好的记忆力、更好的决策能力、更好的心理机能（能够在积极的体验中感受更多）。\n\nStephen Suomi的一项实验甚至发现，如果这种气质的恒河猴被精于照顾他人的母亲养育，孩子会更为“成熟”及更能抗压，甚至成为社会团体的领袖。\n研究也同时表明，因为这些高敏感的个体更容易受到环境的影响，因此他们也更可能被好的养育手段、好的老师、好的干预手段影响，因此从这些项目的收获更多。\n硬币总是有两面，不是吗？\n“高敏感族”如何不受伤？\n身为高敏感族，因为敏感神经的发达，不仅常常受到各类刺激的干扰，而且还容易感受到身边人的质疑、贬低和不理解。另外，加上血清素的不足，对抗抑郁的硬性条件匮乏，常常会让生活力不从心。\n我们可以怎样帮助自己呢？下面来谈一谈几个可能有效的做法。\n一、做自己的“父母”\n如果你是一个“高敏感族”，你很有可能在童年时遭受过来自或家人或朋友或陌生人很多的误解甚至嫌弃。下面，我想要你重新思考一下你的童年，如果拥有全新知识的你，现在充当你的“父母”，看看会否不一样。\n在Elaine博士的调查中，发现了两种截然不同的高敏感族。一些人报告自己终身都处在焦虑和抑郁中；而另外一些人则鲜少有这些感觉。进一步的调查发现，焦虑和抑郁的人几乎都拥有一个困难的童年，而即便拥有困难的童年，非敏感族的焦虑和抑郁程度远远不如高敏感族。\n\n经常，有人会将“高敏感”和“神经质”（neuroticism）相提并论。显然，这样是错误的。诚然，“神经质”通常是糟糕的童年带来的副产品。但是，高敏感未必会导致“神经质”（主要表现为多疑、不安全感强、过度主观等）。\n即使你拥有一个很棒的童年，高敏感族也很有可能会有一些麻烦。因为高敏感族意味着你与别人不一样，你的家长和老师，即使他们非常优秀，也可能缺乏正确应对“高敏感族”的方式。更何况，想要让你变得“正常”常常是他们这些“正常人”梦寐以求的事情。\n在大多数文化中，这些特质对于你本人来说都是一种劣势，特别是男孩。\n你需要理解“高敏感族”，将之看成是一种特殊的气质，而不是缺陷。“敏感”这个词的意思，单纯是形容一种对细微事物的快速反应。通过认可、帮助的形式来帮助“孩子”（即你自己），而不是逼迫其成为别人，甚至贬低或者践踏“孩子”的自尊。\n\n所以请记住，敏感度高是不能被“解决”的，它仅仅是意味着更多的谨慎和担心，以及对不好经历有更深的感受。\n\n二、掌握“遁逃术”\n高敏感族很容易被事情“压垮”，比如一场会议下接收太多信息，很容易让你的头脑爆炸（常伴有生理现状“头痛”），这时候你要掌握一些脱离方法。\n比如，“尿遁”是一个很好的方式。\n只要你能脱离会场一分钟，这一分钟对于你来说都是莫大的帮助。只要有休息，必然比源源不绝地接收过量的信息强，因为信息超载后根本就无法储存在你的脑中。\n比起所有信息化成“耳边风”，不如适时休息，接收适量有效的信息。\n\n在刺激过度的时候，想办法离开当下的空间；或者感到恐怖时，告诉自己仅仅是一部电影。采用“高敏感族”更为喜欢的方式，而非采用“正常人的方式”。\n三、记下自己的想法\n高敏感族很容易被周围的刺激“控制”，就算高敏感族在发呆，也是同时有很多想法盘旋在脑中。这个时候，你选择把想法写下来，比起脑中长久拥有悬而未决的想法能够更加有效地帮助你。\n\n四、设立界限\n设立合适的界限通常对高敏感族来说都是一个挑战，因为高敏感族对他人的感情很敏感，也较具有同情心，所以不想看到别人因失望触发的不快感，也难以承受。\n所以，高敏感族一般也患有“拒绝困难症”，什么忙都帮，不管自己忙不忙得过来。这样一来，就不能为自己争取休息的时间，很容易崩溃（burnout）。\n你应该给自己和别人设立清晰的界限，用于说“不”，并让别人做好他们自己的事情。\n\n高敏感族还要注意……\n你的高敏感不是我的高敏感。比如，我对痛觉敏感，但你不。比如你对冲突敏感，但我不。即，高敏感族之间也是有差异的，不要想当然地认为同为“高敏感族”一定能够理解你。\n最后，也附上一个“高敏感族”（HSP）的中文测试，点击高敏感族中文测试测一测吧！\n参考资料\n\nElaine N. Aron, Ph.D. The Highly Sensitive Person\n「高敏感族」如何不受傷？ 請相信自己獨有的天賦！\n8 Signs You’re a Highly Sensitive Person (HSP)\nSigns Of A Highly Sensitive Person (HSP) &amp; What To Do About It | BetterHelp\n高敏感族英文网\n\n图片来源\nunsplash.com\n"},{"title":"如何免费获得SSL证书-让阿里云免费给你的网站「上锁」",
"url":"/blog/certificate-https/",
"date":"2020-05-18",
"headings":[],
"body":"说明：这篇文章的方法已经过时，仅做记录需要。阿里云的证书已经收费。免费证书可以看letsencrypt这篇文章。\n正文如下：\n作为一个网络小白，为了提高网站的搜索排名，我稍微研究了一下必要条件，发现google很在意一个事情，就是https证书，”s”代表security（安全），即上锁的意思。\n简单来说，一般的网页生成后网站名称是http://www.linxiaozhong.club，而加了https证书的网站则可以通过https://www.linxiaozhong.club到达。\nHTTP 网站的左上角有“不安全”字样，也就是说在这样的网站输入个人信息是不安全的，特别是信用卡等付款信息。\n通过https验证后，也就是拿到证书后，网站会多一个小锁头。点进去可以看到网站有“证书”，即已经通过验证。\n这个证书有什么用呢？1、保护你的网站；2、增加谷歌google排名的权重（百度也正要开始推https了）\n那么如何获取这个证书呢？下面我以阿里云获取证书的流程为例，说一下具体步骤：\n1、登陆阿里云，搜索“SSL证书”，选择“选购证书”\n2、选择“单域名”-“DV SSL”-“免费版”，点击“立即购买”即完成证书的购买过程\n3、付款后，会来到证书申请页面，需要填基本资料：你的域名、姓名、手机号、邮箱之类的。其他的选项都选择阿里云默认的选项即可\n4、证书申请后，稍等10几分钟后你登记的邮箱就会收到申请成功邮件，接下来就是下载部署证书了！\n因为本文篇幅问题，部署证书下一篇文章：如何下载和部署SSL证书\n2022年3月14日更新：\n下载购买证书的环节改变了，这次可以直接购买20个，还是一样选择DV证书。\n"},{"title":"如何在阿里云下载和部署SSL证书？",
"url":"/blog/place-certificate/",
"date":"2020-05-18",
"headings":[{"level":2,"id":"can-kao-wen-dang","permalink":"https://linxz.online/blog/place-certificate/#can-kao-wen-dang","title":"参考文档","children":[]}],
"body":"我们如何下载和安装阿里云的证书呢？\n1、首先你要知道你的Web服务器，一共有以下几种：\nnginx, apache等等。\n我知道Web服务器对于小白来说很难理解，所以你有两个方法。一、花钱。直接点击下面的“一键式HTTPS服务”就可以了。二、找阿里客服帮忙。（嘻嘻，热心的阿里客服就是好）。我当然选择是第二种：\n2、回到首页，点击你的头像找到“工单管理”\n3、提交工单，即提出你的问题。\n不要害怕你的问题弱智，阿里的客服还是很给力的，该回答的就回答。至少他查了一下，帮我查出我的Web服务器是apache。（虽然后来我发现我的服务器下面也有apache的文件夹~）\n4、回到第1步，下载apache类型的证书。\n下一步就是证书如何安装了，阿里云的客服开始不给力，他让我咨询我的技术人员。我当然不甘心，我没有技术人员可以咨询啊。\n于是我打开了后面的“帮助文件”，一堆专业名词弄得我云里雾里。但我看懂了一个步骤：将下载的证书文件安装到服务器根目录。于是，我想，为什么不试一下？\n这时问题又来了，我打开阿里云轻量级应用，装了WordPress镜像后，根本看不到服务器根目录啊。我发现了一个办法，就是可以通过远程连接阿里云的主机通过敲代码的形式安装，可是我不会呀。\n于是我又上网搜索，如何打开服务器的根目录。经过一番云里雾里，终于让我发现了下面这个神器——SSH Secure File Transfer，可惜原下载地址是已经失效。（可以安装WinSCP，功能类似，下载地址是这个)\n5、windows系统下，下载SSH，桌面会出现两个SSH字样的文件，打开“SSH Secure File Transfer Client”。单机左上角的“小电脑”(connect)。打开“新建会话”也是一样的操作。\nmac系统下，下载Cyberduck（软件头像是只小黄鸭，地址是这个）记得选择SFTP的方式，而不是FTP的方式，端口是22，否则连接不上。\n6、我们回到阿里云服务器，在“服务器运维”里面就可以看到你的Host name，也就是IP地址。User name就是你的账号。另外，你需要“设置密码”来设置你的密码，因为下一步会用到。\n7、回到SSH，输入Host Name和User Name，之后再输入密码就可以进入服务器管理界面了。我们找到usr文件夹，点进去，再点击local，再点击apache，最后点击cert。（mac和windows的操作是一样的）\n找到你的三个证书文件（最好下载在桌面），然后直接拉过去就行了。\n8、windows下，再次找到“蓝色小电脑”，按下“disconnet”，你就可以退出SSH；WinSCP软件的话，则将显示你IP地址的标签，按“x”即可（Mac系统下，则用快捷键command+y即可退出，或者窗口上方菜单中选择“转到”-“断开选项”。）\n过10分钟左右，利用https://(你的网站名），比如我的网站是https://www.linxiaozhong.club，就可以登录进你的网站了，这时候多了一个“锁头”的图标，那么就是安装成功了。庆祝一下吧！\n#更新证书后的更新————————————————————————————\n昨晚证书到期，我更新网站中的证书，将新证书下载到apchache里面后，发现网站时时不更新，到处搜索后，发现问题的原因可能是：1.apache服务器没更新；2.阿里云的相关服务没更新\n2022.3.14日更新：\n可以不需要下载证书了，只需要在阿里云申请证书时输入你的域名即可，如下图：\n选择创建证书-证书申请，输入你的域名即可。之后去阿里云服务的“HTTP设置”换成这个证书即可，不用使用SSH去上传证书了！\n在所有措施都做完后，发现也没效果，早上起来发现应该看看阿里云的服务台，原来需要在服务台里面更新https设置：\n在“域名”-“HTTPS设置”中更新证书，证书这才开始启用。\n汗，忙活了一晚上的apache指令…….原来是一个按键的事情。学艺不精，哎。\n2023.8.18日更新：\n因为想用最新的code block pro 插件效果，所以被迫升级 php 和 wordpress，折腾了一下备份和恢复数据库和 wordpress 网站，所幸一切顺利，不过证书又得要重新部署了。另外在阿里云更新服务器的设置后，web 服务器从 apache 变为 ngnix 了，所以有必要更新一下设置模式。\n1.登录阿里云证书网站，点击下载证书。\n2.把证书移入服务器\n在本地 terminal 打开，输入以下命令：\nscp /Users/lxz/Downloads/9295489_www.linxiaozhong.club_nginx/www.linxiaozhong.club.pem root@149.129.84.123:/usr/local/nginx/conf/cert\n\n以上是利用 mac 中 terminal 的 ssh 功能，将本地的证书文档放入服务器。还有一个 key 文档，也是类似操作。\n上面是安装了wordpress镜像的网址地址，如果你是ECS服务器，那么路径在/etc/nginx/cert，需要自己先mkdir cert\n3.修改conf文件\n首先来修改nginx.conf：\nvim /usr/local/nginx/conf/nginx.conf\n\n修改内容是：\nserver_name www.linxiaozhong.club;\n\n因为nginx.conf里面有include vhost/wordpress.conf，需要在里面修改设置。修改内容是：\nserver_name www.linxiaozhong.club;\nssl_certificate cert/&lt;cert-file-name&gt;.pem;\nssl_certificate_key cert/&lt;cert-file-name&gt;.key;\n\n参考文档\n阿里云\n"},{"title":"网络小白如何进行域名解析？",
"url":"/blog/how-to-set-dns/",
"date":"2020-05-17",
"headings":[{"level":1,"id":"freenomyu-ming-jie-xi","permalink":"https://linxz.online/blog/how-to-set-dns/#freenomyu-ming-jie-xi","title":"Freenom域名解析","children":[]},{"level":1,"id":"er-namesiloyu-ming-jie-xi","permalink":"https://linxz.online/blog/how-to-set-dns/#er-namesiloyu-ming-jie-xi","title":"二、Namesilo域名解析","children":[]},{"level":1,"id":"duo-ge-yu-ming-ke-yi-bang-ding-tong-yi-ge-wang-zhan-ma","permalink":"https://linxz.online/blog/how-to-set-dns/#duo-ge-yu-ming-ke-yi-bang-ding-tong-yi-ge-wang-zhan-ma","title":"多个域名可以绑定同一个网站吗？","children":[]}],
"body":"当我们拥有了自己的域名后，怎么与服务器连接呢？\n方法是 域名解析。\n简单来说，就是让网络用户在查找你的域名的时候，能够直接连到你的服务器上。（因为网页在服务器上）\n下面还是直接先上步骤，相关的知识会放到最后来讲：\nFreenom域名解析\n1、进入首页\n如果你还没有注册属于自己的免费域名，可以看网络小白如何注册自己的域名。假设你已经注册完了，会在首页看到“服务”-“我的域名”。\n2、选择你想要和服务器连接的域名，点击“管理我的域名”(Manage Domain)，这里我选择是linxiaozhong.ga\n3、点击“管理工具”(Management tool)，选择Nameservers（域名服务商）\n4、这时候我们要返回自己的服务器。\n我以阿里云为例，进入阿里云。搜索“云解析DNS”，选择“管理控制台”。\n5、弹出的页面选择“添加域名”，将你的域名添加进去。添加完之后，它会显示“未使用阿里云解析”。我们把鼠标移到“未使用阿里云解析”，就会得到两个DNS地址，复制下来。\n6、回到Freenom，选择“使用自定义服务商”（Use Custom Nameservers）,输入阿里云服务器所给的DNS地址（粘贴刚才的两个网站地址），然后选择“更换服务商”（Change Nameservers）就大功告成了。\n7、所有步骤完成后，还需要耐心等待15分钟左右。域名解析成功与否，也可以回到阿里云的云解析DNS主界面，如果出现绿色的“正常”，则整个解析就成功了。\n8、阿里云服务器设置添加域名，点击“域名”，添加一下就可以了。\n现在，在浏览器输入你的域名，就不再显示错误，应该是服务器商的广告网页。如果阿里云之前选择的是WordPress镜像的话，现在就是WordPress的登录界面。\n二、Namesilo域名解析\n1、进入首页\n假设你已经注册完了，会在Namesilo首页看到“Domain Manager”，点击进去。\n2、进入域名控制台\n点击你自己的域名（www…..），直接进入域名管理器。\n3、修改Nameservers。\n同上，我们需要修改Nameservers（域名服务商），点击”Change”，在里面输入上面阿里云给的地址就可以了。同理，这里也需要等待15分钟左右，成功后Namesilo首页的域名后面的NameServers会改变。同样，阿里云的云解析DNS界面也会显示“成功”。\n跟上面步骤一样，在阿里云上“域名”添加域名就完成最后一步了。\n至此，我们免费和收费的域名商都完成了DNS解析，也就是我们的网页现在有内容了！\n相关的知识我也整理了一下，如下：\n多个域名可以绑定同一个网站吗？\n可以。阿里云服务器上面的域名管理设置两个就好了。我的网站就有两个域名可以同时达到。\n域名解析后，我们也想构建网站的内容了，那么可以查看“网络小白如何搭建网站-WordPress篇”。\n另外，我们也想让百度谷歌google收录我们的网站，让别人在搜索的时候能搜到我们，那么你可以参考“网络小白如何向百度及谷歌提交网站”。\n"},{"title":"不会代码的网络小白如何一步步建起自己的网站（并上线）？-WordPress篇",
"url":"/blog/build-website-wordpress/",
"date":"2020-05-16",
"headings":[{"level":1,"id":"wang-zhan-jian-she-san-yao-su","permalink":"https://linxz.online/blog/build-website-wordpress/#wang-zhan-jian-she-san-yao-su","title":"网站建设三要素","children":[]},{"level":1,"id":"wpde-an-zhuang","permalink":"https://linxz.online/blog/build-website-wordpress/#wpde-an-zhuang","title":"WP的安装","children":[{"level":2,"id":"yi-deng-lu-jin-fu-wu-qi","permalink":"https://linxz.online/blog/build-website-wordpress/#yi-deng-lu-jin-fu-wu-qi","title":"一、登录进服务器","children":[]},{"level":2,"id":"er-fu-zhi-zhang-hao-mi-ma","permalink":"https://linxz.online/blog/build-website-wordpress/#er-fu-zhi-zhang-hao-mi-ma","title":"二、复制账号密码","children":[]},{"level":2,"id":"san-shu-ru-zhang-hao-mi-ma","permalink":"https://linxz.online/blog/build-website-wordpress/#san-shu-ru-zhang-hao-mi-ma","title":"三、输入账号密码","children":[]},{"level":2,"id":"si-wpde-zhu-jie-mian","permalink":"https://linxz.online/blog/build-website-wordpress/#si-wpde-zhu-jie-mian","title":"四、WP的主界面","children":[]}]}],
"body":"首先，我是一个网络小白，建成这个网站之前，我的网络知识非常匮乏，甚至连IP地址指什么都不知道。\n另外，我是一个文科生，从来没学习过所谓的代码。就这样，某天我突然有个想法——我想做一个网站，然后就有了这个站。\n当然，事情不可能这么一帆风顺，我在这条路上也碰到不少坑。为了让大家不用踩到这些坑，所以我就把自己经验写出来，希望帮助到其他不会代码的网络小白。\n网站建设三要素\n如果你在百度或者谷歌输入“建立自己的网站”，十有八九会告诉你新手建站有三要素：服务器（或虚拟主机）、域名、CMS（内容管理系统，比如wordpress），但是这三个要素怎么选，新手怎么避开存在的坑，那下面我就一一为你揭开疑惑。\n由于篇幅原因，此文仅会 专注于WordPress（以下简称WP）的教程。其他部分请参考我的其他文章：\n不会代码的网络小白如何一步步建起自己的网站（并上线）？-服务器篇\n不会代码的网络小白如何一步步建起自己的网站（并上线）？-域名篇\nWP的安装\n首先，WordPress是如何搭建或者下载的？\n一般现在的服务器都有提供WP的安装包，英文的一般在“Installer”字样的文件夹，中文的一般在“应用”字样的文件夹。下面我主要讲阿里云轻量级服务器的步骤：\n一、登录进服务器\n如果你根据我之前服务器篇的教程，选择是阿里的轻量级服务器，预装的是WordPress镜像，那么就会在服务器页直接看到登录地址和账号密码。\n如果你注册了域名，并做了域名解析，你也可以通过你的域名（www…..）+/wp-admin进入，比如你的域名是www.dongdong.com，则进入WP管理界面的域名就是www.dongdong.com/wp-admin\n二、复制账号密码\n一般账号就是上图中的“管理员账号”，默认是“admin”。密码需要通过远程连接服务器获取，将阿里给的代码直接复制进去,再按一下回车（Enter）就出来密码了，我们再将密码复制下来。\n三、输入账号密码\n四、WP的主界面\n我们刚进到主界面，第一件事当然是“装修”，给你的网站选择一个漂亮的主题。\n在“外观”-“自定义”中可以直接进入网页进行编辑，是不是很方便？\n一般来说，需要编辑文章则进入“文章”，所有非文章的页面进入“页面”，接下来你就可以愉快地摆弄你的网站了！\n"},{"title":"不会代码的网络小白如何一步步建起自己的网站（并上线）？-域名篇",
"url":"/blog/build-website-url/",
"date":"2020-05-15",
"headings":[{"level":1,"id":"wang-zhan-jian-she-san-yao-su","permalink":"https://linxz.online/blog/build-website-url/#wang-zhan-jian-she-san-yao-su","title":"网站建设三要素","children":[]},{"level":1,"id":"yu-ming-de-ji-ben-zhi-shi","permalink":"https://linxz.online/blog/build-website-url/#yu-ming-de-ji-ben-zhi-shi","title":"域名的基本知识","children":[]},{"level":1,"id":"yu-ming-de-zhu-ce-bu-zou","permalink":"https://linxz.online/blog/build-website-url/#yu-ming-de-zhu-ce-bu-zou","title":"域名的注册步骤","children":[]},{"level":1,"id":"fu-fei-yu-ming","permalink":"https://linxz.online/blog/build-website-url/#fu-fei-yu-ming","title":"付费域名","children":[]},{"level":1,"id":"yu-ming-de-xuan-ze","permalink":"https://linxz.online/blog/build-website-url/#yu-ming-de-xuan-ze","title":"域名的选择","children":[]},{"level":1,"id":"bei-an-wen-ti","permalink":"https://linxz.online/blog/build-website-url/#bei-an-wen-ti","title":"备案问题","children":[]}],
"body":"首先，我是一个网络小白，建成这个网站之前，我的网络知识非常匮乏，甚至连IP地址指什么都不知道。\n另外，我是一个文科生，从来没学习过所谓的代码。就这样，某天我突然有个想法——我想做一个网站，然后就有了这个站。\n当然，事情不可能这么一帆风顺，我在这条路上也碰到不少坑。为了让大家不用踩到这些坑，所以我就把自己经验写出来，希望帮助到其他不会代码的网络小白。\n网站建设三要素\n如果你在百度或者谷歌输入“建立自己的网站”，十有八九会告诉你新手建站有三要素：服务器（或虚拟主机）、域名、CMS（内容管理系统，比如wordpress），但是这三个要素怎么选，新手怎么避开存在的坑，那下面我就一一为你揭开疑惑。由于篇幅原因，此文仅会 专注于域名的选择。其他部分请参考我的其他文章：\n不会代码的网络小白如何一步步建起自己的网站（并上线）？-服务器篇\n不会代码的网络小白如何一步步建起自己的网站（并上线）？-WordPress篇\n域名的基本知识\n域名相当于地址。互联网上如果有人想要访问你的网页，需要输入特定。比如访问百度就输入www.baidu.com，而访问我的网页则输入www.linxiaozhong.club\n那么，这个域名是怎么来的呢？\n互联网上有很多通过ICANN认证的域名商，比如阿里（万网）、Namesilo、Freenom等。你可以理解成ICANN是互联网的政府，颁发了许可证给域名商，有了许可证才可以卖域名。而你要做的，就是把域名从他们手上买回来。\n根据不同域名的属性，有贵的也有便宜的，跟我们买车牌号码一个道理。\n域名的注册步骤\n如果你是首次使用域名，想找个免费的域名练练手，我推荐freenom。\n注册步骤如下：\n1、进入freenom的官网（点此链接：www.freenom.com）\n2、我们现在先打个我们想要的域名。\n3、页面会出现许多免费的域名，我们点“现在获取”，会出现“域名不可用”。\n域名不可用？为什么呢？因为你没注册。为什么你没注册，因为Freenom不能注册！\n这看起来很傻，不知道官网为什么要这样设置，可能是要阻隔免费白嫖的玩家？\n4、这个时候不用慌，回到菜单栏，点击“合作伙伴”-“开发人员”\n拉到下面，直到出现“今天就获得一个随机的域账户”\n5、输入自己的邮箱，验证邮箱地址就完成账号注册了。现在，返回第1步，就可以愉快地收割免费域名了！\n付费域名\n付费的域名商，我推荐Namesilo（大厂、便宜、支持支付宝！），直接上步骤：\n1、注册或直接在搜索框打出你想要的域名（推荐，反正付款也会需要你注册）\n2、选择你想要的域名，点“Add”-“Checkout”\n3、所有选项保持默认就可以了，如果有除域名外的搭配购买就删除掉。注意，Namesilo的隐私保护政策是免费的，不用去掉。\n4、选择“CONTINUE”就会让你注册，输入用户名、邮箱、账号密码这些就可以了，然后付款点“支付宝”，用支付宝扫一扫付款，就大功告成了！\n这样，你就拥有自己的域名了。至于让人在互联网上搜索到你的域名，这就涉及到域名解析，详情可以查看我的这个文章：“网络小白如何进行域名解析”\n下面再拓展一下知识：\n域名的选择\n搜索引擎对免费域名的收录情况并不好，如果想要让自己的网站被更多人所知，最好使用收费的域名。我在使用付费域名前搜索了一番。国外最著名的是Godaddy、Namesilo，国内是阿里的万网。新手建站其实没什么要考虑的，便宜和稳定。这几个域名商都是大平台，稳定性不用说，拼的是价格。Godaddy和阿里的政策一样，第一年很便宜，但是后续逐渐提高费用。而Namesilo则每一年都收同样的价格，因此长期来说，Namesilo更划算，所以我理所当然选择了Namesilo。\n备案问题\n为什么我推荐国外域名商，因为国内万网注册的域名需要备案（好像仅针对.cn域名）。不管怎样，服务器也好域名也好，对新手友好就是尽量减少麻烦。只要涉及备案，就涉及到交身份证、拍照这些的，还有审核需要个几天。刚刚燃烧起来的创作热情有可能就消失殆尽了。所以，新手站长应尽量避开国内的服务商，将所有事情用最高效的方式来进行。\n"},{"title":"网络小白如何改变WordPress网站的行间距？",
"url":"/blog/wordpress-line-spacing/",
"date":"2020-05-14",
"headings":[],
"body":"首先，我是一个网络小白，建成这个网站之前，我的网络知识非常匮乏，甚至连IP地址指什么都不知道。\n另外，我是一个文科生，从来没学习过所谓的代码。就这样，某天我突然有个想法——我想做一个网站，然后就有了这个站。\n在有了这个网站之后，我又不断遇到了新的问题。某天，我发现自己的网站在手机端阅读并不够完美，行间距太窄了，根本就不能好好阅读。\n怎么办呢？我翻遍我的wordpress后台，寻找行间距这样的按钮，一无所获。然后，我上网找，发现的是各种html代码，别提那一刻我的内心有多崩溃：明明我只是想简单改个行距啊？！就不能有一个按键来完成吗？\n在我的一通搜索之下，发现“外观”-“自定义”是能够更改网站元素的，那么我的行距是不是在其中呢？终于，我看到一个叫CSS代码的东西，这是我们今天的主角。\n别看它是代码，你就害怕，其实它很简单，它长这样：\np {line-height: 200%}\n如果你懂点英语的话，很容易就看出它就是行高的意思，200%是一个值，可以上下调，网页会实时更新你的操作，你可以方便看到自己调整的大小是否符合需求。\n下面直接上步骤：\n打开“外观”-“自定义”-“额外CSS”，把我上面的那组代码复制进去，修改数值（200%）至你想要的行距，搞定！\n效果还没有改好的话，还需要删掉一些代码。\n我查看了文章的编辑器，在我不小心点开源代码后，终于给我看到了端倪！点击到“所有文章”-“编辑”，源代码就可以看到了。\n删除掉&lt;section dir=”ltr”&gt;这样的字眼就大功告成了。\n是不是很简单？\n至于为什么这串代码会存在？因为这几篇文章都是我从自己的微信公众号直接复制过来的，可能带了点那里的格式。而我在wordpress上直接编辑的文章，则不用删除这些数据。所以，我猜想从别的地方复制而来的数据都要走我这一步。\n整个教程到此结束，虽然用了一点点代码，但所幸并不复杂，小白也很容易学会！\n"},{"title":"不会代码的网络小白如何一步步建起自己的网站（并上线）？-服务器篇",
"url":"/blog/build-website-server/",
"date":"2020-05-13",
"headings":[{"level":1,"id":"wang-zhan-jian-she-san-yao-su","permalink":"https://linxz.online/blog/build-website-server/#wang-zhan-jian-she-san-yao-su","title":"网站建设三要素","children":[]},{"level":1,"id":"fu-wu-qi-xu-ni-zhu-ji","permalink":"https://linxz.online/blog/build-website-server/#fu-wu-qi-xu-ni-zhu-ji","title":"服务器（虚拟主机）","children":[]},{"level":1,"id":"fu-wu-qi-de-xuan-ze","permalink":"https://linxz.online/blog/build-website-server/#fu-wu-qi-de-xuan-ze","title":"服务器的选择","children":[]},{"level":1,"id":"fu-wu-qi-shou-fei-wen-ti","permalink":"https://linxz.online/blog/build-website-server/#fu-wu-qi-shou-fei-wen-ti","title":"服务器收费问题","children":[]}],
"body":"首先，我是一个网络小白，建成这个网站之前，我的网络知识非常匮乏，甚至连IP地址指什么都不知道。\n另外，我是一个文科生，从来没学习过所谓的代码。就这样，某天我突然有个想法——我想做一个网站，然后就有了这个站。\n当然，事情不可能这么一帆风顺，我在这条路上也碰到不少坑。为了让大家不用踩到这些坑，所以我就把自己经验写出来，希望帮助到其他不会代码的网络小白。\n网站建设三要素\n如果你在百度或者谷歌输入“建立自己的网站”，十有八九会告诉你新手建站有三要素：服务器（或虚拟主机）、域名、CMS（内容管理系统，比如wordpress），但是这三个要素怎么选，新手怎么避开存在的坑，那下面我就一一为你揭开疑惑。由于篇幅原因，此文仅会 专注于服务器的选择。其他部分请参考我的其他文章：\n不会代码的网络小白如何一步步建起自己的网站（并上线）？-域名篇\n不会代码的网络小白如何一步步建起自己的网站（并上线）？-WordPress篇\n服务器（虚拟主机）\n这里我选择阿里云香港轻量级应用服务器，后面会写原因和服务器的基本知识。这里直接上步骤：\n1、登录阿里云的主页，选登录（支付宝可以直接登录）\n2、选支付宝登录\n3、首页选择“轻量级应用服务器”\n4、点击“立即购买”\n5、选择香港的服务器以及wordpress镜像（建网站用的），初次使用建议选择1个月就好了，以后有需要再续费。阿里双11有时还有优惠。\n6、购买完毕后，点击自己的头像进入主页，选择“轻量级应用服务器”（阿里的首页真复杂，我第一次找了一遍没找到自己的服务器，这里放张图方便大家找）\n7、进入服务器首页，这里显示你购买的服务器，右下角是分配给你的公网IP（即你的网站在互联网上的真实地址，之后域名解析会用到）\n8、进入域名标签，这里就需要操作域名了。关于域名购买和解析，我会放到下一个文章讲。\n到这，你的服务器就搭建成功了。\n下面讲讲我在这个过程学到的内容，这算是一些基本知识吧：\n服务器的选择\n其实服务器的类型有很多种，你只需要知道服务器大致有三类：独立服务器、云服务器（或VPS）、虚拟主机。\n为了方便理解，你只用知道独立服务器（你买不起，不需要），云服务器和虚拟主机你挑一个就好了。\n至于云服务器与虚拟主机的区别，简单来说，就是买房和租房的区别。云服务器通常有独立的IP（即别人通过一串数字直接能访问你的网站，比如149.45.68.222），而虚拟主机是共享IP，即别人只能通过网址能访问你的网站，而不能通过数字（因为这串数字里面含太多网站），因为这个IP被一台主机分给了不同的网站，做不同的用途。\n所以，不管是为了调试方便或者为了隐私性，都推荐云服务器。特别是我们又身在国内，比较靠谱的服务器供应商只有腾讯云和阿里云，都是主要提供云服务器。所以，基本上在两大公司中选一个就行了。我个人选了阿里云，因为阿里云有一个香港轻量级应用服务器，可以免备案。\n（这里再说一下，服务器在国内的网站都需要备案。如果不想备案，可以选择国外的服务器，但是速度会比国内慢一点。我选了香港的，因为地理环境离我们大陆最近，线路的路程也短些）\n服务器收费问题\n服务器收费，基本上就是免费和收费。\n免费的我用过两款，awardspace和profreehost. 其实两款都不错，属于虚拟主机，都有可视化界面。相对而言，profreehost更容易掌握些，在youtube也能直接找到教程。\n两者的主要缺点是，awardspace很慢（至少在国内打开），我建了个网站，所有朋友都登录不上。profreehost有一个致命弱点，它有点击限制（好像是每天2000次？）。我们是新手站长，肯定认为其实没有人点击，你就大错特错了。我测试过程中，只是自己打开网站，更新了几次，莫名其妙就到了限制。而且到了限制后，服务器会马上关停，24小时后才能重新打开。更有甚者，被profreehost莫名封锁了一个月。另外，profreehost的访问速度也快不了多少。\n因为这两个服务器速度奇慢，莫名的资源限制，让我有了使用收费平台的想法。\n就如以上所讲，因为我人在国内，又主要面临国内的用户，基本是腾讯阿里二选一。我最终选的是阿里的香港服务器轻量级应用。因为我看了网上的评价，选中它一是因为价格便宜，二是因为直接内置了wordpress镜像，不用折腾，所以非常适合建站的新手。\n"},{"title":"运动——请相信自己能战胜抑郁",
"url":"/blog/depression-sports/",
"date":"2020-05-11",
"headings":[{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/depression-sports/#can-kao-zi-liao","title":"参考资料","children":[]}],
"body":"对抗抑郁有N种方式，就医、咨询、看书、看视频、冥想、运动、上课……市面上罗列的，我几乎都做过，甚至还参加过传销式疯狂的培训。在实际的“搏斗”中，什么有效什么无效我有很多个人的经验可以分享。\n\n我最想也永远最先分享的一定是运动，往后我会分享其他的理论知识，包括影响我最深的CBT（认知行为疗法）和我与精神分析的经历，以及塞利格曼对于乐观与悲观的看法，还包括我对“人生就是受苦”的看法。当然还有各种有效无效的抗抑郁方式，我也想星星点点地讲一下。\n关于这个主题，我有太多的角度和内容想要讲述，但相关内容我一直在整理，另外，我也还需要不断地学习。\n不管怎样，首先我还是想讲运动，这真是上天对抑郁者的恩赐。\n\n跑步，这是对我帮助最大而且是我唯一在做的运动。\n首先，运动是最省钱且最简单操作的运动，特别是跑步。你不需要任何装配（当然，好的跑步鞋也能增强你跑步的动力，但这不是必选项），只要迈出步子，就能“服下对抗抑郁的一剂药”。\n在哈佛健康官网上介绍，高强度运动会释放“感觉良好的化学物质”——内啡肽，因此，有些跑步者甚至汇报他们有“跑步高潮”（runner’s high）。当然，对大多数人来说，维持低强度的运动就足够。“神经学家发现，抑郁者在运动过后，海马体（大脑中掌控情绪的部位）变得更小，而海马体内的神经细胞能够生长，产生更多的细胞连接，从而帮助抑郁患者减少抑郁”。\n虽然运动对于抑郁者的帮助是显而易见的，甚至不用我引用以上的话，大家都能信服。但为什么还是有这么多人放弃运动呢，尤其运动对你的抑郁情绪有明显帮助的情况下？\n\n首先，抑郁会带来明显的身体反应，影响睡眠，精力减少，食欲低下以及身体疼痛，所有这些身体反应都会减少运动的动力。这几乎是一个死循环，抑郁让你不想要运动，而不运动你会更加抑郁。怎么办呢？\n最简单的方法是像哈佛健康网站Dr.Miller介绍一样，从小处开始。哪怕花5分钟开始出去走路，慢慢第三天你可以花10分钟，慢慢你可以花15分钟……\n说个我个人的例子。我曾经有一段时间很热爱跑步，特别是发现跑步有助于减轻抑郁情绪后。一开始，我也认为跑步很无趣，因此我给自己设下一个非常“荒谬”的目标——一天跑一个地铁站。我从小是个不爱锻炼的人，身体能力一般，但那段时候居然奇迹般地坚持下来，几乎坚持了两个月，直到“膝盖中了一箭”——膝盖开始痛。\n说出这个经历并不想让大家学我，因为我过度消费自己的膝盖，虽然现在没啥事，但当时直接就让我几个月不敢跑步。这里面唯一值得借鉴的是设定目标，但设定得需要合理，不要超出你平时可承受的范围。\n如果你不清楚自己的能力，可以从一公里开始跑起。我最近重拾自己跑步的习惯，一开始的目标就实际多了，每天下班2公里。我给自己的目标是每一个月增加1公里，这个目标对我很实际，因为我以前连续跑过10公里的，大概知道我能承受的范围，所以目标实际，最好有点挑战性，这样比较容易坚持。\n\n另外，我最近在看一本习惯养成的书叫Atomic Habits，中文翻译应该是叫“原子习惯”。书中介绍了很多养成习惯的方法，我觉得有两个建立习惯的方法很适合用来建立锻炼习惯。\n第一，给出时间地点。科学家尝试做一个实验，让三组人开始锻炼。第一组人，科学家让实验者简单记录自己一周锻炼的结果；第二组人，科学家提供许多锻炼好处的材料（视频和书）给实验者看，并让他们记录自己一周锻炼的次数；第三组人，科学家不仅提供锻炼好处的材料，还让实验者给出他们一周将会在xx地点xx时间进行锻炼。实验结果发现，第一、二组人结果相似，都很少锻炼，而第三组实验者锻炼次数显然多得多。这就是“时间地点”的效应。\n给自己的锻炼给出具体的时间和地点，最好记录在某个地方（比如我喜欢用google日历记下待办事项），那你会做这件事情的概率会大大增加。\n第二，习惯累加。我们生活中本来就养成很多的习惯，比如我们洗脸、刷牙、抽烟、洗澡、吃饭……这些都是我们不用刻意去逼自己想的事情，靠的是潜意识的“自动导航”。很多人觉得给自己设定目标太难了，或者自己设定了时间地点也不会遵守，那么这里介绍的将是最适合你的方法——习惯累加。\n什么意思呢？简单来说，就是习惯套习惯。比如，你可以告诉自己，“吃早餐前我就去跑步”，或者“我下班就去跑步”。对于你来说，吃早餐或者下班，这都是习惯动作，在习惯动作后面加上你想要培养的习惯就行了。\n当然，你的习惯不能脱离现实。对于我来说，我本来设定的习惯是“起床-跑步”，但因为我需要早起，而且过度早起会让我一天都不精神，我有时候晚上又可能熬夜，因此，我就很容易培养一个失败的习惯。但是“下班-跑步”不会，我下班是固定时间，附近有个商场可以换衣服，换上就可以直接跑步，虽然偶尔也会有紧急事项影响我习惯的执行，但大部分时间都是可行的。\n每个人的时间表都是不同的，你需要找到自己时间表，能够填下你运动的时间。哪怕一周只能抽出一天的时间，对于你个人的抑郁状态都是巨大的帮助。\n\n说到运动，我还有一个小秘诀可以贡献，可以帮助你增强运动的动力。每次我购买新的运动装备，比如运动鞋、头巾、短裤，甚至仅仅是随身挎包，都会让我下一次更愿意出去跑步。当然，对于这一点，普通人请慎重，量力而行。而土豪嘛，请随意。\n再另一点，也是Atomic Habit提到的，真正改变一个人习惯的并不是设定的目标或者制定的计划，而是人的信念。比如，你想学习乐器的时候，你相信自己是一个“艰苦训练的音乐家”，那么你更有可能拿起吉他。而我，在跑步时，总是相信自己是一个“跑者”。而跑者，需要毅力。那么，我就是一个有毅力的人。你呢？你是“游泳者”还是“篮球员”？\n\n当然，运动也有它的局限——它是一个需要长久见效的“药方”，三天打渔两天晒网的方式很容易将你打回原状，特别是抑郁者，本身的身体条件会让你越来越不想跑步，最后直接打回原状。如果你真的想要走出来，需要日复一日的坚持，在这一点上没人可以帮助你，请坚强。另外，“虽然对很多人来说，运动相当于服用抗抑郁药，但仅仅运动对于严重的抑郁症是不够的”，真正严重的疾病需要更加专业的支持。但是，请注意，这里并不是“无效”，而是“不够”。\n运动对我个人的帮助是巨大的，虽然我想要探讨的是对抗抑郁。但在焕新思维、增强体质、减轻压力等方法，个人也受益良多。基于此，我觉得运动的作用，再怎么夸张都不为过。\n参考资料\nExercise is an all-natural treatment to fight depression-Harvard Health Letter\nAtomic Habits-James Clear\n"},{"title":"小白如何向谷歌google及百度提交网站？-CNAME验证的详细步骤",
"url":"/blog/dns-submit/",
"date":"2020-05-11",
"headings":[{"level":2,"id":"2024nian-hui-gu","permalink":"https://linxz.online/blog/dns-submit/#2024nian-hui-gu","title":"2024年回顾","children":[]}],
"body":"想必各位刚刚建立网站的站长都有同样的问题，如何让百度和谷歌google收录你们的网页？\n关于网页的收录，google有google search console，百度有站长工具。这些信息在互联网一搜索都是答案。但是，收录的过程就有点曲折离奇了（至少对我而言）。\n我的域名是在Namesilo申请的，因为看过别人的推荐是最便宜的域名商，也懂点英语，就稀里糊涂地注册了。等到百度和谷歌让我进行CNAME验证的时候（这是提交网站给谷歌的必要步骤，百度可选），就吃尽了苦头。\n以下先说结论吧：\n在Namesilo增加CNAME记录的时候，一定要记得换回默认的DNS服务器（nameservers）！\n下面来说说步骤，其实很简单：\n1、打开Namesilo的DNS管理面板（Manage DNS），就是“小蓝球”。\n2、进入Manage DNS面板，把默认的全删掉，点击红色x就可以了。\n3、创建一条CNAME记录，点击“CNAME”就可以了。\n4、抄下百度或者谷歌google给你的HostName（二级域名，小白也可以理解为网站前缀，类似www），谷歌的是空白的，即直接就是你的网址，所以HostName那里不用填。\n百度一般是一串乱码，比如给我的是“oiumxpp”，这个填入HostName就好了。后面（你的域名，比如我的是.xiaozhong.club）不用填。\n至于对象，即address/value一栏，则填入谷歌和百度给你的地址，谷歌一般是“ghs.google.com”，百度一般是“ziyuan.baidu.com”。\n填完需要等一段时间，DNS改变需要10几分钟到一天不等。\n特别注意：\n因为我的服务器是阿里云的，所以nameservers一开始选的是阿里的。听说改DNS要等一段时间，就傻傻地一直等。结果一直等不到。添加百度CNAME验证的时候也是如此，白白等了一天！\n一定要记得改回到NS1.DNSOWL.COM, NS2.DNSOWL.COM和NS3.DNSOWL.COM。然后不要着急，按照谷歌或者百度的要求，等个10几分钟。谷歌的我等了几分钟，百度的我是干脆等到第二天才验证成功的。\n另外，Namesilo本身就有针对谷歌google提交的优化，只要在Manage DNS里面找到Blogger，然后再选择Apply Template就好了。你可以看到它会直接把你创建一个CNAME链接到谷歌。但是前提还是要记住——记得改回Namesilo的默认nameserver！\n我也是新站长，搞不懂为啥一定要换到默认的nameserver，可能非Namesilo的域名商不用？\n反正因为这个事，我硬是搞了两天，希望别人也不要跟我一样碰雷吧。\n2024年回顾\n当年的我竟然如此小白，连DNS服务都没搞清楚，汗。虽然迁移文章发生在2024年，但是还是把当年的过程原样抄过来，避免有人和我一样。\n如果是DNS的服务器换成阿里云，可以直接到阿里云操作DNS也是可以的。\n"},{"title":"为什么活着这么不快乐？",
"url":"/blog/unhappy/",
"date":"2020-05-10",
"headings":[{"level":2,"id":"kuai-le-shi-yi-ge-wen-ti","permalink":"https://linxz.online/blog/unhappy/#kuai-le-shi-yi-ge-wen-ti","title":"快乐是一个问题","children":[]},{"level":2,"id":"kuai-le-zhi-shi-yi-chong-qing-xu","permalink":"https://linxz.online/blog/unhappy/#kuai-le-zhi-shi-yi-chong-qing-xu","title":"快乐只是一种情绪","children":[]},{"level":2,"id":"xuan-ze-ni-de-tong-ku","permalink":"https://linxz.online/blog/unhappy/#xuan-ze-ni-de-tong-ku","title":"选择你的痛苦","children":[]},{"level":2,"id":"can-kao-zi-liao","permalink":"https://linxz.online/blog/unhappy/#can-kao-zi-liao","title":"参考资料","children":[]},{"level":2,"id":"tu-pian","permalink":"https://linxz.online/blog/unhappy/#tu-pian","title":"图片","children":[]}],
"body":"​抑郁的朋友经常有一个念头：我的人生这么痛苦，一点都不值得过。如果人生过得不快乐，那又有什么意义呢？\n活着就是要快乐啊，如果一天到晚都苦哈哈地，兴致低落，那还不如死了算了。确实，有些人真的为此自尽。\n在我的生活中，说得上快乐的时光是很少的。要么是出外旅游，要么是和喜欢的人一起聊某个感兴趣的话题，要么是无所事事地打游戏。对于成年人，特别是有家庭的人，这些事情显得特别奢侈。\n生活中更多的是日复一日的工作、他人要求你完成的责任或无聊的时光。这些事情占据了我们生活的大部分时间，一般它们是无聊的，有些事情更伴随着压力、恐惧和忧虑。\n想想都可怕，为什么我要过这样的生活？\n\n有时候又想，那些富二代们、中东土豪们、世界首富们，是不是过得很爽呀？每天跑车、美女、赌局，刺激一轮又一轮，他们活在快乐的“日不落帝国”中，是不是这样才会幸福？\n当然，大部分人都是普通人，所以只能过着我所描述的普通日子，而且很多人穷极一生，也达不到所谓的富裕阶层，体会到他们的快乐（当然，我这里假设钱能买到快乐），那么这些大部分时间都缺乏快乐的日子，真的值得人类忍受吗？\n快乐是一个问题\n最近我读的一本书叫《The subtle art of not giving a f*ck》(我的中文翻译是《“去他x的”的艺术》），里面讲了这么一个故事：\n大约2500年前，喜马拉雅山，即现在的尼泊尔境内，住着一位富裕的皇帝。他的孩子即将要出生，为此他想到一个主意——他要给这个孩子一个完美的人生。\n\n从出生起，这个孩子将不知“苦”为何物。他的所有要求、所有愿望，天上飞的、地上钻的，任何时候他想要任何东西，皇帝都要为他拿到手，不惜一切代价。 为了彻底让王子与痛苦隔绝，皇帝为宫殿建筑了高墙，让王子无法接触外面的世界。\n在宫殿中，王子得到最好的事物、最棒的礼物，身边无数佣人随叫随到。一切都在皇帝的计划当中，王子体会不到世间的一切痛苦。 但是，宫殿内日复一日的奢华生活渐渐让王子感觉到厌倦，他慢慢觉得生活有点空洞。皇帝继续把所有搜集到的珍稀物品送给王子，但这一切再也无法让王子满足。\n终于，有一个晚上，王子偷偷爬出了高墙。一个佣人在他的威逼下，充当他的司机，带他游览宫殿外的村庄。这一晚王子所见所闻，彻底惊呆了他。\n\n他第一次见到有人生病却无法医治，第一次见到老人、流浪汉，第一次见到人活在痛苦当中、借酒浇愁，第一次亲眼见证人的死亡。 回到宫殿后，王子发现自己似乎陷入了某种存在危机——他不知道怎么处理自己的情绪。他能感受到自己悲伤，渐渐自己也学会了抱怨，害怕将会发生的事情。\n就像所有年轻人一样，王子开始抱怨自己的父母，他责怪自己的父亲。一定是因为父亲从小让他过这样奢华的生活，才让自己无法抵抗这样的冲击，让他的生活了无生趣。所以，他决定逃跑。\n王子想，一定是过去的种种遭遇让他无法承受现在的情绪冲击，因此他决定反着来。他彻底放弃自己的身份、家庭、财产，他住到大街上，像动物一样栖身于尘土中。他让自己受饥、受寒，他折磨自己，强迫自己每餐都去乞讨。\n\n然而，一年又一年过去了，王子并没有感受到自己情绪压力的减轻，他并没有获得自己一直在追求的“另一种生活”。实际上，多年的受苦经验纯粹就是受苦，并没有带给他任何意义。\n他开始后悔，为什么当初要下定决心来让自己受苦呢？这是一个多么糟糕的决定。现在怎么办？王子想，我要找到另一种不让自己受苦的办法。\n于是，王子给自己洗了澡，重新整理了自己的衣冠，来到了河边的一棵树下。他决定一直坐在这棵树下，直到自己能够参悟出另一种不再受苦的办法。\n\n就这样过去了四十九天，王子思考了很多。\n虽然我们不知道一个人到底能不能在一个相同位置下不吃不喝坐近两个月，但假设传说是真的，王子最后参悟了一些人生的真理。 其中的一个真理是这样的——人生而受苦。 富人受苦是因为他们的财富让他们受苦，穷人受苦是因为他们的贫穷让他们受苦。无家可归的人被无家可归的条件所累，有家庭的人受家庭的苦。追求快乐的人会受到“追求快乐”带来的痛苦，放弃自己快乐的人会因为“放弃快乐”而受苦。 众生皆苦。\n当然，所有的痛苦并不必然平等，有的苦难显然超过一般的苦难。但是不管怎样，我们活着，就都在受苦。\n因此，痛苦是无法避免的，你无法一直活在快乐当中。你能做的，就是不再逃避，接受痛苦。\n\n可能有人已经猜到，王子便是后来后来的释迦牟尼佛，他创立了佛教，他告诉我们，众生皆苦，不需逃避。\n快乐只是一种情绪\n另外，快乐很重要吗？快乐只是一种情绪。 情绪在人类进化的过程中，只有一种用途：帮助我们过得更好。\n它是人类的反馈机制，告诉我们哪些东西对我们有好处，哪些东西对我们有坏处，仅此而已。 用手碰热锅后感受到的痛苦，它让人类不再碰炎热的物体；独自一人感受到的孤独，它让人类积极与他人进行沟通。\n情绪是一种生理信号，它被设计成帮助人类追求有益的活动，避免有害的活动。\n\n所以，当你陷入某种“中年危机”，依然想着小时候爸爸对你情绪虐待的事情，你感到很糟糕，这是大脑在尝试告诉你，这是一个未解决的问题，你需要想办法处理一下。\n换句话说，消极的情绪在提醒你行动。你觉得自己情绪低落了，从生理上来说，这是一个需要行动的讯号。这并不是什么打算摧毁你的生化武器。 有些人认为，自己的情绪就是生活的一切。你感觉到好，所有的一切都是好的。你感觉不好，所有的东西又变得不好，好像身边所有的事情都会变魔术一样，随你的情绪变化。情绪它仅仅是信号，是情报官，它是一种生理神经反应，并不是司令官。\n情绪根据你从前狭隘的经验，有可能传达的是错误的情报，所以我们并不一定要信任自己的情绪。 很多人从小就被教导要压抑自己的情绪，为了个人发展、社交需求或者社会规范，特别是负面情绪。其实，这是错误的。因为，你否认了负面情绪就等于否认人类的赖以生存进化的反馈机制，它在不断帮助人类解决问题。 但另外一些人却臣服于情绪之下，认为自己感受到的情绪就是一切。我很生气，因此我就打破你的杯子；我打你，因为我觉得我就是对的。\n我们知道，三岁的小孩和小狗才会完全受情绪控制，认为自己情绪发泄全都是正确的。他们都会做的事是，在干净的地毯上排泄。\n\n另外不能臣服于情绪之下的原因是，情绪是易变的。今天你觉得开心，明天却不一定。我们对同一件事的看法也是多变的。今天你觉得你的伴侣很可爱，明天可能就很可恶。让你心仪的新房子同时也是那个让你气得跺脚的房子。\n因此，情绪仅仅是自然界赋予人类的一个反馈机制，帮助人类探测周围的事物。它时而有效、时而失灵，仅此而已。\n选择你的痛苦\n如果我问你，“什么是你人生中最想要的东西？”你可能会回答，“我想要快乐。我想要一个温馨的家庭、一份我喜欢的工作。”\n这样的回答，在全世界范围内都是很常见的，不过这样的回答根本就不能代表你想要的东西。 每个人都喜欢让人感觉很好的的东西，大家都想要健康、快乐、不用担心的人生，拥有一个完美的伴侣、姣好的容貌、赚很多的钱以及成为一个受欢迎的、受人尊重的人。\n\n这是所有人的愿望，想出这样的愿望是很简单的。\n然后，很多人可能没有考虑过一个更加有趣的问题——你想要怎样的痛苦？或者，你愿意承受怎样的痛苦？ 因为这才是真正的生活。 举例来说，很多人都想要一个独立的办公室，赚很多的钱——但不是很多人愿意承受每周60小时的工作、过长的通勤时间、无聊的文书工作以及官僚的企业体制。\n很多人想要找到完美的伴侣，享受完美的性爱——但不是很多人愿意经历痛苦的沟通过程、尴尬的安静、以及容易感觉到自己受到伤害。\n\n所以，这些人停下来了，不再追求自己想要的东西。\n以后的每年，他们都会问自己，“如果当初xxx，我今天应该就xxx了吧？” 为什么人们总是需要降低自己的标准，总是要后悔自己的选择呢？因为，快乐的目标意味着承受痛苦的过程。\n你选择一个目标，必然要求你付出相应的努力，努力的过程就是痛苦的。 你想要有一个成功的企业，你必须要冒险、忍受不确定性、承受一次又一次失败带给你的心理创伤，你要花不可思议的时间在上面，但同时，到头来可能一无所有。\n\n你想要找到一个伴侣，你必须承受情绪的波澜、一次又一次的拒绝，忍受两性紧张的关系，承受一次次看着手机但没人发来一条信息。这是爱情游戏的一部分，如果你不玩这个游戏，你根本不可能会获胜。\n所以，决定你是否能够达成目标的根本就不是“你想要什么快乐”，而是“你选择何种痛苦”。你必须要做出选择，正如以上所说，你不可能逃避掉人生的痛苦。\n快乐非常简单，大多数人都有类似的答案。有趣的问题是痛苦，这是一个艰难的问题，但这个问题才能帮助你达到成功的彼岸。你愿意牺牲什么？你愿意承受什么？这才是区别你我的问题。\n\n著名游戏制作人宫崎英高制作出了著名的“受苦游戏”——《黑暗之魂》。这款游戏会让玩家在游戏中一次次地死亡，逼迫玩家一次次受虐、一次次练习，但玩家通过锻炼自己的技巧，最后得以一个个地打赢BOSS，享受承受痛苦后的快感。这个游戏在世界范围内受到极大的欢迎，因为这跟人的自然状态很像——为了打赢BOSS，你需要承受必要的痛苦。\n如果你不愿意承受你想要的“快乐”而需要承受的苦难，那么你不配得到这份快乐。另一个层面也说明，你也许并不真的想要这个目标（快乐）。\n快乐就是快乐，痛苦就是痛苦，有趣的是选择，你可以选择忍受怎样的痛苦，去达到你想要的快乐。既然人生的痛苦无可避免，那么你将选择怎样的痛苦？\n\n参考资料\n“The subtle art of not giving a F*ck”- Mark Manson\n图片\nunsplash，steamcommunity，azquotes\n"},{"title":"「我觉得自己有心理问题」",
"url":"/blog/psycho-problem/",
"date":"2020-05-09",
"headings":[{"level":6,"id":"tu-zhu-shang-ke-zuo-de-bi-ji-zi-ji-lue-liao-cao","permalink":"https://linxz.online/blog/psycho-problem/#tu-zhu-shang-ke-zuo-de-bi-ji-zi-ji-lue-liao-cao","title":"图注：上课做的笔记，字迹略潦草","children":[]}],
"body":"​很多人知道我喜欢心理学，在心理咨询行业内工作过，也有类似的经历，他们很喜欢问：“我是不是‘抑郁症’？”\n这个问题很简单——你应该到医院检查一遍，确定自己是不是。\n因为就精神科诊断来说，我亲身经历过，确实有一个清晰的流程，首先会从你的器质性层面检查起，看看是不是生理因素，再进入到科学的量表填写和分析，最终会有个详细的诊断结果。\n总之，正规医院的精神病诊断，应建立科学诊断的基础上。\n\n至于“我到底有没有问题？”“什么时候我要看心理医生”“我觉得我焦虑了？”……\n这些问题其实是很难回答的，为什么呢？\n首先，心理问题并不像流血受伤，没有清晰的痕迹。同时，它也没有一个明确的标准，即到达某点你就是抑郁了，某点就是焦虑，某点你是正常的，某点你是不正常的。\n如果要做个比喻，心理大概就是一条连续不断的光谱。\n人的心理被大致分为“心理正常”与“心理不正常”。“正常”中包含“心理健康”和“心理不健康”，而“不正常”包含了各项精神科疾病。\n如下图所示：\n\n图注：上课做的笔记，字迹略潦草\n精神科医生主要区分的是人“心理正常”和“心理不正常”。\n“正常”不用说了，就是普通人。“不正常”就是我们常说的精神病人，主要供医生诊断的。它是一个严格的医学范畴，有具体的诊断标准。\n对于我们非专业人士来说，一个很容易区分的指标就是“自知力”，即这个人到底知不知道自己在干什么。\n如果一个人有被害妄想，常常觉得全世界人都想杀他（妄想症）、或者常常描述别人看不到的画面或声音（幻觉、幻听），那么我们就把他判断为“心理不正常”。当然，“不正常”的种类还有很多种，这里就不展开说了。\n\n下面我着重说一下“心理健康”和“心理不健康”。\n很多人都说自己有“心理有问题”，那么到底是有问题还是没问题？这个问题我没有答案，但好消息是，你们一般都属于“心理不健康”而已，因为至少你们还有自知能力，懂得寻求帮助。\n在这一范畴下，你是不需要精神科医生介入的。所谓的心理问题更多的是一种状态，而不是一种病。\n坦白说，我发现很多来询问心理问题的朋友，大部分人其实问题真的不大，而且碰到的都是实际的问题，要么是工作，要么是家庭，都是现实原因，都属于“一般心理问题”。\n\n问题通常都有现实的触发原因（比如失业、离婚等），持续时间很短，少则几天，多则1-2月。虽然他会感觉到自己有不良情绪，但仍能理智控制，基本维持正常的生活，睡眠也不会受到影响。\n应该说这种情况是大量存在的，或者说只要是人，都会有“心理不健康”的时候。\n很多人也将这种情况称为“心理感冒”。一般情况下，人是健康的，但是遇到“病菌”（突发事件或者特定的人），抵抗力稍低的人会容易“感冒”。不过，标榜自己强壮健康的人，也不能保证自己一直不感冒。\n所以，“心理感冒”是一个正常人必经的阶段，区别只是个体之间的抵抗力强弱而已。\n\n有些人会说（我只碰到很少数），他的心情持续低落，对某件事耿耿于怀（现实原因），大概半年（时间很长）来都是昏昏沉沉，好像做什么事情都没法帮助。那么，这种情况下我们可能判断他属于“严重心理问题”。\n在这个情况下，确实要特别小心。因为他有“滑”向“神经症”的危险。这个“神经症”不是指我们常说的“神经病”（“神经病”更像我之前所说的无自知力的情况），而是指求助者的痛苦没有现实来源，脱离了现实处境。\n比如，一个经历过文革的人，明知道文革已经结束，不会再发生同样的情况，却一直在回忆痛苦，而且被这样的痛苦压得喘不过气。\n\n之所以我这里用的是“滑”，正如我之前所说，心理是一条连续不断的光谱。你往左边过一点，就是“心理正常”，右边一点就是“心理不健康”，再右一点就是“神经症”，甚至会有“抑郁症”“人格分裂”等症状。但这都不是绝对的，这就像一把滑尺，今天滑过来一些，明天滑回去一些。一般而言，滑动的范围不会太大，但也可能突然滑过去很大范围（遇到重大事故）。\n因此我们无法绝对地说，“某人有心理问题”或者“某人有严重的心理问题”。因为在病症外，心理就是一个动态的概念。每个人都可能有问题，问题也可大可小，无法用某个单一的点来衡量。\n那么这样的话，我怎么才能知道什么时候需要心理帮助呢？\n\n美国心理学会（APA）建议，当你生活的某一面巨大压力时，应积极寻求心理咨询师的帮助。这个问题可能使你：\n\n\n每天至少花1个小时思考某个同样的问题如何解决；\n\n\n让你感到不安，并让你变得离群索居；\n\n\n降低了你生活的质量；\n\n\n对你的学业、工作或者人际关系产生了消极影响；\n\n\n你已经采取很多方式尝试解决这个问题，但都没有用。\n\n\nJohn M. Grohol提出，当你有以下五种情况时，应该寻求帮助：\n\n\n你生活得非常痛苦。\n\n\n你所做的都没有用。\n\n\n你的朋友和家人觉得你很烦，不想再听诉苦。\n\n\n你开始滥用药物或者虐待别人来试图减轻你的痛苦。\n\n\n其他人都察觉到你“有问题”，并建议你看医生。\n\n\n我经常和朋友们说，就我自身的经验有两个标准，一个是失眠，一个是影响生活。 失眠就不多说了，连续几天睡不好觉，一定会影响生活。（但建议去医院检查，先排除是否有身体上的疾病）；\n另一个指标是，你的心情是否会影响你的正常生活？比如说，你突然很害怕/讨厌和别人在一起（同时你很孤独），突然就无法起床上班了，突然食欲变得极其差（同样要排除躯体疾病）等等，影响了日常的生活节奏，我绝对建议你寻求心理咨询的帮助。\n如果你有的是“严重的心理问题”时，心理咨询会像你的拐杖，一步步地搀扶着你走出来；如果你有“一般的心理问题”时，当你无法解决的时候，咨询师通常会给你一个新的视角，让你重新看待自我。\n\n有趣的是，当个人有自愈能力时，其实心理咨询就会像“马杀鸡”，就是纯粹帮你心理按按摩，让你舒服地走出来而已。\n所以，有时候心理咨询师也像“骗子”，因为有能力自我恢复的人，是不需要咨询师的。\n但从另一个角度看，花钱买服务，让你轻松点度过艰难的时光，这似乎也是一笔不错的交易？\n\n参考资料：\n\n《心理咨询师（基础知识）》，国家职业资格培训教程，民族出版社\nWhy Should I Go to Therapy? 8 Signs It’s Time to See a Therapist-Crystal Raypole\n5 Sure Signs It’s Time to See a Therapist- John M. Grohol, Psy.D\n\n"},{"title":"我悲观得很叼",
"url":"/blog/pessimism-is-good/",
"date":"2020-05-07",
"headings":[],
"body":"今天的文章是来处理一个长久以来困扰我的问题——我的悲观能救吗？\n从前的我，对自己有一个固定的认识——我是一个相对悲观的人。\n面临考试，我总认为自己很容易就“失手”，无甚把握；\n面对关系，我总认为自己是个不讨喜的人，所以不大敢去接触别人，或者我认为必须要将自己“装扮”成一个完成不同的人才能成功与别人沟通，也一度让我很痛苦（我有个社交软件的账号名为“假装外向”，用以自嘲）；\n面对工作，我总会认为自己没什么本事，纯粹在公司混饭吃（奇怪的是，我身边好像没有同事戳破过我？甚至有人觉得我很能干？）；\n开始创业后，我无时无刻都看到很多公司可能会失败的风险，所以每天都惴惴不安。\n因为也碰过很多乐观的人，有些人的思考维度里面甚至都没有我举到的这些情况。看到这些人看似美好的生活，不禁促使我自己在想——\n“完蛋了，我是一个悲观的人，我该怎么办？”\n\n最近我在看一本书，书名叫“The positive power of negative thinking” （我自己翻译为《负向思维的正向引力》），里面介绍了一种悲观叫“防御性悲观”。\nKatherine在一所精英大学里面担任社会学教授，她聪明、努力、对自己的专业怀有热情，但你会很惊奇的发现，她是一个“悲观主义者”。\n当她在申请学术研究项目的时候，在准备演讲的时候，甚至在筹划某个同事的退休晚宴的时候，她都会告诉自己，这一切一定会变得非常糟糕——话筒没声音，演讲稿没写好，编好的笑话不好笑以及自己会紧张得说不出话。她总是害怕并相信所有事情都会出错。\n而她嫁给了一个“乐观主义者”——Bill。Bill是一个成功的建筑设计师，他总是很自信也很幽默，他总是很快地决定做一个新项目，从不担忧项目会出什么问题，同时会鼓励身边的人不用怕，向前冲。\n但是，Bill也很没有耐心。\n他不大喜欢听到别人毫无缘由的担忧，比如他的妻子Katherine去机场前还要检查这那，浪费一堆时间。\n心情好的时候，他只会一笑置之，甚至对这些“多余担心”开一些无关紧要的玩笑。\n心情不好的时候，他会变得极端烦躁，弄不清楚为什么他的妻子要担心这些尚未发生，而且不大可能会发生的事情。\n比如，他的妻子申请的项目一向都很成功，每次的主持都很有趣，几乎毫无担心的必要。\n\n为什么他们的表现会如此不一样？\n因为他们采取截然不同的方法来达成自己的目标。\n表面上看，Katherine和Bill，一个是乐观者，一个悲观者，这就是理由。但是，往深处去想，其实“乐观”和“悲观”都只是他们的策略，他们采取了不同方式来处理焦虑。\n想到讲座，Katherine马上会条件反射地担心各种事情，总是做最坏的打算，因此为了对抗她的焦虑，她只能更加用心地准备，在每个可能出错的地方都加上一道“保险”.\n比如带个“小手抄”，比如再润饰一下文字，比如开场前再测试一下话筒，所以她的讲座在重重保障下，效果一直不错。\n而Bill遇到一个讲座，他也会有焦虑，但他的方式是“转移注意力”。\n认为自己准备妥当后，他通常会想办法放松甚至想象自己成功的画面，以此来处理他的焦虑。这个时候，如果一个“悲观主义者”跑过来告诉他，哪里哪里可能会出错，他会非常生气。\n因为你将他拉回到“焦虑”里去，恰恰是他努力避开的东西。同样，因为Bill也是一个很努力的人，所以他的讲座一般也很成功。\n同样是为达成目标，Katherine采取的方法叫“防御性悲观”，即通过焦虑来迫使自己做更好的准备，而Bill采取的方法叫“策略性乐观”，即通过避开焦虑来保持自我的最好状态。\n\n那么哪种方法比较好呢？\n乍看之下，都一样，他们两个人都完成了目标。但是，我们悲观主义者还是能嗅出一丝不公平——\n凭什么乐观者可以毫无焦虑地获得成功，我们悲观者需要在焦虑中获得成功，我们也想一身轻松呀。\n难道悲观者就不能变得乐观吗？\n心理学家做了一个实验，找来一些悲观者，告诉他们将会有一些困难的智力题，引发他们的焦虑感，并记录数据。\nA组使用他们习惯的“防御性悲观”方法，全程都在焦虑状态下准备和答题，B组则被使用“乐观”的方法，通过音乐使其放松或者告知他们实验者已经测试过他们的智力，这些题目对他们毫无难度来降低他们的焦虑值。\n实验结果让人大跌眼镜，因为研究发现，悲观者的“负向情绪”（焦虑）有助于提高他们的成功表现，而“正向情绪”（放松、自信）则会影响这些悲观者的表现。\n\n这个实验也拓展到现实生活，通过对一个医院的护士进行研究，他们有不同的目标（买房子、帮一个亲戚走出负面情绪、给离婚后的生活找个新兴趣等等）。\n那些采用“防御性悲观”策略的人（仅限于悲观者）最后汇报他们完成工作后的焦虑感最少，也对结果最满意，反而实验者竭尽心力帮助悲观者转换心情的方法并没有帮助他们达到更好的结果。\n所以，这可以说明，“防御性悲观”虽然会在短期内增加悲观者的焦虑，但对悲观者完成目标是一项有效的策略。\n而悲观者盲目采用所谓的“乐观策略”的话，可能得不偿失——表现得更差，而且事后更焦虑。\n到这里，似乎悲观者的世界很美好，一样可以完成目标，只是忍受多一点焦虑罢了。\n可是，并非每个悲观者都像Katherine一样积极，有时候任务来了，悲观者更多的选择是放弃、是自我瘫痪？\n为什么有些人的选择会是积极的，有些人则更为消极？\nJulie博士在书中提出，除了“防御性悲观”外，悲观者最常使用的策略“逃避”(avoding)和“自我瘫痪”(self-handicapping)。\n“逃避”指放弃当前任务，而“自我瘫痪”则是指拖延、制作混乱和滥用药物和酒精等行为。\n\n这里的“制作混乱”（disorganizing）值得一讲，它是指个人不顾一切地承接任务，给自己营造一种繁忙的状态。在工作超出个人负荷的情况下，必然使某些任务不能顺利完成。\n这恰恰是悲观者想要达到的目的——借口是因为工作繁多以致表现不好，而非因为自己不够聪明、能力不足。\n这两种策略都与人的自尊有关。\n“逃避”或者“自我瘫痪”都让悲观者自身能够脱离任务，继而将任务的失败归因到外部因素上，“是因为昨天的酒、是因为任务太多、是因为时间太短等等，否则我早就完成了或可以做得更好……” \n——这两种策略，都在保护人的自尊，避免失败的自我归因。（塞格利曼在《活出最乐观的自己》中详细地说明了归因）\n只是，同样是逃避，使用“策略性乐观”的人，会在逃避焦虑后继续行动，而纯粹“逃避”的人，则会偏离目标，减少练习的机会，自然就减少了成功的几率，长期来看会增加个人的焦虑。\n而“自我瘫痪”的人，因为害怕自己被发现为是“无能的、没有创造力的、智力低下的”，这些对他们而言都是终身不变的标签。\n所以，比较之下，他们宁愿被认为自己是“懒惰的、不可靠的、不专业的”，这样至少可以暂时保护他们的自尊。\n但是，人是一种喜欢追求确定性的生物。当你所做的事情成败很难与自己的努力挂钩，甚至没法验证自己在何种条件下能够完成一件事情的时候，这也增加人的不确定感，继而引发长期的焦虑。\n因此，在对抗焦虑的路途上，使用“逃避”和“自我瘫痪”策略的悲观者是得不偿失的。\n“不同的鞋适合不同的人”，Julie博士建议每个个体按照自我的情况，慎选自己的策略。\n\n最后，其实我想传达一个比“悲观不可怕”更为重要的讯息。\n在我对抗抑郁的路上，多年前一个朋友的话点醒了我。他说，抑郁者最大的问题不是开心不起来，而是因为思维的狭隘。\n他们认为，他所做的事情，这个事情的情形就是他脑中的唯一一条路径。这种思维阻碍他去行动和发现，继而让他被动地孤立起来。\n所以，“开阔”比“开心起来”意义更为重要。发现世界的大，世界的包罗万有，发现更多的观点、更多的策略，往往会使人豁然开朗、乐观处事。\n另外很重要的是，Julie博士强调，没有绝对的乐观和悲观。没有人是绝对乐观的人，也没有人是绝对悲观的人。\nKatherine在工作上悲观，但她在财务上异常乐观。Bill在工作上乐观，却在财务上很悲观。塞格利曼也在他的书中解释，乐观的时候更奋进，悲观的时候更现实。仅是如此而已。\n乐观与悲观，它既可以是一种状态，也可以是一种策略。正如李小龙所说——Be water, my friend，人要像水一样流动无形。\n"}],
"sections":[]},{},{"entry":null,
"pages":[],
"sections":[]},{"entry":{"title":"林氏家书",
"url":"/family-letters/",
"date":"",
"headings":[],
"body":"祖父林廣承之家書，余代為整理。\n"},
"pages":[{"title":"命也，運也，時也，福也",
"url":"/family-letters/destiny/",
"date":"",
"headings":[],
"body":"有福之人祖山興，\n無福之人祖失靈。\n不怨祖亦不怨人，\n立誌守信苦也樂。\n忠義孝道宜從善，\n運轉時來祖山旺。\n有運之人神尋人，\n無運之人人求神。\n平安便是神保佑，\n發財只在儉與勤。\n——廣承自律\n愿我兒孫知之\n庚辰年\n「廣承原帖」：\n\n"},{"title":"善念",
"url":"/family-letters/great-mind/",
"date":"",
"headings":[],
"body":"不測之災盡力幫，風流懶漢孬縱容。\n忍讓謙躬心清閒，強橫奸邪天報應。\n勤儉耕耘惟家計，盜搶誘騙無久長。\n善良重義家和睦，驕縱淫賭禍孿生。\n粗淡飽暖家長樂，華衣美味多積災。\n——廣承敬吉\n庚辰年書\n「廣承原帖」：\n\n"},{"title":"敬父如天",
"url":"/family-letters/respect/",
"date":"",
"headings":[],
"body":"敬父如天，敬母如地\n汝之子孫，亦復如是\n立德必旺，為善則昌\n以和為貴，源遠流長\n——廣承敬錄\n庚辰年\n「廣承原帖」：\n\n"},{"title":"勸世善书 提升智慧 調澈人生 受益良多",
"url":"/family-letters/good-mind/",
"date":"",
"headings":[],
"body":"人生就像一場戲，\n因為有緣聚一起\n勸君應該去珍惜，\n相扶到老不容易\n凡事三思是必要，\n勿因小事發脾氣\n別人有苦應相勸，\n寬心安慰最如意\n激動之時心情燥，\n傷神費力失禮儀\n兒孫自有兒孫福，\n貧富貴賤勿相比\n知足常樂延壽命，\n鄰居親朋相扶持\n有說有笑解憂鬱，\n內外上下總相宜\n——廣承敬錄于\n庚辰年孟春\n「廣承原帖」：\n\n"}],
"sections":[]},{"entry":null,
"pages":[{"title":"羡慕并不好",
"url":"/shorts/xian-mu-bing-bu-hao/",
"date":"2025-03-10",
"headings":[],
"body":"小时候总羡慕别人有这个那个，到头来对自己一点帮助都没。\n还不如耕耘好自己的一片地。\n"},{"title":"「流式输出」为什么有用户体验？",
"url":"/shorts/liu-shi-shu-chu-wei-shen-me-you-yong-hu-ti-yan/",
"date":"2025-03-03",
"headings":[],
"body":"AI模型的「流式输出」成了标配。\n1分钟后给你一个长文，和一个个字蹦出来有什么区别？对结果来说，没区别，对过程来说，有重大区别。\n用户不喜欢空白，就像Loading也需要Loading条。\n把用户的时间填满东西，就是目前最好的用户体验。\n用户对「过程」上瘾，确认来说，是对「奖赏」上瘾。\n就像「还有20分钟」送达一样，用户喜欢「看得见」的过程。\n"},{"title":"你真的对孩子没要求吗？",
"url":"/shorts/ni-zhen-de-dui-hai-zi-mei-yao-qiu-ma/",
"date":"2025-02-14",
"headings":[],
"body":"你真的对孩子没要求吗？\n我们经常在影视作品看到，父母说对自己的孩子没要求，只希望他平安幸福。\n且不说父母表达这句话的真假，只论这句话。\n其实，“平安”和“幸福”也是要求。你希望他平安，就倾向不冒险，孩子生活中就少了很多冒险的机会。\n你希望孩子幸福，那更难了。最富有的人也不能保证自己幸福。\n我时常想，我对孩子没什么要求，不想他升上什么学校，考多少分，挣多少钱。这话不假。\n但恰是这些目标，却是比较具体和容易实现的。这些是硬性指标，能够监测的。\n我反而对孩子有“软性要求”，我希望他有一些好品质，比如“遇到困难不放弃”，“坚持自己的想法”，或者“考虑别人的处境”等等。\n这些要求却不是容易的，一则没有清晰的界定，二则因为这些品质无法“教”。\n倘若一个富商从小教孩子要节俭，自己却花钱大手大脚，孩子又有近乎无限的资源，说再多也教不会。\n这种“软性要求”，除非身体力行，创建一个环境给孩子学习不可。比如如何克服困难，孩子自然是比照父母的应对方式，如果父母送他到其他环境，他的参照系也是身边的人居多。\n当然，也可以让孩子看书学习，但这与其他技能一样，纸上得来终觉浅，远没有亲身体验这么入心入脑，甚至成为习惯动作。\n所以，这种“软性要求”，对父母的要求非常高，既需要父母是个好榜样，也需要创造环境让孩子学习。换句话说，要“把手弄脏”，而不是找个老师给个课程表考个试。\n"},{"title":"人们可以接受蠢材，但不接受不负责任的蠢材。",
"url":"/shorts/ren-men-ke-yi-jie-shou-chun-cai-dan-bu-jie-shou-bu-fu-ze-ren-de-chun-cai/",
"date":"2025-02-14",
"headings":[],
"body":"地位和能力有关吗？\n非也，与责任有关。\n越高的地位，需要负越大的责任。比如骑士，比如总统，比如皇室。\n人们可以接受领导是蠢材吗？显然可以。但是，人们不能接受不负责任的领导。\n因此，所谓的“上位”并不是打怪升级，一点点锻炼能力就上去的，而更像是赌博。\n运气好的含着金钥匙出生，诞生之始就尊荣无限，运气不好的则赌一把，看看何时因为某事得到人群的注意，进而受到爱戴或被畏惧。\n这里可能和能力有关，也可能无关。与你的公共形象，造成的传媒效更有关系。\n"},{"title":"创新，往往始于模仿。",
"url":"/shorts/chuang-xin-wang-wang-shi-yu-mo-fang/",
"date":"2025-02-13",
"headings":[],
"body":"最近我学习了安卓和iOS开发，安卓从XML到Jetpack Compose，iOS从UIKit到SwiftUI，这些界面设计的演变都导向同一种代码风格——利用closure的概念，先绘制界面，再与业务逻辑结合。\n \n所以，学会了iOS开发，安卓开发也不难。\n \n尽管科技发展迅速，平台、语言和框架层出不穷，但这并不可怕。因为所有的创新，都是建立在“借鉴”之上。只要掌握一门扎实的基础，借助AI工具，很快就能掌握其他领域的知识。\n"},{"title":"如果让你写小说，是现实主义还是魔幻？",
"url":"/shorts/ru-guo-rang-ni-xie-xiao-shuo-shi-xian-shi-zhu-yi-huan-shi-mo-huan/",
"date":"2025-02-12",
"headings":[],
"body":"我看天龙八部时总不愉快，觉得段正淳真是一个败笔。\n现实中怎么可能都是他老婆，儿子刚好喜欢的人全是亲妹妹。\n不过，转念一想，如果写了小说，还是现实那一套，未免太过无聊。\n本来写小说就是想要跳脱现实，魔幻一次。\n这样一想，心下才比较痛快。\n"},{"title":"突然想起AI Pin和Rabbit R1了",
"url":"/shorts/tu-ran-xiang-qi-ai-pinhe-rabbit-r1liao/",
"date":"2025-02-12",
"headings":[],
"body":"一年过去了，这些AI硬件倒闭了吗？\n"},{"title":"金庸的厉害之处在武侠之外",
"url":"/shorts/jin-yong-de-li-hai-zhi-chu-zai-wu-xia-zhi-wai/",
"date":"2025-02-11",
"headings":[],
"body":"最近读鹿鼎记，金庸对明末争王和大清历史的刻画，让我回到读史的日子。\n金庸厉害的点不是武侠招数和故事，这点古龙也能办到。但对于历史、人文、地理等要素的处理，却是一个很高的综合能力。\n"},{"title":"照顾别人是一种能力",
"url":"/shorts/zhao-gu-bie-ren-shi-yi-chong-neng-li/",
"date":"2025-01-18",
"headings":[],
"body":"照顾别人是一种能力，不是意愿或特质。\n怎么说呢？\n比如，你在身体不好的时候，想要照顾别人，心想着，腿却迈不动，此为没有能力。\n既没有能力，再有心也没法照顾。\n说到照顾别人的情绪，自己若处理不好自己的，只能深陷自我，无法帮助和包容。\n现实来说，比如许多去上班的先生，明明看到老婆孩子需要帮助（比如生病），却无法照顾。\n事后妻子往往会埋怨丈夫不关心家庭，其实并非不关心，而是丧失照顾能力。因为要赚钱呀。\n但是，这远远不是事实，可能的事实是我们无法分辨出两者何为重要，何者紧急。\n多事而无法分身，往往是没有能力分辨轻重缓急的结果。\n所以，有时候别人无法照顾或者自己无法照顾别人的情况，可以想想能力，而非意愿。\n先学会照顾自己，方有照顾别人的能力。\n无法照料之时，也别惊慌，既是能力，便能锻炼。\n"},{"title":"代码编写规范是约束团队，不是约束个人的。",
"url":"/shorts/dai-ma-bian-xie-gui-fan-shi-yue-shu-tuan-dui-bu-shi-yue-shu-ge-ren-de/",
"date":"2025-01-17",
"headings":[],
"body":"关于代码编写规范\n现代编程，特别是大厂，自有一套规范。\n除了规定使用的元素风格，字体大小等设计元素外，还有编写代码的结构、语法等。\n我理解这些规范，却不能接受。\n我认为，这种规范更适合叫做“团队代码规范”，层层封装和抽象，事实上对团队是最有好处，各自负责自己的代码，不互相打扰，解耦程度高，确实容易维护，对公司更友好。\n个人养成这样的习惯，也能得到类似的好处，但是我觉得弊大于利。\n对个人来说，快速学习，快速搭建项目是重中之重，层层束缚会拖慢主要工程的进展，所以最近又听到人抱怨“Java是最丑陋的语言”。\n对个人而言，项目总是在可控范围内，代码用自己舒适的结构最佳。出现BUG，快速单屏定位也简单。\n至于个人项目变大了，那自然成为团队项目，自然是需要重构一番，采取“团队代码规范”。\n"},{"title":"金庸塑造了「扫地僧」的角色，实有深意。",
"url":"/shorts/jin-yong-su-zao-liao-sao-di-seng-de-jiao-se-shi-you-shen-yi/",
"date":"2025-01-17",
"headings":[],
"body":"天龙八部中，金庸塑造了「扫地僧」的角色。\n以前只道是为一时之爽，故意塑造一个底层人物，来羞辱天下武学大家。\n现在想来，不是。佛曰，众生平等。为何平等？我们的钱财生来不平等。\n但是，每个人都有思考的权力。一个讯息，一种规则，任凭你是多底层的人物，都不妨碍你思考任何高深的问题。\n思考的空间内是平等的，哪怕你是公司的螺丝钉，也不妨碍你去思考公司的利润来去，成本归属。\n另一层意思是，大道即简。最深奥的问题往往背后隐藏的是简单的道理，偏偏越学深越执拗，可能从一个「白丁」的眼里，却能抓住核心要义。\n任何组织制定一个规则，必定源于某个事件，针对某些群体。须得思考清楚，再知道如何应对。而埋没在「武功招式」下，则「不得佛法」。\n"},{"title":"其实开发任何应用，不管任何平台，掌握两门语言即可。  即UI语言+逻辑语言。",
"url":"/shorts/qi-shi-kai-fa-ren-he-ying-yong-bu-guan-ren-he-ping-tai-zhang-wo-liang-men-yu-yan-ji-ke-ji-uiyu-yan-luo-ji-yu-yan/",
"date":"2025-01-15",
"headings":[],
"body":"React的UI是变种html，逻辑是变种js\nVue的UI是变种html，逻辑是变种js\n小程序的UI是小变种html，逻辑是js\niOS的UI是SwiftUI/UIkit，逻辑是swift\n安卓的UI是Jetpack Compose/XML，逻辑是java/kotlin\nuni-app的UI是小变种html（与小程序一致），逻辑是变种js（与vue一致）\n综上，掌握html和js的好处最多，覆盖面最广，这两门语言是基础中的基础。（CSS不说，大多数人都是问AI的）\n逻辑语言其实也有共性，数据结构、条件判断、循环、列表、对象学完基本上就入门了，可以动手做了，可以触类旁通。\n当然，还有纯血鸿蒙尚未研究。\n"},{"title":"阮星竹的描写弱了",
"url":"/shorts/ruan-xing-zhu-de-miao-xie-ruo-liao/",
"date":"2025-01-14",
"headings":[],
"body":"作为阿朱阿紫的母亲，一点也不关心女儿，天天挂念着段郎。\n天龙八部，其他段正淳的女人也是如此，不符合常理。\n"},{"title":"读圣贤书，所谓何事？",
"url":"/shorts/du-sheng-xian-shu-suo-wei-he-shi/",
"date":"2025-01-08",
"headings":[],
"body":"读书来干嘛？\n古语有之，读圣贤书，所谓何事？为经国方略，为往圣继绝学。\n我们也曾嘲笑前辈“为中华崛起而读书”，似乎为强加身上的责任微感不屑。\n而如今，我们“自由”了，却为何读书？为找到一份工作？但这又未必确保是一份好工作。为陶冶性情？却又不如在社交媒体上多花时间装饰。\n读书无目的，不是不行，却似少了推动的引擎，自己磨磨洋工罢了。\n"},{"title":"做出一个判断，并证明自己的判断是正确的，真是中年男人的「春药」",
"url":"/shorts/zuo-chu-yi-ge-pan-duan-bing-zheng-ming-zi-ji-de-pan-duan-shi-zheng-que-de-zhen-shi-zhong-nian-nan-ren-de-chun-yao/",
"date":"2025-01-08",
"headings":[],
"body":"从其中获得的爽快感，我认为比买房买车更胜一筹。\n"},{"title":"做生意真的比打工好吗？",
"url":"/shorts/zuo-sheng-yi-zhen-de-bi-da-gong-hao-ma/",
"date":"2025-01-08",
"headings":[],
"body":"我其实挺奇怪“打工还是做生意”这个话题的。\n不管是媒体，长辈，还是朋辈，一致的意见都是“别打工，不要拿死工资，打工不好”，都说人要有雄心壮志创一番事业。\n我觉得奇怪，一则打工不好，为什么人人都在打工？你说他们没能力创业吧，买个车子出去摆个摊总行吧，既然打工万般不好，那有个机会不是要去试试吗？\n二则没什么人提到打工的好处，比如每个月相对稳定有人发钱，不用发愁管不住人，不用管理工商税务这些杂事，不用焦虑明天从哪里收钱等等。你说也不稳定呀，可你有更稳定的方式吗？\n不要相信人们所说的，要看他们所做的。\n"},{"title":"虚竹和石破天都受金庸的青睐。",
"url":"/shorts/xu-zhu-he-shi-po-tian-du-shou-jin-yong-de-qing-lai/",
"date":"2025-01-07",
"headings":[],
"body":"靠纯真获得好运气，是各大小说惯用伎俩，人们还是喜欢纯真的人。\n"},{"title":"短时间塞进许多刺激其实是在剥夺人的快乐。",
"url":"/shorts/duan-shi-jian-sai-jin-xu-duo-ci-ji-qi-shi-shi-zai-bo-duo-ren-de-kuai-le/",
"date":"2025-01-06",
"headings":[],
"body":"以后此人获得快乐会越来越困难。\n快乐可不是越多越好，也会 过重 。\n"},{"title":"媒体是放大器，并不传播真相。",
"url":"/shorts/mei-ti-shi-fang-da-qi-bing-bu-chuan-bo-zhen-xiang/",
"date":"2025-01-06",
"headings":[],
"body":"媒体即使在传播所谓的真相，也放大了它的效应。原本只能小范围传播的信息，现在有了放大的能力。\n因此，媒体也是武器。\n"},{"title":"游坦之对阿紫，段誉对王语嫣都是不值。",
"url":"/shorts/you-tan-zhi-dui-a-zi-duan-yu-dui-wang-yu-yan-du-shi-bu-zhi/",
"date":"2025-01-05",
"headings":[],
"body":"青年男人对女人纯粹的性冲动，往往不够理智，付出甚多而收获甚少。\n"},{"title":"我之所以错过互联网高速发展时期，是因为我没有看到外界的动向，一切的势头是这么的明显。",
"url":"/shorts/fan-si-cuo-guo-hu-lian-wang-de-yuan-yin/",
"date":"2025-01-03",
"headings":[{"level":1,"id":"fan-si-zai-ci-mei-zhua-zhu-ji-hui","permalink":"https://linxz.online/shorts/fan-si-cuo-guo-hu-lian-wang-de-yuan-yin/#fan-si-zai-ci-mei-zhua-zhu-ji-hui","title":"反思再次没抓住机会","children":[]}],
"body":"反思再次没抓住机会\n我没有抓住AI初期的机会，源于基本功不够扎实，传媒功底或者产品功底，既无法快速出好作品，也无法成功传播。\n"},{"title":"今天整理教程笔记的时候发现，我们大部分时间说的话，都没有意义。真正产生作用的只有少数的话。",
"url":"/shorts/jin-tian-zheng-li-jiao-cheng-bi-ji-de-shi-hou-fa-xian-wo-men-da-bu-fen-shi-jian-shuo-de-hua-du-mei-you-yi-yi-zhen-zheng-chan-sheng-zuo-yong-de-zhi-you-shao-shu-de-hua/",
"date":"2025-01-02",
"headings":[],
"body":"发现这个事实挺悲伤的，已浪费了不少时间。比如我观看3个小时的视频，最后能够记下来的可能只有100字。\n但是，我又挺开心的，其实人不必说这么多话的。不必逼自己多说话。\n"},{"title":"require是CommonJS标准，通常是node.js在用。",
"url":"/shorts/requireshi-commonjsbiao-zhun-tong-chang-shi-node-jszai-yong/",
"date":"2025-01-02",
"headings":[],
"body":"现在js一般是ES6标准，以 import 和  export 为主。\n其他标准，如AMD（Asynchronous Module Definition） 和 CMD（Common Module Definition） ，已经被淘汰。\n"},{"title":"企业为什么要选拔人？选拔的是那些不能教的品质：正直，勇敢，韧性等。",
"url":"/shorts/qi-ye-wei-shen-me-yao-xuan-ba-ren-xuan-ba-de-shi-na-xie-bu-neng-jiao-de-pin-zhi-zheng-zhi-yong-gan-ren-xing-deng/",
"date":"2025-01-01",
"headings":[],
"body":"大多数技能都可以习得，而品质靠的是影响。\n"},{"title":"只学有兴趣的知识是效率最高的，也是记得最牢的。",
"url":"/shorts/zhi-xue-you-xing-qu-de-zhi-shi-shi-xiao-lu-zui-gao-de-ye-shi-ji-de-zui-lao-de/",
"date":"2025-01-01",
"headings":[],
"body":"不必担心兴趣会让知识狭隘，学得越多，你想知道的就越多。\n"},{"title":"小程序开发以react和vue为基础。",
"url":"/shorts/xiao-cheng-xu-kai-fa/",
"date":"2024-12-31",
"headings":[{"level":1,"id":"kai-fa-yao-yi","permalink":"https://linxz.online/shorts/xiao-cheng-xu-kai-fa/#kai-fa-yao-yi","title":"开发要义","children":[]}],
"body":"开发要义\n掌握基础React和vue知识，开发就简单。\n"},{"title":"星宿派描写有趣，人人趋炎附势，不要脸，门规极端弱肉强食。",
"url":"/shorts/xing-su-pai-miao-xie-you-qu-ren-ren-qu-yan-fu-shi-bu-yao-lian-men-gui-ji-duan-ruo-rou-qiang-shi/",
"date":"2024-12-31",
"headings":[],
"body":""},{"title":"分工合作有利于效率，不利于目标。",
"url":"/shorts/fen-gong-he-zuo-you-li-yu-xiao-lu-bu-li-yu-mu-biao/",
"date":"2024-12-30",
"headings":[],
"body":"我们以为目标和效率是一体的，其实不然。\n看现代公司治理机制就知道。市场、营销、销售部门看似分得很清楚，但是谁负责活动里面的获客或者介绍？谁来负责串起一个活动？分工让每个人身上的担子小了，但是又会出现工作真空。\n比如分编程为前端和后端，这个有绝对定义吗？前端就不能传数据，后端就不能写界面？还是前端只需要实现界面就行？\n如果要完成一件事情，比如做个app，最快的方式就是一个人写完，不分前后端。\n"},{"title":"天龙八部描写恶毒女人精彩：康敏（马夫人）和阿紫",
"url":"/shorts/tian-long-ba-bu-miao-xie-e-du-nu-ren-jing-cai-kang-min-ma-fu-ren-he-a-zi/",
"date":"2024-12-30",
"headings":[],
"body":"都是成长经历的缺乏爱导致的。\n"},{"title":"被裁员的人失去的是安全感。",
"url":"/shorts/bei-cai-yuan-de-ren-shi-qu-de-shi-an-quan-gan/",
"date":"2024-12-28",
"headings":[],
"body":"我常常想，被裁员没什么不好的。当然前提是有补偿。\n今天看到微软大裁员，给n+1。技术行业一般都是1万打底，这不是有了小十万吗？至少比别人少奋斗一年了吧。多者那可能是别人十年的薪酬。\n网络上却是在鼓吹裁员的惨状，为啥？\n因为这没有了安全感，少了一个固定打钱的大户，重要的是，动摇正常生活节奏。从今天起，要思考新出路，找到新公司，面对新同事，这一切对于从未思考过这个问题的人来说是难题，甚至是折磨。\n最好的应对方式是【准备被裁】，时刻做好准备，总是预演甚至实践解决方案，这样，被裁反而成为锦上添花。\n"},{"title":"所谓专业，不是指能处理任何未知情况，而是心中有许多【组件】，能够根据情况快速拼接出解决方案。",
"url":"/shorts/suo-wei-zhuan-ye-bu-shi-zhi-neng-chu-li-ren-he-wei-zhi-qing-kuang-er-shi-xin-zhong-you-xu-duo-zu-jian-neng-gou-gen-ju-qing-kuang-kuai-su-pin-jie-chu-jie-jue-fang-an/",
"date":"2024-12-28",
"headings":[],
"body":""},{"title":"编程语言的核心不在语言本身，而是解决问题。",
"url":"/shorts/bian-cheng-yu-yan-de-he-xin-bu-zai-yu-yan-ben-shen-er-shi-jie-jue-wen-ti/",
"date":"2024-12-27",
"headings":[{"level":1,"id":"jie-jue-wen-ti-de-he-xin","permalink":"https://linxz.online/shorts/bian-cheng-yu-yan-de-he-xin-bu-zai-yu-yan-ben-shen-er-shi-jie-jue-wen-ti/#jie-jue-wen-ti-de-he-xin","title":"解决问题的核心","children":[]}],
"body":"解决问题的核心\n在于找出问题，无非是网络请求，数据连接这些需求，不必过于纠结其他内容。\n"},{"title":"经过大起大落，发现自己是普通人，总比一辈子自命不凡，哀叹时运不济好。总算有机会试过身手。",
"url":"/shorts/jing-guo-da-qi-da-luo-fa-xian-zi-ji-shi-pu-tong-ren-zong-bi-yi-bei-zi-zi-ming-bu-fan-ai-tan-shi-yun-bu-ji-hao-zong-suan-you-ji-hui-shi-guo-shen-shou/",
"date":"2024-12-27",
"headings":[],
"body":""},{"title":"Mac没有加入开发者计划（99美金），可以本地运行，只需要在签名选择“sign in to run locally”即可。",
"url":"/shorts/macmei-you-jia-ru-kai-fa-zhe-ji-hua-99mei-jin-ke-yi-ben-di-yun-xing-zhi-xu-yao-zai-qian-ming-xuan-ze-sign-in-to-run-locally-ji-ke/",
"date":"2024-12-27",
"headings":[{"level":1,"id":"xode-fang-fa","permalink":"https://linxz.online/shorts/macmei-you-jia-ru-kai-fa-zhe-ji-hua-99mei-jin-ke-yi-ben-di-yun-xing-zhi-xu-yao-zai-qian-ming-xuan-ze-sign-in-to-run-locally-ji-ke/#xode-fang-fa","title":"xode 方法","children":[]}],
"body":"xode 方法\nProduct - Archive - custom - copy app\n"},{"title":"Mac形成App时，记得在build phase把依赖包都勾选到，否则不会打包依赖package dependencies",
"url":"/shorts/macxing-cheng-appshi-ji-de-zai-build-phaseba-yi-lai-bao-du-gou-xuan-dao-fou-ze-bu-hui-da-bao-yi-lai-package-dependencies/",
"date":"2024-12-27",
"headings":[{"level":1,"id":"xian-zai-ye-hui-kai-fa-macde-appliao","permalink":"https://linxz.online/shorts/macxing-cheng-appshi-ji-de-zai-build-phaseba-yi-lai-bao-du-gou-xuan-dao-fou-ze-bu-hui-da-bao-yi-lai-package-dependencies/#xian-zai-ye-hui-kai-fa-macde-appliao","title":"现在也会开发Mac的App了","children":[]}],
"body":"现在也会开发Mac的App了\n只不过没有加入开发者计划，还是不能分发，只能本地用了。\n"},{"title":"最近在装修，对「草台班子」理论感触颇深。你以为对接的是专业团队，想不到大家都差不多，都是边干边想，区别只是经验的多少而已。",
"url":"/shorts/zui-jin-zai-zhuang-xiu-dui-cao-tai-ban-zi-li-lun-gan-hong-po-shen-ni-yi-wei-dui-jie-de-shi-zhuan-ye-tuan-dui-xiang-bu-dao-da-jia-du-chai-bu-duo-du-shi-bian-gan-bian-xiang-qu-bie-zhi-shi-jing-yan-de-duo-shao-er-yi/",
"date":"2024-12-27",
"headings":[],
"body":"专业等于经验多吗？肯定不是，而是遇到情况能够进行专业思考，并能靠已有和未知的方法去解决问题。\n经验多是专业的必要条件，但是不是充分条件。\n专业这个词也很难界定，主观层面上讲，我希望面前的人能够解决我的问题，才叫专业。\n"},{"title":"不知道该干什么的时候，就跟着别人干呗。等知道自己想干啥时，就干那个事情好了。没什么可纠结的。",
"url":"/shorts/bu-zhi-dao-gai-gan-shen-me-de-shi-hou-jiu-gen-zhao-bie-ren-gan-bai-deng-zhi-dao-zi-ji-xiang-gan-sha-shi-jiu-gan-na-ge-shi-qing-hao-liao-mei-shen-me-ke-jiu-jie-de/",
"date":"2024-12-24",
"headings":[],
"body":""},{"title":"苹果开发者计划太难注册了。",
"url":"/shorts/ping-guo-kai-fa-zhe-ji-hua-tai-nan-zhu-ce-liao/",
"date":"2024-12-23",
"headings":[],
"body":"应该和我登录过美区ID有关。\n客服做不了任何事情。\n需要用新设备新id注册，或者用家里人手机id。\n"},{"title":"最近重读《天龙八部》，惊觉它的创作年份是1963年，竟是61年前。我从小看，青年读，中年读，均不过时。经典永存。",
"url":"/shorts/jinyong-creations/",
"date":"2024-12-22",
"headings":[],
"body":"我认为这样的通俗作品不愧为「华人之光」，我也想拥有这样经久不衰的作品。\n"},{"title":"第二十二条军规的意思：制定不存在的规则。",
"url":"/shorts/catch-22/",
"date":"2024-12-20",
"headings":[],
"body":"今天看到一篇微信公众号文章，讲的是美国的政治正确，把它说成第二十二条军规，无所不在，却没有标准。\n二十二条军规意思是：\n疯子可以免于飞行，但同时又规定必须由本人提出申请，而如果本人一旦提出申请，便证明其并未变疯。\n这条规则本来是用来显示领导的「宽宏大量」,但是其实不想有人执行。\n这条军规，便是一种不存在的规则，充满荒诞。\n"},{"title":"AI prompt 工程师 vs 高达驾驶员",
"url":"/shorts/ai-prompt-engineer-gundam-driver/",
"date":"2024-12-05",
"headings":[],
"body":"之前觉得AI Prompt工程师没啥用。等AI应用起来了，普通人和AI直接不存在桥梁了，要中间层干嘛？\n今晚倒是想通了。即使遍地都是高达，普通人就会驾驶高达了吗？\n首先，高达碍于成本问题，肯定不是每人一架，再者，高达也是分等级的，越高级功能越多，驾驶起来也越复杂，需要一个更好的驾驶员。\n我们要做的事很简单，看到高达，努力坐上高达，锻炼驾驶高达的本领。而老板们，直接把高达和驾驶员买下来，就拥有破坏世界的能力。\n"},{"title":"心灵镜头的「拉近」和「拉远」。人到中年，觉得很多以前重视的东西都无所谓了。",
"url":"/shorts/mind-zoom-in-and-out/",
"date":"2024-12-05",
"headings":[],
"body":"人到中年，觉得很多以前重视的东西都无所谓了，这是“镜头拉远”了，如果站在人生之长看现在，自然无足轻重。\n我想，许多伟大的人为什么会有卓越的眼光，源于他们能够“拉远”视角，去聚焦和坚持真正影响历史的事情。\n不过，视角拉远，沉浸感就弱。比如听长辈说了无数遍创业和养娃的艰辛，还不如自己实实在在来一遍。\n很多培训之所有有效果，其实在于“封闭”，他们让参会者尽可能聚焦现在或者会场，就会觉得眼前的事情无比重要。\n要放在社会视角，可能真的不重要。\n"},{"title":"说说吴柳芳说的“改命”。",
"url":"/shorts/shuo-shuo-wu-liu-fang-shuo-de-gai-ming/",
"date":"2024-12-04",
"headings":[],
"body":"今天我看到一个分析“再见爱人”的视频，说从财富观看几个家庭，麦琳属于穷人家，留几手夫妇属于中产，杨子夫妇属于高产，一开头就分好类了，然后就说中产的天花板云云。\n我想，这个便是吴柳芳口中的“命”，穷人家即使穷尽智慧，也无法翻身，或者说“跨越阶级”。\n我觉得这个思维蛮危险的，这种所谓的“命”一般是小说家安的人物身上的，开场就交代好家世背景和性格特点，所以“一种人只会有一种命运”。而当个人把这种“命”套在自己身上时，不免会有元素错位，让人徒增悲伤。\n比如，一个认为自己是“中产命”的人，一辈子可能都要为没有一处房子懊悔。更可怕的是，他不敢冒险，因为觉得自己没有“高产命”。\n倪匡先生在卫斯理系列多次探讨“命运”的话题。他认为，命运是中国传统文化重要的组成部分，各种算命玄学也很深奥。但是，知晓自己的命运一点都不好玩。\n为什么呢？因为如果知道了，活着还有什么意思呢？就是一个已知故事情节的小说而已，就算是“好命”也不值得过。\n命运可以改吗？假设可以“改命”，那这个命运就不成立了。这是算错的命。\n所以，命是知道还是不知道好？命可改还是不可改？\n"},{"title":"如何巩固知识？准备知识、教授知识、类比知识。",
"url":"/shorts/knowledge-solidify/",
"date":"2024-12-03",
"headings":[{"level":1,"id":"zhun-bei-zhi-shi","permalink":"https://linxz.online/shorts/knowledge-solidify/#zhun-bei-zhi-shi","title":"准备知识","children":[]},{"level":1,"id":"jiao-shou-zhi-shi","permalink":"https://linxz.online/shorts/knowledge-solidify/#jiao-shou-zhi-shi","title":"教授知识","children":[]},{"level":1,"id":"lei-bi-zhi-shi","permalink":"https://linxz.online/shorts/knowledge-solidify/#lei-bi-zhi-shi","title":"类比知识","children":[]}],
"body":"准备知识\n包含搜索资料，形成课件。\n教授知识\n将你所学讲出来。\n类比知识\n将知识类比成你熟悉的东西。\n"},{"title":"「血脉论」还挺有意思的",
"url":"/shorts/blood/",
"date":"2024-11-22",
"headings":[],
"body":"魔戒故事中，比尔博·巴金斯是巴金斯家的人，更是一个霍比特人，这样的基因和环境注定他是一个安定、保守、不愿冒险的人。\n可是，他的母亲一支是「图克」家族的人，这是一个以勇敢和冒险闻名的家族。只要他有这支血脉，总有一天他的基因会觉醒，带着他去冒险。\n其实，人本身就有好奇心，也有冒险的冲动，但却用「血脉」做借口。\n表面上这是激发了此人的潜能，实际上是深深的自我暗示。\n你操控了潜意识，让它相信你有冒险的基因，又反被潜意识操控，让你隐约认为自己该勇敢地踏上旅程。\n"},{"title":"培训课程设计，可增加【学习心态】小节。",
"url":"/shorts/learningmind/",
"date":"2024-11-21",
"headings":[],
"body":"参见Angela的ios课程\n"},{"title":"我要做app",
"url":"/shorts/app/",
"date":"2024-11-20",
"headings":[],
"body":"同步日记本。做到了。\n"},{"title":"AI时代的编程项目，先做出来，再学习。",
"url":"/shorts/dofirst/",
"date":"2024-11-20",
"headings":[],
"body":"现在总是先做出来项目，再思考代码的意思。\n"},{"title":"即使是互联网时代，出卖信息还是一门很好的生意。",
"url":"/shorts/sell-information/",
"date":"2024-11-19",
"headings":[],
"body":"比如，AI媒体的出现；公司高管对消息的把控。\n把握人性：人们热衷新信息，人们爱八卦，人们会FOMO。\n出卖信息不适合我，需要时时追踪最新的消息，耗费心神，追赶信息让我感觉不到收获。\n"},{"title":"一本书并不只是一本书。略读、慢读、细读、品读都可以算是完全不同的书。",
"url":"/shorts/reading-books/",
"date":"2024-11-18",
"headings":[],
"body":"最近重读《笑傲江湖》，发现完全是一本不一样的书。\n以前只道令狐冲是好人，岳不群是坏人，令狐冲潇洒，岳不群古板。\n最近一看，令狐冲和以琳相处细节，可以看出人与人相互理解的难度；岳不群作为一派宗师，没受过啥挫折的典型，确实做得还可以了。\n所以，不用老是追求新书。书贵精不贵多，经常读，细细读就可以了。\n"},{"title":"我对别人没有期待。为什么对自己的期待这么高？对自己的作品总不满意。",
"url":"/shorts/expectation/",
"date":"2024-11-15",
"headings":[{"level":2,"id":"yi-chu","permalink":"https://linxz.online/shorts/expectation/#yi-chu","title":"益处","children":[]},{"level":2,"id":"hai-chu","permalink":"https://linxz.online/shorts/expectation/#hai-chu","title":"害处","children":[]},{"level":2,"id":"zen-me-zuo","permalink":"https://linxz.online/shorts/expectation/#zen-me-zuo","title":"怎么做？","children":[]}],
"body":"小时候，我总是期待自己能够考上清华或者北大，而无视我的教育环境和应该付出的努力。\n这样的期待既有益又有害。\n益处\n\n很强的责任感和追求卓越的倾向，促使你不断进步。\n\n害处\n\n过度苛责自己，不必要的内耗。\n容易把自己价值和工作成果挂钩，产生自我怀疑。\n过度比较，用别人的成就要求自己。\n过度害怕失败，唯成果论。\n\n怎么做？\n\n\n拆分目标，大目标变小目标。关注 过程 ，而不是 结果 。\n\n\n反思自己的标准，以自己兴趣为主，不要在乎社会标准。\n\n\n失败并不可怕，就是旅途必经之路。\n\n\n"},{"title":"《三体》故事中，我印象最深的是章北海，他的思维很特别，源于他的教育方式，父亲总是告诉他，「要多想」，不是多说或者多做。",
"url":"/shorts/three-body-think-more/",
"date":"2024-11-08",
"headings":[],
"body":"我理解的「多想」是在生活中多思考，虽然偏离了原文的意思。原文的背景是三体人已经派出 智子 来监视地球，所以不能把自己的想法说出来，父亲就让他想，想了就去做。原意应该是要掩盖自己的想法。\n但是，我觉得生活中要多想，才能想出与众不同的办法，这其实也呼应了原文，最后章北海意想不到的 逃亡主义 方案正是多想的结果，毫无意外地成为了一群没有想法的人的领袖。\n"},{"title":"任何产品的设计原则：可靠的、好看的、容易使用的。",
"url":"/shorts/design-principle/",
"date":"2024-10-22",
"headings":[],
"body":""},{"title":"所有大富大贵的人（地区）旁边都有一些羡慕得眼红的人，他们很可能不计成本地改变自己的处境，去投资他们，或者，和他们在一起。",
"url":"/shorts/new-money/",
"date":"2024-10-22",
"headings":[],
"body":""},{"title":"不知道是倪匡抄三体，还是大刘抄卫斯理，贝壳和三体中，外星文明与人类接触的都是日本人。",
"url":"/shorts/three-body-japanese/",
"date":"2024-10-22",
"headings":[],
"body":""},{"title":"放大视角对「看全」很重要",
"url":"/shorts/vision/",
"date":"2024-10-22",
"headings":[],
"body":"开车时，外面指挥的人比司机自信，因为第一人称视角和第三人称的区别，可以看到周围。\n上帝视角（2D）可以看到更多。\n人最幸福的事情是有“沉浸式视角”，但也是最大的不幸。\n"},{"title":"「久旱逢甘霖」才是幸福。",
"url":"/shorts/happiness-real/",
"date":"2024-10-20",
"headings":[],
"body":"普通的幸福很容易沦为「普通」。\n因此富人才会去「找罪受」。\n"},{"title":"讲故事挺难的。读别人的故事很轻巧，只要用「读不读得下去」的标准评判就好了。但是，轮到自己写了，就会发现很难下笔，先讲什么，后讲什么，人物要改什么名字，都很头疼。",
"url":"/shorts/story-telling/",
"date":"2024-10-17",
"headings":[{"level":1,"id":"xie-gu-shi-de-fang-fa","permalink":"https://linxz.online/shorts/story-telling/#xie-gu-shi-de-fang-fa","title":"写故事的方法","children":[{"level":2,"id":"5w1h","permalink":"https://linxz.online/shorts/story-telling/#5w1h","title":"5W1H","children":[]}]}],
"body":"你大可以用「重写一篇故事」来测试。拿一个欧美发生的故事，重新写情节，人物都换成中文名，要求用最简洁的章节表达你学到的内容，这样可以测试一下你写故事的能力，说者容易做者难。\n写故事的方法\n5W1H\nWhat Why Who Where When How\n如果你是总结知识，2W1H就可以了：What Why How\n"},{"title":"快速判断的能力与优先度的明确有关。",
"url":"/shorts/judge-fast/",
"date":"2024-10-16",
"headings":[],
"body":"判断能力，或者说决策能力。\n另外，精于概算的人能更快速判断。也许因为判断需要参考数字，而越快算出来的人，越容易进入判断模式。\n"},{"title":"我擅长念书可能是因为我不喜欢用脑。确切来说，不喜欢主动用脑。",
"url":"/shorts/active-mind/",
"date":"2024-10-14",
"headings":[],
"body":"念书时，有固定的规则和答案，我不用思考做什么，照着规则做就好了。因此我就很舒服，研究规则就行了。\n在这方面，我可能还是比较聪明的。\n不过，当自由后，要思考自己干什么的时候，我可能就不擅长了。\n"},{"title":"年龄增长后，愈发不会迷恋异性。年轻时迷恋异性应该是进化的需要。",
"url":"/shorts/obssession/",
"date":"2024-10-14",
"headings":[],
"body":""},{"title":"成功和责任是最相关的，与智力关系不大。",
"url":"/shorts/success-and-responsibility/",
"date":"2024-10-14",
"headings":[],
"body":"比如身居高位的人，他不一定比你更聪明。但他肩负的责任必定比你更大。\n同样，他们要承担更大的风险。比如说，项目失败了，他第一个要走人。\n因此，把责任转嫁给低收入人群，是很不道德的。因为这本来就是收入的一部分。\n你并不是比别人聪明，而是你肩负了更多的责任。\n"},{"title":"智能抠图网站：remove.bg",
"url":"/shorts/background-remover/",
"date":"2024-10-13",
"headings":[],
"body":"效果不错。比百度的AI抠图效果好。\n适合一键去背景，一键抠图。\nremovebg\n"},{"title":"拥有房子和车子并不能使我更开心，但能够使家人开心，这样我就会开心。",
"url":"/shorts/happy-reason/",
"date":"2024-10-13",
"headings":[],
"body":""},{"title":"看到一篇很好的博客-guangzhengli，关于独立开发者的技术栈，强推nextjs和cloudflare.",
"url":"/shorts/independent-developer/",
"date":"2024-10-12",
"headings":[],
"body":"这是博客地址。\n这个博客还有很多相当好的文章，我的向量数据库知识也是在这里学的。\n"},{"title":"做个「老年人」越来越难。父母60岁想走爱心通道，机场工作人员说70岁才算老人。",
"url":"/shorts/aged/",
"date":"2024-10-11",
"headings":[],
"body":"这次国庆返乡，两个长辈都说，靠年轻人赚钱不可能了，自己要会赚，赚了还要给孩子钱。\n"},{"title":"飞机高铁A/F座位靠窗，C/D座位靠过道。",
"url":"/shorts/seats/",
"date":"2024-10-11",
"headings":[],
"body":"典型的飞机座位一排6个，三三分，ABC DEF。\n高铁座位遵照飞机惯例，但是一排5个。\n为了不影响D和F靠过道和靠窗的含义，就去掉E。因此，高铁座位没有E。\n"},{"title":"服务器是什么？是一部永不关机的电脑。因为网站托管需要不关机，任何人任何地点都能上网。",
"url":"/shorts/server/",
"date":"2024-10-11",
"headings":[],
"body":"事实上，服务器也不是永不关机。我们也是可以关机的，但是对比日常使用的电脑，显然服务器的稳定性更高，更适合长时间运行。\n"},{"title":"身体是自己的。世上没有任何医生或者大夫会为你全权负责。自己要学习。",
"url":"/shorts/disease/",
"date":"2024-10-02",
"headings":[],
"body":""}],
"sections":[]},{"entry":{"title":"吾本布衣，亦凡学子。",
"url":"/about/",
"date":"",
"headings":[],
"body":"得君关注，岂不幸哉？\n小红书：\n长期腰颈酸痛委员\n小红书号：color_fool\n\n\n"},
"pages":[],
"sections":[]},{"entry":null,
"pages":[{"title":"《鹿鼎记》",
"url":"/books/lu-ding-ji/",
"date":"2025-02-11",
"headings":[{"level":3,"id":"jin-yong-zuo-pin-ji-xin-xu","permalink":"https://linxz.online/books/lu-ding-ji/#jin-yong-zuo-pin-ji-xin-xu","title":"“金庸作品集”新序","children":[]}],
"body":"“金庸作品集”新序\n\n那文士提笔蘸上了墨，在纸上写了个“鹿”字，说道：“鹿虽是庞然大物，性子却极和平，只吃青草树叶，从不伤害别的野兽。凶猛的野兽要伤它吃它，它只有逃跑，倘若逃不了，便只有给人家吃了。”又写了“逐鹿”两字，说道：“因此古人常常拿鹿来比喻天下。世上百姓都温顺善良，只有给人欺压残害的份儿。《汉书》上说：‘秦失其鹿，天下共逐之。’那就是说，秦朝失了天下，群雄并起，大家争夺，最后汉高祖打败了楚霸王，就得了这只又肥又大的鹿。”\n\n\n2025-02-07 09:18:12\n\n逐鹿中原\n"},{"title":"《天龙八部》",
"url":"/books/demi-gods-and-semi-devils/",
"date":"2024-12-17",
"headings":[{"level":3,"id":"yi-wu-guan-yao","permalink":"https://linxz.online/books/demi-gods-and-semi-devils/#yi-wu-guan-yao","title":"一五 灌药","children":[]},{"level":3,"id":"yi-qi-qing-xin","permalink":"https://linxz.online/books/demi-gods-and-semi-devils/#yi-qi-qing-xin","title":"一七 倾心","children":[]}],
"body":"一五 灌药\n\n“天龙八部”都是“非人”，包括八种神道怪物，因为以“天”及“龙”为首，所以称为“天龙八部”。八部者，一天，二龙，三夜叉，四乾达婆，五阿修罗，六迦楼罗，七紧那罗，八摩呼罗迦。\n\n\n2024-12-11 18:59:44\n\n天龙八部不是人\n\n天”是指天神。在佛教中，天神的地位并非至高无上，只不过比人能享受到更大、更长久的福报而已。佛教认为一切事物无常，天神的寿命终了之后，也是要死的。天神临死之前有五种征状：衣裳垢腻、头上花萎、身体臭秽、腋下汗出、不乐本座（第五个征状或说是“玉女离散”），这就是所谓“天人五衰”，是天神最大的悲哀。帝释是众天神的领袖。\n\n\n2024-12-11 19:00:21\n\n帝释是天神的领袖\n一七 倾心\n\n抱膝坐下，静观湖上月色，四下里清冷幽绝，心想：“‘有志者事竟成’，这话虽不错，可是孔夫子言道：‘知之者不如好之者，好之者不如乐之者。’这话更合我脾胃。爹爹妈妈常叫我‘痴儿’，说我从小对喜爱的事物痴痴迷迷，说我七岁那年，对着一株‘十八学士’茶花从朝瞧到晚，半夜里也偷偷起床对着它发呆，吃饭时想着它，读书时想着它，直瞧到它谢了，接连哭了几天。后来我学下棋，又是废寝忘食，日日夜夜，心中想着的便是一副棋枰，别的什么也不理。这一次爹爹叫我开始练武，恰好我正在研读《易经》，连吃饭时筷子伸出去夹菜，也想着这一筷的方位是‘大有’呢还是‘同人’。我不肯学武，到底是为了不肯抛下《易经》不理呢，还是当真认定不该学打人杀人的法子？爹爹说我‘强辞夺理’，只怕我当真有点强辞夺理，也未可知。妈最明白我的脾气，劝我爹爹说：‘这痴儿哪一天爱上了武功，你就是逼他少练一会儿，他也不会听。他此刻既不肯学，硬揿着牛头喝水，终究不成。’唉，要我立志做什么事可难得很，倒盼望我哪一天迷上了练武，爹爹、妈妈，还有伯父，自然欢喜得很。我练好了武功，不打人、不杀人就是了，练武也不是非杀人不可。伯父武功这样高强，他性子仁慈，只怕从来没出手杀过一个人。只不过他要杀人，又怎用得着亲自动手？”\n\n\n2024-12-13 08:26:04\n\n物痴\n\n钟万仇一怔，明白妻子是说笑，当即捧腹狂笑。这一大笑，伤口中鲜血更似泉涌。\n钟夫人流泪道：“怎……怎么是好？”钟万仇大喜，伸手揽住她腰，道：“阿宝，你为我这么耽心，我便立时死去，也不枉了。”钟夫人晕生双颊，轻轻推开了他，道：“段公子在这儿，你也这么疯疯颠颠的。”钟万仇呵呵而笑，笑几声，咳几下。\n\n\n2024-12-13 08:27:41\n\n情痴 中年犯 很是可怕\n"},{"title":"《侠客行》",
"url":"/books/xia-ke-xing/",
"date":"2024-12-06",
"headings":[],
"body":"金庸先生在后记写道，他最近研究金刚经，悟出世间无相的道理。石破天其人简单，看事情简单，因此能够悟出最深奥的道理。\n双胞胎认错人这种剧情没啥复杂的，他想写的是石清夫妇爱子之情，旁人由爱生恨的情绪。\n"},{"title":"《笑傲江湖》",
"url":"/books/smiling-proud-wanderer/",
"date":"2024-11-11",
"headings":[{"level":1,"id":"jin-yong-xian-sheng-zhen-you-wen-hua","permalink":"https://linxz.online/books/smiling-proud-wanderer/#jin-yong-xian-sheng-zhen-you-wen-hua","title":"金庸先生真有文化","children":[]},{"level":1,"id":"xin-li-zi-xun-shi-shi-jiao-xia-de-yue-bu-qun","permalink":"https://linxz.online/books/smiling-proud-wanderer/#xin-li-zi-xun-shi-shi-jiao-xia-de-yue-bu-qun","title":"心理咨询师视角下的岳不群","children":[]},{"level":1,"id":"ren-ying-ying-de-xing-ge-ke-hua-bu-hao","permalink":"https://linxz.online/books/smiling-proud-wanderer/#ren-ying-ying-de-xing-ge-ke-hua-bu-hao","title":"任盈盈的性格刻画不好","children":[]},{"level":1,"id":"zhong-nian-ren-kan-xiao-ao-jiang-hu","permalink":"https://linxz.online/books/smiling-proud-wanderer/#zhong-nian-ren-kan-xiao-ao-jiang-hu","title":"中年人看笑傲江湖","children":[]},{"level":1,"id":"yong-ni-xi-huan-de-fang-shi-du-guo-yi-sheng-vs-xiao-ao-jiang-hu","permalink":"https://linxz.online/books/smiling-proud-wanderer/#yong-ni-xi-huan-de-fang-shi-du-guo-yi-sheng-vs-xiao-ao-jiang-hu","title":"用你喜欢的方式度过一生 vs 笑傲江湖","children":[]},{"level":1,"id":"xiao-ao-jiang-hu-yu-di-su-xiao-shuo","permalink":"https://linxz.online/books/smiling-proud-wanderer/#xiao-ao-jiang-hu-yu-di-su-xiao-shuo","title":"笑傲江湖与低俗小说","children":[{"level":3,"id":"wu-zhi-shang","permalink":"https://linxz.online/books/smiling-proud-wanderer/#wu-zhi-shang","title":"五 治伤","children":[]},{"level":3,"id":"qi-shou-pu","permalink":"https://linxz.online/books/smiling-proud-wanderer/#qi-shou-pu","title":"七 授谱","children":[]},{"level":3,"id":"ba-mian-bi","permalink":"https://linxz.online/books/smiling-proud-wanderer/#ba-mian-bi","title":"八 面壁","children":[]},{"level":3,"id":"yi-0-chuan-jian","permalink":"https://linxz.online/books/smiling-proud-wanderer/#yi-0-chuan-jian","title":"一〇 传剑","children":[]},{"level":3,"id":"yi-san-xue-qin","permalink":"https://linxz.online/books/smiling-proud-wanderer/#yi-san-xue-qin","title":"一三 学琴","children":[]}]}],
"body":"金庸先生真有文化\n昨天我看到潇湘一词，觉得和湖南可能有关系，一查果然指的是湖南湘江一带。\n衡山派位于湖南，掌门莫大先生叫做潇湘夜雨，刚好也是一首诗词，这种种联想，一定是因为腹有诗书之故。\n当然，也可能是写的时候查阅书籍。但是书中五岳各派特点，可能也不是临时起意，肯定胸中有七八成墨水了。\n五岳山脉位置\n心理咨询师视角下的岳不群\n其实岳不群做得还可以了。\n一个比自己名头响得多的徒弟，所到之处、所遇之人尽是对徒弟的恭维，对师父本人的不屑。\n雨夜突遭围攻，作为武林大派掌门，练就多年武功，心高气傲，却发现斗不过十五个无名小卒，差点眼睁睁看着妻女受辱。\n而被自己的徒弟，救了整个门派的性命，却不肯透露任何消息。\n一般人如何受得了？没得抑郁症就很不错了。你说他遁入邪道，强抢剑谱，又如何？一个普通人受此屈辱，忍辱偷生已是极强心力，何况贵为一派宗师？\n如果手下有令狐冲如此高徒，一个师父很难可以做得漂亮、豁达。\n已经很不错了。\n捧得越高，摔得越重。\n任盈盈的性格刻画不好\n任盈盈的刻画不如赵敏，甚至不如岳灵珊。\n一个骄横跋扈的姑娘，怎么可能遇到一个喜欢的人，突然变成另一个人，并在男方总想起其他女人的时候，还安慰男方。\n一个只为令狐冲描写的配角，没有性格亮点。不像一个真实的人。说是御姐，总是在令狐冲旁边像小女人，说像女孩，却总是深谋远虑，纯粹是为了推动故事发展安插的角色。\n中年人看笑傲江湖\n对令狐冲没有了兴趣，反而总是为岳不群打抱不平。\n论计谋心计，令狐冲与岳不群差得甚远。比如说明明对令狐冲恨得不行，为了五岳大计，却甘能忍让，冲儿前冲儿后，情同父子等肉麻话一句接一句，武功不如人，却能稳准狠地拿捏令狐冲的痛处（用今天的话讲，原生家庭不幸？）。\n种种名誉好处，本是非他不可。又能忍有把握人性，焉能不成功？可惜令狐冲的运气太好，完全靠着机缘前进，可谁又有如此幸运呢？\n岳不群输得太冤。\n用你喜欢的方式度过一生 vs 笑傲江湖\n当年明月在《明朝那些事儿》中，以徐霞客“用你喜欢的方式度过一生”的故事作为恢弘历史的结尾，和《笑傲江湖》有异曲同工之妙。\n金庸先生在《笑傲江湖》的后记写道，左冷禅、岳不群、方证大师等人都是政治人物，甚至连劳德诺、林平之等人也是政治，唯独令狐冲是个「隐士」。\n他的原意便是写政治，主角就是左冷禅、岳不群等人，可是写着写着，却被刘正风、令狐冲这类「追求自由」的理想吸引。\n身在江湖，却在江湖之外。\n笑傲江湖与低俗小说\n笑傲江湖和低俗小说有什么共同点？\n都是小人物开局，占了极大篇幅。\n低俗小说的文森特，笑傲江湖的小林子，出场都是主角叙事。可到后来，发现他们居然是故事的小人物，这种叙事结构确实妙极。\n此后，笑傲江湖急转，以令狐冲为主角完成故事。而昆汀因为电影的形式，居然创出个无主角的结构，或说人人皆主角的结构，倒是和冰与火之歌一个类型，更是为妙。\n但这也与华山派的“剑宗”和“气宗”类似，在结构（招式）上出彩，未必见得内力（故事）精湛。\n但两大宗派，各有千秋，各有拥护者。\n\n五 治伤\n\n仪琳见他脸色不快，不敢再说，依言向左首寻去。走出二里有余，果见数亩瓜田，累累的生满了西瓜，树颠蝉声鸣响，四下里却一个人影也无，寻思：“令狐师兄要吃西瓜。可是这西瓜是有主之物，我怎可随便偷人家的？”快步又走出里许，站到一个高冈之上，四下眺望，始终不见有人，连农舍茅屋也不见一间，只得又退了回来，站在瓜田之中，踟蹰半晌，伸手待去摘瓜，又缩了回来，想起师父谆谆告诫的戒律，决不可偷盗他人之物，欲待退去，脑海中又出现了令狐冲唇干舌燥的脸容，咬一咬牙，双手合什，暗暗祝祷：“菩萨垂鉴，弟子非敢有意偷盗，实因令狐师兄……令狐师兄要吃西瓜。”转念一想，又觉“令狐师兄要吃西瓜”这八个字，并不是什么了不起的理由，心下焦急，眼泪已夺眶而出，双手捧住一个西瓜，向上一提，瓜蒂便即断了，心道：“人家救你性命，你便为他堕入地狱，永受轮回之苦，却又如何？一人作事一身当，是我仪琳犯了戒律，这与令狐师兄无干。”捧起西瓜，回到令狐冲身边。\n令狐冲于世俗的礼法教条，从来不瞧在眼里，听仪琳说要向人化缘讨西瓜，只道这小尼姑年轻不懂事，浑没想到她为了采摘这个西瓜，心头有许多交战，受了这样多委屈，见她摘了西瓜回来，心头一喜，赞道：“好师妹，乖乖的小姑娘。”\n\n\n2024-11-10 17:17:37\n\n为什么说人无法互相理解。令狐冲是江湖人，藐视一切世俗规条，他以为偷西瓜就是一件出手即来的事，哪知道对于从小法门长大的仪琳，却是天人交战几百回。伴侣之间需要互相理解也是此道，不要以为对方做的是一件小事。\n七 授谱\n\n岳不群见他脸色犹豫，显然对自己的话并未深信，又问：“冲儿，此事关系到我华山一派的兴衰荣辱，也关系到你一生的安危成败，你不可对我有丝毫隐瞒。我只问你，今后见到魔教中人，是否嫉恶如仇，格杀无赦？”\n令狐冲怔怔的瞧着师父，心中一个念头不住盘旋：“日后我若见到魔教中人，是不是不问是非，拔剑便杀？倘若曲老前辈和曲非烟这小姑娘没死，我是不是见了便杀？”他自己实在不知道，师父这个问题当真无法回答。\n\n\n2024-11-12 08:17:24\n\n对已有江湖地位的人而言，立场比观点重要。\n八 面壁\n\n令狐冲默然不语，突然之间，心中涌现了一股说不出的烦扰，一只粽子只吃了两口，手中拿着半截粽子，只感一片茫然。\n岳灵珊拉了拉他衣袖，笑道：“大师哥，你把舌头吞下肚去了吗？怎地不说话了？”令狐冲一怔，将半截粽子送到口中，粽子清香鲜美，但黏在嘴里，竟没法下咽。岳灵珊指住了他，格格娇笑，道：“吃得这般性急，黏住了牙齿。”令狐冲脸现苦笑，努力把粽子吞下咽喉，心想：“我恁地傻！小师妹爱玩，我又不能下崖，她便拉林师弟作伴，那也寻常得很，我竟这等小气，为此介意！”言念及此，登时心平气和，笑道：“这只粽子定是你裹的，裹得也真黏，可将我牙齿和舌头都黏在一起啦。”岳灵珊哈哈大笑，隔了一会，说道：“可怜的大师哥，在这崖上坐牢，馋成了这副样子。”\n\n\n2024-11-12 08:40:21\n\n年轻人恋爱的毛病，总以为对方属于自己一个人。\n一〇 传剑\n\n风清扬拍手赞道：“对，对！孺子可教。‘料敌机先’这四个字，正是这剑法的精要所在，任何人一招之出，必定有若干朕兆。他下一刀要砍向你左臂，眼光定会瞧向你左臂，如果这时他的单刀正在右下方，自然会提起刀来，划个半圆，自上而下的斜向下砍。”于是将这第三剑中克破快刀的种种变化，一项项详加剖析。令狐冲只听得心旷神怡，便如一个乡下少年忽地置身于皇宫内院，目之所接，耳之所闻，莫不新奇万端，而又莫不华丽辉煌。\n这第三招变化繁复之极，令狐冲于一时之间，所能领会的也只十之二三，其余的便都硬记在心。一个教得起劲，一个学得用心，竟不知时刻之过，猛听得田伯光在洞外大叫：“令狐兄，天光啦，睡醒了没有？”\n\n\n2024-11-13 19:03:05\n\n好的学习内容，会让人如令狐冲学独孤九剑般，进入心流状态。\n一三 学琴\n\n令狐冲知他必是去向师父禀报自己动静，暗自冷笑：“我又没做丝毫亏心事，你们就有十个、一百个对我日夜监视，令狐冲光明磊落，又有何惧？”胸中愤激，牵动了内息，只感气血翻涌，极是难受，伏在枕上大声喘息，隔了好半天，这才渐渐平静。坐起身来，披衣穿鞋，心道：“师父既已不当我弟子看待，便似防贼一般提防，我留在华山派中还有什么意味，不如一走了之。将来师父明白我也罢，不明白也罢，一切由他去罢。”\n\n\n2024-11-15 18:58:34\n\n弟子比师傅厉害，师傅假装大度，便如岳不群一般，又怕又要端着。\n"},{"title":"《十八岁出门远行》",
"url":"/books/eighteen-run-out/",
"date":"2024-11-02",
"headings":[],
"body":"这本书是短篇故事的集合。\n我其实只想记下《鲜血梅花》的故事。\n这是一个武侠小说，主角的父亲死了，他出门远行去找杀父仇人。\n但是，过程非常曲折。\n第一，他的武功并不好，不知道是否能结果杀父仇人，甚至不知道能否安全度过路上的风险；\n第二，不知道谁是杀父仇人，只有两个线索：青云道长和白雨潇。\n于是，他找啊找，找到胭脂女，胭脂女托他找另一叫刘天的人；找到黑针大侠，他托他找一个叫李东的人。\n他找到白雨潇，却认不出他，白雨潇指引他找青云道长，因为胭脂女和黑针大侠要找的人线索在青云道长那里。\n终于，他找到青云道长，但是道长只能和他说两句话，他事先不知道，所以问了刘天和李东的下落。等他记得自己的目标——寻找杀父仇人，道长早就走了。\n主角折回去找白雨潇，顺便把两个人的行踪告诉胭脂女和黑针大侠。\n终于找到白雨潇，他告诉主角，杀死主角父亲的正是刘天和李东，但都被胭脂女和黑针大侠解决了。\n\n我的想法：\n忙活半天，原来都回到原点啊。\n但是，事情却在你兜兜转转下解决了，并不是按照你设想的方式。\n在你出门冒险时，你信心其实是不够的，也不知道天地辽阔，会做错很多事情。\n但终究，你还是做对了。因为你的目标，它总会有一种达成的方式。\n"},{"title":"《教沙白白做人？》",
"url":"/books/enthanasia/",
"date":"2024-10-23",
"headings":[],
"body":"我今天在看公众号“卖杏花”的文章教沙白白做人？，之所以感兴趣，是因为这是一个关于「安乐死」的案例。\n沙白白是一位高知识分子，精通多国语言，40+岁的独立女性，因为患红斑狼疮和尿毒症，不堪病魔的折磨，前往瑞士赴死，其父亲陪着她。\n网上多有异议，认为如此高知的女性，为何不知道有其他治疗方法？应该可以延长性命。或者，对于她选择的不理解。当然，针对这一切，作者都有一一讨论。\n我关注了【沙白白】的视频号，确实觉得这样的女性选择死亡是个遗憾的事，内心也怅然若失。\n但她的死亡，让我重新思考了自己的人生。我是否过着值得过的一生呢？她至少认为自己过了值得过的一生。\n2024.10.28更新：\n我想再说说“为什么我不喜欢去过四十多个国家，会讲几门语言这样的生活追求。也不鼓励我的孩子过这样的生活。\n首先，我不反对度过丰富的一生，我也很喜欢旅游，如果可以去不同的国家，我也是很高兴的。\n我不排斥学习新语言，甚至出发去不同国家前，我会刻意练习几句。\n提出这样的目标的人，无疑是具有探索精神的人，也好玩有趣。\n只不过，我觉得这样的目标对于“开阔的眼界”无益。\n你一定会说，我真是胡说八道，去这么多国家，讲这么多的语言，自然是为了“开阔”呀，你难道期望一个人天天在家“开阔眼界”吗？\n不是这样理解的，出去，与人交谈，这样确实可以开阔眼界，但是开阔眼界的方法不只这一种。你阅读，上网同样可以，只是得到的东西不一样。\n我注意到，很多人喜欢树立这样的目标，认为成为一个国际人就完美了，且不说目标实现的难度，光是让这个目标成为一个硬性任务，就深深把人困住。\n人在不同阶段应该有不同目标，且要适应环境。\n比如说你喜欢弹琴，但腰痛后你如何坚持这个兴趣？是忍着伤痛继续吗？如果这样的话，你会恶化自己的腰伤，直至不能弹琴。但如果这个人灵活一些，告诉自己说，其实不一定要弹到死为止，他会更在意自己的身体，可能可以通过调理，让他重拾兴趣。\n这个就是人的执念或者痴念，会让人不够灵活，什么时候都得活得像一只凤凰，否则宁愿死，非常不灵活。\n如果你没这么幸运，挣不到这么多钱？去不了这么多国家呢？你会认为自己人生完全失败吗？如果这样思考问题，我反而觉得自己白活了。\n把目标，把人生都像水一样处理，遇到什么事，想怎样的方法，我相信会过得更加愉快。\n"},{"title":"《会走路的钱》",
"url":"/books/money-walks/",
"date":"2024-10-23",
"headings":[{"level":2,"id":"can-kao","permalink":"https://linxz.online/books/money-walks/#can-kao","title":"参考","children":[]}],
"body":"这本书我看的是繁体版本，暂时没找到简体版本。这是对我30岁后影响最大的经济类书籍，因为影响了我的经济决策，比如买房的位置。\n它由一个美籍华人BayFamily编写的，讲述一个普通人的挣钱故事（2006-2018）。他记录了三个大事件：投资中国房地产，次贷危机湾区房产抄底，持有比特币。\n书里主要观点：\n\n不要和Old Money拼体力，找到New Money，找到那些渴望出头的年轻人，投资他们。\n赚未来有钱人的钱。先在这些地方布局，买好他们需要的资产（比如房子）\n想办法利用发展速度不平衡赚取一定的利润。\n你不需要比别人抢先十步，抢先一步即可。\n\n参考\nBayFamily博客连载\n"},{"title":"《大数据时代》",
"url":"/books/big-data/",
"date":"2024-10-17",
"headings":[{"level":3,"id":"02-geng-za-bu-shi-jing-que-xing-er-shi-hun-za-xing","permalink":"https://linxz.online/books/big-data/#02-geng-za-bu-shi-jing-que-xing-er-shi-hun-za-xing","title":"02 更杂 不是精确性，而是混杂性","children":[]}],
"body":"02 更杂 不是精确性，而是混杂性\n\n从某种意义上，谷歌的语料库是布朗语料库的一个退步。因为谷歌语料库的内容来自于未经过滤的网页内容，所以会包含一些不完整的句子、拼写错误、语法错误以及其他各种错误。况且，它也没有详细的人工纠错后的注解。但是，谷歌语料库是布朗语料库的好几百万倍大，这样的优势完全压倒了缺点。\n\n\n2024-10-17 08:19:42\n\n大数据并没有小数据精确，但大数据的简单算法比小数据的复杂算法要好。\n\n2008年的经济危机表明，这个滞后是致命的。政策决策者为了更好地应对变化，需要及时了解通货膨胀率，但如果以传统的依赖采样和追求精确的方式进行数据收集，政府就不可能及时获得数据了。\n麻省理工学院(MIT)的两位经济学家，阿尔贝托·卡瓦略(Alberto Cavell)和罗伯托·里哥本(Oberto Rigobon)就对此提出了一个大数据方案，那就是接受更混乱的数据。通过一个软件在互联网上收集信息，他们每天可以收集到50万种商品的价格。收集到的数据很混乱，也不是所有数据都能轻易进行比较。但是把大数据和好的分析法相结合，这个项目在2008年9月雷曼兄弟破产之后马上就发现了通货紧缩趋势，然而那些依赖官方数据的人直到11月份才知道这个情况。\n\n\n2024-10-17 08:21:41\n\n大数据可以很及时。\n\n当我们上传照片到Flickr网站的时候，我们会给照片添加标签。也就是说，我们会使用一组文本标签来编组和搜索这些资源。人们用自己的方式创造和使用标签，所以它是没有标准、没有预先设定的排列和分类，也没有我们必须遵守的类别的。任何人都可以输入新的标签，标签内容事实上就成为了网络资源的分类标准。标签被广泛地应用于Facebook、博客等社交网络上。因为它们的存在，互联网上的资源变得更加容易找到，特别是像图片、视频和音乐这些无法用关键词搜索的非文本类资源。\n\n\n2024-10-17 08:20:40\n\n“标签搜索”正是大数据的应用。\n"},{"title":"《卫斯理系列》",
"url":"/books/westli/",
"date":"2024-10-17",
"headings":[],
"body":"之所以读（或者说「听」）卫斯理系列，源于小学时有个老师提及百慕达三角和蓝血人。\n长大后才发现，百慕达三角和蓝血人并没有关系，蓝血人是科幻小说卫斯理系列的其中一本。\n于是翻到卫斯理系列。\n从前喜欢香港才子黄霑，源于他创作的《上海滩》歌词和笑傲江湖歌词，喜欢他的豪放不羁。\n后来发现香港有四大才子，金庸、倪匡、蔡澜、黄霑。\n金庸不必说，蔡澜（点心）太有名，黄霑已说过，倒是倪匡可以了解一下。\n想起小时候看过吴奇隆演的卫斯理，也可以顺便回味一下。\n说起来卫斯理小说是什么类型很难界定，说它是科幻的，读了少年卫斯理的几章，觉得科幻得不强，和三体、银河系搭车客指南、银翼杀手这种差得太远，既无太空知识，也没有赛博朋克，大部分时间很写实，少部分时间似乎是悬疑，甚至是莫名其妙。说是玄幻，又跟《凡人修仙传》、《斗破苍穹》这类型的小说相隔太远。\n不管了，先当成一本好玩的书吧。\n10.18更新：\n卫斯理小说系列还蛮好看的。少年卫斯理刚看完，觉得悬疑感略微不足，有点莫名奇妙。但是一看《贝壳》就吸引住了，感觉是类似侦探小说一样，有看柯南的感觉。\n10.22更新：\n在看《地心烘炉》，被卫斯理的勇气折服。卫斯理不是智慧的象征，而是勇气的象征。冒险故事正是字面上的意思，它不是解谜，主角最重要的品质是勇气，不是智慧。\n"},{"title":"《小岛经济学》",
"url":"/books/island-economy/",
"date":"2024-10-16",
"headings":[{"level":2,"id":"di-yi-zhang-yi-ge-hao-dian-zi-chu-lu-liao","permalink":"https://linxz.online/books/island-economy/#di-yi-zhang-yi-ge-hao-dian-zi-chu-lu-liao","title":"第一章 一个好点子出炉了","children":[]},{"level":2,"id":"di-er-zhang-ba-cai-fu-fen-xiang-gei-bie-ren","permalink":"https://linxz.online/books/island-economy/#di-er-zhang-ba-cai-fu-fen-xiang-gei-bie-ren","title":"第二章 把财富分享给别人","children":[{"level":3,"id":"xiao-fei-dai-kuan","permalink":"https://linxz.online/books/island-economy/#xiao-fei-dai-kuan","title":"消费贷款","children":[]},{"level":3,"id":"xiao-lu-yu-tong-huo-jin-suo","permalink":"https://linxz.online/books/island-economy/#xiao-lu-yu-tong-huo-jin-suo","title":"效率与通货紧缩","children":[]}]}],
"body":"第一章 一个好点子出炉了\n\n消费不足：为了织网，艾伯那天就不能去捕鱼。他必须放弃当天的所得，放弃那条本来可以捕到、吃到的鱼。他这样做并不是因为他不需要鱼，事实上，他爱吃鱼，而且如果那天没有捕到鱼，他就会饿肚子。他对鱼的需求与他的两个朋友没有什么不同。他选择暂时延迟消费（吃鱼），是为了将来消费更多的产品（捕到更多的鱼）。\n冒险：除了消费不足，艾伯还需要冒险，因为他也不知道自己做的捕鱼器到底好不好用。自己花费了一天的时间饿着肚子辛苦劳动，却不知道这东西究竟能不能补偿所失。最后的结果很可能只剩一把绳子和一个饿瘪的胃。如果这个想法失败了，艾伯不能指望贝克和查理给自己任何补偿，因为他俩早就警告过他这样做很傻。\n\n\n2024-10-16 08:26:47\n\n创新需要“挨饿”，因为大家时间都是一样的，用于“生产力”的时间需要拨给“创新。同时，需要冒险，你不知道是否会成功，但必须投入。\n第二章 把财富分享给别人\n\n贝克走近艾伯，说道：“我们做个约定吧：你借给我们一条鱼，我们会还你两条。这可是百分之百的利润啊。除了这座小岛，你到哪儿能找到这样的高回报？”\n\n\n2024-10-16 08:28:23\n\n借贷利息关系源于出借人觉得“不公平”。\n消费贷款\n\n假如在政府的激励之下，贷款都流向了那些最终无法还款的个人或者企业（它们的确经常无力还款），那么这些损失就要由那些牺牲了自己的利益创造储蓄的个人来承担了！\n\n\n2024-10-16 08:33:14\n\n贷款的风险最终由出借人承担。因此取得收益无可厚非。\n效率与通货紧缩\n\n每个工作的人实际上都在经营着自己的生意，将自己的劳动力卖给出价最高的雇主。有时（拿自由的水池清洁工来说），他们将劳动力卖给不同的顾客；有时（就大多数工作者来说），他们只将劳动力卖给某一个顾客，即他们的雇主。水池清洁工能够自由选择，为出价更高的顾客工作（或者在他掌握了新技能后，转行做报酬更高的服务工作）。同样，上班族如果有机会，也可以跳槽，去追求薪资更丰厚的工作。上班族没有跳槽，就证明他们目前的工作可能是当前所拥有的最好选择。\n\n\n2024-10-16 08:50:02\n\n每个职员都在做生意，出卖自己的劳动力。如果他没有跳槽，证明这是他目前最好的选择。\n\n一名员工的具体价值主要取决于三个方面：需求（雇主是否需要这名员工所掌握的技能）、供应（有多少人具备这些技能）以及生产力（这名员工对那些任务的完成程度如何）。要想获得较高的薪资，这位员工必须提高其自身价值，要么掌握极少数人具备的急需技能（如医生），要么通过对本职工作精益求精来提高生产力，根本无捷径可走。\n现实链接\n\n\n2024-10-16 08:51:22\n\n员工价值：满足需求，能够供应需求，并且有不可取代的生产力。\n"},{"title":"《代码整洁之道》(Clean Code)",
"url":"/books/clean-code/",
"date":"2024-10-14",
"headings":[{"level":2,"id":"yi-zhe-xu-1-xiang-shou-zhi-ye-su-yang","permalink":"https://linxz.online/books/clean-code/#yi-zhe-xu-1-xiang-shou-zhi-ye-su-yang","title":"译者序1：享受职业素养","children":[]},{"level":2,"id":"di-1zhang-zhuan-ye-zhu-yi","permalink":"https://linxz.online/books/clean-code/#di-1zhang-zhuan-ye-zhu-yi","title":"第1章 专业主义","children":[]}],
"body":"译者序1：享受职业素养\n\n相比起“专业主义”​“职业化”等说法，我更喜欢用它来翻译Professionalism，因为素养强调的并不是天赋的神秘，也不是技艺的高深，而是持续积淀的结晶：一方面，它体现了能力和素质；另一方面，它又强调了持续的积累和养成\n\n\n2024-10-14 15:34:32\n\n职业素养：长期养成的一种习惯。\n第1章 专业主义\n\n你写的每一行代码都要测试。\n\n\n2024-10-14 15:31:43\n\n测试每一行代码。\n"},{"title":"《沉默的大多数》",
"url":"/books/most-silent-people/",
"date":"2024-10-12",
"headings":[],
"body":"\n据野史记载，中亚古国花剌子模有一古怪的风俗，凡是给君王带来好消息的信使，就会得到提升，给君王带来坏消息的人则会被送去喂老虎。\n\n\n2024-10-12 14:37:26\n\n带来坏消息的人会受到惩罚。\n\n不过也有“坏消息信使”​，此人叫作马寅初。五十年代初，马寅初提出了新人口论。当时以为，只要把马老臭批一顿，就可以根绝中国的人口问题，后来才发现，问题不是这么简单。假如学者能知道自己报告的是好消息还是坏消息，这问题也就简单了。这方面有一个例子是我亲身所历。我和李银河从1989年开始一项社会学研究，首次发现了中国存在着广泛的同性恋人群，并且有同性恋文化。当时以为这个发现很有意义，就把它报道出来，结果不但自己倒了霉，还带累得一家社会学专业刊物受到本市有关部门的警告。\n\n\n2024-10-12 14:38:50\n\n马寅初-新人口论（倡导计划生育）和李银河同性恋研究都曾被当做‘坏信使’。\n建国初始，马寅初提出中国人口发展过快，需要遏制人口，实施计划生育。\n参考：马寅初“人口论”遭批判始末\n"},{"title":"《娱乐至死》",
"url":"/books/amuse-to-death/",
"date":"2024-10-11",
"headings":[{"level":1,"id":"ao-wei-er-he-he-xu-li","permalink":"https://linxz.online/books/amuse-to-death/#ao-wei-er-he-he-xu-li","title":"奥威尔和赫胥黎","children":[{"level":3,"id":"di-1zhang-mei-jie-ji-yin-yu","permalink":"https://linxz.online/books/amuse-to-death/#di-1zhang-mei-jie-ji-yin-yu","title":"第1章 媒介即隐喻","children":[]},{"level":3,"id":"di-5zhang-duo-duo-mao-de-shi-jie","permalink":"https://linxz.online/books/amuse-to-death/#di-5zhang-duo-duo-mao-de-shi-jie","title":"第5章 躲躲猫的世界","children":[]},{"level":3,"id":"di-6zhang-yu-le-ye-shi-dai","permalink":"https://linxz.online/books/amuse-to-death/#di-6zhang-yu-le-ye-shi-dai","title":"第6章 娱乐业时代","children":[]}]}],
"body":"奥威尔和赫胥黎\n奥威尔声称的全面控制时代并没有到来，相反，赫胥黎的美丽新世界让人们开始不再严肃，追求娱乐至死。\n第1章 媒介即隐喻\n\n美国前总统理查德·尼克松曾把自己的一次竞选失败归罪于化妆师的蓄意破坏。他就如何严肃对待总统竞选这个问题给了爱德华·肯尼迪一个建议：减去20磅体重。虽然宪法对此只字未提，但似乎胖子事实上已被剥夺了竞选任何高层政治职位的权利，或许秃子也一样不能幸免于此，当然还有那些外表经过美容仍无法有较大改观的人。我们似乎达到了这样一个阶段：政治家原本可以表现才干和驾驭能力的领域已经从智慧变成了化妆术。\n\n\n2024-10-10 08:38:32\n\n政治家的领域已经从智慧变成了化妆术\n\n福德总结说：“钟表是一种动力机械，其产品是分和秒。”在制造分秒的时候，钟表把时间从人类的活动中分离开来，并且使人们相信时间是可以以精确而可计量的单位独立存在的。分分秒秒的存在不是上帝的意图，也不是大自然的产物，而是人类运用自己创造出来的机械和自己对话的结果。\n在芒福德的著作《技术与文明》中，他向我们展示了从14世纪开始，钟表是怎样使人变成遵守时间的人、节约时间的人和现在拘役于时间的人。在这个过程中，我们学会了漠视日出日落和季节更替，因为在一个由分分秒秒组成的世界里，大自然的权威已经被取代了。确实，正如芒福德所指出的，自从钟表被发明以来，人类生活中便没有了永恒。所以，钟表不懈的嘀嗒声代表的是上帝至高无上的权威的日渐削弱，虽然很少有人能意识到其中的关联。也就是说，钟表的发明引入了一种人和上帝之间进行对话的新形式，而上帝似乎是输家。也许摩西的“十诫”中还应该再加上一诫：你不可制作任何代表时间的机械。\n\n\n2024-10-10 08:41:32\n\n时间是人类的武器，弱化了上帝\n\n隐喻是一种通过把某一事物和其他事物做比较来揭示该事物实质的方法。通过这种强大的暗示力，我们脑中也形成了这样一个概念，那就是要理解一个事物必须引入另一个事物：光是波，语言是一棵树，上帝是一个明智而可敬的人，大脑是被知识照亮的黑暗洞穴。如果这些隐喻不再有效，我们一定会找到其他适用的：光是粒子，语言是一条河，上帝是一个微分方程（正如罗素曾经宣称的），大脑是一个渴望栽培的花园。\n\n\n2024-10-10 08:43:50\n\n隐喻：要理解一件事物，要引入另一个事物\n第5章 躲躲猫的世界\n\n你可以通过问自己这样一个问题来了解到底什么是没有语境的信息：早晨的广播或电视，或者早晨的报纸，有多少次为你提供了需要改变一天计划的信息，或让你决定采取本来不准备采取的行动，或帮助你更加了解了你需要解决的问题？对于我们中的大多数人来说，天气预报有时有用；对于投资者来说，关于股票市场的新闻可能有用；或许有关犯罪的报道也会影响我们，特别是如果犯罪行为碰巧发生在你住的地方或涉及某个你认识的人的话。但我们生活中的大多数新闻都是不起作用的，至多是为我们提供一点儿谈资，却不能引导我们采取有益的行动。这正是电报的传统：通过生产大量无关的信息，它完全改变了我们所称的“信息—行动比”。\n\n\n2024-10-11 13:03:09\n\n有用的信息：对你的决策产生影响。其他都是噪声。\n第6章 娱乐业时代\n\n他们关心的是给观众留下印象，而不是给观众留下观点，而这正是电视擅长的。辩论后的综述通常避免对竞选人的观点进行评论，因为确实也没什么可以评论的。这样的辩论就像是拳击比赛，关键的问题是“谁打倒了谁”，而这个问题的答案则取决于竞选人的“风格”——他们的外表如何，他们的眼神如何，他们怎样微笑，怎样说俏皮话。当年在里根总统与弗里茨的第二场辩论中，里根总统在被问到年龄时说了一句极精彩的俏皮话，结果第二天有好几家报纸都透露里根用他的笑话击败了对手弗里茨。\n\n\n2024-10-11 08:52:32\n\n他们关心的是留下形象，而不是留下观点。\n"},{"title":"《教父三部曲》",
"url":"/books/godfather/",
"date":"2024-07-25",
"headings":[{"level":3,"id":"di-yi-bu-yi","permalink":"https://linxz.online/books/godfather/#di-yi-bu-yi","title":"第一部（一）","children":[]}],
"body":"第一部（一）\n\n连最卑微的人，只要时刻擦亮眼睛，就迟早能抓住机会，报复最有权势的人。\n\n\n2024-07-25 19:06:18\n\n时刻注意他人\n"},{"title":"《枪炮、病菌与钢铁》",
"url":"/books/gun-bacteria-iron/",
"date":"2022-11-04",
"headings":[{"level":4,"id":"","permalink":"https://linxz.online/books/gun-bacteria-iron/#","title":"","children":[]},{"level":4,"id":"-1","permalink":"https://linxz.online/books/gun-bacteria-iron/#-1","title":"","children":[]},{"level":4,"id":"-2","permalink":"https://linxz.online/books/gun-bacteria-iron/#-2","title":"","children":[]},{"level":4,"id":"-3","permalink":"https://linxz.online/books/gun-bacteria-iron/#-3","title":"","children":[]},{"level":4,"id":"-4","permalink":"https://linxz.online/books/gun-bacteria-iron/#-4","title":"","children":[]},{"level":4,"id":"-5","permalink":"https://linxz.online/books/gun-bacteria-iron/#-5","title":"","children":[]},{"level":4,"id":"-6","permalink":"https://linxz.online/books/gun-bacteria-iron/#-6","title":"","children":[]},{"level":4,"id":"-7","permalink":"https://linxz.online/books/gun-bacteria-iron/#-7","title":"","children":[]},{"level":4,"id":"-8","permalink":"https://linxz.online/books/gun-bacteria-iron/#-8","title":"","children":[]},{"level":4,"id":"-9","permalink":"https://linxz.online/books/gun-bacteria-iron/#-9","title":"","children":[]},{"level":4,"id":"-10","permalink":"https://linxz.online/books/gun-bacteria-iron/#-10","title":"","children":[]},{"level":4,"id":"-11","permalink":"https://linxz.online/books/gun-bacteria-iron/#-11","title":"","children":[]},{"level":4,"id":"-12","permalink":"https://linxz.online/books/gun-bacteria-iron/#-12","title":"","children":[]},{"level":4,"id":"-13","permalink":"https://linxz.online/books/gun-bacteria-iron/#-13","title":"","children":[]},{"level":4,"id":"-14","permalink":"https://linxz.online/books/gun-bacteria-iron/#-14","title":"","children":[]},{"level":4,"id":"-15","permalink":"https://linxz.online/books/gun-bacteria-iron/#-15","title":"","children":[]}],
"body":"\n\n至于草莓或树莓，人类也得应付对手——画眉和其他爱好莓子的鸟。罗马人的确试过在园圃种植野草莓，但数以十亿计的欧洲画眉到处撒便，传播野草莓的种子，当然罗马人的园圃也不例外，结果就是长出来的还是画眉喜欢的小颗草莓，人类盼望的大颗草莓只好一再落空。直到近世，由于保护网和温室的发明，人类才打败画眉，生产出合乎自己所求的草莓和树莓。\n\n\n2022-11-04 19:05:35\n\n草莓只能在棚内种才大颗，为了避开画眉鸟\n\n\n现代世界作物年产量的80%是由十几种植物贡献的。这十几种“重量级”的作物如下：谷物有小麦、玉米、稻米、大麦和高粱，豆类有黄豆，块根或块茎类为马铃薯、木薯、甘薯，糖分的来源则是甘蔗、甜菜，水果如香蕉。这些谷物厥功至伟，提供了全世界人口所需卡路里的一半。\n\n\n2022-11-07 08:26:51\n\n82法则在食物上的证明\n\n墨西哥类蜀黍恐怕难以引起狩猎—采集族群的兴趣：它不如野生麦子多产，种子比起后来的玉米也少得多，种子的外面还有一层不可食用的坚硬外壳。墨西哥类蜀黍要想摇身一变成为有价值的作物，不得不经过一番生殖生物学的巨变——增加种子的数量，去除种子外面那层坚如岩石的外壳。玉米始祖的穗轴本来只有一丁点儿大，后来才有人类拇指般大，这个过程到底经历了几百年还是几千年？考古学家仍争论不休。比较明确的是，又过了几千年，玉米才有现代的尺寸。小麦、大麦的天生优势和墨西哥类蜀黍的明显劣势，大概就是欧亚社会和新大陆社会发展差异的要因。\n\n\n2022-11-07 08:35:53\n\n必须等植物的条件成熟，才可能引起人类食物的“质变”，并非“存在”就能构成条件，所以人们会对某些所谓机会视而不见，因为这些对于人类来说不是“准备好的机会”\n\n我耐着性子对这些土著朋友解释：我从书上得知有些蘑菇根本碰不得，就连美国的蘑菇专家也会因难以辨识而栽在毒蘑菇手里，一命呜呼，所以，虽然大家已饥肠辘辘，但是不是该三思，为了一餐赔上一条命是否值得？这时，我的土著朋友跟我翻脸了，叫我闭嘴，好好听他们说。说来说去，都是我自己的错。这么些年来，我缠着他们问东问西，考问几百种树木和鸟类的名字，怎么可以认为他们对蘑菇的知识有限？这简直是一种侮辱。只有美国人才会愚蠢到去摘有毒的蘑菇。他们不厌其烦地给我再上一课，告诉我安全可食的蘑菇有哪29种，用弗雷语怎么说，它们在森林中的生长地又在何处。这种呢，就叫作坦蒂（tánti），是长在树上的蘑菇，不但美味，而且保证可以入口。\n\n\n2022-11-07 08:47:45\n\n现代人获得一些知识，但也以失去一些知识作为代价。核心在于环境，环境影响一个人吸收的知识类型。\n\n今天新几内亚的情况说明了同样的道理，能优先获得引进的新作物和家畜（或者在文化上乐意接受新作物和家畜）的族群就可扩张版图，没有门路或意愿接受的族群自然遭到淘汰。\n\n\n2022-11-07 18:38:25\n\n接受创新很重要，固步自封只会带来灭亡。\n\n土壤肥沃，降雨规律且恰到好处，气候利于农作\n\n\n2022-11-07 18:40:27\n\n降雨规律，这是地中海气候的优势\n\n肥沃新月地带登峰造极，新几内亚和美国东部则乏善可陈。肥沃新月地带野生动植物的驯养可谓轻而易举，不但驯化了许多物种，其中品种多产而优良者比比皆是，而且种类繁多。结果得以发展出精密的粮食生产业，促使人口更加稠密，进而迈入有先进技术和复杂政治组织的现代世界，同时携带可以消灭其他族群的传染病。\n\n\n2022-11-07 18:42:42\n\n同是地中海气候，因其可驯化的动物 植物品种较多，较早实现农业进化。\n\n接受新的作物、家畜和技术的，就能日益精进，领袖群伦，人口数目远远超过那些不愿接受新事物的族群，接着便向后者大举入侵，甚至将之连根拔起。这种现象可以说非同小可，意义远远超过作物采借这回事\n\n\n2022-11-07 18:44:48\n\n封闭就要挨打\n\n\n对于成功，我们总想找一个只涉及单一因素的简单原则。然而，对大部分事物来说，要获得成功，实际上必须避免失败，只是可能造成失败的因素有许多，而且彼此互不相关。\n\n\n2022-11-07 18:54:15\n\n成功，并不是找出成功公式，相反，要避免失败。\n\n第4章谈到大型哺乳动物对人类社群有深远的影响。特别值得一提的是，这些动物劳苦功高——供给人类肉品、乳品、毛皮、肥料，平时拉车，战时载人冲锋陷阵，也帮忙把病菌传播给没有抵抗力的族群。\n\n\n2022-11-07 18:55:26\n\n作为食物、载具、病毒源，甚至作为信仰，哺乳动物对于人类发展来说居功至伟。\n\n非洲象呢？它们不是在迦太基将领汉尼拔的统率下越过了阿尔卑斯山吗？今天在东南亚辛勤工作的亚洲象呢？我并没有忘记这些劳苦功高的朋友。这关乎一个重要区分：大象可以被驯服，但无法被驯化。汉尼拔的非洲象和亚洲的工作象只是被驯服的野象，它们无法在人工环境中繁殖。根据定义，“家畜”是在人工环境中有选择地被驯养的动物，它们的进食、繁殖都由人类控制，以使其不同于野生始祖，能够为人类所用。\n\n\n2022-11-07 18:57:48\n\n大象可以被驯服，但不能在纯人工条件下生存，因此无法被驯化。\n\n因为人择的方向与野地的天择不同，所以牲畜和其野生始祖之间有些差异，比如体型大小。牛、猪和绵羊驯养之后都变小，豚鼠则变大。人类选择绵羊和羊驼的标准是它们身上的毛，毛越多越好，牛则以乳汁多的为上选，有些家畜在被驯养后大脑变小了，感觉器官也不再那么灵敏，因为再也不必担心掠食者的突袭。\n\n\n2022-11-07 18:58:54\n\n对动物而言，不是“物竞天择”，而是“物竞人择”。\n\n本书所谓的“欧亚”在好几个案例中，都包括北非。就生物地理学和许多文化角度来说，北非和欧亚大陆的关联较近，与撒哈拉以南非洲反倒较为疏远。\n\n\n2022-11-07 19:01:09\n\n与地中海地区相似的纬度，相似的气候，反而远离非洲其他国家\n\n在我工作的新几内亚村落就有人养袋鼠、负鼠，以及鹟、鹗等禽鸟。捕来的动物大部分最后被吃了，但其中一些成了宠物。新几内亚人甚至经常捕捉食火鸡（一种似鸵鸟、不会飞翔的大型鸟类）的幼鸟，养大后烹煮成大餐——不过，食火鸡成年后极其凶猛，倒霉的村民遇上了，恐怕难逃被开膛剖肚的厄运。有些亚洲族群养老鹰作为狩猎伙伴。像这种勇猛的宠物也有反咬主人造成伤亡的例子。古埃及人、亚述人和现代的印度人也养猎豹作为打猎之用。从古埃及人的壁画也可看出，他们还养了一些有蹄的哺乳动物（这已不足为奇），如瞪羚、麋羚，还养了鹤等鸟类，令人惊奇的是长颈鹿（可能很危险），甚至还有养鬣狗的。尽管非洲象不好惹，但罗马时代已有人将之驯服，现在还有人在驯养亚洲象。或许最令人难以想象的宠物是欧洲棕熊（和美洲灰熊同种），日本的阿伊努人常把小熊抓来，养大后作为祭品。\n\n\n2022-11-08 08:53:00\n\n养宠物，古代的人更有想象力。\n\n世界上那148种有可能被驯化的大型动物想必已有无数人尝试过驯化了，最后驯化成功的只有那些，古人已尽全力，没有漏网之鱼。\n\n\n2022-11-08 08:54:49\n\n我们站在前人的无数实验之上。\n\n古代的埃及人、亚述人和现代的印度人都非常珍视驯养的猎豹，它们是优秀的狩猎伴侣，比猎犬强太多了。印度曾有一位莫卧儿皇帝尤其痴迷，养了上千头猎豹。尽管王公贵族投注了大量的心血、成本，仍难以使猎豹在畜栏里繁殖，他们所有的猎豹都是从野地抓来养的。一直到1960年，生物学家才让我们见到第一头在动物园出生的猎豹。在野地里，一群猎豹兄弟追逐一头雌性，飞奔数日，雌猎豹似乎必须在这样粗野的追求过程中才会排卵、发情。在兽栏中，猎豹拒绝表演这样复杂的追求戏码。\n\n\n2022-11-08 09:01:47\n\n不能在众目睽睽之下繁殖，成为人类无法驯化猎豹的目标\n\n相形之下，大多数喜欢独居、有领地意识的动物无法放牧。它们既不容忍同类，也不会将人类当作领袖，而且没有服从高层的本能。有谁见过一群猫（独居、有领地意识的野猫）跟在人类后面，或是被人“放牧”？每一个爱猫人都知道：猫不像狗那样有服从的本能。\n\n\n2022-11-08 18:48:33\n\n猫天性桀骜不驯，爱独居，不适合当家畜，适合当宠物\n\n欧亚大陆的族群得天独厚，拥有最多可供驯化的大型食草哺乳动物。三方面的基本条件造就了这个结果：生物地理、历史和生物学。第一，欧亚大陆面积最大，生态最为多样，可供驯化的候选物种多。第二，澳大利亚和美洲的大型哺乳类动物在更新世末期遭遇了大灭绝，几乎所有候选动物都灭绝了。这可能是因为人类较晚进入澳大利亚和美洲，那里的动物不幸突然与狩猎技术高明的现代智人相遇，才遭到灭绝。第三，更新世结束后各大洲幸存的大型哺乳动物中，欧亚大陆的动物适合驯化的比例较高。研究那些从未被驯化的候选动物，比如非洲的大型群居哺乳动物，我们会发现每种都有特别的理由而无法被驯化。因此，托尔斯泰想必会赞同圣马太的慧见：“被召的多，选上的少。”\n\n\n2022-11-08 18:51:01\n\n为什么欧亚大陆走在其他大陆前面的原因之一：成功的动物驯化，源于得天独厚的条件\n\n\n为什么肥沃新月地带作物的传播如此神速？部分原因就在于欧亚大陆的东西向大陆轴线，也就是本章开头谈到的情况。位于同一纬度的东西两地，每一天的长度和季节变化相同，也有着类似的疾病，温度和降雨也差不多，生境和生物群落区（biomes）也大同小异。例如，葡萄牙、伊朗北部和日本纬度大致相同，葡萄牙和伊朗、伊朗和日本之间的距离都在4 000英里左右，但三地气候差不多；哪怕只是往南走1 000英里，气候的差异就大了。\n\n\n2022-11-08 19:06:06\n\n东西轴线比南北轴线传播效果更好，因为有类似的气候。\n\n\n近代史上的人类杀手有天花、流感、肺结核、疟疾、瘟疫、麻疹和霍乱等——这些传染病都是由动物的疾病演化而来的。奇怪的是，引起人类传染病的微生物，现在几乎只在人类社群中流行。对人类来说，疾病一直是最可怕的杀手，也是塑造历史的关键角色。\n\n\n2022-11-09 08:30:48\n\n动物带来的病毒不可忽视。\n\n就病菌的传播而言，最不费力的方式，就是一动不动地等着被送到下一个宿主体内。静静地待在一个宿主身上，被下一个宿主吃进肚子，正是这个策略的运用。例如，沙门氏菌的感染是因吃了被污染的鸡蛋或肉类，旋毛虫则随着未煮熟的猪肉进入人体作怪，而日本人和美国人有时会得的异尖线虫病，就是生鱼片造成的，寄生虫从鱼肉进入人体。但在新几内亚高地流行的库鲁病（和中枢神经病变有关，症状为运动失调、震颤和发音障碍等），则是由吃人肉造成的。食人族的母亲剖开病死者的脑壳，还没下锅，一旁的小孩已迫不及待地把手指伸进人脑，在吸吮手指的同时，也吸入致命的病毒。\n\n\n2022-11-11 12:55:35\n\n病菌的传播渠道。\n\n日本人和美国人有时会得的异尖线虫病，就是生鱼片造成的，寄生虫从鱼肉进入人体。但在新几内亚高地流行的库鲁病（和中枢神经病变有关，症状为运动失调、震颤和发音障碍等），则是由吃人肉造成的。食人族的母亲剖开病死者的脑壳，还没下锅，一旁的小孩已迫不及待地把手指伸进人脑，在吸吮手指的同时，也吸入致命的病毒。\n\n\n2022-11-09 18:31:57\n\n吃任何食品时 注意病毒\n\n我们身体的另一种反应就是动员免疫系统。白细胞等努力作战、歼灭外来的微生物。在抵御那些微生物的同时，身体也渐渐产生抗体，痊愈后就比较不会再度感染。过去的经验告诉我们：对于流感和感冒等疾病，我们的抵抗力有限，病愈后还是免不了再遭受感染；然而，其他疾病如麻疹、腮腺炎、风疹、百日咳和现已绝迹的天花等，由于抗体的作用，一次感染，终生免疫。这就是预防接种的原则：以注射死亡或效力减退的菌株来使抗体生成，而免除真正的疾病之苦。\n\n\n2022-11-11 12:54:49\n\n免疫系统帮助我们抵抗病毒。\n\n这就是预防接种的原则：以注射死亡或效力减退的菌株来使抗体生成，而免除真正的疾病之苦。\n\n\n2022-11-09 18:35:40\n\n接入快死的病毒，让身体学习如何对抗，这就是疫苗的原理。\n\n但有些微生物狡猾得很，不只侵入我们的免疫系统，还会改变分子结构（也就是所谓的“抗原”），让抗体认不出来。病毒持续演化，进行品种改良，每每以不同的抗原卷土重来，这就是两年前我们得过流感后，今年仍然无法幸免的原因。疟疾和嗜睡症有快速改变抗原的能耐，因此更加狡猾。最狡诈的就是艾滋病病毒，这种病毒就算是待在同一个病人身上，也有可能演化出新的病原，以全面征服整个免疫系统。\n\n\n2022-11-11 12:54:13\n\n欺骗抗体，也是病毒常用的手段。\n\n微生物演化的结果则是以我们的身体作为营养来源，而在宿主死亡或产生抵抗力时，却没有翅膀可以飞离，继续寻找下一个目标。因此，有些病菌演化出传播的伎俩，以找到更多的潜在宿主。我们身上出现的“疾病症状”很多都是这种伎俩的发挥。人类也演化出一套应变的方法。人类和病菌就此困在了越发激烈的演化竞争中，谁都无法脱身。溃败的一方宣告死亡，唯一的裁判就是天择。\n\n\n2022-11-11 12:53:26\n\n病毒与抵抗力相互较劲。\n\n但在现代医学兴起之前，流行病要可怕得多。人类史上最恐怖的流行病是流感，在第一次世界大战结束时夺走了2 100万人的性命。1346—1352年暴发的黑死病造成欧洲四分之一人口死亡，在某些城市，死亡比例更高达全城的70%。19世纪80年代初，加拿大太平洋铁路在萨斯喀彻温兴建时，当地的美洲土著因几乎不曾接触白人和从白人社群而来的病菌，每年因肺结核而死的比例高达9%。\n\n\n2022-11-09 18:38:52\n\n流行性疾病在历史上一直都很可怕。\n\n成为流行病的传染性疾病有几个特征：第一，传播速度惊人，在短时间内就能攻占整个社群；第二，以“急症”的面貌出现，很快就可置人于死地，但若大难不死，则没多久就可康复；第三，痊愈的幸运者则能产生抗体，之后很长一段时间不再复发，也许终其一生不会再受到感染；第四，这些疾病往往只在人类社群中发展，致病的微生物无法在土壤或其他动物身上存活。\n\n\n2022-11-09 18:39:39\n\n流行病特征。\n\n显然，群聚疾病无法在人口少的狩猎—采集游群和行刀耕火种的农民之间流行。现代亚马孙的印第安人和太平洋岛民的悲剧经验证实，只要有一个外来族群带来了传染病，小部落就可能因为没有人有相应的抗体而惨遭灭族。例如，1902年，有人登陆加拿大北极圈内与世隔绝的南安普敦岛，这艘名叫“行动号”的捕鲸船上有个船员感染了痢疾，结果岛上56个赛得缪特（Sadlermiut）因纽特人死了51个。此外，若成年人感染了麻疹等“儿童传染病”，病情将比儿童更加严重，若发生在一个小族群，则所有成年人都无法幸免。（美国人现在罕有人在成年后得麻疹，是因为在小时候就已得过，或者已接受过疫苗接种。）此传染病消弭了整个小族群的人口后，就宣告绝迹。小族群的人口数量少，因此无法抵御外来的流行病，也无法演化出可传染给外来族群的疾病。\n\n\n2022-11-11 12:52:22\n\n“灭族”的病毒\n\n为什么农业的兴起会触发群聚传染病的演化？其中一个原因是，比起狩猎—采集的生活形态，农业能养活十倍甚至百倍以上的人口。第二个原因是，狩猎—采集部落经常搬迁营地，留下富含微生物和幼虫的粪便。但采用定居形态的农民生活圈不出自己的污水排放区，等于为微生物提供了一条侵入人体和水源的快捷途径。\n有些农业社群收集人类的粪便和尿液当肥料，使细菌和寄生虫更容易找到感染的对象。农田灌溉和养鱼的池塘对携带血吸虫的蛇和水蛭而言，简直是天堂。因此，农民的生活周遭是粪便，所储藏的粮食也会吸引携带病菌的啮齿动物前来。非洲农民在森林中开辟的空地也成为疟蚊繁殖的乐园。\n\n\n2022-11-11 12:50:49\n\n农业的发展帮助了病毒的传播\n\n如果农业的滥觞是微生物兴旺之因，城市的兴起则使微生物更加繁盛。城市人口稠密加上环境污浊，对微生物的繁衍再好不过了。直到20世纪初，欧洲的城市人口才趋于稳定；在那之前，城市由于群聚疾病而不断有人死亡，不足的人口就由乡村的健康农民补足。对微生物而言，另一个荣景是世界贸易路线的发展。在罗马时代就有欧洲、亚洲、北非的各路人马汇聚的贸易路线，成为微生物远征五湖四海的最佳途径。公元165年和180年之间，人称“安东尼瘟疫”的天花来到罗马，因此丧生的罗马市民达好几百万人。\n\n\n2022-11-11 12:51:22\n\n贸易和城市繁荣加剧了病毒的传播\n\n1519年，科尔特斯率领600名西班牙随从登陆墨西哥海岸，企图征服有数百万人的阿兹特克帝国。科尔特斯到了首都特诺奇蒂特兰，不久就被逐出城外，“仅”折损了三分之二的兵力，但他又企图杀到海岸，以展现西班牙的武力优势，笑傲那些天真无知的印第安人。然而，科尔特斯再次发动攻击时，印第安人已经学乖了，在每一条巷道严阵以待，准备拼个你死我活。西班牙人凭什么本事获胜？答案就是天花。1520年，有个奴隶在古巴感染了天花后来到墨西哥。结果这场流行病杀死了半个阿兹特克帝国的人，连皇帝奎特拉瓦克也难逃一劫。这种神秘的疾病专挑印第安人而放过了所有的西班牙人，劫后余生者因而信心全无。墨西哥人口本有2 000万，到了1618年陡降至160万。\n\n\n2022-11-09 18:56:48\n\n科尔特斯用天花征服了墨西哥人（阿兹特克帝国）\n\n印第安人从未接触过旧大陆的致命病菌，因此无从产生抵抗力或基因变化。天花、麻疹、流感和斑疹伤寒等，都是逞凶斗狠的头号杀手。如果嫌不够，白喉、疟疾、腮腺炎、百日咳、鼠疫、肺结核和黄热病还等着呢。很多白人都见识过致命病菌蹂躏人类的本事。例如19世纪北美大草原上有一支曼丹印第安人（Mandan Indian），他们是文化发达的印第安部落。1837年，有艘从圣路易斯沿密苏里河开来的汽船带来了天花病毒。不出几个星期，本有2 000人的曼丹人一下子变成了不到40人。\n\n\n2022-11-11 12:48:40\n\n对没有抵抗力的人来说，病毒一来就是致命的。\n\n为什么致命群聚流行病不能在美洲兴起？这个问题其实可以用另一个简单的问题来回答：这些病菌是从什么微生物演化来的？欧亚大陆的群聚传染病是从牲口身上来的。欧亚大陆可豢养的牲畜不少，但在美洲被驯化的只有5种：墨西哥和美国西南部的火鸡、骆马（或羊驼），安第斯山脉的豚鼠，南美热带地区的疣鼻栖鸭和遍布于全美洲的狗。\n\n\n2022-11-09 18:59:55\n\n家养动物带来了病菌，一切源于欧亚得天独厚的驯化历史\n\n\n英语只有26个字母，音素却有差不多40个。因此，大多数以字母组合的文字，包括英文在内，不得不用同一个字母来代表几个不同的音素，或用几个字母组合起来代表某些音素，例如英文中的sh和th（但在俄文和希腊文各有单一的字母对应）。\n\n\n2022-11-10 07:57:01\n\n就像计算机语言只有1和0，但靠着无数的组合代表了世界上所有的信息。\n\n或许文字发展史上最关键的一步，就是苏美尔人采用了代表语音的符号。碰到无法用图像描绘的抽象名词时，他们就用同音且可以画出来的名词来代表。例如，“弓”易画，“生命”却难以描绘，但在苏美尔人的语言中，两者的发音相同，都是ti，所以他们就用“弓”的图像来代表“生命”。然而，在看到“弓”这个符号时，我们如何断定是“弓”还是“生命”？为了避免混淆不清，苏美尔人在前面加上一个不发音的符号（限定符）来指示名词的类别。语言学家将这一突破命名为“画谜原则”——今天的双关语也是基于这一原则产生的。\n\n\n2022-11-10 08:01:49\n\n语音的发展\n\n文字发展的先决条件是：这个人类社群必须认为文字有用，而且能供养造字专家。\n\n\n2022-11-10 08:12:16\n\n文字的前提是农业基础\n\n发明的传播方式有很多。一个极端是“蓝本复制”，将蓝本照单全收或略加修改后拿来运用；另一个极端是“理念传播”，学到基本概念后自己再来研发细节。你最先只是知道可行，后来自己也想试试，你自己得出的解决方案可能和最早那位发明者的一样，也可能不一样。\n\n\n2022-11-10 08:13:37\n\n发明的传播：抄袭或借鉴\n\n1810年左右，塞阔雅决心再接再厉，为切罗基语设计出一套文字。他还是先画图，后来觉得太复杂了，而且老是画不好，就放弃了。接下来，他开始为每一个词设计一个符号，造了几千个符号还是不够，因此又不满意。\n\n\n2022-11-10 08:20:13\n\n文字可能源于人类画不好图\n\n最古老的苏美尔楔形文字是写不出一般的文章的，只能用来速记，其词汇只包括名称、数字、测量单位、需计数的物体和几个形容词。就好比现在有个美国法院的书记员，虽然想表达“我们命令约翰上缴他欠政府的27头肥羊”的意思，但由于缺乏必要的词语和语法结构，只能写成“约翰27头肥羊”。后来的楔形文字可以用来写文章了，但得使用夹杂着好几百个语标、声符和不发音限定符的复杂系统。\n\n\n2022-11-10 18:44:44\n\n早期文字只有简单记录的功能，并不能形成一句话\n\n早期文字的用途有限是有意为之，人们刻意不去发展更清晰的文字系统。苏美尔人的国王和祭司都希望文字只掌握在少数官员手中，由他们来记录课征的绵羊的数目，而不是给大众用来作诗或当作图谋不轨的工具。正如人类学家克劳德·列维-斯特劳斯（Claude Lévi-Strauss）所言，古代文字的主要目的就是“为奴役他人提供便利”。文字为庶民所用是很久以后的事，那时文字系统才变得简单，更利于表情达意。\n\n\n2022-11-10 18:47:03\n\n文字曾是一种奴役人民的工具，因从要尽可能地晦涩。\n\n\n一旦发明了一件事物，发明家必须做的就是为它找个事做。只有在新发明“工作”了一段时间后，消费者才会觉得他们“需要”那件发明。还有一些新发明，在经过一段时间后发明的初衷被忘记了，因为消费者为它们找到了新的用途。事后才找出用途的发明并不罕见，现代史上许多重大的技术突破都属这一类，例如飞机、汽车、内燃机、电灯泡，以及留声机和晶体管，读者知道了有没有大吃一惊呢？所以，往往发明才是需求之母，常见的观点把两者的关系弄反了。\n\n\n2022-11-10 19:00:48\n\n人类好奇心促发发明，继而满足需求，而非需求促成发明。\n\n世界史的基本模式，会不会因某些天才没有在某时某地出生而发生有意义的变化？答案很明显：历史上从来没有那样的人物。所有世人熟悉的著名发明家，都既有先驱，也后继有人。他们让人记得，关键在于，在社会有能力利用他们的产品的时候，他们做出了适当的贡献。\n\n\n2022-11-10 19:04:17\n\n大发明家靠的最主要法宝是运气。\n\n而“发明”的过程，只要与我合作的新几内亚人到远离他们家园的地方工作，就会发生在我眼前。他们在森林中不断捡拾不熟悉的东西在手中把玩，偶尔发现有用的东西，就带回家。同样的过程也发生在我们离开营地之后，当地居民会到我们放弃的营地，翻捡我们留下的东西。他们拿着我们丢下的东西，试着找出它们的用途。丢弃的锡罐比较容易，拿回家可以当作容器。其他东西有时会有完全不同的用途。谁会想到黄色的2号铅笔可以当作装饰品？插在耳洞中或者横插在鼻子上（穿过鼻中隔）试试嘛！一片破玻璃可以当作刀片吗？锋利的话有何不可！\n\n\n2022-11-10 19:05:59\n\n人类的发明是自然而然的，天性使然\n\n发明家找到一项新技术的用途后，下一步就是说服社会采用这项技术。仅仅比较大、比较快、比较强而有力，并不能保证新发明被社会接受。无数这样的新发明不是没人理睬，就是在长期的抵制之后才得到社会认可。著名的例子包括：1971年美国国会否决了发展超音速客机的法案，世人不断抵制有效率的打字键盘设计，英国也曾长期抵制电灯照明。\n\n\n2022-11-11 08:28:41\n\n新发明是不受欢迎的\n\n轮子在现代工业社会中非常有用，但是在其他类型的社会中未必如此。古代墨西哥土著发明了带轮轴的轮车，却拿来当玩具，而不是运输工具。我们也许会觉得难以置信，可是稍微动脑筋想一想，就会发现古代的墨西哥人没有家畜拉轮车，因此轮车比挑夫好不了多少。\n\n\n2022-11-11 08:29:28\n\n发明是否有用 要看当时的社会条件\n\n古时候廉价劳工易找，因此创新发明的动力不强，而在高薪与缺乏劳力的地方，非得创造解决问题的技术不可。\n\n\n2022-11-11 08:33:16\n\n人力资源价格提高 催生发明动机\n\n另有4个因素涉及思想意识，而非经济与组织。第一，冒险行为是创新过程中不可或缺的元素，有些社会鼓励冒险，有些则不鼓励。第二，欧洲社会在文艺复兴之后，以科学观点为独有的特色，欧洲在现代技术发展史上的地位便是源自这一特色。第三，容忍多元观点与所谓异端的社会，较能孕育创新；故步自封的社会倾向于扼杀创新。第四，宗教与技术创新的关系并不固定。一些宗教据说与技术创新特别兼容，一些宗教可能特别不兼容。\n\n\n2022-11-11 08:34:38\n\n创新的思想前提\n\n欧洲人在20世纪30年代第一次进入新几内亚东部高地时，“发现”了几十个从未接触过西方人的石器时代部落。其中，钦布（Chimbu）部落非常积极地采纳西方技术，他们看见白人拓垦者种植咖啡，于是也种植咖啡当作经济作物。1964年，我遇见一个50岁的钦布人，他不识字，穿着传统的草裙，在使用石器的部落中成长。他种咖啡发了财，我遇见他的时候，他刚花了10万美元现款买下一座锯木场，又买了卡车队来运送咖啡与木材。相比之下，他们的邻居达力比（Daribi）部落（我已经和他们合作8年了）就非常保守，对西方技术不感兴趣。当第一架直升机降临达力比村子的时候，他们看了一眼飞机，就继续做手边的事了。换成是钦布人，一定会上前讨价还价，看得花多少钱才能租用那架直升机。结果，钦布人逐渐扩张地盘，占领了达力比人的土地，种植经济作物，最后达力比人成了钦布人的工人。\n\n\n2022-11-11 08:42:32\n\n对外来殖民的不同态度决定人类部落的命运\n\n现在中东的社会相对来说比较保守，并未居于技术发展的前锋，但是在中世纪，那个地区的社会是技术领先、欢迎创新的。中世纪中东社会的识字率比同时期的欧洲社会高得多；他们吸收了古希腊文明的遗产，许多古希腊典籍我们之所以现在还能读到，全是因为它们有阿拉伯文译本。他们发明或者改良了风车、利用潮汐推动的磨盘、三角测量术以及三角帆；他们改进了冶金术、机械工程、炼金术（化学工程）与灌溉方法；他们从中国采借了造纸术、火药，又将它们传入欧洲。在中世纪，技术流动的主要方向是从伊斯兰世界到欧洲，而不像今天是反过来。技术流动的主要方向，大约到了16世纪才开始逆转。\n\n\n2022-11-11 08:43:55\n\n中东地区曾异常欢迎创新\n\n一个社会从发明了新技术的社会采借该技术，这样的事可能在各种各样的环境中发生，包括和平时期的贸易往来（例如1954年日本从美国买到了半导体技术）、间谍活动（如552年，蚕茧由东南亚偷运到中东）、移民（如1685年，法国20万名胡格诺派教徒遭到驱逐，而将玻璃和服装业输往欧洲各地），还有战争。中国的造纸术就是经由战争传入伊斯兰世界的，那是世界文明史上的大事。751年，中国军队与阿拉伯军队战于中亚的怛罗斯河，阿拉伯人在俘虏中发现了造纸工人，于是将他们带到撒马尔罕，设立工厂，生产纸张。\n\n\n2022-11-11 08:47:58\n\n获取新发明的方法有很多种。\n\n但是，日本也有一些因素在酝酿着抵制火器。日本的武士阶层人口众多，武士刀既是阶层的象征，又是艺术品，更是宰制下层的利器。日本的传统战争主要由武士公开对决定胜负。在两军之间，双方武士出列，先发表仪式性的演说，再以武士刀展露高超的武艺，输赢毫无侥幸。这样的行为模式，要是碰上了手持长枪的粗鄙农民，武士必死无疑。此外，火枪是外国人发明的，因此逐渐受人鄙视（1600年之后，这是外国事物在日本最常遭遇的命运）。武士阶级控制的政府于是开始限制枪支生产，只有几个城市开放。然后，政府设计了执照制度，生产枪支必须获得政府的执照，接着又规定，为政府生产枪支的厂商才能取得执照。最后，政府减少订购枪支的订单。于是全日本几乎找不到一支还管用的枪了。\n\n\n2022-11-11 18:37:19\n\n既得利益会使人们拒绝进步。\n\n自我催化的另一个主要原因，是新技术、新材料出现后，将它们组合可产生更新的技术。举例来说，为什么谷登堡在1455年印制了《圣经》之后，印刷业就在中世纪的欧洲以爆炸性的速度传布开来？而那位无名印工在公元前1700年印制了斐斯托斯圆盘之后，却什么也没触发？部分原因在于，中世纪欧洲的印刷业者能够将6种新技术组合在一起，而这些新技术大部分是斐斯托斯圆盘的制作人闻所未闻的——纸张、活字模、冶金术、印刷机、油墨与文字。谷登堡发展出金属铸字字模，以解决活字印刷最大的问题——字号不一。他能成功，是因为当时冶金学已有许多进展：钢可用来做冲压器，青铜或黄铜合金可用来做字模（后来被钢取代），铅可用来做铸模，锡锌铅合金可用来做活字模。谷登堡印刷机的前身是螺旋压榨机，原来用于榨酒或榨橄榄油。他使用的油墨，是在通用的墨水中加入油改良而成的。至于以字母拼写的文字，已有3 000年的发展史，中世纪的欧洲继承了这一笔遗产，使活字印刷成为比较经济的书籍制作方式，因为只要铸造几十个字模就成了，中文的话，至少需要几千个常用字模才够印书。\n\n\n2022-11-11 18:40:01\n\n技术也以其他技术作为前提条件，就像没有GPU算力的提高，就没有AI模型一样。\n\n这么长的逐步加速发展期间，有两个飞跃式发展特别值得一提。第一个发生在10万—5万年前，也许源自遗传变化，那就是解剖学意义上的现代人出现了。现代人的语言或认知能力（或两者）可能是这个形态变化的结果。这个飞跃产生了骨器、有专门用途的石器和复合工具。第二个飞跃源自定居生活。世界各地的社会并不是同时经历这一飞跃发展的，有的早在1.3万年前就已经开始了，有的至今还原地踏步。大体而言，以食物生产为生计的社会才会定居，因为若要生产食物，人就必须住在离作物、果园近的地方，还得储存余粮。\n\n\n2022-11-11 18:41:44\n\n人类的出现与定居是两个飞跃的时间点。\n\n各大洲在面积、人口方面的差异，各洲对内对外联络的便利，食物生产兴起的时间，都对技术的起源与发展造成了影响，所有这些影响，都因技术的自体催化特性而更加扩张了。欧亚大陆在起步上就领先，到1492年，起步时的领先已造成了巨大的差异。欧亚大陆独特的地理条件是推波助澜的主力，而不是欧亚族群的智力。我认识的新几内亚人里，就有智力堪比爱迪生的天才。只不过，他们没有用聪明才智来发明留声机，而是致力于解决和所处环境相关的技术问题：如何在没有外来物品的情况下在新几内亚的丛林中生存？\n\n\n2022-11-11 18:52:23\n\n得天独厚的环境造成欧亚大陆的领先，而非智力因素。\n\n\n传教士带领着进入现代社会的。在传教士之后到来的，是教师、医师、官员和军人。历史上，政府和宗教的势力范围多有重叠，无论那个势力范围是以和平手段（如法玉族的情况）还是武力拿下的。使用武力的例子，往往是政府先用兵，宗教再来辩护。虽然游牧族群和部落有时能击退有组织的政府与宗教，但过去1.3万年的历史趋势是：游牧族群和部落输了。\n\n\n2022-11-11 18:55:12\n\n宗教只是让入侵合理化的手段。\n\n政府和宗教是人类历史普遍模式的四组近因之一，另外三组是病菌、文字和技术。\n\n\n2022-11-11 18:56:34\n\n人类演化至今的原因：宗教政府、病菌、文字、技术。\n\n群组织常被描述为“人人平等”：没有上层阶级、下层阶级这样的社会分层，没有制度化或世袭的领袖，也没有垄断信息、决策的制度。然而，“人人平等”并不代表所有成员都有同样的威望，或人人参与决策。“人人平等”指的是：游群中并无正式领袖，谁更有魅力、力气更大、更聪明、战斗技能更强，谁就是领袖。\n\n\n2022-11-11 18:59:18\n\n单一的特质说了算，简单的领导逻辑。\n\n部落成员之间的冲突较易消弭，原因在于几乎人人都是亲戚。由于部落是个关系亲密的小团体，不需要警察、法律等大团体用以解决争端的制度。若有争吵，双方的亲友会施加压力，避免两人大打出手或刀戈相向。在新几内亚传统社会中，两个互不相识的新几内亚人如果在外村相遇，就会花很长时间来聊自己的亲戚，试图找出彼此间的关系，如果两人有关系，就能多一个不去互相残杀的理由了。\n\n\n2022-11-12 07:52:10\n\n小部落的冲突靠亲属纽带解决。\n\n不过，许多高地族群都有自己的大人物，也就是部落里最有影响力的人，但这不是一个正式的职衔，而且没有什么实权，不能自作主张，对外交秘密一无所知，至多只是参与公共决策。大人物能有这个地位，完全是靠自己的贡献，这个尊荣无法代代相传。\n\n\n2022-11-12 07:52:49\n\n有名无实的大人物。\n\n部落集会没有主席，人人平起平坐，酋长则是永远的权威中心，负责所有的重大决策，而且垄断一切重要信息（比如邻邦酋长私底下威胁要干什么，或诸神应允了什么样的收成）。不像部落里那些与众人没什么分别的大人物，酋长有醒目的标记，比如在西南太平洋的伦内尔岛上，酋长就是背后挂着一面大扇子的人。平民遇见酋长必须行礼，如在夏威夷则须拜倒。酋长的命令由一两个层级的官僚来传达，这些官僚多半是地位比较低的酋长。然而，和国家的官僚相比，酋邦的官僚分工没那么细。夏威夷的酋邦的官僚从征粮、灌溉到徭役都得负责，而一个国家的税收、水务和征兵则分别由不同的官僚掌管。\n\n\n2022-11-12 07:55:51\n\n酋长即皇帝的雏形。\n\n虽然有的统治阶级强调自己动机高尚，但高尚和自私常常分不清，私欲也有可能冠冕堂皇。盗贼和政治家有时只有一线之隔，这个区分主要是看贡品、税收用于统治者自身和平民的比例。例如，扎伊尔的蒙博托总统很腐败，因为他几乎把国家所有的财物（相当于好几十亿美元）归为己有，再吐出一点骨头重新分配给民众（那时在扎伊尔一般人都无法打电话）。而乔治·华盛顿在我们眼里，则是伟大的政治家，因为他把税收用在人人称道的公共建设上，而非中饱私囊。然而，他生于美国的豪门，本就不愁吃穿，美国的贫富差距要比新几内亚的村落大得多。\n\n\n2022-11-12 08:00:27\n\n政治家与盗贼仅一线之隔\n\n那么，如果统治者既想要锦衣玉食，又希望得到普通百姓的支持，他们该怎么做呢？以下四者就是统治者祭出的法宝。\n第一，解除平民的武装，武装掌权者。在今日高科技武器时代，这一点比较容易，因为这类武器只能由兵工厂生产，掌权者很容易加以控制。古代的矛头或棍棒则是平民在家也能制作的武器，统治者就难以制止。\n第二，多分点贡品给平民，皆大欢喜，自然不会怨声载道。这对夏威夷的酋长和今天美国的政治家都适用。\n第三，使用垄断的武力来保障人民的幸福，包括维持公共秩序并制止暴力。这是权力集中的社会相对于权力分散的社会的一大优点，但往往被人忽视。以前的人类学家常把游群或部落所在的地方描绘成和平、没有暴力的理想国，只因为他们经过三年的观察，发现由25个人组成的游群在那段时间里没有发生过谋杀。那是自然：这个游群只有十来个大人和十来个孩童，平常的原因造成的死亡就够多了，要是每三年再有一个大人杀死另一个大人，这个游群还能存续下去吗？如果进行一些长期的调查，我们就会发现，游群和部落中死亡的头号原因就是谋杀。有一次我造访新几内亚的伊佑人（Iyau）时，刚好碰到一个女人类学家在访问伊佑妇女，调查她们的生活史。一问到丈夫姓氏，总是一把辛酸泪，老公横死，再嫁的对象又死于非命：“我的第一任丈夫被来袭的伊洛匹人（Elopi）杀害，第二任丈夫则被想要我的男人砍死。我就跟这个男的一起生活。后来，第二任丈夫的兄弟前来寻仇，杀了我的第三任丈夫。”这种遭遇在所谓“性情平和”的部落族群中可谓司空见惯。因此，在部落越来越大时，人们会倾向于接受中央统治，以换得保护。\n第四，统治者寻求公众支持的另一个厉害做法，就是利用意识形态或宗教给人民洗脑，让他们服从自己的统治。游群和部落当然也有超自然信仰，但不会用其来为中央集权张目，为搜括找名正言顺的理由，同时在没有亲属关系的众人之间维持和平。超自然信仰有了前述功效，经过制度化之后，就成了我们所说的宗教。夏威夷的酋长和其他地方的酋长没什么两样，都称自己是天神下凡或是可上达天听，与神沟通，因此是平民与天神的媒介，可呼风唤雨，能否国泰民安、年年丰收，都仰赖他的本领。\n\n\n2022-11-12 08:02:20\n\n统治四要素。\n\n宗教对中央集权的社会还有两点好处。第一，共同的宗教或意识形态有助于化解陌生人之间的纷争，让民众相信“四海之内皆兄弟”，不至于互相残杀。第二，宗教赋予民众牺牲奉献的动机，让他们摒弃自私自利的念头。褒扬为国捐躯的少数士兵，使得人人奋起，为“大我”向外攻城略地，或保乡卫土。\n\n\n2022-11-12 08:03:18\n\n宗教能软化人民，倡导利他。\n\n显然，在面对比较简单的政治体时，国家的优势主要体现于先进的武器、技术和众多的人口。但国家和酋邦还有两个相同的潜在优势：第一，决策的权力集中，可集中调动军队和资源；第二，利用官方宗教和爱国情操使军人愿意为国捐躯。\n这种情操是如此深植于现代国家人民的心中，加上学校、教会和政府的宣传，以至我们忘了先前的人类历史并非如此。每个国家都有教人民勇于献身的一套，如英国的“为了吾王吾国”和西班牙的“为了伟大的上帝和西班牙”等。16世纪阿兹特克帝国的战士也受到类似的感召：“在沙场上，没有什么比得上光荣的死亡。把美丽的鲜血奉献给赐予我们生命的天神维齐洛波齐特利（Huitzilopochtli）：我遥望他的身影，内心满是渴望。”\n\n\n2022-11-12 08:13:22\n\n爱国教育是国家重要的工作之一。\n\n第二种说法是大家最熟悉的，也就是法国哲学家卢梭提出的社会契约论：众人衡量自己的利益后，达成共识，认为国家带来的福祉超过其他较为简单的社会形态，因此自愿选择国家。这是一个理性的决定。但是，我们仔细观察并考察历史记录便会发现，根本没有哪个国家是在那种超然的氛围中通过众人的理性远见建立的。小的政治单元才不会自愿放弃主权与大的政治单元合并，只在被征服或受外力胁迫时才不得不如此。\n\n\n2022-11-12 08:15:59\n\n组成国家通常是因为被征服，是一种被动选择。\n\n第三种说法现在还有不少历史学家和经济学家认同，那就是国家的出现和大型灌溉系统息息相关，其根据是，在美索不达米亚、中国北部和墨西哥等地，国家出现的时候，大型灌溉系统也的确动工了。该理论也主张，建立和维护复杂的大型灌溉系统或水利工程，非得有中央集权的官僚组织不可。于是，该理论就把可观察到的时间上的大略相关性转化成了假定的因果关联。根据这种假定，当初美索不达米亚、中国北部和墨西哥等地的居民，预见到了大型灌溉系统的好处（虽然方圆数千里内甚至世界上都没有这种系统让他们可以见识），于是这些有远见的人决定团结起来，放弃效率有限的小酋邦，组成可以兴建大型灌溉系统的国家。\n\n\n2022-11-12 08:17:49\n\n功利化的国家追求。\n\n考古资料与史料中都有小型政治单元合并为大型政治单元的案例。卢梭说什么小型社会的成员以自由意志决定组成大型社会，以保障所有人的福祉，其实这全是神话。小型社会的领袖和大型社会的领袖一样，都珍惜自己的独立与权位。合并通常以两种途径达成：在外力威胁下同意合并，被征服吞并。两类例子在历史上都有很多。\n\n\n2022-11-12 08:24:12\n\n部落成为国家，往往是“物竞天择”，而不是“人民的意志”。\n\n所以，切罗基邦联不是以战争打造的，而是原来独立的小型社会受到强大的外力威胁才决定合并的。美国当年也是在几乎相同的情况下形成的。最初的北美十三州（其中之一的佐治亚州正是切罗基邦联的推手）在英国军事的威胁下同意成立邦联。当初各州也非常珍惜自己的独立地位，而各州间的第一份协议书——邦联条款（1781年）根本行不通，因为每一州保留的自主权力太大了。直到后来大家面临更大的威胁，引发了1786年著名的谢斯起义，以及无法解决的债务问题，各州才捐弃本位主义，在1787年通过了现行的美国联邦宪法。19世纪德意志诸邦放弃主权，成立统一帝国，也是个艰辛的过程。1870年法国宣战的威胁，最后让各小邦放弃了大部分主权，移交德意志帝国中央政府（1871年）；在这之前，统一的努力失败了三次：1848年的法兰克福议会、1850年的德意志邦联、1866年的北德意志邦联。\n\n\n2022-11-12 08:25:45\n\n外力迫使联合。\n\n\n澳大利亚还有一个极为独特的特征，那就是这块大陆上的气候，基本上不受季节周期调控，而是受南半球的厄尔尼诺现象支配。厄尔尼诺现象不以年度为循环周期，也无规则的周期，不定时地出现长期干旱，又不定时地大雨滂沱、洪流横行，在澳大利亚是常态。即使在今天，引进源自欧亚大陆的农作物品种，再以卡车、铁路运销农产品，生产粮食在澳大利亚仍然是个高风险行业。年头好的时候，牧群生养众多，但是气候一旦转坏，就只能眼睁睁地看着它们死于干渴。澳大利亚土著当年若是发展农牧，一定也会遇到同样的问题。在年头好的时候累积的人口，到了干旱年份土地只能供养少数人时，不免要面临缩减。\n\n\n2022-11-14 08:12:48\n\n这也是澳洲经济如今以矿产为主的原因。\n\n\n欧洲人“发现新大陆”之前，美洲有上千种土著语言。历史显示，英语取代了美国的印第安土著语言，并不是因为印第安人觉得英语悦耳。语言替代的过程，涉及战争、谋杀、传染病，移民直接或间接地杀死土著，迫使残存的土著不得不采用新出现的优势语言——英语。这种语言更替现象的近因，是欧洲移民的技术和政治组织比美洲人强，而追根究底，关键在于食物生产在欧洲出现得比较早。英语在澳大利亚取代了澳大利亚土著的语言，班图语在非洲近赤道地带取代了俾格米人和科伊桑人原本的语言，基本上都是同样的过程。\n\n\n2022-11-14 18:39:18\n\n语言受经济优势的影响。\n\n\n老戏码一再重复上演：有的族群，所在的生态环境中有发展农牧业的资源，地理位置又方便采借别处的技术，这些族群就取代了不具备这些优势的族群。而同一拨移民散布到不同环境中后，他们的后代又会在不同的环境中，发展出不同的生活样态。\n\n\n2022-11-15 08:33:53\n\n优势的生态环境是先手。\n\n\n美洲与欧洲在食物生产方面最明显的不同，就在于大型家养哺乳动物。在第9章里我们讨论过欧亚大陆上的13种家畜，它们不仅是人类主要的动物性蛋白质来源（提供肉与奶），也供应毛、皮，还是陆上运输工具，平时运送人员、物资，战时更不可或缺。在农耕上，它们也节省了人力，提高了土地的产量。大约到了中世纪，水力与风力逐渐取代了畜力，但是在那以前，家畜是人力之外主要的“工业”能源，例如碾坊拉磨、开关水闸等，无不由家畜代劳。美洲呢？美洲只有一种大型家养哺乳动物，就是骆马。骆马只出没于安第斯山脉一个很小的区域，以及附近的秘鲁海岸地区。骆马供应肉、毛、皮，也可以运输物资，但是不产奶，不供人骑乘，不能拉车、拉犁，不供应工业能源，更别提冲锋陷阵了。\n在晚更新世，南北美洲的大型野生哺乳动物发生了大灭绝（也许是被消灭的），这是欧亚社会与美洲土著社会间巨大差异的一大成因。假如没有那场大灭绝，现代历史可能改写。假如没有那场大灭绝，1519年科尔特斯带着他那群衣衫褴褛的冒险家登上墨西哥海岸的时候，面对的将是几千名骑兵，而他们的坐骑是在美洲驯化的马匹；阿兹特克人不会死于天花，反倒是西班牙人会被美洲独有的各种病菌感染，而阿兹特克人早就有了抵御这些病菌的能力；懂得利用畜力的美洲文明，也可能会发兵入侵欧洲，造成浩劫。但是，这些假设的状况都没发生，因为几千年前的哺乳动物灭绝事件阻绝了历史那样发展的可能性。\n\n\n2022-11-15 08:41:18\n\n坐骑既有功能性，也是病菌武器，对征服至关重要。\n\n南美安第斯山脉、中美洲、美国西南部——从来没有形成高速、巨量的商业贸易网络，而亚洲输往欧洲的黑死病、流感，（或许）还有天花，都是通过那种贸易网络传播的。\n\n\n2022-11-15 08:48:22\n\n贸易网络不只带来商品，还带来病菌。\n\n欧亚社会用来使机器运转的能源，远丰富于美洲土著。最早突破能源限制的发明是利用畜力。牛、马、驴可以用于拉犁、推磨、打水、灌溉或排水。水轮在罗马时代就有了，用途日渐广泛，到了中世纪，利用潮汐或风力的装置也出现了。加上齿轮传动装置，水力和风力不但可以用于碾磨谷物或汲引河水，还能用在榨糖、鼓风、采矿、造纸、磨石、榨油、制盐、织布、锯木等一系列生产活动中。传统上都将18世纪英国以蒸汽为动力作为工业革命的起点，事实上，一场以风力与水力为基础的工业革命，早在中世纪就已经在欧洲许多地区展开了。到了1492年，欧亚大陆上所有利用畜力、风力、水力完成的工作，在美洲仍旧以人力操作。\n\n\n2022-11-15 08:49:56\n\n工业革命比想象中早。\n\n中美洲为玩具发明的轮子，从未得到机会和安第斯山区驯化的骆马合作，新大陆因此丧失了一种强有力的运输工具。\n\n\n2022-11-15 19:30:01\n\n轮子最初由美洲发明\n\n西班牙的越洋殖民事业始于1492年，这时欧洲远洋船只的制造技术已经快速发展了1个世纪，吸收了旧大陆社会（阿拉伯人、印度人、中国人、印度尼西亚人）在印度洋发展出来的先进航海术、风帆、船舶设计。\n\n\n2022-11-15 19:42:04\n\n15世纪末期，以西班牙为代表，开始了欧洲征服美洲的旅程。\n\n\n科伊人的人口经历了大幅度的缩减：欧洲殖民者枪杀他们、驱赶他们、将传染病传染给他们；幸存下来的大部分人与欧洲人混血，产生了在南非被称为“有色人”（Colored）的人群。桑人也遭遇了同样的命运，被枪杀、被驱赶、被感染，不过还是有一小群人在纳米比亚不适合农耕的沙漠地区生存下来，保留了自己的特性。电影《上帝也疯狂》描述的就是桑人的生活。\n\n\n2022-11-15 19:51:01\n\n上帝也疯狂-科伊桑人\n\n马达加斯加岛上的族群有两种成分，其中之一是非洲黑人（这没什么可奇怪的），另一种是从面孔上就能辨认出的东南亚热带地区的人。具体地说，马达加斯加人（非洲黑人、亚洲人与混血人种）说的语言是南岛语，与印度尼西亚加里曼丹人说的马安亚语（Ma’anyan）非常相似，而加里曼丹人可在4 000英里开外的地方！马达加斯加岛周围方圆几千英里，根本没有任何类似加里曼丹人的族群存在。\n公元1500年，欧洲人到达马达加斯加岛，那时，南岛语族和他们带来的南岛语、调适过的南岛文化，已经在马达加斯加岛上生根了。我认为这是世界人类地理学上最令人惊讶的事实。这就相当于哥伦布登陆古巴后，发现岛上的居民是金发蓝眼的北欧人，说的语言接近瑞典语，而近在咫尺的美洲大陆由完全不同的人种占据、说完全不同的语言。加里曼丹的史前居民，应该是航行到马达加斯加岛的吧？可是他们既没有地图又没有罗盘，怎么办到的呢？\n\n\n2022-11-16 08:18:05\n\n马达加斯加岛上聚集一批南亚人。\n\n但是所有的英语方言集合起来，不过是日耳曼语族中的一个支系。其他的支系，包括德语、斯堪的纳维亚语、荷兰语，全都挤在欧洲西北一隅。例如弗里斯兰语（Frisian）是与英语最接近的日耳曼语，流通于荷兰和德国西部的小片沿海区域。因此语言学家可以正确地推测：英语起源于欧洲西北部，然后散播到世界其他地区。事实上，由史料可知，5—6世纪盎格鲁-撒克逊人侵入英格兰，英语是他们带过去的。\n\n\n2022-11-16 08:21:56\n\n英语起源于欧洲西北部。\n\n\n理性探讨日本的考古学之所以如此困难，是因为日本人对历史的解读影响着他们当下的行为。在东亚的各个民族当中，谁把文化传给了谁，谁在文化上高人一等，谁对谁的土地拥有历史主权？例如，有大量的考古证据显示，公元300年到700年，日本和朝鲜半岛之间有人员及物品的往来。日本人对此的解读是，日本在当时征服了朝鲜，将朝鲜的奴隶和工匠带回了日本；而韩国人对此的解读是，朝鲜人征服了日本，日本皇室的缔造者是来自朝鲜的人。\n\n\n2022-11-16 18:34:19\n\n历史对日韩来说，都是面子问题\n\n人类有史以来第一次拥有了各种形状的密封盛水容器。掌握蒸、煮或炖的新技能后，人类拥有了更加丰富的食物来源，因为很多食物在以前难以食用，比如在火上烤就会烧着或脱水的叶菜，煮熟后才容易开口的贝类，需要通过浸泡来去除毒素或苦味的橡实和马栗。人们还能将食物煮至软烂，用来喂养婴儿，让婴儿更早地断奶，以缩短母亲的生育间隔。软烂的食物还能用来喂养牙齿脱落的老人，使他们更长寿，在文字出现以前的社会中，长者就是知识的宝库。这些陶器带来的重大影响触发了人口的爆炸式增长，使日本人口从大约几千人攀升至25万人。\n\n\n2022-11-17 08:26:55\n\n容器的发明让老人小孩都做出贡献。\n\n弥生人和日本人的祖先采用了许多绳文时代的地名，就像美国白人采用了美洲土著的地名（比如Massachusetts和Mississippi）。\n\n\n2022-11-17 08:33:03\n\n美国很多奇怪地名来自印第安人的语言。\n\n\n欧亚大陆上，殖民美洲与澳大利亚的为什么是欧洲社会，而不是肥沃新月地带、中国或印度？为什么欧洲社会在技术上领先，而且在现代世界中占据了政治与经济的领导地位？在公元前8500年到公元1450年之间，任何历史学者都不可能想到欧洲最后会脱颖而出，因为在那近1万年间，欧洲是旧大陆中最落后的地区。从公元前8500年起，直到公元前50年后希腊、罗马相继兴起，欧亚大陆西部地区几乎每一项重要的创新——驯化动植物、文字、冶金、轮子、国家等，都是在中东肥沃新月地带一带发明的。大约公元900年后，水车在欧洲逐渐传布各地，这时阿尔卑斯山以西、以北地区，对旧大陆的技术或文明还没有任何贡献；那些地区只会从地中海东部、肥沃新月地带和中国捡现成。甚至公元1000年到1450年之间，科学与技术的主要流向，是从伊斯兰世界（印度到北非）到欧洲，而不是从欧洲到伊斯兰世界。在那些岁月中，中国是世界的技术领袖，而中国几乎与肥沃新月地带同时发明了农业。\n\n\n2022-11-17 18:33:07\n\n欧洲反败为胜的武器到底是什么\n\n只要我们比较一下今天的肥沃新月地带与古代人对肥沃新月地带的描述，就很清楚了。在今天，再用“肥沃新月”“农业发源地”这样的词来描述这个地区，就显得荒谬了。在曾经的肥沃新月地带，大片地区如今已成为沙漠、半沙漠、草原，或被侵蚀、盐化的地带，不再适合农耕。今天，当地的一些国家靠石油这种不可再生资源积累财富，隐藏了这一地区长期根本贫困和难以自给的实况。\n可是，在古代，肥沃新月地带和包括希腊在内的地中海东部地区，多为森林所覆盖。这个地区从肥沃的林地，转变成土壤冲蚀灌木林带或沙漠的过程，古植物学家和考古学家已经弄清楚了。原来的森林，或被清理后当作农田，或被砍伐了当作建材，或被当作燃料烧了，或被用于生产石膏。由于那里降雨量很小，相应而言初级生产力也很低，植被的恢复速度跟不上破坏的速度。羊群大量增加之后，更是雪上加霜，因为羊群对地面植被的破坏非常彻底，地面上的树木与青草消失后，土壤冲蚀、河谷淤积，而灌溉农业在降雨量小的地方会导致土壤盐化。这些过程在新石器时代就开始了，并且持续到现代。古代纳巴泰（Nabataen）王国首都佩特拉（Petra）附近残余的森林，在第一次世界大战前就因奥斯曼帝国建设汉志铁路的需要而全部被砍。\n\n\n2022-11-17 18:35:08\n\n中东地区曾非常肥沃和富有。在没有石油的年代。\n\n这些条件使中国先驰得点，于唐宋之间成为技术大国，领先世界。中国有一长串的“技术第一”头衔，例如铸铁、罗盘、造纸、印刷等。在政治实力、航海、海权等方面，中国也曾经是世界领袖。15世纪初期，中国的船队就数度远航，出航人员共2.8万人，船只达数百艘，每艘可达400英尺长，他们渡过印度洋，最远到达非洲东部海岸。那时哥伦布还没出生，更别提载着他“发现”美洲的3艘船有多简陋了。为什么中国船队没有绕过好望角西进，殖民欧洲，反而是葡萄牙人达伽马率领3艘小船绕过好望角东行，开启了欧洲人向东亚拓殖的时代？为什么中国船只没有东渡太平洋，登陆美洲西岸？一言以蔽之，为什么技术先进的中国会被原本落后的欧洲赶上呢？\n中国船队的结局可以为我们提供一条线索。1405年至1433年，中国船队七下西洋。后来朝中大臣与太监斗争，大臣占了上风后，就不再维持船队，最后船坞荒废，朝廷甚至颁布禁海令。这样的事例在人类政治史上并不少见：19世纪80年代伦敦通过继续使用煤气街灯的法案，美国在两次世界大战之间的孤立主义，还有许多国家开倒车的例子，不胜枚举，全都是国内政治斗争的结果。但是中国的例子有一点不同，因为中国是个统一的国家，只要一个决定，就可以使全中国的船队停摆。那个决定造成的结果难以挽回，因为船坞荒废就不能造新船，也就无从证明先前的决定荒谬，旧的船坞荒废后，新船坞也无从兴建。\n\n\n2022-11-17 18:37:35\n\n自己“作死”。\n\n中国的地理条件最后让古代中国付出了代价——只要统治者一个决定，就能阻滞创新，这样的事史不绝书。欧洲的情况完全不同，地理的障碍促成许多互相竞争的独立小国。每个小国都是一个创新中心。要是一国没有接受的创新被另一国采纳，邻国也就不得不跟进，否则就会落伍或被淘汰。欧洲的地理障碍足以妨碍统一，又不至于妨碍技术与观念的流通。在欧洲从未出现过像中国一样，能够决定全欧洲命运的统治者。\n\n\n2022-11-17 18:54:25\n\n中国很依赖领导人的决策。\n\n历史预测和其他历史科学中的预测一样，在大空间尺度和长时间内最可靠，因为每个小尺度事件的特异性在大尺度中不再突出。我刚刚预测过下1 000个婴儿的男婴人数，但我不能预测我的孩子的性别。至于欧洲人与美洲土著冲突的结局，历史学者能辨识出决定因素，因为欧亚大陆的社会和美洲社会在过去的1.3万年中走上了不同的发展道路，但他们预测不到1960年美国总统大选的结果。1960年10月一场电视辩论会上哪个候选人说了什么之类的细节，可能会影响选举的结果，让尼克松而不是肯尼迪当选，但是谁说了什么之类的细节，不会影响欧洲人征服美洲的结局。\n\n\n2022-11-18 08:11:59\n\n历史预测方向，但不预测细节。\n\n\n热带地区有两大特征不利于经济发展。其中一个特征是居住在热带地区或去过热带地区的读者很熟悉的：在热带地区比在温带地区更容易生病，容易感染疟疾或登革热等热带传染疾病，或者感染热带寄生虫。因而热带国家的居民比温带国家的居民生病的时间更多，生病期间无法从事劳动生产。总体而言，他们的寿命也更短。这不仅对这些居民而言很悲哀，而且对他们的国家经济来说也是不幸。热带地区的另外一个经济劣势是土壤更贫瘠，植物病害和动物疫病更多，所以农业生产力更低。\n\n\n2022-11-18 08:18:35\n\n热带地区更容易生病，土地更贫瘠。\n\n所以，玛丽又转而问那位丈夫：“你与其他女人有染，是这样的吗？”丈夫回答说：“对，的确如此。”玛丽追问道：“你为什么要与其他女人保持婚外关系呢？”丈夫回答说：“这是因为我的妻子越来越冷漠，丝毫不给我感情与爱。这就是我为什么会与其他女人有染：为了得到任何正常男人或女人都想得到也应当得到的爱、情感与关注。”如果这位丈夫不那么生气，或者如果他逻辑清晰，他可能这样回答：“我的妻子打了我一个耳光只是我们婚姻破裂的近因。我的外遇只是因果链中的一个近因，但它们不是终极原因。终极原因是我妻子的冷淡。”\n\n\n2022-11-18 08:40:45\n\n夫妻问题的近因和终极因不同，这个比喻好。\n\n今天，拥有悠久的农业历史，以及得益于农业发展而形成的悠久的国家政府历史的国家，比那些农业历史短和政府历史短的国家人均收入更高，即使按照经济学家控制了其他变量后的测算，结果也是如此。农业历史的影响是巨大的。它在国家间平均收入的差异方面，占据50%的原因。即使我们比较那些在近代收入依然很低的国家，也会发现，像日本、中国和马来西亚这样国家政府历史悠久的国家，其近代的经济增长率还是高于赞比亚和新几内亚这样国家政府历史短的国家。尽管有些国家政府历史短的国家拥有更丰富的自然资源，拥有悠久的国家政府历史的国家的增长速度还是更快，这一点仍然没错。\n\n\n2022-11-18 08:31:10\n\n经济发展的背后原因是农业，养活了更多的人以从事不同工作。\n\n英国还享有巨大的其他优势，即英国是一个岛国，不像欧洲大陆国家那样容易遭受军事入侵（也因此没有必要组建保家卫国的常备军），它还在大西洋占据理想的地理位置，便于殖民其他大洲。\n\n\n2022-11-18 08:34:30\n\n岛国的优势：不容易被入侵，容易发展航海业，进而殖民。\n"}],
"sections":[]}]}}
