终端配置


Coder Life

终端应用:iTerm2

配色方案:Solarized Dark

下载解压后,在 iTerm2 的 Preferences 里 Profiles / Colors,右下角 Color Presets… / Import… 加载 iterm2-colors-solarized/Solarized Dark.itermcolors  文件

Shell: Z-Shell

macOS 自带 zsh,用 brew 可以安装最新版本

oh-my-zsh

zsh 的配置方案。安装:

字体:Monaco for Powerline

下载后双击安装。在 iTerm2 的 Preferences 里 Profiles / Text,Chang Font, 选择 Monaco for Powerline, 12pt.

更多配置

编辑 ~/.zshrc 文件

 

从Windows8迁移到Archlinux(硬盘安装方法)


Coder Life

背景

越来越不喜欢Windows,而且Archlinux对我有太大的吸引力,我曾经也一度通过各种方式把我的Windows操作方式极力逼近Linux, 比如用cygwin能在Windows命令提示符中舒服地使用linux命令,Win+R运行框中输入任何软件的名字运行这个软件,写ShellExtension DLL扩展我的鼠标右键菜单,以及文件系统的结构(C盘为根目录,规划好所有文件夹,根据性质不同存在D、E盘,然后junction到C盘),还有重磅炸弹——Emacs。如此种种本已能满足我的要求。然而随着时间的推移很多的因素积累在一起,又愈发看到Linux一片势好,何不提前转过来呢?最主要的是有任何不满意的地方可以自己修改,随意替换。对于很多比较“功利性”的人来说会认为把时间花在折腾上很不划算,但我想说趁着年轻多折腾,包括以后忙事业最好也能固定一部分时间来像学生时代那样来折腾折腾,学习、钻研、折腾,其实不就是同义词么。OK,不管你是为什么要转Archlinux的,如果你确定了,就往下看吧,方法理论上讲适用于Windows XP/Vista/7/8/8.1。如果你对命令行什么的有恐惧症,就不要看了,改用Ubuntu吧,那个安装起来和装Windows一样。

前期准备

“No One Should need to warn you backup your important files.”

备份资料,如果有移动硬盘就备份到移动硬盘,没有的话建议备份到最后一个分区

备份好了之后下载
bootice
grub4dos 0.4.6a http://code.google.com/p/grub4dos-chenall/downloads/list
Archlinux https://www.archlinux.org/download/

弄一个fat32分区,建议是分区表的倒数第二个分区(不用太大,理论上比你下的Archlinux的iso大5M就行,但我喜欢分2G)

把Archlinux-xxxxxx-dual.iso放进去并重命名为 arch.iso (重命名是为了后面的方便)

提取iso中的archiso.img 和 vmlinuz 放到 iso 一起(fat32分区的根目录)

这两个文件随着archlinux的版本变化位置会不同,一般在有 isolinux 或者 boot 里面,找找吧,不费力,可能会遇到2份,其中i686 目录下的是32位,x86_64 下的是64位的。

把grub4dos目录下的grldr和grldr.mgr拷贝到C盘根目录

打开bootice,下面第二个按钮(主引导),选 grub4dos 0.4.6a, 选C盘,确定

在C盘根目录新建文件 menu.lst, 内容如下

其中 hd0,5 是你的fat32分区的编号,不知道也没关系,继续按步骤往下。

放心大胆的来,在我警告你之前,出现问题可以平安无事的返回你的Windows系统。

重启电脑,会出现让你选择 Windows Install Archlinux 和 Archlinux 选项的窗口,选 InstallArchlinux

如果提示File Not Found, 可能是你 fat32 分区等编号弄错了,回到选择界面在 Install Archlinux 这一行按e然后在root (hd0, 5)这一行再按e然后把5改成其他数字,C、D、E、F盘,F盘一般是4或者5。改好后按b即可启动。可以逐个尝试都没关系,不会对你电脑造成损坏。

成功后,一般会提示找不到 /dev/disk/by-label/archiso ,等到可以输命令时先输入fdisk -l 或者 cfdisk /dev/sda 查清楚你的那个 fat32 分区是sda几,假设是sdaN, 则继续敲以下命令:

其中mount 的 -t vfat 是因为fat32分区,如果你存放在ntfs分区就用 -t ntfs

接下来应该一路顺畅可以进入到isolinux了

首先是联网,如果你是adsl拨号等话,输入 pppoe-setup然后按提示操作

配置好后pppoe-start联网 pppoe-stop 断网

如果是dhcp(就是平时一插上网线就有网的话), 输入 dhcpcd

