<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.6" -->
<rss version="0.92">
<channel>
	<title>Semantic Web Notes</title>
	<link>http://www.kylogs.com/blog</link>
	<description>PR不重要，RP才重要...</description>
	<lastBuildDate>Mon, 17 Nov 2008 08:29:14 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>堕落的日子</title>
		<description>

过了一段混乱的日子，这样的混乱还是在继续的延续，不太晓得，什么时候才能摆脱。

前两天下到了李宗盛的一个演唱会，一边又一边的听，找到了一首"生命中的精灵"，大叔真是有灵性。这些凌乱的旋律与想法，在这些日子里不断的交杂，我实在是理不清楚。

又翻了一边Alain的"身份的焦虑"，觉得这位才子大哥跟一般的才子们不一样的地方就是他知道的比较多，他想得比较清楚，他只有少许的迷茫。

9 月初开始投简历了，每天看各大bbs的job版，偶尔接到笔试和面试通知，偶尔被公司鄙视或者鄙视公司。算是这段浑浑噩噩生活的开始。9月底得到了一个大 牛公司的dream offer，干的工作也很酷，很底层，可以远离Java。于是开始懒散，无所事事。然后金融危机开始变得越来越夸张，hr突然电话我，告知我由于金融危机 这个季度的hc被冻结了，offer具体情况要12月才能从米国审批下来。愣了愣，想想这个offer没戏了，但也没觉得有多不爽，继续找工作。

面 了百度，在二面的时候跟hr谈了下对工作与生活的看法，我的意见是要很平衡的，我不会为一份job而放弃掉自己生活的节奏。hr对我的意见，不置可否，她 个人或许是同意的，但百度的加班是常常到深夜，我这样的人或许不够资格的。是年轻人，却不愿意拼。当时，还没有清楚，今年的形势有多么糟糕，自己的姿态也 是蛮高的。过了几天，被淘宝面试官给鄙视了，这次，我感觉比较无语，情绪也很低落，被一个自己不怎么愿意去的公司鄙视是蛮难过的，很容易自我怀疑。记得那 个下午，mm陪我吃了午饭，我有点心不在焉。又天天的逛bbs的job版，几乎都成了强迫症。Google不理我，M$不理我，心里蛮遗憾的，心里又骂了 几遍投行的那帮猪头。

10月中旬拿到了网易杭研究院的offer，拿offer的前一天很开心，因为从网上搜到的网易杭研 的待遇超过我期望不少。ask.com在杭州给的是12K/M，而传闻网易在杭州IT工资最高，YY了半天。第二天拿到offer，白YY了，失落了半 天。果然商人的话不能信，比ask低了不少。

总是有了希望，然后一场空。Morgan Stanley的电面很伤心，觉得完全没希望了，考虑了半天，心一狠，觉得去趟杭州，签了。走前，跟mm和老朋友吃饭，吃饭完陪mm听宣讲会，听完之后找 了个地方，在一起3年了，她觉得没激情了，觉得最近对我没感觉了，然后分手了。或许是找工作让我太烦躁了，有些冷落她。奇怪的是这一切都很平淡，我竟然没 有太伤心，太难过。分手之后还是浑浑噩噩的过日子，眼睛有点疼，不断的眨眼，现在依然是。

去杭州的火车上，睡在上铺，晚上没人聊天了，灯也关了。我听着歌，开始回想这三年的点点滴滴，慢慢开始难受，慢慢开始痛苦。歌不好听，人也烦，给人发短信，却什么都不想说。

不断的安慰自己，老子都年薪那么高了，吃遍杭州美食去，美食不比美女重要多么！重复了几遍这个咒语，却不顶用，放弃了，睁着眼睛，撑到天亮。

浙大玉泉是第二次去了，情人坡好漂亮。记得上次是在同样的地方，水完GRE后给mm打电话，这次去情人坡却是烟雨迷蒙，一个高中同学陪着。走走停停，瞎说话，瞎想，瞎难过。

回来的时候收到了MS的终面通知，我又开始YY了。YY了一天，兴奋的感觉就没了，就算拿到offer了又怎么样呢？会更加开心么？

