www.kingmaxyang.cn

不能不说的秘密

我开始理解

我开始理解为什么Google、Facebook、Youtube、Tweeter这些世界互联网巨头,被中国封杀多年,依然不想办法解决或者妥协。他们不是不重视中国市场,而是在鬼佬的价值观里面,赚钱和商业利益不是放在第一位的。他们先要做自己认为正确的,自己喜欢的,认为对社会和大众有价值的事情,其次才是考虑商业利益。因此他们宁可放弃中国这个拥有5亿网民(可能是世界网民的一办?)的巨大市场,也不向中国政府的规则妥协,而违反自己的原则。

这种想法在中国人看来是很不可理解,但在鬼佬的思维里面是很正常的。我经常在国外电子商务网站购物,有时注册的帐号会被网站封杀,原因是“买得太多”。这在中国人看来很荒诞,不是生意越多越好的吗?但是鬼佬就是这样,他认为你不是“End User”,捣乱了市场秩序。这种行为表面上像Stupid,实际上是大智若愚。正是因为“守规矩”,才让老美无论在商业还是技术领域都立于不败之地。

我以前经常会有一个疑惑,就是到底是过程重要还是结果重要。最完美当然是又能赚到钱又能做喜欢的事情。但如果只有两个选择,一是什么都不用做,直接得到一笔巨额财富,二是经过千辛万苦后才获得财富,以前我可能还会考虑,现在会豪不犹豫地选择后者。因为后者除了得到成功的标记物(财富)外,更重要的是得到了一个非常具创造感的过程。这种自我实现享受是前者不能拥有的。在这层意义上来说,二世祖其实并不幸福。

很简单的一个例子,就是比尔盖茨和乔布斯。二者的财富是差距较大的,盖茨是过1000亿(dollar),而乔布斯只有不过几十亿。但乔布斯在这几年的社会影响力却比盖茨要强,这让盖茨都感到羡慕。财富固然是一个比较客观的事业成就的标志物,但是获得成功过程中的创造感和对社会、世界造成影响的成就感,却不是财富能够带来。财富只是通往成功路后带来的其中一个产物而已,而并不是目的。只有竖立了这样的价值观,才有可能获得巨大的成功。

posted by kingmaxyang in Can't Unsay and have No Comments

陈士骏传记分享

  1999年的时候,我离开伊利诺伊来到硅谷,那时候,就发现这里有不少百万千万亿万富翁,他们明明已经很有钱了,却放弃舒适的休闲生活,他们的家里也许有十几个卧室,有人还有私人的高尔夫球场,可他们每天还是驱车来到小镇上破旧的办公室,每周一待就是80个小时,他们是为了什么?
  那时候,我觉得这些人疯了,按照一般人的想法,如果你拼命工作,慢慢地就能赚到钱,然后买下车子、房子,再盼着退休天天去打高尔夫球。可是当你每天去打高尔夫球,打了两个月的时候,实际上,你又会发现,你工作,是因为你喜欢工作,而不是要用它换取什么。
  很多人跟我说,假如我有你那么多钱的话,我每天都会去想方设法地玩,而不是去工作,而我想要回答他们说,因为你们这么想,所以你们永远不会有那么多钱。钱不是目的,不要把它当目的。  

posted by kingmaxyang in Can't Unsay,Life and have No Comments

Good bye 2011

明年见!

这大概是今天说得最多的一句话。回顾今年,我算是做了不可思议非常之多的事情。年初,我全力开发一个大型的ERP软件,可惜选题不好,面向餐饮和kalaOK行业,未正式应用已经感觉前景太难,加上已经启动电子商务的新项目,精力有限,最后就只做成了一个财务软件在顾客处在用至今。

美购网的正式启动应该是在三月末,当时我们就在华工租的一间民居办公,办公设备就只有几台笔记本,一台PC组装服务器。我们的启动没有热闹的鞭炮,华丽的剪彩,只有默默的开始写代码。累了,就到北湖跑两圈,或者篮球场上扔几球。至今,还挺怀念这生活。

四月,装修完毕,公司正式搬迁到科韵路,我们就从三名元老正式开始了新事业,同时开始招募美购网项目员工,组建团队。创业虽多年,但此前一直象个体户,至今日方有Teamwork的感觉。

年中,做了爸爸,确实也忙了好一会。宝宝健康成长,非常可爱。

下半年,全力以赴开始美购网项目的运营。起步基于淘宝业务,开发了一系列自己都觉得非常强大的接口。到年末的最后两个月,月营业额已经达到40万,仅在淘宝,预期有多。这中间经历了一些拆解与合并不详述。目前着眼于打好内功,优化流程,提升管理水准,做真正的代购专业网站,再进行大力推广。

