Blog

回车与换行

Content #

回车和换行的概念最早起源于老式打字机。那种打字机上有滚筒,用于使纸张上下卷动,每敲击一个按键,字车往右移动一格,位于下一个可打印的位置。在这种古老而不失先进性的设备上,将字车推到最左边,也就是一行的开始,叫做回车(Carriage Return);而拧一下滚筒,将纸上卷一行,叫做换行(Line Feed)。如果既回车,又换行,那么,字车将位于下一行的行首。这个过程通常叫做回车换行(CRLF)。

在刚刚有了电子计算机的时候,因为它又大又贵,只能通过远程终端来分享它的计算能力。这时候,用的是电传打字机,不需要人工操作即可显示和打印字符。当然,根据需要随时回车换行还是需要的。怎么办?那就是用ASCII 码中的控制字符来命令电传打字机来做这件事。回车分配的ASCII 码是0x0d,换行分配的则是0x0a。

不过,当我们向显存里写入0x0d 和0x0a 时,并不起任何作用,也没有任何效果,没有任何硬件对解释它们的意义负责。不过无所谓,对回车换行代码的解释可以由我们自己负责,现在所要做的,就是在字符串中,需要回车换行的地方按照老传统插入这两个代码。

From #

toc:Literature

Content #

一地鸡毛的出处 《棋王》的文学史意义 史铁生的清醒抒情 史铁生的心态真是坦荡透明 评论叙事文体的三个特点 一个失意人和另一个失意人的拥抱 她们在乎的只是一个态度 贬低完自己就有资格去伤害别人了 她这微笑是稍微带着点狞笑的意味的 欣赏通俗作品的诀窍 多纳德·戴维评俄国文学史 难以接受故乡的改变

关山夺路 #

提起千斤,放下四两 天下事了犹未了何妨以不了了之

生命册 #

无梁的风

文学体验三十讲 #

昆德拉预言了著书癖 文明的标志是治愈的大腿骨 看那个球慢慢变小 癌症是最好的死亡方式 到了生死之际维持虚假交流会让病人生气 读琥珀眼睛的兔子会感受到叙述的层次 安静自我的四要素 毛姆喜欢使用第一人称的原因 八卦的社会意义 哈代与纳博科夫 小说的智慧则是顾左右而言他 诗人的形象就像是神箭手菲罗克忒忒斯

一地鸡毛的出处

Content #

果然,最后在郊区一个旮旯小店里买到了炭火。不过是高价的。高价能买到也不错。小林让老婆把炭火送到幼儿园。第二天,女儿就恢复了常态,高兴去幼儿园。女儿一高兴,全家情绪又都好起来。这天晚上吃饭,老婆用微波炉烤了半只鸡,又让小林喝了一瓶啤酒。啤酒喝下,小林头有些发晕,满身变大。这时小林对老婆说,其实世界上事情也很简单,只要弄明白一个道理,按道理办事,生活就像流水,一天天过下去,也满舒服。舒服世界,环球同此凉热。老婆见他喝多了,瞪了他一眼,一把将啤酒瓶给夺了过来。啤酒虽然夺了过去,但小林脑袋已经发懵,这天夜里睡得很死。半夜做了一个梦,梦见自己睡觉,上边盖着一堆鸡毛,下边铺着许多人掉下的皮屑,柔软舒服,度年如日。又梦见黑压压无边无际的人群向前涌动,又变成一队队祈雨的蚂蚁。一觉醒来,已是天亮。小林摇头回忆梦境,梦境已是一片模糊。这时老婆醒来,见他在那里发傻,便催他去买豆腐。这时小林头脑清醒过来,不再管梦,赶忙爬起来去排队买豆腐。买完豆腐上班,在办公室收到一封信,是上次来北京看病的小学老师他儿子写的,说自上次父亲在北京看了病,回来停了三个月,现已去世了;临去世前,曾嘱咐他给小林写封信,说上次到北京受到小林的招待,表示感谢。小林读了这封信,难受一天。现在老师已埋入黄土,上次老师来看病,也没能给他找个医院,到家里也没让他洗个脸。小时候自己掉到冰窟窿里,老师把棉袄都给他穿。但伤心一天,等一坐上班车,想着家里的大白菜堆到一起有些发热,等他回去拆堆散热,就把老师的事给放到一边了。死的已经死了,再想也没有用,活着的还是先考虑大白菜为好。小林又想,如果收拾完大白菜,老婆能用微波炉再给他烤点鸡,让他喝瓶啤酒,他就没有什么不满足的了。

From #

synchronized代码块的实现

Content #

synchronized 代码块是由一对儿 monitorenter/monitorexit 指令实现的, Monitor 对象是同步的基本实现单元。