有 的时候得到的东西的太多，期望的太多，而自己又没有一颗智慧，懂得感恩的心灵，幸福的阀值是会越来越高的。为了让自己更加快乐，我一直在追求许多外在的东 西，但无论成功与否，每次追求都会给自己带来更多的失落。再看看"身份的焦虑"，觉得Alain的分析确实是很在理，但是，他没能告诉我们该怎么办。 </description>
		<link>http://www.kylogs.com/blog/archives/729.html</link>
			</item>
	<item>
		<title>随风而去</title>
		<description>"随风而去"是伍佰很久以前的作品了。伍佰有的作品非常离谱，有的却是十分精彩。推荐下不熟悉伍佰这个流氓的同学听听这首“随风而去” :).

听歌要有心境，有的歌，当你还很稚嫩的时候你会不明白词与曲之间隐含的痛快与哀伤。当许多的心酸与快乐已经过去，许多的梦想与豪情已经过去，在一些不经意的瞬间里，那些音符，那些言语，和他们在一起的氛围，就让你觉得在那么多人的生命里，喜怒哀乐是何其的相似，就让你觉得自己依然是过去的那个自己，所改变的只是一些额外的装饰。自己依然是自己，身边的一切，却都随风而去。

很惊讶伍佰这样的野蛮大叔，年轻的时候还能写出那么温柔的歌词，果然每一个人，都有他柔情的时刻：
让所有的爱通通随风而去
转眼之间无痕迹
让淡淡清香留在心底
不再有相思的悲凄
让青春年少疯狂时的秘密
化成彩虹般绮丽
让时间的河将我流走
像白云一样不回头 </description>
		<link>http://www.kylogs.com/blog/archives/724.html</link>
			</item>
	<item>
		<title>随便说说</title>
		<description>已经有较长的一段时间没有更新blog了，最近实在是比较忙，实验室的事情特别多。有专利要写，有东西要设计，还有ppt报告要做...，还要找工作。

有人觉得写blog其实标题很重要，我这篇post的标题就是不好的典型。这样的标题对搜索引擎来说基本没有价值，这篇文章也将在搜索引擎收录的汪洋大海中沉没。由于title或者metadata中的关键字在很多的搜索引擎中有着相当高的权值（相对于该页的其他内容），充满关键字的标题也会给blog带来不少流量，也就是说做标题党是很有好处的。这点新浪首页将标题党的本质展现的淋漓尽致。

但是，对于一个原创的blogger而言，流量其实是蛮尴尬的事情。写blog跟写日记是有区别的，写blog有一个目的就是让自己的文章被别人看到，而写日记有一个特点就是让自己的文章不被别人看到。blogger当然需要有评论，需要有别人的共鸣，孤独的自我谈论是很难长久的。就是说我们blogger需要有流量，需要自己的站点更多的被展示。这样的结果就会导致blogger在写文章的时候小心翼翼：设计标题让它有更多关键词，写一些自己不感兴趣却热门的话题，选词造句不是为了准确的描述，而是为了添加更多的关键字.....这样为了搜索引擎而写的blogger，过得非常辛苦。

我不是反对SEO，我自己也装了一些SEO插件，只是觉得SEO不当从post的内容着手（虽然这是最有效的方法），而可以从页面的结构上去设计。内容过于注重SEO的blog和post，我觉得时间长了会没有价值。

说起来，现在搜索引擎的力量真是很受重视。大家可以搜索 新浪 伊利 公关，还可以看看新浪这个报道奶粉检查结果的页面，“伊利”两字是这么写的：“伊-利”。hoho。 </description>
		<link>http://www.kylogs.com/blog/archives/718.html</link>
			</item>
	<item>
		<title>说说C语言和内存对齐</title>
		<description>我看东西，看得快，忘得也奇快。大概2星期重新研究过内存对齐，现在都快忘光了，于是赶紧再回忆一下。 :)
所谓内存对齐，即使得数据所在内存地址的起点应尽量对齐(是某个值的公倍数)，而不是凌乱不堪的。一般我们把8个bit看成1一个byte，用byte来做存储的单位，其实也是一种内存对齐的机制——这样处理器访问数据只需要访问8的倍数即可。

