2013年4月27日星期六

[转] vim7 中文显示问题


vim中文显示问题


安装了vim7.2,下载地址 www.vim.org,但是在utf-8下输入中文却是乱码。
使用 :set 命令,发现vimrc中设置的字符集并未生效。
后发现是安装时 configuration 少写了参数;添加如下参数:

./configure --enable-multibyte

就可以正常显示输入的中文了。
附上vimrc的部分内容:

let &termencoding=&encoding
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8,gb18030,utf-16,big5
set langmenu=C

注: 如果不指定  --enable-multibyte, set enc, set fileencoding 时发现没有这样的指令.

[转]Linux 添加环境变量与 GCC 编译器添加 INCLUDE 与 LIB 环境变量


Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量

对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的
.bashrc或.bash_profile里增加下面的内容:
(注意:等号前面不要加空格,否则可能出现 command not found)

#在PATH中找到可执行文件程序的路径。
export PATH =$PATH:$HOME/bin

#gcc找到头文件的路径
C_INCLUDE_PATH=/usr/include/libxml2:/MyLib
export C_INCLUDE_PATH

#g++找到头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
export CPLUS_INCLUDE_PATH

#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib
export LD_LIBRARY_PATH

#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/MyLib
export LIBRARY_PATH

Specifies the directories that are to be searched for libraries at both link and run time.
LD_RUN_PATH=$HOME/local/bin:/opt/local/bin:/usr/bin/:/usr/local/bin
export LD_RUN_PATH


#
DYLD_LIBRARY_PATH=$HOME/local/lib:/usr/local/lib:/usr/lib:/usr/local/mysql/lib
export DYLD_LIBRARY_PATH

2013年4月25日星期四

[总结] 如何添加和删除在 Mac OS X 的 Finder 侧边栏项目


如何添加和删除在 Mac OS  X 的 Finder 侧边栏项目


1. 按着 command 再拖就可以删了.
2. 直接编辑文件
~/Library/Preferences/com.apple.sidebarlists.plist
修改完成重启 finder

PS: 经验证,第一个方法简单实用,太好使了.

2013年4月24日星期三

[转] 微信公众帐号的四种玩法

近日,腾讯科技推荐了一篇《最创新的十大微信公众帐号》,文章推荐了包括和菜头在内的10个创新有趣的公众帐号。小微按图索骥关注了其中几个,感觉的确蛮好玩的,比如琢磨先生晚上发的“美国版新闻联播”、斑狸的闯关游戏、腾讯科技的“小小说科技”话题互动等。
  在腾讯科技的“忽悠”之下,估计也有不少人和小微一样关注了这些帐号,估计被推荐的各位也觉得推广效果很好。比如和菜头今天就发微信说他的订阅量突破了1万,而斑狸也打算重新继续自己的微信新篇章…。本来,小微也想推荐自己喜欢的公众帐号的,但腾讯科技推荐在先,小微再推荐就显得无趣了。所以,小微微创新一下,分析一下我所订阅的部分公众帐号的玩法儿!
  从今年8月下旬,微信悄悄推出公众平台至今,关于如何利用微信营销,微信营销的效果分析就有各种文章出现。似乎已经玩腻了微博的媒体、机构、大V们也纷纷开启了自己的微信公众帐号,并不遗余力地通过微博进行宣传(微信团队没花一分钱赚足了眼球哦~)。截至11月8日,小微分别在腾讯和新浪微博检索“微信公众号”,发现新浪有105万余条讨论、腾讯有近11万条话题,微信公众帐号的火热程度可见一斑。
  小微从公众帐号推出至今,也收听了不少帐号(刚才检查了一下自己订阅的帐号已超过100个了)。虽说这么多帐号,但综合来看这些公众帐号的玩法不过如下四类:
  一、图文推送型
  媒体、机构及部分名人类帐号主要采取图文推送的形式来第一时间给用户推送消息。因对微信公众平台的后台熟悉程度不同,有的推送图文版信息(如腾讯新闻、南方周末、华尔街日报中文网、财新网、程苓峰、冷兔等),有的则只是文字+链接信息(如潇湘晨报、喷嚏网、李开复等)。当然图文信息形式的推荐有可能因为手机版本不支持或微信版本不支持而无法顺利阅读,而文字+链接的形式虽然简单,但能保证每位用户都收的到。
  二、语音推送型
  名人帐号及部分媒体帐号主要采取语音推送型的方式,比如李冰冰、范晓萱、莫文蔚、声优小孽等多数时候都是一条语言发给订阅者,对于名人的疯狂粉丝来说,能听到偶像对自己说话,感觉还是很不错地说;部分媒体如腾讯科技的“小小说科技”、“iweekly周末画报”则在部分推送中加入了语音(巧合的是两者都以女性编辑的声音形象出现)。微信的出现最大限度地解放了人们的手指,对于媒体而言,在图文推送之外如能加入语音的推送,给人的感觉还是相当不错滴!
  三、闯关互动型
  利用这种方式互动的比较少见,如果不是腾讯科技推荐的话,我还真不晓得会有“斑狸”这种帐号的存在。此种方式的有点是可以让网友不断地探索与你互动,但弱点呢…每个网友都会有耐心玩完你的游戏吗?至少小微没有玩完第一关啦!(但小微旁边坐的90后MM就玩完了5关)
  在微信公众号中有自定义回复的功能,现在也有不少帐号如微成都等采取了关键词自定义回复的功能,好处是网友可以调戏机器人,不足是关键词密度不够、设置不合理的话,网友容易对机器人产生厌烦的情绪。自定义回复仅限于针对新用户,如果有真人来回复的话,最好还是真人吧。
  四、综合互动型
  所谓“综合互动型”就是图文、语音、闯关、机器人加真人与网友互动等各种手段都用到的账号了…这种类型的帐号现在还比较少见(可能是小微孤陋寡闻哈),目前小微已知的也只有我们@微成都 在这么做。适时地精选图文信息推送给我们的网友,偶尔会有语言,小编忙的时候有小微机器人自动回复,编辑不忙的时候就会抽空上到公众平台看完大家所有的留言。有信息推送,有图文互动,有活动推荐,更重要的是有一颗真诚与网友沟通的心…。呃,自我表扬一下,“小微你辛苦了”…小微心声:“为大家服务!”
  来源:微成都官方博客投稿,作者:Aren,原文链接

2013年4月23日星期二

[转] mac上禁止 Apache 开机启动



因为要装 Nginx, 所以想禁止 Apache 在开机时自动启动。
网上给的较多的方法是:
系统偏好设置 -> 共享 -> 把 Web共享 取消就行了。

但这招对我好像不太管用。又不想把它卸掉,毕竟还要用它的 ab 之类的命令。所以只能想办法不让其自动启动 httpd,不要占用我的80端口。
我得到的一个可行方法是执行下面的命令:

$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

同理,要想开机启动 Nginx,也解决了:
将 org.apache.httpd.plist 文件重命名为 Nginx 的(如 nginx.plist)。改一下相应的命令,参数,等。然后:

$ sudo launchctl load -w /System/Library/LaunchDaemons/nginx.plist  

完毕。 

2013年4月22日星期一

[转] git 标签



内容提要:创建有签名,无签名、轻量级标签来永久的标记项目历史中的关键点

跟大多数的VCS工具一样,git也有在历史状态的关键点“贴标签”的功能--一般人们用这个功能来标记发布点(例如'v1.0')。这节课我们学习如何使用标签列表,创建新标签,以及在git中有哪些不同类别的标签。

列出git中现有标签

要想列出git中现有的所有标签,输入'git tag'命令运行即可:
$ git tag
v0.1
v1.3

这个列表是按照字母表顺序给出的,其实排名先后跟重要程度没有直接联系。
当然,你也可以按照特定表达式搜索某些标签。假如在一个git仓库中有超过240个标签,而你只想得到1.4.2序列的标签,那么你可以:
$ git tag -l v1.4.2.*
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4

