Subversion不完全安装笔记

昨天深夜开始安装Subversion,折腾了很久,终于搞定。 把过程写出来与大家分享,整个安装过程主要参考了 http://www.jlchannel.com/blog/?p=104 和 http://www.newbooks.com.cn/info/52691.html。

安装环境为

内核:Linux version 2.6.9-34.ELsmp
操作系统:Red Hat Enterprise Linux AS release 4 (Nahant Update 3)

Web Server: Apache 2.0 ( Web server必须是Apache 2.0以上,Subversion数据库才能通过http协议去访问)

  1. 先到http://subversion.tigris.org 下载最新的文件, 分别是subversion-1.4.0.tar.gz 和 subversion-deps-1.4.0.tar.gz
  2. 将文件包解压
    tar zxvf subversion-1.4.0.tar.gz
    tar zxvf subversion-deps-1.4.0.tar.gz
  3. 开始编译
    cd subversion-1.4.0
    ./congiure
    make
    make install在我用的系统里被安装到了 /usr/local/bin
  4. 编辑http.conf
    加入下面的两行
    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so
    DAV svn
    SVNParentPath /data/svn //svn父目录

    Require valid-user //采用何种认证
    AuthType Basic //连接类型设置
    AuthName “Subversion repository” //连接框提示
    AuthzSVNAccessFile /data/svn/accessfile //权限配置文件
    AuthUserFile /data/svn/passwdfile //用户配置文件
  5. 创建数据目录
    cd /data
    mkdir svnsvnadmin create /data/svn/test //创建测试目录

    chown -R nobody /data/svn //很重要,否则从apache访问不了
  6. 管理用户
    htpasswd /data/svn/passwdfile admin //添加用户
  7. 权限设置
    编辑 /data/svn/accessfile
    加入
    [test:/] //这表示,仓库test的根目录下的访问权限
    admin = rw //test仓库admin用户具有读写权限
  8. 重起Apache
    /usr/local/apache/bin/apachectl restart
  9. 服务器端安装完毕
    从http://www.xxxx.com/svn/test 就能够访问了
  10. 安装客户端
    从http://tortoisesvn.tigris.org/ 下载TortoiseSVN。一个WIndows资源管理器插件, 把Subversion客户端和资源管理器近乎完美的结合到了一起,现在就可以开始用了。 Let’s GO!

后记:

要注意的还有如下几点:

  1. 服务器端的运行方式除了通过http访问外,还可以是用svn自己的服务器运行,但没有尝试
  2. svn存储数据有两种方式,一种是文件,一种是berklydb, 但是没有让我选择。
  3. Subversion服务器端全靠字符界面来配置,自己手动写配置文件,很麻烦, 尤其是要对整个项目树进行精确的权限管理的时候。 有个Web界面的配置工具 SVNManager,应该能节省很多力气。可惜因为php5安装出现莫名奇妙的问题而没有尝试成功,如果有尝试成功的还请给出测试报告。

try{} catch(…){}

以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:


try
{
BYTE* pch ;
pch = ( BYTE* )00001234 ; //给予一个非法地址

*pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
}
catch(…)
{
AfxMessageBox( “catched” ) ;
}


这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。 但在Release方式下如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。

那么能否在release代码优化状态下捕获这个异常呢, 答案是有的。 就是__try, __except结构, 上述代码如果改成如下代码异常即可捕获。


__try
{
BYTE* pch ;
pch = ( BYTE* )00001234 ; //给予一个非法地址

*pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
AfxMessageBox( “catched” ) ;
}

但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。 而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢?

当然有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。

找到一篇比较好的英文文章谈这个问题: http://members.cox.net/doug_web/eh.htm

用C++10 年多了 , 居然这么基础的问题都搞错, 真是汗颜。 要加紧学习啊, Stay Hungry, Stay Foolish!

Smart Archives 增强

安装了 Justin Blanton 开发的 smart archives 插件, 发现这个插件对中文和韩文支持不佳。我给做了点小修改,并且对他的一些小缺陷也进行了补正。最后的效果请看 http://www.doyj.com/archives/。

安装方法如下:
  1. 将下面的代码拷贝并存成文件smartarchives.php
  2. 将smartarchives.php 上载到你的plugin目录
  3. 到控制面板激活Smart Archives 插件
  4. 在适当的地方插入smartArchives()函数调用。
    这个函数有两个参数,第一个在”both”, “block”,”list”中选择,默认为both 第二个是要排除的分类id.
下面就是修改后的代码:


‘.$years[year].’: ‘);
$qm = mysql_query(“SELECT distinct month(post_date) as monthv
FROM $tableposts
ORDER BY monthv asc”) or die(mysql_error());

for ($i=1; $i<=12; $i++) { $q = mysql_query("SELECT *, year(post_date) as year FROM $tableposts WHERE year(post_date)='$years[year]' AND month(post_date)='$i' AND post_status='publish' AND post_date <= NOW() ORDER BY id desc") or die(mysql_error()); $sm = $month[zeroise($i,2)]; // get the shortened month name; strtotime() localizes if(mysql_num_rows($q)) { echo('‘.$sm.’ ‘); }
else
{ echo(‘‘.$sm.’ ‘); }
}

echo(‘
‘);
}
echo (‘

‘);
}

