Thinking in XiaoQiang
世人皆有悲哀,只有你不明白
posts - 56,comments - 150,trackbacks - 0
       看到这么多人点击我的博客, 我很欣慰呀. 
       大家可能有不认识我的,我是京城IT业的一个小字辈, 混到今天确实很不容易. 我是从打字员做起的,打字, 复印传真, 业务咨询...
       刚入行的时候, 先是学了一段VB,后来学过JAVA, 现在正在研究ruby.
       经历过十冬腊月大雪纷飞,也经历过大雨倾盆. 有一年上班天寒地冻大雪铺路,学院路上连条狗都没有. 我在雪地里骑着自行车,吭哧吭哧了一个半小时才到公司. 然后想起来今天是周日不上班.  这么艰苦的日子也有过. 但是我也坚持到了今天.
posted @ 2006-11-08 23:03 小强 阅读(1117) | 评论 (6)编辑 收藏

转自:http://mailboxpublic.googlepages.com/ubuntu%E6%98%AF%E6%80%8E%E6%A0%B7%E7%BB%83%E6%88%90%E7%9A%84

这篇文章在互联网上被广泛转载,但是很多都不完整,误导新手。同时有许多人根本不尊重作者的辛勤劳动,没有给原文署名。因此,我把它放到googlepages来,作为正式的文章。如果有商业用途,请联系本人:yulewang \at gmail \dot com

 [转载请保持原样,请勿擅自修改,以免误导新手]
yulewang 翻译 整理

二十一世纪到了,每个人都强调自己的个性,于是一种叫做DIY的东西悄然兴起。
操作系统作为全人类智慧的结晶,自然DIY起来难度极大,因而DIY出一个操作系统成就感绝对比买宜家的东西的成就感大。
为了不至于从头开始编写一个操作系统,我们当然把采用现成的操作系统作为一个底线。
当然,我们可以通过LFS让我们爽到底,但是,能够做到LFS的人可真的是凤毛麟角。而且更重要的是LFS简直在挑战我的忍耐程度。
我的这篇文章,教大家如何DIY一个自己的ubuntu发行版。在非常节省时间的情况下,达到耍酷的目的。

就好比LFS一样,我们需要一个创作基地。我们首先建立一个变量。建立这个变量的好处很明显,即使你不用~/diy_ubuntu这个目录,一样可以照着这个文章继续做下去。
$ export WORK=~/diy_ubuntu
$ mkdir -p $WORK

然后我们把光盘镜像文件挂到/mnt
$ sudo mount -t iso9660 -o loop dapper-live-i386.iso /mnt
$ cd $WORK

复制文件光盘文件
$ mkdir ubuntu-livecd
$ cp -a /mnt/. ubuntu-livecd
$ chmod -R u+w ubuntu-livecd
$ sudo umount /mnt

由于光盘中包含了很多windows下面的自由软件,我们来把不必要的文件删除。当然你可以保留。
$ rm -rf $WORK/ubuntu-livecd/programs

把光盘中的压缩文件挂起来,这个样子以后你可以在$WORK/old目录中看到一个完整的linux操作系统的目录。
$ mkdir $WORK/old
$ sudo mount -t squashfs -o loop,ro $WORK/ubuntu-livecd/casper/filesystem.squashfs $WORK/old

我们建立一个2GB大小的文件系统,然后把这个文件当作一个设备文件格式化,结果系统给出了一个警告,别理会它,选择是就是。
$ sudo dd if=/dev/zero of=$WORK/ubuntu-fs.ext2 bs=1M count=2147
$ sudo mke2fs $WORK/ubuntu-fs.ext2

然后我们把这个空文件系统挂起来。
$ mkdir $WORK/new
$ sudo mount -o loop $WORK/ubuntu-fs.ext2 $WORK/new

复制linux操作系统的文件.由于我们事先得到的linux是压缩的,所以我们把它解压了。
$ sudo cp -a $WORK/old/. $WORK/new

当然现在$WORK/old就没有用处了。废掉它
$ sudo umount $WORK/old

我们首先进入刚才得到的那个操作系统
$ sudo cp /etc/resolv.conf $WORK/new/etc/
$ sudo mount -t proc -o bind /proc $WORK/new/proc
$ sudo chroot $WORK/new /bin/bash

现在你就进入系统了,高喊linux for human beings,大炼ubuntu,想干什么就干什么。
# vi /etc/apt/sources.list #选择适合你的源
# apt-get update
# apt-get dist-upgrade
# apt-get install 你想装的软件
# apt-get clean
.... #更多的配置
最后离开你的那个操作系统
# exit

$ sudo umount $WORK/new/proc
$ sudo rm $WORK/new/etc/resolv.conf
现在你已经回到了你的初始状态中

把manifest重新整一遍
$ sudo chroot $WORK/new dpkg-query -W --showformat='${Package} ${Version}\n' > $WORK/ubuntu-livecd/casper/filesystem.manifest

然后做一下“磁盘清理”
$ sudo dd if=/dev/zero of=$WORK/new/dummyfile
$ sudo rm $WORK/new/dummyfile

重新压缩系统
$ sudo rm $WORK/ubuntu-livecd/casper/filesystem.squashfs
$ cd $WORK/new
$ sudo mksquashfs . $WORK/ubuntu-livecd/casper/filesystem.squashfs