在 Java 6 之前,Monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作。

现代的(Oracle)JDK 中,JVM 对此进行了大刀阔斧地改进,提供了三种不同的 Monitor 实现,也就是常说的三种不同的锁:偏斜锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能。

From #

轻量级边

Content #

无向图 G=(V,E)\(的一个切割\) 的一个切割 (S,V-S) 指的是集合V的一个划分。如果一条边 \((u,v)\in E\) 的一个端点位于集合S,另一个端点位于集合\(V-S\),则称该条边横跨切割\((S,V-S)\)。请问什么是轻量级边(light edge)?

在横跨一个切割的所有边中,权重最小的边称为劲量级边。轻量级边可能不是唯一的。

From #

task_struct中real_parent与parent这两个指针有何区别

Content #

Linux task_struct中real_parent与parent这两个指针有何区别?

These are pointers to the parent’s task structure. For a normal process, both these pointers refer to the same task_struct; they only differ for multi-thread processes, implemented using posix threads.

For such cases, real_parent refers to the parent thread task structure and parent refers the process task structure to which SIGCHLD is delivered.

From #

Softplus函数

Content #

Softplus函数的数学表达式是什么?

\begin{displaymath}\zeta(x)=\log(1+e^x)\end{displaymath}

From #

MySQL中如何安全地给小表加字段

Content #

MySQL中如何安全地给小表加字段?

由于MDL的特性,MySQL中给小表添加字段,有可能会导致整个数据库挂掉。要如何安全地给小表加字段,首先我们要解决长事务,事务不提交,就会一直占着 MDL 锁。在 MySQL 的 information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。如果你要做 DDL 变更的表刚好有长事务在执行,要考虑先暂停 DDL,或者 kill 掉这个长事务。

但考虑一下这个场景。如果你要变更的表是一个热点表,虽然数据量不大,但是上面的请求很频繁,而你不得不加个字段,你该怎么做呢?这时候 kill 可能未必管用,因为新的请求马上就来了。比较理想的机制是,在 alter table 语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到 MDL 写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后开发人员或者 DBA 再通过重试命令重复这个过程。MariaDB 已经合并了 AliSQL 的这个功能,所以这两个开源分支目前都支持 DDL NOWAIT/WAIT n 这个语法。

ALTER TABLE tbl_name NOWAIT add column … ALTER TABLE tbl_name WAIT N add column …

From #

谈话的乐趣

Content #

提问可以为客户打开道路,让他们体验到心理学家詹姆斯·彭尼贝克(James Pennebaker)所说的“谈话的乐趣”。彭尼贝克的实验是怎么做的?

彭尼贝克将一些陌生人分成小组。请想象一下,你刚刚加入了其中一个小组,并且有15分钟的时间,可以就一个自己选择的话题,与这些陌生人交谈。你可能会聊一聊你的家乡、你在哪里上大学,或者你的事业发展情况。

15分钟之后,你评定一下自己有多么喜欢这个小组。结果显示,你谈的越多,你就越喜欢这个小组。这并不令人惊讶,因为人们喜欢谈论自己。但是,我问你另一个问题:你对于这个小组了解了多少?逻辑上讲,要想了解身边的人,你需要用心倾听。你谈得越少,你对于小组的了解就应该越多。但是彭尼贝克发现了相反的结果:你谈得越多,你会认为自己越了解这个小组。通过像获取者一样交谈,主导对话,你相信自己实际上了解了周围的人,尽管他们很少发言。在《开场白》(Opening Up)中,彭尼贝克反思道:“我们大多数人都发现,表达自己的想法是一种令人惊讶、非常愉悦的学习体验。”

正是因为那些付出者有兴趣了解我们,向我们询问问题,我们才能体验到了解自己的快感。而且,通过把舞台交给我们,付出者实际上从我们这里获得了更多关于我们的信息,这可以帮助他们想出办法,向我们推销那些我们已经非常看重的东西。

From #

dirty_writeback_centisecs与dirty_expire_centisecs

Content #

Linux内核参数中与Dirty Page相关的参数中有dirty_writeback_centisecs与 dirty_expire_centisecs,这两个参数的含义是什么?

dirty_writeback_centisecs,这个参数的值是个时间值,以百分之一秒为单位,缺省值是 500,也就是 5 秒钟。它表示每 5 秒钟会唤醒内核的 flush 线程来处理 dirty pages。

dirty_expire_centisecs,这个参数的值也是一个时间值,以百分之一秒为单位,缺省值是 3000,也就是 30 秒钟。它定义了 dirty page 在内存中存放的最长时间,如果一个 dirty page 超过这里定义的时间,那么内核的 flush 线程也会把这个页面写入磁盘。

From #