碎碎念

陪她去流浪 新建

原来,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');
没有评论 页首

2024-05-13.md

待办事项

  • 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️⃣个小时。就像和绝大部分高速公路拥挤一样,当你快速多次地穿梭于车辆之间后会发现,前面简直是畅通无阻、一片光明。什么,光明?我感觉今天的拥堵实属就是对同事买车最大的讽刺。

3条评论 页首

2024-05-11.md

待办事项

  • 加入十年之约还者开往。
  • 保活检测
  • 证书过期检测
  • 正在维护 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
}

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

我真是个天才。

1条评论 页首

如果评论中带列表(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. 世间所有路都将与你相逢
3条评论 页首

不知道是哪天,为了显得行文更正式一点儿,我特地给“妳”添加到了自定义短语里面,输入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 */;
1条评论 页首

2024-05-09.md

待办事项

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

这篇关于在二进制位中定位包含 1 的位置的论文1 PDF 《Using de Bruijn Sequences to Index a 1 in a Computer Word》好奇怪,选择的时候一团糊(别说,还挺好看🤩)。导致我 MacOS 的单词快速查看(QuickLookup)功能也彻底废了。

1.jpg

没有评论 页首

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

看了很多上传文件相关的文章,但是都没有采用(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)
}
2条评论 页首

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

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

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

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

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

2条评论 页首

2024-05-06.md

待办事项

  • admin/script.js 为什么没有缓存?
没有评论 页首

2024-05-05.md

待办事项

  • 编写统一的重未登录定向处理器。
  • 成文: 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")
4条评论 页首

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

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

没有评论 页首

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

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

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

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

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

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

5条评论 页首

2024-04-29.md

待办事项

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

技术

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

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

没有评论 页首

2024-04-28.md

待办事项

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

技术

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


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

没有评论 页首

2024-04-27.md

待办事项

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

技术

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

没有评论 页首

2024-04-26.md

技术

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

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

没有评论 页首

2024-04-25.md

技术

一句错误的代码:

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>');
没有评论 页首

2024-04-24.md

技术

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

待办事项

  • 写个 age 加密的教程。
  • 发现 age 可以直接上 ssh 的 key,曝爽!
没有评论 页首

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

1782445642662695037-GLyEuBubEAAljo9.jpg

没有评论 页首

2024-04-22.md

技术

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


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

待办事项

  • 把博客美化评论内容成文;
没有评论 页首

2024-04-21.md

技术

了解了一下新的 Go 1.22 版本的 ServeMux,已经支持 带 METHOD 的 Handler 了。可以废掉我在 TaoBlog 中写的带 Method 的 ServeMux 了。

没有评论 页首

2024-04-20.md

待办事项

生活

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

没有评论 页首

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

没有评论 页首