2011,以前的老主顾还有找,因此我还兼顾了数个IT工程,还有若干外包业务。前提是不占用太多时间及有高性价比。在进口代购业务确立为我们的不二事业的同时,其他收入来源也暂时性地有选择的不放弃,这还让我本年的个人收入还不错。

还有,Svnchina.com也上轨道了,经历了年中一次改版,年末的一次双线服务器的搬迁。稳定胜于一切。

iPhone还掉进马桶里了,让我用了一个多月诺基亚。人是不能走回头路的,千万。

借「好爸爸车」的名义,还买了一台mazda5,7座商务进口,不超20万落地,高性价比符合我一贯作风。旧车就给我爸开了。虽然我名下汽车都两台,但我还是奉行环保原则,到迪卡农买两台自行车,一台我自己的骑车上班,一台我老婆的圣诞礼物。

今年还有很多事,感觉像过了很久,但又是过得很快。写着写着,已经是明年了。

明年见!

– 发送自我的 iPad

posted by kingmaxyang in Life and have No Comments

Ubuntu 10.04 Server Apache + SVN + SSL配置

Ubuntu 10.04 Server Apache + SVN + SSL配置
2010/12/10 14:08

一、安装准备(安装模块)

#sudo apt-get install apache2

#sudo apt-get install apache2-mpm-prefork

#sudo apt-get install apache2-utils

#sudo apt-get install libapache2-svn

#sudo apt-get install libapache2-mod-auth-pam(可选,用于PAM)

#sudo apt-get install libapache2-mod-auth-sys-group(可选,用于PAM)

#sudo apt-get install subversion

#sudo apt-get install subversion-tools

 

二、SVN配置

配置前说明:

我的Subversion文件仓库放在/home/svn,并且我的项目名称是简单的“myproject”。Subversion组名字是subversion

 

创建Subversion的组:

典型的情况下,您应该创建一个名为“Subversion”的组来拥有文件仓库所在的目录。

 

#sudo addgroup subversion

#sudo usermod -G subversion -a www-data

//subversion是组名,可自己定义,一般不需要更改

验证:

# cat /etc/group|grep subversion

subversion:x:1001:www-data,svnx

//你需要注销然后再登录以便您能够成为subversion组的一员

 

创建SVN库:

# cd /home

# sudo mkdir svn

#cd  svn

# sudo mkdir myproject

//此命令在svn目录下进行

# sudo chown -R root:subversion myproject

//此命令在svn目录下进行

# # sudo chmod -R g+rws myproject

//此命令在svn目录下进行

//赋予组成员对所有新加入文件仓库的文件拥有相应的权限

# sudo svnadmin create myproject  //此命令在svn目录下进行

 

可能的问题:

在后续Check in的时候遇到如下错误:

Can’t open ‘/home/svn/myproject/db/txn-current-lock’: Permission denied

解决方法:可以再次运行命令:

# sudo chown -R root:subversion myproject

 

三、Apache配置

先备份一下Apache2的配置文件:

sudo cp -R /etc/apache2 /etc/apache2_backup

 

通过WebDAV协议访问SVN文件仓库,您必须配置您的Apache 2 Web服务器。您必须加入下面的代码片段到您的/etc/apache2/mods-available/dav_svn.conf中:(加在文件最后面即可)

 

<Location /myproject>      //版本库名字,必须以/开始

DAV svn                    //不用改

SVNPath /home/svn/myproject //版本库路径

AuthType Basic

AuthName “myproject subversion repository”

AuthUserFile /etc/subversion/passwd   //密码文件路径。

<LimitExcept GET PROPFIND OPTIONS REPORT>

Require valid-user

</LimitExcept>

</Location>

 

特别说明:

1、如果需要用户每次登录时都进行用户密码验证,请将<LimitExcept GET PROPFIND OPTIONS REPORT>与</LimitExcept>两行注释掉。

2、当您添加了上面的内容,您必须重新起动Apache 2 Web服务器,请输入下面的命令:

#sudo /etc/init.d/apache2 restart

 

创建passwd 文件:

该文件包含了用户授权的详细信息。要添加用户,您可以执行下面的命令:

#sudo htpasswd -c /etc/subversion/passwd user_name

它会提示您输入密码,当您输入了密码,该用户就建立了。

 

最后,你就可以用客户端来访问了

http://主机IP/myproject

 

