转眼一晃,一年又过去了。我和孩子都长了一岁。不过我们成年人感受到的时间飞逝,和孩子有一些异同。
孩子在一年过程中,是没心没肺的玩耍娱乐,这些经验和快乐,有些是没有记忆的,比如哪一天的楼下滑车。有一些是潜移默化的,比如哭闹后的面壁,让孩子对道理有深刻认识。对于孩子而言,一年中的经历,是无形中植入的种子,谁也不知道哪一天会发芽,或者早已经在孩子成长的过程中生根。其中弊利,谁也无法能给个断定。因为孩子的可能是巨大的,谁又知道这一刻的同伴辱骂,会让其走向懦弱暴躁或者虚怀若谷的两个极端,抑或只是无声无响等待被抹除的记忆?
我们成年人的一年和孩子是不一样的体感。一年的时间,并不是一个成年人的基本单位。有人一无所有,有人衣食无忧,有人捶胸顿足,有人把酒言欢,诸多改变,很可能都不是一年之内养成的。一个赌博的习惯培养了十多年,才有可能让一个中年人一夜走向穷困。一个二十多年的烟民,才可能在短时间内走向生命尽头。我们对一年内发生的每件事,都有自己的思考和认知,是有明确的利弊权衡,这和孩子的被动接受是有区别的。

时间是极为可怕的怪物,对任何事物都有一致的光阴长河。比如铁片在生锈、沙漠在升温、高山在变矮,孩子在长高等等。在光阴长河里,万事万物都在同一个度量单位里面平滑的向前移动。这种温水煮青蛙的方式对于万事万物都是一样的刻量,有生命的、有物质形态的甚至虚无缥缈的万事万物,都随着时光的流逝,不同程度的发生了不可逆转的变化。
对于我们这些置身于怪物掌控下的一粒沙来说,短时间内有大的行为波动是不现实的。就像那些一年内暴富的机缘,不可遇更不可求。我们都是在一步步的被时间打磨,一年时间,说长不长,说短也不短,值得做一个总结和回味,也值得在以后的岁月中慢慢咀嚼,毕竟人生能有几个一年?

又一年过去了,我也慢慢逼近三十岁的门槛。2021 年,不是一个平坦年,有人欢喜但更多的人是哭。我没啥机缘,所以没有啥特别欢喜的,感觉这一年也都是水到渠成的故事。哭呢,悲惨的事情也都没有发生在我的身上,我也没有哭的必要。当我觉得又得过且过了一年的时候,我还是想回顾一下,就翻看了年度相册作为事件源,发现能写的东西还是非常多的。个中甘甜与辛酸,均冷暖自知。

更新:2023.10.08 已经迁移至 X (Twitter),海驴。欢迎访问和 follow。

2022 年 8 月 6 日 00:36|有些人,道理呢是说不通的。动手,虽然不好听,可能够解决问题。

2022 年 8 月 4 日 00:46|取关了差评的公众号。本来作为科普公众号挺好的,非要瞎几把含沙射影讲了几年政治。基本不主动取关,现在啊,实在是恶心的撑不住了。差评,之前还挺好的,我之前工作在他们办公室旁边,还去热过饭,一群有激情的少年员工。直到有一天我发现它们不仅瞎扯淡还控评,之后也没有调整。直到现在的不喜取关。

2022 年 8 月 3 日 02:32|看着各大搜索引擎的热搜,笑死了。都挺好,这些年,没啥进步但也没退步。

2022 年 8 月 3 日 02:25|挺好,这个访台事件让我清了好几位朋友圈人士。傻逼脑残,不遇到这样的事都找不到机会。

2022 年 8 月 1 日 10:00|工作上,总要和某些同事打招呼,说 “大佬,这个…”。加上大佬,大哥,老哥这些前称,对我们这些底层的人来说,比较好办事。其实也不是他们喜欢听,他们并不喜欢。只是当你说了这些前缀,他们不看消息不回消息,也有些不好意思了。仅此而已。

更新:2023.10.08 已经迁移至 X (Twitter),海驴。欢迎访问和 follow。

2021 年 12 月 30 日 公司内部,先把一件事情弄大,再小的事情都会被处理掉。不会闹事没有饭吃。

