神奇的isatty

前些日子才从apt-get命令系列换成更为时尚的apt系列,作为一个debian系发行版——deepin的开发者,我表示很汗颜……新的apt命令除了在功能上将apt-get、apt-cache等几个命令统一到了一个命令上外,更是有了不错的TUI,如文档所说: The `apt` command is meant to be pleasant for end users and does not need to be backward compatible like apt-get(8). 毕竟,还多了进度条呢…… 😂 不过这不是今天要说的重点,换到apt以后,把apt操作的一些结果跟管道结合一起用,经常会收到警告,例如: (ssh) hualet@hualet-PC : ~ [0] % apt search deepin | grep -i superstar WARNING: apt does not have a stable CLI interface. Use with caution in scripts. CLI的输出也算是API要保持stable么?汗颜again……dtk作为一个系统级的开发库都还没有到stable的状态、某in公司的CTO写得命令行工具,第二天接口就全变了😂……敬畏之余,困惑我的倒不是这个警告的内容,毕竟新的东西都不保证稳定么,但是apt是怎么知道它的输出被连到管道了呢? 一直没空处理,直到昨天,又一次遇到了,遂记下,晚上思来想去没什么想法,遂请教前文提到的不靠谱CTO,丫直接甩过来一句: “istty检测output啊,很多命令行程序都会根据这个做不同的反应” 我:“man istty没有结果啊“ 他:”你man page没装全吧?“ 我默默敲下sudo apt install manpages-dev,显示已经安装了…… 我:“装全了啊,我Google一下吧” 他:“肯定没装全,应该是在libbsd或者termios里的吧……“ 信誓旦旦。 我默默Google了一圈,发现那个函数其实叫isatty,在unistd.h里面定义 我:“你是不是记错了,有isatty,unistd.h里面的……” Read On →

输入法消失之谜

