2007-10-08

“萝莎”台风

十一后的第一天上班时间,起床后,雨挺大的,但没有收到不上班的通知,只好持伞出门。才走几步,转上大路,竟然全是积水,风又大,很多人把鞋子拿在手上,光脚行走。我的裤子也早就被风雨吹湿了,鞋子自是更不用说。好不容易到了公司,竟然就两个人!着湿漉漉的鞋子,被打混的裤子紧贴着大腿,下身犹如刚从水里捞上来似的,甭提有多难受了。在公司里实在坐不了几分钟,想想反正也没什么人,得,回去换身衣服,在家休息好了。
回去的路上,从马路的另一侧走,才发现,路边的小河已经漫到岸上了,河沿边的长椅,已经被水没过了椅面,水下是青青的绿草,太夸张了,看来杭州的泄洪能力实在是不堪台风的蹂躏啊。
回家上QQ,发现其它公司很多人都收到通知不上班了,哎,真不厚道啊,我们没有 :-(

2007-08-01

生病了?自己吓自己!

身体不舒服,不一定是生病了,有时,是心理作用。
这段时间,感觉胸口闷,心脏不舒服,吓坏了,今天上医院(上海仁济医院[东部]),O,GOD。人山人海!昨天晚上去急诊,也是人山人海,楞给吓回来了,后来11点钟打电话去问,说还有N多人。
进了医院,由于急诊时给我的是内科,一大早我也挂了个内科,等了一个小时多,终于轮到了,结果没问几句,要我改挂心内科,郁闷啊,又是漫长的等待。。。
后来又是心电图,又是胸透,均查无异常,最终结论:自己吓自己的。

敲键盘的,长时间保持一个姿势,又缺少锻炼,身体本来就很虚,疲劳或是没休息好,有个不适感很正常,可是老被人说太“瘦”,没精神,又有“胃出血”的既往病史,消化一直不太好,以至于心理上有了“阴影”,总以为自己有个什么不好的病。。。。

还好,没事就好,呵呵,保持开朗的心情最重要!

2007-07-24

十年同学会

7/21,老班长组织了我们高中的十年同学会,还请了当时的班主任及几位任课老师。
比预想的人数要多,本以为有一半就不错了,但那天来了近五十多位同学(我们班是两个理科慢班的合集,总人数好象是64)。看来,慢班也有好处,大部分同学依然在家乡,容易聚在一起,不象快班,基本上都散落在全国各地了,甚至好些在国外了。
象我这么瘦的,也有两三,哈哈哈,颇为慰藉啊。当然,也有好些个本就不瘦的,现在更胖了。得盯着那张脸看上半天,才能与昔日的形象对上!

2007-07-18

mp4 3gp 视频格式转换

新入手了一台双模手机:大唐DT508,支持GSM和小灵通。
国产的手机,品质不怎么样,倒是杂七杂八的功能N多。其中就支持MP4,3GP媒体格式。于是也将手头的一些影片给转成MP4,但怎么试都不行,要么有图象没声音,要么就给个“格式不支持”。
最后,找了个Total Video Converter 2.603,转换成3gp格式,使用默认设置生成的文件,可以正常播放,但品质较差。尝试将视频比特率设为原比特率后,品质好多了,不过,生成的MP4,倒是死活不能成功播放,不知是什么原因。
另外有款开源软件:Media Coder,功能要强大很多,但具体设置比较复杂,必须得有相关的背景知识,象比特率,画面大小,每种格式都有自己的标准,不是随便设就可以的,但输出AVI格式的,一般来说没问题,那倒是可以用这款软件来做前期处理,如拆分,合并,声音,画面处理等。

2007-07-07

C#2.0 首次使用匿名方法

从知道C#2.0引入了匿名方法后,这还是首次使用:-)
goodsIDs是List<int>,为了拼接SQL文,使用String.Join方法,可遗憾的是,它只支持字符型数组,在不想写个循环的情况下,选择使用Array的转换方法,但它需要一个委托方法来进行类型转换。本就想省事,当然也不想新建一个方法,于是想到了匿名方法,由此有了第一次体验,呵呵,感觉挺有趣的,和JavaScript的prototype指定一个无名称的function差不多。

// 生成SQL文
sql.AppendLine("UPDATE LINGS_GOODS");
sql.AppendLine(" SET LINKID=0");
sql.AppendLine(
String.Format("ID IN (@GOODSID{0})",
String.Join(",@GOODSID",
goodsIDs.ConvertAll<string>(new Converter<int,string>(delegate(int value) { return value.ToString(); })).ToArray())),
true);

不过,最终也没有使用匿名方法,因为想起来框架中有现成的转换方法可用:
// 生成SQL文
sql.AppendLine("UPDATE LINGS_GOODS");
sql.AppendLine(" SET LINKID=0");
sql.AppendLine(
String.Format("ID IN (@GOODSID{0})",
String.Join(",@GOODSID",
goodsIDs.ConvertAll<string>(new Converter<int,string>(Convert.ToString)).ToArray())),
true);

连C# 2.0的新特性都还没体验过,C# 3.0已经出来了,感叹这世界变化太快 :-)

2007-07-06

令人郁闷的MDB SQL转参

折腾了半天,一个SQL死活通不过:
UPDATE
LINGS_GOODS
SET LINKID=@LINKID
WHERE ID IN (
SELECT
ID
FROM LINGS_GOODS
WHERE LINKID IN (
SELECT
DISTINCT LINKID
FROM LINGS_GOODS
WHERE LINKID<>0
AND ID IN (@GOODSID4LINKID6
,@GOODSID4LINKID14
,@GOODSID4LINKID7
,@GOODSID4LINKID10
,@GOODSID4LINKID11) )
OR ID IN (@GOODSID4GOODSID6
,@GOODSID4GOODSID14
,@GOODSID4GOODSID7
,@GOODSID4GOODSID10
,@GOODSID4GOODSID11) )

转参:
LINKID:6
GOODSID4LINKID6:6
GOODSID4LINKID14:14
GOODSID4LINKID7:7
GOODSID4LINKID10:10
GOODSID4LINKID11:11
GOODSID4GOODSID6:6
GOODSID4GOODSID14:14
GOODSID4GOODSID7:7
GOODSID4GOODSID10:10
GOODSID4GOODSID11:11

更新之后,发现新的值竟然是 11, 而不是 6。
最后试着将 LINKID 参数的位置调整到最后,更新正确了!
Access SQL 的参数问题以前也遇到过,之前以为只要名称对上,次序可以随意,但结果却是非得要按参数在SQL中出现的次序来一一指定参数不可,不然就错位了,似乎不支持参数名,SQL中的参数名,完全可以用 ? 来代替。

但现在这问题来看,对于参数的次序问题,看来不是完全按 SQL 文文本的次序来定,而是按实际执行的子查询的次序来定。
上面的 SQL 中,两个子查询先执行,更新操作是最后执行,所以更新内容的参数就要放在最后。

哎,实在令人郁闷,一个知识点的缺失,贴进去大半天的时间。

文档标准多样与Linux

在很大程度上,常用的 MicroSoft Word/Excel 文档在 Linux 无法完全交换,阻碍了 Linux 的普及,特别是在Ubuntu7推出后,桌面应用的可操作性更加容易之后。

办公文档是各单位及个人最要的电脑资料,广泛用于信息传播,网上资料下载及各单位的内部管理系统,都会维护大量的办公文档,采用的最广泛的,应该是 MicroSoft Wrod/Excel,虽然 OpenOffice 能打开,但不能保证编辑后完全兼容,因此大部分人迫不得已使用 Wine 来编辑文档。

常见的文档格式有金山的 WPS,Adobe 的 pdf,Microsoft Word,OpenOffice,甚至于文档标准就有多个:国内的 UOF,国际的 ODF,微软的 OpenXML,还有 “Adobe的Acrobat 软件和它所支持的 PDF 格式已经得到广泛的认同,现已被国际标准化组织(ISO)评为很多领域的标准,比如,PDF/X 是电子印刷数据交换标准,PDF/A 成为长期保存及存档的电子记录标准。”

如果国际标准统一,并实现完全兼容,将会大大提高Ubuntu的竞争力,减少推广阻力,让用户在做同一件事上,有多种选择。

参考资料:
1、开放文档格式标准ODF/UOF互通互融(IT168-软件频道)
2、中文文档国家标准呼之欲出(天极网)
3、微软OpenXML不示弱 被ECMA批为国际文档标准(天极网)
4、统一文档标准 改善业务流程(赛迪网)

2007-07-05

今天是我和老婆的阳历生日

今天生日,两个人的共同生日,夫妻同月同日生的应该不多吧,不过,家庭节日却是少了一个,呵呵。

想去吃海鲜,好久没回家了,实在是太想吃海鲜了。以前在家,几乎天天满桌的海鲜,而出外飘泊的这么些年,吃海鲜却已经是一种奢望了。

最爱吃的海鲜有很多,黄鱼,带鱼,黄梅鱼,虾姑,鲳鱼,鱿鱼,还有很多不知道怎么说的……
海鲜当然要野生的才好吃,但价格实在是太贵了,有些甚至是有价无市。听我妈说,她小的时候,一阵浪过,海岸上到处可见被浪打上来的海蛰,可现在,环境污染,海洋资源保护的欠缺,这种盛况,早已经看不到了。

目前状况下,如果能吃到新鲜又肥美的,已经是很不错了,希望晚上能吃上新鲜又肥美的 :-)

关于 FormView 状态的判断

在一个页面,想要根据 FormView 的状态来切换按钮显示时,在不同的事件里,取得的 FormView 状态会有不同。

例如:当前的 FormView 是 Insert 状态,点击 Insert 按钮,在 Inserted 事件中,将状态切换到 ReadOnly 时,在不同的页面事件中,取到的 FormView 的 CurrentMode 是不同的。要想在页面输出时,根据 FormView 状态切换按钮显示,要选择合适的事件。

最初,我使用 Page_Load 事件来进行处理,但发现取到的状态不正确。在上面举例的操作过程中,我预想的结果是 ReadOnly,然而实际上却是 Insert 状态。经过了解,最后使用 Page_PreRenderComplete 事件正确取得 FormView 的状态。

首先,需要了解页面生命周期中,各事件的先后顺序,简单列几个事件的次序:
1、Page_PreLoad
2、Page_Load
3、RaiseChangedEvents(各个控件的 Changed 事件)
4、RaisePostBackEvent(各个控件的处理事件,如 onClick 等)
5、Page_LoadComplete
6、Control_PreRender
7、Page_PreRenderComplete

为此,我写了一个测试程序,在各个事件中输出日志记录,部分内容如下:

<Log Date="2007-07-05 12:51:09 5603808" Level="Debug_Level">Page_PreLoad</Log>
<Log Date="2007-07-05 12:51:09 5603808" Level="Debug_Level">FormMode:Insert</Log>
<Log Date="2007-07-05 12:51:09 5904240" Level="Debug_Level">Page_Load</Log>
<Log Date="2007-07-05 12:51:09 6004384" Level="Debug_Level">FormMode:Insert</Log>
<Log Date="2007-07-05 12:51:09 6505104" Level="Debug_Level">Page_LoadComplete</Log>
<Log Date="2007-07-05 12:51:09 6505104" Level="Debug_Level">FormMode:ReadOnly</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormView_PreRender</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormMode:ReadOnly</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">Page_PreRenderComplete</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormMode:ReadOnly</Log>

从日志记录中可以看出,要到 Page_LoadComplete 事件时,FormView 的状态才由 Insert 状态切换到 ReadOnly 状态。而我在开始编写ASP.Net程序时,总是想当然地以为在 Page_Load 事件时,所有的控件都已经加载并处理完毕。

同样,在 Page_Load 事件中,如果查看 GridView 的行数,所取得的结果是变更前的行数,而不是最终输出到客户浏览器后的行数。在 Page_Load 事件中所取得的行数,可能是从ViewState 中取得原始数据,是系统状态的还原结果,还没有去处理用户事件并重新检索数据。

综上,或许我们应该先花点时间了解页面的生命周期,从网上,我搜索到一些相关内容的网页,摘录以参考。

1、Asp.Net Page LiftCycle(页面生命周期)
这在以前,我也看到过这张图,但不在自己电脑上,未保存,后来再想找时,一直没找到,呵呵,和这页面的作者差不多:-)
另外,这张图中,似乎少了些事件,如 Page_PreRenderComplete。 而图例中的 Adapter 和 Page Persister 是什么意思也不懂。
2、ASP.NET 应用程序生命周期概述(MSDN的文章)
3、客观看待ViewState对Asp.net程序作用和影响(某位博客的文章)

2007-06-30

房价跟美国接轨,工资跟非洲接轨?[转]

在某论坛看到这篇文章,感觉挺有意思的,转以保存。
通过google搜索,找到一个地址,但不确定是否是原始出处。

http://zihan868.bokee.com/viewdiary.15389472.html



  银行跨行查询收费,和哪个国家接轨你绝对想不到,美国绝大多数的银行根本不存在什么所谓的跨行查询收费。美国的绝大多数银行是股份制银行,这种自己突然规定跨行查询收费的只有在垄断银行才会发生。专家说,如果国外只要有一个银行实行了跨行查询收费,中国就会以和国际接轨为理由,采用这种方式。然后他们查阅了很多资料发现,我们周围这些国家,只有唯一一个巴基斯坦是跨行查询收费的。看到这里我彻底晕了,原来中国几家银行跨行查询收费的所谓和国际接轨,居然是和巴基斯坦接轨啊。
  
  有些决策者在制定政策的时候,手里有两套法宝,一套是“中国国情”一套是“与国际接轨”,当制定不利于人民的政策时,如房改,要求大家自己掏钱购买商品房,就说是和“国际接轨”,理由是,人家外国都是自己买房子,没有福利分房的说法,但与此同时,他们却恰恰忽略了人家外国土地私有这个关键因素,中国人并不拥有土地的所有权,土地都属于国家,却要被迫付出昂贵的价钱购买一套只有使用权的商品房,而当人们对此提出质疑的时候,他们又会说这是中国特殊国情决定的。
  
  又比如医改,教改,人家其他国家是免费医疗,免费义务教育,但这一点他们又不与国际接轨了,又强调中国国情了,什么财力不堪重负啦之类,结果导致大家看不起病,上不起学。
  
  又比如所谓“高薪养廉”,据说是新加坡、香港的成功经验,所以要和“国际接轨”,所以五次三番地给公务员加薪。但人家严格的监督制度,对公务员近乎苛刻的约束,廉政公署等等,他们又不和国际接轨了,又强调中国国情了。韩国首都汉城(现名首尔)只有14辆公务车,这点他们就不愿意接轨,中国现在一个乡镇 14辆公车都不算多吧?这就是中国国情。
  
  美国有个燃油税,他们就要和“国际接轨”,也要征燃油税,但美国高速公路、大桥绝大多数是不收费的,在美国养一辆车除汽油费外每年仅需170多美元,这点他们又不和国际接轨了,不仅养路费、车船税等等一大堆,而且到处设置关卡,几乎路路收费。全世界总共只有14万公里收费公路,但就有10万公里在中国!这就又是中国国情了.
  
  美国格林斯潘加息了,他们就要和“国际接轨”,但美国购房享受退税,购买第一套住房享受低利率,对出租房屋屋主进行补贴以降低租金,这些他们又不和国际接轨了,又强调中国国情了,不仅不对出租房屋进行补贴,反而变本加厉地对出租屋提高税收,导致这部分成本转嫁给租客,租金上涨。 
  
  世界绝大多数国家都是土地私有的,人民买房的同时就买了地皮,具有永久所有权。当然,他们在这一点上就不和国际接轨了,因为中国国情特殊啊!但是,当他们发现香港的使用权制度对自己比较有利后,就立即和香港接轨了!订了个70年使用权制度,迫使人民祖祖辈辈不断花巨资购买有限使用权,但香港是什么情况?香港原先是殖民地啊!英国只租用了99年啊,它搞个使用权无可厚非,因为土地本不是它的,时间到了就要归还的,你搞使用权到底是什么意思?不是说中国是公有制吗? 不是全国人民拥有对一切生产资料的所有权吗?但落实到的最后怎么变成绝大多数人都一无所有了呢?怎么就变成必须购买本属于自己的土地使用权呢?所以在这方面就和香港这个“殖民地”接轨,就不和其他的国际接轨。
  
  又比如,油价要涨、电价要涨、水价要涨,理由还是和国际接轨,说什么人家的都很贵,中国的油价水价电价便宜的很,所以就该涨,但说到人民的工资水平、福利水平、劳动保障制度,就又不和国际接轨了,就又强调中国的特殊国情了,人家的工会都是工人选举产生,实实在在代表工人权益,这一点咱们就是不和人家接轨,咱就是要让工会成为资本家压迫工人的帮凶,原因还是:中国国情。所以,不要拿什么美国、英国的加息说事,什么时候中国成为完全市场经济国家了,权力部门受公众严格监督了,再说这些不迟!

