桃子的碎碎念

陪她去流浪 新建

续:各位关心我的、没关心我的朋友们,又是好久不见,我还活着

刚才埃及回来什么也没干躺了两天就直奔东北去野了半个🈷️,仿佛是今天才结束假期……

是的,今天我又双叒叕回来深圳了……🥵

这应该是我见过的最豪华的飞机屏幕了吧?

  • 可以取下来;
  • 可以玩游戏;
  • 有键盘;
  • 可以刷信用卡💳!

但是,为什么你要把 Player 翻译成 播放机?一点儿都不专业。

拍摄于从埃及回中国的途中。

#开罗 #广州 #四川航空 #草台班子

各位关心我的、没关心我的朋友们,好久不见,我还活着……[狗头]

#埃及 玩了一个月,不亦乐乎,博客也完全没有经营……

但是今天为什么想起发一条碎碎念?因为我手机坏了[狗头]……只得玩电脑(?)。

我在 #马特鲁 玩海的时候,又一次1把手机泡水了,在我明确知道手机被拆过、不能防水的情况下……现象是:面容ID坏掉了、屏幕完全失灵……😭。

好害怕,我的资料不会全部毁了吧?我的相册不会全没了吧?我不会在埃及孤立无援吧?不会吧不会吧?😭😭😭。求求了,一定要坚持到新手机发布!

2024-9-11 23:33:09

手机已经好几天不能开机,我快崩溃了……

2024-10-6 20:20:49

手机修好了,但是有点不开心。

去年刚拿驾照时租油车加了省加油费在加油站办了张广发的信用卡(第一次确实省了很多钱),结果最近一年的消费不足以抵扣收费,被扣两百块……

IMG_1360.avif

什么无妄之灾啊!一气之下决定注销……结果刚接通,对方竟然猜准了我的来意,直接问我是不是“因为年费原因才要注销”[捂脸],哈哈哈。如果继续注销的话,年费肯定省不了了。所以我选择了不注销,但是要在接下来一个月消费满 6 笔 / 或者金额数达标(几百块),然后就退回年费。

早知道就不办这玩意儿,为了省几十块钱,每年都要恶心我一下……我一直用的招行信用卡,我记得招行是不要年费的啊!

#信用卡

在别人的提醒下,办了一张国际驾照🪪,可以到国外租个车玩玩儿了!

原来驾照可以这样用的、原来这玩意儿就是个翻译件?[捂脸][捂脸][捂脸],花了我 ~¥100 😢……

IMG_1358.avif IMG_1359.avif

#驾照

连飞个无人机也要强制登录了,到山顶才发现……

被限高 30 米、限远 50 米。 我就这样拿着遥控器,从山顶到山腰、转了一大圈、花了一个小时才找到一丝信号连上网接收到验证码,周围的安卓手机也没有信号。感觉自己是个智障一样。

  • 大国人引以为豪的大基建呢?
  • 大疆这么大一企业就从来没有想过离线验证?

感觉生活在这个国家,总是被各种莫名其妙的东西戏耍。

IMG_1254.avif

#草台班子 #大疆无人机

2024-8-5 12:12:39

截屏 2024-08-05 12.11.08.avif

大疆售后牛逼!

经常一天能接到很多陌生电话。没耐心的话,就不接;有耐心地话,等我手输手机号在微信里面“添加朋友”看看其到底是个什么“昵称”后再决定要不要接、还是拉黑。

所以,我有一个最终想法,如果“来电功能”能以某种程度和“微信”合作一下,显示“来电者”的名字该有多好。 之所以这是一个最终想法,是考虑到隐私泄漏:不可能来一个电话就向微信查询一下。应该是像苹果早几年的“归属地显示”功能一样:是先由提供方预置一个归属地数据库给苹果使用,苹果自己在本地去查询,完全不与提供方再有后续的交互。

有些电话,若接吧,我又不是它的潜在客户,浪费你我大家的时间;不接吧,又怕错过可能有用的电话。难搞。

还挺神奇的,下面3️⃣个电话,几乎是每个小时打一次,不能说毫无关联吧?

IMG_1215.avif

#想法

2024-8-5 10:20:37

电话打进来的时候,只显示“中国 大陆”;点进去的时候,显示的是“中国 广东 广州” ➕ 备用流量卡的信息。

有这个必要吗,产品体验非得做得如此割裂?作为一张只用来上网的卡,我完全可以自信地拒绝任何电话📞——如果你在电话打进来的时候就显示给我看。

看来没有乔布斯的苹果已经不知道怎么做手机了。

IMG_1303.avif

#教你做产品 #不要浪费我的时间

博客又被 209.141.34.4 这个死妈的垃圾攻击了,这次就准备长期放家里了,不折腾 VPS 了,随便你咋打我。

你一定很开心我这样咒你全家吧?

  • 头像服务还是用的 gravatar,发现家里访问不了,所以得重写一下头像缓存服务。
2024-8-1 05:04:39

才发现 Cloudflare 把我的 ETag 头部去掉了,导致文章总是返回 200 🥵🥵🥵……

2024-8-1 05:35:19

Cloudflare 的 Argo Tunnel 不支持 GRPC 转发(nginx 中的 grpc_pass),所以基于 GRPC 的服务全部挂了:

  • 电脑上的后台备份进程可以通过直连内网解决
  • 但是手机客户端暂时无解
2024-8-7 10:22:06
  • 由于 Cloudflare 的 GRPC 问题未解决,备份服务没法走域名,先使用内网地址
  • 支持 Upgrade 拨号器转发 GRPC 请求

点了这么多回 #肯德基🍟 外卖,第一次遇到不要配送费的[捂脸],以前都是 9 块、6 块……吃不起吃不起……

IMG_0994.avif

要是每次都有“满30配送减6”多好啊,哪次没有超过30?

和朋友一起去看了电影《抓娃娃》。

作为一个土生土长的农村孩子,我对这部片没有太多评价,搞笑片算不上,对我来说有点童年阴影。 中国的父母——特别是农村家庭的——爱孩子的方式很多都是:没苦硬吃,还说是“为你好”。当然,中国的社会整体价值观都偏向于歌颂苦难。有一句话是怎么说的来着?“祝歌颂苦难的人天天都有苦头吃。”

片尾,父母认为“大号练废了”(原话),需要给孩子惊喜:一个弟弟或妹妹。我不太了解导演到底是想表达什么,或者是这样更符合主旋律? 咋的,敢情说孩子就是父母来拿练手的?练废了就重开?什么弱智行为。放过他人,也放过自己。

IMG_0990.avif

对于“小孩儿要穷养”这件事,我还是比较有发言权的,因为我自己勉强就算得上是一个被穷养长大的孩子。 依稀记得上初中那会儿(2007年左右),我表弟借宿我家,和我上同一个初中,初三住校。他一周的生活费是 50 元,而我,只有 15 元。 平均一天 3 元,要知道,中午的荤菜是 2.5 元,晚餐的米线是 1.5 元;所以我经常食不果腹。但是我知道,父母肯定拿得出更多的钱至少让我吃饱、不饿着。只是不知道他们从哪里听说了一些“歪门邪道”的东西:孩子要穷养、要多吃苦……才会体会到生活的不易、才会更努力。 小时候我可能认为这样观念正确,但是很显然长大后的我不认同这种东西。但是我也不怪他们,毕竟他们本身也没有什么文化,没有自己的思想,容易被控制。

没苦硬吃容易让人从小自卑,是的,我从小就自卑。也不知道是不是因为从小经常饿肚子的原因,我个子很小(裸身高 163cm),严重拖了后腿。不像现在的 00 后,普遍 170+。年初相亲的 00 后,就是 170+,没有哪个妹子愿意接受比自己矮很多的吧?所以,这事儿,它没成,不能说完全无关。

IMG_1219.avif

#电影

把以前写的脚本语言服务端部分重新编写并编译成 #WASM 后迁移到了 GitHub Pages。六年多没有更新了(短期内没有再更新的打算),少点儿服务器运维;域名 https://tao.twofei.com 作废了

People die, but long live GitHub.

  1. https://laike9m.com/blog/people-die-but-long-live-github,122/
  2. https://github.com/yihong0618/gitblog
  3. https://josephcz.xyz/log/talk-about-github/
2024-8-1 20:58:19

尝试把域名也通过 Cloudflare 转发,发现不管是“DNS HTTPS 记录”还是“DNS URI 记录”都无效,然后试了试“Page Rules”:

