一般情况只有经典的古文才能让我感觉到『澎湃』的感觉。偶然也有一些让人回味的现代文。所以搭了个deep-paper.com的来收藏某些经典的文章。

IT工程师对感情和生活的思考确实比重太少了。自我检讨一下,工作事业本身终究是回向给家人朋友,愿和他们一起简单快乐的生活。而学会愉快地和人交流相处才是人生意义所在。

近来从两篇文章得到两个很有里程碑意义的启发。

第一个来源:《为什么你的爱情会输给日常琐碎?》

核心点是,『感情中,伴侣处理对方情绪需求的方式最为关键。当伴侣发出和对方“连接”的情绪需求时,面对请求的不同回应方式,会对夫妻的幸福程度造成深远的影响。』

回想我当年大学那个长跑的初恋,演化从愉快、厌恶、磨合、反复磨合、再反复磨合、舒适、自然、眷恋、交流闭环愉快、谈婚论嫁、交流情趣变味、突然急刹车。

长跑中,待对方我是问心无愧了,从牺牲了我的狗肉朋友圈,到勒紧裤腰带满足对方各种无用小东西的爱好,再到磨钝性格棱角主动妥协融入对方的世界观和坐标系。到后来已成习惯了一个亲人的存在。

但是,一切终止在个地方。创业落魄时,我说我好伤心,她竟然好像确实没有听到,而我就伤心地过界了,潜意识感觉已经到缘散不留之时。反而却有了『轻松』的感觉。这可能就是情绪需求是双方关系最大的影响因素了吧。

第二个来源:《有情趣的生活,不一定非要价格昂贵》

核心点是,『生活是有仪式感的,我们想要尊重生命给予的一切,多去感受其中有趣的体验。正是我们看重的仪式感让生活称其为生活,而非简单快速的生存方式。』

认真的收拾屋子、认真的整理物件、认真的准备早餐。。。认真考虑生活中更实际有趣的存在习惯。这些是很实在的大事,舍近求远地憧憬远方并非智慧的生活行为。远方可以有,不过近处总有不少可以看清晰的小事。

今天是上元节元宵,补睡起来到了21:30,:sleeping: 看看wm家里的摄像头诺诺在咿咿呀呀地跳舞,又看看电视晚会上有啥新鲜事,再看看月下楼随机一篇古诗词。不能够陪在家人旁边,过一个个简单而真实的日子,是咱这一辈年轻人的遗憾了,也常在这种情景时刻倍感心慌慌,,:smile:

静下心来,检视一下自己,当遇到心慌慌的时候,除了增强跑步强度加大多巴胺地强壮感愉悦感之外。最可消除烦闷忧愁的,还有两个有趣的方式:

元宵诺诺

  1. 入境诗词文字: 想象在曾经的某片时空景象,古人偶感得神来之笔,其意气之精妙、精神之独到,让人得到的感动绝非千金可求来啊!!! :pray:
  2. 透视各种澎湃的『基础建筑』: 比如,阅读、推演、审视那犹如浩大交响乐,跌宕起伏的古代人类文明历史;再比如,hack推测各种程序或模式的liveObjMap在内存中的大概存在形态。

第一点,需要那么一点耐心,一点平静中的偶然,才可能捕获到下面一些隽永的共鸣。第二点就得切换各种视角啥的。这里表现第一点,也当是汇总最近让我印象深刻的句子们,



1
2
3
4
5
6
7
8
9
君子对青天而惧,闻雷霆而不惊;履平地而恐,涉风波不疑  ---《小窗幽记》陈继儒(明) ---	
心无机事,案有好书,饱食晏眠,时清体健,此是上界真人。 ---《小窗幽记》陈继儒(明) ---
常将酒钥开眉锁,莫把心机织鬓丝 ---《增广贤文》之二百八十 ---
费尽心机俱归无用,总不如安分随缘 ---
处世若大梦,胡为劳其生?...浩歌待明月,曲尽已忘情。---《春日醉起言志》李白 ---
克己成,纵己败 ---
书屋前,列曲槛栽花,凿方池浸月,引活水养鱼;
小窗下,焚清香读书,设净几鼓琴,卷疏帘看鹤,登高楼饮酒。小酌半醺,浇花种竹;听琴玩鹤,焚香煮茶;泛舟观山,寓意奕棋。虽有他乐,吾不易矣。---《小窗幽记》 ---
掩户焚香,清福已具。如无福者,定生他想。更有福者,辅以读书。---《小窗幽记》 ---