2007-06-09

YY还不会走路,好心急啊

YY已经15个月了,但是还不会走路。
牵着她的一只手,会走,但一放开就倒。
在网上查了一下,一般是12~14个月就会走路,但18个月,则100%都会走。或许YY是后者。
YY开始长牙也晚,老婆说是缺钙,她自己也缺钙。现在我们在给她服龙牡壮骨粉。
YY现在不在身边,下次回她外婆家,要考虑带她去做体检了。

uTorrent:提示磁盘空间不足

下载并试用 uTorrent 时,出现磁盘空间不足的提示,而实际上我的磁盘还有10多个G的可用空间。最后发现是分区格式的问题,FAT32允许的单文件最大值是4GB,而 BT 下载文件却有 4.3G,一张DVD。
所以认为是一个 BUG 并提交到官方网站。

得到的回复是,uTorrent 只是简单的返回 Windows API 的出错信息而已,原来这是 Windows 的 Bug。
但记得有个下载工具是有判断并明确提醒是分区格式的问题,想再建议加入判断,但E文写不出来,只好作罢,对于大部分懂电脑的来说,可能会找出问题原因,但普通用户,是比较困难的,而且使用FAT32的概率也相当高,而用 BT 下载大文件,也是比较普遍的。

相关链接:
http://forum.utorrent.com/viewtopic.php?pid=255809#p255809

一种新颖的验证方式


今天注册了一个uTorrent的论坛帐号,发现该网站使用了一种新颖的验证方式。
当前网上,为了防止有人恶意访问,流行在登录或发帖时,追加验证码的输入及校验。而这个网站所使用的方式是:显示的是一张含有一个小方块的图片,要求用户点击图片某一角落的小方块进行验证。
原理应该比较简单,就是从表单数据中提取点击的坐标值,进行对比校验。

采用这种方式有一个明显的优点,它减少了用户的键盘输入。若是使用了自动填表功能,则不需要任何输入即可一点马上提交登录信息。

但这种方式也有缺点,如果用户没有鼠标或不喜欢使用鼠标,则会造成不便,虽然这是少数情况。如果同时提供两种方式,校验时,任何一种通过即成功返回,或许是个不错的完美方案。

从根本上来说,这是为了防止恶意防问,一般指程序的自动攻击。采用这种方式,被突破的概率不知道是多少,其安全强度能有几分。我的数学向来较差,不知道是不是=小方块的面积(象素单位):图片的面积。直觉上,应该是较为可靠的。但相比于若干位英文字母+数字的方式,似乎被突破要容易得多。

另外,除了单纯的穷举法外,对图片进行分析的难度,也不及英文字母+数字的方式。但不管怎么说,在人性化方面要强上许多,对于防范要求不高的网站,还是一个比较受用户欢迎的不错选择。

2007-06-04

安装Windows后,恢复Ubuntu的启动菜单

安装Windows后,MBR上的GRUB被清掉了,按网上资料显示,恢复是相当简单。
确实,若顺利的话,也就两句Grub命令:
root (hd0,1)
setup (hd0)
但是,这是有前提的,你得要用root帐户来操作,虽然这有点象废话,然而我还是犯了这个错误。
由于Grub也是可以由非root帐户执行的,所以在命令行输入grub,没有提示权限不足,只是在进行以上操作时,总是说找不到磁盘,郁闷的说。
错误消息:Error 21: Selected disk does not exist

总结一下,完整而有简单的操作步骤是:
sudo -i
grub
root (hdX,X)
setup (hdX[,X])
quit

sudo -i是取得root权限,以前的命令su的替代,若单执行一条命令,也可以直接sudo grub。
root (hdX,X) 其中“X”是数字,表示第几个磁盘,第几个分区是root所在分区
setup (hdX,[X]) “X”同上,但如果是要将grub安装到MBR,而不是分区的Boot扇区,可以省略后者。
另外有一条非常有用的命令:
find /boot/grub/stage1
它会帮你找出,你的root分区所在的磁盘位置,返回如:(hd0,1),就不用去瞎猜了。

另外一个问题是,我在安装系统时,喜欢将老系统分区删除,再重建,如此一来,WindowsXp的安装程序重建分区时,竟然留了1M的空间,害得又多出个未分配空间,而且,系统分区的位置也变了,还没细查,估计有可能变成逻辑分区了。还有更可恶的,它竟然将启动分区弄到原来的数据盘上去了,真想不通啊,这实在令人难以接受。愣是把我干净的数据分区的根目录弄得乱七八糟,放上那么多个文件!Windows的分区,不得不让人不屑。

最后,提供一个资源,比较丰富的相关信息,主题与本文相同,作为继续学习资料:
http://blog.linuxmine.com/9084/viewspace-1220

2007-06-03

Sony VGN-S16C的驱动程序

悔不该,当初弄了这个Sony。得,这回,没带驱动光盘,玩完了,人家根本就不提供驱动下载。
在网上七折腾,八折腾,下的声卡驱动不正确,光有图标,就不出声,气死人!!!
最后,在美版网站,下了正确的驱动,但也花了一整天时间,郁闷透顶!
若有谁也有这种烦恼,也可以考虑到美版网站,找配置相当的机型,下载对应的驱动,应该可以用的。
哎,想不通啊,为什么中文版的,就不提供所有驱动下载?NND。

VGN-S16:http://esupport.sony.com/US/perl/swu-list.pl?mdl=VGNS170&UpdateType=Everything

Sony北美支持网站:http://esupport.sony.com/

上传老代码:ASP同学录源码

简介:
语言:Javascript(完全抛弃了VBScript)
数据库:Access2000以上
特点:ASP->XML + XLST->HTML
对DB访问做了简单封装,全部使用Commond来进行数据操作,规避注入侵害。
其它:
1、由于JS操作二进制很困难,所以对图片的支持不是很好,上传个人相片时,有可能程序无法识别实际的图片高度,宽度,以致上传失败。
2、由于纯粹是个人玩玩的,虽然当前自己在用,但后台管理依然没做,功能很不完善,仅供学习或继续开发用。

下载地址:http://download.csdn.net/source/188952
登录帐号:97-696 密码:jsj02

真遗憾,AutoCompleteExtender竟然不支持多列

自动填充,就我来说,最常用的应该是代码输入,这时,总是要求能显示代码所对应的名称,如此一来,AutoCompleteExtender就不适用了,它竟然不支持多列,令人有种想骂人的冲动!哎,枉费这么多时间来折腾,算了,不要它了.

2007-06-02

添加Ajax自动填充控件(AutoCompleteExtender)所遇到的问题

1、添加AutoCompleteExtender控件
从ajax.asp.net上下载了最新的SampleWebSite,将Bin目录下的Dll中的组件添加到控件面板上。打开既存的网站,在其中一个页面添加了AutoCompleteExtender控件。
2、添加ScriptManager控件
按提示,自动填充控件需要信赖ScriptManager,但是当前页面并非Page页,而是自定义组件,如果直接添加在ascx页面上,相信Page页肯定不能再添加ScriptManager了,若其也需要添加此类依赖组件,则会产生冲突,所以我认为应当添加ScriptManagerProxy来替代。
3、添加自定义的后台ServiceMethod
4、运行。
在文本框输入字符后,未能出现下拉列表框,反复检查代码,未能发现任何问题。
5、检查FireFox的Error Console,发现有脚本错误:
'Sys' is undefined.
定位代码:
<script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ctl00$Main$kdkd', document.getElementById('aspnetForm'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);
//]]>
</script>
5、安装FireBug后,发现有好几个URL请求发生了404错误,URI是当前网站根目录下的ScriptResource.axd
6、能过以上,确定了是Web.config的配置问题,缺少axd类型的Handler
7、能过查找,发现一个网上资料:http://codebetter.com/blogs/jay.kimble/archive/2006/10/26/How-To_3A00_-Enable-Microsoft-Ajax-Beta-over-on-an-existing-site.aspx
看了看,一来是E文,另外,有好向个step,感觉有点麻烦。于是决定新建一个“ASP.NET AJAX-Enabled WebSite”,将其自动生成的Web.config直接复制过来,并重新添加我自己的appSettings小节与connectionStrings小节。但位置似乎有讲究,紧跟着放在后,产生编译错误:
错误 38 Only one <configSections> element allowed per config file and if present must be the first child of the root <configuration> element. M:\LingsJob\src.new\Web.config 33
等错误及警告。改变位置,放到</configSections>与<system.web>之间即可。
8、重新编译并运行,在文本框输入时,成功产生XHR,但返回的结果却是错误提示:
Unknown web method XXX.
9、反复检查,未能找出原因,对比AJAX的Sample,索性也改成请求*.asmx再指向AppCode下的WebService类的Public方法。
10、测试成功。

以上是我在使用AutoCompleteExtender所遇的问题及解决措施,方法比较“粗鲁”,而没有去深究细节,个人认为,如非太闲,能实现,就真的是不想去多研究了,感觉做程序,已经是够累了...

2007-05-24

初用Ubuntu 7.04 -- 修改分区,添加Windows

想要做多系统,追回一个windows2003。
先是为新系统分配一个磁盘分区。原来的分区为swap, /, /XXX,共三个,将最后一个分区一分为二,变为一个ntfs分区和一个fat32分区,重启系统后,使用ghost,将以前的windows2003备份恢复到新的ntfs分区中。
原先只有一个ubuntu系统,grub被安装在磁盘的mbr中,重启后,进入ubuntu的过程中,提示出错,原因是最后一个分区被修改,导致挂载失败。系统没有直接进入图形的登录界面,而是以root身分,运行了一个shell。令人意想不到的是,输入"reboot",竟然进入了图形登录界面,输入用户名密码,进入了gnome桌面,这对于没有多少命令记得的我来说,是最好不过了。

进入系统后,为了能正常启动ubuntu和windows2003,需要修改/etc/fstab和/boot/grub/menu.lst这两个文件。
fstab保存了系统自动挂载项目,打开后,将/dev/sda3注释掉(即原来的最后一个分区),再追加新的两个分区的挂载项。

/dev/sda3 /ntfs ntfs noauto,codepage=936,iocharset=cp936 0 0
/dev/sda4 /mos vfat defaults,codepage=936,iocharset=cp936 0 0

这也是从网上参考的,没去查手册,/dev/sda3是第一个磁盘的第3个分区,现在装的是windows2003,这不需要挂载,所以加了noauto选项,否则进入到Gnome桌面后,会自动挂载,并在桌面上出现磁盘图标,不过加了这个选项后,在文件浏览器的位置面板上,还是能看到,但双击时,提示非root不能挂载。

/dev/sda4是我分出来,作为两个系统共同使用的数据存储分区,使用了两个系统都能稳定可靠操作的fat32格式。使用目前的参数,却有一个问题,这个分区对于普通用户来说,是只读的,我只好用sudo来操作写数据,还勉强可以接受,就此也没再去细究。另外还有一个问题是,在ubuntu下将中文文件名的文件复制过去,到windows2003下,变成了乱码,估计也是参数不正确的原因,一般来说,不大会使用中文文件名,所以也就懒得管了。

menu.lst这个文件的修改很顺利,因为它本身就有启动win98/2000的sample,复制过来,去掉注释即可,或再改一下title,启动时菜单等待时间等。。。

title Windows 2003
root (hd0,2)
makeactive
chainloader +1

另外几个选项,含有详细的说明
## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not change this entry to 'saved' or your
# array will desync and will not let you boot your system.
default 0

## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout 3

## hiddenmenu
# Hides the menu by default (press ESC to see the menu)
hiddenmenu

最后一项,如果要默认显示菜单,我估计可能是:showmenu吧,可以试试,或是到网上确认一下。

2007-05-16

初用Ubuntu 7.04 -- 如何完成Windows中常见的设置(陆续添加中...)

同样是图形界面的操作,很多需求是类似的,但Ubuntu的Gnome毕竟与Windows还是有很大的区别,所以初用,总是难免不知道如何设置。
这里将使用过程中遇到的,陆续添加进来,力求使用简单的图形程序来解决,而不是命令行,或是手工编辑配置文件。

1、更改文件的默认打开程序
右键点击文件,选择弹出菜单中的“属性”-“打开方式”,选择自己的要定制的应用程序。


2、设置启动项目,在进入桌面后,自动运行指定的程序,同Windows中的“启动”菜单
选择系统菜单:系统-首选项-会话-启动程序-新建。

[转摘]细说字体 Sans Serif 与 Serif

出处:http://yx.takeback.net/serif-font.html

拜读了 LGJ Font Notes 的 Serif VS. Sans Serif 注1 一文,顿时胸中豁然开朗,终于明白了什么是Sans Serif字体,什么是Serif字体,什么地方应该使用Sans Serif字体,什么地方又应该使用Serif字体。这些问题,不管是对Web Designer还是普通用户,了解它我觉得还是十分必要的,比如在很多浏览器中就涉及相应的设置。

