代码
[Android]用shell卸载安装在模拟器上的应用
在使用android模拟器的时候,将编好的apk安装到模拟器上使用的是如下的命令:
?View Code BASH adb install path/to/fuckGFW-debug.apk
那么很自然的,我们觉得,卸掉一个已安装的程序应该用的是
?View Code BASH adb uninstall path/to/fuckGFW-debug.apk
然而到现在为止,这行命令在我的机器上还没有成功地达到它的目的过,于是当我需要重新安装一个应用时,使用的是傻不拉叽的方法——在模拟器中使用setting-application来卸载,必须承认,这实在是太傻了,卸载的次数越多,就觉得越傻。
所幸Android除了uninstall之后,还提供一种方法来卸载应用,那就是在模拟器中直接删除应用对应的apk,你需要做的是找出应用apk在模拟器中的位置,一般是data/app/yourapp.apk。然后直接使用shell来删除它。命令如下:
?View Code BASH adb shell rm data/app/net.laihj.fuckGFW.apk
这样会比手工操作快42倍以上,手工麻烦不说,android的模拟器远不是勤勉的典范,至少在我的机器上它慢得可以。然而这不是最美妙的,最美妙的是你可以把三个工作合成一行命令。它们是:卸载,编译,安装。只需要在bash中用分号将三个命令分开即可。代码如下:
?View Code BASH adb shell rm data/app/net.laihj.fuckGFW.apk;ant debug;adb install path/to/fuckGFW-debug.apk
当你修改过代码之后,别再到模拟器中手工卸载应用了,直接运行这一行,然后看修改有否生效吧。
当然,高智商的程序员认为这三部都可以写到build.xml中,然后用ant来控制。没错,可是直接用bash来处理,学习成本更低不是?
[elisp]用elisp编译解释当前的buffer
运行当前的buffer,就是说编译或解释当前的buferr。比如在编辑的是python文件”hello.py”,那么运行它的命令就是”python hello.py”,一般的python-mode用”C-c C-c”来处理这个问题,在编辑过程中可以调用这个快捷键来运行。当然你也可以使用”M-!”来打开shell command的mini buffer来输入命令。
诚然,很多语言的mode里面实际上都内置了这一功能,但我觉得,一方面不同的mode可能定义不同快捷键,造成了额外的记忆负担,另一方面并不能要求所有的mode都提供这一功能,在mode不完整的情况下你大概也需要自己定义的能力。
要做这事儿,当然是自定义一个函数。那么最直观的想法,就是在elisp里面写一行调用shell来执行命令的代码。是的,有这种东西,示例如下:
(shell-command “python hello.py”)
这一行代码的相当于在终端中执行”python hello.py”。
我们的目的是执行当前buffer,所以下一步要做的是得到当前buffer所对应的文件名。在上一篇blog中介绍过相关方法,就是”buffer-file-name”。
于是代码就变成了这样。
(shell-command (concat “python ” (buffer-file-name)))
用concat把”python “和当前buffer的文件名连起来作为要执行的命令。
至此,就完成了.py文件的执行函数,那推广之,需要对不同的文件进行编译/解释时,就需要扩展这个命令。
我们知道对.sh文件要用bash命令执行,对.py要用python,对.htm要调用firefox。现在要做的就是让机器知道这件事。很明显的,我们需要一个map,把它们对应地存下来。
完整的代码和注释如下:
(defun run-current-file ()
(interactive)
(let (ext-map file-name file-ext prog-name cmd-str
(setq ext-map
‘(
(”py” . “python”)
[...]
[elisp]EmacsLisp 基础
来源:李杀网
李杀网有一枚elisp教程我很喜欢,原因是它不解释太多的名词,而从实际动作方面入手,对我的胃口。
以下是相关的笔记。
运行方式:
作为一个实践的手册,第一件事当然是告诉如果运行一行代码,让你在看指南的过程中可以方便地动手尝试。
eval-last-sexp
输入后把光标移到表达式后面,如“(+ 3 4)”后面,然后输入”Alt+x eval-last-sexp”或者使用快捷键”C-x C-e”,就可以在mini buffer看到这一句的运行结果”7″。
eval-region
解释选中的区域。
ielm
打开一个交互式的elips命令行解释器。
寻找帮助:
可以使用”Alt + x describe-function”(快捷键”C-h f”)来查找一个函数的用法。也可以使用”Alt+x elisp-index-search”在手参考手册中查询。
常用函数
打印
(message “hi”)
(message “her age is:%d” 16) ;%d 数字
(message “her name is: %s” “Vicky”) ;%s 字符串
(message “her min init is: %c” 86) ;%c 字符
注意:你可以在*message* buffer中看到打印出来的结果。
运算函数
(+ 4 5 1 ) ;=10
(- 9 2) ;=7
(* [...]
新人在团队中应该问什么样的问题
最近团队中来一个外包,一起搞一个要得很急的项目,大概是年底发。
新人最近提的问题,让我总是忍不住想扔给他一篇《提问的智慧》,砸砸他的脑袋。
此君动不动就咬死了原来的代码行不通,这倒没什么,问题是在此基础上,他并不会提出自己的办法,而是拼命地问你怎么办怎么办怎么办,要求你给出一个方案来实行。
我觉得这样的问题不如不问,对谁都没有好处。
那么刚到团队的新人应该怎么问问题呢?
我个人觉得,如果团队有文档,那当然最重要的是先RTFM,没文档的团队免不了要问问题,其实我们喜欢新人问问题多过新人把代码弄得一团糟。但要注意的是,新人应该问的是老人能够几十秒之内回答的问题。
比如说,作为新人,不应该直接问为什么调用这个功能是为什么弹出提示说“没有权限”,而应该跟代码跟到相关的数据表,然后问在这种情况下为什么这个数据库表的值不对。
因为,一个团队,加进一个程序员,本质上来说目的只有一个:加快团队开发的效率,而前少项目交付的时间。
新人来问我问题,如果这个问题我知道,很好,我乐意告诉你。这样节省了走弯路的时间,有利于整个团队的效率。如果我不知道,那么这个问题应该打住,请君自己去看代码,而不是要求我帮忙看代码,或者要求我去思考出一个方案由你来执行。
因为不管是让我去帮忙读代码或让我出方案,都是一个时间浪费的问题。一方面,我得停下手头的工作,另一方面,在我帮忙的这段时间,新人实际上是闲着的。
并且,团队招一个新人,并不是为了写代码,而是为了解决问题。我们招一个人来,应该是看中其独立思考解决问题的能力,而不是为了得到一个编写代码的工具。如果只是一个按给定方案来写代码的工具的话,相比于人类,某些二进制代码组成的工具说不定是更好的选择。
而且,这样的问题并不能培养一个人的编码能力,天天从天上掉下来大鱼的话,人是会懒地,他必然学不会渔的能力。
Emacs的orgmode [remember]
Inbox,在GTD的定义里面是收集材料的工具。最好的Inbox工具是纸和笔。而Remember在Orgmode里面算是较好的Inbox工具。它比每次打开org文件来写好非常非常多。它提供的是在emacs启动的情况下,快速的录入工具。如果你的emacs没启动,那用便箋或纸笔会好得多。原因很简单,emacs什么都好,就是启动太龟了。
配置和基本使用
remember.el在emacs23以上版本是自带的,emacs22及以下版本如果发现没有自带,请自行放狗搜。
(setq org-default-notes-file “~/.notes”)
在.emacs中作如上设置,表示你希望将remember产生的note存放在~/.notes中,要我说这可一点也不重要,重要的是下面这一行:
(define-key global-map [f12] ‘org-remember)
快键键。当然,快捷键从来很重要。不过在remember模式中,它显得尤其重要。因为本身remember是随时需要的东西,用完后又应该随时忘掉。所以调用remember应该越不影响当前的思路又好。一个要键入”M-x org-remember”这么多字符才能调出来的remember又有什么用?
我觉得remeber的用法应该是这样的:
现在我想起来晚上海贼王的汉化应该出新的了,接F12调出remember,输入OP,然后“C-c C-c”保存(C-c C-k是取消),remember buffer自动消失,整个emacs又恢复成写这篇blog的界面。
现在的问题是,我一天可能乱七八糟的出现不少想法,每次都按F12来记录是好的,晚上回家一看,~/.noet里面充满了记录,一条一条分门另类地复制了不同的org文件中。我承认这是重要的工作,无可避免。可是有些想法我在记录的时候就知道它应该是todo还是普通的笔记,能不能让它们自动归位呢?
于是我们应该开始介绍:
模版
模版的配置文件如下:
(setq org-remember-templates
‘((”TODO” ?t “* TODO %?\n %x\n %a” “~/doc/org/home.org” “Tasks”)
(”IDEA” ?i “* IDEA %?\n %i\n %a” “~/doc/org/home.org” “Idea”)
))
它的参数是这样的,”TODO”是这个模版的名,”?t”是快捷键,”* TODO %?\n %x\n %a”是整个模版体,然后是该模版要保存的文件,保存后的项目在文件中处于哪个父节点下面(如果没有会自动新建)。
我们以第一个模版为例说一下使用中会发生什么?
当你按下F12(这是我的快捷键)时,会看到buffer被切分成两块,下面出现一个rememeber fuffer。以及一个输入提示,按我们之前的设定,出现两个快捷提示。
这时按下“t”,在remember buffer中,会自动接模版体的格式显示出补好的TODO,第一行是“* TODO”,第二行是%x,%x是你触发remember时kill ring(类似于剪贴板)中的内容。最后一行是%a,一个指向你触发remember的地方的link。
这时如果你按下”C-c C-c”保存,这一条TODO项目将会被送到”~/doc/org/home.org”文件中的”Tasks”条目下面。
模版还有一些好玩的用法,比如说写日记。
关于模版参数的更详细说明,可以在这里找到
参考资料
org手册remember
Remembering to Org and [...]
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)
[...]
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)
[...]
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:
** [...]
[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”
[...]



