Archive for May, 2005

Mobile MSN Space

  很多博客服务商已经开始提供移动博客服务,比如BlogCN的mBlog,用户可以下载一个叫做Mrabo的插件,在手机上撰写网志甚至上传图片。这样带高像素摄像头的手机就可以随时随地抓拍照片然后马上发布到自己的Blog上,听上去就很带劲,不是吗?

  Mrabo有两个版本,Symbian OS版本和KJava版本,这样市场上的一般中端手机就都可以安装使用了。但是BlogCN让人不敢恭维的稳定性和网速让不少老用户转向了其他服务商的地盘,我身边的4个BlogCN注册用户最近都搬家了。

  那么,MSN Space是否能够使用移动Blog呢?虽然现在国内已经可以使用Messenger for Windows Mobile、WAP Messenger,但是移动MSN(中国)网页上,仍然是一句让人无限期待的“不久来到中国的……MSN移动服务”。

  不过,这里有一个变通的方法:MSN Space支持电子邮件发布方式,用户可以进行设置,通过某个邮箱发送一封邮件到特定地址,把网志以邮件的方式发布出来。一开始我觉得这个功能有点奇怪:既然可以上网,何必还要用电子邮件来写日志,直接登录多方便。仔细一看说明,原来这个功能本来就是提供给移动设备用的。

  马上做一个测试,呵呵。首先是在设置里面启用电子邮件发布功能,选择一个自己手机上能够使用的邮箱,并且输入一个字符串作为机密字保护。比如你的MSN Space账户为abc,输入的字符串为xyz,那么就可以向abc.xyz@spaces.msn.com发送邮件,从而提交网志。在手机上写一封简单的邮件,发送……

  哈哈,成功。这就意味着MSN Space也可以随时随地发送日志了,在你出门游玩的时候,用手机捕捉到一幅漂亮画面,或者说地铁上面突然有感而发,你都可以马上把它们通过你的博客网站向全世界公开。

  一般高端智能手机支持直接以POP3方式发送邮件(似乎一些中端手机也已经有这个功能了),对于我们这种使用一般手机的人来说,还是有很多方式可以选择的。比如中国移动和中国联通都支持免费或者收费的移动WAP信箱,甚至各地移动也有很多类似的服务,手机号码就是自己的信箱账户。担心手机号码泄漏的话,还可以选择别名,比如我的手机信箱就是上海移动的无线邮:Ricky@shmobile.com,安全,而且也比较好记。最后请猜猜看,我这篇日志来自于……当然还是PC了,等我有手写输入的手机再来写这么多吧。

Advertisements

Leave a comment

XML动态菜单

  我正在开发的程序经常需要根据客户的需要或者市场的变化对功能进行增删,或者说对界面进行微调。如果说因此频繁的升级客户端程序,不停的发布新程序将会是一件很痛苦的事情,用户也会感到厌烦。但是注意到客户端大部分的作用体现在收集用户的输入,然后从服务器获取数据并显示,就像一个浏览器……慢着,浏览器?为什么不做成一个浏览器呢?除了下载应用数据,客户端的功能、界面描述都做成配置文件,全部都从服务器下载,这样只要修改服务器端的配置,就可以让客户端上显示的功能界面发生改变。于是,XML出场了……

  这一次我先说说菜单部分:

[XML解析器]
  首先需要选择一种轻量级而且比较容易使用的XML解析器,MSXML当然就不用考虑了,我们最终选择了cppDom,这是一个使用C++/STL实现的XML解析器,编译出来的大小和解析效率都很让人满意。

[配置定义]
  定义配置信息如下:

<Menus>
    <Menu id="1000" name="菜单1" type="menu">
        <MenuItem name="功能1" type="menu">
            <MenuItem id="1001" name="子功能1" type="item" actiontype="page" actionid="6000"/>
        </MenuItem>
        <MenuItem type="separator" />
        <MenuItem id="1002" name="功能2" type="item" actiontype="page" actionid="6100"/>
        <MenuItem name="功能3" type="menu" >
            <MenuItem id="1020" name="子功能2" type="item" actiontype="page" actionid="6200"/>
        </MenuItem>
    </Menu>
 </Menus>

  上述配置中定义了一个菜单组,id为1000,显示名称为“菜单1”。具体含义如下:

  MenuItem:菜单中的子节点
   id:节点id
   name:显示名称
   type:节点类型(菜单项、分隔符、子菜单)
   actiontype:响应消息类型
   actionid:响应消息id