1
2
tao.twofei.com/*
Forwarding URL (Status Code: 301 - Permanent Redirect, Url: https://movsb.github.io/taolang/)

也不生效,再仔细看了 Page Rules 的文档,说是必须先要添加一条对应的 DNS 记录 😅,神经兮兮的……没添加、不报错、不生效……这种体验是人做的吗?

特别注意,添加 A 记录的时候要添加特殊的值,见文档里面:

Page Rules require proxied DNS records

Page Rules require a proxied DNS record for your page rule to work. Page Rules will not apply to hostnames that do not exist in DNS or are not being directed to Cloudflare.

Depending on the record type, you can use different values for the target as a placeholder. Either one of these achieves the same outcome and you only need to create one:

1
2
3
www.example.com  A      192.0.2.1
www.example.com  AAAA   2001:DB8::1
www.example.com  CNAME  domain.example

Cloudflare recommends only using reserved IP addresses or domain names to avoid sending traffic to foreign infrastructure.

添加(且代理)后解决了,现在 https://tao.twofei.com 永久重定向到了 https://movsb.github.io/taolang/

2024-8-5 02:15:33

时不时就要兴起一股写编译器的风: https://twitter.com/Manjusaka_Lee/status/1815378850328789133

前同事一直叫我去 #长沙 耍、发展、定居……盛情难却!

去了才知道,长沙这天气比深圳还热还闷🔥。 待了一周多,几乎一直在家里😂😂😂…… 好在是新家,其他家人及小孩全都不在这边儿~ 也几乎没出去玩儿,整天就是到处吃吃喝喝,专职司机接送上、下班🥵…… 认识了五、六个新朋友……

没有时间顺序的随意生活记录📝。


说来奇怪,两个从虾皮离职的湖南同事,都去了长沙的蚂蚁🐜……虽然听说是外包,但是是全资子公司?🥵

IMG_0858.avif

刚好周末,陪他们一家人带小孩子爬了 #岳麓山,噢不——是全程走公路上去的,没有登山道。

IMG_0868.avif IMG_0869.avif

虽然去过几次了,但是还是去 #文和友 硬凑了个热闹,感觉拍得挺好看的一张照片,原图直出。文和友多了一架钢琴🎹,可惜我好久没练琴,弹了一小段王菲的《如愿》,手就不听使唤了🥵……装逼失败☹️。

IMG_0878.avif

在家里体验了一下 VR,看了几部电影🎥,非常非常“身临其境”🥵🥵🥵……

IMG_0866.avif

恰好有要好的大学同学在字节跳动的 PICO 项目组,随便问了几句……

IMG_0986.avif

快看,下面👇这个外型、配色好像二狗!

IMG_0860.avif

超大的实习,“贵手”,每天都很堵的西二环……

IMG_0900.avif

以及灯💡红🔴酒🍷绿🟢的玉兰路……

IMG_0903.avif

环境优雅、停车难的“湘水谣”:

IMG_0928.avif

超级好吃的椰汁🥥奶冻(四季缤纷椰子鸡.梅溪湖步步高店):

IMG_0910.avif

以及——公司楼下一前一后的两家好吃的早餐店:超人气、非常便宜、马子(臊子)种类自助且超多的“带杏干面馆” & 还不错的女同事推荐的“谭记粉馆”。 老板说看你小伙子瘦骨嶙峋的,肯定吃不了老长沙扣肉……我全吃完了……🥵


返程:753km;高速费用:¥386;时间:12小时(暴雨⛈️、堵车1小时➕充电3小时,下午4点出发、凌晨4点到)。

高速趣事:在刚出龙山服务区(广连高速广州方向)的时候,遇到一辆比我还快的小车🚗(一般比较少见,哈哈哈……),在长途驾车无聊➕没有人超我车➕夜间行车的情况下,我竟然提速追上了他,走到前面又放慢车速,然后又被他超过,他又被我超过……😂😂😂 就这样反反复复,我超他、他超我,前前后后共同行驶了大概有 50km,最终在广深沿江高速的时候“分道扬镳”,他去广州(猜测)、我去深圳。噢,忘了说,他的车牌是 粤J﹒736AA(广东省江门市)。第一次在高速上这样玩儿,感觉好有意思,让无聊的旅途也变得有意思了!


同事、朋友都说长沙作为主力发展旅游的城市,对外地车非常友好:交警尽量不处罚外地车辆的违规😂😂😂。不像深圳,逮住就往死了罚,不愧对作为打工城市的称号。


#长沙 #高速公路 #文和友 #岳麓山

#橘子洲头 没有去。

#茶颜悦色 没有喝,喝的霸王茶姬(同事老婆买的,长沙本地人),奇怪不奇怪?🤔 茶颜悦色不火了?

#长沙 玩了一周多,一天都没有写代码。刚回来又想写代码了……🥵🥵🥵

记得之前有人问我华为问界的英语名字“AITO”是什么意思,以下应该算得上是官方回答……

Adding Intelligence to Auto.

IMG_0939.avif

“华为好、华为美,华为给我增智慧……”[狗头][狗头][狗头]

#英语 #问界

从去年买车到现在一年时间内,折腾了各种商业充电桩,浪费了大量时间与国内的交互师作斗争(注册、充值、扫码、下 App、实名认证、退款、提现……),终于在长沙发现了“e充电”的“即插即充”功能:插上去后一键开充,自动从微信扣款……国家电网牛逼🥵🥵🥵! 其它的垃圾交互全部去死吧!

IMG_0938.avif

终于把这张从第一天上高速就贴上去的、来自深圳交警的、质量超好的实习贴给换新了!

这一年经历了数不清的风吹雨打、它就是不会掉!相比我姐在重庆交警那里获得的实习贴,质量好十倍!

等等,我不是驾照已经满一年了吗?为什么还要贴实习贴?😏😏😏

IMG_0839.avif IMG_0838.avif

#扮猪吃老虎 #深圳 #重庆

看了《NGINX 配置避免 IP 访问时证书暴露域名》,了解到:

  1. 虽然类似 Cloudflare 虽然这种可以隐藏真实 IP……;
  2. 通过 IP 访问可以通过在 ClientHello 里面通过证书确定对应的域名;
  3. Censys 在全网范围内通过访问所有 IP 来找对应的域名;

看来 ssl_reject_handshake 必须得开了。

我怕不是有精神病,为什么看无糖可乐像黑丝?🥵🥵🥵🥵🥵

IMG_0832.avif

二狗的这张照片一定要保存起来:

20211128_17212793.avif

在一个含有 225 个 JPG 大图的目录内用 #FFMPEG 执行到 #AVIF 批量转换时……

截屏2024-07-17 13.09.52.avif

太爆炸💥了,我存储空间剩余不到 200G,内存总共 32G,这 659GB 是怎么冒出来的?🤔

自从把服务器搬到无限流量的机器上以抵御攻击后,QQ 邮件服务又失败了……要不是二狗说没收到通知,我还没留意到最近一周的邮件通知全部失败了。

具体现象是,美国的服务器连不上国内的 QQ 邮箱的 smtp 服务器,看起来是墙的双向屏蔽功能在起作用了,挺好的,主动脱轨,早日倒闭。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
root@localhost:~# ping smtp.qq.com
PING smtp.qq.com (43.129.255.54) 56(84) bytes of data.
64 bytes from 43.129.255.54: icmp_seq=1 ttl=50 time=201 ms
64 bytes from 43.129.255.54: icmp_seq=2 ttl=50 time=201 ms
^C
--- smtp.qq.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 200.505/200.544/200.584/0.039 ms

root@localhost:~# nc -v 43.129.255.54 465
nc: connect to 43.129.255.54 port 465 (tcp) failed: Connection timed out
2024-7-13 07:17:56

用了二狗推荐的 Zoho 邮件,感觉很不错。但是,我只发送成功过一封邮件,后续就再也连不上服务器了,已经发了工单问为什么。

1
2
3
4
5
6
7
8
root@localhost:~# ping smtp.zoho.com
PING smtp.zoho.com (136.143.190.56) 56(84) bytes of data.
^C
--- smtp.zoho.com ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3108ms

root@localhost:~# nc -v smtp.zoho.com 465
nc: connect to smtp.zoho.com (136.143.190.56) port 465 (tcp) failed: Connection timed out
2024-7-14 14:09:04

写了点代码,允许服务器从国内建连接,即:从国外翻回国内。我™️真的太难了🥺🥺🥺。

既然翻回了国内,所以二狗推荐 Zoho 也用不着了,又回到了 QQ 域名邮箱。

评论的邮件通知终于恢复了,哎。

  • 注册“远程拨号器”目前没有鉴权,考虑到只有 TLS 连接,缓缓再搞吧
  • 可以考虑把所有对外的请求通过远程拨号器发起,这样可以避免暴露服务器真实 IP 地址
2024-7-15 18:07:26

连 QQ 邮箱也发不了邮件了……放过我吧,真的不想折腾这玩意儿了……

1
2
3
4
5
6
7
Running tool: /opt/homebrew/bin/go test -timeout 30s -run ^Test$ github.com/movsb/taoblog/modules/mailer -v -count 1

=== RUN   Test
    /Users/tao/code/taoblog/modules/mailer/mail_test.go:18: 535 Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
--- FAIL: Test (0.15s)
FAIL
FAIL	github.com/movsb/taoblog/modules/mailer	0.405s
2024-7-15 19:03:37

注册了一个专用的 Gmail 账号,结果发现在服务器上 smtp.gmail.com 也访问不了……我这才意识到是服务器的问题!

mmp 🤬🤬🤬

2024-7-15 19:46:57

QQ 域名邮箱恢复了,可以继续使用了:

WechatIMG4767.avif

要知道,现在重新注册的话,至少要 ¥25/月,天价……

跟前同事聊天的时候,他看我一直闲着,说让我试试 Web3:

部分聊天记录.avif

直到我今天给他发了这张图😅😅😅:

#护照 补办拿到了!虽然错过了去东南亚、去埃及🇪🇬…… 再找机会!

IMG_0556.avif

然后跟一个大学同学聊了几句天,感觉有点儿聊不下去……😒

IMG_0564.avif

又看到别人推荐 #绝命毒师1 2,竟然还排第一。然后看了下自己的硬盘,三年前就下载好了🥵🥵🥵……

花了一晚上看完了第一季,好像没有特别来劲,感觉不如《漫长的季节》🥵🥵🥵。但是他们说要继续看,后面越看越好看。

剧集排行.avif

对应的中文名字3

编号 英文名 中文名 看过
1 Breaking Bad 绝命毒师
2 Game of Thrones 权力的游戏
3 Chernobyl 切尔诺贝利
4 The Sopranos 黑道家族
5 Band of Brothers 兄弟连
6 The Wire 火线
7 Better Call Saul 风骚律师
8 Stranger Things 怪奇物语
9 Sherlock 神探夏洛克
10 Peaky Blinders 浴血黑帮
11 The Twilight Zone 阴阳魔界
12 Fleabag 伦敦生活
13 Fargo 冰血暴
14 House 豪斯医生
15 Friends 老友记
16 Dark 暗黑(德国)
17 The Office 办公室
18 Succession 继承之战
19 Battlestar Galactica 太空堡垒卡拉狄加
20 Freaks and Geeks 怪胎与书呆
21 Mad Men 广告狂人
22 Narcos 毒枭
23 Mindhunter 心灵猎人
24 Mr. Robot 黑客军团
25 Black Mirror 黑镜
26 Heartstopper 心跳漏一拍
27 Severance 人生切割术
28 It's Always Sunny in Philadelphia 费城永远阳光灿烂
29 The Boys 黑袍纠察队
30 Seinfeld 宋飞传
31 Peep Show 窥视秀
32 The Last of Us 最后生还者
33 When They See Us 有色眼镜
34 The Mandalorian 曼达洛人
35 Lost 迷失
36 Line of Duty 重任在肩
37 Deadwood 朽木
38 Mare of Easttown 东城梦魇
39 Hannibal 汉尼拔
40 The Bear 熊家餐馆
41 Boardwalk Empire 大西洋帝国
42 Atlanta 亚特兰大
43 Vikings 维京传奇
44 Twin Peaks 双峰
45 The Shield 盾牌
46 Happy Valley 幸福谷
47 True Detective 真探
48 The Haunting of Hill House 鬼入侵
49 The Americans 美国谍梦
50 Justified 火线警探

一些观影记录📝

S02

看到了二狗的狗窝:(S02E01@15:33)

doghouse.avif

孕妇🤰也可以把车开得飞起,国内挺着大肚子感觉行走都很难的啊!难道又是体质差异?(S02E04@08:40)

虽然马上临产,但也可以找到一份好工作,家人也同意去上班。🥵 (S02E07@32:10)

哈哈哈,这摩托笑死我了:(S02E07@34:51)

Breaking.Bad.S02E07.BluRay.720p.x264.AC3-CnSCG-0001.avif

既然大家都在讨论说 Pinkman 用 ATM 爆了某人的头,但是为什么警方完全没有找过他做过调查?美国/墨西哥的法律好奇怪。

我发现很多电影中时常提到中国,什么中国菜、中国的经济,这部剧集也是……不明觉厉。 (S02E11@22:15)

杰西还是太年轻不成器啊,轻轻松松就对小女友和盘托出了!不由得想起了圣经中的一句话:Spare the rod, spoil the child. (S02E12@32:36)

Breaking.Bad.S02E12.BluRay.720p.x264.AC3-CnSCG-0001.avif

S03

在坐床头拿平板看完了第三集,啥也没有记录😅😅😅。

S04

S04E13(最后一集)把 Gus 炸裂那一段真精彩啊,走得非常体面。

慎点!血腥!

Walt 这下全身而退了?难道全剧不应该终于此吗,竟然还有一季!赶紧看看是怎么回事!

S05

看完了,感觉最后一季有点儿无聊呢🥵。

Breaking.Bad.S05E16.BluRay.720p.x264.AC3-CnSCG-0001.avif

不过,最后几分钟的重机枪扫射看着是真的爽🤪🤪🤪。

@yiqifacai 只有穷人,才会痴迷技术;只有笨人,才会想着先把事做好。
观察一下身边真正的有钱人,就会发现他们有一个共同的特点:“明明知道这个人不行,但是他不提醒、不指点不好为人师,即便是他的认知经验都超过了对方,他也不会给对方的提建议。
因为无论你是指点、说教,都是需要消耗能量,情商最低的行为就是不停的讲道理,智者戒口,愚者指点江山。能说服一个人的从来不是道理,而是南墙。能点醒一个人的从来不是说教,而是磨难。

噢,难怪我越来越穷了!

不小心写错了代码没加限制🚫,一下子启动了上千个子进程(Perl),瞬间把 CPU & Memory 干爆,要不是连上了图形化的 VNC 终端,我差点没辙……(才意识到 BuyVM 不像 HostDare,后者有拯救模式(Rescue Mode),没出问题时万事大吉,出问题了才知道谁是大哥)。

截图 2024-07-08 03.44.49.avif

截图 2024-07-08 03.45.14.avif

问题已经解决了,那我还要不要写容器的资源配额呢?(逃……)

奇奇怪怪🤔,北京的同学竟然突然发了一张我大学的书📖的照片给我,关键是,我已经完全忘记什么时候给过他这本书了。

b433f2619b34e13576ed021db2f9c1e0.avif

chat.avif

每次找数据库管理软件,就还是觉得 Adminer 顺手,除用 #Adminer 打开 #SQLite3 数据库外,因为它不允许无密码登录,每次都要折腾一下……😡😡😡

  1. Accessing a database without a password 推荐页面使用 login-password-less 这个插件方式;

  2. 这里生成你自己的密码,并替换上述插件的源代码如下:

    1
    2
    3
    4
    5
    6
    
    16,17c16,17
    < 	function __construct($password_hash) {
    < 		$this->password_hash = $password_hash;
    ---
    > 	function __construct() {
    > 		$this->password_hash = '$2y$10$0X0Fb9jejoSGWYjUzZzEh.Ck6riuMLm8z./tClCcQe.jEN68/DZ72';
    
  3. 覆盖掉原始插件代码:docker run -it --rm -v ./your.db:/your.db -v ./login-password-less.php:/var/www/html/plugins/login-password-less.php -p 8080:8080 -e ADMINER_PLUGINS='login-password-less' adminer

就行了,密码输入刚才上面第二步的密码,用户名留空,数据库输入映射的路径即可(绝对路径最好)。

感觉还是做个成品的镜像吧,感觉网上也挺多人搜索这个的,但是网上的方法明显偏复杂,不 Ad-Hoc 🙄:

  • 做个临时用的 Adminer for SQLite3 镜像

“阿米娜·阔伊姆@二代目”最近再度因为在 #推特 上发表了可能涉儿童色情相关的内容被封号,导致推上出现了一众高仿号(“阿米娜·阔伊姆@三代目”),搞得大家都无从分辨孰真孰假。好景不长,“阿米娜·阔伊姆@三代目”又被封号,现在又出现了一堆“阿米娜·阔伊姆@四代目”🤪……

阿米娜·阔伊姆.avif

我是想借这个话题讨论下如何简单证明自己曾经是某个帐户的持有者——一个不需要实名的方式。

方法非常类似于数字签名✍️:

  1. 生成一对公/私钥🔐;
  2. 用私钥签名自己的帐户名字;
  3. 将签名结果置于当前帐号的描述中;
  4. 帐号被封;
  5. 注册新的帐号;
  6. 用私钥再对新的帐号签名(步骤2、3);

验证方式:

由于签名中带有公钥,如果新、旧帐户的公钥相同,则一定是由相同的私钥签名的,从而证明新、旧帐户的持有者是同一人。

说明:

  1. 被签名的数据可以是任意的,只需要保证公钥一致。

蔡佩軒 Ariel Tsai【禮物】(Blessings) 4K MV 官方版

为什么觉得特别好听,听了一晚上……😂😂😂😂😂

#音乐

今天奇怪的一连串事件……

空调突然漏水,正好滴在我电脑💻上,然后,下方正好是插排🥵🥵🥵!

还好我怕灰尘太多,把 MacBook 用原装的袋子裹了一下,没想到有意外的收获。 早上躺在床上的时候听到滴滴的声音,明明感觉声音是来自空调内机……

然后发现,二狗和雨帆竟然在我的评论区写起了 HTML,见评论。 于是我就惊坐起,赶忙看看这几天又把哪里的代码改崩了😡😡😡……

然后又发现,那个古早时期玩 QQ 空间(暴露年龄了)留下的“跑马灯🐎”的滚动效果的单词 marquee 正好是“大帐篷”的意思……

然后我顺手就从旁边装鸡蛋🥚的箱子📦里面拿起一块泡沫,盖在了电脑上,给插排搭起了个“帐篷⛺️”:危险⚠️解除!

IMG_9970.avif

待办事项
  • 编写自定义的 robots / well-known 处理器,过滤机器人请求

非常郁闷,同事说明天中午一起吃饭订机票,该启动国际旅游计划了…… 但是,我突然发现我的 #护照 不见了,找了一个小时都找不到。打视频电话给妈妈让帮忙在农村老家找一找,看是不是过年落家里了,结果也没有找到……

2024-6-20 01:15:38

花了一晚上,做了个大扫除🧹,把出租屋翻了个底朝天,仍未得。

我真的会谢,这么多年,时常看见,从来没有带出过门,突然需要用到时就……消失得无影无踪 😭😭😭。

时常会接到深圳的莫名其妙的电话,也不知道是不是谁拾到了我的护照交公了,然后因为我不接陌生电话而错失……

哎😑,预约了明天的补办,失败了好几次。看造化吧。

2024-6-20 13:17:05

IMG_9925.avif

去补办了,哎呀,要等到 7️⃣🈷️1️⃣1️⃣ 号才能拿到,黄花菜都凉了……我错了🧎。

刚装的全新系统,一跑 docker-compose 就脚本报错,搞了好一阵才发现原来 #Docker 早就放弃 #Python 版本、而用 #Go 重写了。

所以,现在不再是:

1
apt install docker-compose

而是:

1
apt install docker-compose-v2

了。以前是用 docker-compose,现在是用 docker compose。难怪官方一直叫我这样用但是又一直报错:docker: 'compose' is not a docker command.……🙄

非常丝滑。哎,生命苦短,别用 Python。

如果有人想看看是什么错,可以点击展开。
 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
root@twofei:~/servers/taoblog# docker-compose up -d

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/docker/api/client.py", line 214, in _retrieve_server_version
    return self.version(api_version=False)["ApiVersion"]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/api/daemon.py", line 181, in version
    return self._result(self._get(url), json=True)
                        ^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/utils/decorators.py", line 46, in inner
    return f(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/api/client.py", line 237, in _get
    return self.get(url, **self._set_request_timeout(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 602, in get
    return self.request("GET", url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 486, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 791, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 497, in _make_request
    conn.request(
TypeError: HTTPConnection.request() got an unexpected keyword argument 'chunked'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/bin/docker-compose", line 33, in <module>
    sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main
    command_func()
  File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 200, in perform_command
    project = project_from_options('.', options)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 60, in project_from_options
    return get_project(
           ^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 152, in get_project
    client = get_client(
             ^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/docker_client.py", line 41, in get_client
    client = docker_client(
             ^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/docker_client.py", line 170, in docker_client
    client = APIClient(use_ssh_client=not use_paramiko_ssh, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/api/client.py", line 197, in __init__
    self._version = self._retrieve_server_version()
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/api/client.py", line 221, in _retrieve_server_version
    raise DockerException(
docker.errors.DockerException: Error while fetching server API version: HTTPConnection.request() got an unexpected keyword argument 'chunked'

我去,小火箭是怎么敢把 #NES 几十年的扩展名你都敢给我占了?😡😡😡

Xnip2024-06-14_17-52-01.avif

待办事项
  • 监控服务器的磁盘空间(几度要被打满了)(这里

还是很好听……

标题:おやすみ

专辑:Zwei!! Original Sound Track

作者:Falcom Sound Team jdk

00:00
摄于:2019年1月26日 星期六 23:48

#番茄花园 🍅,#复古

おやすみなさい。

啊啊啊,原来 position: sticky; 已经早就进入标准的 #CSS 了,而我的《CSS 定位 (Positioning)》这篇文章正好写于标准化的那一年前后……

从这个页面的表格上面学来的:https://exiftool.org/

2024-6-14 16:36:55

偷走了,可以在博客程序页面中的更新历史表格中看到效果。

2024-6-14 17:39:04
2024-6-14 22:13:48

维斯百科表格中关于 <table> 的使用的描述

Common attributes for columns, column groups and row groups

The MediaWiki syntax for tables currently offers no support for specifying common attributes for columns (with the HTML element ‎<col />), column groups (HTML element ‎<colgroup>‎</colgroup>) and row groups (HTML elements ‎<thead>‎</thead>, ‎<tbody>‎</tbody> and ‎<tfoot>‎</tfoot>). Those standard HTML elements are not accepted even in their HTML or XHTML syntax.

All the rows and cells (header or data) of the table are rendered within a single implicit row group (HTML element ‎<tbody>‎</tbody>) without any attributes or styles.### Common attributes for columns, column groups and row groups

The MediaWiki syntax for tables currently offers no support for specifying common attributes for columns (with the HTML element ‎<col />), column groups (HTML element ‎<colgroup>‎</colgroup>) and row groups (HTML elements ‎<thead>‎</thead>, ‎<tbody>‎</tbody> and ‎<tfoot>‎</tfoot>). Those standard HTML elements are not accepted even in their HTML or XHTML syntax.

All the rows and cells (header or data) of the table are rendered within a single implicit row group (HTML element ‎<tbody>‎</tbody>) without any attributes or styles.

2024-6-14 23:26:51

不要用 border-collapse: separate;,除非样式写得非常完美,否则带 rowspan 的 tr/td 的 border 会重复出现。不信试试?1

待办事项
  • 把用 outline 实现的 th 的 border 成文(border-collapse 的情况下);

#Grafana 设置单个面板的时间范围为昨天一整天:

很难理解,但是达到要求了。

把 Query Options 设置成:

  • Relative time:now/d
  • Time shift:1d/d

其中的 / 有特殊含义:

  • 对于开始时间:表示 round 到时间单位的开始;
  • 对于结束时间:表示 round 到时间单位的结束。

上面的ℹ️提示也非常秘:Relative time should be now-5m and 5m, or variables like $_relativeTime.
请问:你就一个框,你教我如何填两个值?

relative-time.avif

就连特意显示的时间范围的友好名也是错误的:

time-info.avif

这里明明该是:Yesterday。

把用 #Obsidian 管理维护的日记本仓库自动同步脚本停了,废弃 Obsidian 中……

说了好久了,用了几年,感觉越来越难用。

2024-6-11 10:57:21

把日记导入到博客中的代码写好了。

2024-6-11 12:36:05

全部导入了,编号范围:10831417,默认状态全部为“私密”。

我竟然写了这么多……

2024-8-5 01:42:20

哈哈哈,希望我放弃 #Obsidian 是正确的选择:

IMG_1274.avif

className 竟然可能不是普通 string……

className can also be an instance of SVGAnimatedString if the element is an SVGElement.
It is better to get/set the className of an element using Element.getAttribute and Element.setAttribute if you are dealing with SVG elements.
However, take into account that Element.getAttribute returns null instead of "" if the element has an empty class attribute.

意味着,没有 includes 方法1…… 太反直觉了,虽然我一直用 classList.contains

傻逼苹果,电源都给整出负数了,一天没用电脑,待机又把电耗空了,又睡死了……

neg.avif

#中山#珠海 一日游~ 没别的,同事去练练车。

带同事去了野狸岛——上次相亲妹子带我去的那个岛,终于吃上了妹子非常推荐的那家店的蛋挞(上次排队太久没等),好吃是非常好吃,但这也太腻了……🥵。

#七娘山 回来的路上,顺路送了一个一起下山的大哥。大哥人挺好的,下雨的时候还主动提出给我雨衣,我朋友下山非常慢,他还边走边等我们一起。到山脚公路上的时候,他说他要打车从七娘山回龙岗,我非常吃惊,毕竟这得有 60 多公里,还挺偏,不得一两百的打车🚖费?于是我就捎上了他,当然,他说要给我钱,我没要,大哥不要嫌弃我开飞车就好了。 #你是个好人

送毕,终于是想起了要去一个九年没见的老同学那里。大学的时候我们都是用 QQ,我连他的微信都没有,毕业后没了消息。我们都是来自同一个人工智能实验室,所以其实关系很好。他就在龙岗,巧的是,他的店就在大哥下车点 2 公里。

听另一个同学说他自己创业在 #深圳 开了一家 #火锅 🍲 店,想过去尝尝味道如何。作为小半个 #重庆 人,还得是重庆味道适合我。店在龙岗,因为他之前在比亚迪龙岗的工厂里面,后来遇疫情就辞职了,然后几乎是从零开始学做火锅,这让我非常震惊。我没有问他为何辞职,但我知道的是,比亚迪和在龙岗的华为一样,都是非常血汗的工厂,而和华为不一样的是,比亚迪的工资非常低。

今天可不是周末,但是几乎座无虚席…… 我刚走到门口,他就过来跟我握手,那一定是一眼就认出是我来了。当然,我也认出他来了,我们似乎都没有变。 他看起来完全不像是一个老板模样,还是学校时的穿着,学生模样。我那个同学跟我说:等他结账的时候,你就知道他是老板了。

我问他你这边怎么这么多妹子,是不是附近有什么学校🏫?他:深圳妹子本来就多……

我还没有结婚,他,也没有。

(打码好麻烦,不想打了。)

终于等到了不是下雨的一天,也终于去了 #七娘山 —— 一座应该算得是 #深圳 少有的我没爬过的山了。

越近山脚,就发现天气越来越开始恶化,尽管我一早就打电话问过今天是可以登山的,但是我仍然一度怀疑马上又要封山,害怕又白来一趟!虽然我觉得开车非常有乐趣,但是,我过来可是要 90 公里,这可不是闹着玩儿的!

一点儿都不风和日丽,几张非常普通的照片。 登顶的时候甚至飘起了小雨🌧️,感觉全身湿了个大半。 而且上面完全是白茫茫的一片,被雾气🌁笼罩着,几乎没有能见度。 本来也带上了无人机,但是发现毫无用处。(最后一张是山顶。)

这座山有个非常神奇的特点: 虽然登山的路上经常可以看到多条支路,但是,最终它们都会在前面几十米处殊途同归。我一开始会犹豫怎么走,但是经历过几次后发现:怎么一回头就发现隔壁还有一条路?然后就明白,并不是他们不愿意标路牌,因为真的不用🙂‍↔️。

山顶上竟然有“证书”可以拿?这应该是我第一张关于登山的证书。

山上的所谓的观景平台,其实是一个个凸起的小坑位,只有一条路进入,周边也非常隐秘。再加上我们是非周末去的,人非常少,感觉会是情侣幽会的绝佳之地😝。 我应该用无人机来拍的,可惜这天气让我懒得拿。

“🧑‍🧒‍🧒设施老旧,请勿聚集。”

同事终于把宝马提到手了,穷逼我也第一次开上了宝马……

笑死,同事吃午饭的时候跟我说:我跟 XXX 来这个店试驾了三次,今天提车带你来。 我说,你这不是渣男吗……🤣(澄清一下,他一直单身。)

体验再谈

我收回部分上次说的话,再谈谈我觉得的一些明显的优点与缺点:

优点:

  • 油门响应速度确实快,远比我租的 200 块一天的车好使,上次那个试驾车是个垃圾;
  • 外观非常漂亮,高端、大气、上档次。

缺点:

  • 车机非常鸡肋:
    • 蓝牙连接后切换困难,害得我手机关机后同事才重新连上;
    • 用不了百度地图,车机地图不适应;
    • CarPlay 响应很慢、手机发热严重、甚至会把音乐/语音给卡断。

哎,搞得好像是我提了一辆 #宝马 这么高兴一样,你咋发这么多图呢?

特写

真的很帅……

随拍

午餐

南山确实比光明有钱,至少……至少餐厅有工作人员,在光明的时候感觉全部是自助。

晚餐

“每天都值得庆祝🎉”,每天都要有 #仪式感。他们喝了点啤酒🍺,今天晚上这宝马,我是开定了。

一些沿途

感觉深圳最少不了的就是湖南菜,菜的花样多,名字也是…… 大湖南、大弗兰、大胡兰,一时间搞不清楚到底哪些是真、哪些是假……

以及……一些在今天这个日子有些奇奇怪怪/牛逼的车牌……

nginx 居然在我服务 panic 挂了的时候重新连接一次……神奇,一个请求收到两次连接。。。

“白头并非雪可替,相识已是上上签。” 这 #杨晚晚 这么懂我,怕不是有毒吧!🥵

没错,深圳又开始不停地下着雨了,计划一周的去 #七娘山 又泡汤了……只能宅家研究杨晚晚……啊不不不,是“研究”技术……🥵

白头并非雪可替,相识已是上上签.avif
白头并非雪可替,相识已是上上签.png

上面哪一张图更清晰?你猜哪张是原图? 上面是 #AVIF,下面是 #PNG

答案是:下面的 PNG 是原图。特地为了对比,所以没有删除。 AVIF 是用 ffmpeg 从 PNG 转换来的,因为 PNG 太大了(446KB),而 AVIF 只有 38KB,不足十分之一大小,神奇不神奇?看来这 AVIF 是不得不爱了!

另外,没想到这 AVIF 还有 “美颜/磨皮”效果?🤪

Go 里面这样可以实现一个允许可重复读、多次副本读的 io.Reader,还挺好玩的,感觉又在 #套娃……

 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
package main

import (
	"bytes"
	"io"
	"os"
	"strings"
)

// 基于内存实现的可重复读的 Reader。
func MemDupReader(r io.Reader) func() io.Reader {
	b := bytes.NewBuffer(nil)
	t := io.TeeReader(r, b)

	return func() io.Reader {
		br := bytes.NewReader(b.Bytes())
		return io.MultiReader(br, t)
	}
}

func main() {
	r := strings.NewReader("123\n")

	dup := MemDupReader(r)

	for i := 0; i < 10; i++ {
		io.Copy(os.Stdout, dup())
	}
}

结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
tests (main) → go run main.go
123
123
123
123
123
123
123
123
123
123

主要原理是:

  1. 通过 TeeReader 把从原始接口读出来的数据顺便写一份拷贝到内存 Buffer 里面(io.Writer);
  2. 然后下次读的时候,首先从内存读(io.Reader),然后继续从原始的数据读;
  3. 通过内存 BufferBytes() 重建一个 bytes.Reader 支持了 io.Seeker1

由于是在内存中缓存的,所以要小心数据不能太大。否则应该用文件实现缓冲(io.ReadWriteSeeker)。


  1. 奇怪为什么 bytes.Buffer 不支持 Seek? ^

《Using i.e. and e.g. correctly》1

The abbreviation “i.e.” stands for id est, which is Latin for “that is.”
The abbreviation “e.g.” stands for the Latin phrase exempli gratia, meaning “for example.”


哇,国外的正规引号的写法真的就是中文的引号!?

“
LEFT DOUBLE QUOTATION MARK
Unicode: U+201C,UTF-8: E2 80 9C

分号是这么用的:

All employees will receive the standard discount; i.e., 20 percent.

...we technically have created a compound sentence...
So we use a semicolon to join the two independent clauses.

#英语

用过 Unix-like 系统的人都知道以 “/” 开头的路径是绝对路径,但是不知道 Go 为什么要加一个奇怪的 URL.IsAbs() 函数, 这个函数只通过判断有没有协议头(Scheme)来确定是不是绝对路径……

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package main

import (
	"fmt"
	"net/url"
)

func main() {
	u1, _ := url.Parse("/1.txt")
	u2, _ := url.Parse("file:///1.txt")
	fmt.Println(u1.IsAbs(), u2.IsAbs())
}

你要这么搞的话,我感觉 Go 语言对我来说有点儿不受控了……

1
2
$ go run main.go
false true

就算对于前端来说,以 / 开头的也是绝对路径啊,以 https:// 开头这种难道不叫跨源吗?都可以叫作“不是同一个文件系统”了……

笑死,神经病一样,在 GitHub 上看故事1,这些烂用 GitHub 的人到底有没有公德心? #王思聪 #AVIF

又不回我是吧.jpg

特意贴这句话,是突地想起了前司的一位同组的女同事……之前经常相互发这个来着……🥵,差点遗忘,写下来,对抗遗忘。

为了防止我自己也忘记名字,我应该把名字记录在本文中,怎么做?

这是一条来自手机端 iOS App 的碎碎念!🍏🍎。 测试!

人生 #第二次 开发 iOS App!

当然,我并不是要开发一个完整的客户端,只是为了测试一下如何在 iOS 上使用 #GRPC#ProtocolBuffer,上手难易程度完全在预期范围内,感觉当初用 GRPC + ProtocolBuffer 重构 API 接口是非常正确的选择。

只是……接近两年没写 #SwiftUI 了,反倒是 UI 慢慢摸索了好久……

2024-6-2 09:18:11

(当然,图片不是来自手机端 🤪🤪🤪)。

2024-6-2 09:34:19

我一定是现学现用!感觉从来没有开过这么多的标签页!

#第一次 使用 #AVIF 图片格式,比 JPG/PNG 都小,甚至比 WebP 还小很多,后面有空再试试 #JpegXL

第一次总有些不愉快…… 是的,下面这张图好大,因为我代码的图片自动缩放功能不认识 AVIF 格式,晚点有空再修吧😇

tabs.avif

2024-6-2 23:51:10

暴力出奇迹:java - How to get image dimensions from an avif file? - Stack Overflow

LMt5R.jpg

2024-6-3 07:43:51

#AVIF 图片大小修好了,就不会有我搞不定的事!

2024-6-14 18:01:58

找了半天的图片转文字(OCR),要么是收费昂贵、要么是安装复杂、要么是识别效果差、要么是中文不友好……

咋的,是家里手上花几万块钱买的 MacBook Pro M2 32G 它不香吗?🤔

 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
//
//  main.swift
//  ocr
//
//  Created by Yang Tao on 2024/5/31.
//
import Foundation
import Vision

func recognizeText(_ path :String, completion: @escaping ([String]) -> Void) async {
	let handler = VNImageRequestHandler(url: URL(fileURLWithPath: path, isDirectory: false))
	let request = VNRecognizeTextRequest { request, error in
		let result = request.results as! [VNRecognizedTextObservation]
		let results = result.compactMap { $0.topCandidates(1).first?.string }
		DispatchQueue.global().async { completion(results) }
	}

	request.recognitionLevel = .accurate
	request.recognitionLanguages = ["zh-CN"]
	
	do {
		try handler.perform([request])
	} catch {
		fatalError(error.localizedDescription)
	}
}

let path = CommandLine.arguments[1]
await recognizeText(path) { $0.forEach { print($0) } }

就这加上空行、注释才 29 行 Swift 代码,要什么自行车🚴?

 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
ocr (master) → swiftc main.swift 
ocr (master) → ls
main       main.swift
ocr (master) → ./main ~/Downloads/IMG_9598.jpg 
照片墙
14 关注
杨晚晚
C
) VIP 伍
2229粉丝
网易音乐人、歌手
IP 属地 湖北
互相关注
聊天
ocr (master) → ./main ~/Downloads/IMG_9601.JPG 
18
+ 添加状态
)VIP•伍
“我在江南君在北,一片痴情空与对。”
010枚徽章|广东 深圳•o 90后 摩羯座•村龄7年
32关注
2粉丝
Lv.8等级
1953时听歌
L 最近
v本地
^ 云盘
已购

不好意思,这里也是 29 行,就是这么巧!

图片来自上一篇碎碎念

2024-6-3 10:03:25

开个坑:

  • 博客支持自动识别图片文字内容并保存、可供文本搜索图片🔍。

    可选方案:服务在后台扫描有更新的文章,通过 grpc stream 的方式让提供方(本地客户端)提供技术支持。

从上一份外企的工作的经验得知,#日历 这个东西,也知道像是手机上的日历、#待办事项#备忘录 一样,都是有通用的标准的。 像是 Apple、Google 都在使用这些古早的标准。是的,非常古早,无它——任何除 HTML 外仍在使用 XML 作为交换数据格式的协议我都认为是古董了。

这也使我极度排斥和它们打交道,之前做 XmlRpc/Pingback 把我做到吐。所以虽然我一直想做一个自己的日历本,一直拖、一直拖…… 在拖到完成之前,这条碎碎念我就慢慢 #填坑 吧。

2024-5-31 02:42:14

Tokidoki,是 go-webdav 作者的项目,前者基于后者,实现了基于文件系统的后端。目前看起来还比较粗糙,还不足以上生产环境。

  • 现实一个基于 SQLite3 的后端,和博客程序集成(作者正在实现基本 PostgreSQL 的后端);

害怕,好久没上 #网易云音乐,竟然发现被 #杨晚晚 关注了……🥵🥵🥵

吓得我赶紧改了个签名✍️……你猜我为什么被关注?😎😎😎

2024-5-30 15:08:54

必须来一首 #洗脑 的歌:

标题:片片相思赋予谁

专辑:片片相思赋予谁

作者:杨晚晚

00:00

我是不是年纪大了,为什么觉得这种歌听起来很带劲?🤔

2024-6-14 19:25:42

reply.avif

(好像让大家看到我名字了👀。)

<script> 嵌入 JSON 的正规做法1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!-- Generated by the server -->
<script id="data" type="application/json">
  {
    "userId": 1234,
    "userName": "Maria Cruz",
    "memberSince": "2000-01-01T00:00:00.000Z"
  }
</script>

<!-- Static -->
<script>
  const userInfo = JSON.parse(document.getElementById("data").text);
  console.log("User information: %o", userInfo);
</script>
2024-6-14 04:21:43

实际上,放 Yaml 也不是不行,就像我友链文章中的那样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!--article begins here-->
<script type="application/yaml">
friends:
- name: 小竹の笔记本
  url: https://notes.smallbamboo.cn
  description: 这里是编程宇宙中一颗璀璨的星辰,照亮你探索知识的旅程。
  icon: https://notes.smallbamboo.cn/wp-content/uploads/2024/04/1714049480-icon.png
- name: Doghouse
  url: https://qwq.me/
  description: In the Mood for Love.
- name: 卡瓦邦噶!
  url: https://www.kawabangga.com/
  description: 无法自制的人得不到自由。
...

在 StackOverflow 上面发个帖子问一下关于 Safari 字体大小问题 的根本原因时为了补充一个视频时发现:StackOverflow 支持 GIF,但是不支持 MP4.

可是……当我用 #FFMPEG 把录屏转换成 GIF 时:

1
2
3
4
1.6M a.mov // 原始录屏
200K a.mp4 // ffmpeg -i a.mov a.mp4
1.3M a.gif // ffmpeg -i a.mp4 a.gif
1.0M b.gif // ffmpeg -i a.mov b.gif

转了一圈最后发现,GIF 不管是大小、清晰度、帧率、声音通道、色彩空间都完全被 MP4 吊打啊,完全不在一个量级。

这还是我读高中时认识的那个占用空间大的 MP4 格式吗?StackOverflow 这样抱残守缺干嘛?连 Twitter 都早就用 MP4 代替 GIF 了。

放个 MP4 吧(GIF 就不放了,感觉浪费我空间😅),200KB,8 秒的视频,如此清晰,什么如获至宝,时代的眼泪……

2024-5-29 19:56:01

哈哈哈,在别人的网站上又看到了一个 GIF。是功夫里面的冯小刚打人片段, 我从原视频里面截了一部分,然后转成了 MP4,大小为 179KB,原 GIF 是 362KB,仅是后者的 50%,且不说 MP4 的分辨率是 GIF 的 两倍……

kf.gif

GIF 看着好有年代感啊!一看就回到了那个年代。

自以为是早期的 Win32 开发者,对事件系统非常熟悉,以为可以照搬到浏览器里面。尽管如此,但还是在 js 这里踩了坑,对浏览器中 js 执行顺序误解很大。

比如下面这些代码片段,打印顺序是啥样?

1
2
3
<img src="bad://" onerror="alert('111')" />
<script src="not-found.js"></script>
<script> alert(333); </script>

其中,not-found.js 是一个不存在的脚本。

测试用例:first.html

然后再看看下面这个:

1
2
3
<img src="bad://" onerror="alert('111')" />
<script src="222.js"></script>
<script> alert(333); </script>

其中,222.js 的内容是 alert(222);

测试用例:second.html,记得多刷新几次看看有没有不同。

以及:

1
2
3
<script src="222.js"></script>
<img src="bad://" onerror="alert('111')" />
<script> alert(333); </script>

测试用例:third.html

别问我,我不知道。

七娘山⛰️真是个特殊的山,特殊在哪呢,就是能不能去登山完全取决于当天的天气,对,是当天。因此,需要当天打电话问管理人员才能决定,官方(深圳大鹏半岛国家地质公园)并不会在任何地方公布这个信息(微信公众号已经停留在了几年前)。也别相信各个地图所谓的“正在营业”,因为我上次去就扑空了,然后转去了隔壁的杨梅坑/鹿嘴山庄。

待办事项

合法的新手司机了,周年快乐!

license.jpeg
stat

这里程中,90% 应该都是我贡献的,高速应该超过 50%.

如果不是因为保险限制一年不能超过 30000 公里,这数据再翻过倍毫无压力。


#仪式感 ,是的,晚上又去吃椰汁鸡了!不过,这次变得有些“聪明”了,竟然想起了问老板有没有停车🅿️券,有!感觉以前血亏!那可是深圳超繁忙路段之一啊!


上次买 #宝马 的那个朋友,跟妹子的关系似乎发展不如预期,找我吃了个夜宵。结论:现在的妹子真的难追……尽管他已经差不多年薪百万的深圳人了,还是感觉难,非常地难。不知道现在的妹子在想什么……噢,忘了说,他把上次在光明买的宝马订单退了,等等,不是不买了,是换成了一家南山的店,价钱一样,赠品也几乎完全一样,除了我当时坚持的座椅通风。他说:天热怕什么,空调给我使劲开!

一直用 @media screen,今天才知道有 @container 这么个神器,简单一图胜千言:

container-query.svg

待办事项

  • 服务端和客户端版本必须match
  • 获取 4K 图片 https://pbs.twimg.com/media/GA0Qq0DbYAEltfQ.jpg?name=4096x4096
  • 同步评论中代码的滚动
  • 邮件中的 # 评论 hash 不见了
  • 关于 <template> 被 parse 进 head
  • 保留原始 markdown 中的 html 注释。
  • 播放器适配移动端
  • 搜索功能换成 ListPosts
  • 不设置语言的代码块格式乱了。

把推特的数据📊从官方轻松点几下、一键导出了,非常便捷。 只不过,官方说为了安全,需要等待至少1️⃣天时间才能下载,期间会不停地要求邮件验证以确定帐号安全。

刚好满一天,下载了下来,打开一看,非常吃惊😱。 打开首页,完全就是个离线版的推特,有自己的全量数据,一览到底,所有文字、图片、视频打包📦在一起。 各种数据文件的格式在文档中描述得清清楚楚。

什么业界良心企业啊,我哭死……😭

我……是不是要导入过来呢?

一大早刚醒来,就看见亲戚发了个视频,现场非常惨不忍睹。是的,家里进村的小公路旁边又发生了严重车祸,一辆白色的比亚迪汽车径直撞向了一旁的等待坐免费公交去镇上赶集的老年人、等待上学的孩子、以及接送学生的家长。其中 5️⃣ 个人没了(学生没事),其中一个是我们村的。

去年带同事回老家时就发觉到,我们村本来就非常小,常住人差点两只手👐都能数尽(敢信?),不像同事河南那儿,一个村几千人/户。我们村要是再出个事、走几个老人,那几乎是要成“消逝的村庄”了。不知道多少个家庭又支离破碎。

我很后悔虽然从小在老家生活长大、但其实极少留下值得纪念的东西,甚至照片都少之又少。现在家乡变化又这么大,尽管我如同一个“闲人”,但是我还是“回不去”那个家乡。

希望大家都平平安安。

“吾心安处是吾乡。”——XX。


不出意外,没过多久,现场就收拾得“干干净净”。然后就有人给我家人“送温暖”,上门翻查手机,要求删除视频。 电话甚至都打到了远在云南那头的我爸那里…… 从没有哪一刻感觉到他们的温暖如此亲切过。

这叫什么好事不出门、此地无银啊? 同事问我怎么没上新闻📰?我说:什么时候他们不这样做了,那才算得上是新闻。


现场视频出来了,慎点~

后来爬起来那个小孩子是我堂姐的女儿👧,万幸只受了轻微擦伤,她妈妈也没事。


👩:今天调查的人说中央都来了人的。
👩:撞人的那个人,儿子是飞行员,也跟他停职了。今天调查的人来说的。


新闻出来了(为了隐私暂时不放),驾驶员头天晚上彻夜打麻将🀄️致严重疲劳驾驶。

早前推上有人说像 Markdown 这种简单的文档可以用正则表达式很轻易地解析,我完全不以为然,因为我自己用正规的递归下降解析写过,发现……挺 tricky 的。但是在《网站支持 Live Photo 图片展示》上发现我很久很久之前用过的 marked 这个 js 写的 Markdown 库竟然就是用的正则表达式实现的?

我低估了正则表达式的强大,也低估了作者们的能力。但是有句关于正则表达式的话我还记得很清楚:

Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems. (Source of the famous “Now you have two problems” quote)

很多人写的正则,是那种写的时候看得懂,事后就忘记。不然你看看下面这段装逼过度

1
R"((\w+)\s+([^\?\s]+(\?(\w+(=(\w+)?)?)?(&(\w+(=\w+)?))*))\s+(.*)\r?\n(([-\w]+\s*:\s*.*?\s*\r?\n)+)\r?\n)"

我只敢肯定这段代码是我给公司写的,语言是 C++,但是意义嘛……

但不管怎样,我最终还是放弃了marked,因为我不想在后端一直保留 nodejs,我是🐶党。

随机 #开往 了一个网站“Evan's Space”,发现作者把文章的附件挂在国内某云盘上,尽管附件仅有 8KB 大小……

说实话,作为一个经历过中国互联网大大小小在线存储、云盘服务商的我来说,不是很理解这种行为。

一些不成熟的见解:

  • 写文章✍️时单独上传附件到站外是一个麻烦事(可能有插件集成);
  • 云盘文件可能被莫名其妙地和谐、丢失、删除、不可用;
  • 不方便自己整理数据、备份数据;
  • 云盘可能下载速度还没自己的小水管快;
  • 云盘可能强制用户下载 App 后下载;
  • 云服务商的链接可能挂掉;
  • 云盘服务商可能没自己的网站活得久;
  • 云盘跑路,自己的数据全部丢失。
  • ……

所以,我从建站初期就很少使用过第三方存储(云盘、图床等)。 尽管前些年用过腾讯云 COS 存储我的音视频(太大了以至于我不想放 Git 仓库),直到后来腾讯云换域名(以及改 HTTPS 访问)导致之前的链接挂掉了之后,我就弃用了。我认为他们对兼容性的考虑甚至比我更加草台班子。

又是小满,又是 5.20,跟前同事约了个饭🍚,继续走个仪式,叙叙旧。 他今天没上班,但是也不会出去玩,因为晚上他约了妹子。

本来我俩是很早就规划了5️⃣🈷️份去东南亚新马泰🇸🇬的玩法,结果为了避开高峰,5️⃣1️⃣就去了他家茂名。还以为东南亚之旅已经不再提,结果又被提起,maybe 六月(底)。说起来,前司是一家主营东南亚的公司,虽然我待了好几年年,竟然没借机出去玩过……实属遗憾。

好巧不巧,我姐要带侄儿于暑期去土耳其🇹🇷去找姐夫,问我要不要随同,从深圳出发🛫…… 如果不去,就帮她照看一下猫猫🐈:

78月份有安排没
我把猫带过来,帮我养两个月吧[捂脸][捂脸]
哈哈哈哈,很乖的。只需要铲屎🥣,其他都不管[捂脸]
猫砂猫粮我买了寄过来,自动喂食器安起,自己喂自己吃🐱
乖得很,不吵闹不拆家,不凶人,舍不得不要了
可以保证饿不死[旺柴](我)
你隔太远了,要是在重庆,就安逸了[捂脸]
带人家旅游下不好吗(我)
飞机托运很麻烦,[奸笑]要不你回来,爸爸满60

这最后一句,让我 emo 了。我差点儿就忘记爸爸马上要过生日了,倒不是忘记,只是会影响到我的规划。 车子本来就是买给他庆祝 60 岁生日🎂的,被我开到了深圳来……在考虑要不要回去?

我自认为不是一个很麻烦的人,但是有时候真的各种事情混在一起我真的很怕麻烦:

  • 要找工作、回去后要面对如何给家人/亲戚解释还没有工作
  • 要找女朋友、要面对如何给媒婆解释为什么不找人家妹子聊天💬了
  • 要面对同学为何给你介绍妹子的局不去……

有时候很想自己是一个自由的人,但大多数时候身不由己……

“唯有取舍让我为难。”——雪舞。

待办事项

  • 通过 img loaderror 的方式执行同步滚动注入脚本。
  • 只保留三栏,合并评论
  • 启用标签插件
  • 把 plantuml 插件独立并开放
  • 用公钥代替 token 加密,携带时间。
  • 用 plantuml 的 mind 功能展示博客功能集。

待办事项

  • 写一个类似日历的事件记录系统,比如十周年

为了给博客后台的碎碎念找个能用的 Markdown 编辑✍️器,结果一不小心给人家提了一堆 issues,感觉我有罪:

tme.jpg

选此 Tiny-Markdown-Editor 的原因有几个:

  • 足够小巧、简单,算是一个小而美的产品(除兼容性 Bugs 比较多以外);
  • 纯香草味🌿 Javascript 写的,符合我的选型(我不会 TypeScript 和各种复杂的前端工具链);
  • 没有各种复杂的命令栏,我不需要,我都是手写;
  • 一句话完成原地替换 <textarea>

所以最终选了它,没想到 bugs(主要是 Firefox 上)这么多呢?🥹

编辑器这种复杂的东西我不敢碰,所以都是提 issues,没有 pull-requests。

谁人一天大周末的不出去约妹子还在家写代码给人家提 issue 啊?是我🙃。

Go 语言至今都不允许当全局变量的初始值是函数返回值时,全局变量的类型被定义成带 const 修饰。比如下面这样的语句不被允许:

1
2
const n1 = math.Max(1, 2)
// math.Max(1, 2) (value of type float64) is not constant

真的很迷,可能 Go 语言认为 const 必须全宇宙级别的不变,不能是程序初始化来的。

这就导致类似 goldmark 里面像下面这种看起来像常量的全局变量,实际上,并不是:

1
2
3
4
package ast

// KindHeading is a NodeKind of the Heading node.
var KindHeading = NewNodeKind("Heading")

我一不小心写了个 switch-case 语句,包含了重复的 case 值,竟然不报错:

1
2
3
4
5
6
switch node.Kind() {
case ast.KindHeading:
	// ...
case ast.KindHeading:
	// ...
}

看着是有那么点儿怪怪的吧? 还好我有习惯是会在提交代码前会再 review 一次,不是简单地 git add .。(不点名批评前上司)

而恰好这两个 case 的单测也不冲突(case 里面有条件判断),导致还真就没发现问题。

然后我就跑去看了看语言规范

Implementation restriction: A compiler may disallow multiple case expressions evaluating to the same constant. For instance, the current compilers disallow duplicate integer, floating point, or string constants in case expressions.

没毛病,make sense。只是……啥时候让已初始化的全局变量可以定义成 const?

待办事项

  • 错误页面

和浏览器较量缓存的有效/刷新时机已经很久了,看起来目前取得了比较完美的表现。

目前对一篇文章返回了以下头部字段:

1
2
3
Last-Modified: Thu, 16 May 2024 00:10:09 GMT
Etag: HEAD-1715836710-1715818209-1715817446
Cache-Control: max-age=0, must-revalidate

从上往下:

  • Last-Modified 只表示文章本身最后的修改时间。

    早期的时候我只用有这个,但是明显不够用。比如博客的主题发生了变化时,页面也应该算更新。 为了不改变这个字段本身的含义,我使用了 ETag 字段。

  • ETag 实体标签,另一种用来表示实体有没有修改过的方式,是对 Last-Modified 的补充。

    它就是个普通的字符串,内容可以自己写。我上面的格式是:${GitCommit}-${主题修改时间/系统启动时间}-${文章内容修改时间}-${评论更新时间}

    很复杂吧?其中任何一个的更新都会导致页面缓存失效。

  • Cache-Control 缓存控制。控制缓存保留的时长、刷新策略。

    max-age 表示缓存多久算新鲜,不新鲜就算过时了(过时不代表不可用)。 后面的 must-revalidate 表示对于过时的内容,必须重新检查是否还可用(也就是 304 状态码检测)。

    不知道我对于我设置的这个值是否完全理解,我的需求是:缓存你随便保存多久,但是总是帮我 revalidate 一下就行。如果不设置为 0,浏览器可能并不会 revalidate。但是设置为 0 我又不知道浏览器会不会不要缓存总是立即删除。

    但是目前看起来不会删除,如果 revalidate 后还有效,会继续用。

以上的缓存控制只是针对文章主 HTML 本身(即 Document)。资源文件(Js/Css)我加了一个较短的 max-age。 如果换成给资源文件 URL 加上版本号的方式,理论上,可以把缓存有效期设置成永远。

本地开发的过程中,如果只是对主题本身进行了修改(而不是文章),比如样式和字体,此时需要刷新。如果没有 ETag,简单的做法是强制刷新,但是,强制刷新会使字体文件也没必要地全部重新加载、页面还会回到页首!这是非常不能忍的。不强制刷新的话,页面的滚动位置会保持一致。这对于观察样式的细微修改会很舒服的。

最近这火狐浏览器不知道是咋回事,打开一个新连接的速度无端慢到发指,我还找不到原因:

blocked

但是 Chrome 和 Safari 没有问题🙂‍↔️。

待办事项

  • plantuml 测试页面
  • ssh-agent

Safari 果然是新时代的 IE,果然该死,Mac、iPad、iPhone 三个系统上的浏览器显示效果均不一样,放弃了😇,浪费生命。


测试用例:font-size.html
操作步骤:用手机 Safari 浏览器打开即可。如果发现左右的字体大小不一样,那么 bugs 复现了!

源代码(方便手机阅读):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>

<body>
<table>
<tbody>
<tr>
	<td>
		<pre><span>A</span>B</pre>
	</td>
	<td>
		<pre><span>A</span>BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB</pre>
	</td>
</tr>
</tbody>
</table>
</body>
</html>

最近几个月洗脑次数最多的歌:周慧敏 - 《最愛》

用错了 line-height 好多年😇,仔细读读 line-height - CSS: Cascading Style Sheets | MDN,其中提到的关于带单位与不带单位的不预期的行为。

本来想写点儿例子总结下的,结果发现写的例子总有我自己不明白的地方,干脆不写了🌿。

还是写点儿……

  1. 既然 span 继承了 div 的 line-height,但是为什么写和不写有区别?

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    <div><span>1</span></div>
    <style>
    	div {
    		line-height: 2em;
    	}
    	span  {
    		font-size: 8em;
    		line-height: 2em;
    	}
    </style>
    

    用例:line-height-inheritance.html

原来,JS 里面是不能直接设置 important 的:

1
2
3
document.body.style.display = 'none !important';

// Error in parsing value for ‘display’.  Declaration dropped. 901:1:5

需要用 setProperty 来设置:

1
document.body.style.setProperty('display', 'none', 'important');

待办事项

  • fix size 函数挂掉的问题
  • 缓存评论
  • 碎念预览

今天没宅家写代码,跟同事、以及同事的朋友,去试驾&提了一辆 #宝马(同事),简单谈谈体验与感受 & 生活流水账。 好巧不巧,早上我带了两根香蕉🍌、他带了两个糖油粑粑。于是我们两人相互交换,这是早餐🍳。

开车过去到 4S 店的时候,快要接近正午🕛。先上车做了个简单直观的乘坐体验:3️⃣系空间紧凑,5️⃣系过于宽敞,7️⃣系更加商务风。然后也顺便体验了一下 SUV / X 系列,感觉不是一点点高,我这个小个子下车有点费劲。宝马全系车型的门感觉都有点怪怪的,声音比较硬,开门人要很靠边,不然容易撞到。7️⃣系的后门更离谱,还是个三角▶️区域,专业欺负短手,我差点儿要弯腰了。其实同事早就看好了车型,325长轴曜夜,今天过来只是为了谈价钱。毕竟在现在中国无论做个什么都想摇号的年代,错过一次指标再想要就很难了。如果说还有别的,那就是,让我试驾一下,真的。

谈判的过程得持续有3️⃣个小时那么久。对方是个销冠(1️⃣月份卖了 28 辆,1100 万的销售成绩🤔),然后还名同“林妹妹”。好说歹说,价格是差一点 30 万,只是送的东西还挺多,算得上有诚意了。至少,送了坐椅通风x1(在我要求后,x2)。我这同事不算很懂买车,并没有过问很多细节的东西。男人是不是到最后都只在乎自己爽了?他一开始竟然觉得副驾没有坐椅通风也还行?🙂‍↔️。我都说,你这正在找对象,深圳夏天这天气,没有坐椅通风对妹子可不友好。 谈完很快就先交了订金,确认是订金(可以退),而不是定金(不可以退)。如今这些行业,用“订金”这我有点意外。再三确认,没错。

等了小半个小时才等来试驾🚘,销售直接用同事的身份证登记,都没有问我有没有驾照🪪,就直接很放心地让我去试驾了。 对,是很放心地,竟然没有配试驾专员:

  • 因为右转旁边有一个消防拴水柱子,于是想打开宝马的 360 全景影像看看是啥样。可能是开多了我爸的比亚迪,习惯了左手大拇指直接能触达并打开全景影像,宝马的影像在中控台区域。并且打开后,我们3️⃣人一起折腾了好几分钟都没有搞出来类似比亚迪的那种视图效果,角度有点儿迷汁奇怪。
  • 然后看了看地图🧭,感觉比较平凡,我们三人一致觉得不如百度地图。最终,我们还是用 🍏 CarPlay 投屏了手机地图。国内企业也许是互联网/应用层思维偏多一点,做的车机也许是看起来更加合乎时代/用户习惯,以至于让我产生了一种当我用宝马的车机的时候,有一种在用诺基亚的感觉。毕竟,如果比亚迪的自带地图如果不好用,我还可以下载个几乎和手机版完全一样功能的平板版地图,“亲切”。更甚的是,当我看到旁边保时捷 Taycan 也挂个手机支架用手机导航的时候,我就觉得挺奇怪的:车商强推的大屏不好用吗?我以前租车的时候必须要租带 CarPlay 的,因为不用猜我就知道绝大部分汽车自带的地图不好用,CarPlay 一把梭到底。我只管踩油门,车机我是完全不想碰。我对车机的唯一依赖目前应该只能地图,我在我爸的比亚迪上装了地图后,我就没有再跟别人提起过 CarPlay,就连我自己也觉得 CarPlay 的唯一作用好像就是用来显示手机版的地图一样,对我也没有那么重要了。
  • 油车有声浪,而电车没有。尽管我对这个东西不是很感兴趣,可能是年龄大了,喜欢电车的安安静静。当我在市区把速度一脚踩到 110km/h 的时候,那感觉还是有点刺激。也不知道是不是因为开了运动🏃‍♀️模式,宝马的油门一脚下去的延迟是 250ms 左右,而完全💯松开油门后,能感觉竟然有如电车般的动能回收时带来的制动效果。这是我不知道的油车特性,还是宝马专属?以至于我多次松、踩、松、踩,反复确认,确实无误。于是我们3️⃣人一起在车上“蹦迪”,随着我踩油门的节奏🎶一起摇摆。我同事好像在返程路上有点儿不开心了,因为他之前试驾这车的时候好像不是这样,今天我好像改变了他对这车的看法。
  • 抛开我之前租的那辆特斯拉标准续航 Model Y,这辆宝马算是我开过的最贵/最豪华的车🚘了。租多了 100/200 块一天的车,我觉得所有的油车都很“肉”——油门踩到底都半天不带动的那种。我姐在坐了几次我租的车之后,对电车(特斯拉)的好感大得多。同事说让我去试驾一下 30 万的宝马吧,你那些日系 1.5 不带 T 真不行的。不过今天看来,对于方向指哪打哪、动力随叫随到,我感觉和一辆普通的电车比起来,好像并没有优势?🤔

当然,上述这些只是我一个只碰过宝马3️⃣系2️⃣5️⃣分钟的人的一些鄙见。 去年我自己在纠结😐我自己要买 325 还是 Model Y 的时候,当时也完全拿不定主意。 拖了几个月也没下订,最终先给我爸买了一辆比亚迪代步,然后我爸其实当时还没驾照,所以这车是我在开。 眼看这马上就快要到一年的驾驶体验来说,我肯定优先选 Model Y 了。 电车在市区是真香,0.36元/度的电价让我有一种丢垃圾🗑️都想开车🚗去的想法。目前购车已有🔟个月,里程 2.8 万公里,我感觉还是 affordable/acceptable 的。其实当时也算过,如果我当时真买了宝马3️⃣系,平均来看,每个月的用车成本真的超过 2000. 有点肉痛。同事给我看了他这个月还不到半个月的信用卡帐单,~2500,然后我当着他的面打开了我的招商银行掌上生活,~5000. 他只是说了一句:shit bro,what the fuck……

最后,这家宝马 4S 店比较离谱,不仅迎宾竟然不发水,连午餐🍱也堪比街边 12 元快餐店。我今天穿着一身简单的“红衣”,也挺“出众”了吧?在店门口的几辆车之间兜兜转转了几圈,最终在试驾完拿着下订金✅的文件跑进大门时(因为下起了小雨🌧️),也没能被前台尴尬地问了一句:是来看车的吗?怎么,我拿着你们的“合同”,还不够混个脸熟吗?🤔 当然,这些都不是重点,我不介意。

光明新区看起来确实很新,建筑🏠、公路🛣️都很新,很干净。同事的朋友说光明新区是深圳的未来,我问未来多久到来?他不知道,我说,得有个至少 20 年吧?不管深圳有没有留住我,20 年后应该不是我的时代了。我只想,现在,快快乐乐。未来,未来。

末了,把同事带回了地铁站🚉,因为他预感今天会堵车,他还赶时间回福田陪他妈妈👩一起过母亲节。 而我,拉着另外一位同事去南山吃了我最爱吃的一家椰汁🥥鸡,没别的,就算是个仪式感吧?这店家我之前经常跟我的另外一个同事去,每周去一次的程度,但是后来那个人——up and vanished like a fart in the wind——后,我也就不再是常客。 所以当我拿出一张已经过期一周的优惠券时,一个陌生的阿姨说,过期了这个不能用不能用。我只是微笑着对阿姨说,好的好的,节日快乐。然后当老板过来的时候,我重复了同样的请求,老板肯定看我面熟,于是给我打了折。

我说我给家庭群发了个红包🧧,我问他你发了吗?他说没有,他 made a phone call 📞。 我向来不爱跟家人用电话/语音沟通。因为我真的觉得没什么说的……就不聊聊日常。连人家 99 后的妹子都觉得跟我有代沟了……当然,这和父母之间的沟通不具可比性。 我跟我父母相处得也很好,我只是想说,父母都是担心我吃🍽️好、睡💤好没有。我们日常都有在群里简单沟通,我真不习惯打电话 📞。我和很多人不一样。

同事的预感非常正确,从宝安到南山,区区 10 公里路程,我们堵了2️⃣个小时。就像和绝大部分高速公路拥挤一样,当你快速多次地穿梭于车辆之间后会发现,前面简直是畅通无阻、一片光明。 什么,光明?我感觉今天的拥堵实属就是对同事买车最大的讽刺。

待办事项

  • 加入十年之约还者开往。
  • 保活检测
  • 证书过期检测
  • 正在维护 handler
  • 自动删除不认识的 cookie(管理员首页)
  • 整理一些聊天记录,给文章加上私密访问功能。
  • 接入 rbac 系统,从 tiger 里面复用代码。
  • 把文章的更新写入文本日志,恢复到 git 仓库。
  • 本地缓存头像
  • 创建打码的图片动态不保存结果

Go 语言多少有点儿大病,以至于这种东西需要我自己实现,以至于我需要用我三脚猫功夫的模板/泛型才能实现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// https://en.wikipedia.org/wiki/IIf
// https://blog.twofei.com/716/#没有条件运算符
//
// 用法:
//      a := IIF(b, c, d)
// 类似于:
//      a := d; if b { a = c }
// 其它语言写法:
//      let a = b ? c : d;
func IIF[Condition ~bool, Any any](cond Condition, first, second Any) Any {
	if cond {
		return first
	}
	return second
}

是谁当初说不需要三元/条件运算符的?我打断他的 🐶 腿。

我真是个天才。

如果评论中带列表(list),那么当前的列表会顺序递进样式:比如第一层用实心圆点儿,第二层用空心圆点儿,第三层用方块儿。这个行为是浏览器默认的。

但是我的评论列表也是用的 <ul>/<ol> 来描述,这种嵌套关系会导致评论内容中的列表表现不一样,所以需要重置列表项的样式(list-style-type)。 做法也非常简单:

1
2
3
ul, ol {
    list-style-type: initial;
}

解决完这个问题后,我突发奇想:Markdown 是支持多种 Markers 符号官方的(就是用哪个符号表示要开始写列表了,比如:- + * . )), 那么我为啥不保留原始的这个符号呢,这样更所见即所得? 于是我就打开了 list-style-type 一看,竟然示例中第一个就是自定义样式🤣,这下不得不学了……

如我想像中的那样简单,常用的都预置了。但是 1) 2) 这种没有。我用 @at-rule 自己写了一个 marker 生成器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// https://developer.mozilla.org/en-US/docs/Web/CSS/@counter-style
@counter-style parenthesis {
	system: numeric;
	symbols: "0" "1" "2" "3" "4" "5" "6" "7" "8" "9";
	suffix: ") ";
}
ul, ol {
	&.marker-minus          { list-style-type: "- ";        }
	&.marker-plus           { list-style-type: "+ ";        }
	&.marker-asterisk       { list-style-type: "* ";        }
	&.marker-period         { list-style-type: decimal;     }
	&.marker-parenthesis    { list-style-type: parenthesis; }
}

然后就是在文档渲染时解析 Markdown 的过程中判断一下 Marker 的类型并增加类名即可:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
var knownListItemMarkers = map[byte]string{
	'-': `minus`,
	'+': `plus`,
	'*': `asterisk`,
	'.': `period`,
	')': `parenthesis`,
}

// 保留列表样式。
//
// 只是增加类名,前端通过类名自行决定怎么展示。
func (*_ReserveListItemMarkerStyle) WalkEntering(n ast.Node) (ast.WalkStatus, error) {
	switch typed := n.(type) {
	case *ast.List:
		if class, ok := knownListItemMarkers[typed.Marker]; ok {
			appendClass(typed, `marker-`+class)
		}
	}
	return ast.WalkContinue, nil
}

然后就是一些例子🌰:

如愿

  • 演唱:王菲
  • 作词:唐恬
  • 作曲:钱雷
  • 你是 遥遥的路
  • 山野大雾里的灯
  • 我是孩童啊 走在你的眼眸
  • 你是 明月清风
  • 我是你照拂的梦
  • 见与不见都一生与你相拥
  1. 而我将爱你所爱的人间
  2. 愿你所愿的笑颜
  3. 你的手我蹒跚在牵
  4. 请带我去明天
  5. 如果说你曾苦过我的甜
  6. 我愿活成你的愿
  7. 愿不枉啊 愿勇往啊
  8. 这盛世每一天
  1. 你是岁月长河 星火燃起的天空
  2. 我是仰望者 就把你唱成歌
  3. 你是我之所来 也是我心之所归
  4. 世间所有路都将与你相逢

不知道是哪天,为了显得行文更正式一点儿,我特地给“妳”添加到了自定义短语里面,输入vq即可代替原本不是二级简码的vqiy。 这样就和输入“你(wq)”一样只需要两笔。

然而,我几乎从来没有打过这个字。因为,没有一个她。

妳

在我正在每天使用的电脑的一个很浅的备份目录内找到了7️⃣年前备份的“说说”(就是本碎念功能的前身)。看了下时间点,正好结束在隐藏说说功能前夕。

都是我的过去,为了不丢失,还是给它们“安个身”吧?毕竟也没有别的人这么多年陪着我,只有我的数据。

1
2
3
4
5
6
7
-- MySQL dump 10.13  Distrib 5.5.43, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: taoblog
-- ------------------------------------------------------
-- Server version	5.5.43-0ubuntu0.14.04.1

-- Dump completed on 2017-10-08  3:38:08

看起来有些年迈了。

哈哈哈,那时候的“说说”还记录了地点信息的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
DROP TABLE IF EXISTS `shuoshuo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `shuoshuo` (
  `id` int(20) unsigned NOT NULL AUTO_INCREMENT,
  `content` text CHARACTER SET utf8 NOT NULL,
  `source` text CHARACTER SET utf8,
  `date` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `geo_lat` float(10,6) NOT NULL DEFAULT '0.000000',
  `geo_lng` float(10,6) NOT NULL DEFAULT '0.000000',
  `geo_addr` varchar(256) CHARACTER SET utf8 NOT NULL,
  `comments` int(20) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=208 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

那还是我数据库时间用 datetime 的年代,想想当年好像是写了一整个的 PHP 文件来处理日期/时间📅。

评论就显得比较简单,竟然连作者邮箱都不用留的,随意留言,多么简单而又美好的年代:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
DROP TABLE IF EXISTS `shuoshuo_comments`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `shuoshuo_comments` (
  `id` int(20) unsigned NOT NULL AUTO_INCREMENT,
  `sid` int(20) unsigned NOT NULL,
  `author` tinytext CHARACTER SET utf8 NOT NULL,
  `date` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `content` text CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

待办事项

  • 用节流的方式更改博客的备份时机。现在一直是一天定点备份。有滞后,风险较高。
  • 把代码渲染改成可选项,RSS 不需要渲染。
  • 接入 plantuml
  • 动态更新时间?页面时间 1 分钟前 显示不对不会更新,除非强刷。。
  • 把 taorm 成文
  • api获取文章时删除敏感字段(geo)
  • 我应该复用评论编辑框为文章编辑框,这样就使合并文章和评论的进度又提前了一步。
  • 管理员允许编辑评论者的信息。
  • 预览文章编辑信息。
  • 实现一个前端的编辑距离算法以自动定位没加 name 的 # hashtag。并且生成 toc。
  • 把三元运算符成文。
  • 把 Youtube 加载变懒。
  • 我甚至可以开放编辑✍️功能……
  • 写个debounce,延缓文件刷新。
  • 支持 HEAD 请求,不要返回 404
  • 用 api 更新动态可变数据(文章评论数)

为了在前端发一张带图片的碎碎念,写了一天的代码支持在前端上传⏫文件🥵,兜兜转转又回来了。

看了很多上传文件相关的文章,但是都没有采用(fetch + XMLHttpRequest)。
取而代之,用的是我自己的文件上传方案:通过 WebSocket 把 GRPC Stream 代理(双向拷贝)到前端。
这样的话接口就全部统一了。也可以很方便地增加上传进度展示(目前没有加,因为文件小)。

这好像是一个网上很少被提起的方案。

Go 的内嵌接口不会自动包含被内嵌的对象实现的接口,所以像下面这样的代码不会如预期的方式工作,不知道为什么,踩坑几次了😫:

 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
package main

import (
	"io"
)

type A struct{}

func (a *A) Close() error               { return nil }
func (a *A) Read(p []byte) (int, error) { return len(p), nil }

// A 实现了 ReadCloser
var _ io.ReadCloser = (*A)(nil)

// 无论以何种方式嵌入 A,B/N 都无法完全断言出 A 实现的全部接口。
type B struct{ io.Closer }
type N struct{ any }

func main() {
	var b any

	b = &B{&A{}}
	b.(io.Closer).Close()
	b.(io.Reader).Read(nil)

	b = &N{&A{}}
	b.(io.Closer).Close()
	b.(io.Reader).Read(nil)
}

现实代码是,我包裹了 http.ResponseWriter 通过重写 WriteHeader 的方式以实现捕捉到状态码:

1
2
3
4
type _ResponseWriter struct {
	http.ResponseWriter
	code int
}

然后就发现,我自己的 _ResponseWriter 没有实现 Hijacker 了,导致我的 WebSocket 升级失败。

现实是,很多代码都这样写,并且以为不会出问题。比如:

一直没明白为什么不支持。

2024-6-1 18:05:41

发现了一个 Go1.20 新加入的功能:https://pkg.go.dev/net/http#NewResponseController 可以完成我要的功能。

2024-6-4 07:00:46
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// https://blog.twofei.com/909/
type _ResponseWriter struct {
	http.ResponseWriter
	*http.ResponseController
	code int
}

func (w *_ResponseWriter) WriteHeader(statusCode int) {
	w.code = statusCode
	w.ResponseWriter.WriteHeader(statusCode)
}

使用 Rollup 给 js 打包的时候发现它有一个“奇怪”的格式化参数 -f iife。查了一下才知道,像下面这样的代码写法:

1
2
3
(function () {
    /* ... */
})();

