世界名画

去年换办公室时,买了一些艺术鉴赏类的书籍,让办公室看起来不是那么技术线和管理风。

不过后来工作变动,于是搬回家。

这些名画介绍的书籍很多,现在AI如此发达了,估计烧几十块钱的token,也能做出一个类似原创的《世界名画》之类的。

不过,自己看,和AI写出来,是两码事了。这是按画家的年代顺序来排列的,每个画家大概1~3幅作品。自己溜达美术馆/博物馆,跟有专业人士讲解差别很大。

看画册,纯图片和有高质量的文本说明也差别比较大。

不过画册唯一不好的地方是,原作很多适合肉眼鉴赏的细节,会在转印的过程中丢失。

对比有些画,我用手机拍出来的效果,跟印在书上,色差也有点大。

openspec-apply-change

最近项目越做越复杂,于是上下文不大够用了。

apply change的时候,它虽然有一个tasks.md作工作规划,但codex屡屡把项目方方面面读进context,没有什么产出,就又compact了。

这样效果很低。

于是打断它,要求小步快跑,盯着tasks.md逐个完成,一聚焦,事情就流畅了。

突破微信贴图号“添加位置”限制

用EXIF修改让旧照片重新拥有精准地理标记

一份关于如何让世界各地拍摄的旧照片,在微信贴图号中获得准确位置推荐的技术笔记。

功能与痛点:为什么你的老照片加不了位置?

微信的贴图号(部分用户称为图片动态/状态,一种可发布图片、文字并附带位置的轻内容功能)有一个非常实用的机制:

  • 发布贴图时,你可以选择 “添加位置”
  • 一旦位置添加得当,该条贴图就有机会被推荐给该地点附近的人,带来大量自然曝光。

然而,这个“位置”并非随便就能加上。微信允许添加的位置来源只有两个:

  1. 手机当前地理位置
    发图时,手机会定位你所在的位置,并允许你在方圆2公里内的具体地点中选择一个。
  2. 图片内嵌的EXIF信息
    微信会读取图片文件中的 EXIF GPS坐标,若图片是在“近期”拍摄的,就能直接识别出对应的地点,让你添加。

这里便出现了困扰许多用户的限制:

  • 老照片失效:我在几年前周游世界时拍的照片,因为不是“近期拍摄”,EXIF时间戳过旧,微信完全不予识别。
  • 无法回到现场:我不可能再飞回那些国家,仅为了站在当地发一条贴图。而通过模拟定位工具伪造手机GPS,又很容易被微信安全策略识别,存在风险。

结论就是:历史照片的全球足迹,几乎不可能再被激活。

解决思路:给EXIF做一次“时间平移与GPS移植”

既然微信只信任“近期拍摄且携带GPS”的图片,那么关键突破口就在 EXIF元数据

我需要的操作本质非常简单:

  • 将一张带有正确GPS坐标的照片,其 拍摄时间 修改为最近(例如昨天或今天)。
  • 如果原图GPS信息已丢失,就重新写入正确的经纬度

这样处理后,微信就会认为这是一张刚刚在当地拍摄的照片,从而允许我添加该地点。

但是,手动修改成千上万张旧照片并不现实。于是我让AI写了一个轻量小工具,专门批量/定向完成EXIF更新。

实践步骤:只需修改一张图,轻松激活所有图

整个工作流经过测试,确实生效,而且极其省力:

  1. 准备一张锚点图
    选出一张需要添加位置的地点的照片,或者任意一张图。用工具将其EXIF中的 DateTimeOriginal 改为近一两天,并确保 GPSLatitudeGPSLongitude 等字段正确填入该地点的坐标。
  2. 发布贴图,获取位置
    打开微信贴图号,选择这张刚修改过的图片。微信识别到EXIF中的近期时间和GPS后,“添加位置”列表中会出现对应的地点。选中并发布。
  3. 补充上传其他图片
    这条贴图一旦带着正确位置发布成功后,你可以立即编辑或补充上传其他旧照片(那些未修改EXIF的图片)。此时位置已固定,不再需要每张图都通过EXIF校验。