这样,就可以通过Web方式访问版本库了,不过这样的密码传输是纯文本方式的,基于安全方面的考虑,我建议你使用SSL。

四、SSL配置

Apache2已经在前面安装好了下面安装SSL模块:
安装SSL模块

#a2enmod ssl

 

我们可以使用openssl来创建,这里我就是此方法创建SSL证书的

#sudo cd /etc/apache2

#sudo mkdir ssl

#sudo cd ssl

#sudo openssl req -x509 -newkey rsa:1024 -keyout apache.pem -out apache.pem -nodes -days 999

 

注:在要求输入Common Name (eg, YOUR name)时,输入你的主机名。

示例过程如下:

Generating a 1024 bit RSA private key
…………………++++++
..++++++
writing new private key to ‘apache.pem’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:China
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Jiangxi
Locality Name (eg, city) []:Nanchang
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Nanchang Unversity
Organizational Unit Name (eg, section) []:Information Center
Common Name (eg, YOUR name) []:LinuxServer
Email Address []:111@gmail.com

复制一份站点配置做为SSL配置的原型
#cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl

#ln -s /etc/apache2/sites-available/ssl /etc/apache2/sites-enabled/ssl

编辑SSL的配置

#vi /etc/apache2/sites-enabled/ssl
把端口改为443
加入SSL认证配置
其它的根据需要自己定制与普通配置无异

<VirtualHost *:443>

ServerSignature On

SSLEngine On

SSLCertificateFile /etc/apache2/ssl/apache.pem

………………………

修改普通http方式的配置(apache2这里好像不用改,默认的已经是80端口)

编辑Apache端口配置,加入443端口(这里可以不用加“Listen 443”因为SSL默认认证的443端口已经打开)

 

别忘了把前面生成的SSL密钥文件拷贝过来

# sudo cp apache.pem  /proc/14646/cwd/apache.pem  //在apache.pem目录下

重启apache2

#/etc/init.d/apache2 restart

posted by kingmaxyang in Tech and have No Comments

服务器间大文件传输

转自:http://www.sar4.com/2010/11/21/Linux%E4%B8%8B%E5%A4%A7%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6.html

1,gzip+scp+gunzip
server1压缩并传送:

server1$ gzip -c /backup/mydb/mytable.MYD > mytable.MYD.gz
server1$ scp mytable.MYD.gz root@server2:/var/lib/myql/mydb/

server2解压:

server2$ gunzip /var/lib/mysql/mydb/mytable.MYD.gz

2,通道+ssh
server1压缩通过通道ssh传送到server2并在server2上解压

server1$ gzip -c /backup/mydb/mytable.MYD | ssh root@server2 "gunzip -c - > /var/lib/mysql/mydb/mytable.MYD"

3,通道+netcat
server2监听12345端口:

server2$ nc -l -p 12345 | tar xvzf -

server1传送数据:

server1$ tar cvzf - /var/lib/mysql/mydb/mytable.MYD | nc -q 1 server2 12345

4,rsync

server1$ rsync -ave ssh server2:/var/lib/mysql/mydb/ /home/mydb/

速度对比:
100 Mb/S Ethernet LAN.文件大小为738 MB可压缩至100 MB

Method 				Time (seconds)
rsync without compression 	71
scp without compression 	68
nc without compression 		67
rsync with compression (-z) 	63
gzip, scp, and gunzip 		60(44 + 10 + 6)
ssh with compression 		44
nc with compression 		42

 

posted by kingmaxyang in Tech and have No Comments

小小杨一个半月,精选部分照片

posted by kingmaxyang in Life and have No Comments

Dreamweaver CS 5.5

原来已经出到5.5,备忘下载地址

http://goodboy5264.blog.163.com/blog/static/2538298201151610415777/

posted by kingmaxyang in Life and have No Comments

彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, UTF-8

第一部分:  字符集历史

电子计算机技术是从美国开始发展起来的,因为美国使用的文字为英文,美国规定的计算机信息交换用的字符编码集是人们熟知的扩展的ASCII码,它以8bit字节为单位存储,ASCII的0-31及127为控制符,32-126为可见字符,包括所有的英文字母,阿拉伯数字和其他一些常见符号,128-255的ASCII码则没有定义。

ASCII对英语国家是够用了,但对其他西欧国家却不够用,因此,人们将ASCII扩展到0-255的范围,形成了ISO-8859-1字符集。值得一提的是,因为考虑到程序中处理的信息大多是西文信息,因此有些WEB容器(如:Tomcat4.x)在处理所接收到的request字符串时,如果您没指定request的编码方式则系统就缺省地采用ISO-8859-1,明白这一点对理解后面的问题会有帮助。

