存档

‘技术’ 分类的存档

为eclipse安装pydev不要使用zip包安装

2009年3月11日

pydev是一个为eclipse提供python环境的插件,它的安装文档中说可以用eclipse本身的update装,也可以直接解zip包安装。

实际使用中发现用zip包解压安装的在auto complete上有问题,会把 __name__ , True 等builtin的名称识别为 undefined variable,而且基本什么auto complete也出不来。从auto complete的log上来看,有形如这样的错误:

Error creating python process – exited before creating sockets - exitValue = (1)(/usr/bin/python2.4/tmp/eclipse-config/org.eclipse.osgi/bundles/650/1/.cp/PySrc/pycompletionserver.py)

现在查到了原因是直接用zip包安装的文件格式不对,所以装的时候还是用help -> software update的方法装吧,如果已经出这个问题了,就卸掉重装吧。。。

参考地址:http://pydev.blogspot.com/2009/03/pydev-zip-distribution-problem.html

技术

原来mount的时候还能用硬盘id来mount

2009年3月5日

不知道是不是我土了。。。

原来mount硬盘的时候都写成/dev/sda,/dev/hda1之类的型式,solaris下面也不过是硬盘的编号。这样的缺点就是如果你添减硬盘(最典型的例子是装系统时接着光驱,装完后拨了它编号就变了)编号变了会出问题

今天才发现mount的dev的名字原来可以写成这样:

/dev/disk/by-id/ata-ST3250820NS_9QE68B2F
/dev/disk/by-id/scsi-SAdaptec_RAIDNAME_2244073F-part1

然后fstab里也用这种格式写,一下子就少了很多麻烦了嘛

运维

SyncML是个好协议

2009年3月4日

近日从上海电信CDMA换成北京联通GSM网络,虽说是报着对WCDMA的希望,不过又不想立即入手3G的smartphone,于是借来很朴素的Nokia 7070 Prism一只准备先用到5月份再换。

于是首先想到的问题就是,很便宜的这只手机,原来WM手机里三百来口人的通讯录怎么转移过来呢。网上一查,好像这款机器的数据线都很难买到。于是在菜单里乱翻,看到了形如“与服务器同步”的项,以为是什么Nokia自己的服务,没太在意。

后来搜索解决办法时无意搜到http://hotpim.pimwap.com/,发现上面讲的S40的同步办法就是用到了上面看到的“与服务器同步”一项,然后又看到其主页上提到SyncML协议,心想既然这是个标准协议,那Google Sync会不会也支持呢,一查,如果支持。于是从outlook把联系人导出成.csv,再导入进google contacts,从手机同步,OK啦!

SyncML(Synchronization Markup Language)是由Nokia和Ericsson等老大发起的,已经被OMA采纳。

PS.  Gmail Contacts和Outlook目前只有calendar有google官方的同步工具,contacts好像只有第三方的收费同步服务,于是乎。。。大概就是我抛弃outlook的时候了。。。
那既然不用outlook了,我的下一只smartphone是不是就可以转向symbian阵营了呢 ?

技术

搬家日记(X-Space到WordPress)

2009年2月8日

搬家工作基本完成,颇发扬了自已动手,丰衣足食的精神,记录一下吧。

我的blog原先架在Discuz!的附属的Supesite的X-Space上,目的是转到现在的wordpress上来。本来以为会有现成的blog搬家工具,结果各处一搜,竟然都不支持X-Space自已host的这种blog,唯一看到一个叫blogbak的,也只能把X-Space上的blog导到它自己的51某某站上。
那没有现成的工具,那就用RSS吧,结果发现X-Space不能把日志导出成RSS2.0的文件,作罢。那,从WP这边导入X-Space的rss的feed总是万能的了吧,结果再一次被X-Space的RSS输出打击掉,它只输出一定长度的文章,结果长的文章的后半部分就被截掉了,而且不能通过设置改变这个行为。。。。

没办法,自己写程序搬家好了。。。不过也好,这样comment和commentor的联系方式什么的都能留下,否则我就放弃他们了
(注:上面的功能新版的X-Space好像已经有了,不过我的版本很老。。。)