你的改动都保存了。现在把$WORK/new废掉
$ cd $WORK
$ sudo umount $WORK/new

把文件的md5重新算一下
$ cd $WORK/ubuntu-livecd
$ sudo find . -type f -print0 |xargs -0 md5sum |sudo tee md5sum.txt

建立光盘镜像,命令很长,忍受着点。
$ cd $WORK
$ sudo mkisofs -o ubuntu-new.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -r -V "My Cool Ubuntu Live CD" -cache-inodes -J -l ubuntu-livecd
然后你就可以用iso把光盘烧了

然后你就可以在别人前面耍酷了。最后,王子和公主过着幸福的生活

posted @ 2006-10-31 15:58 小强 阅读(360) | 评论 (0)编辑 收藏
Ubuntu Live CD 个性化定制全程图解

转载,未测试

个性化定制最为明显的好处就在于能够真正适合自己的需要。想要个性化定制 Ubuntu 的 Live CD 吗?想要体验 DIY 的乐趣吗?本文将以图解的方式全程为你提供指导与帮助。

选择工具

“工预善其事,必先利其器”。选择一款合适的定制工具,对于普通用户来说尤其重要。这儿有两种 Ubuntu Live CD 的定制工具:UCK 和 Reconstructor。前者可以增删 Live CD 中的语言包和应用程序,后者能够提供从 GNOME 桌面到应用软件的多方面定制功能。本文选择 Reconstructor 作为 Ubuntu Live CD 的定制工具,读者朋友也可以自行尝试 UCK。

前期准备

在正式定制之前,应该做好这些方面的准备工作:制作或收集需要用到的定制资源,如主题、壁纸、模块等等;Ubuntu Live CD 的原始 ISO 映像(Reconstructor 支持 6.06 及 6.10);从 Reconstructor 官方网站下载定制程序;安装 Reconstructor 的使用依赖,如 squashfs-tools、libbogl-dev、mkisofs 等(详见 readme.txt 文件)。

定制过程

执行程序

tar xvzj reconstructor-2.0.tar.gz
cd reconstructor-2.0/
sudo python reconstructor.py

Reconstructor 在启动时会检查使用依赖,并提示用户安装未完成的依赖。接着会进入欢迎页面。




创建工作目录
Reconstructor 默认会将工作目录创建于 /home/username/reconstructor,另外分别创建 remaster、root、initrd 三个子目录。工作目录仅在首次使用时才有必要创建,如果是再次使用,则无需创建。因为我们是初次使用,所以勾选其中的三个选项。然后,在 Live CD ISO Filename 选择先前下载好的原始 Ubuntu Live CD ISO 映像文件。




定制引导屏幕
引导屏幕这部分可以定制 Live CD Splash 图像、引导选项文字的颜色、以及 Usplash 图像。需要注意是,Splash 图像要求是 pcx 格式,而 Usplash 则是编译好的 so 文件(对于 Ubuntu 6.06,Reconstructor 支持直接生成)。设置后,点击“Apply”按钮以便生效。




GNOME 桌面的定制
GNOME 桌面包括登录屏幕、桌面、主题三部分的定制。其中,在登录屏幕中可以设置 GDM 主题、Splash 屏幕、背景颜色;桌面部分能够定制壁纸和字体;在主题中可以选择 GNOME 桌面所用的主题及图标。对于这些定制,用户既可以选择系统自带的,也可以使用自己的。从 GNOME LOOK 上可以找到这方面的丰富资源。




定制 Apt 源
通过定制 Apt 源,就能够直接在 Live CD 中使用这些扩展的源,以便安装需要的应用程序。在你需要使用的源前打勾选择即可。对于其他的源,可以输入到下面的文本框中。




优化启动及关机过程
在启动部分,可以选择在系统启动时需要运行的守护进程,如 ppp、laptop-mode 等。同时,Reconstructor 也能够对关机过程进行优化。




设置用户及口令
切换到 Live CD 选项页,对在 Live CD 中要用到的用户、口令及主机名进行设置。




定制应用程序
Reconstructor 的模块功能可以让用户按需定制应用程序,如安装程序、删除程序等。普通用户可以使用 Reconstructor 提供的现有模块:包括图像处理软件、生产力软件、多媒体软件、网络软件、服务器软件、及其他软件等。如果现有模块不能满足你的要求,那么可以通过输入安装或删除命令来实现对于软件的定制。




构建选项
注意以上每一个部分的定制都需要点击“Apply”按钮。现在按“Next”进入构建选项页。在此设置 Ubuntu Live CD ISO 文件的保存路径、名称、架构。如果所有的都没有问题,那么继续下一步吧。




定制结束
此时,需耐心等候一阵,直到看到 Finished 页面。




最后测试

在 Ubuntu Live CD 定制结束后,先不要忙着刻盘,在虚拟机中测试一下,如果确认没有问题,那么就烧录并与朋友分享吧
posted @ 2006-10-31 15:48 小强 阅读(1001) | 评论 (0)编辑 收藏
转自:http://blog.rubypdf.com/2006/10/20/install-ruby-on-rails-lighttpdsqlite3-and-mongrel-under-ubuntu/