有一个专门的名字:Immediately invoked function expression / 立即调用函数表达式

这个概念已经存在很久很久了,只是我今天才知道它有正式的名字,被这样缩写。

我好像很久没看书📖了。有点儿恐怖。

待办事项

  • admin/script.js 为什么没有缓存?

终于回到了深圳,结束了五一假期为期4️⃣天的茂名/化州旅游,日子又回归平静。

全程 1028.6kM。 去程(4月30号22点➡️次日11点)用时13小时; 回程(5月4号18点➡️次日02点)用时8小时。 回程少花了好几个小时,大概是少经历了好几次车祸现场,并且中途变聪明了,中途下道几次躲避拥堵。 去程的途中也经历了超级大暴雨⛈️,不过好在已经是早上的7点,天已大亮,并且尽管已熬整夜,但大家状态都非常好。而我,经历过贵州山区的超级大暴雨,这点儿“毛毛雨🌧️”对我来说,不值一提。听闻此次梅州高速坍塌事件后非常痛心。

认识了董的好几个家人(几个姐姐、相亲对象、以及他爸),(他们)广东人(范围是不是太大了,应该是茂名人/化州人/他们家?)不管是什么场合(吃饭、唱歌、娱乐、购物、散步、乘车……)感觉有说不玩的笑话,一家人的气氛非常的活跃、欢快、热情。 这是我以前从未见过如此和谐的家庭。当然,他们几乎全程用当地方言,我几乎没能参与对话,也不能明白他们谈吐的精髓。比较遗憾。