在西方国家罗马字母阵营中,字体分为两大种类:Sans Serif和 Serif,打字机体虽然也属于 Sans Serif,但由于是等宽字体,所以另外独立出 Monospace 这一种类,例如在Web中,表示代码时常常要使用等宽字体。

Serif的意思是,在字的笔画开始及結束的地方有额外的装饰,而且笔画的粗细会因直橫的不同而有不同。相反的,Sans Serif则沒有这些额外的装饰,笔画粗细大致差不多。如下图:

字体对比图

可以看出,我们平时所用的Georgia、Times New Roman等就属于Serif字体,而Arial、Tahoma、Verdana等则属于Sans Serif字体。对中文而言,同样存在这两大种类,很明显,宋体、细明体(繁体中常用)等就属于Serif,而黑体、幼圆等则属于Sans Serif。
Serif 和 Sans Serif 的一般比较

* Serif的字体容易辨认,因此易读性较高。反之Sans Serif 则较醒目,但在行文阅读的情況下,Sans Serif 容易造成字母辨认的困扰,常会有来回重读及上下行错乱的情形。
* Serif 强调了字母笔画的开始及结束,因此较易前后连续性的辨识。
* Serif 强调一个word,而非单一的字母,反之Sans Serif则强调个别字母。
* 在小字体的场合,通常Sans Serif比Serif更清晰。

适用用途:

通常文章的內文、正文使用的是易读性较佳的 Serif 字体,这可增加易读性,而且长时间阅读下因为会以word为单位来阅读,较不容易疲倦。而标题、表格內用字则采用较醒目的Sans Serif字体,它需要显著、醒目,但不必长时间盯著这些字来阅读。

像宣传品、海报类,为求醒目,它的短篇的段落也会采用Sans Serif字体。但在书籍、报刊杂志,正文有相当篇幅的情形下,则应采用Serif字体来减轻读者阅读上的负担。在Web设计及浏览器设置中也应遵循此原则为是。

实际应用

在Firefox中(目前似乎只有Firefox有此功能),可以分别单独指定Sans Serif、Serif及Monospace的中西文字体,然而这个选项并未设置在工具菜单中,不过可以在Addressbar中键入about:config,然后在Filter中过滤font找到如下Preference Name:

font.name.monospace.x-western
font.name.monospace.zh-CN
font.name.sans-serif.x-western
font.name.sans-serif.zh-CN
font.name.serif.x-western
font.name.serif.zh-CN

你可以依照上述Sans Serif、Serif及Monospace的原则来分别指定一种对应字体,按照W3C的CSS规则 注2 ,在font(或者font-family)的最后都要求指定一个Serif这样的Generic-family,避免客户端实在没有指定字体时使用本机上的Serif默认字体。

由于Mozilla系的浏览器的这种特性,我们在CSS的font设定中,可以分别设定中西文字体来丰富版面,例如我们指定一组小字体(类似此文章标题下的日期、作者、类别):

font-family: Arial, PMingLiU, Sans-Serif;
/*按照文章前面所讲,在小字体时Sans-serif更为清晰,所以随便指定一个Arial,
而作为Serif的PMingLiU(明体)在小字体显示时也有不俗的外观。
最后不忘指定一个Sans-Serif类。*/

参考资料:

1. Serif VS. Sans Serif
2. Font family: the ‘font-family’ property

初用Ubuntu 7.04 -- 关于输入法

一直以来,对于Ubuntu输入法不甚了解,出了问题,不知道如何配置解决,直到找到这篇文章,才稍稍明白些。
出处:http://comcat.blog.openrays.org/blog-htm-do-showone-tid-58.html(comcat 的BLOG)

解析环境变量XMODIFIERS/GTK_IM_MODULE
作者: comcat 发表日期: 2006-09-05 18:28

我们配置输入法时,都是习惯性的在输入法启动前导出环境变量:

export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=SCIM

他们有何用意呢??

我们常用的输入法有以下几种:

1. XIM (X输入法, 所有 X 图形程序都是可用的)
2. GTK immodule(GTK输入模块, 专给 GTK+2/Gnome 程序用的,GTK+ 1 不适用)
3. QT immodule(QT输入模块, 专给 QT/KDE 程序用的)


XMODIFIERS实际上是指定 X图形程序的输入法.

GTK_IM_MODULE 则是指定GTK+2的程序默认所用的输入法模块.

有关GTK+2 所有输入法模块都安装在 /usr/lib/gtk-2.0/2.4.0/immodules/ 目录下.



关于他们之间的关系,我们有一个比较直观的经验就是, 当我们因为设置XMODIFIERS失误(比如在有些情况下scim小写),导致X输入法没法使用时,我们在gnome-terminal里单击鼠标右键,移动到 "输入法",再选择 "SCIM Input Method"时,我们在gnome-terminal下却是可以输入中文的. 当然前提是我们已经安装scim-gtk2-immodule包.


一般情况下XMODIFIERS的优先级高于GTK_IM_MODULE ,即当我们同时设定这两个环境变量,在GTK+2的应用程序里优先使用的是XMODIFIERS指定的X输入法.



GTK immodule 比起 XIM 有很多好处:
1. 不受 locale 限制
2. 完全不用设定,随时可用,会自动调用 IM server
3. 可以任意切换各种不同 IM server,随时可改,无需重启X.
4. 真正支援游标跟随.



但是因为 c++ 的兼容性问题使 scim-gtk2-immodule 跟许多程序相冲突,故而在目前,如果我们使用scim的话,还不能流畅享受到GTK 输入模块的种种妙处,只能使用 Scim for XIM.

注:mozilla, firefox, thunderbird 等不是正规的 GTK+ 2,没办法用鼠标动态选择输入法. 如果你仅仅使用GTK immodule的话, 一定要使用GTK_IM_MODULE指定默认的GTK 输入模块.

2007-05-15

初用Ubuntu 7.04 --解决Skype无法启动故障

作为一名Ubuntu的新手,我不知道究竟做了什么,竟然导致Skype无法启动。
运行时,提示:
*** glibc detected *** skype: free(): invalid pointer: 0x08a38bb0 ***

通过网络搜索,找到了相关的解决方案: http://www.cloverjune.com/read.php/142.htm
在他上面,提供了两个解决方案:
一、重新安装libqt3-mt,然后再次安装Skype
sudo apt-get remove skype
sudo apt-get remove libqt3-mt
sudo apt-get install libqt3-mt
sudo apt-get install skype

二、下载rpm包,经转换为deb包的,安装即可。
这个我没试,一般的应用程序都有deb包,也就没去了解如何去进行包格式的转换。

但是遗憾的是,没有具体解析
第一种方案提到的libqt3-mt,据查,是挪威 TrollTech 公司的产品,以下摘引自IBM网站上的文章:http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/overview/index.html

Qt 是一个跨平台的 C++ 图形用户界面库,由挪威 TrollTech 公司出品,目前包括Qt, 基于 Framebuffer 的 Qt Embedded,快速开发工具 Qt Designer,国际化工具 Qt Linguist 等部分 Qt 支持所有 Unix 系统,当然也包括 Linux,还支持 WinNT/Win2k,Win95/98 平台。

从Debian的网站上可以看到:http://packages.debian.org/unstable/libs/libqt3-mt


Qt GUI Library (Threaded runtime version), Version 3

This is the Trolltech Qt library, version 3. It's necessary for applications that link against the libqt-mt.so.3, e.g. all KDE3 applications.

(所有的KDE3应用程序,都要依赖于libqt3-mt)

同样,虽然用的不是KDE,而是Gnome,但Skype依赖于libqt3-mt,所以必须要装。
但我实在是不知道,什么时候,改变过这个包,还是改变了相关的配置。
况且,与提示中的glibc又是什么关系呢?是否libqt3-mt隶属于glibc?但却没找到例证。
从找到的Glibc相关网站上来看,这是一个C链接包,似乎与libqt3-mt没有什么直接的关系(http://www.gnu.org/software/libc/)
倒是有一种可能最大,那就是libqt3-mt调用了Glibc,并且里面有个函数出错了。
疑问到此进行不下去了,也不可能花时间去研究源代码,则只好作罢。

不过按这个思路,不能启动的问题确实是解决了。

2007-05-11

初用Ubuntu 7.04 --安装VMware Workstation 6.0.0 build-45731

初用Ubuntu,什么也不会,但是桌面系统吧,傻瓜式的就按Windows的操作经验来乱试,遇到什么问题,通过Google来解决,也不必太深入,将过程记下来,作备忘吧。
-----------------------------------------------------------------------------


由于之前的vmware 5.5.1 build-19175,我不能成功地Bridge到无线网卡,所以下载了最新版的vmware ,重新测试。为了保证得到最新版,我在官方网站直接下载。官方的下载是必须要通过用户登录的,下载文件受到保护,使用MuutiGet下载失败,只好老老实实地用FireFox来下载,速度极慢,只有5~6K左右,而文件有180M多,昨晚睡觉后,继续开机下载。
安装与之前提到的版本一样,也是解开压缩包,执行:
sudo ./vmware-install.pl

Creating a new VMware Workstation installer database using the tar4 format.

Installing VMware Workstation. This may take from several minutes to over an
hour depending upon its size.

In which directory do you want to install the binary files?
[/usr/bin]

What is the directory that contains the init directories (rc0.d/ to rc6.d/)?
[/etc]

What is the directory that contains the init scripts?
[/etc/init.d]

In which directory do you want to install the daemon files?
[/usr/sbin]

In which directory do you want to install the library files?
[/usr/lib/vmware]

The path "/usr/lib/vmware" does not exist currently. This program is going to
create it, including needed parent directories. Is this what you want?
[yes]

In which directory do you want to install the manual files?
[/usr/share/man]

In which directory do you want to install the documentation files?
[/usr/share/doc/vmware]

The path "/usr/share/doc/vmware" does not exist currently. This program is
going to create it, including needed parent directories. Is this what you want?
[yes]

The installation of VMware Workstation 6.0.0 build-45731 for Linux completed
successfully. You can decide to remove this software from your system at any
time by invoking the following command: "/usr/bin/vmware-uninstall.pl".

Before running VMware Workstation for the first time, you need to configure it
by invoking the following command: "/usr/bin/vmware-config.pl". Do you want
this program to invoke the command for you now? [yes]

Making sure services for VMware Workstation are stopped.

Stopping VMware services:
Virtual machine monitor done

Configuring fallback GTK+ 2.4 libraries.

In which directory do you want to install the theme icons?
[/usr/share/icons]

What directory contains your desktop menu entry files? These files have a
.desktop file extension. [/usr/share/applications]

In which directory do you want to install the application's icon?
[/usr/share/pixmaps]

Trying to find a suitable vmmon module for your running kernel.

The module bld-2.6.20-15-i586generic-Ubuntu7.04 loads perfectly in the running
kernel.

Trying to find a suitable vmblock module for your running kernel.

The module bld-2.6.20-15-i586generic-Ubuntu7.04 loads perfectly in the running
kernel.

Do you want networking for your virtual machines? (yes/no/help) [yes]

Configuring a bridged network for vmnet0.

Your computer has multiple ethernet network interfaces available: eth0, eth1,
eth0:avah. Which one do you want to bridge to vmnet0? [eth0]

The following bridged networks have been defined:

. vmnet0 is bridged to eth0

Do you wish to configure another bridged network? (yes/no) [no] y

Configuring a bridged network for vmnet2.

Your computer has multiple ethernet network interfaces available: eth1,
eth0:avah. Which one do you want to bridge to vmnet2? [eth0] eth1

The following bridged networks have been defined:

. vmnet0 is bridged to eth0
. vmnet2 is bridged to eth1

Do you wish to configure another bridged network? (yes/no) [no]

Do you want to be able to use NAT networking in your virtual machines? (yes/no)
[yes]

Configuring a NAT network for vmnet8.

Do you want this program to probe for an unused private subnet? (yes/no/help)
[yes]

Probing for an unused private subnet (this can take some time)...

The subnet 172.16.185.0/255.255.255.0 appears to be unused.

The following NAT networks have been defined:

. vmnet8 is a NAT network on private subnet 172.16.185.0.

Do you wish to configure another NAT network? (yes/no) [no]

Do you want to be able to use host-only networking in your virtual machines?
[yes]

Configuring a host-only network for vmnet1.

Do you want this program to probe for an unused private subnet? (yes/no/help)
[yes]

Probing for an unused private subnet (this can take some time)...

The subnet 192.168.217.0/255.255.255.0 appears to be unused.

The following host-only networks have been defined:

. vmnet1 is a host-only network on private subnet 192.168.217.0.

Do you wish to configure another host-only network? (yes/no) [no]

Trying to find a suitable vmnet module for your running kernel.

The module bld-2.6.20-15-i586generic-Ubuntu7.04 loads perfectly in the running
kernel.

Do you want to install the Eclipse Integrated Virtual Debugger? You must have
the Eclipse IDE installed. [no]

Creating a new VMware VIX API installer database using the tar4 format.

Installing VMware VIX API. This may take from several minutes to over an hour
depending upon its size.

You must read and accept the VMware VIX API End User License Agreement to
continue.
Press enter to display it.

VMware(R) Software Developer Kit (SDK) Agreement

VMware, Inc. ("VMware") provides this Software Developer Kit ("SDK") for VIX
Application Programming Interface ("VIX API") to you subject to the
following terms and conditions. If you disagree with any of the following
terms, then do not use this SDK.

1. This SDK contains a variety of materials, including but not limited to,
interface definitions, documentation, Redistributable Code and Sample Code
regarding programming interfaces to one or more VMware products as
referenced in such materials ("VMware Software"). This SDK is intended to
serve as a guide for writing programs to interact with the VMware Software.
For the purpose of this Agreement, "Sample Code" means sample software in
source code format designated as "Sample Code" in the SDK documentation, and
"Redistributable Code" means object code files designated as
"Redistributable Code" in the SDK documentation.

2. Subject to the restrictions below, you may download and make a
reasonable number of copies of the SDK contents for your personal use solely
for the purpose of creating software that communicates with VMware Software
("Developer Software"). You agree to defend, indemnify and hold harmless
VMware, and any of its directors, officers, employees, affiliates or agents,
from and against any and all claims, losses, damages, liabilities and other
expenses (including reasonable attorneys' fees), arising from your
modification and distribution of the Sample Code, distribution of
Redistributable Code or breach of this SDK Terms and Conditions.

3. Restrictions: You may create and distribute Developer Software based on
the Sample Code and Redistributable Code, provided that (1) you do not use
the SDK to design or develop anything other than Developer Software; (2) you
do not modify, create derivative works of, reverse engineer, reverse
compile, or disassemble the Redistribution Code, except that you may modify
and create derivative works of the Sample Code in connection with Developer
Software; (3) you distribute the Redistributable Code in object code form
only and solely in conjunction with, and as part of your Developer Software;
(4) you do not make any more copies of the SDK than are reasonably necessary
for the authorized use and backup and archival purposes; (5) you do not
permit further distribution of the SDK by your end users; (6) you do not
permit sub-licensees or end users to reverse engineer or reverse compile the
Redistributable Code; and (7) you do not use the SDK to design or develop
software to upload or otherwise transmit any material containing software
viruses or other computer code, files or programs designed to interrupt,
destroy, or limit the functionality of any software or hardware.

4. VMware retains ownership of the SDK, including without limitation all
copyrights and other intellectual property rights therein.

5. For open source software components included with the SDK, you are
subject to the terms of those applicable open source license agreements.
The open source software licenses can be found in the
open_source_licenses.txt file, other materials accompanying the SDK, the
documentation or corresponding source files available at
http://www.vmware.com/download/open_source.html.

6. You may not represent that the programs you develop using the SDK are
certified or otherwise endorsed by VMware. You may not use the VMware name
or any other trademarks or service marks of VMware in connection with
programs that you develop using the SDK.

7. You will not receive any VMware support or subscription services for the
SDK or any other services from VMware in connection with the SDK. If you
have purchased support and/or subscription services for a VMware product,
such support and/or subscription services shall not apply to the SDK or your
use of the SDK.

8. Term, Termination and Changes: This Agreement shall continue as long as
you are in compliance with the terms specified herein or until otherwise
terminated. You and or VMware each may terminate this Agreement for any
reason at any time. You agree, upon termination, to destroy all copies of
the SDK within your possession or control. The Confidential Information,
Limitations of Warranties, Liability and Indemnification sections set out in
this Agreement shall survive any termination or expiration of this
Agreement.

9. Limitations of Warranties and Liability: THE SDK IS PROVIDED "AS IS"
WITHOUT ANY WARRANTIES OF ANY KIND. TO THE MAXIMUM EXTENT PERMITTED BY
APPLICABLE LAW, VMWARE DISCLAIMS ANY IMPLIED WARRANTIES, INCLUDING, WITHOUT
LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS.

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL VMWARE
BE LIABLE FOR ANY LOST PROFITS OR BUSINESS OPPORTUNITIES, LOSS OF USE,
BUSINESS INTERRUPTION, LOSS OF DATA, OR ANY OTHER INDIRECT, SPECIAL,
INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE SDK OR YOUR USE OF
THE SDK, UNDER ANY THEORY OF LIABILITY, WHETHER BASED IN CONTRACT, TORT,
NEGLIGENCE, PRODUCT LIABILITY, OR OTHERWISE. BECAUSE SOME JURISDICTIONS DO
NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR
INCIDENTAL DAMAGES, THE PRECEDING LIMITATION MAY NOT APPLY TO YOU.

VMWARE'S LIABILITY ARISING OUT OF THE SDK PROVIDED HEREUNDER WILL NOT, IN
ANY EVENT, EXCEED US$5.00.

THE FOREGOING LIMITATIONS SHALL APPLY TO THE MAXIMUM EXTENT PERMITTED BY
APPLICABLE LAW, REGARDLESS OF WHETHER VMWARE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES AND REGARDLESS OF WHETHER ANY REMEDY FAILS OF
ITS ESSENTIAL PURPOSE.

10. These terms are governed by the laws of the State of California and the
United States of America without regard to conflict of laws principles. You
may not assign any part of this Agreement without the prior written consent
of VMware. Any attempted assignment without consent shall be void. These
terms constitute the entire agreement between you and VMware with respect to
the SDK, and supersede all prior written or oral communications,
understandings and agreements. Any waiver of these terms must be in writing
to be effective. If any provision of these terms is found to be invalid or
unenforceable, the remaining terms will continue to be valid and enforceable
to the fullest extent permitted by law.

SDK 4.05.07



Do you accept? (yes/no) y

Thank you.

In which directory do you want to install the VMware VIX API binary files?
[/usr/bin]

In which directory do you want to install the VMware VIX API library files?
[/usr/lib/vmware-vix/lib]

The path "/usr/lib/vmware-vix/lib" does not exist currently. This program is
going to create it, including needed parent directories. Is this what you want?
[yes]

In which directory do you want to install the VMware VIX API document pages?
[/usr/share/doc/vmware-vix]

The path "/usr/share/doc/vmware-vix" does not exist currently. This program is
going to create it, including needed parent directories. Is this what you want?
[yes]

The installation of VMware VIX API 1.1.0 build-45731 for Linux completed
successfully. You can decide to remove this software from your system at any
time by invoking the following command: "/usr/bin/vmware-uninstall-vix.pl".

Starting VMware services:
Virtual machine monitor done
Blocking file system: done
Virtual ethernet done
Bridged networking on /dev/vmnet0 done
Host network detection done
Host-only networking on /dev/vmnet1 (background) done
DHCP server on /dev/vmnet1 done
Bridged networking on /dev/vmnet2 done
Host-only networking on /dev/vmnet8 (background) done
DHCP server on /dev/vmnet8 done
NAT service on /dev/vmnet8 done

The configuration of VMware Workstation 6.0.0 build-45731 for Linux for this
running kernel completed successfully.

You can now run VMware Workstation by invoking the following command:
"/usr/bin/vmware".

Enjoy,

--the VMware team


在我的机子上,eth0是有线连接,eth1是无线连接,将/dev/vmnet2 bridge 到eth1上,启动Windows98,使用Bridged方式,无法取到无线路由器DHCP分配的地址,改用Custom:/dev/vmnet2后,成功取得IP并连接上网。

然而,在使用工行的U盾时,遇到了麻烦,接入U盾,不能自动连接到GuestOS。在Vmware的论坛中,找到的解决方案是,启动GuestOS后,点击菜单VM-Removable Devices - USB Devices 中的Smart Card,这样GuestOS就会加载U盾,并安装驱动程序。这与我以前在Windows作Host时的体验不同,那时只要直接将设置接入,如果当前GuestOS窗口被激活,就会自动加载。



虽然U盾被加载到GuestOS了,但是使用工行的驱动,在管理器程序中,却看不到接入的U盾,自然,在IE中也无法使用。
再拿U盘来做测试,安装USB的万能驱动,使用一切正常,那看来,有可能是U盾的驱动与Vmware不兼容,或许为了安全目的,加了特殊的手段。
但也有可能是GuestOS的问题,这不是在VMware6.0下安装的,抽时间从头安装再试试。

BTW,在Windows下,图形处理用惯了Photoshop,使用GMIP比较困难,想画线条都不知道怎么画,又得要花时间去学习了。

2007-05-10

初用Ubuntu 7.04 --微软的雅黑字体

初用Ubuntu,什么也不会,但是桌面系统吧,傻瓜式的就按Windows的操作经验来乱试,遇到什么问题,通过Google来解决,也不必太深入,将过程记下来,作备忘吧。
-----------------------------------------------------------------------------

在Ubuntu中文社区,看到别人使用了微软的雅黑字体,真的很漂亮,也到网上去下载。
我没怎么美化,那份指南看上去太恐怖了点,还是简单点吧,不一定要很完美。
将包文件解开,复制两个字体文件到系统的字体目录下,然后注销重新登录(不然在FireFox2.0.3的配置字体时,找不到),改一下系统字体与相关应用的字体即可。

改完FireFox后,打开网页,感觉真的很好:-)
然而,打开我自己的博客,却还是老样子,难道是样式表的原因?于是我将所有的样式去除,但照旧。仔细检查了源代码,终于被我发现文档定义部分比其它网页多了一个语言:lang="en"
完整代码:<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
将它删除后:<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
问题解决了,漂亮的字体出现在我眼前:-)

