Archive for the ‘Tools’ Category
Emacs中对不同项目指定不同的风格
我的Emacs配置里C语言默认的缩进风格是用4个空格,最近要修改Chromium的代码,而Google的C/C++风格统一为2个空格缩进,所以改代码的时候要把c-basic-offset设置为2。这样在不同项目间切换的时候很不方便。
在stackoverflow上发帖求助后发现了Emacs 23.1一个很好用的新功能,Per-Directory Local Variables,只需要在项目主目录下放一个.dir-locals.el文件,里面设置该项目特有的变量值,就能应用到整个项目了。
以我的Chromium为例,Google已经提供了一份C/C++风格的配置,只需要在~/chromius/src/.dir-locals.el里把google-c-style常量粘贴进去即可。另外我不知道为啥加上c-offsets-alist那段后Emacs缩进会变得很奇怪,所以我把它删了。附修改后的.dir-locals.el
((c++-mode . ((c-recognize-knr-p . nil)
(c-enable-xemacs-performance-kludge-p . t) ; speed up indentation in XEmacs
(c-basic-offset . 2)
(indent-tabs-mode . nil)
(c-comment-only-line-offset . 0)
(c-hanging-braces-alist . ((defun-open after)
(defun-close before after)
(class-open after)
(class-close before after)
(namespace-open after)
(inline-open after)
(inline-close before after)
(block-open after)
(block-close . c-snug-do-while)
(extern-lang-open after)
(extern-lang-close after)
(statement-case-open after)
(substatement-open after)))
(c-hanging-colons-alist . ((case-label)
(label after)
(access-label after)
(member-init-intro before)
(inher-intro)))
(c-hanging-semi&comma-criteria
. (c-semi&comma-no-newlines-for-oneline-inliners
c-semi&comma-inside-parenlist
c-semi&comma-no-newlines-before-nonblanks))
(c-indent-comments-syntactically-p . nil)
(comment-column . 40)
(c-cleanup-list . (brace-else-brace
brace-elseif-brace
brace-catch-brace
empty-defun-braces
defun-close-semi
list-close-comma
scope-operator)))))
NoteExpress and BibTex
最近写了篇survey,分享下用NoteExpress一些经验
1. bibtex 关键字设置:
工具->样式->选择当前输出样式,选择BibTex,然后就能在题录的字段中找到bibtex 关键字一项了
2. 导出bibtex时选择ANSI编码,如果设置为UTF-8貌似编译latex时会给出类似You’re missing an entry type—line 1 of file xxx.bib的提示。
3. 导出引用的网页:我的解决方法是在BibTex样式->题录->模版里新增一个网页模版,然后右键编辑区选择从模版通用复制,并在里面增加一条`***`Howpublished = {\url{`链接`}}, 这样就能使用howpublished字段导出网页链接了。不过好像这样网页地址不会换行,于是我最后还是用手动断行改了下.bib。
4. 另外提下,把png/jpg转成eps,我用的是sam2p,aur上就有。
在git中修改之前提交的内容
其实这个问题我以前在Stackoverflow上回答过别人http://stackoverflow.com/questions/1186535/how-to-modify-a-specified-commit,不过现在自己反而忘了,还是贴在这下次查起来方便点
先用git rebase bbc643cd^ –interactive 退回到要修改的commit的前一个点,这里bbc643cd就是要修改的commit,执行后git会调用默认的编辑器显示该次commit到最新commit的所有记录,在这里我们把要修改的那一项的行首的pick改成edit。
接下来运行git commit –amend,使用默认编辑器修改这次commit。
最后执行git rebase –continue就能提交修改后的commit并且返回到原来的commit了。
新装硬盘空间只有31B/32MB的解决方案
这周买了块西数的1T硬盘,用来放各种美剧/高清电影。装好进入Win7后提示检测到新硬盘,然后进入磁盘管理一看发现磁盘大小只有31兆,重启进入BIOS看到的磁盘容量是0MB。换了一台电脑问题依然存在。
于是求助superuser,发现了这篇文章http://www.pcstats.com/articleview.cfm?articleid=1139&page=12,貌似是LBA(Logical Block Addressing)相关的问题,下载了个HDD Capacity Restore Tool修复后问题解决。
附该软件下载地址:http://hdd-tools.com/products/cr/download/crsetup.exe
推荐个iPhone/iPod Touch上的时间管理工具
以前一直用TODO和Saisuke做时间管理,前者用来同步toodledo.com的待办事项,后者可以和Google Calendar同步日程安排。不过最近不知怎么的Saisuke没法和Google Calendar同步了,每次同步都报错“Turn off Airplane Mode or use Wi-Fi to access Network”,于是只能去App Store上找替代品。
这里推荐下Pocket Informant,用下来感觉很不错。同时支持tooledo.com和Google Calendar,Today视图上可以查看今天的Calendar安排以及近期的TODO事项。不过好像不支持TODO的标签功能,我现在拿context当tag用。另外weiphone上也有人说它速度有点慢,不过我没发现。
破解版俺这里就不提供下载了,appulous和weiphone上搜一下就能找到。
Dreamhost上编译php5
Dreamhost提供的php有不少限制,昨天折腾了一个晚上终于成功地在自己的虚拟主机上编译了php5。
Why
用下来,发现使用自己编译的php5有这么几个好处:
1. 可以自定义内存分配上限,默认只有32M,通过wordpress安装插件的时候经常出现内存不够的问题。
2. 上传文件大小限制也能改,默认只有2M,基本没法通过wordpress传音乐之类的比较大的文件。
3. 使用自己的php后解释执行的进程uid也是自己了,这样就避免了很多nobody用户访问/修改/增加文件所带来的问题。
How to compile
编译和安装的大部分步骤可以参考http://wiki.dreamhost.com/index.php/Installing_PHP5,这里补充一点我碰到的问题和解决方法。
因为我这台dreamhost虚拟主机用的是x86_64,而通过下载的php5的configure文件默认查找的是/usr/lib/下面的共享库,通过–with-libdir=lib64设置查找路径后却无法找到openssl库了,于是我用了个很山寨的方法,把configure脚本里查找libmysqlclient时的路径临时改成了/usr/lib64,然后再改回/usr/lib。
安装脚本开头定义的几个包的名字可能也要修改下,如果下载出现错误的话去上级目录看下最新的包的名字是什么就行了。另外脚本中解压.Z和.tar.gz文件用的是uncompress命令,似乎在我的这个主机上没有安装,改成tar zxf就行了。
How to use
最后说下编译成功后怎么使用,具体方法那个网页上也讲过了,只要把编译后的php.cgi放到/cgi-bin/下然后改下.htaccess即可。
对于子域名,比如我这个techblog.iamzellux.com,参照网页上的说明把整个cgi-bin用符号链接的方式link到子域名的根目录下是最方便的方案,当然别忘了修改.htaccess。
防止Firefox在关闭最后一个Tab后退出
记得以前用Firefox 3.0.x时把Tools -> Options -> Tabs -> Always show the tab bar勾上就行了,升级到3.5以后就没用了,搜了下Knowledge Base,最后在
看到只要将about:config页中的browser.tabs.closeWindowWithLastTab项设为false即可
Company-mode: Emacs自动补全
Company的全写是complete everything,它只是一个补全的前端,会自动调用semantic等后端插件。
新版的Company可以从它的官方主页(http://nschum.de/src/emacs/company-mode/)下载到,也可以从ELPA下载安装这个插件。
使用这个插件时只要在.emacs中加入
(add-to-list 'load-path "/path/to/company")
(autoload 'company-mode "company" nil t)
然后Emacs中使用M-x company-mode启动company模式即可。
具体的按键可以在company.el中看到
(defvar company-active-map
(let ((keymap (make-sparse-keymap)))
(define-key keymap "\e\e\e" 'company-abort)
(define-key keymap "\C-g" 'company-abort)
(define-key keymap (kbd "M-n") 'company-select-next)
(define-key keymap (kbd "M-p") 'company-select-previous)
(define-key keymap (kbd "") 'company-select-next)
(define-key keymap (kbd "") 'company-select-previous)
(define-key keymap [down-mouse-1] 'ignore)
(define-key keymap [down-mouse-3] 'ignore)
(define-key keymap [mouse-1] 'company-complete-mouse)
(define-key keymap [mouse-3] 'company-select-mouse)
(define-key keymap [up-mouse-1] 'ignore)
(define-key keymap [up-mouse-3] 'ignore)
(define-key keymap "\C-m" 'company-complete-selection)
(define-key keymap "\t" 'company-complete-common)
(define-key keymap (kbd "") 'company-show-doc-buffer)
(define-key keymap "\C-w" 'company-show-location)
(define-key keymap "\C-s" 'company-search-candidates)
(define-key keymap "\C-\M-s" 'company-filter-candidates)
(dotimes (i 10)
(define-key keymap (vector (+ (aref (kbd "M-0") 0) i))
`(lambda () (interactive) (company-complete-number ,i))))
keymap)
"Keymap that is enabled during an active completion.")
这里默认的补全按键是Tab,由于已经把它绑定到了yasnippet,我用了Shift-Tab替代(Ctrl-Tab似乎在terminal下没法用,不知道哪位能解决这个问题)
(define-key company-mode-map "\t" nil)
(define-key company-mode-map [(backtab)] 'company-complete-common)
如果按了Shift-Tab没有任何反应,请确认你的后端插件已经配置正确,可以参考这篇博文。
另外这里还有个视频,不喜欢看文字的话看一下这个就知道company怎么用了。http://nschum.de/src/emacs/company-mode/screencast/
ArchLinux下安装git, gitosis, gitweb服务
参考文章:
[1] http://hokietux.net/blog/?p=58
[2] http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way
[3] http://www.nkuttler.de/2009/04/06/git-clone-ssh-could-not-resolve-hostname/
1. git
很简单,直接用pacman安装即可
sudo pacman -S git
2. gitosis
gitosis是一个方便管理git仓库的工具,安装方法:
1) 从yaourt或者aur下载安装gitosis-git包 http://aur.archlinux.org/packages.php?ID=23419
2) 新建git用户
sudo useradd –system –shell /bin/sh –comment ‘git version control’–user-group –home-dir /home/git/ git
3) 将开发用户的rsa公钥导入gitosis,(没有公钥的话请先运行ssh-keygen -t rsa生成)
sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub
4) 如果以上步骤没有问题,那么运行
git clone ssh://git@hostname/gitosis-admin.git
后应该就能看到gitosis-admin.git这个目录了
5) 新建项目、添加用户等操作参见[2],这里不再赘述
3. gitweb
事实上ArchLinux中安装的git包自带了gitweb,可以用which gitweb搜到,一般默认在/usr/share/gitweb。下面假设我的http根目录为/home/httpd
1) 将/usr/share/gitweb下的文件复制到/home/httpd/cgi-bin(其实似乎只要gitweb.cgi就够了)
sudo cp -R /usr/share/gitweb /home/httpd/cgi-bin/
2) /usr/share/gitweb下的.css和.png复制到/home/httpd/html/git/
3) 修改或创建/etc/gitweb.conf,具体配置如下
# git命令的地址
$GIT = "/usr/bin/git";
# 项目仓库地址
$projectroot = "/home/git/repositories";
# 网页显示相关的文件,我把它们都放在了/home/httpd/html/git/下
$stylesheet = "/git/gitweb.css";
$logo = "/git/git-logo.png";
$favicon = "/git/git-favicon.png";
# 首页显示的站点名
$site_name = "ZelluX's Git Trees";
# 项目信息中显示的地址,
@git_base_url_list = ("ssh://git\@hostname");
# 网页中项目说明的显示长度
$projects_list_description_width = 50;
# 发布的项目的标记。例如/home/git/repositories/hello/git-daemon-export-ok存在,
# 那么hello这个项目就会显示在项目列表上。
# 但是似乎每次pull或者push操作都会导致git把这个它认为多余的文件删掉,不知道有没有其他的解决方案。
# 把这行注释掉就允许所有的项目显示在网页上。
$export_ok = "git-daemon-export-ok";
$feature{'pathinfo'}{'default'} = [1];
$feature{'blame'}{'default'} = [1];
$feature{'blame'}{'override'} = [1];
$feature{'pickaxe'}{'default'} = [1];
$feature{'pickaxe'}{'override'} = [1];
$feature{'snapshot'}{'default'} = [1];
$feature{'snapshot'}{'override'} = [1];
$feature{'search'}{'default'} = [1];
$feature{'grep'}{'default'} = [1];
$feature{'grep'}{'override'} = [1];
4) 在apache的配置中增加以下内容 /etc/httpd/conf/httpd.conf,这里我没有用VirtualHost机制,只加了行URL重写规则,VirtualHost的配置方法参见[1]
RewriteEngine on RewriteRule ^/gitweb/(.*) /cgi-bin/gitweb.cgi/$1 [L,PT]
5) 重启apache后应该就能访问 http://hostname/gitweb/ 了,如果提示Project not found,请确认apache能访问git的仓库目录,并且相应的项目目录下有git-daemon-export-ok这个文件。
在Linux Kernel 2.6.29上安装VMware Server 2
在kernel 2.6.29上编译vmware modules时报错了
/usr/src/linux-2.6.29/arch/x86/include/asm/apicdef.h:132:1: warning: this is the location of the previous definition /tmp/vmware-config0/vmmon-only/linux/driver.c: In function ‘LinuxDriverSyncCallOnEachCPU’: /tmp/vmware-config0/vmmon-only/linux/driver.c:1423: error: too many arguments to function ‘smp_call_function’ /tmp/vmware-config0/vmmon-only/linux/driver.c: In function ‘LinuxDriver_Ioctl’: /tmp/vmware-config0/vmmon-only/linux/driver.c:1987: error: ‘struct task_struct’ has no member named ‘euid’ /tmp/vmware-config0/vmmon-only/linux/driver.c:1987: error: ‘struct task_struct’ has no member named ‘uid’ /tmp/vmware-config0/vmmon-only/linux/driver.c:1988: error: ‘struct task_struct’ has no member named ‘fsuid’ /tmp/vmware-config0/vmmon-only/linux/driver.c:1988: error: ‘struct task_struct’ has no member named ‘uid’ /tmp/vmware-config0/vmmon-only/linux/driver.c:1989: error: ‘struct task_struct’ has no member named ‘egid’ /tmp/vmware-config0/vmmon-only/linux/driver.c:1989: error: ‘struct task_struct’ has no member named ‘gid’ /tmp/vmware-config0/vmmon-only/linux/driver.c:1990: error: ‘struct task_struct’ has no member named ‘fsgid’ /tmp/vmware-config0/vmmon-only/linux/driver.c:1990: error: ‘struct task_struct’ has no member named ‘gid’ /tmp/vmware-config0/vmmon-only/linux/driver.c:2007: error: too many arguments to function ‘smp_call_function’
貌似是2.6.29的task_struct有了改动导致的,网上搜到一堆vmware workstation在kernel 2.6.29上的补丁,都不好用,最后在http://www.saarlinux.de/blog/?p=5 翻到一个已经打了补丁的vmware modules包,解压到/usr/lib/vmware/modules/source覆盖原来的几个.tar文件再运行vmware-config.pl就可以了