我的2025

Kodaline 是我喜欢了很多年的一个乐队,2023年的7月,我还有幸在新加坡现场听了他们的演出。可惜的是今年,他们宣布了一个令人遗憾的消息:乐队将于2025年10月解散,结束他们长达13年的音乐旅程。这个消息让我感到既惋惜又感慨,仿佛一个时代的终结。在2025的最后一天,我想用Kodaline的一首歌《Saving Grace》来作为我2025年的总结。 工作 入职新公司已经一年半了,回顾这一年多的时间,工作内容逐渐从最初的适应和学习,转变为更多的独立负责项目和推动技术落地。作为团队中唯一的中国同事,我也逐渐融入了多元文化的工作环境,学会了如何在跨文化团队中有效沟通与协作。 二月初,之前公司招来的两个实习生顺利完成了实习期,回到学校继续学业。作为mentor,能够见证他们的成长,也是我职业生涯中的一大收获。 四月,第一次参加了公司组织的迷你马拉松活动。虽然只是短短5公里的距离,但是跑完之后的自助大餐才是最令人期待的,跟同事们一起吃吃喝喝也是挺开心的。 六月,报名并参加了公司内部的Innovation Week活动,像其他同事展示了我们组正在进行的项目,并分享了一些技术心得。 其实整个上半年,工作节奏都比较紧凑,业余时间还准备了两门AWS的认证考试: AWS Certified Machine Learning Specialty 和 AWS Certified Developer Associate。 下半年经历了一次系统迁移,从旧的基础设施到新的公司内部计算平台,和英国的团队开会沟通了多次,终于在年底前顺利完成了迁移工作。过程虽然充满挑战,但也让我学到了和跨团队协作的经验。 除此之外,今年还和组内同事一起提交了两篇patent申请,这不仅提升了团队的技术积累,也为公司的知识产权贡献了一份力量。 阅读 今年的阅读量有所减少,因为上半年都在备考AWS认证,下半年才有多一些空余时间,但依然坚持读完了18本书。阅读内容涵盖了技术书籍、文学作品,个人传记和投资理财等多个领域。 比较喜欢的书目包括: 《追风筝的人》 《复利人生》 《芯片浪潮》 《算法图解》 《微积分的力量》 《Unix传奇:历史与回忆》 《第一性原理》 《从0到1:开启商业与未来的秘密》 《黄仁勋:英伟达之芯》 《赤裸裸的统计学》 演唱会 今年三月,有幸现场观看了邓紫棋的个人演唱会,这是我第一次听她现场唱歌,声音非常有穿透力,现场氛围也很棒。当然,我也是为了那首最喜欢的歌曲:《天空没有极限》特地去的。 旅行 今年的旅行计划主要集中在下半年,为了更好地利用那无处安放的24天年假,我安排了几次不同的旅行。 八月,回了一趟成都和老家探亲,顺便和朋友们聚会,吃了很多家乡的美食。 十月,和朋友一起去了熊野古道徒步旅行,感受了千年古道的历史与自然风光。还顺道去了沿途的几个地方,比如新宫市、那智瀑布和纪伊胜浦,然后又顺道而上去了大阪,奈良,体验了日本的传统文化和自然美景。 熊野古道是日本一条历史悠久的朝圣之路,连接着熊野三山(熊野本宫大社、熊野速玉大社和熊野那智大社)。整个古道徒步花了大概三天的时间,其中会经历很多不同的地形,有山路、石阶、森林小径以及苔原地带等,沿途还能看到一些古老的寺庙和神社,感受到浓厚的历史氛围。这条千年古道不仅是朝圣之路,更是一段与自然和历史对话的旅程。 纪伊胜浦的海上鸟居和海景也是一大亮点,站在海边看着远处的鸟居,感受到一种宁静与庄严的氛围。金枪鱼市场则是美食爱好者的天堂,早上围观完市场的金枪鱼拍卖过后,食客们就可以直接涌向旁边的餐厅品尝新鲜的金枪鱼大餐,比如现烤的金枪鱼头,肥美的刺身和寿司,绝对让人回味无穷。 奈良的鹿群和若草山也是不可错过的景点。与这些温顺的鹿近距离接触,感受到人与自然和谐共处的美好。而若草山的日落景色更是令人难忘,夕阳洒在山坡上,映照出一片金黄,美不胜收。 十二月初,去了东北的长白山滑雪,体验了冰雪世界的魅力,找教练学了两个学时的课程,双板算是入门了。回来的时候还顺道去了哈尔滨,感受了冰城的独特风情。 十二月下旬,发觉年假还剩几天,去了旅行清单上的另外一个目的地:马六甲。马六甲的历史街区充满了殖民时期的建筑和文化遗迹,漫步在古老的街道上,仿佛穿越回了几个世纪前。荷兰红屋、圣保罗教堂和鸡场街等地标性建筑,都让我对这座城市的历史有了更深的了解。 投资理财 今年在投资理财方面,比起去年更加注重风险管理。在美股市场上,我继续持有一些优质的科技股,重点关注公司的基本面和长期增长潜力,而不是短期的市场波动。今年的市场波动较大,尤其年初,整个持仓收益还是负的。不过随着时间的推移,到年底时,整体收益回升到了正数。 今年操作最多的还是期权交易,主要是通过卖出Put和Covered Call来获取额外的收益。通过这种方式,不仅增加了现金流,还能在市场下跌时降低持仓成本。另外,增持了一部分特斯拉的股票,还用一小部分资金尝试买入了PLTR,RKLB和英伟达的看涨期权,算是赌一把未来的科技发展趋势。 得益于读到了《复利人生》这本书,我更加理解了复利的力量和长期投资的重要性。从明年开始,我计划调整资产配置,考虑将部分资金投入到指数基金并进行长期定投,以实现更稳健的长期增长。 被动收入 今年在被动收入方面也有一些新的尝试。继续运营已有项目,并通过Google广告和联盟营销获得了一些额外的收入。另外,给一个长期维护的个人项目加入了支付购买高级功能的选项,吸引到了一些用户付费使用。随着Vibe Coding的兴起,年底在Codex的帮助下又上线了两个新的小项目,已经吸引了一些流量,正在打算把流量转化为收入来源,继续扩充我的 Kopi Fund 购物 趁着年底的双十一和黑色星期五,买了一些愿望清单上的东西: Herman Miller的Aeron椅子,公司同款,坐起来确实舒服 入手了一台Breville的咖啡机,这台海盐白是我第一眼就看上的颜色,终于在打折季下手了,现在每天早上都能喝到一杯现磨咖啡,感觉一天的精神都来了。还顺便能练习一下拉花技术。 另外还买了文石的彩色电子书阅读器,这样可以把日常通勤的时间和睡觉前的时间都用来阅读电子书了。 展望2026 展望2026年,希望在工作中继续提升自己的技术能力和项目管理经验,争取承担更多的责任和挑战。同时,我也计划继续保持阅读的习惯,拓宽自己的知识面,尤其是在技术和投资理财方面。 投资方面,计划调整资产配置,增加指数基金的比例,并继续利用期权策略来提升收益。希望通过持续学习和实践,能够在投资理财上取得更好的成绩。 被动收入方面,计划继续优化现有项目,并尝试开发新的项目,探索更多的收入来源。 关于旅行,希望能探索更多不同的文化和风景,在西班牙也有一条和日本熊野古道类似的朝圣之路——圣地亚哥朝圣之路(Camino de Santiago),如果一切条件具备,计划在明年尝试走一走,体验一下这条历史悠久的徒步路线,同时完成双朝圣认证。

2026/1/1
articleCard.readMore

AWS Certified Developer Associate 认证备考指北

距离我上次分享 AWS 机器学习专业认证 (MLS-C01) 的经验,转眼已过去了三个月有余。这次我决定选取另一个目标——AWS Certified Developer Associate (DVA-C02)认证。 你可能会好奇,机器学习和开发,听起来是两个不同的领域。其实不然!在 AWS 上,无论是部署机器学习模型,还是构建任何应用程序,都离不开扎实的开发和部署功底。我希望通过 DVA-C02这个认证,进一步夯实我在 AWS 上的实践能力。 DVA-C02:和 MLS-C01 有什么不同? 这次 DVA-C02 考试给我带来的最大感受,就是它与 MLS-C01 的定位差异。 如果说 MLS-C01 是一次深入特定领域的“专精”,它要求你对机器学习的各个环节(从数据准备、模型训练、调优到部署和监控)有深入而细致的理解,涉及大量服务细节和高级概念。 那么 DVA-C02 则更像是一次“广度”的拓展。它侧重于开发者在 AWS 上构建、部署和调试应用程序时会用到的核心服务和最佳实践。考试范围涵盖了 Lambda、API Gateway、DynamoDB、容器服务(ECS/EKS/Fargate)、消息队列(SQS/SNS)、CI/CD 工具链(CodeCommit、CodeBuild、CodeDeploy、CodePipeline)以及重要的安全和监控服务。 简单来说: MLS-C01 考的是你“懂不懂机器学习怎么在 AWS 上落地”,题目难度更高,更强调理论与实践结合的深度。 DVA-C02 考的则是你“能不能在 AWS 上高效地开发和部署应用”,它要求你对常用服务的实际应用场景、集成方式和开发流程有全面的掌握。 它们是互补的,而不是替代的关系。对我而言,通过 DVA-C02 认证,进一步强化了我在 AWS 云上作为开发者所需的实战技能,让我的云知识体系更加完善。 备考之路 我的备考时间线大致如下: 6月初:开始关注 DVA-C02 认证,了解考试大纲和主要服务。 6月中旬:在 Udemy 上找到一门高评分的 DVA-C02 课程,开始系统学习。 6月底:完成课程学习,开始做题练习。 7月上旬和中旬:预约考试时间,集中复习和模拟考试。 7月下旬:参加考试并顺利通过。 在线课程学习 我选择了 Udemy 上 Stephane Maarek的 DVA-C02 课程,这门课程内容全面,涵盖了考试大纲中的所有核心服务和概念。课程通过实际案例和实验室演示,帮助我理解每个服务的实际应用场景和最佳实践。 刷题经验 在完成课程后,我开始集中刷题。主要来源包括: Udemy 课程附带的样题 网上找到的额外练习题 这些练习题可以帮助识别知识盲点,并熟悉考试格式和问题风格。每次做错的题目,注意仔细分析错误原因,并查找相关资料进行补充学习。另外可以利用 AI 工具来帮助理解一些陌生的概念,有不懂的知识点就多问 AI,让它帮你解释和举例,省去了很多时间。 预约与参加考试 考试我选择了线下的 Pearson VUE 考试中心,预约过程非常顺利。考试就预约在7月下旬的一个周末。考完提交后,大概只等到了晚上就收到了通过的邮件通知。 级别: Associate 时长: 130 分钟(2小时10分钟) 费用: 150 美元 (公司出钱) 题目数量: 65 道题目 通过分数: 720 分(满分 1000 分) 最后的最后,希望这些碎碎念能带给你些许启发。如果你也在备考 DVA-C02,或者只是想提升自己的 AWS 开发能力,真心建议:多动手,多复盘,多思考服务如何在真实场景中协作落地。See you in the cloud!

2025/7/27
articleCard.readMore

我的 AWS Certified Machine Learning – Specialty 认证之旅

最近通过了 AWS Certified Machine Learning – Specialty 认证,再此分享一下我的备考经验和考试心得,希望能帮助到正在准备这项认证的朋友们。 时间线和准备方法 我的认证之旅从三月初开始,当时在 Udemy 上寻找相关课程。还好有公司的商业版Udemy订阅,可以免费学所有课程。利用周间下班的时间和周末的一些时间,到三月中下旬,我已经完成了课程学习并开始做习题练习。 然后我随即预约了三月底的考试,这给了我一个集中的准备窗口。 在线课程学习 Udemy 的课程为理解 AWS 机器学习生态系统提供了坚实的基础。课程涵盖了重要的服务,如 SageMaker、Comprehend、Rekognition 和 AWS与机器学习相关的各种服务,以及基本的机器学习概念和最佳实践。实践实验室对于获得这些服务的实际操作经验特别有帮助。 刷题经验 看过Sample Question后,你才会发现,只看视频课程是远远不够的。完成课程后,我专注于从两个主要来源练习题目: Udemy 课程附带的样题 网上找到的额外练习题 这些练习题对于识别知识盲点和需要额外学习的领域非常有价值。它们也帮助我熟悉了考试格式和问题风格。另外,对于做错的题目,我会仔细分析错误原因,并在网上查找相关资料进行补充学习。另外,AI工具也可以帮助你理解一些陌生的概念,有不懂的知识点就多问AI,让它帮你解释和举例,省去了很多时间。 预约与参加考试 考试我倾向于选择线下的,预约了一家离我家较近的 Pearson VUE 考试中心。考试中心的工作人员非常友好,整个过程都很顺利。 级别: Specialty 时长: 180 分钟(3 小时) 费用: 300 美元 (还好是公司出钱) 考试的题目是多选题和单选题的组合,涵盖了 AWS 机器学习的各个方面,包括模型训练、数据处理、部署和监控等。考试的题目有时会很复杂,涉及到多个 AWS 服务的组合使用。题目通常会给出一个场景描述,然后要求你选择最合适的解决方案或服务。 值得注意的是,考试题目是全英文的,所以需要一定的英语阅读能力。考试时,考生需要在 3 小时内完成 65 道题目,这意味着每道题目的平均时间大约是 2 分钟。虽然时间看似充足,但有些题目需要仔细阅读和分析,所以时间管理非常重要。 考试总分为 1000 分,750 分及以上为通过。 在考试注册网站上有一个小福利,如果你的母语不是英语,可以申请额外的 30 分钟时间。 考试心得 考试本身有几个挑战: 许多题目都有冗长的场景描述,需要仔细阅读以识别关键信息 一些多选题很有技巧性,需要密切关注细节 时间管理至关重要:3小时起初看似充足,但复杂题目需要大量阅读时间 考试总时长3小时,对于体力和注意力都是一个挑战 有效的应对策略: 对于冗长的题目,先集中精力识别关键需求和约束条件,然后再查看答案选项 对于具有挑战性的问题,使用了”标记”功能,稍后再回来处理 对于多选题,先仔细排除明显不正确的答案 预留至少20-30分钟的时间进行最终复查已标记的问题 查询成绩 完成考试后,并不会直接展示成绩,官方承诺会在48小时内通知成绩。其实就在考试过后的第二天,就收到了邮件通知,成绩已经更新到AWS Certification Account上了。登录后查看成绩,750分以上就算通过了。 随后,收到了 AWS 认证的电子证书和徽章,可以在 LinkedIn 和其他社交平台上展示。 最后,得感谢公司免费的学习资源和认证机会,也感谢 Udemy 的课程帮助我顺利通过考试。希望我的经验能对正在备考的朋友们有所帮助!祝大家都能顺利通过认证,取得好成绩!

