浅谈 - 转身

一转身,那个动人的身影就不见了,在人海里,想再次打捞到她,再次与她相遇,哪怕匆匆一瞬,都是不可能了,不可能了。
在广场,在车站,在大街,在超市,在乡野,在人流聚散的地方,我经常有这种感受:转身就是永别。
那一次,我在北京车站等车,在拥挤的人流里,我不小心踩了右面一个年轻人,我正准备道歉或接受责备,却看见转过来一张文雅谦和的脸,他说“对不起你,我挡着你了”,我深为感动,只顾欣赏这张善良的、有教养的脸,只顾欣赏这江南的表情,水的表情,却忘了对他说声谢谢,把最诚挚的心情告诉他,当我忽然记起,正要张口表达,人潮猛然涌了过来,一转身,我已找不到他,只看见攒动的人头,波动的各色衣服……
还记得那年春天,我一人在秦岭深处行走,山路两旁开满鲜花,灯芯花,野草莓花,苜蓿花,蒲公英花……路下面的小河,清澈如镜,温柔如绸,淙淙的水声在轻唤谁的乳名,四周的群山,一律被松树、柏树、桦树和茂密灌木覆盖。闻着花香,听着水声,看着山色,我恍然已走入了那“拈花微笑”的仙境。正在此时,迎面走来一位小女孩,她头上插了几朵野花,手里拿着一束菖蒲,好看的脸上满是羞涩,浑身洋溢着纯真的自然气息,但我不便过分地注意她,我怕她受到惊吓,于是我停下来,为她让路,然后静静地看她远去,欣赏她的背影,却记不请她的眼睛和脸究竟是什么样子,匆匆一瞥里只得到“好看”的朦胧感觉。也许,或者是一定的,我这一生只有这一次和她相遇了,只有这一次,在她还是小女孩的时候。我突然感到十分的失落和惆怅。我想在记忆里逼真地收藏一个像野花一样纯真的秦岭女孩,这也许是她一生里最生动的瞬间,我记起了泰戈尔的诗句:“我不知道你是多么美丽,你像花一样盲目。”我情不自禁地转过身来,沿着小女孩走去的方向走着,走到山路转弯的地方,出现了一个三岔路口,我已经无法知道小女孩走进了哪一条路径。就那么一转身,她消失在命运的路径,也许就是我此生永远都不能踏上的路径……
冬天,已经很冷了,西伯利亚寒流远道而来,遭遇袭击的当然是穷人,最可怜的是乞丐。乞丐不多,但不多的乞丐也常常有力地触动和唤醒我们冬眠的良心。在南大街路口,我看见一位贫寒凄苦的中年乞丐,我急忙赶回家,拿上我去年穿过的那件防寒服找他,可是来到南大街,已不见了他,于是我在东大街找他,又在北大街找他,都没有找到,最后我来到丁字街,还是没有找到他,却遇到了一个老年乞丐,一转身,苦难交换了方向,交换了背影。于是我把防寒服披在这位贫苦老人的身上,希望他下降的体温稍稍回升,希望降温的人性稍稍回升。我由此想到,亚洲的穷人,非洲的穷人,全世界的穷人,想到徘徊在文明大街上的那些孤苦身影,一转身,他们到哪里去了?而文明,你能否追上去,轻轻拉起那褴褛的衣襟,或者握起那空空的手,仔细看看他们的眼睛?他们到哪里去了,一转身?
一转身,车窗外的河流已经不知去向;一转身,门前的那只鸟已不见踪影;一转身,天上的那座虹桥已经悄然消失;一转身,水里的鱼已经没入深渊;一转身……
旭日一转身变成落日,青丝一转身变成白发……等一等,等一等,能否再转回来?

转载自:《南方日报》

ubuntu下允许root用户ssh远程登录

SSH服务器,可以通过SSH协议来访问远程服务器,代替telnet和ftp。安装OpenSSH server:
1. 使用apt命令安装openssh server
$ sudo apt-get install openssh-server
如果找不到安装包可用apt-get update (必须保证DNS能够域名解析)
2. 可以对 openssh server进行配置
$ sudo vi /etc/ssh/sshd_config
3. 重启 openssh server
$ sudo /etc/init.d/ssh restart
4. 客户端如果是ubuntu的话,则已经安装好ssh client,可以用下面的命令连接远程服务器。
$ ssh xxx.xxx.xxx.xxx
如果是windows系统的话,可以使用SSH Secure Shell等ssh软件进行远程连接。

对今天C语言机考的吐槽和感想

考试内容

第一个函数,拼接字符串,并且要求该函数能够对异常进行处理,函数只接受两个字符指针,没有告诉我字符串1所在的数组长度,所以无法避免有时候会超出字符串1所在数组的内存空间造成内存访问异常。我绞尽脑汁都想不出来如何避免由于结果字符串过长导致的内存访问异常,除非动用C库函数,而我又担心使用库函数会扣分,所以就直接放弃对异常处理了。但愿影响不大。

第二个函数,插入字符串,也是要求能够对异常进行处理,函数接受两个字符指针,和插入位置索引。这个稍稍知道,大致应该是如果插入位置大于了字符串1的长度,就出错,额,但是回到宿舍又想,如果插入位置小于0的话,也应该出错,当时没想到这个情况。我认为该题考查错误的“重点”在于判断插入位置是否大于字符串1的长度,而不是判断那个插入索引值是否小于0。但愿影响不大。。。

总结:这两个函数我均用C语言基本的语句来实现的,没有借助任何库函数,但是在不借助库函数的前提下,不管是上述哪个函数,都无法做到对异常的完美处理。

