<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Keep Move - 永不止步]]></title><description><![CDATA[Keep Move - 永不止步]]></description><link>https://nomoshen.com</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 10:55:33 GMT</lastBuildDate><atom:link href="https://nomoshen.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Ai时代的工具链]]></title><description><![CDATA[本周是black Friday,我订阅了几个AI服务，还是蛮贵的...不过这样基本上构成我目前整体的知识阅读的过程，随着Ai的不断发展，工具链的替换可能是很重要的一个过程的。我主要订购了以下几个工具：

Memo: 这个工具的主要作用是将视频/audio转srt，并且带有ai翻译的工具；当然我觉得它做的非常好的是，它把整个链路做的非常好的，并且可以用本地的资源做audio->text；而且它自带了很多的ai功能，比如对字幕进行进一步的AI的处理，提问，summarize和思维导图等等；目前我主要...]]></description><link>https://nomoshen.com/ai</link><guid isPermaLink="true">https://nomoshen.com/ai</guid><category><![CDATA[podwise]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sun, 30 Nov 2025 13:25:00 GMT</pubDate><content:encoded><![CDATA[<p>本周是black Friday,我订阅了几个AI服务，还是蛮贵的...不过这样基本上构成我目前整体的知识阅读的过程，随着Ai的不断发展，工具链的替换可能是很重要的一个过程的。我主要订购了以下几个工具：</p>
<ul>
<li><p><a target="_blank" href="https://memo.ac/">Memo</a>: 这个工具的主要作用是将视频/audio转srt，并且带有ai翻译的工具；当然我觉得它做的非常好的是，它把整个链路做的非常好的，并且可以用本地的资源做audio-&gt;text；而且它自带了很多的ai功能，比如对字幕进行进一步的AI的处理，提问，summarize和思维导图等等；目前我主要是用来对其他的工具的补充；</p>
</li>
<li><p><a target="_blank" href="podwise.ai">podwise</a>: 这个服务非常好，针对的是podcast/播客这种形式的资讯输入，会自动的进行转义，内容总结，核心观点进行罗列，并且做了一定的向量化，可以向AI提出问题的；黑五有优惠，大概是42-43刀 一年，我觉得很划算的；现在还支持youtube的分析；目前我的套餐是一个月有20次的导入功能，我觉得基本够用的；这个是我目前用的相对比较多的。</p>
</li>
<li><p><a target="_blank" href="https://folo.is/">folo</a>: 这个是阅读神器，尤其是目前这个阶段，将阅读做到了all in one的这个工具的。可以将基本市面上的所有信息都订阅在同一个app里面，然后进行阅读的。包含了推特，telegram，rss等等；提供了AI的功能的。目前我唯一不满意的是没办法做到边阅读边做笔记的，这块不知道后期什么时候能支持，现在如果看到想要仔细阅读记笔记的，就可能还需要其他的方式进行的。</p>
</li>
<li><p><a target="_blank" href="gemini.google.com">gemini</a>: 每个月20刀，我觉得很值得的；因为google的服务很全的，随着google的模型越来越强大的，对应的gemini也就越来越值钱的，而且它提供了近2T的存储空间+notebooklm的pro会员，我觉得极为值得。目前我基本上有任何问题都会询问gemini，很多人绝对gemini模型不行，还不如chatgpt，但是这个随着时间的偏移，这个差距在变慢慢的变小；Google作为技术大厂，拥有的数据是其他的公司不那么有的优势，所以我很早就开始购买他家的服务的；当然我另外一方面也买它家股票，可能就是信仰吧；</p>
</li>
<li><p>notebooklm: 这是一个google的ai的一个服务，可以支持各种资讯的ai对话的；对文章，书，youtube视频等等，都可以进行AI的总结对话，唯一不能做到的是阅读和做笔记的；这块的话需要结合其他的方式来进行；</p>
</li>
<li><p><a target="_blank" href="https://koodoreader.com/en">KoodoReader</a>: 这是一个阅读器，选择它的原因是可以统一pdf和epub这类格式的，而且支持注解，并且输出; 本来paper我想用Zotero，但是我体验了KoodoReader看pdf，我也能接受；至于AI的功能我准备结合notebooklm来进行，这样的话AI功能就独立了；</p>
</li>
<li><p><a target="_blank" href="https://obsidian.md/">obsidian</a>：记录笔记可能依然还是我需要的，目前我还不怎么会使用obsidian，很多它的功能我还不是很清楚，不过我觉得用来记笔记貌似也没什么问题；我大部分时候主要是用来写blog和记笔记用，支持简单的markdown我基本上都能接受的；</p>
</li>
</ul>
<h3 id="heading-5l255so55qe6zo6lev">使用的链路</h3>
<p><img src="https://cdn.nomoshen.com/images/clipboard_20251130201221_43941.png" alt="image" /></p>
<p>我想要的还是相对比较统一的流程，这样的方式可以将生活的很多部分简单化，不需要总是做选择；而且我准备弄一个telegram作为backup，让自己其他不能cover的场景通过telegram 来完成的；后面我尝试这个过程来，会在不适应的地方慢慢的调整的。</p>
]]></content:encoded></item><item><title><![CDATA[做了一个噩梦]]></title><description><![CDATA[今天凌晨4点多起来看了一眼丈母娘的发烧是否ok...就导致我有点睡不着的，刷了一会推特之后又开始睡觉了，于是就开始做了一个很可怕的梦。
噩梦
那天，我不知道是在哪里..我带着女儿和我弟出去玩的，貌似是一个风景山区。于是我就带着女儿和弟弟出去玩的；我们走啊走, 沿着一条路一直走..突然看到一个小道有一家饭店的，这个饭店是比较特殊，有很多海鲜的；我看上了一只大龙虾，我问多少钱的，他说大概就70rmb就可以的。。。我觉得很划算的，我心想：我买下来，到时候把老婆叫过来一起吃的，并且告诉她这个才70rmb...]]></description><link>https://nomoshen.com/5yga5lqg5lia5liq5zmp5qkm</link><guid isPermaLink="true">https://nomoshen.com/5yga5lqg5lia5liq5zmp5qkm</guid><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Mon, 24 Nov 2025 12:12:47 GMT</pubDate><content:encoded><![CDATA[<p>今天凌晨4点多起来看了一眼丈母娘的发烧是否ok...就导致我有点睡不着的，刷了一会推特之后又开始睡觉了，于是就开始做了一个很可怕的梦。</p>
<h2 id="heading-5zmp5qkm">噩梦</h2>
<p>那天，我不知道是在哪里..我带着女儿和我弟出去玩的，貌似是一个风景山区。于是我就带着女儿和弟弟出去玩的；我们走啊走, 沿着一条路一直走..突然看到一个小道有一家饭店的，这个饭店是比较特殊，有很多海鲜的；我看上了一只大龙虾，我问多少钱的，他说大概就70rmb就可以的。。。我觉得很划算的，我心想：我买下来，到时候把老婆叫过来一起吃的，并且告诉她这个才70rmb...</p>
<p>后面我不知道为什么，我把女儿和弟弟放在饭店里面出去了；可能是上厕所的，但是出来之后我再次回去找这家店的时候我发现我迷路了.. 我心中有点着急，因为我没办法联系到他们，并且女儿如果走丢了我要怎么样面对后面的生活和亲人。 于是我就走到了我一开始的地方，然后沿着这条路不断的寻找的，但是走着走着我都没发现这家店，并且没发现这个路口的；等到我走到一个我没见过的地方的时候，我发现自己肯定是走过头了，于是我又回到了开头的，再次重新开始找的。我越早越着急的，但是我怎么样也没找到他们的，我当时很害怕。</p>
<p>这个时候我老婆打电话过来的，我当时不知道如何说这件事情的，但是我还是和她说了，我找不到孩子他们了。她很害怕的，于是很快就和我汇合然后重新开头找的。我们找啊找啊，遇到路上的店主我们就问那家店在哪里，店主都说往前走的。但是沿途走着，走到了我完全不认识的地方，但是我依然没找到那家店的，然后看着前面和后面，我发现我再也找不到我女儿的。。我真的很害怕.</p>
<p>在那个瞬间我醒了，我发现这是个梦，哎....吓死我了...这一切结束了... 希望孩子们都能健康成长，别遇到什么可怕的事情。</p>
]]></content:encoded></item><item><title><![CDATA[子女教育-2]]></title><description><![CDATA[下面我分享一个推特上的一个关于子女教育的推
哈哈哈哈，李诞这个视频我看过

我给你分享几个我和我女儿之间的小故事

第一个故事
我经常给小朋友说：你们现在上学的成绩不重要，你们现在数学考试都是语文脑筋急转弯，语文考试都是历史背诵，一点用都没有，你出了社会就知道，社会根本没有选择题，社会要有选择题就好了，最难的是你遇到困难，你连门都找不到。我第一次这样讲的时候是女儿小学4年级，那时候我女儿听的一愣一愣的，她不明白，但是觉得我的理论和学校的不一样，很狂妄，但是她很喜欢，哈哈哈哈。

她什么时候真正明...]]></description><link>https://nomoshen.com/2</link><guid isPermaLink="true">https://nomoshen.com/2</guid><category><![CDATA[子女]]></category><category><![CDATA[education]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Thu, 13 Nov 2025 04:53:09 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://cdn.nomoshen.com/images/clipboard_20251113122544_15944.png" alt="image" /></p>
<p>下面我分享一个推特上的一个<a target="_blank" href="https://x.com/manateelazycat/status/1987794402669162673">关于子女教育的推</a></p>
<pre><code>哈哈哈哈，李诞这个视频我看过

我给你分享几个我和我女儿之间的小故事

第一个故事
我经常给小朋友说：你们现在上学的成绩不重要，你们现在数学考试都是语文脑筋急转弯，语文考试都是历史背诵，一点用都没有，你出了社会就知道，社会根本没有选择题，社会要有选择题就好了，最难的是你遇到困难，你连门都找不到。我第一次这样讲的时候是女儿小学<span class="hljs-number">4</span>年级，那时候我女儿听的一愣一愣的，她不明白，但是觉得我的理论和学校的不一样，很狂妄，但是她很喜欢，哈哈哈哈。

她什么时候真正明白问题了呢？她初一的时候说要出去吃早餐，我说我周六要面试，你们给我带回来吧。女儿回来的时候，我还在面试，面试的是一个华中科技大学的计算机研究生，一个小妹妹，说句实话，那天我前两句面试的问题已经知道底子了，为了不打击小妹妹，我就降低难度，但是让我没想到的是，我越降低难度的时候，小妹妹越不会答。每当我问课本里进程和线程区别的时候，小妹妹背诵的非常标准。每当我问实战中多线程通讯你会遇到哪些坑这些开放式问题的时候，小妹妹就不知所措，越回答越紧张，那天为了不打击小妹妹，我全程鼓励她以后就结束面试了。

那天女儿就全程听我面试，虽然不懂技术细节，但是她回头就跟她妈妈说了：妈妈，我现在知道读书除了学校的书，还要读很多学校外的书，刚才那个姐姐一问到课本上的书就还可以，一问到课本外的书，就不会回答爸爸问的问题了。

第二个故事
女儿初一下半年的时候，每天晚上写作业写到半夜，强度要比小学大很多，女儿初中一上学就没心气了。有一天终于发烧了，没有去考试，第二天还要开家长会，我去之前，她特别害怕老师说没考好。我说，别怕，你不知道你爸爸的套路。

学校家长会，班主任全程暗示要上补习班，我听着超级不耐烦，初一第一次老师说，家长们有没有什么问题？我把手高高举起，就像小学一年级举的那么高。班主任以为我是一个热心的家长，我先给班里三个老师戴了高帽，说她们不容易，老师们露出了满意的笑容。然后我话锋一转，我说数学老师，你为啥只讲一遍，从来不讲第二遍，第二遍不会就要打手？而且你还说学不会老师没责任？英语老师，单词错了我可以理解，多抄抄加深记忆我也理解，为啥要写一百遍？小孩睡觉都不够，抄一百遍有意思吗？班主任，你为啥要鼓励小孩上补习班，周末<span class="hljs-number">5</span>个补习班小孩都没休息能学到什么东西嘛？你都说你的小孩不舍得上补习班，为啥要我们小孩上补习班？（这句话的意思你们懂的）。反正那天我火力全开，开完以后，我再补了一句，老师我们正常交流，说的不好不要介意哈，以后嘴给老师一堵，就怕流氓有文化。你知道了嘛，那一次以后，我就改变了我们班的家长会规则，老师说完直接散场，再也不提问了，我初二初三都是第一个站起来就走的

我第一次家长会回去，我给女儿买了最喜欢吃的薯片，一五一十的说了家长会的剧情，她不但没怪我，还是非常认可我的回答。她后面问了一句，万一老师无辜的罚她站怎么办？我说，大大方方的起来，站后面有啥了不起的，你不尴尬，尴尬的就是她。无缘无故的罚你只会损失你老师的公正，对你没啥损失，反正坐久了，站着听讲还活动筋骨。

第三个故事
初二的时候作业写到半夜，实在不想写了，我说明天我给你请假，我女儿就在那里纠结什么理由合适。我说赶紧睡吧。第二天我直接发条短信说不舒服去医院，老师也没问啥。我转头就带她去武汉滑雪场滑了一天雪，开心死了，久违的笑容又回来了。我说，你看今天周五请假还有个好处，因为没去，所以不知道周末作业，周末也不用做作业了。

那个星期是她那半年最快乐的一个周末，下周考试也不差。我说，偶尔不去，不会影响考试的，你们现在过度学习了，学习没考好的原因不是不会，是没有休息好。