2025/4/19
articleCard.readMore

2024年的年终总结:转变与沉淀

看着屏幕上的倒计时,我以相当赛博的方式在Youtube上看了世界各地直播的跨年烟花秀,转眼间,2024就这样结束了。若要用一个词来概括这一年,大概是”转变”吧 —— 工作的转变、生活节奏的转变,以及思维方式的转变。而在这些转变之中,我也在寻找着一种新的平衡与沉淀。 工作 六月的新加坡,依旧是那般湿热。6.21日是我在Shopee的最后一天,收拾着办公桌上零散的物件时,我不禁回想起五年前初来乍到的场景。从当初努力适应英文工作环境的新人,到如今习惯了一切的”老sailor”,时间的痕迹悄然留在工作邮箱里几千封往来的邮件中,以及Seatalk的各个群组中。记得刚来时,每次开会都要全神贯注地听着同事用英文讨论,生怕错过重要信息。而今天,会议室里的交谈早已不知不觉切换成了中文,曾经朝夕相处的其他同事也都已经离开。这种变化让我感慨:或许,是时候寻找新的挑战了。五年的时光,不长不短,却足以让一个人对环境产生眷恋,也足以让人萌生出探索未知的渴望。 其实早在2024年初,我就开始了新的求职之旅,也开始在LeetCode上刷题。整个求职季,我面试了3到4家公司,每一次面试都是一次宝贵的经历,让我看到了不同公司的文化与技术栈。终于在四月底,我收到了一个令人满意的offer,那一刻的喜悦让之前的所有付出都变得值得。于是,也顺带向Shopee递交了离职申请,开始了为期两个月的 notice period。 就这样,在最终结束了五年的旅程后,我开启了职业生涯的新篇章。新公司带给我的第一印象,是那种久违的多元文化氛围。会议室里又重新响起了各种口音的英文,团队里来自不同国家的同事让我仿佛回到了最初来新加坡时的感觉,而我,也成为了团队里唯一的中国同事。让我感到欣喜的是,老板在我入职不久就把一个重要项目交到了我手上。这种信任带来的不仅是压力,更多的是一种被重视的感觉。在新的环境里,我重新找到了那种初入职场时的干劲和期待。 阅读 工作环境的转变,也带来了生活节奏的改变。告别了在Shopee在职读硕士时紧绷的步调,我终于有了更多业余的时间。今年在微信读书上完成了13本书的阅读,从技术书籍到文学作品以及个人传记,每一本都让我获得了不同的收获。现在想来,这可能是毕业后最重要的改变之一: 在工作之余找回了持续学习的节奏。那些宁静的阅读时光,成为了我生活中不可或缺的一部分。 技术书籍方面,读完了《搞定系统设计:面试敲开大厂的门》,这本书对于系统设计的基础知识和面试技巧有很好的总结。另外,还读了《黑客与画家》,让我对技术的发展有了更深的理解。 在文学作品方面,读了余华的两本作品:《活着》、《第七天》,还读了《杀死一只知更鸟》,每一本都让我感受到了作者的情感与思考。 个人传记方面,读了《李光耀观天下》,还重读了《乔布斯传》和《硅谷钢铁侠》。这些传记让我看到了不同领域的成功者的人生轨迹,也让我对自己的职业生涯有了更多的思考。 另外,还读了乔治·奥威尔的《1984》和《动物庄园》,这两本书对于当代社会的政治与社会问题有着深刻的思考,也让我对人性有了更多的认识。 其他的书籍还包括《全情投入》,《我的二本学生》,等。 开源项目 如果说工作与阅读是一种向内的沉淀,那么继续投入开源项目则是我探索世界的一种方式。今年还有一个重要的改变是告别了前公司配发的2019款MacBook Pro,利用新公司的补贴,直接入手了MacBook Pro M3。还记得第一次运行编译项目时,那种几乎察觉不到风扇声的安静,和以往等待编译时的轰鸣形成了鲜明的对比,ARM芯片果然名不虚传!新的设备不仅带来了效率的提升,更激发了我在技术探索上的热情。 今年除了继续维护 GoDNS 这个老朋友,我还用Rust开启了两个新项目。选择Rust不仅是因为它的技术特性,更是因为学习一门新语言的过程,总能带来思维方式的革新。当 knock-rs 和 tcping 这两个项目逐渐成型时,那种创造的喜悦感让我想起了最初写代码时的兴奋。在开源社区里,每一个Star、每一个Issue,都让我感受到代码背后的连接与互动。 旅行 六月初,我一次性清空了在Shopee剩余的所有十几天年假,回成都看望了家人。新公司入职后又喜提了12.5天年假,于是,年末的旅程带我再次重返东京,也让我初访槟城。 在东京的街头,我不再像去年那样匆忙地打卡景点,而是更多地去感受这座城市的氛围。在秋叶原的电器店里流连,在涩谷的十字路口观察来来往往的人群,在居酒屋吃当地的烧鸟和烤肉,这些细节让我对这座城市有了更深的理解。除此之外,还抽空二刷了镰仓,去看了冬天的富士山,最后还去参观了三鹰之森吉卜力美术馆。 东京都厅展望台的夜景 上野公园的红叶 明治神宫 从涩谷SKY上俯瞰城市景观 一澜拉面 镰仓江之岛上的寺庙 镰仓的海边 镰仓–长谷寺 富士山下, 天气不错,山顶的雪清晰可见。让我想起了陈奕迅的那首歌:谁能凭爱意要富士山私有… 三鹰之森吉卜力美术馆 而槟城之行,则是一场穿越历史与美食的探索,殖民时期的建筑与街边的小贩,编织出一座城市独特的底蕴。每一次的旅行,都像是给自己按下了暂停键,让匆忙的生活得以片刻的沉淀。 槟城的海边 娘惹博物馆 被动收入 如果你读过我之前的一篇blog《聊聊被动收入与躺赚》,就知道我一直在做一些可以产生被动收入的个人项目。2024年,在被动收入这条路上,我也尝试着一些新的可能。给一个长期维护的个人项目加入Google广告是一个小小的尝试,却带来了意想不到的收获。这让我明白,有时候改变不必太大,重要的是持续地尝试和积累。我打算把这部分收入称为我的”Kopi Fund” (咖啡基金,Kopi是咖啡在南洋的叫法),用来支持我在喝咖啡和阅读上的一些小小花销。 总结 展望2025年,我希望能在这些改变中找到更多的可能性。继续在技术探索中保持热情,在阅读中沉淀思考,在旅行中开阔视野。期待在工作中有更大的突破,在开源社区贡献更多价值,也能在投资理财上有新的收获。重新深入学习美股期权将是明年的一个新挑战,也许就像今年的Rust学习一样,会带来一些意想不到的收获。 毕竟,生活就是在不断的转变中寻找平衡,在变与不变之间沉淀出自己的节奏。这大概就是2024年给我最大的领悟。在来新加坡的第六个年头,我依然在寻找着属于自己的生活方式,期待着每一种新的可能。

2025/1/1
articleCard.readMore

迟来的2023年终总结

这是一篇迟来的2023年终总结。2023年底的时候出去旅游了,2024年初又回国了一次,所以这篇年终总结终究还是迟到了半个月。 工作 如果用一句话总结去年的工作,那就是:平淡无奇,甚至还变卷了一些。看着曾经并肩作战的同事,一个个都离开了,曾经开会的时候,默认的语言还是英语,如今开会都是默认直接中文了。年初由于组织架构的再次调整,我又被合并到了另外一个组,开始用C++开发线上的实时推荐系统。于是,我的技术栈也因此扩展成了React, Go, C++。在业余时间,我还顺便学习了一下现代C++,毕竟上次用传统的C++已经是N年前了。至于工作本身嘛,我只能说,走一步看一步,我还是先刷着LeetCode热热身吧。 学习 2023年这一整年,最值得令人高兴的事情是:我终于又毕业了! 从疫情开始的线上课程,到后疫情时代的线下课程,总共历时两年的时间,我又毕业了。回顾起当初去学院提交资料,领取学生卡的场景还仿佛就停留在昨天。这两年的时间里,做得比较有规律的事情,就是遇到有课程的时候,早上起来一大早去公司上班,下班后又马不停蹄地飞奔去学校接着上课。晚上回家还得卷一下当天课程的quiz,周末也得继续和小组的同学一起讨论项目,写report。除了假期的周末,平时是几乎没有周末的。这种忙碌而又充实的生活,让我觉得仿佛又回到了多年前的那个学生时代。 这种忙碌的生活一直重复了四个学期,最后一个学期伴随着最后两门的考试,最终到了2023年4月底。6月的一天早上,我跟往常一样在公司上班的时候,收到了学院的邮件,通知可以顺利毕业了。 7月,学校的毕业典礼,早上一场突如其来的大雨,导致路上堵车了40多分钟,本来以为是赶不上最后的毕业典礼了,没想到赶在毕业典礼开始的前几分钟顺利入场了。 有同事问我:本科毕业多年后,还有必要再去读一个master吗?对我而言,我觉得是有必要的。 当年因为家庭经济的原因,没有能出国深造的机会。本科毕业之后,我就开始在国内工作了,直到后来到了新加坡。没能出国体验留学,对我来说难免是一件比较遗憾的事情。后来从NUS毕业来公司的新同事那里了解到,原来国外的master是没有入学考试的,直接拿着本科成绩单和英语考试成绩申请就可以了。而且part-time的证书和full-time是一样的,学费也一样,就连平时上课都是一起上的。 于是,我就疯狂DIY走完了接下来的所有流程:考雅思,翻译本科成绩,准备各种资料,提交申请,直到拿到offer入学。 或许多年以后,我还能回忆起这段毕业N年后迟来的海外留学经历,回忆起考试前的忙碌,作业和项目deadline前的紧张。毕竟,我也为之努力过了,这个曾经的缺憾也终于被填补上了。 当然,在各种不同课程的project中,我还有幸认识到了一群同样在新加坡一边上班一边攻读master的队友们,甚至还有跟我在同一个公司的同事,也算是很新奇的体验了。 趁着毕业之际,把之前在NUS学习时候的各种照片和视频整理了一下,制作了一份毕业纪念视频: 演唱会 Master的课程完结之后,今年倒是看了很多场的演唱会。首先是4月Eason演唱会的新加坡场: 还有不老歌神张学友: 有我最喜欢的爱尔兰乐队: Kodaline 最后还有年底张信哲巡演的新加坡场: 现场的体验确实比平时听Spotify上的音乐更震撼,另外,舞台效果还是挺棒的。 旅行 年底的年假还剩了十来天,所以计划了一场跨越几个城市的“毕业旅行”,先后去了吉隆坡,香港,台北和东京。 吉隆坡篇 十一月的吉隆坡和新加坡差不多,仍然是盛夏。双子塔的夜景不错,Bukit Bintang的夜市人潮汹涌,颇有赛博朋克的风格。从新加坡飞吉隆坡是我遇到最短途的飞行了,飞机起飞不到20分钟,就开始降落了…… 香港篇 十二月从新加坡飞去了香港,两天的时间匆匆打卡了小红书上各个比较有名的景点。怪兽大厦是曾经变形金刚电影的取景地,密集的房屋给人很有压抑的感觉。 中途还去打卡了香港大学,正好遇到他们的毕业季 当然,必打卡的地方还有太平山上的夜景 台北篇 年底得知入台证放开申请之后,立马提交了资料,一周左右就到手了。正好从香港飞去台湾也很近,这一段行程算是无缝衔接上了。 位于台北市附近的野柳地址公园风景很不错 十分的瀑布 九份老街 东京篇 如果年底的台北还是深秋,东京就算是彻彻底底的冬天了。从台北乘坐虎航直飞东京,其实也挺近的,正好也用上了刚申请的日本五年签。 打卡了地标建筑晴空塔 徒步上野公园 “混进” 了东京大学 东京都厅展望室的夜景 明治神宫 代代木公园 镰仓,灌篮高手打卡地 涩谷SKY观景台 六本木的圣诞点灯 御茶之水站 也许看腻了热带国家的风景,这次旅行台北和东京整体体验还挺不错,值得再去。 总结 回顾了一下去年对今年的展望:顺利毕业,回国,策划一次年底的旅行,好像都实现了。 今年终于可以腾出一点心思,重新思考一下工作以及后续的发展。希望在新的一年,能重新参与到开源项目中,并阅读一些其他感兴趣的书籍。