相比西方的拼音文字,东方的文字(如中文)的字符数要大得多,根本不可能在一个字节内将它们表示出来,因此,它们以两个字节为单位存储,以中文国标字符集GB2312为例,它的第一个字节为128-255。系统可以据此判断,若第一个字节大于127,则把与该字节后紧接着的一个字节结合起来共两个字节组成一个中文字符。这种由多个字节存储一个字符的字符集叫多字节字符集(MultiByte Charsets),对应的象ASCII这种用一个字节存储一个字符的字符集叫单字节字符集(SingleByte Charsets)。在GB2312字符集中,ASCII字符仍然用一个字节存储,换句话说该ASCII是该字符集的子集。

GB2312只包含数千个常用汉字,往往不能满足实际需要,因此,人们对它进行扩展,这就有了我们现在广泛使用的GBK字符集,GBK是现阶段Windows及其他一些中文操作系统的缺省字符集。它包含2万多个字符,除了保持和GB2312兼容外,还包含繁体中文字,日文字符和朝鲜字符。值得注意的是GBK只是一个规范而不是国家标准,新的国家标准是GB18030-2000,它是比GBK包含字符更多的字符集。

我国的台湾地区使用的文字是繁体字,其字符集是BIG5,而日本采用的字符集则是SJIS。它们的编码方法与GB2312类似,它们的ASCII字符部分是兼容的,但扩展部分的编码则是不兼容的,比如这几种字符集中都有”中文”这两个字符,但他们在各自的字符集中的编码并不相同,这就是用GB2312写成的网页用BIG5浏览时,看到的是乱糟糟的信息的原因。

可见,在字符集的世界里,呈现给我们的是一个群雄割据的局面,各字符集拥有一块自己的地盘。这给各国和各地区交换信息带来了很大的困难,同时,也给国际化(本地化)编程造成了很大的麻烦。

常言道:”分久必合”,随着国际标准ISO10646定义的通用字符集(Universal Character Set即UCS)的出现,使这种局面发生了彻底的改观。UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息。UCS 包含了用于表达所有已知语言的字符。不仅包括拉丁语、希腊语、 斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语和乔治亚语的描述、还包括中文、日文和韩文这样的象形文字、 以及平假名、片假名、 孟加拉语、 旁遮普语果鲁穆奇字符(Gurmukhi)、泰米尔语、印.埃纳德语(Kannada)、Malayalam、泰国语、 老挝语、 汉语拼音(Bopomofo)、Hangul、 Devangari、Gujarati、Oriya、Telugu 以及其他数也数不清的语。对于还没有加入的语言,由于正在研究怎样在计算机中最好地编码它们, 因而最终它们都将被加入。

ISO 10646 定义了一个 31 位的字符集。然而, 在这巨大的编码空间中, 迄今为止只分配了前 65534 个码位 (0×0000 到 0xFFFD)。 这个 UCS 的 16位子集称为基本多语言面 (Basic Multilingual Plane, BMP)。 将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和科学领域里才会用到它们。

UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字。 表示一个 UCS 值的十六进制数, 通常在前面加上 “U+”, 就象 U+0041 代表字符”拉丁大写字母A”。 UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的。这里要注意的是它是以16bit为单位存储,即便对字母”A”也是用16bit,这是与前面介绍的所有字符集不同的地方。

历史上,在国际标准化组织研究ISO10646标准的同时,另一个由多语言软件制造商组成的协会也在从事创立单一字符集的工作,这就是现在人们熟知的 Unicode。幸运的是,1991年前后ISO10646和Unicode的参与者都认识到,世界上不需要两个不同的单一字符集。他们合并双方的工作成果,并为创立单一编码表而协同工作。两个项目仍都存在并独立地公布各自的标准,都同意保持ISO10646和Unicode的码表兼容,并紧密地共同调整任何未来的扩展。这与当年在PC机上的操作系统MS-dos与PC-dos的情形有些相象。后面,我们将视ISO10646和Unicode为同一个东西。

