Posts for: #Tech

推荐一个同事做的小工具:PDF书签易

你有没有遇到过这种情况:好不容易找到一本 PDF 电子书,打开发现没有书签目录。几百页的书,想跳到某一章只能一页一页翻,或者疯狂按 Ctrl+F。

我一个同事就被这个问题折磨够了。

从自己的痒点开始

他喜欢用 PDF 看技术书。网上找的、淘宝买的扫描版,很多都没有完整的书签目录。市面上能加书签的工具不是没有——福昕阅读器可以,WPS 也行。但体验都一样:一条一条手动添加,点击、输入标题、设置页码、设置层级,循环往复。一本 300 页的书,光加书签就要半小时以上。

淘宝和闲鱼上甚至有专门代做 PDF 书签的服务。按目录页收费,每页 1-2 块钱,一本普通的书大概 10 多块,耗时一个小时左右。头部商家月销几百单。

说明这个需求是真实存在的,而且现有的解决方案都很原始。

先用最笨的方法解决问题

他没有一上来就做 APP。

第一步是写了一个 Python 命令行脚本:照着 PDF 的目录页,在一个 TXT 文件里用缩进表示层级,写好标题和页码,脚本读取后自动写入 PDF。

甚至目录都不用自己敲——去电商网站搜这本书,商品描述里的目录直接复制过来就行,还自带页码。

这个"工程版"工具,让他制作一本书的书签只需要几分钟。他拿这个效率去闲鱼接单,还真卖出了几十块钱。

这个阶段很有意思:用最低成本验证了需求,同时验证了解决方案。

从工具到产品

命令行版本只能自己用,推广不了。于是他启动了创新项目,目标是做一个真正的产品级桌面应用。

核心交互很优雅:窗口左边是 PDF 页面预览,中间是书签文本编辑区,右边是实时生成的书签树预览。像写代码一样写书签——用缩进定义层级,所见即所得。

几个亮点功能:

• 内置 OCR:扫描版 PDF 直接识别目录页文字,省去手动输入

• 智能页码校准:扫描版 PDF 的页码和实际印刷页码经常对不上,用一个简单的 (++5) 语法就能批量修正偏移

• 自动格式化:识别 1.1、1.1.1 这种标准编号,自动生成对应的层级缩进

• 纯本地处理:所有文件都在本地完成,不上传服务器

技术选型值得说说

他没用 Electron(太臃肿),选了 Tauri:Rust 后端 + Web 前端。PDF 渲染和 OCR 都直接调用系统原生 API——macOS 用 Swift 的 PDFKit 和 Vision,Windows 用微软官方的系统 API。Rust 通过 FFI 调用编译好的静态库。

[阅读全文]

找餐厅这件事,一百条好评不如一个靠谱的朋友

我越来越觉得,找餐厅这件事,大众点评、小红书都帮不了我。

倒不是说它们不好用。信息多,评价全,但问题就出在"太多"上。我打开一家店的页面,几百条评价,有说惊艳的,有说踩雷的,有明显是刷的,有写了一千字但你也不知道这个人平时吃什么水平的。看完一圈,我还是不知道该不该去。

后来想明白了,问题是:我不认识这些人。

我不知道他们的口味,不知道他们的标准,不知道他们说的"好吃"到底是什么意思。一个觉得"好吃到哭"的人,跟我可能完全不在一个频道上。这种评价再多,对我来说就是噪音。

但如果是朋友呢?那完全不一样。

我知道他是什么样的人,知道他吃过什么东西,知道他说"这家不错"意味着什么。他的推荐我是可以直接信的。

这就是我们做 EatVenture 的原因——它不是大众点评,它是朋友点评。

我在 EatVenture 上只关注我认识的、喜欢的、且我认可 Ta 饮食品味的朋友。注意,不是所有朋友。认识归认识,但有些人吃东西的口味跟我差别太大,我会关注 Ta,但不会订阅 Ta 的餐厅列表。我只关注那些我觉得"真的懂吃"的人。

