2012年9月30日星期日

又两个grep的替代品: Rak和Grin

看这个意思,各种语言都要把grep重新实现一遍:

Rak
http://rak.rubyforge.org/

引用Rak is a grep replacement in pure Ruby. It accepts Ruby syntax regular expressions and automatically recurses directories, skipping .svn/, .cvs/, pkg/ and more things you don't care about. It is based on the Perl tool ack by Andy Lester.



Grin
http://pypi.python.org/pypi/grin/

引用A grep program configured the way I like it.

I wrote grin to help me search directories full of source code. The venerable GNU grep and find are great tools, but they fall just a little short for my normal use cases.

...Also, I was bored. It seems to be catching. Perl has ack, Ruby has rak, and now Python has grin

grin比ack好的一点是,ack缺省是按编程语言扩展名来搜的,一些它不识别的编程语言就得重新定义,所以常常临时需要用ack -a,而grin跟grep的行为比较一致,没有这个问题。

参见: grep的两个替代品(ack & glark) - 巴蛮子 - 博客园

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/21/another-grep-replacements-rak-grin.html)

tmux/screen里面如何用鼠标滚轮来卷动窗口内容

tmux里面用鼠标滚轮来卷动窗口内容

在tmux里面,因为每个窗口(tmux window)的历史内容已经被tmux接管了,所以原来console/terminal提供的Shift+PgUp/PgDn所显示的内容并不是当前窗口的历史内容,所以要用C-b [ 进入copy-mode,然后才能用PgUp/PgDn/光标/Ctrl-S等键在copy-mode中移动。

如果要启用鼠标滚轮来卷动窗口内容的话,可以按C-b :然后输入
    setw mode-mouse on
这就可以了。如果要对所有窗口开启的话:
    setw -g mode-mouse on
(这种情况下,Vi/Emacs等全屏程序并不受影响,还可以自己接管滚轮事件)

也可以加到~/.tmux.conf里面
     set-window-option -g mode-mouse on
(setw其实是set-window-option的别名)

摘自: Scroll shell output with mouse in tmux - Super User

gnu screen里面呢
一种说法是在~/.screenrc里面添加
    termcapinfo xterm* ti@:te@
xterm*用于匹配(glob match)你的当前term类型
Using the scrollwheel in GNU screen

另一种说法就比较复杂了,详见链接: How to use mousewheel in GNU Screen | Mikael Ståldal’s technical blog 

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/17/mouse-wheel-in-tmux-screen.html)

tmux如何查看历史输出

在tmux里面,因为每个窗口(tmux window)的历史内容已经被tmux接管了,所以原来console/terminal提供的Shift+PgUp/PgDn所显示的内容并不是当前窗口的历史内容,那么应该怎么办呢?

改用C-b [进入copy mode,然后就可以用PgUp/PgDn/光标来浏览历史输出了,按q退出。C-b PgUp也可以直接进入coy mode. 参见:How do I scroll in tmux? - Super User

copy mode其实比较类似于vi/emacs里面一个只读buffer,可以移动光标,可以搜索,用C-SPC开始选择,选择完后用M-w拷贝(拷贝后自动退出copy mode),然后可以C-b ]粘贴(可在其它窗口粘贴), C-b =可以从剪贴板历史中选择。

gnu screen里面呢
gnu screen进入copy mode的方式跟tmux类似(C-a [),但进入后它是vi style keybindings。

对于拷贝文字,第一次空格设置开始标记,然后用hjklw之类移动光标,第二次空格完成拷贝。粘贴也是用C-a ]

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/17/tmux-scroll-back.html)

Hack: 支持多个repo的cyg-apt

原本是为了在Cygwin下面安装deepgrep这个工具(见介绍 deepgrep: grep nested archives with one command ),但我发现自己编译它有点麻烦,然后又发现Cygwin Ports这个非官方仓库里面有这个strigi包。

但这个strigi包的依赖又有点多,用cygwin setup下载很有点受不了:cygwin setup缺省会下载所有的更新,虽然可以选择不管它们,但界面操作起来可有点麻烦,本来一次性麻烦一点也就罢了,但因为这个镜像很不稳定,一旦在某个包上卡死,或者发现它正在下某个我不想下载的大软件包(比如emacs24),就得重来。。。

也试用了apt-cyg-multi,但它不支持跨repo的包依赖,比如这个strigi的依赖里有几个包是在官方仓库里的,而我没有安装,它就一会儿又报告一个错误,我把缺的安装上了,再跑它,它又报告一个错误,我又得去装缺的那个。。。

算了,还是自己动手吧,看了一下apt-cyg-multi的代码,用bash写的,我觉得可读性不是太好,调试也比较麻烦,不想在这个上面改。

于是又拿起了自己简单修改过的cyg-apt,是python写的,bootstrap代价有点大,但对我而言python是必装的,也不是大问题了。

完成的代码在这里: http://code.google.com/p/bamanzi-misc/source/browse/trunk/cygwin/cyg-apt,还没有在cyg-apt原项目网站上提交patch。

支持多repo的方法是在~/.cyg-apt里面添加一个mirrors配置项,格式为python的dict格式,例如:

mirrors = { 'main': 'http://ftp.cn.debian.org/cygwin', 'ports': 'http://downloads.sourceforge.net/cygwin-ports' }

然后执行:

cyg-apt update
cyg
-apt install strigi

就等着安装完成吧。

(不过,尚不支持同一类仓库的多个mirror——如果想一个mirror连不上时,转向另一个mirror去下载,目前是不支持的。因为我觉得暂时没有太大必要,因为在~/.cyg-apt里换一个mirror就是了,至于原来下载下来的包虽说是按mirror url分目录存放的,但手工挪一下倒也不难)

另外,我改掉了cyg-apt原本每次都去自动更新setup.ini的行为,改为cyg-apt update时才更新,这跟Debian apt-get的行为一致 —— 不过cyg-apt原本的对某些子命令(比如install)会自动更新setup.ini行为并未删除,而是改到配置项auto_update(或者命令行选项'-a')上了。

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/09/08/cyg-apt-for-multi-repo.html)

deepgrep: grep nested archives with one command

Total Commander里面有个功能是我很离不开的,导致我在linux下还得用wine来跑它:可以支持搜索压缩包里面的文件内容,并且可以通过它的packer插件支持各种类型的压缩包。

先说说我最需要这个功能的一个场景吧,比如,我常常修改一些Firefox的扩展,有的扩展的安装包会在被firefox解压,但里面还有一个 content jar文件(其实是采用zip压缩格式); 而新版本的firefox对安装的扩展大都不会将xpi解压,这个xpi文件其实也是zip格式,里面很可能还会有个jar包。我有时需要搜索所有扩展的 install.rdf文件,以确定名称为xxxx的某个扩展到底在哪个文件里,有时需要搜索xpi或者jar里面的js、xul代码,以查找某个函数或 者某个页面元素的定义。

zgrep/bzgrep都只能搜索单个的gzip/bzip2压缩文件,而不能支持包含多个文件的包,不适用于上面的问题;

zipgrep性质上比较接近,支持zip文件,但有两个问题:
1. 不支持压缩包嵌套的场景(比如在上述xpi里面的content jar中间搜索js/xul的内容),
2. 它只能指定搜索某个zip文件,而不是以目录为搜索范围,然后透明地搜索多个zip文件;

前两天看见Planet Debian上有篇deepgrep: grep nested archives with one command,这个东西正式我一直以来想要的!

唯一的遗憾是deepgrep不能显示搜索结果所在的行号,这使得我想在Emacs里面集成它有点困难(本来想在grep-mode的基础上改改,可以打开搜索结果所在的文件(压缩包内的),并跳到指定的行)。

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/17/deepgrep-goes-thru-nested-archives.html)

Python脚本重定向其输出时的编码问题

python有一个比较烦的问题是,同一段程序,里面有print语句,直接运行时没有问题,一旦将其输出设了个重定向,这个脚本就不正常了,报告UnicodeEncodeError

究其原因,是Python感知到输出到控制台时,会从控制台取当前编码;而重定向后Python程序无法得知写那个文件该用哪个编码(不过为啥不用控制台的值?), 缺省就用了ascii (准确地说,是系统缺省编码sys.getdefaultencoding(),可以在sitecustomize模块里修改。而python3将缺省编码改为utf-8了) 。python - UnicodeDecodeError when redirecting to file - Stack Overflow

解决办法有两个:
 
一个是刚才提到的修改sitecustomize模块(缺省不存在,特意留给用户定制的),在里面调用sys.setdefaultcoding('xxxx')——这个函数python在import site之后就没有了,应用程序的python代码里是没法调的

方法二是shell里设置环境变量PYTHONIOENCODING,设成utf_8或者gbk都可以(只要字符集够) PrintFails - PythonInfo Wiki

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/16/python-encoding-when-redirection.html)

[git/hg] 什么叫做bare repo?

[git/hg]什么叫做bare repo?

引用一个bare repo与普通repo的区别是没有项目文件的working copy,即repo根目录下只有专用目录,而没有任何其他代码文件和文件夹;这是为了响应作为codebase应当遵循的“Only store, never update from revisions(只存储版本,不更新到实际代码文件)”原则。

hg管理的repo天生就能做codebase使用,无论是否是bare的,这点是由其分布式版本控制系统的本质决定的,它可以随时把当前的repo通过自带的http server发布代码,特别适合分布式开源项目的代码分享。

git也是分布式代码版本管理工具,不过它对作为codebase的repo做了严格的bare要求。可以看到的是许多人在初学git时不了解这一点,抱怨自己做spike时不知如何提交代码到在本机上的codebase。这里顺手写下两个tips:

* 初始建立一个bare repo

$ git init --bare

* 如果已有一个repo了,使用下面的方法将其转化为bare的

$ git config --bool core.bare true

之后可删除除了repo根目录.git文件夹之外的所有文件,即只保留专用目录


摘自: git vs hg - 挖金子的矿工 - 博客频道 - CSDN.NET

