塔希里亚三出来了。
__
淼大以出手要快为题在他的博客上宣布 了塔希里亚三的到来。
吴淼大人是我最喜欢的漫画家,很真实的养猫人。以前就在blog上推荐过他的一个画。
推荐一下。
Emacs的orgmode [tags]
tags
标签(tags)在管理东西方面有很多应用。比如blog,flickr,前阵子还在小众软件上看到用标签管理文件的软件。
本身,我们在做org管理文件的时候就已经把不同的东西放在不同文件里了。比如我们建了home.org,work.org两个文件,把在家的工作做在home.org里,把公司的放在work.org里面。
但这种用文件来分类的方法有不便的地方:其一,如果我想到一个新的分类,那就必须新建一个文件;其二,如果我有一个工作同时属于两个文件,怎么办?
于是,tags来了。
tags只做一件事:标记这个项目是什么?它的展示样式是这样的
TODO 跟特留尼西特握手 :苦差:薪水:逃不掉:
你可以按C-c C-c组合键,这里在mini buffer(就是下面的小框)会出现”Tags:”,等待你输入标签,支持中英文。
就是这么简单。
tags的继承
如前所述,本来我们的想法是用文件来进行不同的分类的,也就是说实际上文件就是一种分类,放在work.org中的项目本来就应该拥有work属性,我不想在每一个项目上添一个:work:的蛇足。
这就得说到tags继承的org特性了。

如图,叶项目“新门”本身有一个属性”苦差”,同时它继续了两个属性,一个来自它的父项目apartment,还有一个来自文件属件work。给一个文件设置属性,需要在文件头加上一行。
更简单的方法
如果有一些常用的标签不想每次都敲。可以使用orgmode的标签快捷键功能.比如你可以用k来代表苦差,用s来代表薪水。跟很多org设置一样,可以在两个地方完成这些设置。
一个是.emacs文件。它的语法是这样的。
(setq org-tag-alist '(("苦差" . ?k)
("薪水" . ?s)))
还有一种做法是在文件的头部加声明。类似这样:
#+FILETAGS: :work:
它们的分别在于,前者对于本机所有的org文件都有效。后者刚只对当前文件有效。
这时再给一个项目加标签就会变成这样

敲相应的快捷键就可以了。
搜索查看tags
使用tags来给项目打标签当然不是为了打打好看而已。我们是要用的。最常用的用法就是用tags来表示context的概念。
江湖传言把事情分类来做能提高工作效率。即是说,如果你有十个电话要打,十个email要回。最好不要打一个电话回一封email再打一个电话再回一封email,比较好的做法是先打十个电话,然后再连回十个email。还有一个秘笈,是威尔史密斯在<当幸福来敲门>里面教给我们的,如果你不把话筒放下来,能节约很多打电话的时间。
这就需要我们能够把十个电话项目都取出来,在文件里面一个一个找:phone:标签?别傻了。敲一个C-c a吧,然后再敲m,下方的mini buffer里出现了几个大字”MATCH:”,这里输入”phone”,回车。你的列表中所有文件里的带有phone标签或者属性的项目就都列出来了。不想要所有项目,只想看TODO?简单,C-c a后不要加m,加个M吧。
输入关键词的时候还可以使用与或非运算,算符如下:phone&work,同时有两个标签的。phone|work,有两个标签之一的。phone-work有phone标签而没有work标签的。
这里,C-c a表示你要求调出agenda view,后面那个命令则指明你想要调出什么样的view。敲后C-c a之后,不要急着敲m,可以看看org都提供了哪些view,我们熟知的有C-c a a,C-c a t等。
不要每次都输关键字
这样看起来,C-a a a也是一种检索,只不过它们是org-mode内置而已,那我也有一些数据视图是经常要用的,有一些是没事就搜一下的。我也要敲三个键就弄出来,不想每次都敲tags。
嘿嘿,改源码把我自己的搜索置进去。倒是不用着急,读代码总是麻烦的。事实上org-mode已经开放了一个自定义view的接口。唤作org-agenda-custom-commands。可以在.emacs文件中设置自己的。
(setq org-agenda-custom-commands
'(("k" "work haha"
((agenda "")
(tags-todo "work")
(tags-todo "支持")))))
这段代码表示您定了一个可以用C-c a k 调出来的view,它的描述是”work haha”,view中包含三段数据。最上面是agenda,就是调C-c a a出来的界面,然后一个分隔行,列出tags为“work”的项目,再一个分隔行,列出tags为支持的项目。