我写的这些代码适用于满足以下条件的人:
1.是自己host的X-Space和wordpress,自己的主机或者虚拟主机都行,专门的博客提供商(BSP)就不行了
2.X-Space和wordpress在同一个数据库中(一般虚拟主机都这样),如果不是,就得自己改改代码了
3.X-Space的文字编码是gb2312,wordpress的是UTF-8(话又说回来,要是编码相同,连程序都不用了,完全靠SQL也能完成搬家)

搬家步骤:

  1. 正常地安装wordpress
  2. 首先,要小改一下X-Space在数据库里的supe_spacecomments表,在它之中加一列integer列,叫wpID,用于保存原blog里日志的ID和新WP的blog中日志的ID的对应
  3. 打开本文附件convertscript.zip里的两个PHP文件,把里面的数据名、用户名密码等改成实际的值,上传到自己的虚拟主机上
  4. 执行convertArticle.php,把原有的日志转换到WP中(新文章的作者会是默认的id=1,也就是admin用户)
  5. 执行convertComment.php,把原有的comment也转到WP中
  6. 跑一下这句sql: UPDATE `wp_posts` SET `post_name` = md5( `post_content` ) WHERE `post_name` = “”, 用来给每篇日志生成一个post_name,用在该文的静态地址中

至此,搬家基本就算是完成了,不过有点美中不足,就是WP的wp_posts表中有一列叫comment_count,算是个冗余的计数信息吧。默认它是0的,我写了下面的sql以填写它的值:

UPDATE `wp_posts` AS w
INNER JOIN
(
    SELECT p.`ID` AS `wpID` , count( * ) AS `comment_count`
    FROM `wp_posts` AS p
    INNER JOIN `wp_comments` AS c ON p.`ID` = c.`comment_post_ID`
    GROUP BY p.`ID`
) AS ct
ON w.`ID`=ct.`wpID`
SET w.`comment_count`=ct.`comment_count`

但是我的512j的服务器上mysql是4.0.22版本,还不支持子查询。。。。
不过,这个字段有没有用我也不确定,因为各种地方显示的comment计数都是正常的。。。

最后,小感慨一下。以后挑blog建的时候,要先研究好这东西的接口怎么样,否则就容易上X-Space这样的贼船了。。。

技术, 杂记 , , ,

tc pfifio_fast及PRIO对没有filter的包的处理

2009年1月15日

看好多网站上的讲tc的教程都有类似下面的例子:
tc filter add dev eth0 protocol ip parent 2: prio 1 u32 match ip sport 23 0xffff flowid 2:1
tc filter add dev eth0 protocol ip parent 2: prio 2 flowid 2:2
后一句的本意是不符号上面各种filter的默认分到classid 2:2中去,可是实际我用的时候发现后一句被告知不能用(tc竟然没有–version参数,我也不知道是啥版本的)
看了一下文档,说不符合任何filter的包按classifier的root的默认分类发送,那这个“默认分类”是什么呢?
对于CBQ来说,它本身就是在搞复杂的分类,就不说了;这里只说简单的以频道分类的classifier:pfifo_fast的PRIO,默认来说这两个classifier建立的时候会生成3个band,然后也会有一个默认的priomap,形如:1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
这些数字是干什么用的呢,它们与IP包头的TOS字段有关,TOS字段一共4个bit,每个bit代表不同的特性,如果最高位是表示最小延迟,最低位是表示最小成本等。这4个bit一共能组合成16种TOS值,linux内核会根据这4个bit的TOS值给该包判定一个priority值(从0开始),这个priority值对应了priomap中相应位置的数字,每个数字就表示该TOS值将被默认地送往这个classifier的哪个band。
例如:对于什么标志都不带的包,TOS=0000b=0,linux会给它分配priority值0,对应priomap中的第1个数字――1,也就是说什么标志都没有的包装被送往band 1;对于telnet包,一般TOS=1000b=8,linux会给它分配priority值6对应priomap中第9个数字――0,就是说telnet包默认会被送到band0
对上述两个Classifier,band号越小,优先级越高,所以telnet包的优先级高于普通包,合理,嗯
下面列出linux内核会给各种TOS值分配什么样的priority,选自tc手册。
TOS     Bits  Means                    Linux Priority    Band
————————————————————
0×0     0     Normal Service           0 Best Effort     1
0×2     1     Minimize Monetary Cost   1 Filler          2
0×4     2     Maximize Reliability     0 Best Effort     1
0×6     3     mmc+mr                   0 Best Effort     1
0×8     4     Maximize Throughput      2 Bulk            2
0xa     5     mmc+mt                   2 Bulk            2
0xc     6     mr+mt                    2 Bulk            2
0xe     7     mmc+mr+mt                2 Bulk            2
0×10    8     Minimize Delay           6 Interactive     0
0×12    9     mmc+md                   6 Interactive     0
0×14    10    mr+md                    6 Interactive     0
0×16    11    mmc+mr+md                6 Interactive     0
0×18    12    mt+md                    4 Int. Bulk       1
0x1a    13    mmc+mt+md                4 Int. Bulk       1
0x1c    14    mr+mt+md                 4 Int. Bulk       1
0x1e    15    mmc+mr+mt+md             4 Int. Bulk       1
还有常见的协议的TOS值:
TELNET                   1000           (minimize delay)
FTP
        Control          1000           (minimize delay)
        Data             0100           (maximize throughput)