2024/1/15
articleCard.readMore

The Heap Sort Algorithm Explained

The Heap A heap is a specialized binary tree data structure that satisfies the heap property. In a heap, each node has at most two children, and the key (the value) of each node is greater than or equal to (in a max heap) or less than or equal to (in a min heap) the keys of its children. The binary tree representation of a heap is a complete binary tree, meaning that all levels of the tree are completely filled except possibly for the last level, which is filled from left to right. Heap Sort Heap sort is a comparison-based sorting algorithm that uses a max heap to sort elements in ascending order. The algorithm works by first building a max heap from the input array. It then repeatedly extracts the maximum element from the heap and places it at the end of the array. This process is repeated until all elements have been extracted and the array is sorted in ascending order. Heap sort has a time complexity of O(nlogn) and is an in-place sorting algorithm, meaning it does not require any additional memory beyond the input array. An array can be used to represent the heap structure by using the following indexing scheme: The root of the heap is at index 0. For any node at index i, its left child is at index 2*i+1 and its right child is at index 2*i+2. Using this indexing scheme, we can represent a heap as an array and perform heap operations on it efficiently. For example, to build a max heap from an array, we can start at the last non-leaf node (which is at index n/2-1, where n is the size of the array) and perform the heapify operation on each node from this index down to the root. The heapify operation ensures that the node is the largest of the three by swapping it with the largest child if necessary. By calling heapify on each node from the last non-leaf node down to the root, we ensure that the entire array represents a max heap. An C++ Example Here is an C++ example that builds a max heap based on the input vector: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 void heapify(std::vector<int>& vec, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && vec[left] > vec[largest]) { largest = left; } if (right < n && vec[right] > vec[largest]) { largest = right; } if (largest != i) { std::swap(vec[i], vec[largest]); heapify(vec, n, largest); } } void build_max_heap(std::vector<int>& vec) { int n = vec.size(); for (int i = n / 2 - 1; i >= 0; i--) { heapify(vec, n, i); } } The build_max_heap function constructs a max heap from a given vector of integers. A max heap is a binary tree where the value of each node is greater than or equal to the values of its children. The build_max_heap function starts by finding the index of the last non-leaf node in the binary tree, which is n/2 - 1, where n is the size of the vector. It then iterates from this index down to the root of the tree, calling the heapify function on each node. The heapify function takes a node and its two children and ensures that the node is the largest of the three by swapping it with the largest child if necessary. By calling heapify on each node from the last non-leaf node down to the root, the build_max_heap function ensures that the entire binary tree is a max heap. Now we call this function and construct a max heap: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int main() { std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}; // create a maximum heap build_max_heap(vec); // print the maximum element std::cout << "Maximum element: " << vec.front() << std::endl; // print the whole vector std::cout << "The heap: "; for (auto i : vec) { std::cout << i << " "; } return 0; } The output is: 1 2 Maximum element: 9 The heap: 9 6 4 5 5 3 2 1 1 3 5 If we append a new number 12 to the end of the vector and re-construct the max heap: 1 2 3 4 5 6 7 vec.push_back(12); build_max_heap(vec); std::cout << "\nThe heap: "; for (auto i : vec) { std::cout << i << " "; } The output is: 1 The heap: 12 6 9 5 5 4 2 1 1 3 5 3 We will see that, after re-construct the max heap, the newly appended element 12 becomes to the top element of this max heap. The Heap In C++ Standard Library std::make_heap and std::priority_queue are both C++ standard library containers that are used to implement heaps. However, they have some differences in their functionality and usage: std::make_heap is a function that takes a range of elements and rearranges them into a heap. It does not provide any additional functionality beyond constructing the heap. Once the heap is constructed, you can use other algorithms like std::sort_heap or std::pop_heap to manipulate the heap. std::priority_queue is a container adapter that provides a priority queue data structure. It is implemented using a heap and provides additional functionality beyond just constructing the heap. It allows you to insert elements into the priority queue, remove the highest-priority element, and access the highest-priority element without removing it. It also provides a way to customize the comparison function used to determine the priority of elements. The Heap Related LeetCode Problems 215. Kth Largest Element in an Array 347. Top K Frequent Elements 703. Kth Largest Element in a Stream

2023/10/10
articleCard.readMore

Modern C++ 学习笔记 -- 左值与右值

左值(lvalues)与右值(rvalues)的概念 左值和右值是Modern C++中引入的新概念。简而言之: 左值位于等号左边,我们可以对左值进行取地址操作。 右值位于等号右边,本质上是一个数值,即 literal constant,我们没法对它进行取地址操作。 1 int x = 999; // x 是左值, 999是右值 我们,可以把左值大致想象为一个容器,而容器中存放的就是右值,如果没有这个容器,其中的右值将会失效。对于以下的程序,我们在编译的时候将会得到类似的错误: 1 error: lvalue required as left operand of assignment 1 2 int x; 123 = x; 很显然,等号左边需要的是一个左值,而123作为一个 literal constant 类型,是没有办法充当左值的。同样,我们也没法对一个右值进行取地址的操作: 1 2 int *x; x = &123; //无法对右值取地址 编译器报错: 1 error: lvalue required as unary '&' operand 左值到右值的隐式转换 左值在很多情况下有可能被转换为右值,比如在C++中的 - 运算符,它将两个右值作为参数,并将计算结果作为右值返回。 1 2 3 int x = 10; int y = 5; int z = x - y; 在上面的程序片段中,我们明显看到x, y本身是左值,但是却以右值的身份参与了减法运算。这是如何做到的呢?答案是编译器对左值做了隐式的转换,将x和y转换成为了右值。C++中其他的乘法,除法和加法运算也是同样如此。 如果左值能被转换成右值,那么右值本身能被转换成左值吗?答案是 否定 的. 左值引用与右值引用 C++中引入引用的概念,是为了在程序中方便的通过引用修改原变量的值,并且,在调用方法传参的过程中,传递引用可以避免拷贝。在通常情况下,左值引用只能指向左值,而右值引用只能指向右值。听起来比较废话,但是也有特殊的情况。 左值引用 1 2 3 int x = 10; int& ref_x = x; ref_x++; 在上面的示例程序中,我们定义了一个左值x,然后赋值10。随后定义了一个引用,指向x。因此,ref_x成为x的引用,它就叫做左值引用。通过操作ref_x,我们就可以改变x的值。 如果我们把上面的程序简化为: 1 int& ref_x = 10; 在编译的时候,我们会得到类似的错误: 1 cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int' 显然,左值引用只能指向一个左值,而不能指向一个右值。不错从错误信息中,我们方法可以得出另外一种写法: 1 const int& ref_x = 10; 根据编译器的规则,我们被允许通过定义一个const类型的左值来指向右值。不过既然这个左值被定义成了const,没有办法修改指向的值。 右值引用 C++中的右值引用以&&表示。通过右值引用,可以修改其指向的右值。 1 2 int&& ref_x = 10; //定义右值引用 ref_x--; //通过右值引用修改其指向的右值 如果我们尝试将右值引用指向一个左值: 1 2 int x = 10; int&& ref_x = x; 编译器也会抛出类似的错误,告诉我们不能把一个右值引用指向左值。 1 error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int' 左右值引用的本质 通过一个简单的示例程序,我们就能知道左值引用和有值引用的本质。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 void increase(int&& input) { input++; } int main() { int x = 10; int& ref_a = &x; int&& ref_b = std::move(x); increase(x); // 编译错误,不能传入左值 increase(ref_a); // 编译错误,不能传入 左值引用 increase(ref_b); // 编译错误,右值引用本身是一个左值 increase(std::move(a)); // 编译通过 increase(std::move(ref_a)); // 编译通过 increase(std::move(ref_b)); // 编译通过 increase(7); //编译通过,7是右值 return 0; } 从上面的代码示例中,我们可以看出右值引用 ref_b 本身也是一个左值,在调用 increase 的时候,需要通过 std::move 转换为右值,编译器才不会报错。 通过以上的例子,我们可以总结出如下的规律: 左右值引用的引入,都是为了避免拷贝。 左值引用通常指向左值,通过添加 const 关键字约束也能指向右值,不过无法对右值进行修改。 右值引用本质上也是一个左值,右值引用通常情况下指向右值,不过通过 std::move 等形式也可以指向左值。 右值引用与移动语义 在前面的例子中,我们已经涉及到了 std::move 这样的操作。右值引用配合 std::move 通常能实现移动语义,从而实现避免拷贝,提升程序性能。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream> #include <vector> int main() { std::vector<std::string> list; std::string str_a = "Hello"; std::string str_b = "World"; list.push_back(str_a); list.push_back(std::move(str_b)); std::cout << "str_a: " << str_a << std::endl; std::cout << "str_b: " << str_b << std::endl; std::cout << "list[0]: " << list[0] << std::endl; std::cout << "list[1]: " << list[1] << std::endl; return 0; } 如果运行上面的示例程序,我们会得到这样的程序输出: 1 2 3 4 str_a: Hello str_b: list[0]: Hello list[1]: World 很明显,在str_a被添加到vector的时候,并没有涉及到移动语义,所以str_a的值被拷贝到了vector中。而在把str_b添加到vector的过程中,由于用到了std::move,所以str_b的值被移动到了vector中。之后再输出vector的值的时候,可以看到其中已经包含了str_a和str_b的值。但是str_b本身的值已经被偷走了。 需要注意的是,std::move本身的名字比较有迷惑性,其实它在这里的工作只是把str_b从左值转换成右值,而不会做实际上移动资源的操作。如果我们把添加str_b的代码替换成: 1 list.push_back(static_cast<std::string&&>(str_b)); 会达到一样的效果。而真正的秘密在于 std::vector 提供的两种不同的重载方法: 1 2 void push_back( const T& value ); void push_back( T&& value ); 第一个重载方法接受的是左值引用,当传入 str_a 的时候,由于 const 关键字的限制,它的值会被拷贝一份,并放入到vector中,而 str_a 本身的值并不受影响。而第二个重载方法接受的是一个右值引用,push_back方法会把其值放入vector中,并转移 str_b 对字符串值 World 的所有权。这样,当我们再输出它的值的时候,发现已经为空了。 完美转发(std::forward) 完美转发(Perfect Forwarding),转发的意义在于当一个方法把其参数传递给另外一个方法的时候,不光转发参数本身,还包括其属性(左值引用保持左值引用,右值引用保持右值引用)。 std::forward 实际上也是做类型的转换,不同的是 std::move 只把左值转换为右值,std::forward 能转换为左值或右值。 std::forward<T>(arg) 中,如果类型 T 是左值,参数 arg 将被转换为左值,否则 arg 将被转换为右值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <iostream> #include <utility> void target_func(int& arg) { std::cout << "lvalue reference" << std::endl; } void target_func(int&& arg) { std::cout << "rvalue reference" << std::endl; } template <typename T> void forward(T&& arg) { target_func(std::forward<T>(arg)); } int main() { forward(5); int x = 5; forward(x); return 0; } 在以上的示例程序中,forward 使用一个Universal Reference类型接受一个参数,并且通过 std::forward 讲参数转发给 target_func。由于此方法有两个重载,分别接受左值引用和右值引用。在我们分别传入右值 5 和左值 x 的时候,我们发现 forward 这个方法都能准确无误的把参数转发给对应的重载方法。因此,程序的输出分别是: 1 2 rvalue reference lvalue reference 参考文章 Understanding the meaning of lvalues and rvalues in C++ Cpp Reference Perfect Forwarding

2023/9/7
articleCard.readMore

告别2022