2021 年 12 月 26 日 今天和两位朋友要了欠款,也都很爽快。不禁想起那一年,我和高中同桌讨要 3000 借款的场景。 讨要了一年,期间说现在没钱、刚分手、现在手里真没钱、等等。开始的时候,我是真没放心上,当年都是好朋友,只是毕业好久没见面了,只当是困难。后面偶然从另一个好朋友那里知道也有借款并及时要回止损了,我才知道,这朋友心变了,变得喝人血馒头了。 最后他就是死马当活马医,不接电话不回信息。我就留言说法院投诉了,等传票。 他马上还了钱,然后删除好友关系,然后退出同学群。这一串操作把我打懵了,可能他面子上也觉得这很丢人吧。至于良心,我倒是不觉得他还有了,毕竟当时可是高中同桌好友,要是有哪能干出这事。

2021 年 12 月 25 日 房子,终于是告一段落了。基本好了,还有冰箱洗衣机,等入住的时候再买。其他基本 OK 了。

2021 年 12 月 23 日 人微言轻的时候,靠的就是不要脸了。别人就是看不起,只有不要脸可以更好的沟通。

2021 年 12 月 22 日 今天部门开圆桌会,发现同事和之前经历的公司一样,都不做出头鸟,也没有啥醍醐灌顶的言论。但是那一种不向权贵膜拜低头的自信气质,倒是走过的公司很少见的。走过的公司,有小厂,大家看老板脸色混饭吃。有管理上近乎国企的公司,大家严肃对待上 1 级和上 n 级领导的言论甚至抄录下来防止忘记。这里有一种你是我领导但我不认为你比我强的心里。所以呢,总体来说,很多人都在社会和公司噤若寒蝉,只有在家的时候才放开约束。大公司的员工,虽然除了工作表现上会有突出,其他方面也和大众一样,是自私、有歪心、思维更活跃的普通人。应该按照自己想法好好打扮自己的家,对所有人那都是可以放纵的地方。

更新:2023.10.08 已经迁移至 X (Twitter),海驴。欢迎访问和 follow。

这一篇是碎碎念的扉页,作为碎碎念分类的开篇。
过去的这一年,我又经历了一场无法言说的个人荒诞。有严肃的,有开心的,有奇葩的,有诡异的,更有无法言说的。
过去一年,对我的影响很大,客观评价来说,我很受益,也有伤害。虽然我的这些经历,对很多人来说,每天都在经历,或者就像每日的吃饭一样正常,但我回首思考,对我或者很多很多人而言,如果有这样一场经历,人生的见识的确更丰满一些。

我在一周前发现了一个惊人的秘密。我尝试去了解和熟悉这个秘密,发现需要很大的勇气和一个不那么友好的过程。于是我打算把战线拉长,我希望经过一段时间的自我训练后,拥有这个逆天改命的技巧与能力。
秘密就是多重性格。多重性格不是 “多重人格”,多重人格是疾病,多个人格在一个主体上不互斥的体现出来,多个人格之间相互独立。 相反,多重性格就是一个主体,可以控制多个性格,在不同的场景下,展现不同的性格形态。但是这多个性格之间相互影响、相互约束,只在最合适的场景、使得主体舒适度最大这样的条件下,主体刻意展现其中的一种性格。

很多人都对别人劝诫,说性格不好,应该改改脾气云云。说这话的人都是傻逼,因为我也说过。
说这话的人会认为自己在某方面的性格是优秀的,因为没有尝试过改改脾气这个过程,才会顺口说出这样的劝诫。
但什么样的性格才是优秀的?这本身就不像 1+1=2 这样,有一个绝对的标准。
改改脾气是否是那么容易的?我下面会阐述,基本改不了。
很多女性都喜欢温文尔雅的男士,那让这个男士去做将军去砍头杀人,拿着刀他都手抖。我这是举个例子,我写过一个 [打比方][1] 的文章有说明,例子可以更好的阐述观点,但例子可能会误导人。我就想引申出一个重心:性格是多样的,但各有千秋。好看的外表千篇一律,有趣的灵魂也绝非万里挑一。

Core Foundation 是被 iOSer 忽略的一个重要框架。说重要,因为 Core Foundation 提供了丰富的组件库,这些组件库可以很好的用于开发工作。
但之所以被忽略,因为很多开发工作,可以用更友好的 Foundation 框架替代。
Core Foundation 有 Foundation 没有的功能,比如 CFDictionary 的 Key 元素无需实现 NSCoping 协议、CFArray 可以不进行对象引用计数等。反过来,Foundation 也有 Core Foundation 无法胜任的工作,最大的来说就是自动引用计数功能。
在 iOS 项目开发过程中,我们可以使用基于 C 语言的 Core Foundation 框架写一些业务功能逻辑,甚至有时候非用 Core Foundation 不可,因为它有 Foundation 没有的功能。

