一个斜杠引起的思考

最近关注 WebService,尝试CXF的一个 Client 样例 时,修改一下,运行,总是报这个错:
Caused by: java.net.MalformedURLException: Invalid address. Endpoint address cannot be null.
……

本来想跳过它了,但是很简单的修改,如下

public static final QName SERVIVE_NAME = new QName(
		"http://ws.leegorous.net", "Hello");
public static final QName PORT_NAME = new QName(
		"http://ws.leegorous.net", "HelloPort");

public static void main(String[] args) {
	Service service = Service.create(SERVIVE_NAME);

	String endpointAddress = "http://localhost:9000/hello";
	service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
			endpointAddress);

	Hello srv = service.getPort(Hello.class);
	System.out.println(srv.sayHi("Leegorous"));
}

感觉离真相很近,但怎么都搞不着的感觉真是糟糕~

于是开始调试,调试一下也不错,可以顺便大概了解下过程,但是越挖掘,越觉得奇怪。小说电视里,经常吹嘘当找不到方向时不妨回到原点,这个的原点就是我修改的部分。

很奇怪的发现样例里初始化QName的第一个参数是以”/”结尾的,我想不会吧。
一边质疑着自己,一边加上斜杠,运行测试,居然成功了!

public static final QName SERVIVE_NAME = new QName(
		"http://ws.leegorous.net/", "Hello");
public static final QName PORT_NAME = new QName(
		"http://ws.leegorous.net/", "HelloPort");

已经找到步向真相的入口了。或许是QName的问题,也可能是后面使用它的程序有问题,具体还有待解剖报告。

这个问题貌似不太值得一写。不过它使我想起昨晚发现的一起事件,某报文系统已经运行了数年,但居然还有比较低级的解析失败,而且最糟糕就是搜索过分依赖于那个出错的属性。而据我观察,好些系统问题都是有各种各样的“小”而且不太可能发生的失误而造成的,也正是大家都不是仔细收集和分析证据,而是先入为主的否决了其些可能性转而去思考所谓的更大可能性,而浪费了大量的时间。

不过有些先入为主的印象作用是我们不能左右的,就如现在人们在介绍我时依然是用类似于“一个Web界面高手”,甚至是“美工”,除了无奈,还能做什么呢?

难道跳出来大叫
“That’s so 2007”

!##$%^&*()~~

平安的彩虹

昨天下午下班下雨,但我们又上线了。貌似我在交行,客户就觉得他们的“新灵感”会实现。这和系统能跑就万岁的大众观念有点抵触,在帮助客户实现实用价值和不打破“和谐”的工作氛围之间,还需要取得一个平衡。当然,如果能够获得一致的积极的共识,就最好了。

顺利安全地上线之后,隐隐作痛的脑袋里,蹦出一个系统崩溃的预感。回到办公室,忽然有人大喊:好大条彩虹。

扭头一看,果然,在中国平安的钟楼后面,架起了一道彩虹。刚好可以用随身带的相机拍下来了~

平安的彩虹
平安的彩虹

看见彩虹,脑袋里持续两天的痛楚消失了~

彩虹隐去
彩虹隐去

灿烂夺目的东西总是短暂的。但是人总喜欢延长这美好的感觉~
现场观察,女生对彩虹的炽热程度显然优于男生。
但是不能以此推断女生就一定钟情于大卡拉的钻石,因为彩虹是免费的。

汹涌
平静的平安与汹涌的雨云

雨后的世界感觉干净了许多。天,没事就来多洗几遍吧。
顺便也洗涤一下这群看起来很劳碌的人们的心吧。
如果交行的建筑也有特色点就更好了,不见对面的平安和那汹涌的雨云是多么的搭调吗?

最后的彩虹
最后的彩虹

彩虹虽然隐去,不过心情好了许多,不过也可能只是交行综合症的合理表现~

夕阳与雨云的较量
夕阳与雨云的较量

这时再回头一看,夕阳与雨云的较量。
阳光是敌不过雨云的遮蔽的,但是雨云也没办法彻底地封锁

吞食天地
吞食天地

夕阳与雨云
夕阳与雨云