然后我会主动把 EatVenture 发给他们,拜托他们把自己喜欢的餐厅标注上去。

这些人可能是每次出差都能摸到当地最好馆子的同事,可能是在某个城市住了十年把好店全吃遍了的朋友,也可能就是那种朋友圈发什么吃的你都想问一句"这是哪家"的人。

这样一来,下次我去他们去过的城市,打开 EatVenture,沿着他们吃过的路线走一遍就好了。不用做攻略,不用翻评价,不用纠结。因为推荐这些餐厅的人,是我自己选过的。

找餐厅,数量不重要,精准才重要。一百条陌生人的好评,不如一个懂吃的朋友跟你说一句"去这家"。

朋友点评,大于大众点评。

EatVenture 是一个很小众的 App。它不是为所有人做的,就是为你和你信任的那几个朋友做的。但就是这个"小",让它特别好用。

这个小工具也并不为所有人设计,目前用的是 Google 的 API,大陆餐厅数据很不完整(不推荐使用),反而是香港、新加坡、日本等地方,陆陆续续被朋友“占领”了。

如果你想试试,可以识别这个二维码,至少新加坡、香港的餐厅还挺完整:

知识星球的 10 年

知识星球 10 岁了。一个小工具 10 岁,在这个宏大的时代下,微不足道。自家的孩子,出生在移动互联网的尾巴,当下赶上 AI 凶猛地冲撞过来,还是幸运的。

试图回忆过去的时候,我发现,能被记住的,往往是一些问题、低谷。

跟大家分享几个低谷。

事故

说出来大家可能会笑——其实,早期版本被 @Fenng 在朋友圈、微博推荐的前几次,都直接把服务拖垮了。

第一次挂的原因是,每个用户登录的时候,都会一次性把圈子里的用户列表拉回来,几千个用户通讯录信息、头像,几千个人同时拉——嗯,在我们还是单服务器的时候,瞬间就雪崩了。

2021 年,生财有术 418 续费,在 20:00 秒杀开始时,数据库没撑住,甚至导致了付款方面的问题,比如付了费,我们却没准确记录。那次给生财有术团队带来了挺大的后续工作量。

那之后,为了让整个活动更加顺滑,研发团队做了些工作,比如:

  1. 后端、运维工作
  • 压力测试,通过压力测试,找出木桶的最短板,从而不断做性能调优

  • 数据库按业务拆分成多个集群,进一步减轻数据库压力

  • 代码级调优(核心目的是为主库减负)

  • 限速,如果达到我们压力测试的峰值,对来访用户进行排队、降级等限制

  • 临时扩容,根据去年的经验,将服务器做了短期大幅扩容,活动结束后释放

  1. 前端工作
  • 页面静态化

技术上的调优,加上微信支付给力的协助,那之后就没出过这么大事故了。

2017 年的下架

2017 年,因为风控、内容安全问题,产品被下架,后续会如何,一无所知。我后来发了张照片,记录:这张照片是 2017 年 6 月 30 日拍的,那时公司遇到一个很大的坎,尽了全力东奔西走。所幸贵人相助,指点、计划、执行、核查、修正,投入很大的精力和成本,走出来了。那会儿,在等机会去拜访人,外面天热,猫在地铁站里,有点累,盘腿在地上坐着,闭目养神。shotgun 拍下来了。偶尔翻到,还是会回忆起那个炎热的下午。创业就是这样,如履薄冰。

那段时间还有另一张图片——归零的图片。

创业公司,很大概率活不过下个月,所以,或许不用规划太长远,尤其是现在的巨变时代,我们也根本看不清三个月后的世界变化。

找到光

除了低谷,当然也有欣喜,比如找到光的欣喜。

在回顾时,我翻了旧照片,找到一张 2015 年 5 月 6 日,在腾讯大厦拍的照片,这是个起点。白板上的草稿,是 Tony 随手画下的。

那时候,我们观察到的问题来自微信群。