初用Ubuntu 7.04 --安装MultiGet下载软件

初用Ubuntu,什么也不会,但是桌面系统吧,傻瓜式的就按Windows的操作经验来乱试,遇到什么问题,通过Google来解决,也不必太深入,将过程记下来,作备忘吧。
-----------------------------------------------------------------------------

作品网站:http://multiget.sourceforge.net/
这应该是一个国人开发的Linux下的作品,呵呵,运行后,看到几个汉字了(百年同济)。。。

选择deb格式的文件,下载后,直接运行安装即可。
安装过程中,图形界面的安装器会自动帮你检查依赖包,并下载安装当前系统缺少的依赖包。
安装完成后,在Application-Internet中,可以找到它,不过图标好像有点“土气”:-)

打开后,这个软件与我们在Windows下常用的下载软件很想象,如网络蚂蚁,网际快车等,大概是这类软件的界面经过长期摸索与客户反馈,已经差不多定型了吧。

Linux向来图形界面不为人看好,网上相关的资料也喜欢用命令行来执行操作,但时至今天,Linux的图形界面已经越来越人性化了,象添加/删除软件这种操作,基本上都可以在桌面上完成了,没必要再开个终端:-)

初用Ubuntu 7.04 --RAR文件的解包

初用Ubuntu,什么也不会,但是桌面系统吧,傻瓜式的就按Windows的操作经验来乱试,遇到什么问题,通过Google来解决,也不必太深入,将过程记下来,作备忘吧。
-----------------------------------------------------------------------------
参考:http://www.ubuntux.org/how-to-install-rar-archiver-rar

打开终端,运行下面的命令
sudo apt-get install rar
sudo ln -fs /usr/bin/rar /usr/bin/unrar

然后就可以打开RAR文件了。

初用Ubuntu 7.04--GRUB的麻烦

由于我的vmware5.5.1无法bridge到我的无线网卡,而我又有待处理的淘宝帐单,所以决定先回到Windows2003,处理完帐单后,再回归Ubuntu,到时试试vmware6beta看看,是否能解决这个问题。
我备有windows2003的ghost备份文件,使用无忧光盘启动映象制作的DVD光盘。从这张光盘启动后,我将系统恢复到原Linux分区,完成后重新启动。
然而,启动后,出现的不是Windows2003的画面,而是grub的出错信息,这是因为将grub安装到硬盘的mbr所致(linux分区已被覆盖,启动失败)。解决的办法自然是恢复成Windows的默认mbr程序。首先想到的是使用Dos命令fdisk/mbr。于是使用光盘启动系统,执行这条命令后,却显示了一个出错提示,似乎是没找到硬盘的意思,真怪了!直接输入命令fdisk,却无法进入,在选择是否支持大容量硬盘后,直接返回到命令提示符下了,不知道是什么原因。
想了想,还有什么其它工具提供mbr修复呢?在启动光盘上找了找,发现了diskman,但没有mbr修复功能,倒是可以直接编辑mbr,这个难度就大了点啦。。。呵呵。但发现没有设置激活的分区,于是将windows2003的分区激活。重新启动,还是不行,是啊,这是mbr的问题,还没到启动分区的boot这一步哪。
在光盘里再次翻找,又有一个软件进入我的视线,sfdisk,也是一个快速分区软件,并且找到了mbr修复选项,OK,修复,重启。这回显示的是一大堆E文,大意应该是分区识别有问题吧。
这回,我直接在sfdisk中,删除了系统分区和原来的linux交换分区,并重建了一个分区,设置为激活分区,再重新启动并重新恢复ghost备份文件,重启,OK。

2007-05-08

初用Ubuntu 7.04 --安装vmware 5.5.1 build-19175

初用Ubuntu,什么也不会,但是桌面系统吧,傻瓜式的就按Windows的操作经验来乱试,遇到什么问题,通过Google来解决,也不必太深入,将过程记下来,作备忘吧。

注册序列号(网上搜索得来)
DA925-HP80U-Z8HDC-4WXXP
3KW2W-AYR2C-88M6F-4MDQ2
-----------------------------------------------------------------------------


为了有时可能需要跑Windows,所以得装个虚拟机,在网上搜索到一个vmware 5.5.1 build-19175的下载,Go!
下载完成后,解开压缩包,执行里面的vmware-install.pl,一路回车,最后提示第一次运行Vmware,要进行配置,问你要不要马上执行vmware-config.pl(这个文件,安装后,可以在/usr/bin目录下找到)输入个”y”,再一路回车,到下面卡住了。。。

What is the location of the directory of C header files that match your running
kernel? [/usr/src/linux/include]

The path "/usr/src/linux/include" is not an existing directory.


呵呵,我哪知道内核的头文件在哪啊,上网找吧,得到的信息说最新版的Ubuntu还不被支持,但可以下载一个补丁程序来解决,Vmware-any-any-update,一个名叫Petr Vandrovec (vandrove@vc.cvut.cz)的人制作的。Petr Vandrovec ,From 捷克技术大学(布拉格捷克斯洛伐克技术大学) ,
Czech Technical University in Prague www.cvut.cz

下载地址:http://platan.vc.cvut.cz/ftp/pub/vmware/vmware-any-any-update109.tar.gz
下载之后,解开压缩包,运行runme.pl

sudo ./runme.pl
Updating /usr/bin/vmware-config.pl ... already patched
Updating /usr/bin/vmware ... No patch needed/available
Updating /usr/bin/vmnet-bridge ... No patch needed/available
Updating /usr/lib/vmware/bin/vmware-vmx ... No patch needed/available
Updating /usr/lib/vmware/bin-debug/vmware-vmx ... No patch needed/available
VMware modules in "/usr/lib/vmware/modules/source" has been updated.

Before running VMware for the first time after update, you need to configure it
for your running kernel by invoking the following command:
"/usr/bin/vmware-config.pl". Do you want this script to invoke the command for
you now? [yes] y

Making sure services for VMware Workstation are stopped.

Stopping VMware services:
Virtual machine monitor done

Configuring fallback GTK+ 2.4 libraries.

In which directory do you want to install the mime type icons?
[/usr/share/icons]

What directory contains your desktop menu entry files? These files have a
.desktop file extension. [/usr/share/applications]

In which directory do you want to install the application's icon?
[/usr/share/pixmaps]

Trying to find a suitable vmmon module for your running kernel.

None of the pre-built vmmon modules for VMware Workstation is suitable for your
running kernel. Do you want this program to try to build the vmmon module for
your system (you need to have a C compiler installed on your system)? [yes] y

Using compiler "/usr/bin/gcc". Use environment variable CC to override.

What is the location of the directory of C header files that match your running
kernel? [/lib/modules/2.6.20-15-generic/build/include]

Extracting the sources of the vmmon module.

Building the vmmon module.

Building for VMware Workstation 5.5.0 or 5.5.1.
Using 2.6.x kernel build system.
make: Entering directory `/tmp/vmware-config0/vmmon-only'
make -C /lib/modules/2.6.20-15-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.20-15-generic'
CC [M] /tmp/vmware-config0/vmmon-only/linux/driver.o
CC [M] /tmp/vmware-config0/vmmon-only/linux/hostif.o
CC [M] /tmp/vmware-config0/vmmon-only/common/cpuid.o
CC [M] /tmp/vmware-config0/vmmon-only/common/hash.o
CC [M] /tmp/vmware-config0/vmmon-only/common/memtrack.o
CC [M] /tmp/vmware-config0/vmmon-only/common/phystrack.o
CC [M] /tmp/vmware-config0/vmmon-only/common/task.o
gcc: error trying to exec 'cc1plus': execvp: No such file or directory
make[2]: *** [/tmp/vmware-config0/vmmon-only/common/task.o] Error 1
make[1]: *** [_module_/tmp/vmware-config0/vmmon-only] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.20-15-generic'
make: *** [vmmon.ko] Error 2
make: Leaving directory `/tmp/vmware-config0/vmmon-only'
Unable to build the vmmon module.

