桃子的碎碎念

陪她去流浪 新建

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

还是很好听……

标题:おやすみ

专辑:Zwei!! Original Sound Track

作者:Falcom Sound Team jdk

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

#番茄花园 🍅,#复古

おやすみなさい。

#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,默认状态全部为“私密”。

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 图片大小修好了,就不会有我搞不定的事!除了她。

找了半天的图片转文字(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

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

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

在 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

技术

不知道啥时候把 blog@twofei.com 这个邮箱发件人的昵称命名成了 “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

待办事项

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

旅游

韶关丹霞山

景点描述

有两个景点: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”了,虽然当时我并不知道这句英语是什么意思、也学了好久才记住。哎~,女性成熟得真早啊。

网络

突然发现我的邮箱 chkesp@gmail.com 竟然扯上了 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 啊😭

这邮箱地址……真的难绷 😅😅😅,建议换成 kfpt@byd.com

1733865567692755396-GA_tT-3asAA2KL_.jpg

相同代码用 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

硬件

网络

  • anhbk@qq.com 作为 Firefox 的登录邮箱已经超过十年了,今天换成了 chkesp@gmail.com

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

挺好看的😋 🌈🌈🌈

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)怎么处理这个问题?并找到这些文件来自哪里。

待办事项

技术

  • 再次把 ChatGPT 安装了回来,这次登录时的报错是: IPv6 域名被禁止了(国内的),于是在 OpenWRT 里面把 IPv6 的解析禁用掉了(本来代理服务器也不支持),成功登录,并体验了语音功能。
  • 了解到语音助手的实现:
    • 先把语音转换成文字(比如 Whisper);
    • 然后用自然语言处理:
      • 分词(Tokenization)
      • 词性标记(Part of speech Tagging)
      • 命名实体识别(Named Entity Recognition,NER):识别文字中的实体,如人名、地名;
      • 语法分析:分析句子的结构和语法关系;

硬件

  • 经再次考虑,把老家的无线开关设备方案换成了 2.4G 方案。

    • 最直接的原因:不需要联网,电池供电,比使用 WiFi 稳定。如果家里网出问题,家里人解决不了。
    • 晚上用手机开关可能确实没有那么方便;
    • 爸爸的手机不支持 HomeKit;
    • 稳定 > 方便;
  • 看了这篇碱性电池测试 | 知名品牌的电池真的比较好吗?碱性电池的测试,电池🔋居然可以支持 500mA 的大电流。好强啊,比钮扣电池的 0.x mA 强太多了。看来我的无线按钮项目要换成电池了。

  • 串口通信协议是一种在串行通信中用于发送和接收数据的规则和约定。串口通信协议定义了数据如何被组织、传输和解释。在串口通信中,常见的协议包括以下几种:

    1. UART (Universal Asynchronous Receiver/Transmitter): UART是一种最基本的串口通信协议,它定义了数据位、停止位、奇偶校验等基本参数,但没有固定的数据帧结构。它通常是异步的、无差错检测的。

    2. RS-232: RS-232是一种标准化的串行通信接口协议,定义了数据格式、传输速率、电平等规范。它通常用于连接计算机与外围设备,例如串口打印机、调制解调器等。

    3. RS-485: RS-485是一种用于工业环境的串行通信协议,支持多点通信和差分信号传输。它可以支持长距离通信,并具有抗干扰能力。

    4. SPI (Serial Peripheral Interface): SPI是一种用于片上系统(SoC)中外围设备通信的同步串行通信协议。它具有高速、全双工、点对点或多点传输等特点。

    5. I2C (Inter-Integrated Circuit): I2C是一种用于短距离数字通信的串行通信协议。它允许多个设备通过同一条总线进行通信,并具有地址分配和数据传输的能力。

    6. CAN (Controller Area Network): CAN是一种用于车辆和工业领域的串行通信协议。它支持多个设备连接,并具有高度的实时性和可靠性。

    每种协议都有其特定的应用场景和优势,选择合适的协议取决于具体的通信需求,如距离、速率、设备支持等。

Be patient, be Positive.

1726871244426125707-F_cUBEyagAAaDqD.jpg

待办事项

  • 了解一下 LaunchAgent 并回复博客用户。
  • 把 goldmark wiki table 成文;
  • 把 世特力硬盘 控制器 成文;
  • 自动切换输入法成文;
  • 把 goldmark 的 wiki table 支持上线并提交 pr

社交

  • 刘能给 follow back 回来了,又一大佬🧍‍♂️!

硬件

  • 尝试了一下安装 stm32 的 Stm32CubeIDE,这年头居然还在用 Eclipse,过于老气横秋了。

  • 新名词:Sub-GHz: "Sub-GHz"是指低于1GHz的频率范围。在无线通信领域,Sub-GHz通常指的是低于1GHz的射频频段。这个频段包括从300MHz到1000MHz之间的范围,也可以是更窄的频率范围,如433MHz、868MHz或915MHz等特定的频率。

    Sub-GHz频段在无线通信中具有一些优点,例如:

    • 更长的传输距离: 低频率信号具有更好的穿透能力,能够在障碍物穿透和长距离传输方面表现更好。
    • 更好的覆盖范围: 由于信号穿透性强,Sub-GHz频段的通信信号在建筑物内部和城市环境中能够提供较好的覆盖范围。
    • 较少的功耗: 低频率的通信通常需要较低的功耗,这对于一些低功耗设备和电池供电设备而言是有利的。

    因此,在许多无线通信应用中,Sub-GHz频段常用于低功耗、长距离传输和穿透障碍物的需求,例如物联网(IoT)、传感器网络、远程监控等。