官方的说法是提供了一个GUI界面,M-x customize-variable RET org-agenda-custom-commands可以打开。界面如下:
![]()
但我个人还是喜欢使用.emacs文件手写配置。不是我装13,而是GUI界面设计得实在太难用了,我到现在也没弄明白它的用法。
[ZT]百度孙云丰说,Google市侩,我感到恶心
今天下午1时20分,百度首席产品设计师孙云丰在自己的博客中撰文关于谷歌退出中国,直指Google退出中国的姿态证明自己是市侩分子,对此感到恶心。
他的博客全文如下:
google宣称要退出中国,所证明的,恰恰不是市面上的那些g粉所宣称的那样,google是个人权斗士,而刚好反了过来,正好证明google是个市侩分子。
google 的首席法律顾问的调调让我感到恶心。因经济利益退出,就直白白的说好了,把自己涂脂抹粉一番,还煞有介事的提到google被中国人攻击,中国异议分子的 Gmail信箱被攻击,把这些事情作为退出中国的铺垫,这种论调是侮辱中国普通老百姓的智商,但还真有可能迎合那帮目空一切,但从未到过中国、对中国没有丝毫了解,却又喜欢对中国说三道四的西方人的假想。
只提一个假设,如果谷歌占据了中国80%的搜索市场份额,google的高管,还会这么高调的宣称要do no evil,从中国退出吗?
整个事情给我的唯一感受,就是恶心。
————–
以上是作为一个曾经的忠实google用户而说的,和百度无关。市面上沾沾自喜于了解一点google的产品技术细节将google奉为道德楷模而自封G粉的兄弟,请勿跟帖瞎喷,你们根本不懂什么叫搜索引擎,什么叫自由人权。
立此存照的原因在于,原帖 http://news.csdn.net/a/20100113/216459.html 被百度的人要求删掉,所以本着对历史负责的态度,保存与此,欢迎转帖。
emacs代码补完-yasnippet
Email:hamainter(AT)gmail.com
yasnippet是emacs的一款代码补完插件,类似于一个代码模版。基本用法就是“TAB”,输入关键字之后按TAB键,YASnippet根据预先设定的模版来展开代码。很好玩。
YASnippte有两种安装方法,一种是视频中使用的单el文件yasnippet-bundle.el,配置也简单一点,只要在你的.emacs文件中添加以下代码就可以了。
(add-to-list 'load-path
"~/.emacs.d/plugins")
(require 'yasnippet-bundle)
还有一种涉及多个文件,一个是yasnippet.el,还有一个存放模版文件的文件夹,里面按照不同的mode存放模版。相应的,你的配置文件中需要配置el文件的位置和模版文件夹所在的位置。
(add-to-list 'load-path
"~/.emacs.d/plugins/yasnippet-x.y.z")
(require 'yasnippet) ;; not yasnippet-bundle
(yas/initialize)
(yas/load-directory "~/.emacs.d/plugins/yasnippet-x.y.z/snippets")
二者使用起来是一样的。不过很明显的区别在于,单文件模式是指模版也完全整合到yasnippet-bundle.el文件中了,修改起来很麻烦。
而修改模版在我看来是必须的。因为原始的mode模本一般不太可能符合所有人的需要,至少我现在手上的版本来看,质量只能算是一般而已,令人不爽的,需要修改的地方还是很多的。另外,emacs的乐趣不就是完全可定制么?一个调教之前的emacs基本上并不比gedit高明多个,以上是个人意见。
所以我个人推荐多文件的安装方法。安装配置之后进入emacs,看到界面基本上是这样的。

而文件结构基本上是这样
sgml-mode/ |-- body |-- br |-- code |-- code.class |-- div |-- div.class |-- div.id |-- div.id-class |-- dov |-- form |-- head |-- header | |-- h1 | |-- h2 | |-- h3 | |-- h4 | |-- h5 | `-- h6
它与snippet文件夹里的文件成一一对应关系。也就是说,你需要修改哪个模版,只需要在snippet文件夹中找到相应的文件对它进行修改就可以了。
class ${1:ClassName}(${2:object}):
"""$3
"""
def __init__(self,${4:para}):
$0
以上是python中class的模版,不是原始的,我去掉了init中比较复杂的部分。定义了yasnippet这样的行为:
在emacs的python-mode中,你输入了”class”,然后按一下TAB,编辑器将自动给你填出如下代码段。
class ClassName(object):
"""
"""
def __init__(self,para):
并且光标停留在”ClassName”上,因为模版中$1位于这里。你可以对它进行修改。这里提一个模版的简单语法,模版中以$n定义光标定位的位置,从1开始,展开后光标就定位在$1,然后按TAB键在不同的位置间移动,碰到$0时退出模版,开始输入自定义项。
这里有一个限制,就是修改时必须把$1-$n-$0的整个流程走完一遍你才可以写自己想写的东西。所以在$4那里就出了一件我很不爽的事,self后面的逗号,我的__init__是无参的,我可以把para删掉,但是我删不掉逗号,原因是流程还没走完,你不可做流程以外的事情。我必须TAB到$0然后再把光标移上去删除一个逗号。
于是我找到文件所在的地方,修改了__init__的模版,把逗号放到$4当中去,这样我跳过它的时候,逗号也一并消失了。
Just for fun.
装一个不?它们的项目首页是:yasnippet
[8g]被误解的匈牙利命名法
程序员都认识匈牙利命名法。
程序员被教导说匈牙利命名法过时了。它的起源地微软都明确表示不建议使用匈牙利命名法。
因为这种命名方法是多余的,只会把事情搞复杂,而没有什么好处。常见的例子是这样的:
for(ni = 0 ; ni <10 ;ni++)
{}
这里面有个变量i,根据匈牙利命名法,需要在前面加一个前缀n,表示这个变量是整型。如果它是长整型,那么变量名可能是li。
它的问题在这里,首先这增加了程度员的敲键次数,程序员们不喜欢,程序猿也不会喜欢。其次,付出了多敲键的代价之后,程员发现自己并没有获得什么好处。把i变成ni有什么意义呢?脱了马甲我就不认得你是个整型了怎地?就算我不认得了,IDE也认得侬啊。
所以这种做法被作为一种蛇足在岁月中不断遭受程序员们的白眼,之后被“不推荐”了。
然而,这是一枚冤案,匈牙利命名法比杨乃武还冤哪,你们程序员纯粹是拉不出便便来还怪地球没有吸引力。本身它就不是这么用的。
原始的匈牙利命名法,现在被称为匈牙利应用命名法,由1972年至1981年在施乐帕洛阿尔托研究中心工作的程序员查尔斯·西蒙尼发明。此人后来成了微软的总设计师。这种命名法其实是对于西蒙尼祖籍的一种讽刺。匈牙利人名和大多数其他欧洲人名相比是反过来的,即姓氏在名字的前面。举个例子,英语化的名字"Charles Simonyi"在匈牙利语中原本是"Simonyi Károly"。同样的,在匈牙利命名法中,类型名在实际变量名前,而不是像大多数欧洲的Smalltalk那样,类型放在变量名后,例如aPoint和lastPoint。后者在西蒙尼任职于施乐帕洛阿尔托研究中心时期非常流行。这种命名法可能也是受到了一种叫做波兰式的不相关的概念的启发。
匈牙利命名法这个叫法被许多人记住是因为难发音的辅音字串有点像一些东欧语言中辅音丰富的拼写方式,尽管实际上匈牙利语是属于 芬兰-乌戈尔语族,而不像斯拉夫语族那样元音丰富。举例来说,零结束字符串的前缀"sz"实际上就是匈牙利字母表中的一个合体字母(参看德语中的ß)
如上所述,原始的匈牙利命名法现在被称匈牙利应用命名法。而一般咸认的匈牙利命名法,就是上文举过例子的,臭名昭著的,其实是匈牙利系统命名法。它是后起的,派生出来的,却盖过了原始方法的光芒,引来臭名后,却盖在匈牙利命名法身上。有点像假药厂的弄倒了真药厂的。
二者的区别在于前缀的目的。
匈牙利系统命名法的前缀是为了说明变量的系统属性,比如类型。
String strName; //str表示这个变量是字符串
匈牙利应用命名法的前缀是为了说明变量的应用属性或业务属性。
String dogName,manName; //dog表示这个string是狗的名字。
系统命名法在从某种程度上来说是冗余的。
应用命名法却能够使代码的错误更容易被发现。
我们假设有一个生死薄系统,记载世上生物的轮回问题。它将每一个生物保持为一个对象的实例,里面有一个数据字段为name。
现在我们要把进行转世操作的一部分,以下是系统命名法的示例。
strName = dog.name //some op man.name = strName
上列代码要把人名赋值给狗,我们假设这在系统中是不允许的,会导致错误。但它在编译上却没有问题,如果说你把一个string赋值给一个string会导致编译错误的话,我们只能认为编译器今天心情不太好。
诚然,如果你是个认真的程序员,你好好查看整个过程的代码,可以看出这个strName到底是人名还是狗名,这里应不应该直接进行赋值操作。但是懒惰的程序员可能会想,能不能不去看那堆意大利面,直接从一行代码中看出不妥。
于是,匈牙利应用命名法出场了,它将代码改成这样
dogName = dog.name; //some op man.name = dogName;
“嘿,朋友,我不想要一个狗名字。”事情就会变成这样。
当然,编译器依然心情很好,不会给你报出什么错误来。但是你还有xlint,你可以设定一种规则不允许不同名字之间乱伦式的互赋值。
你应该把代码改成这样。
dogName = dog.name; manName = manFormDog(dogName); man.name = manName;
世界就和谐了,这只狗开开心心(可能也不是太开心,做人并不比做狗好。)转世为人。
现实的例子
一个留言本程序
留言本的主要工作就是把用户的输入显示出来,它任劳任怨地工作,如实地显示客户的留言。却有可能被别有用心的龌龊人士利用,比如输入特定的脚本,让服务器做一个特定的事。
这就意味着你在后面编程时必须时刻紧记一个原则:用户的输入是不安全的,永远不要把它们原样输出。
“但是这很累,”你说,“用户的留言在后台还要过不少地方,我还要考虑正常的业务流程,不想时刻绷着这么一条筋。”
于是应用命名法从天而降,像“威猛先生来了!”,你可以把用户的输入保存在一个String中,变量名用us前缀,代表“unsafe”,它可以在后台游弋,游来游去可能还都是us,只有经过特定的某几个方法才能变成"s"(safe)。
这样,你就不会要时盯着某个变量,看它到底安不安全。当你需要将它输出的时候,不用管它之前到底被怎么处理过,如果看到它的前缀是"s",“嗯,祝旅程愉快。”如果是"us",“啊,对不起,请打开包来检查一下。”
(八卦来源是新书软件随想录)
Emacs的orgmode [归档]
如果你用org-mode来做TODO管理,那么无法避免的是,随着时间的流逝,被DONE的事件会越来越多,那么TODO被会被夹杂在DONE之间,难以查找。同时,由于后期回顾的需要,你也不想简单地将DONE事件删除掉。这个时候,你就需要归档命令了。归档,就是把你不想天天看到的东西,放到你看不到了,或者不怎么影响你的注意力的地方去。org-mode提供了两种归档方式。
内部归档
内部归档是在本文件内部给特定子树打上ACHIVED标签或者移动到名为achived的子树中去并打上标签。
这个被认为是ACIVED的子树,会被移动了本级子树的最末端。
例如有这么一个子树,由三个TODO项目组成。
* blog ** TODO 匈牙利命名法 ** TODO org-mode 归档 ** TODO BillG审查
C-c C-x a
将某一个节点打上ARCHIVE标签。
* blog ** TODO 匈牙利命名法 ** TODO org-mode 归档 :ARCHIVE: ** TODO BillG审查
C-c C-x A
将当前节点归入一个名为Archive的子树中,并且这个子树是位于当前级别子树的最下方。
* blog
** TODO org-mode 归档 :ARCHIVE:
** TODO BillG审查
** Archive :ARCHIVE:
*** TODO 匈牙利命名法
:PROPERTIES:
:ARCHIVE_TIME: 2010-01-02 六 18:14
:END:
外部归档
外部归档是指把子树移动到另一个org文件中去。文件名可以自定义。默认情况下,归档的子树会被移动到名为“当年文件名_archived”的文件中去。
C-c C-x C-s是把当前的节点移到archived文件中去。
我个人还是更喜欢在文件内部做归档。因为它兼具归档的好处和查找的方便。
在任何一个树的子树中,只有一个archive子树,只占文档的一行,当你居然查看以前存档的事件时,只能在这个节点上使用”C-TAB”命令即可打开。
China2009
2009年
2008年的最后一天,晚上。我坐在西安七贤青旅的小咖啡馆里面。对面小桌上的洋人们在弹吉他,小声唱歌,我用skype和一群朋友聊天。元旦对我来说也许是个地标,却并不是什么大不了的节日。近十二点,洋人们出去放烟花,十二点整,进来互道happy new year。于是一年开始了。今天我在上班。
09年初的时候,我列了一张check list,写09年想做的事。今天回去看那张单子,只有马拉松是切实地去跑了的。六块腹肌无从谈起,新疆喀纳斯便是形势所迫终于去不了。想学想精通的东西几乎还是半吊子,只是思想颓得厉害,对互联网这种东西开始提不起劲儿来。
这一年读清了很多名字,却没有因此看到希望。
这一年失去了很多,计有facebook,twitter,picasa等,还有CN域名。可预见将会去的更多,理论上将失去整个互联网,建立大中华局域网。在阮一峰的博客上看到他想尝试一下网络创业,心有戚戚。
2009年接触了很多阴暗的东西,唯一闪光的是有一个姑娘始终陪伴着我。
希望就要到来的2010年,会好一些,开心一些。
也希望这个域名,能够多活一些时日。
[wordpress]修改syntax-highlighter的样式
在wordpress中装上 之后如果发现代码样式不满意,可以修改插件css设定。具体位置在/wp-content/plugins/google-syntax-highlighter/Styles/SyntaxHighlighter.css 。或者在wordpress后台找到插件的编编辑器,找到的SyntaxHighlighter.css文件。修改.dp-highlighter即可。
.dp-highlighter
{
font-family: "Consolas", "Courier New", Courier, mono;
font-size: 17px;
background-color: #E7E5DC;
width: 99%;
overflow: auto;
margin: 18px 0px 18px 0px;
padding-top: 1px; /* adds a little border on top when controls are hidden */
}
Emacs的org-mode [agenda view]
假设你已经有了一个或多个带有TODO项目的org文件了,里面不少TODO项目还打上了DEADLINE或SCHEDULED时间戳。你打算怎么观赏它?怎么从一大堆项目中找到今天要处理的事情?打开所有的节点搜索?还是创建时按时间顺序排列?
都不需要,用agenda view就够了。这是一种视图,所谓视图,在我看来就是展示数据的方式。
agenda view就是要把你的数据,按时间来排列分割,然后展示给你看的。在你打开Emacs的任何时候,可以用(C-c a a)来打开agenda view。它的效果如图:

以图中23日的日程来看。它的数据展示规则是这样的。
第一部分是一个按时间分割的列表,它并不是每一天都有的,只有你当天的项目除了日期之外还定义了时间的情况下,它才会出现,并以两个时为间隔,将你的项目插入其中。而没有定义具体时间的当天项目,则在之后排队显示。
第二部分,没有具体时间的项目。第一列是TODO项目所在的org文件名,我这里有home,work,linux三个文件。第二列,显示这个项目是被分配在今天,还是在今天到期。Scheduled就是设置在今天的工作项,而Deadline就是指该项目在今天到期。而”In 2 d.”则表示这一项目在两天后到期。之后是描述。如果你的项目有tags的话,它将会在最后一列显示。
agenda view提供四种视图,分别是日(d),周(w),月(v m),年(v y),括号里是切换这四种视图的快捷键。用哪种视图纯属个人喜好,我觉得一方面是看你每天的日程多不多,另一方面可以取决于你在什么样的高度查看你的日程。
tags与情境
情境(context),在时间管理的概念中就是按所处的环境来分割TODO项目。比如说某些事是在网络上做的,某些事是在公司做的,某些事是在家里做的。
当然你可以把不同的情境分别放在不同的文件里。不过如果情境比文件的粒度要小,比如说你在家里有三个情境,”厕上”"床上”"电脑前”,而这些情境都属于“home”,你无须创建三个文件,而可以将它们全部放在home.org中,然后分别打上不同的标签。打标签的命令可以用(C-c C-q)。
之后如果你要做床上的事,可以敲(C-c a m),按提示输入标签,就可以显示所有符合条件的项目。
(C-c a)是打开agenda view的命令,而后面的m a可以看作是参数,用于打开不同的视图。如前所见,(C-c a a)是一种日历式的视图。(C-c a m)是一种可以指定Tags显示的视图。当然还有很多,按(C-c a)之后,界面上会有提示。
要做了以上这些事情,你还需要做一个配置,目的是要让agenda view知道,它应该从哪些个org文件里面取数据。
在你的.emacs文件中,添加:
(setq org-agenda-files (list "~/doc/org/linux.org"
"~/doc/org/work.org"
"~/doc/org/home.org"))
你尽可以在后面添加自己需要的org


