一次修改,激活全部。 优雅地绕过了时间与距离的双重限制。

工具要点与注意事项

  • 修改EXIF的工具:使用Python (piexif, Pillow) 或现成的命令行工具(exiftool)均可,AI辅助可快速生成脚本。
  • 时间窗口:观察发现,“近期”大致在一个月内,为保险起见建议把拍摄时间改为 最近24小时
  • 避免滥用模拟定位:修改图片EXIF属于本地文件处理,不会触发微信的模拟定位检测,相比直接伪造手机GPS要安全得多。
  • 合规使用:本方法仅用于将个人历史旅行照片还原真实拍摄地点,以实现内容展示与记录,请勿用于虚假打卡、位置欺骗等违规行为。

结语

微信贴图号的地理围栏机制,曾经让无数精彩的“老照片足迹”被封存。借助EXIF元数据的灵活修改,我们重新获得了定义位置的能力。这不仅是对旅行记忆的一次数字复原,也为内容创作者解锁了更灵活的地点表达方式。

你过去在冰岛、在撒哈拉、在某个无名小镇按下的快门,现在终于能够带着它们原本的坐标,出现在它应该出现的人群视野里。


呼伦贝尔

还是太太和小儿子的同学家长一起组织的家庭游,大概的顺序是 海拉尔–额尔古纳–恩和–黑山头–满洲里–哈尔滨。

除了哈尔滨,其他几个都是内蒙段,有联系旅行社,帮我们安排了司机兼导游,一路接送并讲解。

海拉尔:呼伦贝尔的首府,我算是第一次踏入内蒙的地界,也是第一次知道,这一片,除了崇拜成吉思汗之外,更注意纪念的是代表蒙古,征服这片土地的,铁木真的弟弟——哈萨尔。

额尔古纳:大兴安岭边上的白桦林,安排了让小孩用白桦树皮作画的环节,好无聊。

恩和:是俄罗斯族的小镇,就是卖个俄罗斯风情,还有做俄罗斯面包的环节,也挺没意思。不过附近草原上骑了个马,没有我想象中那么累。想当年我第一次骑马是在杭州马会俱乐部,搞得腰酸背痛的,估计是马术的训练方式太紧张了。

黑山头:恩和到黑山头的路上,就是额尔古纳河的风光了,很美。还有草原的山上弄的滑草和索道项目,孩子们挺开心。黑山头镇则是一种欢迎土豪的玩法,有篝火晚会,欢迎土豪们去赞助点火仪式。还真有老板以及托们去的。不过烟花搞得很危险,掉下来的块块直接把旁边的老人头砸破了。黑山头镇还有个特色的地方,坐东向西,前方是河流和草原,适合看草原日落。

满洲里,中东铁路的起点,俄罗斯人比较多,我们去套娃游乐场看表演,之前也在半路看过蒙古族的马术表演,在满洲里的游乐场又看了一遍俄罗斯人的马术表演,同行的孩子有在珠海长隆看过一模一样的,边看边睡着了。

内蒙最后一场是旅拍,之后返回海拉尔坐火车。

火车是绿皮火车,孩子们虽然没坐过,但也不会有什么兴奋了,毕竟累了。

到了哈尔滨,中央大街——索非亚教堂——极地公园——黑龙江省博等等。我抽空去转了一下哈尔滨的其他教堂。

先不贴图了。

不过我现在发现Blog看的人太少,朋友圈又不适宜写太多,想表达的内容其实也不时有,最近发现微信的贴图号挺不错,于是改了个名字,把一些见闻直接发那里去了,只要不主动通知好友,其实他们是不知道的。

问津–迷津 / 孤帆–天际

几年前在办公室里的发财树的树叶上写字,多是一些佛道的文本,有两句表明当时的心境:月迷津渡,雾失楼台。

当然这是秦观的词了。

我之前一直认为迷津是一个佛教用语,但搜寻不到佛经里“迷津”的确切出处。早上想起,再搜搜,其实还是以孟浩然的诗为源:

早寒有怀

木落雁南度,北风江上寒。

我家襄水曲,遥隔楚云端。

乡泪客中尽,孤帆天际看。

迷津欲有,平海夕漫漫。

其实也并不完全是孟浩然的原创,真正的来源是“问津”。此处化用了《论语·微子》孔子使子路问津的故事:

长沮、桀溺耦而耕,孔子过之,使子路问津焉。长沮曰:“夫执舆者为谁?” 子路曰:“为孔丘。”曰:“是鲁孔丘与?”曰:“是也。”曰:“是知津矣。”问于桀溺。桀溺曰:“子为谁?”曰:“为仲由”。

陶渊明的《桃花源记》中也用了“问津”一词:后遂无问津者。

秦观的词对应的是《桃花源记》:雾失楼台,月迷津渡,桃源望断无寻处。

说回孟浩然的诗。其时孟屡次科举不中,在荆襄吴越间寻找机会,一如孔子周游列国,谋取入仕。然而前路茫茫,人生海海,孤帆天际。

李白的《送孟浩然之广陵》正是看出好友的迷茫,化用其诗,以积极乐观的方式进行开解:

孤帆远影碧空尽,惟见长江天际流。

一时的迷茫得失,又算得上什么。滚滚长江,流向天际。

而李白诗中并没有直接答复“迷津”一问。

孟的诗:留下了儒释皆用的“迷津”一词;李的送别诗,则留下了千古名句。

本文只用搜索引擎,未使用AI进行编写或修改。

我的中考

这几天时CC中考,我周五开始休假,在考场附近定了个酒店房间,方便他中午休息。毕竟家里老人(他外公外婆)虽然心里想他好,但没什么能力给他压力上的及时疏导。

然后想起1995年,我的中考。我初二下和初三是在白沙中学读的,也是全东莞范围内很少见的村办中学。(后来跟白沙小学合并了再一起,再后来,就停办了初中)中考考场在虎门中学。于是相熟的同学约在一起,早上骑车到太平,考完上午场后,就一起去那一家号称全国最早的麦当劳吃午饭。为什么是号称呢,因为它是冒牌货,在88年就开业了,香港人学到了麦当劳的做法,就到虎门开了一家仿冒。90年麦当劳正式进入中国,它就主动改名做麦当莱。

我们的座位是学校的教导主任编排的,为了关照三村跟他相熟的小孩/家长,把几个安排在我前后左右,方便看我试卷吧。我一开始也言明了,看无所谓,我也大方,不要抢我试卷,干扰我答题。当然了,中考过后我很快就把这些忘掉了,前几年初中同学聚会,说起这事情,我才想起,哦,是这样子啊。

第二天的考试,中午的时候遇到初一初二上的同学,邀请我回学校(虎门一中)休息一下。反正我也没什么好午休的,就过去了。见到转校前的那些同学,有认得的,也有不认得的。个人感觉有点唏嘘。人生就不过分分聚聚,后来再跟他们聚会,已经是疫情前的时候了。

中考出成绩之前,我哥带我到中大住了一周,校内的食堂大妈嘲笑我的粤语,我对广州人开始反感了。期间走了一下亲戚,在华农的教工宿舍睡过一个午觉,屋外下了一场雷阵雨,那个午觉是我人生最舒服的午觉。我对华农的第一印象非常好。在中大也跟我哥的同学下了围棋,才知道自己自学的围棋还是缺了很多基本功。

那时候中大有个码头,可以坐渡轮去大沙头,我哥就带我去大沙头,看他进证券营业厅,看人交易买卖股票。大沙头也有水翼船,我回虎门的时候就坐水翼船回的太平。

后来成绩就出来了,637.3 + 10分竞赛加分,647.3,拿了虎门第一,第二名是虎门中学的,636.3 + 10。赢得不多,其实我也没想过要拿虎门第一名,当时的理想是能考上东莞中学就可以了。现在回想起来,还是回到白沙读书的一年半,身边的高手太少了,只好自己卷自己,一不小心就卷赢了。