最后
就像李诞说的，该学学，该社交社交，学习成绩不要在意，只要学了可以了，真的要焦虑，还不如自己多赚点钱，保留小孩好奇心火种，以后多的是努力的时候
</code></pre><p>这个推我非常的喜欢，原因是和我对孩子的教育观点很符合，但是我有做的不够好的...所以我很喜欢这个家长对孩子的保护。我自己在面对孩子的教育的时候我会焦虑，一焦虑我对孩子就特别严格的...导致孩子自己的时间都比较少的，这块这段时间一直思考是否是自己出了什么问题，导致了这么的不好处理的。</p>
<h2 id="heading-566a5y2v5yig5p6q">简单分析</h2>
<p>第一个故事主要讲了，中国的教育将孩子的绝大多数的精力花在了所谓的课堂的知识上了，但是这些知识本身没那么有用的，甚至与说这只是知识的一小小部分，但是中国教育将这部分知识变成花样来考孩子，导致孩子把大量的精力花在这种没意义的事情上，从而导致孩子没有精力去把时间花在其他的知识上。所以要给孩子多一点自由的时间，让他们能学习其他的东西，而不仅仅只是书本知识。</p>
<p>第二个故事主要讲的就是课外补习的事情的，目前国内教育的确有过度补习和过劳的问题的，孩子太累了，而且要勇于提出问题，尤其是向"权威"提出问题，因为他们可能本身就是错的。我特别喜欢作者对女儿说的，万一老师给他孩子使绊子的话，他说那你就站到后面去，反正你不尴尬尴尬的就是老师，这种操作会导致老师缺少公平性的。我特别喜欢这种教育的，孩子要有能力去反抗老师的</p>
<p>第三个故事，其实是我做的不好的，我孩子在海外读书，但是我感觉我对她的压力有点大的；上次我老婆一次给女儿请假，我就有点生气的， 但是我时候想想这不应该，少读一天书也不会死，并且少做点作业也不会有问题，我的想法中总还是会带有这中国教育的步步为营的感觉，一点都不松弛的...我既然在海外，我本不就希望松弛一些吗。</p>
<p>最后我说一下我自己；我反思了自己的这些变化，可能还是在于经济上的不稳定导致的。我和妻子都没工作，虽然我们的资金还可能坚持很久很久，但是我都未来的不确定和当下的没稳定收入导致我焦虑的很，所以有的时候我就害怕女儿的松弛会导致最后我不能给她兜底。看到作者最后一句话，鸡娃不如鸡自己的，让她们活得更加松弛一些，而我应该去直面自己的焦虑，让自己赚更多的钱，为他们兜底...</p>
]]></content:encoded></item><item><title><![CDATA[被诈骗-马来西亚]]></title><description><![CDATA[最近我在国内，我老婆在马来；最近在计划搬家的，找的那个房子不包含一些必要的家具，于是我老婆就必须要买点家具的，主要是沙发和餐桌..我们本来计划是说去ikea去买，但是我老婆觉得ikea的家具不便宜，并且款式一般的，最终问了中介找了一个二手平台找找看不错的家具。
我老婆挑了两个家具的，我看了一下价格也不算便宜的，但是我老婆喜欢的，于是我就说你觉得ok那就购买吧。我还顺便问了一下，这个家具能不能线下看一下货的，但是我老婆说这货在很远的地方的，大概是300公里的一个城市的。那我就说这个包邮吗，我老婆说...]]></description><link>https://nomoshen.com/6kkr6ki6aqxlemproadpeilvs6mg</link><guid isPermaLink="true">https://nomoshen.com/6kkr6ki6aqxlemproadpeilvs6mg</guid><category><![CDATA[life]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Thu, 13 Nov 2025 04:01:07 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://cdn.nomoshen.com/images/clipboard_20251113111437_11677.png" alt="image" /></p>
<p>最近我在国内，我老婆在马来；最近在计划搬家的，找的那个房子不包含一些必要的家具，于是我老婆就必须要买点家具的，主要是沙发和餐桌..我们本来计划是说去ikea去买，但是我老婆觉得ikea的家具不便宜，并且款式一般的，最终问了中介找了一个二手平台找找看不错的家具。</p>
<p>我老婆挑了两个家具的，我看了一下价格也不算便宜的，但是我老婆喜欢的，于是我就说你觉得ok那就购买吧。我还顺便问了一下，这个家具能不能线下看一下货的，但是我老婆说这货在很远的地方的，大概是300公里的一个城市的。那我就说这个包邮吗，我老婆说包邮。。。其实这一瞬间我的大脑就觉得不是很自然的，在马来这个地方，运货并不是很便宜的东西，他两个家具收我们1000多rm，还包邮送过来感觉不赚钱啊。不过这一切也是一瞬间的。</p>
<p>当时我没有很去关心这个事情，很大原因是我不在身边，我应该把主动权交给我老婆，而且就是个钱的问题，应该不至于出什么事情的。不过一开始的不自然最终就变成了一场诈骗的。而且对方在送货那天说车胎坏了让我老婆垫付了1300rm，我和我老婆说，其实这个钱你不能也不应该付，因为包邮是对方的事情的。但是当时我老婆的心可能比较着急，就直接打钱过去了。这事情也是我事后才知道的。结果就很自然，打了钱之后再也联系不到这个人了，我老婆在小区楼下等了好久都没等到的。最终大概被骗了2800rm...不是很多，但是对我老婆的打击有点大的。</p>
<p>晚上我和女儿打完电话的，让她睡觉之后的。我打电话给了我老婆的，我看她情绪很差的，因为一开始我不知道还有后面的1300块，我说没事，就1500而已，我们家不缺这个钱，就当教训就好。但是她说，其实她当时在那个平台交易的时候就觉得奇怪了，那个人说跳出平台交流的，去whatsapp上进行的...平台进行了提示当时我老婆放松了警惕。我打电话过去的时候她在思考如何报警的，但是估计这个过程就很难了，而且她的签证也不在身边的，所以我说不用了，钱不多就当作一个教训就好的。这点钱我们也不缺的。但是她说后面她还给对方打了1300块，这个时候我觉得她有点崩溃了，肯定是觉得自己好傻这都能被骗...慢慢的她就忍不住哭起来了，我很后悔的是我不能陪在身边的，如果在的话，可能损失会更加少一些的。。当然也只是可能...看着她哭，我整个人就不是很好的，我说，没事的，一点点钱而已，就当作教训就好的...一点都不贵的，我们家也不缺这么点钱的。大概是哭了一会，慢慢的平静了...记得上次她哭，貌似是她外婆走的时候...</p>
<p>最后我和她说，我们出门在外，理论上会有很多困难和挫折的，只不过我们之前过的都比较顺利的让我们放下了警惕的心，这次诈骗让我们吃了教训，并且价格不贵的...后面再行走于社会的时候，我们要时刻保持着警惕的心，钱和安全都需要稍微留点心。最后就翻篇吧...一切都会好起来的...</p>
<h3 id="heading-5oir55qe6icb5amg">我的老婆</h3>
<p>我和我老婆大概认识快20年了吧，从高三一直走到了现在..我对她还是很了解的，她是一个心很大的人，并且对未来也不会太过于焦虑的...很多大事情做决定的时候，也很迅速的...不会有太多的纠结的。当然她本身欲望也不是很大，而且懒懒的。 她和我有很大的不同在于，我对未来总是很害怕并且很焦虑，但是她总是在当下过的好就行的。
所以她这个人就会比较没有警惕心，大大咧咧的过着生活。而我是与她很互补的性格，我很谨慎，并且喜欢有条不紊的生活着，有的时候会有点强迫症。。她的存在会让我看到不同的方面的好的。记得她刚生完我家女儿的时候，在家待业中。我为了减少她的焦虑，我说以后家里的钱你来管理吧，这个事情大概执行到了年底，我们年底对账的时候，我说家里有多少钱以及钱都花在哪里去了。我老婆就是那种一问三不知的状态的，最后她很愤懑的说，钱还是你来管理吧，这事情太麻烦了。。这就是她，她并不喜欢如此复杂的事情，她就想过的轻轻松松的。大概是2年之后，我和她说，我们家存到了100wrmb，她说什么？为什么会有那么多...那个时候工资涨的比较快并且我节省和强制储蓄了，这100w就来的很快的....我看到她很开心，感觉心里有底气的那种的。</p>
<p>可能生活对她太顺利了，所以这次就很容易被骗了。其实有的时候我在思考是不是因为我对她保护的太好了， 导致她本身就放松了警惕心。因为责任感有的时候对我也是一种压力，我有的时候希望她也能在生活中去分担一些责任的，所以很多时候我思考，那我就将这个事情交给你了，你去弄吧..我就不过问了..不过可能这次的教训让她能成长起来吧。。</p>
<p>最后最后，希望未来我们一家能开开心心健健康康的前进，未来的路不是一般的难走哦。</p>
]]></content:encoded></item><item><title><![CDATA[当下和最近想做的事情]]></title><description><![CDATA[1. Current 当下
最近依然还在中国，已经回来快一个月了. 最近一直在忙着带丈母娘看病和住院的。索性一切都还在可控范围内的，丈母娘由于糖尿病控制的很差导致本身的冠心病也复发. 这次去浙江省人民医院去做了造影检查和支架植入的手术的，不过这一切都比我预估的要顺利，我就怕她由于长时间没吃药和高血糖的持续的时间太长了，会带来严重的问题，不过好在没有发生最坏的事情的。 因为做了手术，所以这段时间我和我老婆的姐姐每人轮换的陪床，不过陪床真的好累的，因为睡得很不好的，特别的累。不过好在都结束了，而且丈...]]></description><link>https://nomoshen.com/5b2t5lil5zkm5pya6lr5ooz5yga55qe5lql5oof</link><guid isPermaLink="true">https://nomoshen.com/5b2t5lil5zkm5pya6lr5ooz5yga55qe5lql5oof</guid><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sun, 09 Nov 2025 03:44:23 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://cdn.nomoshen.com/images/clipboard_20251109105218_10338.png" alt="image" /></p>
<h2 id="heading-1-current">1. Current 当下</h2>
<p>最近依然还在中国，已经回来快一个月了. 最近一直在忙着带丈母娘看病和住院的。索性一切都还在可控范围内的，丈母娘由于糖尿病控制的很差导致本身的冠心病也复发. 这次去浙江省人民医院去做了造影检查和支架植入的手术的，不过这一切都比我预估的要顺利，我就怕她由于长时间没吃药和高血糖的持续的时间太长了，会带来严重的问题，不过好在没有发生最坏的事情的。 因为做了手术，所以这段时间我和我老婆的姐姐每人轮换的陪床，不过陪床真的好累的，因为睡得很不好的，特别的累。不过好在都结束了，而且丈母娘因为医生不断的警告之下也慢慢的知道了如果她在任性妄为的话，可能后面真的会有极为严重的后果；这次回来她也非常听话的测量血糖和血压等。为了以防万一，我和姐姐说了，她每次来的时候就帮忙check一下药是否ok...希望这样能一切顺利下去。</p>
<p>我和朋友最近在讨论关于是否应该请护工的这个问题，我和她一致认为如果病不是很严重的情况下，请护工是一个不错的选择的，因为自己人陪床是一个很累且很无聊的事情的，当然我并不是说我不关心父母，我只是觉得如果你本身自我意识是OK的，只是只有10-20%场景需要人帮忙的话，请护工的话可以极大的减少孩子的压力的。我大概问了一下我那个医院的价格，220元一天，一对一。。我感觉还是蛮划算的，比如手术动完之后的那个晚上我们进行陪护，后面就找护工进行照顾，这样双方都能接受的。不过，现在我还不敢提出这个观点，因为他们可能觉得这是离经叛道的一种. 哎...何必呢..</p>
<h2 id="heading-2">2. 后面三个月要做的事情</h2>
<p>最近思考了好多，因为生活没有重点，总是迷迷糊糊的过着...又由于亲人身体的问题来回奔波，搞得我也没有什么心思去思考太多的事情的。不过冥冥之中我还是想做点什么的，于是在昨天晚上我就慢慢清晰的思考到了自己可能需要做什么的。</p>
<h3 id="heading-21">2.1 经验的分享</h3>
<p>我准备将前面10年的工作经历分享出来，并非是一种比较简单的罗列，我想做的是基于某一个领域进行分模块的分享自己的经历和对应的模块的深度解析的，以及当时一些决策的背后的现实考量。当然会有很多技术上的内容分析和代码层面的解析。因为时间过去很久了，很多东西都已经成为了过去式，但是我依然想尝试去回顾这些经历，让自己对自己的过去的经历有一个相对比较好的认识的。而倚仗的项目可能是某一个比较有名的开源项目的， 我会对此进行水平对比同一个模块，它们的侧重点和优缺点的。目前AI的能力很强，可以加速这个过程的效率的，也是给我一种能完成的信心。</p>
<p>基本上的项目几个：</p>
<ol>
<li>分布式监控系统，目前叫做可观测性...我会结合潮流，慢慢的和目前的概念进行整合</li>
<li>mongodb： 这是我深入参与的系统，但是我没有真正去做过这个方面的开源，我想在后面继续去深入这块，因为我有一个想去澳洲的心，我思考是否可以尝试做mongodb的开源去接近这个目标；当然目标是一回事情，我将分析我们在mongodb做的优化和对应的原因</li>
<li>MQ: 这个我不知道是否能将清楚的，因为我只有不到1年的维护经验，不过我想从大面上去思考不同的mq的优缺点和对应实现的机制上的区别，还有找一个比较有名的mq，分析它的历史推进。</li>
</ol>
<h3 id="heading-22">2.2 看书</h3>
<p>最近想看的书有点多的，但是我想抓一下重点,分别技术和非技术吧，我会将中间的摘录到时候也分享到blog上面来，因为这样我也可以对自己有一个交代，而且在notebooklm的帮助下，做笔记本身效率就极高的。</p>
<h4 id="heading-5oqa5pyv57g7">技术类</h4>
<ul>
<li>Software Architecture The Hard Parts Modern Trade-Off Analyses for Distributed Architectures (Neal Ford, Mark Richards, Pramod Sadalage etc.) </li>
<li>Latency Reduce delay in software systems (Pekka Enberg) </li>
<li>Designing Data-Intensive Applications, Second Edition (Sixth Early Release) (Martin Kleppmann, Chris Riccomini) </li>
<li><a target="_blank" href="https://github.com/PacktPublishing/Modern-AI-Agents">Build a Multi-Agent System (from Scratch) With MCP and A2A (Val Andrei Fajardo)</a></li>
</ul>
<h4 id="heading-6z2e5oqa5pyv57g7">非技术类</h4>
<ul>
<li>刘擎西方现代思想讲义</li>
<li>the art of spending money</li>
<li>通往奴役之路，台/港 翻译</li>
<li>活在此时此刻</li>
<li>自由的窄门</li>
</ul>
<h3 id="heading-23">2.3 英语</h3>
<p>为了澳洲的4个6，可能还是不得不要更加用心去准备雅思的。虽然感觉好难....</p>
]]></content:encoded></item><item><title><![CDATA[子女教育-1]]></title><description><![CDATA[不要把孩子，限制在你自己的认知里。
因为他，生在另一个时代。
你看着他跌跌撞撞，总想伸手去扶，
可有些路，注定要他自己去走。
时代的风，早已吹向不同的方向。
你以为的稳妥，在他眼中也许是束缚。
你担心的风险，或许正是他看见更远风景的机会。

这段文字的出处是来自于twitter 黄浦记忆

自从我去年年初开始辞职待业中，我基本上每天都陪着我家女儿。家中女儿性格和我们夫妻有点类似的，有点内向，在陌生人面向会很内向的。一方面可能是因为我们夫妻平时就不爱社交有点关系的。这段时间我发现自己对女儿的控制越...]]></description><link>https://nomoshen.com/1</link><guid isPermaLink="true">https://nomoshen.com/1</guid><category><![CDATA[education]]></category><category><![CDATA[Kids]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Tue, 04 Nov 2025 11:50:23 GMT</pubDate><content:encoded><![CDATA[<pre><code>不要把孩子，限制在你自己的认知里。
因为他，生在另一个时代。
你看着他跌跌撞撞，总想伸手去扶，
可有些路，注定要他自己去走。
时代的风，早已吹向不同的方向。
你以为的稳妥，在他眼中也许是束缚。
你担心的风险，或许正是他看见更远风景的机会。
</code></pre><p><img src="https://cdn.nomoshen.com/images/clipboard_20251104193017_41417.png" alt="image" /></p>
<p>这段文字的出处是来自于twitter <a target="_blank" href="https://x.com/Himalaya_bear1/status/1985360127449329911">黄浦记忆</a></p>
<hr />
<p>自从我去年年初开始辞职待业中，我基本上每天都陪着我家女儿。家中女儿性格和我们夫妻有点类似的，有点内向，在陌生人面向会很内向的。一方面可能是因为我们夫妻平时就不爱社交有点关系的。这段时间我发现自己对女儿的控制越来越强，每天都需要她做很多"必须"做的事情，当然这个必须本身是我认为的，有的时候我反思自己是否管的太多了，或者是因为自己太闲了从而将注意力都关注在她身上的。但是有的时候好了一段时间之后，依然还是会控制不了自己的。
上面这个推，貌似直接就击中了我的痛点。我有点焦虑，我甚至于想让她能安安全全的不掉到任何坑的过完一生的。但是我内心又知道这是不可能的，就和很多我们这样的道理都懂，但是过不好一生一样的。年纪小的时候越早的面对该面对的，可能会为她们在后面路走的更加顺。就和当年我报考志愿的时候，我爸说要不弄个老师或者参加军队什么的，我说我不要，我想去学计算机的。就是这个决定能让我走上了相对快速的道路...而我就和当年我爸一样，我对未来也不可知，很多的事情现在好，可能未来就不一定好的，所以我所谓的必须要做的事情，也可能是不那么必须的。。。因为这只是我的经验的；
我之前想过，如果可能的话，我希望自己留给她的是一种我面对社会的一种相对成功的经验的，如何理财，如何面对政府，如何克服困难，如何解决难处等等一些相对ok的经验的，也是为了让她能在为了有更多的能力去解决遇到的问题。我们都知道大概率自己的孩子是一个普通人的，但是心中又执着于给予她们足够的保护，反而这将会成为他们的束缚...</p>
<p>从下次见到女儿开始，我要选择一些相对合理的方式去面对她，我需要将关注点多放在自己身上的，当我focus在她身上的时候，我能感受到她的压力也变大了...这一些都不好不好...希望我每时每刻都能记住限制的这点...放手让她飞，即使会受伤，我只需要给予一种永远存在的安全港湾，当你想休息的时候，不管什么时候都会无条件接待你。</p>
]]></content:encoded></item><item><title><![CDATA[国内的这段时间]]></title><description><![CDATA[之前那篇文章说了为什么回国了。这段时间我就在自己父母家和老婆父母家两端住，老婆在我走的时候说，回家的话去陪一下她父母的，多住几天...所以我就一周一周来会的换着住. 不过在国内的生活总是会无聊的，因为很多时候我并不喜欢在双方父母家待着的，而且我也不喜欢这段时间的天气的，时而冷时而热。 但是没有其他的更好的选择的，本来思考出去旅游来着的，但是我觉得自己貌似对旅游腻了，找不到心中的那种平静的。
这家的时间比较长，大部分时间是自己看点新闻和陪父母聊天来解决，丈母娘家离市区比较接近的，所以我会选择去杭州...]]></description><link>https://nomoshen.com/5zu95yaf55qe6lz5q615pe26ze0</link><guid isPermaLink="true">https://nomoshen.com/5zu95yaf55qe6lz5q615pe26ze0</guid><category><![CDATA[生活感悟]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sat, 01 Nov 2025 05:06:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761914962999/56557d11-449f-4575-9f6e-9ed30d858905.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>之前那篇文章说了为什么回国了。这段时间我就在自己父母家和老婆父母家两端住，老婆在我走的时候说，回家的话去陪一下她父母的，多住几天...所以我就一周一周来会的换着住. 不过在国内的生活总是会无聊的，因为很多时候我并不喜欢在双方父母家待着的，而且我也不喜欢这段时间的天气的，时而冷时而热。 但是没有其他的更好的选择的，本来思考出去旅游来着的，但是我觉得自己貌似对旅游腻了，找不到心中的那种平静的。</p>
<p>这家的时间比较长，大部分时间是自己看点新闻和陪父母聊天来解决，丈母娘家离市区比较接近的，所以我会选择去杭州西湖玩的，当然本身也不是真的想去干什么的，只不过是选择一个环境不错的地方不断的磨练身体的。我选择西湖主要的原因是环湖的整体的路程比较合适的，不会太远也不会太近的，而且风景不错的。真的累了可以坐下来休息一番的。封面照是在西湖拍的，我自己也蛮喜欢的；很多时候我很难理解为什么西湖这样的风景点算是5A风景点，因为我觉得其实还是蛮普通的，不就一个保护的比较好的湖吗，没有特殊之处的。但是这次在环湖走的时候，又觉得蛮好的，风景恰到好处，配套也是很完善的，看着的时候心里也是很开心的。</p>
<h2 id="heading-576o6aof">美食</h2>
<p>在马来的生活中，虽然很多时候我依然能吃到很多中国的好吃的东西，但是总会少一些东西的。我尤其是惦记酸菜鱼的，在马来没有特别好的店，可能也是我不知道吧，在那边的时候偶尔会想着要吃的，所以这次回来我就去了2家相对评价还不错的店里去吃了。因为是一个人，所以每次点了之后就会觉得太多的，但是如果不点的话就觉得有点可惜的；
一家叫做新安江奶酸菜鱼的，我觉得做的一般，而且鱼不是先杀的，所以自己感觉一般的；第二家是在乡下的，活鱼现杀的，味道也极好的，小红书上找的，这次小红书没有骗我的。。不过最小的一条有3斤多的，吃的我最后有点撑。老板娘一开始建议我不要吃了，太多了...我心想，这老板娘真实在，还有劝退的...不过我依然保持既然来了我一定要吃，于是点了...现杀的鱼肉就是很不错的，口感和味道都是极好的。
可能我真的比较喜欢吃鱼，昨天从医院看完丈母娘回来，我就走进了一家专门吃鱼头的店；老板娘问几个人，我说一个的，但是一个人的话吃一个鱼头太多了，要不半个就好的。。不过最终我付钱的时候发现还是蛮贵的，168一份。。不过我进去的时候也没问，吃了再说的吧。</p>
<p><img src="https://cdn.nomoshen.com/images/IMG_5996.jpeg" alt="image1" /></p>
<p><img src="https://cdn.nomoshen.com/images/IMG_5999.jpeg" alt="image2" /></p>
<h2 id="heading-5a625lit6icb5lq6">家中老人</h2>
<p>这段时间一直在医院和丈母娘家两边跑，原因是丈母娘说不舒服的，在我们的强烈要求之下去住了院的。然后我在分析她吃的药之后，我发现她将一种心血管疾病的药给停了的，那个药是必须要吃的，而且这件事情也不是一次两次了，前面也有几次因为自己把这个药停了之后导致了不舒服的。之所以如此重要，是因为这个药是降低血液的凝血功能的，因为丈母娘放了两个支架，所以医生说这个药要终生吃的，但是我整理她的药的时候，发现怎么样也找不到的这个药，我就问为什么这个药不见了，她说，她觉得吃这个药会死，所以就不吃了。。。我当时就直接气炸了...脑子有毛病吗的，为什么要做这样的事情的。</p>
<p>因为之前有一次也是类似的事情，不吃这个药导致很不舒服的，吃了就缓解了。关键问她什么时候不吃的，也是一问三不知的。还有糖尿病的血糖高的离谱的，都已经开始有糖尿病并发症了。但是劝她去医院里面看看，总说不去的，去了可能要死在医院里面的。这次去检查，医生发现她的药都不是很好的那种的，问了才知道她为什么方便，直接在卫生院配了药。她自己去杭州配药并非第一次的，她已经轻车熟路了，但是她就不愿意去...交通不便，地铁直达的，但是她就是不愿意去。再者就是每次不舒服的时候，就会自己去配一堆中药吃的，觉得吃那种东西会好的；我们不是第一次劝说，不要随便吃这类东西，但是很难被听进去的。</p>
<p>之前我思考和姐姐说，是不是差不多时间带妈妈去做一次心脏检查的，但是丈母娘就死活不肯去的。好了现在去了医院的，医生直接就说这事情很严重的，而且丈母娘的支架已经放了很久了，需要去检查一下，一方面是预防第二方面是如果有问题可以直接再放一个的。丈母娘在医生的劝说之下答应，这次出院之后就去杭州大医院做检查的，可能她也害怕了。
这件事情，从头到尾我都很生气的，因为丈母娘搞得现在这个样子，基本都是自己作出来的，胰岛素有好的不要的，自己去小医院开；其实周边有一些稍大一点的医院她也觉得麻烦的；心脏病的药也不吃的，说她几句就说，死了算了。我心中想，你因为能直接死掉，万一医生说到时候开胸手术不还是自己受苦吗。能预防的时候不预防，等到严重了，到时候受苦受累的不还是自己吗。烦的要死的。我朋友开解我说，很多时候，能改变的都只有自己的，能在意的也就只有自己的，能可以给予很多意见的，但是是否听取，还是要看对方是否在意自己的。我能做的就是在我还在国内的时候，帮忙一下，也不用太强势的要求，只需要给予合理的建议即可的。至于最终对方是否愿意听取，是否能去坚持，只能看她是否在意自己的身体的。我说是啊，要不是在国内，我就眼不见为净了。做人我时而自私时而又有点责任感的，尤其是对上一辈，我心还是硬的，但是我如果在身边的话， 我依然还是会主动去帮助他们的，因为会觉得责任所在的。朋友劝解，别过于有责任心即可的。
这事情估计还要花不少时间，下周带老人去杭州，估计要在杭州住一段时间的...希望一切都好好的，这段时间我很想女儿的，虽然视频能解决见一下的感觉，但是和亲自陪伴是完全不一样的，每次女儿说想我的时候，我又何尝不是呢。希望一切都能快一点的，我真的很想陪着她们。</p>
<h2 id="heading-5yw25luw">其他</h2>
<p>这段时间研究了一下澳洲的移民，感觉难度很高的. 听了分析，感觉不想浪费钱的话，我可以选择海外进行申请，然后不管是技术还是直接找工作的，都还是很难的；但是如果能找到那种海外工作的话，那就完美了。而且基础门槛是雅思4个6，对我来说还是能勾得着的要求的。工作吗，我感觉我有一点想法的，之前的经验和一个database的公司有点契合的，准备一下可能会有点机会的，属于技术比较高的那种的，但是不知道最终如何的，但是自己待在马来西亚的话，其实也不是不行；最近老婆有点反复，一方面我不是没工作吗，虽然资产给予了我们不少的收入，但是她还是担心，是否要继续走其他的路还是待在马来的，马来这个国家我觉得如果真的待我也能接受的，我找一份马来的技术的工作也不是很行的...但是我依然还是想着能走到发达国家中去，给予孩子一个相对高的阶梯的，目前也处于这个十字路口。</p>
<p>最近听和看了一些东西，中间有几个点让我还是感受很深的：</p>
<ul>
<li>世界是我们的，也是你们的，但是未来是他们的；这句话是针对全世界的人口生育率下降的问题的，现在的欧洲，日本，中国等等发达国家都在面临生育率下降的问题的，如果按照30年的纬度看的话，慢慢的这个世界会留给生育率更加强大的民族，比如伊斯兰、非洲等的。想着这件事情，很多事情必要性貌似也不是很强的。哈哈哈不过我并不是很在意，我在意的还是当下吧。</li>
<li>何为躺平；年轻人目前的躺平我更加觉得过于的悲观或者极端的；之前看过一个视频和一个播客，基本上的观点是一样的，躺平并不是不努力，而且更加有效的努力而非无效的卷。其实意思是找到自己想做的，然后好好的学习和准备的，锻炼身体，练好英语，等到机会来的时候，可以随时抓住的。我觉得这才是所谓的躺平，少刷点手机的，多读点书的，早睡早起等等</li>
<li>AI很强，但是All in AI很危险的...</li>
</ul>
<p>最近看了几本书的，分别为：</p>
<ul>
<li>连接；英文名Nexus；很不错的书...里面讲到的虽然AI诞生很厉害，但是如果人类认为这是银弹的话，那就会出现极端的恐怖的人道灾害。</li>
<li>latency，这是一本技术书记</li>
<li>一本讲哲学的。为什么看这本书的，主要是在听世界苦茶的一期节目的时候，他说，反而活的比较辛苦的人才更加应该去看哲学，因为你除了这些方式减少你的痛苦，你不能像有钱人那样通过钱来抚慰自己的心灵，还是有点道理的。</li>
</ul>
<p>最近看了一些动画片</p>
<ul>
<li>spy &amp; family： 这个很好看，因为我在看的时候看到了如何教育孩子的情节，也非常有意思的...</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[20250-10-09 最近一次旅行]]></title><description><![CDATA[原因
我们一家子都待在马来，但是我们没有去搞第二家园的（长期签证），所以我就必须频繁的进出马来也保证合法性的，但是今年马来和中国双方出了一个双方免签的政策将无限进出马来的漏洞给堵上了。所以我不得不要获得一个相对长期的签证的。去年的时候我通过学习英语的方式搞了一个student visa来获得合法签证，但是有效期只有一年的，好在今年马来西亚一个孩子可以办理双方父母的陪读签证的。但是必须在我孩子和老婆下了签证之后才能办理的，为此我就只能先离开马来。我不想回国的，所以我就思考我要来一次说走就走的旅行的...]]></description><link>https://nomoshen.com/20250-10-09</link><guid isPermaLink="true">https://nomoshen.com/20250-10-09</guid><category><![CDATA[旅行]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Mon, 13 Oct 2025 11:22:58 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-5y6f5zug">原因</h2>
<p>我们一家子都待在马来，但是我们没有去搞第二家园的（长期签证），所以我就必须频繁的进出马来也保证合法性的，但是今年马来和中国双方出了一个双方免签的政策将无限进出马来的漏洞给堵上了。所以我不得不要获得一个相对长期的签证的。去年的时候我通过学习英语的方式搞了一个student visa来获得合法签证，但是有效期只有一年的，好在今年马来西亚一个孩子可以办理双方父母的陪读签证的。但是必须在我孩子和老婆下了签证之后才能办理的，为此我就只能先离开马来。我不想回国的，所以我就思考我要来一次说走就走的旅行的。大概的计划是：泰国普吉岛，云南，最后回家待一段时间的。但是总的来说，计划赶不上变化的啊...这个最后再说。</p>
<h2 id="heading-5row5zu95pmu5zcj5bkb">泰国普吉岛</h2>
<p>大概在2015和2016年我去过两次普吉岛的，整体的影响还不错的，毕竟那个时候基本上是头几次出国的，而且每次都是为了都泰国躲避杭州冬天的，而且普吉岛的海滩会比马来的要好很多的，所以第一个目的点是普吉岛的。我预定了大概8天的酒店的，为了压一下预算的，我大概住的酒店很一般的，价钱应该120差不多；后来我发现过几天再去看的时候，变成不到100，有点坑啊。
大概是10-09号登陆普吉岛，看了一下grab打车去酒店大概要200rmb，还是觉得太贵了，于是搜索了google map 发现可以做机场的smart bus可以到，票价20rmb差不多，果断就做了这个车...大概花费了1个多小时到达了芭东海滩的，我就跟着导航一路走到了酒店。不过让我比较意外的是，我印象中的普吉岛貌似没有那么破烂呢，路两边的建筑实在是不咋滴的，不过随着州了一段时间，我发现了几个印象中我们之前吃饭的地方的，我才真正确定可能是我的印象被自己美化的。到了酒店，我发现酒店的住宿条件一般的，但是干净程度还行，我心里还觉得是OK的。
旅行第一天总是很累的感觉的，一方面是早上起的早来整理行李，做了近1个小时的grab到机场，就感觉整天都在路上奔波的。所以回到酒店我就打开了电脑，爬上睡觉了. 大概稍微休息了1-2个小时，我就起床开始去外面逛..我找了周边google map的评分还不错的饭店，准备去吃饭的；但是到了饭店的时候发现整体的环境很差，我就再找找其他的，随着走的过程中发现周边的街道环境真心很一般的，大概走了快1个小时，几乎把那边的街道都走遍了，最后我随便找了一家店点了几个菜吃的；饭菜还可以的，很符合中国人的口味的，我还叫了一瓶泰国的啤酒的，味道不错的，喝掉一瓶之后我都开始有点晕乎乎的。因为晚上没什么安排，我就再叫了一瓶不一样的啤酒继续喝，顺便拿出了kindle看了会书的。
饭店本身人不多，所以占座没什么负罪感的。最近在看nexus这本书，看的是台湾版本的连结；内容非常的有意思的，而且作为计算机领域的我，我越加觉得AI的产生会对人类产生很大的影响的。里面提到AI与过去的其他的技术突破都不一样的，之前的不管任何技术的发展，整个人类的信息圈依然都是以人主动发生，不管是真相还是伪造的假消息，都来源于人；但是AI的产生就不一样的，AI可以自我对消息进行反应，也就表明在整个信息圈中你很难去鉴别是人还是机器发起的，而且AI的效率极高的，数量也极大的，我很难想象后期的信息圈中到底有多少是人多少是AI。在后面的几天中，我听了一个世界苦茶聊到了tiktok的这个收购的问题的，里面也聊到了AI对整个人类的信息和偏见的影响的，后面有人分析到目前国内的终端矩阵都是机房话的，成千上万的非人类节点不断的按照的人类的目标输出着所谓的信息，而这些信息也不断在影响着看这些信息的人...想想就害怕..
喝了半瓶酒之后，觉得实在喝不了了，我就起身回酒店的。我还不知道后面要如何玩；其实我有点后悔在泰国住那么多天，因为我发现这边的环境我并不是很喜欢的。不美...而且我去的几天，基本每天都下雨导致到海并不是很好看的，而且泰国普吉岛的脏乱让我实在有点难以接受的。不过我心想，也算了...反正都已经安排了酒店。后面几天的生活相对比较枯燥，但是依然还是有一些开心的事情：</p>
<ul>
<li>非常划算的泰国海鲜的。在普吉岛的海鲜是真便宜。我在马来其实没怎么吃到海鲜，因为马来的海鲜并不便宜的。甚至于有点贵的，所以我这次去它们的海鲜市场买了一些海鲜，在进行了讨价还价之后买了一些巨大的皮皮虾 + 一条石斑鱼 + 2个鱿鱼 + 一捆蛏子，大概是200rmb，我后面思考应该是买贵了，但是无所谓的...200还行，我感觉的。在二楼随便找了一家加工店，又买了一瓶啤酒，然后就开始吃吃；不得不说，是真好吃的，而且烧的也很不错的。因为只有一个人所以最后连啤酒都没喝完的，实在太撑了.</li>
<li>找了离海比较近的cafe，然后在里面进行学习的。普吉岛有一个不是很好，基本什么都要收钱，尤其是上厕所也要收钱，而且很贵的。比如一次厕所4rmb...而且很多cafe店不带插头，这就让我很难受的，在小红书上找了一下，最后还是找到了一家店有电源提供的，所以就在那边办公了。普吉岛的coffee很贵，我甚至于觉得远贵于国内的，所以我就基本上也就点个美式差不多的，30多rmb吧...在马来一个美式就17rmb差不多的。在办公的时候外面有开始下雨了，我觉得我也是运气不好，基本上在普吉岛的几天几乎天天下雨的。听着外面淅淅沥沥的雨声，我慢慢的看了几篇技术文章的。</li>
<li>酒；我其实本身是不大喜欢喝酒的，但是由于在马来酒的价格很贵的，所以来到了普吉岛就可以放心喝一些。普吉岛上的啤酒不算贵的，我找到了bigc ，这是普吉岛的大超市，大概10几rmb一大罐啤酒的，我就买了好几瓶放到酒店冰箱里，平时没事可以喝。我发现泰国的啤酒味道是真心不错的...有一天我就在酒店里面，买了一些日料和主食在酒店里面喝着啤酒过了一天的。 中间也出去吃了几次，看xhs上的评价，并且google map的评价也不错的店吃了，总的来说可以，但是中间貌似胡萝卜是不新鲜的...这让我有点难受的。</li>
</ul>
<p>过了4天，大概就是每天看书看电影和吃饭喝酒睡觉。我思考还要过5天就可以去云南的。突然一天，我老婆打电话说，家中她的二姨娘过世了，让我回家去代替她。这这这...我还真没办法推脱，一方面是我老婆的护照上交去贴签了，她回不来，第二方面我不是比较闲吗.这事情真的是没办法...不过我也在普吉岛待得有点腻，我想想也就算了，我就跑到前台去问问我提早check out是不是能退钱，不过被告知不能...算了算了，不多就走了...</p>
<h2 id="heading-hk">HK</h2>
<p>我购买了普吉岛到杭州的机票，不过没有直达的，只有转机的。。。价格有点贵，而且时间也很长的。不过没办法，我需要赶着回去，于是买了一个国泰的转机hk的...不过辛苦的是我需要在机场留宿一晚的，我不想出去住酒店的，所以我就准备在机场找个地方睡觉了。。。希望不会冻坏了....
之前我在上海机场睡过一次，不过那个时候我准备比较多，我还带了毯子...这次我没想到会这样的，只有长袖没有长裤，希望晚上不会冷....害怕...
在机场的这个时候，我就开始写我这文章的，我找到了晚上的落脚点...希望到时候不会有很多人来抢位置的。HK还是慢慢在变化，我打开了GEMINI，发现提示用不了...我一下子才发现我可能又需要用代理的..</p>
<h2 id="heading-5pya5zco">最后</h2>
<p>我自己发现自己最近有点迷茫中，旅游并不能解决我的问题的。长时间的不做正经工作让我有点闲的发慌的，一方面我还是想发挥一下自己的价值，另外一方面我又害怕着去面试，可能不会有人要的。本以为可以通过旅游让自己开心点，但是没有达到效果的...感觉需要为自己设定一些目标，然后慢慢做做看...</p>
]]></content:encoded></item><item><title><![CDATA[最近我的状态]]></title><description><![CDATA[以下都是自己的吐槽，只是一时间的心理状态，不要全部当真.

回来2周了，已经快腻了；我既不想在两边待着，但是不得不待着；我老婆说一周这边一周那边的话，我其实并不是很想，你愿意待哪里就哪里吧；在南阳给我的感觉并不是很好的，感觉空间上的狭小让我透不过气来的，这可能就是所谓的私人空间吧，一个完全属于自己的空间并且会有一段时间和家人分离的时光的，让自己可以做一些自己想做的事情的；目前在前进就相对还好一些的，有自己的房间空间，我父母基本上也不管，所以只需要躲进去就好的；但是其实我更加怀念马来的生活，因为很...]]></description><link>https://nomoshen.com/5pya6lr5oir55qe54q25ocb</link><guid isPermaLink="true">https://nomoshen.com/5pya6lr5oir55qe54q25ocb</guid><category><![CDATA[Self Improvement ]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Thu, 17 Jul 2025 04:08:27 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>以下都是自己的吐槽，只是一时间的心理状态，不要全部当真.</p>
</blockquote>
<p>回来2周了，已经快腻了；我既不想在两边待着，但是不得不待着；我老婆说一周这边一周那边的话，我其实并不是很想，你愿意待哪里就哪里吧；在南阳给我的感觉并不是很好的，感觉空间上的狭小让我透不过气来的，这可能就是所谓的<strong>私人空间</strong>吧，一个完全属于自己的空间并且会有一段时间和家人分离的时光的，让自己可以做一些自己想做的事情的；目前在前进就相对还好一些的，有自己的房间空间，我父母基本上也不管，所以只需要躲进去就好的；但是其实我更加怀念马来的生活，因为很多习惯我可以继续维持的，可以比较好的做很多事情的。我每天可以运动和看书学习的，时间上比较好安排的; 这可能就是我目前的烦恼的；最近准备每天去library，然后准备面试相关的事情的.</p>
<h2 id="heading-5a56ieq5bex55qe5lqg6kej">对自己的了解</h2>
<p>这一年多我对自己的了解有点深入了，我还是有点想要社交的，我并不是一个喜欢孤独一个人待着的人的；所谓<strong>人气</strong> 我感觉是一种与社会连接的感觉，我不喜欢一个人待在家里然后做事情，可能只是一段时间会需要那种状态的；我想要被需要的感觉吧，不管是夫妻还是女儿，一种需求的感觉会让自己能更加容易觉得自己有价值的. 最近我听一个<a target="_blank" href="https://www.youtube.com/@flipradio_fearnation">FearNation 世界苦茶</a>的某一期中讲到了关于男女关系: </p>
<blockquote>
<p>里面一个人问他，要不要继续找下一个男朋友的；里面提到的一个观点: 男女朋友只是锦上添花，只有自己独处能生活到好的话，才是找男女朋友的基本条件的；这个观点其实是最近几年比较火的，我在之前也是比较认同这个观点的，因为我觉得只有我强大到不需要另外一个人也可以生活的时候，再去找对方的时候是一种真实存在并且相对公平的，但是他说这是不对的，而这个观点中的那个人才是有毛病的；</p>
<p>当我听到这句话的时候，其实我也开始反思，我心中总是存在一种完美主义，这个东西一致让我很难做好很多事情的。本质上是因为我害怕失败，失败了就不完美了；而这也让我举步维艰的，我明白，而且也太明白的；而上面说的那种情况其实本质上也是完美主义，人并不是做好十分的准备才能去做的，而是应该在过程中去边做边前进的，可能在过程中事情的发展会发生变化的，偏离你原先的计划和原先的技能树的；而我自己感觉自己设定在自己的框架里，因为在这框架内我有点self-confidence来去应对，并且符合我自己的完美情况； 可能这就是缺少所谓的brave，勇气这种东西是与生俱来的，而我感觉自己少了这种东西；我在女儿的身上也貌似感受到了这种…不过先不提女儿的；</p>
</blockquote>
<p>回归到这个博主的观点，我突然有点醒悟过来的；所谓的那种观点本身就是完美主义的，一种当自己处于能应付所有情况以后你可能就不会有需要去找朋友的需求的，缺少了行动的动力；而且这种心理会让自己很难跨出第一步，因为自己还没有准备好的。而我最近的状态基本就是这样的，从去年的1月份开始我就辞职在家休息的，当然前半年的状态还是很不错的，因为很freedom，不需要为了工作上面的事情而烦恼的；每天只需要休息和带孩子玩即可的。但是慢慢的我就开始存在了压力的，因为毕竟家中的财富还不能让我们坚持一辈子的，所以我不得不要继续前行，而目前的我只是短暂的休息；所以后期我就去学习English了；刚开始的我还是很有动力的，但是慢慢的就开始懈怠了，今年的5月份我学习完毕了，English的感觉会好一些，但是没有达到我的要求的..这个时候我又害怕了，我害怕自己这样的英语是不是真的可以去找到工作的；我不敢去尝试考雅思等等的...现在我就struggle在这边...</p>
<p>有的时候我自己都想笑自己的无能的。为什么总是怕前怕后的...这段时间我很内耗中，因为这种状态让我很难受；不过我目前大概能知道如何解决这些问题，我要去做成一些事情，让自己聚焦到一些事情的上去的，这样可能减少内耗的..有一段时间我发现自己有事情做的时候就会很舒服的，可能的确类似于很多人说的：闲的慌了...目前的自己还处于一种不是很好的状态的，但是我有在向内观察自己的，什么时候自己会好一些什么时候自己不那么舒服的...目前给自己短暂的几个目标是:</p>
<ol>
<li>找到一份工作，维护家庭的正向现金流...我已经快18个月没有工作了，我其实心中很害怕，但是我需要好好克服的这个缺点,去尝试而不是畏惧这些;</li>
<li>考雅思，我要达到6分的雅思成绩；应该来说对我目前的难，但是我觉得这也是我需要去克服的；我想去澳洲，带着家人们一起过去的，而这是我能达到的baseline...</li>
</ol>
<h2 id="heading-5a625bqt">家庭</h2>
<p>当你自己状态很差的时候，你对家人态度也很差的...我越来越能感受到这点的..这段时间我状态和内耗太多了，导致我对孩子很不耐烦，需要的只是想通过严格的管控她来进行管理，当然效果不好，因为小姑娘是自由的人格的，所以反抗的很严重的。而对于妻子，由于我自己状态很差，当我看到她每天很清闲也不努力做事情的时候，我就觉得她为什么没有那么有干劲；于是乎对她的态度就会莫名的很差..这段时间我不断的反省我觉得是自己的问题导致了这些现象的。如果不是我压力如此之大的，我就会更加宽容和耐心去面对家人的。。哈哈，所以有的时候思考的时候，发现可能什么都没变，但是就是因为自身的问题导致了后面的问题。</p>
<h2 id="heading-5pya5zco">最后</h2>
<p>在国内的生活的这段时间，我本身也不是很舒服；当然很大原因是因为我需要去面对很多人的质疑。因为我们家庭目前还没有收入，而对于没有收入的家庭很多人都会觉得我们在瞎弄。前段时间我老婆的父亲让我老婆有时间要多看书的，不要没事可干，每天玩游戏什么的...哈哈哈他说这话的时候我感觉这话是对我说的，哈哈哈...尴尬的...因为毕竟是我的原因导致目前我老婆的状态的。所以说到底还是因为我的decision。要改变这个状态依然还是在于我是否能维持以后的生活的。虽然害怕，但是我要前行的。</p>
<p>但是我不喜欢去面对这样的情况；因为别人的质疑会让我也开始质疑；你们的这些问题我都知道，但是你们不要给我压力，我会慢慢解决的..所以很多时候我不想回国，很不舒服；不舒服的理由有：</p>
<ol>
<li>没有舒服的私人空间的；一方面要和父母去住在一起，一方面没有舒服的环境可以维持之前的生活；</li>
<li>需要面对别人的质疑；我的内心不够强大的，所以我不想面对...哈哈哈</li>
</ol>
<p>未来的希望是我找到工作，有了稳定的收入之后想去澳洲perth，让孩子在那边收教育，并且老婆去读一个专业，这样整个费用是可以被接受的...而这一切都还需要努力...我的努力需要更加多一些。最后最后我有一个心得：</p>
<blockquote>
<p>不要过多的关注政治、新闻等流量性质的东西；因为会不断的消耗的注意力；方法呢：不断删减你的信息流，推特、youtube等等，只保留有价值的即可；
一定要多看书的，尤其是AI这个世界，你以为你看书变快了，不是的；你需要有更多的知识去驾驭AI；AI有多强在于你有强的；一句话说AI的话：garbage 进 garbage 出；你需要更多的知识才能知道如何去驾驭AI，问出好的问题等;</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[看f1观后感]]></title><description><![CDATA[看F1观后感
2025-06-29下午，我一个人去看了这部电影的；我邀请了我老婆一起，但是她貌似不是很感兴趣.所以最终就趁着孩子去上画画课，我就去看了. 我一直很期待这部电影，一方面的主题是F1赛车，大部分男孩子都比较喜欢赛车，不管是小时候的四驱小子还是因为对速度有着基因的着迷. 另外一方面是因为主角，布拉德皮特这个演员从年轻的时候开始看，尤其是他演的本杰明，真的超级帅气..我和我老婆说，他是那种男的和女的看着都很帅气的人，我老婆说她没觉得..哈哈哈. 不管怎么样，电影上映了之后我总是想找机会去...]]></description><link>https://nomoshen.com/f1</link><guid isPermaLink="true">https://nomoshen.com/f1</guid><category><![CDATA[Movies]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sun, 29 Jun 2025 09:34:01 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-f1httpsmoviedoubancomsubject35689244">看<a target="_blank" href="https://movie.douban.com/subject/35689244/">F1</a>观后感</h2>
<p>2025-06-29下午，我一个人去看了这部电影的；我邀请了我老婆一起，但是她貌似不是很感兴趣.所以最终就趁着孩子去上画画课，我就去看了. 我一直很期待这部电影，一方面的主题是F1赛车，大部分男孩子都比较喜欢赛车，不管是小时候的四驱小子还是因为对速度有着基因的着迷. 另外一方面是因为主角，布拉德皮特这个演员从年轻的时候开始看，尤其是他演的<a target="_blank" href="https://movie.douban.com/subject/1485260/">本杰明</a>，真的超级帅气..我和我老婆说，他是那种男的和女的看着都很帅气的人，我老婆说她没觉得..哈哈哈. 不管怎么样，电影上映了之后我总是想找机会去看...现在终于到了这个事情，我这个mall没有所谓的IMAX，不过我依然还是选择了一个相对大的场次来看. </p>
<h3 id="heading-1">1. 总体评价</h3>
<p>对我来说，应该是本年度最佳的电影的. 要好于之前阿汤哥上映的不可能任务的最后的一部；我个人的评价是：</p>
<ul>
<li>整个故事线：相对比较简单的，你看开头基本上就知道后面结果是怎么样的；但是绝对绝对不枯燥;</li>
<li>整个电影的节奏非常好，不会有任何你突然觉得有点出戏或者不耐烦的感觉的；剧情节奏没有断，一直拉着我的情绪和眼球；这已经是我一两年没有的感受的；</li>
<li>特效和音乐都非常完美；对F1赛车的第一视角以及速度的特效，加之适当的music加入的..让我真的感觉自己在场地上开赛车的体验；</li>
</ul>
<p>所以我的整体评价是完美; 甚至于我会看很多次对于这种电影的; 我非常recommend this movie.</p>
<h3 id="heading-2">2.主要内容</h3>
<p>主要内容其实比较简单的; 一个F1天才在年轻的时候因为事故早早的陨落，没有获得该有的荣誉的；人到中年，朋友给予他重新获得当初的梦想的机会，他依然决然的接受了这个机会；而想要获得champion谈何容易，给予他的的基础条件并非是什么都准备好的，而是很差的；朋友的F1车队在前半赛季一分未得，车内赛车又慢的不行的；而且主力车手很有talented，但是非常的傲慢，心没有集中在赛车上，而且将一部分时间花在了所谓的包装上的，尤其是面对车队这种成绩他更加需要思考的下一个车队. 这就是他面对的基础条件的. </p>
<p>作为早年的天才，他有着自己的骄傲，而且走过了所谓的中年的时代的，他更加清楚自己要什么的；一开始的配合很不好的，两个人的第一场比赛因为谁都不让谁最终导致双双出局的。对他来说这并不是个很好的结果，所以事后他独自一个人躺进了冰水中的，我思考他是在冷静和反思的。他对赛车很熟悉，并且对比赛也有自己的想法的，在后续的比赛中，他不断的使用自己的经验去帮助车队去取的分数的；中间有很多不是那么光彩的招数，但是对他来说，赢就是王道的. 慢慢的车队好起来了，而且他用他的专业的知识让车队的技术总监去改造赛车，让他能在弯道中去节省时间，通过不断的叠加这种优势慢慢的赢的比赛的。一切都是那么的顺利，车队里面的人慢慢的也开始接受他的strategy，因为能赢. 但是在后面一场比较重要的比赛中的，头号选手因为过于年轻和没有耐心导致了一场比较惨的事故，让他们在那场比赛中失去了积分；</p>
<p>而后，主角就开始作为主力选手去参加比赛，慢慢的他们车队的积分就好起来了。可以看出这中间会存在一个雷就是头号的年轻选手，他感受到了危机，甚至于他觉得是这个老选手真的会抢走他的一切的。等他回来的那场比赛因为两个人的较劲最终导致比赛输的很惨的。赛后主角很气愤，看着出来他真的很想要赢的，而且这个目标慢慢的在逼近中的。事后这个车队的老板通过一种方式让双方慢慢的认可对方的，而且通过扑克牌的方式决定了第二天的种子选手的选择；当一切都变好的时候，危机又慢慢的靠近。这个世界总会有一些人搞破坏，而且往往是内部的人；他们被举报使用了违规的材料的，导致他们只能用之前的配置比赛；这让主角很气愤，因为用这套配置是不可能赢比赛，眼看要实现的梦想希望有突然不见了。</p>
<blockquote>
<p>这边我突然想到了一个人说的话，但是我忘记了出处. 大概意思是：要让敌人崩溃的方法就是在他们觉得有希望的时候狠狠的把希望给破坏掉. 那样会让人一下子就绝望了.</p>
</blockquote>
<p>就因为这样，男主角开车的时候出了严重的事故. 当然这个事故并没有让主角受伤很多的，但是当车队的老板，他的好友看到他10年前的病例的时候，他突然后悔把他叫来了；10年的车祸导致男主角脊椎严重受伤，还插了好几个钢钉在里面的。这样的身体咋还能开车呢，那是会死的...于是老板把他fire了. 当然我们都知道故事不会这么结束的，还有最后一场比赛的。最后的转折点来了，F1赛委会知道了举报是假的，可以使用新的配置开车的，并且头号车手终于变mature,他找到了自己为什么开赛车的理由，他变得更加motivated. 这下万事俱备的情况下，男主角回来了，经过了不懈的努力+老天的不断的帮忙，男主角的车队最终赢了比赛；哈哈哈，他很开心的，因为这是他的梦想的。比赛最后一段时间是男主角在第一名的位置开车，这个时候突然电影就安静下来了，貌似什么都慢下来了，呼应了前面男主角说的：他喜欢在开赛车，因为当他在车上的时候会感受到那种peaceful和fly的感觉. 结局是好的，车队赢了比赛，不会被卖出；年轻的头号车手回归了纯真的赛车手的状态，focus到自己的梦想上去。而男主角离开了车队，去尝试不断的车开。</p>
<h3 id="heading-3">3. 感动我的瞬间</h3>
<p>这个故事情节对我来说并不是很简单，因为中间还是反转了多次的。尤其是好起来的时候，又急转直下的转折。虽然我能明白的，但是依然还是为这个转折导致心痛的。我自己在看电影的时候，全程都很紧张的，很多时候还不自主的抖。我想要他们赢，好像赢了就是我赢了的感觉。几乎没有任何瞬间让我觉得想去看会手机等等。当然因为时间的问题去了一趟厕所的。对我来说，这部电影中很多瞬间都让我觉得很影响深刻的。</p>
<ol>
<li>第一次参加比赛，两个车手因为不配合导致双双出局。赛后头号选手很气愤，但是当媒体说要拍照的时候，头号车手就摆出一个很帅的和微笑的pose让他们拍；这个时候男主角说了一句：你为什么要关注的这些，你有什么好笑的，你都输了比赛。还有就是我不会让，你要凭本事来超过的。</li>
</ol>
<blockquote>
<p>其实这边男主角就开始再说一件事情，你要关注赛车，不要关注这些媒体；输了比赛需要是反省反思和伤心，而不是作秀;</p>
</blockquote>
<ol start="2">
<li>男主角开始比赛之后，每天都在持续绕着场地跑步的，来赛场上很早的，并且会关注比赛的赛道；会不断的模拟调整自己的车来让自己的跑圈速度更加快的。每天早上会因为赛车的事情睡不着而起床开始研究各种技术的。思考如何让自己的赛车更加快，并且找技术leader讨论自己的方案的。</li>
</ol>
<blockquote>
<p>这种专注力真的很可怕的；相比较而言的，头号车手每天来的很晚的，准时下班的；并且花很多时间去参加媒体活动的。和车队的其他的人员保持了一种的距离感觉的；关于这段，我觉得可能是男主在经历了时间的沉浮之后，慢慢知道自己要什么的；但是机会并非什么时候都会给予的，现在这个机会来之不易，他身体和大脑是激动的紧张的，他想要牢牢的抓住这个机会。这是一种年轻人没有的执念的，可能也是所谓的失去了才知道是最好的。很多时候机会是不会再次出现的，你需要在懊悔中活一辈子的。年轻人总觉得未来都还会有的，导致了对当下的不珍惜. </p>
</blockquote>
<ol start="3">
<li>我忘记了在什么场景了，但是男主说了一句： 你只需要focus，其他的都是噪声;</li>
</ol>
<blockquote>
<p>可能是目前我的状态很差的，所以当我听到这句话的时候我一下子被触及到了；你只需要关注你内心真的想要的，然后focus到上面，其他的都是噪声。我每天关注很多很多东西，总不断的刷着推特，为了很多事而忧心，慢慢的我就将我的注意力花到了很多不值得甚至于不会改变的事情上去了，而真正我在意的，我想要的事情却没有注意力去做的。慢慢我甚至觉得自己貌似政治抑郁了. focus focus 其他的和你无关，都是噪声而已的.</p>
</blockquote>
<ol start="4">
<li><p>技术总监和男主角的对话; 作为女技术总监，在行业里面也是收到了歧视，因为要来这边工作，被前老板嘲笑和与丈夫离婚的，她也背负了很多. 男主角第一次找她讨论改变车的方案时，她是极力反对的，因为这是她的专业，你如果不能用实力去告知我，我能相信你的的话，我是不会做出你说的改变的。可能这就是对自己专业的信任吧。其实对她来说，她一直缺少一个很好的正向反馈的，她创造了他们的赛车，但是车手没有提供有用的反馈，导致她并不知道车手想要什么的。其实这里面在一开始的时候就提到了这个问题；虽然我车上有几千个传感器，但是车是你在开，我需要你告诉我你的反馈，怎么样让车变成你想要的那种模式的。其实很有道理，每个人有每个人的开车习惯的，一些小的调整都会让你更容易进入状态的。男主就提出了自己的需求，因为他是想要赢的那种的。</p>
</li>
<li><p>慢就是快; 这是那个给车换配件的技术人经常说的，也是我们人生中一直需要去反复和自己提起的；</p>
</li>
</ol>
<blockquote>
<p>在我们成长的道路上，不断被提到要成果要成绩，但是真正重要的事情反而是不应该如此着急去获得的，只能慢慢去感受的，慢慢去获得的；越是心急要结果越是容易出错的；当你的心态足够的稳定的时候，你的手和眼睛才能配合到你的大脑的，与其现在着急，不如长年累月的坚持的。当然对于电影的，主要是描述的不要太紧张，把每个小细节做好就好；</p>
</blockquote>
<ol start="6">
<li>头号车手; </li>
</ol>
<blockquote>
<p>几乎有着所有年轻人的问题。天赋很高，但是心很着急的；开局的时候，她妈妈就和他说：你爸爸和你说过什么？应该是开好车吧（我有点忘记了）；这句话后面他也觉悟了；其实从头到尾电影都在叙述一件事情就是：focus到你想要的东西上去，其他的都是噪声的。想要赢需要做出更多的努力，尤其是体育这个领域，这个行业是马太效应很强的行业，只有冠军才算成功。这种行业你如果按时上下班是不可能会成功的。男主回到比赛之后，天天跑步，观察赛道调整赛车，模拟训练的等等，这些都是需要时间和努力才能去完成的。慢慢的这个车手也开始向着男主学习，放下了他所谓的自傲，向前辈去学习的。后期，他的agent让他去参加活动，他和他说，以后他再也不参加任何活动和采访。我忘记了我一开始开赛车的目的了，现在我又找回来了。focus focus，其他的都是噪声的。可能这就是变得更加纯粹的。</p>
</blockquote>
<ol start="7">
<li>内部的小人</li>
</ol>
<blockquote>
<p>有一句话是这么说的，最坚固的堡垒都是从内部被打破的。其实这剧情让我感受了两个点；第一当然是真实世界的人还是很险恶的，一定要正确识别对方，这也是人比较复杂的情况；第二点对于我来说比较深刻的是，在于如何选择你的队友的，当你将你的背后交给你的队友的时候，如果他轻易把你卖了，那得是多少悲伤的事情的。尤其是创业初期，一定要选择真正的队友的， 尤其是大家一定要有一致的目标的。当这个目标完成之后，一定要check是否还合适做队友，尤其是很多人在完成了目标之后会有其他的想法，所以一定要再次check，否则在后面的路途中，这些队友会起到反作用的.</p>
</blockquote>
<h3 id="heading-4">4. 最后</h3>
<blockquote>
<p>focus, focus,其他的都是噪声.</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[我的投资记录]]></title><description><![CDATA[突然想记录一下自己的投资决策，原因是最近因为一波操作让自己损失了一大笔钱，每天都让我有点后悔不已；理智告诉我其实我做决策本身是没错的，但是依然会很难受, 但是中间有一些操作的确做的不好的，所以我需要记录一下每次操作，已经对应plan变化.
事情是这样的，美国大选，我投资的tesla的CEO全面和政治挂钩，导致了很大的政治不确定性；于是我为了我的投资的安全性，我出了40%的仓位以预防风险；当然现在是后面trump成功的当选了美国下一届的总统, tesla暴涨，我错失了不少的收益；当然我还持有不少的...]]></description><link>https://nomoshen.com/5oir55qe5oqv6lwe6k6w5b2v</link><guid isPermaLink="true">https://nomoshen.com/5oir55qe5oqv6lwe6k6w5b2v</guid><category><![CDATA[Investment]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Tue, 12 Nov 2024 03:50:20 GMT</pubDate><content:encoded><![CDATA[<p>突然想记录一下自己的投资决策，原因是最近因为一波操作让自己损失了一大笔钱，每天都让我有点后悔不已；理智告诉我其实我做决策本身是没错的，但是依然会很难受, 但是中间有一些操作的确做的不好的，所以我需要记录一下每次操作，已经对应plan变化.</p>
<p>事情是这样的，美国大选，我投资的tesla的CEO全面和政治挂钩，导致了很大的政治不确定性；于是我为了我的投资的安全性，我出了40%的仓位以预防风险；当然现在是后面trump成功的当选了美国下一届的总统, tesla暴涨，我错失了不少的收益；当然我还持有不少的tesla的股票的，也有很丰富的收益，但是心理上依然很难受的。事后思考这部分事情，我觉得可能自己只做了规避风险，但是没有做后续的操作的。</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>时间</td><td>操作</td><td>原因</td><td>后续</td></tr>
</thead>
<tbody>
<tr>
<td>2024年11月4日</td><td>卖出部分tesla的股票</td><td>规避政治风险，作为对冲，出售部分tesla的股票；对tesla本身还是保证长期看好的；</td><td>1. 如果政治风险出清的话，就按照市场价进行买回仓位 2. 如果按照预期发生风险的话，就进行长期持有；正常情况下，我应该在trump当选的那个瞬间将tesla的股票进行买回，但是当时我发现整个tesla的股票的价格已经涨了好多我就收手了；而且我对美国股市的长期高估值也很害怕，所以当时就没做操作的；但是正常来说我卖出的理由已经解决了，理论上我应该买回我的仓位；</td></tr>
<tr>
<td>2024年11月12日</td><td>我按照34.16的价格买入了LMND的股票</td><td>原因是: 财报非常好的，但是我的反应有点慢的；最近出现新高，所以准备追入一波；</td><td>1. 按照预期的上涨的话，会到差不多点进行止盈退出；2. 如果开始下跌，下限10%进行退出；</td></tr>
<tr>
<td>2024年11月8日</td><td>我买了3倍做多美国国债</td><td>原因: 这段时间因为美元降息预期下降的，美债的价格死命往下掉，但是美国的利息长期肯定是往下跌的，所以我进场做多美国债;</td><td>1. 加杠杆做多就是为了套利；40%的利润空间就走；如果跌幅超过10%就出掉；2. 国债本身不加杠杆部分就中期持有，因为目前美国利息还没有到底，依然还可以操作；</td></tr>
</tbody>
</table>
</div>]]></content:encoded></item><item><title><![CDATA[关于The Impact of Thread-Per-Core Architecture on
Application Tail Latency读后总结]]></title><description><![CDATA[这个paper主要是讲了Thread-Per-Core架构对应用层的长尾延迟的影响；根据最后的总结是在配置合理的情况下会有一个比较好的效果的；Thread-Per-Core这个系统架构一开始我接触的时候出现在Scylladb,它还有对应的一个framework叫做seastar，是一个C++的框架，用来支持这种模型的；
1 这个架构的好处
随着单core的整个摩尔瓶颈的到来，目前现代的硬件设备都是用多core来提升性能的，但是平时我们使用的multicore的编程方式随着线程的变多会导致整体的内...]]></description><link>https://nomoshen.com/the-impact-of-thread-per-core-architecture-on-application-tail-latency</link><guid isPermaLink="true">https://nomoshen.com/the-impact-of-thread-per-core-architecture-on-application-tail-latency</guid><category><![CDATA[thread-per-core]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sun, 27 Oct 2024 09:46:13 GMT</pubDate><content:encoded><![CDATA[<p>这个<a target="_blank" href="https://penberg.org/papers/tpc-ancs19.pdf">paper</a>主要是讲了<code>Thread-Per-Core</code>架构对应用层的长尾延迟的影响；根据最后的总结是在配置合理的情况下会有一个比较好的效果的；<code>Thread-Per-Core</code>这个系统架构一开始我接触的时候出现在<a target="_blank" href="https://www.scylladb.com/">Scylladb</a>,它还有对应的一个framework叫做seastar，是一个C++的框架，用来支持这种模型的；</p>
<h3 id="heading-1">1 这个架构的好处</h3>
<p>随着单core的整个摩尔瓶颈的到来，目前现代的硬件设备都是用多core来提升性能的，但是平时我们使用的multicore的编程方式随着线程的变多会导致整体的内核切换的消耗就变得突出的，而且多核编程会涉及到thread-safe的问题，就会加入很多所谓的同步的机制，也从一定程度上导致core对性能提升比较缓慢；paper从几个方面进行了分析：</p>
<ol>
<li><p>CPU affinity: 中文叫做亲和性，linux内核的调度算法不保证一个线程前一个时刻在A cpu执行，下一个时刻可能跑到了CPU B上运行，这个会带来的问题其实还挺多的。主要在于cache的实效从而带来的性能的损耗，这个损耗还是很明确的；</p>
</li>
<li><p>Thread synchronization: 本质上是因为存在相互都要访问的公共资源，为了保证thread-safe,就必须进行同步机制的；但是这个会带来所谓的损耗；尤其是lock机制的加入会将本身是并行的操作在某一个环节变成串行的，公共资源越多，本质上core的增加未必能提升所谓的性能，可能还有反向作用；redis的整个架构就是单线程+异步的方式，基于的理论估计是减少竞争和内存操作本身就很快；</p>
</li>
<li><p>OS interfaces: 一方面提到了Linux的async机制做的一般，不过iouring加入之后估计可以提升不少；其他的主要是说的是用户态和内核态的context切换的消耗和内存copy用户态的内存的消耗等；目前iouring我感觉应该是解决了一大部分的问题吧；</p>
</li>
</ol>
<p>关于这个架构，paper author提出了三个架构：</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730020683640/59e54974-52f1-4a67-af0f-4ddbdd41a0f6.png" alt class="image--center mx-auto" /></p>
<p>a. shared-everything</p>
<p>b. shared-nothing</p>
<p>c. shared-something</p>
<p>分别说一下各自的确定；a这种的话解决了cpu的亲和性的问题，但是解决不了thread-synchronization的问题；而b这种架构的问题在于1. 负载均衡的问题 2. core与core之间有状态了，请求与请求之间就有了状态； 一个请求访问了A cpu，下次连接断掉之后可能会访问B，但是B的内存没有它的数据，这就产生了问题；所以才会有c，大部分不分享，一些信息进行分享的；</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730021076598/d784c429-6366-48ed-9773-c7df90ccae7d.png" alt class="image--center mx-auto" /></p>
<p>c架构+NUMA的架构，尽可能将控制在同一个a NUMA domain；</p>
<p>paper还提到了关于NIC和软中断的问题；通常情况下网络package过来通过softirq来进行通知application，而当package很多的时候会通过thread主动的loop来获得package的；paper提出专门指定cpu去负责网络package，并且获得package也是对应的业务thread的数据，通过这种方式让业务cpu能全力做事情，而不会被各种软中断打断处理网络请求；</p>
<h3 id="heading-2">2 最终的测试</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730021510260/55f5935d-418f-4903-a8f0-f2e7312f27de.png" alt class="image--center mx-auto" /></p>
<p>几个变量：</p>
<ol>
<li><p>硬件的不同，一个是现代的高级硬件，一个是传统的硬件</p>
</li>
<li><p>IRQ的亲和性是否绑定</p>
</li>
<li><p>是否关闭IRQ的balance</p>
</li>
<li><p>memcache和sphinxd</p>
</li>
</ol>
<p>结果：</p>
<ol>
<li><p>从read 延迟来看，几种模式其实都差不多的，在相同的硬件上sphinxd会稍微好一些的；C中可以看到，当IRQ亲和性开启+关闭balance的话，并且随着连接数变多的时候效果会好不少，C中的第一张图；</p>
</li>
<li><p>从update latency来看，整体的提升了67%或者47%的效果；</p>
</li>
</ol>
<p>从结果来说是有效果的，看样子能减少50%的长尾延迟。</p>
<h3 id="heading-3">3 后面的研究</h3>
<ol>
<li><p>请求的路由；其实这个架构有点类似于基于core的分布式架构，每个core只做自己想管的工作，那么关于请求的路由就很重要的；目前用的是message-pass，如果请求错误量很大的话，就会导致整体的请求转移消耗就变大的；</p>
</li>
<li><p>负载均衡，结合上一个问题，需要客户端去感知当前的core建立的连接是错误的连接，需要切换一些的，但是需要client的配合</p>
</li>
<li><p>os interfaces： 这个方面的思考就是kernel-bypass，但是这其实很麻烦的，需要application思考更多的东西，现在有一个叫做Demikernel在重新设计os接口，可以让应用层可以无感知，高度抽象的是用户spdk、dbdk等等类似的工具；</p>
</li>
<li><p>将负载卸载到硬件上去，比如用fpga来做一部分的计算什么的，但是这样就变复杂的了；</p>
</li>
<li><p>应用层的创新；</p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[DDIA第六章: Partitioning]]></title><description><![CDATA[tags:

ddia

读书笔记



在分布式数据存储的系统中，Partition(分片)是绕不开的一个技术点，原因在于随着数据规模的增加，总有一天需要一台机器装不下所有的数据的时候，所以需要将数据进行切分并且存放到各个机器上去；对于整个系统来说，分片也会极大的提升系统本身的scalability; 如果所有的数据都存储在一台机器上，那么就表示通过增加机器无法为系统提供扩展性；
当然这个技术已经在不上的数据存储系统中应用；当然不同的系统所叫的名字各不相同；

Mongodb: shard, ...]]></description><link>https://nomoshen.com/ddia-partitioning</link><guid isPermaLink="true">https://nomoshen.com/ddia-partitioning</guid><category><![CDATA[ddia]]></category><category><![CDATA[读书笔记]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Tue, 10 Sep 2024 08:37:22 GMT</pubDate><content:encoded><![CDATA[<hr />
<p>tags:</p>
<ul>
<li><p>ddia</p>
</li>
<li><p>读书笔记</p>
</li>
</ul>
<hr />
<p>在分布式数据存储的系统中，Partition(分片)是绕不开的一个技术点，原因在于随着数据规模的增加，总有一天需要一台机器装不下所有的数据的时候，所以需要将数据进行切分并且存放到各个机器上去；对于整个系统来说，分片也会极大的提升系统本身的scalability; 如果所有的数据都存储在一台机器上，那么就表示通过增加机器无法为系统提供扩展性；</p>
<p>当然这个技术已经在不上的数据存储系统中应用；当然不同的系统所叫的名字各不相同；</p>
<ul>
<li><p>Mongodb: shard, 这个算是物理意义上的分片，比这个更加小的话叫做chunk</p>
</li>
<li><p>Hbase: region</p>
</li>
<li><p>bigtable: tablet</p>
</li>
<li><p>Cassandra: vnode</p>
</li>
</ul>
<p>等等..</p>
<h2 id="heading-1">1.分片有哪种方式并且各自的优缺点是什么？</h2>
<h3 id="heading-11-range">1.1 按照range进行切分</h3>
<p>通常数据都会包含有一个<code>primary-key</code>,当然也可以不用<code>primary-key</code>但是一定会有一个key用来做为切分的依据；而所谓的range进行切分，通常是按照是字典排序的顺序进行切分，每个region会包含<code>[min,max)</code>，在同一个region的数据按照切分依赖的key是有序的；有点类似于字典，如果按照word的首字母进行切分，那么第一个region就是A开头，这里面包含了所有的A开头的word，并且是有序排列；</p>
<p>这种切分的好处是:</p>
<ol>
<li><p>range scan会非常快，正常的切分是按照primary-key，那么如果对primary-key进行range-scan就会非常快，因为这些key是存储在一起，并且有序…类似于你查字典以A开头的word，那就是第一个区域遍历即可；</p>
</li>
<li><p>range查询性能：range查询会集中在某一些partition上，而不会在全部的partition上；这其实很重要，因为会限制你查询性能的上限（后面解释）；</p>
</li>
</ol>
<p>缺点：</p>
<p><strong>倾斜问题</strong>：不管是read还是write，甚至于存储的空间都会倾斜的很厉害的；而且极端容易出发hotspot的问题，导致整个服务集群出现不可用；</p>
<h3 id="heading-12-hash">1.2 按照hash分片</h3>
<p>range分片的问题很明显，而且处理起来并不是很简单的，尤其是hot spot的问题，出现了除了限流就只能限流，可以加入平时的rebalance的机制，但是rebalance本质上都是一种比较重的操作的；而hash分片就是应对这种倾斜问题所提出的；</p>
<p>依照上面提到的，range 分片是按照某一个用户指定的key来进行分片，那么hash分片的唯一的区别在于依据变成了<code>hash(key)</code>计算之后的数值进行分片；因为有hash函数的存在，即使只是普通的md5，都能很好的达到所谓的随机性，这样可以把原本相关的数据分散到不同的partition上的；这样就极大极大概率减少了所谓的倾斜问题；</p>
<ul>
<li><p>优点</p>
<ol>
<li><p>相关数据会被分散到各个分区，减少了数据倾斜和热点问题的产生</p>
</li>
<li><p>单点query也是非常快速的；</p>
</li>
</ol>
</li>
<li><p>缺点</p>
<ol>
<li><p>range-scan：对于hash分片的数据，其数据相关性已经被hash函数所打破，所以相关的数据不会在同一个分区，而且你也不知道和没发去跟踪所在的partition；所以针对的range scan或者模糊查询都是需要被发送到所有的partition上；这会导致一个短板效应，latency会依赖于最慢的partition返回的时间的；</p>
</li>
<li><p>性能：每一个range-scan都要往全部分区上查询，那么整个集群的range-scan性能就是单节点的range-scan的性能，所以上限很明显；</p>
</li>
</ol>
</li>
</ul>
<p>是否可以兼顾呢？通常的方法是组合索引，本质上依然还是range分片，但是用户主动将相对随机的字段加在最前面，从而达到随机的效果；这个需要用户去识别，尤其是第一个字段是否足够的随机；还有就是这种情况的话，想要有比较好的range-scan的查询的话，只能按照组合索引的顺序去查询，比如组合索引<code>(a,b,c)</code>,那么你有效率的scan的方式是提供<code>a or a,b or a,b,c</code>这种模式，一定要有顺序，因为索引第一部分是a字段，你不能只使用<code>b</code>来进行查询，因为这样不能明确找到具体的partition，那就全量搜索。</p>
<h3 id="heading-13">1.3 关于负载倾斜和热点问题</h3>
<p>上面讲到了hash 分片可以解决绝大多数的热点问题，但是这也只是绝大多数而已；依然还有会一些corner case让你不得不面对的；其中比如单key的多量访问，比如就对某一个key进行过量的并发访问最终导致对应的分区出现过载，最终导致服务短暂不可用的；对于这种情况的话，解决的方式其实有几种：</p>
<ol>
<li><p>服务保护；即当系统出现过载的时候，限流熔断机制的引入可以帮助系统可用性的提高的；当然这其实就是所谓的系统极限，对外用户来说体验可能不算太好；</p>
</li>
<li><p>可以适当引入所谓的cache，但是cache也会面临单机的硬件瓶颈；比如就是网卡打满了什么的，这种时候依然还是不能解决本质上的问题；</p>
</li>
<li><p>系统本身能自动去检测数据倾斜或访问热点的时候，通过对于key+random num来进行分散，这样调整整体数据的倾斜性；但是这种方式带来的问题是有几个：</p>
<ol>
<li><p>需要维护这种meta-信息，尤其是需要记住哪些key做了类似的操作，而且也查询也变得更加麻烦，需要同时向所有的randum key进行查询</p>
</li>
<li><p>反应的速度太慢，需要检测并且加入所谓的均衡机制；对于read倾斜来说，不要到要何年马月才能有效果；对写倾斜可能效果会比较好；</p>
</li>
</ol>
</li>
</ol>
<p>当然现在很多系统目前还没有所谓的这种机制，起码没有自动检测和实施的机制，估计未来会出现的；</p>
<pre><code class="lang-markdown">关于这段我也是深有感触，之前维护过规模比较大的mongodb集群的；不同区域的mongodb集群选择了不同的分片模式的：
整体使用下来range分片模式在维护过程中整体的需要关心的事情还是太多的，尤其是负载均衡和热点问题的，动不动就因为热点请求导致服务抖动严重的，而且mongodb集群的负载也很不均衡，这个里面是由于mongodb按照的是chunk的个数进行均衡，但是不考虑真实数据的均衡程度，所以时不时就需要进行调整，当然hash也有这个问题，但是整个的存储均衡好不少的；所以后期新开集群我们默认使用的hash分片，因为当时的mongodb整体的自动化做的不好，虽然我们在外围一套工具进行均衡和迁移，但是依然是很麻烦的操作；
当然hash也遇到了一些问题，老板观察到整个模糊查询的性能已经达到了上限，希望后面能提到更加好的，这样可以做更多的事情；但是模糊查询或者range-scan在hash分片中本身就是需要发送到所有的partition进行查询的，单机瓶颈就是集群瓶颈，所以如果要提高可能需要思考其他的方案；

