一个简单的AHK脚本
#IfWinActive ahk_class Emacs
Capslock::Control
Control::Capslock
#IfWinActive
假如当前的ahk_class是Emacs,那么交换Ctrl和Caps,否则不交换。
Emacs里面的MiniMap
Sublime Text的MiniMap比较有特色,正在想是不是能为Emacs也搞一个类似的东西,没想到已经有了。(不知道MiniMap是啥的,请移步Sublime Text的网站)
http://www.emacswiki.org/emacs/MiniMap
Emacs MiniMap的tricky之处在于,它并没有实现什么新的GUI控件,而是直接新开一个buffer,把font face缩小一下,达到MiniMap的类似效果。想出这法子的哥们可真行。
不过这也意味着MiniMap在字符界面是下不可用的——不过这谁又在乎呢,毕竟Sublime Text连CUI的版本都没有。在Emacs里面用这么小的代价实现相似的功能,一方面是Emacs这货实现是强大,另外一方面是写这东西的哥们实在也挺有想法的。
不过目前看来这个MiniMap功能是有了,但是体验不算特别好。用vertical split开的window在C-x 1之后就不见了,这可是很不爽的。依我的想法来看,能不能想办法让minimap window比较特殊一点,于是自己fork了一个别人已经做了修改的版本hack了一下。目前我主要hack了三个小地方:
1. 为delete-other-windows做了advice,总是保留MiniMap window;
2. 修正了make-overlay的一个错误参数,不改的话为空文件生成的overlay是不对的;
3. 只为图形界面的Emacs创建MiniMap,毕竟用了font face,在字符界面下意义不大。
随便改了一下,感兴趣的就拿走。
https://github.com/liuw/emacs-minimap
MiniMap的实现也不算特别稳定,有时会让Emacs死掉的。但是我没有那个水平,也懒得去debug了——说实话我还是用CUI的Emacs比较多点,看这东西单纯是觉得新奇而已。废话少说了,上图。
Can’t help writing this down: is it really so hard to find a buzheteng Linux distro?
It’s SUNDAY! Time for ranting!
It may seem weired that I rant in English — anyway I’m not a native English speaker and the best rant always comes from one’s mother tongue. BUT there is no Chinese input method on this system, so I have to writing this down in English.
You can bet I’m on Linux now, yes, you’re right. I’m playing with Fedora 16 in a live USB key. The default desktop is Gnome 3 — another disaster for a long time Gnome 2 user. It seems that the Unity-like UI is getting more and more popular. Well, I can adapt myself to new UI. However, PLEASE do better design. The new UI is driving both ordinary users and developers (who use Linux as developing platform) away IMHO.
For new users / Linux noobs: Configuration ability is very weak — look at those few icons in the control panel. What’s worse, the default style of the desktop sucks — large portion of my screen is occupied by useless window frame and menu (take firefox as an example). I wish I could tweak font size to make it not so ugly, but I just can’t find a tool to do that. This will eventually lead to comments like “Linux is ugly and difficult to use”.
For developers: How can I tweak this system? I need my menu back! Those visual effects are good, but they don’t add up productivity. Grouping appications is a good move, but the big icons scattering all over the screen makes me feel bad. Searching applications? That works on the basis that your application shows up in the groups. In a word, they are not helping at all. My observation is that few of my friend (low level) developers will use either Unity or Gnome 3.
Well, some other suggestions include switching to Arch or Gentoo. But I’m not very into those two distros. My principle is “buzheteng”. I would rather focus on my job. I’m really tired of writing configurations line by line with my bare hands. I need a out-of-the-box distro.
How about switching to other desktop environment? KDE? No, I had very bad experience long time ago which effectively shadows me nowadays. LXDE and XFCE? They are just too light-weighted, I need full featured desktop.
Linux desktop is evolving, that’s good. I’m just too out-dated to catch up with its pace. I can not appreciate the new changes due to my out-dated tastes. I’m considering buying a Macbook now, seriously.
UPDATED:
To my surprise, KDE works much better than Gnome 3 for me. The UI is smoother than I expected. But (well, there is always a “but”) the concept of “activity” is driving me mad (What? I need to switch “desktop icons” activity to view my icons? Then switch back to “desktop” activity to see my applications?). Grouping applications is one thing, grouping activities is another. I don’t like the idea of switching among different activities just to separate what you’re doing, I would rather use different workspaces to achieve the same goal.
Emacs中的Rectangle
记一下Emacs里面的rectangle相关的操作。
Emacs的rectangle概念,就是你mark的起点和终点之间围起来的区域。由于rectangle没有专门的模式去select,所以在显示方面,transient-mark-mode不能只高亮这个rectangle。像在Vim里面,可以用C-v启用Visual mode blockwise,看起来会漂亮点。不过,看不看得清楚并不影响操作。
在Emacs中输入C-h a,然后输入rectangle就可以得到一些相关的函数。
比较有用的是对rectangle的delete、kill、yank操作。
然后还有replace-rectangle、string-insert-rectangle、string-rectangle。
shortcut就不写了,我是M-x党。
Oops debug小经验
常在河边走哪能不湿脚,写程序没有遇到bug那是不可能的。内核菜鸟写代码,出个kernel oops那更是家常便饭。
从我目前遇到的各种oops来看,debug首先要检验能否稳定重现bug。
若不能稳定重现(触发条件不一,Oops信息不一),那么恭喜了,基本是出现竞态了。这种问题可大可小,当然最后的问题肯定是在自己的代码里面的(前提是其他模块都是稳定的)。这个时候当然是得先把code path都走一遍,检查是不是逻辑有问题;之后就是检查各种锁了。
若能稳定重现,那么相对好办点。慢慢用printk定位到出问题的语句就可以了。objdump反汇编一下,配合oops里面的stack trace信息看看大概是哪个语句出问题了,不过个人觉得帮助不大。更加高级点的工具我基本不会用,囧。
最NB的debug工具还是printk,因为它在任何上下文都是健壮的,这是一个多么伟大的特性啊!(囧)
什么?没有stack trace?你没有开内核的debug功能?当我啥都没说吧。
高雅是装不出来的
选了这么奇怪的一个题目,我想写啥?其实也没啥,也就年末随便写点东西纪念一下快要过去的一年。
在真正开始敲键盘之前,我的脑子里面还是有很东西想写下来的;但是真正开始敲键盘,又觉得好像没什么好说的了,刚才的妙语连珠(脑子里的)突然变成了理屈词穷。再扯就远了,打住。假如我在写高考作文,还没看到这里阅卷老师大概就已经把我弊掉了。
回归主题,高雅是装不出来的。就像我,下了这么多贝多芬的交响乐打算陶冶情操,最后却还是听你爱我爱的流行歌比较多点;买了这么多管理学、心理学的书打算充实自己,最后还是看刘慈欣、王晋康的科幻小说看到不能自拔;下了这么多BBC的记录片打算练练听力,最后还是每天端着饭碗流着哈喇子到优酷上看Dota视频;收藏了不少有趣的网站,最后还是每天刷CB、人人。种种的决心、愿望,最后都是尘归尘土归土,平时该干嘛还干嘛,吃了玩,玩了睡,睡了吃,永堕轮回。
老大不小了,再想着去改变点什么,总是觉得心有余力不足。种种装逼的冲动,最后也都慢慢地消磨干净直到灰飞烟灭。还有什么意思?还有什么意思?好吧,既然装不成高雅,能不能让自己真的高雅起来。想透了,有时候就会觉得所有的外在表象都是那么的无趣,原来一个人只要思想自由,那么真的没有什么东西可以阻挡。装逼装出来的,是假高雅;看透世情,回归本心,才是真高雅。只有从内心真正开始追求一个更好的自我,外在的行动才有意义。
所以,现在我偶尔也听听贝多芬,但还是更喜欢流行乐;乱七八糟的书都看,不再把眼光放在那个小框框里;BBC在看,但是其他轻松点的视频也没有戒;有趣的网站看到了还是会收下来,但是CB和人人基本每天都得刷;每天都锻炼,不为什么好身材,只想要强健的体魄;技术方面也学了点东西,为社区做了微小的贡献,不算什么大事。说到底,我只是想有一个更好的自己,而不是想有一个“别人眼里”更好的自己。原来我最希望达到的境界,是看透世情,而不是阳春白雪。我慢慢修炼着我的俗人之雅,把看到的、听到的、做过的内化为己用,渐入波澜不惊之境,甚好甚好。
不用再盘点什么,一点小事不需要大肆宣扬。这一年,我有很多的遗憾,也有很多的理想。遗憾已成过往,不可再追;而理想是未竟之事,即使再远也还可盼。第天都在念一句话“人总是要死的”,望我有生之年,能够实现这么多或大或小中的理想中的一个,能够得到一个更好的自我。
最后奉送一句,大家都不用再装了,装逼是很辛苦的。哈哈哈哈哈哈哈哈。
吐槽一下Google Group
本来这个时候我应该在写论文,但是我还是忍不住吐槽一下:我觉得Google Group真是挺奇葩的一个产品。
好话先说在前头:Google大公无私,给大家免费做论坛,免费做邮件列表,让大家在互联网上的每一个错别字,每一句吐槽都(有可能)永世长存,真是了不得。这个精神我是很赞许的。
但是,我不爽的地方就是,Google Group是一个论坛和邮件列表结合的怪胎。我相信国内很多技术人员都是从论坛起步的,所以基本上都是把Group当成论坛用(即是在网页上回复),但是这样对于我这种把Group当成邮件列表来用的人来说就比较痛苦了。
这不是大家的问题,而是Group这个产品具有双重的定位。你说是应该使用邮件列表的标准管理还是论坛的标准管理?这是一个众口难调的问题。
要是按照邮件列表的标准管理,那么就有一些基本要求:
- 限制主题。这个自然不用多说。一些话题比较泛的Group,至少也要有对应的前缀要求(如OT)。
- 减少无意义的发言(比如说“多谢”、“顶”之类的在论坛中的习惯)。因为每一封邮件都是实实在在发到订阅者的邮箱中的,是会占用空间的。假如一个列表订阅人数众多的话,这些邮件就会占用很多空间,不够低碳。
- 注重线索化。只回复想要回复的邮件,而不是每次都在最后回复。随意回复造成邮件客户端线索是乱的,没办法看。这个问题在Gmail和Group的Web界面中不明显,但是对客户端是一个灾难。
就我看过的比较有限的几个中文技术相关Group来看,管理上还是比较“随意”的。当然这些Group的话题都是比较广泛的,要是以一些开源软件的development列表的要求去管理也不合适,我相信管理员也是很努力去管理。但是由于Group产品的先天定位,管理起来着实费力吧。
我每次看到一些邮件就觉得心里拔凉拔凉的,比如说:
- “收集了XXX资料”——用论坛模式看,有sticky操作,但是邮件是不行的。
- 带图或者其他一些不小的附件的邮件——再次强调不低碳啊。
- “谢谢”“顶”——前面解释了。
- 用html格式发出的邮件——个人爱好问题,但是就我经验来看,这种邮件基本上会把格式搞得乱七八糟。
- “XXX想邀请你聊天”等等的有意无意的SPAM。
好吧,那我用论坛模式玩不就没有问题了吗?不好意思,不是我死板,而是我实在没有精力每天都去开这么多网页慢慢找有什么更新,以及这些更新中有什么是我感兴趣的内容。邮件可以用filter分类,排除不少干扰。
Group的论坛模式降低了大家交流的门槛,还是很好的。但是鱼与熊掌不可兼得。人微言轻,我想我还是老老实实潜水吧。
一月记
其实还差个两天才够一个月呢。
这边的生活慢慢也习惯下来了,比较值得记的是12月14日那一天到King’s College的hall里面参加了公司的Christmas Party,算是一个偏正式点的英式晚宴。大部分人都是穿西装,我没有,没办法了,还好对于着装也没有强制的要求。一开始我还不习惯,觉得不大舒服。不过喝了点酒之后就开始大舌头了,说着不大通顺的英语和别人鬼扯,要是平时说话才没有那么快呢。
然后其余时间基本都在伺候netback,做了一个thread-per-vif的,做了一个NAPI的,不过都不是特别满意。不过这事也不急,因为还有更大的计划。前天找Ian聊了一回,基本上netback和netfront都要改改。其实现在Dom0做的事情太多的,所以tx和rx都是很昂贵的,个人设想是最后netback只负责dispatch就好了,其他的事情让DomU里面的netfront完成,这样来说相对公平点。工作方面基本就这样。
今天是圣诞节,我也抓紧机会体察了一下风土人情。上午专门骑车到City Center转了一圈,所有的店铺都歇业了;国内倒正好相反,商家都抓紧时间搞促销。好吧,我相信国人能把除了清明节的节日都过成购物节、狂欢节和情人节。中午到Daniel家作客,认识了新朋友(一个理论物理的韩国post-doc及其夫人,在剑桥念书的香港女孩Becky以及在剑桥工作的深圳女士,当然还有Daniel的家人)。晚上到Ian家作客,整个家庭都过来团聚了,很有爱的一家。至于吃的东西,都是传统的东西了(极好地契合了我体察风土人情的主题),火鸡、土豆、培根烤香肠,餐后点有布丁和巧克力,都还不错。总之是很不错的一天吧。其实我倒不觉得自己有多大的交朋友的能耐,只是这边的人都比较好客,呵呵。然后这一个多月来,觉得最大的收获还是英语多少有点长进,至少听native speaker闲聊的时候也可以听明白一点了。
后面的事情,当然就是开始写我的论文了,毕业最重要。
一个简单的Kernel用的内存池
经过几天的编程,netback现在已经转移到thread-per-vif的模型了,非常有限的测试表示在某些情况下新netback的性能还比旧的好的点(至少没有比原来的差)。
为了限制新模型的netback内存占用情况,需要实现一个统一的内存池。本着能简单就简单的原则,用一个free list来管理可用的entry,实现简单的get one和put one操作。以后可能还会用到,先记下。不说实现得有多好,至少是够用了。
所有的页都是通过alloc_page申请的,所以初始状态下它们的reference count应该是1。
锁的使用尽量少,put的时候没有加锁,因为写操作是原子的,真正的页面回收工作推迟到池中没有空闲页面的时候再进行。但是假如要实现get n和put n的操作,那么put的时候也必须要加锁。
#define PAGE_POOL_ORDER 10
#define PAGE_POOL_SIZE (1 << PAGE_POOL_ORDER)
#define PAGE_POOL_NR_RESERVED 0
typedef uint32_t idx_t;
#define FREE_LIST_END 0xffffffff
#define INVAL_IDX FREE_LIST_END
#define RECLAIMABLE (INVAL_IDX - 1)
struct page_pool {
struct page **pool;
idx_t *free_list;
idx_t free_head;
int free_count;
spinlock_t lock;
};
static struct page_pool *page_pool;
int get_free_entry(void)
{
unsigned long flag;
idx_t head;
int idx;
spin_lock_irqsave(&page_pool->lock, flag);
if (page_pool->free_count == 0) {
/* XXX liuw: reclaim pages */
/* free_list[idx] == RECLAIMABLE AND */
/* page->_count == 1 */
for (idx = 0; idx < PAGE_POOL_SIZE; idx++)
if (page_pool->free_list[idx] == RECLAIMABLE &&
page_count(page_pool->pool[idx]) == 1) {
/* __reclaim_free_entry(idx); */
page_pool->free_list[idx] =
page_pool->free_head;
page_pool->free_head = idx;
page_pool->free_count++;
}
if (likely(page_pool->free_count > 0))
goto found_free_page;
spin_unlock_irqrestore(&page_pool->lock, flag);
return -ENOSPC;
}
found_free_page:
idx = head = page_pool->free_head;
page_pool->free_count--;
page_pool->free_head = page_pool->free_list[head];
page_pool->free_list[head] = FREE_LIST_END;
spin_unlock_irqrestore(&page_pool->lock, flag);
return idx;
}
static inline void put_free_entry(idx_t idx)
{
page_pool->free_list[idx] = RECLAIMABLE;
}
给Linux kernel写patch有多难?
Good question!
答案是:一点也不难。随便打开一个文件,然后找出comment里面的拼写及语法错误,再然后按照使用Git发送patch提到的方法发送出去就ok了。一般都可以被ack然后进仓库的。
这是一个很严肃的事情哦,为社区做贡献。门槛也不高,值得一试。:-)
当然,前提是要会用Git以及有一本好词典,呵呵。