For more information on how to troubleshoot module-related problems, please
visit our Web site at "http://www.vmware.com/download/modules/modules.html" and
"http://www.vmware.com/support/reference/linux/prebuilt_modules_linux.html".

Execution aborted.

哎,出错了,编译失败,查看错误消息,是有个文件找不着,搜索一把,原来是没装g++包的原因,OK,装上它吧:
sudo apt-get install g++
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
Reading state information... 完成
将会安装下列额外的软件包:
g++-4.1 libc6-dev libstdc++6-4.1-dev linux-libc-dev
建议安装的软件包:
gcc-4.1-doc lib64stdc++6 glibc-doc manpages-dev libstdc++6-4.1-doc
下列【新】软件包将被安装:
g++ g++-4.1 libc6-dev libstdc++6-4.1-dev linux-libc-dev
共升级了 0 个软件包,新安装了 5 个软件包,要卸载 0 个软件包,有 15 个软件未被升级。
需要下载 7896kB 的软件包。
解压缩后会消耗掉 32.9MB 的额外空间。
您希望继续执行吗?[Y/n]y
获取:1 http://cn.archive.ubuntu.com feisty/main linux-libc-dev 2.6.20-15.27 [664kB]
获取:2 http://cn.archive.ubuntu.com feisty/main libc6-dev 2.5-0ubuntu14 [3018kB]
获取:3 http://cn.archive.ubuntu.com feisty/main libstdc++6-4.1-dev 4.1.2-0ubuntu4 [1632kB]
获取:4 http://cn.archive.ubuntu.com feisty/main g++-4.1 4.1.2-0ubuntu4 [2581kB]
获取:5 http://cn.archive.ubuntu.com feisty/main g++ 4:4.1.2-1ubuntu1 [1428B]
下载 7896kB,耗时 9m2s (14.6kB/s)
选中了曾被取消选择的软件包 linux-libc-dev。
(正在读取数据库 ... 系统当前总共安装有 88121 个文件和目录。)
正在解压缩 linux-libc-dev (从 .../linux-libc-dev_2.6.20-15.27_i386.deb) ...
选中了曾被取消选择的软件包 libc6-dev。
正在解压缩 libc6-dev (从 .../libc6-dev_2.5-0ubuntu14_i386.deb) ...
选中了曾被取消选择的软件包 libstdc++6-4.1-dev。
正在解压缩 libstdc++6-4.1-dev (从 .../libstdc++6-4.1-dev_4.1.2-0ubuntu4_i386.deb) ...
选中了曾被取消选择的软件包 g++-4.1。
正在解压缩 g++-4.1 (从 .../g++-4.1_4.1.2-0ubuntu4_i386.deb) ...
选中了曾被取消选择的软件包 g++。
正在解压缩 g++ (从 .../g++_4%3a4.1.2-1ubuntu1_i386.deb) ...
正在设置 linux-libc-dev (2.6.20-15.27) ...
正在设置 libc6-dev (2.5-0ubuntu14) ...
正在设置 g++-4.1 (4.1.2-0ubuntu4) ...
正在设置 libstdc++6-4.1-dev (4.1.2-0ubuntu4) ...
正在设置 g++ (4.1.2-1ubuntu1) ...


g++安装成功后,再次运行vmware的配置程序:
cd /usr/bin
sudo ./vmware-config.pl
Password:
Making sure services for VMware Workstation are stopped.

Stopping VMware services:
Virtual machine monitor done

Configuring fallback GTK+ 2.4 libraries.

In which directory do you want to install the mime type icons?
[/usr/share/icons]

What directory contains your desktop menu entry files? These files have a
.desktop file extension. [/usr/share/applications]

In which directory do you want to install the application's icon?
[/usr/share/pixmaps]

Trying to find a suitable vmmon module for your running kernel.

None of the pre-built vmmon modules for VMware Workstation is suitable for your
running kernel. Do you want this program to try to build the vmmon module for
your system (you need to have a C compiler installed on your system)? [yes] y

Using compiler "/usr/bin/gcc". Use environment variable CC to override.

What is the location of the directory of C header files that match your running
kernel? [/lib/modules/2.6.20-15-generic/build/include]

Extracting the sources of the vmmon module.

Building the vmmon module.

Building for VMware Workstation 5.5.0 or 5.5.1.
Using 2.6.x kernel build system.
make: Entering directory `/tmp/vmware-config1/vmmon-only'
make -C /lib/modules/2.6.20-15-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.20-15-generic'
CC [M] /tmp/vmware-config1/vmmon-only/linux/driver.o
CC [M] /tmp/vmware-config1/vmmon-only/linux/hostif.o
CC [M] /tmp/vmware-config1/vmmon-only/common/cpuid.o
CC [M] /tmp/vmware-config1/vmmon-only/common/hash.o
CC [M] /tmp/vmware-config1/vmmon-only/common/memtrack.o
CC [M] /tmp/vmware-config1/vmmon-only/common/phystrack.o
CC [M] /tmp/vmware-config1/vmmon-only/common/task.o
cc1plus: warning: command line option "-Wdeclaration-after-statement" is valid for C/ObjC but not for C++
cc1plus: warning: command line option "-Wno-pointer-sign" is valid for C/ObjC but not for C++
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
cc1plus: warning: command line option "-ffreestanding" is valid for C/ObjC but not for C++
/tmp/vmware-config1/vmmon-only/common/task_compat.h: In function ‘int Vmx86_RunVM(VMCrossPage*, VMDriver*) [with VMCrossPage = VMCrossPageV321]’:
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1522: warning: ‘sysenterState.SysenterStateV45::rsp’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1523: warning: ‘sysenterState.SysenterStateV45::rip’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h: In function ‘int Vmx86_RunVM(VMCrossPage*, VMDriver*) [with VMCrossPage = VMCrossPageV3]’:
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1522: warning: ‘sysenterState.SysenterStateV45::rsp’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1523: warning: ‘sysenterState.SysenterStateV45::rip’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h: In function ‘int Vmx86_RunVM(VMCrossPage*, VMDriver*) [with VMCrossPage = VMCrossPageGSX1]’:
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1522: warning: ‘sysenterState.SysenterStateV45::rsp’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1523: warning: ‘sysenterState.SysenterStateV45::rip’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h: In function ‘int Vmx86_RunVM(VMCrossPage*, VMDriver*) [with VMCrossPage = VMCrossPageV2]’:
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1522: warning: ‘sysenterState.SysenterStateV45::rsp’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1523: warning: ‘sysenterState.SysenterStateV45::rip’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h: In function ‘int Vmx86_RunVM_V4(VMDriver*, Vcpuid) [with VMCrossPage = VMCrossPageV4]’:
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::rsp’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::rip’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h: In function ‘int Vmx86_RunVM(VMDriver*, Vcpuid)’:
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1522: warning: ‘sysenterState.SysenterStateV45::rsp’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1523: warning: ‘sysenterState.SysenterStateV45::rip’ is used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::rsp’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::rip’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::rsp’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:2073: warning: ‘sysenterState.SysenterStateV45::rip’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h: In function ‘void Task_Switch_V45(VMDriver*, Vcpuid)’:
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1713: warning: ‘sysenterState.SysenterStateV45::validEIP’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1713: warning: ‘sysenterState.SysenterStateV45::cs’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1713: warning: ‘sysenterState.SysenterStateV45::rsp’ may be used uninitialized in this function
/tmp/vmware-config1/vmmon-only/common/task_compat.h:1713: warning: ‘sysenterState.SysenterStateV45::rip’ may be used uninitialized in this function
CC [M] /tmp/vmware-config1/vmmon-only/common/vmx86.o
CC [M] /tmp/vmware-config1/vmmon-only/vmcore/compat.o
CC [M] /tmp/vmware-config1/vmmon-only/vmcore/moduleloop.o
LD [M] /tmp/vmware-config1/vmmon-only/vmmon.o
Building modules, stage 2.
MODPOST 1 modules
CC /tmp/vmware-config1/vmmon-only/vmmon.mod.o
LD [M] /tmp/vmware-config1/vmmon-only/vmmon.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.20-15-generic'
cp -f vmmon.ko ./../vmmon.o
make: Leaving directory `/tmp/vmware-config1/vmmon-only'
The module loads perfectly in the running kernel.

Do you want networking for your virtual machines? (yes/no/help) [yes] y

Configuring a bridged network for vmnet0.

Your computer has multiple ethernet network interfaces available: eth0, eth1,
eth0:avah. Which one do you want to bridge to vmnet0? [eth0] eth1

The following bridged networks have been defined:

. vmnet0 is bridged to eth1

Do you wish to configure another bridged network? (yes/no) [no] n

Do you want to be able to use NAT networking in your virtual machines? (yes/no)
[yes] n

Do you want to be able to use host-only networking in your virtual machines?
[no] y

Configuring a host-only network for vmnet1.

Do you want this program to probe for an unused private subnet? (yes/no/help)
[yes] help

Virtual machines configured to use host-only networking are placed on a virtual
network that is confined to this host. Virtual machines on this network can
communicate with each other and the host, but no one else.

To setup this host-only networking you need to select a network number that is
normally unreachable from the host. We can automatically select this number for
you, or you can specify a network number that you want.

The automatic selection process works by testing a series of Class C subnet
numbers to see if they are reachable from the host. The first one that is
unreachable is used. The subnet numbers are chosen from the private network
numbers specified by the Internet Engineering Task Force (IETF) in RFC 1918
(http://www.isi.edu/in-notes/rfc1918.txt).

Remember that the host-only network that virtual machines reside on will not be
accessible outside the host machine. This means that it is OK to use the same
number on different systems so long as you do not enable communication between
these networks.

Do you want this program to probe for an unused private subnet? (yes/no/help)
[yes] y

Probing for an unused private subnet (this can take some time)...

The subnet 192.168.45.0/255.255.255.0 appears to be unused.

The following host-only networks have been defined:

. vmnet1 is a host-only network on private subnet 192.168.45.0.

Do you wish to configure another host-only network? (yes/no) [no] n

Extracting the sources of the vmnet module.

Building the vmnet module.

Building for VMware Workstation 5.5.0 or 5.5.1.
Using 2.6.x kernel build system.
make: Entering directory `/tmp/vmware-config1/vmnet-only'
make -C /lib/modules/2.6.20-15-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.20-15-generic'
CC [M] /tmp/vmware-config1/vmnet-only/driver.o
CC [M] /tmp/vmware-config1/vmnet-only/hub.o
CC [M] /tmp/vmware-config1/vmnet-only/userif.o
CC [M] /tmp/vmware-config1/vmnet-only/netif.o
CC [M] /tmp/vmware-config1/vmnet-only/bridge.o
CC [M] /tmp/vmware-config1/vmnet-only/procfs.o
CC [M] /tmp/vmware-config1/vmnet-only/smac_compat.o
CC [M] /tmp/vmware-config1/vmnet-only/smac_linux.x386.o
LD [M] /tmp/vmware-config1/vmnet-only/vmnet.o
Building modules, stage 2.
MODPOST 1 modules
CC /tmp/vmware-config1/vmnet-only/vmnet.mod.o
LD [M] /tmp/vmware-config1/vmnet-only/vmnet.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.20-15-generic'
cp -f vmnet.ko ./../vmnet.o
make: Leaving directory `/tmp/vmware-config1/vmnet-only'
The module loads perfectly in the running kernel.

Starting VMware services:
Virtual machine monitor done
Virtual ethernet done
Bridged networking on /dev/vmnet0 done
Host-only networking on /dev/vmnet1 (background) done

The configuration of VMware Workstation 5.5.1 build-19175 for Linux for this
running kernel completed successfully.

You can now run VMware Workstation by invoking the following command:
"/usr/bin/vmware".

Enjoy,

--the VMware team


这次顺利地完成了!
运行/usr/bin/vmware
终于,期待已久的vmware窗口出来了。马上打开,却发现打开对话框中没有NTFS的盘,可能是系统不支持读写的原因吧,那就复制到Home吧,OK,我的Windows98出来了,呵呵,强啊,文件格式与Windows下的一样,虚拟机文件直接拿来就可以跑了。

初用Ubuntu 7.04 --安装Skype

初用Ubuntu,什么也不会,但是桌面系统吧,傻瓜式的就按Windows的操作经验来乱试,遇到什么问题,通过Google来解决,也不必太深入,将过程记下来,作备忘吧。
-----------------------------------------------------------------------------

装完系统后,在应用程序(Application)的Internet菜单中,Gaim程序,可以登录MSN,QQ,ICQ等等,基本上比较流行的聊天软件都有了,但没有Skype,于是我上网去下载。在Skype的官方网站,For Linux的下载列表中,没有For Ubuntu的,通过Google,得到了For Debian的下载地址(Ubuntu是基于Debian内核的。
下载地址:http://www.skype.com/go/getskype-linux-deb

下载完成后,进行安装,后面所跟的文件名,以实际下载后的文件名为准。

sudo dpkg -i ./skype_debian-1.3.0.53-1_i386.deb
Password:
选中了曾被取消选择的软件包 skype。
(正在读取数据库 ... 系统当前总共安装有 88037 个文件和目录。)
正在解压缩 skype (从 .../skype_debian-1.3.0.53-1_i386.deb) ...
dpkg:依赖关系问题使得 skype 的配置工作不能继续:
skype 依赖于 libqt3-mt | libqt3c102-mt (>= 3:3.3.3.2);然而:
未曾安装软件包“libqt3-mt”。
未曾安装软件包“libqt3c102-mt”。
dpkg:处理 skype (--install)时出错:
依赖关系问题 - 仍未被配置
在处理时有错误发生:
skype

以上,郁闷,缺少依赖包,但我不知道怎么安装依赖包,我试着输入命令:
sudo apt-get -install libqt3-mt
但是出错了,折腾了半天也没成功,于是上网去搜索,有人提醒说,直接下载动态或是静态的二进制包即可,于是下载了静态包,解压后,直接运行,OK。

本来这事,到这也就结了,但我发现,打开Update Manager出错了!提示输入命令进行修复。

sudo apt-get install -f
Password:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
Reading state information... 完成
正在更正依赖关系... 完成
将会安装下列额外的软件包:
libqt3-mt
建议安装的软件包:
libqt3-mt-psql libqt3-mt-mysql libqt3-mt-odbc
下列【新】软件包将被安装:
libqt3-mt
共升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 15 个软件未被升级。
有 1 个软件包没有被完全安装或卸载。
需要下载 3299kB 的软件包。
解压缩后会消耗掉 9130kB 的额外空间。
您希望继续执行吗?[Y/n]y
获取:1 http://cn.archive.ubuntu.com feisty/main libqt3-mt 3:3.3.8really3.3.7-0ubuntu5 [3299kB]
下载 3299kB,耗时 1m31s (36.1kB/s)
选中了曾被取消选择的软件包 libqt3-mt。
(正在读取数据库 ... 系统当前总共安装有 88088 个文件和目录。)
正在解压缩 libqt3-mt (从 .../libqt3-mt_3%3a3.3.8really3.3.7-0ubuntu5_i386.deb) ...
正在设置 libqt3-mt (3.3.8really3.3.7-0ubuntu5) ...

正在设置 skype (1.3.0.53-1) ...

呵呵,系统自动帮我安装了我想装但没装上的依赖包libqt3-mt,还智能地修复了skype,这时,到菜单里,发现Internet中多了Skype,OK,不要静态包了:-)

初用Ubuntu 7.04 --安装截图软件scrot

初用Ubuntu,什么也不会,但是桌面系统吧,傻瓜式的就按Windows的操作经验来乱试,遇到什么问题,通过Google来解决,也不必太深入,将过程记下来,作备忘吧。

相关博客文章:http://www.fwolf.com/blog/post/215
-----------------------------------------------------------------------------

在Ubuntu中,桌面系统自带有截图功能,只要按PrintScreen功能键,就可以保存整个屏幕,也可以按Alt+PrintScreen组合键,保存当前激活的窗口,操作与Windows的一样,只不过,Windows中复制到剪贴板中,而Ubuntu则是直接跳出保存对话框。
但是,比如我要将输入汉字时,输入法的提示栏给保存下来,用上面的办法就不行,我只要按下键盘,输入法提示栏就自动消失了,没办法,找个专业户来干这事吧。
通过Google搜索,我选择了Scrot,正如这位博客说的:“还有其他的几个截图软件,比如SnapALL,但毕竟不如apt中有的scrot方便呀。”,具体的就不多说了,参考这个博客的文章。
我装好以后,在命令行输入scrot -d 3,命令行会停留在那里,进行计时,并截图,我赶紧切换到文档编辑器,输入汉字,呵呵,好像3秒太少了点,可能是我的手脚太慢了吧:-)





