星期四, 五月 24, 2007

算法以及刚买房子就失业

刚才在javaeye上看到一个算法的帖子,f(n)表示从1到n之间,所有数字包含1的个数,例如f(1)=1,f(13)=6,求400000000以内的f(n)=n的值。
然后跟着这个帖子,看到一个哥们就这个题目谈到的优化,然后跟着到了这个哥们的网站,然后在网站上看到这个哥们刚买房,在装修。和我差不多同步。不过他更不幸,刚失业。不过看着他技术应该还可以,找份工资供房子应该问题不大。
这个算法给我有点感触,就是优化首先要从算法上考虑,然后是语言、机制等。不过给我感触更深的是他刚买房子就失业。因为我也有着类似的担忧。

关于计算机基础的一个书单

下面的书单,是我这两天在javaeye上淘来的,主要是potian和hurricane1026的意见。

算法部分:

1.《Concrete Mathematics A Foundation for Computer Science(Second Edition) 》(《具体数学:计算机科学基础》
作者:Graham、Knuth、Patashnik

2.《The Art Of Computer Programming》vol1,2,3,4(《计算机程序设计艺术》)
作者:Donald E.Knuth

评论:
提到计算机算法谁敢不提老怪物knuth的这部经典之作呢?看看其他的经典书籍中每章之后引用的来自TAOCP的材料,你就知道TAOCP对于算法来说是什么,可以说镇山之宝。不过这套书够晦涩。苏运霖先生翻译的不错。不过对于经典还是英文好些,毕竟对于英文书,最好的情况还是看原版。二手货总是容易走味的。该书对于读者要求很高,其中数学成分很重,而且用asm描述。Bill Gates说做完了TAOCP所有习题的同学赶快给他寄简历。另外,如果看的时候觉得晕,最好先看一遍也是高爷爷写的《具体数学》 (摘自javaeye的hurricane1026同学评论http://www.javaeye.com/topic/66976

3.《MIT-introduction to algorithms(Second Edition)》(MIT版《算法导论》)
---------------------------------------------------
操作系统部分
----------------------------------------------------
网络部分
------------------------------------------------------
体系结构部分
------------------------------------------------------

异或运算

看位操作符。与&,异或^,或,取反~,右移>>(高位补符号位的值),右移>>>(高位补0),左移<<(低位补0)。看到一个题目,说两个整数a和b,交换ab的值,且不允许用第三个参数。看到提示是用异或操作来实现。试了试,发现了原因。
比如
a=0000,0101
b=1010,0110
a=a^b=1010,0011
b=a^b=0000,0101
a=a^b=1010,0110
a和b的值交换了。证明如下:
0^1=1,1^0=1,1^1=0,0^0=0 可以得到
若a^b=c,则a=b^c
所以上面的交换就是将a和b的异或值c放入变量a,在将值b和值c异即得到值a,放入变量b,再将值a和值c异或,得到值b,放入变量a。

-----------------------------------------------
equals()和==
==是比较两个引用是否指向同一个对象。如果是基本类型,则比较值。
equals,object类的equals()也是比较两个引用是否指向同一个对象,但基本类型的包装类,Date,File类改写了equals方法,变为比较值了。
总之,==是严格的比较内存地址,而equals除非被改写,否则也是比较内存地址。
------------------------
String的学问(基础知识啊,汗一个。可参考http://www.cn-java.com/target/news.php?news_id=3445
String a="aaa";
String b="aaa";
a==b为true,a.equals(b)为true。原因是a和b都是指向相同的字符串常量,"aaa"存在于常量池,在编译期间生成(并非运行期),a和b两个引用都指向常量池中的同一个aaa。
String a="aaa";
String b=new String("aaa");
a==b为false,a.equals(b)为true。原因是a是指向常量池中"aaa"的一个引用,而b是在运行期生成的一个String对象。
但是,a==b.intern()为true。当一个String对象调用intern()方法时,表示从常量池中寻找一个unicode相同的常量,如果有则直接返回其引用,如果没有则在常量池中新建一个并返回其引用。

星期一, 五月 21, 2007

接口日

忙碌的周末过去了,迎来了轻松的上班日。


一早就收到财务发过来的邮件,说接口测试的事情。我四月四号让他们测,到今天他们才告诉我开始测。财务部的人太牛了。要稍微调调财务的接口了。


过了一会儿,通讯的人也给我邮件,说通讯接口的地址资料准备好了,那今天也要开始测试通讯的接口了。


-----------------------------------

刚才看了一分文档,是神州数码的sap项目的实施顾问的简历。感慨一下。

-------------
财务接口发现有的数据导不过去,奇怪。查查看。

-------------
刚在javaeye上看贴,看到一些牛人对一些算法题的解答,确实很牛,我15分钟才看懂题目,还没有想清怎么做,人家已经写出了java代码,执行出了结果。
回去补习。



星期五, 五月 18, 2007

领导一开会,系统变三变

昨天下午就sap项目跟领导做汇报,汇报的结果是:不一定上sap,还要看看别的软件,比如国内的用友金蝶。原因是sap管理太规范了,不适应我们业务的灵活多变。我们的灵活多边,主要体现在机构的多变上,比如现在是在法人A下运作所有业务,也许发现另外一个地方有优惠的税收政策,于是在该地注册一个法人B,把部分业务放在B下运作,以合理避税。也就是说,公司可以随意扩展法人单位,并将业务注入。另外,公司的所有分部,都可以灵活的增减,最小的操作单元是客户。分部灵活变动,还需要能准确的对其进行考核。
唉……

星期四, 五月 17, 2007

今天干什么呢

昨天把一些常去的blog加到google reader了,今天就不用一来公司就到收藏夹中逐个去看了,只用打开google reader,就一目了然。看到一个帖子,说代码优美,一看,原来是比较三个数的大小,用的是递归,大概如下。
public int getBigger(int x,int y,int z){
if(x>=y &&amp;amp;amp; x>=z) return x;
return getBigger(y,z,x);
}

对于递归适用的场合,比如上例,我觉得应该适用在传进的三个参数中,第一个是max的可能性最大,第二个是max的可能性其次,第三个可能性最小的情况下。如果反过来,这里用递归的效率就太低了。

--------------------------------------------
刚看了myan今天早上发的一个帖子,很有感触。如下:
---------
事实上,任何工作了几年的人都能感觉到,学生阶段是最有时间的,工作了以后就没时间了。所以如果要走弯路,要琢磨一点语言细节,要做一点吃饱了撑的事情,练一点内功,最好在学生阶段走。当然,你觉得,如果在学生阶段都不走弯路,那岂不是更好?看上去当然更好,但是走弯路是不是真的可以避免,那条路是不是弯路,你指的路是不是就那么直,不那么好说的。特别是在你人生不同的阶段,你会对自己的过去有不同的看法和评价。我的观点就是,总体上讲,弯路是不可避免的,走弯路也不全是坏事,甚至在年轻的时候多走弯路,可能是太好太好的事情了。你以为的直路,说不定到头来是更大的弯路。人生的事情很难说清楚,最不用后悔的是受磨砺,最不用担心的是没机会。至于那条“直路”,对于学生来说还挺令人向往的,可等到工作阶段,你立刻就能体会到是个什么感觉了。每天都被任务驱动着,根本不用自己费力去找“pragmatic”方式,每天都是街头喋血,连回去练练扎马步、丹田气的机会不多。到时候别说语言细节,就是一些必要的应用数学、算法理论之类的东西,也只能见缝插针学一点,囫囵吞枣,解决问题就好。实际上未鹏你是中国学生里的一个异数,你在学生阶段踏踏实实搞了一些“语言律师”的东西,因此现在有所反思,觉得自己应该早点街头肉搏,而且现在你去街头肉搏,最多已开始有点不适应,一旦适应之后,你就够厉害,因为你内功厚。但是大多数学生,他们一开始的学习方式就是你所倡导的“pragmatic”街头喋血。但是他们的结果,不是写出Notes规则引擎,不是开发出联众,而是搞了多年ASP,不知道HTTP原理;学了三年.NET,但就是理解不了异步编程模型,一碰到BeginInvoke就发怵;写了两年MFC程序,不理解Windows事件模型,一遇到问题就只能抓瞎。我这些说法都不是凭空说的,背后都有我身边的实际例子。如果你把视野放的足够大,你就会认识到,中国的学生不是太务虚,而是太务实,不是太不实用主义,而是太实用主义了。所以我觉得你的这个呼吁,对于一小部分人来说是合适的,对于绝大多数人来说是不适用的。当然,工作当中需要了解的细节也是有的,比如做国际化的人,需要对字符编码的问题滚瓜烂熟,搞Windows向Linux移植的人,需要对Windows内部钩子的实现、Linux/X系统内部事件机制了然于心;搞WinCE开发,需要对微软ActiveSync的一些编程接口非常熟练。这些细节,或者说特定领域的知识技术,没有具体的应用背景和支撑环境,是不可能学进去的。因此现在大公司招高校毕业生,普遍比较理性,知道学生没有那个环境和条件搞pragmatic,一般都是不要求的。就看你基础打得扎实不扎实,有没有钻研精神。重要的是这个磨练过程,而不是结果,要的是你粗壮的腿,而不是你身上背的那袋盐巴。
我曾经问过一个美国大学的教授,是一项国际大学生编程大赛的主席,那些编程大赛的题目究竟对实际软件开发有什么用?他说,其实他们也知道不太有用,但是第一只有这个形式的东西搞比赛容易操作,真正有用的东西没法比赛,第二,重要的是选手参与这个比赛的过程,要想取得最好的成绩,往往要花几年时间,做几千题,几千道跟实际软件开发没太多关系的题。最后证明,在这个大赛中取得好成绩的,以后在工作中大多数也能取得好成绩。你说这个弯子绕的大不大,这个时间花得冤不冤?最后,其实这些话是写给你的,也是写给我自己的。10年前的这个时候,正好是我已经熟练掌握了C,开始雄心勃勃地向C++主峰发起进攻的时候。今天如果能够让我年轻10岁,回到大学里重新选择,我可能不会选择深入研究C++,而是把C学透了,就去研究OS、Compiler、TCP/IP。但是当年我看不到这些,只能看到C++。我后悔吗?不太后悔。人只能在一种局限性与另一种局限性之中选择,走了那条路,今天就会后悔别的事情。如今我对IT这个产业链有所了解之后,更觉得世界之大,岂是一人一时所能逆料。所以全局最优是可望不可及的,个人所能做的,只是追求局部最优而已,然后让命运的大浪把你送上高峰或者拍入深渊。比如,你以为出国读书,一定是好?你以为被一流大公司高薪聘请,一定是妙?你以为你在学生阶段写出一个软件,搞得天下闻名,万人敬仰,就一定有好结局?真的不一定啊。但是不一定,是不是我们就可以吊儿郎当,游手好闲?当然不是。全局最优不可期盼,但局部最优一定要努力争取,要按照自己定的路线去踏踏实实的努力,取得尽可能好的成果。所以,你要想做个好的语言律师,就踏踏实实下功夫去做吧,没什么不对的。还是那句话,下足功夫,练出一副好身板,比什么都重要。如果说后悔,我从不后悔技术路线的选择,只是后悔那时候下得功夫还是不够,还是拿出太多的时间去看电视,吃烧烤了。
---------
我就是那种在大学里没有学到专业技能的学生,既没有务实,也没有务虚,只是想了一些玄之又玄的问题,酝酿了一些情绪。现在的工作,跟myan说的还不太一样,还有很多的时间可以学习,可以系统的学习,不过我一直没有下功夫,而又一直痛恨自己水平低。前两天我突然发现一个成语用来说我很合适-志大才疏。
不能总这样,人总要有点成就,才好安慰自己。

星期三, 五月 16, 2007

很久没有写代码

刚才看了看fms的代码,觉得有点陌生了。才一个多月而已,看来要保持持续阅读代码才行阿。

下午在修改接口,让fms的发车运抵信息可以按运输地逐个回写到tulip

星期二, 五月 15, 2007

买书买不到

刚才收到大猫的邮件,说现在的工作中学不到什么技术,打算过段时间跳。我也觉得是,他应该去ibm、google试试。
觉得自己进步太慢了,想买本书,《解析极限编程》,在dangdang、joyo都没有货,chinapub有,但是不能货到付款,还要去邮局汇款,dearbook也有而且便宜,但他们的送货城市的页面打不开,也不知道能不能送货。算了,过段时间买吧。



-------------------------
下午收到阿松的邮件,让我修改tulip和spd的接口,返回tulip发车运抵的状态。刚写完了,打算明天测试。还没有测,我就已经觉得代码很垃圾的。这种垃圾的结构,是从以前继承出来的。另外,还有一些没有考虑周到的地方,比如:spd对每个单的发车运抵都发送数据到接口表,然后接口程序从接口表读取数据,判断是否需要回到tulip。以上是我的实现方式,但很显然是不好的。因为我把不需要回到tulip的数据也发出来放到接口表中,而且是clob字段,造成很多垃圾数据了。

星期一, 五月 14, 2007

test

test google analytic

大雨的季节

起来的时候还没有雨,一出门,下了一会儿下雨。等车,上车,开始下暴雨了,一直到下车。这次的雨的大小,相当于杯子(即相当于仙人在天上用杯子往下浇水,猛的时候我见过用桶的)。
昨天去新居打扫卫生,两个人擦了两小时,把客厅的玻璃和柜子擦了一遍。今天去擦卧室。

ps:今天是5月23日,怎么发布出来变成了5月14日?blogger服务器的时间出问题了?

开会

昨天和前天都在忙装修的事情,暂且按下不表。
今天开了一天的会,主要是讨论IBM的sap方案和神州数码的方案。看到方案里的利润中心,成本中心,大家都不清楚具体是什么概念,都是连蒙带猜。


星期六, 五月 12, 2007

java中的abstract class和interface

刚看了一篇帖子,讲abstract class和interface的。
http://blog.csdn.net/doublel/archive/2007/05/11/1604159.aspx

总结部分如下:
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7.接口中的方法默认都是 public,abstract 类型的。

作者还举了一个例子,比如有一个抽象类Door,它有两个动作open和close,现在要求它还要有alarm(报警)的功能,应该怎么设计呢?
方案一:
abstract class Door{
abstract void open();
abstract void close();
abstract void alarm();
}
或者
interface Door{
void open();
void close();
void alarm();
}
方案一的设计把Door的基本功能open、close和附属功能alarm混在一起了,open、close和alarm对于Door是不同层次的功能。

方案二:
abstract class Door{
abstract void open();
abstract void close();
}
interface Alarm{
void alarm();
}
这个设计是更合理的设计。abstract class表示的是is-a的关系,而interface表示的是like-a的关系。

星期五, 五月 11, 2007

装修接近尾声,sap项目即将开始

今天周五了,明天后天要把地板、厨柜、厨房电器、热水器、洁具都安装好,之后装修就算大体完工了。(长舒一口气……)

昨天晚上浏览了一下ibm、accenture、神州数码和速索的方案,没有什么赶紧,主要是我对销售业务不太熟悉,所以下一个礼拜主要是熟悉销售业务,内部流程等。



----
上午过了一遍速索的方案,总体感觉是对重点需求不突出,有点对细节说得太多。下午还要过accenture的方案。

星期四, 五月 10, 2007

test google analytics

510

早上部分:
今天的计划:
1.配合通讯的把接口的测试环境建起来;
2.继续理解sap项目的需求文档。
3.中间穿插看看java和基础会计的书

-------------------------
中午部分:
上午通讯把ftp的空间放大了些,另外放了些测试的xml上去,我跑了一下,基本可以跑通。不过还存在一些异常的情况没有考虑,比如基础资料在业务数据之后才传过来。下午改改。
另外上午看了看基础会计的书,知道会计的基本工作大概是:首先制作原始凭证;然后制作会计凭证;复核会计凭证;登记账簿。然后出报表。

--------------------------------------------------------
下午看基础会计的书,问了张存强一个会计科目的问题,然后他滔滔不绝的引申出了非常多的东西,包括财务审计,企业审计(包括财务审计),销售的两条主线(计划和预算)等等。基本上业务上的问题,只要我能问出来的,他都能答出来。我觉得他不去做咨询实在太可惜了。

明天集中讨论供应商的sap方案,今天好好看看。

星期三, 五月 09, 2007

有点眉目了

昨天在周勇家搞到十一点,终于有点眉目了。
早上来公司,把以前所有部署的项目都删除了,然后再把数据库的date字段都改为string,就可以了。天啊,折磨我这么多天的居然就是这样一点东西!!(不得不佩服周勇,他解决问题的能力比我强。)
现在联系通讯的人,下午应该就可以测试了。

---------------------------------------------
中午和通讯的联系了一下,感受到做接口折磨人了。要他们在订单头的xml中增加一个属性,保存该订单头有多少条明细的数量,扯了半天,他们答应看看好不好加,如果好加就加。其实想想也是,这个接口的需求是speedex提出来的,对通讯来说没有任何好处,他们当然不用太上心了。可怜我两边的人都不是,还要夹在中间,一边被逼,一边受气。

接下来可以安心看看sap项目的文档了。这对我来说是一次机会啊。

星期二, 五月 08, 2007

五一结束了,赶紧把重点转到工作上

五一假期过去了,回来一收邮件,看到周勇1号给我发的邮件,说发现了通讯接口的问题,是xml格式中时间的问题。呆会儿我试试。
------
本来以为找到原因了,事情在控制之中了,但biztalk仍然让我捉摸不定。有的时候同样的环境下,能得到不同的结果。肯定是有什么不对的,但我还没有发现。
----
晚上继续找。去周勇家搞。