关于极端情况的hot spot问题，我们当时也遇到了，就一个用户疯狂的查一个key的value，并且这个value有点大，就导致了单partition的网卡被打满了，整个集群就开抖动；对于这种问题，后期我们基本是限流熔断的方式来进行，没有从本质上去解决这个问题；

DDIA很多章节讲的真的很不错的，缓缓道来，并且该讲的都讲到了；
</code></pre>
<h2 id="heading-2">2. 第二索引分片的问题</h2>
<p>第二索引主要是提升用户的使用方式的，可以用其他的字段进行索引，增加了业务上的便利性的；那么对于第二索引数据存储也是一个问题的，因为不可能存储在同一个节点上，也涉及到了所谓的分片的问题；常见的方案有两种：</p>
<h3 id="heading-21">2.1 按照文档进行分片</h3>
<blockquote>
<p>这种方法本质上就是数据在那个节点，就在那个节点进行索引存储的；别名叫做：<code>a local index</code></p>
</blockquote>
<p>这种方法应该是比较常见的方式的，这样每一个分片的索引是独立的，只对当下的数据进行负责的；对于这种分片的优缺点分析：</p>
<ul>
<li><p>优点：</p>
<ul>
<li>整个写入逻辑比较简单的，而且写入数据和index是在同一个节点做的，更加方便做所为的事务</li>
</ul>
</li>
<li><p>缺点：</p>
<ul>
<li>对于模糊查询可能需要查询所有的分片；因为正常情况下，路由层是没办法对除了主键以外的条件进行有效的效率上的过滤的；那么就会遇到hash分片的问题；</li>
</ul>
</li>
</ul>
<h3 id="heading-22-term">2.2 按照Term进行分片</h3>
<blockquote>
<p>这边的term，书上的解释看上去更加是类似于具体的二级索引构建的key，也就是按照真实的索引key来进行分片；可以这么去思考：索引的分区依赖于具体索引组成的key； 这个索引方式的别名: <code>a global index</code></p>
</blockquote>
<p>这个时候数据和索引其实是本分离在不同的节点上的；</p>
<ul>
<li><p>优点：每次查询可以根据查询的条件优先过滤，找到部分的分区，然后快速找到所有相关的数据；其实本质上也是range分片的过程；通过索引找到所有的id然后再去根据id的list查询所有的数据；</p>
</li>
<li><p>缺点：很明显的复杂度变高了，而且数据和索引的原子性就很难把握了；如果index写入成功，数据还在写入的过程中，查询发现索引有但是数据层没有，这种不一致性就很难把握；再加上故障处理等等，会有不少的用户体验；</p>
</li>
</ul>
<pre><code class="lang-markdown">这两个索引我在之前的工作环境中都遇到过；
<span class="hljs-bullet">1.</span> mongodb的索引是使用第一种方式的；模糊查询的话，尤其是没有涉及到分区key的模糊查询的话，那必然就会触发全分区的查询的；但是如果在查询的时候加入所谓的分区key的部分的话，在range分片下还是有一定的优化的；
<span class="hljs-bullet">2.</span> 一个朋友的公司在内部做influxdb的分布式架构，influxdb的索引数据和时序数据本身就是用了第二种方式的，不是很确定关于不一致部分是如何处理的；我猜可能是先写数据再async同步index吧；这样只会触发所谓的index延迟，而不会出现index有数据没有这种情况的；
</code></pre>
<h2 id="heading-3-rebalance">3. rebalance</h2>
<p>和开头讲的一样，分片的好处是为了提升集群的可扩展性的；当新节点上线之后，需要去别的节点拉取一些分片到自己的节点，从而开始分担集群的服务；如果系统发现一些节点的负载过于沉重，需要系统将当前节点的部分分区迁移到其他的节点上，用来减轻当前节点的压力的；而这种迁移的过程就是所谓的<code>rebalance</code></p>
<h3 id="heading-31-rebalance">3.1 Rebalance的策略</h3>
<ul>
<li><p>不要使用<code>hash(key) mod N</code>这种方式；</p>
</li>
<li><p>固定分区数量</p>
<p>  在集群初始化的时候已经确定了分区的个数，后面的运行过程的时候分区的个数是不会变换的；但是分区到node之间的关系可以是人为指定或者自动自动执行的；</p>
</li>
<li><p>动态分区的方式</p>
<p>  所谓动态指的是系统会设置每一个分区的max value，可能是数据的条数又或者是存储大小等等，也就是说系统会根据运行情况，记录每一个分区的大小，如果达到了所谓的max value就进行split，又或者当两个相邻的分区都很小的情况下进行merge；这样系统的分区的个数是在变化的；</p>
</li>
</ul>
<p>rebalance迁移的最小维度是<code>分片</code>,每一个节点上存储了多个分片；当系统觉得当前节点有太多的分片或者压力过大的时候，就会启动将当前的节点的部分分区迁移到其他的节点上的；这个过程就是rebalance的过程的；</p>
<h3 id="heading-32-rebalance">3.2 rebalance 自动还是人工</h3>
<p>理论上应该是需要自动的，但是rebalance是一个很重的操作的，有的时候会影响到正常的读写请求的，所以需要去trade-off；按照目前的技术发展自动化一定是趋势的；</p>
<pre><code class="lang-markdown">mongodb的rebalance机制比较单一，老版本是按照chunk的个数做均衡，新版本加入了按照数据存储余量来进行均衡；但是这种单一的均衡策略并不能解决读写不平衡的问题的；尤其是range分片的情况下；
所以我们在维护mongodb集群的过程中，加入了外围的工具，加各种策略去判断哪些节点压力比较大的，然后通过mongodb自带的迁移分区的command来迁移；关于这块我觉得mongodb现在做的并不是很好的；

