Thursday, January 29

这几天国内在过年,MSN上在线的人都很少。生活在国外的思归倒是随笔不断。在他的一篇随笔里看到“头脑风暴”集体自由讨论专题的连接。粗读了一下,虽然并没有非常详细地介绍我关心的"高级头脑风暴",但是还是有价值的读物。
思考一个问题,不断地设问,从不同的角度看问题,联想,穷尽所能地列举各种可能所带来的好处,确实是学习,研究和工作的重要手段。无论这个方法叫做什么,都不是重要的事情。同妻一起作了近一年的强相关逻辑研究,好多激荡式的思考,热烈的争论都带来耳目一新的感觉。

大怪兽今天发现一个网址:Win32サブルーチンズ。里面有很多出色的介绍Win32编程书,很多已经是绝版的了。幸亏作者公开了那些书的内容。按照怪兽的说法这些内容是MSDN很好的补充。虽然没有时间看,但是也写到blog里存档。


Friday, January 16

BUGS
FeedDemon真是一个漂亮的shareware, 程序从界面到功能看上去都极其专业。用它来读blog和news确实方便。用了这个软件才真正感觉到基于XML的RSS不经意见就有所成就了。
这个软件在多国语言上还有一些bug,我只好用english界面。通过这个软件来看博客堂,我发现了博客堂的一个bug,就是RSS的头没有改成自己的。
我在.Text的source里找了一下,在Dottext.Web.Rss这个类里面,是用硬编码写的。
//Channel Description
writer.WriteElementString("title","WebLogs @ ASP.NET");
writer.WriteElementString("link","http://weblogs.asp.net");
writer.WriteElementString("description",".NETWeblogs by .NET Developers");
writer.WriteElementString("generator",Dottext.Framework.VersionInfo.Version);
这个BUG要是不改正,在加channel到FeedDemon的时候可能会和已经存在的WebLogs @ ASP.NET冲突,必须手动改名。而且随笔的出处联接也都是http://weblogs.asp.net。
.Text好多地方为了重用,搞的结构很复杂,在这个小地方用硬编码确实不可理解。也许是对RSS功能不是特别重视吧。

说到bug,我还遇到了asp.net 1.1的bug。在写一个page template的时候,我将form放入一个ascx中就会导致一个客户端script错误。详细的错误描述在msdn上有描述
http://support.microsoft.com/default.aspx?id=818803
这个bug需要等待一个新的NET Framework 1.1 service pack问世。
暂时的措施是:http://www.asp.net/Forums/ShowPost.aspx?PostID=206709

在另外一个地址上有一些已经发现的bug列标。
http://support.microsoft.com/default.aspx?kbid=821156

重粒子@BUG是程序的魅力之一

Wednesday, January 14

如此SB
1)恨不得大骂。竟然有如此SB的项目。
面对那个白痴项目,我想让它稍微聪明一点。对Oracle COM用一个类封装了一下,用起来类似MS的data access block。 居然被否定了一半。 原因是不能用缺省的VB弹出的出错信息。不是那个出错信息太少, 而是太多了。 靠靠。

2)最近连着读了日经BP网<中国故事--日本最大的离岸开发成功启示录>(1) (2) (3)
外包项目确实是趋势, 中国人件费的廉价,导致如此多的项目发注到中国去。外包项目其实对双方都是有利的。日方可以用相对廉价的代价开发出项目来。中方获得相应的外汇收入,而且一般很少发生拖欠项目经费的事情。
这样的项目一般来说都是日方写出需求说明书,概要设计书,甚至很多项目要写出详细说明书。这个写说明书的工作一般叫做上游工程。项目流到中国去以后,由中国程序员作详细设计和codeing,这个工作叫做下游工程。
外包项目怎样能够保证成功呢?软件的质量怎么控制呢?看看上面那篇文章里成功和失败的对比就很清楚了。
1:交流。交流充分与否是一个项目能否成功的基本前提。
2:热情。一般来说作下游工程没什么激情可言。日方的说明书往往写的详细之极。有的甚至到变量的名称。能否调动出中方的积极性来作这种"体力劳动"呢?
3:跟踪。项目的每一个阶段,是否有明确的负责人,日方是否清楚项目的进度。中方是否及时反应了遇到的困难?
4:测试。中方一定要作充分的单体测试,否则交给日方以后,低级的错误往往导致合作不愉快,会对中方的开发能力产生怀疑。
5:理解。相互的尊重和理解是基本的做人前提。任何的居高临下,阿谀奉承或者种族歧视都是分裂的触发器。