TFTP                     1000           (minimize delay)
SMTP
        Command phase    1000           (minimize delay)
        DATA phase       0100           (maximize throughput)
Domain Name Service
        UDP Query        1000           (minimize delay)
        TCP Query        0000
        Zone Transfer    0100           (maximize throughput)
NNTP                     0001           (minimize monetary cost)
ICMP
        Errors           0000
        Requests         0000 (mostly)
        Responses        <same as request> (mostly)
Classes
另,IP头中,TOS这4个bit再往高处3个bit的定义也叫priority,但是好像linux是根据tos的4个bit分配priority值,不是直接以这3个bit为准。(priomap是16个数字,如果是以这3个bit为准,就是8个了,呵呵)

技术 , ,

关于用到mysql的应用,注意检查编码问题

2008年5月9日

对于集成了mysql的一些应用,比如proftpd的用户认证(已经栽在它上面两次了!!),用的时候一定要检查my.cnf里关于client端默认编码的事。
因为它没有地方让你执行什么set names=XXX这种语句,所以只能靠my.cnf里的默认设置

切记在与mysql有关的应用遇到问题要养成检查my.cnf的习惯,否则真是不知道怎么死的。。。

技术 , ,

记一次网站紧急维护过程

2008年2月25日

学院自己设计的选课系统,今年初次启用,用于一个年级约150人的同时选课。选课开始之后很快网站便失去响应。重启服务器之后重新开启选课系统,但是又迅速停止服务。于是选课宣布推迟。

 


二次选课安排在某日下午。于第二次选课前一天接手站点维护,对站点的结构和程序性能进行分析。该站点由两台服务器分别负责数据库和Web服务。采用10个
并发用户模拟选课过程时,210个事务操作需要10分钟左右。期间Web服务器基本没有负载,而数据库服务器CPU满载。站点数据表尺寸在1M的级别,程
序代码中仅有一次锁表操作,但是有若干处在循环中查询数据库。因此推测性能问题是由于对数据库访问次数过多而导致的。

 

开启
数据库的日志并访问课程列表页面,发现仅此一个页面就有200余次数据库查询操作。对课程列表页面进行压力测试发现,数据库服务器每秒可处理近800次查
询请求。而一次完整的选课过程则会导致900余次数据库查询。这说明程序结构存在着严重的问题,因此对程序进行重构,消除循环中对于数据库的访问。共将三
处循环中对于数据库的访问改为存储过程,另外修改了一些查询语句。同时对数据表项目进行了小的调整,添加了几个表项作为缓存,消除了几处多余查询和重复查
询。撤销了两个被频繁调用的且结果稳定的函数中对于数据库的调用,将部分结果暂时硬编码至程序中。另有一处被频繁调用的函数因程序结构原因无法进行快速重
构,故而放弃对其的修改。经过上述重构,显示课程列表页面所需的访问数据库次数降低至20次左右,同时由于数据库和程序客户端的问题增加了三次额外的数据
库连接操作。应当说这个数据库访问次数仍是偏多的,但是与原先的情况相比有了明显的改进,同时由于程序结构的限制,在短时间内无法进行进一步的优化,因此
对程序的优化到此为止告一段落。整个重构过程耗时约12小时。在程序重构的同时,根据网站页面的功能对于部分网页暂时采取了转为静态页面和不显示的方法以
降低重构的工作量。优化结束后对课程列表页面进行压力测试,10个客户端连续刷新时Web服务器的CPU占用在40%左右,而数据库服务器的CPU占用在
30%附近。

 

