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

vs2012 编译 Qt 4.8.4

Qt4.8.4 添加了 vs2012 的 makespace, 编译Qt方便多了。但据说对于webkit vs2012不支持,有错误。所以我在编译中去掉了webkit.  如果使用到webkit,可以试下,看看能不能简单修改代码通过编译。

使用vs2012的cmd, 基于编译目标, 使用x86 或者 x64 的cmd, 修改QTDIR目录, 运行一下脚本:

 

set QTDIR=E:\devsoftware\qt-everywhere-opensource-src-4.8.4-amd64
set QMAKESPEC=win32-msvc2012
set PATH=%PATH%;%QTDIR%\bin
cd %QTDIR%
configure.exe  -debug-and-release -opensource -fast -no-qt3support -qt-zlib -mp -no-webkit
y
nmake -i

 

编译时并行的,如果是用笔记本,非商业散热设计的话,最好用鲁大师控制下Cpu最高温度,节能降温:)。

nmake使用 -I 参数忽略错误,避免卡主编译过程

***************************************************************************************************************************************

最后附上 vs2012 编译 Qt 4.8.3的过程, 看别人文章的笔记,记不得出处了
1. 建立环境变量
call "E:\devsoftware\VS2012\VC\vcvarsall.bat" amd64
set QMAKESPEC=win32-msvc2010
set QTDIR=E:\devsoftware\qt-everywhere-opensource-src-4.8.3-vs2012-amd64
set PATH=%PATH%;E:\devsoftware\qt-everywhere-opensource-src-4.8.3-vs2012-amd64\bin

2. 修改 mkspecs\win32-msvc2010\qmake.conf
将 QMAKE_COMPILER_DEFINES  += _MSC_VER=1600 WIN32 当中的1600改成1700
QMAKE_CFLAGS            = -nologo -Zm200 -Zc:wchar_t-
改为
QMAKE_CFLAGS            = -nologo -Zm200 -Zc:wchar_t

3.  在控制台中,切换到Qt的安装目录下。使用如下参数进行配置
configure.exe  -debug-and-release -opensource -fast -no-qt3support -qt-zlib -mp

4. 修改代码错误 1
.\wtf/HashSet.h(180) : error C2664: 'std::pair<_Ty1,_Ty2>::pair(const std::pair<_Ty1,_Ty2> &)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'const std::pair<_Ty1,_Ty2> &'
在Qt的Src目录搜索这个HashSet.h

E:\devsoftware\qt-everywhere-opensource-src-4.8.3-vs2012-amd64\src\3rdparty\webkit\Source\JavaScriptCore\wtf

template<typename Value, typename HashFunctions, typename Traits>
template<typename T, typename HashTranslator>
inline pair<typename HashSet<Value, HashFunctions, Traits>::iterator, bool>
HashSet<Value, HashFunctions, Traits>::add(const T& value)
{
typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
return m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
}
将180行所在的函数以及它下面的函数用下面的代码替换:
template<typename T, typename U, typename V>
inline pair<typename HashSet<T,U,V>::const_iterator, bool> HashSet<T,U,V>::add(const ValueType &value)
{
auto p= m_impl.add(value);
return make_pair(typename HashSet<T,U,V>::const_iterator(p.first), p.second);
}
template<typename Value, typename HashFunctions, typename Traits>
template<typename T, typename HashTranslator>
inline pair<typename HashSet<Value, HashFunctions, Traits>::iterator, bool>
HashSet<Value, HashFunctions, Traits>::add(const T& value)
{
typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
typedef typename HashSet<Value, HashFunctions, Traits>::iterator iter_type;
auto& temp = m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
return make_pair((iter_type)temp.first, temp.second);
}

5. 修改代码错误 2
platform\DefaultLocalizationStrategy.cpp(327) : error C2001: newline in constant
platform\DefaultLocalizationStrategy.cpp(327) : fatal error C1057: unexpected end of file in macro expansion
这个错误的原因是因为代码里面的非英文的引号造成的。
E:\devsoftware\qt-everywhere-opensource-src-4.8.3-vs2012-amd64\src\3rdparty\webkit\Source\WebCore\platform

原始的错误代码如下:

return WEB_UI_STRING("Look Up “<selection>”", "Look Up context menu item with selected word").replace("<selection>", truncatedStringForLookupMenuItem(selectedString));

大家注意 <selection> 单词前后的引号。就是它造成编译报错。修改成下面的代码

return WEB_UI_STRING("Look Up \"<selection>\"", "Look Up context menu item with selected word").replace("<selection>", truncatedStringForLookupMenuItem(selectedString));

6. nmake -i 编译

5. 修改代码错误 1

转载自:http://blog.csdn.net/salmonrun/article/details/8298146