随着疫情的反复,今年又是没能回去的一年,回想起年初的时候,去摩天轮观了夜景,也去金沙酒店的无边泳池游了一回,一年的时间总是飞逝而过。 工作 新加坡的“复工复产”,比起国内来得更早一些。上半年还都在家里办公,公司员工可以自由选择在家上班或者去公司,从下半年开始,就陆续都回公司上班了。再到年底,几乎全员都被要求回公司上班了。 然而,今年的经济形式并不好,再加上美联储加息,公司各种相关的负面新闻层出不穷,股价连续暴跌。经历了年中和年末的几波裁员,身边有不少同事幸运的领到了大礼包。说是大礼包一点也不过分,都是N+2起,但是我命中仿佛一直和大礼包没有太大的缘分。当年Moto关闭成都研发中心,传闻N+7的大礼包我也没领到,在领大礼包之前竟然主动离职了,眼睁睁错过一个亿。这次也一样,一波又一波的裁员也没轮到我,除了老实搬砖也干不了啥。公司的这波裁员也上了国内的新闻,脉眿上都被刷屏了,希望明年的经济能尽快好转起来。 学习 之前因为疫情,我的master课程有两个学期都是完全在线上完成的。从今年8月开始,也就是我读master课程的第三个学期,NUS也要求所有的课程和考试都转成线下形式了。好在Shopee离校园很近,下班后可以走到街对面直接乘坐NUS的校车去上课,时间刚刚好。前两个学期都是上网课,也没有太多机会去熟悉校园,这次趁着去学校上课的机会正好把校园逛了个遍: UTown的风景 UTown的大草坪 校园礼品店 校园内的李光前自然历史博物馆 参加线下课程,虽然每次得往学校里跑,不过整体体验还是不错的,那种N年前在大学上课的感觉又回来了,哥的青春也跟着回来了: 自从第三学期开始,明显感觉比之前两个学期轻松了许多,因为前两个学期都是选满了三门课程,周末的时间几乎全用来做project和肝作业了。后两个学期分别只有两门课程,workload自然也小了许多。正值年底,第三个学期也结束了,来年开学后还有最后一个学期,不出意外的话,我就可以毕业了。希望来年最后两门课能卷出个高分,顺利毕业。 开源项目 今年投入开源项目的精力并不多,开学上课过后,也没有太多精力维护开源项目。当然,其间也投入了小部分精力继续维护已有的项目,更新了几个版本。另外,也花了一点时间给GitHub配置了项目赞助功能,还意外得到了一些赞助。 除此之外,LunarVim 是我今年开始玩的Vim配置,用起来挺顺手,于是我也给这个开源项目的作者赞助了一点美刀,算是聊表心意。 今年开源项目的总赞助收入是: 9.99新币 投资 今年的股票和期权账户只能用惨不忍睹来形容。去年底开始,公司股票开启暴跌模式,年初的时候,特斯拉的期权又亏了2W多刀。快到年底的时候,特斯拉和公司股票又开始狂跌。掐指一算,哥的身价亏了几百个W的软妹币。不过虽然亏,税还得照缴,生活也还得继续。今年的投资,就这样了吧。账户也不想看了,也许再等两三年再看看会不会好一点。 程序员划水实践 说是划水实践其实一点也不错,年底的时候约上NUS的校友(其实都是程序员),实践了一下程序员应该如何正确的划水。从巴西立公园租了几个皮艇,一路划到乌敏岛,中午在一个海上的渔家餐馆吃饭,然后再划回公园。单程4公里,来回大概8公里。 旅行 年底第三学期刚结束,去电影院看了Coldplay的一场演唱会,然后开始准备旅行攻略。 之前在Youtube上有看到西澳Perth的各种旅行视频,被种了草。趁着周末的空余时间,提交了澳洲的旅行签证申请。看官网本来以为审批的过程需要3个月以上,如果真是这样的话,年底旅行得换个地方了,当时的Plan B是准备去新加坡旁边的马来西亚走一圈。没想到的是提交完材料之后一周多的时间就收到审批通过的邮件。然后,也就顺理成章的有了这次的澳洲之行。 旅行前好好的准备了一下行程,还顺便把新加坡的驾照转换成了国际驾照,按照行程安排,在网上选酒店,租车,其间也参考了不少的旅行攻略。 这旅行的大致路线是: 从新加坡直飞Perth,把我信用卡积分转换得到的几万新航里程用来换了一张免费的单程机票,相当于是白嫖了。去Perth后直接租车,游览本地的景点,然后顺着西海岸线路一路往北,去几个著名的景点打卡。 在Perth的最后一晚,回到Perth市区,第二天一早开车去机场还车,然后从Perth飞去墨尔本拜访一下十几年没见的前同事一家,顺便在墨尔本周边逛逛。 从墨尔本直飞回新加坡,其实这段行程略长,在飞机上8小时,跨越了3个时区。 行程计划: 万事已俱备,在十二月初的时候,跟公司请了一周的年假,换了一些澳币现金,开启了这次的澳洲之旅。掐指一算,这也是我在疫情快三年之后,第一次乘飞机出去的长途旅行。 新加坡是一年四季都是夏天,Perth正好在南半球,也是夏季。所以出行的衣服可以无缝衔接,都是夏装就行了。长袖长裤也需要备两件,因为跟新加坡不一样的是,澳洲白天和晚上温差更大一些,晚上的风能让你感觉一秒入秋。从新加坡飞Perth只需要大概5小时左右的时间,更神奇的是,西澳的Perth和新加坡,以及和国内都一样,都是东八区,无时差。 这次租的车是个日产的SUV,在国内的同款叫东风日产奇骏。澳洲的车跟新加坡的也一样,驾驶台在右侧,车辆靠左行驶。从西澳Perth沿着海岸线一路北上了几百公里,感觉风景绝佳,一旁是公路,另一侧就是大海。随手一拍也能出不错的照片。 Geraldton的海滩 HMAS Sydney II Memorial The Pinnacles Desert Cairn Beach Cervantes Phillip Island 实事证明,4天的时间游Perth还是不够的,粉红湖泊因为季节不对,关闭了,Perth的野生动物园也没时间去,Rottnest Island值得花上一整天的时间去,可惜也因为时间关系没包含在此次行程中。这次只是一路北上自驾,从Perth一直往南又是另外一条不错的线路,看来下次有机会还得再去深度体验一下。 这次用Dji的Action 3和手机拍了很多4K的视频,所有的素材整理出来有接近15GB。回新加坡之后,我把之前买的Final Cut Pro翻了出来,第一次学视频剪辑,剪出了一个3分多钟的vlog,供同学们欣赏: 来年期望 Master课程顺利毕业 回国一次 策划一次去其他国家的旅行

2022/12/27
articleCard.readMore

客制化键盘初体验 RAMA WORKS KARA

前言 时间穿越回2019年,自从我把我的 HHKB Type-S 改装成了蓝牙版本 [1],这个键盘就成为工作中的主力键盘,一直用到了现在。无线连接很方便,充电一次可以用两三周,这是因为电池寿命衰退的缘故,其实之前充电一次大概能用一个月。另外,最方便的是完全可定制的键位和firmware支持的8层可自定义按键,相当的强大。我一直以为,这将是我所折腾的最后一个键盘了。可惜人算不如天算,还没有玩过客制化键盘的我怎么能停止折腾的步伐呢? 偶然有一次,在公司看到了另外一个喜欢折腾键盘的同事的客制化键盘,彻底坚决了我再折腾一个客制化键盘的心。由于用HHKB多年,既然要折腾一个客制化键盘,当然还是希望选择HHKB的layout。其实支持这种HHKB布局的客制化键盘可选择的范围并不是很多,之前参考过的有Drop上的Tokyo 60系列,还有一个国人自己折腾的HTKB客制化套件。再后来无意中关注到了RAMA WORKS的KARA系列,看了一下广告[2],觉得这键盘还真不错,做工不赖,虽然是个塑料壳子,但是颜色很骚气。金属壳子的客制化键盘虽然逼格更高,但是日常通勤背着估计有点重。 KARA系列提供了多种颜色可以选择,图片中后三种颜色 ICED, AZUR, HAZE 都是我喜欢的颜色。好吧,就它了! 满怀欣喜的去官网看了一圈,原来这款KARA是去年推出的系列了,当时只是官网组织团购了一波,后面再也没补货了。难道这公司也是跟小米学的饥饿营销?幸运的是,在新加坡本地的一个键盘玩家群,刚好碰到有个出二手未拆封的HAZE。官网去年价格160美刀发售,折合新币222.9,这个卖家出价是260新币,后来跟他砍价到了250新币。比起官网发售的价格也没多太多。就这样,HAZE被我纳入囊中了。 购物清单 虽然KARA的官方套件中已经包含了组装客制化键盘的大部分零件:键盘外壳,静音隔层和放置键帽的Plate,还送一根USB Type-C的线。键帽和轴是没有默认提供的,这也是键盘客制化中可玩性很高的部分。市面上可以买到的轴有很多种,颜色也多种多样,再也不限于当年Cherry原厂的那几种MX轴了。多方面搜索了一下之后,决定在Drop上下单键帽和开轴器。在新加坡本地的一个键盘玩家网站买好了润滑剂和轴,还去Shopee买了润滑轴需要的工具。下面列了一个整体的清单: Drop是一个美国的网站,下单后快递直接从美帝邮寄到新加坡。不知道是疫情的缘故还是其他,这个包裹等了快一个月。清单上,我把USD部分的金额转换成了新币。所以,最后的总价是640.85新币,合人民币大概3000+了。我去!这是我目前折腾过最贵的键盘了! 键帽我选择了GMK LASTER系列的Synthwave M170,这种深紫色的键帽加上蓝色的印刷字母,跟键盘壳子比较搭配。之前用了太多的青轴和茶轴,这次换个不一样的,买了Gazzew的紫色线性轴。 等所有的东西准备齐,就可以开始着手组装键盘了。 组装过程 打开盒子,PCB板,各种配件和说明书都有了。 原厂出产的轴除了特别说明是润滑过的之外,默认是不带润滑的。其实这也是组装键盘里面最耗时的部分。如果不想折腾,建议直接买那种已经润滑过的轴,能省不少时间。组装的第一步就是把所有的轴用开轴器拆开,然后分别把轴里面经常摩擦的部分手动刷上润滑剂。根据润滑过后的测试,润过的轴和没润过的还是差别挺大的,主要是声音方面要更沉稳好听一些。 关于如何润滑轴,Youtube上有两个很不错的视频,手把手教你如何润滑轴和Stabilizer [3] ,看完就可以开始上手了。 按照新手入门开始润第一个轴,大概需要5分钟时间。后续熟练的话大概需要2-3分钟左右。如果按照平均润一个轴需要话3分钟左右计算,60个键的键盘就需要3个小时了。总之,这是个很耗时的过程,润轴的时间我大概听了2-3个podcast,不然实在太无聊了。 等所有的轴都润好,再直往PCB板上装上Stabilizer,组装算是正式进入正题了。拿出PCB,把之前拆开润好的轴,一个一个按在板子上固定,然后通电测试。RAMA WORKS的板子做工还真不错。 等所有的轴和键帽安装完毕,把键盘背面再固定一下,盖上盖子,就算大工告成了。 接上笔记本测试,这灯光效果还真不错,骚气袭人,亮瞎眼。 最后接上VIA Configurator,把这个键盘按照HHKB蓝牙的使用习惯,配置好各种自定义按键,就能正式开始使用了。 后记 客制化的选择实在是太多了,比起各种键盘官网发售的标准配置,能替换和定制的东西也很多,包括但不限于:各种轴,各种键帽,配重模块,外壳的材质,静音处理,等等。也许这也是客制化的吸引力所在吧。而热拔插轴的应用,也让玩客制化键盘的门槛低了一些,再也不需要电烙铁了。 或许是HHKB玩太久的缘故,这种线性轴的声音更好听一些,力道更轻盈一些。我打算把这个键盘带到公司,在工作中用一段时间再更深入体会一下。 附录 HHKB蓝牙改造指北 RAMA WORKS KARA 系列 How to Lube MX Style Switches How to Lube and Tune Stabilizers

2022/8/28
articleCard.readMore

聊聊被动收入与躺赚