[菜单创建]
  在框架管理类(CFrameManager)中增加两公共方法:

  void LoadConfig(LPCTSTR lpszConfig); // lpszConfig:配置文件路径
  void LoadMenu(CMenu *pMenu);     
// pMenu:系统菜单指针
  
  程序主框架的构造函数中创建一个框架管理对象实例,读取配置文件并完成解析。在主框架创建好后进行菜单初始化,循环递归访问上述配置,利用InsertMenu、AppendMenu等函数完成菜单的建立。并且把每个菜单项的id、动作及其参数保存到一个map容器当中。

[消息处理]
  在主框架中通过ON_COMMAND_RANGE宏来捕捉动态菜单消息:

  ON_COMMAND_RANGE(MENUBEGIN, MENUEND, OnMenuitem)
  ……
  void CMainFrame::OnMenuitem(UINT uID)
  {
    m_pFrameMgr->OnDeal(uID);
  }

  框架管理对象实例根据传入的菜单项ID从map容器中查找到需要触发的动作及其参数,使用Factory模式创建对应的处理对象完成操作(可以是显示一个表单,也可以是打开一个文件……)。

[美化我的菜单]
  一般都希望自己的菜单能够有像WinXP一样的漂亮效果,这里我参考网上的一些代码,利用HOOK写了一个自己的菜单效果类。使用非常简单,共四个静态公共方法:

  static void
InitializeHook ();                // 注册钩子
  static void UninitializeHook ();            // 注销钩子
  static void HandleWindowProc(…);     // 拦截处理消息
  static void SetMenuItemImage (…);    // 设置菜单位图

  一般在程序初始化和结束的地方注册和注销钩子,在需要加载菜单效果的窗口类的WindowProc函数中调用一次HandleWindowProc函数就可以了。

  最终效果如下图所示:

  下次再讲讲如何使用XML文档动态创建界面……

 

2 Comments

体验WAP MSN

  也许是当初在杭州从事的是移动应用软件的开发,我对基于手机的各种应用总是很好奇,现在不能像以前那样总是接触到最先进的手机了,所以兴趣范围也只缩小到GPRS+WAP这一块了。很早以前就对国外能够使用移动MSN感到羡慕,终于有一天看到了微软广告中提到了大陆地区开始提供移动MSN,立马掏出手机实验了一下。

  打开“移动梦网”-“聊天交友”,翻过N页的色情和准色情栏目,找到移动MSN。输入MSN账户和密码,选中自动登录……居然登录出错了。显然这家SP和不少服务供应商一样,没有想到部分手机的密码输入控件只支持数字和大写字母。没办法,只能修改自己的MSN密码了。(作为一个移动服务供应商,应该多考虑一些手机与电脑的不同点,让服务更加符合手机用户的习惯,比如说手机上面输入比较麻烦,自动登录功能就是一个很重要的东西,至少应该把上次登录的用户名密码保留下来。这样用户可以把地址放到书签中后快速访问到服务。)

  这下终于顺利登录进来了,马上我的电脑上就显示自己的账户在另外一台机器上登录,进入脱机状态。而手机上也显示出了自己的状态,并分页显示目前在线的好友。不过电脑上的分组在这里无法显示,毕竟手机的显示区域有限。

  除了好友列表,还提供几个基本功能,阅读新信息、刷新好友列表、直接点击好友名字向它发送消息……看来还不支持PUSH,只能让浏览器去主动刷新页面。个人设置里面提供更改昵称、更改状态、添加好友、设置显示行数等功能。OK,更改一下状态为显示为“显示为脱机”看看。怎么回事?“用户未登录或者超时”,Try again,错误依旧……难道这是SP的一个BUG,显示为脱机还真的让我脱机了,结果让这项功能成为一个陷阱,当然,这也只是一个猜测。

  另外,不能进入自己的Hotmail邮箱也蛮让人失望的。反正现在各种手机邮箱还是很多的,只是多个邮箱使用起来不太方便。其实,要利用MSNP8/9实现一个自己的移动MSN并不是非常复杂的事情,就是把类似于Internet上很流行一阵的机器人移植到WAP上来。

  顺便提一句,这家SP的正式服务定价为每月8元,性价比算不上高。现在我比较习惯的还只是在1个多小时的上下班路上看看新浪新闻,访问一下校友录,或者偶尔出门时查询一下公交线路。希望这家SP能够提供更多更好的服务或者微软重新找一家更好的合作伙伴。