有了Unicode,字符集问题接近了完美的解决,但不要高兴得过早。由于历史的原因:一些操作系统如:Unix、Linux等都是基于ASCII设计的。此外,还有一些数据库管理系统软件如:Oracle等也是围绕ASCII来设计的(从其8i的白皮书上介绍的设置系统字符集和字段的字符集中可以间接地看到这一点)。在这些系统中直接用Unicode会导致严重的问题。用这些编码的字符串会包含一些特殊的字符, 比如 ‘\0′ 或 ‘/’, 它们在 文件名和其他 C 库函数参数里都有特别的含义。 另外, 大多数使用 ASCII 文件的 UNIX 下的工具,如果不进行重大修改是无法读取 16 位的字符的。 基于这些原因, 在文件名, 文本文件, 环境变量等地方,直接使用Unicode是不合适的。

在 ISO 10646-1 Annex R 和 RFC 2279 里定义的 UTF-8 (Unicode Transformation Form 8-bit form)编码没有这些问题。

UTF-8 有以下一些特性:

UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0×00 到 0x7F (ASCII 兼容)。 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的。

所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集。 因此,ASCII 字节 (0×00-0x7F) 不可能作为任何其他字符的一部分。

表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节。 多字节串的其余字节都在 0×80 到 0xBF 范围里。 这使得重新同步非常容易, 并使编码无国界,且很少受丢失字节的影响。

UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长。

字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到。

通过,UTF-8这种形式,Unicode终于可以广泛的在各种情况下使用了.

第二部分: 从Unicode到UTF-8的转换

From: http://hi.baidu.com/winnyang/blog/item/d5fd4f3d7b1cbdc19e3d62aa.html

Unicode是一个字符集,而UTF-8是 Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1 个字节。Unicode为双字节,而UTF-8中汉字占三个字节。
网魂小兵 http://xdotnet.cnblogs.com
UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP(Basic Multilingual Plane)字符最多只用到3字节长。下面看一下UTF-8编码表:

U-00000000 – U-0000007F: 0xxxxxxx
U-00000080 – U-000007FF: 110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxx 的位置由字符编码数的二进制表示的位填入, 越靠右的 x 具有越少的特殊意义,只用最短的那个足够表达一个字符编码数的多字节串。注意在多字节串中, 第一个字节的开头”1″的数目就是整个串中字节的数目。而第一行中以0开头,是为了兼容ASCII编码,为一个字节,第二行就为双字节字符串,第三行为3 字节,如汉字就属于这种,以此类推。(个人认为:其实我们可以简单的把前面的1的个数看成字节数)
网魂小兵 http://xdotnet.cnblogs.com
为了要将Unicode转换为UTF-8,当然要知道他们的区别到底在什么地方。下面来看一下,在Unicode中的编码是怎样转换成UTF-8的,在UTF-8中,如果一个字符的字节小于0×80(128)则为ASCII字符,占一个字节,可以不用转换,因为UTF-8兼容ASCII编码。假如在Unicode中汉字“你”的编码为“u4F60”,把它转换为二进制为100111101100000,然后按照UTF-8的方法进行转换。可以将Unicode二进制从地位往高位取出二进制数字,每次取6位,如上述的二进制就可以分别取出为如下所示的格式,前面按格式填补,不足8位用0填补。

unicode: 100111101100000                  4F60 

utf-8:    11100100,10111101,10100000       E4BDA0

从上面就可以很直观的看出Unicode到UTF-8之间的转换,当然知道了UTF-8的格式后,就可以进行逆运算,就是按照格式把它在二进制中的相应位置上取出,然后在转换就是所得到的Unicode字符了(这个运算可以通过“位移”来完成)。
网魂小兵 http://xdotnet.cnblogs.com
如上述的“你”的转换,由于其值大于0×800小于0×10000,因此可以判断为三字节存储,则最高位需要向右移“12”位再根据三字节格式的最高位为 11100000(0xE0)求或(|)就可以得到最高位的值了。同理第二位则是右移“6”位,则还剩下最高位和第二位的二进制值,可以通过与 111111(0x3F)求按位于(&)操作,再和11000000(0×80)求或(|)。第三位就不用移位了,只要直接取最后六位(与 111111(ox3F)取&),在与11000000(0×80)求或(|)。OK了,转换成功!在VC++中的代码如下所示(Unicode到UTF-8的转换)。

1 const wchar_t pUnicode = L”你”;
2 char utf8[3+1];
3 memset(utf8,0,4);
4 utf8[0] = 0xE0|(pUnicode>>12);
5 utf8[1] = 0×80|((pUnicode>>6)&0x3F);
6 utf8[2] = 0×80|(pUnicode&0x3F);
7 utf8[3] = ”\0″;
8 //char[4]就是UTF-8的字符“你”了。