关于为什么rebalance是一个比较重的op呢？因为实际上分片本质上是一个逻辑上的概念，它并不是真的类似于物理隔离在一个节点上的；当然这几年已经有不少数据库的公司开始思考做成物理隔离；这样迁移的过程整体的波动会小很多的；因为在节点维度多个分片数据是融合在一起的，所以你在迁移的时候需要先去找到这些数据，然后进行迁移，并且迁移完毕之后再删除的；整个过程，当分片比较大，或者分片数比较多的时候，其实会消耗比较多的当前节点的资源，而且迁移本身涉及到了网络带宽和本地的磁盘io、cpu的占用，不控制好的确会影响到了当下的在线业务；

不同的数据库系统都会给予一些配置来进行控制，比如每次只能同时启动一个分片的迁移的，这样的方式来保证影响范围的；
说一下物理隔离的好处，如果是真实的物理隔离，那么进行迁移的时候只需要消耗少许的io和网络即可，不会因为查询数据对整个节点的内存什么的进行很大的影响的；而且删除也只是物理层面的直接delete，这个就很好，之前听TIDB目前就这么做，每一个region一个rocksdb，当然他们的说大概一块nvme的话放2000多个rocksdb问题不大的；如果真的是这样，其实好处真的不少；分布式系统的迁移问题真的很麻烦的，涉及到到的状态很多的，并且又要控制影响，快了不好，慢了就赶不及；
</code></pre>
<h2 id="heading-4">4. 请求路由</h2>
<p>既然数据被分散在多个节点上，那么client的请求如何路由到正确的节点上呢？这个问题更加普通的叫法是: <code>service discovery</code>，并不只是限制在数据库领域；对于这个问题目前业界的几个解决方法是:</p>
<p><img src="https://cdn.nomoshen.com/typora_img/image.png" alt="image" /></p>
<ol>
<li><p>允许client可以连接所有节点，这个节点会作为中转节点，把请求转到正确的节点上去的；</p>
</li>
<li><p>有一个单独组件叫做<code>routing tier</code>,路由层,client直接访问的是路由层，由路由层去请求到正确的node；这就表示路由层需要感觉到底层分区部署的变化的，这样它才能路由请求到正确的node上去；要如何做呢？通常系统会依赖类似于zookeeper的组件，通过监听zookeeper的节点变化来感知底层分区的变化，这种架构由kafka，hbase等等，mongodb的话，路由层是mongos，configserver就是作为zookeeper的角色存在；当然和zk的监听不一样的是，mongodb还有一套触发机制，让mongos主动去拉configsrv来进行更新；</p>
<p> 由另外一种方式是cassandra类似的系统使用的，节点之间使用gossip的系列就传递集群的节点的信息，原因是cassandra这类系统数据存储在什么节点是通过计算获得的，而并不是存储起来的，但是关键计算的信息是集群的node信息，所以节点变化是需要传递到所有的节点的；但是gossip这种协议最终收敛，但是时间上不确定的，所以比较复杂…好处你可以感知到的就是meta信息需要保存的很少；</p>
</li>
<li><p>client直接连接到正确的节点上，如果连接不到正确的节点，错误节点会和它说你应该去什么节点，然后再直接连接过去的…redis的集群模式就是这样的；</p>
</li>
</ol>
<h2 id="heading-5">5. 总结</h2>
<p>这章节主要讲了</p>
<ol>
<li><p>为什么要分片</p>
</li>
<li><p>分片的2种方式</p>
</li>
<li><p>第二索引的分片方式</p>
</li>
<li><p>rebalance的方式和面对的问题</p>
</li>
<li><p>请求路由的几种方式</p>
</li>
</ol>
<p>基本上包含了分区所有的信息, 后面会配合副本机制来来保证整体的高可用和高可扩展性；在分片这个阶段，最为重要的是如何找到合适业务方式的分区方式和如何高效的去rebalance，目前不同数据库系统的rebalance的大致机制是类似的，但是实现上会有一些差别，但是这样也会让效率差别很大；</p>
]]></content:encoded></item><item><title><![CDATA[日本7日自由行]]></title><description><![CDATA[总算把日本之行安排上了，工作10年我基本上把东南亚都玩过了，就还剩下日本的，也是我最想去的一个国家的；在没去日本之前，我新加坡的朋友说：日本很好，很干净，吃的也非常好的；而且日本这个国家在外面评价也很好的，所以当我预订了机票和酒店之后就非常的开心。
这次坐飞机也经历了很多不平常的事情的，所以算是补全了人生不一样的经历；这次出行我是一个人出行的，老婆对日本兴趣不大，因为之前来过；可能也是因为她本身对旅游也兴趣不大，所以她和女儿早早的就会马来西亚了；也好，这样整体的费用上会消减不少，因为住宿上我可以...]]></description><link>https://nomoshen.com/7</link><guid isPermaLink="true">https://nomoshen.com/7</guid><category><![CDATA[osaka]]></category><category><![CDATA[japen]]></category><category><![CDATA[kyoto]]></category><category><![CDATA[kobe]]></category><category><![CDATA[Travel]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Wed, 14 Aug 2024 10:08:24 GMT</pubDate><content:encoded><![CDATA[<p>总算把日本之行安排上了，工作10年我基本上把东南亚都玩过了，就还剩下日本的，也是我最想去的一个国家的；在没去日本之前，我新加坡的朋友说：日本很好，很干净，吃的也非常好的；而且日本这个国家在外面评价也很好的，所以当我预订了机票和酒店之后就非常的开心。</p>
<p>这次坐飞机也经历了很多不平常的事情的，所以算是补全了人生不一样的经历；这次出行我是一个人出行的，老婆对日本兴趣不大，因为之前来过；可能也是因为她本身对旅游也兴趣不大，所以她和女儿早早的就会马来西亚了；也好，这样整体的费用上会消减不少，因为住宿上我可以取舍比较多的；很多人说日本的住宿很贵，其实如果稍微做点攻略的话，日本住宿的性价比远高于新加坡，而且是远远超过的，我7天下来整体的住宿就花费了1300多rmb，很划算哦。。。而且卫生和住宿情况都可以接受；</p>
<h2 id="heading-1">1. 目的</h2>
<ul>
<li><p>大阪</p>
</li>
<li><p>京都</p>
</li>
<li><p>奈良</p>
</li>
<li><p>神户</p>
</li>
</ul>
<p><img src="https://cdn.nomoshen.com/typora_img/image-20240814105225836.png" alt="image-20240814105225836" /></p>
<p>整个上的行程按照上面的顺序进行的；大阪-&gt;京都-&gt;奈良-&gt;神户-&gt;关西机场；这次主要玩了几个地方：</p>
<ol>
<li><p>大阪城</p>
</li>
<li><p>梅田蓝天大厦楼顶</p>
</li>
<li><p>寺庙: 四天王寺、天王寺、通天阁</p>
</li>
<li><p>商圈</p>
</li>
<li><p>京都：清水寺、金阁寺、Fushimi Inari Shrine</p>
</li>
<li><p>奈良</p>
</li>
<li><p>神户：看了海</p>
</li>
<li><p>坐高速船直达关西机场</p>
</li>
</ol>
<h2 id="heading-2">2. 旅途</h2>
<h3 id="heading-1-1">1. 上海浦东机场</h3>
<p>为了性价比，我选择从上海做飞机去大阪；和杭州相比，价格相差600多；7月29号是我的机票时间的，我本来选择29号也就是周一早上做高铁去上海的，但是因为周一杭州到上海的火车票都已经卖完了，我只能选择周日晚上做火车到上海的，然后在机场住一晚；</p>
<p>到机场的时候已经是凌晨12点，所以就思考直接在机场睡好了，于是就在浦东机场好几层走，找可以躺的位置的；这里不得不吐槽，上海机场的位置为了防止你躺，每个位置之间就加了一个横杆，所以能躺的位置都很少的；我拖着箱子在机场转了1个多小时，最后妥协想着就在大理石上躺一晚也可以；不过正巧这个时候一对夫妻走了，我思考估计是他们的飞机要起飞了，因为那个位置特别好的，我马上就跑过去抢到位置，然后拿出我的毛毯开始睡觉，因为真的很困.大概到了6点多我醒来了，看手表昨天睡的还行，深睡眠了3个多小时；事后我老婆说你不怕东西被拿走啊，我说我当作枕头垫在头下面，她说这样也容易拿走，毕竟你睡着了；</p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_1926.jpeg" alt="IMG_1926" /></p>
<h3 id="heading-2-1">2. 大阪</h3>
<p>大概下午5点达到了大阪；日本时区比国内快一个小时；所以其实这个时候国内才下午4点多；我按照google map找到了一个大巴车做到大阪；上车的时候司机问是去大阪还是大阪城，我根本就听不懂，而且我也不知道大阪和大阪城有什么区别的。不过最后我给他看了google地图，就顺利上车了；</p>
<p>第一个感受到的极致服务就是：搬运行李的人，他给你一张你行李箱对应的纸条，然后让你自己上车，行李会帮你放好，到了目的地，会有专人帮你把行李搬下来，你按照纸条领取就好；</p>
<ul>
<li><p>酒店：Acro Capsule Hotel Namba Dotonbori</p>
<p>  这是一个青旅，价格150-200rmb差不多，看时间端；非常非常推荐的；地理位置在大阪商圈，里面的卫生情况极好，虽然大家都是住在同一个很大的房间里，但是里面非常安静；洗澡上厕所的地方也很大的，基本上不会相互干扰的；男女分开也很安全的；因为之前住过新加坡的青旅，我只能说这家青旅从各方面都完胜；</p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_1936.jpeg" alt="IMG_1936" /></p>
</li>
</ul>
<ul>
<li><p>大阪城</p>
<p>  第二天出发去大阪城；我觉得大阪城还是很不错的；我徒步走了一个大圈，看到了周边的学校、野球场等等，唯一的感受是真干净，很多人说tokyo会更加干净，但是大阪的干净已经让我惊讶了；几乎没有所谓的人造垃圾，我也看到有一些人在捡垃圾工作；而且日本垃圾桶真的很少，我基本上都是放在包里，有的时候去便利店顺便就丢一下，可能真的是每个人有这种意识，才能达到如果干净的街区；</p>
<p>  因为徒步了4公里，天气也很热我就进入了一家starbucks的店，点了一杯超大杯的冷萃，换算rmb大概是25多一点；我发现在海外星巴克貌似都比国内便宜，即使是新加坡也比国内划算，大概星巴克和哈根达斯类似，国内的定位不一样一些；</p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2061.jpeg" alt="IMG_2061" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2049.jpeg" alt="IMG_2049" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2023.jpeg" alt="IMG_2023" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_1980.jpeg" alt="IMG_1980" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_1970.jpeg" alt="IMG_1970" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_1968.jpeg" alt="IMG_1968" /></p>
</li>
</ul>
<ul>
<li><p>梅田蓝天大厦</p>
<p>  这块也是大阪商圈比较集中的地方，这周边都是大型商场，奢侈品也很多的，有需求的可以购买；我来这边主要是上楼顶看大阪全貌的；这个东西看过了有点时候就会疲乏，尤其是后面我去槟城的升旗山的时候就觉得没意思了；</p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2108.jpeg" alt="IMG_2108" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2149.jpeg" alt="IMG_2149" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2129.jpeg" alt="IMG_2129" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2123.jpeg" alt="IMG_2123" /></p>
</li>
</ul>
<ul>
<li><p>各种寺庙</p>
<p>  个人不相信这些东西，所以只是进去看了一圈，通天阁我就没上去，因为觉得意义不大的；不过这个地方周边免税的药妆店，可以购买很多日用品，给老婆带了一些，然后我就回酒店睡觉去了；</p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2167.jpeg" alt="IMG_2167" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2184.jpeg" alt="IMG_2184" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2176.jpeg" alt="IMG_2176" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2172.jpeg" alt="IMG_2172" /></p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/IMG_2170.jpeg" alt="IMG_2170" /></p>
</li>
</ul>
<h3 id="heading-3">3. 京都</h3>
<p>京都虽然待了三天，但是后面可能是天气太热了，我快速的对几个有名景点走了一下，然后就找了星巴克写代码去了。因为实在是太热了，走一下就感觉要虚脱了；中间吃了一顿不少的饺子餐，我觉得日本的饮食真的是很不错的，不过是牛肉饭、烤串、还是饺子都非常好吃的，而且让人很放心；而且每次我都会点他们的啤酒喝，因为真的很好喝；</p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2244.jpeg" alt="IMG_2244" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2333.jpeg" alt="IMG_2333" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2298.jpeg" alt="IMG_2298" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2290.jpeg" alt="IMG_2290" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2269.jpeg" alt="IMG_2269" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2258.jpeg" alt="IMG_2258" /></p>
<p>为了给老婆购买抹茶，我在小红书上找了一家店，是一个很小巷子里面的一个老爷爷开的；因为是小巷子所以基本上没人的，我也不敢进去；犹豫再三之后我还是进去购买了，老爷爷很友善；我说我想购买抹茶，但是他问了我一些问题，我听不懂的，所以他就拆了一包给我喝喝，真的很好喝的；过程中，他让我等一下，因为他这个时候在炒茶，弄好了还给我看他的茶...我感觉应该是价格不算贵吧。我买了相对好的两种，40g大概是2000日元差不多；店名：<strong>梅香庵</strong></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2331.jpeg" alt="IMG_2331" /></p>
<h3 id="heading-4">4. 奈良</h3>
<p>我退房把行李放在酒店，然后出发去奈良；大概车程是1个多小时就可以到奈良；扑面而来的是鹿，老多的鹿；一点都不怕人的；我比较喜欢那边的博物馆,一方面里面的东西都还比较有意思，另外一个是当时天气实在是太热了，博物馆比较凉爽；过程中去景区周边吃了一个茶泡饭，相对比较贵，但是味道还是不错，当然还是加了一杯冰啤酒，真心不错；奈良的主要可玩的地方:</p>
<ul>
<li><p>奈良公园-满街的鹿</p>
</li>
<li><p>博物馆</p>
</li>
<li><p>若宫神社</p>
</li>
<li><p>若草山</p>
</li>
</ul>
<p>我主要第一和第二个景区，后面两个由于天气的原因(热)，实在是热的没办法看风景了；最后我又来到了星巴克，叫了一杯大杯冷萃，坐了1-2个小时，到了4点差不多我就回京都了..奈良我觉得可逛可不逛；</p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2422.jpeg" alt="IMG_2422" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2418.jpeg" alt="IMG_2418" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2414.jpeg" alt="IMG_2414" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2405.jpeg" alt="IMG_2405" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2404.jpeg" alt="IMG_2404" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2364.jpeg" alt="IMG_2364" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2359.jpeg" alt="IMG_2359" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2352.jpeg" alt="IMG_2352" /></p>
<h3 id="heading-5">5. 神户</h3>
<p>去神户三个理由，一个是为了吃所谓的神户牛肉，当然最后我也没正宗吃到，第二个是看看日本的海，其实在大阪的时候我从机场出来的大巴上也看到了海，但是没有很近的接触；第三是为了最后一天从神户坐船去关西机场，有一趟直达的，半小时就可以到关西机场的；</p>
<p>日本的商场关的特别早，我本来想7点多去商场吃饭，但是发现那个时间点他们都开始关门了，于是我就在超市里面买了一些折扣的食品吃吃，不过味道真心还可以；神户牛肉我一直没找到特别好的店，在外面看了一下物价都有点贵的出奇，导致我都没敢进去；</p>
<p>那天我主要去了海边，发现有好多人在海边玩；我还是比较惊讶的， 因为当天太阳很大的，但是孩子们在水里玩的很开心；有一些高中生在练习类似于壁球的，在沙滩上，烈日炎炎的情况下训练，真的很漫画风；很多成年人聚集在一个地方，是一个专门的烧烤店里面，烧烤...很热火..还有一些在海钓什么的。。。不过海边的景色是真心不错，真的如果靠近海的时候，反而不那么热了，风凉凉的很舒服...</p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2497.jpeg" alt="IMG_2497" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2485.jpeg" alt="IMG_2485" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2477.jpeg" alt="IMG_2477" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2465.jpeg" alt="IMG_2465" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2459.jpeg" alt="IMG_2459" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2455.jpeg" alt="IMG_2455" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2447.jpeg" alt="IMG_2447" /></p>
<h2 id="heading-3-1">3. 其他</h2>
<h3 id="heading-1-2">1. 酒店</h3>
<ul>
<li><p>Acro Capsule Hotel Namba Dotonbori: 3晚，424rmb，这是一个青旅，不过非常推荐</p>
</li>
<li><p>M’s Plus 四条大宫酒店 (Hotel M's Plus Shijo Omiya): 2晚，477.37 rmb，一个标准酒店，也很推荐</p>
</li>
<li><p>三条PIECE青年旅馆 (Piece Hostel Sanjo)： 1晚，青旅，220 rmb，主要是周六，住青旅就便宜不少；如果我依然住上面的酒店，花费在800多rmb差不多的；这个青旅也很不错的，唯一的缺点在于卫生间在B1，晚上上厕所麻烦一些；不过卫生情况也可以；</p>
</li>
<li><p>西神户广场酒店 (Kobe Plaza Hotel West)： 1晚，255rmb，标准酒店；地点很不错的，离三宫站比较近，走走就可以达到；</p>
</li>
</ul>
<p>日本的酒店周六那个晚上会很贵，如果能早点订的话，早点会便宜些；</p>
<h3 id="heading-2-2">2. 吃</h3>
<p>我个人没有吃很多好吃的，基本集中在：</p>
<ul>
<li><p>牛肉饭，鳗鱼饭，在吉野家吃的，我觉得老好吃了；很多人可能会不认同，但是我觉得真的很不错；</p>
</li>
<li><p>啤酒：几乎顿顿有啤酒，真心好喝...价格上大概在20-30 rmb一杯或者一瓶；</p>
</li>
<li><p>茶泡饭：只是吃了一顿，而且花了100多rmb，好吃是好吃的，但是就是贵了一些</p>
</li>
<li><p>牛排：在商场下面吃的，挺好吃的，我本来想吃好一些的，但是服务人员说要等40分钟，我就算了</p>
</li>
<li><p>夜间烧烤，随机进入了一个烧烤店，里面主打烤鸡皮，我也就叫了酒吃了，有点咸，不过兑着酒喝也问题不大的；</p>
</li>
<li><p>饺子店：应该是京都比较有名的饺子，我去的时候还需要排队；因为是一个人所以很快就进去了；叫了一份煎饺，炒大肠，味道非常不错；我叫了两瓶酒，喝完之后晕晕乎乎的回酒店去了；</p>
</li>
</ul>
<h3 id="heading-3-2">3. 感受</h3>
<ul>
<li><p>服务人员服务意识很高的，而且总是很客气；导致最终我们两个在不断的相互鞠躬</p>
</li>
<li><p>道路非常干净，真的很厉害，这块日本</p>
</li>
<li><p>食物真的很好吃，可以的话，我可能在多吃好多天</p>
</li>
<li><p>地铁很复杂，他们说tokyo的地铁会更加复杂；复杂的原因是地铁有很多家公司经营，导致很多时候动一个地方有很多个地铁口子，但是不同地铁的口子下去是不能互通的；这就导致你以为你到了地铁站，进去发现没有要做的地铁，最终就在那边思考很久再出来，找其他的地铁站；我真的是每次坐地铁都需要思考很久；在京都的时候我坐公交总是坐反了，让我也很头疼；</p>
</li>
<li><p>京都可能是下次我去的话，会待很久的地方；因为最后一天我发现有很多小的街道没走，很有那种味道，但是那是我的最后一天，我有点后悔...</p>
</li>
</ul>
<h2 id="heading-4-1">4. 最后</h2>
<p>日本非常推荐旅游去，当然我一些朋友说日本人与人之间会比较冷漠；但是我这次去的话，起码对我来说，服务行业的人都还行，我也不喜欢那种没有距离感的人；美食是吸引我去的下一个理由；大阪的话，其实商业氛围比较浓，所以喜欢逛街的可以去，京都可以安静待一段时间；奈良，地方比较小，所以可玩性比较低；神户我感觉差不多，我不准备再去；</p>
<p>最终我从大阪飞马来西亚，中间落地新加坡转机，在新加坡机场睡了3-4个小时；这我就不得不说新加坡的国际机场真的好不少的，很多的椅子不会有横杆，而且很多地方准备了睡觉的椅子给你；不过当时人有点多我也是花了很多时间才找到一个可以让我躺下来的地方；最终睡了3-4个小时起来坐飞机回了马来；</p>
]]></content:encoded></item><item><title><![CDATA[马来-槟城自驾游]]></title><description><![CDATA[这段时间回到了马来，老婆不辜负自己的努力拿到了马来的驾照；于是我们两就准备计划一次自驾出行；当然也有很多其他的考虑；一方面女儿再过一段时间就要开学的，另外一方面我和我老婆也要开始上课的，所以趁着这段时间空，带着孩子出去玩；马来的汽油和过路费都非常便宜，加之有本地驾照，所以我们准备自驾出行的；
1. 目的点
本次主要的目的点有怡保和槟城；当然最为主要的是槟城，怡保是顺路逛了几个景点；对于马来来说其实马六甲也是本来我们想去逛的，但是它的方向和槟城是完全相反的过程的；所以就摒弃了马六甲，直接重心是槟城...]]></description><link>https://nomoshen.com/6ams5p2lleannwfjuihqumpvua4ua</link><guid isPermaLink="true">https://nomoshen.com/6ams5p2lleannwfjuihqumpvua4ua</guid><category><![CDATA[Penang]]></category><category><![CDATA[malaysia]]></category><category><![CDATA[Travel]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Tue, 13 Aug 2024 13:36:01 GMT</pubDate><content:encoded><![CDATA[<p>这段时间回到了马来，老婆不辜负自己的努力拿到了马来的驾照；于是我们两就准备计划一次自驾出行；当然也有很多其他的考虑；一方面女儿再过一段时间就要开学的，另外一方面我和我老婆也要开始上课的，所以趁着这段时间空，带着孩子出去玩；马来的汽油和过路费都非常便宜，加之有本地驾照，所以我们准备自驾出行的；</p>
<h2 id="heading-1">1. 目的点</h2>
<p>本次主要的目的点有怡保和槟城；当然最为主要的是槟城，怡保是顺路逛了几个景点；对于马来来说其实马六甲也是本来我们想去逛的，但是它的方向和槟城是完全相反的过程的；所以就摒弃了马六甲，直接重心是槟城；查阅了小红书，将槟城的几个景点罗列了一下；酒店什么的都是在车上实时定的；</p>
<h2 id="heading-2">2. 旅途</h2>
<p>整体的行程是</p>
<p><img src="https://cdn.nomoshen.com/typora_img/image-20240813201636769.png" alt="image-20240813201636769" /></p>
<p>主要的目标地点有：</p>
<ul>
<li><p>椰壳洞 Perak, Gopeng, Jln Gua Tempurung, 邮政编码: 31600</p>
</li>
<li><p>务边沉香山茶园 Perak, Gopeng, Jalan Sungai Itek, 邮政编码: 31600</p>
</li>
<li><p>Evergreen Laurel Hotel, 53, Persiaran Gurney, 10250 George Town, Pulau Pinang</p>
</li>
<li><p>凯利古堡 Perak, Batu Gajah, Jalan Gopeng, 邮政编码: 31000</p>
</li>
</ul>
<h3 id="heading-1-1">1. 椰壳洞</h3>
<p>这应该是马来西亚最大的石灰岩溶洞; 个人推荐一定还是要去看看；而且比较顺路，整体耗时也可控，大概在1-2个小时一定是能完成；有干路线和湿路线，我们去的时候湿路线封闭了，但是第一次去的我们还是觉得干的比较合适，而且还带着小孩子…</p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2597.jpeg" alt="IMG_2597" /></p>
<h3 id="heading-2-1">2. 务边沉香山茶园</h3>
<p>看完了椰壳洞，我们很快来到了不远的这个景点；我个人觉得没什么必要去这个景点，有点无聊的...我们在那边吃了抹茶冰淇淋，味道比较奇怪；但是对应的茶叶蛋的味道很不错的...为此我们在他们的商店购买了一些茶叶和调料相关的，不过还是挺贵的；</p>
<h3 id="heading-3-evergreen">3. 槟城-Evergreen酒店</h3>
<p>这个是一个比较早的5星级酒店，所以它的优点和缺点会比较明显；缺点就是设备都会比较老，优点是：干净、空间比较大的；尤其是卫生间什么的..而且因为有这些优缺点，所以它的性价比极高，我预订了2个晚上，大概是800多rmb差不多；如果下次还去槟城的话，我会直接订更多天，因为比较舒服，其他的活动设备也还不错；</p>
<p>而且这个酒店前面有一个沿海公园，有很多可以让孩子玩的东西的，是一个不错的放手让孩子玩的地方的；后面因为预定后面几天的酒店中出现了支付出错，导致了酒店预订不了了...这是这次旅游的一次意外..后面的酒店就完全没这个酒店好；晚饭在酒店周边吃了个自助餐，不好吃，没看评分直接进去了...有点无比后悔.</p>
<h3 id="heading-4">4. 前往乔治博物馆</h3>
<p>为了更加好的感受槟城的当地的特色，我们第二天早上是步行去乔治博物馆的；大概1公里多吧，不过天气有点热的，导致孩子总抱怨什么时候能到；如果下次来的话，我们可能直接开车去，其实除了特别特别的热门的景区，大部分槟城还是有很多停车位的，只需要付一点点钱基本就OK；当然也看到了沿途的风景，都是非常不错的；</p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2631.jpeg" alt="IMG_2631" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2632.jpeg" alt="IMG_2632" /></p>
<p>因为没吃早饭，所以找了评价比较高的两家面包店：</p>
<ul>
<li><p>Continental Bakery</p>
</li>
<li><p>65c Ondo Bakery</p>
</li>
</ul>
<p>这两家店都很不错，可以尝试吃吃看；</p>
<p>乔治博物馆是一个值得去走走的地方，毕竟来都来了对吧；而且那周边有很多其他的可以走走的地方的；小印度街，我觉得一般，但是我老婆女儿很喜欢，因为她们买了几套印度服装；后面还去了所谓的壁画，其实我就拍了没几张照片的，后面开始下雨了，我们就打车回酒店了...孩子觉得逛久了就很累;</p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2739.jpeg" alt="IMG_2739" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2729.jpeg" alt="IMG_2729" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2728.jpeg" alt="IMG_2728" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2727.jpeg" alt="IMG_2727" /></p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2726.jpeg" alt="IMG_2726" /></p>
<h3 id="heading-5">5. 海滩</h3>
<p>我们去了Batu Ferringhi Beach，大概3点多出发的，本来觉得不需要那么早，但是怕没地方停车所以还是早早的出发去，不过幸好早点去，不然停车可能也是很麻烦的事情的；这个地方吗，如果你说沙滩很漂亮那肯定没有其他的地方好的，就是一个看海的地方，而且海水并不是很蓝，可能是近海的原因的；不过整体的可玩性比较高；我和我女儿玩了海上摩托艇，这个自由度比较高，因为是自己驾驶的，而且时间比较长，你可以在海面上开来开去的..我和我女儿大概玩了10几分钟，最终小姑娘可能因为体力问题就撑不住，我们就提早回去了；上面还有其他的玩的设施，总来说：自由度比较高，当然需要注意危险；</p>
<p>后面很长时间陪孩子在玩沙子，而且海边的浪比较大的，所以很多孩子就在岸边玩的很开心，虽然很好玩，但是浪容易把孩子卷跑，所以父母需要注意；</p>
<h3 id="heading-6">6. 升旗山</h3>
<p>打车和开车都可以，停车也不紧张；有一个地方停车15马币，虽然贵, 但是贵在有不少空位，你可以放心开车过去的；升旗山我感觉一般，可能是因为之前我去过类似景点太多了，没有太多的感受；但是因为是可以看到槟城的全貌，所以如果第一次来，那还是可以花一下午去感受一下；如果天好的话可以等等日落什么的，我那天有点雾蒙蒙的，就懒得等，当然孩子觉得有点冷，所以就提早下来了；</p>
<p><img src="https://cdn.nomoshen.com/typora_img/IMG_2906.jpeg" alt="IMG_2906" /></p>
<p><strong>说个趣事</strong>：小姑娘的虎牙已经动了很久，最后就是在升旗山上拔掉的；她很开心，因为她很在意这个牙齿，总是摇摇晃晃的，让她觉得有点烦。。。</p>
<h3 id="heading-7">7. 颠倒博物馆</h3>
<p>这个是孩子想去，成人玩估计会觉得没意思，但是孩子估计会喜欢；不过整个博物馆不大，有很多个房间，人进去有人会教你摆姿势，并且给你拍照..其实对我来说蛮无聊的;</p>
<h3 id="heading-8-new-world-park-food-city">8. new world park food city</h3>
<p>最后一天了，我们早上起来就去这个地方吃早餐；这个地方有点类似于新加坡的食阁，有很多家店，一些特色的当地的小吃什么的，有兴趣的可以去试试，我觉得属于品种多样...</p>
<h2 id="heading-3">3. 美食推荐</h2>
<ul>
<li><p>65c Ondo Bakery 和 Continental Bakery 可以买一些吃吃，两家店很近，所以比较方便</p>
</li>
<li><p>Me'nate Penang: 十分推荐，吃牛肉和牛排的，肉比较好，烧的也很不错的；我们吃了260多马币，有点点太多了；价格上的话和牛排的品质有关，和牛会贵不少，有的一块肉写着400多RM；我们挑了一些便宜的肉，还有牛肋骨什么的，一定要收着点，不然容易太多吃不动；这家店的味道是真心不错；</p>
</li>
<li><p>早餐店在小巷子走的时候发现一家，性价比比较高吧；但是不喜欢他们家的饮料，可能东南亚的饮料总觉得很甜，而且类似于粉泡泡的感觉的；</p>
</li>
</ul>
<h3 id="heading-4-1">4. 总花销</h3>
<ul>
<li><p>总额：7000 rmb</p>
</li>
<li><p>住宿： 2452</p>
</li>
<li><p>交通费： 128 油费 + 128过路费，总共路程大概是900公里</p>
</li>
<li><p>其他: 吃、购买东西、门票等</p>
</li>
</ul>
<p>总共天数是5晚6天...</p>
]]></content:encoded></item><item><title><![CDATA[step-2: 房子卖出]]></title><description><![CDATA[从去年年底下决心要出去，慢慢的一步一步在进行中；女儿已经出去快一年了，小姑娘在外面适应的还不错的，所以随之而来的就是step-2卖房子；我这个人做事情总的来说还是有点拖，因为卖房子这个事情看着就很麻烦的，我一直拖到了5月底才把房子收拾干净然后挂出去的；
不得不说，虽然我整体对未来比较悲观，但是我又很矛盾的希望疫情放开之后，经济能稍微好一点的，让我能以一个比较高的价格出售；这种自我矛盾的心态让我在卖房子上面总是犹豫不决的。现在回想起来，我想到了之前听不明白播客许教授的一段话：

悲观其实挺好的，因...]]></description><link>https://nomoshen.com/step-2</link><guid isPermaLink="true">https://nomoshen.com/step-2</guid><category><![CDATA[life]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sun, 15 Oct 2023 06:33:42 GMT</pubDate><content:encoded><![CDATA[<p>从去年年底下决心要出去，慢慢的一步一步在进行中；女儿已经出去快一年了，小姑娘在外面适应的还不错的，所以随之而来的就是step-2卖房子；我这个人做事情总的来说还是有点拖，因为卖房子这个事情看着就很麻烦的，我一直拖到了5月底才把房子收拾干净然后挂出去的；
不得不说，虽然我整体对未来比较悲观，但是我又很矛盾的希望疫情放开之后，经济能稍微好一点的，让我能以一个比较高的价格出售；这种自我矛盾的心态让我在卖房子上面总是犹豫不决的。现在回想起来，我想到了之前听不明白播客许教授的一段话：</p>
<blockquote>
<p>悲观其实挺好的，因为悲观能降低你对未来的预期并且能做一些措施去预防或者抵御吧；甚至于可以更加悲观一些的；</p>
</blockquote>
<p>人就是这样，虽然道理都懂，但是当身处于其中的时候就容易失去核心的点；随着6月7月一个一个月的过去，我所在的省份的房价慢慢的往下跌，之前我不肯接受的价格，很快就变成我奢求的价格；现在想来很后悔没有在一开始挂牌的时候直接卖掉，因为那个价格比我现在的这个价格高50w；哈哈哈但是机会就是这样，过了就过了，现在这个时机已经卖不到那个价格，甚至于挂牌价都不能那么高；
这次从女儿这边回来，我就下定决心要尽快出手，只要价格能接受就好，赚多赚少可能已经不是很关键的；为什么房子不留下来呢？这个问题本质上是想用这笔钱维持以后几十年的孩子和老婆的生活，虽然有积蓄，但是积蓄没办法维持很长时间; 
基于这些原因，从我回国一周我就快速的和中介联络，看目前有哪些用户有想法可以真的下决心购买我的房子的，但是询问一圈有想法的有，但是很多客户都在观望，想再等等或者摇号什么的；大概在本周有一个中介天天和我打电话说他有一个客户资金已经ok了，价格上就是多少的，问我能不能接受，但是给的价格其实有点低，但是和我的心里价格少了10w；我就中介说，这个是低价，不能再低了，如果低于这个价格，我觉得没什么好谈的。
哈哈哈，这个中介来回磨，最终我们就真实的见面聊了，虽然最终价格比我心里价格低，但和我老婆一合计的，觉得卖了吧，无所谓了...于是就成交了..</p>
<h4 id="heading-5oiq5lqk5lml5zco55qe5bd5oof">成交之后的心情</h4>
<p>签约完毕之后，我心情是很轻松的，感觉心里一块石头落下了，至于这个价格低不低呢，我觉得还蛮低的，按照去年的价格可能差价有100w，但是我却没有一种很不甘的心情，我的心情是很开心的，这个开心来源于：</p>
<ol>
<li>这件事情总算落地了，一件心事解决了</li>
<li>我没有负债了，我如果被裁员不会焦虑钱的问题</li>
<li>后面的生活可能有一定的稳定性了，孩子和老婆的生活得到了保证</li>
<li>我终于可以做一些我想做的事情
当然目前只是走到了第一步，等所有的事情都结束，我能拿到房款，这件事情就算是完全ok了，后面我要做的事情就是step3了;</li>
</ol>
<h4 id="heading-6lz5lu25lql5oof5b6x5yiw55qe5lia5lqb5lic6kw">这件事情得到的一些东西</h4>
<p>我真的不是那种可以有心事的人，我有心事的话，我整个人就会焦虑，因为未来的不确定，起码是那种不稳定会导致我焦虑无比，虽然可能有planA|B|C,但是依然不能让我安心下来，这可能和小时候的成长环境有关，对钱有点执着，感觉需要用钱来守护自己的未来生活的，也是出于对家庭的负责，我虽然很痛苦但是我依然会优先保护她们的未来的...</p>
<p>后面的日子，自己能做自己想做的事情，不要去担心太多的东西的，让自己心无旁骛的做事情，可能这就是我想要的也是适合我的...</p>
]]></content:encoded></item><item><title><![CDATA[io_uring介绍]]></title><description><![CDATA[最近看到liburing的文档，感觉对iouring的很多的原理和使用方式有一个比较大概的了解，对于想知道这套接口到底做了什么能比较好的入门，而且liburing这套lib的代码也非常容易懂，下面是自己看文档的笔记.
1. io_uring的起源
Linux之前其实已经有一套异步io的接口，但是这套接口有着几个比较明显的限制:

最最大的限制在于: 只有使用O_DIRECT模式下面才能支持异步访问，因为只能支持O_DIRECT的话，那么就不能使用缓存和需要做内存对齐的限制，所以导致这个接口并不是...]]></description><link>https://nomoshen.com/iouring</link><guid isPermaLink="true">https://nomoshen.com/iouring</guid><category><![CDATA[iOS]]></category><category><![CDATA[liburing]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sat, 09 Sep 2023 04:07:27 GMT</pubDate><content:encoded><![CDATA[<p>最近看到liburing的<a target="_blank" href="https://kernel.dk/io_uring.pdf">文档</a>，感觉对iouring的很多的原理和使用方式有一个比较大概的了解，对于想知道这套接口到底做了什么能比较好的入门，而且<a target="_blank" href="https://github.com/axboe/liburing">liburing</a>这套lib的代码也非常容易懂，下面是自己看文档的笔记.</p>
<h2 id="heading-1-iouring">1. io_uring的起源</h2>
<p>Linux之前其实已经有一套异步io的接口，但是这套接口有着几个比较明显的限制:</p>
<ul>
<li><p>最最大的限制在于: 只有使用<code>O_DIRECT</code>模式下面才能支持异步访问，因为只能支持<code>O_DIRECT</code>的话，那么就不能使用缓存和需要做内存对齐的限制，所以导致这个接口并不是很通用;</p>
</li>
<li><p>依然会blocking; 即使你满足了所有关于这个接口的限制，依然存在多种方式会导致blocking; 比如meta-data需要被执行io的话，那么提交这个过程将会blocking；又或者当底层存储设备的slot都在被使用的过程中，也会导致blocking，直到最终一个slot变得可用；看到描述的感觉就是不可控，而且对于异步编程来说，blocking是一个很重大的问题，因为会导致你的整个异步框架问题；</p>
</li>
<li><p>API 不是很好；这边主要说的是性能问题，有太多的内核到userspace的copy；</p>
</li>
</ul>
<h4 id="heading-aio">为何选择重新设计一套接口而不是优化之前的aio的接口呢？</h4>
<p>当时内核组的想法是提升aio性能和复用原先的接口，原因是</p>
<ul>
<li><p>改善和优化现存接口会由于提供新的接口；用户采用一个新的接口是需要很长很长的时间</p>
</li>
<li><p>兼容原先接口可以兼容原先使用老接口的应用，从这个成眠来说减少了接入的工作量</p>
</li>
</ul>
<p>但是最终发现要修复和改进目前的状态，一方面会导致整个接口变得无比复杂，也不能到达所谓的预期，于是就推到重来;</p>
<h4 id="heading-5paw6k66k6h55qe55uu5qch">新设计的目标</h4>
<ul>
<li><p>更加容易被使用，更加难被误用；</p>
</li>
<li><p>有更加广泛的使用场景；主要是说这套接口能使用场景更加广泛，除了文件io还能支持类似的block设备或者网络接口等等；这套接口需要对未来有足够的开放性；</p>
</li>
<li><p>更丰富的扩展性；这边主要是的是需要对兼容目前已有的使用方式，能让用户一套接口实现目前已有的所有；防止用户需要为了不同的功能用两套不同的接口;</p>
</li>
<li><p>更丰富的功能；这边主要是的是需要对兼容目前已有的使用方式，能让用户一套接口实现目前已有的所有；防止用户需要为了不同的功能用两套不同的接口;</p>
</li>
<li><p>更加好的性能；</p>
</li>
<li><p>可伸缩性；可能是能随着底层设备的伸缩，接口本身能支持到线性扩展的能力；</p>
</li>
</ul>
<h2 id="heading-2-iouring">2. 正式进入IO_URING</h2>
<p>io_uring虽然有那么多的目标，但是第一优先级在于性能，而性能的最重要的点在于<code>kernel-user</code>之间的内存copy，要去除这个copy的话，就需要共享内存，但是同时需要避免所谓的并发问题的；最终找到了一个数据结构能得到要求：<code>ring-buffer</code>, 应该就是环形队列的；</p>
<ol>
<li><p><strong>SPSC</strong>: 单生产者单消费者；</p>
</li>
<li><p>通过<code>memory-barrier</code>的方式来保证并发安全；在这边极力的避免所谓的lock的操作，lock对性能影响太大；</p>
</li>
</ol>
<p>这边一定要注意的是单消费单生产者的这个前提，不然会觉得后面的实现貌似不thread-safe; 假设我们用<code>writeIndex</code>和<code>readIndex</code>来表示写和读的索引，可能会产生线程安全的问题主要在于判断队列full或者empty，这个通过比较writeIndex和readIndex的方式来进行，而对这两个变量的访问可以通过<code>memory-barrier</code>的方式来保护；</p>
<p>对于目前的异步接口，有两个最为重要的操作；分别为: 提交请求和与消费这个请求关联的完成事件；对于提交事件来说,application是生产者，而kernel是消费者；对于消费完成事件的话，kernel是生产者，application是消费者；因此这个新的接口会有两个<code>ring-buffer</code></p>
<ul>
<li><p>SQ: 提交队列</p>
</li>
<li><p>CQ: 完成队列</p>
</li>
</ul>
<h3 id="heading-21">2.1 数据结构</h3>
<pre><code class="lang-cpp"><span class="hljs-comment">// complete event struct</span>
<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_uring_cqe</span> {</span>
__u64 user_data;
__s32 res;
__u32 flags;
};
</code></pre>
<ul>
<li><p><code>user_data</code>: 一个指针，从提交请求那边带过来的，可以带各种信心，内核是不会去碰这个数据的；</p>
</li>
<li><p><code>res</code>: 本次request的最终结果，就是正常system call的结果，和之前read/write的一样；</p>
</li>
<li><p><code>flags</code>: 用来带与这个操作的元信息，但是目前还没用；</p>
</li>
</ul>
<p>相比于完成event的数据结构，request的数据结构会更加复杂很多；</p>
<pre><code class="lang-cpp"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_uring_sqe</span> {</span>
__u8 opcode;
__u8 flags;
__u16 ioprio;
__s32 fd;
__u64 off;
__u64 addr;
__u32 len;
<span class="hljs-keyword">union</span> {
<span class="hljs-keyword">__kernel_rwf_t</span> rw_flags;
__u32 fsync_flags;
__u16 poll_events;
__u32 sync_range_flags;
__u32 msg_flags;
};
__u64 user_data;
<span class="hljs-keyword">union</span> {
__u16 buf_index;
__u64 __pad2[<span class="hljs-number">3</span>];
};
};
</code></pre>
<ul>
<li><p><code>opcode</code>: 本次request的操作类型，比如<code>IOURING_OP_READV</code>表示向量读</p>
</li>
<li><p><code>flags</code>: 一些特殊的配置，通过flags来进行设置</p>
</li>
<li><p><code>ioprio</code>:操作优先级，可以通过<code>ioprio_set</code>的方式来进行设置</p>
</li>
<li><p><code>fd</code>: 本次请求关联的文件句柄</p>
</li>
<li><p><code>off</code>:offset</p>
</li>
<li><p><code>addr</code>: 读写最终的地址，比如buffer的地址，又或者如果<code>opcode</code>设置成<code>IOURING_OP_READV</code>的话，那么addr是就是数组首地址；</p>
</li>
<li><p><code>len</code>:配合addr一起事情，比如读取或者写入的长度;</p>
</li>
<li><p><code>union</code>:需要配合特殊的opcode来使用；</p>
</li>
<li><p><code>user_data</code>:和之前完成event的field对应的；</p>
</li>
<li><p><code>buf_index</code>:也是高端使用；</p>
</li>
</ul>
<h3 id="heading-22-ring-buffer-with-no-lock">2.2 内核和用户空间的通信 - ring-buffer with no lock</h3>
<ul>
<li><p>cqr: completion queue ringbuffer</p>
<p>  完成队列kernel负责生产，而producer负责消费，整体的size是一个32bits的整数，这个方法的好处是：可以充分利用所有的空间，不需要去设置所谓的full flag来表示空间满的问题；劣势是size的长度必须是2的指数次的大小；</p>
<pre><code class="lang-plain">  环形队列在没有特殊的flag的情况下是如何判断队列满或者空呢？
  * tailer:表示之前写入的位置
  * head: 表示第一个可读的位置;

  在push的过程中，判断tailer+1 == head: 如果相同，说明队列满；
  在pop的过程中，判断head==tailer: 如果相同，说明队列空；

  这种适合SPSC这种场景