起因 被动收入(Passive Income) 是不需要花费多少时间和精力,也不需要照看,就可以自动获得的收入。在很多年前,我就从网上看到这样的说法,作为一个普通打工上班族,工资收入大概就是我们最单一的收入来源了。被动收入的终极目标,就是建立一些可以自动运营和自我维护的业务,即使在后期不需要投入太多精力的情况下,这些业务照样能为我们带来源源不断的收入。被动收入能在一定程度上带给我们财务上的安全感,即使面临失业和财务上的风险,被动收入的收益足以帮你减轻或者解决掉财务上的危机。 自从开始写Blog以来,我也尝试过如何利用互联网来产生一些被动收入,比如在Blog中植入Google Adsense的广告,通过流量和点击来赚取广告费。无奈广告的点击量不高,而Google Adsense的最低付款额度是100刀,广告挂了一两年也只赚了50多刀,达不到提取的最低门槛,这赚钱的效率实在是有点低,后来干脆放弃了。一直到现在,账户里面还留着那50多刀,就当是个纪念了。 初次尝试 说到真正的被动收入实践,我是从2017年开始的。那个时候,还不流行抖音带货,视频自媒体和直播还不如现在这么火。而互联网上比较传统的带货方式还是: Affiliate Marketing,又叫做 营销联盟 。就是通过URL链接带推荐码的方式,进行营销和宣传,当有订单成交的时候,商家就会给推荐者返利。 作为一个还算 比较早期的VPS玩家,我的第一台VPS是从2010年开始折腾的。在2016,2017年的时候,当时的VPS服务商有名的也就只有那几家。其中,搬瓦工也算是挺有知名度了。之前搬瓦工提供的线路也算比较一般,其产品都是以低价获取口碑和用户。从2017年开始,他们家相继推出了CN2线路和CN2 GIA线路的VPS,从此开启了国内VPS玩家的竞相购买,销售一度火爆。 从那个时候开始,我决定做VPS主机的推广来赚取佣金。本着折腾VPS是一种爱好,另外也对这方面比较熟悉,推广起来比较有信心。搬瓦工当时也是处于扩大业务的阶段,他们家的推广佣金比例也很不错,一个订单可以提取高达22%的佣金,一直到现在都没变过。而且这22%的佣金返利还是循环的,只要购买过的用户继续续费,那下个月续费的费用里面,也有22%的佣金直接归你。更惊为天人的是,他们家的佣金可以闪电提现,基本上分分钟提取到Paypal账户上。直到现在,我也还没见过有其他VPS商家能做到这种程度的。 从2017年8月下旬开始,我的 第一篇推广搬瓦工VPS的文章 在Blog上发布了,这也是第一篇为我的个人blog带来收入的文章。由于我的blog建立较早,有从Google自带来的流量,也有通过RSS订阅和友链交换来的流量。发布的当天,我还把文章的URL发去了一些技术社区推广。翻看了一下最早的佣金记录,这篇文章从发布的当天开始,就有4个人订购了VPS,总共带来了24.8美刀的收入,这可真比Google Adsense来钱快多了。从那天开始,后续的几天也一直有了佣金收入。 第一次尝到了甜头,我决定再把推广业务好好发展一下,后续又多发了几篇VPS和线路的评测文章,每篇都加上推广链接。凭着Blog本身在Google的权重还不错,新的文章几乎每篇都很快就被Google收录,再优化一点关键词,很多关键词搜索都能直接排在首页第一条,或者前三页。这自然能带来更多的流量,更多的佣金也随之而来。 横向发展 当然,光靠Google的自然流量还是不够的。为了引入更多的流量,提高订单的成交率,我还尝试了多种方式来引流。为了把写好的评测文章发去国内各大网站和论坛进行推广,我在掘金,知乎和简书都注册了帐号,也会把推广的文章发到程序员聚集较多的论坛V2EX以及Twitter。得益于这些网站在搜索引擎的权重都比较高,在上面发表的评测文章也能在搜索结果页中出现在较为靠前的页面。这一波操作也带来了不错的收入。不过后来,由于“同行”间的恶行竞争,有几篇文章在知乎和简书都遭到了举报并被删除了。再后来,知乎的号也因为多次举报被永久封号了,我也放弃了这样的推广方式。 由于搬瓦工的VPS销售一度火爆,刚出炉的一批VPS会在短时间内被一抢而光,想要购买的玩家只能等下一批机器上线。而这些消息之前都是靠Blog,论坛和QQ群口口相传。后续也有人开发了VPS的库存监控网站,主要就是通过监控服务商页面的变化,有新机器可以订购的时候就发出邮件或者其他方式的通知。后来我也跟着做了一个专门监控VPS库存的网站: https://vpsdalao.com,除了监控搬瓦工的VPS库存,还监控其他一些VPS商家的库存情况,也顺便嵌入了推广链接。 除此之外,我还尝试过搭建了一个专门的VPS评测网站,推广包括搬瓦工VPS在内以及各种商家的VPS。也有从Google购买广告,购买关键词引入流量。 躺赚之路 在躺赚收入越来越多之后,每个月从搬瓦工所赚取的佣金已经够覆盖所有推广网站和域名的支出,还大大有剩余。从2017年开始,我几乎可以不花钱的玩着一堆VPS,顺便还躺赚着美元。细算了一下从17年到现在,大概5年的时间,从搬瓦工总共提取的佣金大概有 36332.99 美元,按照当前汇率,合人民币 24.5万 左右。平均一年躺赚 4.9 万人民币。嗯,除此之外,我还推广其他商家的VPS,大概算了一下,收入也有几千刀左右。搬瓦工这边算是赚得最多的了。这些副业所带来的躺赚收入,也算是业余给自己挣了一些零花钱,虽然数量不多,但是躺赚的过程还是比较享受的。 一点思考与总结 从2017年到现在,明显感觉到VPS主机推广已经不如过去那么火了。随着某qiang的不断扩展和升级,搬瓦工每次都成为“重灾区”,有很多VPS玩家的机器莫名被block。另外,搬瓦工现在已经不走性价比路线了,新出的机器都不如以往那么便宜,也间接导致了他们家推广的业务越来越不好做。虽然现在每个月仍然有搬瓦工的佣金可以提取,但是我也没把太多的精力放在主机推广这个副业上了。 总结一下主机推广这个副业的运作方式,不难发现跟其他业务推广的套路相似。我也有几条经验在这里分享一下: 任何一个副业或者躺赚的途径,都跟软件开发一样,有它自己的生命周期。要看准时机,在初期进入,当这个行当被更多人都知道而变得火爆的时候,你可以在竞争中获得先机,并充分享受到这个蓝海市场带来的更高和更多的利益。 流量才是王道,正所谓酒好也怕巷子深,如何把你的推广文章让更多的人看到,提高订单成交率,就能带来更多的佣金和利润。各种推广方式都可以尝试一下,去各种论坛,群和社区,找到目标用户进行有目的的推广。 对于VPS推广,除了写评测文章,也可以考虑到这方面玩家的需求,对他们的需求进行深挖,做出对应的产品,这也很有利于推广。比如VPS比价网站,VPS库存监控网站,VPS二手交易网站,等等。只不过我没精力继续搞了……

2022/7/24
articleCard.readMore

新加坡驾照转换指北

话说,新加坡和中国是互相不承认驾照的,拿着中国驾照在新加坡是不能直接驾车的,需要把中国驾照转换成新加坡驾照才行。按照新加坡的规定,如果你在来新加坡之前已经有了中国驾照,并且持有中国驾照超过半年以上,然后现在又拿着新加坡的长期签证(工作准证,家属准证,学生准证,新加坡PR),那么恭喜你,只需要通过一门简单的理论考试(Basic Theory Test),就可以把中国驾照转换成新加坡驾照了。 本驾照转换攻略适用于持有新加坡长期准证,并且在来新加坡之前已经拥有驾照的同学。 驾校注册 去驾校注册是开始的第一步,其实也挺方便的。新加坡有三个驾驶培训学校,分散在不同的区域,建议找一家离家近的就行。带上你的护照和工作准证,去驾校咨询处咨询一下就行。工作人员在了解你的来意之后,会给你一份表格填写,收集一些基本信息。后续还会在驾校的系统上开设你的账户,有了账户一切就好办了,你可以往账户中充值,然后预约后续的考试。考试的费用会直接在你的驾校账户中扣除掉。 备考刷题与预约考试 账户注册完成之后,接下来就是备考了。基础理论考试的参考资料可以在驾校买到,也可以去大众书局购买。有两种参考书可以购买,我只买了左边的那一本。 理论考试的题型,都是选择题,一共50道,由系统随机生成,能保证答对45题及以上,就能通过考试了。基础理论考试的书,本身内容没有多少,备考的时候建议先快速刷一遍,大多内容就是介绍交通标志和信号灯的含义,以及各种交通规则。速度快的话,2-3天就可以过完一遍,然后就是刷题了。我在网上找到一个不错的理论考试题库,直接购买付费会员,所有的题都是在这个网站刷的: https://drivingtheory.sg/。 看完第一遍书过后,就可以开始刷题,中途有遇到不理解的问题,再对照着书加强一遍记忆。在看书备考的时候,就可以开始预约去驾校参加理论考试了。通常备考需要一到两周的时间,因个人看书的速度和刷题的快慢而异。预约考试可以提前开始,因为有时候报考的人太多,不一定有合适的时间段。 预约考试都是在驾校各自的官网进行的,用开的驾校账户登录和充值过后,直接在网上预约。预约的时候需要选择具体的考试日期和时间段。预约成功后,会从你的会员帐户中扣除6.5新币的考试费用。需要注意的是,预约考试的时候不用关心是中文考试还是英文考试,考试当天,系统界面上可以自由选择切换语言为中文或者英文。 参加考试 参加考试当天,记得带上你的身份ID,提前到达考试场地。之前因为COVID-19,在进入驾校之前会检查Trace Together和是否有预约考试,现在估计不用了。考试的场地是每人按照考官规定的座位入座,每人面前一台电脑。听考官介绍完之后,用指定的账户和密码登录过后开始答题。整个考试时长50分钟,50道选择题。其实准备充分的话,很快就能搞定,一般时间是在5-10分钟左右。答完所有题目之后,还有时间可以快速把不确定的题目再过一遍。 考完之后,系统会立即显示你的成绩和是否通过。这时候可以提前立场,并在考官那里领取一张驾照转换的申请表。拿到申请表,就可以从驾校闪人了。另外,你的考试成绩会记录在系统中,去交警局进行后续流程的时候,对方可以直接从系统中查到你的成绩,不需要任何的纸质证明。 转换驾照 通过了考试,填写完申请表,还需要找一家本地认可的翻译公司,把你的中国驾照翻译成英文版本。拿到翻译件之后,就可以直接去交警局转换驾照了。去交警局不用提前预约,在大厅排队系统拿到一个号码就可以等待办理业务。在办理窗口提交驾照原件和翻译件,身份ID,驾照转换申请表和一张照片,留下你的居住地址,付款,搞定。等待大约4-5个工作日之后,驾照卡片会邮寄到你的邮箱。 一些备注 大多数驾校和交警局付款都不能用信用卡,但是支持NETS支付,所以带上一张银行卡是很有必要的。 如果你持有的是非PR一类的签证,默认驾照的有效期是5年,5年之后需要重新去交警局更新驾照。中途一旦你的PR批准和通过,就可以直接去交警局把驾照再更新一下,新的驾照就是永久有效了。 附录 驾校地址 Bukit Batok Driving Center 815 Bukit Batok West Avenue 5, Singapore 659085 TEL: 6561 1233 https://www.bbdc.sg ComfortDelGro Driving Center 205 Ubi Ave 4, Singapore 408805 TEL: 6841 8900 https://www.cdc.com.sg Singapore Safety Driving Center 2, Woodlands Industrial Park E4 Singapore 757387 TEL: 6482 6060 https://www.ssdcl.com.sg 交通警察局地址 Traffic Police Headquarters 10 Ubi Ave 3, Singapore 408865 TEL: 6547 0000

2022/5/15
articleCard.readMore

利用GitHub Actions实现版本自动构建与发布流程

GitHub Actions 是 GitHub 自家推出的持续集成和持续交付工作流服务。自从上次利用GitHub Actions实现Blog自动部署与发布过后,构建和发布blog从此变得轻松。这次,我打算充分利用 GitHub Actions, 把开源项目的持续构建和发布流程做成完全自动化。 用我经常维护的一个项目 GoDNS 举个栗子,每次发布的时候,需要手动执行的两个任务: 基于不同平台进行交叉编译,把编译好的二进制文件分别上传到GitHub上,进行新版本的发布。 另外,这个项目还需要构建基于不同平台的 Docker 镜像,然后推送到 Docker Hub 上。 在使用 GitHub Actions 之前,我的做法就是在本机使用 Makefile 分别构建二进制文件和 Docker 镜像。这一系列操作在 Mac OS 下的结果就是:无法避免的风扇狂转,以及CPU温度的陡然上升。为了减轻笔记本的负担,后来我把构建 Docker 镜像的流程迁移到了VPS上。不过,这也使发布流程略显繁琐。 有了 GitHub Actions,事情就变得简单了,通过设置一个触发流程的事件,就可以用两个并行的流程分别构建二进制文件和 Docker 镜像了: 在 GoDNS 的构建流程中,触发条件是当每次有新的 tag 被创建的时候。通过把新创建的 tag push 到GitHub,两个 actions 就会并行执行。其中一个 action 负责构建跨平台二进制文件,完成后自动 release 一个相应的新版本。另外一个 action 负责构建 Docker 镜像,并 push 到 Docker Hub。 不得不说,自从用上了 GitHub Actions,我的笔记本被彻底解放了。附上两个自动构建发布流程,供参考。 Workflow 及定义 二进制包自动构建与发布流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 name: Auto Release on: push: tags: - '*' permissions: contents: write jobs: goreleaser: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.17 - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: # either 'goreleaser' (default) or 'goreleaser-pro' distribution: goreleaser version: latest args: release --rm-dist env: GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} Docker 镜像自动构建与发布流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 name: Docker Image CI on: push: tags: - '*' jobs: build: runs-on: ubuntu-latest steps: - name: Get git tag id: tag uses: dawidd6/action-get-tag@v1 with: strip_v: true - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push the docker image uses: docker/build-push-action@v2 with: platforms: linux/amd64,linux/arm64,linux/arm/v7 push: true tags: timothyye/godns:latest,timothyye/godns:${{steps.tag.outputs.tag}}

2022/5/3
articleCard.readMore

逝去的2021