待办事项

折腾

  • 使用 go get 始终拉不下来最新的代码,结果靠 GONOPROXY="github.com" 搞定,妈的,真是气人。非要搞什么 cache。

突然发现维斯百科的 Tables 描述方式好像还不错,能用很简洁的方式描述出比较复杂/漂亮的表格。于是今天一时兴起不足500行代码递归🔄下降⬇️了一个 parser,准备集成到现在使用的 Markdown 引擎中🤔。(例子来自官方:

1726149029820829954-F_SA_saaMAA3SJ5.jpg 1726149029820829954-F_SBJYlbUAACMB-.jpg 1726149029820829954-F_SDJXTbUAAGHIB.jpg

待办事项

  • 了解一下 LaunchAgent 并回复博客用户。

音乐🎵

  • 竟然听了一天的朴树,第一次。有几首歌还是很好听的:
    • New Body
    • Forever Young
    • 空帆船⛵️
    • 平凡之路

woc,震惊🤯🤯 当年觉得 VB6 调用 Win32 SDK 太麻烦,玩了一年就放弃了。你们太强了。。。

第一眼竟然看成了是乔布斯的推特😅…… 不过,不管是“乔布斯”还是“工作”,这种场合都挺微妙的。

竟然离职了 🥲🥲🥲

硬件

  • 水位检测
    • 水位检测
      • 超声波 SR-04
    • 钮扣电池供电
      • 电压检测
    • 水位告警

想法

  • 翻到了旧项目 mind,是一个将 yaml 转换成表格的程序,类似于思维导图。我在想能不能把它改成一个描述表格如何生成的语言?用于方便地在 Markdown 里面嵌入复杂的表格。我又在想创造一门形式语言了?😄😄😄

都自我审查到这里来了 🥵,赶紧让苹果改啊🤪。

1725131826979815477-F_DmP63asAALAZg.jpg 1725131826979815477-F_DmP63b0AAwhou.jpg

待办事项

  • 关闭这个问题单:https://github.com/canonical/microk8s/issues/4296
  • 提醒闲鱼买家签收树莓派
  • 五分钟未使用电烙铁自动关闭主电源🔌
  • 把 Shadowsocks 跑在 esp32 里面?
    • 这样可以 轻松回家,如果再加个 DDNS,就太爽了吧?

工具

  • 对 nvim 配置了 im-select 脚本,现在在 Normal 与 Edit 之间切换的时候可以自动切换输入法了!爽爆😆

硬件

  • 折腾了一晚上树莓派 3B+,想弄成一个家庭影院/娱乐系统,过年的时候带回家,结果新学了一种包管理器 flatpak,但是始终没有搞定其沙盒的权限问题,难受☹️。
  • 拆了好多次小米的电脑挂灯,才发现原来是滚轮没有对准,难怪盖子合不好!😡

刚刚 #vscode 持续崩溃,才发现是 MacOS 空间满了,但是系统没有任何提示。等我发现并清理部分资源后再打开 vscode,发现其 profiles 全部丢了,最近项目列表清空了😭。都是些什么草台班子啊。

1724441920674394551-F-5xUqFWQAE42Bp.jpg 1724441920674394551-F-5xdJ2XYAARxVL.png 1724441920674394551-F-5yZgpXoAAemJG.jpg

待办事项

学习

  • SPDX: # The Software Package Data Exchange. 虽然看到 SPDX-License-Identifier 过很多次了,但是今天才知道这个是什么全称。我应该对新事物保持更多的 #好奇心 😳。
  • 终于知道什么是开漏了:
    • 开漏输出(Open-Drain Output)是一种数字输出模式,常见于集成电路中的输出引脚。这种输出模式的特点是在逻辑高电平(1)时,输出为高阻态(开路),而在逻辑低电平(0)时,输出为低电平(连接到地或另一低电平源)。开漏输出的优势之一是它允许多个设备共享同一信号线而不引起冲突,因为只有在有设备输出低电平时才会拉低信号线。这在I2C等总线通信中经常使用。

硬件

  • 在优信电子上面发现了 “一体化超声波测距模块 倒车雷达防水超声波JSN-SR04T”,感觉跟汽车雷达已经非常接近?HC-SR04 测量角度非常小(15°),而且对表面要求平整:0.5 m²,即 0.7m ⨉ 0.7m,这也太离谱了,实际体验并不是很好。用来测水面还行?
  • 电源电压抑制比 (Power supply rejection ratio, PSRR):在电子设备中, 电源抑制比是一个经常在电子放大器或稳压器的规格书出现的参数,用来描述某一设备对电源噪声的抑制能力。 电源抑制比的定义是电源电压变化做成设备输出的电压相应变化的比例。因为此比值一般较大,为方便使用,常以分贝作为单位,理想的设备其PSRR是无限大。维基百科 #术语
  • 天线,到底应该怎么摆放?
  • 格力空调 YAPOF3 红外编码

网络

  • 因为 Mozilla 提示我捐款失败了,更新了信用卡。终于想起来把 Paypal 的二次验证给打开 了,真难以想像只需要一个 密码就能登录进账户是什么安全体验🙄。

硬件

  • 在嘉立创的 PCB 下单中心发现了 3D 打印的选项,名字叫“三维猴”,看起来可以下单,但是有点儿贵。好在不用自己购买打印机了。
  • “有源蜂鸣器”和“无源蜂鸣器”:这里的“源”不是指电源。而是指振荡源。 有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一 定频率的脉冲信号,程序控制方便但频率固定,单片机一个高低电平就 可以让其发出声音。 无源蜂鸣器和电磁扬声器一样没有内部驱动电路需要接在音频输出电 路中才能发声。如果给直流信号是不响的,因为磁路恒定,必须用2K~5K 的方波去驱动它。声音频率可控,可以做出“多来米发索拉西”的效果。 在一些特例中,可以和LED复用一个控制口。来源

待办事项

  • 看电影🎬《奥本海默》
    • 看得睡着了,叙事有点儿慢,抽空再看一遍

技术

硬件

  • 第一次在嘉立创打印黑色的 PCB 板子,感觉非常好看。
    • 实测发现 WiFi 还是不容易连上,再次失败。

待办事项

  • 看电影🎬《奥本海默》

起点

  • 今天开始用日记本记录“待办事项”。

TIL

  • 刚刚竟然发现绿联的 USB Type-C 转 Type-A 的 蓝色 Type-A 竟然 4 + 5 根触点…… 太神奇了。。。 但是我好像从来没有见过这样的公头。。。
  • 绿联的 Type-C 扩展坞电源输出只有 4.2V,不知道是哪里坏了。搭了一个飞线,从 Type-C 输入,目前的输出电压是 5.2V,不知道会不会干坏我的外部设备。

折腾

  • 被 nginx 又浪费了几个小时。
    • 临时生成的文件不要跟配置文件放在一个目录!不然挂载到宿主机会看到,会影响下次启动!
  • 突然发现博客服务器上可以 curl curl / curl google 直接访问,但是又找不到是谁解析的。resolv.conf 只有 nameserver。

为了坐在床头看电影时方便调节电脑的音量。写了点代码跑在 MacBook 上,将它作为一个 HomeKit 配件。由于 #HomeKit 移除了 Speaker🔉 支持,我直接 fake 成一个可以控制亮度🔆的灯泡💡。😅😅😅 #智能家居

1722318620053909957-F-bnbZDbsAAcvf1.jpg 1722318620053909957-F-bnbWdaoAAh-Ct.jpg

数码

  • 终于写了个“自动运行.app“,可以无忧地启动需要登录后启动的命令了。
  • 把 MacBook 添加成为了 HomeKit 设备,这下可以在手机上控制音量了。😄

数码

  • 用了6️⃣年的绿联 USB-C 转 USB-A 扩展坞竟然出现了电源不稳定情况,ESP32 连 WiFI 会报 brownout resets。蛋疼。但是竟然发现它可以外接电源供电。试试。

ESP32 官方推荐的用户论坛,是如何做到又丑又极其难用的?🤔

最不能忍的时候还在使用上古 BBCode。。。

https://esp32.com/

硬件

  • 把世特力硬盘的 ESP8266 拿出来重新烧了个程序,加上了 #HomeKit ,几行代码搞定,爽翻😊。
  • 把罗兰电钢琴的 12V 电源直接接在 ESP32 的板子上,忘记了变压器输出端有个耐压只有 6.3V 的电容,几秒钟时间直接爆了,声音很大,味很重。难受。
  • 花了一天时间,终于把 ESP32-C3 为什么自动重启的问题解决了———省略了官方电路的电容。实在没想到这玩意儿影响会这么大。 这下好了,板子要重新画了。😭

想把家里的某有源音箱改成智能设备,这样的话, 坐在床头看电影的时候就不会跑到显示器面前去调声音大小了。可是……为什么 #HomeKit#Matter 都不支持 Speaker 呢?前者是取消了支持,后者是根本不支持。我能怎么办,我也很无助啊 🤔

1721103154572669044-F-KIfABbYAA19BI.jpg 1721103154572669044-F-KWLiGaQAAyozo.jpg 1721103154572669044-F-KWLiFasAAeop1.png

看着很精致🥺 最近正好做了一些智能家居设备需要盒子(我警告⚠️你们…),年初又学了画模型,看看这次双十一能不能买一个吧🥵🥵🥵

硬件

  • 自制的基于 ESP32-C3 的板子在连接 WiFi 时始终会重启,没找到原因,除了板子上没有接电容外,跟官方推荐的应用电路没有区别。苦恼😖,我好菜🥬。

  • 电源降压芯片 AMS1117,ESP32 官方用的是 SGM2212,看起来电流比较稳定?🤔 买了几个试试,也不知道是不是正品。另外,它也有电压可调版本,需要借助可调电阻(变阻器/数字电位器)。MCP40D18 看起来很不错(并且是 I2C接口),但是淘宝竟然没有卖的 😳,不应该啊(因为 17/19 都有卖)。

  • ESP32 官方利用 DTR/RTS 来自动复位以编程 的方式非常巧妙,见 ESP32-C3-DevKitM-1 原理图。必须盗走!

硬件

  • 始终没搞清楚为什么 HomeKit 移除了 Speaker 支持,Matter 也不支持。我想在观影的时候在我的手机上控制电脑的音量真的就这么难吗?

太真实了……🥵

笑死,点开“最近更新”,看到“已停止更新”…… 这是要走商业化路线了?🤔

1719910011869286585-F95Y4FgbEAAHKtO.jpg 1719910011869286585-F95Y9oragAAtqYr.jpg

这两天这网是明显地变慢了🤔,发生什么事了。。。

1719906816178749676-F95V2zobEAAk9DF.jpg 1719906816178749676-F95WDVbbgAAowBi.png

硬件

  • 搞了一天的 Ci24R1,虽然搞通了,但是很不稳定。不知道原因,放弃。考虑重新搞 ESP32 HomeKit / Matter 方案。
  • 之前访问 ESP32 的官方的时候发现 HomeKit-SDK 需要 MFi 认证
    • Espressif HomeKit SDK 仅提供给已获得 MFi 许可的用户。获取 SDK 时请务必提供六位数的 Account Number。

  • 今天到 GitHub 仓库却发现不需要了(可能一直都不需要)!!!开心!!! 放心扔了垃圾 51 单片机和简单的 2.4GHz 无线方案。
    • 用官方的例子添加了一个风扇,成功!

Type-A 可以给 Type-C 供电,但是 Type-C 不可以给 Type-C 供电(VBUS 没电)。我一定是第一次画 Type-C 板子。😧😧😧

这个 TLD 不错,所有的动名词/现在分词都可以拿来用了。🤣

硬件

  • 被 type-c 坑的一天 见与 深圳市海瑟威电子商行 的聊天。
    • 电脑和充电器 type-c 连 type-c 均无法给 stc8 板子供电,但是硬盘柜的 type-a 转 type-c 却可以,至今不知道为啥。
  • 从 stc15 迁移到 stc8 的过程中,因为定时器 2 和定时器 1 的默认分频方式不一样,导致浪费两个时间调试,最终修改 AUXR 的值调通串口。
  • SFRs in the 8051 architecture cannot be accessed through indirect addressing, so pointers are of no use.

无线方案

名称 成本 功耗 指向性(需要对准设备) 一个遥控器控制多个设备 远程控制 智能家居
红外遥控器 ⭐️ ⭐️ 否(室内)
2.4GHz ⭐️⭐️ ⭐️⭐️ 否(但是可以实现) 是(百米内) 否(但是可以实现)
手机 + WiFi ⭐️⭐️⭐️⭐️ ⭐️⭐️⭐️ 是(不限距离)

技术

  • SDCC 的 printf 函数竟然支持自定义 outputChar 回调函数extern int _print_format (pfn_outputchar pfn, void* pvoid, const char *format, va_list ap);。这样的话,内部就不用定义不知道需要多大的 buffer。交给用户来输出 。特别适用于在单片机上使用串口输出数据的典型使用。什么叫人类之光啊!太好使了。瞬间有点儿喜欢这个工具了。

看上来某国产便宜 2.4GHz SoC,但是光买个烧录器需要 300 多块钱。劝退 😅

1718830474238529629-F9qDEbabcAAV0EP.jpg

硬件

硬件

  • 看上了 ST 的 STM8L050J3 芯片,8 个引脚,想做一个手持红外遥控器,但是发现工具链太难搞了,放弃。芯片倒是很有吸引力:
    • 超低功耗:一颗松下 CR2032 电池,按低功耗正常运行只有 5uA。225mAh 的容量,可以跑 5 年!
    • 有 ADC,可以用来测电池的电压
    • 有红外接口
  • 再看了一下 MSP430,好像都需要专用的编程器与收费的工具链,快要放弃了,难道我还是得回到 51 😭?
  • 看上了 Ci2451,但是是小众产品,非常适合,但是没有资料。Ci24R1 也非常适合,但是不是 SoC。
  • 然后发现安信可有成品模组:2.4G,看起来非常不错。

我一直有个疑问:微博的话题是包含在微博正文内容中的,“不显示话题内容而显示搜索词结果”难道不该是完全相同的结果吗?🤔

硬件

  • 研究了一下在 Mac 上使用 STC 芯片的方式:
    • 编译器使用 sdcc
    • 下载器使用 stcgal
    • 效果还行,初次使用芯片的时候要进行频率校准:./stcgal.py -p /dev/cu.usbserial-110 -b 19200 -l 19200 -t 11057 ../sdcc/main.ihx-t 参数)
    • 参考文章:

游戏

  • 开外挂玩了一遍“林则徐禁烟”,这玩意儿是如何做到只有仅仅 4 关的剧情却有 512KB 大小的?非得对话,不然路都给你封了,简直智障🙄。 #NES
  • 玩了一把记忆中的“战斧🪓/斧王”,依然是垃圾中的战斗机,全程只有一两个动作。当年是如何单独作为一张大卡销售的?

学习

  • 原来 Chile(智利) 的发音是 BrE ˈtʃɪli, AmE ˈtʃɪli,我一直以为后面的 le 发音为 l。懵了…… 看来遇到陌生的知识真的还能妄图自己能猜对,还是需要当成新知识了解它、认识它。 #TIL

网易云音乐车载音乐还要单独开 VIP 🥵🥵

怀念 CarPlay😳

1712326387011559881-F8Nnw6TbkAA3Z5S.jpg 1712326387011559881-F8Nnw6TboAAaMit.jpg 1712326387011559881-F8Nnw6SbQAA9ubF.jpg

有鉴于节假日航班✈️一票难求,建议各机场增购10倍的飞机。平常没用的时候可以把闲置租出去或者机长🧑‍✈️自己去接活。🤔

学习

  • 听着 Apple Music 推荐的邓紫棋的新歌“唯一”时,发现有句歌词是“你真的希望你能厘清”,咦,这里“真的”……按照“的地得”的用法,应该用“地”呀,🥵!但是我自己也从来没有这样用过🥺。

