跳至主要内容

博文

目前显示的是 2009的博文

一道题・了解补码多一些~

Java的开发面试题里面经常爱问关于primitive types的范围之类的问题,例如一个short能表达的整数值范围是多少,诸如此类的。这种题型的目的是看看程序员对于Java Fundamental到底了解多少,实际上有的刁钻问题甚至连老鸟都能蒙住…… 看到一道蛮有意思的基础问题,贴出来一起学习一下: int min = 0x80000000; // minimum integer int opp = -min; // get opposite number int sum = min + opp; 问min, opp, 和sum求出来是多少? 首先要明确一点,对于32bit的整形int而言,0x80000000所表示的是多少? 因为最高位是符号位(sign),所以最大的int所代表的是0x7FFFFFFF,换算为十进制(decimal)也就是2147483647。 根据补码的定义,最小的32bit int应该是0x80000000,因此换算为十进制的值就是-2147483648. 在Java中,如果用int来存储这个MIN的相反数,得到的还是它自身。看起来这个结果很无厘头,1的相反数是-1;2的相反数是-2;为什么到了最大的负数这里它的相反数就是它自身呢?? 为什么为什么为什么…… 原因在于 补码 计算相反数。先取反,再加一。 0x80000000 -> 0x7FFFFFFF -> 0x80000000 所以就得到了上面的结果——min的相反数还是自身。 因此,  (0x80000000) = -0x80000000 = -2147483648 有了上面的结果,最后一个求和的结果就相对容易理解了。 两个最小整数相加之后,结果溢出了,最后所能够得到的sum就是0。

Synergy Between Spring AOP and AspectJ

