电脑网络
计算机相关内容
我不确定这是不是R和Sweave能达到的最漂亮的境界:
下载:一份由pgfSweave生成的人模狗样的动态文档这两天花了点时间,把跟LaTeX、LyX、Sweave有关的一系列中文问题从头到脚翻了个遍,目前为止,明白并解决了如下问题(基于带有MikTeX 2.8的CTeX 2.8.0.125、LyX 1.6.5、R 2.10.1、R包pgfSweave 1.0.3,操作系统Win XP,从头到尾一直用UTF-8编码):
- (LaTeX说中文了)LaTeX生成可复制粘贴的中文PDF文档:由于我的惰性,还用着N年前的CTeX,那个老版本CTeX中的MikTeX貌似一直有问题,比如无法更新LaTeX宏包,更不必说那些
dvipdfmx之类的程序了,估计人家作者都已经更新了无数个版本我还不知道。在我陈旧的印象中,要用LaTeX生成可复制粘贴的中文只有一种办法,就是用dvipdfmx把dvi转为pdf,而我陈旧的印象又记得dvi文件只能由latex命令生成,并且用latex编译的文档必须用EPS图形,这一直让我觉得很不爽,因为我实在不爱用EPS,比如R的postscript()设备(可生成EPS图形)不支持半透明色,而且图形中要用中文字符的话配置非常麻烦(N年前我请教了Paul Murrell,虽然搞明白了,但心里仍有疙瘩)。我的偏好是用pdflatex命令编译文档,图形也用PDF格式(pdflatex默认支持PDF和PNG图形),用R生成PDF图形也方便、漂亮,所以配合Sweave很容易生成一篇干净利索的PDF文档;但pdflatex命令直接编译生成的中文文档中,中文字符是不能复制粘贴的,因为复制出来就是乱码。所以呢,我陈旧的知识让我的这个“麻烦问题”一直没有得到解决。
你要是Google这个话题,得到的结果八成都是广告——他们都会告诉你,“嘿,我(或某公司)这里可以建网站,傻瓜式的哟,快来投奔我吧!”新手一般都觉得建网站是一件超级复杂的事情,于是很天真很无邪地进了圈套,到最后还乐呵呵帮人数钱。傻瓜式的东西就如它的名字一样,只是为傻瓜准备的,要格外小心。
我正式接触计算机在2002年,接触网站建设在2003年,想想时日也不短了,虽然不是什么高手,但还是有一定发言权滴。数月前,鼓动江堂兄从Live Space逃脱、建立了自己的窝,而近日又把自己的网站和“统计之都”网站都搬了家,然后也帮“贝吉塔行星”逃离了那抽风的Live Space,后来有朋友问起关于如何建立个人网站的事情,所以干脆写篇教程,把这建网站的来龙去脉讲清楚。
一、建网站的准备材料:域名和空间
一个网站通常由域名和一堆网页文件构成:
- 域名:就是“三达不溜什么什么点坑”这样的东西(如www.yihui.name,不严格,见后话),它由一家非营利组织ICANN管理,但它授权给了若干注册商(registrar)去卖域名,你可以在这些域名经销商那里注册顶级域名,所谓顶级域名就是“字母或数字组合+顶级域名后缀”,这些后缀包括常见的com/org/net,也包括不常见的name/info/biz等,各家允许注册的域名后缀可能有所不同,这就看个人喜好了;关于域名后缀,本来它是有含义的,比如com是company,org是organization,name是个人域名,等等,但我个人觉得这些东西已经没太大意义了,域名只要好记、看着像模像样就可以了,管它是公司还是组织呢(有例外:如gov等特殊后缀一般人不能注册),那著名的del.icio.us网站就是个很好的例子,它不一定非得是美国网站,但这个域名就是注册得很巧妙。顶级域名下面可以设置子域名,如二级三级域名,严格来说,www.yihui.name只是yihui.name的二级子域名,只是www太盛行,以至于人们干脆把www.***.***当作顶级域名了。animation.yihui.name就是本站的一个子域名/子站。说了半天,域名怎么注册啊?你Google一下“域名注册”或“domain name registration”,顶上的Sponsored link中都是有实力的注册商,但我作为过来人要严重提醒的是,尽量不要在国内注册(尤其不要相信那个万网的鬼话)。据说GoDaddy还可以,我没试过,只知道它似乎不能注册.name域名,我自己是在name.com注册的域名(需要付美元,我用的PayPal,双币种的信用卡也可以)。
- 网站空间:想得简单一些,空间和你的硬盘没啥区别,只不过是空间服务商卖给你的一块服务器硬盘位置而已,性能可能比你的PC机好一点,网站空间就是放网页文件的地方,网页文件你可以简单想象为你硬盘里的文件,它们也是按路径访问的,网址的路径就对应着硬盘里的文件夹。网页文件通常分为:
- 静态网页:其内容是固定不变的,里面放着HTML代码(网页的一种语言),不管谁、不管什么时间访问,内容都一样,通常以.html/.htm为文件名
- 动态网页:我估计现在大多数网站都是动态的了,所谓动态就是网页文件会根据不同的条件解析生成不同的HTML代码,例如:某动态页面根据时间和用户ID向访问者问好,早上访问就说早上好,晚上访问就说晚上好,路人甲来了就说路人甲你好……动态页面通常和数据库挂钩,用户在访问网页的时候,网页程序就存取数据库,所以页面内容会不断更新。动态页面可能采取不同的语言编写,如古老的微软的ASP、盛行的开源的PHP。现在网络上有无数的网站系统,我当然推崇PHP+MySQL的系统了,目前尤其看好WordPress系统。
- 注意有些国外空间是几乎可以当做自己的电脑使用的,包括编译安装程序(如Python),SSH登录,MySQL可以在命令行中执行,等等,国内似乎没见过能给空间这么大自由的
域名和空间没有必然联系,域名的作用就是作为一个字符串映射到一个IP地址上,因为(1)IP地址太难记了(2)IP地址数目有限(同一个IP上可以放N个域名)所以才需要域名这么个东西。这就意味着,你有换空间的自由。哪天对空间服务商不高兴了,可以直接把他踹了,把域名解析到别家去,用另一家空间。哎哎,等会儿,啥叫域名解析?
主机:218.16.120.61
用户名:yihuiname
密码:YiHuI@))()^!^
空间不大,有时候可能有用,比如给别人发超大文件。据我所知,还没有哪个邮箱能支持200M附件吧。各位客官看着用吧,别用它干坏事就可以了。2009年9月21日到期,到时我就不管了。
前几天把原COS网站的800M空间也放出来了,不过那是公家的,就用邮件发送了,不知各位收到没有。
补充说明:近日发现有童鞋竟然把FTP变成了山寨BBS,呃,好吧,你们继续灌水吧。前些日子有位童鞋在R-help邮件列表里问如何生成那种单词大小与其出现频率成比例的图,这玩意儿也就是通常所说的标签云(Tag Cloud)。我琢磨了一下WordPress的插件wp-cumulus,发现其原理很简单,不过就是将标签信息以XML形式通过JavaScript传递给一个Flash文件,所以也很容易用R去实现这个传递过程,即:将文本、超级链接以及频数写成XML,然后嵌入到HTML文件中。整个过程参见Creating Tag Cloud Using R and Flash / JavaScript (SWFObject)这篇日志,函数源代码和示例数据都可以从那里下载。
效果是这样的:
(通过RSS阅读的童鞋们请打开原文链接在浏览器中观看,否则啥都看不到)
Google Chart API是很老的产品了(下文简称GCA),以前隐约听说过这么个东西,只是没觉得什么地方能用上,如果仅仅是单幅图形,还不如自己用软件画出来,而且自己画图比用GCA要方便灵活许多。这两天琢磨着网页里面有些简单的数字该如何显示给读者,比如几乎所有人的博客上都会显示阅读次数、评论条数等数据,这些数据是动态的,所以不适合静态图形展示,因此又想起GCA。简单来说,GCA就是用网址传递数据给Google的某个画图程序,Google画完之后把图形以PNG形式返回给你,你可以在网页中尽情使用。由于数据包含在网址中,因此很容易通过动态网页程序(如PHP)生成数据并写出网址。
1、从访问数和评论数生成Venn图
作为一个简单应用,我把原本枯燥的三个数字“用户(user)阅读次数”、“机器人(bot,网络爬虫)浏览次数”和“评论(comment)条数”用Venn图展示在每个条标题下的信息栏中了。对于学过与集合有关的课程(如概率论)的人来说,Venn图几乎是第一节课就会接触到的东西,它直观表明了几个集合之间的关系,如交集与并集。前面的三个数字中,user和bot交集为空,而user与comment的交集为comment,因为凡是发表评论的人必然要打开页面阅读。
Venn图的主要参数是7个数字,依次说明各个集合的大小:A, B, C, A∩B, A∩C, B∩C, A∩B∩C。这7个数字传给数据参数chd即可,如:
http://chart.apis.google.com/chart?cht=v&chs=300x300&chd=t:100,80,60,30,25,20,10
1、RSS Feed:feed.php
对现代网民来说,RSS阅读器已经是看网页的必备工具,因此RSS种子的地址几乎是众多网址中最重要的一个。
插播不重要的通知:
1、本站的RSS地址已经更改为:http://yihui.name/cn/feed/,评论RSS为:http://yihui.name/cn/comments/feed/,请Google Reader中的读者即时更换。英文博客也类似,把cn改成en就可以了。
2、如果你懒得换也行,反正我已经重定向了。 
Bo-Blog的feed.php文件在不带参数的时候是博客正文的RSS,带参数go的时候可能是评论,也可能是分类目录的RSS,因此需要在WP根目录下建一个feed.php文件,里面对参数作简单的判断,把原来的RSS重定向到WP的RSS中。以下代码只是本博客的转向,具体怎么写要根据具体搬家结果分析。
go参数中提取分类数字,传给WP的cat参数。
<?php
header("HTTP/1.1 301 Moved Permanently");
if(!isset($_REQUEST["go"])){
header("Location: http://$_SERVER[HTTP_HOST]/cn/?feed=rss2");
} else {
$tmp = $_REQUEST["go"];
if ($tmp == 'comment') {
header("Location: http://$_SERVER[HTTP_HOST]/cn/?feed=comments-rss2");
} else if (stripos($tmp, '_')) {
$tmp = end(explode('_', $tmp));
if ($tmp == '2') {
header("Location: http://$_SERVER[HTTP_HOST]/cn/?feed=rss2");
} else {
header("Location: http://$_SERVER[HTTP_HOST]/cn/?feed=rss2&cat=".$tmp);
}
}
}
?>
学习最好的方法莫过于实践,最快的途径莫过于示例,这段时间网站搬家,迫使我不断去看一些SQL操作方法,最终记载于此,以便将来参考。
1、时间操作
例:将GMT时间更改为GMT+8,可用INTERVAL把一段时间加到一个字段上。
UPDATE `wpcn_posts` SET `post_date` = `post_date_gmt` + INTERVAL 8 HOUR WHERE `post_date_gmt` = `post_date`
本例是为了对付Bo-Blog搬家到WP时大部分时间记录都没有被正确转换到GMT+8时区的问题。
2、字符查找替换
例:将某个图片的错误文件名更改为正确文件名。
UPDATE `wpcn_comments` SET `comment_content` = REPLACE ( `comment_content`, 'emot/ok', 'emot/pig' ) WHERE `comment_content` LIKE '%emot/ok%'
本例是为了对付Bo-Blog的pig.gif图片文件名被错误替换为ok.gif的问题,用到了REPLACE函数和LIKE操作符,注意LIKE后面的字段用%%匹配,而非*。
3、用R帮忙
例:批量更新日志的永久链接。
cat(sprintf("UPDATE `wpen_posts` SET post_name = '%s' WHERE ID =%d;",
x[, 3], x[, 1]), sep = "\n")
由于我不知道SQL里面如何用数组或向量,因此在批量处理的时候就用笨办法执行了,即:写n条SQL语句一起执行。R一向都是向量化操作,因此只需要把日志的ID和post_name准备好,然后用一个sprintf()就生成所有的SQL语句了,扔到phpMyAdmin中执行一下,所有的日志链接就更新了,省得把每一篇日志打开依次修改。
以上R语句生成如下结果:
UPDATE `wpen_posts` SET post_name = 'tidy-up-your-r-code' WHERE ID =1; UPDATE `wpen_posts` SET post_name = 'dare-be-defeated' WHERE ID =2; ....
插一句,对于英文日志,永久链接就是把空格替换为-,用正则表达式删掉不是[:alnum:]的字符即可。
4、用mysqldump备份数据库
这个命令可以以多种形式备份MySQL数据库,这里举例将数据库备份为*.sql的SQL语句脚本:
mysqldump -u db_user -p -r result_filename.sql database_name
由于mysqldump命令是独立的程序,所以不要先登录进mysql界面,直接在终端或command窗口运行即可。这样的备份文件可以在将来在mysql中用source命令导入:
source result_filename.sql
这样看来备份数据库也是很容易的事情,不过导入导出的时候可能会遇到编码问题。
'(.?)\[('.$tagregexp.')\b([^\[\]\r\n]*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)'是有效的。
这两天捣鼓Wordpress,遇到了无数的问题,估计Google不下百次,有些问题实在诡异,不过幸好都让我找到了答案。例如,昨天被这个问题搞得几乎崩溃:有的帖子在更新发布之后就变成空白了,刚开始我以为是数据库连接问题,后来在phpMyAdmin中检查了一遍又一遍,甚至直接更改数据库,都没法让文章显示出来,于是又去查codex,看the_content()等函数,依旧无果。最后在千般尝试下,发现把文章删除一部分文字之后就可以显示出来了,于是我意识到这与被删的文字有关,但从未听说Wordpress系统对文章内容有审查啊,所以应该不是关键词过滤的问题,我于是一句一句话地删除,看删到哪里之后文章就发不出了,最后统计了一下字节数,但这个数字对解决问题根本没用,因为不能因此就避免长文章。
我想来想去,想到了可能是插件的问题,由于需要“头文字”效果,我安装了TinyCode插件,它的内部用到了WP的shortcode。在将TinyCode禁用的情况下,长文章可以显示,问题便找到了:出在shortcode上。继续Google,发现几个月前有人出现了类似的问题,一位德国高手提供了解决方案,修改/wp-includes/shortcodes.php文件。找到:
function get_shortcode_regex() {
global $shortcode_tags;
$tagnames = array_keys($shortcode_tags);
$tagregexp = join( '|', array_map('preg_quote', $tagnames) );
return '\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\1\])?';
}
将正则表达式替换为:
return '\[('.$tagregexp.')\b([^\]]*?)(\/)?\](?:(.+?)\[\/\1\])?';
这样问题便解决了。Wordpress这么完善的系统也会有Bug……

最近评论