内存对齐的目的很简单，这样有利于提供访问的速度（特别是在栈中）。对于对齐的内存地址，处理器访问一次即可得到，而未对齐的地址，可能需要访问两次才行。

那内存对齐的最小单位是什么呢？其实不同平台上不同的编译器都有自己的决定(猜的)，编译器的这个决定叫做默认对齐系数。我们在自己编写程序的时候很少会去注意到这个对齐问题，这个很正常，因为这机制本身就应该是对程序员透明的。但是，我们还是能够在程序中觉察到对齐机制的存在。如果程序员没有正确意识到对齐机制的存在，有的时候它甚至会让程序的行为不正确。我举个小小的例子来说明下。
假设有这样一个结构体
typedef struct ex{
	int c1;
	char c2;
        int c3;
}ve;  /*  1  */
我的运行环境是gcc4.0+, ubuntu8.04, 32位单核cpu，sizeof(char)是1，sizeof(int)是4，猜猜sizeof(ve)的值会是多少？如果程序员不清楚内存对齐的概念的话会认为这个值是6，但其实是12。在这里面，有4个成员需要对齐，c1,c2,c3,ve，c1,c2,c3跟ve的对齐规则并不一致。

c1,c2,c3的对齐过程如下（对齐系数是4的前提下）：假设第一个成员放在offset为0的位置，那么c1所占的内存就是[0~3]，而c2所占的内存是[4]，c3所占的内存不是[5~8]，而是[8~12]，但如果c3是char类型的话，c3所占的内存就是[5]。

所以结构体内成员的对齐规则如下：假设第一个成员的offset是0，则之后成员的对齐系数是系统的对齐系数（可以通过pragma pack(x)来指定）和自身长度两者间较小的值。比如，系统的对齐系数是4，而char的长度是1，那么char就按1对齐。而int的长度是4，于系统对齐系数一致，则按4对齐。