nothing but the script I used:
#install Mysql
apt-get install mysql-server

#install Ruby and relative
apt-get install irb libdbm-ruby1.8 libgdbm-ruby1.8 libmysql-ruby1.8 libmysqlclient14 libopenssl-ruby1.8 libruby1.8-dbg mysql-common ri ri1.8 ruby1.8-dev

#install rubygems
wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz
tar zxfv rubygems-0.9.0.tgz
cd rubygems-0.9.0
ruby setup.rb
gem update –system

#install Rails and dependencies
gem install rails –include-dependencies

#before install Mongrel,
apt-get install install build-essential #we need it to compile mongrel and Sqlite3

#intall Mongrel
gem install mongrel –include-dependencies

#install Sqlite3
apt-get install sqlite3 swig libsqlite3-ruby libsqlite3-dev
gem install sqlite3-ruby #compile this need libsqlite.h

#install Lighttpd
apt-get install lighttpd

some useful link
http://mongrel.rubyforge.org/docs/lighttpd.html
http://fo64.com/articles/2005/10/20/rails-on-breezy
http://scottstuff.net/blog/articles/2006/07/23/typo-installer

posted @ 2006-10-30 17:09 小强 阅读(1048) | 评论 (2)编辑 收藏

转自:http://www.urbanpuddle.com/articles/2006/06/10/install-ruby-rails-on-ubuntu-dapper-drake

This is a small guide I wrote up to installing Ruby on Rails on Dapper Drake. It covers getting lighttpd running to support both rails and php which will be useful to anyone who likes to use phpmyadmin along with ruby on rails. It's similar to the article I wrote earlier for Arch Linux except modified for Ubuntu's Dapper Drake release.

1. Make sure the universe repository in /etc/apt/sources.list is uncommented:
deb http://us.archive.ubuntu.com/ubuntu dapper universe
deb-src http://us.archive.ubuntu.com/ubuntu dapper universe

2. Make sure you are up to date:
sudo apt-get update
sudo apt-get dist-upgrade

3. Install the ruby base packages:
sudo apt-get install ruby ri rdoc mysql-server libmysql-ruby

4. We need to grab the latest ruby gems from rubyforge. You may need to modify this command if a version after 0.90 is available.
sudo wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz
tar -xvzf rubygems-0.9.0.tgz
cd rubygems-0.9.0
sudo ruby setup.rb

5. Now let's install Ruby on Rails!
sudo gem install rails --include-dependencies

6. We have Rails but we still need lighttpd and mysql. I've thrown in PHP too in case you want to manage your database with phpmyadmin like I do. Let's grab all the packages, shall we?
sudo apt-get install lighttpd php5-cgi php4-cgi php5-mysql php5-mysqli php4-mysql libfcgi-dev libfcgi-ruby1.8

7. Modify your /etc/lighttpd/lighttpd.conf file to set up your domains. Be careful because by default Ubuntu maps all the images so that they are taken from /usr/share/images instead of your/rails/root/public/images so if you're wondering why your rails app is working but your images aren't being displayed this is why. You can take out the offending code in your lighttpd.conf or just put your images in /usr/share/images.

8. Time to enable some modules for lighttpd. There are others that you may need but they should be enabled in your lighttpd.conf. Personally, I'm not a fan of enabling modules two different ways but I'm sure this will get cleaned up eventually.
sudo /usr/sbin/lighty-enable-mod fastcgi
sudo /usr/sbin/lighty-enable-mod proxy
sudo /etc/init.d/lighttpd force-reload

9. Let's make sure that there are no errors by stopping lighttpd and then starting it manually:
sudo /etc/init.d/lighttpd stop
sudo lighttpd -f /etc/lighttpd/lighttpd.conf

If you have errors there make sure you take a look and try to address them! The output you see will be your best bet in getting help from somebody on one of the forums.

10. Install some basic gems you might need to run your rails app:
sudo gem install actionmailer
sudo gem install activesupport
sudo gem install actionpack
sudo gem install actionwebservice

And now you should have a new, shiny, ready to go Ubuntu Dapper Drake server just waiting for your PHP or Ruby on Rails applications!
posted @ 2006-10-30 17:07 小强 阅读(387) | 评论 (0)编辑 收藏
     摘要: Capistrano: Automating Application Deployment Application deployment is one of those things that becomes more and more complicated as the scale of your application increases. With just a single box...  阅读全文
posted @ 2006-10-30 14:00 小强 阅读(901) | 评论 (0)编辑 收藏

前几天在我的blogjava上和CSDN上发过一个帖子: 说一说编程恶习.
http://community.csdn.net/Expert/topic/5091/5091887.xml
http://www.blogjava.net/uiiang/archive/2006/10/16/75502.html

几天的时间收到了很多网友的回复.
我发这个帖子时, 并不是想讨论技术问题, 也不是为了抱怨, 只是想以另一种方式, 来提醒一下编程的初学者, 和一些所谓"经验丰富"的老程序员. 因为我发现传统的写一篇编程规范的文档, 似乎并不能引起大家足够的重视. 垃圾代码仍然一出再出.

我在帖子中所说的问题, 也并不需要太多的技术经验和深厚的专业知识. 都是一些随手而来的小问题, 解决这些问题的方法只需要工作时认真负责, 多动动脑子就行了.