synergy (synergies) If there is synergy between two or more organizations or groups, they are more successful when they work together than when they work separately. (BUSINESS) Much has changed in the AOP framework landscape in the past few years. There has been some housecleaning among the AOP frameworks, resulting in some frameworks merging and others going extinct. In 2005, the AspectWerkz project merged with AspectJ, marking the last significant activity in the AOP world and leaving us with three dominant AOP frameworks: AspectJ ( http://eclipse.org/aspectj ) JBoss AOP ( http://labs.jboss.com/portal/jbossaop/index.html ) Spring AOP ( http://www.springframework.org ) Since this is a Spring book, we will, of course, focus on Spring AOP. Even so, there's a lot of synergy between the Spring and AspectJ projects, and the AOP support in Spring 2.0 borrows a lot from the AspectJ project. In fact, the <aop:spring-configured /> configuration element takes advantage of AspectJ...

如何在 Eclipse WTP 内配置 Tomcat 的 Multiple Hosts

在开发Tomcat上的WebApp的时候,服务器上部署了几个webapp分别用Virtual Hosts映射到几个不同的domain,例如: www.mydomain.com wap.mydomain.com soapapi.mydomain.com 在服务器上操作的时候是通过Apache Httpd的config文件中设定Virutal Host,并采用JK2协议转发到Tomcat 5.5中。所以在Tomcat的server.xml中也要有对应的Host配置。 然而当我在Eclipse内通过WTP部署程序的时候,是没有办法创建多个Host的config的。通过Server视图中的右键菜单"Add or Remove Projects.."只能够在已有的默认Host内添加新的Context。于是我手动编辑这个server.xml文件,实现以下的双Host: <Host appBase="webapps" autoDeploy="true" name=" www.mydomain.com "   unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">   <Context docBase="myweb" path="" reloadable="true"     source="org.eclipse.jst.j2ee.server:myweb" crossContext="true"/> </Host> <Host appBase="webapps" autoDeploy="true" name=" soapapi.mydomain.com "   unpackWARs="true" xmlNamespaceAware=...

关于 Python SOAP Library 的初步调查

What's the best soap client library for Python, and where is the documentation for it? Unfortunately, at the moment, I don't think there is a "best" Python SOAP library. Each of the mainstream ones available has its own pros and cons. Older libraries: SOAPy : Was the "best," but no longer maintained. Does not work on Python 2.5+ ZSI : Very painful to use, and development is slow. Has a module called "SOAPpy", which is different than SOAPy (above). "Newer" libraries: SUDS : Very Pythonic, and easy to create WSDL-consuming SOAP clients. Creating SOAP servers is a little bit more difficult. soaplib : Creating servers is easy, creating clients a little bit more challenging. Of the above, I've only used SUDS personally, and I liked it a lot. 在 IBM DeveloperWorks 站点上搜了一下,基本上介绍Python和SOAP的文章都是有点年头的了,以下是参考文章系列―― The Python Web services developer : The world of Python Web services Web services software repository, Part 3 Python SOAP libra...

This Summer: Reading Season

这个夏天,打算为自己找点书看。 很早就听说过高爷爷的"名言"――看不懂我的书,别做程序员~ 非计算机专业 尤其是经济会计金融外语类 的童鞋大概不知道高爷爷的各种趣事,以下摘抄几则: 1960 年的时候, 高级语言编程领域也发生了一件大事, 即 ALGOL 60 的提出. ALGOL 是划时代的标准, 我们今天用的 C/Java 全是 ALGOL 家族的. ALGOL 注意到了 FORTRAN 的不支持递归的问题, 于是从一开始, 就订立标准支持递归. 但是, 处理递归需要很小心的安排每个函数每次调用的地址和所谓的活动窗口(Active Frame), 而并不是每个编译器都是牛人写的, 所以在处理递归这样一个新事物上, 难免会出点小问题和小 BUG. 这时候, 搞笑的高爷爷(Knuth) 出场了, 他提出了一个测试, 叫做 "是男人就得负67″. (The man or boy test). 恕我功底不深, 不能给各位读者把这个男人测试的关窍讲清楚, 但是, 我知道, 这个测试, 乃是看 ALGOL 60 编译器有没有正确的实现递归和外部引用的. 照高爷爷的说法, 真的男人要能得到正确答案, 不是男人的就得不到正确答案. 当然, 高爷爷当时自己也没有男人编译器, 所以自己猜了一个 -121, 后来, 真的男人编译器出来了, 正确答案是 -67. 可见, 高爷爷的人脑编译器, 也不是男人编译器… 计算机的历史很大程度上是编译器发展的历史. 当年 Knuth 就是因为写了Alogo 60 编译器后, Addison-Wesley 过来找高爷爷约稿, 1962年的时候就让他写本编译器的书. Knuth 写啊写啊, 发现写了很久还没写到主题. 那边编辑急了, 说你都写了3000页手稿了, 你还不交稿. 高爷爷说, 这个, 我还没写到正题呢. 书商说, 算了, 你出多卷本吧. 于是才有了 TAoCP. 在<编程珠玑 II> 第一章, Jon Bentley 就着重提醒了代码 profiling 的重要性. 说到 profiling 这个词, 就不能不再次提到万众敬仰的高爷爷. 高爷爷在1970年的暑假, 通过捡Stanford 大学机房扔出来的垃圾(其实是含有程序的磁带), 写出了一篇震古烁今的论文 "An emp...

特殊的网站维护日

早上坐公交看见路上出现了穿白色制服的纠警,猛地记起来这是个特殊的日子,姑且称之为天朝特有的网站维护日吧…… 当偶还不知道政治为何物的时候,电视上播放过首都著名广场上英勇的战士被坏人烧死的新闻, 今天就花了一个钟头的时间完整的看了一遍相关的资料―― 因为上国浩如烟海的史书中实在难以觅得这一"著名"事件的相关记录, 只好求助于全知全能的wikipedia来解惑了。 我不明白为什么天朝首脑们不愿意让世人公开了解并讨论这件事情,现在的小朋友们基本上都不了解发生过这档子事,但是由于各种渠道的存在或多或少的还是可以知道一些消息。预期让人们怀着猎奇心理拼命追问还不如解禁允许公开评说。 顺便备份一下几个有相关资料的链接…… 1) Tiananmen Square Protests 2) 当时的总理与学生对话,注意站在他边上的可是如今的总理 3) BBC: Inside PRC's Ruling Party - Tiananmen Square 4) 未曾听说过,据L童鞋说素当年学生之一,神秘代号Wuer Kaixi

Java Shift Operation

在java中,位移符号 ( <<、 >> 和 >>> ) 是使用频率相对不太高的运算符号。不过,在一些特定的程序语境中,这些符号相当的有用,例如在JavaME程序中做数据的乘除运算,很多时候就以 << 和 >> 来书写代码。 Lucio童鞋发了几行关于处理RGB色值转换的代码和我讨论,大致的问题是将int类型左移64位和左移128位应该得到什么结果。结果我俩在这上头遇到了不解的谜,大意如下:     int a = (1 << 3), b = (1 << 8), c = (1 << 31);     int d = (1 << 32), e = (1 << 64), f = (1 << 128); 问这些数的值到底几何,很显然,第一行的a = 2^3 = 8,b = 2^8 = 256, c = 2^31 = 2147483648。但是第二行怎么算呢?java中的int类型是32bit,第二行中左移的位数都超过了这个范围,我俩都直接觉得 d == e == f == 0。However, 在运行过实际程序之后,结果出乎意料之外…… 实际执行的时候,d == e == f == 1。这究竟是为什么呢?这时候就要靠猛击JLS来寻找神谕了…… (还用不着直接骚扰Gosling大神) 。在 圣经 JLS的第十五节第十九条 中给出了明确的解释: If the promoted type of the left-hand operand is int, only the five lowest-order bits of the right-hand operand are used as the shift distance . It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x1f. The shift distance actually used is there...

