我的2015

2015只剩下最后一个小时了,时间过得真快,总结一下自己过去的一年。
家庭方面。今年的主旋律还是在媳妇怀孕和宝宝出生上,一整年都忙个不停,当好模(苦)范(逼)丈(爸)夫(爸)真的不容易,不过宝宝健康成长,也是一件挺开心的事,真正用心去抚养下一代,也许会有不一样的体验。
阅读方面,今年没读几本书,与去年想比,真是差了一大截,与工作忙有关系吧,晚上一回到家也忙个不停,不过这些都不是借口,明年要按照正常计划来阅读和学习。
个人方面,觉得最满意的是下决心买了个vps,如果这也算是对自己一种技术投资的话,这绝对一次满意的投资。一来可以自建vpn,shadowsocks等科学上网的需要,从此可以更自由地使用互联网,可以随心所欲地使用google,这对于一个程序员来说,是多么重要的一件事情。再一方面,用vps自建了一个博客,经过一个断断续续的优化,博客的访问速度也提升了不少,用wordpress来建一个博客并不是一件难的事情,难的是从此要定期地为博客更新内容,之前在博客园也有过博客,但在上面博客更新的时间越来越长。自建博客后,就好像有一种无形力量在背后崔着你一样,让你不断地更新博客,个人而言,真正每月都更新博客的,这是头一年,一年后,写博客已然成为一种习惯,我现在很感谢这种习惯,唯一不足的是今年的博客内容都很分散,没有集中性,都是自己想写什么就写什么,也没有什么章法,写博客的技术真是渣。这也暴露了自己技术太过分散,不够深入的问题。这也是写博客一年的又一收获,明年开始要注重更深入和全面地掌握技术。希望能分出一些技术系列来写博客。
马上新的一年了,希望新的一年里,自己不忘初心。不断前行,不断战斗。

ios的静态load函数

ios在执行main()方法前,还做了很多工作,包括装载和一些初始化,比如熟知的+ load方法等,这样我们就很容易利用load方法对我们的程序进行一些初始化工作,而又不必多写其它的代码,或者引用其它的文件,降低了偶合度,只要在我们的class里加入+ load方法即可

这里有一篇文章分析得比较详细
iOS程序main函数之前发生了什么

Shadowsocks优化加速

最近闲时把digitalocean服务器上的shadowcocks优化了一下,优化后google搜索基本在2秒以内出结果,我基本达到了我科学上网的要求,更重要的是工作的时候提高了我的效率。如果想还快一点,可以用国内的一台vps做二级代理,速度可提升不少。

Shadowsocks要比vpn轻很多,同时也要快很多,在网终环境不好的时候,vpn也经常容易断,影响效率。
平时科学上网大多数时候都是用Shadowsocks,速度快不说,还不用老让我重连,然后Shadowsocks还有很多优化空间。
1.加密方式推荐使用rc4-md5
TIPS: 加密方式推荐使用rc4-md5,因为 RC4 比 AES 速度快好几倍,如果用在路由器上会带来显著性能提升。旧的 RC4 加密之所以不安全是因为 Shadowsocks 在每个连接上重复使用 key,没有使用 IV。现在已经重新正确实现,可以放心使用。/etc/shadowsocks.json配置文件如下;
{
    “server”:”my_server_ip”,
    “server_port”:8000,
    “local_address”: “127.0.0.1”,
    “local_port”:1080,
    “password”:”mypassword”,
    “timeout”:300,
    “method”:”rc4-md5″
}

重新启动即可
ssserver -c /etc/shadowsocks.json -d stop
ssserver -c /etc/shadowsocks.json -d start

2.锐速加速
锐速是一款非常不错的TCP底层加速软件,可以非常方便快速地完成服务器网络的优化,配合 ShadowSocks 效果奇佳。目前锐速官方也出了永久免费版本,适用带宽20M、3000加速连接,个人使用是足够了。如果需要,先要在锐速官网注册个账户。

然后确定自己的内核是否在锐速的支持列表里,如果不在,请先更换内核,如果不确定,请使用 手动安装。

确定自己的内核版本在支持列表里,就可以使用以下命令快速安装了。

wget http://my.serverspeeder.com/d/ls/serverSpeederInstaller.tar.gz
tar xzvf serverSpeederInstaller.tar.gz
bash serverSpeederInstaller.sh
输入在官网注册的账号密码进行安装。
然后选择需要加速的接口、上行及下行最大带宽,这里不需要输入任何内容,参数设置直接回车默认即可,
最后两项输入 y 开机自动启动锐速,y 立刻启动锐速。之后可以通过lsmod查看是否有appex模块在运行。