在帖子的回复中, 有几个回复让我很在意:
==================================================================
钱给的太少,能对付过去就完了
社会上什么行业不是这样,能对付就行了 。

要改变这种情况, 那还要上边有改变的想法,改善一下工作环境,等等。 。

老板们吃的是良心,拉的是思想

我们那么认真干啥
=====================================================================

我对这种说法非常的不赞同, 代码写的再差, 老板还是要赚他的钱, 该被剥削还是跑不了.
可如果把这个当成不认真工作的理由, 那就只能永远自己吃亏了.
如果总是这么不认真工作, 不养成良好的工作习惯, 自已思考的习惯, 那就永远不能进步
只能当一辈子代码民工, 一辈子给这种垃圾老板打工.

要明白一点, 好的编程习惯, 思考能力, 都是在平时工作当中, 一点一滴的积累起来的.
并不是当有人给了你一个好的工作环境后, 想变出来就能立刻变出来的.

老板对不起咱们是另一回事, 但自己是不是能对得起自己, 那就看你自己的想法了

态度决定一切

posted @ 2006-10-30 10:28 小强 阅读(2014) | 评论 (10)编辑 收藏

         最近在做一个汽车销售系统的改善工作, 这个系统已经运行两年了, 两年来, 客户不断的提出新需求, 系统也在不断的改来改去。 这次轮到我来改它了。   想想 N 年前初学编程的时候, 书上, 网上, 杂志上不断的在说, 要养成良好的编程习惯。 然后还给出了 N 长的一大篇文章来介绍一些编程规范。 我这个人是很懒的, 大概的看了一下就过去了。 没有特意的记什么。 好在我这个人也不是特别的懒, 对自己的工作也是很上心。 编程的时候尽可能做到更好。 性能功能能考虑到的都要做到最好。   慢慢的也养成了一些编程的习惯,   时间长了, 下意识的就去遵守一些模式,模范之类的东西了。
        
有了这些习惯, 再看这次修改的系统, 真的是生可忍熟不可忍了。   这次我也不说什么编程规范了, 我就说说这些编程恶习

        
一,   程序没有注释
      
注释 !! 注释 !!! 如果只是打印了一个 HELLO WORLD 您不注释那也就算了, 如果是只有一两百行的小功能类您不注释, 那我也忍了, 可是 3000 多行一个类的业务逻辑代码, 您老人家还不注释 !!!   TM 让我怎么去改代码,   一点业务逻辑的说明都没有, 我改代码的时候,得一边用 DEBUG 调试, 一边替他加注释。 然后才能进行自己的工作。 几千行的一个类,   一行注释都没有, TM 就不觉得颜色单调了点吗 ?

      
二,   不遵守基本的编程约定
      
变量名大小写混乱, 明明是变量, 非要完全大写, 要不就大写开头。 要不就是方法名全是大写, 最牛 B 的一个方法是用中文做方法名, 你丫这时候想起打中文来了, 累不累呀。

       还有人用拼音做变量名方法名,就算您英文不好,稍微查一下金山词霸行不行,现在百度和 GOOGLE 都有翻译功能,稍微查一下英文,也当是学英语了行不行? 您实在太忙的话,不查也就算了,拼音就拼音吧,好赖也算是中国话的。 可是您就别用拼音简写了,英文简写还认不出来呢, 您还用拼音的开头字母当变量名, 那我 TM 上哪儿猜去呀!

 

       三, 不明就里的代码

       系统中经常会出现这样的代码,尤其是在 controller 里居多:

       // some code

       If(flag .equals(“submit”)){

       model.getInfo();

}else{

       model.getInfo();

}

我没写错, if else 调用的方法完全一样,大家也放心,我仔细的看过调用的代码,调用的方法里,也没有根据其它情况来改变他的运行路线。我就不明白为什么要做这个 if 判断了。担心会有什么特殊的业务逻辑, 所以也不赶随便去改他。 猜了半天,感觉最理想的答案是写代码的人,担心以后会有新的逻辑分支, 所以在这里用 if 预留了一个位置, 以后改的时候方便。

数日之后有幸遇见了当初写这代码的老兄,问过之后立刻晕倒,原来是这个代码是参照别的模块的样子写的,别的模块在这里都有 N 个程序分支,通过 if 来判断后决定调用哪个 model 里的方法。但他这个模块很简单,没有什么分支,就是调用那一个方法,但他写代码时,看别人的模块在这里都进行 if 判断了,所以觉得自己也应该判断一下,于是就出现了上面这样的代码。

 

四, 面向过程式的编程方法

遇到过好几次 2000 多行的方法,所有业务逻辑,一气呵成,就用了一个方法搞定。如果是简单的逻辑也就算了, 可是几千行的代码全放在一个方法里,一个类里有无数的重复代码。 这回到好,重构那本书没白看, 现在有了实践的机会了。

难道您自己调试的时候就不觉得麻烦吗? 我在这里不想讨论什么面向过程还是面向对象,也别和我说什么方法多了也不一定就是面向对象的思想。 平时对自己写的代码多上点心, 大家都是在这行干了几年的人了,把代码写的漂亮点有什么不好。

 

五, 代码缩进混乱

