I am LAZY bones?
AN ancient AND boring SITE

WordPress文章如何同步到X

其实,十几年前,我的blog就有这个功能的,比如:

当时用的是一个叫 WP2Twitter 的 WordPress插件,当时的逻辑也非常简单,有新post的时候,就把标题和URL拼一个字符串,直接往Twitter发了,而且那时候Twitter的权限也比较松。

最近重拾blog以后,想着也把这个功能恢复一下,而且现在不是有AI了嘛,其实还可以更进一步,不仅可以输出标题,还顺便把文章的内容做个大致的摘要,可以让有兴趣的朋友点进来,也可以避免浪费对此内容不感兴趣的朋友的时间。

搜了一下IFTTT、RSS转X等方案,其实倒是有很多平台都能实现,但要么功能过于强大,搞得很复杂;要么需要订阅,要交一笔费用。后来眼光还是回到WordPress插件上来了,还真让我找到一个至少非常适合我的插件,分享给大家,如果有需要的话,也可以参考。

这个插件叫 Automator,其功能非常强大,可以连接WP和各种社交媒体和平台,部分功能也需要订阅pro,但发布到X,则是免费版就够用的。
点击查看全文 »

《显微镜下的大明》读后感

《显微镜下的大明》是马伯庸老师写的一步纪实文学作品,“纪实”这点毫无疑问,书里引用的全部是非常严肃真实的史料,比如民间档案文书、地方志和相关学术研究,有一些还是很难得一见的史料。

虽然纪实,你完全不会感觉到枯燥无味,这也充分体现了马老师的文字功底。像讲故事一般,把一个个生动活泼的案例抽丝剥茧,娓娓道来。其实选取的这几个事件本身,也足够有戏剧性,情节跌宕起伏,真的是真实永远比虚构更精彩。
under_microscope

这几个故事里,我想只讲我对印象最深的那个故事——大明第一档案库的前世今生——的感受。
点击查看全文 »

聊聊Unicode和emoji

这两天,在和一个老友研究一个和emoji相关的技术问题。

早上又刚好看到一个google的invitation,在Gmail页面(macOS下的Safari浏览器)和iOS下的Gmail APP里,显示的效果不一样,甚至在同一个Safari浏览器下,Gmail页面和Google calendar页面的效果也不一样。如图:

emoji_show_diff
左:web页面;右:iPhone Mirroring的APP界面

这就激起了我的好奇心,想深入分析了一下Unicode和emoji的一些细节。正式开始前,先叠个甲:这里面的技术细节水非常深,我今天的“初探”难免会有错误和不完整的地方,欢迎留言讨论交流。
点击查看全文 »

开普敦马拉松

虽然在X上已经简单说过几句,但鉴于这个事情太离谱了,我还是想专门再写点文字吐槽一下。。。

先从前一天10月18日说,和所有的马拉松一样,今天是领参赛包的日子,连续玩了几天的景点后,今天也是休息日。睡了个懒觉,10点多才起来吃早饭,然后去体育场领参赛包。

参赛包领取流程和国内的类似,甚至更简单,凭邮件通知就可以领取,拿到东西后,会经过一个很长的设置好的“赞助商展示购物区”,还挺热闹的。
点击查看全文 »

自主控制WordPress的图片尺寸

你往WordPress上传一张图片的时候,它有可能会给你在后台生成7、8张不同尺寸的图片,比如这样:

其实这对于大部分人来说,都是一个蛮好的功能。比如小白可能会把手机拍的几个MB的图片直接上传上来,那对于web显示可能就太大了。有个自动缩略就很合适了,既能节省带宽,页面加载又快。

但我偏偏是一个喜欢“手动档”的人,我想自己来控制这些尺寸,上传前就会对图片做适当的压缩。这样服务器里也就不用存储这多张图片了。

问了GPT,以下方法对我是有效的:

  1. WordPress后台 → 设置 → 媒体,把缩略图/中等/大的宽高都设为 0,保存。//这里能少3个图片
  2. 在WP主题的 functions.php 里,加入以下代码:

完事,现在你传什么,服务器就只存什么了。

