卖国贼 琦善(下)

从很多现存的历史材料来看,琦善确实不是个精明能干、清正廉洁的形象,也绝非历史学家蒋廷黻先生所说,是个“审察中外强弱形势远超时人”的外交家。清朝官员张集馨在其自叙年谱《道咸宦海见闻录》中曾称琦善“天分绝顶,见事机警,刑名钱谷、吏治营务无不谙熟”,但又“性气高傲,不欲下人,才具素长,睥睨一切”、“遇事接物,多用权术,不能开诚布公”等等,可见他为官“好用诡道怪行”,深谙逢迎之道,故而深得道光帝赏识,所以他只是一个在传统官僚体系培养的精英代表而已。 如果是在过去,或许琦善会走上更高的......

READ MORE

via 太隐 (author: Ludwig Wang)
卖国贼 琦善(上)

茅海建先生较早前写过一本书,名字叫《天朝的崩溃》,从大学到工作,我读过了几遍,特别喜欢开头的那篇绪论,也就是琦善到底是不是卖国贼的问题,其实探讨过这个问题的学者有很多,但很少有人像茅海建先生那样把这件事情有理有据的写的这么明白。 或许有人纳闷了,这个事有必要这么细究么。 如果放在上下五千年文明来看,不值得,假如没有琦善,那也会有伊里布、牛鉴等等,不过琦善在历史上确实是个代表性的关键角色。所以他确实值得细究。 因为茅海建先生书中已经写的足够详细,所以我主要还是引用他的大部分资料......

READ MORE

via 太隐 (author: Ludwig Wang)
太原之行(2):逛博物馆

书接上文,在太原期间,我们参观了太原北齐壁画博物馆、晋商博物馆和晋祠博物馆。这三座博物馆各具特色,值得细细品味。若有朋友到太原旅行,又恰好喜欢逛博物馆,这三家均十分推荐。下面容我一一道来。

[查看全文...]

via 拾月
太原之行(1):拍晋少奶奶写真、听周深演唱会

上个月南瓜抢到了6月14日(周六)周深太原演唱会门票,于是特意在6月13日周五请假一天,连着周末在太原玩三天。南瓜因公司组织山西团建,12号先行抵达太原。

三天行程如下:

周五上午乘飞机到太原,下午拍写真
周六中午参观北齐壁画博物馆,下午参观晋商博物馆,晚上在红灯笼体育馆听演唱会
周日下午参观晋祠博物馆,晚上乘飞机回杭州

本文记录拍写真和听演唱会体验,博物馆准备另起博文记述。

[查看全文...]

via 拾月
Next.js + Vite,这是什么新的操作?

该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/posts/Z-Turn/nextjs%2Bvite-hack-combined

事情是这样的。

前段日子做了一个摄影佬必备的线上图库。

https://github.com/Afilmory/Afilmory

这个项目是 Vite + React 写的,当初没有考虑要做 SEO 的打算。

然后想给 /:photoId 路由加个 Open Gragh 的支持。那必须得上一个 Server 了。

那用什么呢,不管用什么必须的支持 Serverless,毕竟我也不想多开一个服务器去托管了。

现在支持 Serverless 的太多,hono,fastify 都可以。我最后还是选择了 Next.js。一开始只想着它处理和画 OG 最方便,而且可以直接托管到 Cloudflare Pages 上。

目前,已知我的 app 是 SPA,vite build 之后是静态产物。我需要在 Next.js 上托管这些静态产物。

托管静态产物,这还不简单。我直接一个 vite build && cp -r dist ../ssr/public。放到 public 下就被 Next.js 自动托管了。

但是,index.html 的 <head /> 咋办,vite build 出来的都是死的。

我直接用 dom 操作替换一下。
import { DOMParser } from 'linkedom'

export const runtime = 'edge'

export const GET = async (
  request: NextRequest,
  { params }: { params: Promise<{ photoId: string }> },
)
  try {
    const indexHtml = await fetch(new URL('./index.html', import.meta.url)).then(r => r.text())
    const document = new DOMParser().parseFromString(indexHtml, 'text/html')

    // Remove all twitter meta tags and open graph meta tags
    document.head.childNodes.forEach((node) => {
      if (node.nodeName === 'META') {
        const $meta = node as HTMLMetaElement
        if ($meta.getAttribute('name')?.startsWith('twitter:')) {
          $meta.remove()
        }
        if ($meta.getAttribute('property')?.startsWith('og:')) {
          $meta.remove()
        }
      }
    })
    // Insert meta open graph tags and twitter meta tags
    createAndInsertOpenGraphMeta(document, photo, request)

    return new Response(document.documentElement.outerHTML, {
      headers: {
        'Content-Type': 'text/html',
        'X-SSR': '1',
      },
    })
  } catch (error) {
    console.error('Error generating SSR page:', error)
    console.info('Falling back to static index.html')
    console.info(error.message)

    return new Response(indexHtml, {
      headers: { 'Content-Type': 'text/html' },
      status: 500,
    })
  }
}

那么就搞定了对 HTML 的处理,注入了 OG 相关的 Meta 标签。