我们公司有规定,改代码的时候,不许修改原有代码的格式。 不管他多乱,也不许改。 我不明白这是为什么,也许是检查代码的人,要用文件比较工具吧。

但这下苦坏我了, 代码的格式那叫一个乱。 有顶着行头写的, 有向后空了 N 格的,大概是写代码的人, 为了方便自己找到正在调试的那段代码,所以把代码的缩进变得和其它代码与众不同吧。 那您调试完了到是重新排一下版呀, 这真的不累~~, 现在的 IDE 工具都有自动排版代码的功能, 一个快捷键就搞定了,稍微勤快一点行吗??

BT 的一段代码是缩进居然出了屏幕!!! 你吃饱了撑的呀, 没事缩那么远干吗, 我根据后台输出找了半天也没找到那段代码在哪儿, 原来是因为缩进的太远了,不在屏幕范围之内, 向右拉了半天滚动条才找到。 你丫是不是写着代码睡着了? 脸正好砸在 TAB 键上。

 

六, 多余的后台输出

好几个循环嵌套在一起~~~ 也行, 就算是因为业务逻辑需要,没别的办法也将就了。 好几个循环嵌套在一起查数据库, 咱们最好还是开动一下脑筋, 看看有什么更好的办法。如果还是没别的办法, 那也凑合了。 可这种情况您就别在后台输出 SQL 语句啦, 每次一执行程序,成百上千个 SQL 语句在后台输出, 查数据库才用了一两秒,结果输出这些 SQL 就用了半分钟。 您自己就没觉出程序慢在哪里吗? 您调试程序的时候输出一下也就算了, 提交到正式运行的环境时,就麻烦您,劳您大驾~~ 把那些输出注释掉吧,实在不行留几个重要的输出就行了。 让这种代码影响系统性能~~ 也太冤了吧。

 

七, 打肿脸充胖子

我也不知道这条算不算恶习,也许不算,在有些人眼里还是好事。但也要看具体情况,经常有些人写代码不喜欢用 IDE ,只用 EDITPLUS 这类工具。按常理说,初学者都应该尽量用这些编辑器写代码,对加深学习印象有好处。也有人说高手不屑于用那些 IDE ,我少见多怪, 这种绝顶高手我没见过。

但咱平时工作的时候,要的是效率,您不是那种高手就乖乖的用 IDE 吧。经常见到有些人,为查一个方法的调用,搜来搜去的。真正的高手是工作效率最高的人,不是用最简单工具的人。


//20061019 start
        一些补充: 

有些人提到用EDITPLUS的效率其实也很高, 这点我也承认. 但我想说明一下, 我所见到的用EDITPLUS那个人, 根本没有发挥出editplus应有的效率和功能. 在他的手里editplus只是一个多了颜色区分的记事本. 编译程序还是用javac , 也不会用ANT, 发布程序还是手工拷贝. 号称四年经验的程序员, 刚到公司时用了一天时间重装好电脑后, 写了一个打印hello world的程序测试环境. 结果不写static void main方法, 直接就要用java去运行. 运行不成功还说系统配置有问题, 需要再重装.  每次帮他调试程序, 想查一个方法的调用, 一个文件一个文件的搜, 看得我这个急...........     我的希望是不管用什么工具, 要让这个工具在自己的手里发挥出最大的作用来, 如果用editplus非常纯熟的话, 我也会很佩服那个人的, 而且会虚心的向他学习使用技巧

可他把时间全耽误在这上了, 这样的工作效率, 加班都是活该的
//20061019 end



    今天就写这么多,
大家还遇到过什么样的编程恶习,欢迎补充。

大家不要总是抱怨什么工资太少,工作量太大。工作效率这玩意儿是要经验来做基础,这没错,经验少也没事。咱平时写程序的时候多上点心,多对自己的代码思考一下,多动动脑子。自然就能总结出最好的工作经验了,工作效率自然就提高了。

也别总是说什么 STRUTS 不好, HIBERNATE 太慢,不屑去用它。人家的程序能在全世界流行,自然有他的过人之处。多读读他的代码,学习一下他到底好在哪里,如何才能把这些优点应用到自己的代码上。这才是最重要的。

 也许咱们写不出什么高超的代码技巧,写不出什么华丽的算法,但如果能在一些习惯,细节上做到精益求精,那也对得起自己的代码了。


    写出上面这些代码的人,如果你的工资真的很少,那我只能惋惜的说一句:你的工资是可怜了点,但看您写的这代码,连这点工资都不应该给你!!

posted @ 2006-10-16 23:27 小强 阅读(5628) | 评论 (45)编辑 收藏
Ruby是何方神圣?

Ruby是一种功能强大的面向对象的脚本语言,她可以使您方便快捷地进行面向对象编程.Ruby使文本处理和系统管理变得简单,与Perl非常相似.一句话:简单明了,扩展性强,移植性好.

Ruby的几大亮点:

  • 语法简单
  • 垃圾回收
  • 可移植性
  • 动态载入
  • 完全免费
  • 正则表达式

走向世界的Ruby

松本行弘"Matz"(Matsumoto Yukihiro)是Ruby语言的发明人,他从1993年起便开始着手Ruby的研发工作。他一直想发明一种语言,使你既能进行高效开发又能享受编程的快乐。1993年2月24日Ruby诞生了,1995年12月Matz推出了Ruby的第一个版本Ruby 0.95。不久Ruby便凭借其独特的魅力横扫日本,相信在不久的将来,Ruby将走向世界。