创建标签
在git中有两种最主要的标签--轻量级标签(lightweight)和带注释的标签(annotated)。轻量级标签跟分枝一样,不会改变--它就是针对某个特定提交的指针。然而,带注释的标签是git仓库中的对象。它是一组校验和,包含标签名、email、日期,标签信息,GPG签名和验证。一般情况下,建议创建带注释的标签,这样就会保留这些信息,但是如果你只是需要临时性标签或者某些原因你不想在标签中附带上面说的这些信息,lightweight标签更合适些。
带注释的标签

在git中创建带注释的标签非常简单,在运行'tag'命令时加上-a就可以了。
$ git tag -a v1.4 -m 'version 1.4'
$ git tag
v0.1
v1.3
v1.4

'-m'指明标签信息,跟标签一起存储。如果你不使用-m指明标签信息,git会自动启动文本编辑器让你输入。
可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。
$ git show v1.4
tag v1.4
Tagger: Scott Chacon <schacon@gmail.com]] ]]> 
Date:   Mon Feb 9 14:45:11 2009 -0800
my version 1.4
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gmail.com]] ]]> 
Date:   Sun Feb 8 19:02:46 2009 -0800
    Merge branch 'experiment'

我们可以看到,在提交对象信息上面,列出了此标签的提交者和提交时间,以及相应的标签信息。
有签名的标签

如果你有GPG私钥的话,你也可以用GPG来给你的标签签名,把-a换成-s就可以了:
[master]$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Scott Chacon <schacon@gmail.com>"
1024-bit DSA key, ID F721C45A, created 2009-02-09

然后,如果你对某个标签运行'git show'的话,你就会看到你的GPG前面附加上去了。
[master]$ git show v1.5
tag v1.5
Tagger: Scott Chacon <schacon@gmail.com]] ]]> 
Date:   Mon Feb 9 15:22:20 2009 -0800
my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
=WryJ
-----END PGP SIGNATURE-----
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gmail.com]] ]]> 
Date:   Sun Feb 8 19:02:46 2009 -0800
    Merge branch 'experiment'

稍后,我们会介绍如何验证签名标签。
轻量级标签

轻量级标签实际上就是存在一个文件中的提交校验和--没有附加任何其他信息。创建轻量级标签的方法就是把上面'-a','-s','-m'这些选项都去掉。
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

如果现在对这个标签使用'git show'命令,不会看到像上面那种标签显示的那么多内容,仅仅显示这次提交的有关信息。
$ git show v1.4-lw
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gmail.com>
Date:   Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'

验证标签
使用'git tag -v (tag)'就可以验证一个签名标签了。这个命令会用到GPG来验证签名。前提是:你必须在密钥环中存放着签名者的公钥。
$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
GIT 1.4.2.1
Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
gpg:                 aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7  4A7D C0C6 D9A4 F311 9B9A
如果你没有这个公钥的话,你会看到这样的信息:
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'
后期贴标签

这种情况是说你想对以前的某次提交贴个标签,如果整个提交历史是这样的:
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

忘记在那个提交信息为'updated rakefile'的点上贴一个'v1.2'的标签了,我可以现在贴一个上去。你可以在执行创建标签的语句后面跟上那次提交的校验和(或者部分校验和)。
$ git tag -a v1.2 9fceb02
现在我们可以列出所有的标签:
$ git tag 
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gmail.com]] ]]> 
Date:   Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gmail.com]] ]]> 
Date:   Sun Apr 27 20:43:35 2008 -0700
    updated rakefile
...

共享标签

默认情况下,'git push'命令不会将标签上传到远程服务器上。为了共享这些标签,你必须在'git push'命令后明确添加-tags选项
[master]$ git push --tags
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
 * [new tag]         v0.1 -> v0.1
 * [new tag]         v1.2 -> v1.2
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw
 * [new tag]         v1.5 -> v1.5
现在,如果有人克隆或者在线同步你的git仓库的话,标签也会一并同步了。

2013年4月18日星期四

[转] vim 配置高亮显示当前行



vim 是我在Ubuntu下最喜欢用的编辑器(当然win下也有的)。通过对vimrc文件的修改,可以很好的配置vim,比如显示行号,语法高亮等。这里要说的是高亮显示当前行。
如果只是想在这一次使用vim是启用,只需要在正常模式下输入:set cursorline就好了。
要是想每一次打开vim都启用,就要在vimrc文件(ubuntu下位于/etc/vim/vimrc)里加入set cursorline这一句。
如果想修改高亮的颜色,可以在vimrc中加入这两句


hi CursorLine   cterm=NONE ctermbg=darkred ctermfg=white guibg=darkred guifg=white
hi CursorColumn cterm=NONE ctermbg=darkred ctermfg=white guibg=darkred guifg=white

可以把 darkred,white 等换成你喜欢的颜色。其中 guibg 和 guifg 修改的是下划线的颜色;ctermbg 和 ctermfg 修改的是背景的颜色,可以删去,仅保留下划线。

另附上vim官网关于高亮显示当前行的 tip

2013年4月17日星期三

[分享] Linux/Unix 下 bash shell 实现 c shell 的智能历史命令搜索

喜欢命令行工作模式的同学,常常会遇到一个场景: 在历史命令中搜索一个曾经执行的命令.最近几条命令我们可通过向上的光标轻松的翻到,稍久远一点的怎么办呢?

大师级的用户会很快给出一个方案: bash shell 环境下可以通过 ctrl + r 的组合键来搜索一个历史命令.比如想找一下历史中编辑过几个文件,可以先键入 vi 后再按下组合键来不断查找.此法够吊了.

用过 FreeBSD 的同学一定会发现,管理员默认的 c shell 有上历史命令搜索功能非常贴心.比如在键入 v 之年,再先向上的光标键翻阅时,发现它会自动匹配历史已 v 打头的命令,同时还支持不断向上查.这样只要对历史的一个操作的第一个字母有印象,就可以很轻松的找到它,当然了,前提上历史命令确实保存了它^_*.

工作中,遇到的更多的是比较流行的bash shell,连 Mac 默认的也是它.好在办法总是有的.

$ curl "https://raw.github.com/hy0kl/profile/master/.inputrc" >> ~/.inputrc

立刻生效!

有图有真相,请注意光标的位置:


2013年4月16日星期二

[分享] vi 实现高亮 C 语言常用 API

vi 是 Uninx 哲学的代表,可配置,可扩展,小巧灵活,将本职做到极致.
vi 的默认配置通常放在 /usr/share/vim 下,如果想要定制个性化的设置,建议在自家的工作目录下覆盖系统的配置,尽量不要修改系统的东西.系统已经提供了良好的覆盖思想来满足不同的需求了.

vi 对 c 源文件有天然的支持,能高亮数据类型和关键字,但对于常用的函数并没有实现高亮,对常常编写c 程序的同学来说,并不十分友好.好在我们可定制可扩展.

$ mkdir -p  ~/.vim/syntax
$ cd  ~/.vim/syntax
$ curl "https://raw.github.com/hy0kl/profile/master/.vim/syntax/c.vim" > c.vim

没错,就这么简单,如此可实现高亮常见的 c 语言 API.当然,前提是打开了 .vimrc 中的 syntax on.
有图有真相.


2013年4月15日星期一

[总结] 将 VIM 打造成智能 IDE 之 php/python 代码自动补全


关键词: VIM IDE php python 代码补全

VIM 之美在于折腾.
在编辑模式下,按下 ctrl+p 或 ctrl+n 能实现代码自动补全.然此功能有个非常大的局限,补全的内容仅限于本文件出现过的,用来防止拼写错误还成,和 IDE 工具的代码自动补全不能同日而言.
常言道:工欲善其事,必先利其器.选择了神的编辑器,怎么能容忍工具如此功能不全,开发如此不智能呢?! OK,下面主要以 php, python 为例子来说明,怎么实现简单而有效的代码主动补全.