4 Comments

5月下旬 仙居行

即使是一直坐在大巴上,我也知道这是一个很美丽的地方……

晚上待续……

Leave a comment

聚类、遗传算法、ClusterProject

  作为燕子的硕士研究生毕业论文设计,这算是我和她合作完成的一个“项目”。其中我负责的是总体框架设计和大部分用户界面相关的代码,特别是图像处理部分。实际的算法是由燕子完成的,毕竟,应用数学硕士研究生的专业知识不是我能够在短期内能够掌握的。今天在这里对一年多前的工作做一个回顾。

  本程序用于聚类算法计算以及图形模拟。

  主要特性包括:

  1、多文档-多线程结构,可同时处理多份数据。
  2、项目式文件组织结构,统一管理数据、参数、图形、报表。
  3、总共提供两大类(Hierarchical、Partition)共15种聚类算方法、15种距离判别算法和多种结果评估手段。用户可以通过在属性页上面进行自由选择组合。另外,还提供3种遗传算法用于Partition聚类。并且能够使用多种手段处理缺失数据。
  4、多种图文输出方式,包括表格、报表、二维空间分布、三维空间分布、点阵、树、折线等,图形提供导出接口(BMP文件与PS文件,通过后一种格式,可以进一步生成PDF文件),并且可打印。

  程序的结构不算很复杂,基本工作可以分成以下几块:

1、算法
  算法是程序的灵魂。我们定义了一个聚类算法基类,并且派生出若干子类:

  CClusterBase┬→CHierarchical┬→CAgglomerative┬→CAverageLinkage
                   ︱                    ︱                        ├→CCentroidLinkage
                   ︱                    ︱                        ├→CCompleteLinkage
                   ︱                    ︱                        ├→CFlexibleLinkage
                   ︱                    ︱                        ├→CFlxblGroupLinkage
                   ︱                    ︱                        ├→CMedianLinkage
                   ︱                    ︱                        ├→CSingleLinkage
                   ︱                    ︱                        ├→CUPGMLinkage
                   ︱                    ︱                        ├→CWardLinkage
                   ︱                    ︱                        └→CWPGMALinkage
                   ︱                    └→CDivisive→CDiana
                   └→CPartition┬→CCAST
                                      ├→CKmeans
                                      ├→CKMedoid
                                      └→CPAM

  这样就得到一个算法继承体系。在基类中定义一系列的虚接口和一些工具方法。子类中提供方法的具体实现,由燕子来实现。

  class CClusterBase 
  {
  public:
    bool GetDataFromFile(const string &strFileName);
    virtual string  IsKindOf()const {return "ClusterBase";}
    virtual bool   Configuration(const CClusterProjectDoc &rDoc, bool bFlag);
    virtual bool   Implementation() = 0;
    virtual bool   SaveResult()const = 0;
  protected:
    // 各种工具函数
    ……
  }

  各种距离计算方法和结果评估指标也是同样实现的。

  用户新建一个空项目后,导入原始数据。打开项目配置,选择具体的算法,根据算法的不同搭配选择不同的参数,这些信息都会被保存在项目文件当中。当用户选择RUN的时候,程序搜集这些信息,通过Factory模式来产生一个具体的算法实例对象,完成计算并且生成各种报表和图像数据文件。用户可以通过项目视图中的图标来浏览这些图文报表。

2、图形

  最早只是为燕子做了一个简单的独立小程序,把原始数据降维后得到一个二维平面分布或者三维空间分布的图像,可以比较直观的表现聚类的效果。后来慢慢的产生了一个想法,把功能进行扩充,除了提供分布图像以外,还要提供平面点阵、树状图、折线图等,并且提供缩放、图例显隐、颜色调节、导出等功能,并把这些功能封装成控件加入到软件里面来。

  燕子的算法类在计算完成后会生成若干个不同类型的数据文件,这些文件的数据格式都是经过定义的。图像控件读取这些数据文件自动完成绘制,并且能够导出成BMP位图文件或者通过PS文件生成PDF文件。

  毕竟是1年多前做的程序,现在看起来,不足(甚至可以说是设计拙劣)的地方还是有不少的。燕子也希望我能够做一些改进,并且提出了具体的修改意见。我将会在稍微空闲的时候开始这项工作。

  更多详情见相册中的ClusterProject。

 