Foundation 是用 Objective-C 语言写的,Core Foundation 使用 C 和 C++ 语言写的。我们都知道 Objective-C 是 C 的超集,所以认为 Objective-C 和 C、C++ 混编是正常的。
那么,什么是超集?Objective-C 是动态的面向对象的,C 是静态的面向过程的,如何实现这个超集?
既然 Objective-C 可以和 C、C++ 一起使用,那么 Golang 呢?我们可不可以用 Go 来做混合开发?

通过 Core Foundation,可以有更大的认知空间。
比如各类高级语言在计算机中是如何运行的?Dart (flutter) 可以做混合开发,原理是什么?Lua 做热更新,它不是 C 语言也不是 Objective-C 语言,是怎么被计算机调用执行的?用 Node.js 写 iOS 代码,到底行不行?
各种风马牛不相及的高级编程语言,是否有各自的边界?

最近在研究发送 / 接收缓冲区对 Socket 性能对影响,朋友发来两篇质量非常高的研究性报告让我看。
Socket 缓存究竟如何影响 TCP 的性能
TCP 性能和发送接收窗口、Buffer 的关系
做研究的,都少不了数据。上面文章中 “缓冲区对 Socket 性能分析” 的数据非常严谨,我非常佩服。
于是我用 WireShark 分析验证 TCP 的数据传输流程,过程包含三次握手、滑动窗口数据传输、四次挥手,收益很多。

这个问题,在很多年前其实是经历过血腥风雨的。

就是下面的代码,Xcode 创建项目的时候,会生成下面的 main.mm 文件:

1
2
3
4
5
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

问题就是,main 里面的 autoreleasepool 是做什么用的?

不管在哪门开发语言中,多线程都是绕不过去的开发方式。多线程本身也不是开发语言的一部分,只是开发语言会对多线程进行语言级别的包装。
多线程属于计算机原理的一部分。每个应用都需要操作系统分配一个进程后才能在进程中执行,为了实现并发效果,才有了多进程方案。而进程切换开销太大,这才有了多线程方案。乃至于多线程也是有不小的内存和 CPU 开销,后面的协程才开始起家。
但是协程已经不属于计算机的范畴,协程是单线程的,需要语言级别实现的。有些语言并没有实现协程,也只能使用多线程的方案对 CPU 资源进行深一步的榨干。

像 iOS 开发里面,每个应用都是独立的沙盒,官方并没有提供多进程的方案 (操作系统级别肯定要支持),也没有提供协程方案,如果想更有效的利用 CPU 资源,只能从多线程上面入手。

iOS 里面多线程虽然理解起来有点绕,尤其任务和队列嵌套的时候。但只要多使用几次并加以过程分析,多线程的使用也就能很好的过关了。因为 GCD 本身已经对多线程有了非常棒对封装,只要不自己作死,串型队列和同步任务一起处理的时候小心一些,就不会出现队列等待导致死锁。即使死锁了,像这样的系统中断性问题,也很容易排查和处理。

那多线程,难点在哪里呢?显然不是 Api 级别的多线程接口调用。

运行时 (Runtime) 本身是一个非常普通的概念,每个编程语言都会有运行时,非 iOS Objective-C 特有。
概念上理解,
运行时,就是程序执行的过程
,每个编程语言,只有运行后执行特定的任务才有价值,所以每个编程语言,都有运行时。
而 Objective-C 的 Runtime 显然不仅仅是程序执行过程这么简单,它一举将基于面向过程的语言 C 而实现的面向对象的语言 Objective-C 变成了动态语言
为什么 Objective-C 的 Runtime 有些难理解,因为运行时从概念上理解非常简单,但是 Java、Python、C 它们的运行时都是不一样的,运行时期间可以做很多事情,所以运行时理解起来还是比较抽象和高阶。
如果把 Runtime 改名为 OCDR(Objective-C Dynamic Resolution,即 Objective-C 动态决议),剥离运行时和运行时库的概念,那么很多人都会轻松掌握 Objective-C Runtime 的核心。而 Objective-C Runtime 本质上的确就在践行动态决议这么一个过程。

0%