网络

  • 终于想起把被盗多年的百度地图头像给换掉了。

#全屋新风

装修完入住一年多了,除了空调、冰箱这种传统神器之外,最推荐的是全屋新风。

一年多以来,家里窗户没开过,新风没关过。

优点: 1⃣可以立刻入住。空气流动,不存在甲醛浓度积累的问题。 2⃣️浮尘减少 90%。保守估算,擦拭数码产品的频率低了十倍。 3⃣️没有空气过敏。家人的花粉过敏和各种鼻炎症状不见了。 4⃣️神清气爽。长期在书房闭门办公,没有空气问题导致的困倦和不适。

缺点: 1⃣️安装费用和水平。和空调一样,风道、静音都考验安装水平。

其他缺点没了。买的国产品牌,机器和耗材都很便宜,功耗也不高可以 7*24 开启。

个人

  • 整理数据时,尝试把以前给雪舞读的故事博客数据库导出来,发现只有 MySQL 的数据文件了,为了导出 MySQL 语句,遇到了各种问题:
    • 忘记了 mysql 的版本,导致用 docker-compose 启动的时候报各种错误:

      db_1       | 2023-09-20T21:06:25.674785Z 0 [Warning] The plugin 'unix_socket' used to authenticate user 'root'@'localhost' is not loaded. Nobody can currently login using this account.
      db_1       | 2023-09-20T21:06:25.675092Z 0 [Warning] System table 'time_zone_leap_second' is expected to be transactional.
      db_1       | 2023-09-20T21:06:25.675531Z 0 [ERROR] Native table 'performance_schema'.'cond_instances' has the wrong structure
      db_1       | 2023-09-20T21:06:25.675552Z 0 [ERROR] Native table 'performance_schema'.'events_waits_current' has the wrong structure
      db_1       | 2023-09-20T21:06:25.675572Z 0 [ERROR] Native table 'performance_schema'.'events_waits_history' has the wrong structure
      db_1       | 2023-09-20T21:06:25.677161Z 0 [ERROR] Incorrect definition of table mysql.db: expected column 'User' at position 2 to have type char(32), found type char(80).
      db_1       | 2023-09-20T21:06:25.677173Z 0 [ERROR] mysql.user has no `Event_priv` column at position 28
      db_1       | 2023-09-20T21:06:25.677256Z 0 [ERROR] Incorrect definition of table mysql.event: expected column 'definer' at position 3 to have type char(77), found type char(141).
      db_1       | 2023-09-20T21:06:25.677282Z 0 [ERROR] Incorrect definition of table mysql.event: expected column 'sql_mode' at position 14 to have type set('REAL_AS_FLOAT','PIPES_AS_CONCAT', ...
      
    • 虽然 MySQL 还是启动成功了,但是 mysqldump 不行:

      root@d587871a3053:/# mysqldump -h 127.0.0.1 shirley
      -- MySQL dump 10.13  Distrib 5.7.9, for Linux (x86_64)
      --
      -- Host: 127.0.0.1    Database: shirley
      -- ------------------------------------------------------
      -- Server version	5.7.9
      
      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8 */;
      /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
      /*!40103 SET TIME_ZONE='+00:00' */;
      /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
      /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
      /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
      /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
      mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'gtid\_mode'': Native table 'performance_schema'.'session_variables' has the wrong structure (1682)
      
    • 然后尝试用 mysql(cli)直接导出,不行,没有办法,只能查看 select 的结果。

    • 然后就是用 adminer 登录后台:发现原来的数据库没有设置密码…… Adminer 4.6.3 及以后不允许……

    • 换了 Adminer 4.6.2 后成功进入,并导出成功

    • 可以删除数据文件了。

    • 长记性啊!以后可只能保存 sql 文件了,不要再保存不知道版本的 mysql 数据文件夹。

生活

  • 今天在神舟租车租了一辆坦克 300 来试着开一下,有点儿贵,388 。说说体验:
    • 和普通油车没什么区别,踩油门反应很慢;
    • 车重,发动机声音大;
    • 非常耗油。开了 165 公里,花了 185 块钱油费。平均 1 公里 > 1 块钱。简直离谱!!!再也不想开油车了!!! 185 块钱在家里可以充满电接近 10 次,可以跑至少 3000 公里!离谱!!!
  • 这几天预制菜突然闹得沸沸扬扬,我尝试在京东上面买了一点来吃:猪肚鸡、梅菜扣肉。还买了一包鱼皮,但是味道根本不如在香港买的那个,光一股盐味,不好吃。

数码

  • 熬夜看了苹果 iPhone15 的发布会,有点儿想买,但是 Pro Max 1TB 的价格要 13999,放弃。

个人

  • 今晚第一次使用金花推荐的爱柔肤系列护肤品🧴,花了 2000+ 块钱(实在太贵了!),也不知道有没有效果,简单记录📝一个起点吧~

ESP32-CAM 拿 multipart 数据放 来显示视频 是什么我没见过的高级玩法?🤔️

1700891099508900267-F5rHNNuaMAAcqrj.jpg

屏蔽➕静音后再次进入依然能看到,什么狗屁膏药马斯克啊

1676408311040860161-F0PMeECakAEJnfv.jpg

你果就是解决不了电池电量🪫偷跑的问题。

1674690180442390531-Fz2xpkGakAAJ2qL.jpg

技术

  • 不知道为何从其它主机 ping openwrt 时断时续的,花了几个小时才发现又是 docker 的转发规则导致的(文章里面写过),但是为何是时断时续的?又花了近一下午的时间来处理,哎,网络问题真难啊 ☹️。

生活

  • 最近在云南跟妈妈一起看《三分野》,里面的插曲《心里的流星》非常好听,在 Apple Music上一搜,居然是周惠唱的,这声音居然这么多年未变 。依然这么好听 。

    一直挺喜欢听周惠的歌的,但是我这种害怕去发现新歌、又害怕错过好听的歌曲的应该如何是好?

    逛维斯百科资料发现周惠的英文名竟然叫 Where Chou,怎么会有人用 Where 作名字啊?🥵她的小名 惠儿?

技术

  • 通过一张二维码终于知道了什么是 HDR,还是挺神奇的 。

GitHub 在 block s.b. 的时候可以填 optional note,这就很 git 的。(不然我会忘了我为什么会这样做)

1669378861254209537-FyrTOCiaAAIUgtG.jpg 1669378861254209537-FyrTOCiaMAA87y3.png

生活

  • 买了明天清早的机票,去昆明看看妈妈 。
  • 中国电信广东省电话网络竟然遭遇大面积服务中断,无服务信号、空号 。

有意思,这是被 syn flood / DDoS 攻击了?

1666093825578921992-Fx8neGBaAAIovQP.jpg

#rarbg 近 300 万部,近 6000 T。🤔 空间不够用了。️

1665848650591764480-Fx5H-wraAAAKHDJ.jpg

技术

  • 熬夜看完了 #WWDC 23,第一次看。感觉今年没有必须买 iPhone 15 。
  • 磁力链接的 btih 种子哈希竟然可以不是十六进制! https://twitter.com/majin_shinsa/status/1664972757208276993/photo/1
  • 发现博客服务器流量又被跑光了,并且发现大量 SYN_RECV 状态的连接。用 nethogs 命令看到有个连接在 2M/s,但是每次启动 nethogs 都显示不同的连接,搞不懂是为什么。从厂商的后台统计数据看到才恢复一个小时,流量已经跑了 30G 了。
    • 折腾了很久,不知道如何解决。先关电源关了。

生活

  • 我发现喉咙痛好像是因为空气太干燥的原因(整天开空调),持续喝水以后,喉咙就不痛了。多喝水!

ChatGPT 被强制登出了,看来换地区也不行了。到底是怎么检测到我不在美国的(地区设置和登录谷歌账号都是美国)?学多邻国用时区?时区改了我可没法适应啊。😡😡😡

生活

  • 在抖音上看到一部爽剧《回到古代当太子》,要收费,竟然在油管上面找到免费的,然后发现非常多类似的,看了通宵一早上,连看了四部剧。🥵🥵🥵

“此人已被永久禁言。”

1664529270612561922-FxmYcvHaIAEAnAg.jpg

生活

  • 儿童节快乐!收到了妈妈的儿童节红包🧧。
  • 今天一觉睡到快中午时分,头特别晕,还伴随着发烧,很难受。
  • 一天没吃饭,晚上一个人去吃了探唐烧烤,搬过来几年了,第一次去吃,味道还行。 吃了饭回来睡了个觉,一觉睡到接近 23 点,头还是很晕,不知道是为啥。 期间还一直做恶梦:科三停车前一定要经过某个点,并且速度不能超过 30 。🙃 反反复复做了几十次。 终于不想睡了,爬了起来。

醒醒!起来换证书📄了!

1663412520659607552-FxWg2DkaAAAJBZi.jpg


舒服了。。

1663420915852673026-FxWoeFdagAASZNZ.jpg

技术

  • laixintao 竟然关注了我的博客,收到了他的评论
  • 监控面板增加了一个证书过期倒计时面板,再也不怕证书过期了。但是告警规则用得还不熟,通知消息时而发时而不发的,有点儿奇怪。

GoDaddy 居然有真人在线客服💁的。。。

1663088284430635009-FxR565JaQAI8w88.jpg

Docker(包括 Compose)默认的端口居然默认是暴露在 0.0.0.0 上面的,真是离谱。(我真的没见过多少人会写 IP 地址的,基本上只会写 端口:端口)。这不一下子把服务器的端口直接暴露在公网上了。😡 这么多年 Docker 白用了。

1663010371882614784-FxQyEgUaYAEF0W3.jpg 1663010371882614784-FxQy1rAagAEi7bY.jpg

技术

  • 刚刚发现 docker 的端口默认是暴露在 0.0.0.0 上面的,才发现博客的 grpc 端口也暴露在公网了。Twitter
  • 把 blog 的服务器 do-release-upgrade 了一下,然后挂了。重新 install 了系统,只需要备份 servers 目录即可。目前看来一切正常。

技术

  • 早上一爬起来又收到了 VPS 带宽被耗尽的邮件。但是,这次不像是被别人下载文件耗光的,看了下官方的统计数据,是以 5.6 M/s 的速度持续下载了 10+ 个小时的数据。但是我目前没找到是哪里的下载导致的。
  • 学会了使用通配符域名,之前的很多个 xxx.home.twofei.com 可以全部去掉,保留 *.home.twofei.com 即可。

生活

  • 来华强北给手机换了块电池,160,换的电芯。不知道好用不。

  • 在市民中心看到了带灯带的风筝🪁

  • 搬到这边来几年了,终于吃了一次“王麻麻小龙虾”。

生活

  • 拿到驾照🪪了!!!科三一把过,满分💯,科四裸考 94 分!开心极了!🥰🥰🥰

生活

  • 去模拟了科三,感觉还是好难,明天仍然没有把握过。
  • 发现 谢 把我的 telegram 消息全部清空了。

技术

  • 查看 nginx 的日志发现上次 vps 流量用完是因为被别人循环下载博客上的“天使爱美丽.pdf“文件给刷完了的,不是我自己用完的。难怪。
    • 刚才写了段代码,建立 256 个 ssh 连接到它的 IP,不知道它还能不能连上它的 ssh。

为了删除已经推送到 GitHub 的大文件,必须把仓库删除再重建…………🥵 不可思议。

1660855308917387264-FwyLE9VaAAA5-a9.jpg

操作步骤

  • 创建了两台虚拟机:alpine-host(192.168.1.217),alpine-client(192.168.1.88)。

  • 设置 client 的 gateway 为 host:

    1
    2
    3
    4
    5
    6
    7
    
    # cat /etc/network/interfaces
    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet dhcp
    	gateway 192.168.1.217
    
  • 通过 ssredir_tproxy.sh 成功从 client 请求 Google。

    • 原理:在 host 机器上将流量通过 iptables 转换到 ipt2socks 进程内处理
    • 进程将其转换成 socks5 client 协议,然后请求代理 socks server 服务完成翻墙。

iptables 规则里面有两条没看懂,TPROXY 没定义,不知道跳哪里去了。

hand over the marked package to TPROXY for processing

1
2
iptables -t mangle -A PREROUTING -p tcp -m mark --mark 0x2333 -j TPROXY --on-ip 127.0.0.1 --on-port 60080
iptables -t mangle -A PREROUTING -p udp -m mark --mark 0x2333 -j TPROXY --on-ip 127.0.0.1 --on-port 60080

查到了,竟然是 Linux 官方标准模块…… Transparent proxy support

相关工具

  • ipt2socks 将作为 gateway 的流量转换成 socks5 client 后请求 socks server 将流量发送到境外;

技术

  • 基本上搞懂了,OpenWRT 软路由的工作方式,非常开心 🥳。 接下来就是做一个自己的,ImmortalWRT 实在太丑了,功能繁复,用不着。

技术

  • 备份电影到 nuc 时,先备份创建时间(rsync 的 -N 参数),结果发现 nuc 上面的 rsync 版本太低(2018 年的)不支持。真是奇怪🤔️,ext4 这类文件系统是有什么奇怪的理由默认不开启保存文件的创建时间?

    那我手贱升级一下系统版本吧,希望不要“滚挂”!😡。论什么是动力啊!

    花了一个多个小时,更新成功。重新安装 Docker 后把我的防火墙默认 POLICY 又改成 DROP 了。花了好一阵才解决。

技术

  • 安装了 #ChatGPT iOS 官方客户端,却死活用谷歌登录不了(电脑端可以),开全局防火墙也不行,于是我就好奇,我又没开定位,它是怎么知道我在哪里的?然后我发现手机系统设置里面有一个“语言与地区”,地区是中国,我尝试改成“美国”,然后发现可以了!身在中国__在美国🥲。

生活

  • 买了两瓶 #维生素 B,OTC 的。希望皮肤能好一点儿?

生活

  • 在拼多多买了两块 Apple Watch 表带,大小合适,终于不用在手腕上打圈了。

学习

  • “五一”挤死也要旅游,图个啥?用马斯洛需求层次理论分析一下
    • 五个层次
      1. 生理:食物、水、空气、睡、性
      2. 安全:身体、财产、事业
      3. 爱与归属:亲情、爱情、友情、社交
      4. 尊重:自信、收获尊重
      5. 自我实现:个人理想与抱负
    • 代表
      • 西游记:唐僧、孙悟空、沙和尚、白龙马、猪八戒
      • 工作:发工资、五险一金、团建、表扬/晋升、自我实现

一不小心没注意到用完了 VPS 的流量,直接导致彻底失联了。。。村里终于通网了。。。

世事无常,R.I.P.

1658057776474787841-FwKaX5AaQAEE4XD.png

技术

  • 一早起来发现 HostDare 的 VPS 流量用完了……宅家这段时间看油管真多啊!导致失联了好几个小时。并且,新买了副本,从早到晚旧 VPS 的网络彻底不给用了(可以在网页上 VNC),不知道怎么把旧数据迁移到新 VPS。
  • 另一个更惊讶的消息是,陈皓(@haoel)先生因为心梗意外离世了。
  • 搞了一晚上,把代理进程全部改成了 docker,并且开启了负载均衡。跑一下看看效果。

技术

  • 使用 WebSocket 重写了 http2tcp,支持连接断开自动重连。以前想写的“永不断开的 TCP” 好像完成了?🤔️

最近家里代理服务器很不稳定,不知道是不是有啥大事?奇怪的是我发现直接打开服务器上的网站却秒开,是不是我 443 端口的 nginx/tls 特征伪装被识破了?🤔️

于是我用Go WebSocket写了个代理编译成WASM直接跑在无头浏览器Chrome里面,目前看来很稳定。️🤔

最成功的“伪装”是:我真真正正是个浏览器?

1657388986309169152-FwA4eL-aUAEd6Vq.png 1657388986309169152-FwA5FtsaQAE2SlQ.jpg 1657388986309169152-FwA5p1oakAEVJgT.jpg

技术

  • 基于 无头浏览器 + WebSocket 实现了五个真正浏览器级别的代理软件,会不会比 GO 的 TLS 特征更好?

写了个油猴脚本,自动下载点过赞的油管音乐视频🤔️不怕本地没音乐了,实在无聊用 ffplay 无打扰播放一下也行。😂

1656335584208756736-Fvx7mNjaMAIRuNS.png 1656335584208756736-Fvx724JaYAAg63J.png 1656335584208756736-Fvx8MJ6akAMAoyP.jpg

技术

  • 弄了个油猴脚本,自动下载油管点赞过的音乐视频。不怕没资源了!

为什么要把该开发者解决的事情丢用用户去解决。有本事不写 Cookie?

1655937664435228675-FvsSWWGakAAK1Oc.jpg

在把 2015 年花 299 买的漫步者音箱拆开加装个蓝牙模块改成无线时发现,这货居然用的是 TDA2030/2050 😅 这可是在学校那时用的玩意儿啊。。。

1655882834090004480-FvrgnU6akAEIQ4u.jpg 1655882834090004480-FvrgoS0aIAAm0Gu.jpg

娱乐

  • 一口气看完了《漫长的季节》,感觉就是个加长版的悬疑电影?

技术

  • 这都什么年代了,C++ 从字符串里面解析出一个数值居然还是非常复杂:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #include <iostream>
    #include <charconv>
    
    int main()
    {
        const char* str = "1234";
        int num;
        auto [p, ec] = std::from_chars(str, str + std::strlen(str), num);
        if (ec != std::errc()) {
            std::cerr << "Error: invalid integer string\n";
            return 1;
        }
        if (p != str + std::strlen(str)) {
            std::cerr << "Error: invalid characters in integer string\n";
            return 1;
        }
        std::cout << "Parsed integer: " << num << '\n';
        return 0;
    }
    
    

我给加了个 HomeKit 协议支持,现在可以在手机上随时控制开关与查看状态了😅 太能折腾。。。

1654119735200722945-FvSc_z8aEAMNm-m.jpg

板子打好了,花了点儿时间焊上去,正常工作!🥰

1653988085896740864-FvQlRPMaAAI-MeA.jpg 1653988085896740864-FvQlRQBaMAAiihn.jpg 1653988085896740864-FvQlRPpakAA8Uql.jpg

技术

  • 嘉立创打的板子到了,很快焊好 ESP8266,工作非常好!
  • 让硬盘柜风扇支持了 HomeKit!算是我制作的智能家居的第一个设备!

跟着别人的视频初学 3D 建模,人家 1⃣ 个小时的视频,我边看边做花了 5⃣️ 个小时 🥵🥵🥵 可太难了。

https://youtu.be/ZCGhYYpyf84


然而还不太像……

1653346398182731778-FvHdxfDagAMtVpq.jpg


看截面像一点儿~

1653348730840698880-FvHf5UBacAUVT-K.jpg

我也想要一个谷歌面试机会🥹🥹🥹

(这款 ESP32 没有硬件 PWM,效果不是很好。)

生活

  • 不知道为什么把“系统服务”的“指南针校准”给庆掉了,一直使用苹果自带地图的时候不显示方向给我气死了。

在家里划水两个月,捡起了8⃣️年前的爱好……