跳至主要内容

博文

目前显示的是 2008的博文

解决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运算平台的时候,该认真考虑一下以往因为不需要担心所以不曾注意过的问题了……

Trailing Comma in JSON String

“遵循标准和实现自有的特性,这二者之间是存在一个平衡点的。在我看来,user-friendly可以作为这一平衡点的参考标准之一。” Javascript中使用JSON字符串来描述object的时候,name/value pair之间是以逗号来分割的,例如: { name: 'jlazy', city: 'shanghai', zipcode:'200001' } 这个语法与C、C++、Java和C#中定义数组的语法类似,但是有一个很大的区别,就是最后一个name/value pair后面不应该有逗号。而C家族的数组定义中,是允许存在trailing comma的,例如: int dim[] = { 32, 44, 60, }; 在程序中如果需要动态生成这种结构性的字符串,显然后者是较为容易的,for循环中每次在遍历项的最后添加一个‘,’符号即可。而对于JSON字符串,需要添加一个判断条件语句: var strJson = '{'; for (int i = 0; i < array.length; ++i) { if (i) strJson += ','; strJson += array[i]; } 不同的浏览器实现针对这个特点有不同的实现,例如,Firefox中,默许trailing comma的存在,这对程序开发者是较为友好的。而IE7对于这个trailing comma则是非常挑剔的,算得上是有点finicky。不过既然这是标准,IE7选择了严格的语法检查,也是无可厚非的。 刚好遇到了一个bug是由于这个原因导致的,特地还安装了Visual Studio 2008来attach to process来debug dynamic scripts。因此特别记录一下。 References: 1) Introducing JSON [ ^ ] 2) Can you use a trailing comma in a JSON object? 3) Dojo ComboBox Widget (Take 2) 4) Trailing Comma Within JSON's Array

Living in Hardy Heron (6)

在Ubuntu 8.04 LTS Server上运行Apache2+MySQL+Tomcat5.5,由于之前的测试服务器上使用Sun-JDK-5.0,时常发生一些莫名的JVM crash 事件,于是决定在新的Amazon Instance上尝试使用IBM-JDK-5.0。IBM是免费提供Linux、AIX上头的JDK的,口碑很好很强大。 具体的方法如下: 1) Install IBM JDK 先解压 ibm-jdk-5.0 的文件夹到Ubuntu的 /usr/lib/jvm 目录,这里放了所有的 java virtual machine…… $ tar zxf ibm-java2-sdk-5.0-8.0-linux-i386.tgz $ sudo mv -t /usr/lib/jvm/ ibm-java2-i386-50/ 为目录创建 soft link,采用一个简洁的名字。 $ cd /usr/lib/jvm/ $ sudo ln -s ibm-java2-i386-50 jdk-ibm-5.0 使用 update-alternatives 工具安装该jvm,并设置为系统默认的JVM。 $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-ibm-5.0/bin/java 500 $ sudo update-alternatives --config java 2) 修改 Tomcat 5.5 的启动脚本 首先,如果系统的 Tomcat 5.5 是通过 apt-get install tomcat5.5 获得的,默认会使用一个名为 jsvc 的工具来启动 Catalina 的服务线程 (而且一般都是启动三个进程)。如果要使用 IBM JDK,必须修改 /etc/init.d/tomcat5.5 脚本,将 DAEMON 改回 catalina.sh。 其次,Tomcat默认的shutdown方法不够“敏捷”。因为它需要使用startup的所有设置重新启动一个JVM来通知之前的进程关闭。众所周知,Tomcat会监听 8005 端口等待接收指令。因此,可以充分发挥Linux上众多的工具优势,直接访问该端口发出 shutdown 指令。 echo SHUTDOWN | nc loc...

Living in Hardy Heron (5)