</code></pre>
<p>  下面是一段伪码，用来描述消费这个ring的过程:</p>
<pre><code class="lang-cpp">  <span class="hljs-keyword">unsigned</span> head;
  head = cqring→head;
  read_barrier();
  <span class="hljs-keyword">if</span> (head != cqring→tail) {
    <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_uring_cqe</span> *<span class="hljs-title">cqe</span>;</span>
    <span class="hljs-keyword">unsigned</span> index;
    index = head &amp; (cqring→mask);
    cqe = &amp;cqring→cqes[index];
    <span class="hljs-comment">/* process completed cqe here */</span>
    ...
    <span class="hljs-comment">/* we've now consumed this entry */</span>
    head++;
  }
  cqring→head = head;
  write_barrier();
</code></pre>
<p>  memory-barrier主要是<strong>用来保证在多线程情况下，各个线程看到指令可排序</strong>；它并不用来解决并发问题，它主要是来解决内存load和store的顺序问题；</p>
<ol>
<li><p>获得head</p>
</li>
<li><p>判断队列是否为空</p>
</li>
<li><p>消费entry</p>
</li>
<li><p>修改head</p>
<p><code>ring-cqe[]</code>是一个共享内存数组，连续的; 这个与sqe ring 有点不一样；</p>
</li>
</ol>
</li>
<li><p>sqr: subimssion queue ringbuffer</p>
<p>  sqr与cqr的最大区别点在于：cqr是一个连续的数据，并且cqe就是这个数组的entry；sqr本质上有两个数组，也就是两个ring；主要的目的在于获得sqe,并且填充sqe，最后提交sqe之间的过程是分开的的；一个索引ring主要是为了对真正提交的sqe，这个ring也是给kernel来看的，在不主动提交io请求之前，也就是获得sqe并且在填充sqe过程中，索引的ring的tail是不会变化的，内核也是不会知道有数据需要被消费的；这样从用户层面来说可以按照业务的要求提交多个io请求；</p>
<p>  这个设计我一开始很奇怪，但是文档上给出的理由是：这种方式比较灵活;</p>
<blockquote>
<p>Some applications may embed request units inside internal data structures, and this allows\
them the flexibility to do so while retaining the ability to submit multiple sqes in one operation. That in turns allows for\
easier conversion of said applications to the io_uring interface.</p>
<p>一个op中包含了多个sqe操作；使用这种方式的话会更加灵活，没有顺序的限制；</p>
</blockquote>
<pre><code class="lang-cpp">  <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_uring_sqe</span> *<span class="hljs-title">sqe</span>;</span>
  <span class="hljs-keyword">unsigned</span> tail, index;
  tail = sqring→tail;
  index = tail &amp; (*sqring→ring_mask);

  sqe = &amp;sqring→sqes[index];
  <span class="hljs-comment">/* this call fills in the sqe entries for this IO */</span>
  init_io(sqe);
  <span class="hljs-comment">/* fill the sqe index into the SQ ring array */</span>
  sqring→<span class="hljs-built_in">array</span>[index] = index;
  tail++;
  write_barrier();
  sqring→tail = tail;
  write_barrier();