# 下载

如何取得Ruby

  • 您可以从各个镜像站点下载稳定版ruby 1.8.1
  • 您还可以下载下一个稳定版本的预览版ruby 1.8.2 preview1
  • 我们用tar.gz把当前CVS稳定版快照(Fri Jul 30 04:00:51 JST 2004)保存下来。这是在1.8系列稳定版的基础上打了补丁的版本。若您需要比最终版本还要稳定的版本的话,就请下载使用。
  • 每天晚上,我们都会用tar.gz把当时的CVS最新版快照(Fri Jul 30 04:00:25 JST 2004)保存下来。因为保存快照时没有作任何修改,所以可能会有一些问题。请您斟酌使用。
  • 我们使用tar.gz把当前的1.6系列快照(Fri Jul 30 04:01:11 JST 2004)保存下来。该最新版本修正了1.6系列最终版本的所有错误。若您暂时无法升级到1.8系列,却又想修正1.6最终版本的错误时,就请使用该版本。
  • 请参考CVS指南来了解使用匿名CVS获得最新源码的方法。

可下载项目

FTP镜像站点

HTTP镜像站点

Rsync镜像站点

  • rsync://sunsite.dk/ftp/mirrors/ruby/ (丹麦)
  • rsync://rsync.idaemons.org/ftp/mirror/ftp.ruby-lang.org/ruby/ (日本)
  • rsync://gd.tuwien.ac.at/languages/ruby/ (澳大利亚)
  • rsync://mirror.cs.mun.ca/ruby/ (加拿大)

# 下载:文档

Ruby 1.6 参考手册(日语版)
下载发行版
下载最新版
Ruby 1.4 参考手册(英语版)
下载
Ruby 1.4 参考手册(日语版)
下载
Ruby教程(日语版)
下载
Ruby用户指南(日语版)
下载

# Ruby教程

Ruby安装方法分类

大体说来,Ruby的安装方法可分为两类。

第一种方法,自己编译源代码然后开始安装。在UNIX系列OS(Linux、NetBSD、FreeBSD、Solaris、HP-UX以及Windows中的Cygwin等等)平台上采用这种方式安装时,操作方法大同小异且简便快捷。在Windows环境中,编译环境的不同会带来功能上的差异(请参考「不同的Microsoft Windows编译环境所引起的差异」)。

另一种方法就是使用针对不同平台开发的各种便利的安装工具。若您“不想编译”或者想使用软件包来安装Ruby的相关软件的话,我们推荐您使用这种方法。Linux环境下可以使用RPM或deb,若是FreeBSD的话则可以使用ports/packages等。但是,您必须拥有root权限才能使用软件包进行安装。若您想安装到自己的主目录里的话,就必须自己编译源代码。

Windows上的安装方法有点特殊。在cygwin、mswin32或mingw这三种不同的编译环境下,使用的安装方法也不一样。若您并不熟悉UNIX的话,我们建议您使用mingw或mswin32。

此外在您编译源代码时,您可以使用CVS以获得最新版的源代码。

这里我们只介绍了一些典型的安装方法,实际上,Ruby还可以支持很多其他的平台。而且Ruby每天都会得到改进,因此本文件中的某些描述可能已经与实际情况有所不同。若您发现我们的描述有误或与实际情况不符的话,请您指正。同时若您有其他平台上的相关信息的话,也请您补足。如您所见,我们采用的是专人维护制度。当您想帮我们补充资料的时候,请参考「RWiki的RD」。

目录

按平台分类的安装指南

(字母顺序)

  • Alpha Machine
  • Borland C++ (从源代码开始)
  • BTRON .超汉字
  • Cygwin (binary)
  • Cygwin (从源代码开始)
  • Debian GNU/Linux
  • EWS4800
  • FreeBSD
  • HP-UX
  • Kondara MNU/Linux
  • MacOS X
  • mingw32 (binary)
  • mingw32 (从源代码开始)
  • MS-DOS
  • mswin32 (binary)
  • mswin32 (从源代码开始)
  • NetBSD
  • OS/2
  • Vine Linux
  • RPM系列Linux平台
  • UNIX平台
  • 用CVS保持更新

Windows用户提示

开发环境

  • emacs + ruby-mode
  • xyzzy + ruby-mode
  • irb
  • irbsh
  • ReFe
  • Copal
  • RDE
  • RubyWin
posted @ 2006-07-24 17:39 小强 阅读(1131) | 评论 (1)编辑 收藏
Ruby 基础

作者:Ralf Wirdemann, Thomas Baustert
www.b-simple.de
2006.2.14

1.1 在线文档和书籍

    语言资料上,如果要找核心和标准API的文档可以去 www.ruby-lang.org,深步进阶我们推荐下面的书籍:

Dave Thomas: Programming Ruby, Second Edition, Pragmatic Bookshelf, 2005
Ruby书籍中的标准著作,极具推荐价值。
Hal Fulton: The Ruby Way, Sams, 2001
这部书不仅仅有Ruby语言的最新状况,还提供了一百个案例,很有意思。