程序重构结束之后,对数据库以及两台服务器的操作系统继续进行优化。根据程序中的查询语句为数据库增添了一些
索引,从而使得10个客户端连续刷新课程列表页面时数据库服务器的CPU占用降低至10%以下。此时Web服务器的CPU占用相对较高,同时使用压力测试
软件进行测试时响应时间有明显的周期性分布。检查Web服务器的网络连接情况,发现Web服务器端访问数据库的网络连接在程序结束之后没有及时关闭,猜测
这可能导致网络连接数过多,从而导致响应时间周期性的分布。因此调整Web服务器的部分网络参数以消除此现象。另外为Web服务器安装了程序脚本的预编译
模块以避免重复的脚本编译操作。经过这些优化之后,25个客户端连续刷新课程列表页面时Web服务器的CPU占用降低至20%以下,数据库服务器的CPU
占用在15%左右。

 

分析维护前后系统的性能,对于程序的重构使响应速度提高了近10倍;添加新的数据库索引以及Web程序脚本预编译又各自使得Web服务器和数据库服务器的响应速度翻倍。因此总的来看,维护之后站点的性能提高了近20倍。

 


日上午对于网站的内容以及程序逻辑进行进一步的检查,更正了几处数据和逻辑错误。下午选课时,网站负载在选课开始3分钟后达到峰值。Web服务器的峰值
CPU占用在15%,而数据库服务器的峰值CPU占用在10%。选课开始10分钟后两服务器已没有明显负载。根据数据库内容的监测,此时大部分学生的选课
已基本结束。

运维 , ,

用PHP通过LDAP操作活动目录(AD)的笔记

2007年11月12日

最近一周一直在研究AD这方面的问题,主要难题就是用跑在Linux上的PHP通过LDAP来读写Windows上的活动目录中用户的信息。一般来说需要这么做的情况不常见,因为既然是用AD了就可以用很多现在的LDAP模块,但是我现在要做的是把已有的一个非标准的用户/密码的库转换到AD里去,所以必须亲自来完成一些底层的工作。这方面的文章网上不多见,所以这里综述一下。

首先,是安装配置AD本身的这部分工作:
主要包括:装Win2k3(或2008哈),建立域控制器,建DNS服务,把要加入域的几个机器加进域来,然后建设OU(放用户的OU及放计算机的OU),建立安全组(我用它来限制哪些用户可以登录哪些计算机),设立组策略并应用到各OU等。
这部分内容的文章很多,微软给的文档就足够详细了,比如这个Step by Step的教程:http://www.microsoft.com/china/technet/prodtechnol/windowsserver2003/technologies/directory/activedirectory/stepbystep/default.mspx
(ps.这中间在密码策略上浪费了大量时间,后来才弄清一个域中只能在根下设置密码策略,就算把带有密码策略的组策略应用在OU上,也是无效的。2008里已经可以针对安全组甚至用户设置独立的密码策略了,期待~~)

然后是一些为了就乎linux的准备工作:
先去http://www.microsoft.com/windowsserversystem/sfu/downloads/default.mspx下载一套Windows Services for UNIX,这个装上以后AD里用户的属性页里会出现一个UNIX属于页,有uid,gid什么的,这是为了让linux能结合AD验证用户登录的(比如pam),我目前没用上,不过装它没坏处。
还有是要建立一个proxyuser,这个user是ldap客户端连AD时登录用的,想让PHP实现对AD的什么操作,就给这个proxyuser赋予什么权限。
这里推荐一套很好的文档,是微软的Windows Security and Directory Services for UNIX Guide(还是要pf一下m$,文档就是全,这里对linux中安全体系的介绍比专方介绍的文档都详细。。。)