[php]
1. 在用户主目录下建立必要的目录
$ cd
$ mkdir -p .vim/tools/php

2. 在linux 下有个技巧可以快速生成 php 函数自动补全的词表文件,到 php 源码目录下,搜索 PHP_FUNCTION 或 ZEND_FUNCTION 关键字:
$ find ./php.5.3 -type f -name "*.h" -o -name "*.c" | xargs grep -E "PHP_FUNCTION|ZEND_FUNCTION" | sed -ie "s/.*_FUNCTION(//g;s/)//g" | sort | uniq > functions.txt

3. 将 functions.txt 放到 ~/.vim/tools/php 下

4. 修改 VIM 配置文件
$ ~/.vimrc  # 加入以下内容
set completeopt=longest,menu    " 设置代码提示为弹出层
function AddPHPFuncList()
    set dictionary-=~/.vim/tools/php/functions.txt dictionary+=~/.vim/tools/php/functions.txt
    set complete-=k complete+=k
endfunction
au FileType php call AddPHPFuncList()   " 告诉 VIM 以后缀名来识别文件类型,以进行函数自动补全.

这样在编辑文件时,按下 ctrl+n 实现向下选择提示词, ctrl+p 向上选择提示词.

[python]
1. 在用户主目录下建立必要的目录
$ cd
$ mkdir -p .vim/tools/python

2. 从 http://vim.sourceforge.net/scripts/script.php?script_id=850 下载文件包,并将里面的文件解压到 .vim/tools/python 下.

3. 修改 VIM 配置文件
$ ~/.vimrc  # 加入以下内容
function AddPythonFuncList()
    set dictionary-=~/.vim/tools/python/complete-dict dictionary+=~/.vim/tools/python/complete-dict
    set complete-=k complete+=k
endfunction
au FileType python call AddPythonFuncList()   " 告诉 VIM 以后缀名来识别文件类型,以进行函数自动补全.

如此便大功告成.
enjoy it.

有图为证:


[转] git 中二进制文件冲突



对于二进制文件的冲突,你肯定不想通过编辑二进制文件来解决冲突,那是不可能完成的事情。
你要做的就是:要么选择对方的修改,要么选择自己的修改。
你可以用 git checkout 的 --theirs  --ours 选项。

git pull
git checkout --theirs YOUR_BINARY_FILE
// git checkout --ours YOUR_BINARY_FILE
git add YOUR_BINARY_FILE
git commit -m 'merged with the remote repos.'
git push

2013年4月14日星期日

php5.3 开始出现的 Function ereg() is deprecated Error 问题解决办法



PHP 5.3 ereg() 无法正常使用,提示“Function ereg() is deprecated Error”。问题根源是php中有两种正则表示方法,一个是posix,一个是perl,php6打算废除posix的正则表示方法所以后来就加了个preg_match。此问题解决办法很简单,在ereg前加个过滤提示信息符号即可:把ereg()变成@ereg()。这样屏蔽了提示信息,但根本问题还是没有解决,php在5.2版本以前ereg都使用正常,在5.3以后,就要用preg_match来代替ereg。所以就需要变成这样,原来:ereg(“^[0-9]*$”,$page)变成:preg_match(“/^[0-9]*$/”,$page)特别提醒:posix与perl的很明显的表达区别就是是否加斜杠,所以与ereg相比,后者在正则的前后分别增加了两个”/”符号,不能缺少。

Tips:此问题在php5.2之前版本不会出现。

2013年4月12日星期五

[转] yii 获取当前 url 和域名

mark
http://lxy.me/the-yii-access-to-the-current-url-and-domain-name.html
<?php 
//当前域名 
echo Yii::app()->request->hostInfo;

//除域名外的URL 

echo Yii::app()->request->getUrl(); 

//除域名外的首页地址 

echo Yii::app()->user->returnUrl

//除域名外的根目录地址 

echo Yii::app()->homeUrl
?>

git 常见操作出错及解决方法汇总(持继更新,欢迎投稿)


1. Q: git push 
error: refusing to update checked out branch: refs/heads/master
A: You can simply convert your remote repository to bare repository ( There is no working copy in the bare repository - the folder contains only the actual repository data ) .

Execute following command in your remote repository folder:

git config --bool core.bare true
Then delete all the files except .git in that folder. and then you will be able to perform git push to the remote repository without any errors.

2. Q: Git Tip: git push  'No refs in common and none specified'
Git is a source-control tool used by software developers.
A: $ git push origin master

2013年4月11日星期四

[分享] Mac 的一些常用快捷键



到(Go To)
Control-F2 到菜单
Control-F3 到Dock