从上面这个规则，我们可以看到一个有趣的问题，在结构体内，成员的摆放顺序不同，结构体所占空间是不同的。比如，
typedef struct ex{
	char c1;
	char c2;
        int c3;
}ve; /*  2  */
与
typedef struct ex{
	char c1;
	int c3;
     ...</description>
		<link>http://www.kylogs.com/blog/archives/710.html</link>
			</item>
	<item>
		<title>关于爬虫</title>
		<description>一直传闻（传闻1，传闻2）百度除了派正常爬虫，还会派匿名爬虫来抓取网站信息。爬虫要伪装agent信息的原因很简单，可以做一些不想让人知道的事情。比如，疯狂抓取页面，可以不遵守Robots.txt等等。不过看了一些之前对百度的匿名爬虫的文章。我觉得有时候这个不一定是百度搜索引擎的爬虫（虽然ip是来自于百度公司的），很有可能一些匿名的爬虫是来源于百度一些研究性项目。我们实验室也写过爬虫寻找web service的描述文件（最后是利用google了....），以进行分析。由于算法的问题，实验性的爬虫可能会过度访问一些站点，以至于表现不是很道德。

我的blog也常常被微软live的伪装爬虫光顾（每天几十次），yahoo统计和clicki统计等统计程序都认为是人而不是爬虫，但是它的行为显然不是，ip的区段都是米国微软公司的，ref URL是live中关于某个词的搜索页面，而我的页面排名在live搜索中很靠后，基本上正常人不会常常翻到搜索结果的最后几页。所以我怀疑这个爬虫是微软利用live的搜索结果在做些研究。

对于我这样这样访问量不多的小blog(一共每天150ip左右)，爬虫的访问量要占总访问量的大部分，前两天还因为我的blog占用cpu过高而短时间内被dreamhost停止了服务。虽然dreamhost的口碑一般且过度销售，但是大概1天1000左右的ip对它而言还是可以接受的。这只能说明有大量的爬虫在访问我的blog。随着引向我blog的链接越来越多，来光顾的爬虫也越来越多。特别是做了几个插件之后，有了wordpress.org/extend/plugins到我blog的链接，随之而来的垃圾评论越来越多，每天100多个广告评论，相当崩溃。最近正想方法来避免一些有害爬虫的访问，比如判断ip，然后返回其404？待试验了再说。 </description>
		<link>http://www.kylogs.com/blog/archives/704.html</link>
			</item>
	<item>
		<title>IDE的意义</title>
		<description>这两天在看一本书：Managing Projects with GNU Make。我每次看书，都会产生一些跟书的内容本身并不非常相关的想法。我看这本书的目的是要为easyC-API建立一个好用的makefile文件，另外也是对其有些好奇。

待到书看了一半，我就想到了IDE，Eclipse CDT, DEV C++等帮助我们创建管理项目的工具。我觉得那才是一个程序员应该去用的工具，而不是去手工一个makefile文件。因为看着这些makefile的编写规则，我觉得让它的自动生成是完全可以做到的，既然可以利用工具完全可以做到，普通的程序员就完全不需要去了解这里面的机制，就像我们不了解Java的Byte Code，也不了解JVM生存Byte Code的规则，但是我们依然能写出漂亮的Java应用。用人手工去写makefile文件是存在许多弊端的:

	需要非常精通makefile的规则，也就是需要额外的学习；
	非常容易出错，对于大型的项目而言，几乎难以避免；
	程序员之间沟通不方便，makefile文件虽然是比较直观的，但是不同的人编写风格存在着较大的差异，不如用工具生成的容易理解——如果采用工具生成，甚至你都不必去理解它；

我要说的是，手工编写makefile很酷，但是只能自己玩，不要强迫别人跟你一起玩。以上结论，对Ant同样适用。 </description>
		<link>http://www.kylogs.com/blog/archives/698.html</link>
			</item>
	<item>
		<title>降低选择的数量</title>
		<description>如果我们要设计一个系统（或者框架，或者程序设计语言），我们是让它对实现一个功能有一种解决方案好，还是有20种解决方案好（对系统的使用者而言）？这个问题似乎很容易回答，显然是有20种方案更好些。20种不同的方案显然都有着不同的优缺点，可以使得方案的效果更加的可控，挑选的余地更大。一般情况下是是这样的，不过我最近看书的时候常常想一个问题：假使从20个方案挑选一个需要的难度和花费，比直接使用第一种方案要高很多，那么有着更多的解决办法还是一件好事么？
我的观点是否定的。我从程序设计语言的角度来举个例子。假如有一天我设计了一种新的程序设计语言，名字叫SuperPERL（我不是要讽刺Perl），其最大的特点就是自由。实现每个功能都可以有无数的写法，使得不同背景的程序员都能够轻松过渡到SuperPERL。比如，打开文件这样的操作，有如下几种写法：

//方法1：
File file=new file("path");
InputStream is=new FileInputStream(file);
Scanner s=new Scanner(is);

//方法2：%%表示调用shell命令
StringBuffer fb=new StringBuffer();
StringBuffer.addContent("%%echo $myfile>$fb");

//方法3:

File *file=open_file("myfile")
//方法4:
.....


看着其实很不错，SuperPERL能把各种语言都能融会贯通，程序员能够随心所欲的写出正确的代码，一个C程序或者一个Java程序员，或者Basic程序员都能顺利的使用这种语言。但是如果我们面对的是一位初学者呢？他买了A书，然后学到SuperPERL打开文件是按方法1做的，买了B书，然后学到打开文件是按方法4作的，然后他的老师告诉他应该按方法2做，他同学，一位大牛告诉他SuprePERL中最具效率的打开文件的方法应该是第二种，其他方法都是土鳖做法......如果在学习SuperPERL中的每一个功能都要发生以上的故事，我想他肯定会放弃这种编程语言的。
其次是沟通的困难，一个C转过来的程序员，很快乐的编写着SuperPERL程序：用着自己熟悉的语法，写出非常时尚的代码。但是他同事可能以前是一位Pascal程序员，不难想象这两位用着同一种编程语言共同开发项目时会产生的困境——互相之间看不懂对方的代码。

功能不是越多越方便，选择不是越多越好，对于程序设计语言，对于各种应用框架而言，尤其如此。如果我是某个语言或者框架的设计师，我的设计准则肯定会有一条是：公开的概念（也就是使用者需要学习的概念）越少越好，拥有的选择越少越好。少的概念有利于初学者的学习，也有利于开发者之间的沟通。

想想Java世界无数需要理解与学习的概念吧，Java世界正朝着相反的方向前进。 </description>
		<link>http://www.kylogs.com/blog/archives/674.html</link>
			</item>
	<item>
		<title>easyC-API中关于动态数组(Vector)的实现与使用方法简介</title>
		<description>动态数组在C语言中是比较常用的，实现起来也是很简单明了的，这篇文章我简单给出一个动态数组的实现(easyC-API中的实现与此基本一致，稍稍复杂些)。首先，定义动态数组如下：
typedef struct easyc_vector{
    int size;
    int base_size;
    int actual_size;
    eType *base;
    eType (*get)(int, const struct easyc_vector *);
    void (*set)(int,eType,const struct easyc_vector *);
    eType (*remove)(int,struct easyc_vector *);
    ...</description>
		<link>http://www.kylogs.com/blog/archives/667.html</link>
			</item>
	<item>
		<title>Google浏览器Chrome即将发布</title>
		<description>

虽然不是google Fans，不过作为google服务的重度依赖者，对google的产品一直都蛮关注。刚刚在求实上看到有同学介绍google开发的浏览器，很Orz。我一直认为google brower, google OS, google phone都是GFans的自娱自乐，没想到确有其事。

按照google官方blog中的文章A fresh take on the browser，9月2日，Google的浏览器google chrome的beta就要放出，也就是今天阿（注意一点点时差的区别）Gfans上对此也有介绍。为了配合这个浏览器的发布，google特意做了一套漫画。我这边网速有问题，一直不能正常显示。

google chrome是开源的，基于什么协议我还没有查到。加油吧，google chrome，真希望土鳖IE用的人越来越少，那么将来我们的网银就能支持firefox拉，娃哈哈。

网页开发者们或许会关心google chrome对web标准的支持如何，我想应该不会比IE6差吧。拭目以待吧。 </description>
		<link>http://www.kylogs.com/blog/archives/652.html</link>
			</item>
	<item>
		<title>关于C语言的typedef</title>
		<description>注：本文的内容只是对自己学习到知识的一些简单总结，并没有考证过C的规范和手册进行求证。
很多文章，甚至于很多教材，对c语言的typedef的解释是有错误的，以致于许多学习C语言的人对typedef的理解往往有偏差。

一种最常见的错误观点是typedef定义了现有类型的一个别名（alias），比如
typedef int EType;/* (1) */
是给int类型取了一个EType的别名。在这种情况下，似乎也能解释的通，但是，如果碰到这样一个typedef定义呢：
typedef int (*f)(double,int); /* (2) */
观其名，识其行，看typedef的名字就明白它的意思是定义类型。typedef不是简单的给现有类型取一个别名，或者简单的进行字符替换，typedef是利用现有的数据类型类定义一个新的类型。比如语句（1），从概念上我们应当认为是定义了一种新的数据类型，只是这种新类型跟int类型是吻合的。而语句（2）定义了一种新的类型f，f这种类型是一个参数为double,int，返回值是int的函数指针类型。

那么如何去分析，识别typedef定义的类型呢？我从Tony Bai的文章中学到了蛮好的方法。方法就是看看去掉typedef之后，剩下的语句中把相应的变量(记为p)变成了什么类型，那么加上typedef之后，这个p就成了这种类型的名字。

举语句(2)的例子，把typedef去掉，原句就成了
int (*f)(double,int); /* (3) */
，这是一个很普通的函数指针的定义，这个时候f就是指向一个参数为double,int返回值为int的函数指针变量，那么加上typedef之后，f就是指向.....的函数指针类型。

再举一个通俗的例子，将语句(1)的typedef去掉，就成了int EType;/* (4) */我们可以清楚的看到，EType是一个int类型的变量，那么加上typedef，EType实际上就成了一个int类型。 </description>
		<link>http://www.kylogs.com/blog/archives/648.html</link>
			</item>
</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.749 seconds -->