日本也有作下游工程的公司。比如我现在作的这个SB项目就是作详细说明和coding。日本的开发者往往听话地听作苦力。作法是否愚蠢不管他们的事。中国开发者往往是想提出自己的见解,耽误了项目的schedule。任何过分的作法都是不对的。

Saturday, January 10

■PBC001カメラ 「INFに必要なセクションが見つかりませんでした」エラーについて
2003年4月、ヨドバシカメラで購入したPBC001WEBカメラは画像はよく映らないですから、12月ヨドバシカメラで保障期間内で修理してもらいました。結局、新品を交換した。新品のドライバは7月4日のものですから、古いドライバをアンインストールして、7月4日のドライバをなかなかインストールできない状態です。http://www.persol-jp.com/download/download.html#pbc001からDOWNLOADしたドライバと製品付属CDにあるドライバを両方ともインストールしてみました。だめでした。何度もpersol-jp社に質問のメールを出しましたけど、解決できなかった。
----------------
persol-jp社の対処方法
上記問題を解決する手段として下記方法を行って頂く以外に
対応方法がございません。

①Windowsファイルの上書きインストールを行う。

②OSのクリーンインストールを行う。
----------------
そんな無理な答えです。
7月4日のPBC001のドライバに絶対バグがありますと思いますから、私は少し直してみてもうインストールできました。(WindowsXPの場合)
C:\WINDOWS\inf\usbcam.infファイルの最後に
[ClassInstall32]
一行を追加してインストールを続きました。
完璧ではないですけど、万一、他の利用者に同じ問題があれば多少助けると思いますから、やり方をメールでpersol-jp社に出しました。。

実は手元のPBC001の画面品質は理想的ではないですが、ドライバの問題ですか本体の問題ですかよくわからない。
今後ぜひブランド商品(LogiTech?)を使ったほうがよいと思います。

Wednesday, January 7

白痴项目
定论:我现在做的这个项目是极端白痴的。
说明:这是一个从VB6升级到VB.Net的项目。一小部分程序直接使用VS.NET的转换结果。大部分程序都要重新写,主要是因为数据库(oracle)的设计有一些变更。
看看我们经客户定案的程序规约:
1,使用.net framework 1.0 (not 1.1)
2,使用Oracle In Process OLE Automation Server, 而不是ADO.Net的OleDB或者OracleClient。理由1,OleDB或者OracleClient是MS做的,MS不值得信赖。(反驳意见:VB.NET也是MS做的) 理由2:VS.NET的自动转换结果使用的就是Oracle In Process COM
3,每一个函数,类,模块都有一个变量,标明它的ID,输出出错信息和log的时候用
4,共通模块使用link文件的形式引入项目,不是用DLL参照或者项目参照。
5,所有的变量都要有前缀,3个字母, 而不是1个。因为3个字母更清楚。boolean->bln,integer->int,structure->typ
6,所有的函数和过程都有前缀,3个字母加一个下滑线,表明返回值的类型。例:bln_CheckInput()
7,不仅仅服务器上要安装oracle server,客户端也有一个oracle server,用来存储客户端的数据。
8,项目里的文件路径指定使用绝对路径。D:\MDB\XXX9,
9,不要使用TRY...CATCH...FINALLY,要用ON ERROR...


这个世界一定是哪里不对了,是哪里呢?

聪明的你能告诉我吗?

Friday, December 26

总结一周

年终了,今天是今年最后一天上班,下午开了"纳会",前几天项目组还开了"忘年会",前者是领导总结一下一年的工作,给大家拜个年,大家聊聊天。后者纯粹是吃吃喝喝了。
接下来一周时间,准备在家编程序。每天觉得时间不够用,这下子有一周假期,还真不适应呢。前几天一个电视节目里问:如果出了某种变故,你被告知仅有一天的寿命了,你会利用这一天做些什么?这真是一个无聊的问题,面对这样的问题,每个人有自己的回答。我想我仍然会利用这最后一天编程序的。有过太多IDEA,真正实现的寥寥无几。如果只有最后一天,还是希望实现自己的价值。:)

