niyue

Archive for the ‘programming’ Category

Install mysql driver Ruby gem on Leopard

In mac, programming, ruby on October 14, 2008 at 11:20 PM

Ruby, Rails and MySQL with Leopard 10.5.2 and XCode 3.0
评论中有一个comment介绍了如何安装在安装了x86_64架构的mysql后,如何在Leopard上安装mysql gem。

Google AppEngine

In idea, programming on April 15, 2008 at 10:43 AM

申请了Google AppEngine,前天刚得到批准,准备写点小东西看看。AppEngine是很有意思的一个东西,原来一直想写一些server side的应用,可惜一直没有环境来部署,也就一直没有实现。很多想做的东西也都因为没有Web环境来部署觉得用处不大就没有去做。不过现在有了AppEngine这些问题都迎刃而解了。

但是AppEngine只支持Python,开始想找个曲线救国的办法 – 找到一个Python实现的JVM或者Ruby VM,这样就可以在AppEngine上部署Java或者Ruby的应用(假设AppEngine的Python环境可以让这些虚拟机跑起来)。当然如果有Python-based JVM的话,还可以再这之上再跑Ruby的应用(JRuby)或者Groovy和Scala的应用了,想想就是一个很酷的事情。稍微花了些时间,可惜并没有找到这种的虚拟机实现,不知道是原来并没有这种需求还是技术上有什么难度,有PyPy为什么没有RuPy或者JaPy?

So *start learning Python* in this year~

Update:

这个(Compile Ruby to Python)已经很接近我想要找的东西了,可惜是用Ruby写的,如果是用Python写的话,那就应该可以在Google AppEngine的环境中动态的将Ruby编译成Python代码,于是就可以变成一个Ruby运行时了~

http://www.infoq.com/cn/news/2008/04/google-app-engine-simplifies-web

http://www.dougma.com/archives/81

http://ejohn.org/blog/running-java-in-javascript/

http://hotruby.accelart.jp/

web service related pronunciation

In programming on December 28, 2007 at 3:23 PM

Web service领域相关的名词术语实在太多,缩写记不清很麻烦,读起来也不知道如何读,今天特地花了些时间搜集了一下这些术语的读音,感觉还挺有意思的:

WSDL
Web Services Description Language, pronounced ‘wiz-dəl’ or spelled out, ‘W-S-D-L’
SOAP
这个最容易, ‘səup’
UDDI
UDDI is NOT pronounced “Uddy”, but as spelt.
jUDDI
pronounced ‘judy’,和上面的不一样:p
WSE
Web Services Enhancements, pronounced ‘wizzy’
JAXWS
pronounced ‘jax-weis’
WSE-WSDL
‘wizzy-wiz-dəl’…

Editing Ruby File in Vim

In programming on December 27, 2007 at 10:34 AM

在/usr/share/vim/vim70/filetype.vim(in MacOS X)中找到ruby类型的设置,为其增加不同的后缀,使得*.rb,*.rake等都识别为ruby代码进行语法高亮:

au BufNewFile,BufRead *.rb,*.rake,*.rbw,*.gemspec setf ruby

在.vimrc中设置以下内容,即可使得编辑*.rb和*.erb时tab缩进值为2,但是其他类型的文件仍然为4.

set expandtab ” To insert space characters whenever the tab key is pressed
set tabstop=4 ” To control the number of space characters that will be inserted when the tab key is pressed
set shiftwidth=4 ” To change the number of space characters inserted for indentation
set softtabstop=4 ” makes the spaces feel like real tabs
au BufRead,BufNewFile *.rb set expandtab
au BufRead,BufNewFile *.rb set tabstop=2
au BufRead,BufNewFile *.rb set shiftwidth=2
au BufRead,BufNewFile *.rb set softtabstop=2
au BufRead,BufNewFile *.erb set expandtab
au BufRead,BufNewFile *.erb set tabstop=2
au BufRead,BufNewFile *.erb set shiftwidth=2
au BufRead,BufNewFile *.erb set softtabstop=2

Ruby Guys are Mac Guys

In mac, programming on November 13, 2007 at 9:02 PM

See RubyConf 2007 picture. In the third picture, almost all machines are Macbook Pro. Show me the money~

rails file_column plugin使用

In programming on August 11, 2007 at 10:14 PM

Rails的file_column插件是一个简单但是功能比较完备的文件上传插件。这一插件已经有很长时间没有更新了(最后一次更新是在2005年),但是就其功能和兼容性来说,一般的使用似乎没有什么问题。其用法也相当简单,大致的看看网站上面的文档即可。但是如果要做一些自定义的工作的话,就需要直接看它的源代码了。代码量不多,包括测试代码也就10多个文件。