如果是wifi的话,先修改 /etc/wpa_supplicant/wpa_supplicant.conf 如果怎么修改还要问的话,那你就敲命令

然后输入以下内容:

^X 即表示 Ctrl+X, Ctrl+X, Y, 回车保存退出

ifconfig查看一下你的无线网卡的interface比如wlp3s0

命令:

然后再输入命令 dhcpcd

如果是静态ip分配,比如必须用 192.168.2.123 这个ip,网关是192.168.2.1, 则输入

最后 ping www.baidu.com试试成功否。

如果提示network is unreachable

route -n 检查一下路由。

如果是 unknown host name ,可能是dns的问题,输入

然后继续测试。 测试成功后写一个脚本,包含以上的内容,待会安装完系统后,进入新系统就可以直接运行这个脚本联网了。先输入:

然后输入:

以上内容根据实际情况来,就是你之前输入了哪些命令就把它写在这。

然后添加163镜像服务器(2013-7-1新版的已经包含了,不必手动添加):

添加在第一个Server的前面一行:

然后就是正式的安装过程了。

分区

把C盘到fat32分区中间的分区全部删除(建议先保留fat32分区)。新建一个20G的Primary分区,记住是sdaX, Write,Quit

如果你是插上网线就有网,最后一步可以只输入 pacstrap /mnt base base-devel, 其他的最好按上面的来,避免装好Arch之后进去联不了网就又得回来弄就麻烦了,笔者在全过程中来回了好几次,很浪费时间,所以尽量能让大家一次搞定。

等待安装完成后生成fstab,其中包含了静态文件系统信息,定义了存储设备和分区整合到整个系统的方式。mount 命令会读取这个文件,确定设备和分区的挂载选项。

然后进入到新系统:

更改时区

生成内存盘镜像:

设置root密码

退出,用 exit或^D, 卸载

然后

记住ext4那个20G,刚刚你安装了Archlinux的编号, 然后重启

然后这时候选第3个,也是先修改 (hd0,0) 为正确的数字,还有 /dev/sda6 也修改成正确的数字,然后按b。

提示File Not Found就继续改 (hd0,0) 和 sda6 的数字。

成功进去之后,登录root帐号

神马?!忙活了半天你就是为了让我装一个黑白屏幕,上个世纪人们用的命令行操作系统!老子要上网!老子要玩游戏!

好吧,那就先赶紧装个桌面吧。先用和上面同样的方法联网。添加Server。然后升级系统。

然后安装xorg

然后安装显卡驱动,如果是ati的卡就

如果是nvidia的卡就

如果是Intel的集成显卡就

安装所有驱动或选择安装驱动可以输入以下

然后装xfce桌面

装完之后,新建一个用户测试一下

然后切换到这个用户

然后设置X Windows

把# startxfce4的注释去掉(就是把前面的那个 # 删掉)

保存退出,进入看看

默认的xfce进去之后是极丑的,不过可以弄成很漂亮。这个看缘分吧,如果你现在想试试其他漂亮的,可以装gnome桌面。Ctrl+Alt+F2 打开 tty2 登录root 安装gnome

装完之后,新建一个用户测试一下

把# exec gnome-session的注释去掉,然后

如果进入gnome桌面黑屏,只有一个鼠标可以动。其他什么都没有。就先从root启动一下gnome,
然后再用普通用户进去就可以了。

还有最重量级的桌面kde。想再试试吗?

Ctrl+Alt+F3 打开 tty3

登录root

安装xfce

新建测试用户

切换

配置kde

把 # exec startkde 的注释去掉

保存退出,进入看看

OK,KDE的桌面呈现在眼前了。

到这里就可以把Windows给干掉了。

安装配置grub

好了,再调整分区

把20G的ext4分区Bootable一下,其他的全删掉(如果你没用移动硬盘备份而用一个分区备份那就别删了那个,这不用提醒吧),怎么分区随便你了,可以分一个200G的Logical作为/home, 假设是 sdaX

把除了root之外的其他所有用户都logout或者reboot一下,然后

cp -ax 可以将 /home 中的内容完整复制到 /mnt/newhome 中,并保留全部文件属性,也不会交叉任何挂载点。/mnt/newhome 就是 /home 的精确副本。

编辑 /etc/fstab 文件,在最后添加:

这样每次启动时都会自动挂载

没有问题就 rm -rf /home.bak 删掉原来的

如果愿意的话可以再弄一个 swap 分区,同样用 cfdisk 分配合适大小的Logical分区,假设是 sdaX

在 /etc/fstab 中添加