切换(Switch)
Command-Tab 在程序间切换
Command-` 在程序中的窗口间切换

窗口(Window)
Command-H 隐藏
Command-M 最小化
Command-N 新建
Command-O 打开
Command-P 打印
Command-Q 退出
Command-W 关闭
F9 显示所有程序打开的窗口
F10 显示当前打开的窗口
F11 隐藏所有窗口并显示桌面

文件(File)
Command-S 保存
Command-Shift-S 另存为
Command-Shift-N 新建文件夹
Command-I 简介
Command-Option-I 显示多个项目的简介

移动(Move)
Home 移动到文件开头
End 移动到文件结尾
Command-← 移动到行首
Command-→ 移动到行尾
Option-← 向左移动一个单词
Option-← 向右移动一个单词

选择(Select)
Shift-Home 选择到文件开头
Shift-End 选择到文件结尾
Shift-Command-← 选择到行首
Shift-Command-→ 选择到行尾
Shift-Option-← 向左选择一个单词
Shift-Option-← 向右选择一个单词

编辑(Edit)
Fn-Backspace 删除光标后的字符
Command-Delete 删除
Command-Delete-Shift 清空垃圾桶
Command-Shift-A 转到应用程序目录
Command-Shift-C 转到COMPUTER目录
Command-Shift-H 转到HOME目录
Command-Shift-B 通过蓝牙传送文件

屏幕(Screen)
Control-Shift-Eject 屏幕休眠
Command-Shift-3 截取整个屏幕
Command-Shift-4 截取指定区域
Command-Option– 缩小
Command-Option-= 放大
Command-Option-Control-8 将屏幕从“白底黑字” 切换成 “黑底白字”
Command-Option-Ctrl-> 提高对比度
Command-Option-Ctrl-< 降低对比度

系统(System)
Command-Option-Escape 强制退出程序
Command-Option-Eject 睡眠
Command-Control-Eject 关闭所有程序并重新启动
Command-Space 切换语言
Command-esc Front Row
Command-? 获得帮助
Command-F5 打开/关闭VoiceOver(朗读菜单、按钮等)

音量(Volume)
Shift-volume 调整音量但不发出提示音
Option-volume 打开“声音”的“系统预置”
Shift-Option-volume 微调音量(原有的16格调节细化为64格)

其它(Others)
Command-Shift-Y 用当前选中的文字生成便签


全局快捷键
Cmd-C 复制文件
Cmd-V 粘贴文件
Option-拖动 复制文件到新地址
Cmd-拖动 移动并自动对齐
Cmd-Delete 删除
Cmd-Option-拖动 做替身(快捷方式)
Cmd-Shift-Delete 清空垃圾桶
Cmd-Shift-Option-Delete 强制清空垃圾桶
Tab 选定下一个项目
Shift-Tab 选定上一个项目
Return 执行默认动作
Escape 关闭对话框
Page Up 向上翻页
向上 箭头 选取上一个文件
Page Down 向下翻页
向下 箭头 选取下一个文件
Cmd-Shift-G 打开’前往文件夹’对话框
Cmd-句号 [.] 关闭对话框

Exposé 和系统的快捷
F8 切换Space
Shift-F8 慢速切换Space
F9(默认设置) 使用 Exposé 显示所有打开的窗口
F10(默认设置) 使用 Exposé 在某个应用程序中显示所有打开的窗口
F11(默认设置) 使用 Exposé 隐藏所有打开的窗口并显示桌面
Cmd-H 隐藏程序
Cmd-Option-H 隐藏其他程序
Cmd-Q 退出程序
Cmd-Shift-Q 退出所有程序并且注销用户
Cmd-Option-Shift-Q 强制注销用户
Cmd-Tab 切换到下一个应用程序
Cmd-Shift-Tab 切换到上一个应用程序
Cmd-拖动 整理菜单栏
按下 Option 键并点按一个窗口 切换窗口并隐藏当前窗口
按住 Option 并点按 Dock 图标 切换到另一个应用程序并隐藏当前应用程序
按下 Control 键并点按该项 查看某个项的快捷(上下文)菜单
将光标移到该词上面,然后按 Cmd-Control-D 使用 Dictionary 查看对字词在应用程序中的定义

停止响应
Cmd-句号 [.] 停止进程
Cmd-Option-Escape 打开’强制退出’
电源键 关机
Cmd-Option-Shift-电源键 强制关机或重新启动(在某些电脑上)
Cmd-Control-电源键 强制重启

Finder
Cmd-点击 标题 查看当前窗口的路径
Cmd-双击 (文件夹上) 新窗口中打开文件夹
Option-双击 (文件夹上) 新窗口中打开文件夹并关闭当前窗口
Cmd-1 用图标浏览
Cmd-2 用列表浏览
Cmd-Option-向右 箭头 列表模式下显示包含的目录
向左 箭头 列表模式下关闭选定目录
Cmd-向下 箭头 在图标或列表模式下打开选定目录
Cmd-Option-向下 箭头 在图标或列表模式下在新窗口打开选定目录并关闭当前窗口
Cmd-Shift-Option-向下 箭头 (慢速)在图标或列表模式下在新窗口打开选定目录并关闭当前窗口
Cmd-向上 箭头 打开上一级目录
Cmd-Option-向上 箭头 打开上一级目录并关闭当前目录
Cmd-3 用分栏浏览
Cmd-4 用cover flow浏览
Cmd-Y 打开快速查看
Cmd-Option-Y 用幻灯片显示
Cmd-Shift-H 打开用户文件夹
Cmd-Option-Shift-向上 箭头 聚焦桌面
Cmd-Shift-I 打开iDisk
Cmd-Shift-D 打开桌面
Cmd-Shift-C 打开’电脑’
Cmd-Shift-K 打开网络
Cmd-Shift-A 打开应用程序
双击 标题 最小化窗口
Cmd-M 最小化窗口
Option-点击 按钮 应用到所有激活的窗口
按下并按住滚动条 快速浏览长文稿
按住 Option 键并点按滚动条 迅速在“滚动到当前位置”和“滚动到页面”之间切换
Cmd-波浪符号 (~) 激活当前应用程序中的上一个或下一个窗口

Dock
拖动 分割线 自定义Dock大小
Option-拖动 分割线 调整Dock到合适大小
Control-点击 显示Dock快捷菜单
Control-点击图标 显示项目的快捷菜单
Cmd-点击 打开图标所在文件夹
Option-点击 切换并隐藏当前程序
Cmd-Option-点击 切换并隐藏所有程序
Cmd-Option-拖动 强制程序打开文件
Cmd-Option-D 显示/隐藏Dock

启动
*快捷键只能在启动时使用
当您看到进程指示器(看起来像旋转的齿轮)时,请按住左边的 Shift 键。 防止自动登录
听到启动音之后立即按住 Shift 键,然后当您看到进程指示器(看起来像旋转的齿轮)时释放该键。 以安全模式启动(只
有必要的 Mac OS X 项被启动, 一些功能和应用程序可能无法正常工作。)
在登录屏幕上点按“登录”按钮之后,请按住 Shift 键。 防止登录时打开“登录项”和 Finder 窗口
C 从光盘启动
N 从默认的 NetBoot 磁盘映像启动
T 以目标磁盘模式启动
Option 选择启动磁盘(在某些电脑上)
Cmd-X 使用 Mac OS X 而不是 Mac OS 9 来进行启动(如果两者均位于同一宗卷上)
按住鼠标键 推出可去掉的光盘
Cmd-Option-P-R 还原参数 RAM
Cmd-V 显示详细的状态信息(详细模式)
Cmd-S 以单一用户模式启动

Safari
Cmd-Option-F google搜索栏
Option-向上 箭头 向上翻页
Option-向下 箭头 向下翻页
Cmd-点击 链接 在后台用新标签打开
Cmd-Shift-点击 链接 打开并激活新标签
Cmd-Option-点击 链接 打开新窗口
Option-点击 Close 按钮 关闭其他标签
Cmd-Shift-] 选取下一个标签
Cmd-Shift-[ 选取上一个标签
Cmd-Shift-H 打开主页
Cmd-Shift-K 切换’禁止弹出窗口'
Cmd-Option-E 清空缓存
Cmd-Option-R 不用缓存并刷新页面
Cmd-F 查找
Cmd-M 最小化窗口
Shift-点击 按钮 慢动作动画效果
Cmd-加号[+] 增大字体
Cmd-减号[-] 减小字体
Cmd-0 默认字体

Dashboard
使用这些快捷来处理 Dashboard 和 Dashboard widget。
F12(默认设置) 显示或隐藏 Dashboard
Cmd-R 重新载入当前 widget
Cmd-等号 (=) 显示或隐藏 widget 栏
Cmd-向左箭头键,Cmd-向右箭头键 滚动 widget 栏
注:要更改 Dashboard 的快捷,请选取“文件”>“系统偏好设置”,点按“Exposé Spaces”,然后点按“Exposé”。

Front Row
您可以使用键盘来控制 Front Row 而无需使用 Apple Remote 遥控器。
Cmd-Esc (Escape) 打开 Front Row
Cmd-Esc 或 Esc 从打开的菜单中关闭 Front Row
向上箭头键,向下箭头键 浏览菜单和列表
Cmd-Esc 或 Esc 返回上一级菜单
空格键或 Return 选择菜单或列表中的项
空格键或 Return 播放和暂停音频或视频
向上箭头键,向下箭头键 更改音量
向右箭头键,向左箭头键 前往下一个或上一个歌曲或照片
向右箭头键,向左箭头键 前往所播放 DVD 的下一章或上一章
右箭头键,左箭头键(按住按钮) 快进或倒回歌曲、视频或 DVD
在某些 Apple 键盘和便携式电脑上,您或许也可以使用特定按键来更改音量和控制回放。

键盘导航
Control-F1 打开/关闭全键盘控制
Control-F2 聚焦菜单栏
Control-F3 聚焦Dock
Control-F4 聚焦活跃窗口或下一个窗口
Control-F5 聚焦窗口工具栏
Control-F6 聚焦浮动窗口
Control-F7 在控制或文本框与列表之间移动
Control-F8 聚焦菜单栏中的状态菜单
Cmd-Accent [`] 聚焦活跃应用程序的下一个窗口
Cmd-Shift-Accent [`] 聚焦活跃应用程序的上一个窗口
Cmd-Option-Accent [`] 聚焦窗口抽屉

Cmd-Option-T 显示或隐藏字符调板
 Mac的键盘没有Home, End, Page UP, Page DOWN这几个键?但可以通过用Fn键来组合得到同样的功能:
Home键 = Fn+左方向
End键    = Fn+右方向
PageUP = Fn+上方向
PageDOWN = Fn+下方向
向前Delete = Fn+delete键

[转] Mac OS X 下的截屏功能和使用技巧


Mac OS X下的截屏功能和使用技巧


  在Mac OS X下有很强大的截屏功能,它不仅仅是对屏幕的全屏COPY,而是包括很多细节在里面,
就从这点来看,已经比过所有版本的Windows了。

  下面我来向大家详细介绍一下:

  对全屏的截图我们可以通过按 苹果键(花键)+Shift键+3来执行,之后伴随着清脆的一声提示音后,