补充:
1. 上面部分说法可能不对,因为该博文是针对老版hg写的,而后来hg也有了类似git的repo内多命名分支,而对于bare repo,官方wiki (GitConcepts#Bare_repositories上)说要这样: hg update null

2. 对git而言, bare repo不仅仅是没有checkout, 而且There is no .git directory is created. Instead, the files normally in the .git directory are placed in the top-level directory where the working directory would normally be. (来自Shared Repositories Should Be Bare Repositories - GitGuys)

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/15/git-hg-bare-repo.html)

几个与Dropbox和Ubuntu One有关的链接

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/14/links-for-dropbox-ubuntu-one.html)

Create a Git Mirror (for your hg repository) / hg tip

为hg仓库建立一个git的镜像真的很简单,只需要三步:
  1. 安装hg的hg-git扩展: easy_install hg-git, 然后在~/.hgrc里面启用这个扩展;
  2. 在hg repo的hgrc里面的.hg/hgrc里添加一个path: 格式为:github = git+ssh://git@github.com/username/project.git (当然,你得先在github上创建一个空的git仓库)
  3. hg push github

注意:如果在github上的仓库不为空,hg push会被拒绝,除非你先将github上的历史pull过来。

来自:  Create a Git Mirror (for your hg repository) / hg tip

关于hg-git的更详细的说明,可查看其主页: Hg-Git Mercurial Plugin — durin42 / hg-git / overview — Bitbucket

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/13/create-git-mirror-for-hg-repo.html)

浏览器里最强的搜索栏(duckduckgo !bang)

为了进行一些专项搜索(比如在AMO上搜索Firefox扩展,在PyPi上搜索Python包,在http://packages.debian.org搜索Debian包),我给Firefox和Chrome都配了好多搜索引擎,每个配上一个关键字,这样就可以在地址栏输入"amo firebug"直接从AMO网站上按关键字搜索firebug了。。。

早上看见一篇 Useful duckduckgo searches for developers,里面说到DuckDuckGo搜索引擎提供一种!Bang语法,翻了一下,哇,这才是终极的替代品!

为什么这么说?因为大多数情况下我不再需要上面那些配置,直接在DuckDuckGo的输入框里面输入"!amo firebug"或者"!dpkg gedit"就能完成上述功能了! 而且很多关键字跟我原来的习惯是一致的:amo, pypi, dpkg...

如果说我将DuckDuckGo设置为Firefox/Chrome的默认搜索引擎,那就更方便了,都不用进入DuckDuckGo的网站,直接在Firefox/Chrome搜索框里按!bang方式输入就行了,哈哈。

不过上面为什么说“大多数情况下”?你看看!Bang页面列出的用法就知道了,很多很多常用网站都有对应的关键字,下面是我常用的一些搜索,包含了各项Google应用、Python/Javascript语法、Python软件包、Linux软件包、man page、Vim/Emacs/TotalCommander插件。。。 该页面还有很多很多。。。

如果还有一些你常用的没有包含在里面,可以提交申请,也可以再配合浏览器的搜索引擎来进行本地扩展。

Google (!g)
Google HK (!ghk)
Google CN (!gcn)
Google Images (!img)
Google Maps (!gmap)
Google Blogs (!gblogs)
Google Groups (!gg)
Google Reader (!gr)
 
Chrome Extension Repository (!crx)
Firefox Add-ons (!firefox)
Firefox Addons (!amo)
 
Vim Scripts (!vimscripts)
Vim.org (!vim)
Vimdoc (!vimdoc)
EmacsWiki (!emacs)
EmacsWiki (!emacswiki)
 
!github
!bitbucket
!sourceforge
Google Code (!gcode)
 
Debian Packages (!dpkg)
Debian file search (!dfiles)
openSUSE Software (!susepkg)
Ubuntu Packages (!upackages)
Ubuntu Manpages (!uman)
man.cx (!man)
 
JavaScript Docs (!js)
Mozilla Developer Center (!mdc)
Mozilla Developer Network (!mdn)
Python Docs (!py)
Pypi.python.org (!pypi)
Python2.6 Docs (!python26)
Python2.7 Docs (!python27)
 
Wikipedia (!w)
Wikipedia (ZH) (!wzh)
Wiktionary (!wt)
 
DICT.org (!dict)
WordNet (!wordnet)
Google Translate (!tr)  (可惜没有en <-> 中文的。下面这个可以用来查单词,但整句就不行了)
LEO Dictionary Chinese (!leoc)
 
AlternativeTo (!altto)
TotalCmd.Net (!totalcmd)
 
Twitter (!twitter)
StackOverflow (!so)
stackexchange.com (!sx)

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/09/27/most-powerful-search-box-in-firefox.html)

2012年9月6日星期四

2012-09 短博客

(8月试验了一下这种形式,觉得还不错,用评论来发比较短的博文很方便,修改也方便。本月继续。

不过这种方式对于通过RSS订阅的朋友来说就很不爽,所以我打算每月底整理一下,将通过评论发的“短博文”改放到正文来——有点想以前杂志上的“外xx篇”哈。而试图通过tag来分类查看的网友,就有点对不住了 :-)

之前的“网海拾贝”的形式就不搞了,光秃秃的放一些链接意思不大,整理起来也比较麻烦。)

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/09/06/shortblogs-2012-09.html)