我为什么使用 Vim?

很多人说用 Vim 是因为键位比较方便,其实这只是部分原因,不知道你思考过没,为什么今天大部分 Editor/IDE 都支持 vim keymap 的情况下,还有那么多人用 Vim 呢?如果仅仅因为键位原因,他们大可以用其他东西啊,为何还继续用原始的 Vim 呢?

也许在你看来,有的人配置 Vim 一半天最后就是类似 IDE/Vscode 的样子,既然如此,那么为啥那些人不直接去用 IDE/Vscode 呢?(二者也都支持 vim keymap),为什么他们还抱着原版的 Vim 不放呢?难道真的是他们没听过/没用过时下最先进的 Editor/IDE 么?

事实可能恰恰相反,很多 vimer 都是非常热衷尝试各种新的编辑器的,我给 vscode 写过不少高赞回答,也给 atom editor 开发过插件,不少 vimer 机器上 terminal/gui based 的 editor 加起来都有十多个,对主流 editor/ide 的熟悉程度未必比非 vimer 差。

那么究竟为啥还有人用 vim 呢?CoC 作者赵启明老兄已经回答了:”Vim 大概是世界上扩展能力最强的编辑器”。Vim 就像编辑器世界里的 MineCraft,你说 MineCraft 最终目标也就是去杀条龙,为什么那么多人不直接玩也能杀龙的黑魂/老头环,却一直迷恋 MineCraft 呢?

因为 MineCraft 每一寸土地都可以定制化,每种游戏元素都可以自己制作(除了工具武器制作外还可以制作各种玩法的副本关卡,还有人用 MC 里的红石从门电路做起,搭了个 CPU),而 Vim 里每个字符你都可以定制。

方便定制体现在两个方面:首先是能定制的地方很多,到处都能改(不像 vscode 一样对插件开发者诸多限制,连个 toolbar 按钮你想加都加不了);其次是非常容易上手修改,改的代价非常低,不用加个简单功能都要创建个插件项目,编辑 package 配置等一堆七七八八的文件,一半天才能开始写一行代码。

我用过非常多的编辑器,有一些至今我都非常喜欢,但不管我多么喜欢一款编辑器,总有一些地方是我不满意的,碰到这种时候,大部分我只能祈求开发商发慈悲哪天给我加一下,即便有些开源的,支持扩展的,很多都没达到 Vim 的扩展性,可以那么容易的让普通用户随心定制,四处定制。

用其他 Editor/IDE 的用户大部分都是下下扩展,改下按键之类的,而 vim 用过一年以上的几乎人人都可以随手扩展,举几个例子:

Continue reading

Loading

Posted in 随笔 | Tagged | Leave a comment

用了很久的全拼改为双拼值得吗?

双拼是我最近半年学习的最有用的东西了,世界上有一些基础技能是只要你投入一定固定时间,一次学会然后就可终身受益,比如学习一门外语,比如驾驶,比如练习打字速度,比如学习双拼。把时间花在这些事情上面是最有价值的投资。

上士闻道,勤而行之;中士闻道,若存若亡;下士闻道,大笑之
— 《道德经》

回答一些关于双拼的常见问题:

1)自己能够非常熟练的使用全拼,切换到双拼有收益么?

这个情况和我之前差不多,我系统的练习过英文输入,字母和符号数字都用标准指法盲打,手速方面也不比别人慢,我也写文章分享过何提高英文打字的速度:如何练习编程的手速?

同时我也用了二十多年的全拼了,自认为很熟练,像一些长的拼音诸如 “shuang” 这些,基本一眨眼就输入完成,根本不存在卡壳,搭配云词库输入起来简直像飞一样,所以一开始也觉得根本没有学习双拼的必要。值到我真的花时间学了双拼并用了三个月后,我的整体输入速度至少快了 50%。

2)双拼快在哪里?

首先所有汉字都可以两次击键就完成输入(第一键输入声母第二键韵母),其次输入错了按 BackSpace 往回删除的时候非常有效率,比如 “今天我上街买东西”,全拼是:”jintianwoshangjiemaidongxi” ,假设打到最后发现前面 “天”字我输入错了,全拼需要按非常多次 BackSpace 才能删除到 “tian” ,按的时候还要非常注意位置,避免多按或者少按;

而双拼的话,输入的是:”jbtmwouhjpmddsxi” 从前面的 26 个字母缩减到 16 个字母不说,每个字都是稳定的 2 个字母组成,因此往回删除的时候非常稳定,两次 BackSpace 删除一个字,按的次数也比较少。