当然在UTF-8到Unicode的转换也是通过移位等来完成的,就是把UTF-8那些格式相应的位置的二进制数给揪出来。在上述例子中“你”为三个字节,因此要每个字节进行处理,有高位到低位进行处理。在UTF-8中“你”为11100100,10111101,10100000。从高位起即第一个字节11100100就是把其中的”0100″给取出来,这个很简单只要和11111(0x1F)取与(&),由三字节可以得知最到位肯定位于12位之前,因为每次取六位。所以还要将得到的结果左移12位,最高位也就这样完成了0100,000000,000000。而第二位则是要把“111101”给取出来,则只需将第二字节10111101 和111111(0x3F)取与(&)。在将所得到的结果左移6位与最高字节所得的结果取或(|),第二位就这样完成了,得到的结果为 0100,111101,000000。以此类推最后一位直接与111111(0x3F)取与(&),再与前面所得的结果取或(|)即可得到结果 0100,111101,100000。OK,转换成功!在VC++中的代码如下所示(UTF-8到Unicode的转换)。

1 const wchar_t pUnicode = L”你”;
2 char utf8[3+1];
3 memset(utf8,0,4);
4 utf8[0] = 0xE0|(pUnicode>>12);
5 utf8[1] = 0×80|((pUnicode>>6)&0x3F);
6 utf8[2] = 0×80|(pUnicode&0x3F);
7 utf8[3] = ”\0″;
8 //char[4]就是UTF-8的字符“你”了。

当然在UTF-8到Unicode的转换也是通过移位等来完成的,就是把UTF-8那些格式相应的位置的二进制数给揪出来。在上述例子中“你”为三个字节,因此要每个字节进行处理,有高位到低位进行处理。在UTF-8中“你”为11100100,10111101,10100000。从高位起即第一个字节11100100就是把其中的”0100″给取出来,这个很简单只要和11111(0x1F)取与(&),由三字节可以得知最到位肯定位于12位之前,因为每次取六位。所以还要将得到的结果左移12位,最高位也就这样完成了0100,000000,000000。而第二位则是要把“111101”给取出来,则只需将第二字节10111101 和111111(0x3F)取与(&)。在将所得到的结果左移6位与最高字节所得的结果取或(|),第二位就这样完成了,得到的结果为 0100,111101,000000。以此类推最后一位直接与111111(0x3F)取与(&),再与前面所得的结果取或(|)即可得到结果 0100,111101,100000。OK,转换成功!在VC++中的代码如下所示(UTF-8到Unicode的转换)。

1 //UTF-8格式的字符串
2 const char* utf8 = ”你”;
3 wchar_t unicode;
4 unicode = (utf8[0] & 0x1F) << 12;
5 unicode |= (utf8[1] & 0x3F) << 6;
6 unicode |= (utf8[2] & 0x3F);
7 //unicode is ok!

网魂小兵 http://xdotnet.cnblogs.com
当然在编程过程中不可能只转换一个字符,这里需要注意的是字符的长度一定要算清楚,不然会带来…以上就是我这几天研究的结果,至于Unicode的转换为GB2312在MFC中Windows有自带的API(WideCharToMultiByte)可以转换。这样也就能够将UTF-8格式转换为GB2312了,这里就不再赘述,如果大家有更好的方法希望指教。

 

posted by kingmaxyang in Tech and have No Comments

MySQL 数据库同步

本文为转载,转以备忘。

MySQL 的数据同步,在 MySQL 官方网站文档上,叫 Replication 字面是重作的意思,意译就是同步了。其实,MySQL 的同步,并不是使用同步 sync 这个单词而是用重作 replication,很准确表明了 MySQL 数据库操作的实质,是作同样的操作,或叫重作同样的操作,以保持主数据库服务器 master 与 从属服务器 slave 之样的数据保持一致。replication 就是有重复,重作的意思。

MySQL 为了实现 replication 必须打开 bin-log 项,也是打开二进制的 MySQL 日志记录选项。

MySQL 的 bin log 二进制日志,可以记录所有影响到数据库表中存储记录内容的 sql 操作,如 insert / update / delete 操作,而不记录 select 这样的操作。因此,我们可以通过二进制日志把某一时间段内丢失的数据可以恢复到数据库中(如果二进制日志中记录的日志项,包涵数据库表中所有数据,那么,就可以恢复本地数据库的全部数据了)。 而这个二进制日志,如果用作远程数据库恢复,那就是 replication 了。这就是使用 replication 而不用 sync 的原因。这也是为什么要设置 bin-log = 这个选项的原因。

在同步过程中,最重要的同步参照物,就是同步使用那一个二进制日志文件,从那一条记录开始同步。