到这里还没结束,我们还要修改锐速的3个参数,vi /serverspeeder/etc/config

rsc=”1″ #RSC网卡驱动模式
advinacc=”1″ #流量方向加速
maxmode=”1″ #最大传输模式
digitalocean vps的网卡支持rsc和gso高级算法,所以可以开启rsc=”1″,gso=”1″。

重新启动锐速

service serverSpeeder restart

注:
如果遇到..Failed to write configuration: /proc/net/appex/wanKbps的错误,
需要删除掉

rm -rf /serverspeeder/

然后重新尝试在官网手动下载安装包serverSpeederInstaller.tar.gz
解压重复以上安装步骤bash serverSpeederInstaller.sh即可

附:/serverspeeder/etc/config 各参数配置

启动锐速: /serverspeeder/bin/serverSpeeder.sh start
加载锐速模块, 使用/serverspeeder/etc/config 文件中的配置作为锐速的初始化参数;

停止锐速:/serverspeeder/bin/serverSpeeder.sh stop
卸载加速模块;卸载前请确认没有其它进程在访问/proc/net/appex/目录,例如确认控制台当前目录是否是/proc/net/appex/;

实时修改锐速参数: /serverspeeder/bin/serverSpeeder.sh reload
修改/serverspeeder/etc/config 文件中的配置后运行此命令,此时模块不退出,参数被实时修改;

如何卸载锐速?
在确保锐速没有运行的情况下,您可以通过两种方式来卸载锐速:
1. 使用安装脚本的卸载功能卸载锐速,如:./serverSpeederInstaller.sh uninstall
2. 通过简单的删除操作,如’rm -rf /serverspeeder/’,即可将锐速完全卸载;
通过修改/appex/etc/config 文件,可以为 LotServer 设定不同的配置参数;常用参
数的说明如下:
1) accif=”eth*”
加速接口;eth*一般为服务器上对外提供服务的网络接口,例如 eth0, eth1„,一
般通过 …

makefile

概述
——

什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。

在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。

关于程序的编译和链接
——————————

在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.

好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。

Makefile 介绍
———————

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

一、Makefile的规则

在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target … : prerequisites …
command

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。内容还多着呢。:)

二、一个示例

正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。

edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c …

关于记录片<河西走廊>

一口气看完了记录片,由感而发说两句。
总体感觉:宏大、厚重、壮丽、深情,很赞的一部纪录片,至今仍在回味。
整片以时间和叙事为线索,从汉初张骞开始,到当代,每一集都以一个主题展开叙述,而且还还用演员还原了场景,比起平时看只拍景物的记录片生动了很多,同时画面唯美,场面宏大。其实我对记录片的拍摄制作一窍不通,个人感觉布局。
我更想说的是看完了这总记录片后,当作对甘肃这个地方的地里地貌作一次科普,对这个地方普经和正在发生的历史在脑海中过了一遍。把从小到大从书本看到的,以及从电视上看到的有关河西走廊的各种零碎知识进行一次生动的串联和展现。
在历史上,河西走廊就是中原地带对外的一个窗口,中原文化从这里输出,西域文化从这里传入(比如佛教),这在这里,也是两种文化碰撞最强烈的地带,丝绸之路,敦煌,壁画。
而更重要的是在军事上的作用,河西走廊就是控制西域地带的一把钥匙,自古以来的王朝,只要参稳定控制河西走廊的,就能把军事影响到西域,就能控制住西域。而丢掉河西走廊控制权的王朝,同时也丢掉了西域的控制权。历史上有名的阳关,玉门关,嘉峪关都在此。
河西走廊不只是一个地理概念,更是一个历史概念,一种文化使命。整部纪录片确实在不遗余力的诠释这一点,没有停留在展现自然风光(自然风光都浓缩到广告后的短片中,如星空、丹霞、古城、河流)或者勾画历史故事的层面,而更多是在梳理河西走廊在历史长河中所扮演的沟通内外角色。最后一集尽管有主旋律味道,但表达起来还算是自然的。
而雅尼创作的《河西走廊之梦》更是不可或缺的浓重一笔,伴着悠扬深远的曲调,我们似乎可以听到从历史深处铺开的丝绸之路上传来的那一声声驼铃与胡笳
我也从来没有踏上这片神奇的地士,记录片中的景色也够唯美的,各种塞外风光,就像片中所说,这里有除了海洋之外的一切地理地貌,希望什么时候时候能路上行程去看看,特别是号称塞上江南的张掖。还有西出阳关无故人的阳关,春风不度玉门关的玉门关,虽然已经成为废墟,失去了原有的军事作用。