还记得去年大致这个时候,去Google Photos整理照片的情形,一晃又过完了一年。2021,又是被疫情困住没能回去的一年。 从Spotify的年度大数据来看,这首Kodaline的《Say Something》是我在2021听得最多的一首歌。喜欢这个来自爱尔兰的小清新乐队很多年了,主唱的声音清新干净明朗温柔,很治愈。 工作 因为疫情的反复,今年只回公司上了几个月的班,大部分时间还是远程工作。尤其是快年底的时候,疫情反扑,每天确诊人数3000以上,年底最后几个月都一直在家工作,实在是将远程工作体验到了极致。今年由于公司项目组架构进行了很大的调整,结果是我分别待了三个不同的项目组,其间又做前端开发,也做后端开发,项目技术栈涉及到了Go, Java, C++, React, TypeScript, 感觉自己快真正成为一个全栈工程师了。年初的时候,EP工作签证快到期,公司HR主动联系我renew工作签证,结果一切顺利,又能继续在坡再躁两年了。 办公室一景 办公楼外的夕阳 转换驾照 根据新加坡的交通法规,如果在国内已经持有驾照,到新加坡这边只需要参加一个理论考试,并且熟悉了新加坡这边的道路交通规则,就能直接把国内的驾照,转换成新加坡的驾照了。这件事情要从去年说起,其实我本来已经去驾校注册完毕,买了理论考试的书备考,还预约了2020年的6月去驾校的理论考试。可后来疫情突然爆发,新加坡全面封国,鼓励所有人尽量减少外出,那次的理论考试直接被驾校给取消了。再后来因为搬家,住得离那个报名的驾校更远了,搬家过后就一直搁置了这个事情。直到今年,才又想起去年挖的坑,找出理论考试的书,拂去灰尘,重新准备。延迟了近一年,在六月中旬的时候,顺利预约到了六月底的考试。还记得考试当天,打车从家到驾校,半小时的车程,几乎跨越了半个新加坡,考试却只花了5分钟就搞定了。 剩下的流程就是带着翻译好的驾照翻译件和原件,以及填好驾照转换的申请表,去交警局申请转换驾照。几天后,驾照邮寄到家,新加坡驾照就这样到手了。 重返校园 毕业N年,在国内的时候也纠结和考虑过要不要读研究生的事情,可我一想到国内的研究生考试都离不开考政治,我就顿时没了兴趣。自从来了新加坡,才了解到原来只有国内的研究生才有入学考试一说,国外并不需要,只要提交一门规定的英语考试成绩和大学本科成绩就可以申请。另外,跟国内不同的是,国外的master,不管是全职脱产,还是在职,学的课程一样,学费也一样,认可度也一样,毕业证书也一样。考虑了一下平日休息的时间除了刷剧和徒步,要不再顺便折腾一下part-time master?其实自从来2019年来新加坡过后,这个想法就一直在脑海中扎根了。去年底,趁着工作后下班的时间准备了A类雅思考试,虽然口语成绩不是很理想,但是一看NUS (National University of Singapore) 对于计算机master的申请要求,雅思6分的总分应该是达到了 (正好考了6.5) ,索性抱着试一试的心态,在年初1月底的时候,提交了Computer Science part-time master的申请。 NUS计算机学院的研究生课程主要分为四个方向: Computer Science - 计算机科学 Information System - 信息系统 Infocomm Security - 信息/通讯安全 Artificial Intelligence - 人工智能 申请的时间窗口只有一年两次: 1月申请,8月入学 8月申请,次年1月入学 为了准备资料,提取大学时候各科成绩,还专门托我老爸跑了一趟本科学校的档案馆,提取出成绩并找翻译公司翻译成英文版,再邮寄到新加坡来。正好赶在年初的时候,准备好所有的材料,并提交了申请。至于专业方向,我还是选择了本科的老本行:计算机科学。 我本科毕业的学校是国内的不知名非985/211大学,其实申请的时候并没有报太大希望。在提交个人陈述的时候,把自己对计算机科学的兴趣和当前工作的相关性都详细叙述了一下,还把之前获得的一些业界认可的证书也都提交上去了,总之,本科学校一般,成绩也不出彩,就拿其他的来凑吧。1月底提交申请,5月早上的某一天,突然收到了一封email,竟然是offer letter来了。 传说中的Offer 在NUS的学院网站上accept了offer,然后预约入学体检,所有的手续搞定之后,去计算机学院领了张学生卡。 滴!学生卡… 还是因为疫情的原因,大部分课还是线上进行的,中途去学校了两次,围观了一下学校,顺便去学校的食堂吃了两顿。不得不感叹,还是学校里吃饭便宜,比公司旁边吃饭便宜多了。 从8月入学到年底,已经过完第一个学期了。好家伙,一学期三门课一起修,累并快乐着,周末和平时休息时间几乎都用来肝作业了 -_-# 第一学期算是掌握了课程的大致情况和节奏,后面的学期估计会更适应一点。希望能不出意外两年后顺利毕业吧…… PR申请 PR也就是新加坡的永久居民,俗称绿卡。来坡大概一年半的时候,也就是跟提交申请NUS master一起的时候,我也顺便替全家提交了PR申请。 提起新加坡的PR,那可真是一个让人又爱又恨的东西。每年PR申请者那么多,批准人数只有3万。当然,就算申请被拒了,移民局也不会告诉你任何原因,只能半年后再重新申请。而申请PR的条件,也是未公开的谜,官方并没有公布一个PR评估的条件和细则,民间都只是根据申请通过者的条件来猜测。因为从学历水平和薪资水平来看,每年各个阶段的都有批准的。有学历低、薪水低的批准,也有学历高、薪水高的被拒。所以,申请者的年龄、来新加坡的年份、学历、所从事行业、薪水、纳税情况、家庭稳定情况等等,都会影响到你申请PR成功与否。 其实提交PR申请之后,我心里也没底,毕竟这是来坡之后第一次申请。可这申请提交过后,申请状态就从2月底开始,一直都是pending,超过10个月了。在年底12月的时候,状态终于发生了一点变化,登录去ICA上看了一下,PR大概率是有戏了。 在2021的最后一天,PR申请状态变为 Approved,这下PR是真的稳了。掐指一算,从2019年5月来坡搬砖,到PR到手,大概两年零七个月左右。参考了一下各种网上的案例,有多次申请仍然被拒的,也有在坡7、8年仍然没能申请到PR的,我这第一次申请就通过,大概是被幸运之神眷顾了吧! PR Approved 作为一个在新加坡搬砖的外国人,有了PR,身份上的焦虑顿时消失了:不用再担心工作的不稳定性,也不用担心工作签证续签出什么乱子,在坡买房能立省30%的外国人印花税。另外,小孩读书的费用也能省掉一大笔。接下来,可以安心的搬砖和读书了。 户外徒步 周末和假期的徒步依然是在新加坡生活的人们的保留节目。因为疫情不方便去周边其他国家,户外徒步依旧是最受欢迎的运动之一。今年刷了两次麦里芝蓄水池,也再刷了乌敏岛,还去了新加坡最边缘上的两个地方:地图右上角的 Coney Island 和地图左上角的 Sungei Buloh Wetland Reserve (双溪布洛湿地保护区)。 双溪布洛湿地保护区 Coney Island 沙滩与对岸的马来西亚 去圣淘沙岛上徒步,由于疫情的原因,游客少得可怜。 圣淘沙环球影城 圣淘沙岛上的海景 圣淘沙岛一景 植物园一游,植被茂密,还有个特大号草坪,周末人都喜欢去草坪休闲娱乐: 植物园 植物园的大草坪 好几次的徒步安排在了下班后的傍晚,在不同的时间去徒步,还能看到不一样的景色。 黄昏的花柏山公园 花柏山公园的城景 黄昏的麦里芝 黄昏的麦里芝 黄昏的麦里芝 夜晚的海边栈道 徒步随拍夜景 徒步随拍夜景 期权投资 自从2020年底开始接触到期权投资,然后在网上自学了期权相关的知识。从2021年开始,正式开始期权投资的各种骚操作,总的说来,2021年期权投资还是盈利的。从IBKR的年度报表来看,2021年期权盈利为接近8万刀。 由于是初次接触期权的小白,中途也有一些误操作,导致了一部分损失。另外,由于预估价格错误,期权挪仓也导致账面亏损,看来期权知识还得加深一下。从去年开始,也顺带在业余时间写了期权入门笔记系列,由于master课程和作业实在繁忙,没能继续,希望2022能继续填完这个坑。 开源项目 开源项目今年也没多少contribution,主要还是由于学业繁忙。快年底的时候休假,把之前一直维护的两个项目 SKM 和 GoDNS 重构了一下代码结构,方便后续维护。另外,今年因为工作的原因,还重新拾起了多年未用的C++,学习了一些现代C++的新特性。业余时间还继续学习了一下Rust,不过确实因为精力有限,进展比较慢。希望2022能用Rust搞个开源软件的新坑…… 关于2022 因为疫情大致两年没回家了,希望来年疫情能消停一下。安心搬砖、读书、回家一次应该是明年的关键词吧……

2022/1/1
articleCard.readMore

使用Caddy2托管静态博客

最近由于Cloudflare受到一些”干扰”,有网友提醒我的blog在国内有打不开的情况。不幸的是我的Blog + CDN都是托管给Cloudflare的,被无辜”殃及”了。再加上最近比较忙,blog也荒芜了快一年没打理,正好这个周末的晚上可以来折腾一下。 看了一下手上的吃灰的几个小鸡,发现竟然还有一台之前买的搬瓦工的小鸡,登录上去一看,好家伙,uptime 都659天了,稳啊! 好吧,就它了!接下来又是一波骚操作,从德国Contabo的主机rsync直接拷贝所有静态页面过来,速度还挺快。之前用的Nginx,这次打算再次换成Caddy Server,毕竟Caddy都出第二个版本了,自动更新SSL证书是比较能吸引我的地方。去官网研究了一下文档,还是决定用Docker来跑Caddy2,方便! 由于这个VPS只是用来放我的静态blog,所以也不用考虑多站点的问题,Caddyfile的配置简单到发指: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 https://xiaozhou.net { encode gzip tls example.mail@gmail.com { protocols tls1.2 } root * /usr/share/caddy file_server } http://www.xiaozhou.net { redir https://xiaozhou.net{url} } http://xiaozhou.net { redir https://xiaozhou.net{url} } 配置里面有两个请求转发,把所有非HTTPS的请求都转发到HTTPS。然后,再准备一个shell脚本,用来运行Caddy2: 1 2 3 4 docker run -d --restart=always --name caddy -p 80:80 -p 443:443 \ -v /home/mysite:/usr/share/caddy/ \ -v $PWD/Caddyfile:/etc/caddy/Caddyfile \ caddy:2.4.5-alpine 容器直接暴露80端口和443端口到宿主机器即可。万事具备,只欠东风!去Cloudflare把域名解析过来,等生效,然后直接启动Caddy server。一切顺利,Caddy Server会在第一次启动的时候,自动申请LetsEncrypt的证书,后续也能自动renew。我懒啊,要的就是省心! 后续的流程,去GitHub改掉blog的自动部署流程,把部署的机器更新成现在的小鸡,打完收工!就这样,Blog又又又搬家了一次,从德国搬去了美国西海岸…… 唉……

2021/10/17
articleCard.readMore

美股期权投资策略学习笔记--期权的基本概念

前言 自从去年接触美股以及期权到现在,已经有小半年时间了。期权是一种非常有吸引力的金融衍生品,也是一种能通过时间给你带来不错回报的投资工具。在没有接触期权之前,我一直以为期权是一种风险很高的投资行为,其实不然。在金融市场中,风险总是伴随着对等的收益,只要你善于利用期权,不但能为你规避一些风险,还能带来收入。相比股票,期权更像是一个功能齐全的工具箱,合理的运用各种期权策略和组合,就能构建出丰富多样的投资组合,这一过程本身也极其具有创造性和趣味性,这也许就是期权更吸引我的地方。 最近读麦克米伦的《期权投资策略》,略有心得,准备写一系列的学习笔记,方便自己以后查阅,也方便对期权感兴趣的同学参考。 什么是期权 股票期权(Stock Option)是一种买卖双方在未来某一个时间以某种特定价格买入或者卖出某种特定标的资产(Underlying Asset)的权利。简单的说,股票期权就是一种权利。 期权是一种在期货基础上产生的金融衍生品,对于期货而言,标的资产是某种商品或者实物。而对于美股期权而言,这种买入或者卖出的标的资产,就是股票。 对于期权交易的买卖双方来说,期权更是一张合约,这张合约规定了买方的权利以及卖方所应当实现的义务。 期权的基本要素 以 InteracriveBrokers 上显示的期权为例,我们先来看看一张期权合约到底长什么样的: 1 TSLA 16JUL21 585.0 C 一张期权合约,在各大交易商的系统上显示的格式或许略有差别,但是任何一张期权合约都具有以下四个特征: 期权的类型,例子中的C字母,彻底暴露了它是一张看涨期权。通常我们把看涨期权叫做Call Options,把看跌期权叫做Put Options。 标的股票的名字: 这张期权合约对应的标的股票是特斯拉(TSLA)。 到期日: 这张期权合约的到期日是2021年7月16日。 行权价: 在期权到期的时候,如果达到了行权的条件,买方行使权利的时候所对应的价格。在本例中,行权价是585.0美元。 把以上四个要素综合起来,我们就能够理解一张期权合约所要表达的意义:TSLA 16JUL21 585.0 P 是指一张在到期日2021年7月16日,期权的买方能够以585.0美元一股的价格,买入100股标的股票为特斯拉的合约。在这里我们还要了解的一点就是:一张期权合约正好对应了100股的标的股票。 关于权利金 期权作为一张合约,是具有其自身价值的。当期权买家从期权卖家手中买入一张期权合约的时候,需要支付给期权的卖家一笔费用。这笔费用,就叫做权利金(Premium)。 期权的分类 按照几种不同的划分方式,我们可以把期权分为几种不同的类型: 按照期权的类型 看涨期权(Call Options) 看跌期权(Put Options) 而针对这两种类型,我们能有四种对应的操作: 买入看涨期权(Long Call) 卖空看涨期权(Short Call) 买入看跌期权(Long Put) 卖空看跌期权(Short Put) 按照期权的价值来分类 实值期权(ITM) - 全称: In-The-Money Option,对于看涨期权来说,如果当前股价高于期权的行权价,这个期权就是实值期权。 虚值期权(OTM) - 全称: Out-of-The Money Option,同样对于看涨期权,如果当前股价低于期权的行权价,这个期权就是虚值期权。 平值期权(ATM) - 全称: At-The-Money Option,如果当前股价恰好等于期权行权价,那么这个期权就属于平值期权。不过在实际情况中,我们一般把期权链上,距离当前股价上下最近的两个期权,都叫做平值期权。 期权的买方与卖方 在期权交易市场中,买方和卖方是互为对手方,对于同一张到期后的期权合约,盈利的要么是买方,要么是卖方。期权合约也规定了期权买家和卖家双方的 权利 和 义务。 作为期权的买家,既然付出了权利金从卖家手中买入期权合约,买家拥有在期权到期后行权或者放弃行权的权利。 作为期权的卖家,既然通过卖出期权获得了权利金,就必须履行期权被行权的义务。在期权到期日的时候,卖家有可能会被指派行权。当卖家一旦被指派,必须按照期权的行权价,买入或者卖出指定数额的股票。 期权的到期行权与指派 和欧式期权不同,美式期权的买家可以不必等到期权到期的时候才行权,而是可以在期权的存续期内的任何时候行权。期权的行权与指派是由专门的 期权清算公司(Options Clearing Corporation, OCC)来完成的。在整个期权交易的生命周期当中,期权清算公司控制着所有期权的行权和指派。在期权指派的时候,期权的卖家会随机被选中。作为期权的卖家,必须服从指派并且必须交割股票,这也是前面提到的在期权交易过程中,卖家必须履行的义务。