下面就是资料不好找的工作啦,一步一步来:

1.关于AD与ldap的符合性。AD被做成基本符合ldap的模式,每个用户和计算机或是组什么的都有一个DN,形如CN=loudly,OU=bbs,DC=bdwm,DC=net这样子,而用户的每个属性就是这条记录里的一个attribute,所以可以用ldap_search(),ldap_add()这些标准的函数来操作AD。一个特殊但是关键的地方就是用户的密码,很不易地找到这两个文档介绍这个事情:
How To Change a Windows 2000 User’s Password Through LDAP
User Management with Active Directory―LDAP Password Modification
文章中的核心内容就是:用户的密码是一个叫unicodePwd的属性表示的,这个属于只能写不能读,写的时候的格式是用一对双引号括起密码原文,再编码为unicode传给它,还有,要想改用户密码,必须是通过SSL方式连接LDAP(636端口,而不是普通的389端口)。因为如上要求,就要有以下步骤的工作了。

2.生成根证书
用SSL的话嘛,就需要证书。可以在域控制器上开启认证服务来创建企业的CA(注意这个服务开启后域的设置就不能改了,包括域名,这个机器的名等,所以要在进行这步之前设置好)。这里要做的就是创建CA,然后验证一下是不是ok的。其实这部分内容我也不懂,主要就是照着下面两篇参考着做的,具体步骤怎么回事(尤其是验证的时候)我也不知道是在做什么。
a.Install an enterprise root certification authority
b.就是上面提到的Windows Security and Directory Services for UNIX Guide第二卷的第Chapter4的Build a Certification Authority那一节
如果不自己建CA,而是从别处获得CA,那就看下面这篇:
c.How to enable LDAP over SSL with a third-party certification authority
下面这篇也可以参考,不过该文的主题是别的
d.如何在 Windows 2000 域控制器中配置数字证书来确保 LDAP 和 SMTP 复制的安全
上面的工作做好后,如果正常,那么域控制器就会开始listen 636端口,也就可以通过SSL连AD了(一般ldap客户端的规矩是:连的时候直接写DC地址就是用非加密方法连,连的时候如果写ldaps://地址,就是用SSL方法连接DC)

3.LDAP客户端的配置
客户端,就是要去连AD的机器,也就是本文中跑着PHP的那个机器,要做的工作主要是把DC上的CA导出成.cer,然后拷到客户端上来,然后转化为.pem(可是我的.cer和.pem文件是一样的)放到某个位置,然后再修改一下/etc/openldap/ldap.conf,这样连DC的时候系统就可以去查相应的证书。主要参考的文档是这篇:
Communicating between OpenLDAP and Active Directory over SSL
下面两篇也可以参考:
Configuring Microsoft Active Directory for SSL access
LDAP over SSL – Modifying Active Directory with PHP
上面的文章里最后都要用linux下的ldapsearch命令来测试连接是否可以进行,不过语法不同,我最后成功地连上DC用的语句是:
ldapsearch -x -H “ldaps://theDC.yourdomain.net” -s base -D “cn=proxyuser,cn=users,dc=yourdomain,dc=net” -W -b “dc=yourdomain,dc=net”(回车后提示输proxyuser的密码)
还有,要强调的是,连DC一定要用它的域名,不要用IP或是NetBIOS名,因为CA里写的是域名,要匹配
另,上面说的是linux的ldap客户端,win下也有啊,比如说win2k和2k3的support-tools里的ldp.exe,可是我还没搞清楚它应该怎么才能以SSL连AD。。。

4.用PHP来操作活动目录
这步算是最轻松的了,就是学一学PHP的相关函数的语法就好了。不过大概是没几个人用到ldap这方面的功能吧,PHP manual中ldap这部分的说明很简略,特别是用TLS的文档里写着这部分没有文档。。。所以最好的办法还是看一些源代码,这里推荐的是我在SourceForge上找到一个的PHP连AD的类:http://adldap.sourceforge.net/
这个类写的并不是特别好,比如添用户时非要求填几个没用的属性,还有至少在一层的OU里的样子,所以推荐它主要是为了看它的原码(30k左右,不是很多)学习用ldap来添加、查询、修改、加组等操作应该怎么写,如果你的应用比较复杂,建议还是自己来写,不直接用它的类。
下面几个地址也列出来考虑吧,它们都是我google到的别人问的问题,本身没有确切解答,不过还是有功劳的,比如我认识到了没有验证一个用户的密码对不对的函数,要做的就是用那个用户名和密码去bind一下,bind上
就是对,否则就是错。
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/Q_21296510.html?qid=21296510
http://topic.csdn.net/t/20060524/10/4774581.html
http://www.ideawu.net/ideablog/category6/article238.html
http://topic.csdn.net/t/20030520/15/1809327.html#

上面列出的文章链接真的不是那么好挑选出来,真怕他们哪天没了,回头我下载完打包传上来吧

编程, 技术 , , ,

一些安装SVN的笔记

2007年10月5日

这里的内容是安装与apache结合的svn服务器端的记录

apache2:
./configure –enable-dav –enable-so –enable-maintainer-mode

subversion:
./configure(如果apache2不是安在默认目录了,会报错,要加参数指明apr和apxs的位置)
make
make install

在httpd.conf中:
make install应该已经添加了的内容:
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
加入:
<Location /svn> (/svn是用户浏览时url中的路径)
        DAV svn
        SVNListParentPath on
        SVNParentPath /home/svn    (这个目录是实际数据存储的目录)
        AuthType Basic
        AuthName “Subversion repositories”
        AuthUserFile passwd
        #AuthzSVNAccessFile svnaccessfile
        Require valid-user
</Location>
在/usr/local/apache2下,bin/htpasswd -c passwd loudly

创建分支时
cd /home/svn svnadmin create repname

http://server-IP/svn/repname

运维 ,

关于linux下的编程,不禁发些牢骚

2007年8月13日

虽说是以开源为基础的,而且在简单的程序上写起来是比较方便,不过有些时候确实让人头痛,让人想念微软的.Net或是MFC。

首先是标准不统一,最近在写一个基于线程池的服务器程序,用到了semaphore,还是存在mmap中的无名semaphore,调试得很愉快,于是高兴地把程序分发往各服务器,没料到在第一个服务器上装的时候就郁闷掉了,发现进程会永远地阻塞在sem_wait()上。后来一调查才意识到,我开发的环境是FC6(用的2.6内核),人家是支持整套Posix IPC的,结果分发到的服务器以Rhel3甚至Rh7为主,内核很老(老到不是问题,主要是发行版编译时不开posix支持),我用的Posix的ipc函数就不支持。没办法,只好返工重写,这下改用System V的semaphore,这个东西比Posix的功能强,却也复杂了不少。Posix说是明日这标准,不过System V还是比较老,被支持广,这下写完,到是没啥问题了。这还只是在linux平台上呢,还没提什么solaris,bsd之流的,现在明白了为什么APUE一上来就介绍各种linux/unix版的区别了哎。
然后就是库版本什么的挑剔性啦,我写的这个程序要部署在实验室的20多台服务器上。这个工程很大,因为要首先给每台机器装上要用到的库(比如Xercesc),然后把源码拷过去,然后编译,只能写脚本来做这些工作,不过仍然是很麻烦,因为意外情况还是很多的。不能拷二进制程序吗?没戏。发行版各种各样,glibc版本各种各样,直接拷二进制的话,20台机器里有6、7台能正常就不错了。试想这些服务器要都是Windows 2003呢,直接分发二进制就是理所当然的啦,分发源代码再编译才是多此一举。

还有文档,一直在linux下写东西,能看的也就是man page加上google一些东西,偶尔在win下写程序时看MSDN时确实觉得是享受啊。。。man page,纯文字的不说,里面有各种各样的地方让你参见某某某,却又没个方便的链接过去的方法,影响编程心情啊。。。

编程