用微信群沟通极简、便捷,很多人的生活、工作中都离不开。我自己就大量在工作中使用微信群——与同事、伙伴、用户在群里沟通,迅速解决问题。在重度使用过程中,我也感受到了一些不便,比如:精华内容不连续不易整理、内容不备份很容易遗失遗忘、文件图片不及时下载很快被清理、时常被各种表情包红包或者无关话题岔开歪楼导致讨论不聚焦等等。

我们认为,一个简单的移动端社区,可能会是微信群的良好补充,而海量使用微信工作的人们,也将是我们的目标用户群。于是我们花了几个月时间,把产品做出来了,2015 年的 11 月 10 日,第一个对外公开的版本发布了,版本号是 1.1.1——从 0.9 版开始,内部已经迭代过几个版本。

但,就像绝大多数创业公司的创业项目那样,产品开发出来后,我们尝试着在网络上做了些推广,响应者寥寥。我尝试着找一些朋友——有在传统企业里负责信息技术的,有各行各业野路子的创业者,也有活跃在社交媒体的内容创作者。大多数朋友都会下载,登录测试,然后遗忘。

所以,我们一边自我怀疑,一边做各种迭代尝试。

第一个支持付费的版本是 1.15.4,在 2016 年 8 月 12 日上线。发布日志了,我们写了:

[阅读全文]

你验证过吗?

昨天在 Twitter 上,很多人在“围剿”微信,其中有一位用户写:

不知道你们知不知道,微信传任何文件,即使是同一个文件都是全量拷贝一次。七天文件显示过期的时候,其实文件还在手机里,就是不给你看,如果此时你的朋友再发一次给你,还是会全量拷贝一份放在手机里 这就是为什么微信这么占空间的原因,这难道不是技术上的缺陷吗?

一个 1G 的视频,发给 3 个朋友,就占掉 3G 的内存

我忍不住回复:你验证过吗?

这让我想起多年前,我还在绿盟工程部当售前工程师时的一件小事。几个同事朋友约了,某个周末聊点技术——交流彼此近期看到有意思的技术、项目、产品。我分享的是一篇文章里提到的安全项目,当时在我看来还比较新颖。

我讲完后,同事“小吱吱”问了好几个问题,我都答不上来,他有点诧异,问我:你验证过吗?

我说:没有。

那时我还是挺惭愧的——没编译部署测试过,没看过代码,拿着一篇文章就满嘴跑火车了。

后来我会尽量让自己靠谱一点,传播之前,尽可能有判断,有验证。

简单,可靠,其实很难做到,共勉。

Mac 下 neovim 里自动 esc 切换输入法

1. 安装 macism

https://github.com/laishulu/macism

brew tap laishulu/homebrew
brew install macism

2. nvim 插件里加一个 im-select.lua

~/.config/nvim/lua/plugins/im-select.lua

return {
  "keaising/im-select.nvim",
  config = function()
    require("im_select").setup({
      -- 在普通模式下,默认使用的英文输入法
      -- 请将下面的值替换为您在上一步中获取到的英文输入法标识符
      default_im_select = "com.apple.keylayout.ABC", -- macOS 示例
      -- default_im_select = "1033", -- Windows 示例
      -- default_im_select = "keyboard-us", -- Linux (Fcitx5) 示例

      -- 设置触发切换的事件
      set_default_events = { "InsertLeave", "CmdlineLeave" },
      set_previous_events = { "InsertEnter" },

      -- 保持安静,当找不到依赖的命令行工具时不发出警告
      keep_quiet_on_no_binary = false,

      -- 异步切换输入法,避免卡顿
      async_switch_im = true
    })
  end,
}

Mac 下开启 sshd 登录后马上断开连接的一种可能

如果"共享 → 远程登录"里选择了"只允许这些用户…",系统会用 com.apple.access_ssh 做白名单。不在组里就会被 PAM 拒绝。

# 查看是否在白名单组
dseditgroup -o checkmember -m "$USER" com.apple.access_ssh

# 不在的话加入(需要管理员密码)
sudo dseditgroup -o edit -a "$USER" -t user com.apple.access_ssh

# 也可放开给所有用户(图形界面改:系统设置 → 通用 → 共享 → 远程登录,选"所有用户")