总结一下上一周:
1,No! Flash 2.0 release了,在屏蔽flash的基础上,增加了block spyware的功能。除了新浪,网易这样的新闻网站,3721,Baidu也成了No!Flash屏蔽的对象。对那种毫不尊重浏览者选择权的粗暴广告方式实在忍无可忍。特别是对播号上网和机器型号比较老的用户而言,直接占用了他们有限的带宽和CPU。没有No!Flash的时候真想大骂这些恶德业者。

2,写了一篇对话形式的小文章。"MM与GG的对话---关与printf和字符数组"给C语言的初学者。

3,看了大怪兽关与const的随笔,我想有必要总结一下const在C++里的各种用法,开始写一篇文章,现在写了一半,还在blogger的draft里,希望下周release它。

4,用了这么多年C++,真的没有好好总结一下,没有一个好得hint,也不会去想对于初学者会遇到些什么问题。今天在dev-club里,为了回答一个问题,总结了一下作为函数的参数时,什么情况下必须用"引用":
(1)引用保证了你传入的确实是一个对象的引用并且在函数里不会像指针一样改变用途。

void fun( X *px )和void fun( X &x )的普通在于
你可不可以这么用
fun(0);

用指针就可以传入一个0(或者其他整数),也许是一个非法的地址,而且在fun函数内还可以改变px指向的地址。例如
void fun( X *px )
{
X aaa;
px=&aaa;
}

用引用就不会有这些问题。传入0是违法的。引用在传入的时候被初始化以后,绝对不会再被改变成为另外一个对象的引用。

(2),作为重栽运算符时的参数方式。
如果你写成
X operator+( X *a, X *b )
用的时候就只能
&val1+&val2
了。
使用引用不会有这样的尴尬。
声明的时候这样
X operator+( X &a, X &b )
使用的时候这样
val1+val2

Sunday, December 14

1,微软建议的开发流程,在这篇文章里进行了详细的论述。Team Development with Visual Studio .NET and Visual SourceSafe。特别是提供了一个叫做BuildIt的小工具,可以自动从sourcesafe里checkout最新的代码,编译,更新version,设置vss的标签,对于nightly build和每日编译真的很有用。

2,VS.Net2003提供了before build,after-build的项目选项。可以做编译前预处理,编译后的收尾处理工作。ms petshop提供了足够好的例子。

3,“星轨工作室”的Orbit翻译了CodeProject上的介绍WTL的系列文章,WTL for MFC programmer ,真是做了伟大的贡献。详细所有使用WTL的中国程序员都会感谢他的。

4,看到一篇趣文:
<<大腕 之过度设计>>
一定得选最先进的架构,
怎么也得也要分布式的,
做就要规范,
把设计模拿过来,
什么Builder呀,Adapter呀,Bridge呀,
能用不能用的全用上,
多服务器,负载均衡,
搬它几台曙光来做集群,
支持十亿用户同时访问。
同行不是用CORBA 就是用EJB,
你要用一DCOM,你都不好意思和人打招呼。
客户端旁边还要做一帮助精灵,暴可爱那种,
一口一个"May i help you sir"
一口地道西雅图腔,
倍(儿)有面子。
你说这样的程序,怎么着也要花个十万八万的吧?
十万八万?那是电费!
八千万起!
你别嫌贵 还不打折。
您得研究顾客的心理,
国家钱来搞研究的,
根本不在乎多花点钱。
什么叫研究你知道吗?
就是只要最炫,不要最好。

Monday, December 8

这篇来自中文MSDN的文章"使用 Microsoft .NET 的企业解决方案模式"确实很好,很重要。我读了大约1/3。文章里面提到的内容有些是我熟知的,有些是生疏的。但感觉他们确实给我今后的asp.net项目开发提供了很好的理论基础和实践指南。我制作了PDF文件,希望在不引起任何版权纠纷的情况下,大家可以将自己的comment加进去,共同理解提高。

PDF的下载

Thursday, November 27

有开发winform经验的人都知道,要想使程序在windows XP下真正拥有XP风格,需要按照下面这篇文章所说的去做。The Code Project - Windows XP Visual Styles for Windows Forms - C# Programming
首先如果你的画面上有Button,CheckBox,RadionBox,GroupBox的话,需要改变他们属性FlatStyle为System,然后追加一个manifest文件到exe文件的同一个路径下。就像App.config文件那样。

当然,在.Net Framework 1.1下,你可以不必这么麻烦,只需要加一句Application.EnableVisualStyles();就可以了。

遗憾的是,我再做的项目要用1.0,在1.0里可没有这么方便了。

我有10几个小winform程序都需要这样做,所以我首先想到建立一个模板。就像往项目里追加一个app.config一样。我仿照app.config模板作法,复制一个模板,修改里面的app.config成app.manifest文件。改好的模板放在这里了。

AppXPStyle.zip

我在修改C:\Program Files\Microsoft Visual Studio .NET\Vb7\VBProjectItems\Local Project Items\Utility\LocalUtilityProjectItems.vsdir以后可以追加manifest进入项目了,但是文件名变成了App1.manifest,而且编译以后,它不会同App.config一样被改名,拷贝到exe所在的文件夹下。
App.config真是一个magic file啊,VS是怎么做的?

我改变想法,考虑用macro来自动生成manifest,可是不知道如何得到当前所在的project,以及它生成的exe文件的路径。:s


Tuesday, November 25

惯性太可怕
今天看了一眼一个很久以前用C++编的程序,突然发现在这个程序我这么写到
#define DECIMAL_DIGIT 3
... ...
int a = 10^DECIMAL_DIGIT; //求10的n次方
... ...
MyGod,我居然用这样的语句来计算10的3次方。
这是可是C++啊,不是Basic。
正确的写法应该是
#include < cmath >
using namespace std;
......
#define DECIMAL_DIGIT 3
... ...
double a = pow(10,DECIMAL_DIGIT)
... ...

我原来的写法至少犯了2个错误,
1,在Basic里^是求幂的符号,而在C++(包括C#)里则是求2进制"异或"的符号,作用是完全不同的。
2,无论是basic也好还是C++也好,求幂以后的返回值都是double型,即使你的输入都是int型。

沉重检讨,我为什么会犯这种错误!!!!
都是VB惹的祸????
很多时候BASIC确实很好用,我都不自觉地用到C++里了。惯性实在可怕。
2週間ぶりのBLOGだ。この2週間で新しいPCを組み合わせって、BenQ FP791 LCDを購入しました。悔しいことはLCDのドット抜けだ。一つの明るい点で、不良対象外だって悔しいだ。コーディングなら、このLCDは明るすぎだ、DVD鑑賞ならいいかも。
3連休を利用してNo!FlashをUPDATEしていた。うるさいActiveXをBLOCKしたい。来週かな?PUBLISH IT。
日本では、BLOGの利用は少ないと思いますが、実は「日記」という形式で流しています。東京大学のサイトに置いている
便所コオロギ観察日記はC++,Windows関連のBLOGを記録している。いい参考できます。

Monday, November 10

致命的BUG:KB326219

下午我在做一个WinForm in VB.Net的程序时遇到了奇怪的问题,在设置好LABEL的字体后,运行出错,是奇怪的System.ArithmeticException,可是出错的位置是VS自动生成的code。google之后发现,这是一个臭名昭著的问题:326219 - PRB: System.Arithmetic Exception Error When You Change the Floating-Point Control Register in a Managed Application
看了这篇KB,我非常奇怪,是什么改变了浮点控制寄存器呢?
我一个一个地关掉我桌面上的程序, 发现罪魁就是早上安装的WORKTIME,在这个程序里一定是使用了这个寄存器,而dotNet在使用它时没有正确地初始化。
按照KB的指示,我们必须在每new一个form之前样做浮点精度指定。就像这样:
Imports System.Runtime.InteropServices
Module StartUp

_
Overloads Function _controlfp(ByVal n As Integer, ByVal mask As Integer) As Integer
End Function

_
Public Sub Main()
FixArithBug()

' Starts the application.
Application.Run(New Form1())
End Sub

Public Sub FixArithBug()
'PRB: System.Arithmetic Exception Error When You Change the Floating-Point Control Register in a Managed Application
'http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B326219 Const _MCW_EM As Integer = &H8001F
Const _RC_NEAR As Integer = &H0
Const _PC_53 As Integer = &H10000
Const _EM_INVALID As Integer = &H10
Const _EM_ZERODIVIDE As Integer = &H8
Const _EM_OVERFLOW As Integer = &H4
Const _EM_UNDERFLOW As Integer = &H2
Const _EM_INEXACT As Integer = &H1
Const _EM_DENORMAL As Integer = &H80000
Const _CW_DEFAULT As Integer = (_RC_NEAR + _PC_53 + _EM_INVALID + _EM_ZERODIVIDE + _EM_OVERFLOW + _EM_UNDERFLOW + _EM_INEXACT + _EM_DENORMAL)
_controlfp(_CW_DEFAULT, &HFFFFF)
End Sub
End Module

这个问题同时出现在framework1.0和1.1里面。
我实在不希望还出现在1.2里,因为这种程序之间互相干扰的问题有时候是很难发现。
类似的VS2003也对别的程序有影响。
这种类型的问题往往是因为WINDOWS的消息机制引起的,错误地发送消息给一个Window程序是常见的原因。但是因为寄存器的原因,我还是头一次遇到。

Friday, November 7

MS有一个方法允许在一个操作系统里同时运行不同的IE版本,但是并没有公开这种方法。这个秘密已经被发现了:Multiple IE's in Windows
这对需要测试多个IE版本的网页设计者带来了好处,不再需要额外的机器,虚拟机了。:)

Tuesday, November 4

可删除任意已知节点的左倾树
优先队列是一个非常有用的数据结构,一般用于多任务的优先权分配。比如一台打印机只能一个文档一个文档地打印,如果有多个打印任务,如何调度他们呢?一个简单的策略就是先来先打印(FIFO),可是如果一个等待处理的先来的任务有上千页,而后来的等待中的任务只有1,2页,那么仍然按照先来先打的策略将会很没有效率(恕我不解释"效率"这个词)。另外一个策略就是等待任务中页数最小的先打印。这个策略看上去更好一些。
我们现在的问题是如何调度类似的这些任务如何调度,合理的数据结构如何。这就要用到优先队列的这个数据结构了。一个有效的优先队列实现方案就是左倾树(Leftist Trees)。这在一些经典的数据结构和算法的书中都有介绍。
对这个数据结构稍加研究以后,就会发现它不能很好地解决一个特例,就是如果用户想取消一个还没有进行的任务(我想cancel一个打印文档是大家经常会遇到的)。解决这个特例直观的想法是重新构造左倾树,可是怎样做呢?上周五,布朗香写出了一个算法:可删除任意已知节点的左倾树。我有幸看到了这篇文章,记录于此。:)

Thursday, October 30

WinFX发想
据说下一代.NET Framework更名为“WinFX”。并且准备取代Win32成为最主要的API(应用程序接口)。
我没有详细去看WinFX的技术设计文档,但是估计今后的API将采用XML作为interface。估计会类似最早嵌入HTML的ActiveX组件,java applet。只不过这次是真正面向Desktop了。
个人认为这在技术发展到现在的程度下是极其自然的。
早期的DLL,后来的COM都无法完全实现“将用户界面的设计者与程序开发人员的工作分开进行,以便提高开发效率”(Allchin)。 特别是现在windows下成ton的API,极端混乱不看,我想即使MS windwos Team的成员也不间得所有的API都了解吧。一些接口下面隐藏的诡秘细节更是令人无从想像。这回API升级以后造成的参数不兼容问题有望在XML接口下解决。
XML接口的另外好处是所谓的AOP,可以通过设置attribute,控制API的安全性,交互协议,字节顺序等等这些API本身不应该负责的事情。
对普通用户来说,windows的界面将想同web一样丰富多彩,每个人都可以轻易设计自己的windows界面,让你感觉更亲近更友善。这种和界面相关的设计语言据说叫做XAML(eXtensible Application Markup Language)

以上纯属个人想像,如有雷同,万分荣幸!


Tuesday, October 28

我昨天胡言乱语了一通,结果遭人骂是"一个看轻自己民族的人"。555,晚上没睡好觉。我只不过介绍了人家的优点,就被基于某种民族思想的言论攻击了。
CSDN上的一篇文章说的好"客观看待自身的问题,才能使我们中国的软件行业实现真正的跨越,超越日本,击败印度,抗衡美国。 真的希望能看到这样一天:中国的程序员能面对世界自信的说:“我们是最棒的!” "

Monday, October 27

胡言乱语
理性的思考,来自怎样的大脑?
看看22岁的麻省理工大学的副教授的Erik Demaine就知道什么是智慧。
玩过联众的俄罗斯方块对战的朋友都知道,在有限的时间里找到最佳的策略是多么不容易,如果让其中一方是一个计算机程序的话,是否有一个有效的算法来解决这个问题呢?Erik Demaine告诉我们,没有这样的算法。因为这是一个NP完全问题。
这个Erik Demaine的博士论文居然是"Folding and Unfolding",完全来自对折纸的研究。
纸张的发明是中国为世界做出的巨大贡献。我不知道折纸是哪个国家发明的,但是折纸(origami)这个英文词拼写是来自日语的"おりがみ"。
历史上中国曾经发明过很多东西,但是我不知道近代中国为世界贡献了什么?
日本NHK电视台有一个节目就是"ProjectX",这个节目在晚上的黄金时间播出,每一集都讲述了近代由日本人发明并对世界都产生影响的产品,从最普通的人,开发最前线的人讲起。我没有每一集都看到,至少看过的有"方便面","洗碗机","复印机","自动检票机"...
现在有一些venture company就同自己的员工说,我们的工作今后会被ProjectX选种的。那是怎样的一种激励啊。

昨天还看了梁肇新的《编程高手箴言》的样章。本来有些感想,现在也想不起来。
在中国做程序员很累。
。。。。。。在外国也不见得舒服。

今天,我作了。。。。

太晚了,我要回家了。bye

Sunday, October 26

前几天有人问杨立伟飞行员从太空能看到长城吗?。。。取决于我们如何定义看见。:)

让我们通过下面这个网站来看看从太空到底能看到什么。
Molecular Expressions: Science, Optics and You - Powers Of 10: Interactive Java Tutorial

Friday, October 24

上海市居住证
上海比较牛啊,中国人在上海住还要申请"签证"呢,还给你评分,分数不够的话,还拒签呢。
:s
我算了算,要是有钱在上海买房的话,刚好能混上3年签证,没房的话1年。要是工作没找好的话,只能拒签了。555~~~
我一个小人物,可怎么是好。

Wednesday, October 22

Microsoft toys with open source
走向开放的微软
微软的产品一般来说都是封闭开发的。外人是无法参与进去的。不过这种说法看上去就要成为过去时了。微软正在草拟一个新的license, 来使一个Windows C++ 代码库WTL(Windows Template Library)成为开放的,允许非微软开发者参与的商业代码库。这对于微软来说几乎是一种激进的行为。
最早,微软Visual C++ Libraries Team的Pranish Kumar在今年4月12日提议将WTL变成shared source。这在WTL社区引起过争论。Pranish Kumar的mail可以在这里找到。他提出了一些重要的想法,而且在征求非微软人士的意见。

我是在2002年6月从大怪兽那里听说WTL这个名词的。在同年10月1日我写自己的第一个WTL程序No!Flash用来屏蔽国内新闻网站的动态广告。WTL让我有一种众里寻她千百度的感觉:)WTL是为那些追求开发出更小巧更快速的windows程序的开发者准备的。

我使用C++编程几乎不得不同时使用STL/BOOST/ATL/ATL Server/WTL以及自己积累的一些CLASS。C++在程序库上的贫乏,再加上一些语法的复杂性,对于一般的开发者来说,C++不是一个好的approch。java和.Net的突飞猛进,不能不说是对C++扬长弃短的结果。