{ "version": "https://jsonfeed.org/version/1", "title": "琼台博客", "home_page_url": "https://www.qttc.net", "feed_url": "https://www.qttc.net/feed.json", "description": "Hi,这是一个专注编程技术的个人日志,从事研发13+年,这里记录工作学习中遇到的技术问题与解决方式", "icon": "https://www.qttc.net/images/logo.png", "author": { "name": "Nicholas Lee", "url": "https://www.qttc.net/about.html" }, "items": [ { "id": "https://www.qttc.net/561-my-kids-hobbies.html", "content_html": "
\n这应该称得上他俩这个时期爱好的标签了,只要有任何机会就要坐电梯,无论是扶梯还是直梯,他还会仔细观察电梯有多宽,有什么按钮,应急按钮是干什么的,还误按了几次应急按钮(实在是防不住)
\n家附近有一个商场,他俩开始学会走路后,那会正直疫情封控,能去的地方非常少,于是夏天就喜欢带他俩去商场里溜达。
\n只要一进商场,路线就已经给你规划好了,拉着你坐各式各样的扶梯,只要他能看见的,基本都要坐。那个时期我比较痛苦,因为他俩胆子还小,走路要抱着我的腿,两个小孩一人抱一腿,他俩的头正好顶我的屁股上,我走路就跟企鹅一样,时间长了非常累。一开始我以为这是小孩有什么特殊的原因,后来也就慢慢理解了,喜欢坐电梯的小孩还挺多的。
\nB站上有一个Ball smulation的号专门发一些3D软件渲染出来的小球在电梯上滚动的视频,我自从给他俩看过之后,一发不可收拾,动不动就要看小球电梯。我当时也很奇怪,为什么它的小球就配扶梯不配别的?但它的播放量很高,应该有不少宝妈应该也遇到了我家宝宝同样的需求,要看小球电梯。
\n由于早期疏忽加上正直碰上疫情开始,我家宝宝出生之后,家里没有老人、育儿嫂、保姆,家里只有两个住保温箱刚出阿里的低体重宝宝和一个刚经过剖腹产的老婆,我们也没有特意在语言方面给足够多的输入,导致他俩的语言发育比较迟缓,后来意识到这个问题之后就开始有意的不让他俩看这种抽象类的视频,因为给他俩看这类视频没有语言输入,对他俩不太有利。
\n经过2年,目前已经基本不在给他看这类只有背景音乐的视频。
\n这个是我家大宝的最爱,他非常喜欢去地下车库,而且也非常期待去不同的商场的地下车库。老二倒没有这么执着,但多数情况下因为要满足老大的需求,老二也被迫去了好多不同地方的地下车库。
\n大宝的这个爱好确实给我们带来不少麻烦,无论去到哪,都要求停地下车库,无法商量,初期的时候也只能强哄。但由于大宝的语言理解里比较迟缓,非常不好通过三言两语就能哄好。还好后期他的语言能力逐渐提升,只要提前沟通,也基本没问题。
\n后来我发现大宝不是只喜欢地上车库,他也喜欢楼顶车库,只不过他之前没有见过,无法提这个要求。我家附近有个商场,楼顶是停车的,自从有一回带他俩开车上楼顶之后,下次再到那个地方时,大宝就会强烈要求你停楼顶,要是不顺从他就得费好大劲才能把他哄好,他会有一些预期很条件反射,上次来这里是停楼顶,这次来也应该停楼顶。后来我在儿童心理学上也看到了对这一现象的解释,心里也就没有那么焦虑了。
\n这个爱好虽然两个宝宝都喜欢,但大宝更猛烈一些。我和宝妈说他俩既然这么想坐地铁,就带他坐坐吧,反正我们常去的那家商场内可以直达地铁坐两站到下个商圈。
\n自从有了那一次之后,每个周末大宝会要求到商场,只要一进停车场,后续的路线基本上就被大宝安排的清清楚楚
\n坐扶梯 > 走旋转门 > 过地铁安检 > 坐地铁 > 出地铁 > 走到固定的寿司店 > 吃寿司(每次点的寿司都一样)> 坐电梯 > 坐地铁 > 回到原来的商场
\n以上流程我和宝妈还有小宝至少被大宝领着刷了不下5次,一开始我并不着急,想着小孩图新鲜就让他折腾吧,可是当他领着刷4、5次的时候我和宝妈有意识的认为不能让大宝这么下去了,我们需要做一些改变。
\n有一回我故意带大宝绕路,他找不到去寿司店的路才作罢,我跟宝妈真的不想每个周末都去吃寿司。
\n小孩一直喜欢的东西,突然有一天你跟他说你不能这样了,他是无法理解的,自然就会哭闹,连恐吓带哄骗好不容易把他这个固定的思维模式给改变了,现在即使再去到那家商场,即使跟大宝提前说咱们今天不坐地铁他也会接受,不会哭闹不停。
\n这个是处于相对较年幼的时期了,小区里每天固定的时间就会有垃圾车来收垃圾,疫情封控时,没有什么新鲜的事,每天垃圾车来了收垃圾时他俩会站在窗台上看。
\n让我觉得他俩这喜欢垃圾是有一会带着他俩出去,正值垃圾车进来收垃圾,离我们不远,那会他俩刚会走路,嚷嚷着要看。人家在工作,我凑近看了不合适,只好把一个骑脖子上,另外一个站在高处,看着垃圾车整个收垃圾的过程,连收垃圾的工人过来时都逗他俩。
\n想着小孩喜欢垃圾车,就给他俩买一个垃圾车模型玩具吧,他俩在那个时期玩了好长时间的垃圾车。
\n", "url": "https://www.qttc.net/561-my-kids-hobbies.html", "title": "小孩的兴趣爱好", "summary": "\n这应该称得上他俩这个时期爱好的标签了,只要有任何机会就要坐电梯,无论是扶梯还是直梯,他还会仔细观察电梯有多宽,有什么按钮,应急按钮是干什么的,还误按了几次应急按钮(实在是防不住)
\n家附近有一个商场,他俩开始学会走路后,那会正直疫情封控,能去的地方非常少,于是夏天就喜欢带他俩去商场里溜达。
\n只要一进商场,路线就已经给你规划好了,拉着你坐各式各样的扶梯,只要他能看见的,基本都要坐。那个时期我比较痛苦,因为他俩胆子还小,走路要抱着我的腿,两个小孩一人抱一腿,他俩的头正好顶我的屁股上,我走路就跟企鹅一样,时间长了非常累。一开始我以为这是小孩有什么特殊的原因,后来也就慢慢理解了,喜欢坐电梯的小孩还挺多的。
\n", "date_modified": "2024-03-01T00:00:00.000Z", "author": { "name": "Nicholas Lee", "url": "https://www.qttc.net/about.html" } }, { "id": "https://www.qttc.net/560-chinese-new-year.html", "content_html": "\n大环境差,公司刚经历一波裁员,我的团队也全部解散了。工作也没有之前那么忙了,正好也可以抽时间完成之前一直在计划但没有做的事
\n转眼,2024年已到来,两个宝宝也迎来了4岁生日!不少人回想过去通常会觉得很艰辛,的确,非常感谢我老婆无比艰辛的怀两个宝宝最后顺利出生。
\n我至今回想,整体上仍然觉得非常开心,虽然养育小孩会遇到很多琐碎的事,但整体上我觉得非常幸运,两个宝宝在剖腹产之后仅住了9天的保温箱后我们就接回家精心照料,健康成长,能吃能玩,在出生不足5斤到今天将近17kg,希望两个宝宝能一直健康快乐,愉快成长,拥有美好的童年回忆。
\n宝宝一直对双层巴士非常感兴趣,如今宝宝4岁了,还没有坐过双层巴士,于是决定大年初二趁人少带他体验一下。
\n一顿乱搜,误打误撞坐地铁到金台地铁站发现是9号双层巴士的起始站,很顺利的第一个上车坐到了第二层第一排的位置,两个小家伙全程东张西望,各种问题不断,激动坏了。双层巴士真的是高,视野的确不一样,如果大家有机会一定要坐第一排。
\n严格来说不算第一次,因为在宝宝8个月左右宝妈带着俩个宝宝坐高铁回外婆家,但宝宝有记忆、会说话以来没有带他俩坐过,于是就决定大年初三带他俩坐高铁去天津滨海。
\n坐地铁到北京南站经过安检到二层候车厅,大宝就等不及了,看见闸机门就要进。他实在太渴望了,没有去过高铁站,没有近距离观察过高铁,劝了好久才好不容易等到我们高铁班次开始检票,赶紧排队上高铁。上高铁后小家伙果然东瞧西看,激动坏了。小家伙很注意各种细节,就连中间经过的洗手间、洗手池全都要问一遍。
\n这个事并不在这个春节,但想到以上第一次坐高铁、双层巴士,就顺便记录一下宝宝坐地铁。由于宝宝出生时,正直疫情刚爆发,没有什么机会带他出去,开车带他俩经过地铁线路时会告诉他这是地铁,那会他俩就一直就期待要坐地铁。
\n2023年春节过后,宝宝已经满三岁,宝妈决定要带他俩去上一下托班,做为秋季上幼儿园之前的铺垫。
\n正好宝妈有一个朋友是在顺义做托班的,看着挺合适就去试试。听宝妈说宝宝第一次进地铁时非常开心激动,一路看个不停。
\n宝宝不知道什么时候开始带他俩出去玩之后,开始不愿意回家了,大年初四从天津做高铁回京,两个小家伙由于虽然很累了,但由于坐高铁比较激动,全程没睡。在北京南站换乘地铁后睡着了,在出地铁站后两个小家伙还在睡觉,当时已经晚上9点半,我让宝妈抱着他俩在地铁站门口坐着,我去开车。
\n大约10分钟后,我开车回到地铁站,发现两个宝宝在哭(事后问宝妈才知道大宝醒后发现是回家的路,就哭闹着会地铁站不愿意回家),我把小宝抱上车之后回来准备抱大宝上车,但大宝一直在哭闹不愿意上车。
\n我预感到不好办了,因为估计得要哄好一阵才能劝他上车,大宝瘫坐在地上哭闹,我蹲在他旁边一直在耐心哄着,但大宝实在是太想一直在外面玩,不愿意接受回家。我正无计可施的时候,旁边站着一位抽烟、戴着眼镜穿黑色衣服跟我年纪差不多的男人,突然走过来说对大宝说
\n“要不要跟我回家?”
\n大宝一看吓得不闹了,赶紧主动站起来要爬上车逃离这个地方,我抓紧顺势抱他坐上安全座椅,当我系好安全带准备回头感谢一下眼睛叔叔时发现他已走远了。眼镜叔叔的这一助攻让我非常顺利的把大宝哄回了家,甚至到小区下车后,还让我一直抱着担心眼镜叔叔来抓,我跟宝妈心里乐得不行。
\n宝宝目前语言发育有些迟缓,理解力还偏低。大年初九我下班回家两位宝宝在看着电视,电视里播着小仓鼠过各种机关的视频。
\n宝宝目前也正处于十万个为什么的阶段,在一个镜头为小仓鼠过独木桥,独木桥下面是显示屏模拟的毒液,此时小仓鼠正在谨慎的经过独木桥。此时大宝十万个为什么开启了
\n大宝:这是什么?
\n我:这是毒液,小仓鼠不能掉下去,掉下去就完蛋了。
\n大宝:完蛋里面有什么?(他理解完蛋为一种物品了)
\n我顿时语塞,无法解释。。。
\n不知道什么时候开始,小宝问问题总是 XXX弄啥?好多次我都无法回答
\n下面列举一些让我卡顿无法回答的例句
\n大环境差,公司刚经历一波裁员,我的团队也全部解散了。工作也没有之前那么忙了,正好也可以抽时间完成之前一直在计划但没有做的事
\n转眼,2024年已到来,两个宝宝也迎来了4岁生日!不少人回想过去通常会觉得很艰辛,的确,非常感谢我老婆无比艰辛的怀两个宝宝最后顺利出生。
\n", "date_modified": "2024-02-21T00:00:00.000Z", "author": { "name": "Nicholas Lee", "url": "https://www.qttc.net/about.html" } }, { "id": "https://www.qttc.net/559-happy-2024.html", "content_html": "2023~相信看到我这篇文章的大多数IT行业的朋友都受到了2023经济低迷的影响,降薪裁员一片哀嚎~,就连家底殷实的大厂也不例外。要说这个时期有没有逆势者可能大觉都共认华为了,一机难求,它给中国制造提振了不少信心,问界汽车一把做到龙头位置,其它当然还有芯片、国产系统产业都是逆势归来。人们在经历不幸时总会展望来年,我也不例外,经历了2023团队解散、降薪、业务线停滞等种种事之后自然就在思考2024会好起来吗?
\n时间飞快,7月团队解散,转眼就2024的元旦了。公司也并没有消停,经过2024年的市场预期,计算了一下现有的成本,发现还得继续裁员才能做到成本持平,这让我想起了前段时间我看的一本萨希尔·拉文吉亚写的《小而美》,作者一直努力想让自己公司变成独角兽,但是至少少数公司能成为独角兽,大多数公司能盈利就不错了,之前有过相关的创业数据称平均一家创业公司的存活周期是2年,也就差不多天使轮之后要么成要么黄。
\n现行阶段,相信对于绝大多数在这一波侥幸存活下来的公司估计只有一个目的,就是如何做到成本持平,持平意味着留存,意味着还有机会,因为一旦成本不能持平就要裁员~,债务严重的可能还要破产清算。过去那种靠融资壮大的战略就得要改变了,对于软件公司,最主要的就是人力成本,有多少钱养多少人。
\n2024这一年普遍预测相比2023不会有太多质的改变,目标仍然是存活、收入盖住成本不黄就是最佳解法。在人们普遍降低消费时,只要不是吃穿的必要消费都是可以砍掉不消费的,对于行业也同样,非核心行业一到经济危机时首当其冲最受冲击。
\n无论经济如何差,遇到多么大的挫折,该面对的还是要持续面对。
\n你无法改变任何事情、结果,唯独能做的就是让自己静下心来,保持生活的初心,不断完善自我,多读书、多学习、尽力做好一切事情,然后你会发现一切都会在变好。
\n", "url": "https://www.qttc.net/559-happy-2024.html", "title": "Welcome 2024", "summary": "2023~相信看到我这篇文章的大多数IT行业的朋友都受到了2023经济低迷的影响,降薪裁员一片哀嚎~,就连家底殷实的大厂也不例外。要说这个时期有没有逆势者可能大觉都共认华为了,一机难求,它给中国制造提振了不少信心,问界汽车一把做到龙头位置,其它当然还有芯片、国产系统产业都是逆势归来。人们在经历不幸时总会展望来年,我也不例外,经历了2023团队解散、降薪、业务线停滞等种种事之后自然就在思考2024会好起来吗?
\n时间飞快,7月团队解散,转眼就2024的元旦了。公司也并没有消停,经过2024年的市场预期,计算了一下现有的成本,发现还得继续裁员才能做到成本持平,这让我想起了前段时间我看的一本萨希尔·拉文吉亚写的《小而美》,作者一直努力想让自己公司变成独角兽,但是至少少数公司能成为独角兽,大多数公司能盈利就不错了,之前有过相关的创业数据称平均一家创业公司的存活周期是2年,也就差不多天使轮之后要么成要么黄。
\n", "date_modified": "2024-01-05T00:00:00.000Z", "author": { "name": "Nicholas Lee", "url": "https://www.qttc.net/about.html" } }, { "id": "https://www.qttc.net/558-clickhouse-export-ddl.html", "content_html": "今天需要把一个clickhouse的实例转移到另外一个实例,本来要使用clickhouse-backup工具,但最终总是导出metadata,没有包含实际数据,没办法只能放弃,使用脚本的方式导出建表语句,再导出CSV的数据。
\n然而在导出建表语句的时候,非常奇怪,在clickhouse CLI下总是看起来正常
\nSHOW CREATE TABLE analysis.spm_dictionary\n\nSHOW CREATE TABLE analysis.spm_dictionary\n\nQuery id: 0bd7cb9d-b92a-4625-9ca9-eb306ce77fd3\n\n┌─statement───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\n│ CREATE TABLE analysis.spm_dictionary\n(\n `spm_b` String,\n `name` String\n)\nENGINE = MergeTree\nORDER BY spm_b\nSETTINGS index_granularity = 8192 │\n└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\n\n1 row in set. Elapsed: 0.014 sec. \n
\n然而,在导出到sql文件时,总是转义了换行符,变成这样
\nclickhouse-client -m -q "SHOW CREATE TABLE analysis.spm_dictionary"\nCREATE TABLE analysis.spm_dictionary\\n(\\n `spm_b` String,\\n `name` String\\n)\\nENGINE = MergeTree\\nORDER BY spm_b\\nSETTINGS index_granularity = 8192\n
\n很明显,导出的SQL内容里转义了换行符"\\n",这自然在导入时无法使用,比较奇怪的是网上绝大多数的站点都是这么写的,难道它们的可以工作,我的就特殊了?
\n耗了将近一个小时,发现没有什么结果,只能看下官方文档,发现有一个--format
参数引起了我的注意,查看了一下发现有一个TabSeparatedRaw
映入我的眼帘,顿时欲哭无泪,赶紧试一下,结果显示正常了,问题解决
clickhouse-client -q "SHOW CREATE TABLE analysis.spm_dictionary" --format TabSeparatedRaw\nCREATE TABLE analysis.spm_dictionary\n(\n `spm_b` String,\n `name` String\n)\nENGINE = MergeTree\nORDER BY spm_b\nSETTINGS index_granularity = 8192\n
\n看来网上的绝大多数文章都抄袭,基本没有真正测试过
\n", "url": "https://www.qttc.net/558-clickhouse-export-ddl.html", "title": "clickhouse导出建表语句DDL换行符的问题", "summary": "今天需要把一个clickhouse的实例转移到另外一个实例,本来要使用clickhouse-backup工具,但最终总是导出metadata,没有包含实际数据,没办法只能放弃,使用脚本的方式导出建表语句,再导出CSV的数据。
\n然而在导出建表语句的时候,非常奇怪,在clickhouse CLI下总是看起来正常
\nSHOW CREATE TABLE analysis.spm_dictionary\n\nSHOW CREATE TABLE analysis.spm_dictionary\n\nQuery id: 0bd7cb9d-b92a-4625-9ca9-eb306ce77fd3\n\n┌─statement───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\n│ CREATE TABLE analysis.spm_dictionary\n(\n `spm_b` String,\n `name` String\n)\nENGINE = MergeTree\nORDER BY spm_b\nSETTINGS index_granularity = 8192 │\n└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\n\n1 row in set. Elapsed: 0.014 sec. \n
\n",
"date_modified": "2023-08-24T00:00:00.000Z",
"author": {
"name": "Nicholas Lee",
"url": "https://www.qttc.net/about.html"
}
},
{
"id": "https://www.qttc.net/557-tar-cannot-change-ownership.html",
"content_html": "前两天在解压一个tar包时提示
\n\n\nCannot change ownership to uid 1000, gid 1000: Permission denied
\n
第一次遇到这个问题,看这个错误感觉像是权限的问题,但我当前操作就是在root账号下,理论上root应该拥有一切权限,而我这次操作跟以往不一样的地方是我在NFS下解压的。
\n我在本地磁盘下可以解压,在NFS下无法解压,难道我需要去修改NFS的文件系统?
\n后来在tar的帮助文档里看到了一个关键性配置项--no-same-owner
,这个配置项的意思是在解压时不用保持相同的Owner,我试了一下,错误解决~
tar xzf archive.tar.gz --no-same-owner -C /mnt/nfs\n
\n这是用了tar命令这么多年,首次用到这个选项~
\n", "url": "https://www.qttc.net/557-tar-cannot-change-ownership.html", "title": "tar解压错误Cannot change ownership to uid 1000, gid 1000 Permission denied", "summary": "前两天在解压一个tar包时提示
\n\n\nCannot change ownership to uid 1000, gid 1000: Permission denied
\n
第一次遇到这个问题,看这个错误感觉像是权限的问题,但我当前操作就是在root账号下,理论上root应该拥有一切权限,而我这次操作跟以往不一样的地方是我在NFS下解压的。
\n我在本地磁盘下可以解压,在NFS下无法解压,难道我需要去修改NFS的文件系统?
\n后来在tar的帮助文档里看到了一个关键性配置项--no-same-owner
,这个配置项的意思是在解压时不用保持相同的Owner,我试了一下,错误解决~
我有一个Rust项目,需要发送kafka消息,容器化运行。我使用的是Rust 1.70版本,kafka类库使用的是rdkafka,但最近遇到一个非常奇怪的问题,我发现在没有修改任何依赖与Carogo.lock的场景下重新构建出来的镜像竟然无法发送消息。到生产后一直报错
\nFailed to produce kafka message: Message production error: MessageTimedOut (Local: Message timed out)\n
\n根据经验,看到这个错误绝大部分人的直觉是kafka服务没有连上导致超时,有可能是kafka的IP、端口写错了,或者有防火墙的因素。然而在我这个场景里,一个月之前构建的容器却可以正常工作,它们的配置文件一模一样。
\n我还进一步发现我构建的容器可以在我本机工作,但放到k8s里就失败,于是我到rdkafka的repo下提交了一个issue Production error MessageTimedOut when upgrade from 0.31 to 0.33,标题之所以写标题从0.31升级到0.33出现这个问题是在最初升级时出现问题,当时我误以为是升级导致的,后来即使我把版本降级回到0.31,使用一个月之前构建可运行的代码重新构建一次发现也无法正常工作。
\n这就非常奇怪了,作者写了一个简单的例子https://github.com/davidblewett/timeout_test让我在我的环境里运行一下,我用这个例子构建出来的镜像竟然可以发送消息!!!
\n而我的源码和作者提供的源码差别仅仅是我的Cargo.toml下的依赖添加了其它我需要使用的依赖
\n[dependencies]\nredis = "0.23"\nserde = { version = "1.0", features = ["derive"] }\nserde_yaml = "0.9"\nserde_json = "1"\nenv_logger = "0.10"\nlog = "0.4"\nreqwest = { version = "0.11", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nhttp = "0.2"\ntokio-postgres = { version = "0.7", features = ["with-chrono-0_4"] }\nregex = "1.4"\nrand = "0.8"\nrdkafka = "0.31"\nanyhow = "1"\n
\n这个问题我已经耗了将近一天时间,各种方案都尝试过,但依旧没有解决。现在没有任何方向,估计是不太好解决了~,确实感受到了计算机的玄学~,截止目前我理解可能是我的依赖库里的某个底层依赖与rdkafka的依赖冲突了。
\n", "url": "https://www.qttc.net/556-curious-kafka-timeout.html", "title": "非常奇怪的Kafka发消息MessageTimeOut错误", "summary": "\n我有一个Rust项目,需要发送kafka消息,容器化运行。我使用的是Rust 1.70版本,kafka类库使用的是rdkafka,但最近遇到一个非常奇怪的问题,我发现在没有修改任何依赖与Carogo.lock的场景下重新构建出来的镜像竟然无法发送消息。到生产后一直报错
\nFailed to produce kafka message: Message production error: MessageTimedOut (Local: Message timed out)\n
\n",
"date_modified": "2023-08-03T00:00:00.000Z",
"author": {
"name": "Nicholas Lee",
"url": "https://www.qttc.net/about.html"
}
},
{
"id": "https://www.qttc.net/555-httpie-lost-54k-stars.html",
"content_html": "\n前两天逛httpie的Github仓库,发现README写了一段有意思的内容
\n\n\nWe lost 54k GitHub stars
\n
有点好奇,就点进去看了一下,总的来说这是发生在2022年因为一次误操作把仓库从public改到private导致Github系统把原仓库5.4万的stars清零的悲惨事件。
\n到现在有一年时间也不属于什么新鲜新闻了,甚至可能看到这篇文章的很多读者都已经知道了这件事,接下来我就摘抄文章里的一些有意思的片段
\n\n\nThe dialog should be more contextual and, paraphrasing again, it should say “You’re about to kill 55,000 people.” That would’ve certainly made me pause.
\n
在Github弹窗修改repo的visibility从public到private时,应该提示我这个操作我将会杀掉5万5千个人
\n\n\nSo I went back to the repo’s settings to flip the switch. But GitHub didn’t allow me to do that—for an entire half an hour.
\n
作者意识有问题了,于是他想切换repo的visibility从private到public,但Github在半小时内不允许它这么做,随后它解释了为什么Github为什么在半个小时内不允许他切换会public,因为Github此刻正在忙着删除httpie仓库的star星星
\nmysql > UPDATE repo_stargazers SET visibility-"private" WHERE\nrepo="httpie/httpie";\nQuery OK, 1 row affected (0.012 sec)\nmysql > DELETE FROM repo_stargazers WHERE repo="httpie/httpie"; Query OK, 54386 rows affected (28 min)\nmysql > DELETE FROM repo_watchers WHERE repo-"httpie/httpie";\nQuery OK, 1154 rows affected (4 sec)\n
\n\n\nGitHub obviously has backups. And it is indeed possible to undo the damage done by accidentally making a repo private. The GitHub team themselves accidentally made the GitHub Desktop app repo private once. And they restored everything for themselves within hours
\n
简单说就是Github是有备份数据的,他们完全可以恢复数据在个把小时内
\n\n\nSo the answer to the question is, unfortunately, the following: GitHub will restore a repo damaged by making it private. But only if it’s one of their own projects, not a community one. The latter gets a tweet, at best.
\n
他愿意付钱让Github团队帮他恢复,但Github团队说他们有更高优先级的事情拒绝了帮httpie恢复星星,为什么他觉得Github可以做到呢?是因为2020年GitHub桌面App的Repo也犯过同样的错误,然后他们的前CEO发推说
\n\n\nA developer mistakenly made the GitHub Desktop repo private this morning. Flipping it back doesn’t restore stars (and a few other things), so we are restoring from DB backup. That's all.
\n
但是Github团队备份数据只能恢复他们自己的项目,不是社区的项目。
\n吸取一些教训,作者给了UI/UX的建议
\n\n也给了数据库设计的例子,Soft-deletes(软删除),可以从30分钟的操作缩短到1秒以内,还能解决错误操作的迅速恢复
\nmysqI > UPDATE repo_stargazers SET visibility "private" WHERE\nrepo="httpie/httpie"; Query OK, 1 row affected (0.012 sec) mysq1 > UPDATE repo_stargazers SET _deleted-true WHERE repo-"httpie/\nhttpie"; Query OK, 54386 rows affected (0.85 sec) mysqi > UPDATE repo_watchers SET _deleted-true WHERE repo-"httpie/\nhttpie";\nQuery OK, 1154 rows affected (0.09 sec)\n
\n我猜作者几乎是哭着写这篇文章,同时还很气愤,Github上如果你的项目星星很多要注意别误操作了~后果很严重
\n", "url": "https://www.qttc.net/555-httpie-lost-54k-stars.html", "title": "httpie的Github仓库丢失了5.4万收藏量", "summary": "\n前两天逛httpie的Github仓库,发现README写了一段有意思的内容
\n\n\nWe lost 54k GitHub stars
\n
有点好奇,就点进去看了一下,总的来说这是发生在2022年因为一次误操作把仓库从public改到private导致Github系统把原仓库5.4万的stars清零的悲惨事件。
\n到现在有一年时间也不属于什么新鲜新闻了,甚至可能看到这篇文章的很多读者都已经知道了这件事,接下来我就摘抄文章里的一些有意思的片段
\n", "date_modified": "2023-07-17T00:00:00.000Z", "author": { "name": "Nicholas Lee", "url": "https://www.qttc.net/about.html" } }, { "id": "https://www.qttc.net/554-kubeadm-rebuild-cluster-caveats.html", "content_html": "背景环境信息
\nkubeadm init初始化集群很顺利,按照教程配置.kube目录,拷贝配置文件,安装网络插件,部署nginx也能访\n问,但就是在启动Nginx时发现配置转发的集群内主机名找不到,这还是同一个Namespace下的。
\n初步判断可能是集群DNS问题,启动busybox进入命令行模式,看了一下/etc/resolv.conf没问题,直接ping其它pod IP发现ping不通,ping互联网IP发现也ping不通,这完全就是无网的状态啊~
\n这情况有点不对,一顿折腾之后问题解决,核心关键点就在于这三台虚机节点我曾经用kubeadm初始化过一个集群,但我在kubeadm reset时,没有根据提示完成最后关键遗留操作
\n执行下ipvsadm --clear,如果没有这个命令就apt install ipvsadm
安装一下
删除/etc/cni/net.d
这个目录
如果有$HOME/.kube
这个目录就删除,通常Worker节点都没有这个目录
清除iptables规则iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
,这个命令是用于配置Linux操作系统中的iptables防火墙规则:
iptables -F
: 这个命令用于清除所有的防火墙规则,包括所有的链(chains)中的规则。-F
选项表示"flush"(清除)规则。iptables -t nat -F
: 这个命令用于清除"nat"表中的规则,"nat"表用于网络地址转换(Network Address Translation,NAT)。-t nat
选项表示指定使用"nat"表。iptables -t mangle -F
: 这个命令用于清除"mangle"表中的规则,"mangle"表用于修改数据包的特定字段。-t mangle
选项表示指定使用"mangle"表。iptables -X
: 这个命令用于删除用户自定义的链(chains)。-X
选项表示删除链。通过这个命令组合,首先清除了所有防火墙规则,然后清除了"nat"表和"mangle"表中的规则,并最后删除了所有用户自定义的链。这样做可以将防火墙规则恢复到默认状态,以便重新配置规则。
\n经过以上4个关键步骤,再推荐一下重启一下节点,然后重新kubeadm init初始化集群,问题解决~
\n", "url": "https://www.qttc.net/554-kubeadm-rebuild-cluster-caveats.html", "title": "kubeadm重新构建k8s集群注意事项", "summary": "背景环境信息
\nkubeadm init初始化集群很顺利,按照教程配置.kube目录,拷贝配置文件,安装网络插件,部署nginx也能访\n问,但就是在启动Nginx时发现配置转发的集群内主机名找不到,这还是同一个Namespace下的。
\n初步判断可能是集群DNS问题,启动busybox进入命令行模式,看了一下/etc/resolv.conf没问题,直接ping其它pod IP发现ping不通,ping互联网IP发现也ping不通,这完全就是无网的状态啊~
\n", "date_modified": "2023-07-10T00:00:00.000Z", "author": { "name": "Nicholas Lee", "url": "https://www.qttc.net/about.html" } }, { "id": "https://www.qttc.net/553-configuration-cool-terminal-via-zsh-syntax-highlighting.html", "content_html": "如果你是一名程序员,那么配置一个语法高亮,支持在命令行显示时间、显示Git分支、推送拉取状态等等就显得非常有助于日常工作。
\n在Mac电脑上通常都是基于zsh配置,而如果你想懒省事的话,也有人家配好的profile,你直接用就好,它就是powerlevel10k。其中有一个功能我认为是比较常用的,就是当你敲入的命令存在系统的时候,它就会变成绿色,当你敲入一个命令系统中检测不存在时,就会变红色,这个校验可以让我们在执行前就能校验命令是否正确,极大提升工作效率,它也是zsh的一个插件,叫zsh-syntax-highlighting,点击链接到它的Github的主页提供了安装文档入口,支持很多包管理安装
\n支持的包管理安装
\n真要找不到,最后用Git克隆源码也能安装
\ngit clone https://github.com/zsh-users/zsh-syntax-highlighting.git\necho "source ${(q-)PWD}/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc\nsource ./zsh-syntax-highlighting/zsh-syntax-highlighting.zsh\n
\n你要是说你没有Git命令??那你不要当码农了~
\n我录了一期视频介绍我如何用它配置我的Terminal的
\n\n\n", "url": "https://www.qttc.net/553-configuration-cool-terminal-via-zsh-syntax-highlighting.html", "title": "用zsh-syntax-highlighting配置你的命令行语法高亮", "summary": "如果你是一名程序员,那么配置一个语法高亮,支持在命令行显示时间、显示Git分支、推送拉取状态等等就显得非常有助于日常工作。
\n在Mac电脑上通常都是基于zsh配置,而如果你想懒省事的话,也有人家配好的profile,你直接用就好,它就是powerlevel10k。其中有一个功能我认为是比较常用的,就是当你敲入的命令存在系统的时候,它就会变成绿色,当你敲入一个命令系统中检测不存在时,就会变红色,这个校验可以让我们在执行前就能校验命令是否正确,极大提升工作效率,它也是zsh的一个插件,叫zsh-syntax-highlighting,点击链接到它的Github的主页提供了安装文档入口,支持很多包管理安装
\n", "date_modified": "2023-07-08T00:00:00.000Z", "author": { "name": "Nicholas Lee", "url": "https://www.qttc.net/about.html" } }, { "id": "https://www.qttc.net/552-exmail-qq-lettre-valid.html", "content_html": "邮件发送这个在Rust中总是有点问题,之前用lettre低版本测试没问题,后来腾讯企业邮箱升级做了一些限制调整,我调了好长时间,终于调通了。
\nCargo.toml
\n[dependencies]\nlettre = "0.10"\n
\n目前lettre最新版本就是0.10版本了。
\nsample.rs
\nuse lettre::message::header::ContentType;\nuse lettre::transport::smtp::authentication::{Credentials, Mechanism};\nuse lettre::transport::smtp::client::{TlsParameters, Tls};\nuse lettre::{Message, SmtpTransport, Transport};\nuse log::{info, warn};\nuse crate::router;\n\nfn send_mail(to_addr: &str, subject: &str, body: String) -> anyhow::Result<()> {\n let email: Message = Message::builder()\n .from("Qttc <blog@qttc.net>".parse()?)\n .reply_to("Qttc <blog@qttc.net>".parse()?)\n .to(to_addr.parse()?)\n .subject(subject)\n .header(ContentType::TEXT_HTML)\n .body(body)?;\n\n let creds: Credentials = Credentials::new(\n "[Account]".to_string(),\n "[Password]".to_string(),\n );\n\n let smtp_host: &str = "smtp.exmail.qq.com";\n let tls_params: TlsParameters = TlsParameters::new("exmail.qq.com".to_string())?;\n let tls: Tls = Tls::Wrapper(tls_params);\n\n let mailer: SmtpTransport = SmtpTransport::relay(smtp_host)?\n .port(465)\n .credentials(creds)\n .authentication(vec![Mechanism::Login])\n .tls(tls)\n .build();\n\n match mailer.send(&email) {\n Ok(_) => info!("Email sent {} successfully!", &to_addr),\n Err(e) => warn!("Error sending email {} was error: {}", &to_addr, e),\n };\n\n Ok(())\n}\n
\n注意,Tls配置的域名是exmail.qq.com
,不是smtp.exmail.qq.com
。另外,tls()
方法要求构建的Tls参数不支持异步的AsyncSmtpTransport
\n\npub fn tls(self, tls: Tls) -> Self\nAvailable on crate features native-tls or rustls-tls or boring-tls only.
\n
所以这里只能使用同步的SmtpTransport
,那些想尝试异步的就不要徒劳了。
邮件发送这个在Rust中总是有点问题,之前用lettre低版本测试没问题,后来腾讯企业邮箱升级做了一些限制调整,我调了好长时间,终于调通了。
\nCargo.toml
\n[dependencies]\nlettre = "0.10"\n
\n目前lettre最新版本就是0.10版本了。
\nsample.rs
\nuse lettre::message::header::ContentType;\nuse lettre::transport::smtp::authentication::{Credentials, Mechanism};\nuse lettre::transport::smtp::client::{TlsParameters, Tls};\nuse lettre::{Message, SmtpTransport, Transport};\nuse log::{info, warn};\nuse crate::router;\n\nfn send_mail(to_addr: &str, subject: &str, body: String) -> anyhow::Result<()> {\n let email: Message = Message::builder()\n .from("Qttc <blog@qttc.net>".parse()?)\n .reply_to("Qttc <blog@qttc.net>".parse()?)\n .to(to_addr.parse()?)\n .subject(subject)\n .header(ContentType::TEXT_HTML)\n .body(body)?;\n\n let creds: Credentials = Credentials::new(\n "[Account]".to_string(),\n "[Password]".to_string(),\n );\n\n let smtp_host: &str = "smtp.exmail.qq.com";\n let tls_params: TlsParameters = TlsParameters::new("exmail.qq.com".to_string())?;\n let tls: Tls = Tls::Wrapper(tls_params);\n\n let mailer: SmtpTransport = SmtpTransport::relay(smtp_host)?\n .port(465)\n .credentials(creds)\n .authentication(vec![Mechanism::Login])\n .tls(tls)\n .build();\n\n match mailer.send(&email) {\n Ok(_) => info!("Email sent {} successfully!", &to_addr),\n Err(e) => warn!("Error sending email {} was error: {}", &to_addr, e),\n };\n\n Ok(())\n}\n
\n",
"date_modified": "2023-07-03T00:00:00.000Z",
"author": {
"name": "Nicholas Lee",
"url": "https://www.qttc.net/about.html"
}
}
]
}