作者归档:kevin

Life is short. Use Python

因为新工作的关系,已经连续好几天在研究python这门语言。也看了国内国外很多关于python的文章。随着这几天对python了解的深入,让我越发觉得,学习python,实在是“迫在眉睫了”。

作为一个用PHP做了差不多快8年web开发的Coder,学习python,自然要从web开发这块儿入手了。花了两个多小时,通读了python.org上的“HOWTO Use Python in the web”,收益匪浅,不仅仅是python的web开发。再次感叹一下,国内怎么就没有这么简单明了的理论性入门文章,要不是我英文和中文的表达能力实在太差,真想给它翻译一把。

在搭建nginx+python的运行环境时,偶然间了解到了一门新的语言——Haskell
其实说它新,只是对我来说……人家都存在了n年了。它的中文介绍,百度百科里有。在一篇介绍这门语言的教程里,看到了这么句话:

“从以人为本的角度来看,程序员的时间比机器的时间更宝贵,所以Haskell是明智的选择”

其实我觉得,把这句话用在python身上,也许正是现在如此多的人选择python的原因

Come on Baby,放弃那些类似“能够用不少于6种方式来写一个for循环” 的花花肠子,Use Python

正所谓——人生苦短,我用python~!

11111.jpg

nginx 和 subversion

实在厌倦了apache的臃肿,打算彻底投奔nginx的怀抱了。
编译,安装,迁移,一切都很顺利 ,最后一步在迁移svn的时候卡住了。
把nginx作为subversion的前端webserver居然目前没有解决方案……

搞了一个晚上,最终还是采取了proxy的办法,把发向nginx的svn请求转到apache上去了 ,哎。
为啥nginx没有这方面的解决方案,也大概查了个水落石出。因为这方面中文资料实在是少,让我费了颇多的周折,
现在就明明白白的说一下吧。

在nginx.net的Mailing list里,nginx的作者Igor Sysoev说了,支持SVN需要有三个东西

1) full WebDAV support,
2) DeltaV support,
3) SVN repo format support.

而在nginx里的NginxHttpDavModule,仅仅对以上三项中的第一项WebDAV有了初步的支持(目前来看Igor Sysoev并没有升级的想法),对于几个高级的WebDAV操作(比如OPTIONS、PROPFIND)并不支持,而这些操作,恰恰是SVN所必须的。而剩下的两项,更是一点支持都没。

所以,就目前来说,想单纯的nginx+subversion,基本上是不可能的。

在刚开始研究这个问题的时候,并不知道除了WebDAV还必须要有其他两个东西。所以满世界找nginx上WebDAV的解决方案,以为搞定这个,就万事大吉了。别说,还真让我在一个老外的博客上给找着一个。这家伙的方法很巧妙,他依据WebDAV的RFC文档,将绝大多数NginxHttpDavModule不支持的操作用PHP代码实现了,并且通过nginx,把这些请求重定向到了PHP程序。这是这篇博客的地址,有志于自己动手解决这个问题的人,可以参考一下:)

Install subversion-1.5.2 on Linux