改完重启 sshd:

sudo launchctl kickstart -k system/com.openssh.sshd

开源超轻量的 Flutter 聊天库

这两年,大量 AI ChatBot 涌现。不少人在用 Flutter 做跨平台应用时,想加个简单的 AI 聊天,却被一堆 IM 方案搞得头大——我们就是这样。

所以同事做了一个超轻量的 Flutter 库:simple_chat。

它能让你几行代码就把聊天界面跑起来,通吃 iOS、Android、Web。

之所以叫 simple,是因为它真的是主打简洁。你不用拉一大堆依赖或后端配置,几分钟就能搞定。UI 也很好改,如果想要自己定制聊天气泡、字体、颜色,分分钟就能上手。

有人会问,能用它干什么?

常见的 IM、客服、AI 聊天机器人都能用得上,毕竟它支持消息发送状态、群聊、未读消息指示,还能直接选图、预览图片,算是“麻雀虽小,五脏俱全”。

如果你对那些大而全的 Stream、Sendbird 没什么兴趣,只想要个纯前端的简洁方案,simple_chat 或许就是你想要的。同事 Lawrence 还在不断迭代这个项目,未来计划支持更多自定义选项、多媒体消息、实时打字状态等功能。

项目开源,如果你也想帮忙或者提想法,不妨去看看:

simple_chat 能让 Flutter 开发者省去很多麻烦,专注业务逻辑,而不是陷在复杂的聊天框架里。

再上一个 simple_chat 的小应用案例:EatVenture——觅食历险产品,里面嵌了 simple_chat,如图:

我用 EatVenture 解决俩问题:

  1. 在海外找餐馆

  2. 在餐厅看不懂菜单拍一下识图推荐

EatVenture 更多信息:https://tealseed.com/eatventure/。

为什么我不喜欢 Notion 了

这两年,我比较重度地使用 Notion,在小团队,甚至跨团队的项目,用 Notion 协作都很方便。不过,我也开始厌烦它了。我反感的主要的原因有这么几个:

  1. Notion 已经成为“吃内容的怪兽”,内容输入很愉悦,但希望将内容导出很困难,是私有格式,全部在他们的服务器上,可以导出,但导出的数据问题很多,并不方便真正想迁移的人——从这个角度,想从 Notion 搬走,就得做好放弃在里面的全部数据的准备。

  2. 不是本地存储、本地优先,数据都在云端,无法离线使用。

  3. Notion 逐渐从一个类似乐高那样的灵活的小产品,变成了全家桶,有日历、有 AI、有邮箱,而且不同功能相互融合交织,不能关闭。

至于性能差、经常有闹心的细节问题(比如:看过的通知不会消除、从 Notion 往外复制几段内容经常不好选择等等),相比之下还都能忍。

想来也有趣,总在重复上演少年斗恶龙然后变成恶龙,越做越强之后,优势反而变成弱点,这种一体两面的转化,还真有些哲学意味。

现在我的选择是:

  • 团队协作,我就不折腾了,还是用 Notion,只是留个心,重要的文档存一份 pdf。

  • 自己的工作,用本地的纯文本文件 + GitHub 存储——编辑器可以随便换——Obsidian、vscode……

–

开源发布 Slax Reader?

先说一下,Slax Reader 是个结合了 AI 能力的稍后阅读产品,可以免费使用,同时具备付费功能(毕竟要 AI 算力),只允许 Gmail 账号登录。

地址:https://r.slax.com,欢迎试试,也欢迎付费 ;)

开源了,也还是会收费的。

以下是正文:

–

前几天,我在群里发了一条:

讨论:如果 Reader 索性开源发布,大家会喜欢,还是担忧?为什么?

同事们的回复普遍比较积极。

Zhiqiang:

两者都有。

  • 喜欢是没试过开源一整个项目,有机会尝试了。
  • 担忧是光开源代码不够、还需要支撑,比如文档、issue 的处理、PR 管理这些。事情多了起来。咱开源除了表达一种态度,还希望能提供价值,仅代码的价值比较有限,支撑性的工作是蛮重要的一环。