当然,旅游不一定有足够吸引人的风景可看,但……美食不应该少。各种特色盐焗鸡、牛腩没少吃!特别是他爸现场监工的那只盐焗鸡,据说是现挑、现杀、现做、现提、现吃。是我吃过的最好吃的一只!

待办事项

  • 编写统一的重未登录定向处理器。
  • 成文: Grpc stream interceptor 的 wrap context WrapServerStream
  • 把评论列表静态化成一个 json文件。

W3C 总是能给我整出恶心的东西,为什么把一个 Date 赋值给 <input type="datetime-local" /> 这么难?这tm是给人用的吗?🤔

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// https://dev.to/kevinluo201/set-value-of-datetime-local-input-field-3435
// getFullYear, getMonth, getDate, getHours, getMinutes all return values of local time.
const convertToDateTimeLocalString = (date) => {
  const year = date.getFullYear();
  const month = (date.getMonth() + 1).toString().padStart(2, "0");
  const day = date.getDate().toString().padStart(2, "0");
  const hours = date.getHours().toString().padStart(2, "0");
  const minutes = date.getMinutes().toString().padStart(2, "0");

  return `${year}-${month}-${day}T${hours}:${minutes}`;
}
const currentTime = new Date()
document.getElementById('start-time').value = convertToDateTimeLocalString(currentTime)

