2007-07-24

 

十年同学会

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

Labels:


2007-07-18

 

mp4 3gp 视频格式转换

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

Labels:


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已经出来了,感叹这世界变化太快 :-)

Labels:


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 中,两个子查询先执行,更新操作是最后执行,所以更新内容的参数就要放在最后。

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

Labels: ,


 

文档标准多样与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、统一文档标准 改善业务流程(赛迪网)

Labels:


2007-07-05

 

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

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

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

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

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

Labels:


 

关于 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程序作用和影响(某位博客的文章)

Labels:


This page is powered by Blogger. Isn't yours?

Subscribe to Posts [Atom]