跳至主要内容

博文

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...

解决iPhone无法播放站点提供的MP3的问题

正在开发的web站点提供语音文件给用户播放,发现iPhone 在播放MP3文件的时候遇到了一些问题,而从其他一些类似网站上下载的MP3文件却没有遇到这个问题。 第一直觉是MIME类型不对,但是比较了一下,都是一样的。iPhone里面点击MP3的连接之后会自动使用QuickTime播放器打开,然而QT直接弹出无法识别该链接…… 经过一番搜索,终于在Google的iPhoneWebDev论坛上找到了一个很有用的帖子: [quote] Configure Your Server HTTP servers hosting media files for iPhone must support byte-range requests, which iPhone uses to perform random access in media playback. (Byte-range support is also known as content-range or partial-range support.) Most, but not all, HTTP 1.1 servers already support byte-range requests. If you are not sure whether your media server supports byte-range requests, you can open the Terminal application in Mac OS X and use the curl command-line tool to download a short segment from a file on the server: curl -range 0-99http://example.com/test.mov-o/dev/null If the tool reports that it downloaded 100 bytes, the media server correctly handled the byte-range request. If it downloads the entire file, you may need to update the media server. Fo...

喝茶

办公室里头喝茶。 有朋友从尼泊尔带回来的柠檬茶, 也有上百元的铁观音, 但喝来喝去, 都觉得不如家乡的茉莉花茶口感亲切。 淡淡的清香, 冬日的早上喝着觉得很温暖。

64bit的Java

TSS上推荐了一篇名为 Java Performance in 64bit land 的博文。作者Roo大概和IBM J9有些什么渊源,讨论的话题很明了——在买车买性能,车主们赤裸裸地冲着多气缸奔去的年代,计算机的性能提升却成了一个“不好说”的问题。 按照『常理』来说,三核应该比双核来的强悍,64位系统应该较32位的小弟弟生猛,无奈软件和硬件之间的纠结让现实变得不那么美好……这问题搅活得像是奶粉奶牛鸡蛋饲料一样错综复杂…… 早在几年前C++社区的牛人Herb Sutter就已经发了 一篇振聋发聩的檄文 质问免费的性能提升还能撑多久,大意就是单个微处理器的处理速度增长地山河日下频率的提升已经逐渐接近物理极限,以往程序员们躺着也能依赖摩尔定律飙升程序运行速度的good old time眼看就要say goodbye了,往后的日子处理器大户们肯定会在多核超线程上动脑筋,而软件开发人员也必须要开发多线程的程序才能充分发挥硬件的功能了。 毫无疑问,首先经历变革的阵痛的肯定是C、C++程序员——部分原因当然归功于永远的指针。Java程序员们在面对64bit运算平台的时候,该认真考虑一下以往因为不需要担心所以不曾注意过的问题了……