ZDDHUB 的博客

读过很多书,看过很多电影,也解决过很多问题,回头想想却发现什么都不记得,因此有了写博客的习惯。这个网站的所有源代码开源在 Github 上,具体可以查看这个仓库

下面是近期的一些文章:


  • PixelsMeasure 开发第二年总结

    前年利用业余时间,开发了一款屏幕测量应用 —— PixelsMeasure,搜索 PixelsMeasure 可以下载,同时支持 macOS 和 iOS。这篇文章总结一下今年的经历和感悟。 本文数据的统计时间从 07/22/2023 到 07/22/2024,和开发第一年的总结 (从 07/22/2022 到 07/22/2023)做对比。

  • PixelsMeasure 开发一年总结

    去年利用业余时间,开发了一款屏幕测量应用 —— PixelsMeasure,这篇文章总结一下这段时间的经历和感悟。

  • Swift/SwiftUI 踩坑记

    这里记录 Swift/SwiftUI 开发过程中踩过的坑。

  • 为什么说 GPT 利好程序员

    半年来,ChatGPT (基于 GPT 架构开发的大型语言模型) 彻底颠覆了人们对人工智能的认识,给很多行业都带来了前所未有的冲击。尤其在编码方面,能轻而易举地写出俄罗斯方块、贪吃蛇、1024 等小游戏,能写出电影推荐等可上线的应用程序。在出色完成编码任务的同时,编码质量和效率都让人震撼。以至于很多人开始焦虑,觉得程序员离下岗不远了。为了了解其能力,我深入体验了一回。惊奇地发现,GPT 十分利好程序员,尤其利好程序员。 这篇文章记录了我的体验、观察和对未来的预测,希望与大家分享交流。

  • ChatGPT 编程实现 Web 数字水印

    文心一言发布后,界面的水印技术引起了我极大的兴趣。再加上想体验 ChatGPT 写代码的能力,所以借助它的能力,编程实现了类似文心一言界面的 Web 数字水印,并部署在了我的网站上。

  • Web 数字水印探究

    文心一言发布后,除了训练数据规模、训练结果和 ChatGPT 有差异外,界面上还多了水印。这篇文章主要探究文心一言使用的 Web 数字水印技术。 那什么是 Web 水印呢?GPT-4 帮我写了个带文心一言同款水印的网页,感兴趣的同学可以来这里感受一下。

  • Micro Frontends for Mobile

    On the Web, We have seen significant benefits from including micro frontends, which break up frontend monoliths into many smaller, more manageable pieces, and make many teams work simultaneously on a large and complex product. But Micro frontends for mobile seem stuck these days. In this article, we will describe a comprehensive guide to bringing these benefits to native mobile apps, as well as cover some of the implementation options that are available for mobile. And finally, we will dive deep into a full example application to show the technique.

  • URL 加载系统(URL Loading System)

    URL Loading System,通过 URLs,使用标准的网络协议,与服务器交换数据。本文帮助理解 URL 加载系统,并通过示例代码练习如何使用它,示例代码已开源。

  • Protocol Buffers

    Protocol Buffers,又名 protobuf,是谷歌内部使用的一种数据交换格式,于 2008 年开源 (proto2), 2016 年发布 proto3。后被业界广泛采用发展至今。

  • GraphQL

    GraphQL 是一种查询语言和执行引擎,通过 API 描述应用程序数据模型的功能和需求。2012 年由 Facebook 提出并实现,最初用在移动端,在 2015 年对外发布。于 2019 年成立 GraphQL 基金会发展至今。

  • 从 0 到 1 开发一款 IOS 应用 - Swift

    2021 年才做 IOS 应用开发,你觉得晚了吗?我认为时间刚刚好。Swift 发布 (2014 年) 才不到 10 年, ABI 稳定还不到两年。SwiftUI 也不到两年,势头正浓。Swift 的成熟让新人彻底抛弃 Objective-C 的历史包袱。再考虑到苹果努力打通各个平台的雄心壮志,未来无限可能,绝对值得投资。 本文带你从 0 到 1 开发一款类 Notes 应用,并使用 MVVM 模式构建程序。

  • MV* 软件设计架构

    软件工程推荐设计高内聚,低耦合的程序,方便代码复用,测试和维护。除了微观上符合 SOLID 原则外,宏观上良好的分层/分类也能极大的降低实体之间的耦合。

  • 学习一个新技巧需要多久?

    还记得最近学会的新技巧,一共花了多久吗?这里记录了我学习 VS Code 设置语言命令(Change language mode)的路线图,总共花了 5 个小时。

  • 不停机数据库迁移

    已上线服务若停机,轻则影响使用者的心情,重则会造成无法估计的损失。试想如果淘宝停机五分钟,那会损失多少真金白银。但数据库表结构却不可能在一开始就设计的十分完美,需要不断迁移,不断迭代。本文尝试分析数据库迁移时可能造成的停机原因,并以 Rails + PostgreSQL 为例,提出不停机的数据库迁移方案 (Zero downtime migrations)。

  • Rspec 如何 mock update 方法更新自己?

    Rspec 用来 mock 对象方法的语法如下: allow(model).to receive(:message).and_return(result) 允许 model 接收 message 方法返回 result 结果。那么,如何来 mock update 方法更新对象自己呢?

  • Rails 使用 mysql2 出现的段错误

    这两周做了一个 rails 项目,有重新认识 rails 之感,接着重新认识了一下自己。把其中一个有意思的 bug 拿出来分析一下。

  • 使用 Docker-compose 部署 Rails 应用到生产环境

    在上一个项目上有两年的工作经验,半年后再次使用 Ruby on Rails,还是掉进了各种坑里。踩过了坑,最重要的就是记录下来。 简介 本文主要介绍如何将 Ruby on Rails 应用 Docker 化并部署到生产环境。该应用使用 Mongodb 数据库,其它数据库方法类似。本文方法不是全自动化部署,但仅需要执行一条命令。

  • Cocoa troubleshooting

    心心念念的《Cocoa Programming for OSX (5th edition)》终于回来了,很开心的看了一章。概念和 QT 很像, connection 更像。结果一动手,就被第一个例子给难住了。怎么都调试不通过,浪费了很多时间。写一篇博客记录 Coco 相关问题及解决办法。

  • 独孤九剑 Dit (0x05) - 终端篇

    据说一个合格的程序员看终端的时间会比看女友的时间还多。 想开发一个受 类*nux 程序员普遍欢迎的程序,你就需要增加对终端的友好支持,包括良好的帮助文档、提示、颜色和自动补全。

  • Gem-based Jekyll theme 开发小记

    Github pages 和 Jekyll 搭配,让一大批静态博客火了起来,方便了不少人,用 markdown 写文章也非常优雅。

  • Miscellaneous

    这里记录一些小技巧

  • 前端手记 TodoMVC 之 Redux 篇

    React 将应用程序分解成不同的 component,每个 component 单独完成事件响应或者数据展示。把只负责数据展示的 component 叫做 Presentational Component,易复用。把与业务逻辑/业务处理密切相关的 component 叫做 Container Component,极难复用,通常作为 Presentational Component 的父 component 存在,比如我实现的 TodoMVC 中的 TodoApp。

  • 前端手记 TodoMVC 之 Server 篇

    在上一篇 前端手记 TodoMVC 之 React 篇 中实现了单页应用 TodoMVC,直接把数据存在前端,当刷新或者重新打开网站时,所有数据都会丢失。虽然对于 TodoMVC 这种应用,把数据缓存在前端是一个不错的选择,但以练习为目的,我还是打算特意为之,实现一个简单的 Server,提供 RESTful API,把 TodoMVC 相关的数据存储在后台。

  • 前端手记 TodoMVC 之 React 篇

    保持专注越来越难了,感觉我的注意力也上了年纪,变的花心多了,很容易被打断。能有心情、有时间静坐下来,学学 Todo list 的内容,感觉是最幸福的了。 前端的框架很多,我先从 React 开始。

  • 前端手记 TodoMVC 之 CSS 篇

    我一直以后端程序员自居,从不轻易涉足前端。有人说过,一个人最热爱的就是他所擅长的事。我没有设计师的品味和 UX 的眼力,对前端有着莫名的恐惧。这次由于工作原因,需要系统地学习前端知识,对我来说也是不小的挑战。

  • 独孤九剑 Dit (0x04) - 测试篇

    《南皮县志·风土志下·歌谣》:“兵马不动,粮草先行”。作战时兵马还没出动,军用粮草的运输要先行一步。在开发新功能之前,先编写测试代码,然后只编写使测试通过的功能代码,这种以测试驱动开发的开发模式是我非常推荐的。 对 Dit 的贡献要求需要通过单元测试,编写 Dit 的任意模块,都需要一并编写测试用例。本文先简述一下 Go 对测试的支持,后续会陆续提供 Dit 的测试方案和测试报告。

  • 独孤九剑 Dit (0x03) - 缓存篇

    每个人都会变成自己讨厌的人 Git 通过二进制文件 .git/index 来缓存当前目录,实现工作目录和仓库数据的快速交换。Git 的缓存却保存在 index 文件里,为什么不是 cache,很奇怪。

  • 英语小抄

    这里记录一些有用的单词,句子

  • LLDB debug Golang

    除了 GDB,还可以使用 LLDB debug go code 熟练调试工具是程序员的必备技能,lldb 的发展势头,大有取缔 gdb 的趋势,因此需要把 lldb 加入到自己的工具箱里。 LLDB 命令 LLDB 的所有命令都遵从以下格式: <noun> <verb> [-options [option-value]] [argument [argument...]] 对于常用命令,可设置别名,降低输入负担。(可通过别名设置和 GDB 相同的语法,降低记忆负担)。

  • Make mistakes

    Do you want to know the difference between a master and a beginner? The master has failed more times than the beginner has tried. We need to think about failure differently. Most people think mistakes are a necessary evil. Mistakes are not necessary evil, they aren't evil at all. They are an inevitable(不可避免的) consequence of doing something new and as such should be seen as valuable.

  • 大牛俱乐部上线啦

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上 号外!号外!大牛俱乐部 上线啦,欢迎戳 这里 查看 Go 和 Swift 方面的干货,让你站在巨人的肩上,看的更远!更有好看的妹子,陶冶情操,启迪智慧。 如果你也想加入编辑的行列,欢迎微信搜 zddhub,直接骚扰。

  • 独孤九剑 Dit (0x02) - 数据结构篇

    穷则独善其身,达则兼济天下。一个人一旦能够喂饱自己并有个安身之所,剩下的就是该别人做点什么了。我现在所做的一切,还都是为了自己。 Dit 和 Git 使用相同的设计思路和数据结构,在表述上会优先使用 Git,当出现差别时会特别说明。以下说明两种最基本的数据结构:仓库和对象。

  • 独孤九剑 Dit (0x01) - 总决

    总诀:“归妹趋无妄,无妄趋同人,同人趋大有。甲转丙,丙转庚,庚转癸。子丑之交,辰巳之交,午未之交。风雷是一变,山泽是一变,水火是一变。乾坤相激,震兑相激,离巽相激。三增而成五,五增而成九……” —— 金庸 独孤九剑讲究料敌先机,无招胜有招。在程序世界里,需要根据不同的需求不断的迭代。系统不能像剑一样随手变更,往往需要花费无数个人月「最近体会到可以把变化做成接口,留给用户,来应对一部分需求变更」。程序=算法+数据结构, 很少有像 TeX 那样,算法和数据结构都趋近完美,Donald 独自完成了 99.99%,甚至连 bug,都少到了惊人的地步。我认为程序设计最重要的是数据结构,深刻理解数据结构,使用最合适的算法,以不变应万变,才能抓住程序的本质,解决用户的痛点,做到在需求变化或者转型时,改变最小。

  • 独孤九剑 Dit (0x00) - 我为什么要做 Dit

    又挖了一个坑!不是没事专坑自己,只是想在无聊的时光里,找个乐子,找点事做。 小时候,最令人着迷的就是邻家 DVD 里播放的功夫电影。三五个小伙伴,从中午看到下午,再从下午看到傍晚,从不缺席。印象中的男主角除了爱上师父的女儿外,一般都会经历三个人生阶段: 被虐->上山学艺->下山报仇。

  • 零值强制类型转换的使用

    这可能是最最基础的内容了,可是我却从来没在项目中用过。有一句话是对的,永远不能说精通哪一门语言。 零值可被强制转化为任意类型,转化出的结果,不能被直接访问,可获取相应域的偏移量,通过对应域推算外层类型的地址。

  • 终端颜色输出重定向

    在用printf输出时,可加上颜色显示,让输出信息更加友好。

  • Go语法简略 - 正则表达式

    正则表达式Regular Expression(简写regexp或者RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。用法灵活,设计完善,是值得研究的一门技术。多数流行的语言,都支持正则表达式,且用法类似。像这种一处学习,处处可用的东西,值得大家深入研究。然而对我来说,需要的时候查查就行了。 对于像Duck这种Web框架来说,灵活的处理URL是基本需求,这种场景,使用正则表达式再合适不过了。

  • Makefile

    每次到写Makefile的时候,都是Google一段代码,基本就能实现自己的需求,过后就忘(发现越来越容易忘记一些事情)。今天终于被要求解释Makefile中的特殊变量,直接就蒙逼了,被狠狠地鄙视了一回,那么还是做个备忘吧。之后涉及到Makefile的问题,我都指着这篇活了。

  • Go语法简略 - Duck框架探索

    这个周末,《奔跑吧,兄弟》没有了,《那时那你》看完了,《万万没想到》剧组也没有新的项目,挠人的《花千骨》也要等到周日才更新,这是一个剧荒的周末,没办法,只能看看代码了。 本文打算参考Martini进一步实现我的[Duck框架]。

  • Go语法简略 - 依赖注入

    通过对web应用框架背后原理的探索,引入了依赖注入的概念。如果你需要读懂或者写一个框架的话,依赖注入的思想绝对能帮到你。本文记录对依赖注入的探索。

  • Go语法简略 - web应用框架

    Martini是目前最流行的基于Go的web应用框架,借鉴了express和sinatra。其内核类非常简洁小巧,值得研究。 本文探索Go对web编程的支持。

  • Go语法简略 - 反射

    反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。 一般来说,静态语言都会经过源码—>编译->运行的过程,reflect反其道而行,在运行时访问、 检测或修改源码的行为。 本文主要记录Go的反射语法,方便查询。

  • Go语法简略 - 面向对象

    优秀的程序员应该不限于只用一两种语言,对各种语言都要有猎涉,这样才能在合适的应用下选择最合适的语言。但优秀的程序员至少需要精通一到两种语言,在众多的编程语言中,我选择Go和Swift作为自己之后20年内的主要编程语言。 本文主要记录Go面向对象的语法,方便查询。

  • Go语法简略 - goroutine

    优秀的程序员应该不限于只用一两种语言,对各种语言都要有猎涉,这样才能在合适的应用下选择最合适的语言。但优秀的程序员至少需要精通一到两种语言,在众多的编程语言中,我选择Go和Swift作为自己之后20年内的主要编程语言,并力争达到精通的境地。 本文主要记录 Go 并行相关语法,方便查询。

  • Go语法简略 - 方法和接口

    优秀的程序员应该不限于只用一两种语言,对各种语言都要有猎涉,这样才能在合适的应用下选择最合适的语言。但优秀的程序员至少需要精通一到两种语言,在众多的编程语言中,我选择 Go 和 Swift 作为自己之后20年内的主要编程语言,并力争达到精通的境地。 本文主要记录 Go 方法和接口语法,方便查询。

  • Go语法简略 - 基础篇

    优秀的程序员应该不限于只用一两种语言,对各种语言都要有猎涉,这样才能在合适的应用下选择最合适的语言。但优秀的程序员至少需要精通一到两种语言,在众多的编程语言中,我选择 Go 和 Swift 作为自己之后20年内的主要编程语言。 本文主要记录 Go 的基础语法,方便查询。

  • 大牛 | 轻松科研

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上 最近无聊,做了“大牛|轻松科研”的网站。 明天我妹妹就要高考了,我希望她能金榜题名, 并且能用得上这个网站。

  • 未来这几年

    我也来展望一下未来几年科技的发展,如果不能为将来吹牛添加资本,至少可为做为笑料自嘲一下自己。 一直认为微软是一个缺乏创新的公司,从 win8 开始改变看法。在 xbox 大卖的时候,我曾经告诉朋友,世界那么大,我们不应该挤进小屏幕里面,而且那么扁,看看都觉得难受。

  • 为 Android Studio 创建图标

    当你在Ubuntu上满心欢喜的安装了最新版的Android Studio正准备大干一场的时候,却发现只能从命令行打开,是不是很郁闷呢? 其实做法很简单,Ubuntu上的应用图标配置放在/usr/share/applications目录下。复制其中任意一个文件到android-studio.desktop,修改对应的参数即可。

  • Shell

    这里记录我容易忘记的 shell 代码片段

  • Git

    这里记录我容易忘记的Git命令

  • Vim

    这里记录我容易忘记的vim命令

  • 金庸答百问

    这次,趁着春节,补看了《越女剑》、《白马啸西风》和《鸳鸯刀》,《金庸全集》总算一部不落的读完了。记得第一本读的金庸小说是《神雕侠侣》,从此欲罢不能。这次又重读了一部分《笑傲江湖》,常想着,金庸那匠心独运的构思,是先想好了再写,还是边写边想,终于在金庸答百问里找到了答案:

  • 论拖延症

    现在就干,立刻!马上!

  • Flex, A fast scanner generator

    One size does not fit all Flex is a tool for generating scanners: programs which recognized lexical patterns in text. flex reads the given input files, or its standard input if no file names are given, for a description of a scanner to generate.

  • 有理想的人

    理想是一定要有的,万一实现了呢? 豆豆 看完《天幕红尘》,又把《遥远的救世主》重温了一遍。相比来说更喜欢后者,或许是我对政治压根就不感兴趣,或许是丁元英的这首自嘲诗,真真的刺中了我,无地自容。 本是后山人, 偶做前堂客。 醉舞经阁半卷书, 坐井说天阔。 大志戏功名, 海斗量福祸。 论到囊中羞涩时, 怒指乾坤错。 豆豆是一个有理想的人。很显然, 像丁元英和叶子农这样心思缜密,又智慧过人的男人是很吸引豆豆的,也许现实中很难找到这样的人,所以,他们要么走了,要么死了,留下的只是一段美丽的传奇。

  • 从虚拟到现实

    假如你吃了鸡蛋觉得不错,何必认识那只下蛋的母鸡呢?我是一个想弄清楚下蛋过程的人。 获悉Mathias创办(co-found)了 DISDAR,真心希望他能做出改变世界的产品来。优秀的工作总是令人着迷,在第一次看了SIGGRAPH上的演示视频后,我就告诉自己,我要知道它的全部。大约两年之后,我才实现了 Mathias 论文里的算法流程,并开源了草图检索引擎OpenSSE。这是一个基础的框架,目前只对外提供了一种特征提取算法。希望草图检索不再神秘,更希望感兴趣的朋友能不断的改进,一起把它做成产品。

  • 常用视频转接口

    求知若饥,虚心若愚 (Stay Hungry, Stay Foolish) 作为一个资深的月光族+剁手党,终于在双十一(光棍节)的最后一分钟,花光所有存款,入手了一台U2412M,光荣地为571亿尽了绵薄之力。今天快递哥哥就以惊人的速度将其送到了我手上,令人抓狂的是,自带的线没有一根是能用的。于是百科了一下,记录在此,献给和我一样写了好多年程序,也装过很多台电脑,却叫不上接口名称的人(有图有真相哦)。

  • Recognizer configuration on CentOS

    I usually forget some things. Today, I reinstall my centos system and configure recognizer on it (Recognizer is my online version demo, powered by OpenSSE v1.10. You can get an offline version on my Github). This work actually took me two hours, it’s unbearable thing! So, I decide to record.

  • 整个世界清静了

    除了兴趣,做什么事情都需要一个理由。

  • 《Python源码剖析》读书笔记

    从Python开始,向动态语言迈进。