下面,我们来讲解最核心的过程:

  1. 首先,你应该有两个或两个以上的 MySQL 数据库服务器,版本最好是在 3.3 以上 (当然,两个服务器不一定是两台机器,一台机器上安装两个 MySQL 服务是可以的,同时,如果你对 MySQL replication 原理十分精通的话,你甚至可以在一个 MySQL 服务的两个不同数据库 database 之间作同步,看有没有需要了)说明: 这两个服务器一般设置一个为主服务器,或叫源服务器, master mysql server, 另一台或其他多台就是 replication slave 同步从服务器了。一台 slave 与多台 slave 设置方法是一样的,这样你就可以作类似数据库集群了。
  2. 设置可访问 MySQL 帐号,操作以英文为准。
    • MySQL 帐号一般设置为限定 IP 访问,以保障安全性
    • MySQL 帐号一般在 master 与 slave 设置为相同帐号,同时是远程可访问
    • 特别注意,如果你用 Linux / Unix 操作系统,那一定要注意一下防火墙 firewall 有没有限制 MySQL 远程访问,如果是,最好是打开远程访问端口,并作好访问 IP 限制
    • 由于 my.cnf 中要明文存储 MySQL 帐号密码,请注意保护 my.cnf 不让其他用户访问到(看来要向 MySQL 说明下以后用密码存 passwd)。
  3. 第三步,当然是设置两个服务器要同步的数据库为同样的数据库了。
    • 方法之一,就是英文说明中说的,先锁定数据库读写功能 ( 其实最好是停止 mysqld 服务,再作备份) 然后用 tar 备份数据库目录,转到 slave 服务器相同数据目录中。
    • 方法之二,使用 mysql studio 这样的实用工具,直接使用 mysql studio 的 backup database 工具把数据库同步
    • 以上两种方法都是 master 数据库中有不少数据记录,按上两 种方法得到 master 与 slave 有相同数据库与数据记录。 而第三种方法,则是适合于新建数据库的情况,特别适合于 master 与 slave 在 my.cnf 已经设置好 replication 关系 (但 未指定 database 同步数据库 ) 的情况: 这就是使用 mysql 的 sql 语句 load table from master 与 load data from master;
      load table from master 可以从 master 数据库把表结构复制到 slave 数据库中,这样可以建立同步的表。
      load data from master 是从 master 数据库把数据导入到 slave 数据表中,条件是 master 从一开始安装运行就使用了 bin-log 参数而保存有二进制日志
  4. 这里有一些技巧,包括 mysql 的 sql 指令说明下。

  5. 接下来就是配置 master 与 slave 的 my.cnf 文件,使得 replcation 能有合适的启动参数以支持数据同步
  6. 技巧: 如果你使用 win2k 的 mysql 那么,你可以下载 mysql.com 出的官方 mysql administrator 实用程序,直接在 mysql administrator 中即可配置 master 与 slave ,同时也可以配置 query-cache 。

    在 master 的 my.cnf(如果是 win32 那就是 my.ini)增加

    [mysqld]
    log-bin =
    server-id=1

    注意,上面的 log-bin = 中的 等号 = 是不可少的。

    在 slave 的 my.cnf 修改

    [mysqld]
    server-id=2 # 如果有多个 slave 就改为不重复的 id 就好,在mysql 4.1 中,这个已经取消了
    master-host=10.10.10.22
    master-user=backup #同步用户帐号
    master-password=1234
    master-port=3306
    master-connect-retry=60 #预设重试间隔60秒
    replicate-do-db=test # 告诉slave只做 test 数据库的更新
    bin-log =

     

     

     

  7. 检查 master 与 slave 配置状态,使用 show master status; 与 show slave status; 这两个 SQL 指令即可在 master 与 slave 查看配置状态。这里有两个状态变量十分重要
    • master 与 slave 有相同的数据库表结构,最好 database name 也一样(可以设置为不一样的 database name)
    • master 与 slave 有相同的初始数据记录,保证同步操作开始后两者数据一致
    • master 必须使用 bin-log 二进制日志记录(推荐 slave 也使用 bin-log)
    • slave 是从 master 的 bin-log 是读取 sql 记录来同步,所以,从哪一条 log 开始读取很重要(下面的第 7 条操作,就是保证 slave 能与 master 保持相同的记录读取,并读取正确的 bin-log 日志文件)
  8. mysql > SHOW MASTER STATUS;
    +---------------+----------+--------------+------------------+
    | File   | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +---------------+----------+--------------+------------------+
    | mysql-bin.003 | 73  | test   | manual,mysql  |
    +---------------+----------+--------------+------------------+

    注意 File 是 mysql-bin.003 而 position 是 73

    这个文件是对 test 这个 数据库的二进制日志记录,记录数据变化的当前记录条数是 73

    前面我们说过,二进制日志记录着某个数据库所有数据记录变化的 sql 操作语句,如 insert / update / delete 等,正是因为如此,在 slave 同步 mysql 数据库操作时,其实是读取master 中这个 mysql-bin.003 二进制日志中的 sql 操作,同在 slave 中执行这些 sql 操作,所以,同步成功有以下几个条件:

  9. 在 slave 执行下面 sql 操作
  10. mysql> CHANGE MASTER TO
    ->  MASTER_HOST='master_host_name',
    ->  MASTER_USER='replication_user_name',
    ->  MASTER_PASSWORD='replication_password',
    ->  MASTER_LOG_FILE='recorded_log_file_name',
    ->  MASTER_LOG_POS=recorded_log_position;

    这里,把 上面的 redcorded_log_file_name 改为 mysql-bin.003 而 recorded_log_position 改为 73 (特别注意,这是关系关键)。

