教程:Amazon EC2/Ubuntu系统下搭建PPTP VPN环境

以下是基于Amazon EC2/Ubuntu搭建PPTPD服务提供VPN连接的过程记录。至于为什么要搞VPN,大家都懂的。。。而我主要是要访问Python的一些网站以及使用我非常喜欢的Google docs。

PPTP采用TCP 1723端口,因此在Amazon EC2的防火墙配置中,必须打开这个端口,否则client端无法接入。(网上有文章说也需要打开47端口(GRE端口),我在Amazon EC2上试验的结论是不需要特别设置。)

step1: 安装pptpd

很简单的命令:sudo apt-get install pptpd

step2: 修改pptpd的配置

有三个文件需要修改:

(1)修改/etc/pptpd.conf,添加以下内容(原文件中可能已经有这些内容,确认即可)

localip 192.168.0.1

remoteip 192.168.0.100-110

localip是指VPN建立后,client可以用这个地址访问VPN server。

remoteip就是指分配给client的地址。

(2)修改/etc/ppp/pptpd-options文件,增加以下内容:

ms-dns 8.8.8.8

ms-dns 8.8.4.4

这个配置是使用Google的DNS解析。至于原因,你也懂的。。。

(3)修改/etc/ppp/chap-secrets文件,设置客户机登录的帐号和密码:

# client server secret IP addresses

hilinux * 1234 *

“client”是用户名,“server”是服务器地址,”secret”是登录密码,”IP addresses”是分配的地址,如果指定*,则由系统自动分配。

step3: 重起PPTPD服务:sudo service pptpd restart

step4:配置IP转发

修改/etc/sysctl.conf文件,打开以下的注释:

net.ipv4.ip_forward=1

step5: 重新加载IP转发配置

sudo sysctl -p

step6: 修改Iptables,设置网络地址翻译

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

上述设置在重起后悔丢失,因此需要修改 /etc/rc.local文件, 在exit 0之前添加以下语句:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

step7: 配置DDNS

Amazon EC2每次重起都会变换地址,因此我们需要配置DDNS来获取动态域名解析。在这一步之前,需要在DynDNS上申请一个免费的域名。国内类似的服务商是“花生壳”,我没有进行过测试,不知道“花生壳”是否也适合以下配置。

申请到DynDNS帐号后,下载并安装ddclient:

sudo apt-get install ddclient

安装过程中, 会有简单的界面进行配置, 设置dyndns的相关帐户即可。设置完成后, 配置信息会自动写入/etc/ddclient.conf文件。

完成上述步骤后,就可以在windows客户端拨号建立VPN连接了。

安全警告:此网页包含的内容将不使用安全的HTTPS连接传送解决办法

在使用IE8访问某些论坛中带有图片的帖子时,总是会弹出一个警告对话框,提示说此网页包含的内容将不使用安全的HTTPS连接传送,可能危及到整个网页的安全,询问是否只查看安全传送的网页内容,每次只有选择“否”才能正常显示其中的图片,可以说是相当的麻烦……

其实,这只是IE默认的设置在发生作用,对于那些采用HTTPS协议的网站,如果网页包含经加密传送的HTTPS内容和未经加密传送的HTTP内容时,IE8就会弹出这样的提示信息,假如选择“否”,那么会有一些图片和内容无法显示。如果你确认该网站安全,那么可以按照下面的方法解决这一问题。

打开“Internet选项”对话框,切换到“安全”选项卡,单击“自定义级别”按钮,打开“安全设置/Internet区域”对话框,找到“其他”小节,将“显示混合内容”由默认的“提示”更改为“启用”(如图),确认并重启IE之后即可生效。

SVN版本管理器服务端安装与配置