最容易碰到的自定义需求应该就是定制上传文件存储的位置了,默认是在public目录下根据不同的模型名称来建立目录,明显的,这很容易造成“污染”,导致public目录下面生成大量的子目录。在看了其源码之后,注释中说明是可以通过给file_column这一方法传入参数:root_path来覆盖默认值的。我将root_path设置到public目录的file子目录下,试了之后在开发模式下上传文件确实没有问题,但是进行functional testing的时候发现并不正确。我在模型中设置了对文件大小进行验证的validates_filesize_of。这一方法在测试运行时验证查找的路径是在public目录下查找,这明显是不正确的,也即,仅仅覆盖root_path参数虽然能够在开发模式下正常工作,但是functional testing有些不同,按照其注释中的说法以及源代码,进行单元测试时file_column会把RAILS_ROOT/test/tmp/file_column这一目录作为根目录,而不是RAILS_ROOT/public/。单元测试时应该在setup方法中调用setup_fixture_files,在teardown中调用teardown_fixture_files,这两个方法会把文件fixtures复制到RAILS_ROOT/test/tmp/file_column目录下测试,测试结束后就移除。但由于根目录被我们传入的参数root_path覆盖,导致测试时的代码无法通过。解决的办法有两个,一个是按照不同的运行h环境来设置根目录,代码如下: 

if RAILS_ENV != "test"
  file_column :image, {:root_path => File.join(RAILS_ROOT, "public", "files")}
end
if RAILS_ENV == "test"
  file_column :image, {
  :root_path => File.join(RAILS_ROOT, "test", "tmp", "file_column", "files")
  }
end

但是这样做也有一个缺点,那就是如果在测试模式下进行集成测试的话(如使用selenium进行测试),file_column又会到test/tmp/file_column下查找文件。这也是明显不正确的,会导致文件无法访问。另外一个做法,可以做到万无一失的–直接修改file_column这一插件的代码:-)

A Visual Studio Tip

In programming on August 11, 2007 at 12:03 AM

用Eclipse习惯了,切换到Visual Studio之后发现有很多不顺手的地方。Eclipse中有一个功能,使用Ctrl+Shift+R就能够快速根据文件名打开任意的文件资源。在IntelliJ IDEA中也有这一功能,Ctrl+Shift+N就可以搞定。但是Visual Studio中却没有,每每要到目录树中查找一个文件,十分耗时。

今天偶然间发现了可以利用Eclipse来“帮助”Visual Studio实现这一功能。做法十分简单,把Visual Studio中的项目导入到Eclipse中。比如这是一个C++的项目(VS中最经常遇到的),因此就需要经常打开*.cxx,*.cpp,*.h等类型的文件。在Eclipse中文件关联中将这些类型的文件设置为使用VS打开,这样就可以在Eclipse中使用Ctrl+Shift+R迅速定位文件,然后一按回车,文件就在VS中打开了:)

可视化Java的Call Stack

In java, programming on July 1, 2007 at 5:14 PM

Debugging DFC实在是很痛苦的一件事情,因为DFC类库十分庞大,API的层次很深,很多层次都是非常薄的对下层的一个封装。如果是DFC的使用者,只要考虑其外部接口还比较容易,但是作为API的开发者来说的话,尤其是作为一个刚入门还不太了解其内部结构的新手来说,每次都要花费很多时间在debugger上,仅仅是为了看一下一次访问的整个层次结构是什么样的。于是利用前段空下来的时间,写了一个小工具(InvokeVis)来进行Java的Call Stack的一个可视化。

目前这个工具支持四种可视化的输出格式:

普通文本格式
很简单的格式,仅仅使用缩进来表示不同层次的调用。
GraphViz Dot格式
这一格式可以使用GraphViz中的dot工具来进行转换,可以输出为gif, jpg, png, post script等多种格式。
HTML格式
这是基于Yahoo的YUI的一个HTML格式,Call Stack被可视化的表示为一颗HTML树。
XML格式
这一格式可以使用SpringGraph来进行浏览,用户可以通过Flash来交互式的浏览Call Stack。目前的代码库中自带了一个定制的SpringGraph的flash,可以查看InvokeVis输出的XML格式。

最开始我考虑支持的最主要的格式其实是Dot格式,只希望能够输出为一般的图片就可以了。但是后来发现Dot格式输出的图片的可扩展性不是很好,尤其是对于DFC这种超级巨大的类库而言,一个简单的小程序就会输出几千个节点的图片(在用GraphViz Dot工具转化成jpg时甚至因为节点过多无法输出,只能转化成gif),要想看清图片的细节,只能局限与整个图片的很小一部分,仅仅是窥豹一斑。于是就考虑输出为HTML树这种可以动态变化的方式来进行浏览,扩展性确实得到了很大提高,基本不管多大的节点数都不会有什么扩展性问题。但是又觉得HTML树看起来的时候的可视化效果不如dot格式转化出的图片出色,最后转而想到flash格式的输出,应该来说最后得到的flash的效果还是不错的,但是有部分功能还需要进一步完善,尤其是对现在这一flash中输出的是无向图而不是有向图(方向表示方法调用的发向, caller method -> callee method)这一点很不满意,如果有时间的话会把这点先改进一下。
输出效果图:

Dot format, converted by GraphViz? into gif format:

HTML format:

XML format, visualzed with SpringGraph? flash:

多核对java的影响

In java, programming on November 23, 2006 at 10:45 AM

今天看到一篇文章, Multi-core may be bad for Java, 里面讲到:

The trend towards multicore is moving along at a fast pace. Architectures like Suns Niagara seem to be getting copied by the other CPU vendors. The architecture is basically lots of cores but low clock speed per core.

This is a problem for Java as:

  • Java likely has a longer path length than languages like C and clock speeds won’t help with this.
  • JavaEE promotes a simple threading model for applications
  • Garbage collection remains heavily dependant on clock speed for small pauses.

对与第三点,其实早有大牛Amdahl定律在前头.按照前文的评论中的数值,垃圾回收一般占CPU时间的5%.根据Amdahl定律,s = n/((b*n) + (1-b)),如果处理器的数目足够多(n>100),基本可以认为满足Amadahl定律的极限值,也即s = 1/b, 所以,大概估算的话, 100核的处理器大概可以提高Java平台20倍的性能(这里仅考虑gc是瓶颈). 不知道这个数值算达到了什么程度, 感觉还是比较高的吧.

参考文献:

  1. The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software
  2. multi-core may be bad for java
  3. Amdahl定律@wikipedia

编码问题释疑

In other, programming on September 23, 2006 at 9:08 PM

生活在中国的程序员恐怕没有不会碰到这个问题的–编码问题. unicode, utf-8, GBK, charset, encoding, code page这么一大堆术语加缩写,让人一看到就头晕,根本搞不清哪个是哪个. 各种各样的地方都会出现编码问题–数据库, JSP, mp3标签等等等等,不一而足. 我自己就花了不少时间解决编码的问题(还曾经写了一个很粗糙的Firefox的扩展来修正网页的编码),但面对这么多的术语,再加上平时解决问题时间有限,一般都是找了个方法摆脱了乱码问题之后就再也不想去看这个玩意了。今天本来是想比较一下python和ruby两个语言的,结果从ruby对unicode的支持问题开始,又回到了编码问题上来,终于决定把这些东西搞个清楚。

不过相关术语是在太多了,我建议大家先去看Unicode的词汇表,有什么疑问的词就可以在这个表里面search一下,一般可以立即得到一个清晰准确的解释,我主要结合wikipedia上对unicode的注释(unaccessible for some well-known reason)和unicode的这个词汇表讲几个最常碰到的词语和几个最大的疑惑。
confusing question:
Q: 编码到底是怎么一回事(-_-超级大问题,就解决这一个了决定)?
A: 历史上,编码问题最初是不存在的或者说不是什么大问题(很明显的,计算机发展初期只有英文使用者),字符集和字符编码是不区分的,统一用charset这个词来表示,同时兼了这两个词的含义.到了现代,编码这个问题被解耦成为几个部分:

1. what characters are available
2. their numbering
3. how those numbers are encoded as a series of “code units”
4. how those units are encoded as a stream of octets (bytes)

部分1指的就是字符集,表示可用的所有的字符,包括数字,字母,标点,汉字等等.
部分2指的是编码字符集(这里用英文可能更准确一些coded character set,被编码了的字符集),也即部分1中的每个字符会映射到一个或多个数字或者其他符号,由这些符号来代表部分1中的字符.
部分3和4指的是如何将2中映射得到的数字最终表示为计算机可以识别的二进制串(3,4拆分为两步的主要原因于计算机对字节流的解释有关big-endian or little-endian,不考虑的话应该可以合并).
从这四个部分可以看出,解决编码问题需要定义字符集,定义映射方案,定义编码方案这几个重要步骤.

Q: Unicode又是怎么一回事,它和utf-8有什么关系?
A: Unicode和另外一个与之并列的标准ISO 10646共同组成了一个上面提到的解决编码问题的解决方案,它不是四个部分中的任何一个,而是这四个部分各自解决方案的一个组合.其中字符集是由ISO 10646定义的,numbering应该在Unicode的标准中有(?^_^我也没看过,不确定).utf-8是Unicode提供的用于解决编码子问题的方案之一,同时还有utf-16和utf-32等等编码方案.

Q: code page呢?
A: code page就是coded character set,最初是IBM使用的一个术语,后来微软也大量使用.

这就是我的demystifying encoding problem, 如有不当请指教.
http://www.niyue.com

参考文献:
[1] Glossary of Unicode Terms http://www.unicode.org/glossary/
[2] Unicode in Wikipedia http://en.wikipedia.org/wiki/Unicode
[3] Character encoding in Wikipedia http://en.wikipedia.org/wiki/Character_encoding

Follow

Get every new post delivered to your Inbox.