在将这款软件加到菜单时,我没找到这位博客所说的“Alacarte Menu Editor”,或许是版本不同,叫法不同吧。我是在System菜单下,选择首选项中的“Main Menu"来添加的,请参考图片,点击New Item来追加。

初用Ubuntu 7.04 -- 安装五笔输入法


初用Ubuntu,什么也不会,但是桌面系统吧,傻瓜式的就按Windows的操作经验来乱试,遇到什么问题,通过Google来解决,也不必太深入,将过程记下来,作备忘吧。

小企鹅输入法官方网站:http://www.fcitx.org/
---------------------------------------------------------------------------

装完了Ubuntu后,桌面的操作体验不错,打开/移动窗口比较流畅,不像前几年装的Linux,在Gnome下,窗口操作那是明显的迟滞感,很不爽,现在终于爽了一把:-),不知道是不是我那时没装显卡驱动的原因,不过现在我也没装,不知道这个系统认不认我的ATI显卡。反正我在硬件信息里是没找着。

上网,用FireFox,桌面顶上的系统栏上那个明显的大大的FF图标,一点即可。嘿嘿,我用的是无线上网,系统安装完毕,已经帮我找到可用的无线网络了,我只要输入访问密码即可。但问题来了,我没办法输入汉字,虽然我习惯使用五笔,可是连拼音也没有!!!看来得想办法了。
Google吧(没装汉字输入法,所以搜索时,只好用汉语拼音,再将对应的汉字复制出来,重新搜一把),找到一个:http://softbbs.pconline.com.cn/topic.jsp?tid=6992788&lastUpdate=04-27.19:33
但是,不知道是版本问题还是怎么地,我打开的SCIM输入法设置界面,是全E文的,试了好多次,也没有成功,只好作罢,另想办法了。
再次Google,我选择了Fcitx这个输入法,安装比较简单:

sudo apt-get install fcitx
sudo sh -c " echo 'export XMODIFIERS=@im=fcitx ; export GTK_IM_MODULE="fcitx" ; fcitx ' > /etc/X11/Xsession.d/95xinput "
sudo chmod +rwxXst /etc/X11/Xsession.d/95xinput

输入以上三条命令后,注销系统后,重新登录,在屏幕的上中部,就出来这个可爱的输入法了,切换使用Ctrl+Space,还支持拼音,五笔等,好,终于可以写汉字了。

我们来看一下,这些命令具体代表什么意思:
1. sudo,每条命令里,都有这个词,以前我知道在Linux中有个su的命令,作用是暂时转到root帐号下,进行系统管理,那顾名思义,这个应该就是转到管理员帐号,并执行某个命令了。
2. apt-get install fcitx,这个也能猜到,应该是从Ubuntu网站上取得fcitx这个软件,并安装。
3. sh -c ..... 这条命令就不清楚了,只知道sh是shell,类似于Windows下的Command.com/Cmd.com,是命令行程序。感觉似乎是打印(echo)一行文本,通过管导符>,输出到一个文件中,这应该是修改系统输入法的配置文件吧,追加新安装的输入法,以便系统启动时,自动加载。
4. chmod,这一句的意图应该是修改配置文件的可访问权限,至于为什么要修改,就不明白了,难道输入法fcitx,在当前用户(非管理员)的环境下,要访问这个文件?

其中,最后一条命令,网上搜索来的,其实是:
sudo chmod +755 /etc/X11/Xsession.d/95xinput
在Ubuntu中,模式值,似乎不再支持使用数字,而改用表义字母了,嗯,相对要人性化了一点(在文件浏览器中,好象也可以设置,那是全图形化的,更傻瓜式),我也不知道755代表什么,也懒得查,只想早点把输入法搞定,所以,当命令行提示:

chmod: invalid mode: `+755'
Try `chmod --help' for more information.

那我就Try吧:

$ chmod --help
Usage: chmod [OPTION]... MODE[,MODE]... FILE...
or: chmod [OPTION]... OCTAL-MODE FILE...
or: chmod [OPTION]... --reference=RFILE FILE...
Change the mode of each FILE to MODE.

-c, --changes like verbose but report only when a change is made
--no-preserve-root do not treat `/' specially (the default)
--preserve-root fail to operate recursively on `/'
-f, --silent, --quiet suppress most error messages
-v, --verbose output a diagnostic for every file processed
--reference=RFILE use RFILE's mode instead of MODE values
-R, --recursive change files and directories recursively
--help display this help and exit
--version output version information and exit