我用的SVN服务端是SubVersion,版本:Setup-Subversion-1.6.6.msi。
关于SubVersion的搭建,这里就简单总结一下。其实比较复杂的只是与apache的结合。
1,安装Subversion,TortoiseSVN:
Subversion的下载地址:http://subversion.tigris.org/
TortoiseSVN的下载地址如下:http://tortoisesvn.tigris.org
逐个安装,没什么好说的。
2,安装apache
我安装的是apache2.2版本,这里要特别说明一下,用集成的xampp开发包里面的apache配置SVN问题比较多,建议另外安装.单独安装apache可能会导致原来的xampp开发包不可用,apache+php+mysql的搭建方法可以参考《安装配置apache+php+mysql小结》。
3,Subversion和apache结合:
安装好apache后,进入SubVersion的安装目录,在bin目录下,选中mod_authz_svn.so与mod_dav_svn.so两个文件,选择拷贝 进入Apache的安装目录modules目录下,回到Apache安装目录的conf目录,打开httpd.conf文件,找到
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
去掉签名的#注释。在<IfModule !mpm_netware_module>的前面,#LoadModule vhost_alias_module modules/mod_vhost_alias.so(大概127行)的后面添加:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
表示将我们之前拷贝的模块导入到Apache中,转到该文件的最后,增加如下内容:
<Location /svn>
DAV svn
SVNPath D:/svn/lianyu
AuthType Basic
AuthName “Subversion Repository”
AuthUserFile D:/svn/passwd/passwords
Require valid-user
</Location>
(全文…)

Windows平台网站文件同步备份解决方案——cwRsyn

对于一个网站来说,用户上传文件的同步备份是必需要解决的问题。对于有着巨量上传文件的大型网站,一般采用分布式存储系统。而对于上传文件量不是很大的网站,只要在另外一台服务器上保存上传文件的同步备份,避免单点故障,就可以满足需求。如果采用分布式存储系统,性价比不是很高,而cwRsyn就是一个不错的选择。
下面简单介绍一下如何使用cwRsyn进行文件同步。
cwRsync是Windows平台的文件同步解决方案,cwRsync打包了rsync和cygwin,rsync是Linux平台的文件同步软件,cygwin是一个在Windows平台上运行的Linux模拟环境。
1. cwRsync服务端安装与配置
1) 下载并安装cwRsyncServer,下载地址:http://sourceforge.net/projects/sereds/files/。
安装过程中,会出现创建用户的窗口,输入用户名写密码后,安装软件会自动创建一个Windows帐户。cwRsyncServer以Windows服务方式运行时,系统会使用这个帐户运行服务(要注意该帐户是否对要同步的文件夹有权限),当然你也可以用系统帐户来运行服务。 (全文…)

最新(原创) Intel面试题

去英特尔面试,被无声无息了。据说是headcount取消了,呜呜。
发出上机题,供广大程序兄弟参考。
题目(上机,一个小时时间):
输入一串数字,如:3 3 1 2 3 4 5 6 7 8 9
第一个数字表示行数,第二个表示列数,后面的表示矩阵里的值。生成的矩阵如下:
1 2 3
4 5 6
7 8 9
然后按顺时针方向螺旋输出,在上面的例子中,顺序是:1 2 3 6 9 8 7 4 5
要求输入输出如下:
Input:
3 3 1 2 3 4 5 6 7 8 9
1 3 1 2 3
Output:
1 2 3 6 9 8 7 4 5
1 2 3
说实话比较简单,也没规定用什么语言,我用python写的,45分钟的样子:

import os, sys

def buildMatrix (inputList):
# print rowNum, colNum
inputListTrim = inputList[2:]
# print inputListTrim
inputMatrix = []
tmpCount = 0

for tmpRowNum in range(rowNum):
tmpList = []
for tmpColNum in range(colNum):
# print tmpRowNum, tmpColNum, tmpCount
tmpList.append(inputListTrim[tmpCount])
tmpCount += 1
inputMatrix.append(tmpList)
return inputMatrix

def outputMatrix (inputMatrix):
inputMatrixBuf = inputMatrix
outputList = []
while (len(inputMatrixBuf) > 0):
tmpList = []
tmpList = [tmpStr for tmpStr in inputMatrixBuf[0]]
inputMatrixBuf = inputMatrixBuf[1:]
outputList += tmpList