tip: 《小窗幽记》,《菜根谭》、《围炉夜话》这三本典雅闲适心境的奇书,是浇灭心慌慌的无明心火的最佳选择了。

A、基础知识点:

  • GCD是异步执行任务的技术之一。一般讲应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。(也就是说GCD用我们难以置信的非常简洁的记述方法,实现了极为复杂的多线程编程。)
  • 执行处理时,存在两种Dispatch Queue,一种是等待现在执行中处理的Serial Dispatch Queue(串行队列),另一种是不等待现在执行中处理的Concurrent Dispatch Queue(并行队列)。(Note: Concurrent Dispatch Queue 虽然不用等待处理结束,可以并行执行多个处理,但并行执行的处理数量取决于当前系统的状态。即,当前系统状态允许再新派线程数量,这也是表现了GCD使用线程资源的自平衡合理之处)
  • 手动生成的Dispatch Queue必须由程序员负责释放,这是因为Dispatch Queue并没有想Blocks那样具有作为Obj-c对象来处理的技术。
  • 系统标准提供的Dispatch Queue,一个是 Main Dispatch Queue ,另一个是Global Dispatch Queue。主线程只有一条,所以Main Dispatch Queue自然就是Serial Dispatch Queue;Global Dispatch Queue是Concurrent Queue,它有四个执行优先级:High Priority,Default Priority,Low Priority, Backgroud Priority。
  • Dispatch Group 使用场景,『多个子任务并发,最后执行「完结任务」做结束』;追加到Dispatch Queue中的多个处理全部结束后想执行『结束处理』。使用dispatch_group_notify( )进行callback『结束处理』
  • Dispatch_barrier_async使用场景,『公共数据读写』:需要并发读取数据库read_db_blocks,同时可能有写入write_db_blocks场景。
  • Dispatch_apply(count,queue,^{ someThinsDoing }) 使用场景,『重复某限定次数count,在指定queue上,执行count此 block』,注意的是dispatch_apply 在同步在当前queue。
  • Dispatch_semaphore使用场景,精确粒度的排他性,信号0时才允许通过『修改』。
  • Dispatch_one使用场景,多核多线程安全的单例实现。
  • Dispatch I/O 和Dispatch Data 使用场景,大文件的并发读取,分割。

B、关键知识点:

  • 避免使用旧线程技术,使用GCD:多线程编程问题,如果过多使用多线程,就会消耗大量内存,引起大量的上下文切换,大幅度降低系统的响应性能。
  • 使用Serial Dispatch Queue: 最大目的是,为了避免多线程编程问题,多个线程更新相同资源导致数据竞争。

code snippet example


1、Serial Dispatch & Concurrent Dispatch Queue

1
2
dispatch_queue_t mySerialQueue = dispatch_queue_create("com.testSerialQueue", NULL);//串行queue
dispatch_queue_t myConcurrentQueue = dispatch_queue_create("com.testSerialQueue", DISPATCH_CURRENT_QUEUE_LABEL);//并发queue

2、Dispatch Group 是开源库TMCache线程安全缓存的使用的技术

1
2
3
4
5
6
7
8
9
10
11
[_memoryCache setObject:object forKey:key block:memBlock];
[_diskCache setObject:object forKey:key block:diskBlock];

if (group) {
    __weak TMCache *weakSelf = self;
    dispatch_group_notify(group, _queue, ^{
        TMCache *strongSelf = weakSelf;
        if (strongSelf)
            block(strongSelf, key, object);
    });
}

3、dispatch_barrier_async 同样被TMCache 充分发挥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 dispatch_barrier_async(_queue, ^{
    TMMemoryCache *strongSelf = weakSelf;
    if (!strongSelf)
        return;

    [strongSelf removeObjectAndExecuteBlocksForKey:key];

    if (block) {
        __weak TMMemoryCache *weakSelf = strongSelf;
        dispatch_async(strongSelf->_queue, ^{
            TMMemoryCache *strongSelf = weakSelf;
            if (strongSelf)
                block(strongSelf, key, nil);
        });
    }
});

参考资料:

  1. 《Grand Central Dispatch (GCD) Reference》
  2. 《Objective-C高级编程 iOS与OS X多线程和内存管理》
  3. 《Concurrency Programming Guide》