linux 下的 mysql 与 win2k 下的 MySQL 作 replication 会有什么技巧:

  1. 注意 Linux 下有大小写区分,而 win2k 下没有。所以最好使用 mysqldump 方法来让两个数据库初始化同步,而不能使用 tar 方式直接 copy 数据库表文件。使用 mysql studio 来作 database backup 也不错
  2. 注意 win2k 下的 mysql 配置文件是 c:\my.ini。你可以使用 mysql administrator 0.9 这个图型界面的实用工具来设置。
  3. 如果 win2k 下的 mysql 为 master , 一定要注意 show master status 中显示出来的结果。
  4. win2k 下的 mysql 为 slave 时,注意不要把同步时间周期设置太长。

实战

环境配置

操作系统:linux
MySQL:5.14
主服务器A IP:192.168.1.2(假设)
从服务器B IP:192.168.1.3(假设)
同步数据库: test(用于测试,两台服务器初始数据一致)

主服务器(master)设置

新建一个用于备份的用户(直接用root用户也可以):
GRANT FILE ON *.* TO backup@192.168.1.3 IDENTIFIED BY ‘123456’;

编辑“/etc/my.cnf”(不同服务器可能路径不同)文件,在该文件添加以下内容:
server-id=1
#设置服务器id,主从服务器要不同
log-bin=mysqllog
#启用二进制变更日志(即把所有对数据进行操作的SQL命令以二进制格式记入日志)
#其中mysqllog是日志文件的名称,日志的文件名是mysqllog.n,其中n是一个6位数字的整数。
binlog-do-db=test
#指定需要启用二进制变更日志的数据库"test"
binlog-ignore-db = mysql
#指定不需要启用二进制变更日志的数据库"mysql"

重启mysqld服务,可以用mysql命令:SHOW MASTER STATUS;查看“启用二进制变更日志”情况

从服务器(slave)设置

编辑“/etc/my.cnf”(不同服务器可能路径不同)文件,在该文件添加以下内容:

server-id=2
#设置服务器id,主从服务器要不同
replicate-do-db=test
#指定需要从master同步过来的数据库"test"
replicate-ignore-db = mysql
#指定不需要从master同步过来的数据库"mysql"

#设置master服务器的IP地址、登陆用户、密码、端口
master-host=192.168.1.2
master-user=backup
master-password=123456
master-port=3306

master-connect-retry=60
#连接master服务器失败后重试的延迟时间
slave-skip-errors=all
#跳过所有错误继续执行同步工作
log-slave-updates
#启用从属服务器上的日志同步功能

注意:如果从服务器上存在master.info文件(如:/var/lib/mysql/master.info),要使以上配置选项生效,在重启mysqld服务前必须删除该文件。

重启mysqld服务,可以用mysql命令:SHOW SLAVE STATUS;查看同步情况

从数据库的相关命令:

slave st; slave start ; 开始停止从数据库。
show slave statusG; 显示从库正读取哪一个主数据库二进制日志

成功完成以上配置后,在主服务器A的test库里添加数据或删除数据,在从服务器B的test库里马上也能看到相应的变更。两台服务器的同步操作可以说是瞬间完成的。

 

posted by kingmaxyang in Tech and have No Comments

Mazda5自拍

入手一个月,非常喜欢,不说了直接上照片

Shooting by EOS 7D

 

posted by kingmaxyang in Shooting and have No Comments