总体上,喜欢 > 担忧。

Senwei:

总体来说我赞成开源

  • 有部分用户是喜欢自己部署的,开源能吸引他们(omnivore 停服的时候看到了一些这样的用户)
  • 开源大部分功能,一部分功能闭源(dify、lobechat 的策略)
  • 开源让用户自己接模型,如果用得多可能是付费更省钱,如用 cursor 的开源替代,自己接模型比 cursor 月付费要贵  (cline 多聊几轮就 1 美元了,可能还没把功能改好,cursor 月费 20 刀)

Huanan:

喜欢 > 担忧 +1。

我再补充个担忧的点,市面上整个项目开源的产品也不少,部署难度(特指后端)会直接决定我们能够吸引多少小白用户,但是碰巧,我们选择的依赖 Cloudflare 的 Serverless 以及后端依赖项目过多,我们的部署难度其实挺高的。需要用户绑定 VISA 信用卡、开通各种各样的服务配置才能使用~

Junchang:

[阅读全文]

新产品

无论新人还是老手,在面对新产品选择时,都会犯错误。

拿我自己来说,最近两年,我启动过几个项目,还没有做成的,失败的倒有了一些。回过头看,如果在项目启动前就更加严谨地思考,以及参考成熟的思考框架,或许更好。

对小规模的技术创业团队而言,经典的创业框架或分析方法(比如完整的 Business Model Canvas、7 Domains Framework 等)会过于宏大。我们还小,不需要穷尽那么多维度,可以选择更聚焦和短平快的工具,帮助团队迅速验证想法、找到早期切入点。

精益画布

精益画布(Lean Canvas)就是一个这样的思考框架。它由 Ash Maurya 基于 Business Model Canvas 简化和重构而来,专门面向初创企业或小规模创业团队,包括了 9 个部分:

  1. 问题(Problem):需要解决的核心痛点是什么?

  2. 客户细分(Customer Segments):你的核心用户是谁?早期使用者是谁?

  3. 独特价值主张(Unique Value Proposition):你给用户带来的独特好处是什么?为什么你和别人不一样?

  4. 解决方案(Solution):用什么样的产品或服务形式来解决用户问题?

  5. 渠道(Channels):如何触达用户?怎么让他们知道并使用你的产品?

  6. 收入来源(Revenue Streams):你的盈利模式是什么?用户是否愿意付费,或者是否有其他可行的变现方式?

  7. 成本结构(Cost Structure):主要成本来自哪里?人力、服务器、营销还是其他?

  8. 关键指标(Key Metrics):哪些数据可以反映产品价值和业务健康度?(留存率、付费转化等)

  9. 不公平优势(Unfair Advantage):你或你的团队是否具备一些别人难以复制的优势?(技术专利、独家资源、特殊关系网等)

Lean Canvas 更适合小步快跑、快速迭代的团队,因为它聚焦于问题-解决方案和早期验证,而不是去做全盘、长期的商业生态考量。

其他几个朴素的问题

在创业画布之外,有些创业者经常讨论到的元素,也值得参考。

  • 是不是高频:是不是像刷牙一样,每天早晚都要用的?

  • 是不是足够痛:是被子弹击中的痛,还是被蚊子咬了的痛?

  • 目标人群是不是够大:是大群体需要,还是极少数人需要?

  • 是不是很挤:有没有非常多人在试图解决这个问题?

  • 有没有机会从很小做起:是需要长时间构建一个大生意,还是可以有极小的版本?

  • 有没有长期进化的空间:可以持续迭代很多年吗(坡够不够长)?

  • 有没有飞轮效应:是不是每增加一个用户和内容,就能增强自己的能力和壁垒?

  • 有没有网络效应:有没有机会像微信、Facebook 这样,用了就会传播,而且朋友在哪,你就会在哪,朋友用啥,你就会用啥?

  • 我们对这件事有没有真正的热情:如果一年没起色,我们会不会放弃?如果不做,你有多难受?