如果你喜欢vim编辑器(如果你真喜欢估计不用教)

如果你喜欢emacs

我的emacs配置可以从 http://github.com/sowicm/emacs.d 下载

这时候可以把之前的测试用户全删了

然后建立你的账户

设置密码

在 /etc/sudoers 中添加

切换到你的用户

按前面的方法选择你喜欢的桌面

然后就是中文的问题,安装中文输入法

配置

添加

如果你和我一样喜欢小鹤双拼的话,编辑 ~/.config/fcitx/conf/fcitx-pinyin.config

把 #DefaultShuangpinSchema=Ziranma 取消注释并改成XiaoHe,即

然后是编码

取消 #zh_CN.UTF-8 UTF-8 的注释然后

添加

不这样的话,你打开你的移动硬盘会发现中文文件名全成了乱码

哦,对了,说到移动硬盘还装个这

然后呢?上网?

搞定!flash还没死。所以再装个flashplugin

你打开一个网页。。。你又要抓狂了,这什么鸟屎玩意儿?汉字怎么一个大一个小,乱七八糟!!linux其实任何问题都是几句代码的事。

这是安装了一个较美观的字体,当然你也可以安装微软雅黑。

游戏?每个桌面都自带了一些,如果你是以玩游戏为主……神马?为什么你要装linux?!否则,为了你的学习效率和工作效率最好是严格把工作学习和娱乐区分开来,把电脑只当成工作、学习的工具,PS3、平板什么的当成娱乐休闲的工具,或者弄一个虚拟机来装门玩游戏。总之越明确的分界对你的效率越有帮助。安装虚拟机:

勇士!如果你是以前没怎么用过linux的人,能做到这或认真看到这,你就是这篇文章收获最大的人,我相信你已经明白archlinux乃至linux大概是怎么回事了。你一定对pacman很感兴趣,那就再教你3个基本实用的命令

到此教程就结束了。大胆地探索Archlinux吧!

用C++开发网站/Web应用的2种思路


Coder Life Technologies

从纯静态网页,到aspx,到Flash网站,到php,到java,再到python,C++。经过了许多的取舍抉择。我更喜欢的还是C++。其次选择Java。

首先选择C++做网站,就要了解优势在哪里,劣势在哪里。

优势

安全 服务器上是编译好的二进制执行文件,就算别人获得了webshell,也无法简单地通过文本编辑器就对你的逻辑层进行改变,也无法窥探到你的逻辑层,而且因为是C++二进制执行文件,你还可以更灵活地比如让它自动判断运行环境,自我销毁、警告、报告给你它在哪个陌生的环境运行,用户是谁等等等等。总之相对其他的来说,理论上安全性绝对是最优的。

高效 其他的方案大多数是非编译语言,那么它们都需要相对应的二进制文件对其进行处理,各种解析之后得到结果,我们是直接的二进制执行文件,当然有人可能听说过C++的CGI性能低下,其主要原因是直接用传统CGI的思想,每次一个访问,就运行一个进程,启动结束进程本来就需要时间,到了并发多的时候更是直接把内存给爆了(应该说什么都能给爆了),但C++是强大的,我们可以让它以有限的进程数常驻在内存中,循环处理请求,每一个进程又可以以多线程的方式工作,而且每个进程只要维持一个数据库连接(实际上可以根据web服务器和数据库服务器的实际情况测量确定一个最优值),这样不仅可以保证不会崩掉数据库服务器,而且相比起每个请求都要建立一次数据库连接的方式(其他方案大多是如此),又能省掉建立数据库连接的时间,提速不少。而且你可以根据实际情况将任何读写较频繁的数据加载并常驻到进程的内存中实现最快的响应速度。实测在Apache Fastcgi和Nginx Fastcgi下,用上述方案和php分别完成最简单的数据库查询输出和包含文件,上述方案的效率比php快近3倍!上述方案是一种相当有效的高并发、高负载解决方案。如果你还嫌不够,可以连Apache、Nginx都省掉,直接写成httpd,当然这个我是不推荐的。

稳定 根据前面的叙述,显而易见。

强大 毫无疑问是最强大的,你可以使用任何C/C++库,你的程序功能和你其他的C/C++程序比,几乎没有任何缺失,只是用得到用不到的问题而已。

劣势

开发效率低 这是硬伤,C++的开发效率和它的执行效率一样是众所周知的,一般而言,开发效率与执行效率确实是成反比的。但这个能通过开发一些适当的库得以缓解,甚至能和php媲美,这就需要C++(和C++11)的一些特性了,这就是为什么选择C++而不是C的原因。