在桌面上就会生成一个图片文件,这就是刚刚截屏的图片了,默认文件类型是PNG的。

  自定义截屏是很方便的一个功能,是可以通过按 苹果键(花键)+ Shift键 + 4来执行,
当执行组合按键之后鼠标指针的光标会变成十字,现在你就可以画出你想要截取屏幕的范围了,
画好后截出的图片也会放在桌面上。另外,如果在按 苹果键(花键)+Shift键+4后按下 空格键,
鼠标指针就会变成一个小照相机,这时是截取对象方式的截屏,把小照相机放在你想截图的窗口上
按鼠标左键后就执行了对该窗口的截屏,很方便吧,
还有一个用法就是苹果键(花键)+Shift键 再+Ctrl键 +4,
这样截出的文件就放入系统的剪贴板了,不会生成文件出来,在做文档时直接粘贴就很方便了。

  因为苹果系统默认的截屏生成的文件类型是PNG的,可能大家通常都是在用JPG,所以不太方便,
那么我教大家一个方法来改变截屏生成文件的类型。

  我们运行[应用程序]中的[实用工具]里的Terminal,之后按自己所需执行以下命令:

  默认为jpg:

  defaults write com.apple.screencapture type jpg

  默认为PDF:

  defaults write com.apple.screencapture type pdf

  默认为gif:

  defaults write com.apple.screencapture type gif

  默认为png:

  defaults write com.apple.screencapture type png

  这样以后使用起来就更方便了。

2013年4月10日星期三

已编译 php 的情况下,动态添加扩展

以 ftp 为例.

现在已经在跑生产环境了,编译 php 时没有加载 ftp 扩展,有什么方法么能不在重新编译的情况下解决么?
答案是: 当然有.

假设 php 安装到 /usr/local/php5

# cd /usr/local/src/php-5.*/ext/ftp # 进入对应版本源码目录的相应扩展模块文件夹
# /usr/local/php5/bin/phpize # 进入编译好的php相关目录,调用 phpize 程序生成编译配置文件
# ./configure --with-php-config=/usr/local/php5/bin/php-config # 注意 php-config 文件要存在,否则会报错
# make

参考以下方法挂载扩展:
1. 把生成的 modules/ftp.so 复制到 php.ini 中 extension_dir 指定的目录
然后 php.ini 加上
extension = ftp.so
2. make 完成后紧接着执行
# make install

视 php 的工作模式重启 web 服务器或 php-cig 服务,完成扩展模块安装.

2013年4月9日星期二

日记一则

2012.06.01 星期五 多云
忙活了近兩个月的悲崔项目 cui 终于全部上线,一路跌跌撞撞,走得甚是辛苦.上线后 PM 陆继报一些样式方面的问题,无论如此,已经上线,算是对兩个月的劳动成果有一个交代.
项目上线了,不代表工作结束了.大型项目,更需要系统总结一下.我不知道别的同事会不会,或者有没有时间,或者有没有想法,来总结,反正我觉得非常有必要我自己先来一番:
简述: 和百度大搜索合作的阿拉丁导流项目,我开发的服务主要响应用户检索对音乐的需求,返回生成好的 HTML 或 XML 代码片段供百度结果在渲染页面时使用.由于百度的海量检索请求,他们要求我们的服务峰值能力达到 500q/s.我们交付上线的服务经 QA 同学压力测试,得出的性能指标为: 单机极限压力 1000q/s 时 CPU idle 在 50% 左右,基本上无法正常提供服务; 800q/s 时 CPU idle 80% 左右,服务能力正常.上线后在用户高峰时段,查看实时并发,大搜索真正过来的并发为 50q/s 左右. cui 从性能方面讲,无疑远超预期.

1. 项目名称.
项目名字一定要启好,哪怕不能响当当,不能惊心动魄,但绝不能再叫做 cui,明摆要成为一个悲崔的代表.否则,各种灵异现象,各种闻所末闻,见所末见的悲崔会不断给你带来意外的收获,不停的放大你发现问题,定位问题,解决问题的能力.

2. 技术选型.
很重要.一直在讲,没有最好的技术,只有更适合的场景.最开始,我们考虑要不要用 php 来实现,后来了解到大搜索那边使用的是 nshead + mc_pack 方式的网络通信,归根结底是 socket 通信,考虑到 php  的性能问题,以及以它来实现网络编程的不稳定性,我们最终选择了 C.后来的事实证明,我们当时的决择是英明的.如果当时采用 php 或 Python,八成要在性能那块卡死,那真要悲崔到底了.

3. 指针与内存.
C 语言玩的是指针,玩的是内存的分配与使用.第一版实现中,为了图快捷, cui 大量的栈上开辟临时缓冲区,几十K或几百K的开,高并发下常出现堆栈空间不足,不出 core 而服务自动退出,甚是郁闷.后继的优化中,我将能在堆上申请的内存全部放到初始化时从堆上开辟了.我们知道 malloc 系统调用是非常消耗资源的,应尽可能减少动态内存分配.所以通常我们的做法是初始化的时候一次 malloc 足够多的内存 pool,放着慢慢用. 实践证明,cui 的优化过程就是一个活生生的教科书式的案例.通过将临时缓存区放到线程空间,在程序启动的初始过程,为它他申请好足够的内存,一次 malloc 调用,重复利用,效果相当明显.nginx 大量使用了内存池技术, python 内存大户,也从侧面反映了其内存分配与管理的思想.相比之下 php 在内存使用方面受自身架构的影响,在一定程度制约了其性能.

4. 初始化的学问.
我们曾有多个项目遭遇过 memset 的性能问题.大块内存使用它来清 0 时候会耗用超乎想象的时间.大量的实战表明,对于字符型缓存区,如果已经确认对它进行操作的 API 会自行加 ’\0’,那没有必要全部清 0,初始化的时候仅清 0 首字节就可以了.对于数组型的大块内存,给它一个记数器,标记每次处理时使用多少个 item,初始化时也不用每次都整块内存清 0 了,仅清 0 必须的成员.读的时候判断一下记数器,万事大吉.

5. 超时.
再 NB 的后端服务也得设置合适的超时时间.在酷讯时候,有一次太自信后端服务了,将超时设置为永不超时,刚上线感觉良好,片刻之后,后端服务跨掉了.大搜索只给了 200 毫秒供我们处理一次用户请求,起先联调时发现丢包现象严重.联合排查后发现是由于响应用户请求时间过长,大量超过时的链接,大搜索认为 cui 服务不可用,主动关闭了链接.经过地毯式的排查,确定主要有兩个因素引起了处理时间过长:1).API 使用不正确,错误的将连接,读和写的超时设置成近乎永不超时;2) cui 和它的后端数据服务之间的超时也设置不当,造成了甚至花了 900 多毫秒才处理完一个请求的情况.这对于一个需要应对高并发的服务来讲简直是笑谈.再次敲响了超时不当的警钟:只要用网络交互,一定要设置适当的超时.

6. cache.
cache 绝对是高性能的必杀器,无论前端后端,加一层 cache,性能提升立竿见影. cui 最初设计的时候没有 cache 层,几轮压力测试下来发现,如果不加缓存想要扛到 500q/s 相当的吃力.后继的优化过程中加入 cache 机制,效果非常理想.拖延近一周的时间,全部精力都在寻找丢包与性能提升上面.虽然最终确定丢包一个非常重要的原因是由虚拟机本身造成的,但优化过程对服务的稳定性给予了有力的支持.

7. check list.
我觉得项目最大的败笔就是没有建立良好的 check list.原因很简单,大家都很忙.从一开始,我们的很多需求,策略,注意事项等等,都散列在各种各样的文档,以及讨论区中,从来没有人提出整理,或主动整理出供大家参考,抑或使用项目 WIKI 这样工具来大家协同工作,共同维护 check list.如此,上线了, PM 们开始陆继发现问题了.缀使 QA 同学再怎么给力捉虫,线上问题也无力回天.于是乎各种紧急修复,紧急流程纷纷上演.紧急流程通常是一个个悲剧的续幕,而更为悲崔的是,一个悲剧总会引发一连串的悲剧,蝴蝶效应真实上映,却没有彩排的机会.