但其实,换个角度看,阳光和雨云可以是很好的合作伙伴关系
排斥与自己意见不一致的人只会孤立了自己,
我坚决实践周总理求同存异的行动方针,
这样我无须戴上假面具去刻意地笑脸迎合,
但也可以维持真我风格,
变的只是一个观察的角度而已~

PS: Welcome to see what I saw http://www.flickr.com/photos/leegorous/

想买这辆车

偶然在网上发现这个,标题是男人会比较喜欢,一看图,是车,应该是玩具车,
但是,不对,为什么前面都有条线~~

车型鼠标 - 车头
车头

无论是前面还是后面,看上去都不错,而且车头车尾的灯都可以亮,感觉很酷。

车型鼠标 - 车尾
车尾

哦,原来是只鼠标。

车型鼠标
车型鼠标

我个人是相当的喜欢,产品链接过去是一个日本网站,2000日元不到,折合RMB140左右,鼠标来说不算太贵,就是不知道手感如何。
但下面一看,产地中国……
立刻开始邪恶起来……
价格至少折半……
可惜暂时还未发现哪里有卖,麻烦各位帮我留意下,谢谢~

回头再想,是男人会喜欢吗?应该是男生会喜欢把?
好歹要考虑一下旁边的眼光吧,虽然我一向我行动我朴素~~

软件工程 以人为本

碰巧瞄过 软件工程不同于计算机科学 (En: How Software Engineering Differs From Computer Science )

上一个项目,我在思考,如果才能做出一个可维护的项目,他似乎给出了答案,或者说是给出了解题的方向。

自从上次参加 RubyConf 2009,虽然我没深入玩 Ruby,但是其中 松本行弘 谈到一点,快乐编程,给予我很多启发,使我不得不承认之前做了很长时间的思考的方向是错的,虽然早就意识到有点怪怪的。

做开发最重要的是人,做出来的项目的可维护性所依赖的也是人。

可维护性和稳定性是两回事,显然我们公司的人觉得交付给客户的软件的稳定性才是最重要的,这点我不反对,只不过观点有点不一样。我认为维护不是在稳定交付之后才进入的一种状态,而是之前,深入在开发过程之中。开发一个功能可以是很赤裸的,给人感觉是不稳定的,要让它稳定下来,就要看开发者的维护能力了。

之前公司有个培训,讲到一个冷笑话:有文档,CMMI 1,有文档的文档,CMMI 2,有文档的文档的文档,CMMI 3……

我不喜欢看到一堆的文档,但是我乐意看到这一堆文档的索引,因为这样我就知道,在我需要的时候,我该从哪里,而且是最快的,找到我所需要的东西。

做开发的同样有这么一种愉快经历,项目导入 eclipse 之后,需要什么类,Ctrl+Shift+T一下,很快就找到了,因为 eclipse 自动的帮助我们建立起了索引;在开发过程中,我们会有意识的将一些类进行归类,特别地我十分注重类的命名,除了符合基本命名规则,还需要考虑一个贴切的名字,这样就为日后,不仅仅为我,更重要是为了接手维护的人,快速地找回提供了一个重要的线索。

按照思维定势,估计都知道我想说,可维护的项目需要什么了吧。

具体怎么实施?且看下个项目怎么折腾了……

上面的东西有点跳,几个的目标不一样,但是方向却是一致的,以人为本。

绘制贝塞尔曲线

Bezier Curve in Canvas
Bezier Curve in Canvas

只是靠直线和弧线来画图是不够的,面对一些更加复杂但是有规律的图形时,我们需要另外一个更加强而有力的工具——贝塞尔曲线

在 canvas 里,贝塞尔曲线有二次方和三次方两种形式,区别就在于控制点的数目,二次方的只有一个控制点,而三次方的则有两个。

quadraticCurveTo(cp1x, cp1y, x, y)
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

这里的贝塞尔曲线的用法同样的很简单的,但是却不像在 Photoshop 或者 Illustrator 里画曲线那么轻巧了,它是非常需要触觉和耐心的。所以上面强调了有规律这个关键词。
实际上是什么感觉,大家亲身体验吧,看看下面的示例。