而如果是 Go 的话,只需要下面这样一句就可以了:

1
time.Now().Format("2006-01-02T15:04:05")

五一本来是不打算出去玩儿的,节假日都不喜欢,太堵了,堵人堵车。但这次是个例外,是准备去董的家乡茂名旅游一圈。董的相亲对象竟然非常巧合地在高铁临近出发前错过了,于是一行四人,晚上十点,从深圳出发。

从未在节假日高峰开车出游过,没想到到虎门50公里开了4️⃣个小时。而全程不到500公里的路程居然次日早上11点才到。总共驾驶13个小时,除两次充电分别休息差不多半小时外,全程是我开车,是真的累,堵得累。有史以来连续开车最长的一次,不是炫耀。

没想到刚上线话唠功能就收到了 Freya 的邮件说博客挂了🥵…… 跑上去一看是代理工具把磁盘全部占满了。

我在vps上也无法访问,重启了先…

大概原因是被我的代理服务打日志把根盘占满了🥵

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
root@twofei:~/servers/taoblog# df -htext4
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        34G   32G     0 100% /

root@twofei:/var/lib/docker/containers/593754ff847d194ac2b1172b551bd28c55d421a6c63fe1335cab74898022d7c3# ls -lh
total 13G
-rw-r----- 1 root root  13G Apr 30 13:04 593754ff847d194ac2b1172b551bd28c55d421a6c63fe1335cab74898022d7c3-json.log
drwx------ 2 root root 4.0K May 29  2023 checkpoints
-rw------- 1 root root 2.6K Mar 11 22:03 config.v2.json
-rw-r--r-- 1 root root 1.5K Mar 11 22:03 hostconfig.json
-rw-r--r-- 1 root root   11 Mar 11 22:03 hostname
-rw-r--r-- 1 root root  225 Mar 11 22:03 hosts
drwx--x--- 2 root root 4.0K May 29  2023 mounts
-rw-r--r-- 1 root root   38 Mar 11 22:03 resolv.conf