if (len(inputMatrixBuf) == 0):
break
tmpList = []
for tmpCount in range(len(inputMatrixBuf)):
tmpList.append(inputMatrixBuf[tmpCount].pop())
outputList += tmpList

if (len(inputMatrixBuf) == 0):
break
tmpList = []
tmpListBuf = []
tmpListBuf = reversed(inputMatrixBuf[-1])
tmpList = [tmpStr for tmpStr in tmpListBuf]
inputMatrixBuf = inputMatrixBuf[:-1]
outputList += tmpList

if (len(inputMatrixBuf) == 0):
break
tmpList = []
for tmpCount in range((len(inputMatrixBuf) – 1), -1, -1):
tmpList.append(inputMatrixBuf[tmpCount][0])
inputMatrixBuf[tmpCount] = inputMatrixBuf[tmpCount][1:]
outputList += tmpList

# print inputMatrixBuf
return outputList

inputListStr = raw_input(“Input:\n”)
inputList = inputListStr.split()
#print inputList

if (len(inputList) < 2):
sys.exit(“Could not got row & col numbers!”)

rowNum = int(inputList[0])
colNum = int(inputList[1])

if ((rowNum * colNum) != (len(inputList) – 2)):
sys.exit(“Wrong Arguments Number!”)

inputMatrix = buildMatrix(inputList)
#print inputMatrix
outputList = outputMatrix(inputMatrix)

print “output:”
print ” “.join(outputList)

Discuz 完美解决DZ论坛整合 登录注册登出注销用户数据

说明:自己有网站(SNS),以下都用SNS代表自己网站,也有自己单独的会员系统,但想在自己网站上整合进DZ论坛时,遇到了注册、登陆、退出三 要素的同步处理问题。
例如在我自己网站上登陆了,到了论坛却还要登陆一次,然后,两边的登陆名字也可能并不相同,正是因为此,所以才有了下面这篇 文章。

资源:
UCenter_1.0.0_SC_UTF8     安装DZ论坛,必须先安装这个用户控制中心
Discuz_6.1.0_SC_UTF8      DZ论坛,注意与上面的UCenter字符编码要一致 (全文…)

MySQL 字符串函数:字符串截取

MySQL 字符串函数:字符串截取

MySQL 字符串截取函数:left(), right(), substring(), substring_index()。 还有 mid(), substr()。 其中,mid(), substr() 等价于 substring() 函数,substring() 的功能非常强大和灵活。 (全文…)

MYSQL-中文检索匹配与正则表达式

今天在做mysql的一个搜索的时候发现我用 select name from contact where name like ‘%a%’的时候出来的结果除了包含a的名字外连包含中文“新”的名字也出现在搜索结果里面,这令我想弄清楚mysql的匹配模式和规则到底是怎么样的,所以决定查查资料了解了解,另外在匹配的时候正则表达式也很常用!所以准备在这里记录我学习这两个玩意的收获!
出现这个问题的原因是:MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象。
解决办法
1.在建表的时候对于包含中文的字段加上“BINARY”属性,使之进行二进制比较,例如讲”name char(10)”改成”name char(10) BINARY”。但是这样你对该表的该字段进行匹配的时候是区分大小写的。
2.如果使用源码编译MySQL,可以在编译的时候使用–with–charset=gbk参数,这样mysql就直接支持中文查找和排序。
3.使用mysql的locate函数来判断。如:
SELECT * FROM table WHERE locate(substr,str)>0 ;
locate()有两个形式:

LOCATE( substr , str ) ,  LOCATE(substr str , pos)