PS:查资料的过程中,还了解到现在浏览器有个srcset响应式图片,大致是,HTML的img标签里,除了正常的src以外,还会提供一个srcset,然后浏览器就可以根据当前屏幕的尺寸来决定具体请求那个资源了,下面是个例子,听起来是挺不错的。

折腾自己的blog,而不是直接用平台,就是有这些乐趣(如果你也觉得这是乐趣的话),哈哈~

在新加坡如何退回水电费押金

在新加坡租房(或者买房)的话,肯定会接触“SP group”这个APP,是用来交水电费和垃圾处理费等杂费的。

租房的时候,你需要去开通一个账户,后续的水电使用就可以通过这个APP查看并缴费了。也可以绑定信用卡或者GIRO(理解为定期付款)自动处理,其实还挺方便的。

如果有接触过,可能也已经注意到了,第一期收费的时候,会有一个200-800块钱的Deposit,那这个钱在你的租期结束(或者卖房)的时候,是不会自动退换给你的。这点就完全不像缴费的时候那么方便了,也顺便吐槽一下。

那怎么才能退回来呢?办法还是在SP group里操作,找到 Utilities Services,如图找到“Refund Request”:
点击查看全文 »

要少用X了

最近日益觉得,要少刷X了。

首先,是“刷”的体验,这个体验某种意义上来说是“太好了”,总让人停不下来。之前Twitter时代,基本上是你fo了哪些人,就看那些人的内容,你的timeline真的是你决定的。但现在X里有for you,这里的内容几乎是无限的,而且是以短视频内容为主,点开一个也能上滑看下一个,这不就变成tiktok了嘛。。。亏我刻意避开tiktok,可不能在这里栽了。

其次,是“发”的体验,这个体验现在就是“太差了”,X现在的曝光和浏览,明显向付费的蓝勾子用户倾斜了。这本无可厚非,毕竟人家付钱了嘛,但普通的用户的体验变差了,我就不再在X玩也属于无可厚非吧。

于是,我就寻思着,反正发在X上,也没有多少人看,不如重新启用自己这个上古的blog,之前一直维持着这个站点,是为了纪念;现在重新启用,不是更好吗?毕竟这里一切都可以自己说了算,没有字数限制、可以随时编辑,最重要的是,也不用付额外的钱。还可以避免刷太多浪费时间。

至于浏览量啥的,经过这么多年,已经完全没有期待了,这样更好,也没有啥压力,因为以后发的东西都是自己的碎碎念。
其实如果你往前翻,十多年前我写的东西本身也就是碎碎念,有时候就一两句话,也会当作一篇“文章”。倒是到后来,中文博客流行起来以后,关注我这个小站点人也慢慢多起来了,甚至一度左耳朵耗子的酷壳都加了我的友链,发东西就没有那么自在了。那时候觉得如果发得东西太水了,有点对不起读者,但自己又太懒了,没有那么多优质的内容可以发,所以慢慢就沉寂了下去。再后来中文博客整体都沉寂了。再再后来连网页也都沉寂了下来。。。

所以,现在反正不会有太多人看来,也就想通了,发的内容就当给自己记录吧。毕竟这里搜索起来也比X方便,嘿嘿。

最后,我很喜欢马斯克,希望他能带领人类登陆火星,但也不认同他对X的改变,更不认可他要把X做成微信。

今天就碎碎念到这吧。

飞猪体验太差了

别的不说,就拿买机票举例,你永远无法以“搜索结果”页面的价格,买到你想要的机票。
是的,相同航班的机票,你试着在携程和飞猪搜索的时候,往往飞猪的会便宜个几十块钱,然后,套路就开始了。
先给你推个“超值精选”,就是机票加上若干保险套一起,要去掉保险,你眼神首先得好,能找得到小字入口才行。然后会给你各种行李额度的捆绑之类的,最后你会发现之前的价格,是有附加条件的,你要完成一个什么“联订”才行。。。
点击查看全文 »

香港和新加坡的居住条件