var colors = ["ec460c", "1e951e", "2692f7", "ea62f6"];
var cp1 = 60;
var cp2 = 160;
var y1 = 150;

for (var i=0; i< colors.length; i++) {
	ctx.beginPath();
	ctx.moveTo(25,75);
	ctx.bezierCurveTo(85,75,cp1,y1,100,y1);
	ctx.bezierCurveTo(cp2,y1,120,35,190,35);

	cp1 -= 10;  // 使控制点 1 横坐标左移 10 像素
	cp2 += 10;  // 使控制点 2 横坐标右移 10 像素
	y1 += 20;    // 是曲线低点下降 20 像素

	ctx.strokeStyle = "#" + colors[i];
	// 设置线条颜色
	ctx.stroke();
}

如图,我比较懒,里面用了循环画了几条曲线,一阵颜色一条,不同在于曲线的底端位置与曲线口径的不同。
你觉得像个什么呢?

这里并没有用到二次方形式的贝塞尔曲线,但是三次方的都会用了,二次方的还不行吗?

PS: 以上代码是主体部分,要运行上面的例子,请参考 进驻Canvas

3岁小屁孩网上成功拍得挖掘机

住在Auckland一小家庭的3岁 Pipi 趁父母熟睡时上网订购了一部挖掘机。

故事告诉我:

  1. 网上是可以订购到诸如挖掘机这样的重型机械的,我想买部泥头车看来是有希望的
  2. 如果事后买了什么,想后悔的话,尽管把责任卸给小孩子,自己的或者别人的,当然要趁他们还不可能懂事的情况下
  3. 为免意外,以后还是不要在机器里设置那么多自动登陆。看来国内某网站做得还是可以的,买个东西想少输几遍密码都不行,而且必须是IE
  4. 浏览器应该多装几款,又或者firefox设几套profile,互不干扰,挺好
  5. 这种事情可以上 Times 的

新闻链接:Pipi Quinlan, 3, accidentally buys mechanical digger in net auction

如何批量修改MySQL表的Collation

Phoca Changing collation tool
Phoca Changing collation tool

刚装上drupal,发现自动安装好后,输入的中文是”?”,直觉说是编码问题。

于是打开phpMyAdmin一看,果然,数据库及其表的 collation 均为 latin1_swedish_ci ,欲改之。

但表太多,手动,费时失事,即使脑海中立刻浮现出 excel 这个伟大的工具,我也先google一下。

还真的有,从 这里 发现这个名叫 Phoca Changing Collation 的php工具,它自我介绍:

“The Phoca Changing collation tool changes the database collation of database, tables and columns.”

试之,输入数据库连接信息,选择目标collation,提交之后稍等片刻就搞定了。
不过,它不会帮忙做数据转换,那是另外一个问题了。

心动?官方下载 或者 本站下载

path设置不当导致PHP无法连接数据库

系统运行得好好的,不过看不惯McAfee运行几天之后会劫持相当大内存,删之。

重启后发现drupal offsite了,提示说数据库连接问题,请检查settings.php云云。

莫名其妙,之前还运行良好,突然连接不上,应该是外部原因,不过保险起见,检查settings.php,无异样。

头大,尝试用mysql命令连接数据库,居然报告

'mysql' is not recognized as an internal or external command,
operable program or batch file.

再尝试Start菜单里面的MySQL Command Line Client,可用。

难道系统环境变量出问题,一看path,发现一堆疑似迅雷看看造成的重复路径,删之,mysql的bin路径不翼而飞,插之。

重启apache服务器,drupal 依然 off。查看apache access log,最后的启动日志里面有好几行类似于

PHP Warning: PHP Startup: Unable to load dynamic library 'D:\\Program Files\\PHP\\ext\\php_mysqli.dll' - The specified module could not be found.\r\n in Unknown on line 0

报告一堆module无法载入的警告,这些和数据库连接大有关联,大致问题确定,只是不清楚如何解决。

直觉说修改了系统环境变量,应该重启机器,光重启apache可能不够,于是重启。

重启后,发觉问题居然解决了。

原理不确定,大概是由于path设置不当,既造成mysql之类的命令找不到,又导致apache载入module失败。