也许你还会说还有不易维护,不易调试等缺点,这也是存在的,但也是可以解决或缓解的。

好了,看到这里不知道你还有没有兴趣。如果你也想用C++来做网站的话,不妨参考以下我正在使用的2种思路(因为我已经将其实现都封装在了自己的库里,你可能需要花费额外的时间来让你的编译器能成功编译以下代码)。

思路1:

webroot的结构大致如下:

当用户访问网站时,不管uri是什么,都交由index.cgi处理,调用对应的函数,其中可能会读取html中的文件,这些文件可以用Django的模版语言。而这个文件夹是用户是没有访问权限的,因为它只供index.cgi读取并处理。js和css文件夹中就是静态文件。
这种思路非常像python的django开发的应用,只是把py文件变成cpp文件并编译成了二进制文件。非常方便移植。
(我是在了解python的web框架之前采用的这种方案,只不过html采用的不是Django的模版语言,而是自己随便定义的一套规范,仅有变量和判断功能,后来接触了Django之后,把html的书写规范改成了和Django一致)

思路2:
webroot的主体基本上就一个index.cgi不需要html、js、css,完全的C++风格编程。
其中cpp源码的urlproc部分如下:

编译成index.cgi后当用户访问任意url时,index.cgi都根据url调用对应的函数,然后生成css、js、html返回给浏览器。

希望此文能对你有所帮助,如果你觉得有收获,想进一步交流,可以通过侧边栏上的联系方式联系我。

C++学习方法导论


Coder Life

转载请注明出处:转载自 至尊明帅的博客 原文地址:http://zi-jin.com/?p=10

很多同学都在为学C++而烦恼,现在我希望能提供一些帮助大家学C++的东西。

第一部分:准备工作

1.我不想一开始就介绍很多概念性的东西(但有一些是必须的),想先让大家亲自体验,然后引出概念。希望大家喜欢这种方式。

2.大家看到这篇文章前应该已经看过有关C++语言的书籍,如学校课本,本文并不是代替课本,或许只是引导你如何去看课本及其他书籍。

3.本文说的C++均指标准C++。(这句话是写给看得懂这句话的人看的,现在大家可以不用在此纠结。)

4.C++是一门语言,是人与机器的沟通方式。遵循C++语言规范写出来的东西叫代码,它必须经过编译器编译成机器能执行的指令。

5.其实如果你能把C++ Primer这本书看完,不需要任何其他资料就能了解整个C++语言了,但真的一开始就抱着那么大一本砖头书看也不知道好不好,反正我没试过,我觉得学习过程中还是要以培养兴趣为主。

6.如有任何疑问,欢迎在下面留言:http://zi-jin.com/archives/10#comment

第二部分:从大家都看过的一个C++程序说起:

1.“int”是什么?
int a;
表示声明(Declare)一个整数型变量(interger),其名称为“a”,就像数学里面“设长方形的长为a,宽为b”,值得注意的是你不能“设长方形的长为a,宽为a”。因为标识符(Identifier)在其作用域(Scope)内必须是唯一的,从其英文名可以看出,我们必须凭这个名字而找到准确的事物。
声明多个整数型变量时,可以写成:int a, b, c, d, e;
在C++中,你必须先声明一个变量,才能使用它。
这句话是什么意思?就是上面那个程序中,如果没有“int a;”这个语句,那编译时就会报错,通常的提示是:[未声明的标识符 ‘a’](error: ‘a’ was not declared in this scope)
解决方法?你是把int a;删掉了引起的这个问题,把它重新加上去呗……
除了int外,C++还有其他基本内置类型。下面都提一下:
bool 布尔型
其值为true或false,用来表示一个条件是否成立。比如我可以声明以下一组变量来简单的表示一个人的基本特征:bool bMale, bTall, bStrong, bHealthy, bMarried;

char 字符型
通常用单引号里面一个字符给它赋值(建议这么做),一个字符占一个字节。另外建议了解一下“转义符”(Escape)。如果你不知道为什么’�’等于0的话那就是还不够了解。

wchar_t 宽字符型
通常用单引号里面一个字符或2个字符给它赋值(建议这么做),一个宽字符占2个字节。有很多人都不知道 wchar_t w = ‘ab’; 这样赋值。

short 短整形
一般占2个字节

int 整形
一般在多少位CPU上工作就占多少位。比如在32位机器上就占4个字节(8位为1字节)。建议不了解的同学搜索一下字、字节、位、双字等单位。

long 长整形
一般占4个字节