项目总会有,成长是关键.

彩色版的 svn diff

git 的 diff 加个配置文件可以非常爽的实现彩色化,让查看一了然,而 svn 在命令行下貌似一直没有找到合适的工具.据说写 hook 可以搞定.还好用户的需求才是真的需求,有需求自然会有方案去满足.一个小工具,解决每次都通过将 svn diff 的内容输送给 vim 来查看的麻烦. 

首先,我们需要安装 ColorDiff 这个小工具.
官方网站:http://colordiff.sourceforge.net
http://www.colordiff.org/
下载源码:
wget http://colordiff.sourceforge.net/colordiff-1.0.9.tar.gz

wget http://www.colordiff.org/colordiff-1.0.13.tar.gz

把里面的文件解压到 ~/local/colordiff 下.
然后在 ~/.bashrc 中加入以下内容:

colordiff="~/local/colordiff/colordiff.pl"
alias cdiff=$colordiff
alias svn-gm='svn stat | grep "^M"'
alias svn-log='svn update && svn log | less -R'

function _svn_diff()
{
    argc=$#

    if ((argc > 0))
    then
        svn diff $* | cdiff | less -R
    else
        svn diff | cdiff | less -R
   fi
}

alias svn-diff=_svn_diff

[转] 如何查看 nginx,apache,mysql,php 的编译参数

版权声明:转载时请以超链接形式标明文章原始出处和作者信息 Nginx中文站
本文链接: http://www.nginx.cn/762.html


/usr/local 为 nginx apache mysql php 的安装目录

1、查看nginx编译参数:
/usr/local/nginx/sbin/nginx -V

2、查看apache编译参数:
cat /usr/local/apache/build/config.nice

3、查看php编译参数:
/usr/local/php/bin/php -i | grep configure

4、查看mysql编译参数:
cat /usr/local/mysql/bin/mysqlbug | grep CONFIGURE_LINE


2013年4月8日星期一

[共享] linu/unix 命令行小技巧


注: 内容来自平时收集和同事贡献.


1. du -s * | sort -nr | head -n 5
du *, 是对要统计的目录下的所有当前目录的文件和文件夹进行统计,而对文件夹中的文件夹不再统计; du -s,则会统计.

2. 统计网络状态
netstat -nta | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

3.过滤掉配置文件中的注释行
sed -i -e '/^#/d' httpd.conf
sed -i.bak -e '/^#/d' httpd.conf   #过滤指定文件同时备份文件
grep -v "^ *#"   #注意,中间有个空格, 则不起作用的.
cat /usr/local/etc/apache22/httpd.conf | grep -v \# | sed '/^\s*$/d'

4.vi 中查找替换
:%s/abc/789/gc
每次遇到 abc 都会交互下,是否需要替换.

5. vi recording 命令使用
例子: 想往文件开头加 "",尾部加 "",执行以下命令:
:qa1G0iG%aq
(q 开始到最后 q 结束,第一个 a 是记录到保存名字为 a 的变量之中, G$ 是到文件 最后一行, 0i 是开始处加入, G$ 是到文件 最后一行,第二个 a 是要往最后一行的后面写)以后进入任何一个文件都可以直接按 @a 完成上面的功能.

6. Q: A, B 两文件列表,如何找出只在 A 列表出现过的行?
A: sort -T ~/tmp/ A B B | uniq -u > result.list

7. Q: 怎样递归替换目录下所有文件中的字符串?
A: 预览: foo => bar
sed -e 's/foo/bar/g' `grep 'foo' * -R|`
确认修改:
set -i 's/foo/bar/g' `grep 'foo' * -R|`

8. 如何使用sar命名查看linux系统状态?
$ sar       CPU利用率情况
$ sar –q    看平均负载
$ sar –d    看磁盘访问情况

9. 有时候磁盘空间满了,该如何查找哪个文件夹比较大
可以使用如下命令找到占空间最多的几个文件夹
du -sh * | sort -nr | head -n 5

10. 怎样查看处在各种状态下的TCP连接数,以便分析服务是否正常   
使用如下命令,可以按照连接状态分别统计出来
netstat -nta | awk '/^tcp/{++S[$NF]} END {for(a in S) print a,S[a]}'
如果要单独查看某个服务,则用端口号过滤一下,例如:
netstat -nta | grep 21221 | awk '/^tcp/{++S[$NF]} END {for(a in S) print a,S[a]}'

11. 创建alias,快捷的ssh到一台机器上
修改~/.bashrc文件,添加如下两行
_go(){ ssh -A username@192.168.0.$1; }
alias go=_go
这样一来,原本需要ssh -A username@192.168.0.154 现在只需要改用go 154即可,快很多吧!

12. 正则表达式高级技巧:
预查及负向预查
有时候我们希望在文本中匹配一段字符串A,但是要求这段字符串的前面(或者后面)必须出现(或者不能出现)字符串B,就需要用到预查,
预查分为正向预查、反向预查;负向预查分为负正向预查和负反向预查。
这四种预查的语法分别是:
A(?=B)     匹配A,要求A后面必须出现B
(?<=B)A   匹配A,要求A前面必须出现B
A(?!B)      匹配A,要求A后面不能出现B
(?匹配
A,要求A前面不能出现B

13. 如何查找N天没有被修改过的文件?
下面这条命令会列出在当前目录下最近128天没有被修改过的文件
$ find . -mtime +128
如果想删除,
cd dest-dir && find ./ -type f -mtime +128 -exec rm {} \;

14. Nginx如何平滑重启?
比如pid文件位于/usr/local/nginx/nginx.pid 运行sudo kill CHUP `cat /usr/local/nginx/nginx.pid`这条即可
这样修改了配置文件,不用杀死nginx进程,也可以让配置文件生效

15. nginx如何防止网站被过度抓取?
配置如下:
limit_zone zone $binary_remote_addr 10m;   //定义一个存放会话信息的区块
limit_conn zone 10;                        #限制一个IP并发连接数为10
imit_rate 20k;                             #限制带宽

16. Nginx如何打开长连接?
打开长连接,可以有效节省带宽,降低压力,web servernginx的情况下,配置文件设置添加keepalive_timeout 60;
即可打开长连接,时间为60秒,根据需要,可以增大或调小这个时间。keepalive_timeout 0;则关闭长连接

17. 如何对最近N天没有被修改过的log文件存档?
我们的log文件好多都是一天一个文件,经常看的估计就是最近两三天的,
那么对N天前的log文件存档(压缩),是有必要的.
find ./ -type f -mtime +30 | xargs tar -cvf ./`date +%Y%m%d`.tar
这个是命令是查找当前目录下最近30天没有被修改过的文件并在当前目录下创建一个格式
YYYYMMDD.tar的归档文件.

18. 最简便的清空 memcache 的方法?
如果要清空memcacheitems,常用的办法是什么?杀掉重启?如果有nmemcache需要重启怎么办?挨个做一遍?
很简单,假设memcached运行在本地的11211端口,那么跑一下命令行:
$ sudo echo "flush_all" | nc 192.168.0.168 11211
注:flush并不会将items删除,只是将所有的items标记为expired

19. 如何快速的把一个unix时间戳转换为普通时间?
使用date -d@ 后接unix时间戳
$ date -d@1271397015 # debian Linux GNU/Linux
$ date -r 1271397015 # Mac OS/BSD
Fri Apr 16 13:50:15 CST 2010

20. 如何在vim中删除空行?
刪除沒有內容的空行
:g/^$/d
刪除包含有空格組成的空行
:g/^\s*$/d
除以空格或tab開頭到結尾的空行
:g/^[ |\t]*$/d

21. 如何粘贴后自动整理代码,省去 = 对齐代码的重复操作?
]p