最爽的是手机输入,击键速度是制约手机输入最大的障碍了,虽然我在电脑上击键飞快,但到了手机上的虚拟键盘,一样慢了下来,虽然我没用 9 宫格而是用的全键盘双手两个大拇指输入,该慢还是慢了下来。双拼对于击键次数的减少在手机上能明显体现价值来。

3)写文章主要是思考,打字快慢无所谓?

有的人还说什么刘慈欣打字也不快,但是人家能写出三体,所以打字速度并不重要,这是谬论!

打字速度快了,你才能节省出大量时间给你去思考,一个动作重复 300 次,肌肉就会有记忆;重复 600 此 ,脊柱就会有记忆;你打字速度能做到行云流水一般的速度,大部分输入根本不用过大脑,直接脊柱反射就完成的时候,你大脑才能完全无负担的思考,真正做到:心到,眼到,手到。否则打个字都要停顿下的话,你会占用更多大脑 CPU 时间。

不是至今还有文学大师打字只会用二指禅吗,还有剧作家只喜欢钢笔写文字稿,你们想学他们吗?所以说这就叫反智。这些觉得打字快没用的人,让他们把自己全拼的词库关闭了他们肯么?不肯的话,说明他们根本不是不想要更快的输入速度,而是内心拒绝学习新东西。

4)学习双拼需要多长时间?

我自己花了十分钟就把双拼规则学会了,就看下面这张图片就够了,我用的 “小鹤双拼”布局:

(点击 more/continue 继续)

Continue reading

Loading

Posted in 大浪淘沙 | Tagged | 1 Comment

CD1:BORLAND 宝典

图形界大佬 John Carmack 在推特上呼吁大家,现在应该有意识的保存你的开发环境,这样多年以后你想重新构建你的软件时才不会慌脚乱手,因为通常每过几年你常常会发现,自己之前的老代码已经没有合适的环境编译了:

今天互联网上的内容,由于各种原因,正在以越来越快的速度消失,而习惯什么都从网上找的新一代网民们,却并没有备份和记录的习惯及意识。不远的将来,会有一天,当你特别想找某个工具却搜尽互联网你都找不到时,就麻烦了。

这是一张兼具收藏价值和实用价值的光碟,收录了 Borland 公司全胜时期的著名桌面开发工具:C++ Builder 6 和 Delphi 7,以及各种配套书籍和资源,都是全网最好的版本(原版 CD 安装文件加最新补丁)。别看这两款软件老,因为生成可执行独立小巧,至今依然可以用他们做出交互尚可的桌面应用。

他们最大的特点,是可以让你轻松开发出 1MB 以内的无依赖的桌面软件:(点击 Read more 展开)

Continue reading

Loading

Posted in 未分类 | Tagged , | Leave a comment

VSCode 有哪些让人眼前一亮的插件?

VSCode 里很多插件看着很好玩,但装上看一下你就不会再用了,还有些插件所有人都推过,一堆人推来推去还是那么几个,越看越无聊,因此再说这些也没什么意思,还不如直接看下载排行榜去。

我选插件就一个标准:提升工作效率!分享几个我自己用的能让生活变得更容易的插件:

1)Project Manager:

用 vscode 经常在项目里切换来切换去,Open Directory 效率太低,命令行 code . 用着也不方便,这个 Project Manager 是解决这个痛点存在的:

  • 左上是项目收藏面板,点击 “软盘”图标可以收藏当前项目,下次直接点击就切换。
  • 左下是项目扫描,设定几个目录,会自动扫描这几个目录下面所有 svn/git 项目,双击切换。

有了这两个面板,项目切换随心所欲,想切就切。

2)Notes

笔记插件,安装后,设置一个存储笔记的地方,然后该路径下的 markdown 文件会专门显示在 Notes 插件的面板里,集中管理。当然有更专业的笔记软件,这个插件的优势是就在 vscode 的侧面板里,非常容易访问到,不需要多开一个软件,不影响当前 vscode 正在打开的项目,适合随手记录一些比较零碎的东西。

尤其适合记录一些代码相关的东西,然后设置保存在 onedrive 目录里,多台电脑云同步。搭配其他 markdown 插件,可以方便的实现笔记内链(按 CTRL+鼠标左键跳转),图床之类的功能。

(点击 more/continue 继续)

Continue reading

Loading

Posted in 随笔 | Tagged | Leave a comment

哪些特性让你觉得 SVN 比 Git 更好用?