1,Install Apache,APR and APR-util(http://apr.apache.org/)

#tar -zxf apr-1.3.3.tar.gz
#cd apr-1.3.3
#./configure
#make
#make install

#tar -zxf apr-util-1.3.4.tar.gz
#cd apr-util-1.3.4
#./configure –with-apr=/usr/local/apr/
#make
#make install

编译apache,加如下参数

–enable-dav –with-apr=/usr/local/apr/bin/apr-1-config –with-apr-util=/usr/local/apr/bin/apu-1-config

2. Install Neon(http://www.webdav.org/neon/)
neon is an HTTP and WebDAV client library, with a C interface.

#tar -zxf neon-0.28.3.tar.gz
#cd neon-0.28.3
#./configure –prefix=/usr/local/neon
#make
#make install

3. Install Subversion (http://subversion.tigris.org/)

#tar -zxf subversion-1.5.2.tar.gz
#cd subversion-1.5.2
#./configure –prefix=/usr/local/subversion –with-apxs=/usr/local/apache2/bin/apxs –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr –with-neon=/usr/local/neon
#make
#make install

编译过程中,发生如下错误

/usr/bin/ld: cannot find -lexpat
collect2: ld returned 1 exit status

确认libexpat已经被载入

# ldconfig -p|grep expat
libexpat.so.0 (libc6) => /usr/lib/libexpat.so.0

做个链接,并重载libs,最后检查一下

#cd /usr/lib
#ln -s libexpat.so.0.5.0 libexpat.so
#ldconfig
#ldconfig -p|grep expat
libexpat.so.0 (libc6) => /usr/lib/libexpat.so.0
libexpat.so (libc6) => /usr/lib/libexpat.so

继续编译,通过,OY
4. 配置
打开apache的httpd.conf文件,查找下面两行内容,如果存在,则表示subversion已经安装成功

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

建立代码仓库及配置文件

#cd /usr/local/subversion/
#mkdir repos
#mkdir www
#touch auth
#cd repos
#svnadmin create myproject

通过apache的htpasswd工具创建用户,并按提示输入密码

#cd ..
#/usr/local/apache2/bin/htpasswd -c /usr/local/subversion/passwd kevin

编辑auth文件,写入以下内容,赋予此用户对于myproject的读写权限(例子很简单,更复杂的权限配置,请自己去查官方文档或google搜索“SVN权限”)

[/]
* = rw

[/svn]
* = rw

[/svn/myproject]
lirui=rw

配置apache,设置svn的工作目录

<Location /svn>
DAV svn
SVNParentPath /usr/local/subversion/repos
AuthType Basic
AuthName “Subversion repository”
AuthUserFile /usr/local/subversion/passwd
AuthzSVNAccessFile /usr/local/subversion/auth
Require valid-user
</Location>

重启apache

总结:ldconfig及 LD_LIBRARY_PATH

为了装个nginx,在一个裸机上折腾了一宿。

也不知道是机器慢,还是的确如此,编译gcc花了快一个小时。。。很是吐血。

结果编译安装完成后,去编译其他东西,结果发现了找不到编译器的提示。。。

东查西找,左蒙右猜,终于把问题搞定了,问题就出在这个 LD_LIBRARY_PATH 上面

从别处摘抄总结一下。

1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到

2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到
比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在程序运行时被找到。

3. 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。

4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。

5. 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。

LD_LIBRARY_PATH 的意思:告诉loader在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。在linux下,还提供了另外一种方式来完成同样的功能,你可以把这些目录加到/etc/ld.so.conf中,或则在/etc/ld.so.conf.d里创建一个文件,把目录加到这个文件里。当然,这是系统范围内全局有效的,而环境变量只对当前shell有效。按照惯例,除非你用上述方式指明,loader是不会在当前目录下去找共享库的,正如shell不会在当前目前找可执行文件一样。

开始跟nusoap死磕并告一段落

 断断续续看了一下午nusoap的代码,晚上决把他生成wsdl格式文档的部分完善一下以适合自己使用
一晚上的努力,目前types部分已经完成了。。。明天继续

modify class.soap_server.php

add function addSchema()

modify class.wsdl.php

mod function addComplexType()

博士后和民工的区别

联合利华引进了一条香皂包装生产线,结果发现这条生产线有个缺陷:常常会有盒子里没装入香皂。总不能把空盒子卖给顾客啊,他们只得请了一个学自动化的博士后设计一个方案来分拣空的香皂盒。博士后拉起了一个十几人的科研攻关小组,综合采用了机械、微电子、自动化、X射线探测等技术,花了几十万,成功解决了问题。每当生产线上有空香皂盒通过,两旁的探测器会检测到,并且驱动一只机械手把空皂盒推走。
中国南方有个乡镇企业也买了同样的生产线,老板发现这个问题后大为发火,找了个小工来说:你他妈给老子把这个搞定,不然你给老子爬走。小工很快想出了办法:他花了90块钱在生产线旁边放了台风扇猛吹,于是空皂盒都被吹走了。

[转载]Mysql 数据库字符集

MySQL 4.1开始,对多语言的支持有了很大变化 (这导致了问题的出现)。尽管大部分的地方 (包括个人使用和主机提供商),MySQL 3、4.0 仍然占主导地位;但 MySQL 4.1 乃至5.0是 MySQL 官方推荐的数据库,已经有主机提供商开始提供并将会越来越多;因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 PHP 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题。

MySQL 4.1开始把多国语言字符集分的更加详细,所以导致数据库迁移,或则dz论坛升级到4.0后(dz4.0开始使用gbk或utf-8编码)出现乱码问题。

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

查看系统的字符集和排序方式的设定可以通过下面的两条命令:
QUOTE:
mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
7 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE ‘collation_%’;
+———————-+——————-+
| Variable_name | Value |
+———————-+——————-+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+———————-+——————-+
3 rows in set (0.00 sec)

MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL,其中的一个数据库,其中的一张表,其中的一栏,应该用什么字符集。但是,传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的;
此时 character_set_server 被设定为这个默认的字符集;
当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server;
当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的;
当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。
想要进行“正确”的存储和得到“正确”的结果,最方便的是在所有query开始之前执行一下:

SET NAMES ‘gbk’;
其中gbk是数据库字符集。

它相当于下面的三句指令:
SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;

4.1和5.0默认使用的是latin1字符集(木头:妈的,老外真霸道,妄想让全世界都是使用瑞典字符集吗)
如果我们只想使用gbk字符集存储和获取数据,
我们在编译mysql 4.1和 5.0的时候,需要注意在my.ini或者my.cnf中添加两处参数
[mysqld]
default-character-set=utf8

#settings for clients (connection, results, clients)
[mysql]
default-character-set=utf8

下面我们来说主题,如何转换数据库字符集

更改存储字符集
主要的思想就是把数据库的字符集有latin1改为gbk,big5,或者utf8; 以下操作必须拥有主机权限。假设当前操作的数据库名为:database

导出
首先需要把数据导为mysql4.0的格式,具体的命令如下:
mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt databse > d4.sql

–default-characte-set 以前数据库的字符集,这个一般情况下都是latin1的,
–set-charset 导出的数据的字符集,这个可以设置为gbk,utf8,或者big5
导入
首先使用下面语句新建一个GBK字符集的数据库(test)

CREATE DATABASE `d4` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
然后把刚才导出的数据导入到当前的数据库中就ok了。

mysql -uroot -p –default-character-set=gbk -f d4<d4.sql
通过以上的导出和导入就把数据库的字符集改为正确的存储方式了。

其中d4为新建库的名称,d4.sql为导出文件的名字

但是这种方法,发现数据库数据存储量无端变大30%,真是郁闷

来西安一周了

不知不觉,来西安已经一个星期了,时间是真快啊

这一周,是忙碌的一周,是战斗的一周

忙里偷闲,不停的四处品尝西安的各种美味,给我的感觉,西安的好吃的东西太多了~

各种“皮”不说,单是肉夹馍,我就连续三天拿来当午餐,而且居然顿顿吃的津津有味,满嘴流油。

周末本来是去一个不远的地方吃水盆羊肉的,可在一个西安的哥的忽悠下,改去了城里的“同盛祥” 品尝了所谓正宗的“羊肉泡馍”,其实说实话,感觉跟在路边吃的没什么不一样…… 回到家感觉有点添堵,来回打车的钱都快赶上这顿泡馍了。

记得刚下飞机的时候,拉我进城的司机刚把车开出机场驶上高速,就指着高速旁边的一个一个小土山说,这是谁谁的陵,那是谁谁的陵。西安给我第一个感觉就是,周边是个山丘土坡,就埋葬着几百上千年前的某个皇帝或者皇亲国戚。

来西安一个星期了,吃的也都差不多了,下一个目标,就准备各个著名景点四处逛逛了。

西安真是个好地方。

无聊的周末

本来预感游戏里公会要出大事,前前后后做了很多工作、想了各种结果、做了各种打算、想了各种可能,折腾了一个多星期,结果却是风平冷静,靠的……真他妈的没劲

一个周末把《落地请开手机》看完了,喜欢苏文月,喜欢孙红雷!