Leave a comment

古镇西塘

  西塘有个名号:生活着的古镇。因为它除了是个景区,也是生于斯长于斯的居民们每天生活的家。趁着休假,我和燕子闯进了他们的家,开始了我们的西塘之旅。
  临行前做足了功课,从网上收集了很多关于西塘旅游的资料。火车上燕子还惊呼没有把打印好的攻略带出来,我则吹嘘说西塘的重要景点、特色小吃、民宅住宿我都已经记在脑子里了,完全可以客串一下导游。其实我想说的是:我已经把哪里能吃到最好的荷叶粉蒸肉、老鸭馄饨煲等美食给记熟了……
  一路无话,顺利的到达西塘镇车站,按照资料找到了著名的苏家弄,穿越这条弄堂就是古镇区了。弄堂其实不长,但是我们却仿佛穿越了两个时空,那边是现代化的酒店宾馆超市,这边却是明清风格的小桥流水人家。我们是长假后半段出门的短途游客,因此小镇上的游客也并不是很多,老天爷也很给面子,下过雨,放过晴,大部分时候都是凉凉爽爽的多云天,我和燕子过得很是惬意。
  弄堂●民宅●廊棚●石桥●灯笼
  古镇有好几个算得上特色的地方,第一就是弄堂了。我们进来的就是一条很有名的弄堂,不过苏家弄的名气主要还是因为它是大部分自助背包客进入西塘的首选路径。西塘全镇有弄堂一百多条,一般宽度约两米,最合人行,不宜车马穿梭。弄堂两旁的高墙往往就是居民的住宅。最出名的应该算石皮弄,建于明末清初,网上的资料说全长六十八米,由一百六十六块条石铺成。其最窄的地方不到一米,大胖子除非改作螃蟹横行,否则难以穿过去,幸运的是,虽然燕子老是喊着要我减肥,不过我没有在石皮弄出丑。
  弄长所以宅深。古镇上保存有很多明清时期的民宅,一般三进或者五进,甚至更多。我和燕子投宿的地方叫陈家老宅,给我们留下很深印象的还有烧香港的水阳楼和怀秀桥旁的桐村雅居,后两者已经被开辟成私人博物馆。三个民宅正好是三种类型:普通富裕居民、医生(算古代知识分子吧)和大商家。陈宅就在小镇的中心,紧临河水和廊棚,给我们的出游带来不少方便。一进门就是一个小屏风,里面被改装成了小镇唯一的一个小酒吧,墙上贴满了游客的签名和祝福语,网上曾经有人戏称有点《花样年华》的味道。不过老板倒是很自豪的说这里还真的做过几部电视剧的取景地。穿过酒吧是一个小院落,种有桃树和一些小盆栽,并且布置成了两处茶坊,一些客人就在茶坊里面喝茶聊天。我们就住在罗中的小楼二楼。虽然没有燕子梦想中的雕花大床,不过雕花窗格还是很有些味道的。雕花大床没有住成,我们在水阳楼看到了真正的“女儿床”。据说还是主人家女儿从小睡的,现在它的主人已经是中央美院的学生了。水阳楼的老主人是一名医生,因临近烧香港得名(山南水北曰阳),现在的主人则是一名老师,号称西塘三把刀的徐老师,擅竹雕。宅中收藏有不少父女俩的竹雕和国画作品,而且这里还是电影《画魂》中潘玉良的家的取景地。男主人书房和小主人读书学习的阁楼也很有特色。前者宽敞明亮,陈列有绣品、古玩、窗外阳台下就是小河和一个袖珍花园;后者则几乎没有一点多余的装饰,针对一个小小的天井,很适合留给子弟清心寡欲发奋读书考取功名。桐村雅居又叫江家大院,也在廊棚下,主人原是徽商,移民到小镇落脚。由于怕露财招祸,所以门脸一点特殊都看不出来,穿过一个窄窄的巷子,进去以后才发现别有天地。江宅分五进,虽然不大,但是讲究的地方倒挺多。有专门给客人喝茶等候主人的门廊,有放满盆景别致雅趣的院落,还有专门给男主人待客活动的厅和家眷们起居生活的堂。屋顶的飞檐和屋内的立柱都很有说法,我印象最深的就是穿街过堂的时候,主人家特别给我们介绍梁柱顶端雕刻的大象和玉如意,寓意着“吉祥如意”。桐村雅居现在的主人姓钱,也是西塘三把刀之一,工剪纸,而且还连得一手好书法,能够双手正反书写。我们还在这里发现了提供给游客的客房,燕子不禁抱怨说没有在这里投宿,的确是一个遗憾。古镇上还保存有几处比较大型的官商宅子,由于需要景区联票,我们也就无缘一见了。
  我们在陈家老宅住下后,第一件事情就是顺着烟雨长廊先大致走了一边古镇。烟雨长廊是古镇的中心,临河靠街,全长一千三百多米,由灰砖铺成,像一条长长的带子,弯弯地缠绕在小镇的河边。漫步在长廊下,看小船缓缓前行,一切都是那么悠悠。顺着廊棚散步,不时还能经过各种石拱桥,这些石桥大多具有很美丽的名字:送子来凤、怀秀、安仁、安善、五福、永宁、清宁、卧龙、……有些甚至是从宋代就流传下来的名字,后来历经多次重修保留至今。最高的卧龙桥上据说还能隐隐望见太湖边的群山。
  到了傍晚,走马观花一日游的客人们已经回去了,我们这些住在小镇的游客却还能享受到西塘的夜色。夜色刚刚弥漫开来,沿着河道两边,一串串的红灯笼点亮挂起,在水面上投下片片灯影。游船载着夜游的客人在河道上缓缓飘着,对于岸上的我们,船上的客人是风景,对于他们,我们也是风景。戏台就搭建在河道边,游客可以在船上或者河对岸的廊棚下观看。沿街的酒肆饭店也都把座椅都移出来,让客人们坐在廊棚下一边吃饭一边赏夜色。燕子的衣服穿得有点单薄,因此我们选择了让老板在楼上临窗处设了个座位。单独坐在“雅座”,窗外树影婆娑,灯影袅袅,还有若有若无的丝竹声,真的感觉很幸福。不久又有一对情侣也上来了,显然他们也很满足于这样的环境。西塘的特色小吃花样很多,但是让我和燕子都满意的应该是椒盐南瓜和荷叶粉蒸肉了。其它的多少有些见面不如闻名的感觉,虽然都是名声在外。
  【资料:西塘,古称胥塘、斜塘,又名平川,有着丰富的历史文化的积淀,春秋战国时代,西塘就是吴越两国相争的交界地,故也有吴根越角之称。西塘地势平坦,河流纵横,自然环境十分幽静,处处绿波荡漾,家家临水映人。小镇上保存着完好的明清建筑群落,廊棚和古弄堪称“双绝”。】

  稍后将这次西塘之行的照片加入相册。