。返回substr在str中的位置,如果str不包含substr返回0。这个函数也是不区分大小写的。
4.这样使用sql语句:SELECT * FROM TABLE WHERE FIELDS LIKE BINARY ‘%FIND%’,但是这和1一样是区分大小写的如果你想进行不区分大小写的查询的时候就要使用upper或者lower进行转换。
5.使用binary和ucase函数及concat函数。ucase是讲英文全部转换大写,concat对字符串进行连接。新的sql语句如下:
select id,title,name from achech_com.news where binary ucase(title) like concat(‘%’,ucase(‘a’),’%')
也可以写为select id,title,name from achech_com.news where binary ucase(title) like ucase(‘%a%’)
检索的结果还算满意吧,不过速度可能会因此而慢N毫秒喔。 因为使用like和%进行匹配的话对效率会有一定的影响。

正则表达式:
正则表达式是为复杂搜索指定模式的强大方式。
^
所匹配的字符串以后面的字符串开头
mysql> select “fonfo” REGEXP “^fo$”; -> 0(表示不匹配)
mysql> select “fofo” REGEXP “^fo”; -> 1(表示匹配)
$
所匹配的字符串以前面的字符串结尾
mysql> select “fono” REGEXP “^fono$”; -> 1(表示匹配)
mysql> select “fono” REGEXP “^fo$”; -> 0(表示不匹配)
.
匹配任何字符(包括新行)
mysql> select “fofo” REGEXP “^f.*”; -> 1(表示匹配)
mysql> select “fonfo” REGEXP “^f.*”; -> 1(表示匹配)
a*
匹配任意多个a(包括空串)
mysql> select “Ban” REGEXP “^Ba*n”; -> 1(表示匹配)
mysql> select “Baaan” REGEXP “^Ba*n”; -> 1(表示匹配)
mysql> select “Bn” REGEXP “^Ba*n”; -> 1(表示匹配)

a+
匹配1个或多个a字符的任何序列。

mysql> select “Ban” REGEXP “^Ba+n”; -> 1(表示匹配)
mysql> select “Bn” REGEXP “^Ba+n”; -> 0(表示不匹配)

a?
匹配一个或零个a
mysql> select “Bn” REGEXP “^Ba?n”; -> 1(表示匹配)
mysql> select “Ban” REGEXP “^Ba?n”; -> 1(表示匹配)
mysql> select “Baan” REGEXP “^Ba?n”; -> 0(表示不匹配)

de|abc
匹配de或abc
mysql> select “pi” REGEXP “pi|apa”; -> 1(表示匹配)
mysql> select “axe” REGEXP “pi|apa”; -> 0(表示不匹配)
mysql> select “apa” REGEXP “pi|apa”; -> 1(表示匹配)
mysql> select “apa” REGEXP “^(pi|apa)$”; -> 1(表示匹配)
mysql> select “pi” REGEXP “^(pi|apa)$”; -> 1(表示匹配)
mysql> select “pix” REGEXP “^(pi|apa)$”; -> 0(表示不匹配)

(abc)*
匹配任意多个abc(包括空串)
mysql> select “pi” REGEXP “^(pi)*$”; -> 1(表示匹配)
mysql> select “pip” REGEXP “^(pi)*$”; -> 0(表示不匹配)
mysql> select “pipi” REGEXP “^(pi)*$”; -> 1(表示匹配)

{1} {2,3}
这是一个更全面的方法,它可以实现前面好几种保留字的功能
a*
可以写成a{0,}
a
可以写成a{1,}
a?
可以写成a{0,1}
在{}内只有一个整型参数i,表示字符只能出现i次;在{}内有一个整型参数i,
后面跟一个“,”,表示字符可以出现i次或i次以上;在{}内只有一个整型参数i,
后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下
(包括i次和j次)。其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是25
5)。 如果同时给定了m和n,m必须小于或等于n.

[a-dX], [^a-dX]