上面那个json日志好大🥵 10多个G

1
2
root@twofei:~/servers/taoblog# docker ps | grep  59375
593754ff847d   taocker/socks-proxy            "./socks-proxy serve…"   11 months ago   Up 7 weeks  socks-proxy

跑了11个月了

我家里整个外网访问全靠它🥵🥵🥵

看来运维做得还是不够好呀,我是草台班子!

早在 2015 年刚创建本博客程序的时候就有了一个简单的“说说”功能,相对于复杂的文章来说,就是用来发表日常吐槽。

可是本来是我技术起步阶段,就做得非常难用。后来就隐藏了这个功能,再后来就删除了这个功能。 不知道以前的数据还在不在,如果在的话,抽空同步上来。

现在你看到的这个“碎碎念”,不再是另外一种单独的载体,而就是一篇普通的、没有标题的文章。 之所以这样做,有很多好处:

  • 可以完全复用文章的发表、更新、数据管理工具;
  • 可以完全复用文章的评论功能;
  • 和文章统一链接、统一渲染、统一……

当然,“碎碎念”默认不显示在首页、也不显示其首页评论、也不显示在 RSS 订阅中。

碎碎念不乏有一些比较隐私的内容,我该想一个较好的方案来隐私这部分细节?🤔

待办事项

  • 编辑评论时应该带上时间以防止多次更新冲突;
  • p={id} 查询失效了。curl 中看到的。
  • 不要使用 h2、h3 作为大字体显示用。
  • 评论时检查是否仍属于此文章。
  • 规范化用户及ip 的获取过程
  • 把页面重定向到 /page 形式。

技术

这篇 MDN 的 onsise 处理里面提到了一篇 throuttle 和 debounce 的文章,很好。

在这里讨论了博客评论分页如何永久有效的问题:https://github.com/movsb/taoblog/commit/366c66d2841377c2ddf155af7b31e703a6c39ee2

待办事项

  • 博客请求记录器;
  • 写一篇关于是否需要 HTML 转义的文章;
  • 文章的更新时间应该是最后评论的时间。
  • 更新评论的评论链接;
  • 更新首页的评论链接;

技术

