c/c++, python, emacs
本文源自Stackoverflow中的一个帖子,汇总了73本免费的、语言无关的优秀的编程书籍,业界对这些书籍的评价都很高,非常值得一看。
这些书籍中有HTML格式的,也有PDF格式的,当然,都是英文版的。不过,部分书籍的中文译本已经出现在网上,有兴趣的同学可以Google一下。
算法和数据结构(PDF)
算法(草案)
二叉树(PDF)
通信顺序进程(PDF)- T
下面是shell预留的退出码,自己的程序建议不要用这些:
Table C-1. ”Reserved” Exit Codes
Exit Code NumberMeaningExampleComments1catchall for general errorslet “var1 = 1/0″miscellaneous errors, such as ”divide by zero”2misuse of shell builtins, according to Bash documentationSeldom seen, usually defaults to exit code 1126command invoked cannot executepermission problem or command is not an executable127“command not found”possible problem with $PATH or a typo128invalid argument to exitexit 3.14159exit takes only integer args in the range 0 – 255128+nfatal error signal ”n”kill -9 $PPID of script$? returns 137 (128 + 9)130script terminated by Control-CControl-C is fatal error signal 2, (130 = 128 + 2, see above)255*exit status out of rangeexit -1exit takes only integer args in the range 0 – 255
see: http://www.faqs.org/docs/abs/HTML/exitcodes.html#EXITCODESREF
C中提供了一些标准的退出码,定义在头文件: /usr/include/sysexits.h 中:
#define EX_OK 0 /* successful termination */
#define EX__BASE 64 /* base value for error messages */
#define EX_USAGE 64 /* command line usage error */
#define EX_DATAERR 65 /* data format error */
#define EX_NOINPUT 66 /* cannot o
一直在终端下用emacs作为我的主要编辑器,并且一直在用tabbar插件。
但是终端下的tabbar插件不是太好用,如果打开的buffer很多,后打开的tab就会超出屏幕宽度而无法看到(不知道是我没配好还是它主要是为GUI设计的没考虑终端)。因此,自己在tabbar的基础上写了一个emacs的插件──ctab.el
这也是我的第一个emacs插件。下面介绍下ctab.el的功能:
SnapShots:
1. 在Emacs的header-line里显示一个tab-line,列出已打开的buffer. 当标签超出window显示范围时自动滚动,保持当前buffer永远能显示。这个tab-line里过滤掉不必要的buffer,如: *Completion* or *
2. 通过快捷键在tab(buffer)间快捷切换:M-<right> 下一个标签;M-<left> 上一个标签。
3. TODO:智能排序:将.h和.c/.cpp标签显示在一起,即在打开 file.h 文件后,再打开 file.c 文件,则file.c的tab自动排序到file.h的立即后面,而不是排在最后。(还未实现:P )
欢迎用emacs的同学试用:
下载:svn checkout https://wuxi.googlecode.com/svn/trunk/emacs-lisp/ emacs-lisp安装:
将 ctab.el 复制粘贴到你的emacs的load-path,如:~/.emacs.d/下, 并在 .emacs 文件中增加下面2行:
(require 'ctab)(ctab-mode t)
Enjoy!
同时欢迎大家去我的博客: http://icoder.me/
UFS将文件系统分成很多等大小的zone,每个zone里包含很多blocks(一般一个zone里有32768个blocks), 每个block大小由实现决定,但一般都是1024的整数倍.
Unix文件系统包括下面几个结果:Superblock, inode/dinode/vnode, data block(directory/file).
Superblock是整个文件系统的metadata,如大小、inode数等,一个文件系统只有一个,但由于非常重要,在每个zone都有superblock的备份.
inode是文件的metadata,一个文件对应一个inode,但是不包括文件名(文件名记录在directory中).
dinode是on-disk inode,即实际存储在磁盘上的inode,这个对于不同文件系统(如ext2、ffs)格式略有不同.
vnode是unix特有的结构(linux没有,用一个更为通用的inode代替),主要是实现virtual file system而设计的;存在于内核中,每一个活动的文件(即打开的文件)对应一个vnode,当所有打开这个文件的进程都关闭时,这个vnode被内核回收,下次再有文件被打开时再分配。
inode号是从0开始的,不过0,1,2被系统留作特别的用途:0 用作被删除的文件; 1 文件系统留用(比如用作bad inode count等); 2 根目录(/)专用. (ext2系统中还留用了其他几个inode,第一个可以正常使用的inode是从11开始的)
文件的数据被分成很多blocks,存放于磁盘上,inode中记录了这个block的编号(如ext2中的i_block[]域),其中(现在的实现)前12个block是
最近在开发项目时发现了这样一个问题: 我写好的一个类,在写单测用例时,想要测试protected和private成员,但是test case里无法访问这写成员。
我了解到的比较流行的两种做法是:
1. 将test class作为被测class的友元(friend);
2. 使用hack compiler的方法:#define private protected
两种方法个有优缺点,下面简单分析下:
众所周知c++里面的一个函数,通过编译器以后将会被增加前缀和后缀,变成另外一种形式,例如void f(int); 编译后可能变成:__Z4funci 这个特性就是的学名叫──Name mangling[1].
为什么C++要引入这么奇怪的name mangling? 看下面这段代码:
int func(void) { ...}int func(int) { ... } /* ok, c++ allows function override with different parameter. */
因此C++需要按照一定规则给函数名增加很多修饰。其实不光是函数名,还包括变量名、常量名等。
使用name mangling也带来了问题:
如果用g++编译生成一个.o文件,在纯C链接该.o使用里面的函数时就会出问题。
解决办法:给函数增加 extern “C” 修饰,如:extern “C” int func(int);
好了,前面都是一些基础内容,大家都应该知道,现在介绍一些大多数人不是很熟知的东西。
.me域名首次购买的时候很便宜,$8.99元,而我今天续费的时候确要$19.99一年!
于是在网上找godaddy的优惠码,但是优惠码也就优惠26%,不解决实质问题。
但是最后在网上发现一个便宜的续费方式,分享给大家:
1. 在godaddy hosting 里注册个1个月的主机, 我注册的是$7.99美元的。
2. 注册后就可以捆绑域名renew了,优惠价 $1.99/1year,(注意只能renew 1year,第二年还是19.99)。
3. 总共是:$9.98, 再用优惠码。
最后下来一共是不到$8.
用公钥授权(Public key Authentication)的方式可以实现ssh服务器与本机之间的配对,实现不用输入密码联入SSH服务器。
具体做法:
1) 在本机(ssh客户机)生成密钥文件:client$ cd ~/.ssh
client$ ssh-keygen -q -f id_rsa -t rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
在提示输入密码阶段时(Enter passphrase…),直接Enter,这样以后在本机就不用输入密码了。
这样,在.ssh/目录下就会生产2个文件:id_rsa 和 id_rsa.pub .
注意:保密好这两个文件!
2) 分发公钥文件:
将你的公钥文件 (id_rsa.pub) 分发到你的SSH服务器上:
# Step 1: 将你的id_rsa.pub文件上传到服务器上
client$ scp ~/.ssh/id_rsa.pub user@your.ssh.server:~/.ssh/
# Step 2: 在服务器上安装公钥文件
server$ chmod 700 ~/.ssh
server$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
server$ chmod 600 ~/.ssh/authorized_keys
server$ rm ~/.ssh/id_rsa.pub
注意:这个地方要用>>追加到authorized_keys文件末尾,以免冲到以前的一些公钥授权。
好了,现在大功告成了,enjoy!
PS: 以上方法只保证在OpenSSH服务器上有效,其他SSH服务器不知道。
1. 下载deb软件,并通过scp或者ftp传到iphone上。
2. 安装deb:
dpkg -i /full/path/to/filename.deb
例如:在iphone上安装vim:
dpkg -i vim_7.1-3_iphoneos-arm.deb
PS: 下面是一些可以下载iphone deb软件的地方:
Cydia的saurik源: http://apt.saurik.com/cydia/debs/
saurik源下软件列表:http://apt.saurik.com/dists/tangelo-3.7/main/binary-iphoneos-arm/Packages