这里有个注意,截止到这边文章编写前,在使用 Cloudflare Pages 部署 Next.js app 仍有不少问题。比如这里的 fetch 可能导致报错 Cannot perform Construct on a detached ArrayBuffer。我现在的方案就是不适用 fetch。而是在 build 阶段转换为 js 文件。
# Convert HTML to JS format with exported string
node -e "
const fs = require('fs');
const html = fs.readFileSync('./public/index.html', 'utf8');
const jsContent = \`export default \\\`\${html.replace(/\`/g, '\\\\\`').replace(/\\\$/g, '\\\\\$')}\\\`;\`;
fs.writeFileSync('./src/index.html.ts', jsContent);
"

OK,这样就搞定了。后面开发还是可以用 SPA 去开发,部署的时候去部署 Next.js。直接通过 Cloudflare Pages 一键部署就行了。

后续

Cloudflare Pages 免费版本的 Worker CPU Time 限制的太低了,而生成 OG 的事件远超这个需要的时间,导致 OG 生成经常不可用。现在使用 Railway 去部署了。

看完了?说点什么呢

via 静かな森 (author: Innei)
天一阁

端午节去宁波玩。

此行的主要目的是探访天一阁。作为中国现存最古老、保存较完好的大型藏书楼,我早已心向往之。

[查看全文...]

via 拾月
YB

昨日到公司,在电梯遇见YB正在搬运物品,东西不多,想来已经搬完。

6月9日是YB在字节的last day。YB在字节有新名字,但我仍习惯称他为YB。

[查看全文...]

via 拾月
虽然不完美,但总算是结束了,高中三年。
开始了,我的假期。
总感觉没有什么实感呢,一旦规划起来未来,就不可避免地谈到钱啊,这究竟是我的价值观出现了偏差,还是这个社会的问题呢?算了吧。在学校里保持着的勉强的一致性在这里就开始显现了,我所处的阶层不允许我去实现这些幻想,但或奢或简,人总是要生活。
今天开始,对全新的自己说一句:加油吧!
好物推荐:印章、镜头、水果叉

分享几个近期好物。

[查看全文...]

via 拾月
Fox Day

老板英文名叫Nick,用了电影《疯狂动物城》的Nick做头像。

周五下午在团队小群突然聊到大家的头像,有人提议要不要都换《疯狂动物城》里的动物做头像,我突发奇想,干脆都换Nick的不同风格头像更好玩,于是火速从小红书找了几张,一起换上了。

[查看全文...]

via 拾月
镜头与代码的交响:打造个人线上画廊与假期随笔

该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/notes/193

这些天,日子很短。却过得很有意义。

Vibe Coding: 线上画廊

自从前端日子买了一台相机之后,出门的欲望也多了不少,到哪都要拍几张。日积月累想要做一个展示一些成片的地方了。不少大佬都会有一个属于自己的网站展示,因此萌生了一个想法,也做了一个。

本次开发基本全程使用 claude-4-sonnet。花了一天时间就把模子刻好了。
https://object.innei.in/bed/2025/0603_1748957373899.png
https://object.innei.in/bed/2025/0603_1748957391214.png

这是一个雏形。

后来,我开始研究图片预览的高性能方案,又引导 AI 写了一个基于 LOD 方案的 WebGL 图片预览器。即便是预览一张使用哈苏 X2D 拍摄的一亿像素的图片在缩放和加载也不会卡顿。

接入了 Live Photo 的播放, 也是通过这个了解到 WebCodecs API,使用它对 mov 视频转码然后播放。

接入了 HEIC/HIF 文件的解析,调用了 libheic 的 wasm 进行的转换。

而我上面做的全部一是因为偷懒,我可以直接把拍摄的 Live Photo 或者 HIF 文件放到 S3 上不需要自己的格式转换;二是通过一个项目学到新的东西。

今天我又对这个项目进行了构建优化,使用 Cluster 模式,同时处理多张图片,节省了约 3 倍的时间。而这一切都是基于引导话术 AI 进行的重构和优化。

项目地址:

https://github.com/Innei/photo-gallery

如有需要的摄影爱好者也可以试试它。

我的线上画廊:https://gallery.innei.in

后续,对项目还有更多的展望,比如动态化等等。

好友来访

端午假期,南京的朋友来这边玩了几天。一起帮拍了很多照片。去了周边的景点。

组团 Coding 和做了一顿饭。

@MaxtuneLee 共建 Gallery,以及未来推出的摄影工具链。

看完了?说点什么呢

via 静かな森 (author: Innei)
棱镜通讯 No.114 海蒂·拉玛(Hedy Lamarr)

这期棱镜通讯的主角或许比较特别,因为很多人并不熟悉她的名字,她不仅是影史上非常著名的女演员之一,而且还是一名发明家,被称为“CDMA之母”、“WiFi 之母”、“蓝牙之母”,她便是海蒂·拉玛(Hedy Lamarr)。在第二次世界大战开始时,海蒂·拉玛与作曲家乔治·安塞尔为盟军的鱼雷开发了一套无线电导航系统,该系统使用扩频和跳频技术来击败轴心国的干扰威胁。尽管这项技术没有引起二战期间美国军方的重视,但这项技术在后来为现代WFi、蓝牙、GPS和CDMA等通信技术奠定了基础,并于......

READ MORE

via 太隐 (author: Ludwig Wang)
Back to Top