新大陆 神说,天下的水要聚在一处,使旱地露出来。事就这样成了。 神称旱地为地,称水的聚处为海。神看是好的。 神说,地要发生青草,和结种子的菜蔬,并结果子的树木,各从其类,果子都包着核。事就这样成了。 于是地发生了青草,和结种子的菜蔬,各从其类,并结果子的树木,各从其类,果子都包着核。神看着是好的。 有晚上,有早晨,是第三日。 Eclipse开发平台对于绝大多数Java程序员来说是必不可少的(华丽的忽视JBuilder的拥蹙…… :P)。对于已经安装好了Sun-JDK或是IBM-JDK的筒子而言,这个安装过程简单的可以——下载、解压缩、创建桌面链接(即对应于Windows下的快捷方式)。创建快捷方式只要先在GNOME的目录中新建一个eclipse.desktop文件,然后输入如下内容(这里懒人J的eclipse是解压缩在/opt/eclipse目录中): [Desktop Entry] Encoding=UTF-8 Name=Eclipse 3.4 Comment=Eclipse IDE V3.4 Exec=eclipse Icon=/opt/eclipse/icon.xpm Terminal=false Type=Application Categories=GNOME;Application;Development; StartupNotify=true 可惜,对于偶的系统(Ubuntu 8.04 AMD64bit)来说,eclipse有一个致命的问题——在运行时会突然莫名地crash!!查了不少帖子之后终于找到了解决方法,貌似是Eclipse在AMD64位平台上必须屏蔽掉一处JDK对于编译器的优化。我dump了crash的log(一般出现在$HOME目录中,名字是类似于hs_err_pidXXXXX.log,这里XXXXX就是刚刚crash掉的eclipse的进程标识数),其中可以找到这样的蛛丝马迹—— Current CompileTask: C2:2717      org.eclipse.core.internal.dtree.DataTreeNode.forwardDeltaWith([Lorg/eclipse/core/internal/dtree/AbstractDataTreeNode;[Lorg/eclips...

Living in Hardy Heron (4)

美丽苍穹 神说:诸水之间要有空气,将水分为上下。 神造了苍穹,把苍穹之下的水和苍穹以上的水分开了。 神称苍穹为天。 有晚上,有早晨,这是第二日。 刚安装好的Ubuntu的界面是以橘黄色作为基调的,8.04里的默认壁纸是一只抽象的鹭(对,就是代码名字Hardy Heron里说的爱吃青蛙的Heron,一开始我还以为是鹤,不过Crane一般都是白色的……)默认的简体中文字体是文泉驿。老实说,整体看来界面还是有不小的改进空间的。不过不要紧,已经有很多老鸟为我们指明了方向——使用更为漂亮的商业字体(当然少不了从盖茨大叔留下的那家大公司里面“搬”出来的),还有更绚的3D引擎来美化工作空间。毕竟如果要以Ubuntu作为日常使用的操作系统的话,将整个UI做个养眼的美容还是很有必要的。 字体方面,可以下载微软雅黑和苹果的LiHeiPro字体文件。二者都是TTF字体,使用方法如下: # Goto the system folder where the fonts are stored cd /usr/share/fonts # Make dirs for the new fonts cd ./truetypes sudo mkdir ttf-msyh/ ttf-liheipro/ # Copy the fonts into the new folder and make sure they have proper permissions cd ttf-msyh/ sudo cp ~/downloads/msyh*.ttf . sudo chown root:root *.ttf sudo chmod 644 *.ttf # And generate the scales and dirs configuration sudo mkfontscale sudo mkfontdir # Finally, after both fonts are done, we fresh the system cache of fonts # the command fc-cache is called, with options to force refresh, and # write verbose output to console. sudo fc-cache -fv 安装完字体文件之后,具体...

Living in Hardy Heron (3)

创世纪 神说,要有光,于是就有了光。 神看光是好的,于是就把光暗分开了。 神称光为昼,称暗为夜。有晚上,有早晨,这是头一日。 在Ubuntu Live DVD安装完毕之后,马不停蹄地继续安装必备的系统软件。众所周知,在Linux系统下,即便有了Debian一族的dpkg、apt-get,或是Fedora/Redhat所打造的rpm、yum,软件还是有无法安装的可能。开放源代码的好处就是source code compilation,这才是王道~ 默认的情况下,基本的内核源代码和编译工具是不被安装的。所以必须使用apt-get直接安装: sudo apt-get install build-essential automake linux-headers-`uname -r` 这里linux-header-`uname -r`的uname -r是获取系统的内核版本号。虽然并不经常用到,不过在这个时候``命令还是非常很有用的。 有了基于C/C++构建的编译系统,当然也不能缺少跨平台的Java。由于版权原因,linux下默认提供的java实现并不是Sun的java实现,而是OpenJDK。安装Sun的JDK需要自行到”升阳“的站点去下载bin文件。而我一直偏爱IBM的JDK,以前在Windows下作class obfuscation的时候就发现Sun出品的JDK的性能的确要稍逊IBM一筹。同样的,如果要使用IBM的JDK,也需要自行下载。下载的地址就不多写了,google一下就有了,重要的是看清32bit还是64bit再下载。 chmod +x sun-java-1.6.0r6.bin . sun-java-1.6.0r6.bin 安装后实际上就是解压缩一个目录出来,需要移动到系统的jvm目录中。 sudo mv -t /usr/lib/jvm/ ~/java-6-sun-1.6.0.06/ sudo mv -t /usr/lib/jvm/ ~/ibm-java-x86_64-60 sudo update-alternatives --config java 最后的这个命令是用于设定默认的JDK。当然,手动修改文件/etc/jvm也是可以的。 参考资料 APT/YUM Server 出自鸟哥的私房菜 OpenJDK Project in java.net

Living in Hardy Heron (2)

混沌初开 ia32 shared libraries for use on AMD64 and ia64 systems. This package contains runtime libraries for the ia32/i386 architecture, configured for use on an amd64 or ia64 Debian system running a 64-bit kernel. 本本(Acer 4520G 551G16M)的硬件配置大体如下: CPU: AMD Turion 64x2 Mobile TL-62 HD: 160GB RAM: 2048MB DDR2 Bluetooth: 2.0+EDR Graphics: NVIDIA Geforce 8400M G 802.11b/g Wireless 安装的时候一切都挺不错,分区用了ext-3格式,其结构如下: /boot: 为了提高启动的效率,该分区单独分配180MB。 /home: 个人目录,分配了40GB。 /: 根分区分配了106GB,没有对/usr, /var等作细分。 登录之后check了一下,以太网卡工作正常,可以直接使用“网络”工具来配置IP、子网掩码、网关和DNS等;蓝牙可识别且LED灯工作正常;无线网卡无法正常工作且LED灯完全不亮;大部分特殊键都可以正确工作,例如WEB键、音量控制键、屏幕开关键和鼠标触摸板开关键等;声卡正常工作且音量可控,但是内置麦克风无法识别。 为了开始安装软件,将大量使用apt-get而非“新立得软件管理工具”。ia32-libs是比不可少的。因为有不少的软件缺少在AMD64平台的编译版本,要通过 apt-get install --force-architecture 来安装32位的版本并通过ia32库来确保运行时环境。

Living in Hardy Heron (1)

序幕 Hardy Heron is the code name for Ubuntu 8.04 LTS, released on 2008-04-24. 我的一台老PC上装的是Ubuntu 7.10,因为硬盘上有点坏道,Windows XP一直没法正常工作,自从交给Linux打理之后,使用地很顺利,没有遇到过太多的麻烦。这次Ubuntu 8.04刚发布没多久,还是个LTS版本,我就想在笔记本上体验一下。 没想到由于分区的错误(强烈建议要装双系统的朋友现在Windows下面将空余的分区做好再用LiveCD来安装Ubuntu,血淋淋的前车之鉴阿……),导致原有的Vista系统的分区表被破坏了……反正我的主要开发环境是Java的,IDE用的是强大且跨平台的Eclipse,Editor一直是原生于Linux的VIM。于是决定一不做二不休,将整个本本交给Ubuntu来控制。 这个决定,带来了随后几周的崭新体验——于是,就有了这个《Diving in Hardy Heron》系列。

关于代码缩进的思考

在 PEP8 读到了关于代码缩进的指导建议: Code lay-out Indentation Use 4 spaces per indentation level. For really old code that you don't want to mess up, you can continue to use 8-space tabs. Tabs or Spaces? Never mix tabs and spaces. The most popular way of indenting Python is with spaces only. The second-most popular way is with tabs only. Code indented with a mixture of tabs and spaces should be converted to using spaces exclusively. When invoking the Python command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended! For new projects, spaces-only are strongly recommended over tabs. Most editors have features that make this easy to do. 在此之前我也仔细考虑过缩进应该使用哪个比较好——tab vs. white space.最终我觉得使用tab比较适合我,主要是基于以下几点考虑: 在行首的所有缩进都是用tab,在行内和行末只适用white space,这样无论代码使用哪一种IDE或是editor打开,无论设置的tab width是4或是8或是其他什么奇怪的数,每一行的缩进关系都可以正确的显示出来,差别只是宽度而已,不影响可读性。 我使...

Fixed width within display:inline

根据老板的需求修改web page中的footer的时候发现了<span>的宽度有问题,HTML的结构大致如下: <div style="margin: 0pt 260px; width: 380px;">     <span class="footTag">About</span>     <span class="footTag">Partners</span>     <span class="footTag">Advertise</span> </div> <div style="margin: 6px 0pt; clear: left;">   © 2008 Company-Name </div> 其中样式footTag指定了width,但是尝试了很久发现span的宽度无论如何也不能按照CSS的定义显示…… 但是如果换成DIV或是用 display: block 就可以。在Google了不少keyword之后终于发现了一篇 相关的解释 。到W3C的CSS 2.1规范里具体找了一下,果然发现: 10.3.1 Inline, non-replaced elements The 'width' property does not apply. A computed value of 'auto' for 'left' , 'right' , 'margin-left' or 'margin-right' becomes a used value of '0'. 有空一定要仔细看看规范~做WEB开发的至少先将CSS、JavaScript和DOM混个脸熟,然后再研究不同browser的特性。

Ubuntu下的nvidia硬件加速

在老PC里装上Ubuntu 7.10已经有一段日子了,平时上班主要用ACER的laptop,回家有时候开着PC下aMule或是Azureus。本来也曾经试着用PC来看片,可惜有时候CPU占用率偏高,遇到解码率较高的片子,如HD的片子就会卡…… 今晚在google是否有linux的土豆加速器版本,无意中看见了一个安装nvidia驱动的帖子——打开菜单『系统』|『系统管理』|『受限驱动管理器』,启用nvidia驱动程序即可。打开了nvidia驱动之后的视频果然强悍了不少:Firefox里头的控件多了shade;Flash看土豆的CPU使用率降低了不少;整个desktop的view变得更细致了,估计是抗锯齿打开了的好处。 看来以后买硬件还是大牌比较好,至少linux下面驱动的支持找得到~

File Mode in Linux (1)

Linux中的文件具有三种访问权限:read(读)、write(写)和execute(执行)。每一个文件都属于一个指定的user(用户)和group(群组)。对于文件访问的控制是依据user、group和other来分开定义的。所谓的other,指的是既不是拥有该文件的用户(owner),也不是属于拥有该文件的群组的用户。 使用命令 ls -l 可以列出文件的长列表,在有的linux主机上,定义了该命令的alias别名为ll。其中以10个字符来标记一个文件的类型和权限——drwxrwxrwx。其中,第一个字符标识的是文件的类型,如d表示目录,-表示普通文件,c表示字符设备,b表示块设备,l表示符号链接,p表示管道文件,s表示套接字文件等;后面的九个字符每三个为一组,一次表示owner、group和other的权限;每一组的三个字符又一次表示read、write和execute的权限。此外,s表示setuid,该标志位仅对可执行的文件有效。如果ll命令显示的权限中有'-',则表示对应该位的权限没有被授予。 提到文件的权限,就必须要说到chmod。这个命令就是用于改变一个文件的模式(change mode)的。具体的用法参考man chmod,这里只介绍几个常见的用法: chmod g+x [filename] # grant the Execute privilege to Group chmod g+s [filename] # set the group id to the executable file chmod 755 [filename] # set the mode as rwxr-xr-x

VIM diff用法简介

进入 diff 模式编辑的最简单方法就是用 "vimdiff" 命令。它象通常启动 Vim 一样, 不过额外地,它设定一些参数来设定查看不同之处。 vimdiff file1 file2 [file3 [file4]] 这等同于: vim -d file1 file2 [file3 [file4]] 你也可以使用 "gvimdiff" 或 "vim -d -g"。GUI 就启动了。 你也可以使用 "viewdiff" 或 "gviewdiff" 。Vim 会进入只读模式。 有两条命令可用于在 diffs 之间跳转: * [c * [c 向后至上一个更改的开始。当加上个数字后,便重复执行相应 次。 * ]c * ]c 向前至下一个更改的开始。当加上个数字后,便重复执行相应 次。 如果不存在光标可以跳转到的更改,将产生错误。 有两个命令可用来在两个缓冲之间拷贝。相应的结果是,在一定的范围内两缓冲的内容 被统一。 * :diffg * * :diffget * : [range] diffg[et] [bufspec] 用另一个缓冲来修改当前的缓冲,消除不同之处。如果给定 [bufspec],就使用该缓冲。否则,它仅当有另一个在 diff 模式下 的缓冲时才起作用。 [range] 参考下面。 ...