if (($format == ‘both’) || ($format == ‘list’)) { //check to see if we are supposed to display the list
$qy = mysql_query(“SELECT distinct year(post_date) as year, post_status
FROM $tableposts
WHERE post_status=’publish’
AND post_date <= NOW() ORDER BY year desc"); // loop to display links to all posts, sorted by descending month and day while($years = mysql_fetch_array($qy)) { $qm = mysql_query("SELECT distinct month(post_date) as monthv FROM $tableposts ORDER BY monthv desc") or die(mysql_error()); while($date = mysql_fetch_array($qm)) { $q = mysql_query("SELECT *, year(post_date) as year, month(post_date) as monthv FROM $tableposts WHERE year(post_date)='$years[year]' AND month(post_date)='$date[monthv]' AND post_status='publish' AND post_date <= NOW() ORDER BY id desc") or die(mysql_error()); if(mysql_num_rows($q)) { $lm = $month[zeroise($date[monthv],2)]; // get the full month name; strtotime() localizes echo('

‘.$lm.’ ‘.$years[year].’

‘);
echo(‘

    ‘);
    $q = mysql_query(“SELECT *, year(post_date) as year, month(post_date) as monthv
    FROM $tableposts WHERE year(post_date)=’$years[year]’
    AND month(post_date)=’$date[monthv]’
    AND post_status=’publish’
    ORDER BY post_date desc”) or die(mysql_error());
    while($post = mysql_fetch_array($q)) {
    if ($post[post_date_gmt] <= $now) { if ($catID != '') { // check to see if a category id was specified in the arguments // get the categories that are attached to the current post $cats = $wpdb->get_col(“SELECT category_id FROM $wpdb->post2cat WHERE post_id = $post[ID]”);
    $found=false;
    foreach ($cats as $cat) { // look to see if the specified category is attached to the current post
    if ($cat == $catID) $found=true;
    }
    if (!$found) echo(‘

  • ‘.$post[post_title].’
  • ‘);
    }
    else echo(‘

  • ‘.$post[post_title].’
  • ‘);
    }
    }
    echo (‘

‘);
}
}
}
}
}
?>

电信宽带与网通宽带

我家里是电信的Lan宽带,下载的峰值速度一般在128K字节美妙,大约1MBPS的带宽。 妹妹家是网通的Lan宽带,下载的峰值速度是256K字节每秒,大约2MBPS的带宽。

今天在家里给Blog家了一个XSPF播放器插件,选了9首歌放进去,这样大家可以边看blog边听音乐。在家里的电信宽带上试的都很好,每首歌都播放非常流畅。今晚去了趟妹妹家,发现用她的网通宽带只有第3,6,8首播放流畅,其他都断断续续,根本没法听。

难道这是因为电信和网通互联有问题?

RSS Reader

在一个程序员论坛做了一次有关RSS Reader的投票调查,投票的一共有13人。投票结果是,有三人使用离线RSS Reader, 一人使用在线的Reader, 其他9人不使用。有点让自己震惊。身边非技术圈的人没看到一个在用,没想到技术圈里使用的比率也是这么低。

自己原先一直用Firefox的一个RSS Reader插件,前几天转到了Google Reader上,这样到了外地网吧也能看了。我订的RSS不多, 请看http://www.doyj.com/%E6%88%91%E8%AE%A2%E7%9A%84rss/。
从今天起,在我的blog里也搞“您使用的RSS Reader”调查,欢迎大家在左边投票区投票。

8月3日编辑:投票放了2两天没人投,撤下 🙁

Google WiFi Smotherage of Mountain View

Google开始为Mountain View的近7万用户提供免费的Wifi服务了,带宽是1M, 从 http://www.networkworld.com/community/?q=node/6438 看到的。

在网上搜还搜到了一篇有趣的文章: Why I Fear Google WiFi

Google到底想做什么呢? 是不是为了完整的分析用户上网的行为模式,而采集样本数据呢?从海量的,看似无规律可循的用户上网数据中,挖掘有价值的宝藏正是我感兴趣的课题。

微软又出糗了

在本周Redmond的演讲上,微软工作人员针对Vista的语音识别系统进行了演示。让与会者大跌眼镜的是,此次Demo堪称100%失败,Vista的语音识别系统完全不买工作人员的帐,出现严重识别错误。

微 软工作人员以极为标准的美语试图让Vista正确识别“Dear Mom”这个短语的发音,然而,微软开发五年,投入数十亿美元的Vista将工作人员的努力识别为“Dear aunt,let’s set so double the killer delete select all”。

语言识别程序是要经过训练的,看来这个做演示的人准备严重不足。 下面是一些人在Youtube的评论:

Agreed – sure the whole vista thing may be funny but the reporter is an idiot。

Speech recognition improves with training – I doubt the dude did read more than one page to train the software.

Thats wicked…. and so very microsoft!!

这件事也反映了语音识别技术的不成熟,任重道远。记得90年代还参加过一个语音识别技术的会。印象特别深的是Drgon公司,一对夫妻成立的,当时女老板做主题发言前讲了一段话,她说前一天她去爬了长城,在长城上激动不已,心想小时候登上长城的梦想终于实现了。当时看到好几个公司,他们的下场都不太好,Dragon被竞争对手收购了,这个竞争对手后来破产了。IBM的Via Voice后来停止开发了。从李开复一举将识别率从50%提高到80%后,语音识别技术似乎没出现什么根本性的突破。