中午吃饭时,跟考完数学的CC说起我当年的分数,体育是考了个及格 30.x / 50,政治是88 / 100,说不上优秀,就靠其他遥遥领先了,比如数学,上了高中,才知道我大概是全市第一119.5/120,扣的分是专门不让我满分的——这么说来高考更公平,我高考数学是满分……

后来拿到东莞中学的录取通知,是白沙中学历史上第一个考上东莞中学的(我哥是在虎门一中考上莞中的),也算让白沙中学从湖南湖北江西过来的自认怀才不遇的优秀老师有个交代了。^_^

没考完之前,尽量不跟CC讨论他的考试,就讲我自己的故事好了。

codex的能力

有个持续了2个月的任务:做一个零件之间的冲突的检测算法,然后从1000+个样本里面,看看有多少被检测成伪冲突。这些样本都是成熟的方案,本身并不存在伪冲突。

用codex 5.4的时候,一开始还好,但一段时间之后,它发现我事实上是希望这些样本里面检测的伪冲突清零,于是就用坐标值堆数组的方式,给我一个假象,带来的问题就是这些分支越来越多,数组也越来越多。

我也发现了这个问题,于是让它处理维度提升,但一直到我该用5.5,这种情况终于有了数量级的提升。真的按照零件的逻辑而非数值来帮我处理。

不过也不能完全归咎于5.5和5.4的差异。毕竟在这过程中,我对这个问题的认识也深入了很多:

要检测到连接、冲突,又不能把正常连接/靠近处理成伪冲突,还要考虑检测性能的问题。

海贼王 追平 进度

看了一年多,终于把海贼王追到最新的进度了。然后就可以先忘掉,毕竟尾田效率也就那样。

连载最大的问题就是,前后呼应不上,有作者心境的变化,也有读者/观众的影响,所以要连载成就一个完美的作品,基本上是不可能的。

另外就是环境也在变化,即使作者没忘掉初心,资本和市场的要求,也会让他与时俱进(中性)。

回过头来看vibe coding / AI agent,也是亦步亦趋,多轮之后,还能想起最初的目的吗?或者最初的目的的模糊性,在边做边清晰的前提下,发现原来是自相矛盾,或者俗不可耐?

anthropic的小心机

早上发现Deepseek + Claude Code用不了了:API Error: 400 Failed to deserialize the JSON body into the target type: messages[1].role: unknown variant `system`, expected `user` or `assistant` at line 1 column 29561

问了一下google,是CC升级了,在里面加入了‘system’的role,而一般的第三方模型不会/来不及就它的毛病,就不支持这个role,于是报错。

没有非常好的办法。最后我选择了回退Claude Code:npm install -g @anthropic-ai/claude-code@2.1.148

但是也就是打开那一下是可以了 /exit 出来,重新进,就又变成 2.1.154了。

那每次使用都install 2.1.148再用?或者跳离它这条船。

codex的陷阱

这两天终于碰到一个。

我持续用codex为场景识别并收敛伪冲突。这几天碰到有若干个场景,伪冲突被codex收敛得很快,基本上3分钟内就告诉我,这场景的伪冲突已经清零了。

然后我每天都会让Deepseek + Claude Code帮我检查总冲突数的收敛情况。然后根据剩余的大头再委托codex去处理。

早上DS返回的结果跟昨天返回的结果类似,有些大头完全没有清理。我一开始以为DS搞错了,然后把结果给codex double check,codex一开始还是说它确实清干净了。

随着对质的深入,codex终于发现它的问题,它选了两个错误的数据域作为判断的标准,结果导致这两天的伪清零……

至于它为什么这么选,之前是没有这样做的。大模型毕竟是一种推理机制,如果KPI需要它清零,它会选择一个看上去能达到结果的判断方式,而并非费力地推导出各种机制和规则。简单来说,改测试代码,直接通过。

多模型联合工作,审核,避免偷懒,看来是必须的。