匹配任何是(或不是,如果使用^的话)a、b、c、d或X的字符。两个其他字符之间的“-”字符构成一个范围,与从第1个字符开始到第2个字符之间的所有字符匹配。例如,[0-9]匹配任何十进制数字 。要想包含文字字符“]”,它必须紧跟在开括号“[”之后。要想包含文字字符“-”,它必须首先或最后写入。对于[]对内未定义任何特殊含义的任何字符,仅与其本身匹配。

mysql> select “aXbc” REGEXP “[a-dXYZ]“; -> 1(表示匹配)
mysql> select “aXbc” REGEXP “^[a-dXYZ]$”; -> 0(表示不匹配)
mysql> select “aXbc” REGEXP “^[a-dXYZ] $”; -> 1(表示匹配)
mysql> select “aXbc” REGEXP “^[^a-dXYZ] $”; -> 0(表示不匹配)
mysql> select “gheis” REGEXP “^[^a-dXYZ] $”; -> 1(表示匹配)
mysql> select “gheisa” REGEXP “^[^a-dXYZ] $”; -> 0(表示不匹配)

[[.characters.]]
表示比较元素的顺序。在括号内的字符顺序是唯一的。但是括号中可以包含通配符,
所以他能匹配更多的字符。举例来说:正则表达式[[.ch.]]*c匹配chchcc的前五个字符

[=character_class=]
表示相等的类,可以代替类中其他相等的元素,包括它自己。例如,如果o和( )是
一个相等的类的成员,那么[[=o=]]、[[=( )=]]和[o( )]是完全等价的。

[:character_class:]
在括号里面,在[:和:]中间是字符类的名字,可以代表属于这个类的所有字符。
字符类的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、uppe
r、cntrl、print和xdigit
mysql> select “justalnums” REGEXP “[[:alnum:]] “; -> 1(表示匹配)
mysql> select “!!” REGEXP “[[:alnum:]] “; -> 0(表示不匹配)

alnum 文字数字字符
alpha 文字字符
blank 空白字符
cntrl 控制字符
digit 数字字符
graph 图形字符
lower 小写文字字符
print 图形或空格字符
punct 标点字符
space 空格、制表符、新行、和回车
upper 大写文字字符
xdigit 十六进制数字字符

[[:<:]]
[[:>:]]
分别匹配一个单词开头和结尾的空的字符串,这个单词开头和结尾都不是包含在alnum中
的字符也不能是下划线。
mysql> select “a word a” REGEXP “[[:<:]]word[[:>:]]”; -> 1(表示匹配)
mysql> select “a xword a” REGEXP “[[:<:]]word[[:>:]]”; -> 0(表示不匹配)
mysql> select “weeknights” REGEXP “^(wee|week)(knights|nights)$”; -> 1(表示
匹配)

要想在正则表达式中使用特殊字符的文字实例,应在其前面加上2个反斜杠“\”字符。MySQL解析程序负责解释其中一个,正则表达式库负责解释另一个。例如,要想与包含特殊字符“+”的字符串“1+2”匹配,在下面的正则表达式中,只有最后一个是正确的:

mysql> SELECT '1+2' REGEXP '1+2';                       -> 0
mysql> SELECT '1+2' REGEXP '1\+2';                      -> 0
mysql> SELECT '1+2' REGEXP '1\\+2';                     -> 1

PHP 中的数据库缓存原理

本文章作者主要是用到 php 里面的数据库缓存,php缓存,cache_write,var_export功能对数据进行缓存操作了,觉得写得很不错。

如果后台应用接收到浏览器端的查询请求后,每次都与数据库连接读取数据,势必增加数据库的负担。而往往有大量的请求是重复的,我们可以把这些重复的信息采用缓存技术保存下来,重复使用,这样,在某些情况下可以大大提高程序的性能。

一、缓存函数

cache_write函数接受$string参数,写到$file文件中。注意var_export函数,作用是:

此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。

这些参数可以是数组或常量,而这些数组或常量通常为从数据库中取出的记录,或非序列化(unserialize)对象后得到的数据。这些都可以缓存到本地的文本文件中。

cache_write函数很简单,需要读取数据时,先判断缓存是否存在,存在的话就不去连接数据库取数据,而是直接读出缓存的文本文件,直接产生了数组或常量等类型的数据,可以直接使用。 (全文…)

PHP Page Cache 页面缓存类

一个PHP Page Cache 的页面缓存类,代码结构还不错,大家有需要可以拿来用。

(全文…)