Thursday, September 14, 2006

3-Tier Software Structure

http://blog.joycode.com/jgtm2000/archive/2003/12/29/10064.aspx

BTW:关于三层软件结构中的语义

我设计软件的时候有一个原则:不同的架构层次有不同的语义集,简单说,就是在不同的层次说不同的话。比如说业务需求里面的这样一句话:

“用户可以搜索与给定名称相同的图书”——这是客户的需求,在这一层次上,说的是“人话”。

反映到界面层,这个动作对应的方法就成了:

“GoSearchByName”

到了业务层,我喜欢用:

“GetBooksByName”

而进一步到了数据服务层,一律是数据操作用语:

“BookDataService::SelectByName”

同理可见:

注册新用户 - CreateUser - InsertUser
登录 - SignIn - UpdateStatus
注销 - LogOff - UpdateStatus

等等。。。这样可以有效避免名称上的混乱一致于不清楚代码所处的软件层次。当然你不必要用同样的方法,但是我们的团队很快的适应这样的命名规则,且工作的很好。也供大家参考吧。

介绍Agile Framework

Wednesday, August 30, 2006

Visual Studio 2005 , Window Moblie 2003 and Pocket PC 2003

1. How is Windows Mobile related to Windows CE?
http://blogs.msdn.com/marcpe/archive/2005/04/22/410778.aspx
https://blogs.msdn.com/marcpe/archive/2005/05/04/414644.aspx

'Windows CE' as a product consists of two main things: Platform Builder and a very large collection of software bits ... it is *not* is a finished OS.

Windows Mobile is a set of pre-selected Windows CE components.

Windows CE as a product has been around for a while (I think the first version was around 1996) but Pocket PC and Windows Mobile platform is much newer. Each version of Pocket PC and Windows Mobile is built from a specific version of the Windows CE product

Windows CE 3.0
Pocket PC
Handheld PC 2000
Pocket PC 2002
Smartphone 2002

Windows CE 4.0 (SP2)
(Windows Mobile 2003) Pocket PC 2003
(Windows Mobile 2003) Pocket PC 2003 Phone
(Windows Mobile 2003) Smartphone 2003
(Windows Mobile 2003 SE) Pocket PC 2003 Second Edition
(Windows Mobile 2003 SE) Pocket PC 2003 Phone Second Edition
(Windows Mobile 2003 SE) Smartphone 2003 Second Edition

Windows CE 5.0
Windows Mobile v.next

2. Pocket PC and Smartphone
Pocket PC procss data
Smatphone use on voice

3. Use Visual Studio 2005 to develop Windows Mobile 2003 application
通过 .NET Compact Framework 优化 Pocket PC 开发
Visual studio 2005 support Pocket PC 2003, Smartphone 2003 and Window CE 5.0 application developments.

4. Web Mobile Emulator setting
Visual Studio 2005 include emulator for Pocket PC 2003, Smartphone 2003 and Window CE 5.0. To setup network connection, goto /Tool/Device Emulator Manager, select one emulator, and right click, chosse "connect", this will open the emulator.

Under emulator window, select /File/Configure, under "Network" tab, check "Enable NE2000 PCMCIA Network adapter and Bind to" and click "OK". If not error dialog box pops up, it mean the network connection was already setup. Otherwise, just follow the link to download "Virtual Machine Network Driver for Microsoft Device Emulator", and install the driver.

After this, open emulator window again, goto /Start/Settings/Connections/Network Cards, select a network card, and goto network to select a "internet" or "work".

5. Windows Mobile 5.0 Application Development
New SDK:
Microsoft.WindowsMobile.Configuration
Microsoft.WindowsMobile.Forms
Microsoft.WindowsMobile.PocketOutlook
Microsoft.WindowsMobile.Status
Microsoft.WindowsMobile.Telephony
http://bbs.mscommunity.com/forums/ShowThread.aspx?PostID=11991

More SDK for .Net see here
http://www.opennetcf.org/home.ocf

6. Call CoreDll.dll in .NET
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=626863&SiteID=1
The Windows CE Namespace

Tuesday, August 29, 2006

Career Path

1. Job hunting
http://www.simfit.org/ practice firm, provides the perfect setting for unemployed individuals to gain ‘hands on’ experience in their field while at the same time actively looking for employment.

Wednesday, August 09, 2006

Access Controls inside GridView

How to access controls inside GridView?
1. If the controls is in a TemplateField, and use EditItemTemplate for editing, FooterTemplate for inserting records
< asp:templatefield sortexpression="name" headertext="Name" >
< ItemTemplate > < %# Eval("name") %> < / ItemTemplate >
< FooterTemplate > < asp:TextBox id="txtInsertName" runat="server">< / asp:TextBox > < / FooterTemplate>
< EditItemTemplate > < asp:TextBox id="txtEditName" runat="server"> < / asp:TextBox > < / EditItemTemplate >
< /asp:templatefield>
....
< asp:TemplateField HeaderText="Action">
< ItemTemplate>
< asp:LinkButton id="btnEdit" Runat="server" Text="Edit" CommandName="Edit">< /asp:LinkButton>
< asp:LinkButton id="btnDelete" Runat="server" Text="Remove" CommandName="Delete">< /asp:LinkButton>
< /ItemTemplate>
< EditItemTemplate>
< asp:LinkButton id="btnSave" Runat="server" Text="Save" CommandName="Update">< /asp:LinkButton>
< asp:LinkButton id="btnCancel" Runat="server" Text="Cancel" CommandName="Cancel">< /asp:LinkButton>
< /EditItemTemplate>
< FooterTemplate>
< asp:LinkButton ID="btnInsert" Runat="server" Text="Insert" CommandName="Insert">< /asp:LinkButton>
< /FooterTemplate>
< /asp:TemplateField>

a. Initial values: In RowCreated event,
protected void dgContact_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow) {
if ((e.Row.RowState & DataControlRowState.Edit) != 0) {
int index = e.Row.RowIndex;
IContact contact = contacts[index];
((TextBox)e.Row.FindControl("txtEditName")).Text = contact.name;
...
}
}
}
b. Updating: OnRowUpdating event,
protected void dgContact_OnRowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = dgContact.Rows[e.RowIndex];
contact.name = ((TextBox)row.FindControl("txtEditName")).Text;
...
}
c. Insert: OnRowCommand
protected void dgContact_OnRowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName) {
case "Insert":
GridViewRow row = dgContact.FooterRow;
contact.name = ((TextBox)row.FindControl("txtInsertName")).Text;
...
}
d. Delete: OnRowDeleting Event
protected void dgContact_OnRowDeleting(object sender, GridViewDeleteEventArgs e)
{
string email = dgContact.DataKeys[e.RowIndex].Value.ToString();
...
}

Wednesday, July 05, 2006

MBA 出租司机给我上了一堂MBA课

我在上海赶飞机 出租司机给我上了一堂MBA课 职场生涯
作者:老票
我要从徐家汇赶去机场,于是匆匆结束了一个会议,在美罗大厦前搜索出租车。一辆大众发现了我,非常专业的、径直的停在我的面前。这一停,于是有了后面的这个让我深感震撼的故事,象上了一堂生动的MBA案例课。为了忠实于这名出租车司机的原意,我凭记忆尽量重复他原来的话。
“去哪里……好的,机场。我在徐家汇就喜欢做美罗大厦的生意。这里我只做两个地方。 美罗大厦,均瑶大厦。你知道吗?接到你之前,我在美罗大厦门口兜了两圈,终于被我看到你了!从写字楼里出来的,肯定去的不近~~~”
“哦?你很有方法嘛!”我附和了一下。
“做出租车司机,也要用科学的方法。”他说。我一愣,顿时很有些兴趣“什么科学的方法?”
“要懂得统计。我做过精确的计算。我说给你听啊。我每天开17个小时的车,每小时成本34.5元……”
“怎么算出来的?”我追问。
“你算啊,我每天要交380元,油费大概210元左右。一天17小时,平均每小时固定成本22元,交给公司,平均每小时12.5元油费。这是不是就 是 34.5 元?”,我有些惊讶。我打了10年的车,第一次听到有出租车司机这么计算成本。以前的司机都和我说,每公里成本0.3元,另外每天交多少钱之类的。
“成本是不能按公里算的,只能按时间算。你看,计价器有一个“检查”功能。你可以看 到一天的详细记录。我做过数据分析,每次载客之间的空驶时间平均为7分钟。如果上来一个起步价,10元,大概要开10分钟。也就是每一个10元的客人要花 17分钟的成本,就是9.8元。不赚钱啊!如果说做浦东、杭州、青浦的客人是吃饭,做10元的客人连吃菜都算不上,只能算是撒了些味精。”
强!这位师傅听上去真不象出租车司机,到象是一位成本核算师。“那你怎么办呢?”我更感兴趣了,继续问。看来去机场的路上还能学到新东西。
“千万不能被客户拉了满街跑。而是通过选择停车的地点,时间,和客户,主动地决定你要去的地方。”我非常惊讶,这听上去很有意思。“有人说做出租车 司机是 靠运气吃饭的职业。我以为不是。你要站在客户的位置上,从客户的角度去思考。”这句话听上去很专业,有点象很多商业管理培训老师说的“put yourself into others’ shoes.”
“给你举个例子,医院门口,一个拿着药的,一个拿着脸盆的,你带哪一个。”我想了想,说不知道。
“你要带那个拿脸盆的。一般人病小痛的到医院看一看,拿点药,不一定会去很远的医院。拿着脸盆打车的,那是出院的。住院哪有不死人的?今天二楼的谁 死了, 明天三楼又死了一个。从医院出来的人通常会有一种重获新生的感觉,重新认识生命的意义,健康才最重要。那天这个说:走,去青浦。眼睛都不眨一下。你说他会 打车到人民广场,再去做青浦线吗?绝对不会!”
我不由得开始佩服。
“再给你举个例子。那天人民广场,三个人在前面招手。一个年轻女子,拿着小包,刚买完东西。还有一对青年男女,一看就是逛街的。第三个是个里面穿绒 衬衫 的,外面羽绒服的男子,拿着笔记本包。我看一个人只要3秒钟。我毫不犹豫地停在这个男子面前。这个男的上车后说:延安高架、南北高架~~~还没说后面就忍 不住问,为什么你毫不犹豫地开到我面前?前面还有两个人,他们要是想上车,我也不好意思和他们抢。我回答说,中午的时候,还有十几分钟就1点了。那个女孩 子是中午溜出来买东西的,估计公司很近;那对男女是游客,没拿什么东西,不会去很远;你是出去办事的,拿着笔记本包,一看就是公务。而且这个时候出去,估 计应该不会近。那个男的就说,你说对了,去宝山。”
“那些在超市门口,地铁口打车,穿着睡衣的人可能去很远吗?可能去机场吗?机场也不会让她进啊。”
有道理!我越听越有意思。
“很多司机都抱怨,生意不好做啊,油价又涨了啊,都从别人身上找原因。我说,你永远从别人身上找原因,你永远不能提高。从自己身上找找看,问题出在 哪 里。”这话听起来好熟,好像是“如果你不能改变世界,就改变你自己”,或者Steven Corvey的“影响圈和关注圈”的翻版。“有一次,在南丹路一个人拦车,去田林。后来又有一次,一个人在南丹路拦车,还是去田林。我就问了,怎么你们从 南丹路出来的人,很多都是去田林呢?人家说,在南丹路有一个公共汽车总站,我们都是坐公共汽车从浦东到这里,然后搭车去田林的。我恍然大悟。比如你看我们 开过的这条路,没有写字楼,没有酒店,什么都没有,只有公共汽车站,站在这里拦车的多半都是刚下公共汽车的,再选择一条最短路经打车。在这里拦车的客户通 常不会高于15元。”
“所以我说,态度决定一切!”我听十几个总裁讲过这句话,第一次听出租车司机这么说。
“要用科学的方法,统计学来做生意。天天等在地铁站口排队,怎么能赚到钱?每个月就赚500块钱怎么养活老婆孩子?这就是在谋杀啊!慢性谋杀你的全 家。要 用知识武装自己。学习知识可以把一个人变成聪明的人,一个聪明的人学习知识可以变成很聪明的人。一个很聪明的人学习知识,可以变成天才。”
“有一次一个人打车去火车站,问怎么走。他说这么这么走。我说慢,上高架,再这么这么走。他说,这就绕远了。我说,没关系,你经常走你有经验,你那 么走 50块,你按我的走法,等里程表50块了,我就翻表。你只给50快就好了,多的算我的。按你说的那么走要50分钟,我带你这么走只要25分钟。最后,按我 的路走,多走了4公里,快了25分钟,我只收了50块。乘客很高兴,省了10元钱左右。这4公里对我来说就是1块多钱的油钱。我相当于用1元多钱买了25 分钟。我刚才说了,我一小时的成本34.5块,我多合算啊!”
“在大众公司,一般一个司机3、4千,拿回家。做的好的大概5千左右。顶级的司机大概每月能有7000。全大众2万个司机,大概只有2-3个司机,万里挑一,每月能拿到8000以上。我就是这2-3个人中间的一个。而且很稳定,基本不会大的波动。”
太强了!到此为止,我越来越佩服这个出租车司机。
“我常常说我是一个快乐的车夫。有人说,你是因为赚的钱多,所以当然快乐。我对他们说,你们正好错了。是因为我有快乐、积极的心态,所以赚的钱多。”
说的多好啊!
“要懂得体味工作带给你的美。堵在人民广场的时候,很多司机抱怨,又堵车了!真是倒霉。千万不要这样,用心体会一下这个城市的美,外面有很多漂亮的 女孩子 经过,非常现代的高楼大厦,虽然买不起,但是却可以用欣赏的眼光去享受。开车去机场,看着两边的绿色,冬天是白色的,多美啊。再看看里程表,100多了, 就更美了!每一样工作都有她美丽的地方,我们要懂得从工作中体会这种美丽。”
“我10年前是强生公司的总教练。8年前在公司作过三个不同部门的部门经理。后来我不干了,一个月就3、5千块,没意思。就主动来做司机。我愿意做一个快乐的车夫。哈哈哈哈。”
到了机场,我给他留了一张名片,说:“你有没有兴趣这个星期五,到我办公室,给我软的员工讲一讲你怎么开出租车的?你就当打着表,60公里一小时,你讲多久,我就付你多少钱。给我电话。”
我迫不及待的在飞机上记录下他这堂生动的MBA课。

ERP 把专业的问题通俗化

ERP(Enterprise Resource Planning)企业资源计划系统,是指建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。
  一天中午,丈夫在外给家里打电话:“亲爱的老婆,晚上我想带几个同事回家吃饭可以吗?” (订货意向)
  妻子:“当然可以,来几个人,几点来,想吃什么菜?”
  丈夫:“6个人,我们7点左右回来,准备些酒、烤鸭、番茄炒蛋、凉菜、蛋花汤……。你看可吗?” (商务沟通)
  妻子:“没问题,我会准备好的。” (订单确认)
  妻子记录下需要做的菜单 (MPS计划) ,具体要准备的东西:鸭、酒、番茄、鸡蛋、调料…… (BOM物料清单) ,发现需要:1只鸭蛋,5瓶酒,4个鸡蛋…… (BOM展开) ,炒蛋需要6个鸡蛋,蛋花汤需要4个鸡蛋 (共用物料) 。
  打开冰箱一看 (库房) ,只剩下2个鸡蛋 (缺料) 。
  来到自由市场,妻子:“请问鸡蛋怎么卖?” (采购询价)
  小贩:“1个1元,半打5元,1打9.5元。”
  妻子:“我只需要8个,但这次买1打。” (经济批量采购)
  妻子:“这有一个坏的,换一个。” (验收、退料、换料)
  回到家中,准备洗采、切菜、炒菜…… (工艺线路) ,厨房中有燃气灶、微波炉、电饭煲…… (工作中心) 。
  妻子发现拨鸭毛最费时间 (瓶颈工序,关键工艺路线) ,用微波炉自己做烤鸭可能来不及 (产能不足) ,于是阅览室在楼下的餐厅里买现成的 (产品委外) 。
  下午4点,接到儿子的电话:“妈妈,晚上几个同学想来家里吃饭,你帮忙准备一下。” (紧急订单)
  “好的,你们想吃什么,爸爸晚上也有客人,你愿意和他们一起吃吗?”
  “菜你看着办吧,但一定要有番茄炒鸡蛋,我们不和大人一起吃,6:30左右回来。” (不能并单处理)
  “好的,肯定让你们满意。” (订单确定)
  “鸡蛋又不购了,打电话叫小店送来。” (紧急采购)
  6:30,一切准备就绪,可烤鸭还没送来,急忙打电话询问:“我是李太,怎么订的烤鸭还不送来?” (采购委外单跟催)
  “不好意思,送货的人已经走了,可能是堵车吧,马上就会到的。”
  门铃响了。
  “李太太,这是您要的烤鸭。请在单上签一个字。” (验收、入库、转应付账款)
  6:45,女儿的电话:“妈妈,我想现在带几个朋友回家吃饭可以吗?” (呵呵,又是紧急订购意向,要求现货)
  “不行呀,女儿,今天妈已经需要准备两桌饭了,时间实在是来不及,真的非常抱歉,下次早点说,一定给你们准备好。” (哈哈,这就是ERP的使用局限,要有稳定的外部环境,要有一个起码的提前期) 。
  …… ……
  送走了所有客人,疲惫的妻子坐在沙发上对丈夫说:“亲爱的,现在咱们家请客的频率非常高,应该要买些厨房用品了 (设备采购) ,最好能再雇个小保姆 (连人力资源系统也有缺口了) 。
  丈夫:“家里你做主,需要什么你就去办吧。” (通过审核)
  妻子:“还有,最近家里花销太大,用你的私房钱来补贴一下,好吗?” (最后就是应收货款的催要)
  现在还有人不理解ERP吗?记住,每一个合格的家庭主妇都是生产厂长的有力竞争者。

Monday, June 05, 2006

Remove SQL Server 2005

Today I got some error while installing Sql Server 2005. It told me some component aready existed because of previous failure installation. But the problem is I can not find anywhere to remove this component in "Add/Remove program".

That's How I have to do:
1. Stop all SQL Server services
2. Make sure that Microsoft SQL Server Setup Support Files appears in the list of installed programs. If not, goto 3, if yes goto 4
3. If Microsoft SQL Server Setup Support Files does not appear in the list, install this component before you continue. To install this component, follow these steps:

A. Locate the original SQL Server 2005 installation media.
B. To install the support files, double-click the Servers\setup\sqlsupport.msi file.

4. Run the command to uninstall the SQL Server components
At a command prompt, run the following command:
"%ProgramFiles%\Microsoft SQL Server\90\Setup Bootstrap\ARPWrapper.exe /Remove"

More

Friday, March 17, 2006

配置比较安全的远程控制服务器

提到远程控制软件,大家并不陌生,比较出色的远程控制软件有 VNC, Symantec pcanywhere, Microsoft Romote Desktop Connection等等。

但是vnc凭借着他比较小的体积,比较快的速度,以及比较好的跨平台性能而出众,我用vnc远程连接windows95,98,nt,2000,xp,2003当然还有unix家族的系统。

RealVNC--小巧、有效、免费、跨平台、使用简单,而且也有必要的安全机制(原版VNC的安全机制还是有些稍嫌简陋,不过有一群俄国人正在做更安全的改版)。对于跟我一样的个人用户来说,VNC太棒了。

UltraVNC--基于RealVNC的一个很棒的改进版,速度狂快,内建文件传送。在带宽足够的情况下,客户端连接时指定占用带宽最大的Ultra模式(2Mbits/s),则几乎不再出现屏幕刷新不及时的问题,效果几乎和微软的远程桌面一样好,超越了pcanywhere。

TightVNC also offers a number of improvements, including compression to optimize transfer over slower connections, graphical support for advanced configuration options, and automatic SSH tunneling for Unix systems.

但是vnc并不支持安全加密的传输网络中的数据,这便是个遗憾了,因此,我找到了stunnel这个软件来弥补这个不足,这个软件是对socket端口进行加密解密传输的软件,需要openssl库的支持,具体做法如下:

现在先划分一下结构,一台vnc服务器,一台vnc客户端。

在两台机器上分别安装了vnc后,客户端可以很顺利的连接到vnc服务器,但是这个连接是不安全的。

下面只需要在两台机器上分别安装好stunnel软件,在两台机器上还要进行一下配置

首先在服务器方面,在c:\program files安装stunnel

在客户端的c:\program files安装stunnel

接下来要生成证书,这个证书是基于3方验证的,有一个安全中心来验证服务器和客户端的身份信息

具体方法如下:

安装openssl到c:\program files\openssl

下载2个文件,一个配置文件, openssl.conf,可以从http://www.securityfocus.com/data/tools/openssl.conf下载
ca.bat 脚本文件,用来生成证书,下载地址: http://www.securityfocus.com/data/tools/ca.bat

这2个文件也必须放置到C:\Program Files\OpenSSL.文件夹


接下来生成证书,用来鉴别VNC的服务器和客户端.
生成密匙和证书
CA认证
这个过程首先应该产生一个私人/公共密钥对,同时产生一个第三方信任的证书.在随后的过程中私人密匙将用来签发VNC服务端和客户端的证书,CA证书将被分配给所有的VNC服务端和客户端.因为CA私人密匙是PKI执行过程中最重要的基础之一,所以密匙应该被赋予一个通行码(pass phrase)。 通行码也可以被称做为口令,是用来保护私匙的密码,用户可以自由选择。不用口令是不能使用私匙的,因此口令和私匙同样重要。需要选取一个安全的口令。.
我们通过ca.bat这个批处理文件来产生密匙对和证书:
C:\program files\OpenSSL\ca genca

完成以上步骤之后,CA证书将存储在c:\ca\cacert.pem文件中,私人/公共密匙对存储在C:\CA\private\CAkey.pem文件中。


VNC服务端
接下来产生服务端的密匙对和证书。
~OpenSSL\ca genca\OpenSSL\ca server

于是,在C:\CA\temp\vnc_server生成如下文件:
server.key – 私人/公共密匙对
server.crt – 服务器端的证书
server.pem - server.key + server.crt (在使用Stunnel时将用到)
应该强调的是,服务端的私匙并没有通行码来加密,使用通行码来加密私匙的方法并没有在这里派上用场,主要是因为Stunnel尚不支持通行码,其次,是用通行码加密后的私匙将不能被用于Stunnel软件。

VNC客户端

最后一步是产生客户端的密匙对和证书。
~OpenSSL\ca client


跟服务端类似,在C:\CA\temp\vnc_client文件夹中将产生如下文件:

client.key –私人/公共密匙对r
client.crt – 客户端证书
client.pem – client.key + client.crt (在使用Stunnel时将用到)


最后就要设置stunnel了

在vnc服务器端,c:\program files\stunnel中建立配置文件stunnel.conf

CAfile = CAcert.pem
CApath = certificates
cert = server.pem
client = no
verify = 3

[vnc]
accept = 443 ;将所有的443端口的请求转发到127.0.0.1:5900上
connect = 127.0.0.1:5900

接下来,将刚刚生成的ca证书(C:\CA\CAcert.pem)和VNC服务端的密匙,证书(C:\CA\temp\vnc_server\server.pem)放到C:\Program Files\Stunnel
最后我们也必须安装VNC客户端证书,要想使隧道程序在鉴定过程中找到证书,我们必须按照以下方法来更改证书名称。(以下命令必须在产生证书的服务器上运行,其中value为运行openssl x509命令之后的输出结果,在使用copy命令时,value必须要用这个实际的输出结果代替。)
cd C:\CA\temp\vnc_client
C:\progra~1\openssl\openssl x509 -hash -noout -in client.crt
value(假设这个值为6a03212)
copy client.crt 6a03212.0

然后这 6a03212.0文件应该被放到vnc服务器的C:\Program Files\Stunnel\certificates

VNC客户端

在客户端配置的情况和以上的步骤类似
首先C:\Program Files\Stunnel\新建一个stunnel.conf文件
内容:
CAfile = CAcert.pem
CApath = certificates
cert = client.pem
client = yes
verify = 3

[vnc]
accept = 127.0.0.1:5900
connect = VNC_server_IP_address:443

接下来,将ca证书(C:\CA\CAcert.pem)和VNC客户端的密匙,证书(C:\CA\temp\vnc_client\client.pem)放到C:\Program Files\Stunnel
同样我们需要按照以下方法来更改证书名称。

cd C:\CA\temp\vnc_server
C:\progra~1\openssl\openssl x509 -hash -noout -in server.crt
value(假设这个值为6a03212)
copy client.crt 551234.0

然后这 551234.0文件应该被放到vnc服务器的C:\Program Files\Stunnel\certificates

到这里所有的操作就完成了,需要注意的是,我们再用vnc连接vnc服务器的时候,ip地址就不要输入服务器的地址了,因为那样依然没有通过stunnel做加密。正确的做法应该是使用127.0.0.1这个ip,我们从客户端stunnel配置文件可以看出来,在客户端所有的127.0.0.1:5900(vnc连接请求)都会通过443这个端口转发到vnc_server_ip_address这个ip上。而这个ip就是我们的vnc服务器ip。当数据通过443传达到vnc服务器的时候,由于vnc服务器的设置,他会将443端口过来的信息转发到它本地(127.0.0.1)的5900端口上,这样便使得我们的数据发送到了vnc服务器中,整个的过程图示如下:



附: UltraVNC进阶技巧

1. 开机就玩远程控制
在“开始→运行”中输入“C:\winsock\UltraVNC\winvnc.exe -install”(不含引号)完成服务的安装,这样以\winsock\UltraVNC\winvnc.exe -remove”(不含引号),可以卸载服务。

2. 隐藏系统托盘图标


有时我们不需要UltraVNC在任务栏上显示图标,甚至希望UltraVNC在后台“默默”地运行,那么你可以打开“记事本”,输入如下内容,保存为REG文件,并运行将其导入注册表(Windows 9x用户修改第一行为REGEDIT4):

  Windows Registry Editor Version 5.00
  
  [HKEY_LOCAL_MACHINE\SOFTWARE\ORL\WinVNC3]
  "DebugMode"=dword:00000002
  "DebugLevel"=dword:0000000a
  "AllowLoopback"=dword:00000001
  "MSLogonRequired"=dword:00000000
  "UseDSMPlugin"=dword:00000000
  "DisableTrayIcon"=dword:00000001

3. 禁止使用UltraVNC
打开“注册表编辑器”,依次展开[HKEY_LOCAL_MACHINE\Software\ORL\WinVNC3\Default],在其下建立“双字节值”,键名为“AllowProperties”,键值为“0”。设置后,其他人就无法再修改启动“UltraVNC服务器”了。

4. 局域网外如何使服务器端发出连接信号
控制端在公网, 而服务器端在内网, 用到“反向发起连接”的功能。
a. 在控制端,运行“Run UltraVNC Viewer (Listen Mode)”,这时,客户端在进行监听,等待请求连接的信号。
b. 在服务器端,添加新客户,直接填写,控制端的公网ip地址,这样就发送了请求控制的信号给客户端。之后连接成功,就可以从公网直接穿过防火墙,透过路由器,控制了在局域网内的机器。
c. 在局域网外如何使服务器端发出连接信号呢?可以利用windows的任务计划功能,添加如下的任务,
"c:/program files/ultravnc/winvnc.exe" - connect 202.158.14.36:display用你自己客户端之ip地址来代替上面的,就可以了,修改任务为在指定时间开始,如11点开始,每过5分钟运行一次。
这样就完成了设置。
如果多个人想控制一台服务器,也需要反向连接,否则按照一般办法,谁最后发控制命令,VNC server 会断开之前的连接,始终只有最后一个与服务器进行成功连接的客户端!除非反向连接。

附: Window Remote Desktop Connection设置
自Windows 2000开始,微软就提供一项终端服务(Terminal Server)这项服务可以将远程的桌面传递到本地。通过该服务,可视化的远程管理可以非常方便的实现。继Windows 2000之后,Windows XP也提供这项服务。在Windows XP 中的Terminal Server Client程序比Windows 2000中的那个有了进一步的发展,许多功能都强大了许多。

Windows Server 2003 Service Pack 1 Administration Tools Pack


技巧一:默认端口也修改

大家应该知道远程桌面连接默认使用的端口是3389

将下列两个注册表键中的 PortNumber 均改成自定义的端口即可:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\Tds\Tcp

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp

值得注意的是在输入被访问计算机IP地址时需要使用类似ip:port的形式。

技巧二:"The remote computer has ended the connection" 的问题
把以下设成0就可以了,表示Enable Distributed File System.
HKLM\System\CurrentControlSet\Services\Mup\DisableDFS = 0

技巧三:二次远程混淆解决方法

技巧描述:大家看到这个技巧名字可能不太明白,其实意思就是说我们从家中计算机A通过远程桌面连接到单位计算机B后,在计算机B上再使用远程桌面连接到计算机C,这就称为二次远程。

混淆现象:家中计算机A使用ADSL上网,单位接入服务器B(外网IP为211.154.80.29,内网IP为10.82.0.29),单位内部服务器C(IP地址为10.82.0.240)。由于服务器C没有公网IP地址在家是不能直接访问的,所以要想在家能够通过远程桌面连接到服务器C进行控制就必须进行二次远程连接,即从计算机A远程连接到服务器B211.154.80.29上,再从服务器B连接到服务器C。由于采用全屏幕操作所以从B连接到服务器C上后远程桌面界面上方显示的IP地址仍为211.154.80.29,并不是10.82.0.240。这时候想将服务器C与服务器B的桌面连接断开就不行了,因为一旦点右上的关闭按钮则会关闭A与B的连接,以后再用远程桌面连接到B时界面仍是在服务器C上。如果选择注销虽然可以断开B与C的连接但刚刚登录C运行的程序会立即关闭。

解决方法:其实有两种方法来解决这个混淆问题。
√ 方法一:窗口法
不使用全屏幕模式而改用窗口模式。(如图4)这样窗口的标题将显示出211.154.80.29,而窗口内显示的是正常的10.82.0.240,从而直接点窗口中10.82.0.240旁边的关闭按钮就可以断开B与C的连接了。

图4 点击看大图


√ 方法二:隐藏浮动条法
在使用远程桌面成功连接到远程计算机上后会在界面最上方有一个条状区域显示当前IP地址,我们点这个条状区域最左边的那个按钮就可以让条状区自动隐藏,(如图5)这样在C上使211.154.80.29浮动条自动隐藏后则真正的IP地址10.82.0.240就显示出来了,这时候直接点关闭按钮就可以断开C与B的连接了,而C上运行的程序也不会被关闭。


图5



技巧四:非管理员也玩远程桌面连接

环境描述:大家都知道只有管理员组用户才可以通过远程桌面连接程序管理服务器,非管理员组用户是没有远程桌面使用权限的,不过笔者所在公司有专门的人负责服务器上数据库的管理工作,而本人负责只服务器的日常维护。为了提高安全数据库管理人员不是管理员组的用户而他们又需要在家中登录服务器管理数据库。这时候就涉及到非管理员组用户也要使用远程桌面连接的问题。

WIN2000解决方法:我们通过任务栏的“开始->设置->控制面板->管理工具->终端服务配置”,在“连接”的“RDP-Tcp”属性里进行设置。(如图6)RDP-TCP属性中选择“权限”标签,通过“添加”按钮将你容许远程访问的用户组添加近来并配置相应的权限即可完成非管理员组的远程桌面访问。

图6

WIN2003解决方法:在WIN2003中的配置相对简单,因为系统内置了一个REMOTE DESKTOP USERS组,(如图7)我们把容许远程访问的用户添加到REMOTE DESKTOP USERS组中即可完成非管理员组的远程桌面访问。

图7 点击看大图


技巧五:远程桌面也玩代理

环境描述:由于公司处在教育网内,所以在家通过ADSL访问公司服务器速度非常慢,可是远程桌面程序选项中也没有提供设置代理服务器的地方,这时我们可以通过第三方代理工具来解决远程桌面用代理的问题。

实现方法:远程桌面程序只能使用SOCKS代理,我们可以下载sockscap32代理程序,然后把终端连接程序加到代理列表中即可,(如图8)这样我们使用终端连接程序时就可以通过sockscap32中设置的代理连接到公司服务器了,加快了服务器的访问速度。

Saturday, March 11, 2006

Ruby on Rails

1. 什么是RUBY ?
Ruby 是由日本人松本行弘发明的一种面向对象的脚本语言.声称,更快,更通俗易懂的面向对象的语言,本人接触这段时间,感觉到关于面向对象的确做得不错.一些特点:

1)一切都是对象,例如:
数据类型转换提供如 to_ary,to_i,to_s 等方法,
@i = "2".to_i //字符串转数值类型
puts @i+1
不再象java中的诸如:
Integer.parseInt()
String.valueOf()
那样难看与及难以理解

Time.now.strftime(fmt) 
Time.now对象通过strftime格式化日期类型  
再如koalant在它那本ruby on rails实践中说到 -166.abs 可以直接取其-166绝对值 ………………

2)代码块非强制用{} ,无需 ; 作分行标识;

3)语法灵活,一种可以功能可多种实现,随个人爱好;

4)语法简洁等,做一个应用只要用到几行代码,这也是脚本语言的优势所在

更详细可参考 http://www.ruby-lang.org/ 以及下面提供的些文档资料.

2. 什么是Rails
RAILS是丹麦的小伙子David用RUBY开发的一个web框架. 也叫Ruby On Rails(ROR),它采用模型/视图/控制器(model/view/controller,MVC)架构。
实现一站式开发. http://www.rubyonrails.org/ 有比较详细的介绍.
声称用更少的代码实现web applications。
此框架主要包括三部分
Active Record 一个ORM实现 , 是 Rails 的一个核心组成部分,它将关系型表映射为 Ruby 对象,应用程序的 app/models/ 目录中的 Ruby 文件能够调用 ActiveRecord 的多种验证方法。
Action Pack View 以及controller
控制器以其抽象形式执行应用程序的逻辑。也就是说,应用程序的 app/controllers/ 目录中的 Ruby 脚本能把模型数据导入为变量,保存回去,或对其进行修改和处理。不过,控制器不关心用户如何适当地显示或者输入数据。
视图是我们编写 Ruby 代码的地方。Rails 包含有一门用于 .rhtml 的非常好的模板语言,它将纯粹的 HTML 与嵌入的 Ruby 代码组合起来。 Rails 应用程序界面的最表层外观通常是由 CSS 样式表单控制的。.rhtml 格式是一种增强的 HTML。
Action Mailer 应该是关于mail方面的东西

3. ROR设计思想: 新兴的Web Application快速开发框架
和Python, PHP, VBScript类似, Ruby也是一种动态脚本语言, 但相比Python有更广泛的应用范围, 同时Python有一大特性:Python能够与C无缝集成,现在IronPython又能够与C#集成.
在Python下类似ROR的开发框架有:CherryPyKarrigellTurboGearsDjango, 它们的比较可以看这里http://perhaps.cnblogs.com/archive/2005/10/14/254670.aspx, 和中国的Pathon社区中的一篇文章[Karrigell学习]我为什么选择了Karrigell .
.Net阵营中,CASTLE就是.Net里的ROR设计思想的实现, 主页看这里http://castleproject.org/index.php/ActiveRecord.

一些资料
Really Getting Started in Rails
Rolling with Ruby on Rails Part1 Part 2
Ajax on Rails
Top 12 Ruby on Rails Tutorials
[rails] 我的订餐系统 -- 小试ruby on rails
http://www-128.ibm.com/developerworks/cn/linux/l-rubyrails/#resources 使用 Ruby on Rails 快速开发 Web 应用程序
http://www-128.ibm.com/developerworks/cn/java/wa-rubyonrails/ Ruby on Rails 和 J2EE:两者能否共存?
http://www.rubycentral.com/book/index.html Programming Ruby

Friday, March 03, 2006

AJAX

老赵点滴

Dflying Chen @ cnblogs

Atlas三月份CTP版发布,文档同时大幅更新
http://atlas.asp.net/Default.aspx?tabid=47
atlas.asp.net上Scott Guthrie的Atlas演示录像非常值得一看

Resources:
http://atlas.asp.net/ ATLAS ASP.NET AJAX
Atlas 实现机制浅析
http://ajaxpatterns.org/ AJAX Pattern
http://ajax.schwarz-interactive.de/csharpsample/default.aspx free library for the Microsoft .NET Framework
Bitkraft Integrated Client/Server approach to Ajax Development in the ASP.NET environment PowerWEB LiveControls for ASP.NET Ajax for Visual Studio ASP.NET

Multiplatform
Backbase Community Edition includes all presentation client (Ajax) functions and full utilization of BXML (B-tags).
WebORB by Midnight Coders. .NET and Java Server platform for Ajax-based applications.
http://all.allnet.cn/News/Details.aspx?aid=132 Ajax 学习资源

AJAX经典应用网站  
http://maps.google.com
http://www.writely.com
http://www.meebo.com  
http://local.live.com   
http://www.google.com/ig  
http://www.live.com  
http://www.netvibes.com/  
http://www.pageflakes.com/  
http://www.favoor.com/  
http://www.eskobo.com/  
http://www.protopage.com/v2  
http://www.zoozio.com/  
http://webserver002.goowy.com/  
http://www.wrickr.com/  
http://www.cfempire.com/home  
http://www.okrss.com/  
http://labs.systemone.at/retrievr
http://www.fcsoft.com.cn/ 方成正康软件

Javascript on Firefox & IE

Javascript on Firefox & IE

JavaScript语言中的Literal Syntax特性
http://www.cnblogs.com/birdshome/archive/2005/02/26/105867.html

1. XmlHttp: IE是用ActiveX方式,而Firefox是内置实现的
xmlHttp=new ActiveXObject('Msxml2.XMLHTTP'); //IE
xmlHttp=new XMLHttpRequest(); //FF
可以用下面的写法,可以比较好的兼容IE和Firefox:
function createXH(){
var A=null;
try { A=new ActiveXObject('Msxml2.XMLHTTP') } catch(e) {
try{A=new ActiveXObject('Microsoft.XMLHTTP') } catch(oc) { A=null }
}
if ( !A && typeof XMLHttpRequest != 'undefined' ) { A=new XMLHttpRequest() }
return A
}

请求和接收回应
var xmlhttp=createXH();
xmlhttp.open('POST', 'Message/CheckNew.aspx', false); //false - 同步执行的方式 ; true - 异步执行的方式
xmlhttp.send(''); // 这里也可以在请求时发送一些数据,如果没有数据,也要发个空数据
var rt=xmlhttp.responseText;

异步执行下接收回应:
var xmlhttp = createXH();
function checkNewMessages(){
xmlhttp.open('POST', 'Message/CheckNew.aspx', true);
xmlhttp.onreadystatechange=continue;
xmlhttp.send('');
}
function continue(){
if(xmlhttp.readyState==4){
var rt = xmlhttp.responseText;
}
}

2. event object
In Firefox, it's passed in to the event handler
Unfortunately, IE holds the event in a window attribute instead of passing it in
function shutdown(ev) {
ev = window.ev ev;
....
}

3. What attributes of the Event should be inspected
Element - target (Firefox), srcElement (IE)
Event type - type
Key code - which (Firefox), keyCode (IE)
Key modifiers - altKey, ctrlKey, shiftKey
Mouse buttons - button: In IE, 1 is left, 2 is right, and middle is 4. Value represents the sum of all buttons being pressed
In Firefox, 0 is left, 1 is middle, and 2 is right.
Mouse position - clientX, clientY

4. How should event handlers be dynamically registered
quitButton.onclick = shutdown (IE)
quitButton.attachEvent('onclick', shutdown) (IE)
quitButton.addEventListener('click', shutdown, false) (Firefox)

Monday, February 06, 2006

Query Deadlocking itself because of parallelism: OPTION (MAXDOP 1)

ASP.NET 2.0 error in ExecuteQuery:
Transaction (Process ID 71) was deadlocked on thread communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

While execute the following query:
SET NOCOUNT ON
BEGIN
DECLARE @CountOrd int
DECLARE @CustID nvarchar(50)
DECLARE @Start int
DECLARE @End int
DECLARE @Count int
Set @CustID = 'ACD'
Set @Start = 1
Set @End = 25
CREATE TABLE #op(PK int,CountOrd int, Ord int IDENTITY(1,1))
CREATE INDEX op1 ON #op(Ord)

INSERT INTO #op(PK)
SELECT PKID FROM Orders WHERE Orders.OrdStatus <> 'C' AND Orders.OrdStatus <> '0'
And Orders.CustID in (Select Customer From AllowedCustTable(@CustID))
ORDER BY OrdStatus
END

SELECT #op.Ord,od.*,dbo.OrdStrStatus(od.OrdStatus) AS OrdStrStatus
FROM #op LEFT JOIN Orders od ON #op.PK = od.PKID
WHERE #op.Ord BETWEEN @Start AND @End

Select @CountOrd= Count(#op.PK) FROM #op
Set @Count=@CountOrd

DROP TABLE #op


But we can not find any other is access the same table, so probably deadlocking itself because ofparallelism which can happen, try stop parallelism by using MAXDOP 1 onthe OPTIONS clause of the UPDATE/INSERT statement. After change to the following it works:

ORDER BY OrdStatus OPTION (MAXDOP 1)

Saturday, February 04, 2006

Bypass WGA Validation Failure

Microsoft "Genuine Advantage" cracked in 24h: window.g_sDisableWGACheck='all' AV sez, "This week, Microsoft started requiring users to verifiy their serial number before using Windows Update. This effort to force users to either buy XP or tell them where you got the illegal copy is called 'Genuine Advantage.' It was cracked within 24 hours."
Before pressing 'Custom' or 'Express' buttons paste this text to the address bar and press enter:
javascript:void(window.g_sDisableWGACheck='all')
It turns off the trigger for the key check.

==> http://www.boingboing.net/2005/07/28/microsoft_genuine_ad.html

The bug was fixed but new crack here for LegitCheckControl.dll Version 1.5.530.0 by TEAM ETH0==>
http://www.9down.com/search.php?s=Windows+Genuine+Advantage+Validation&module=stories&topic=0&date=0&range=title


Remove Microsoft WGAWarning:
http://www.mydigitallife.info/2006/0...ns-nag-screen/
http://blog.asmemesa.org/?cat=1
简单的方法,可以把以下三个文件的访问权限禁止就可以了:
cacls /d everyone c:\WINDOWS\system32\WgaLogon.dll
cacls /d everyone c:\WINDOWS\system32\WgaTray.exe
cacls /d everyone c:\WINDOWS\system32\LegitCheckControl.dll

=======================================
Win7 Ultimate Key

KH2J9-PC326-T44D4-39H6V-TVPBY
TFP9Y-VCY3P-VVH3T-8XXCC-MF4YK
236TW-X778T-8MV9F-937GT-QVKBB
87VT2-FY2XW-F7K39-W3T8R-XMFGF
J783Y-JKQWR-677Q8-KCXTF-BHWGC
C4M9W-WPRDG-QBB3F-VM9K8-KDQ9Y
2VCGQ-BRVJ4-2HGJ2-K36X9-J66JG
MGX79-TPQB9-KQ248-KXR2V-DHRTD
FJHWT-KDGHY-K2384-93CT7-323RC

6JKV2-QPB8H-RQ893-FW7TM-PBJ73

TFP9Y-VCY3P-VVH3T-8XXCC-MF4YK
KH2J9-PC326-T44D4-39H6V-TVPBY