5 Comments

My MSN

  MSN真是一个好东西,除了即时通讯、个人空间、……还是一个很好的媒体中心。

  秉持微软一贯的作风,一切都是可以用户自定义的,从栏目内容到页面布局,都是可以通过鼠标拖动点取来完成。用户可以新建多个主题页面,放置各种感兴趣的内容:收件箱、搜索引擎、新闻、财经、体育、电影、音乐……

  比如我就设置了三个主题页面。第一个默认页面包括我的收件箱,我可以直接在这里查看我的电子邮件。还有上海、杭州两地的天气情况,不过似乎准确性有待提高……

  第二个主题是News Center,选择了各大新闻媒体的头条和社论。路透社、纽约时报、华盛顿邮报、……一个练习英文阅读的好地方,相对于Shanghai Daily,这里才是更加原汁原味的英语。

  作为一个男性,体育是我很关注的领域,所以我的第三个主题是Sport Zone,Fox、ESPN的体育新闻、积分榜都包括在里面,在这里甚至可以定义选择观看哪些体育项目哪些联赛哪些队伍……天,还有什么是不提供的?这里我选择了欧洲的几大足球联赛和NBA篮球。在不能看电视的时候,比如说工作时,还能通过MSN和FoxSports提供的实况网站了解比赛形势。

  是不是有点心动了?那么就用自己的.NET Passport登录http://my.msn.com吧。

  (要了解更多请进入“My MSN”相册)

7 Comments