最近不少用户在deepin论坛上报告说搜狗输入法的图标不见了,收到反馈我就心想坏了,我的输入法图标很早前就消失不见了,之前发现这个问题但是没有去跟踪是因为没有看到其他同事出现类似情况,我的电脑平常为了调试用户反馈的bug又经常XJB装软件,觉得是个例。现在收到多人反馈,大概又是什么“更新事故”? 带着沉重的心情,首先要确定的是这个问题影响的范围: 15.4.1的ISO是不存在这个问题的; 不用输入法的老外是没有受到影响的; 只有少量论坛用户报告了这个问题,大部分人表示更新到最新也没有这个问题; 还好影响范围还比较小,那么下一步就是找解决办法了: 想办法绕过?对于这个问题来说好像不太好使; debug找到问题的根本原因; (注:其实用户反馈是集中在这两周的时间甚至更短,如果是其他人的话可能会去排查最近更新了什么包,但是我刚好很早以前遇到了这个问题,受其干扰,所以走了一条冤枉路……) 下面进入本文主题,怎么去debug?以前压根儿没有调过输入法的问题啊,遂去请教公司大神,大神表示:”我也不知道啊 (无奈脸 ”~ 那么我们只能瞎猜了: 第一步:卸载掉搜狗,排除是否是搜狗输入法(问题多多,值得怀疑)导致的。 结果显示卸载掉搜狗输入法以后,小企鹅的图标可以正常显示,看来果然是搜狗输入法导致的? 第二步:下载官方搜狗搜狗输入法,重新安装,排除搜狗输入法版本的问题。 重新安装后没卵用。但是突然想起来搜狗在家目录下的.config/sogou-qimpanel/skin 里面有皮肤缓存,据Google说是皮肤有可能导致输入法图标不见的问题……我们在做2D极速版适配的时候,玩了点黑魔法,替换了一些资源文件,可能是改坏了什么东西? 第三步:删除皮肤缓存,排除修改皮肤的问题。 没卵用…… 陷入僵局,但是发现如果将sogou-qimpanel这个进程杀掉,输入法的图标就会显示出来了……那么估计是这个进程负责读取sogou的皮肤文件然后更改输入法图标,中间可能出现了什么岔子? 第四步:使用strace跟踪sogou-qimpanel,感觉胜利在望。 $ killall sogou-qimpanel && strace -e open sogou-qimpanel 打印着打印着,吭哧,sogou-qimpanel尼玛居然退出了……什么鬼,再次尝试,还是退出了。看来是daemonize了?那么strace attach到子进程呢?貌似关键的信息已经丢了……陷入僵局…… 如何在系统级别追踪呢??? 第五步: 看来要祭出大杀器systemtap了,随手写(抄)了一个stp: probe syscall.open.return { printf("%s %s", filename, execname()) } 运行失败…… WARNING: never-assigned local variable 'filename' (similar: name, __nr, retstr): identifier 'filename' at sogou_qimpanel_open.stp:2:20 source: printf("%s, %s", filename, execname()) 请教公司另外一大神,大神表示“你装一下kernel的debug包就行了……” 结果,还是不行……坑…… Read On →

2016年终总结

自从开始上班,每年年终总结都少不了,因为都是给老板看的,内容无非是今年我做了什么事情、多牛逼、对公司贡献多大云云,万一老板看到一件他不记得但是你写下来的工作贡献一高兴,说不定给你升职加薪,一年也就不算白干了。但是,写给自己的年终总结哪能这么应付,梳理整理自己一年的得失,做好权衡,最重要的是吸取经验做来年的规划。 2016关键词:累、读书和成长 2016年是挺累的一年,不知道是不是整个前半年和2015年的后半年都在加班的缘故还是什么,即便是后半年没怎么加班的时候,也没感觉怎么轻松。其间必然有些成绩,但也带来了很多严重的问题,例如我长期状态不佳、思维不清楚等,总是感觉有点得不偿失。最后的两个来月,我都在认真思考这些现象产生的原因,总结下来问题可能出在两个地方: 一、工作方式不佳,最主要的问题是贪多和多任务并行; 从年初接下来整个社区版的发布和维护工作以后,整个人进入了一种所有事情都想帮着处理的状态,写代码、管理、调试问题、支持售前、支持工程、社区反馈等等,一天到晚地干,似乎没有什么尽头;以至后面养成了多任务并行的坏习惯,做什么事情都集中不了精神,长此以往,不要说提高工作效率了,整个人都快废了。 二、生活方式不佳,最主要的问题是不够自律; 深度一天的工作时间如果不算加班其实到不了8小时,但是这个不到8个小时中我几乎有7.5个小时都在写代码(大部分工作日,有些需要讨论产品需求、开会等略去),中间几乎没有任何break,这几乎回到了14年中的工作生活状态——我几乎丧失了良好的口头交流的能力;这样的一天下来,晚上能干嘛呢?吃饭、游戏和睡觉呗……但是,问题是有些时候还要加班,加班完了回到住的地方连玩儿会儿电脑都不能就睡觉也太“亏”了吧?于是控制不住自己的玩儿过了睡觉时间,长期睡眠不够,这也直接导致了我思维变得特别慢。 确定了问题根源,肯定要治病根儿啊,针对工作方式的问题,我开始强制自己使用番茄钟,并尽量将自己的任务分摊开来;针对生活方式的问题,除了尝试早睡早起外,我也开始尝试跟别人闲聊(主要在微信上),让自己的大脑变得活跃;顺便逼迫自己抽出时间来读书,读书这件事情既能涨知识,还能磨练耐性、让自己的注意力集中起来。 说起读书,16年后半年读的一本非常火的书《软技能——代码之外的生存技能》,它之所以火,我想主要是因为它似乎给程序员打开了一扇门,这些平常只会钻研技术、敲代码的人突然发现,卧槽原来这不是生活啊!一直觉得程序员们是一群很神奇的物种,他们自认为是世界的主宰,但是真相是他们简直是生活不能自理……同时,这群脑子很聪明的人,比其他人更容易接受改变和思想上的冲击。至少这本书让我开始反思自己对待生活的态度、对待薪资的态度、对待投资理财以及社交的态度;书与其说始给程序员写的,到不如说始给所有人写的人生规划课程:学习新技能、找到新工作、营销自己、自由职业、理财和投资等等,我觉得工作的人都应该看一下。 另一本值得一提的书《梁启超教子家书》,这本书我觉得我要么评0分,要么评100分,它好是好在书里面梁启超的家书原文,至于作者整理的一些结论,个人觉得没什么可以吸收的东西。从那么多的家书中,除了可以窥探一番我比较神往的民国生活,从中理解出来的梁启超让我对这个历史人物有了翻天覆地般的认知改变。梁的爱子、博学、社交和投资,这跟前面的《软技能——代码之外的生存技能》这本书似乎遥相呼应,就是在告诉我,你需要改变了! 当作故事读的书例如《红顶商人胡雪岩》和《老残游记》等,其实给我的启发也是蛮大的,胡雪岩的冷静、睿智和大方,老残的淡泊、生活观和使命感(包括作者刘鹗的经历),都让我在生活中处理一些事情的时候有了些个参考;带着功力目的去读的《旅行与读书》、《逻辑思维——成大事者不纠结》等,也能按照预期给我涨涨见识;不期而遇的《解忧杂货铺》,读起来酣畅淋漓,故事也够精彩;2016年(后半年),在微信读书上花费时间116个小时,完整读完的有8本书,还有些零散着读一些丢一些的,这一年也算是个好的收场了。 说起成长,首当其冲的就是经历了一次分手和复合,其中酸甜苦辣,旁人绝不能理解,对我也是一次比较大的考验,让我对待生活、对待另一半有了跟之前完全不一样的转变,我很庆幸这些事的发生在25岁,而不是更晚;2016年我也开始感受到了生活的压力、结婚买房的压力,这些压力促使我去做一些改变,去践行我在书中、在生活中学到的一些生活方式,去担负起责任;这一年通过工作,我更加了解自己的成熟范围和做事风格,我愈加能够掌握做事的分寸。 2016,这是非常精彩的一年。 2017目标关键词:高效、读书、旅行 高效分两个,一个是专注于一两件关键的事情,做好;一个是调整自己的工作状态;读书不消说,这是个会上瘾的东西,好书推荐好书,好书推荐好人,好人又推荐好书,无穷尽也;旅行业分两块儿说,一是出去走走,二是组织一些线下聚会;做到这些2017年也将是非常精彩的一年! 另外,2017年准备把份子钱都收回来,哈哈哈!

12月10日回洛阳记

2016年12月10日,我们宿舍老五结婚的答谢宴,刚好又在我们大学所在的城市洛阳举行,哥们儿几个商量着都回去一趟,互相见见自己几位久未蒙面的兄弟,到场的有深圳来的老大、洛阳本地的老三、新乡来的老四、东道主老五、上海来的老六、北京来的老七和武汉来的我。能够成行着实不易,简单记录一下,留作纪念。 9号晚上从武汉出发,卧铺10号早上到的洛阳。下车发了一个朋友圈: “毕业后就没有来过的城市 洛阳,你有点冷啊😢” 相比江城武汉,洛阳显得要冷得多,去的时候觉得“绝对没问题”的羽绒服已经显得不太够用了。火车站旁边的公交车站,虽然大早上已经开始忙碌起来,但还是那么井然有序;又冷又困,我给五哥打了个电话,问清楚酒店地点,上了熟悉而又陌生的68路。 时间过得总是飞快,上面一幕幕清晰的画面,在现在我码字的时刻,已经是两三天前的场景。这次回洛阳,除了兄弟们一块儿给老五庆祝了婚礼,一块儿吃吃喝喝,还顺带逛了我们的新、老校区,觥筹交错的瞬间,总是感觉回忆满满: 想起了新生报道,先来的瓜分五个下铺;想起了新生拍照,霸气的女生周培一怒之下甩了照相老师一脸;想起了第一次在大学过自己的生日,整个宿舍一块儿出去吃饭,喝了四年最多的一次啤酒(12箱?);想起了用别人的mp4,每天窝在宿舍,一年看了比前18年看得电影总数还多的电影;想起了因为被班长逼着去参加脑残活动,甩了班长一脸;想起了跟宿舍人一块儿打篮球,80后vs90后,打中锋,单手抓篮球;想起了09年大雪,排长队走雪中的一条小径去食堂吃饭,重庆来的老八因为没见过下大雪,翘课出去看雪;想起了唯一一次看世界杯,跟着球迷舍友在4号教学楼一块儿嘶吼;想起了第一次参加文艺晚会比赛,唱王力宏的《龙的传人》;想起了用老九的手机,看电视直播《武林风》;想起了从老大哪里看到的《藏地密码》,他没有看,反而一口气被我看完;想起了一个夏天晚上跟着看了《午夜凶铃》,一个星期没有睡好觉;想起了那个夏天睡宿舍楼顶,早上的大太阳晒的皮肤瘙痒…… 想起了联盟公寓,我买了不到一周的自行车丢了;想起了联盟食堂的面条;想起了洛阳公交车,能随时为了老弱病残停车;想起了人生中第一次去电影院看电影《加勒比海盗4》,也是我看的第一部3D电影;想起了小崔来洛阳找我,跟做梦一样;想起了跟舍友一块儿去做兼职,促销九阳豆浆机,一连站了七天;想起了有虫子的宿舍,宿舍的人不得不三番两次把床板拿到下面用热水烫;想起了我独自上自习,陪过看了所有计算机专业课本的自习室;想起了同样的自习室,小崔因为放了个响屁,非要让我去领她;想起了差点挂掉的机械设计和机械原理,那课压根儿没人愿意上;想起了偶然发现的一个评四大名著的选修课,晚上冒雨也要去听;想起了龙潭峡、天池山,那些洛阳周边的风景区和无忧无虑的大二时光;想起了大家一起看《那些年我们一起追的女孩》,一起听《让青春继续》…… 那天晚上一直玩儿到2点,在KTV唱歌从流行歌曲一直唱到《猴哥》、《葫芦娃》……回酒店又聊天到四点,好像恨不得以后的话就在那天晚上能说完;但是该来的还是回来,老七要去郑州买房子、老大要赶飞机,天下没有不散的筵席,喝碗牛肉汤,各自上路。

楼兰餐厅

这个星期有点浪过头了,周六出去打了羽毛球,周日又出去觅食,文章呢?代码呢?sigh……不过周日的觅食还颇为成功,倒是可以叙叙,补补文章的缺。 楼兰餐厅,一个以新疆地域美食为主题的餐厅,是一个大口吃肉大口吃馕的地方,第一次听说还是上周偶然看到表姐的朋友圈,配图中的烤羊排看着烤得焦黄,卖相相当好,仅这一点便深深地吸引了我,遂决定这周即使浪过头也要去尝一尝。中午十二点到世界城五楼,果然要排长队等候,越加坚定了我这个餐厅不错的信念。 半小时后,终于可以进店享用美食,我俩食量不大,所以只点了四份菜(好像也不完全叫菜,不好称呼), 因为是第一次来,所以菜都是根据感觉来点的,但是我感觉确实刚好凑出了一个比较好的搭配: 第一个上来的是酸奶哈密瓜: 可能是因为用餐环境比较热或者其他的缘故,酸爽的酸奶搭配香甜的哈密瓜,让人的味觉神经突然就活跃起来,人也精神多了;喝了两口小崔急忙制止:“烤羊排肥,吃了肉再喝酸奶,就不会觉得腻”。果然美食家呀,我心悦诚服,放下勺子。 很快,便等到今天的主角大漠烤羊排: 名字听了只让人联想到楼兰古国覆灭后的一片大漠,自古多少英雄战死的地方,想着略悲情,只能吃口烤羊排排解。话说这羊排真不错,外焦里嫩,不管是配酱汁还是佐料,都能让人食欲大开(跟着小崔吃了不少韩国烤肉,完全是两种风格)。吃了两块,大呼过瘾但是也略觉肥腻,这时候吃两口酸奶……写得我现在口水直流…… 楼兰肉囊和牛肉汤揪面差不多是同时上的: 可能是本能上觉得饼和汤搭配吧,就像羊肉泡馍的汤和饼搭配一样,我们点这两样的时候相当默契。事实证明,小崔非常具有美食家的风范,饼是牛肉馅的,配有洋葱,虽然一点都不腻,但是搭配酸爽的牛肉汤,有更上一层楼的美感,肉馕和汤在嘴里相遇的那一刻,真有一种一辈子就这样罢的感觉。实话说,汤的配图有点失败,其实里面有面片一样的面和牛肉片,配有各种蔬菜丁,如果单卖的话我估计可以喝两碗 。 中间小崔也是乐的不得了,原来除了韩国烤肉,还有这么好吃的东西叻,我就顺势盗了她的一张“全餐图”: 食毕,买单走人!

Things about kernel updates on deepin

There were discussions about kernel updates on both deepin forum and deepin telegram group. Users are curious about why security updates are always being lag on deepin, and why there’s no newer version kernel for so long. I explained it in telegram group, here I’ll do it again in case someone’s interested: As we all know, deepin’s maintaining kernel by ourselves now, based on version 4.4 LTS, our kernel gets patches by our kernel team, from Debian and also from Ubuntu (Yes, we do! Read On →

工作效率杀手-多任务并行

日常工作中,我们经常会遇到手头有多项工作,而deadline在即的情况,这时候我们不得不变成三头六臂,多项工作同时进行:先找A商定一下协作前各自需要先完成的工作,再找B确定一下xxx,当要C工作进展到一半的时候,突然发现D工作更紧急一点,正要切换到D工作上,一个同事慢慢向你走过来,“忘记昨天我们说好今天开会的么”…… 还好,如果最后你能撑过这段时间,你可能会赢得“高效能人士”的称号,你可能会被公司领导当众表扬,你也可能从此走上人生巅峰……但是请相信我,这些都是假象,当你在这种假象中高兴过几次以后,你突然发现自己效率急剧降低,精力集中不起来,脑子越来越不好使,浑浑噩噩,最后一发不可收拾。 为什么多任务并行最后会导致这么严重的后果呢?我认真思考了一下,感觉主要问题还是我们普通人的精力有限,压根儿承受不了两个以上任务同时进行。计算机专业有一个术语叫做“系统颠簸”,它通俗来讲是这样子的: 就是当系统内存不够,而又有多个程序同时运行的时候,不活跃的程序会被放置到内存之外,当它再次变成活跃程序的时候,再将它换回到内存中,将另外的程序换出,当系统持续处于这种情况时,整个系统处于机器不稳定、不流畅的状态,就叫系统颠簸; 而我们人类也有系统颠簸的情况,就像上面我说的。 自从我从一名普通的程序员变成管项目的程序员之后,多任务并行在我身上上演了无数次:同时担任项目经理、技术主管、程序员、四分之一个产品经理和十分之一个客服这几个角色;最开始还忙得乐此不疲,但是中国的一句老话说得好,“出来混迟早要还的”……一年多下来,我从一个精神饱满的小青年,眼睁睁就变成了现在目光呆滞、思维缓慢、精力极度不集中的小青年,饱受痛苦。 所以,我也一直在思考着如果才能从根本上杜绝这种多任务并行(被同事打扰也算)的发生,但是也请不要理解错误,并不是什么所有的任务都不能同时进行,比如《这样工作最高效》里面就介绍说,检查邮件和开会、编译代码和阅读文章 这样的例子是适合多任务并行的,只要不会让同事感到尴尬就行。那么如何很好地保护自己的工作效率不要被多任务并行给“杀”掉呢? 我想到的大概有两种方式: 把时间分成小段 这种方式比较类似于番茄工作法,比如我们把一天的工作定为10个番茄中,每个番茄钟半小时,这半个小时中我们集中精力在一件事情上面,专注于这件工作直至它完成,每两个番茄钟之前有15分钟的休息时间,这段时间可以用来休息,也可以用来解决同事临时过来需要处理的紧急事情。这样一天下来,我们只要保证每个番茄钟内是非常高效的,这一天就能保证是高效。 把时间分成大段 这种方式更简单,直接把上午定义为“杂碎期”,下午定义为“专注期”,“杂碎期”用于处理各种计划安排、闲聊、和同事沟通、开会等;“专注期”则专注于自己需要独立完成的工作,这段时间内不要受到任务打扰,保证工作的高效。 总而言之,要让我们的大脑保持专注,而不是在不同的任务间切来切去;跟同事沟通好自己的时间安排,避免过多被打扰;做一个高效率的人。 差点忘了说,我目前正在践行第二种方式,目前感觉良好,希望也能帮到跟我有同样问题的人。