关于 HTML 在特殊符号是否需要转码的问题。这篇文章写得比如清楚,但是,个人觉得只适合手写的情况。


准备把博客的评论改在后端生成,改了半天发现,我直接把所有评论用 js 返回给前端,前端用 js 渲染出来不就行了吗?妈的,写了半天,浪费时间……🙄

待办事项

  • 把通行密钥的使用成文;

技术

终于把拖了几年的通行密钥给上线到博客了,太难了!

技术

发现 iPad 上的浏览器的 user agent 是桌面电脑的,因为设置里面“请求桌面网站”一直是打开的。 但是,桌面版不魂 touch event,iPad 支持。那我要如何区分?

通过 alert('ontouchstart' in window) 可以判断出来。

技术

一句错误的代码:

1
(true ? document.body.prepend : document.body.append)(document.createElement('hr'))

正确的写法:

1
(true ? document.body.prepend : document.body.append).call(document.body,document.createElement('hr'))

火狐的提示比谷歌详细很多。

简写:

1
2
let a = document.append;
a('<hr>');

技术

第一次学习了 JS 的 get/set 属性方法

待办事项

  • 写个 age 加密的教程。
  • 发现 age 可以直接上 ssh 的 key,曝爽!

连发音都是一样的,不能说毫无关系🤔。

1782445642662695037-GLyEuBubEAAljo9.jpg

技术

不知道啥时候把 [email protected] 这个邮箱发件人的昵称命名成了 “damn” 🥵,找了好一会儿设置才将其改掉了。


给博客加上了自动重新部署的逻辑,通过 GitHub 的 Webhooks。

待办事项

  • 把博客美化评论内容成文;

待办事项

生活

每次点击 Obsidian 的 “open today's daily note“ 发现是个新页面时,就恐惧又是新的一天,好像昨天什么也没做一样。

苹果要完,这应该怎么破? #bugOS

前端

发现 node.propnode.getAttribute('prop') 还是不一样。比如当 <img src="照片.jpg" /> 时,前者拿到的是完整路径,后者拿到的是原始值。见:https://stackoverflow.com/a/78312419/3628322

待办事项

  • 把以前的 mind 项目(从 yaml 生成 table)改变成 markdown 扩展。再怎么说描述能力也比 markdown 强吧?🤔

生活

去了甘坑古镇和东西涌。甘坑非常漂亮,容易出图!适合带妹子去!我的妹子在哪里呢!

生活

多次注意到 OpenStreetMap,今天终于打开看了一下。是由全世界的人共同绘制的,感觉很不错。

简单调研了一下几款地图显示老家地址的区别:谷歌 百度 高德,发现只有谷歌卫星地图最最清晰。

看到很多人推荐用 LanDrop 替代 AirDrop,…… 没想到第一次就这么难。☹️

1774882097054015516-GKGlplBa4AAw-gE.jpg

把苹果的开发者订阅取消了。以后是不是就算是本地也用不了 Xcode 了?是不是已上架的也会被下架?是不是也用不了 iOS Beta 版了?

IMG_8899.avif

订购了2️⃣年,开发了两个 iOS App,0️⃣ 收入 [捂脸][捂脸][捂脸]

#苹果 #开发者

待办事项

在停车月租费到期的最后一天交了月费,前台说已经不能给非楼栋人员出租了。

旅游

韶关丹霞山

景点描述

有两个景点:1️⃣ 阳元山风景区 2️⃣ 长老峰风景区。

两个景点有独立的入口,门票总共 100,一次性购买。

阳元山风景区内,阳元山环绕有两条山道,应该从左边上,右边下。 长老峰风景区包含:阴元石、一线天。从长老峰进去后首先达阴元石,然后返程路上可以选择往上去一线天。也可以不去,最终都是到达长老峰出口。

停车可以在东北门处,也可以从大门进去(非内部人员收费 15 元)。

我的费用清单

景区船票:40 停车费用:15+2.5 电费油费:45+38+37+60 高速费用:196+178

其它

可能是由于一天的奔波(头天晚上没睡好觉、早上六点出发、开了一上午车、爬了一下午山),晚上(次日凌晨)开车回家的时候竟然有点恍惚😶‍🌫️(那感觉像前面的车有点重叠、又没有在动的样子),降了速度,听了几首嗨歌(Waking in the Sum、半糖🍬主义、龙战骑士等)才终于回过神来。害怕,开车大半年来 #第一次 出现这种现象。

生活

把大疆遥控器里面的内存卡拷贝了 YouTube 视频后插在比亚迪的车上听了一天歌,晚上回家的时候,竟然读不出来了,然后再插回遥控器,提示“需要格式化”,拔出来再插一次,又不提示了,但是在通知栏里面找不到“浏览”的选项。回家后插在电脑上,完全可以正常使用🙄…… 等有空再插到车机上试试,垃圾比亚迪。

待办事项

  • 把博客的 Vim 按键模拟 成文;
  • 写一篇关于动态页面 304 处理的思考;
  • 隐藏博客标签列表;

技术

突然发现 MacOS 上的 Firefox 进入全屏也会新开桌面了,以前是不会的。这就导致:

  • 全屏时的动画效果不好看了;
  • 不能在全屏的视频窗口中打开微信(等)非全屏窗口了;

about:config 里面找到了配置:full-screen-api.macos-native-full-screen,改成 false 即可。


在博客上实现了一个简单的 Vim 按键模拟,比想像之中的要简单。

生活

看了小米汽车的发布会,如果早一年,我就买了。现在在想能不能把比亚迪秦置换成小米汽车。

待办事项

  • 把 taomd 成文

技术

发现火狐的右键截图会自动带上背景色(即:虽为 PNG,但不透明),而如果在 Inspector 里面 复制 为 Data-URL,然后在浏览器里面打开可得到透明背景的 PNG。此时就可以按需根据自己网页的调整图片背景色。突然发现 PNG 的这个优点还挺好的!

生活

给姐姐发了一个 理想 Mega 测试过程中撞飞假人的视频,结果被告知“谢谢,下次这种不用发我了😡”。哎,如果不去了解、认识到一个东西的缺点与危害,何谈避免、主动保全自己的人身安全?难道这也是男人与女人的区别吗?

个人

做了一下 MBTI 的类型测试,结果表明我是 INTP 类型。适合做科学家,渴求知识。

然而我发现我好像并没有很渴求,对于一些听过很多遍的词都没有去了解过,比如“唯物主义”,虽然从第一次听说以后就大概知道是什么意思,但是从未真正了解过。

待办事项

  • printf/log 库成文

思考

博客的文章是用标签来推荐相关文章的,而标签只不过是作者从文章内容中抽取的几个主旨/高频词,如果能用 AI 来自动分词并可能地提取出关键词/含义。那是不是文章就不用再手动分类了?🤔

待办事项

  • 到天才吧检查 MacBook 的电池状况

生活

因为在小红书上发了一篇帖子MacBook 电池健康严重不足! 后有较多的反馈同样的问题并建议检查一下,于是预约了白天的天才吧。

语言

在《近藤浩治 - 维基百科,自由的百科全书》的页面上发现 cover 被翻译为“翻唱”,终于知道了这个词的翻译。然后顺便看了一下苹果字典,确实有“翻唱”之意。 #英语

好!

1766516063729037800-GIPs-pNboAA74zL.jpg

待办事项

  • 把无线充电放在车上

待办事项

  • 联系比亚迪的售后询问维修进度
  • 把无人机里面的在东莞拍的照片导出来发朋友圈

生活

把车开到了比亚迪汽车王朝网(深圳粤迪4S店) 来维修制动时的异响问题,吃完午饭回来看,竟然发现车前身左侧被刮擦了,很像是在墙面上刮的,不像是车刮的,所以放弃了找比亚迪负责。但是,我最近没有在哪里有刮擦啊!😭

周处除三害🤔

Mac 迅雷会在任务目录下建立一些隐藏文件,其中就包含这个 .magent 文件。是的,是 magent 不是 magnet。 #草台班子

1764642905019519334-GH1FMPUacAAeSQ4.png

个人

再看了一遍 #电影 “我的少女时代”(为了找那句《周处除三害》台词),在看到徐太宇给林真心表白的那句西班牙语“Aqui te amo(我爱你)”(1:59:56)时,竟然莫名其妙地想到了小学五年级(应该没记错?)时, 龙婉妮跟我表白时说的那句“I love you”了,虽然当时我并不知道这句英语是什么意思、也学了好久才记住。哎~,女性成熟得真早啊。

网络

突然发现我的邮箱 [email protected] 竟然扯上了 CH(32V003) 和 ESP(32) 哈哈哈哈😄。

网络

深圳家里的 NUC 和 代理 都连不上了,感觉是失联。但是竟然手机上的华硕路由器竟然可以远程(不在同一网络)访问到路由器,感觉救了我一命! 但是华硕不显示 IPv6 地址,最终通过找到 IPv6 前缀➕之前的 IPv6 后缀拼接成了 NUC 的 IPv6 地址,然后在路由器 Web UI 页面上(App 菜单里面有此选项)将其添加到了防火墙允许名单中,最终得以通过 IPv6 访问到 NUC。

生活

  • 来到 #无锡 ,酒店的网络没有 #IPv6 ,不得不在 Mac 上安装了一个 #OpenWRT
  • 发现无锡硕放机场没有竟然没有自助销售机,而且餐饮非常贵(比如:王四老字号面馆,50+ 一碗牛肉面)。
  • 飞机因为需要打扫🧹卫生所以延误了二十分钟,但是航班信息却不更新,误导人。
  • 到达 #北京

准备明天去北京,需要把 Twitter、Telegram、YouTube 等先卸载了吗? 🥵🥵🥵 怕怕。

如何记住南桥与北桥?速度快的在上面,上面就是北方。

noteworthy

编程

硬件

学习

  • 我才知道 "同比" 的英语是 "year-on-year","环比" 的英语是 "month-on-month" ... 有时候,我确实不太懂汉语,不知道为什么就这么叫了,只能去强行记住一个词的 "概念",直到我看到英语,卧槽怎么这么简单明了?

编程

生活

音乐

  • 发现 #音乐 《人世间》和《如愿》的作曲家都是 #钱雷 ,都非常好听。 看百度百科,《大鱼》、《默》竟然也是!!!

硬件

  • 今天制作了 CH32V003 的第一块板子(红外遥控开关),感觉意外地舒服。
  • 下单了第一块 #3D打印 的单,给 CH32V003 红外遥控制作的盒子。 #第一次

学习

  • 把《英语二》在 #闲鱼 上卖出去了,买家是个声音很好听的小姑娘,跟着男友一起来的。 #英语

#VsCode 你不要这么离谱。。。

1746119328825757847-GDt2PO7aIAArZrQ.jpg

看到这个想起个问题:在 C/C++ 里面,有哪个函数能从字符串里面严格 parse 出整数出来?

严格是指:不能有多余的前缀/后缀空格、不相关字符、不能解析就报错而不是返回 0。

什么 atoi、stol、strtoll 之类的就不提了。from_chars?咋能不能简单点?

🥵🥵🥵 我是谁,我在哪里?

1744642987345498133-GDY3do8bgAASwCL.jpg

去年2月份换的电脑,92% 已经好几个月了🙃

1743856312751182020-GDNsCRsaIAA3Bi8.jpg

生活

  • #第一次 在优衣库官方网站购买了衣服。

待办事项

  • 把 CH32V003 项目独立成模板
  • 研究下 mitmproxy,看能不能拿到比亚迪的车机数据
    • 发现手机不能设置代理,否则比亚迪 App 一定会报错
    • 但是可以用 VPN 把流量转到 mitm 的 proxy 上
    • 最终还是没有拿到数据,猜想是走的 TCP 协议
  • 从日记里面整理出所有的待办事项成列表,防止未办
  • 把插排改成智能设备
  • 采购 LDO 和 人在传感器

一眼阳痿

1743185428952621247-GDEJkevacAAofj-.png 1743185428952621247-GDEJ5ltbAAAOzgp.png

我大量使用 #Raycast 的这个词典功能,但是它经常把查词(Define word)功能远远地放在了我找不到的地方,是不是我使用的姿势不对?🤔 它为什么没有学习到我的使用习惯?@raycastapp

1743168242305441962-GDD5dWKbIAAcu19.jpg 1743168242305441962-GDD5kIpaMAA0qH9.jpg

昨天给 #esp32 设备写 provisioning 代码的时候,怎么感觉这前后端一起写这么闹心?一加个接口就要写界面、发请求处理。一堆的 Vanilla JS 写得我🥵。一气之下150行代码写了个简单的“(假)终端模拟器”,另外再 150 行写了个类 Shell 解释执行器🥵,看起来真是有模有样。

1743148150951739884-GDDn_HkaYAA8HCf.jpg 1743148150951739884-GDDn_HjagAAOXg9.jpg 1743148150951739884-GDDn_HmaIAABpAN.jpg 1743148150951739884-GDDn_HfbcAAaf0t.jpg

硬件

  • 画的 homekit-swtich 的板子外接端口,一上来就碰到了 GPIO16 为 ESP8266 的 RTC IO 不能使用的总是,蛋疼。这都画了多少个版本了。 #待办
    • 把排针按 2.54 对齐
    • 废掉 GPIO16(不能用中断)
    • 另外发现:GPIO14、12、13 是坏的

虽然大家还是没习惯写 const,但是仍然不影响我不知道传进去的这个 pointer 是不是会被长期持有。😣

1739635771995455921-GCRs_Y8a8AA-7CI.png

自从上次顺丰app主动问我快递员有没有送货上门、我勾选了“否”以后,今天顺丰打了个ai电话问我是要送货上门、放代收点,…… 于是我选了“上门”,刚刚,真上门了。好难得,终于不用跑楼下了😇

编程

  • 第一次发现居然有人写 do while 不加花括号

    1
    2
    3
    
    do ret = mbedtls_ssl_handshake( &ssl );
    while( ret == MBEDTLS_ERR_SSL_WANT_READ ||
             ret == MBEDTLS_ERR_SSL_WANT_WRITE );
    

旅游

  • 结束了为期7️⃣天的假期!回到深圳。总结:总共7️⃣天,去了4️⃣个省份1️⃣0️⃣个城市,里程共3️⃣5️⃣0️⃣0️⃣公里。

硬件

  • 这一次的嘉立创非常快,昨天下的单,今天已经顺丰发货了,明天就能到!

旅游

  • 早上买了点水果🍉去了刘宝宝家,然后一起吃了早餐,送他上班。去了五一广场,逛了逛文和友老长沙。
  • 第一次来到了 #江西 ,在 #宜春 天沐温泉度假村第一次泡了个温泉🧖🏻。然后立马起身上高速到了 #井冈山 ,200公里的高速上居然只遇到3️⃣辆车,一路简直是飞奔过来。下了高速后,在井冈山遇到了各种“红色文化”。简直了!到了预计的民宿“兔溪农家”,老板非常热情地招待了我们,给我们安排了行程,还问我们是否需要就餐。

时间:2023-12-17(周日) → 2023-12-24(周六) 历时:7 天 人数:2 人 地点: #深圳 #阳朔 #张家界 #长沙 #赣州 #揭阳 #武功山 类型: #自驾游 #穷游 #特种兵

费用

