2007年9月1日星期六

Blog Day - 博客日

本人特懒,平常比较少关注这些东西。今天看到robin日志,才知道昨天(8/31)是个什么鬼Blog Day,为时晚矣。
 
不过还好,昨天晚上写了很长时间以来的第一篇日记,这第一篇日记算作日记的序,没记下什么秘密,可以发布出来权当纪念Blog Day。
 

/** 重拾笔根
 * @date 2007-8-31
 * @weather 晴,傍晚稍有阴霾。
 * @author 闲耘(xianyun.org, hotoo.cn[AT]gmail.com)
 */

其实我早有重拾笔根,再写日记之意;日前又看得一位大概是台湾的仁兄,提到关于自己的日记的种种玩笑,思考,和收获,我也渐觉手痒起来。意欲重新提笔,为自己的卑微人生留下几许痕迹。

日记不同于博客,这里可以写下内心深处的秘密,欲望,和其他;不必,大概也不该写下违心的谎言。生活中我力求简单,但是出于愚蠢,虚伪或自我保护,我总是不时的拾起谎言,企图掩饰和麻痹自己,希望在这里我可以重归简单,展现真我。感谢这片还算纯洁的土地,让我种植心灵,培养心胸。

日记最好手写在纸质本子上,但是最近一直堕于上街,也没碰巧看中什么好的本子,就暂时写在这本本上,他日再撰抄到本子上。

谨记:每日只需一篇,数十字或数百字即可,敬请坚持。


 

ps:
BlogDay是什么?
BlogDay起源于Bloggers认为自己应该有一个专门的节日,以认识其他来自于不同国度或拥有各种不同嗜好、兴趣的博客。在BlogDay当天,所有参与活动的博客应该在自己的站上推出五个具有特色的Blogs给所有来访问的朋友,藉此和大家分享更多新而有趣的博客。

BlogDay这天会发生什么事?
在八月三十一日这一天内,全世界参与活动的Blog都会发表一篇文章推荐五个新颖的Blog,而且最好这五个Blog的内容可能是来自不同的文化、观点和型态。而所有造访的朋友都可以在八月三十一日当天发现自己前所未知的Blog,藉此认识更多Blogger并为这些新发现而庆祝。


2007年8月28日星期二

文件系统标签结构随想

随着标签的广泛/普遍应用,标签和实用价值越来越得到体现。
 
标签结构不同于目录结构,它没有明确的层次结构,并且没有唯一性问题(文件可以帖上多个不同标签)。
 
使用操作系统文件系统目录结构,可以带来许多好处:比如音乐子目录可以这样明确的分类:子目录华人男歌手、华人女歌手、欧美歌手...等分类,孙子目录下可以按照歌手名分目录,曾孙目录下可以按专辑分目录。
 
但是也因此有许多功能受到限制。当遇到相对模糊的情况时,则会比较难以取舍。一来目录的层次结构会根据用户的喜好而有所不同;二来,文件可以存放在一个语义的目录结构下,也许也可以存放在另一个语义的目录下。
 
出现这种情况时,可以通过快捷方式来模拟,或者使用辅助软件(播放器的播放列表,图片管理软件如Picasa的相册)。
 
 
如果在文件级别实现更为明确的标签功能,则可以方便管理所有单个文件或一组文件(如目录)的标签管理,再加上类似Gmail支持基于标签,目录(Gmail没有目录)和关键字(如果支持内容关键字则更完美)的搜索,wa..
 
 
不过如果提供管理软件外部支持或是模拟实现,也蛮是有用。比如我现在最需要的就是一款文档管理软件,最好他能支持"主流"文档类型(pdf, pdg, chm, htm, html, txt,),在统一界面下查阅文档,提供文档灵活分类模式(系统目录模式(模拟书架),标签模式),提供文档索引搜索能力。
 
除了搜索相关,其他功能类似播放软件(统一界面播放,统一操作)和图片管理软件(统一界面查看,编辑)。
 
但是问题是,如果文件被移动或删除或更名,播放列表和相册等都必须监听或扫描文件/目录。也许系统级提供类似实现,将标签存储在文件属性或其他属于文件本身的资源在,才是最为合理的设计。

作为非系统程序员,可以考虑实现这样的文档管理软件:1.尽量支持多种文档格式;2.用户自定义监听目录;3.文档索引,提供快捷的搜索(本地搜索的索引应该进行全面的索引,例如Javascript程序员可能需要搜索js源代码,而现在的Google本地搜索却忽略这些文本内容。)。
 
 
以上所有皆随想。

2007年7月24日星期二

我记得/记得我

- 你还会记得我吗?
- 唔,大概不会。
- 安慰一下我也好嘛!
- 我没有记住你,这不是我的错,而是你的问题。你没有让我记住你,说明你做的还不够。
 
 
ps: 要被记得,至少要选做下列一项:
1. 关心/照顾他/她/它;
2. 和他/她/它生活在一起;
3. 和他/她/它说话。

你让他/她/它记得你什么呢?

2007年7月7日星期六

(Javascript) HTAutoComplete:不要进行词法分析

Keep It Simple, Stupid. (保持简单,保持拙。)
 
上篇关于AutoComplete控件的思考中提到为了设计一个万能的自动完成控件,要对HTAutoComplete进行词/语法分析的想法,现在我改变主意了,那是一个自作聪明的愚蠢想法。
 
举个简单的例子,对于用户输入的如下文本,应该如何理解呢(允许输入引号本身,粗体表示)?
"a,b",c
可以有两种取词方式,
("a)(b")(c)
("a,b")(c)
我们该如何选择?
 
再复杂一点,对于引号不成对的输入:
"a,b",c"
更复杂一些:
",a,b,",c,"

换个符号对?
(a,b),c

You Can't Write Perfect Software. (你不可能写出完美的软件。)
由于允许输入特殊符号本身,和用特殊符号来分词本身就很矛盾和复杂。而一个Javascript控件,一个帮助工具,没有必要做成无所不能。提供的功能越多,所受的制约就越多。

我的建议:
1. 帮助类只帮助;
2. 让服务器去万能。

 

2007年7月5日星期四

关于AutoComplete控件的思考

一,现有控件的问题。

最近初步完成了两个自动完成的控件,最原始的HTAutoComplete暂时只完成了最基本的功能,大多细节都没有时间去考虑,而主要精力都放在HTAutoComplete2这个控件上。HTAutoComplete2是一个主要用来帮助用户在一个文本框内自动完成输入一个或多个字符/串的控件,主要用途可以是多标签的输入。

完成了beta版后,有些朋友提出了各种问题,建议和意见,都很值得思考。

其中最为典型的问题是输入特殊字符和特殊输入的问题,一般的特殊字符(如Javascript正则表达式用的特殊字符等)基本都考虑到并一定程度上得到解决。但是由于最初设计上的"硬伤"和基于"K.I.S.S."原则上的考虑,像需要输入所有字符/串的需求似乎有点困难和没有必要。

问题:
现有beta版的控件上,已知还有一个特殊字符没有彻底解决——分隔符。没有办法获得分隔符本身,因为现在的版本只取得分隔符之间的字符/串。

方案:
可以将分隔符放在引号或者其他符号对中,如果这样,就需要进行语法分析,可以使用正则表达完成,理论上不是问题。

最后,现有控件需要进一步进行抽象和解耦。


二,进一步抽象。

自动完成的本质是什么?怎么进行抽象?

自动完成控件无非就是帮助用户更方便的输入,所以写自动完成控件需要做的就是这样:
捕获需要自动完成的关键字;
与候选匹配项进行匹配;
返回并呈现匹配结果;
用户使用更方便的方法选中返回的候选匹配选项
自动完成替换,自动完成功能结束。
所以可以定义一个抽象的自动完成类,其他自动完成实例可以从这个抽象类继承,各个实例通过覆写抽象类的方法来完成自动完成工作。

2007年6月29日星期五

(javascript) 字符/串大小写反转

在封装一个模拟Google风格的多标签自动完成类之余,写了这个字符/串大小写反转方法(Google搜索了一下,暂没发现有写这个方法的),如果有用,请自用之;发现问题,请指教之。
 
var Character = function(character){ // 单个字符类
    if (character.length != 1){
        throw Error("[Error:Arguments error.\nclass:org.xianyun.Character]");
    }
    this.value = character; // private:
    this.charCode = character.charCodeAt(0); // public:readonly.
};
Character.reverseCase = function(character){ // 单个字符大小写反转,静态方法。
    var charCode = character.charCodeAt(0);
    if (charCode>=65 && charCode<=90){ // A-Z
        return String.fromCharCode(charCode + 32);
    }else if(charCode>=97 && charCode<=122){ // a-z
        return String.fromCharCode(charCode - 32);
    }else {
        return character;
    }
};
Character.prototype.reverseCase = function(){ // 单个字符大小写反转,成员方法。
    return Character.reverseCase(this.value);
};

 

String.prototype.reverse = function(){ // 字符串顺序反转。
    var s = "";
    for (var i=this.length-1; i>=0; i--){
        s += this.charAt(i);
    }
    return s;
};

String.prototype.reverseCase = function(){ // 字符串大小写反转
    var s = "";
    for (var i=0; i<this.length; i++){
        s += Character.reverseCase(this.charAt(i));
        //s += new Character(this.charAt(i)).reverseCase();
    }
    return s;
};

写给红颜知己

好了,结束了;或者,是有了一个崭新而不同的开始。
 
说实在的,我的确蛮喜欢你的,喜欢你大方的性格和成熟的心态,喜欢你朴素美丽的面庞和匀称健美的身材。
 
当然,我现在是没法去追求你的,像你这样美好的人儿,癞蛤蟆能远远看一眼就已经很奢侈了。追你,也许要等到下辈子吧,等下辈子我漂亮到可以令你迷倒在牛仔裤下,或是富有得可以用金子把你砸晕时,我再来自信的追求你。
 
很幸运,就这样不明不白、悄无声息地结束;正如她潜移默化,毫无预感的来临。有一点暗恋的幸福,却没有失恋的痛楚。或许这也算是爱情吧,比这更动人的爱情,大都比这更痛楚;而"有情人终成眷属"更不是爱情,那是婚姻。哈,谬论。
 
蓝颜知己、情人、老公,都是不错的角色。恩,真好。
 
再见!
 
--
2007/06/28 深夜,于深圳,闲耘。

2007年6月26日星期二

(Cpp) 5矮人分果

// from http://www.cppblog.com/mythma/archive/2007/06/25/26923.html
/**题:
 * 话说有五个小矮人上山摘野果,摘回来后平均分,可是怎么也分不下去.因为分不平均.
 * 到了晚上,一个小矮人爬起来,从里面扔了一个, 刚好能平均分成五份.然后他把自己的那份藏起来,就睡觉去了.
 * 第二个小矮个也爬了起来,也把果子扔了一个后刚好分成5份,他也把自己那份藏了起来.然后睡觉,
 * 余下3 个小矮人都是这样做的,过程完全一样. 请问,最初这堆果子至少有多少个?
 */
/**解:
 * 设共有total个野果;
 * 第1个矮人拿走 (total-1)/5 个野果,此时剩下 (total - 1)/5*4 个野果;
 * 第2个矮人拿走 ((total-1)/5*4 - 1)/5 个野果,剩下 ((total-1)/5*4 - 1)/5*4 个野果;
 * 以此类推...
 */
#include <iostream>
using namespace std;

int getTotal(){
    int total = 1; // 设初始野果总数1个
    while (true){
        int _t = total;
        for (int i = 1; i <= 5; i++){
            if ((_t - 1) % 5 == 0){ // 条件:扔掉1个能够5等分
                _t = (_t - 1) / 5 * 4; // 第i个矮人拿走1/5后剩下的继续循环
                if (i == 5){ // 如果5个矮人都拿到野果
                    return total;
                }
            }
        }
        total ++; // 不满足则野果总数加1
    }
}


int main(){
    cout << getTotal() << endl;
    return 0;
}
 

输出:3121