SVN Tags Operation

快过年了,要放十几天的假,为了不至于让代码荒废,特地做打上标签以备节后使用。查了一下svn的命令,主要用到的就是三个命令: svn copy svn delete svn move 以下是Eclipse中的操作日志: *** Delete svn delete "https://svn.mysvnsrv.com/tags/MILESTONE_R090120" \ -m "It's a incorrect tag, need to be removed." \ --username "jlazy" Committed revision 2042 *** Ok (took 00:05.048) *** Copy svn copy "https://svn.mysvnsrv.com/trunk/mvweb" \ "https://svn.mysvnsrv.com/tags/mvweb" \ -m "Copy the repository to tags." \ --username "jlazy" Committed revision 2043 *** Ok (took 00:10.860) *** Rename svn move "https://svn.mysvnsrv.com/tags/mvweb" \ "https://svn.mysvnsrv.com/tags/mvweb_r20090121" \ -m "Rename the tag to append date info." --username "jlazy" Committed revision 2044 *** Ok (took 00:07.095)

SQL查询优化记录: MYSQL 中 FULL OUTER JOIN 的处理

从 FULL OUTER JOIN 到 UNION 再到 IFNULL 数据库中有一个记录对特定资源访问的表,名为 tbl_navigation_logs (结构如下)。 Field Type Null Key Default Extra id int(11) NO PRI auto_increment customer int(11) YES MUL session varchar(100) NO ipaddress int(11) NO time datetime NO uid varchar(512) NO portal int(11) YES MUL title int(11) YES MUL item bigint(20) YES MUL channel int(11) NO generated by HeidiSQL 在开发业务逻辑的时候遇到一个分支查询:根据访问者来统计对某个特定资源的访问次数。仔细分析一下,一共有两种可能的情况——若customer字段非空,则根据 DISTINCT(`customer`, DATE(`time`))进行访问次数统计,即同一天内同一用户的若干次访问仅算作1次有效,这适用于登录用户的访问统计。否则,就根据DISTINCT(`session`)来统计访问次数。就业务逻辑而言,就是分别将这两种情况都统计出来,最后做一个加法求和。 第一种直观的思路,就是分别将两种分支情况用select语句选择出来,再做一个合并。这里,FULL OUTER JOIN 是合适的。可惜开发环境所使用的MySQL 5.1数据库不支持FULL OUTER JOIN的实现,只能用一个拐弯的UNION来实现…… select _t.* FROM ( SELECT t1.vdate as `visitDate`, (IFNULL(t1.vcount,0) + IFNULL(t2.vcount,0)) as `accessCount` FROM ( SELECT DATE(`time`) AS `vdate`, COUNT(DISTINCT `customer`, DATE(`time`)) AS `vcount` FROM `tbl_navigation_log` WHERE `customer` is not null ...

改写一段自启动服务的脚本

用了一年多的Ubuntu,平时写脚本读脚本渐渐的已经习惯了Debian风格的函数调用,最近因为工作需要,在Fedora服务器上要加入一个自启动服务,花了两天时间重写一段脚本。po上来以备有相同需要的筒子参考。 无论是在Ubuntu还是Fedora下面,我用的shell都是bash,所以基本的命令都是想通的。只是在/etc/init.d里面有几个函数族不太一样。以下先将最终写好的Fedora脚本贴出来,然后再罗嗦几句…… # !/bin/bash # # chkcofig: 35 -80 50 # Description: Company Application Server Implementation # # Check the privilege if [ `id -u` -ne 0 ]; then echo "You need root privileges to run this script" exit 1 fi # Source function library. . /etc/init.d/functions . /lib/lsb/init-functions # Configurations (could be defined in /etc/sysconfig/mvas) APP_NAME=mvas PID_FILE=/var/run/${APP_NAME}.pid LOCK_FILE=/var/lock/subsys/${APP_NAME} CATALINA_HOME=/usr/share/tomcat5 APPSERVER_HOME=${MVAS_HOME-/etc/comp/privaty} pidof_mvas() { local pids=`pidof /usr/bin/java` echo "pid = $pids" for ii in $pids; do echo "testing $ii " if [ -d /proc/$ii ]; then hit=`ps ax | grep $ii | grep appsrv\/conf` [ -n "$hi...