1)不可撤销,SVN 随便你怎么折腾都不会把仓库弄挂,git 的话就要小心了,即便你设置保护了 master,其他分支不小心也会给弄没了。

2)简单直观,不但美术容易使用,连行政和 HR 用 TortoiseSvn 的话,二十分钟就上手了,一说就懂。Git 的话,即便是程序员,想用好的话,不读下 pro git 之类的书,我看都着急。

3)权限细分到目录,可以每次只 update 一个小目录。

4)好管理,只要本地修改下 authz.ini 然后 commit,服务端 crontab 设置个脚本,自动让最新的 authz.ini 生效即可,一切权限变更都有记录。

5)不占空间,占用空间更小,提交一些美术资源都不用担心,比 git 占用小多了。

6)成熟的工作流,branch 不方便没问题,一般 release/trunk/develop 三级分支就够了,平时大家都在 develop 分支上开发,每周一冻结版本,merge 回 trunk 开始测试 trunk,稳定下来以后再从 trunk 合并到 release 对外发布,hotfix 直接在 trunk 上做,测试通过又分别合并回 release 和 develop,非常清晰的工作流,有什么大功能的话再分出一个来。

7)负担轻,用 git 最大的负担就是天天 merge/rebase,这负担比 svn 重很多。

8)单调递增的纯数字版本号:13001, 13002, 13003 看着比一大堆 hash 标记直观,可以大模大样的写到测试邮件里,可以高效率口头交流,别人说个数字你就基本有概念,大概何时提交的?谁前谁后?

。。

说公有云 svn 少的,github 本身就可以用 svn 来操作,直接 checkout github url 即可,提交的时候用 github access-token 当密码,就是 ghp_ 开头那个很长的字符串 ,就能提交了。

代理的话 svn 一样可以配置,码云和 coding.net 等也都同时支持 git/svn。

。。

更没必要把用个工具上升到宗教程度去信仰,多角度看问题,别人的说法自己也想一想,比如曾经流传的:

说法1:git 可以当作 svn 用,svn 却不能当作 git 用,这说的是 git 可以完全包含 svn,根据上面几条,细究起来显然不是这样的。

说法2:git 是分布式的,中心挂了可以恢复;没毛病,但你又不是 linux kernel 需要全球协同,你一个公司项目,团队里所有人都坐在一起办公,即便有人在家工作也有强有力的组织约束,你是联不通内网非要用分布式还是说公司系统不可靠到备份需要依靠每个程序员的 working copy ?

说法3:git 可以方便做分支,没毛病,确实是 git 的长处;但它不经意间植入了一个潜台词 ,即“你需要频繁做分支”,真的是这样的么?还是看各个团队自己的工作流才对吧?上面三级分支的工作流在若干团队里成熟稳定的跑了多少年了,不需要像 git 一样每人每天都要处理合并问题。分支满天飞的代价就是下班前想推代码手慢被同事先 push 了,自己就只有晚半小时回家了。

这里并不是呼吁大家用 svn 代替 git,不用那么二极管思维,而是没必要把 git 当作 zz 正确,适当的时候需要用 svn 也开开心心的用就是。

Loading

Posted in 大浪淘沙 | Tagged | 2 Comments

用 Lazarus 做界面合适吗?

也许你没留意,很多你经常用的桌面软件是用 Lazarus 开发的。

作为 Delphi 的开源替代品,我一直是比较喜欢 Lazarus 的,虽然有些小众。技术有两种,有些是用来挣钱养家,用来赶进度大规模集团作战的;还有一类是出于兴趣,单纯觉得好玩,会不自觉的有空就翻出来当爱好的,比如 Lazarus 就是一个很好玩的玩具。

因此不用成天纠结 “谁是 GUI 天下第一” 之类内卷的问题,抱着轻松和评测+鉴赏的心情了解下或许也不错。

在此之前,得先说两句 Delphi,姚冬老师,知乎编程板块无人不知,给了 Delphi 这样的评价:

Delphi 是神作,它在 RAD(快速应用开发)领域长时间没有对手,直到BS架构取代CS架构。Delphi 的特点就是简单、开发快,单纯就写个基本可用的应用来说,可能至今都没有比他更快的。

为啥作为国内最早使用 Qt 的人,却会给 Delphi 那么高的评价呢?中小应用开发 “至今没有比他更快的技术”这么高的评价,必然是有原因的,无独有偶,另一位 Qt 大神也发表示过对 Delphi 继承者 Lazarus 的喜爱:

Delphi 的继承人有两个,第一个是 C# Winform,几乎是把 Delphi 的整个开发模式迁移过去了;第二个就是 Lazarus。你用 C# Winform 没有任何问题,但 Lazarus 作为另外一个选择,它有其不可替代性:

  • 免费开源,跨平台,支持:Windows, Linux, macOS, FreeBSD。
  • Native 语言做 GUI 更加硬朗:更快响应,更低内存占用,不易破解。
  • 高度还原 Delphi 开发方式,控件丰富。

Lazarus 使用 Free Pascal 和 Free VCL (LCL) 基本做到和 Delphi 项目源代码级别的兼容了,喜欢 Delphi 开发的,迁移 Lazarus 基本上都很容易,配张图感受下:

看看上边那一排丰富的控件,左边熟悉的控件属性面板,是的,原汁原味的 Delphi/BCB 的感觉。

Lazarus 在 2012 年发布 1.0 后在 Source Forge 上到 2020 年累计突破了 400 万的下载次数,持续迭代了多个版本后,于 2022 年发布了 2.2.0 版本,比前作更加稳定和完善。Lazarus 免费并且开源,允许用于商业开发的,这意味着你不需要花几万元购买 DELPHI 或者 VS 就可以开发商业应用。

(点击 more/continue 继续)

Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment

网游通信协议如何防止封包篡改?

第一层:协议非对称加密交换密钥,对称加密传输内容,保护好服务端私钥,防止中间人攻击。流式加密,同样包发两次内容不一样。

第二层:不用标准序列化工具如 protocolbuf,用修改版或者自己实现的。

第三层:客户端加密加壳防止调试和注入,程序签名防止篡改二进制。

第四层:重要代码放虚拟机或者脚本里运行(脚本字节码需需改),一般黑客主要分析反汇编,你复杂逻辑多套几层他就晕了。

第五层:关键数据不落内存,一律使用 getxx,setxx 之类的接口,后面将真实数据经过变换以后才落内存。

第六层:守护进程动态跟踪监控情况。

第七层:决定性逻辑永远放在服务端。

第八层:服务端定期校验消息合理性,比如十秒内最大的移动步长是多少,实际发上来的合理不合理,不合理就踢掉,比如按键点击频率是否超过正常人。

第九层:不定期弹出反外挂答题,答正确奖励经验,错误就掉线。

第十层:必须要放在客户端计算的内容将输入和结果 hash 同步给其他客户端验算,不对就踢掉。

第十一层:当检测到客户端触碰到某规则不要急着踢掉它,而是有概率被踢掉,还要随机几秒踢掉,这样黑客发现一会这里断一会那里断,就蒙圈了。

第十二层:发现某黑客/外挂工具利用某漏洞破解了游戏,先看影响大不大,再看他挣不挣钱,影响一般又不挣钱的话可以先养着他,等他挣钱了用户多了,大型活动之前,一条指令就把它封了,用户退款都可以弄得他爬不起来。

。。。。。

手机打字慢,先写这些,没有绝对安全,就是合理的策略加攻防成本。

Loading

Posted in 游戏开发 | Tagged | 2 Comments

给 Qt5 引入 C# / Delphi 的 Anchor Layout

在前文 用 MFC 写 GUI 程序是一种什么样的体验? 中提过 Anchor Layout 可以很简单的设定让控件跟随窗口四条边大小变化的策略:

比如右下角的两个按钮,设置的 anchor 是 “right,bottom” 他们在窗口扩大缩小时,会跟右和下两条边保持恒定距离,左上角的文字是 “left,top” 的 anchor,他会保持恒定的左边距和上边距,中间文字框的 anchor 是四个方向的 “left,top,right,bottom” 他会和窗口四条边框保持相同边距,因此会随窗口扩大而扩大。

这种布局方式最早是 Delphi / C++ Builder 引入的,非常简单实用,后来被 C# Winform 原封不动的抄了过去,而 QtWidgets 里用了另一套规则,虽然用起来更精细了,却没有 anchor layout 这么简单直白。

虽然 QtQuick 和 QGraphicsItem 里面也支持 anchor 布局,不过原生的 QtWidgets 里并没有支持,所以我写了两行代码解决了这个问题,只需要在窗体的 resizeEvent() 里调用下 AnchorLayout 类的 update() 方法,就能将所有子控件中包含 “anchor” 属性的 geometry 全部按照 c# 规则更新:(点击 Read more 展开)

Continue reading

Loading

Posted in 编程技术 | Tagged | Leave a comment