香港和新加坡是两个经常被拿来比较的对象,面积、人口体量都比较类似,也都是曾经的亚洲四小龙。
但就居住条件而言,坡县确实比香港好太多了,即使坡县的组屋,比香港的鸽子笼也强不少。今天在办公室往外看,突然想到了一个原因:SG的绿地,其实是分布在住宅中见的;而香港的则是住宅区是住宅区,森林是森林。也就是“和牛”和“五花肉”的关系。均匀分布的感受,就会好很多。
SG窗外

用ktransformers跑671b的DeepSeek R1

最近这两天,在折腾拿一台4块V100的GPU卡,来跑个671b准满血的DeepSeek R1,遇到了很多问题,也解决了很多问题,当然估计还留下很多问题。这期间遇到一个个的挑战,搞定一个后又遇到下一个,突然有点十多年前折腾linux的时候的意思了,觉得挺好玩的,就也像以前一样,稍微记录一下吧。

先说下背景,我这台机器的配置是比较古老的数据中心版的GPU机器,显卡上面说了是4块V100,每块16G显存,cpu只有20核、内存256GB、数据盘1.5T,系统是ubuntu 20.04。这硬件拿来跑671b确实是有点捉襟见肘,最终的结果也只是1 token/s 左右,并不具备生产价值,只是研究而已。

我最先遇到的问题,就是由于这个机器很多人有权限,而是最恐怖的公用一个linux账号,环境被搞得想当乱,python都是各种版很多套。所以我最先做的就是梳理环境,用了Miniconda搞了一套干净的python-3.12的运行时,后续的各种包都独立维护。
另外,原先的Nvidia驱动也有两个版本,我也顺手给升级并统一了一下,查了各种资料后,发现这个架构比较旧的显卡最好还是不要安装最新的(12.8)驱动,所以我安装了12.6的版本。
然后,我的思路是,在本机直接编译一个ktransformers,这样才有最大的自由度,我感觉这是最终能跑起来的关键,因为到最后还需要现场修改一些代码才能跑起来。
从源码编译安装的过程主要参照官网文档,但在执行 bash install.sh 之前,还需要干两件事:

  • 一个是export TORCH_CUDA_ARCH_LIST="7.0",这个7.0的值,就是V100的硬件架构。
  • 另一个是 pip3 install flash-attn,这个模块虽然在V100下最终没有用到,但不装会报依赖错误

现在,按照官方文档的说法,应该是要可以跑起来了,然而你跑 python -m ktransformers.local_chat --model_path ./DeepSeek-R1 --gguf_path ./DeepSeek-R1-Q4_K_M的时候,大概率会在load很久之后,报一个错:

RuntimeError: CUDA error: invalid device function
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1
Compile with TORCH_USE_CUDA_DSA to enable device-side assertions

这个问题,我折腾了很久,简单来说大概就是因为过程中会调用flash-attn,而flash-attn其实并不支持V100,在官方的issue列表里搜了一圈后我发现还真有人遇到类似的问题了,而且也贴了一些解决方案,评估了一下,我最终是按这个办法来做的,这里我感觉大概是刻意避开了对flash-attn的调用,可能会影响效率但不会报错了。其中第五步,对ktransformers/ktransformers/operators/attention.py的修改,是用了这个据说更快的方案。。。
改完再运行,还是会报内存不足的错误(可能是显存不足),因为默认只会用单块V100,16G的内存显然是不够的,这时候需要加 optimize_rule_path 参数,给一些优化规则,实测可以这样:python -m ktransformers.local_chat --model_path ./DeepSeek-R1 --gguf_path ./DeepSeek-R1-Q4_K_M --cpu_infer 20 --optimize_rule_path ktransformers/ktransformers/optimize/optimize_rules/DeepSeek-V3-Chat-multi-gpu-4.yaml这个DeepSeek-V3的4卡规则,对于R1也同样有效。
加了这个规则以后,加载过程应该就可以看到会加载到不同的GPU去了,nvidia-smi也能看到4块卡的显存都用起来了。
最终应该就可以响应你的问题了!虽然大概只能到1 token/s 左右。。。

至此大致结束,后面又折腾了一下web的配置,大概也是根据官方文档来的,这个没啥特殊就不展开了。
最后,感谢朋友发的这篇文章,就是这篇公众号文章让我开始有动力折腾这个事情的,哈哈!