</code></pre>
</li>
</ul>
<p>完成事件到达的速度是无序的，和提交到内核的是没有关系的，如果需要支持提交事件的依赖的话，有一些高级功能iouring也支持；</p>
<h3 id="heading-23-iouring">2.3 io_uring提供的接口</h3>
<h4 id="heading-1-iouring-1">1. 初始化iouring的实例</h4>
<pre><code class="lang-cpp"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">io_uring_setup</span><span class="hljs-params">(<span class="hljs-keyword">unsigned</span> entries, struct io_uring_params *params)</span></span>;

<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_uring_params</span> {</span>
  __u32 sq_entries;
  __u32 cq_entries;
  __u32 flags;
  __u32 sq_thread_cpu;
  __u32 sq_thread_idle;
  __u32 resv[<span class="hljs-number">5</span>];
  <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_sqring_offsets</span> <span class="hljs-title">sq_off</span>;</span>
  <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_cqring_offsets</span> <span class="hljs-title">cq_off</span>;</span>
};
</code></pre>
<ul>
<li><p><code>entries</code>: 用来指定sqe的个数，可以认为是提交队列的长度，cqe的长度是sqe的两倍; 要求为2的指数倍</p>
</li>
<li><p><code>params</code>: 一些传给内核的参数；这个参数比较特殊，是有用户和kernel两边来读写的；说明kernel会通过这个参数返回一些数据</p>
<ul>
<li><p><code>sq_entries</code>: 个数</p>
</li>
<li><p><code>cq_entries</code>: 同上</p>
</li>
<li><p><code>sq_off</code>和<code>cq_off</code>：这两个参数很重要，会返回一些内核中ring的内存信息，而user可以通过<code>mmap</code>系统调用的方式来进行无缝对接，这样跟后面的所有的访问可以做到无内核态和用户态的内存copy，这个一段公共内存；</p>
</li>
</ul>
</li>
</ul>
<pre><code class="lang-cpp"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_sqring_offsets</span> {</span>
  __u32 head; <span class="hljs-comment">/* offset of ring head */</span>
  __u32 tail; <span class="hljs-comment">/* offset of ring tail */</span>
  __u32 ring_mask; <span class="hljs-comment">/* ring mask value */</span>
  __u32 ring_entries; <span class="hljs-comment">/* entries in ring */</span>
  __u32 flags; <span class="hljs-comment">/* ring flags */</span>
  __u32 dropped; <span class="hljs-comment">/* number of sqes not submitted */</span>
  __u32 <span class="hljs-built_in">array</span>; <span class="hljs-comment">/* sqe index array */</span>
  __u32 resv1;
  __u64 resv2;
};
</code></pre>
<p>通过这些参数我们就可以对iouring中的sqe的ring和cqe的ring来进行操作的；下面这段是libiouring对这个参数的使用:</p>
<pre><code class="lang-cpp"><span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">io_uring_mmap</span><span class="hljs-params">(<span class="hljs-keyword">int</span> fd, struct io_uring_params *p,
             struct io_uring_sq *sq, struct io_uring_cq *cq)</span>