22. 快速清空文件
$ : > data.file
: 只适用于正规文件,不能是管道,符号链接,和某些特殊文件.

23. {} 的扩展作用
$ cp file22.{txt,backup}
拷贝 file22.txt file22.backup .
: {} 中不能不允许空白,除非这个空白是有意义的.

25. 取昨天的时间
$ date -d"yesterday" +%Y%m%d

26. 可以使用一下命令查使用内存最多的5个进程
ps -aux | sort -k4nr | head  -n 5
或者: top F n

27. 可以使用一下命令查使用CPU最多的5个进程
ps -aux | sort -k3nr | head -n 5

28. Linux删除乱码文件
当文件名为乱码的时候,无法通过键盘输入文件名,所以在终端下就不能直接利用rmmv等命令管理文件了。
但是我们知道每个文件都有一个i节点号,我们可以考虑通过i节点号来管理文件。首先,我们要取得文件的i节点号。这个可以通过ls命令的-i选项获得得,也可以通过ll -i 来获得。
第二步,使用find命令将文件名传递给rm命令。e.g:删除节点为12345的乱码文件夹可以使用如下命令
find ./ -inum 12345 -print -exec rm {} \;
注意\;前面的空格不能少,少了就会报错。

29. svn  diff 的几个有用的操作
  1). 比较工作副本和版本库
如果传递一个 --revision (-r) 参数,你的工作副本会与版本库中的指定版本比较:
$ svn diff -r 3 rules.txt
  2).如果通过 --revision (-r) 传递两个通过冒号分开的版本号,这两个版本会直接比较:
$ svn diff -r 2:3 rules.txt
A more convenient way of comparing one revision to the previous revision is to use the --change (-c) option:
$ svn diff -c 3 rules.txt
  3). 即使在本机没有工作副本,还是可以比较版本库的修订版本,只需要在命令行中输入合适的URL
$ svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt

30. Linux 下安全的去重排序
$ sort -uf input

31. diff 制作 patch .
% diff -ru original newfile > patch.package

32. MySQL 导出查询数据
% mysql -h127.0.0.1 -uroot -p3006 --default-character-set="utf8" 数据库名 < select.sql > result

33. 如何查看Linux操作系统的位数
   (1).编程实现:
在程序中返回sizeof(int)的值,返回的结果是操作系统的字节数。若返回4则是32位操作系统,返回8即是64位。
    (2).getconf命令:
getconf命令可以获取系统的基本配置信息,比如操作系统位数,内存大小,磁盘大小等。
例如:
getconf LONG_BIT

34. Ubuntu 删除旧内核
$ sudo aptitude purge ~ilinux-image-.*\(\!`uname -r`\)

35. SVN 只提交空目录
$ svn add --depth=empty dir

36. 查看文件数目
find . -type f | wc -l

37. 彩色 man 显示
.bashrc中加入如下代码:
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'

38. vim中删除每行行尾的空格
:% s/\s\+$//g

39. iconv 转码失败?!
-c 参数即可.
iconv -c -f "utf-8" -t "gbk" utf-8.file -o gbk.file

40.  iconv 转化编码是忽略出错内容
iconv    用于字符编码转化:
官方用法: iconv(“gb2312”, "UTF-8", "测试语句");
在实际操作中,需要(最好)在第二个参数后面加上“//IGNORE”,即
iconv("gb2312", "UTF-8//IGNORE", "测试语句");
这个参数的意思是当转化过程中如果出错,那么就跳过错误,而不是默认的停在那里。
命令行中的用法是:
iconv -f gbk -t utf-8//IGNORE from_file.txt -o new_format_file.txt

41. 不解压缩直接查看*.gz*.bz2命令
FreeBSD会把老的系统日志打包压缩存放,减少了磁盘空间占用。原来以为解压缩后才能查看日志内容,其实不然,使用zcat可以查看*.gz文件内容,使用bzcat可以直接查看*.bz2文件,很方便!

42. vi 中将空格替换成换行:%s/ \+/\r/g

43. vi中查找精确匹配或完全匹配
假设要查找的内容为abc, 要求精确匹配,则: /\
即用 \<\> 将内容包起来,再如精确匹配www: /\
前匹配和后匹配.可以从上面的做法推导出来.


44. 取当前时间的 unix 时间戳
$ date +%s

一个逗号引发的血案


一个 C 模块,单模块压力没有出任何问题,链系统一压力,稳定复现不出 core 挂掉.
挂在 gdb 下压力后发现挂掉时的一条信息: Program received signal SIGPIPE, Broken pipe.
谷歌了一番,发现是 SIGPIPE 信号没有屏蔽掉.反复查看代码, main 函数有 signalsetup(); 一行,显示有屏蔽函数,可总是无法忽略 kill -SIGPIPE .怀疑原来的屏蔽方法有问题,又从网上找了段大家一致认为靠谱的方法:

    struct sigaction sa;
    
sa.sa_handler SIG_IGN;//设定接受到指定信号后的动作为忽略
    
sa.sa_flags   0;
    if (
sigemptyset(&sa.sa_mask) == -||   //初始化信号集为空
            
sigaction(SIGPIPE, &sa0) == -1)
    {   
//屏蔽SIGPIPE信号
        
fprintf(stderr"failed to ignore SIGPIPE; sigaction\n");
        exit(
EXIT_FAILURE);
    }



结果也不行.于是把代码单独拿出来编译来执行,却发现可以实现信号屏蔽.
求助同事,他建议将屏蔽信号函数的调用往后放置,排除非一些初始化操作的干扰.将 signalsetup(); 这一行后置编译时发现语法错误,编译不过,原来错将一个 ; 打做 ,了:

400     pthread_t *pt_server_core, pt_server_run,
401
402     signalsetup();

就这样,一个逗号让我折腾了大半天,引发一场惨烈的血案,血的教训.
编译器版本: gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)
据朋友说,新版本的 gcc 能检测到如此低级的错误.我用老版本在编译时却没有给出相应的警告.

2013年4月6日星期六

FF 和 IE 上传 jpeg 图片的小注意点

在做一个上传缩略图的小脚本时遇到了一个非常奇怪的问题:同样的一段代码,在用 FF 浏览器上传的时候能够成功执行,但在 IE 下却总是无法执行.于是乎拿过来以前写的测试脚本在 IE 下测试.因为之前在 FF 下测试过,所以发现了两个浏览器在处理上传文件时的一点小小的不同.

简单的测试脚本如下:

<FORM METHOD=POST enctype="multipart/form-data" ACTION="">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="100000">
<INPUT TYPE="file" name="smallpic" size="30">
<INPUT TYPE="submit" value='提交'>
</FORM>
<?php
if($_POST)
{
----$smallpic = $_FILES['smallpic'];
----foreach($smallpic as $key => $value)
--- {
--------echo $key.' => '.$value.'<BR />';
--- }
}
?>

    当上传的图片是 jpg jpeg 的时候,两个浏览器会给出不同的 $_FILES['filename']['type'];
值: FF 是 "image/jpeg" ;而 IE 是 "image/pjpeg" ,所以程序要写得有弹性一点了.

老早之前遇到,最近又碰上了.

FreeBSD 挂载 win 分区大全

挂载win分区大全 
#mount_msdosfs -L zh_CN.GBK /dev/设备 /mnt/挂载点 (fat格式) 
#mount_ntfs -C GBK /dev/设备 /mnt/挂载点 (ntfs格式) 
#mount_cd9660 -C GBK /dev/设备 /cdrom 

PS:经过多次的尝试与测试后发现,只要保证中文的编码是 UTF-8 就可以避免乱码问题,以不变应万变的方法是,将所以文件以英文命名.如果 WIN 分区本身是 UTF-8 编码的,加载时加字符集为 UTF-8 不会有中文乱码问题.

[svn] local add, incoming add upon merge



在 svn 命令行 merge 之后文件经常会出现 local add, incoming add upon merge 问题,导致无法提交,可以通过以下命令解决冲突 
Summarizing to resolve the tree conflict committing your working dir with svn client 1.6.x you can use: 