1.2 引言

    Ruby 是一个纯粹的面向对象的动态型语言。Ruby 程序不是被编译成二进制格式(如Java),而是直接由一个解释器来处理。这门语言在1995年由松本行弘(Matsumoto Yukihiro)发布,除了 Smalltalk、Python 等语言以外,Perl 对它的影响是首当其冲的。
    Ruby 里的一切都是对象,它没有原始类型(如Java)。除了面对对象,Ruby还提供了垃圾回收、异常、正则表达式,为迭代器和方法作参数的“代码块”,运行期的类扩展,线程及更多的东西。Ruby 语言易懂易用,原因在于它简单、语法干净。

1.3 Ruby 程序

    Ruby 程序保存在以 .rb 结尾的文件里。程序内容包含类、模块、或者只是简单的Ruby代码。下面是地球人都知道的 Hello World 程序:

# hello.rb                        
puts "Hello World!"               

    如果这个代码是以 hello.rb 的文件名保存的,那么可以这样调用:

> ruby hello.rb                   
> Hello World!                    

    在Windows下允许您以文件关联的方式在IE中执行;在 Linux/Unix 下您可按照自已的操作系统情况使用 Shebang行:

#!/usr/local/bin/ruby             
puts "Hello World!"               
                                  
#!/usr/bin/env ruby               
puts "Hello World!"               

    随后直接执行这个程序:

> chmod 744 hello.rb              
> ./hello.rb                      

    Ruby 的语句可以以分号结尾,但不是必须。 Ruby 是一个面向行的语言,也就是说,一个语句不需要以分号结尾,解释器能够明白下一行是进一步的语句。下面前几个语句的输出相同,最后一个是错误的:

puts "Hello World!";              

puts "Hello World!"               
puts "Hello " \                   
   "World!";                      
puts "Hello" +                    
   "World!";                      
puts "Hello"   # 语句至此结束     
   + "World!"; # 无法被解释的新语句


    多个语句可以用分号隔开写到一行里面,这不是很地道的写法,因为会影响阅读的流畅。

# 可行,但不漂亮:                
a = 42; b = 15; c = a + b        

#这样比较好:                     
a = 42                           
b = 15                           
c = a + b                        

    Ruby 以两个空格作为缩进的方式(不用Tab键),这是个推荐习惯并且应该尽可能地得到遵循:

# 非常棒的缩进                   
while line = file.readline       
  if !comment_line(line)         
    lines.add(line)              
  end                            
end                              

# oh~,oh~,您这是和外星人学的吧 
while line = file.readline       
    if !comment_line(line)       
        lines.add(line)          
    end                          
end                              

    Ruby 提供了全系列的标准类型,如数字、字符串、正则表达式、数组、哈希(Hash),等等。所有这些元素通过类和模块的方式以备使用,无需在程序(文件)中绑定,它们来自于核心库并在整个程序中自动生效。
    另外一些是以其它类和模块构成系列的标准库方式以备使用的,例如 Date、Logger、Test::Unit 等等。一旦要自行开发就必须在每个程序里通过关键字 require 来明确绑定。于是在 require 后加上或有或无结尾(.rb)的文件名。

require "date"  # date.rb 用到 Date类              
require "my_class" # my_class.rb 用到MyClass类     
require "my_module" # my_module.rb 用到 MyModule模块

    对此处文件名的处理不是按绝对路径,Ruby 会在所有的标准目录下寻找这个文件,它们被包含在全局变量$: 里面,您可以在命令行用 ruby -e "puts $:" 或其它方式得到这些路径。一个装载了类和模块的程序里的所有名字都可以通过全局变量 $" 输出。

1.4 注释

    在 Ruby 中注释行是以#号开始的,注释可出现在句首或句尾。

# 下面这行是被注释掉的           
# a = b - c                      
a = b + c # 注释到行尾           

    一个注释块开始于 =begin 结束于 =end,这几个关键字必须在行首,不能有空格。

=begin                           
  def my_method                  
    ...                          
  end                            
=end                             

1.5 数字

    Ruby支持整数和浮点数。Ruby 里面没有原始类型,都是数字对象。整数从负2的30次幂到正2的30次幂 (在64位机器上从负2的62次幂到正2的62次幂) 被定义成FixNum类型 超出此范围的整数被定义成BigNum类型,类型的划归与转换是自动完成的,一个数字的长度最终由主存来判定。

value = 42 # FixNum                               
big_value = 123456789012345678901234567890 # BigNum

    数字可以用16进制、8进制或者2进制的数字系统来表示:

# 42                             
0x2A                             
0052                             
b101010                          

    有相应的数学运算符以供使用,数字的增减用运算符 += 与 -= 来实现, 出自 C 和 Java 的 ++ 与 -- 在 Ruby 里是没有的。

a = 2                            
b = 3                            
c = a + b    # 5                 
c = a - b    # -1                
c = a / b    # 0                 
c = 2.0 / b  # 0.666666666666667 
c = a * b    # 6                 
c = a**b     # 2*2*2 = 8         
a += 1       # a = 3             
a -= 1       # a = 2             
a++          # Ruby里非法        

    FixNum与BigNum 继承于基类 Integer,以下是可用的函数,是与块(见1.14节)结合的:

1.upto(3) { [i] puts i }    # 1 2 3             
3.downto(3) { [i] puts i }  # 3 2 1             
0.step(10,2) { [i] puts i } # 0 2 4 6 8 10      
3.times { puts *42* }       # 42 42 42          

    浮点数在 Ruby 里是用 Float 类来表示的。像其它语言一样,Ruby 里的浮点也有卷折误差。为了计算精确(如 合值),建议使用 Ruby 标准库里的 BigDecimal 类,相对于 Float,这个类描述了更为丰富的浮点数并且避开了卷折误差。

1.6 字符串
 
    在 Ruby 里,字符串被放置在两个单引号或双引号之间。引号常会出现在另一个引号里面:
 
str = "Hello"          # Hello
str = "Hello 'Thomas'" # Hello 'Thomas'
str = 'Hello'          # Hello
str = 'Hello "Thomas"' # Hello "Thomas"
 
    字符串可以通过 %q 和 %Q 产生,这是为了避免当一个字符串内出现过多的引号或其它符号时会出现这样或那样的错误。%q 产生一个被包含在单引号中的字符串,%Q 产生一个被包含在双引号中的字符串,文本以分隔符为界来限定,分隔符可以是除字母与数字以外的所有符号。

%q{a string}
%q(a string)
%Q$a string$
 
    %Q 可以替换 #{Ausdruck}这样的表达式,而%q不能:
 
表格1.1 字符串中带双引号的逃脱符
\a 响铃
\b 退格
\e 逃脱
\f 换页
\n 换行
\r 回车
\s 空格
\t Tab
\v 垂直表格跳位
\nnn 八进制
\xnn 十六进制 
\cx Control-x
\C-x     Control-x
\M-x     Meta-x
\M-\C-x  Meta-Control-x
\x       x
#{code}  code


puts %q{result: #{42.0/3} EUR}     # result: #{42.0/3} EUR
puts %Q{result: #{42.0/3} EUR}     # result: 14.0 EUR
 
    在花括号、圆括号、角括号的情况下字符串是括号括起来的部分,其它则是到那个符号再次出现为止。字符串也可多行显示,Ruby 在此并不清除起始空格符。
 
s = %Q@ein String über mehrere 
 Zeile mit "" und '' und durch
  einen Klammeraffen begrenzt@
puts s
=>
ein String über mehrere 
 Zeile mit "" und '' und durch
  einen Klammeraffen begrenzt
puts s.inspect
=>
"ein String \374ber mehrere\n Zeile mit \"\" und '' ...
...und durch \n  einen Klammeraffen begrenzt"
 
     一个表达式的结果可以通过#{Ausdruck}插入到一个字符串中,然而这只有在双引号之间有效。
 
"Ergebnis #{42*7/100} %" # Ergebnis       #{2.94} %
"Die Anwort ist: #{answer(x)}"            # Die Anwort ist: 42
 
    如C与Java所惯用的,特殊符号由斜杠逃脱,表1.1列举了所有的特殊符号:
 
"Ein Slash: \\"              # Ein Slash: \
"Er rief: \"Ralf!\""         # Er rief: "Ralf!"
'War\'s okey?'               # War\'s okey?
"Neue\nZeile"                # Neue
                             #Zeile
'Neue\nZeile'                # Neue\nZeile
 
    两个字符串的内容可以用 == 方法来比较,与之相对照的是 equal? ,它用来判断是否是同一个字符串实例(参看1.15.5节):
 
s1 = "Thomas"
s2 = "Thomas"
s3 = "Ralf"
s1 == s2 # => true
s1 == s3 # => false
s1.equal? s1 => true
s1.equal? s2 => false
s1.equal? s3 => false
 
    字符串可以用+和<<这两个方法连接。使用 * 可实现多重累加。
 
"Thomas" + "/Ralf"    # Thomas/Ralf
s = "Thomas" 
s << " und Ralf"      # Thomas und Ralf
"Ralf " * 2           # Ralf Ralf
 
 
    字符串类提供了大量的方法,让你随心所欲,下面是几个例子;
 
s = "Thomas und Ralf"
s[3]                  # 109
s[3].chr              # m
s[7,3]                # und
s[0..6]               # Thomas
 
"Thomas und Ralf".delete("a")         # Thoms und Rlf
"Thomas und Ralf".delete("aou")       # Thms nd Rlf

"Thomas und Ralf".gsub("und", "oder") # Thomas oder Ralf
"Thomas und Ralf".gsub(/[aou]/, "$")  # Th$m$s $nd R$lf
 
"Thomas und Ralf".index('a')          # 4
"Thomas und Ralf".index('a',5)        # 12
 
"Thomas und Ralf".split               # ["Thomas", "und", "Ralf"]
 
    为字符串转换成整数和浮点数提供两种途径,安全一些的是使用核心方法 Integer 和 Float, 它们在出错的时候抛出异常; 另一种是 String 类的方法 to_i 和 to_f,限制较少 。

"42".to_i            # => 42
nil.to_i             # => 0
"42x".to_i           # => 42
Integer("42")        # => 42
Integer(nil)         # => 0
Integer("42x")       # => 参数错误
posted @ 2006-07-24 17:36 小强 阅读(1769) | 评论 (0)编辑 收藏
仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页