</span>{
    <span class="hljs-keyword">size_t</span> size;
    <span class="hljs-keyword">int</span> ret;

    size = <span class="hljs-keyword">sizeof</span>(struct io_uring_cqe);
    <span class="hljs-keyword">if</span> (p-&gt;flags &amp; IORING_SETUP_CQE32)
        size += <span class="hljs-keyword">sizeof</span>(struct io_uring_cqe);

    sq-&gt;ring_sz = p-&gt;sq_off.<span class="hljs-built_in">array</span> + p-&gt;sq_entries * <span class="hljs-keyword">sizeof</span>(<span class="hljs-keyword">unsigned</span>);
    cq-&gt;ring_sz = p-&gt;cq_off.cqes + p-&gt;cq_entries * size;

    <span class="hljs-keyword">if</span> (p-&gt;features &amp; IORING_FEAT_SINGLE_MMAP) {
        <span class="hljs-keyword">if</span> (cq-&gt;ring_sz &gt; sq-&gt;ring_sz)
            sq-&gt;ring_sz = cq-&gt;ring_sz;
        cq-&gt;ring_sz = sq-&gt;ring_sz;
    }
<span class="hljs-comment">// array index</span>
    sq-&gt;ring_ptr = __sys_mmap(<span class="hljs-number">0</span>, sq-&gt;ring_sz, PROT_READ | PROT_WRITE,
                  MAP_SHARED | MAP_POPULATE, fd,
                  IORING_OFF_SQ_RING);
    <span class="hljs-keyword">if</span> (IS_ERR(sq-&gt;ring_ptr))
        <span class="hljs-keyword">return</span> PTR_ERR(sq-&gt;ring_ptr);

    <span class="hljs-keyword">if</span> (p-&gt;features &amp; IORING_FEAT_SINGLE_MMAP) {
        cq-&gt;ring_ptr = sq-&gt;ring_ptr;
    } <span class="hljs-keyword">else</span> {
        cq-&gt;ring_ptr = __sys_mmap(<span class="hljs-number">0</span>, cq-&gt;ring_sz, PROT_READ | PROT_WRITE,
                      MAP_SHARED | MAP_POPULATE, fd,
                      IORING_OFF_CQ_RING);
        <span class="hljs-keyword">if</span> (IS_ERR(cq-&gt;ring_ptr)) {
            ret = PTR_ERR(cq-&gt;ring_ptr);
            cq-&gt;ring_ptr = <span class="hljs-literal">NULL</span>;
            <span class="hljs-keyword">goto</span> err;
        }
    }

    size = <span class="hljs-keyword">sizeof</span>(struct io_uring_sqe);
    <span class="hljs-keyword">if</span> (p-&gt;flags &amp; IORING_SETUP_SQE128)
        size += <span class="hljs-number">64</span>;
<span class="hljs-comment">//真正存储sqe的</span>
    sq-&gt;sqes = __sys_mmap(<span class="hljs-number">0</span>, size * p-&gt;sq_entries, PROT_READ | PROT_WRITE,
                  MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQES);
    <span class="hljs-keyword">if</span> (IS_ERR(sq-&gt;sqes)) {
        ret = PTR_ERR(sq-&gt;sqes);
err:
        io_uring_unmap_rings(sq, cq);
        <span class="hljs-keyword">return</span> ret;
    }

    io_uring_setup_ring_pointers(p, sq, cq);
    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre>
<p><code>array</code>:这个表示array在整个区域的偏移量；上面的mmap映射是用来访问sqe的内存结构；通过这种方式，其实我们就可以实现之前的ring-buffer；可以看到两次mmap的最后一个参数是不一样的，用来表示从ring_fd的不同位置；</p>
<pre><code class="lang-cpp"><span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> IORING_OFF_SQ_RING        0ULL</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> IORING_OFF_CQ_RING        0x8000000ULL</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> IORING_OFF_SQES            0x10000000ULL</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> IORING_OFF_PBUF_RING        0x80000000ULL</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> IORING_OFF_PBUF_SHIFT        16</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> IORING_OFF_MMAP_MASK        0xf8000000ULL</span>
</code></pre>
<p>看到上面的真实实现之后，最终在用户层构建两个sq ring和cq ring，那么后面用户态的访问就可以继续这两个数据结构来进行；</p>
<h4 id="heading-2">2. 提交和消费事件</h4>
<pre><code class="lang-!cpp">int io_uring_enter(unsigned int fd, unsigned int to_submit,unsigned int min_complete, unsigned int flags,sigset_t sig);

// to_submit: 表示有几个请求已经提交给你了，内核你可以消费了
// min_complete: 表示我需要等待几个完成事件
// flags: 可以设置一些行为
// IORING_ENTER_GETEVENTS: 表示内核会主动等待有min_complete event完成； 如果想要等待完成事件，这个flag需要设置
</code></pre>
<p>这个系统调用有两种作用，分别为：</p>
<ul>
<li><p>提交io请求</p>
</li>
<li><p>消费已经完成的event</p>
</li>
</ul>
<p>用户消费cqe的方式有两种，一种是主动等待，也就是io_uring_enter中主动等待，另外一种是去检查cqring即可， 没必要主动等待；</p>
<h4 id="heading-3">3. 其他</h4>
<ul>
<li><p>初始化ioring实例的时候flag:</p>
<ul>
<li><p>IOSQE_IO_DRAIN: 表示在它之前的所有io请求都操作完，才操作它；主要是顺序性；但是这对性能影响很大的，因为有一定的依赖关系，请求与请求之间不能并行进行操作，即使io本身请求无关联；DRAIN表示排空，意思就是排空之前所有的io请求；</p>
</li>
<li><p><code>IOSQE_IO_LINK</code>: <code>DRAIN</code>这个关系太强了点，尤其是不相关的io都被关联起来的，有的时候可能只需要几个io之前有依赖关系，这个时候就可以用LINK这个标识，来关联几个IO操作；对于这类的IO如果返回的结果是<code>-ECANCELED</code>就表示在中间可能出现了一些错误，从而中断了整个chain；从第一个</p>
</li>
<li><p><code>IORING_OP_TIMEOUT</code>: 并非是一个真实的数据操作的，而是一个超时，做了做定时器使用的；如果设置了flag的话，那么addr是timeout的参数，offset是cq 完成的个数，两种触发机制；</p>
</li>
</ul>
</li>
</ul>
<h3 id="heading-24-memory-ordering">2.4 memory ordering</h3>
<ol>
<li><p><code>memory_order_relaxed</code>: 最轻松的内存序，不提供任何同步语义。操作可以以任意顺序执行，没有对其他线程的可见性保证。</p>
</li>
<li><p><code>memory_order_acquire</code>: 用于获取操作（读取操作），确保对其他线程的读取和写入操作的可见性。该操作前的读取操作不能被重排序到该操作之后，确保所需的数据的可见性。</p>
</li>
<li><p><code>memory_order_release</code>: 用于释放操作（写入操作），确保对其他线程的写入操作的可见性。该操作后的写入操作不能被重排序到该操作之前，确保对其他线程的修改的可见性。</p>
</li>
<li><p><code>memory_order_acq_rel</code>: 同时具有获取和释放操作的特性，即确保前面的读取操作不会与后面的写入操作重排序，并确保后面的写入操作不会与前面的读取操作重排序。</p>
</li>
<li><p><code>memory_order_seq_cst</code>: 顺序一致性内存序，提供最强的内存顺序保证。所有操作都按照全局顺序执行，并且提供了对其他线程操作的最严格的可见性保证</p>
</li>
</ol>
<p>目前我的理解是，memory ordering主要是为了解决单线程情况下的指令排序的问题，虽然说编译器或者cpu在保障单线程结果不影响的情况下进行排序来加速整个效率，但是它保证不了多线程情况下的这样的排序依然是对的；所以需要程序员自己去衡量；而memory ordering本质上不是为了解决多线程的线程安全问题，保证的在单线程的读写操作的顺序是可被保证的；比如当我读到a=1的时候，一定能保证b=2，因为在单线程中，我通过memory ordering保证了这个顺序，那么其他的线程看到a=1的时候就可以保证b一定等于2；当然前提是其他线程也要用memory ordering的方式去读；* </p>
<pre><code class="lang-cpp"><span class="hljs-number">1</span>: sqe→opcode = IORING_OP_READV;
<span class="hljs-number">2</span>: sqe→fd = fd;
<span class="hljs-number">3</span>: sqe→off = <span class="hljs-number">0</span>;
<span class="hljs-number">4</span>: sqe→addr = &amp;iovec;
<span class="hljs-number">5</span>: sqe→len = <span class="hljs-number">1</span>;
<span class="hljs-number">6</span>: sqe→user_data = some_value;
write_barrier();<span class="hljs-comment">/* ensure previous writes are seen before tail write */</span>
<span class="hljs-number">7</span>: sqring→tail = sqring→tail + <span class="hljs-number">1</span>;
write_barrier();<span class="hljs-comment">/* ensure tail write is seen */</span>
</code></pre>
<ul>
<li><p><code>write_barrier</code>:保证这之后的写操作不会被调整到write_barrier之前，这样保证有什么用呢，这样保证当tail在变化的时候，sqe已经初始化好了；后面的write_barrier，保证这之后的指令都能看到这次修改；</p>
</li>
<li><p><code>read_barrier</code>: 保证之前的读操作不是被调整到read_barrier这个之后；这样的好处是，当我读到数据是某一个特定值的时候，那么就表示关于这个特定值的假设是成立的；</p>
</li>
</ul>
<h2 id="heading-3-liburing">3. liburing</h2>
<p>提供这个库的主要目的：</p>
<ol>
<li><p>减少setup iouring的代码</p>
</li>
<li><p>提供更加简单的api</p>
</li>
</ol>
<h3 id="heading-31-api">3.1 主要api</h3>
<ul>
<li><p>设置iouring实例</p>
<pre><code class="lang-cpp">  <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_uring</span> <span class="hljs-title">ring</span>;</span>
  io_uring_queue_init(ENTRIES, &amp;ring, <span class="hljs-number">0</span>);
  io_uring_queue_exit(&amp;ring);
</code></pre>
<p>  包含了iouring的实例 + mmap的映射之类的，都帮我们完成</p>
</li>
<li><p>提交和消费</p>
<pre><code class="lang-cpp">  <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_uring_sqe</span> <span class="hljs-title">sqe</span>;</span>
  <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">io_uring_cqe</span> <span class="hljs-title">cqe</span>;</span>
  <span class="hljs-comment">/* get an sqe and fill in a READV operation */</span>

  sqe = io_uring_get_sqe(&amp;ring);
  io_uring_prep_readv(sqe, fd, &amp;iovec, <span class="hljs-number">1</span>, offset);
  <span class="hljs-comment">/* tell the kernel we have an sqe ready for consumption */</span>
  io_uring_submit(&amp;ring);
  <span class="hljs-comment">/* wait for the sqe to complete */</span>
  io_uring_wait_cqe(&amp;ring, &amp;cqe);
  <span class="hljs-comment">/* read and process cqe event */</span>
  app_handle_cqe(cqe);
  io_uring_cqe_seen(&amp;ring, cqe);
</code></pre>
<p>  <code>io_uring_cqe_seen</code>:主要是说某一个sqe已经完成的，可以减少飞行模式的sqe；也会更改cq的head的位置，所以必须在application操作完成之后才能提交完成；有点类似于kafka</p>
<p>  <code>io_uring_peek_cqe</code>: 不需要等待，非阻塞的</p>
</li>
</ul>
<h3 id="heading-32">3.2 高端功能</h3>
<ul>
<li><p>注册文件句柄</p>
<p>  正常情况下，每次向内核提交io的request的时候，内核都会去检索与之相关的文件，当io结束的之后，这个drop掉这个引用；这样每次都进行这样的操作，在一些高性能的场景中是很难被接受的，所以io_uring提供了另外的system call的接口，可以预先注册一些文件句柄到io_uring中，这样就省的每次都关联和关闭的操作；</p>
<pre><code class="lang-cpp">  <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">io_uring_register</span><span class="hljs-params">(<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> fd, <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> opcode, <span class="hljs-keyword">void</span> *arg,
  <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> nr_args)</span></span>;
  <span class="hljs-comment">/**
  fd: iouring实例的文件句柄
  opcode: 操作类型IORING_REGISTER_FILES
  arg: 一个文件句柄的数组
  nr_args:个数；
  */</span>
</code></pre>
<p>  如何使用呢？在后期的使用的过程中，通过array index的方式来替换真的fd提交给iouring(<code>sqe→fd</code>), 然后通过<code>IOSQE_FIXED_FILE</code>设置在flag删除，这样iouring会自动在数组中找自己要的fd，并且也不会都drop；有两种会关闭这个资源:</p>
<ul>
<li><p>iouring实例被free掉</p>
</li>
<li><p>主动调用<code>io_uring_register</code>，并且op_code设置<code>IORING_UNREGISTER_FILES</code>，可以把已经注册的fd给取消掉；</p>
<p>还有可以将buffer固定下来，这样的好处是不需要每次都通过mmap把application的buffer到内核空间，可以通过<code>IORING_REGISTER_BUFFERS</code>的方式来进行设置，每次提交sqe的时候用<code>IORING_OP_READ_FIXED</code>和<code>IORING_OP_WRITE_FIXED</code>的方式来告诉内核，可以用固定的buffer，当然前提是所有的读写不能操作固定buffer的长度；</p>
</li>
</ul>
</li>
<li><p>POLLED IO: 这个很重要的模式；</p>
<p>  正常的io，包括网络或者文件之类io请求，操作系统cpu不会主动去询问当前的io 请求是否完成，都是通过<code>soft/hard interrupt</code>来实现的，而cpu会有相关的中断程序来处理这些中断，并且通知对应的应用程序请求已经完成了，可以继续处理；其实这个方式挺好的，可以让出cpu，让cpu去做其他的事情；整体的缺点就是可能会有一定的延迟，需要通过整个中断处理过程来触发的，有的时候cpu进入不能被中断的时候就需要等待，有一定的延迟的；而且当中断太多的时候，也会降低cpu的整体的效率，需要不断的去处理中断处理程序；所以如果为了降低延迟，提高整体的io性能的话，iouring提供了<code>IORING_SETUP_IOPOLL</code>的flag，这个flag的作用是: 应用程序不会再去检查cq ring的tail，因为之前正常的<code>no-polled io</code>的使用方式是通过去检查cq ring tail的方式来得到是否有完成的event，但是当你开启了polled io之后，将不会同步硬件完成event的通知，也就可能说cq ring 可能是不会再被改变了；代替的就是应用程序必须不断的的调用<code>io_uring_enter</code>来询问是否有完成的event；</p>
<p>  关于这个标识必须在初始化iouring的时候就进行设置，后期是修改不了的；</p>
</li>
<li><p><code>KERNEL SIDE POLLING</code>: 这也是一个很重要的模式</p>
<p>  之前提到，提交io请求需要最终调用<code>io_uring_enter</code>的系统调用的；也就是告诉内核目前有数据了，可以消费了；为了追求高性能的，iouring还提供了不需要主动提交事件的方式，因为当你修改tail之后其实已经表示了你提交了一个io事件，提交这个过程中application主动push的过程，虽然最终还是需要内核去操作，但是application会做一些事情，而不是仅仅提交这些io请求；</p>
<p>  开启了<code>IORING_SETUP_SQPOLL</code>这个之后，内核会启动消费内核线程，主动去轮训 sq ring，application不需要去submit这个请求，这样整个性能的提升是会有的，起码对<code>io_uring_enter</code>的系统调用可以省去，这个消耗也是可观的；</p>
<p>  而且可以通过<code>IORING_SETUP_SQ_AFF</code> 去设定这个内核线程在哪些cpu核心上进行；为了避免浪费太多的无效的cpu，因为轮训本身是比较消耗cpu的；所以如果在一定周期内内核线程空闲的话，会被自动sleep的，用户这段需要通过调用<code>IORING_SQ_NEED_WAKEUP</code>的flag去唤醒这个线程的；</p>
<pre><code class="lang-!cpp">  if ((*sqring→flags) &amp; IORING_SQ_NEED_WAKEUP)
    io_uring_enter(ring_fd, to_submit, to_wait, IORING_ENTER_SQ_WAKEUP);
