<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rockmaple Blog &#187; Web</title>
	<atom:link href="http://zhangyf.net/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://zhangyf.net</link>
	<description>技术，互联网，eLearning …</description>
	<lastBuildDate>Thu, 09 Jun 2011 15:38:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>闲扯RSS Reader</title>
		<link>http://zhangyf.net/2011/03/rss-reader-rest/</link>
		<comments>http://zhangyf.net/2011/03/rss-reader-rest/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 14:08:58 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[RssReader]]></category>

		<guid isPermaLink="false">http://zhangyf.net/?p=104</guid>
		<description><![CDATA[最近google reader基本上是上不去了。墙的触角又伸长了。这对我来说很不适应，因为reader是我获取信息的主要手段。
除却被封的因素外，最近上reader的频率也不如以前高了。经常是看看好友的分享文，看看几个特别关注的网站和博客，其它的就全部标记已读了，或者就直接放在那里不管了。在繁忙的工作之余，很难在有时间阅读大量的大段长文了。
想起了09年中的一个话题：RSS 已死？TechCrouch的一篇文章Rest in Peace, RSS认为RSS将被twitter所取代，这引起了大家对于RSS命运的争论。WebLeOn的观点是：RSS不会死去，而是将获得重生。曹增辉则得出结论：阅读器大众化已死。
现在看起来，将RSS Reader普及到大众的努力已经基本上失败了。而在一些小众的应用领域，RSS Reader仍然发挥着重要的作用。正向曹増辉所说的，“它依然是最高效的定向阅读工具”。每次登录google reader，都会看到好友们在积极的分享文章，flower我的人的数量也在逐步增加，我依然会在reader里记笔记，收藏和分享文章。
也许，RSS Reader的定位应该是：知识管理工具和知识分享工具。
]]></description>
			<content:encoded><![CDATA[<p>最近google reader基本上是上不去了。墙的触角又伸长了。这对我来说很不适应，因为reader是我获取信息的主要手段。</p>
<p>除却被封的因素外，最近上reader的频率也不如以前高了。经常是看看好友的分享文，看看几个特别关注的网站和博客，其它的就全部标记已读了，或者就直接放在那里不管了。在繁忙的工作之余，很难在有时间阅读大量的大段长文了。</p>
<p>想起了09年中的一个话题：RSS 已死？TechCrouch的一篇文章<a href="http://www.techcrunchit.com/2009/05/05/rest-in-peace-rss/" target="_blank">Rest in Peace, RSS</a>认为RSS将被twitter所取代，这引起了大家对于RSS命运的争论。WebLeOn的<a href="http://www.webleon.org/2009/05/rss.html" target="_blank">观点</a>是：RSS不会死去，而是将获得重生。曹增辉则得出结论：<a href="http://www.caozenghui.cn/archives/542.html" target="_blank">阅读器大众化已死</a>。</p>
<p>现在看起来，将RSS Reader普及到大众的努力已经基本上失败了。而在一些小众的应用领域，RSS Reader仍然发挥着重要的作用。正向曹増辉所说的，“它依然是最高效的定向阅读工具”。每次登录google reader，都会看到好友们在积极的分享文章，flower我的人的数量也在逐步增加，我依然会在reader里记笔记，收藏和分享文章。</p>
<p>也许，RSS Reader的定位应该是：知识管理工具和知识分享工具。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2011/03/rss-reader-rest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于GAE的导出农历生日ics文件的工具</title>
		<link>http://zhangyf.net/2010/04/open-source-lunar-calendar-tool/</link>
		<comments>http://zhangyf.net/2010/04/open-source-lunar-calendar-tool/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 04:31:12 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[GAE]]></category>

		<guid isPermaLink="false">http://zhangyf.net/?p=88</guid>
		<description><![CDATA[很多中国人的习惯是按照农历过生日的，但是在Google Calendar里添加农历生日只能一年一年的添加，而不能一次添加多年，这样就很不方便。为了避免这个麻烦，在几个月前写了一个程序，用来生成按年重复的农历生日的ICS文件，导入Google Calendar里，避免一年一年的添加带来的麻烦。程序是一个Web应用，运行在GAE(Google App Endine)之上，地址在这里: http://spur.appspot.com
前几天有网友给我发信说他在用这个工具，问我能不能开源，因为appspot随时可能会被封掉，这样就用不了了。如果开源的话别人拿到源代码至少可以自己部署起来使用。我想这也是个不错的主意，本来这只是我个人写着玩的东西，能对人有帮助还是很高兴的。
于是在Google Code上建了个项目，把源代码放了上去，地址： http://code.google.com/p/lunar-cal-ics-gen/ 。
简单说明一下：

程序使用python语言编写，运行于GAE平台, 要想在本机运行，需要下载GAE SDK。当然，也可以修改代码改造成不依于GAE的Web应用。
Web框架使用了从friendfeed开源出来的tornado，具体介绍可见这里 。
生成日历使用的是icalendar 库，计算农历的代码取自pyzh 项目。

目前添加日历的方式是以ics文件做为中介，最初曾设想通过GData API直接将日历添加到Google Calendar，不过由于时间关系，一直没来得及做这件事，也不确定这个想法是否可行。
程序截图

]]></description>
			<content:encoded><![CDATA[<p>很多中国人的习惯是按照农历过生日的，但是在Google Calendar里添加农历生日只能一年一年的添加，而不能一次添加多年，这样就很不方便。为了避免这个麻烦，在几个月前写了一个程序，用来生成按年重复的农历生日的ICS文件，导入Google Calendar里，避免一年一年的添加带来的麻烦。程序是一个Web应用，运行在GAE(Google App Endine)之上，地址在这里: http://spur.appspot.com</p>
<p>前几天有网友给我发信说他在用这个工具，问我能不能开源，因为appspot随时可能会被封掉，这样就用不了了。如果开源的话别人拿到源代码至少可以自己部署起来使用。我想这也是个不错的主意，本来这只是我个人写着玩的东西，能对人有帮助还是很高兴的。</p>
<p>于是在Google Code上建了个项目，把源代码放了上去，地址： http://code.google.com/p/lunar-cal-ics-gen/ 。</p>
<p>简单说明一下：</p>
<ul>
<li>程序使用python语言编写，运行于GAE平台, 要想在本机运行，需要下载<a href="http://code.google.com/appengine/downloads.html">GAE SDK</a>。当然，也可以修改代码改造成不依于GAE的Web应用。</li>
<li>Web框架使用了从friendfeed开源出来的tornado，具体介绍可见<a href="http://bret.appspot.com/entry/tornado-web-server">这里</a> 。</li>
<li>生成日历使用的是<a href="http://bret.appspot.com/entry/tornado-web-server">icalendar</a> 库，计算农历的代码取自<a href="http://code.google.com/p/pyzh/">pyzh</a> 项目。</li>
</ul>
<p>目前添加日历的方式是以ics文件做为中介，最初曾设想通过GData API直接将日历添加到Google Calendar，不过由于时间关系，一直没来得及做这件事，也不确定这个想法是否可行。</p>
<p>程序截图</p>
<div><img class="alignnone" title="截图" src="http://pic.yupoo.com/rockmaple/9974191a7f6e/xdjfsqvw.jpg" alt="截图" width="500" height="375" /></div>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2010/04/open-source-lunar-calendar-tool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eLearning工具之RSS阅读器</title>
		<link>http://zhangyf.net/2010/03/elearning-rss-reader/</link>
		<comments>http://zhangyf.net/2010/03/elearning-rss-reader/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 12:57:40 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[eLearning]]></category>
		<category><![CDATA[eLearning2.0]]></category>
		<category><![CDATA[RssReader]]></category>

		<guid isPermaLink="false">http://rockmaple.info/?p=12</guid>
		<description><![CDATA[网上分布着大量的不同种类型的知识，每天都有无数的知识被生产出来。作为知识消费者的学习者，往往面对着海量信息无所释从。RSS阅读器可以帮助他们解决这个问题。学习者可以通过订阅感兴趣的信息源，实现对于知识的集中阅读和管理。前提是，这些信息源提供了可供订阅的格式。
也就是说，RSS阅读器提供了由知识生产者到知识消费者之间的快捷通道。但是在RSS阅读器里，知识仍然是原有的知识，并不能通过知识消费者之间的互动而得到升华，因而RSS阅读器作为eLearning工具的作用也就甚为有限了。为什么这么说呢，先简单的扯一点理论。
社会建构主义学习观认为个人建构的、独有的主观意义和理论只有与社会、与物理世界“相适应”时，才有可能得到发展。因此，社会建构主义学习观强调意义的社会建构和学习的社会情境，强调社会互动、协作与活动等。从社会建构主义角度来看，知识不仅是个体在与物理环境的相互作用中建构起来的，而且社会性的相互作用对于知识的建构也同样重要，甚至更为重要。
基于上面的理论，只有当阅读器支持社会性互动，支持社会性知识建构，才能成为更有效的社会化学习工具。社会化也是目前大多数在线RSS阅读器的发展方向。
Google Reader 在社会化方面做了很多尝试，包括许多社会化方面的功能：

分享：包括对文章的分享，目录的分享，标签的分享以及把文章邮寄给好友等功能
评论：可对分享的文章进行评论
Like: 与分享不同的地方在于Like对于所有人是可见的，从而为学习者提供了一种找到兴趣可能相同的人的方法
Follow: 最初是订阅gtalk好友的分享，改成follow后范围大大扩大，而且是单向关系。

总的来说，这几个方面的功能都可归结为“分享”。其实，“分享”的过程可以看做是知识整理的过程，相当于无数的用户不断地在以人工的方式从Google Reader的巨大的内容库中挑选出有价值的知识。重要的是，这些知识是存在Google Reader里的，这本身就是一个财富。用户精挑细选互联网上的内容，加以评论和注释，帮助google构建了一个巨大的知识库。这个知识库又会吸引更多的人来使用Google Reader,他们之中又会有很多人参与“分享”活动，从而形成一个知识不断增长的“生态系统”。
从上面的分析来看，阅读器本身可以作为一个社会化的学习工具，且在社会化方面其实可以走得更远一些，比如围绕同种类型的知识形成学习圈子（因其小众，更容易形成同质的人群），更好地促进学习。
]]></description>
			<content:encoded><![CDATA[<p>网上分布着大量的不同种类型的知识，每天都有无数的知识被生产出来。作为知识消费者的学习者，往往面对着海量信息无所释从。RSS阅读器可以帮助他们解决这个问题。学习者可以通过订阅感兴趣的信息源，实现对于知识的集中阅读和管理。前提是，这些信息源提供了可供订阅的格式。</p>
<p>也就是说，RSS阅读器提供了由知识生产者到知识消费者之间的快捷通道。但是在RSS阅读器里，知识仍然是原有的知识，并不能通过知识消费者之间的互动而得到升华，因而RSS阅读器作为eLearning工具的作用也就甚为有限了。为什么这么说呢，先简单的扯一点理论。</p>
<p>社会建构主义学习观认为个人建构的、独有的主观意义和理论只有与社会、与物理世界“相适应”时，才有可能得到发展。因此，社会建构主义学习观强调意义的社会建构和学习的社会情境，强调社会互动、协作与活动等。从社会建构主义角度来看，知识不仅是个体在与物理环境的相互作用中建构起来的，而且社会性的相互作用对于知识的建构也同样重要，甚至更为重要。</p>
<p>基于上面的理论，只有当阅读器支持社会性互动，支持社会性知识建构，才能成为更有效的社会化学习工具。社会化也是目前大多数在线RSS阅读器的发展方向。<br />
Google Reader 在社会化方面做了很多尝试，包括许多社会化方面的功能：</p>
<ul>
<li>分享：包括对文章的分享，目录的分享，标签的分享以及把文章邮寄给好友等功能</li>
<li>评论：可对分享的文章进行评论</li>
<li>Like: 与分享不同的地方在于Like对于所有人是可见的，从而为学习者提供了一种找到兴趣可能相同的人的方法</li>
<li>Follow: 最初是订阅gtalk好友的分享，改成follow后范围大大扩大，而且是单向关系。</li>
</ul>
<p>总的来说，这几个方面的功能都可归结为“分享”。其实，“分享”的过程可以看做是知识整理的过程，相当于无数的用户不断地在以人工的方式从Google Reader的巨大的内容库中挑选出有价值的知识。重要的是，这些知识是存在Google Reader里的，这本身就是一个财富。用户精挑细选互联网上的内容，加以评论和注释，帮助google构建了一个巨大的知识库。这个知识库又会吸引更多的人来使用Google Reader,他们之中又会有很多人参与“分享”活动，从而形成一个知识不断增长的“生态系统”。</p>
<p>从上面的分析来看，阅读器本身可以作为一个社会化的学习工具，且在社会化方面其实可以走得更远一些，比如围绕同种类型的知识形成学习圈子（因其小众，更容易形成同质的人群），更好地促进学习。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2010/03/elearning-rss-reader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Reader的中文用户都在分享些啥</title>
		<link>http://zhangyf.net/2009/12/what-google-reader-cn-user-shared/</link>
		<comments>http://zhangyf.net/2009/12/what-google-reader-cn-user-shared/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 15:12:20 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[RssReader]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[长尾]]></category>

		<guid isPermaLink="false">http://zhangyf.net/?p=78</guid>
		<description><![CDATA[上周末写了个抓取程序，用来抓取Google Reader分享的Feed。由于分享的Feed里每一篇被分享的文章都列出了like该文章的用户ID，通过该用户ID可以拼出一个新的分享Feed。这样，以几个用户的分享作为种子，就可以获取大量的用户分享数据。
我的小破电脑吭哧吭哧地抓了一周，主要抓取中文用户的分享，其间又由于有些Feed里含有特殊内容而被connection reset了几次。到了周六早晨，共获得了11万个用户ID，其中，中文用户有2.7万(share或者like过中文文章的用户被认为是中文用户)。从抓取的过程来看，这2.7万用户应该是有过分享行为的中文用户里的绝大多数了。
被share最多的文章和被like最多的文章
对已经获得的数据做统计，被share最多的十篇文章是：

这些狗真麻烦
我接受谷歌的六十美元，并欢迎谷歌扫描我的图书
中国特色
一条船上的人
2009年度表情评选揭晓
这是一个庞大而复杂的工程
唐龙与藏獒（转）
大力普及“他妈的”有助于语言交流
小技巧：做好Gmail防盗措施
Google Wave 完全手册……中文版！

被like最多的十篇文章：

唐龙与藏獒（转）
感冒药攻略（内含囧插图……）
继续使用Opera Mini国际版
C++ 会议第一天
2009年度表情评选揭晓
Google Wave 完全手册……中文版！
Twitter改变了什么？
必胜客，你的蛋疼么？
笔记本就是力量
Lifehacker：最值得感谢的 61 款免费应用

韩寒的文章被分享的次数最多，看来他的文章很对阅读器用户的胃口。另外一个被分享比较多的是可能吧，大家对IT类的科普文章还是很感兴趣的嘛。另外，同被share的文章相比，被like比较多的文章看起来知识性更强一些。
比较有意思的一篇文章是唐龙与藏獒（转），来自土摩托日记，被like和share的次数都很多，从标题上看是一篇转载文，不过用google搜索 “唐龙与藏獒”的时候，都是转帖，反而找不到该文章的原始出处和作者。看来一篇文章要想广为流传，不仅要有好的文章质量和独到的见解，还得借助有影响的媒介来传播。
用户的阅读时间
用户分享的Feed里有一个元素叫做gr:crawl-timestamp-msec，经过验证，这个时间在分享Feed里就是用户分享文章的时间。对这个时间做统计，就可以看出用户在哪些时间里使用阅读器。统计结果如下图：

除了晚上睡觉的时间，用户在其他时间使用阅读器的频率似乎差不多，只能大约看出中午，晚上6点和晚上10点左右几个高峰期。这说明用户在工作时间也是在使用Reader的？
分享的长尾
对所有文章的分享次数做统计，最后得到一张图，很明显这张图与长尾理论的观点相符合。

横轴代表文章，纵轴代表文章分享次数。少数文章被大量的分享，而大多数文章则只有一两次分享。
]]></description>
			<content:encoded><![CDATA[<p>上周末写了个抓取程序，用来抓取<a href="https://www.google.com/reader">Google Reader</a>分享的Feed。由于分享的Feed里每一篇被分享的文章都列出了like该文章的用户ID，通过该用户ID可以拼出一个新的分享Feed。这样，以几个用户的分享作为种子，就可以获取大量的用户分享数据。</p>
<p>我的小破电脑吭哧吭哧地抓了一周，主要抓取中文用户的分享，其间又由于有些Feed里含有特殊内容而被connection reset了几次。到了周六早晨，共获得了11万个用户ID，其中，中文用户有2.7万(share或者like过中文文章的用户被认为是中文用户)。从抓取的过程来看，这2.7万用户应该是有过分享行为的中文用户里的绝大多数了。</p>
<h4>被share最多的文章和被like最多的文章</h4>
<p>对已经获得的数据做统计，被share最多的十篇文章是：</p>
<ul>
<li><a href="http://blog.sina.com.cn/s/blog_4701280b0100g03k.html">这些狗真麻烦</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_4701280b0100fzmm.html">我接受谷歌的六十美元，并欢迎谷歌扫描我的图书</a></li>
<li><a href="http://www.kenengba.com/post/1998.html">中国特色</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_4701280b0100fpjr.html">一条船上的人</a></li>
<li><a href="http://www.kenengba.com/post/2015.html">2009年度表情评选揭晓</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_4701280b0100fej4.html">这是一个庞大而复杂的工程</a></li>
<li><a href="http://immusoul.com/index.php/archives/1486.html">唐龙与藏獒（转）</a></li>
<li><a href="http://www.matrix67.com/blog/archives/2571">大力普及“他妈的”有助于语言交流</a></li>
<li><a href="http://www.kenengba.com/post/2032.html">小技巧：做好Gmail防盗措施</a></li>
<li><a href="http://www.google.org.cn/posts/complete-guide-to-google-wave-chinese-version.html">Google Wave 完全手册……中文版！</a></li>
</ul>
<p>被like最多的十篇文章：</p>
<ul>
<li><a href="http://immusoul.com/index.php/archives/1486.html">唐龙与藏獒（转）</a></li>
<li><a href="http://songshuhui.net/archives/23219.html">感冒药攻略（内含囧插图……）</a></li>
<li><a href="http://www.kenengba.com/post/2021.html">继续使用Opera Mini国际版</a></li>
<li><a href="http://blog.codingnow.com/2009/12/cpp2009.html">C++ 会议第一天</a></li>
<li><a href="http://www.kenengba.com/post/2015.html">2009年度表情评选揭晓</a></li>
<li><a href="http://www.google.org.cn/posts/complete-guide-to-google-wave-chinese-version.html">Google Wave 完全手册……中文版！</a></li>
<li><a href="http://www.kenengba.com/post/1974.html">Twitter改变了什么？</a></li>
<li><a href="http://www.hecaitou.net/?p=6598">必胜客，你的蛋疼么？</a></li>
<li><a href="http://www.geekonomics10000.com/373">笔记本就是力量</a></li>
<li><a href="http://xbeta.info/thankful-61-apps.htm">Lifehacker：最值得感谢的 61 款免费应用</a></li>
</ul>
<p>韩寒的文章被分享的次数最多，看来他的文章很对阅读器用户的胃口。另外一个被分享比较多的是<a href="http://www.kenengba.com/">可能吧</a>，大家对IT类的科普文章还是很感兴趣的嘛。另外，同被share的文章相比，被like比较多的文章看起来知识性更强一些。</p>
<p>比较有意思的一篇文章是<a href="http://immusoul.com/index.php/archives/1486.html">唐龙与藏獒（转）</a>，来自<a href="http://immusoul.com/index.php">土摩托日记</a>，被like和share的次数都很多，从标题上看是一篇转载文，不过用google搜索 “唐龙与藏獒”的时候，都是转帖，反而找不到该文章的原始出处和作者。看来一篇文章要想广为流传，不仅要有好的文章质量和独到的见解，还得借助有影响的媒介来传播。</p>
<h4>用户的阅读时间</h4>
<p>用户分享的Feed里有一个元素叫做gr:crawl-timestamp-msec，经过验证，这个时间在分享Feed里就是用户分享文章的时间。对这个时间做统计，就可以看出用户在哪些时间里使用阅读器。统计结果如下图：</p>
<p><img src="http://pic.yupoo.com/rockmaple/6872291a6dfc/8gi2yy8e.jpg" alt="阅读时间图" /></p>
<p>除了晚上睡觉的时间，用户在其他时间使用阅读器的频率似乎差不多，只能大约看出中午，晚上6点和晚上10点左右几个高峰期。这说明用户在工作时间也是在使用Reader的？</p>
<h4>分享的长尾</h4>
<p>对所有文章的分享次数做统计，最后得到一张图，很明显这张图与长尾理论的观点相符合。</p>
<p><img src="http://pic.yupoo.com/rockmaple/3350291a6e01/lrfv5n27.jpg" alt="分享的长尾" /></p>
<p>横轴代表文章，纵轴代表文章分享次数。少数文章被大量的分享，而大多数文章则只有一两次分享。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2009/12/what-google-reader-cn-user-shared/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用Scala写了一个简单的分词工具</title>
		<link>http://zhangyf.net/2009/12/scala-segment-tool/</link>
		<comments>http://zhangyf.net/2009/12/scala-segment-tool/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 15:15:15 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[分词]]></category>

		<guid isPermaLink="false">http://zhangyf.net/?p=80</guid>
		<description><![CDATA[起了个名叫做segcala, 地址 http://segcala.googlecode.com。
这几天对Scala比较感兴趣，看了一些资料，不过语言这东西光看不练还是没感觉，就写了这样一个分词程序。使用了Chih-Hao Tsai的mmseg分词算法。做为依赖注入的粉丝，程序里使用了google guice做为依赖注入容器。
Scala在JVM上的运行效率可以达到和Java差不多的程度。做为同时支持面向对象和函数式编程思想的语言，其强大的表达能力则是Java所忘尘莫及。
以mmseg算法中求一个chunk的自由语素度的代码为例，看看Scala如何使程序变得更加简捷和清晰：
Scala版：
def largestSumMorphemicFreedomDegreeRule(chunks: List[Chunk]): List[Chunk] = {
    val c = chunks.reduceLeft((c1, c2) =&#62; {if (c1.degreeOfMorphemicFreedom &#62; c2.degreeOfMorphemicFreedom) c1 else c2})
    chunks.filter(chunk =&#62; (chunk.degreeOfMorphemicFreedom == c.degreeOfMorphemicFreedom))
}

再看看Java版（取自solo L的mmseg库）:

public class LSDMFOCWRule implements IRule {/* (non-Javadoc)
 * @see org.solol.mmseg.core.IRule#invoke()
 */
public final IChunk[] invoke(final IChunk[] chunks) {
    LSDMFOCWRuleComparator[] [...]]]></description>
			<content:encoded><![CDATA[<p>起了个名叫做segcala, 地址 http://segcala.googlecode.com。</p>
<p>这几天对<a href="http://www.scala-lang.org/">Scala</a>比较感兴趣，看了一些资料，不过语言这东西光看不练还是没感觉，就写了这样一个分词程序。使用了<a href="http://technology.chtsai.org/">Chih-Hao Tsai</a>的<a href="http://rockmaple.appspot.com/entries/%20//technology.chtsai.org/mmseg/">mmseg</a>分词算法。做为依赖注入的粉丝，程序里使用了<a href="http://code.google.com/p/google-guice/">google guice</a>做为依赖注入容器。</p>
<p>Scala在JVM上的运行效率可以达到<a href="http://dmy999.com/article/26/scala-vs-groovy-static-typing-is-key-to-performance">和Java差不多</a>的程度。做为同时支持面向对象和函数式编程思想的语言，其强大的表达能力则是Java所忘尘莫及。</p>
<p>以mmseg算法中求一个chunk的自由语素度的代码为例，看看Scala如何使程序变得更加简捷和清晰：</p>
<p>Scala版：</p>
<pre class="brush:java">def largestSumMorphemicFreedomDegreeRule(chunks: List[Chunk]): List[Chunk] = {
    val c = chunks.reduceLeft((c1, c2) =&gt; {if (c1.degreeOfMorphemicFreedom &gt; c2.degreeOfMorphemicFreedom) c1 else c2})
    chunks.filter(chunk =&gt; (chunk.degreeOfMorphemicFreedom == c.degreeOfMorphemicFreedom))
}
</pre>
<p>再看看Java版（取自solo L的mmseg库）:</p>
<pre class="brush:java">
public class LSDMFOCWRule implements IRule {/* (non-Javadoc)
 * @see org.solol.mmseg.core.IRule#invoke()
 */
public final IChunk[] invoke(final IChunk[] chunks) {
    LSDMFOCWRuleComparator[] orderedChunks = new LSDMFOCWRuleComparator[chunks.length];

    for (int i = 0; i &lt; chunks.length; i++) {
        orderedChunks[i] = new LSDMFOCWRuleComparator(chunks[i]);
    }

    Arrays.sort(orderedChunks);

    int index = 0;
    double degreeOfMorphemicFreedom = orderedChunks[index].getChunk().getDegreeOfMorphemicFreedom();

    List list = new ArrayList(1);
    list.add(orderedChunks[index].getChunk());

    index++;

    while (index &lt; orderedChunks.length) {

        if (orderedChunks[index].getChunk().getDegreeOfMorphemicFreedom() == degreeOfMorphemicFreedom) {
            list.add(orderedChunks[index].getChunk());
        } else {
            break;
        }
        index++;
    }

    IChunk[] degreeOfMorphemicFreedomChunks = new IChunk[list.size()];
    list.toArray(degreeOfMorphemicFreedomChunks);

    return degreeOfMorphemicFreedomChunks;
}

static class LSDMFOCWRuleComparator implements Comparable {

    private IChunk chunk;

    public LSDMFOCWRuleComparator(IChunk chunk) {
        this.chunk = chunk;
    }

    public IChunk getChunk() {
        return chunk;
    }

    public int compareTo(Object obj) {
        IChunk another = ((LSDMFOCWRuleComparator) obj).getChunk();

        double temp = another.getDegreeOfMorphemicFreedom()
                - chunk.getDegreeOfMorphemicFreedom();

        if (temp &gt; 0D) {
            return 1;
        } else if (temp &lt; 0D) {
            return -1;
        } else {
            return 0;
        }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2009/12/scala-segment-tool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web 2.0下的知识分享</title>
		<link>http://zhangyf.net/2009/12/web-2-0-knowlegedge-sharing/</link>
		<comments>http://zhangyf.net/2009/12/web-2-0-knowlegedge-sharing/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 14:14:39 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[eLearning]]></category>
		<category><![CDATA[Web2.0]]></category>
		<category><![CDATA[知识管理]]></category>

		<guid isPermaLink="false">http://rockmaple.info/?p=25</guid>
		<description><![CDATA[
上面这幅图来自这篇文章：Mosh Pit as Innovation Model。
长期以来，知识是一种财富，掌握在少数人手中，很多“专家”乐此不疲的囤积知识，生怕别人偷走他们的想法。Web 2.0改变了这一切，我们可以看到，知识传播不在是少数知识所有者的专利，而是形成了一个知识网，每个人都可以成为知识分享者。
Karl Nelson提出了“开源知识（Open Source Knowledge）”的概念：“信息过时的速度是非常快的，特别是在技术领域，如果你将其存在你的头脑中不会产生什么价值，保存其价值的最好的办法是与他人共享你的知识 ”。
但是想真正使教育适应这一变化很难，这需要观念上的改变，教育本身就有一定的惰性，短时间内很难改变。但是对于那些出生于数字时代的小孩来说，他们都是数字原住民，他们习惯了网络，习惯了从网络上获取和分享。只是我们的老土教育还在束缚着他们。
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.digitalchalkie.com/wp-content/uploads/2007/01/progress.jpg" alt="" /></p>
<p>上面这幅图来自这篇文章：<a href="http://headrush.typepad.com/creating_passionate_users/2006/06/mosh_pit_as_inn.html" target="_blank">Mosh Pit as Innovation Model</a>。</p>
<p>长期以来，知识是一种财富，掌握在少数人手中，很多“专家”乐此不疲的囤积知识，生怕别人偷走他们的想法。Web 2.0改变了这一切，我们可以看到，知识传播不在是少数知识所有者的专利，而是形成了一个知识网，每个人都可以成为知识分享者。</p>
<p>Karl Nelson提出了“开源知识（Open Source Knowledge）”的概念：“信息过时的速度是非常快的，特别是在技术领域，如果你将其存在你的头脑中不会产生什么价值，保存其价值的最好的办法是与他人共享你的知识 ”。</p>
<p>但是想真正使教育适应这一变化很难，这需要观念上的改变，教育本身就有一定的惰性，短时间内很难改变。但是对于那些出生于数字时代的小孩来说，他们都是数字原住民，他们习惯了网络，习惯了从网络上获取和分享。只是我们的老土教育还在束缚着他们。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2009/12/web-2-0-knowlegedge-sharing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>做了一个向Google日历添加按年循环的农历生日的工具</title>
		<link>http://zhangyf.net/2009/10/lunar-calendar-gae/</link>
		<comments>http://zhangyf.net/2009/10/lunar-calendar-gae/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 15:09:35 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[GAE]]></category>

		<guid isPermaLink="false">http://zhangyf.net/?p=75</guid>
		<description><![CDATA[Google日历不支持事件按农历年循环。要添加农历生日事件，就只能一年一年的添加，用起来很不方便，于是自己操刀，做了一个可以添加按年循环的农历生日事件的工具。
应用基于GAE，地址是http://spur.appspot.com，操作界面如下图：

填写相关信息和需要重复的年份范围，导出ics文件，再将ics文件导入到Google日历里就可以了。
目前只能通过导ics文件的方式添加，后续会考虑通过gdata访问Google Calendar API的方式。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.google.com/calendar">Google日历</a>不支持事件按农历年循环。要添加农历生日事件，就只能一年一年的添加，用起来很不方便，于是自己操刀，做了一个可以添加按年循环的农历生日事件的工具。</p>
<p>应用基于<a href="http://code.google.com/appengine">GAE</a>，地址是<a href="http://spur.appspot.com/">http://spur.appspot.com</a>，操作界面如下图：</p>
<p><img src="http://farm3.static.flickr.com/2727/4021273973_b21a324373.jpg" alt="screenshot" /></p>
<p>填写相关信息和需要重复的年份范围，导出ics文件，再将ics文件导入到Google日历里就可以了。</p>
<p>目前只能通过导ics文件的方式添加，后续会考虑通过gdata访问Google Calendar API的方式。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2009/10/lunar-calendar-gae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>搜索的用户界面</title>
		<link>http://zhangyf.net/2009/10/search-user-interface/</link>
		<comments>http://zhangyf.net/2009/10/search-user-interface/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 15:06:55 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[搜索]]></category>
		<category><![CDATA[用户界面]]></category>

		<guid isPermaLink="false">http://rockmaple.info/?p=15</guid>
		<description><![CDATA[
从Greg博客里的书评知道了这本书：Search User Interfaces。
这本书的官网上提供了免费的HTML版，如果你想买一本的话，到这里 。
我还没有看这本书，不过从Greg列出的节录来看，本书对于搜索的界面设计做了深入的研究，并且回答了我们经常会提出 的一些问题，摘录几条：
为什么搜索的界面如此简单？
人们做搜索是要到达一个目的地，而搜索本身不是目的。当人们在寻找信息的时候，他们通常是沉浸在一些重要的工作里，而不希望被打断，阅读时被分散的精力越小，搜索的可用性越高。
关于细节：
一些小的细节的改变可能会产生很大的效果，比如，Franzen and Karlgren发现将表单的输入项变宽会使用户倾向于输入更多的内容。
另外一个例子是，Google早期的拼写纠正提示是放在搜索结果页面上方的。而用户更关注搜索结果，他们通常不会注意到这个提示，他们会一直向下拉页面找相关的结果，在搜索词拼错的情况下，用户很难找到他们想要搜索的结果，但并不会意识到自己输错词了，因为上方的拼写提示已经被忽略。于是用户会放弃搜索并抱怨。后来Google就改成了在页面下方也同样放上拼写纠正提示。
如何给用户提供信息？
提供一条带有用户搜索词的摘要信息是很重要的，它被称为keyword-in-context(KWIC)提取。通常提取摘要是为了概述文章的主要内容，这可能不包含用户输入的关键词，面向查询(query-oriented)的关键词提取则需要展示关键词是怎样在文档内被展示的。
高亮关键词有助于将用户的注意力吸引到文档中最和关键词相关的部分，并展示出关键词和文档中相应的词的语义是否相近。对过多的词做高亮显示也是不合适的，这会减少高亮所带来的好处。
用户在搜索过程中的行为
50%的搜索过程包含着重新构造查询词，拼写纠正的使用次数大约占其展示次数的35%。
10-15%的查询包含着拼写错误，用户更喜欢这些错误被自动纠正，而不是通过鼠标点击纠正词进行再次查询。
用户很少看第一页以外的搜索结果，如果他们在第一页无法找到想要的结果，用户通常会放弃或者更换查询词。用户期望他们想出的结果出现在前两条。
]]></description>
			<content:encoded><![CDATA[<p><img src="http://assets.cambridge.org/97805211/13793/cover/9780521113793.jpg" alt="Search User Interfaces" /></p>
<p>从Greg博客里的书评知道了这本书：<a href="http://searchuserinterfaces.com/">Search User Interfaces</a>。</p>
<p>这本书的<a href="http://searchuserinterfaces.com/">官网</a>上提供了免费的HTML版，如果你想买一本的话，到<a href="http://www.amazon.com/Search-User-Interfaces-Marti-Hearst/dp/0521113792/">这里</a> 。</p>
<p>我还没有看这本书，不过从Greg列出的节录来看，本书对于搜索的界面设计做了深入的研究，并且回答了我们经常会提出 的一些问题，摘录几条：</p>
<h4>为什么搜索的界面如此简单？</h4>
<p>人们做搜索是要到达一个目的地，而搜索本身不是目的。当人们在寻找信息的时候，他们通常是沉浸在一些重要的工作里，而不希望被打断，阅读时被分散的精力越小，搜索的可用性越高。</p>
<h4>关于细节：</h4>
<p>一些小的细节的改变可能会产生很大的效果，比如，Franzen and Karlgren发现将表单的输入项变宽会使用户倾向于输入更多的内容。</p>
<p>另外一个例子是，Google早期的拼写纠正提示是放在搜索结果页面上方的。而用户更关注搜索结果，他们通常不会注意到这个提示，他们会一直向下拉页面找相关的结果，在搜索词拼错的情况下，用户很难找到他们想要搜索的结果，但并不会意识到自己输错词了，因为上方的拼写提示已经被忽略。于是用户会放弃搜索并抱怨。后来Google就改成了在页面下方也同样放上拼写纠正提示。</p>
<h4>如何给用户提供信息？</h4>
<p>提供一条带有用户搜索词的摘要信息是很重要的，它被称为keyword-in-context(KWIC)提取。通常提取摘要是为了概述文章的主要内容，这可能不包含用户输入的关键词，面向查询(query-oriented)的关键词提取则需要展示关键词是怎样在文档内被展示的。</p>
<p>高亮关键词有助于将用户的注意力吸引到文档中最和关键词相关的部分，并展示出关键词和文档中相应的词的语义是否相近。对过多的词做高亮显示也是不合适的，这会减少高亮所带来的好处。</p>
<h4>用户在搜索过程中的行为</h4>
<p>50%的搜索过程包含着重新构造查询词，拼写纠正的使用次数大约占其展示次数的35%。</p>
<p>10-15%的查询包含着拼写错误，用户更喜欢这些错误被自动纠正，而不是通过鼠标点击纠正词进行再次查询。</p>
<p>用户很少看第一页以外的搜索结果，如果他们在第一页无法找到想要的结果，用户通常会放弃或者更换查询词。用户期望他们想出的结果出现在前两条。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2009/10/search-user-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>图书推荐：Even Faster Websites</title>
		<link>http://zhangyf.net/2009/10/book-even-faster-websites/</link>
		<comments>http://zhangyf.net/2009/10/book-even-faster-websites/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 14:49:04 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[图书]]></category>

		<guid isPermaLink="false">http://zhangyf.net/?p=58</guid>
		<description><![CDATA[
继High Performance Web Sites之后，Steve Souders在今年6月又推出了他的新作Even Faster Web Sites。前一本书完全是由Steve Souders一人所写，后一本书则Steve Souders与从多高手合作完成的。
High Performance Web Sites一书从网站配置方面阐述了各种网站性能调优的方法，其中所列出的各条原则对于开发者来说已经是耳熟能详。Even Faster Web Sites一书不仅提出了一些新的原则，而且深入分析了程序设计方面细节对于网站性能的影响。
Steve Souders的两本书给人的感觉就是压榨！压榨！从通常开发者所不关注的地方压榨出最后一滴性能，其结论多有出人意料之处，其分析问题的过程和方法颇值得学习。
列一下各章目录：

Chapter 1. Understanding Ajax Performance, Douglas Crockford.
Chapter 2. Creating Responsive Web Applications, Ben Galbraith and Dion Almaer.
Chapter 3. Splitting the Initial Payload.
Chapter 4. Loading Scripts Without Blocking.
Chapter 5. Coupling Asynchronous Scripts.
Chapter 6. Positioning Inline Scripts.
Chapter 7. Writing Efficient JavaScript, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm4.static.flickr.com/3605/3383772859_9edf374a49.jpg" alt="Even Faster Website" /></p>
<p>继<a href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309">High Performance Web Sites</a>之后，<a href="http://stevesouders.com/">Steve Souders</a>在今年6月又推出了他的新作<a href="http://www.amazon.com/Even-Faster-Web-Sites-Performance/dp/0596522304">Even Faster Web Sites</a>。前一本书完全是由Steve Souders一人所写，后一本书则Steve Souders与从多高手合作完成的。</p>
<p><a href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309">High Performance Web Sites</a>一书从网站配置方面阐述了各种网站性能调优的方法，其中所列出的各条原则对于开发者来说已经是耳熟能详。<a href="http://www.amazon.com/Even-Faster-Web-Sites-Performance/dp/0596522304">Even Faster Web Sites</a>一书不仅提出了一些新的原则，而且深入分析了程序设计方面细节对于网站性能的影响。</p>
<p>Steve Souders的两本书给人的感觉就是压榨！压榨！从通常开发者所不关注的地方压榨出最后一滴性能，其结论多有出人意料之处，其分析问题的过程和方法颇值得学习。</p>
<p>列一下各章目录：</p>
<ul>
<li>Chapter 1. Understanding Ajax Performance, Douglas Crockford.</li>
<li>Chapter 2. Creating Responsive Web Applications, Ben Galbraith and Dion Almaer.</li>
<li>Chapter 3. Splitting the Initial Payload.</li>
<li>Chapter 4. Loading Scripts Without Blocking.</li>
<li>Chapter 5. Coupling Asynchronous Scripts.</li>
<li>Chapter 6. Positioning Inline Scripts.</li>
<li>Chapter 7. Writing Efficient JavaScript, Nicholas C. Zakas.</li>
<li>Chapter 8. Scaling with Comet, Dylan Schiemann.</li>
<li>Chapter 9. Going Beyond Gzipping, Tony Gentilcore.</li>
<li>Chapter 10. Optimizing Images, Stoyan Stefanov and Nicole Sullivan.</li>
<li>Chapter 11. Sharding Dominant Domains.</li>
<li>Chapter 12. Flushing the Document Early.</li>
<li>Chapter 13. Using Iframes Sparingly.</li>
<li>Chapter 14. Simplifying CSS Selectors.</li>
<li>Appendix. Performance Tools.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2009/10/book-even-faster-websites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一组关于社会化媒体的数据</title>
		<link>http://zhangyf.net/2009/10/social-media-data/</link>
		<comments>http://zhangyf.net/2009/10/social-media-data/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 15:48:27 +0000</pubDate>
		<dc:creator>rockmaple</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[社会化媒体]]></category>

		<guid isPermaLink="false">http://zhangyf.net/?p=70</guid>
		<description><![CDATA[数据来自Tony Karrer的博客。比较有意思，顺手翻译了一下。英文原文在这里(需翻墙)。
这些是美国的数据，国内应该有很大的不同。

到2010年前，Y一代(Gen Y)的人数会超过战后“婴儿潮”出生的人数，96%的Y一代会加入社会化网络
社会化媒体已经超过色情网络，成为网络第一活动
去年美国新婚夫妇，每8对里有1对是通过社会化媒体相识的
2009年美国教育部的一项研究表明，在线学习的学生的成绩要好于通过面对面授课学习的学生
每6个高校学生里就有一个参与网络课程
80%的twitter更新发生在手机上
Y一代和Z一代（Generation Y and Z）认为email已经过时了。。。2009年波士顿大学已经不在给新生分配email地址
对世界前20的品牌进行搜索，其中25%的搜索结果会链接到用户生成的内容上
34%的博客写手写产品和品牌相关的内容
25%的美国人说他在上一个月通过手机看过一部视频短片
据Jeff Bezos说，亚玛逊销售的书籍里有35%用于kindle阅读
25家最大的报纸里有24家的订阅量在下降，因为我们不再找新闻，新闻会主动找到我们

]]></description>
			<content:encoded><![CDATA[<p>数据来自Tony Karrer的博客。比较有意思，顺手翻译了一下。英文原文在<a href="http://feedproxy.google.com/~r/ElearningTechnology/~3/iXNbA6c8mOo/social-media-revolution.html">这里</a>(需翻墙)。</p>
<p>这些是美国的数据，国内应该有很大的不同。</p>
<ul>
<li>到2010年前，Y一代(Gen Y)的人数会超过战后“婴儿潮”出生的人数，96%的Y一代会加入社会化网络</li>
<li>社会化媒体已经超过色情网络，成为网络第一活动</li>
<li>去年美国新婚夫妇，每8对里有1对是通过社会化媒体相识的</li>
<li>2009年美国教育部的一项研究表明，在线学习的学生的成绩要好于通过面对面授课学习的学生</li>
<li>每6个高校学生里就有一个参与网络课程</li>
<li>80%的twitter更新发生在手机上</li>
<li>Y一代和Z一代（Generation Y and Z）认为email已经过时了。。。2009年波士顿大学已经不在给新生分配email地址</li>
<li>对世界前20的品牌进行搜索，其中25%的搜索结果会链接到用户生成的内容上</li>
<li>34%的博客写手写产品和品牌相关的内容</li>
<li>25%的美国人说他在上一个月通过手机看过一部视频短片</li>
<li>据Jeff Bezos说，亚玛逊销售的书籍里有35%用于kindle阅读</li>
<li>25家最大的报纸里有24家的订阅量在下降，因为我们不再找新闻，新闻会主动找到我们</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zhangyf.net/2009/10/social-media-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