2021/7/10
articleCard.readMore

我的2020

既然忘不了,那就不要去忘记,让时间去解决一切。 2020过得如此之快,以至于年底整理手机相册,才发现已经进入2021了。新加坡是一个四季如夏,一年四季气温都变化不大的地方,没有了四季明显的变换,更容易让人模糊了对时间的感知。 从年底网易云音乐生成的年度报告来看,黄老板的这首《Photograph》竟然是我本年度听的次数最多的一首歌…… 听着黄老板的歌,整理着照片,顺便用照片回顾一下飞逝而去的2020。 疫情 00 年初临近春节的时候,还换了一把马币,跟同事一起去马来西亚的新山玩了一圈。大家一边畅玩,一边感叹:仅仅跟新加坡一桥之隔的城市,为何消费如此便宜? 谁知道,一场突如其来的疫情,改变了全世界人们的生活。 春节临近,请了年假回国,直飞的往返机票略贵,临时选择了去HK转机的路线(新加坡->HK->成都)。由于2019年在HK发生的各种众所周知的事情,订完机票过后突然有点后悔,甚至有点担心去HK转机的安全,后来又觉得退票麻烦,还是壮着胆子去了…… 在HK中途转机大概有6小时左右的空余时间,正好持中国护照在HK转机,可以免签注入境HK。在跟机场工作人员反复确认入境是否安全后,得到的答复是:”Until now, it’s safe…”。好吧! 二话不说,兑换了点港币,直接入境HK去走一圈。 路过中环,去了佐敦道,经过重庆大厦,还去维港旁边走了一圈。 维港边上,还听一个说着四川话的大妈正在拍照,感觉一切风平浪静,好像什么都没发生过一样…… 找了家路边的餐馆,吃了顿味道不错的烧鹅饭,微信上得知国内口罩已经卖断货了,顺便还在一家屈臣氏买了袋口罩,然后顺利登上了回国的航班。 01 回成都后,简单收拾了一下,又直接开车回到了老家。在老家待了一周,见到了从各地回老家的初中同学。 然后,终于又吃到了向往已久的老家的各种米粉…… 后来疫情越发严重,提前改变计划,从老家绵竹回到了成都。回成都的高速路上,已经有各种检查站开始逐个给乘客量体温和登记了。 返回成都后,最关心的是航班信息。因为疫情,各种航班都有不同程度的改动或者是取消,很庆幸之前订的2.1号回坡的机票并没有受到太大影响。 回到新加坡之后,才知道因为疫情,各国入境政策不断收紧,2.2号过后很多从国内来新加坡的航班都取消了。 02 2月初刚回新加坡,大街上都没几个人戴口罩,网上也看到各类文章,开始质疑新加坡佛系抗疫。直到后来客工宿舍疫情爆发,新加坡开始了漫长的阻断措施。 回新加坡需要居家隔离两周,其间不断收到人力部打来的电话和发来的短信,要求每天间隔一定的时间,上报实时位置,其实这边并没有佛系抗疫,对于居家隔离人员的监督还是挺到位的。居家隔离结束后,回公司上班没多久,随着疫情不断严重,4月7号到6月1号,整个新加坡进入了接近两个月漫长的阻断阶段。 所有公司的员工,都被要求把电脑带回家,在家里远程工作。 作为一个IT搬砖码农,之前在国内的时候也读过DHH的那本《Remote》,幻想着有一天也能体验一下远程工作这种方式。但是没想到,这个愿望竟然在2020这一年,以这样的方式实现了。 阻断期间,各种商铺一律要求停止营业,所有人也被要求尽量减少外出,除非是出去购买食物和生活用品。要去餐馆吃大餐是不可能了,不过在家里也可以把火锅、烤肉、钵钵鸡、腊肉给安排上。 03 6月开始,终于又可以回公司上班了,公司的所有同事分为A/B两组,每周轮流回公司上班,这样可以随时保证只有一半的人员在公司,也避免了人员过于密集。这样的工作方式一直持续到年底,随着新加坡的抗疫宣布进入第三阶段,也总算取得了阶段性的胜利。最近的大新闻也要算疫苗开始正式注射了,真希望这波疫情能尽快过去。 PS: 五月算是在坡工作满一年,六月回公司领了个杯具: 搬家 来新加坡一年半有余,已经搬家过两次了。刚来的时候短租了两个月的HDB,后来因为接家里人过来,在HillView租了一个公寓,6月阻断措施结束过后,合同到期,7月再次搬家到Serangoon。对比住过的三个地方,印象最深刻的还是HillView了。HillView译为“山景”,是一个名副其实的接近大自然风景的地方,因为旁边就是新加坡号称第一高峰(海拔163.63米) 的自然保护区: Bukit Timah Nature Reserve。 我租的公寓,大概就在Bukit Timah山脚下的街对面。当初看上这套公寓,是因为这种老式的公寓空间宽敞,阳台外的风景很吸引人,经常还有各种不知名的鸟飞来阳台,朝客厅内打量,偶尔一两只大胆的鸟踱步进客厅也是常事。 公寓所在的小区也很原生态,满眼可见的绿色,去小区里走走,半路上碰上个蜥蜴也不要太惊讶! 户外徒步 自从来坡以后,喜欢上了徒步,2020一整年,也去徒步了很多次。次数最多的,要算之前HillView旁边的Bukit Timah,在疫情阻断期间,几乎每周都去。虽然号称海拔163.63米,但是20多分钟就能从山脚到山顶,40分钟能走个来回。 其次是麦里芝蓄水池 (MacRitchie Reservoir),在坡县徒步必去的一个地方,徒步的线路可以自由DIY,我每次去大概是走一圈13KM的线路。 10月跟同事组织了一次海岛游,因为疫情的缘故,新加坡旁边的马来和印尼都封锁了边境,要来一次跨国海岛游是不大可能了。这个时候,坐船去乌敏岛(Pulau Ubin)是个不错的选择,因为这个岛是新加坡的第二大外岛,不用出入境,直接坐船可登岛。去乌敏岛,可以欣赏岛上的多处历史古迹、椰子橡胶种植园、养鱼场,以及新加坡硕果仅存的甘榜 (kampong,源自马来语,意指 “传统村落”)。去岛上租个自行车四处骑着撒欢是个不错的选择! 又或者,在东部的海边栈道漫步,看看海景…… 岛上猴子成群,野猪也随处可见,不过它们已经对游客司空见惯。 开源项目 整个上半年保持了一定的更新和迭代速度,可是到了下半年,就开始忙了,大部分经历耗在了工作和其他事情上,今年整体的contributions只是是去年的一半。 很幸运的是,JetBrains的开源项目支持计划,又给续了一年的Free Subscription,感恩! 四月,阻断期间在家,受邀参加了一期《小人物》PodCast的录制,跟播主聊了一期在新加坡的生活和长期一直维护的开源项目。 另外,上半年还自学了一下React,同时用Next.js把之前做的一个网站重写了一遍,没想到到了年底,日访问量涨了不少。今年打算继续对网站进行一波优化,然后看看如何将流量变为收入。 工作 上半年阻断期间,一直在家工作,继续维护从入职以来做的项目。下半年由于组织架构调整,之前做的项目被并入到其他组了,我也跟着换了项目组,随即开始忙起来。年底的四次大促:(9.9 / 10.10 / 11.11 / 12.12) 依旧很忙。 考试 嗯,在2020下半年开始忙的时候,我还参加了了两场考试,都是为了填之前挖的坑。 CKAD考试 之前国内的工作一直跟Kubernetes打交道,想到要是能拿个相关认证也是极好的。2019年底圣诞的时候,剁手入了CKAD考试,结果到了2020才想起还有这么个考试。于是,从8月开始准备,9月参加在线考试,中途还买了个在线的课程便于复习。考试过程中有惊无险,总算是幸运的通过了,写了篇经验总结,方便要备考的同学准备:《CKAD认证备考经验分享》 雅思考试 9月考完CKAD,又马不停蹄的开始准备雅思。其实雅思也是之前来坡之后一直想准备的考试,从19年10月开始有了这个打算,后来从淘宝海淘了几本剑桥雅思真题,中途断断续续开始准备,其间一直不得要领,几乎放弃。转眼间就来到了2020,上半年也就断断续续做了一下阅读,听力,看了一遍雅思写作的书。直到准备完CKAD考试,狠心报了个国内在线的雅思强化班。 刚好年底又是公司的四次大促活动,工作上本来很忙,雅思课程的直播时间大部分是在白天上班时间,要不就是下午还没下班的时间。要看雅思课程的直播是没办法了,只能下班后连忙赶回家吃饭,然后看在线课程回放,一期期的跟完强化课程,然后跟着指导进行练习。我也不知道我哪来的精力,感觉上大学考英语四级的时候,我都没这么认真过…… 雅思考试确实是有一些技巧和方法的,跟着强化班训练下来,感觉效果不错。终于在11月的时候,预约了年底圣诞节前一周的雅思机考,终于在圣诞节过后,拿到了成绩。 考试总结: 听力不及预期,平时训练的时候都是7分,考试比预期低了一些。 阅读有点超乎意料,平时训练的时候是朝着7分这个目标的,预期分数也是7分而已,没想到得了个8分。 口语是比较惨烈的,败在了Part2部分。由于之前复习时间有限,大部分时间放在了阅读和听力,口语完全没准备就上阵了。导致Part2部分遇到一个完全陌生的话题,一时之间不知道说什么,词穷了…… 写作也是准备时间不足,仅得了6分。正常操作是去买几篇雅思精批,考试前多练习写几篇,找找感觉。然而我就看了一遍雅思写作的书,熟悉了一下套路,练习不充分,还有提分的余地。 另外,选择机考雅思还是不错的,出分快,而且写作可以直接键盘输入,效率比手写高,完美规避了书写不好看影响分数的问题,最重要的是:码农打字速度有先天优势…… 所以,雅思首考,口语不尽人意,2021,要不再刷一次雅思A类? 关于2021 2020年底准备考试,阅读的时间减少了,如果新年有什么计划的话,大概是希望能继续保持阅读和持续学习的习惯。之前从国内海淘的大屏幕电子阅读器,也吃灰了一段时间,得重新用起来。 另外,希望这场疫情能尽快结束,真想再回一次老家……

2021/1/2
articleCard.readMore

CKAD认证备考经验分享