</code></pre>
<p>  应用段的代码可能为了防止内核线程sleep，不处理请求，可以设定一个周期或者关心上一次提交请求的距离，如果很久了，那就提交一个唤醒操作，这样保证能正常处理请求；</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[一致性hash]]></title><description><![CDATA[CHAPTER 5: DESIGN CONSISTENT HASHING
1. 传统hash存在的问题
传统的直接使用hash(key)/n 这种方式其实有着自己的使用场景，如果你的n是固定的永远不变的，其实是没有问题的，这里的不变的就是n的数量不变，因为只要n不变那么key分布的位置就不会变化的；而一旦n要变化，这传统的方式就会带来一个极大的问题是：几乎所有的key需要重新被调整分布，这样动静太大了；
2. consist hash

Quoted from Wikipedia: "Consi...]]></description><link>https://nomoshen.com/hash</link><guid isPermaLink="true">https://nomoshen.com/hash</guid><category><![CDATA[System Design]]></category><category><![CDATA[consist-hash]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sun, 20 Aug 2023 23:52:19 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-chapter-5-design-consistent-hashing">CHAPTER 5: DESIGN CONSISTENT HASHING</h1>
<h2 id="heading-1-hash">1. 传统hash存在的问题</h2>
<p>传统的直接使用<code>hash(key)/n</code> 这种方式其实有着自己的使用场景，如果你的n是固定的永远不变的，其实是没有问题的，这里的不变的就是n的数量不变，因为只要n不变那么key分布的位置就不会变化的；而一旦n要变化，这传统的方式就会带来一个极大的问题是：几乎所有的key需要重新被调整分布，这样动静太大了；</p>
<h2 id="heading-2-consist-hash">2. consist hash</h2>
<blockquote>
<p>Quoted from Wikipedia: "Consistent hashing is a special kind of hashing such that when a hash table is re-sized and consistent hashing is used, only k/n keys need to be remapped on average, where k is the number of keys, and n is the number of slots. In contrast, in most traditional hash tables, a change in the number of array slots causes nearly all keys to be remapped [1]</p>
<p>(<a target="_blank" href="https://app.heptabase.com/4397a62d-9173-49be-b358-fd478fecc295/highlightElement/97aa90cf-311b-4b0a-80b3-8fc1d1a4d956">View Source</a>)</p>
</blockquote>
<p>这是wiki对consist hash的定义的，主要是为了解决传统hash中，当集群成员数量变化导致的remapped问题；一致性hash在集群数量产生变更的时候，平均的key的调整数量为<code>k/n</code> , k为key的个数，n为slot的个数，也就是从统计来说，它只需要调整一个节点的key即可，这也符合正常要求：一个节点出现问题，那么就将这个节点的key全部迁移即可， 不要对其他的节点进行影响；(slot正常情况下会在node分布均匀)</p>
<pre><code class="lang-plain">1. hash space: 主要是指一个hash算法结果值的范围,比如sha-1的范围是[0,2^160-1]
2. hash ring: 就是这范围的一种比较形象的表示;
</code></pre>
<h3 id="heading-21">2.1 核心的几个步骤</h3>
<ul>
<li><p>server按照自己的ip或者其他能代表它身份的信息，经过相同的hash算法找到自己在hash ring上的位置</p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/consist-hash-image.png" alt="image.png" /></p>
</li>
<li><p>key在存储的时候，按照hash算法的结果找到对应的位置，然后顺时针找到第一个server来存储它</p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/consist-hash-image%201.png" alt="image 1.png" /></p>
</li>
</ul>
<h3 id="heading-22-addremove">2.2 成员add和remove</h3>
<ul>
<li><p>增加节点</p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/consist-hash-image%202.png" alt="image 2.png" /></p>
<p>  能看到增加了s4之后，remapped的影响面之后在[s3,s4]之间这块范围，之前这块范围是有s0来存储的，所以一致性hash的好处就在于增加/删除节点的时候需要remapped的key的个数非常的少；</p>
</li>
<li><p>删除节点</p>
<p>  <img src="https://cdn.nomoshen.com/typora_img/consist-hash-image%203.png" alt="image 3.png" /></p>
<p>  删除节点也一样，s1的删除影响的范围在于[s0,s1]这个keys，因为这块之前有s1来负责，现在开始要有s2来负责，这种算法的好处几乎做到了能将影响面控制在最小范围之内；</p>
</li>
</ul>
<h3 id="heading-23-hash">2.3 基础一致性hash算法的问题</h3>
<p>如何保证每个server能存储差不多的key，也就是负载均衡； 原因在于server本身在环上的位置也是靠计算的，你没办法用相对直观的方式去分配它负责的key的范围; 比如下面这个图，如果s1下限了，那么s2要承担超过几乎50%的key的范围，这个很容易导致s2出现压力过大的问题;</p>
<p><img src="https://cdn.nomoshen.com/typora_img/consist-hash-image%204.png" alt="image 4.png" /></p>
<p>解决方式是: <code>Virtual node</code> 虚拟节点的；通过将真实节点虚拟成100-1000个虚拟节点然后放到ring上，那么整个hash ring就会被分裂成相对比较均匀的区域，而且本身hash算法从算法层面来保证key会比较均匀的落在hash ring上，那么就可以解决所谓的热点问题; </p>
<p><img src="https://cdn.nomoshen.com/typora_img/consist-hash-image%205.png" alt="image 5.png" /></p>
<blockquote>
<p>As the number of virtual nodes increases, the distribution of keys becomes more balanced. This is because the standard deviation gets smaller with more virtual nodes, leading to balanced data distribution. Standard deviation measures how data are spread out. The outcome of an experiment carried out by online research [2] shows that with one or two hundred virtual nodes, the standard deviation is between 5% (200 virtual nodes) and 10% (100 virtual nodes) of the mean. The standard deviation will be smaller when we increase the number of virtual nodes. However, more spaces are needed to store data about virtual nodes. This is a tradeoff, and we can tune the number of virtual nodes to fit our system requirements.</p>
<p>(<a target="_blank" href="https://app.heptabase.com/4397a62d-9173-49be-b358-fd478fecc295/highlightElement/f99decde-58e1-4dd0-af5f-12a7722a65b8">View Source</a>)</p>
<p>通过标准差的方式去衡量整个的负载均衡的情况的，100-200个虚拟节点测试结果大概标准差在10%或者5%h之间 的，其实这样的负载均衡是可以被接受的；增加虚拟节点个数可以减少标准差但是会增加整体find的过程的和存储这些节点的空间</p>
</blockquote>
<h3 id="heading-23">2.3 自己的思考</h3>
<p>我们思考一下在分布式环境下要做到数据分片本质上就两种方式，分别为</p>
<ul>
<li><p>range</p>
</li>
<li><p>hash</p>
</li>
</ul>
<p><strong>其实这两种方式的本质是一致性的，主要是区别在于key最终要落在范围不同</strong>；range是结果范围是按照用户的key的取值范围，比如mongo的按照range分片本质上取值范围是所有的字符串的范围；而所谓的hash分片，本质上是hash算法结果的取值范围；</p>
<p>正常情况下分布式管理key存储在哪个位置都会有一个meta表，基本上的结构应该是:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>[key1-key5)</td><td>node1</td></tr>
</thead>
<tbody>
<tr>
<td>[key5-key10)</td><td>node2</td></tr>
<tr>
<td>[key10,key20)</td><td>node3</td></tr>
</tbody>
</table>
</div><p>你会发现你需要这么一张表去管理这个映射关系的，但是这种方式带来的问题是什么: 需要不断的去维护这份信息的正确性，删除节点、增加节点，数据迁移等等都需要你去更新这份数据，如果这份数据错了那就表示你的key将找不到的；而一致性hash的方案能解决这个问题，它不需要这份信息的存储，它只需要靠计算+<code>server lookup</code>的方式来获得key的存储节点；</p>
<p>所以想较于一致性hash算法的remapped的好处，其实本质上通过上述的通过一个meta信息管理也可以做到影响面比较小，扩容缩容只不过比一致性hash算法要稍微麻烦一点点，但是影响面也可以控制的比较小；而一致性hash最最重要的是元信息的管理不需要存储只需要计算，这样的好处是：减少瓶颈点，减少复杂度; </p>
<p>目前有哪些比较有名的系统在使用这套算法呢:</p>
<ol>
<li><p>cassandra</p>
</li>
<li><p>dynamo</p>
</li>
<li><p>ceph</p>
</li>
<li><p>…</p>
</li>
</ol>
<p>关于一致性hash好处讲了很多，那么有哪些缺点呢？</p>
<ol>
<li><p>可控性比较差，尤其是运维复杂度比较高；很多操作的预期不明确 </p>
<ol>
<li><p>添加节点之后会出现整个集群都开始数据搬迁的，如果这个时候有的节点压力本身比较大的时候，这无疑是容易出现问题，但是如果我用上面那种方式，其实整个过程是相对可控的；</p>
</li>
<li><p>没办法做定点的操作,需要你预先模拟整个hash ring的状态，复杂度挺高的；</p>
</li>
</ol>
</li>
<li><p>计算资源，其实这到不是很大的问题</p>
</li>
<li><p>虚拟节点的个数的确定，不同机型需要根据硬件能力来决定虚拟节点的个数，无疑增加了复杂度；最好做到标准化</p>
</li>
<li><p>扩容，大概率只能一个节点一个节点进行扩容；还记得上面如何寻找被影响keys，是通过逆时针的方式寻找，如果一下子添加多个服务器，可能找到真正有数据的节点是很复杂的；当然也有解决方法</p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[stackless vs stackful]]></title><description><![CDATA[本文是关于Fibers under the magnifying glass论文或者杂志的总结

1. 介绍


正常subrotine: 类似函数调用，从开始执行到最终结束返回，当返回之后就表示整个过程已经结束了；

coroutine: 本质上和函数调用类似,区别在于可以有多个返回点，执行到一半被暂停，一会再回来这样的形态；当然正常函数也会因为线程调度来完成，但是从主观角度来说，函数本身没有能力暂停，一旦返回就结束了；



目前有两种实现方式:

stackless: 无stack式协程，...]]></description><link>https://nomoshen.com/stackless-vs-stackful</link><guid isPermaLink="true">https://nomoshen.com/stackless-vs-stackful</guid><category><![CDATA[paper]]></category><category><![CDATA[stackless]]></category><category><![CDATA[stackful]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sun, 13 Aug 2023 13:15:02 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>本文是关于<a target="_blank" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1364r0.pdf">Fibers under the magnifying glass</a>论文或者杂志的总结</p>
</blockquote>
<h2 id="heading-1">1. 介绍</h2>
<blockquote>
<ul>
<li><p>正常<code>subrotine</code>: 类似函数调用，从开始执行到最终结束返回，当返回之后就表示整个过程已经结束了；</p>
</li>
<li><p><code>coroutine</code>: 本质上和函数调用类似,区别在于可以有多个返回点，执行到一半被暂停，一会再回来这样的形态；当然正常函数也会因为线程调度来完成，但是从主观角度来说，函数本身没有能力暂停，一旦返回就结束了；</p>
</li>
</ul>
</blockquote>
<p>目前有两种实现方式:</p>
<ul>
<li><p><code>stackless</code>: 无stack式协程，是基于编译器将协程实现为状态机的方式；</p>
</li>
<li><p><code>stackful</code>: 有stack式协程，是基于用户态协程调度器的模式来实现协程的;</p>
</li>
</ul>
<h2 id="heading-2-threadfiber">2. <code>Thread</code>和<code>fiber</code>的各方面的比较</h2>
<p><img src="https://cdn.nomoshen.com/typora_img/image.png" alt="image.png" /></p>
<p>这是几种比较流行的用户态线程和内核线程的模型，基本上分为<code>1-1</code>,<code>1-M</code>,<code>n-m</code> ,在<code>C++</code>中创建一个<code>thread</code>会对应到真正的一条kernel thread, 理论上算是<code>1-1</code>的模型，但是这种方式为了提高并发能力只能通过提升线程的个数，会被最终的机器资源所限制的；<code>1-M</code>这个模型就是<code>fiber</code>,或者是早期的协程模型，用户态的线程对应到内核线程是多对1的，用户态的线程和真是的os的线程是不一样的，早期的协程调度都是单线程的，虽然有局限，但是整体的cpu使用率就高了很多的；可以看到对于<code>1-M</code>模型，多个fiber需要公用一个内核线程的,而内核线程在执行的时候都会自己的执行空间的，所以你会发现多了一个<code>UM Context</code> 这个很重要，因为这个是用来区别不同fiber执行的环境；这可能就是所谓的代价;</p>
<p><code>1-m</code>的模型只能利用单核优势，随着cpu慢慢多核化，这个肯定是不符合预期的；慢慢的就推延到了<code>n-m</code>的模型，比较好的例子是<code>golang</code>,它的协程调度器就是可以利用多核的，并且可以做fiber的多核心调度，这个可能也是慢慢的推演过程；</p>
<blockquote>
<p>会发现操作系统的发展过程也是从简单到复杂，慢慢演进的, 为何要复杂本质上是太过简单粗暴的东西在后期的要求中不能完成任务；</p>
<ol>
<li><p>早期的1-1，比较简单，通过上下文切换，这个过程os会去保证对应的context；能符合要求；随着业务场景的要求越来越高，并且简单的1-1会遇到cpu利用率不高，并行度等等的问题</p>
</li>
<li><p>1-M，这个模型的好处在于可以充分利用单核的性能，唯一要做的就是<code>UM Context</code>的维护和一点点的切换的cpu的消耗，但是当单核出现的物理上限之后，现实的cpu的发展方向往多核，那么这个模型就显得有点尴尬</p>
</li>
<li><p>n-m，在保证高效的单核cpu利用率的情况下，又可以充分利用多核</p>
</li>
</ol>
</blockquote>
<h3 id="heading-21">2.1 内存方面的比较</h3>
<p><img src="https://cdn.nomoshen.com/typora_img/image%201.png" alt="image 1.png" /></p>
<p>因为多个fiber对应一个内核线程，所以整体上来说在达到相同功能的情况下，fiber的内存使用率会更加低；但是可以看到大部分是使用在<code>User Stack</code>上;</p>
<p>使用<code>stackful</code>的协程实现方式的话，可能会面临一些内存相关的技术的问题，因为<code>stackful</code>需要有地方来保存stack的信息，大部分实现是通过<code>heap</code>来存放fiber的stack信息的，那么就需要面对的：</p>
<ol>
<li><p>stack size多大的呢？这个很重要，因为如果出现内存访问越界的问题会带来安全性问题，所谓的非定义性行为，所以这块是很重要的; 目前基本方式是:</p>
<ol>
<li><p>动态stack大小+一个保护page；大概是一次申请比较大的虚拟空间，在合理范围内可以动态扩展，会设置一个保护区，到了保护区的page就会有两种行为：1. 挂了 2. 分配更加到的内存来存放当天的stack； 这种方式其实和os thread类似，比如内核stack的大小是8K，超过了就会出现错误等，让程序以一定的错误明确行为；第二方面是虽然申请了虚拟空间，但是真正使用的物理空间可能没那么多，所以本质上是虚占用；</p>
</li>
<li><p>如果超过了stack size初始化的大小之后，目前有哪几种方式可以进行扩容呢？</p>
<ol>
<li><p>golang在最初的几年使用的非连续的stack空间，类似于一个一个chunk的list的方式；这种好处是不需要内存连续，但是问题是性能比较差，在go1.3之后就弃用了;</p>
<p> <img src="https://cdn.nomoshen.com/typora_img/1233333.png" alt="image 2.png" /></p>
</li>
<li><p>golang后期选择使用的方式：reallocate + copy stack的方式的；类似于C++的vector的动态的实现原理，好处是连续，性能上是分配的时候会有影响，但是分配完毕之后性能就比较好的；但是这种方式只能被用于有gc的语言，C++这种是不行的，因为你的pointer指向的是虚拟地址控制，你重新分配之后的pointer是无效的，C++是不会知道你有哪些pointer指向这个位置，所以后来Rust就放弃了用这种方式来实现fiber，转战用<code>stackless</code></p>
</li>
</ol>
</li>
</ol>
</li>
<li><p>关于<code>stackless</code>的stack size是否会遇到问题呢？其实也遇到，但是问题是它不需要单独的维护这个stack的内存空间，因为stackless的stack是依托于运行它的线程stack，所以总的来说就是os thread的限制是多少就是多少; 本身存储空间应该是要小于<code>stackful</code>的</p>
</li>
</ol>
<h3 id="heading-22">2.2 上下文切换的消耗</h3>
<p><img src="https://cdn.nomoshen.com/typora_img/image%203.png" alt="image 3.png" /></p>
<ol>
<li><p>fiber的切换肯定是小于os 线程的切换;毕竟只是user-mode的切换，都不设置到内核层面的切换</p>
</li>
<li><p>filber的切换虽然代价比较小，但是依然要高于普通的函数调用或者用<code>stackless</code>实现的coroutine</p>
</li>
</ol>
<h3 id="heading-23">2.3 兼容性和扩展性</h3>
<p>不得不说，<code>stackful</code>的fiber在这两个方面都着很多的问题；</p>
<p>fiber在n-m模型的时候会比较危险，这边描述的thread_local的问题，当fiber进行切换时候，切换到了其他的线程的时候，访问TLS的地址的时候会出现一些不确定行为，因为tls的地址被缓存了，当又开始访问的时候会导致访问到是之前thread的tls的地址，这样就会出现问题；</p>
<p>所以正常的fiber只能支持<code>1-M</code>的模型; 这样就限制了fiber的整体使用场景；关于stackful的第二个问题是: <code>green</code>，也就是将所有的会导致阻塞的操作都全部重写变成非阻塞的，这其实就需要有一个user-mode调度器的运行时，一方面用于调度另外一方面将block操作从底层替换掉；即使这样，如果用户一不小心调用block的操作依然会导致整个fiber被block住；</p>
<p>尤其是一个程序依赖多种语言的库或者什么的，这个时候并非所有的控制都有runtime去掌握，这个时候就极端容易出现问题，比如依赖的C++底层库使用了tls的功能，那么就可能导致上层的goroutine获得已经被使用的错误的地址什么的，这样也是问题一堆，看到一个帖子说，可以通过[<a target="_blank" href="https://groups.google.com/g/golang-nuts/c/tGamryo50BY">thread local storage of C library from go application</a>]中所说的LockOSThread来保证goroutine不会去其他的线程上被调度;</p>
<p>stackless就好很多，不会有上面的问题，但是如果调用blocking操作也依然会导致阻塞，这个没办法避免的；rust的解决方法是依靠tokio这种库的封装，将常规的interface异步化，如果实在不能异步就创建线程来进行包装；</p>
<h2 id="heading-3-case-studies">3. case studies</h2>
<p>伴随着研究人员半个世纪的努力和尝试的经验，内核开发者目前的推荐是:<strong>不要使用fiber</strong>; 不过说来搞笑，目前golang如此流行貌似也打了这些内核人员的脸，不过golang并没有解决上面的问题，尤其是兼容性这块的问题的，但是之所以流行本质上还是fiber的这种写法会更加符合人类的思考模型，并且可以极大的降低程序员的门槛 ，随便写写能写出比较好性能要求的程序；但是很多时候一定要注意只要你不要超过它的runtime的范围，大部分时候golang依然还是很不错的选择，runtime帮你做了很多事情，如果你非要go + c++这种蛋疼的模型来做事情的话，极大概率会碰到上面的问题；</p>
<p>windows、solaris、linux、posix和facebook都有比较多的fiber的经验，最终都选择放弃使用fiber，要不继续简单的模型要不转战stackless; </p>
<p><img src="https://cdn.nomoshen.com/typora_img/image%204.png" alt="image 4.png" /></p>
<p>从这个表可以看出来，也就golang在fiber取得了成功，但是当于其他的语言进行交互的时候，其实本质上代价也很高，我还是那个看法，既然用go，那就在go的runtime里面玩，不要玩花里胡哨的东西，代价很大的；</p>
<h2 id="heading-4">4. 总结</h2>
<p>不推荐使用Fiber; 下面是一个两种实现的优缺点对比:</p>
<p><img src="https://cdn.nomoshen.com/typora_img/image%205.png" alt="image 5.png" /></p>
<p>看下对比就大概知道应该用<code>stackless</code>这种方式，目前rust用了这种方式实现的，这个从各方面来说都应该是比较好的选择；</p>
]]></content:encoded></item><item><title><![CDATA[最近一个月面试情况]]></title><description><![CDATA[1. 结果
面试了三家公司，两家大厂一家小厂;最终只拿下一个大厂offer，另外两个都挂了; 怎么说的呢，算是出师不利吧，因为挂的两家公司，随便一家能拿到我都会去了；至于拿到的这个offer我基本也不准接了，所以整体下来貌似算是颗粒无所吧;
2. 初衷和决策标准
目前的工作其实整体上来说已经很不错的，但是我有这不得不换的理由，因为我家人们已经出国了，以后我也准备去面对全球找工作的；当然现在想换工作的唯一目标就是陪伴家人吧；
当然在后面的面试过程中，慢慢也有偏离这个方向，但是那可能是trade-o...]]></description><link>https://nomoshen.com/5pya6lr5lia5liq5pyi6z2i6kv5oof5ya1</link><guid isPermaLink="true">https://nomoshen.com/5pya6lr5lia5liq5pyi6z2i6kv5oof5ya1</guid><category><![CDATA[interview]]></category><category><![CDATA[杂事]]></category><dc:creator><![CDATA[nomoshen]]></dc:creator><pubDate>Sat, 22 Jul 2023 00:04:41 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-1">1. 结果</h2>
<p>面试了三家公司，两家大厂一家小厂;最终只拿下一个大厂offer，另外两个都挂了; 怎么说的呢，算是出师不利吧，因为挂的两家公司，随便一家能拿到我都会去了；至于拿到的这个offer我基本也不准接了，所以整体下来貌似算是颗粒无所吧;</p>
<h3 id="heading-2">2. 初衷和决策标准</h3>
<p>目前的工作其实整体上来说已经很不错的，但是我有这不得不换的理由，因为我家人们已经出国了，以后我也准备去面对全球找工作的；当然现在想换工作的唯一目标就是陪伴家人吧；
当然在后面的面试过程中，慢慢也有偏离这个方向，但是那可能是trade-off的结果的；一份能接受工作的标准是什么呢？我当时的考量是几个：</p>
<ul>
<li>工作内容起码要有兴趣，不能太无聊</li>
<li>薪水可以支持家庭的目前的生活水平，不会出现降级的情况</li>
<li>离家人们近</li>
</ul>
<p>当然可以看到的是第二条是很重要的，没有足够的经济的收入其实本质上支撑不起孩子的教育生活之类的；所以如果将第二条选择为一定要选的，那就只能从其他两条中选；</p>
<h3 id="heading-3">3. 面试</h3>
<p>我用大厂1表示拿到offer的，大厂2和小厂3是挂的海外公司；</p>
<p>7月份开始集中的面试，第一家公司大厂1，因为我前leader在里面的，他来勾搭我，说要不要去那边的，其实我对大厂1并不是很喜欢，因为非常的辛苦和不人性化的，就把人当作工具的，每天工作时间长度很长并且还要996，所以我是拒绝的。但是老板说你就过来面试一下就好的，如果价格合适你到时候再考虑的；我想想就帮个忙就好的，就试了；</p>
<p>面试很快也很迅速，大概就3天3面直接搞定；面试官很喜欢，我猜测应该整体的评价应该也很不错的，因为是match我的工作经验的，而且很多东西我都能知道点在哪里，要如何做，优缺点是什么之类的，所以整体是比较合适的；但是最终在hr出现了问题，价格和我前老板和我描述的差很多很多的，我当时就觉得这有什么好聊的，直接就说算了，不聊了的；</p>
<p>后来我和我前老板抱怨，现在开的待遇是你和我说的<code>1/3</code>,真的不很靠谱啊..过了面试之后，我问我前老板我能要多少价格，他给了我这个数，说先按照这个数聊，说不定还更加多；我当时听下来就觉得心动，因为真的很多的.. 我回来和我老婆聊，说如果真的有那么多的话，我就去做两年的，赚个两年就退休了..这边我心动的理由是(1,2)</p>
<p>当然最终其实都是妄想，大厂1最终的总包比现在也多了太多，我说如果愿意remote的话，我可以不加薪(2,3),哈哈哈但是这个公司是不可能的；</p>
<p>大厂2的话是一家海外公司，挂的原因有两个：</p>
<ol>
<li>match度不够，因为他们做业务架构优化的，所以整体面试的感觉就是有点他想问的我不是很精通，我会的他不是很会；</li>
<li>我自身没有做好准备；海外公司的面试会相对有套路一些，但是我对这块可能突然的转化没做好准备，所以这也是问题</li>
<li>English，虽然猎头说没要求英语，但是我看出来了面试官还是希望能找一个会英语的的；</li>
</ol>
<p>小厂3的话也是一家海外公司，挂的原因应该有两个：</p>
<ol>
<li>我要的太高了，其实不算高，只不过对他们来说有点高</li>
<li>不能完全match..他们可能觉得不值得；</li>
</ol>
<h3 id="heading-4">4. 以后</h3>
<p>当然还是会继续面试下去的，毕竟我还想和家人们一起生活的；现在有几个打算:</p>
<ul>
<li>调整心态，过去的7月，因为面试的患得患失搞的整个人都不好的；因为一些东西你需要去trade-off，事情的发展并不是一定往你最想要的地方发展的；</li>
<li>专业能力的继续准备吧，最近不用面试我就可以花点时间去看一些感兴趣的开源项目和paper什么的；一些该准备的东西也会准备，尤其是后面要继续面试海外公司; 主要会有两个:<ol>
<li>coding,我是真的不喜欢刷题，因为那么短的时间内并且有压力的情况下做题目真的是会发挥失常；</li>
<li>system design：这个其实还蛮重要的，因为我做的系统其实很多问题我都遇到过，我觉得自己的深度和广度是够的，但是在面试的时候如何很好的去描述这是目前的点，所以后面一段时间可能会对这个稍微准备一下；
其他的可能就之前的经历想好好思考一下，总结的顺畅一些;</li>
</ol>
</li>
<li>在我看来短时间换工作应该是不行了，那我就准备10-1的时候去国外看孩子和老婆，这次待的时间会长一些，想多陪一会孩子,到时候我和老板申请一下.</li>
<li>还有就是快点能把房子卖掉，这样风险就小一些,现金就多一些..</li>
<li>English的学习，这个给我未来会造成不少的影响</li>
</ul>
<p>最后，希望能快点找到一份顺心如意的工作,早点回到家人身边,过上自己想要的生活</p>
]]></content:encoded></item></channel></rss>