Nokia手机上的NaturalPark是我最喜欢的电子游戏。为了表达我对它的热爱,我将它移植到了Javascript上:
暂时只支持FireFox。点击这里开始游戏:http://files.cnblogs.com/yushih/np.htm
摘要: Workflow是F#的一个强大功能,既便不深入编译器,也不用stack hack,我们也可以用F#模拟出amb,从而更优雅得写出解决如回溯查找一类问题的程序。先从最简单的例子开始:let nc0 = nondeter { let! x = Amb.choose [1;2;3]return x}这段程序的含义为,x取1,2,3中任意一个值,然后返回x的值。得到nc0的类型为seq<int&g...
阅读全文
摘要: Regular expression这东西其实名不副实,因为其实regular expression看起来非常的不regular。看这个"regular" expression:(?<="n)"s*(?<city>[^"n]+)"s*,"s*(?<country>"w+)"s+(?<pcode>.{3}"s*.{3}).*$你能很快的明白它在干嘛吗?Reg...
阅读全文
摘要: 用HTML写用户界面的好处之一是当页面内容较多时,用户可以通过浏览器的搜索功能快速定位,而不用紧盯着屏幕来回拉动滚动条寻找,但<select>产生的下拉菜单是个例外--浏览器的搜索功能搜索不到菜单里的内容。看这个网页:在这个网页上进行选择简直是损害健康。我认为<select>里的选项以不超过10项为宜,如果有很多选项怎么办呢?有两种解决办法:方法-:将选项分类,然后分层选择...
阅读全文
IM给用户提供的主要交互方式是文字和图片,但是我逐渐感觉到这种简单的“你一言我一语”的方式不够满足高效率交流的要求。比如最近在淘宝上买东西,在用IM向卖家询问的过程中,我意识到卖家可能会处理大量的类似的询问,如果允许卖家在一定程度上将这个应答过程自动化就好了。所以我想,应该给IM增加像动态HTML中的form一样的功能,即一端让令一端填写一张预先设计好的form,对方填写好以后,一段脚本程序根据对方填写的内容做出一些动作。于是我就制作了这个验证概念的IM的程序,实现了上述两个功能--发送form和根据填写结果允许脚本。
首先说明因为这是一个“验证概念”程序,为了快速实现,这个IM的结构是这样的:与正常IM的peer-to-peer不同,这个IM中交谈的双方中一方使用浏览器最客户端,我称其为client side,一方运行着http服务器,交谈的界面用WinForm生成,称为service side。client side上的网页用ajax的方式周期性的轮流服务器。交谈过程中的界面是这样的:
client side和service side的不同之处在于:service side可以发送form到client side,然后用程序处理client side填写后发回的内容,要使用这种功能,service side需先用xml定义form和根据反馈执行的程序,以下是一个例子:
1 <?xml version="1.0" encoding="utf-8"?>
2 <script>
3 <form name="form1">
4 <radio name="purpose">
5 <item id="talk">我想和你聊天</item>
6 <item id="soy">我要采购酱油的</item>
7 </radio>
8 </form>
9
10 <form name="form2">
11 <textarea name="resume"></textarea>
12 <checkbox name="beauty">我是美女</checkbox>
13 </form>
14
15 <form name="form3">
16 <select name="soytype">
17 <item id="light">生抽</item>
18 <item id="dark">老抽</item>
19 </select>
20 <text name="weight"></text>
21 </form>
22
23 <process>
24 <![CDATA[
25 form1 feedback1 = GetFeedbackFrom_form1();
26 if (feedback1.purpose.talk) {
27 form2 feedback2 = GetFeedbackFrom_form2();
28 if (feedback2.beauty) {
29 ShowFeedback(feedback2);
30 } else {
31 throw new Exception("dragon");
32 }
33 } else {
34 form3 soytype = GetFeedbackFrom_form3();
35 ShowFeedback(soytype);
36 StartTalk();
37 }
38 ]]>
39 </process>
40 </script>
form1的意思是这个form包含一组radio,让form接收者(client side)在“聊天”和“打酱油”中做出选择。form2包含一个文本框和一个选项。form3包含一个选择酱油类型的下拉式菜单和一个文本框。<process>元素包含要执行的程序,用C#编写。假设前面定义了一个名为MyForm的form:
<form name="MyForm">

</form>
要向对方(client side)发送这个form时,就调用函数GetFeedbackFrom_MyForm,对方填写表格并提交后,该函数返回一个类型为MyForm的对象,这个对象储存了对方在form中填写了内容,比如,如果MyForm中包含一个名为checked的checkbox元素:
<form name="MyForm">
<checkbox name="checked">打个勾勾吧</checkbox>
</form>
那么MyForm类就包含一个checked的bool成员变量,它的值反映了对方是否在这个checkbox上打勾。类似的,form中的<textarea>和<text>会生成同名的string变量,储存对方填写的内容。
假设这个文件叫myscript.xml,用automation.exe编译它,输出到myscript文件夹:

打开myscript文件夹,其中有文件form1.htm,form2.htm,form3.htm和process.dll,分别对应script.xml中定义的3个form和<process>中的程序。现在可以修改生成的HTML文件,加入提示,图片,样式等等,但不要改变automation.exe生成的HTML form的基本结构(不要增减form中的输入元素,不要改变name、value属性的值)。美工的工作完成后,就可以运行IM了:
然后试验一下效果。在浏览器中打开http://127.0.0.1/index.htm,出现界面,点击Connect按钮,刹那间,script.xml中第3行中定义的form1出现在client side:
选择酱油,然后提交查询,service side端执行script.xml第26行。因为我们没有选择聊天,所以feedback1.purpose.talk为false(而feedback.purpose.soy为true),程序跳转到33行,form3,也就是酱油类型选择出现在client side:
选择一种酱油,在框中输入“80kg” ,提交,script.xml执行35、36行。当service side的用户程序调用StarkTalk的时候,表示开始人和人的交谈,即正常IM的运行模式,这时service side界面弹出,用户在form中填写的内容显示出来:
这个简单的程序就介绍完了,最后也故作深沉的来点思想。我认为IM不仅可以做交谈工具,还有成为简单的信息发布手段的潜能。为什么不用web站点呢?因为总的来说建设一个web站是很复杂的,asp.net、Django、Ruby of rails...这些工具都不是一两天学得会的,而且每次要使用都有较高的起始成本。web站点的特点是:比较正式,有很高的availability(24小时都能访问),容许许多人同时访问,无限的功能(只要是html、javascript、http能实现的都可以实现)。有的时候我们只要临时的发布一些简单的信息,和别人进行一些简单的互动,没有对web站点功能的要求,能不能使用IM+脚本的方式呢?
http://files.cnblogs.com/yushih/fim.zip
let str = "blah"
match input with
| str -> // input = "blah" ?
| _ -> // otherwise
这样写是不对的, str在这个位置并不会被bind到变量str上,而是会和任何输入匹配,匹配的结果进入新的变量str。str在它的scope(the match clause)中遮蔽str。应该这样写:
match input with
| x when x=str -> // input = "blah"
今天把电力影印的Essential .NET拿出来翻,发现一个错误:副标题Volumn 1: The Common Language Runtime被翻译成了“公共语言运行
库”。这是一本影印的书,唯一的翻译就是这个标题,可惜翻译错了。这本书陪伴我5年了,而这个封面上的错误,竟然是第一次意识到,惊诧。
[今天周末,大家不玩技术了好不好]
我认为Silverlight胜算不大,理由至少有两个:
迄今为止微软的广告(好像还有Silverlight广告?真是讽刺)都还在Flash上跑,为什么?现在Flash的安装率是Silverlight不能比的。
Google要想搞点rich interface的东西,除了疯狂的hack ajax,会选择Adobe的平台。Google和Adobe联盟。而且我感觉开源阵营更喜欢Google-Adobe联盟。
我知道,你们在期望Vista横扫一切,但是Vista普及之前时间足够Adobe打败Silverlight了。
所以为了Silverlight的成功,我有个主意,如果我掌管微软中国我一定会这么做:我会
买下所有WPF/Silverlight的书的版权,然后免费发放给中国开发者,就像Intel发放IA32手册一样,写信就能得到。我会
为所有参加WPF/Silverlight培训的开发者付学费、路费、食宿费。而且还可以考虑把这一策略推广到所有WxF。
如果说Web2.0的特征是用户产生内容,是讨好用户的时代,那Web3.0就应该是用户产生应用(比如提供云计算?),就应该讨好开发者。打造Silverlight这么一个优秀的表现平台,微软一定花了不少钱,如果被Adobe打败了,以前的投资就都打水漂了。我建议的花费比起在Silverlight上的沉没成本来应该是微不足道的(一本影印版的书一般也就是50~100块,还包括不菲的利润),微软何不让Silverlight一鼓作气统一天下呢?在接收Flash内容还是Silverlight内容上,最终用户是不会做出主动选择的(假设他/她两个虚拟机都安装了),选择是内容提供者做出的。程序员在选择技术的时候,会考虑哪种技术的学习手段(书、培训、社区...)更容易获取。网站在选择技术的时候,也会考虑掌握哪种技术的开发者更好更多吧。
Silverlight在Adobe前的颓势,数数Friends of ED出版的相关书籍的数量就可以感觉到。互联网现在是Google的地界,微软要想立门户,G老大不支持,恐怕只能靠下面的小喽罗出来拼了吧?
本帖绝非唱衰.NET。虽然学习一下ActionScript也不是什么负担,但我还是希望在.NET技术上的已有投资能有更大效益,所以希望微软发展好。
补充一点:我觉得iPhone和Android也会和Adobe有一腿,而不是Silverlight。
这是一个演示Artificial Intelligence- a Modern Approach第二版,Figure4.20 ONLINE-DFS-AGENT算法的程序。这个程序显示一个迷宫,然后用这个迷宫运行ONLINE-DFS-AGENT。它像一个debugger一样让你单步执行每一行,显示agent在迷宫中的位置,及程序中每一个变量的值。最酷的是你不仅可以往后执行,还可以用一个进度条把程序拉回以前的状态,反复观看以帮助理解这个算法。
程序开始后进入迷宫创建界面:

这里有一个3x3迷宫,灰色线条代表格子间没有墙,用鼠标点一下线条变成黑色,代表墙。按住CTRL点一个格子设定起点;按shift点格子设定终点。点击Run algorithm按钮开始运行算法。

左上角显示agent的当前位置。左下角的进度条代表算法的进度。右上是程序,加亮的行是即将执行的行。右下显示各个变量的值。
最后补充一点,原书上的程序是错的,是一个死循环。因为除了第一次执行,s都不为null,所以"if s is not null then do"里面的代码将执行,unbacktracked[s']将至少包含s,所以"if unbacktracked[s']"永远不为真,函数永远不能"return stop"。对比程序中的代码和书上的代码可以看出我增加了一个bool变量backtrack,解决了这个问题。
程序及源码如下。算法部分是用标准C++和STL写的,用户界面是WinForm。
http://www.cnblogs.com/Files/yushih/OnlineDfsIllustration.zip