如果非要考虑特殊情况,那么还可能出现如下情况:

  1. 传递的字符指针不合法,比如,传入一个未经初始化的指针,它的值是随机的,那么也会出错,但这根本没法预料;
  2. 程序堆栈已满或者溢出,造成函数中的局部变量的内存无法正常分配,(多级函数调用的时候可能会出现堆栈用完的情况,比如一个错误的无法停止的递归函数);
  3. ……

这些情况都不是简简单单能够处理的,所以总的来说,对考试题目的解答实际上并不能做到完美,题目也没有说清楚到底是处理哪些异常。

C语言是一门追求高效的高级语言

如果能够让程序员自己预料可能存在的错误并且尽可能去避免,而不是依赖函数本身来完成对错误的检查,那无疑更贴近“追求高效”的目的。

正如C语言从来不检查下标是否越界,它把这个“包袱”扔给了程序员自己,让程序员自己保证不会出现下标越界,这更印证了本节开头的观点。
假设C语言自己会检查下标是否越界,那么我们每次使用下标的时候,它就会用一次判断来检查下标是否越界,假如我使用了一万次下标,他就要比较一万次,天哪!如果一个有良好技巧且追求高效率的程序员遇到这样的C语言,他估计会崩溃!就一个“优秀的”程序员本身来说,肯定是会想办法避免下标越界的,如果C语言“自作多情地”再检查一遍,效率岂不是太低?何况C语言中,下标的本质是“以数组其实地址为基址的内存偏移量”,这也简化了C语言对数组和对下标的处理。以“牺牲”一点安全性换取这么多的“高效”,这确实是个好主意!C语言本来就是为了高效灵活而诞生的,很多人喜欢C语言就是因为它的灵活和高效,如果一切都限制、都检查得太死,就让C语言暗淡太多了。

我的感想

结合这次机考,我认为函数应该“安分守己”完成自己的“本职工作”,写函数的时候应该“假设”所传递的实际参数是正确的、不会出现问题的,函数按照正常过程完成功能就行了。同时我们调用函数的时候,应该保证传递给函数的实际参数是正确的、不会出现问题的,需不需要检查参数,由调用者的实际情况决定,需要检查,那么我就在调用函数之前检查参数是否有问题,再判断是否需要调用函数,如果能够断定参数没有问题,那么就不检查参数而直接调用函数,这样就能提高很多效率。总的一句话概括就是:函数完成函数自己的事情,“错误检查”和“错误避免”应该交给“外部”处理。(这个“外部”包括调用函数的地方,甚至包括程序员自己。)

连标准的C库函数都没有对内存访问越界进行检查。这也支持了“C语言是一门追求高效的高级语言”这一说法。

标准C库函数中的这些函数之所以没有对可能出现的错误进行检查,也许是为了提高程序的执行效率,把避免错误的任务交给了程序员自己,让程序员自己评估可能发生的错误以及尽可能地去避免错误,我想这样的做法是最好的。

Centos5.x和Centos6.x 系统一键搭建PPTP

第一步: 下载CentOS一键安装包

CentOS 5.x:
wget http://linux.linzhihao.com/shell/pptp_centos5.sh
chmod 755 pptp_centos5.sh

CentOS 6.x:
wget http://linux.linzhihao.com/shell/pptp_centos6.sh
chmod 755 pptp_centos6.sh

第二步: 运行一键安装包
bash pptp_centos.sh

会有三个选择:
1. 安装VPN服务
2. 修复VPN
3. 添加VPN用户

首先输入1,回车,VPS开始安装VPN服务(VPN服务安装完毕后会默认生成一个用户名为vpn,密码为随机数的用户来。)

此外需要添加新的VPN用户时,作如下操作,
#bash pptp_centos.sh
然后选择3,然后输入用户名和密码,OK

4. 修复VPN服务
如果VPN拨号发生错误,可以试着修复VPN,然后重启VPS
#bash pptp_centos.sh
选择2,然后reboot

用户名密码文件:/etc/ppp/chap-secrets
端口:1723

Qt Creator 2.6 + MinGW-gcc440_1 + qt 4.8.4 开源版本 配置

Qt Creator 2.6 + MinGW-gcc440_1 + qt 4.8.4 开源版本 配置
准备:
Qt Creator 2.6 基于 Qt 4.8.3 qt-creator-windows-opensource-2.6.0 MinGW-gcc440_1 Gcc 版本为 4.4.0,一定是需要这个版本 http://code.google.com/p/piece-of-c/downloads/detail?name=MinGW-gcc440_1.zip&can=2&q= qt 4.8.4 开源版本(4.8.3也可以)
qt-win-opensource-4.8.4-mingw
安装步骤:
1. 安装 Qt Creator 2.6, 假设目录为 D:\Cplusdev\Qt\QtCreator2.6
2. 解压缩MinGW-gcc440_1到目录D:\Cplusdev\Qt\MinGW-gcc440_1
3. 安装qt-win-opensource-4.8.4-mingw,期间选择MinGW的目录为 D:\Cplusdev\Qt\MinGW-gcc440_1\mingw。
4. 打开QtCreator, 工具-选项-Qt版本, qMake路径选择D:\Cplusdev\Qt\4.8.4\bin\qmake.exe
5. Compiler添加MinGW,路径选择 D:\Cplusdev\Qt\MinGW-gcc440_1\mingw\bin\mingw32-g++.exe
6. 配置kits,Complier选择MinGW,Qt version选择Qt 4.8.4