Each MODE is of the form `[ugoa]*([-+=]([rwxXst]*|[ugo]))+'.

Report bugs to .


看到粗体部分了?不管他,全加上吧:-)

安装Ubuntu 7.04


Ubuntu 7.04发布了,想看看怎么样,于是上网下了最新的Desktop的映象文件,大概700M多一点。
我的机器是Sony S16的本本,512M内存,原来的系统是Windows XP Pro,装了Vmware5.5,加载安装CD后,顺利进入了Live CD的桌面,感觉界面挺爽的,越来越接近Windows的操作体验了。
但是,在VM中,我点击安装,系统却失去了响应,好几次都是这样,也没去网上找原因,心想,这系统看上去挺不错的,算了,直接拿来换掉Windows XP吧。
要直接安装Ubuntu,我首先将ISO文件刻录成光盘(没有CD盘,用了张DVD,有点浪费:-),用光盘启动后,在安装过程中,选择手动分区(我有两个NTFS分区,一个是原XP系统盘,一个是数据盘,数据当然不想丢掉),删除原系统分区,新建一个800M的SWAP,其余全挂载到/。安装非常顺利,重新启动后,进入系统,漂亮!

2007-04-30

玉环的丧葬习俗

前些日子,外公去世,回家为他送葬。虽然并不是第一次送葬,但也还是不太清楚祖辈相传的送葬习俗。

我老家在玉环岛上,由于旧朝曾海禁,所以现居民,算是彻底的移民了,岛上据说现还有六种方言,我所知道的有五种,是:太平话,平洋话,坎门话,温州话,“新会话”(音,不知道是否是这两个字),我外公家是说平洋话的,我们家则是说太平话的,平洋话,我只能听说简单的话。由于语言多样,在县城,商店或大街上,说普通话比较普遍,没有其它地方,那种不说方言,明显地有被看作外地人的情况(歧视总是无处不在)。同样,大家来自不同的地方,丧葬习俗也不尽相同,但大体上,我猜应该可分为港北与港南两片(楚门半岛及芦浦镇为港北,我家在芦浦,虽然是在岛上,但也还是隶属于港北,不知道是地理原因还是其它,如移民的来源)。

我家祖上听说是从福建迁移来的,分为两支,一支在乐清。每逢清明,还会互相来往,一年一聚,交替为两处扫墓。我曾经在网上查了江姓的出处,一支在北方,一支则是从广东来的,而后者的可能较大。

我回家时,外公已经火化,下葬的日子则定有三月初十。期间,请了道士做道场,父亲与母亲对我说,他们在初九这一天,要为外公“开火光”(音,不知道具体含义,但大概是请人超度灵魂的意思吧),要我去帮忙。而事实上,也帮不上什么忙,只是和哥哥去买了一头“梅头纸”(音)而已。“梅头纸”还挺有讲究,要以五张一包,包好之后,还要加印些东西。这些,还专门有长者指导。另外,就是为道士和相帮的人,作点心,方言称“脚力”(音),一般家里请各种手艺人,在下午三点左右,都要准备的(如木匠,泥水匠,油漆匠等)。以前多为炒面,或是汤年糕。

出殡的时辰是九点钟,但实际是九点半了,这是以时辰计的,八字中的时辰是十二地支,一个时辰相当于现在的两个小时。时辰到了后,孝子孝孙围跪在棺前,由长者盖棺。盖棺者,抓一把米撒在一角,拿一木榫在骨灰盒上作势一击,依次钉完四角后,孝子孝孙起身围棺转三次后出发。走在最前面的是两名手执铜锣的人,引领大家前往墓地。其后是长孙手棒遗像,头顶麻绳结成的圈,之后是香炉盏,内为牌位,再是棺椁,后随子女及其它送行的亲戚好友。另前有洋鼓洋号,后有道士的丝竹鼓乐,一路上鞭炮声不断。行进的路线一般是绕乡一圈,若遇上有桥梁,子女则要分跪两边。到达墓地后,子女在墓前顺逆三圈,此时下葬并封口。然后大家将白布换成红布下山按原路线返回。






玉环的礼仪习俗——丧葬
http://culture.zjol.com.cn/05culture/system/2006/01/11/006438331.shtml

www.zjol.com.cn  2006年01月11日  浙江在线新闻网站

送终、守尸

病人临死,家人围床前焚香跪拜、哭泣、呼叫,守候断气,旧俗称“送终”。人死,将尸体移到中堂,放在门板上,俗称“板头”,待入殓。用金属钱币向井神“买水”,为死者沐身;于脚头下由孝子站凳上“当着老天爷的面”,用无锤秤称寿衣,声明亲人缝制,然后为死者“穿”寿衣。塞铜钱一枚于死者口,称“含口钱”。并将死者生前被、枕、褥等一应“脚尾货”搬屋外。男尸须理发,剃前不剃后,取意“留后”;女尸须梳头、挽髻,不使披散。女婿要送“寿被”。

死于海损的渔人,一般不入居屋,在海边岙口搭“收尸寮”。

报丧

家人按死者生辰八字择大、小殓及发葬日,以黄榜写明,附属肖避忌,贴于门口或显目墙角,并奔告戚友。近年渐改用“讣告”。眷属在外,不论远近,即赶赴。

入殓

俗称“落材”、“敲钉”。材内铺石灰、木炭、材席、冥纸等。闽籍及坎门一地风俗,仵作以白布条放尸入棺,抽回依序分给孝男女,俗称“腰白”。然后垫瓦片、黄土于头顶,脚尾,撮黄土撒死者腹部,盖上“水被”。盖棺时虚按三枚木制镶嵌式“元宝钉”,留一枚交长子收藏,称“小殓”。男女跪地哭嚎,大呼“留丁、留财”。

发葬前,以素馔祭祀,亲友皆素服跪拜。然后“敲钉”、封棺,亲友憾嚎,称“大殓”。

港北太平籍人程式较简单。殓尸后,移棺到户外,称“码棺”。晚上棺前点“脚头灯”。

出殡

移棺至当路,套以材罩,子孙挟死者生前席枕等至僻处烧化后,各持香巡棺。出殡时,扛棺人踢倒搁棺板凳。走三步停一停,反复三次方开步。子孙披麻,戴“三梁冠”,挽灵柩。亲友或披麻穿白衣,或以丧家分给白布系臂,或佩黑臂圈,相随送殡。队列前有一人引路放纸锞,后有开路锣、彩旗、头牌、花圈、遗容、魂轿、香亭、细软乐队等。近年在城镇,有用自行车、摩托车开路,鞭炮狂放,洋号吹时乐等奢费,经劝导,稍敛。

港南出葬通常由子女的友人、同事扛棺,一路直奔墓地。港北则雇请力作,可随时以拄木拄棺杠,歇歇气再走。路遇祠、庙、桥、路廊,孝子跪地请神放行,南北皆然。

安葬

至墓地,后人憾嚎,悲天怆地,锣声齐鸣。按头内脚外推棺进坟圹。抽出垫在圹地上便于推滑棺木的竹片,在墓前点烘炉炭火,由长子一手提炭火,一手拖竹片,称“拖怜愁竹”。子媳按序提灯,称“引丁”。一行送葬人等原路回门,留造坟泥工封坟门。以酒馔宴戚友及一应帮工。

坟圹

本地兴墓葬。墓地选择,取坐北朝南高燥山地。动工时要分麻糍、方糕,称“发坟”。挖山坎构筑为“草墓”,浮地构筑为“浮墓”。通常以砖石为廊,底面捣灰或铺砖石。上盖拱形大墓砖,再披以泥灰。以夫妻合葬双圹坟墓居多。早时有多圹圈椅式大墓,依山成斜坡形,50年代后不兴建。为未亡人造坟称为“做生坟”或 “做寿坟”。坟圹前刻勒“福”“寿”或“禄”字样,未葬人用红漆添写,已葬人用黑漆涂之,以示区别。近年局部出现方石廓等豪华墓所,砌以围墙,镂石雕花,装修华丽,耗资极多。

做七及忌日

于中堂设灵,供羹饭。以死后每七日为一“七”,闽籍人称“做巡”。至七七撤灵,脱麻孝,诵经、安土、题木主。期内孝子不理发。周年悼念称“对年”;二足年脱素换红,称“三年满”。超度拜忏之“开火光”,可在“做七”期内或三年满前做。以后以死日为忌日,每年逢忌日悼念,谓之“做忌”。

以上所因袭之旧葬俗,各地略异。从50年代起,政府多次倡行丧葬事简办新办。民间逐步用追悼会取代吊孝,用遗像取代木主牌位。亲友吊唁,赠花圈,戴黑纱。丧葬中迷信活动大都革除,僻处仍行。近已推行火葬,并始建公墓。

其他葬俗

招潮魂 旧时海损事故屡发,尸不能还。家属在海滩岙口为死者招魂,以衣冠履草人或一并烧化取灰入甏,至“墓所”,葬之。

甏葬 将散葬各处多年族人启坟收骨殖,各装入甏坛重葬一处。港南渔乡50年代前较多见。



来源: 浙江在线-玉环网  作者:

2007-04-10

传入时间字符串,返回与系统当前时间的毫秒差值

做Windows service,要从配置文件读取定时处理时间,再取得与当前时间的差,设置处理定时器。下面的函数是为了完成取差值。传入的参数格式是:"HH:MM:SS",秒数可省:"HH:MM",各数值为00~99的数值,表示从零时后多少小时,又多少分,又多少秒,与报时用的时间有别。
        Private Function GetTimeOffset(ByVal strTime As String) As Double
            Dim objReg As New Regex("(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?")
            Dim objMatch As Match
            Dim objLanuch As TimeSpan
            Dim objOffsetSpan As TimeSpan

            If Not objReg.IsMatch(strTime) Then
                Return -1
            End If

            objMatch = objReg.Match(strTime)

            If String.Empty.Equals(objMatch.Groups(3).Value) Then
                objLanuch = New TimeSpan(Integer.Parse(objMatch.Groups(1).Value), _
                    Integer.Parse(objMatch.Groups(2).Value), _
                    0)
            Else
                objLanuch = New TimeSpan(Integer.Parse(objMatch.Groups(1).Value), _
                    Integer.Parse(objMatch.Groups(2).Value), _
                    Integer.Parse(objMatch.Groups(3).Value))
            End If

            objOffsetSpan = objLanuch.Subtract(DateTime.Now.TimeOfDay)
            If objOffsetSpan.TotalMilliseconds <= 0 Then
                objOffsetSpan = objOffsetSpan.Add(New TimeSpan(1, 0, 0, 0))
            End If

            Return objOffsetSpan.TotalMilliseconds
        End Function

如何调试Windows service的onStart()方法

一般来说,启动Windows service后,创建定时器,定时调用处理过程。调试定时处理过程时,挂载到服务进程,再等待定时器被激发后,IDE会停在断点,进行单步跟踪调试。但想对onStart()进行调试却比较困难,因为等我们完成挂载时,onStart()已经执行完毕了。所以,首先要想办法让onStart()慢点执行,以便我们在服务启动并执行到断点前,有足够的时间来挂载调试器。要实现这个功能,最简单的就是让程序在断点前,暂停一段时间。我们可以追回一句:
System.Threading.Thread.Sleep(10000)
Sleep()的参数是毫秒,这里是暂停10秒,应该有足够的时间,让我们从容挂载调试器。
要注意的是,从管理控制台,点启动服务时,就马上去IDE的TOOL菜单下挂载调试器,而不是等服务启动完成。服务是在onStart()执行完毕后,才完成启动的,那时再去挂载,就为时已晚了。这点我们可以修改暂停时间来证明,如果时间设得越长,则服务器动时,那个等待进度条走得就越慢。

.Net2.0下,Windows Service程序Log无法输出的问题

这两天遇到了这个问题,最后发现,是路径的问题。
以下是我的配置:
<system.diagnostics>
<sources>
<source name="DefaultSource" switchname="DefaultSwitch">
<listeners>
<add name="FileLogListener">
<!--<add name="EventLog">-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information">
</switches>
<sharedlisteners>
<add name="FileLogListener"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
initializeData="FileLogListenerWriter"
location="Custom"
customlocation="LOG\" />

<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializedata="APPLICATION_NAME"> -->
</sharedlisteners>
</system.diagnostics>
其中,红色部分为LOG输出路径,我写的是相对路径。
运行Windows Service后,我在EXE所在路径下去检查LOG文件,但不存在。这使我误以为在Windows service下无法使用my.Application.Log,为解决这个问题走了很多弯路。后来,查了MSDN,上面明确提到支持Windows service,而且配置文件,除了使用绝对路径外,其它都相同。于是我也改成绝对路径,测试后发现,确实能输出LOG。
那为什么用相对路径无法输出呢?还是输出到其它路径下去了?
我运行Process Explorer查看windows service进程,发现它打开了文件:%SystemRoot%\system32\LOG\myService.log
这样看来,当采用相对路径时,输出目录是相对于程序的工作目录,而不是可执行文件所在目录。一般的windows application的工作目录,与可执行文件所在目录一致,而windows service由于是系统目录system32下的svchost.exe加载的,它的工作目录也就成了系统目录system32。

2007-04-07

喜欢Wii的理由

最近,公司里放了台WII来给大家玩,玩过后,感觉确实不错(公司的出发点是,我们在电脑前坐太多了,用以适当运动一下),所以也想拿一台,上网查了后,看到一篇《Wii真的如此理想?炮轰Wii的五大盲区》,也想说说自己的想法。
其实整篇文章就动作捕捉的精确度这一点外,其它的讨论并无意义。按我个人来说,选择它的理由是,这款机子有健身器的作用,却多了乐趣,又有游戏机的功能,多了健身。象我们这些PG,一天>8小时的面对电脑,本身就缺少运动,难道还要坚持坐着动动手指去玩普通游戏手柄的游戏?选择它,要的就是运动后的那种疲劳感,每天一两个小时最多了,却能得到非常好的放松工作心情与锻炼。我是不认同那种玩游戏,可以做在电脑前n小时的“专业”玩家,这样玩下来,身体吃得消吗?我身边就有个朋友,为了玩游戏,经常是黑白颠倒。玩游戏,也是要健康的。
现在的家庭,一般都有游戏机,我想,若父母知道有这么一款健康的游戏,肯定会成为首选。

2007-04-01

做了个特殊字符查看网页

今天完成了特殊字符查看网页,并上传到了googlepage上:http://lingsmm.googlepages.com/char.html

显示的内容主要有从MSDN中来的三份特殊字符表,以及从EXCEL的插入字符中选取的中文特殊字符,另外,若选择“User Defined Font“,则可以对扩展ASCII (0~255) 的字符选择显示字体(也可以手工输入其它字体),如常用的Webdings字体。但遗憾的是,在FF2.0.0.1中测试发现,使用style.fontFamily来指定Webdings字体,无法正常显示特殊符号,所以只好使用已经过时的<font face="Webdings">来进行设置。由于此标签在XHTML1.0中,已经被废弃,所以不能在网页头上加 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 否则不能正常显示特殊字符。按我猜想,FF之所以不支持,可能是由于unicode中,已经或将要包含这些符号吧。

由于要包含中文的一些特殊字符,所以网页的字符集,采用了unicode,可能有些字符编码,甚至已经超出了utf-8字符集(没有确认过)

在这个网页的制作过程中,为了同时支持IE6与FF2,写Javascript颇费工夫,不断的冒出问题,做得很不顺利,还好,终于完成了:-)
另外,从网上看到说用CSS,也能实现圆角矩形,不禁试用了一下,感觉不错。

2007-03-30

使用CSS实现圆角

下面网站,专门帮你制作CSS样式,实现团角矩形的效果:
http://www.spiffycorners.com/

2007-03-24

看完了没一个能活下的,都笑死了 !

看完了没一个能活下的,都笑死了 !

  今天是我的生日,女友早早地打来电话说晚上要到家里去为我祝贺生 日,还要带给我惊喜!听了这个好消息,我今天工作起来是格外买力,一下跑了十几个客户!回到公司,都下午三点了,到食堂一看,只剩下可怜巴巴的一菜一汤 了,肉炒三豆(肉炒黄豆、青豆、豌豆)和萝卜汤。没办法,跑了一上午客户,肚子早就咕咕地叫了,只好要了一大盘肉炒三豆和一大盆萝卜汤,吃了起来!没想到 临下班了,我的肚子里就像一台越野吉普的发动机--开始了剧烈的活塞运动!刹那间,一股股气体来势争先恐后地从我的体内冲了出来!我赶紧冲到没人的地方, 肚子开始还是不好意思地轻声吟唱,但马上就变成了连珠炮似的噗噗做响!肚子好涨呀!而正在这时,女友却打来电话,说她已经到家了,叫我赶紧回家。唉!没办 法只好回家去了,希望她不会看见我这幅狼狈样呀!……

  在回家的路上我刻意努力地放了很多的屁。快到家了,肚子好受了很多,我觉得应该不会再出什么问题了。远远就看到了在门边等着我的女友,她看起来有点兴奋。她大叫着说,“亲爱的,今晚,我为你准备了一份非常奇妙的、一定会让你大吃一惊的礼物。”

  还没进门,女友就用一块布把我的眼睛紧紧蒙了起来,说是要给我一个惊喜!还领着我坐到位于餐桌前头的椅子里,并且让我发誓不会偷看。突然,我感到又想 放屁了。恰恰就在这时,女友的手机响了。这可救了我的命了!我找借口说嫌乱让她到另一间屋子里去接电话!她却非让我不能揭开蒙着眼睛的布,还让我发誓!之 后才跑去另一间屋子里接电话。她一离开,我就抓紧时机,把全身的重量都移到一条腿上,把屁放了出来。这个屁放得不仅声音很大,而且气味就象是腐臭的鸡蛋散 发出的臭味。我几乎不能呼吸,因此我摸到椅垫,使劲的向四周扇着,妄图扇掉这难闻的气味。

  就在我刚感觉好一点的时候,另一个屁又来了。我又抬起腿开始放!它听起来就象是柴油发动机快速转动的声音,而且这一次气味更难闻了。为了不让自己窒息,我用胳膊挥舞着椅垫扇了起来,希望气味会尽快散掉。

  又是在一切将要恢复正常的时候,另一个屁又迫不及待地冲来了。于是我站起来,弯下腰,把屁股向后上方撅了起来!把它放了出来。这个屁放得真正称得上是一流,连身后的报纸都被吹散到了地下..........

  我侧耳倾听另一间屋子里女友交谈的声音,因为要遵守不偷看的诺言,我也不敢打开眼罩,只能在漆黑中不断放着屁,为了赶快把肚子中的气体全部排出,又不 使屋里变得更臭!我解开了裤腰带,把内裤和长裤褪到了小腹以下,把屁股露了出来,并摸索着打开了身后阳台的门,几乎是将整个屁股都伸到阳台上,开始疯狂地 放起屁来……,啊!好受多了!之后,我又手舞足蹈地用椅垫满屋乱扇,祈祷这股恶臭能赶快散去……,就这样,在接下来的十几分钟以内,我一边不断地放着屁, 一边不断地扇着椅垫,终于,当我听到她在电话里说再见的时候,屋里的空气和我的肚子都已经好多了!我迅速地系上裤子,整理了一下头发,开始优雅地、微笑着 等着我亲爱的她来带给我惊喜。

  当她走近的时候,我脸上带着满足地微笑,一付温存的样子。女友首先为她打了这么长时间的电话向我道了歉,然后问我有没有偷偷掀开过布。在我向她保证没 有偷看之后,女友移走了遮在我眼睛上的布,并对我说道,“意外吧!我的女友今天非让我带她们来看看你,她们说你在照片上很有风度,人长的很帅!喏!你看, 坐在桌前的这五位都是我单位里的好姐妹,而站在阳台上的那六位是我上学时最要好的朋友!”

  这时,我才极为震惊和恐惧地发现,有一大堆女孩正围坐在我对面的餐桌边,而身后的阳台上则站着另一堆,她们都是来参加这个令我感到非常意外的生日宴会的。现在,她们每个人脸上都带着一种无法言表的表情看着我,就像发现了火星人………………

一览画面控制用JS代码


代码:

var ie = (document.all &&amp;amp;amp;amp; typeof(ActiveXObject) != "undefined");
var _className = ie ? "className" : "class";

function showHide(objID)
{
var obj = document.getElementById(objID);
if (obj)
{
obj.style.display = obj.style.display=="none" ? "" : "none";
}
}

function clearInput(objID)
{
if (!confirm("Are you sure?"))
{
return;
}
var obj = document.getElementById(objID);
if (obj)
{
var inputList = obj.getElementsByTagName("INPUT");
if (inputList)
{
for(var i=0; i
{
if (inputList[i].getAttribute("TYPE")=="text")
{
inputList[i].value = "";
}
}
}
}
}

function selectCheckbox(tableID, value)
{
var table = document.getElementById(tableID);
if (table)
{
var inputList = table.getElementsByTagName("INPUT");
if (inputList)
{
for(var i=0; i
{
if (inputList[i].getAttribute("TYPE")=="checkbox")
{
if (inputList[i].checked != value)
{
inputList[i].checked = value;
checkboxClick(inputList[i]);
}
}
}
}
}
}

function deleteConfirm(tableID)
{
var isSelected = false;
var table = document.getElementById(tableID);
if (table)
{
var inputList = table.getElementsByTagName("INPUT");
if (inputList)
{
for(var i=0; i
{
if (inputList[i].getAttribute("TYPE")=="checkbox")
{
if (inputList[i].checked)
{
isSelected = true;
break;
}
}
}
}
}

if (isSelected)
{
return confirm("Are you sure?\r\nThat will delete all the selected rows.");
}
else
{
alert("No rows selected.");
return false;
}
}

function checkboxClick(checkbox)
{
var tr = checkbox.parentNode.parentNode;
if (checkbox.checked)
{
checkbox.setAttribute("prevclass", tr.getAttribute(_className));
tr.setAttribute(_className, "Checked");
}
else
{
tr.setAttribute(_className, checkbox.getAttribute("prevclass"));
}
}

2007-03-23

SQL 2005数据类型说明

自动编号:设字段类型为:int ,然后列属性中 (是标识)选是,标识种子选1。

用varchar(max)代替text。varchar的最大长度为8000,但是varchar(max)则可以存储多达2G的数据,因此其作用相当于SQL 2000中的text。但是微软可能会后续的SQL Server版本中移除text类型,从现在就应该用varchar(max) 来代替text。

用nvarchar(max)代替ntext,用binary(max)代替image.

为XML数据选择xml类型。在SQL Server 2005中,为XML数据添加了相应的数据类型,因此存储XML数据的列不需要用 varchar(max)或nvarchar(max),而应当用xml数据类型,以利用T-SQL中专门针对xml数据列的新命令,以及针对xml列的索引。



易混淆的数据类型
(1)char、varchar、text和nchar、nvarchar、ntext
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。 text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
后面三种数据类型和前面的相比,从名称上看只是多了个字母"n",它表示存储的是Unicode数据类型的字符。写过程序的朋友对Unicode应该很了解。字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较:nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。


(2)datetime和smalldatetime
datetime:从1753年1月1日到9999年12月31日的日期和时间数据,精确到百分之三秒。
smalldatetime:从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟。

(3)bitint、int、smallint、tinyint和bit
bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据。
int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据。
smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据。
tinyint:从0到255的整数数据。
bit:1或0的整数数据。

(4)decimal和numeric
这两种数据类型是等效的。都有两个参数:p(精度)和s(小数位数)。p指定小数点左边和右边可以存储的十进制数字的最大个数,p必须是从 1到38之间的值。s指定小数点右边可以存储的十进制数字的最大个数,s必须是从0到p之间的值,默认小数位数是0。

(5)float和real
float:从-1.79^308到1.79^308之间的浮点数字数据。
real:从-3.40^38到3.40^38之间的浮点数字数据。在SQL Server中,real的同义词为float(24)。




关于SQL SERVER 2005 与SQL SERVER 2000比较

这个题目太大了,这里只能大体介绍一下,细节方面还需大家共同研究!希望能使大家对SQL SERVER 2005 快速入手,另外sql server 2005 的界面风格有越来越像 .net了,赶快安装一个感受一下吧!进去之后不要再去找查询分析器了,它和企业管理器都被集成在”Microsoft SQL Server Management studio”了,这个工具占内存较大80M多(再加上sql server 的实例进程80M,就160M了),而以前的企业管理器只需20M左右,加上sql server 的实例进程10M多一共才30M多.有得必有失~!

hacker at 2006/9/29
一、数据库设计方面
1、字段类型。
SQL Server 2005引入了一系列 新的被称为MAX的数据类型。这是VARCHAR,NVARCHAR和VARBINARY类型的扩展,这几种类型 以前被限制在8000字节以下。MAX可以容纳高达2GB的数据,与TEXT和IMAGE一样。
可以使用字符串函数对CLOB类型进行操作。但是这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?是否碎片会引发效率问题?这都是需要进一步探讨的东西。
数据类型
Sql server2000 Sql server2005
text 最大2GB varchar(max) 最大2GB(相当于oracle中的CLOB类型)
ntext 最大2GB nvarchar(max) 最大2GB
image 最大2GB varbinary(max) 最大2GB(代替image也让SQL Server的字段类型更加简洁统一)
无 XML XML 数据被作为二进制大型对象 (BLOB) 存储于内部,可有效地进行重新分析和压缩
其它数据类型保持不变。
2、外键的级联更能扩展
新版本中外键级联加入了SET NULL 和 SET DEFAULT 属性,能够提供能好的级联设置。(有点像oracle了)语法如下(引用sql server 2005 help来说明):
CREATE TABLE 和 ALTER TABLE 语句的 REFERENCES 子句支持 ON DELETE 和 ON UPDATE 子句:
• [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
• [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。
NO ACTION
指定如果试图删除/修改某一行,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 DELETE/UPDATE语句。
CASCADE、SET NULL 和 SET DEFAULT
允许通过删除或更新键值来影响指定具有外键关系的表,这些外键关系可追溯到在其中进行修改的表。如果为目标表也定义了级联引用操作,那么指定的级联操作也将应用于删除或更新的那些行。不能为具有 timestamp 列的外键或主键指定 CASCADE。
ON DELETE CASCADE
指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则也将删除所有包含那些外键的行。
ON UPDATE CASCADE
指定如果试图更新某一行中的键值,而该行的键值被其他表的现有行中的外键所引用,则组成外键的所有值也将更新到为该键指定的新值。 (如果 timestamp 列是外键或被引用键的一部分,则不能指定 CASCADE。 )
ON DELETE SET NULL
指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。目标表的所有外键列必须可为空值,此约束才可执行。
ON DELETE SET NULL
指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。目标表的所有外键列必须可为空值,此约束才可执行。
ON DELETE SET DEFAULT
指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。目标表的所有外键列必须具 有默认值定义,此约束才可执行。如果某个列可为空值,并且未设置显式的默认值,则会使用 NULL 作为该列的隐式默认值。因 ON DELETE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。
ON UPDATE SET DEFAULT
指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。目标表的所有外键列必须具 有默认值定义,此约束才可执行。如果某个列可为空值,并且未设置显式的默认值,则会使用 NULL 作为该列的隐式默认值。因 ON UPDATE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。


3、索引附加字段
即在索引中存储一些常用字段以提高查询速度,这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。在实验环境中会比映射到表中提高30%左右的效率。例:
CREATE INDEX ix_CustomerPostalcode
On Sales.Customer(PostalCode)
INCLUDE (AddressLine1,AddressLine2,City)
索引会提高查询(select)语句的性能,但建有大量索引会影响 INSERT、UPDATE 和 DELETE 语句的性能,因为在表中的数据更改时,所有索引都须进行适当的调整。
4、计算字段的持久化
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
使用 ORDER 排序和虚拟字段 虚拟字段完成的是类似 自增长 ID 的任务
select identity(int,1,1) ID ,hymc into #temp
from hybm
order by hymc
(注: 在ORACLE中,语句: select rownum from USERTABLE order by USERNAME; 得到的rownum还是没有排过序时的ROWNUM,根本不是已经排过序的ROWNUM。也就是说,有没有ORDER BY一个样。)
5、分区表
分区表是个亮点!从分区表也能看出微软要做大作强SQL Server的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQL Server2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。但是需要注意的一 点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚 集索引时,分区表会自动变为非分区表。这一点很让我纳闷。如果你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非 分区表。不知道这算不算一个bug。大家也可以试试。
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查 询,效率会低于未分区表的相同语句。但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
6、CLR类型
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。但是作了些试验, 发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重 的系统性能问题!
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!还不是性能有问题!否则面向对象的数据库早就实现了!
建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。或者是要和操作系统进行Socket通讯的场景。否则建议慎重!
7、索引视图
索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
8、语句和事务快照
语句级快照和事务级快照终于为SQL Server的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
9、数据库快照
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
例子:
CREATE DATABASE demo2
GO
USE demo2
ALTER DATABASE demo2 SET allow_snapshot_isolation ON --启动快照功能
CREATE TABLE test
(
tid INT NOT NULL primary key,
tname VARCHAR(50) NOT NULL
)
INSERT INTO test VALUES(1,'version1')
INSERT INTO test VALUES(2,'version2')

--连接一

USE demo2
BEGIN TRAN
UPDATE test SET tname='version3' WHERE tid=2
SELECT * FROM test

--连接二
USE demo2
SET transaction isolation level snapshot
SELECT * FROM test

10、Mirror
Mirror可以算是SQL Server的Data guard了。具说它切换速度可以达到秒级,这个功能能否被用户认可还有待时间的考验. 这个操作起来比较简单不在详细介绍。

二、开发方面
参考页面:http://www.microsoft.com/china/msdn...e.mspx?mfr=true
1、Ranking函数集
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQL Server2005的row_number比Oracle的更先进。因为它把Order by集成到了一起,不用像Oracle那样还要用子查询进行封装。但是大家注意一点。

如下面的例子:
USE demo
GO
CREATE TABLE rankorder
(
orderid INT,
qty INT
)
GO
INSERT rankorder VALUES(30001,10)
INSERT rankorder VALUES(10001,10)
INSERT rankorder VALUES(10006,10)
INSERT rankorder VALUES(40005,10)
INSERT rankorder VALUES(30003,15)
INSERT rankorder VALUES(30004,20)
INSERT rankorder VALUES(20002,20)
INSERT rankorder VALUES(20001,20)
INSERT rankorder VALUES(10005,30)
INSERT rankorder VALUES(30007,30)
INSERT rankorder VALUES(40001,40)
GO
SELECT orderid,qty,
ROW_NUMBER() OVER(ORDER BY qty) AS rownumber,
RANK() OVER(ORDER BY qty) AS rank,
DENSE_RANK() OVER(ORDER BY qty) AS denserank
FROM rankorder
ORDER BY qty
还有一点要说明:
select ROW_NUMBER() OVER (order by aa)
from tbl
order by bb
会先执行aa的排序,然后再进行bb的排序。
可能有的朋友会抱怨集成的order by,其实如果使用ranking函数,Order by是少不了的。如果担心Order by会影响效率,可以为order by的字段建立聚集索引,查询计划会忽略order by 操作(因为本来就是排序的嘛)。
2、top
可以指定一个数字表达式,以返回要通过查询影响的行数或百分比,还可以根据情况使用变量或子查询。可以在DELETE、UPDATE和INSERT查询中使用TOP选项。可以动态传入参数,省却了动态SQL的拼写。
例:
--声明个变量
DECLARE @a INT
DECLARE @b INT
DECLARE @c INT

--赋值
SET @a = 10
SET @b = 5
SELECT @c = @a/@b

--使用计算表达式
SELECT TOP(@c) * FROM toptest
--使用SELECT语句作为条件
SELECT TOP(SELECT COUNT(*) FROM toptest2) *
FROM toptest

--指出top
DELETE TOP(2) toptest where column1>'t6'

--更新top
UPDATE TOP(2) toptest SET column1 = 'hi' where column1<='t2'

3、Apply
对递归类的树遍历很有帮助。
CROSS APPLY : 得到和FUNCTION 结果相匹配的记录
OUTER APPLY: All rows , regardless of matching function results
一个有代表性的例子:
USE demo
GO
CREATE TABLE Arrays
(
aid INT NOT NULL IDENTITY PRIMARY KEY,
array VARCHAR(7999) NOT NULL
)
GO
INSERT INTO Arrays VALUES('')
INSERT INTO Arrays VALUES('10')
INSERT INTO Arrays VALUES('20,40,30')
INSERT INTO Arrays VALUES('-1,-3,-5')
GO
CREATE FUNCTION function1(@arr AS VARCHAR(7999))
RETURNS @t TABLE(pos INT NOT NULL, value INT NOT NULL)
AS
BEGIN
DECLARE @end AS INT, @start AS INT, @pos AS INT
SELECT @arr = @arr + ',', @pos = 1,
@start = 1, @end = CHARINDEX(',', @arr, @start)
WHILE @end > 1
BEGIN
INSERT INTO @t VALUES(@pos, SUBSTRING(@arr, @start, @end - @start))
SELECT @pos = @pos + 1,
@start = @end + 1, @end = CHARINDEX(',', @arr, @start)
END
RETURN
END

--测试
SELECT * FROM function1('200,400,300')
GO

SELECT A.aid, F.*
FROM Arrays AS A
CROSS APPLY function1(array) AS F
GO
SELECT A.aid, F.*
FROM Arrays AS A
OUTER APPLY function1(array) AS F
GO
查询结果:


4、CTE(Common Table Expression 通用表达式)
它是一个可以由定义语句引用的临时表命名的结果集,要用到WITH 关键字。例:
WITH SalesCTE(ProductID,SalesOrderID)
AS
(SELECT ProductID,COUNT(SalesOrderid)
FROM Sales.SalesOrderDetail GROUP BY ProductID)
SELECT * FROM SalesCTE
5、try/catch
先说明一下事务相关语法:
BEGIN TRAN[SACTION] [transaction_name]
COMMIT [TRAN[SACTION]] [transaction_name]
ROLLBACK [TRAN[SACTION] [transaction_name]
SAVE TRAN[SACTION] [savepoint_name]
上面这几很简单不解释了,下面看 SET XACT_ABORT ON/OFF,当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。所以在sql server 2k里使用事务就必须SET XACT_ABORT ON或者设置保存点。有了try/catch sql server2005 就不一样了!! 演示代码如下表。

USE demo
GO
CREATE TABLE student --创建工作表
( stuid INT NOT NULL PRIMARY KEY,
stuname VARCHAR(50) )
CREATE TABLE score
( stuid INT NOT NULL REFERENCES student(stuid),
score INT )
GO
INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')
INSERT INTO student VALUES (103,'lishi')
INSERT INTO student VALUES (104,'maliu')
2K事务的打操作 2005 使用TRY...CATCH构造扩充了错误处理能力
--调用一个运行时错误
SET XACT_ABORT ON(若为OFF 事务不会回滚)
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76) /*外键错误*/
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
GO
SET XACT_ABORT OFF
BEGIN TRY
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76) /*外键错误*/
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
PRINT '事务提交'
END TRY
BEGIN CATCH
ROLLBACK
PRINT '事务回滚'
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_MESSAGE() as ErrorMessage;
END CATCH
GO

6、pivot/unpivot
实现行列互转。2K 中这个功能用case实现,不过好像没有case 直观。而且默认的第三字段(还可能更多)作为group by字段很容易造成新手的错误。(有图我就不说了)
7、OUTPUT 关键字
在下面的例子中只看蓝色的部分就是正常的insert into … values 语句,通过output 可以将中间值输出 到临时表,也就是不能过触发器也可以实现对中间数据的处理。例:
DECLARE @InsertDetails TABLE (ProductID int, Insertedby sysname)
INSERT INTO Stock.ProductList
OUTPUT inserted.ProductID, suser_name() INTO @InsertDetails
VALUES (‘Racing Bike’,412.99)



MSSQL Server 2000系统数据类型:
(来源于SQL查询分析器)
1bigint 从 -2^63 到 2^63-1 之间的 integer (整数)数据
2binary 定长的binary数据,最长为8,000字节
3bit integer数据,值为1或0
4char 定长的非unicode character数据,长度为8,000个字符
5cursor 含有对游标的引用的变量或存储过程OUTPUT参数所采用的数据类型
6datetime date和time数据,从1753年1月1日到9999年12月31日
7decimal 定点精度和小数的numeric数据,从-10^38-1到10^38-1之间
8float 浮点精度数字数据,从-1.79E+308到1.79E+308之间
9image 长度可变的binary数据,最长为2^31-1字节
10int 从-2^31到2^31-1之间的integer(整数)数据
11money monetary数据值,从-2^63到2^63-1,准确度为货币单位的千分之一
12nchar 定长的unicode数据,长度为4,000个字符
13ntext 长度可变的unicode数据,最长为2^30-1个字符
14numeric decimal的同义词
15nvarchar 长度可变的unicode数据,最长为4,000字符
16real 浮点精度数字数据,从-3.40E+38到3.40E+38之间
17rowversion 数据库范围内的唯一号
18smalldatetime date和time数据,从1900年1月1日到2079年6月6日
19smallint 从-2^15到2^15-1之间的integer数据
20smallmoney monetary数据值,-214,748.3648到+214,748.3647之间
21sql_variant 可存储多种SQL Server支持的数据类型的值的数据类型,
22 但不存储text, ntext, timestamp和sql_variant类型的值
23sysname 系统提供的用户定义的数据类型,为nvarchar(128)的同义词
24table 一种特殊的数据类型,可用于为以后进行处理而存储结果集
25text 长度可变的非unicode数据,最长为2^31-1个字符
26timestamp 数据库范围内的唯一号
27tinyint 从0到255之间的integer数据
28uniqueidentifier全局唯一标识符(GUID)
29varbinary 长度可变的binary数据,最长为2^31-1字节
30varchar 长度可变的非unicode数据,最长为8,000个字符
By mostone.Jiang