日期📅 项目 费用
第1️⃣天 租车 2714
桂林米粉 33
糯米饭 12
加油 277
竹筏 320
电摩托 30
停车费 15
千古情门票 320
停车费 15
啤酒鱼 83+15
酒店 60
第2️⃣天 桂林米粉 24
租车➕手套 35
牛记秧塘牛八宝 87
停车费 5
侗乡缘 85
加油 295
民宿 74
第3️⃣天 张家界国家森林公园 598
蜜雪冰城 20
零食 40
导游 100
晚餐 166
酒店 72
第4️⃣天 早饭 26
鲁珍牛肉面 26
橘子🍊 11
卤菜 40
停车费 10
加油 284
停车费 10
住宿 91
第5️⃣天 水果 52
停车费 25
马蹄 15
臭豆腐 10
泳裤🩳 20
温泉 300
晚餐 65
住宿 76
第6️⃣天 面包 14
肯德基 26
加油 248
橘子🍊 25
人民大排档 100
烤地瓜🍠 14
停车费 12
住宿 80
第7️⃣天 三及第 18
花萼楼 20
加油 296
猪脚饭 70
加油 221
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
~  python3
Python 3.11.6 (main, Oct  2 2023, 13:45:54) [Clang 15.0.0 (clang-1500.0.40.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 2714+33+12+277+320+30+15+320+15+98+60
3894
>>> 24+35+87+5+85+295+74
605
>>> 598+20+40+100+166+72
996
>>> 26+26+11+40+10+284+10+91
498
>>> 52+25+15+10+20+300+65+76
563
>>> 14+26+248+25+100+14+12+80
519
>>> 18+20+296+70+221
625
>>> 3894+605+996+498+563+519+625
7700
>>> 7700/2
3850.0
>>>

行程

日期📅 起点 终点 里程(公里) 耗时(小时)
第1️⃣天 深圳 阳朔 500 6
第2️⃣、3️⃣天 阳朔 张家界 700 8
第4️⃣天 张家界 长沙 300 4
第5️⃣天 长沙 武功山

第1️⃣天:阳朔

景点

地点 项目 票价 开放时间
工农桥 风景 免费
十里画廊 风景 免费 全天
遇龙河 竹筏、山水 ¥160 07:00-17:00
兴坪古镇 游玩 免费 全天
西街 小吃、酒吧街 免费 全天
阳朔之夜 风情 ¥70 16:00-23:00
桂林千古情

美食

名字 价格 推荐店铺
桂林米粉 2️⃣两6️⃣元 老东江米粉
🐮牛八宝 一锅涮,100
螺蛳粉

第2️⃣、3️⃣天:张家界

景点

地点 项目 票价 开放时间
天门山国家森林公园 275
张家界国家森林公园 225
凤凰古城 免费
天门山

进山线路分3️⃣种:

  • A线:索道上,汽车下(优先这个)
  • B线:洗车上,索道下
  • C线:汽车上,汽车下

项目:

  • 索道
  • 玻璃栈道
  • 悬索桥
  • 鬼谷天堑
  • 天门洞
  • 天梯(999台阶)

第4️⃣天:长沙

景点

地点 项目 票价 开放时间
五一广场 免费
黄兴步行街 免费
岳麓山 免费
橘子洲 免费
湖南省博物馆 免费

美食

名字
茶颜悦色
臭豆腐

第5️⃣天:赣州

景点

地点 项目 票价 开放时间
江南宋城 免费
古浮桥 免费
郁孤台 免费

第6️⃣天:揭阳

待办事项

  • 把 CH32V003 独立成项目
  • 把 SysTick 成文

我也一直深受这个问题困扰,今天突发奇想……这也行?😝😝😝

1735515026717634947-GBXJn03bkAAYRZ_.png

硬件

  • 正确打开 VsCode 的方式是在终端里面先导出环境变量,然后再 code <目录>

硬件

  • Rev 1.4 的 homekit-switch “上线”工作不到十分钟就宣告停止工作:继电器吸不上去了。测试发现是继电器坏掉了。
    • 在淘宝和京东上以及拼多多上都没有找到之前那五个松乐继电器的订单,那估计是最早那天晚上用另外一个错误创建的拼多多账号买的。大概率是买到假货了:吸合不了,容易掉漆。拆下来一个旧的和在优信电子上面习的对比了一下,有很大差别。

在 -Os 优化的情况下,GCC 的整数除法竟然占用了 1.5KB,把在 2023 年还没有除法指令的 #CH32V003 的 FLASH 坑掉了 1/10 🥵 于是手撸了一个,48字节完成✅ 什么时候干掉 printf?

1734424210909671828-GBHoifobEAAVmgU.png 1734424210909671828-GBHpOw9a8AAvvvW.jpg

不太聪明的样子,给你个表情自己体会吧 < 0 ^ 0 >

1734417041757749632-GBHirMAbUAAdcIS.jpg 1734417041757749632-GBHi7QtbEAAsXG1.png

代码

竟然在 C++ 标准库里面发现了 doxygen 注释,看来我选择它没错了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/**
* @brief Provides compile-time rational arithmetic.
*
* This class template represents any finite rational number with a
* numerator and denominator representable by compile-time constants of
* type intmax_t. The ratio is simplified when instantiated.
*
* For example:
* @code
* std::ratio<7,-21>::num == -1;
* std::ratio<7,-21>::den == 3;
* @endcode
*
*/
template<intmax_t _Num, intmax_t _Den = 1>

struct ratio

第1️⃣次在自己的代码中使用“用户自定义字面值”,太爽了: https://github.com/movsb/libstuff/commit/5e652e78f1ac18c2d78469f346d7acf22de0ce45

系统

  • 尝试添加一个“自定义短语”,MacOS 卡出屎了,直接重启。

待办事项

  • 把在虚拟机里面安装 openocd 调试成文
  • 把 ch32v00x C++ 编译支持成文
  • ch32v00x cmake 项目成文
  • 把启动过程、存储空间划分分配、分析成文

硬件

  • CH32V003 竟然没有除法指令,一个 __divdi3 占用了 1.5KB 的空间,可是一共才 16KB 啊😭

相同代码用 SDCC 和 GCC 编译出来的二进制大小差太多,于是我就看看差在哪里了,无意发现我图1的代码编译出来只剩那么点汇编了,才发现逻辑符号写错了😅 然后就问了 ChatGPT 如何解决,结果 GCC 8 和 GCC 12 都不行,Clang 却成功警告了 😶‍🌫️(卒

1733280962908426445-GA3V0f3bQAAUXjL.jpg 1733280962908426445-GA3WQw-bUAAEw4y.jpg 1733280962908426445-GA3Zq98akAA5lkk.jpg


啊,我错了…… -Wall 并不包含 -Wlogical-op 🫣🫣🫣

1733281964168483236-GA3ap4BbIAAx3Ax.jpg

Are you right?

1733199909833359393-GA2QBldbQAATm37.png

软件

  • 看了 xPack 的官方才发现 xpack-riscv-none-embed-gcc-8.2.0xpack-riscv-none-elf-gcc-12.2.0-3 是同一个东西,只是前者是为了保持跟 SiFive 的版本一样,后来两者都 Deprecated 了。WCH 真垃圾。
  • Wch-LinkE 在 Win7 串口驱动装不上,准备装 Win10,结果两次卡死机,放弃。

硬件

  • 成功把 CH32V003 灯点亮了,并且,关闭串口后,IO 默认为 SDIO,下载程序非常方便了。
  • 根据这篇文章手动编译了 OpenOCD for WCH,结果他妈的只支持 wlink 不支持 wlinke,什么傻逼公司玩意儿。

🐶🅱️了一下,发现还 does work(当时竟然还没有 go mod) 🤪。但是缺少音乐的世界不完美,写到第2️⃣张图的时候,正是我入职上一份工作前半个🈷️🥵,缺少了最动听的部分。

1733060711369388132-GA0Qq0DbYAEltfQ.jpg 1733060711369388132-GA0RM6Ua8AACcI8.jpg

收支

  • 从今天开始,每个月给维基百科捐款1️⃣美元。

汽车

硬件

  • 因为发了自己写的 NES 模拟器,被大佬 STRRL.gpt, Manjusaka 推特 关注了 🥵 紧张

软件

    • C语言里面为什么不以用 const int 作为数组的长度?(没开启 VLA)
    • 在 C 语言中,数组的长度必须是一个编译时确定的常量表达式。而 const int 在 C 中并不是一个常量表达式,而是一个只读变量。因此,尽管 const int 意味着这个变量是只读的,但它并不是一个常量表达式,不能用作数组的长度。

待办事项

  • 晾衣服
  • 了解一下 LaunchAgent 并回复博客用户。
  • 把 世特力硬盘 控制器 成文;
  • 成文:把 MacOS 作为 HomeKit
  • 成文:Whisper 周年

待办事项

  • 晾衣服
  • 了解一下 LaunchAgent 并回复博客用户。
  • 把 世特力硬盘 控制器 成文;
  • 成文:把 MacOS 作为 HomeKit

前端

  • 在 HTML 中使用 SVG 的方法对比,为了可以选择 SVG 中的文本。
    • 使用 <object data=name.svg
      • 这种方法目前完美达到要求
      • 2023-12-24 更新:不完美,也会生成 frame,并且 Firefox 上会出现右半边部分无法选中文本。
      • 2024-01-16 更新:生成的 frame 没有 body。Stylish 扩展的 document.body 直接 throw,导致页面解析中断了😅。
    • 使用 <iframe src=""></iframe>
      • 会嵌入新的框架,并且会产生滚动条,弃用
    • 使用 <svg><use xlink:href=""></use></svg>
      • 根据 ChatGPT 的测试,没有成功

硬件

  • 起床准备把无线开关装上去的时候,发现 ESP32-C3 这个 WiFi 又它妈不停的重连又断开了,干。

生活

  • 收到了妈妈寄来的两只鸡!开心,现在就开始炖!

看得出来国外的 App 都不是太喜欢像国内一样用内置浏览器打开自家网页并保持登录状态的做法。然而苹果这样打开一个像极了原生 Music 的网页的意义何在?

1732011558715420887-GAlW8VFbAAAtUzU.jpg

待办事项

  • 晾衣服
  • 了解一下 LaunchAgent 并回复博客用户。
  • 把 世特力硬盘 控制器 成文;
  • 自动切换输入法成文;
  • 成文:把 MacOS 作为 HomeKit

阅读

学习

硬件

  • 把红外和遥控方案都做好了,就等盒子。

开发

  • 用 Swift 的 DistributedNotificationCenter 轻松做到了监控系统锁屏状态,可以方便同步到 HomeKit 了。

智能家居

  • 完成了把“锁定屏幕”和“音量调节”添加到了 #HomeKit

如何告诉 VS @code 不要这么给我省内存,我发现一天不关闭重启一下 vscode,就特别卡,鼠标点击都能 1 秒钟才能反应过来那种。

1731297663113650618-GAbNprVasAAvLG1.jpg

硬件

真就是……主板“插在”显卡上🥹

挺好看的😋 🌈🌈🌈

1729936555358482905-GAH4E6na8AAfVXj.png

系统

  • Ubuntu上竟然可以随意安装桌面环境或随意切换:How to Install a Desktop (GUI) on an Ubuntu Server
    • 为了测试 CH32V003 芯片的集成开发环境。。。太折腾了,Mac 上只有工具链。
  • 搞了半天桌面是装成功了,但是网络问题没解决,netplan,真难搞。
  • Cockpit 居然可以安装 Windows ……,QEMU 真神奇…… 服务器环境下也可以装。速度很快,神了,比在 MacOS 上用 UTM 模拟快多了。

硬件

  • 在 YouTube 上面看到一个介绍 RISC-V Linux 的小板子 MilkV Duo a $9 Linux board,然后在淘宝上搜索了一下,居然有卖,再把语言切换成中文,竟然是国内的,叫群芯闪耀,再一看地址,竟然就在旁边“中国广东省深圳市宝安区西乡街道流塘社区新安四路198号宝立方B座L8-01室”,在深圳给我的一点好处就是,一堆公司就在身边……
  • 买了 CH32V003J4M6、WCH-LinkE,以及转接板。

硬件

运维

  • 博客和家里服务器证书又过期了,Grafana 监控还是没到位😳。

待办事项

开发

  • MacOS 上居然有 /etc/paths 这个文件…… StackOverflow
  • 学会了使用 CMake!了解了基本语法后,直接上命令手册!

折腾

  • 把 MinIO 的“预览”用脚本改到了新容器!
  • 发现暴力猴🐒可以自动把备份同步到 WebDav!
    • 然后又发现可以从 URL 安装,这样更好方便版本化。

待办事项

  • 驾照满半年,注册滴答顺风车
    • 注册失败,明天继续
  • 差评红外遥控器,明明是 CR2025,发的是 CR1220。

硬件

  • 学习了 STC51 单片机的软件复位进入下载,不用受 Device Not Configured 困扰了。

待办事项

硬件

  • 终于找到了 HomeKit 开关为什么明明关闭了,但是重新打开又显示为开的问题:
    • IO 口输出 1 的时候,确实灯关闭了
    • 但是如果此时读 IO 口数据,会显示为 0,只有 0.8V 的样子,为什么会这样呢?
    • 接线:IO 口 → 三极管(NPN)→ 继电器
    • 是因为三极管 BE 极是二极管,压降被控制在 0.7V 左右的原因吗?
    • 基极缺限流电阻
    • 三极管数据手册:lcsc
    • L8050QLT1G,,Q 系列,。取中间:225,则 。限流电阻大小:,改变电阻的大小只会影响电流的大小,对吧?
    • 继电器周围要加续流二极管继电器为何要并联二极管
  • 给 HomeKit 开关增加了固件升级功能!
  • 淘宝上了解到了红外芯片

学习

以前觉得嘉立创打样挺快的,现在呢?至少至少2️⃣天的打板 ➕ 至少1️⃣天的顺丰,实在太慢了。还不如用洞洞板飞线,可无奈多数元件是贴片😮‍💨。

硬件

产品

  • 体验了一下 pkgx,第一印象好像还不错。主要看重是原 brew 的作者发明的。 #成文

折腾

  • 卸载旧版本 Homebrew: #成文

    • 下载脚本: curl -LO https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh
    • 手动执行:./uninstall.sh --path /usr/local
  • brew 的 bash-completion #成文

    安装过程:

    • 安装 bash-completion 时会提示:

      Add the following line to your ~/.bash_profile:

      [[ -r "/opt/homebrew/etc/profile.d/bash_completion.sh" ]] && . "/opt/homebrew/etc/profile.d/bash_completion.sh"

    • 这是一个软链接,指向:Cellar/bash-completion@2/2.11/etc/profile.d/bash_completion.sh

    • 上述文件会 source:/opt/homebrew/Cellar/bash-completion@2/2.11/share/bash-completion/bash_completion 文件;

    • 被 source 的这个文件来自 bash-completion 官方,但是有修改,会执行这个目录下的所有文件:compat_dir=${BASH_COMPLETION_COMPAT_DIR:-/opt/homebrew/etc/bash_completion.d}

    • 这个目录里面就是 brew 当前安装的包的 completion 文件;

    Brew 的 completion 文件看起来是自己写的:Formula/g/git.rb#L136-L137。不知道其它包管理器(像是 pkgx)怎么处