float 单精度浮点数
发现有很多同学学了很久C++还不知道如何用C++来表示整数之外的数……建议同学了解一下float在内存中是如何存储的(问搜索引擎)。

double 双精度浮点数
这个也用来表示浮点数,而且推荐使用这个,因为现在32位机器一般处理double比float更快。同样建议同学了解一下double在内存中是如何存储的。

long double 扩展进度浮点数
这个提供的精度一般没有必要,而且还需要承担额外的效率代价。

char型和各种整型前面可以加signed 或 unsigned 说明符
一般不加默认为signed
加unsigned就成了无符号型
有符号型可以表示的数据范围一般是 -2^(n-1) ~ 2^(n-1)-1
无符号型可以表示的数据范围一般是 0 ~ 2^n – 1
如 char 可以表示 -128~127
unsigned char 可以表示 0~255
特别说明:signed a; unsigned b; 一般分别等价于 signed int a; unsigned int b;

除了以上这些基本内置类型外,你还可以使用“typedef”来自定义类型,以及枚举类型(enum)、结构体(struct)、类(class)、联合(union)等

声明变量的格式一般为:
typename identifier [, identifier2, identifier3, ...];
声明时也可以给变量定义,如:
int a = 1, b = 2;

2.函数(function)是什么?
从其英文名可以看出函数其实是一个“功能”,它是用来被调用的,它能根据你提供给它的东西得到一个结果并告诉你、对你提供的东西进行诸多处理、或者只是你对一组常用的语句进行的“打包”。
函数包括参数(parameter)、函数体(function body)、返回类型(return type)。
其声明格式通常为:
return_type function_name(parameters);
声明不包括函数体,定义才包括函数体,定义格式通常为:

其中parameters的格式一般为parameter[, parameter2, parameter3, …] *值得注意的是函数并不一定要有确切数目的参数,感兴趣的可以先自行搜索“C++ 不定参数”来了解
函数体是一个块(Block),块就是用一对花括号括起来的语句序列,可以为空,块就是一个作用域,块中还能有块。
参数就是你提供给它的东西,函数体就是它的实现过程,返回类型是指定它将返回什么类型的结果。
返回类型除了你声明时能用的类型外,还包括一个void类型,即表示不返回东西。
下面来看这样一个例子:

如果窗口一闪而过,解决办法:
1.从Terminal或CMD中调用程序
2.在return 0; 的前面加一条 scanf(“%d”);
3.对于Windows系统,在return 0; 的前面加一条 system(“pause”);

上面这个例子如果不明白 “out” 是什么意思,请搜索“转义符”
如果不明白 char *str 是什么意思没关系,其实这是指针
你要明白的仅仅只是函数的格式以及调用

下面来介绍如何在一个函数func1中调用另一个函数func2的同时func2也调用func1

这个是编译不过的,不管你如何调换func1和func2的顺序都没用。
解决方法是:

函数名和变量名一样也是标识符,也必须要先声明后引用,以上解决办法就是在func1和func2的定义之前加上func2的声明(上面已经介绍了函数声明的格式)

另外还有一个有趣的,那就是一个函数可以调用它自己,看例子:

编译并运行后可以看到会输出10行”Called once”,学过循环控制语句的同学当然还知道其他方法实现这一点。但现在这里是介绍递归函数。通常利用循环控制语句执行效率要比递归函数高。

3.“main”是什么?

4.“#include”是什么?“#include <iostream>”和“#include “iostream””有什么区别?

5.命名空间(namespace)是什么?“#include <iostream>”和“#include <iostream.h>”有什么区别?

6.“using namespace std”是什么?

7.“cin”和“cout”是什么?

第二部分:
1.作用域(Scope)

To be continued…

WordPress文章ID重复利用环保节约方案


Blog itself Coder Life

写博客经常会删掉以前的一些日志,就浪费了很多ID。

于是提供重复利用文章ID的方法:

注意!写本文章时使用的WP版本为3.2.1

用文本编辑器打开 /wp-includes/post.php 文件,找到 wp_insert_post 函数(3.2.1版直接找到2584行),看到如下代码:

在下面添加一部分,变成:

看,这篇文章的地址在经过这样修改之后就不是 http://zi-jin.com/archives/5xx 而是 http://zi-jin.com/archives/1 了。
Enjoy it!

WP-Download_Monitor – 如何新窗口打开下载链接


Blog itself Coder Life

打开 hostname/wp-content/plugins/download-monitor/shortcodes.php 文件,找到

将其修改成:

同理,找到:

改成: