溢泽's profile冲冲冲PhotosBlogLists Tools Help

溢泽 林

Photo 1 of 10
Lists

冲冲冲

March 31

谈论POSA2读书笔记(二)

 豁然开朗~

引用

POSA2读书笔记(二)
呵呵,距离第一篇已经过了半年了……这本书其实翻完已经很久了,但是实践中没有使用到的东西总是一知半解,写出来会误导大众,所以还是不写的好。
 
今天在为Cindy 3.0a1中并发模型设计头痛的时候,翻了翻这本书中的相关模式,突然有种豁然开朗的感觉:)
 
Half-Sync/Half-Async:这个模式是从Cindy 1.x一直沿用下来的模式,我估计也是基于NIO的网络应用里面最常用的并发模型。简单的用伪码说:
while (select() > 0) {
    getReadyEvents();
    deactiveEvents();
    addEventsToQueue();
}
网络IO线程不停的select,并把发生的事件添加到某个队列;若干个工作线程并行的从该队列中取的相应的事件,并分发给应用。网络IO线程是串行化的,而工作线程是并行的,所以这个模式就叫半同步/半异步模式。
 
Leader/Followers:这是今天才豁然开朗的模式:) 在上面的半同步/半异步模式中,瓶颈主要有三处:
  • 动态内存分配。网络IO线程把事件添加到队列,工作线程从队列中取事件,不停的有添加删除操作,队列大小在不停的发生变化。
  • 多同步操作。在对队列进行添加和删除操作时需要对队列进行同步(或者是在队列内部进行同步),同时各个工作线程之间从队列中取相应事件时需要同步。
  • 线程切换:需要不停的在网络IO线程和各工作线程之间做语境切换。比如假设首先所有的工作线程都处于等待状态,这时来了某一个事件,工作线程A被唤醒,去处理该事件;然后又来一个事件,工作线程B被唤醒,去处理该事件;A工作完又回到等待状态,然后又被唤醒……

那么领导/追随模式是怎么样来避免上面的这三个瓶颈呢?

首先领导线程在通过select得到了许多的响应事件,然后领导线程把其中一个从selector上移除,并把一个追随线程提升为领导线程,然后自己就变成了工作线程处理该事件,等到事件处理完成后再变成追随线程或领导线程(如果结束时已经没有可用的领导线程的话)。

这个模式不需要进行动态内存分配,同步操作也比上一个模式少很多,由于领导线程直接变成工作线程处理事件,最大程度的减少了线程切换,所以上面那三个瓶颈都能够得到很好的解决。但是这个模式也有相应的缺点:实现复杂,不像半同步/半异步模式能非常简单的实现。所谓有得必有失呀:)

 

这里可以做一个简单的比喻为两种模式做一下总结。场景是把一堆书从A地经过B地搬到C地(我想不到其他好的例子)。

如果是半同步/半异步模型的话,就是有一个人负责把书从A地搬到B地,其余的人在B地等着,一旦B地书来了,就把书再搬到C地。

如果是领导/追随者模型的话,则是所有的人都在A地排队等待,每个人搬一本送到C地,然后回来排到队伍的最后面。(领导/追随者模型并没有规定次序,所以回来后不一定是排在队伍的最后面,反而是非常有可能排在队伍的第二个位置,这样可以提升系统性能)

 

January 16

[计划]将draw2d移植到c#

      前面一段时间有个项目是用java开发图形编辑程序,开发工具用eclipse,图形编辑框架用GEF。现在一个新的项目要用c#来开发图形编辑程序。
      我只知道c#有一套绘图API是GDI+,好像没有图形库。
      我想,最好在c#下能有一套象draw2d那样的矢量图形库。我在网上找了半天都找不到。看来这种好东西c#开发者不舍得开源的,sigh...
      看来只好自己来移植了。draw2d是lightweight(轻量级)的,移植起来应该没什么困难,不过工作量不小。
      计划步骤:1、学习c#语言(以前都没用过,-___-!)
                     2、熟悉c#界面应用程序开发,特别是事件处理、绘图API。
                     3、将draw2d几何包部分先移植过去(较easy)
                     4、移植draw2d的核心部分:LightweightSystem、Graphics、UpdateManager...(最重要)
                     5、移植各种Figure。

SWT……内幕?

FooSleeper 翻译

原文:
http://groups.yahoo.com/group/straight_talking_java/
http://groups.yahoo.com/group/straight_talking_java/messages/24236

翻译整理:FooSleeper
最后修改:2004-03-03

译注:本文来自straight_talking_java@yahoogroups.com讨论组,已经一年多前的文章。Alan WilliamsonJava Developers Journal的编辑,下文来自他在IBM的一个消息来源。SWT和Swing的论争我见过不少,Netbeans和Eclipse的也同样多。译者翻译此文并不要激起什么争执,也不支持哪一方(虽然我的确站在SWT一边的),更不要攻击Amy。我最重要的理由,这一篇有趣的文章。里面有内幕、线人、公司政治、垄断巨头、美女、商界风云……足够拍一出电影。有趣,这就够了。不过此文反映了IBM对Swing的看法和SWT的由来,还有一点营养的。

From: Alan Williamson
Date: Wed Nov 6, 2002 10:31 am
Reply-To:
To:
Subject: SWT ... the scoop?(SWT……内幕?)

好了这就来……阅读……消化……再阅读……再消化……
Wink

--------------------------------
谢谢你的回复。我很乐意给你提供Swing和SWT背后的一些信息,既然你还把我当作你秘密的“IBM内幕线人”。

要想弄清楚为什么一切都被弄得如此混乱,要从几年前只存在AWT的时候说起。SUN当时已经建立了一套基本的可移植控件类,这些类映射到不同操作系统上的原生窗口组件(native widget),显然下一步应该继续增强这套模型,除了初始的CUA 92组件(文字、按钮等等),再继续加上表格、树、记事本、滑块等等……当时的AWT还满漏洞,远不能称为可靠,还需要SUN的coder们去修补。SUN的developer们如Graham和Otto总习惯于公开把他们的bug归咎为操作系统的差异,比如“Windows和OS/2的焦点次序不同”或者“在……之间Ctrl-X的行为不一样”,以及其他苍白的托辞,好让批评的火力从SUN太早释出代码这个问题的真相上移开。然后Amy Fowler来到了SUN。不我大男子主义,Amy个聪明的美女,大多数呆头呆脑只懂技术的开发人员都要被她捏在手里。

Amy来自一家Smalltalk公司,叫做Objectshare,在那里她负责搞UI类库。跟Java相比Smalltalk的历史有些悲惨,曾几何时有3家庞大的Smalltalk公司——IBM、Parc-Place和Digitalk。在90年代初期3家公司的市场份额大致相等,生活美好的。Parc-Place采用仿窗口部件(emulated widgets)的设计(即Swing的设计),IBM和Digitalk则采用原生窗口部件(native widgets)。后来IBM压倒了另外两家,因此他们打算合并成一家,假设叫做Parc-Place Digitalk。随后当他们试图将他们的产品融合到一个叫做Jigsaw的计划中时爆发了一场大战,计划由于政治原因失败了(开发人员实际上已经能让它运转起来),就因为原生和仿造两派的死战。Amy赢得了精神上的胜利,不过在IBM我们赢得了他们所有的生意,因为这两家公司在一整年里除了吵架什么都没做。当尘埃落定之后PPD(Parc-Place Digitalk当时已改名为Objectshare,跟Windscale改名为Sellafield的原因相同——让人们淡忘之前发生的灾难)的股票价格从60美元掉到了低于1美元1股。他们因为伪报收入被NASDAQ摘牌,从此消失。此时SUN正走上与PPD类似的技术方向,于PDD的技术人员都把他们的简历投到了SUN。Amy被雇佣了,她承诺通过轻量级方案解决所有窗口组件的问题,因此说服SUN管理层让她当了GUI开发部门的头头。她拿着“这里原来的人都搞砸了,我来解决的”的钥匙进来的。随后Amy雇佣了所有她过去在Parc-Place的旧朋友,让他们来开发Swing。

显然Swing应该做的仅仅成为一个绘制框架,给那些希望创建地图软件或者绘图软件的人们使用,无论如何,应该围绕AWT类库来建造它,按钮之类的东西仍然交给AWT来管。SUN的人比如Philip和Mark已经让AWT能够处理表格、树和记事本(notebook,?),所以Swing的方向应该说很明显了。但那些毁了PDD的人不干,他们非要把一切都弄成轻量级的。由于SUN管理层的无知,再加上Amy无情的政治手段,造成了我们今天所见的混乱局面。Amy还使SUN相信Swing作为Mozilla项目的一部分与Netscape联合开发的,事实上这只她的宣传伎俩。

在IBM,我们从第一天起就憎恶Swing。庞大、满错误,而且难看至极。原先我们的工具如VisualAge for Java都用Smalltalk(用的原生窗口组件)写的,所以当我们将这些工具向Java代码库迁移时,我们需要一套窗口组件。IBM这边的开发人员都原来搞Smalltalk的那一批人,我们对管理层要求用Swing来构建WebSphere Studio工具都非常不情愿。Swing个可怕的充满缺陷的怪兽。在WebSphere Studio最初的预览中,当与Microsoft Visual Studio作对比演示的时候,我们所有的客户都讨厌它,就因为它的外观,而不管它的功能有多强。大多数消费者都不会买一辆让人觉得难看的车,哪怕这车有一台出色的引擎。因此我们开始了一个项目,把我们的Smalltalk原生窗口组件移植到Java上去。这个项目加拿大的Object Technology International小组做的。这个项目获得了成功,被运用在在我们发布的VisualAge Micro Edition产品中,VisualAge Micro Edition后来成为J2ME开发方面一个非常成功的IDE。但OTI的人发现,Swing在读取Windows事件方面有极严重的缺陷,我们甚至无法进行SWT(S开始Simple的缩写,不过后来变成了Standard的缩写)和Swing间的互操作。他们在读事件队列的时候用了一种可能留下内存漏洞的方式,所以我们不得不采用我们自己的查询Windows事件队列的循环,以纠正这个错误。我们试了一次又一次让SUN修复这个错误,但Amy就听不进去,所以我们才决定SWT和AWT/Swing不能共存。我们甚至在SWT中定义了自己的Point和Rectangle类——整个工具包对AWT或Swing都没有任何依赖。我们把这个工具包放到了Eclipse中,这一个工具平台,它的总体设计目标就要战胜Micrsoft和Visual Studio。Eclipse开源的,所以任何人都可以在上面构建自己的东西,我们已经有像TogetherSoft和Rational这样的公司移植到了上面。我们的竞争者Microsoft,所以我们所有努力和注意力都从正面针对Microsoft。

不管怎么说SUN对此非常不满。他们的Netbeans跟Eclipse做的相同的事,因此他们向IBM高层抱怨。他们认为SWT要将你绑到Windows上,这纯粹胡说,因为SWT能通过GTK在Mac/Linux上运行,以及一大堆嵌入式平台。他们拒绝让Eclipse获得Java认证,因为里面有原生代码,所以Eclipse产品必须很小心地使用单词“Java”这个SUN的商标。Eclipse甚至不能把自己称为一个Java IDE,SUN已经威胁过要采取法律行动来制止IBM在任何时候把Eclipse称作一个Java IDE。结果之一就IBM在Eclipse上创建的GUI设计工具,允许你构建Swing/AWT GUI,却不让你往里面拖放SWT窗口控件。

将SWT从Eclipse中分离出来完全可能的,只需要把DLL抠出来放到路径中,并使用窗口组件工具包来给你的银行或者保险或者其他什么应用程序开发GUI。再次说明,我们无法更进一步,因为SUN把我们的双手绑上了。虽然作为Eclipse开放源码协议的一部分,CPL允许我们提供这样的解决方案,但SUN已经很清楚地表明他们不希望我们这样做。

对于用户社区来说,无论IBM和SUN的最终动机什么,我发现有一点总很有趣:喜爱Swing的人总会说“一旦你花上几年时间去掌握它,你就能正确地使用它”,这基本上他们在试图证明和维护他们辛苦得来的用途有限的专门技术;而SWT的拥护者们说的“哇,这真快,这跟原生的一样,还可以用XP皮肤……它还又轻又小”。有一句话我喜欢的,我们的一个用户说,Swing就像Java决定不通过操作系统来实现原生的IO,而通过磁头马达API自己来读磁盘的扇区。Swing基本上就这样的,它拿着个底层的“paint(Graphics)”方法,自己来绘制所有的窗口组件。
--------------------------------

后记:现在的情况已经有所不同,SWT到底还单独发布了,VE也承诺在1.0版的时候支持SWT的GUI设计。

什么是轻量级方法?

What is a Lightweight Methodology?
什么是轻量级方法?

A software methodology is the set of rules and practices used to create computer programs.
软件方法就是用来编写计算机程序的一套规则和惯例。

A heavyweight methodology has many rules, practices, and documents.
重量级方法具有很多规则、惯例、和文档。

It requires discipline and time to follow correctly.
正确地遵循它们需要训练及时间。

A lightweight methodology has only a few rules and practices or ones which are easy to follow.
轻量级方法仅具有很少的一些规则和惯例,或者说,这些规则和惯例遵守起来很容易。

In the late 1960s and early 1970s it was common practice for computer programmers to create software any way they could.
在20世纪的60年代后期以及70年代早期,计算机程序员随意使用他们能够使用的任何方式来写软件是件非常常见的事情。

Many programmers excelled at creating software too complex for anyone to understand.
很多程序员竞相写出复杂得对于任何人来说都无法理解的软件。

At that time it was a miracle if a program ran without any bugs.
如果有一个程序,它没有任何的bug,在那时可称得上是个奇迹。

Making computers useful was considered a worthy quest and not unlike an adventure into the old west.
大家都认为让计算机有用武之地是个有价值的追求,不能说不象老早的西部冒险之旅。

In 1968 Edsger Dijkstra wrote a letter to CACM entitled GOTO Statement Considered Harmful.
Edsger Dijkstra于1968年给CACM(应该是Communication of the Association for Computing Machinery: 计算机器 协会 通信)写了一封题为“GOTO语句其实有害”的信。

The central ideas of software engineering were being born.
自此,软件工程的主要概念开始成型。

At that time we believed that bigger, more disciplined methodologies would help us create software with consistent quality and predictable costs.
那时大家认为更全面、更严谨的方法可以帮助我们创建品质可靠、成本可准确估计的软件。

The lawless cowboy coders were being reined in.
无法无天、牛仔式的编码者们被悬崖勒马。

The 1980s were good times for computer programmers.
20世纪80年代正是计算机程序员们的好时光。

We had a few rules and practices to create software that was far superior in quality to what we were creating only a few years earlier.
我们有了一些规则和惯例。从质量上讲,我们这时写的软件远远优于仅仅是写于几年前的软件。

It seemed like if we could just create enough rules to cover the problems we encounter we could create perfect software and be on time.
似乎可以认为:如果能够建立足够多的规则,可适用于所有能够碰到的问题,我们就能够写出完美的软件,并且还能按时完工。

We added more and more rules and practices to cover all the potential problems.
于是乎就有了越来越多的、适用于所有潜在问题的规则和惯例,

Now in the 21st century we find these rules are hard to follow, procedures are complex and not well understood and the amount of documentation written in some abstract notation is way out of control.
现已进入了21世纪,我们发现,这些规则遵守起来非常困难,其过程很复杂,也没有得以透彻地理解;使用各种抽象符号写就的、海一样的文献犹如脱缰的野马纷至沓来。

Trying to come up with a bigger and better methodology was like a California gold rush; everyone headed west only to be disappointed.
大家热火朝天,都想提出更全面、更好的方法,跟California(加利福尼亚,加州)淘金热似的真有一比;每个到了西部的人却都很失望。

We created software to help us create software.
我们写出了能够帮助我们写软件的软件。

But this quickly got out of control and dreadnought CASE tools were born.
但是,这很快就乱了套,各种重磅炸弹似的CASE工具迎面而来。

These tools, originally created to help us follow the rules, are too hard to use themselves.
这些工具原本是用来帮助我们遵守规则的,可它们用起来很是困难,简直都没法用。

Computer programmers find it necessary to cut corners and skip important practices to stay on schedule.
要按时完工,计算机程序员发现他们必须抄近路,忽略一些重要的惯例。

No one is actually following the heavy methodologies we have handcuffed ourselves with.
实际上没有一个人真的遵守那些曾经用来自缚的重量级方法。

The cowboys have returned and we find ourselves back at the OK Corral.
牛仔又回来了,我们回到了俄克拉荷马州(译者注:俄克拉荷马州是偶对OK的猜测,因为偶了解到俄克拉荷马州曾经是往美国西部输出劳工的一个大州,但可能有误,呵呵)的畜栏之中。

When programmers ignore the rules of their methodology they are instinctively moving away from heavyweight methodologies and back toward an earlier, simpler time of lightweight methodologies when a few rules were enough.
当程序员忽略了他们的方法中的规则时,他们(实际上是)本能地脱离重量级方法,回到了早期较为简单的、轻量级方法时代,很少的规则便够了。

But we don't want to forget what we have learned.
可我们并不想忘记我们已经学到的东西。

We can choose to keep the rules that help us create quality software and throw away those that hinder our progress.
我们可以把(能够)帮助我们写出高质量软件的规则保留下来,而摒弃哪些阻碍我们前进的哪些规则。

We can simplify those rules that seem too complex to follow correctly.
我们可以对那些复杂得难以遵循的规则进行简化。

We don't want to return to the early days of cowboy coding when there were no rules at all.
我们也不想回到早期根本没有任何规则可言的牛仔式编码时代。

But instead let's stop at just enough rules to keep our software reliable and reasonably priced.
而是让我们止于足够能使我们的软件可靠、适度定价的规则吧。

Instead of cowboy coders we have software sheriffs; working together as a team, quick on the draw, armed with a few rules and practices that are light, concise, and effective.
我们接受软件行政长官而不要牛仔式的编码者;我们作为团队工作在一起,反应敏捷,仅仅用那些轻量级的、简练的和有效的规则和惯例把我们武装起来。

Extreme Programming (XP) is one of several new lightweight methodologies.
极度编程(XP)就是若干这种新式的、轻量级的方法之中的一种。

XP has a few rules and a modest number of practices, all of which are easy to follow.
XP具有若干规则和适当数量的惯例,且所有这些遵守起来都很容易。

XP is a clean and concise environment developed by observing what makes software development go faster and what makes it move slower.
XP是一种干净简洁的环境,它形成于对到底是哪些东西能够加速软件开发,以及哪些东西却起着减速作用的观察。

It is an environment in which programmers feel free to be creative and productive but remain organized and focused.
它是一种使程序员能够自由发挥其创造力和生产力,却同时有保持组织性和凝聚力的环境。

January 13

php生成验证码

<?php
/*
 * filename: authimg.php
 *   author: ymsw
 *     date: 2006-1-12
 */
// 启动session
session_start();
session_register('AuthNum');
Header("Content-type:image/PNG");
srand((double)microtime()*1000000);
$im =imagecreate(50,23);
$fg = ImageColorAllocate($im, 0,0,0);
$bg =ImageColorAllocate($im, 240,240,240);
// 填充背景
imagefill($im,0,0,$bg); 
// 干扰像素
for($i=0;$i<150;$i++)
{
  $randcolor =ImageColorallocate($im,rand(100,255),rand(100,255),rand(100,255));
  imagesetpixel($im, rand()%50 , rand()%23 ,$randcolor);
}
// 随机线段
for($i=0;$i<4;$i++)
{
  imageline($im,rand(0,50),rand(0,50),rand(0,50),rand(0,50),$fg);
}
// 生成新的四位十六进制数验证码
$authnum=strtoupper(dechex(rand(4096,65535)));
// 把验证码保存到session里
$_SESSION['AuthNum'] = md5($authnum);
// 画验证码
imagestring($im,5,8,5,$authnum,$fg);
ImagePNG($im);
ImageDestroy($im);
?>
 
    下面是验证页面:
<?php
/*
 * filename: authpage.php
 *   author: ymsw
 *     date: 2006-1-12
 */
session_start();
srand((double)microtime()*1000000);
//验证用户输入是否和验证码一致
if(isset($HTTP_POST_VARS['authinput'])) 
{
        if(strcmp($_SESSION['AuthNum'],md5(strtoupper($HTTP_POST_VARS['authinput'])))==0)
                echo "验证成功!";
        else
                echo "验证失败!";
}
?>
<form action=authpage.php method=post>
<table>
 请输入验证码:<input type=text name=authinput  maxlength=4 style="width: 40px"><br>
 <input type=submit name="验证" value="提交验证码">
 <img src=authimg.php>
</table>
</form>
 
-----------------注意--------------------
php4.2.0以后的版本要将$HTTP_POST_VARS替换成$_POST
 

【秘密】有一个号码可以让你取消手机的任何服务项目

有一个号码可以让你取消手机的任何服务项目
其实早就有那么一个短信内容让你可以取消你订购的服务或者强加给你的服务,内容就是“0000”四个零,  那发送给谁呢?  这个问题问的太专业了,发送给谁呢,其实发送的号码就是你订购服务的号码,或者是*商硬家给你的号码,如果不知道可以到相关的网站去查,可以看看订购此服务的号码就是了,现在你就可以试试,比如你想取消qq上的某些或所有服务,你就发送“0000”到“1700”上去,马上就有回复,让你选择取消的服务,格式是“qx+数字”,其中“0”是取消所有服务,也就是你发送“qx0”就取消的qq的所有收费服务,其实这是国家给这些短信服务js订的规矩,但是他们害怕大家知道,谁也不告诉大家应该享受的权利,现在好了,我告诉大家了,其实我是从一个做短信的朋友那里得来的,希望大家广泛传播,让js不能得逞,有圈扔圈吧。希望能解除大家的难言之隐,呵呵。  记住发送“0000”(四个零,不是四个欧)到相应号码,随后按回复的短信去做就可以了。

取消服务的通用码有两个:"0000"和"00000",就是4个零和5个零。所有的短信服务
商都默认使用两个代码作为取消服务的代码(虽然很多时候他们自己会制定各项服务的
取消代码),因为这是国家相关管理部门规定的。只要你发送这两个代码之一到服务商
的号码处(就是发短信给你的那个号码的前四位),就可以取消服务。

    很多人也问到4个零和5个零有什么区别?是这样的,"0000"(4个零)是提请取消服
务代码,当服务商收到这个代码后,他会检查你的手机号码在他那里订制了什么服务,
然后会把你订制的服务及取消方法发给你,你必须按照他所说的办法再发送取消代码才
能取消具体的某项服务。而"00000"(5个零)则是无条件取消所有服务的代码,当服务
商收到该代码,就必须取消你的手机在他那里定制的全部服务,同时反馈已取消所有服
务的信息给用户。

    所以说4个零适合于单独取消服务商的单个服务,比如说你的手机在腾讯(1700)上
订制了移动QQ,QQ交友两个服务,而你又只想取消QQ交友而不想取消移动QQ,那么就应
该发送"0000"到1700,然后根据1700发过来的提示来取消QQ交友。如果你是发送"00000"
到1700的话就会把移动QQ和QQ交友两项服务都取消掉。