svn resolve --accept working -R .  

where . is the directory in conflict.

git 中的 fetch 和 pull

原文: http://www.tech126.com/git-fetch-pull/

git 中从远程的分支获取最新的版本到本地有这样2个命令:

1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge
    
git fetch origin master
git log -p master..origin/master
git merge origin/master


    以上命令的含义:
   首先从远程的origin的master主分支下载最新的版本到origin/master分支上
   然后比较本地的master分支和origin/master分支的差别
   最后进行合并

   上述过程其实可以用以下更清晰的方式来进行:
   
git fetch origin master:tmp
git diff tmp
git merge tmp

    
    从远程获取最新的版本到本地的test分支上
   之后再进行比较合并

2. git pull:相当于是从远程获取最新版本并merge到本地
   
git pull origin master

    上述命令其实相当于git fetch 和 git merge
    在实际使用中,git fetch更安全一些
   因为在merge前,我们可以查看更新情况,然后再决定是否合并

解决Mac下的Mail中文乱码问题



Mail 的乱码问题是由于发送的邮件是mime格式,outlook/express 等无法正确识别。由于mail的默认编码是 utf8,而 outlook 的默认编码是gb2312/gbk,如果 mail 回复邮件则会使用 utf8,而当 html 的 charset 和实际编码有出入在 IE 中会无法正确识别。这就是为什么同样用 webmail,在 firefox 下显示正常,而 IE 则乱码。
虽说是 IE 的问题,但是还是可以解决这个问题的,方法有3:
1.使用纯文本方式( mail 格式里选择制作纯文本)
2.在新建邮件或者回复 outlook 类发送的邮件,手工指定编码(在 mail 的邮件-文本编码 选择 utf8 或者简体中文/GBK/GBK18030 等编码 )
3.如果嫌每次如此操作太麻烦,可以修改 mail 的默认值,由于这个选项没有界面可选,我们需要用命令来执行或者直接修改 mail 的 plist 文件:
退出mail,在终端输入:
defaults write com.apple.mail NSPreferredMailCharset "GBK"    (最好用这个,其它的各有各的问题)
或者:
defaults write com.apple.mail NSPreferredMailCharset "UTF-8"
defaults write com.apple.mail NSPreferredMailCharset "EUC"
defaults write com.apple.mail NSPreferredMailCharset "GB18030" 再开启 Mail 收发邮件就正常了。
要还原的话,输入:defaults write com.apple.mail NSPreferredMailCharset "UTF-8"

PS: 有段时间有效,貌似后来不生效了,现在有时忘指定 utf-8 编码,有个别 windows 客户端会收到乱码邮件.

2013年4月5日星期五

Macbook如何快速锁屏?


  1. 快速锁屏系统已经有默认快捷键了,control + shift + eject
  2. 如果想要有密码保护,这样设置:只要在 Security -> General 里选择 Requierd Password, 再用 control + shift + eject 就可以有密码了
  3. 如果不想按键,那么我的方法是用expose,由一个角落设置为唤出屏保,然后同Vinger,Requierd Password,就行了 不需要按键

国外有朋友玩微信吗?



2013年4月4日星期四

[整理] Linux 无法自动加载 .bashrc


$ vi ~/.bash_profile
#!/bin/bash
if [ -f ~/.bashrc ];
then
    . ~/.bashrc
fi

[总结] Linux如何查看已编译程序的 configure 参数


通常如果是以源码来编译安装的程序,如果想查看安装时的编译 configure 参数,最好祈祷编译时的源代码还在.
切到编译工作目录后,会看到有个 config.log,打开它,就能看到当时安装此软件时指定的 configure 参数.而且即使执行过 make clean,此文件仍然在,除非误操作,又一次执行了 ./configure.

[总结] find 寻找某个时间后创建或修改过的文件


经常发现某些数据目录下会按时期来生成文件,以供别的程序以日期来进行数据整理与产出.而不幸运的是,没有轮偱机制将以前的旧数据删除,结果一堆旧数据, ls 一下滚半天,也找不到真正调程序需要的近期的有效数据.
于是乎我们需要根据时间这一特征来寻找出某个时间点以后新创建或被修改过的文件,不就解决问题了吗?!
google 了一下,发现此类问题提的还不少,有一个小技巧实用之极,特摘过来.

1. 以感兴趣的时间点创建一个文件
$ touch -t 1201050800.00 /tmp/cmp.test
2. 到数据目录用我们的瑞士军刀查找之
$ find . -newer /tmp/cmp.test -print
上面的命令会把目录也算在内,如果只关心文件变化,则可以如下:
$find . -type f -newer /tmp/cmp.test -print

附: touch - change file timestamps
    -t STAMP
        use [[CC]YY]MMDDhhmm[.ss] instead of current time

[总结] BSD ftp 服务器(File Transfer Protocol)

1. 启动 ftp 服务器
  有兩种方式启动 ftpd,一种是使用 standalone daemon,使其成为守护进程;另一种是让超级守护进程 inetd 接管. 
  1) 使用 inetd
      编辑 /etc/inetd.conf, 将 ftp 设定开的 # 移除: 
      ftp stream tcp nowait root /usr/libexec/ftpd -l -l -h
      然后重启 inetd:
      # kill -1 `cat /var/run/inetd.pid`
  2) 在繁忙的服务器上启用 Daemon 工作模式,本文不对此种方法说明. 
2. 编辑欢迎信息,请尽量用英文书写消息体,避免乱码问题
  # vi /etc/ftpwelcome      /** 登陆前的欢迎消息*/
  # vi /etc/ftpmotd         /** 登入后显示的信息*/
3. 服务器参数
  在启动 ftp 服务器时,可以加入以下参数: 
  -d 记录 ftp 的出错信息;除此之外,必须修改 /etc/syslog.conf,加入以下内空以记录 ftp 讯息: 
        !ftp *.* /var/log/ftpd.log
  -h 不显示 ftp 服务器主机名,软件信息,版本等
  -l 记录 ftp 登陆成功及失败的信息;如果用兩个 -l,则上传,下载,删除,建立目录都会留下记录,预设日志文件 /var/log/xferlog
4. ftp 权限控制
  1) 新建立一个专门用作 ftp 的用户,比如 alex,它所在的用户组一定不能加到 wheel 中,否则有权限风险. 
  2) 如果 /var/run/nologin 存在,则所有的账号都不可以登入;此文件可以用来暂时停止 ftp 服务. 
  3) /etc/ftpusers 定义了不可以使用 ftp 服务的使用者和群组;其中 "@" 开头表示群组名称,常见的有 @guest.
  4) 其他限制操作见手册. 
5. chroot 限制用户只能在自家目录下活动
  修改 /etc/ftpchroot, 例" 
  alex
  @guest
  ftpuser /var/ftp
  @other /var/ftp

[分享] 不安装 mysql 的情况下编译安装 php 的 mysqli, mysql 扩展


下载最新的稳定版php.
$ cd php-src
$ ./configure --prefix=/Users/yongjieyang/php--enable-cli --with-libxml-dir=/usr --with-kerberos=/usr --with-zlib=/usr --enable-bcmath --with-bz2=/usr --enable-calendar --with-curl=/usr --enable-exif --enable-ftp --with-ldap=/usr --with-ldap-sasl=/usr --enable-mbstring --enable-mbregex --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql-sock=/var/mysql/mysql.sock --without-pear --with-iodbc=/usr --enable-shmop --with-snmp=/usr --enable-soap --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-xmlrpc --with-iconv-dir=/usr --with-xsl=/usr --enable-zip --with-pcre-regex=/Users/yongjieyang/local --enable-fpm
$ make
$ make test
$ make install

红色记的内容换成当前系统的正确的目录即可.
另外,没有启用 gd,因为我的机器上没有相应的库文件,懒的下载了.
--enable-fpm 开启 fastcgi.