前言 最近通过了CKAD认证考试,也算是填了一个去年底挖的坑。这一切要源于去年底圣诞的时候,Linux Fundation的认证考试打折,原价300刀的CKAD考试,打折下来只用花255刀,忍不住剁手了。 此认证费用,包括一年有效期内任意时间预约考试的机会,以及一次免费重考的机会。 本来想着有一年的时间备考和准备,买了之后拖延症又犯了,就一直没管它。直到最近,突然收到了Linux Fundation的邮件,提醒认证考试年底就要过期了,才想起来之前竟然还买了个这个认证,突然开始慌起来…… 二话不说,立马着手开始备考,由于之前工作中也算用过Kubernetes,对其核心概念也有一个大致了解,从8月到现在,大概花了一个多月的时间来准备。最后,准备总算没白费,通过了这个认证考试。 本篇blog就介绍和分享一下CKAD认证备考的一些经验。 什么是CKAD考试 总的来说,CKA和CKAD是CNCF和Linux基金会联合推出的两个Kubernetes考试认证: CKA: Kubernetes管理员认证(CKA)旨在确保认证持有者具备履行Kubernetes管理员职责的技能,知识和能力。 CKA认证可帮助经过认证的管理员在就业市场中快速建立自己的信誉和价值,并能帮助公司更快地雇用高质量的团队来支持他们的发展。 CKAD: Kubernetes应用程序开发人员认证(CKAD)旨在确保CKAD具备履行Kubernetes应用程序开发人员职责的技能,知识和能力。 经过认证的Kubernetes Application Developer可以定义应用程序资源并使用核心原语来构建,监视和排除Kubernetes中可伸缩应用程序和工具的故障。 就两种考试的定位而言,CKA更偏运维一些,CKAD更面向开发人员一些,所以我选择了CKAD认证。 考试内容与范围 CKA和CKAD的考试范围和比重,是直接公布在认证官网的。CKAD的考试范围和比重如下: 跟CKA的考试时间不一样,相比CKA的3小时时间,CKAD只有2小时。CKAD考试题目总共19道题,总分100分,66以上就算是通过了认证。 备考阶段 虽然之前工作中也有用到Kubernetes,为了让知识点覆盖更全面,我还订阅了KodeKloud的两个课程: Kubernetes For The Absolute Beginner - Hands On Certified Kubernetes Application Developer (CKAD) 他们家的课程是订阅制的,最近疫情期间也打折,所以学完之后可以取消订阅。两个课程都带了在线的动手实验室,学过一个知识点过后,就可以立马去动手实验室操作,用以对知识的巩固加深,还不错哦! 最近还发现他们也把这个课程放到了Udemy,可以一次性购买: https://www.udemy.com/course/certified-kubernetes-application-developer/ 相对于订阅更划算一些。 和其他的一些认证考试不一样的地方在于:CKA和CKAD非常注重动手操作。考试题目并不是常规考试的判断题,选择题,问答题。所谓考试实际上就是在他们官方提供的Kubernetes环境中进行实际操作。所以备考的时候,需要对 kubectl 的一系列命令了如指掌。总的来说,多动手操作实验才是通过这门认证的最佳途径。 在GitHub上,有人为这个考试专门准备了一个动手实验题库: https://github.com/dgkanatsios/CKAD-exercises 在考试之前,我大概把里面每一个题目动手操作了5-6遍。最后要达到的目标,就是看到题目之后,能想到应该如何在Kubernetes上操作并实现题目要求,能做到了然于心才是最佳状态。 关于实验环境,推荐在本机安装运行 minikube 或者 k3s ,他们都是轻量级的Kubernetes实现,用来动手操作实验题目还是不错的。如果你实在懒得搭建本机环境,用网上现成的也有: KataKoda Play with Kubernetes 在操作一些比较复杂题目的时候,你甚至可以用上面那个”Play with Kubernetes”提供的免费资源,自己搭建一个Kubernetes集群进行演练。 考试预约与考前准备 在完成备考过后,可以真正的预约考试了。听说最近Linux Fundation还专门为中国准备了国内现场考点,国内考试可以去专门的考点上机操作完成。另外的方式就是在家或者在一个安静的地方在线参加考试。 对于在线考试,有考前检查和一系列的规定,可以去官网逐一阅读一下。大致说来,规定如下: 考试形式: 在线监控,需要共享桌面和摄像头。如果你的电脑外接了显示器,两个屏幕都得共享。另外,考试中只允许你的浏览器开两个窗口,一个是考试的界面,另外一个就是Kubernetes的官方文档界面。在考试中,遇到不会的配置项,是允许你去官方文档中查询的。 考试环境: 在一个密闭空间,例如书房、卧室、会议室等,电脑屏幕不能对着窗户,房间里除了考生不能存在第二个人,考试的桌面不能放其它东西,水杯也不行(透明的玻璃杯是可以的)。 考试时间及题目: CKA-3小时-24道题、CKAD-2小时-19道题,均为动手操作题。 选择考试时间: 由于监考官在美国,所以考试的时候别忘了选择一个跟你所在的时区最匹配的时间。我选择在了我所在时区的周五晚上9:30,考完大概晚上11:30。 电脑要求: Windows的电脑和Mac OS的电脑都可以。在考试前可以在这里 WebDelivery Compatibility Check 对你的电脑进行兼容性检测。 考试过程 关于时间管理 前面有介绍,CKAD的题目是19道,时间2小时,平均一道题能花的时间是6分钟左右,所以时间管理是非常重要的。19道题目的难度不一,有的简单有的复杂。对于一道题目,先看题,如果觉得没头绪,可以先标记这道题,直接跳过去做后面的题目。等19道题大致做过一遍之后,再回来看标记过的不会的题目。 题目权重与优先级 每一道考试题目上会标注这道题目所占的分数比重,总分100分的题目,达到66分可以通过考试。所以,结合与时间管理的策略,整个考试可以并不按照题目的顺序来做题。我就是在考试开始的时候,直接先快速把19道题过一遍,把分值权重较高的题目先标记出来,优先做这些分值较高的题目,然后再做剩余的题目。 注意考试场景的切换 所有的19道题目并不是在一个Kubernetes环境中设立的,这就涉及到需要在做题之前,先切换到对应Kubernetes的Context。每道题目前都有对Context进行说明和切换的要求,在做题前特别留意一下,确保是在正确的Kubernetes环境中操作即可 考试界面语言的选择 由于是一个针对全世界开发者的考试,官方的考试界面也提供了多语言支持。为了避免翻译的偏差对题目的影响,我还是没选中文,选了英文。 监考官的互动 考试的整个过程,除了共享你所有的桌面,还得开摄像头,也就是你只能被监考官通过视频进行监督,而你是看不到监考官长啥样的。整个过程与监考官的互动,是在一个Web弹出的聊天窗口中进行的。包括考前注意事项说明,以及考试过程中遇到问题,都可以通过这个聊天窗口跟考官互动。考官除了回答你跟考试过程相关的问题,还会在考试过程中进行随机抽查,比如要求你在考试过程中,把双手或者桌面通过摄像头给他看看,确保你没有作弊…… 一些考试中争分夺秒的技巧 为 kubectl 设置 alias 考试的整个过程都是在Kubernetes中进行操作,所以 kubectl 这个命令输入的频率那是相当高的。反复输入这么长的命令,实在是有点浪费时间,要知道在这2小时的考试过程中,时间就是一切。所以在开始考试之初,我就在考试环境中为 kubectl 设置了alias。比如 alias kc=kubectl 或者 alias k=kubectl 。后面所有输入 kubectl 的地方,都可以用 kc 或者 k 替代,能为你节省不少时间。 熟练操作kubectl命令 kubectl 能操作和创建的资源有很多,在考试过程中,能不用YAML来创建资源就尽量不用。因为编辑YAML是比较花时间的,还容易出错。一般做法是用kubectl命令创建资源,通过dry-run的方式,先生成YAML文件模版,再根据题目对这个YAML进行改动。这里有一份 kubectl Cheat Sheet 你当然不能错过。 熟悉各种资源的简化名称 Kubernetes本身也有提供一些简化的资源名称,比如namespace 可以简化为 ns, deployment 可以简化为 deploy,pod 可以简化为 po。了解这些简化的资源名称,也能为你省掉不少的时间,在备考的过程中,可以记忆下来这些简化的命令。Kubernetes的官方文档,列出了所有资源的简化名称,可以参考: https://kubernetes.io/docs/reference/kubectl/overview/#resource-types 考试结果 由于我的网络问题,在考试中竟然断网了两三次 (具体表现就是终端卡住不动了,无法输入任何命令),不得不重新连接进入考试界面,浪费掉了一些时间。当时的心情,真有种万念俱灰的感觉。所以,考前最好再检查一下你的网络环境。最后一道题本来打算做,临交卷还有几分钟的时候,又卡住了。我索性放弃了,直接交卷…… 考试结束之后,官方保证会在36小时之后出考试结果,结果会Email到你考试时候注册的邮箱。虽然考试过程中掉线了两三次,不过还是比较幸运,周五晚上的考试,周日就有了结果,通过了。我在想,要是不断网,再给我多来几分钟,我应该能上90分吧…… 希望此篇blog对备考CKAD的同学有所帮助。

2020/9/27
articleCard.readMore

Emacs启动加速篇

Emacs虽然强大,但是其作为一个伪装成编辑器的”操作系统”,在启动耗时方面是广大Emacs用户的痛点。虽然现在用上Doom Emacs,比起Spacemacs启动要快了不少。在公司开发用的MBP上(内存16GB,i7 6核CPU, 500GB SSD),单次启动加载完所有插件大概需要4秒多的时间。 恰巧最近又买了个德国的高配置VPS,访问速度还不错。于是心血来潮,在上面折腾了开发环境,还装了Doom Emacs,打算实现用任何一台低配置的瘦客户端SSH登录到云端VPS, (或者在Chrome中用SSH扩展连接过去) 达成用Emacs在 “云端” 写代码的一个小目标…… 其实,这样的目标已经实现了,美中不足的地方在于: 由于是SSH连接过去,每次退出SSH会话的时候还得退出Emacs,下次启动Emacs又得花掉人生中宝贵的四秒钟时间,实在是不甘心。正好,Emacs从26.1开始,已经支持使用systemd管理Emacs服务端Daemon的功能。这样一来,我们只需要在VPS上后台使用Systemd启动一个Emacs的服务端,每次SSH登录的时候,用Emacs客户端启动,就能实现秒开Emacs的效果了。 在Emacs安装完成后,会在 /usr/lib/systemd/user 中创建一个Systemd的配置文件,名为: emacs.service。跟其他的Systemd服务一样,我们只需启动这个服务即可。 启动并运行Emacs服务端程序: 1 systemctl --user start emacs.service 为了下次随机器启动时,自动启动Emacs服务端程序,我们还可以运行: 1 systemctl --user enable emacs.service 随后,查看Emacs服务运行情况: 服务端启动妥当,最后,只需要在SSH登录后,运行Emacs客户端程序,即可秒开Emacs了,又为人生中省下了不少个4秒钟: 1 emacsclient -t

2020/6/18
articleCard.readMore

利用GitHub Actions实现Blog自动部署与发布

GitHub Actions是GitHub官方推出的持续集成服务。通过GitHub Actions可以为你的项目提供持续构建,测试,程序打包和部署一条龙服务。根据官方资料介绍,GitHub Actions为用户提供虚拟服务器环境,硬件规格为: 2-core CPU 7GB RAM 14GB SSD 支持的操作系统包括: Windows Server 2019 Ubuntu 18.04 Ubuntu 16.04 macOS X Catalina 10.15 正好,我基于Hexo的blog仓库也是放在GitHub,这样的虚拟环境配置用来持续构建和自动部署blog再合适不过了,还可以避免每次本地部署重复输入命令和CPU风扇狂转的困扰。 配置过程 环境介绍 我的blog是基于Hexo的,所有的Markdown文件托管在GitHub的私有仓库中,另外,构建生成的静态页面是托管在另外一台阿里云国际版的VPS主机上。 利用GitHub Actions需要达成的目标就是:每次提交或者更改新的blog文章,触发GitHub Actions进行构建,构建出静态页面后,直接发布到VPS上。 生成部署专用SSH密钥对 首先需要生成一对新的SSH密钥,注意这对密钥不能有密码保护,因为整个构建过程应该是自动的,有密码保护的密钥对会中断构建过程。 将这对密钥的public key添加到托管blog的VPS对应账户的~/.ssh/authorized_keys中。然后在Blog仓库的Settings->Secrets里添加刚刚生成的私钥,名称为BLOG_DEPLOY_KEY。这样做的目地是保护私钥不被泄漏,这样在GitHub Actions中不用以明文的方式填入私钥。 创建GitHub Actions 以我的blog为例,在blog仓库的Actions选项卡下点击新建workflow,填入如下配置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 name: HEXO CI on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [10.x] steps: - uses: actions/checkout@v1 - uses: webfactory/ssh-agent@v0.2.0 with: ssh-private-key: | ${{ secrets.BLOG_DEPLOY_KEY }} - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - name: Configuration environment run: | ssh-keyscan -p 22833 xiaozhou.net >> ~/.ssh/known_hosts - name: Install dependencies run: | npm i -g hexo-cli npm i - name: Deploy hexo run: | hexo g -d 构建过程中有几个要点: 构建环境基于Ubuntu,并使用node 10.x 构建中用到了webfactory/ssh-agent用来缓存部署blog所用到的私钥 每次构建触发的时候,先初始化基于node 10.x的环境 扫描目标VPS的公钥,并保存到虚拟环境的~/.ssh/known_hosts中,这样可以避免部署时候要求用户输入确认的步骤。 构建前先初始化好hexo的环境,并安装所有依赖 最后,进行静态页面的构建并直接发布 一切准备就绪,为了测试blog的自动构建和发布,可以尝试新建或者修改一篇blog post,然后在仓库的Actions中,就能看到自动触发的构建流程了。

2020/6/8
articleCard.readMore

高性价比德国VPS服务商Contabo VPS评测

Contabo是欧洲的老牌服务商,成立于2003年,如今已经有17年历史。Contabo提供的VPS和独立服务器,有着性价比高和质量稳定的美誉。今天主要给大家介绍Contabo家的VPS系列套餐。如果你想寻找一个欧洲的VPS,并且有很高的配置和稳定的性能,那Contabo的VPS你一定不能错过。 Contabo提供的VPS套餐分为两种:SSD和HDD混合系统,另外一种就是纯SSD系统。在硬件配置上,Contabo一点都不吝啬,光是配置表看下来,你就能心动一回了。 VPS套餐配置 需要注意的是: Contabo的VPS第一次购买,需要安装费,安装费只需要付一次,后面续费就没有安装费了。安装费用为月付4.99欧,季付3.99欧,半年付的话就是2.49欧。一次性购买年付套餐,没有安装费。 整体来说,SSD和HDD混合VPS,性价比最高的一款机型是: 机型: VPS 300 CPU: 2核 内存: 4GB 硬盘: 300GB 带宽: 100Mbps 流量:无限流量 IPv4: 1个 价格/月: 3.99欧元 点击购买 接着是100%纯SSD配置: CPU内存硬盘带宽流量IPv4价格/月购买链接 4核8GB200GB200Mbps无限流量1个4.99欧购买链接 6核16GB400GB400Mbps无限流量1个8.99欧购买链接 8核30GB800GB600Mbps无限流量1个14.99欧购买链接 10核60GB1600GB1Gbps无限流量1个26.99欧购买链接 这种配置和价格,实话说,在其他国外的服务商那里还很少看到,多核CPU+大内存+大硬盘,绝对是亮点! VPS测试 本次测试款为纯SSD的机型,月付4.99欧,4核8G内存,200GB SSD硬盘。 配置信息 Benchmark 这里看来速度并不是很高,但是可以给客服发邮件,要求提速SSD的读写性能,经过邮件沟通后,SSD读写速度顺利提速到500MB+/s,不错不错! IP信息 此机型位于德国纽伦堡机房 电信路由测试 联通线路测试 移动线路测试 多地Ping测试 购买建议 Contabo的VPS性价比不错,用少于其他主机商套餐的价格,就能买到相当不错的配置。无限流量和大硬盘都是亮点。不过机器位于德国,国内访问并不是很快,当然比不上CN2和CN2 GIA线路。用来做站的话可以搭配CloudFlare CDN使用。另外,用来作为自己的云端网盘和下载机器也是很不错的。站长已经把这台机器配置为我的云端开发环境,多核CPU和大内存,用来远程编译程序和构建Docker镜像,很是方便,能让我本机减少不少的运行负担。 另外,Contabo并不支持国内支付宝和微信,但是支持Paypal支付也是很方便的。

2020/5/12
articleCard.readMore