Rails 3.2 新特性简介

2012年4月08日 00:12

好久没有写Blog了,我依稀记得当初面试的时候面试官翻阅我Blog的场景,后来我也只写过一篇Blog而已。而今天,我已经成功的进入了这家企业,成为了真正的Ruby on Rails开发者。从去年暑假刚开始学习Rails,到今天,只有半年有余。不过Rails已经从最初学习时的3.0.8升级到了3.2.3。我依然记得第一次用3.1.0的时候还在疑惑怎么一些功能与书上已经开始不一致了,那会还不知道3.1.0加了很多新特性。不过那时幸亏有GitCafe团队的成员Rainux(@RainuxLuo)带领稀里糊涂的我用上了Rails 3.1,否则我可能至今都不了解Rails的版本计划和3.1的新特性。

本文简单介绍Rails 3.2的新特性,主要参考 Ruby on Rails Guide 3.2 Release Notes。不过作为新手,这Release notes我有很多是看不懂的,幸亏后来又看了Railscasts Upgrading to Rails 3.2视频,终于理解了主要更新,至于次要更新,如果我能理解的就会提及(不能保证理解完全正确,如果有错误请务必指出),如果不能理解的就不说了,一般也不会很重要(如果读者能在评论中略微指导下,我将不胜感激)。

1. Development环境下性能改进,由于集成了Active Reload插件,Rails在Development环境下只会重新加载哪些确实被改过的类文件,在大型项目中,这个新特性将明显改进效率。

2. 使用新的Journey引擎,路由识别的性能提升。

3. ActiveRecord::Relation增加一个explain方法,用以分析SQL包括索引在内的优化信息。目前只支持SQLITE3,MySQL,PostgreSQL三种Adapter。在Development环境下,config/environments/development.rb增加了个新选项config.active_record.auto_explain_threshold_in_seconds,默认值0.5,意思是当一条SQL语句运行时间超过0.5秒时将自动explain并且记入Log,这个新特性将帮助开发者留意那些效率极低的SQL语句。但是如果存在些不可避免的超过0.5秒的SQL语句,你不希望再看到Rails将它记入日志,将这句语句包含在

ActiveRecord::Base.silence_auto_explain do
  # no automatic EXPLAIN here
end

中,Rails将不会自动explain这其中的SQL。

4. Tagged Logging可以方便在多用户多IP访问应用的情况下观看Log。可以在config/environments/development.rb中增加config.log_tags选项,例如

config.log_tags = [:uuid, :remote_ip]

Log将记录例如

Started GET "/users/1" for 10.10.10.10 at 2012-04-07 22:15:35 +0800
[952ab51671f8d31f14069f6a372bb1f5] [10.10.10.10] Processing by UsersController#show as HTML
[952ab51671f8d31f14069f6a372bb1f5] [10.10.10.10]   Parameters: {"id"=>"1"}
[952ab51671f8d31f14069f6a372bb1f5] [10.10.10.10]   User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", "1"]]
[952ab51671f8d31f14069f6a372bb1f5] [10.10.10.10]   Rendered users/show.html.erb within layouts/application (13.1ms)
[952ab51671f8d31f14069f6a372bb1f5] [10.10.10.10] Completed 200 OK in 288ms (Views: 139.8ms | ActiveRecord: 7.6ms)
[d1a1f1ebb6c56d0fc3f09d592ad4c36c] [10.10.10.10]

这样的信息,可以看到,每行之前都有一个UUID和请求的IP地址。其中UUID是Rails根据HTTP Request生成的独一无二的ID。通过这个功能,我们能够把Log中相同的HTTP Request和相同的请求IP地址取分开来。

5. ~/.railsrc现在可以直接写入rails new命令的默认参数。如果你像我一样,习惯创建没有Test Case,不自动运行bundle install命令的Rails项目,你可以运行

echo -T --skip-bundle > ~/.railsrc

这样以后-T --skip-bundle将作为rails new命令的默认参数。

6. rails命令现在接受d命令,等同于destroy命令,方便像我这样的newbie理解。之前我也确实困惑过,为什么generate可以缩写为g,而destroy命令不能缩写为d呢?现在这样就好多了。

7. rails generate的 model / migration / scaffold 命令生成Model属性的时候可以这样写

rails g scaffold Post title:string:index subtitle author:uniq 'price:decimal{7,2}'

可以看到,原来每个属性只能写两列,而现在可以只写一列或是三列。一列表示默认类型是String,三列中第三列可以使用的modifier有index,表示本列添加index;uniq,表示本列添加unique index。如果类型是数值型,还可以加上{x,y}这样的格式表示数据库中数值的精度和小数的精度(留意price:decimal{7,2}左右的引号,shell中{}有特殊含义,因此可以用引号来保持原意)。

8. rails generate plugin命令被移除,请使用rails plugin new替代。

9. 移除config.paths.app.controller,请使用config.paths['app/controller']替代。

10. Rails::Plugin类过时,并将在Rails 4.0中被彻底移除。

11. 如果你在ApplicationController中指定了layout,同时使用了:only或:expect过滤。那么如果过滤条件失败,Rails现在将使用默认的layout。

12. ActionController::TestCase现在支持用cookies直接修改或清除cookie。而在此之前则不得不使用HTTP_COOKIE或CookieJar这样的方法。

13. send_file方法现在可以猜测MIME类型,如果:type没有提供的话。

14. MIME添加了包括PDF和ZIP在内的几种类型

15. 当Controller的父类显式指定过layout的情况下,子类不再按照约定的方法查询layout。

class ApplicationController
  layout "application"
end
 
class PostsController < ApplicationController
end

比如上述例子,PostsController将不会试图去寻找一个posts的layout。如果你想恢复原来的功能,删除ApplicationController中的layout语句或是显式指定PostsController的layout为nil。

16. ActionController::UnknownAction过时,请用AbstractController::ActionNotFound替代。

17. ActionController::DoubleRenderError过时,请用AbstractController::DoubleRenderError替代。

18. ActionController#rescue_action,ActionController#initialize_template_class和ActionController#assign_shortcuts过时。

19. ActionView::Helpers::FormBuilder支持button_tag方法,默认行为等同于submit_tag

<%= form_for @post do |f| %>
  <%= f.button %>
<% end %>

20. Date helpers支持:use_two_digit_numbers选项,设置为true表示日期的月和日都有两个数字构成,如果小于零则之前补零。

21. form_for方法支持:namespace选项,作为form的id的前缀,确保form的id的唯一性。

22. 限制select_year方法生成的year条目的最大数量为1000,可以通过:max_years_allowed选项设置上限。

23. content_tag_for和div_for方法支持直接传入ActiveRecord对象的集合。例如

@items.each do |item|
  content_tag_for(:li, item) do
     Title: <%= item.title %>
  end
end

现在可以被写为

content_tag_for(:li, @items) do |item|
  Title: <%= item.title %>
end

24. 由timestamps创建的created_at和updated_at字段现在默认为not null。

25. 可以使用ActiveRecord::Base.store功能添加ActiveRecord的Key-Value存储器,例如

class User < ActiveRecord::Base
  store :settings, accessors: [ :color, :homepage ]
end
 
u = User.create(color: 'black', homepage: '37signals.com')
u.color                          # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor

如果要让上述代码能够成功运行,必须确保users表有settings字段,类型为text。运行

u = User.create(color: 'black', homepage: '37signals.com')

时,将color和homepage的属性以json的形式存储在users表的settings字段中。注意,如果User自身也有color或homepage字段,这些字段将不被使用。我们可以通过u.color或是u.settings[:color]的方法访问被存储的color字段。试图给settings添加没有被accessors指定的属性也是可以的,唯一的区别就是,将不会在ActiveRecord的实例下添加这个属性的getter和setter。所以上述代码中的u.settings[:country] = 'Denmark'可以正常运行,u.settings[:country]也确实可以取到被存储的值,并且这个值确实在数据库中被持久化。但是不能使用u.country来访问这个值。

26. ActiveRecord::Relation添加pluck,传入这个ActiveRecord的一个字段,将返回包含所有Relation中存储的Record的这个字段的值的数组。

> User.where('id <= 3').pluck(:name)
=> ["bachue", "deltamaster", "anne"]

27. ActiveRecord::Relation添加uniq方法,请看示例

> Client.select('DISTINCT name')
=> [#<User name: "bachue">, #<User name: "bachue">, #<User name: "bachue">]
> User.select(:name).uniq
=> [#<User name: "bachue">]
> User.select(:name).uniq.uniq(false)
=> [#<User name: "bachue">, #<User name: "bachue">, #<User name: "bachue">]

28. :class_name选项现在可以传入Symbol,之前传入Symbol会出错,只能传入类名的字符串。//也曾让我这个newbie confusing了好一阵。

29. 在Development环境下,db:drop命令现在也会drop掉test数据库,和db:create会创建test数据库相对应。

30. 大小写不敏感的uniqueness检查时,如果MySQL的column中已经使用了大小写不敏感的校验,那么Adapter将不会再调用MySQL的LOWER函数来进行这个检查。

31. ActiveRecord::Relation新增first_or_create,first_or_create!和first_or_initialize方法,当Relation没有找到搜索结果时,将创建同时包含Relation的参数和first_or_create的参数的记录,例如

> User.create name: 'bachue', age: 22
=> #<User id: 1, name: "bachue", age: 22>
> User.where(name: 'bachue').first_or_create!(age: 16)
=> #<User id: 1, name: "bachue", age: 22>
# No new record is created
> User.count
=> 1
> User.where(name: 'anne').first_or_create!(age: 16)
=> #<User id: 2, name: "anne", age: 16>
# New record is created
> User.count
=> 2

32. 在Development环境下,config/environments/development.rb增加了新语句

config.active_record.mass_assignment_sanitizer = :strict

功能是当违反mass assignment protection的时候,Rails将抛出ActiveModel::MassAssignmentSecurity::Error异常来阻止这一赋值,而此前仅仅是给出一个warning而并不阻止。

//感觉可以考虑把这句话移到全局的配置文件,阻止Production环境上有人试图用mass assignment攻击系统。

33.  现在将不会自动关闭Thread的数据库连接,例如

Thread.new { Post.find(1) }.join

你现在要在Thread闭包结束时显式关闭连接,例如

Thread.new {
  Post.find(1)
  Post.connection.close
}.join

如果之前你在项目中使用线程的话现在要注意了 //不知道什么情况!Release notes中就这么写的,为啥要修改成这样啊!此前几乎从没有关注过Rails的数据库连接机制好不好!

34. set_table_name,set_inheritance_column,set_sequence_name,set_primary_key,set_locking_column方法过时了,使用setter替代。例如以前写的

class Project < ActiveRecord::Base
  set_table_name "project"
end

现在将被写成

class Project < ActiveRecord::Base
  self.table_name = "project"
end

这种方法的好处在于,你可以使self.table_name变成方法,例如

class Post < ActiveRecord::Base
  def self.table_name
    "special_" + super
  end
end
 
Post.table_name # => "special_posts"

//大爱ruby的local variable和method可以相互替换的特点。也由此可见在ruby中写set_xxxx是没有前途的。

35. ActiveModel::AttributeMethods的define_attr_method方法过时,这方法本来就是用于支持类似于set_table_name方法的,但现在它们都过时了。

36. 新增ActiveSupport:TaggedLogging类,用来包装任何标准的Logger类以提供tagging功能,请看示例

Logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
 
Logger.tagged("BCX") { Logger.info "Stuff" }
# Logs "[BCX] Stuff"
 
Logger.tagged("BCX", "Jason") { Logger.info "Stuff" }
# Logs "[BCX] [Jason] Stuff"
 
Logger.tagged("BCX") { Logger.tagged("Jason") { Logger.info "Stuff" } }
# Logs "[BCX] [Jason] Stuff"

37. 在Date,Time和DateTime类中的beginning_of_week方法现在可以接受一个参数,代表一周的哪一天属于一周的第一天,请看示例

> Date.today.beginning_of_week :monday
=> Mon, 02 Apr 2012 
> Date.today.beginning_of_week :sunday
=> Sun, 08 Apr 2012 
> Date.today.beginning_of_week :saturday
=> Sat, 07 Apr 2012 
> Date.today.beginning_of_week :wednesday
=> Wed, 04 Apr 2012

38.  String类添加safe_constantize方法,用以将字符串转换成同名的Class对象。和constantize方法的区别在于如果无法找到这个Class对象,将返回nil而不是抛掷异常。例如

> 'User'.safe_constantize
=> User(id: integer, name: string, age: integer, created_at: datetime, updated_at: datetime) 
> 'User1'.safe_constantize
=> nil 
> 'User'.constantize
=> User(id: integer, name: string, age: integer, created_at: datetime, updated_at: datetime) 
> 'User1'.constantize
NameError: uninitialized constant User1

39.  增加Array#prepend方法,alias Array#unshift。增加Array#append方法,alias Array#<<。//之前想找给Array push元素的方法,除了<<就找不到了,现在好了。

40.  Time新增all_day,all_week,all_quarter,all_year方法可以生成相应的Range对象,例如:

> Time.now.all_week
=> 2012-04-02 00:00:00 +0800..2012-04-08 23:59:59 +0800

//但是前面才刚提到关于week添加一个选项设定一周的那一天是这周的第一天,这里却又看不到了。

41. 新增ActiveSupport::Cache::NullStore用于Development环境和Testing环境。

42. 移除ActiveSupport::SecureRandom,请使用标准库中的SecureRandom替代。

43. ActiveSupport::Base64过时,请使用::Base64替代。

44. ActiveSupport::Memoizable过时,请使用Ruby的memoization pattern替代。

45. Module#synchronize过时,没有替代方案,请使用ruby标准库的monitor。

46. ActiveSupport::MessageEncryptor#encrypt和ActiveSupport::MessageEncryptor#decrypt方法过时。

47. ActiveSupport::BufferedLogger#silence,如果你不想记录当前语句块的Log,请修改它的Log Level。

48. ActiveSupport::BufferedLogger给你的Log自动创建目录的行为过时,请自行创建。

49. ActiveSupport::BufferedLogger#auto_flushing过时,请像这样设定日志文件的sync level。或是优化你的文件系统。FS cache现在控制着flushing。

f = File.open('foo.log', 'w')
f.sync = true
ActiveSupport::BufferedLogger.new f

50. ActiveSupport::BufferedLogger#flush过时,请设定文件句柄的sync,或是优化你的文件系统。

在KDE下用GVim,一直有个很怪的问题,就是最大化几乎是无效的,最大化之后可以看到右边和下边都各有一条细缝。有人说可能是GVim规定要整数的行和列,也有人说是GVim和KWin都想管理窗口,然后冲突了。

有一种比较简单的解决方法,右击GVim标题,选择Advanced,选择Fullscreen即可。

设置后效果如图所示:

这种方法效果总体较好,但是却有个很严重的缺陷。ALT+TAB看不到窗口切换的效果,这在窗口切换时是很不方便的。

这是Gvim官方的Wiki中的教程:http://vim.wikia.com/wiki/Automatically_maximizing_gvim_in_KDE

设置界面:

按照这个做法的话,也有个很大的问题,就是如果用GVim打开一个其他窗口,比如查找和替换,那个就会变成这样:

显然对GVim主窗口的设置影响到了对话框。

经过多次研究,后来发现一种办法,可以完美解决这个问题而没有这样那样的副作用。首先,和Wiki中一样,进入KWin设置界面。

选择Detach Window Properties按钮,在GVim主窗口任意位置点击一下。

看到如下界面,选择Use whole window class(specific window)。

保持Window Extra中只有Normal Window一项被选中。

这里还是和Wiki中一样的设置方法,在我电脑上,GVim大小为1280x775。

设置后效果如下,可以看到,已经最大化了。

搜索对话框还是和原来一样大小。

下面说下如何修改和删除已经设置过的KWin的规则,之前以为KWin的规则都保存在~/.kde/share/config/kwinrulesrc中,只要编辑这个文件就可以修改KWin的规则,其实是不对的,因为设置完之后再次启动GVim的话,~/.kde/share/config/kwinrulesrc会回滚到原来的设置,不知道这是什么情况。如果要修改或删除已经设置过的KWin的规则,可以启动Window Rules,启动方法如图:

在这个框口中编辑即可,编辑完后不要忘记点击Apply按钮,否则编辑还是无效的。

我们夏季学期的作业,JavaEE的项目正在进行。在我的反复诱导下,Deltamaster 同学终于动用了AOP,不过很快就出了问题。他用AOP对所有Action类的execute方法进行增强(“advice”),但问题是,增强之后,View中的错误信息就无法输出了。

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<s:property value="errorMessage" />

由于AOP是我怂恿的,所以问题还是要由我来解决。Deltamaster如果有什么问题,那我肯定不会先去Google,因为我用Google就是他教的。所以首先,我仔细对比了启用AOP与不启用AOP两种情况下Action的表现,发现完全一致,确定Action没有问题。

由于AOP中我们用的是级别最高的around,有拦截并修改函数返回值的能力。我多次测试了around函数中proceed()函数的返回值在函数中各个点的位置,也没有发现问题。也就是说,around本身的代码也没有错误,但不排除是SpringFramework AOP的Bug使得Controller无法获取到action的返回值。不过,我暂时不会往Bug这块地方想。

如果Controller确实没有获取到action的返回值,也就是,jsp文件没有被调用。我随后在jsp后面加了一句输出语句,然后运行。输出成功了!这就表示该jsp文件确实被调用了,同时也证明了Controller确实获取到了action的返回值,前面AOP有Bug的推论不成立。总之从action到view,中间所有过程均正常。

那么就是errorMessage没有被获得了,在jsp中写errorMessage,实质将调用action类的getErrorMessage方法,我在这个方法中加了句输出语句。测试时这句话并没有输出,也就是说,getErrorMessage没有被调用。但为什么不被调用呢?我在action类中自己写了点get方法,测试发现都没有输出。(此处省略1000+字,关于我是如何验证是否是AOP的Bug造成getErrorMessage失效,以及是否是传回对象的类型无法匹配等等各种怀疑)最后,索性直接写

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<s:property value="class" />

输出了,而且发现是个proxy类,我随即将class改成了class.superclass.name,也就是输出本类的父类的名字,结果是,java.lang.reflect.Proxy,原因终于被发现了,作为一个Java的动态代理类,怎么可能有getErrorMessage方法。我们知道,SpringFramework AOP实现的核心方法是Java动态代理(基于接口的代理)或CGLIB(基于类的代理),这里似乎用的是前者。Proxy类对象代替Action类调用了View,结果当View要求调用者的getErrorMessage方法时,Proxy类没有这样的方法,所以导致出错!

随后我仔细查看了Proxy类的文档,全是类方法,没有任何能获得被代理对象的实例方法。无奈下,直接Google了,很快就找到了解答,很幸运,是中文解答:http://jeooo-li.iteye.com/blog/436931。“只要在Spring的配置文件applicationContext中的<aop:aspectj-autoproxy/>改为<aop:aspectj-autoproxy proxy-target-class="true"/>就可以了。”,经过测试,这个解答是正确的,问题解决。

经过初步测试,发现proxy-target-class="true" 一旦加上后,SpringFramework AOP将使用CGLIB方法而不是动态代理,生成Action类的子类,这样即可以满足AOP增强处理的要求,又完美继承了Action类的所有方法,因此才能解决问题。

最近一直折腾Debian啊,KDE已经玩的很熟练了,LXDE碰到点麻烦,startlxde命令执行后什么事情都没发生啊,不知道如何解决。只能盘算着先用用Debian的Live版本。

今天想开启VMware Player的,没想到VMware Player开不出来了,从错误信息中,得知编译出现错误。我的Fedora的内核不知道什么时候升级到2.6.40了。2.6.40其实就是3.0改个名字而已,怀疑大约是代码发生改动,使得VMware Player编译出错了。因此迅速Google,在 http://osicarg.wordpress.com/2011/07/15/here-is-patch-for-vmware-player-3-1-4-build-385536-on-linux-2-6-39-2-amd64-kernel/ 中找到了解决方案,不过这个解决方案写得并不是很清楚。因此我额外说明下。

下载 这个 tar.bz2 包

解压,然后将其中的五个tar文件(vmblock.tar vmci.tar vmmon.tar vmnet.tar vsock.tar)放入 /usr/lib/vmware/modules/source,覆盖原文件,即可。

然后再用root用户开启VMware Player,即可编译成功。

之所以写这么简单的文章,只是因为希望中文文章至少能有一个Google搜索结果而已,虽然英文搜索结果相当多,但希望帮助到英文不好的Fedora/Linux用户,同时也帮助提升简体中文文章的质量。

114域名纠错大家应该都见过,也都该知道这是什么东西。这个东西真的神出鬼没,有时候现在114,过几分钟就不114了,有时候一个浏览器114,换个浏览器又不114了,还视家庭状况而定,在我家,114似乎格外变态,我已经开启了SSH,照样114,让我苦恼了好久。不过最近终于找到了个办法来对付它。

(这张图是网上搜的)

Google Chrome有一个负责通信的后台,地址是 chrome://net-internals/ ,通过它可以查看Chrome的一些与网络相关的信息。进入DNS标签页面,也可以用 chrome://net-internals/#dns 来进入

点击“Clear host cache”按钮,清除之。然后去访问一个会触发114域名纠错的地址,比如我今天访问的 http://www.ikde.org/,然后进入114地址纠错界面。返回 chrome://net-internals/#dns,可以看见大量DNS解析后的IP地址被刷出。(由于被解析出的IP地址很多,其中甚至还有Google的地址)请仔细挑选其中那些与114相关的IP地址,可以记录下来。由于那些地址可能非常杂乱并有一些重复,你可以使用

sort -n | uniq

命令去重复。然后前往自己使用的路由器的地址,比如 192.168.1.1,你可能需要密码才能进入。进入路由器的设定页面后,找到防火墙,这里各家用的路由器不一样,操作也都不一样。

点击添加,进入添加页面

通讯协议选择“TCP”,来源地址选择“SINGLE”,输入要屏蔽的IP地址,启用即可。各家的路由器操作可能都不相同,我这个路由器不是很好,操作很不人性化,地址要一个一个添加,不能批量添加,速度也很慢。

全部完成后,退出即可。此时再尝试那个会触发114域名纠错的地址,应该就可以直接打开了,如果不行,刷新几次试试。如果再不行,大概就是真的被屏蔽了。

本文记录如何使用RVM,而不是Yum和APT,安装最新版本Ruby on Rails。之所以不用Yum和APT,是因为Fedora的Yum源,Debian的deb源都没有Ruby 1.9.2。

首先,浏览:https://rvm.beginrescueend.com/ 获取Quich install内的安装RVM的方法,这个安装方法可能随着时间的推移而改变,目前安装方法是:

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

在运行安装命令之前,请确定务必满足这三个要求:

bash >= 3.2 is required
curl is required
git is required (>= 1.7 recommended)

如果没有满足,可以运行:

yum install -y bash curl git

你还需要安装这些以满足Ruby on Rails的要求,如果不安装,编译后的rubygems可能会有问题。

yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel
apt-get install build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev

运行并确保这句语句存在于.bashrc和.bash_profile的最后

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

确保这个语句存在于.rvmrc的最后

export rvm_pretty_print_flag=1

用RVM安装Ruby最新版本(1.9.2)(如果遭遇网络问题请自行解决)

rvm install 1.9.2

查看RVM目前管理的所有的Ruby版本

rvm list

命令RVM使用Ruby的最新版本(ruby-1.9.2-p290)

rvm use ruby-1.9.2-p290

完成后,检查version

ruby -v

如果能显示出版本,表示ruby安装已经成功,下面开始准备安装rails,我们将使用rubygems来安装

首先,创建一个gemset

rvm --create use 1.9.2@rails3

默认使得这个gemset

rvm --default use 1.9.2@rails3

下面安装rails,建议先升级gem,可能可以避免一些错误出现

gem update --system
gem update
gem install rails

安装完成后,检查version

rails -v

如果能显示出版本,表示rails已经安装成功,赶紧创建一个项目,体现了Ruby on Rails的快感吧!

本文根据 http://www.wretch.cc/blog/yschu7/13353264 整理并精简部分不必要的内容

如果是Ubuntu / Debian 用户,还可以阅读 http://coding.smashingmagazine.com/2011/06/21/set-up-an-ubuntu-local-development-machine-for-ruby-on-rails/,写得比我更详细些。

 

上次Gnome 3悲剧了一回,我感觉如果再继续使用Gnome 3可能会发生点什么严重后果,所以改行用用KDE,仅仅是玩玩,发行版本仍然是Fedora不变。KDE并不是我熟悉的桌面环境,安装的时候遇到一点问题,分享下,如果大家装的时候也发生类似的问题,也许可以Google到本文。

1. 从官网上下载安装的Libreoffice 3.4.1没有KDE样式。

这不是libobasis3.4-kde-integration没有正确安装的问题,而仅仅是libreoffice目录下的/ure/lib/libstdc++.so.6 这个文件有点问题而已,从 /usr/lib/libstdc++.so.6 复制一个覆盖掉即可。

2. 在例如于Chrome,Eclipse这样的非QT的GTK软件里Fcitx输入法无法激活,不能输入中文

这个Google的我好辛苦,后来终于查到,只要

su -c 'yum install gtk2-immodule-xim'

即可。感谢 http://www.linux-ren.org/modules/flyspray/index.php?do=details&task_id=253 的帖子

3. 在Kopete中使用Business帐号登录GTalk

在Modify Account中,Connection选项卡,勾上Override default server information,然后在Server文本框中填写 talk.google.com,即可。

目前还有一个问题就是此前用的“坚果铺子”软件在KDE下几乎不能安装,因为依赖了nautilus的库文件。目前在等待他们的回复。

 

 

 

少有的一篇与Linux无关的文章啊。话说我们已经进入了夏季学期,要求使用 Struts 2 + Spring + Hibernate 完成一个Web应用程序。我现在在积极学习中。配置Struts 2绝对是一件看RP的事情,配置反复出现问题。最早出现的错误就是 404 ,网页没找到。后来我不知道做了什么事,就解决了。。而现在的HTTP Status 404 - No result defined for action XxxAction and result yyy错误,就比较经典了。连老师看了半天,也丝毫没有解决办法。Google也毫无结果。不过后来倒是给了我启发。

我发现BuildPath里同样的包我其实加了两遍,WebContent/WEB-INF/lib里放入指定的jar包后,事实上就已经被添加进Eclipse了。我开始时没有发现,再添加了一遍,这样就添加了两遍。

后来将这些额外添加的包去掉,问题解决。

感觉Gnome 3 还是很不成熟的,很多以前可以用图形化程序解决的问题现在反而没有了,大概等到发布3.2版本的时候会改进吧。无论如何,我用的是Fedora而不是CentOS发行版本。

Fedora 15下笔记本电脑合盖后总是会休眠,不合我习惯,我一般只要黑屏+锁屏就可以了,找了没有找到图形化的修改方法,gconf-editor中似乎也找不到,Google后得知,可以用这条命令来修改

供电状态下:

gsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action "<setting>"

<setting> ::= nothing|blank|suspend|hibernate|shutdown

电池状态下:

gsettings set org.gnome.settings-daemon.plugins.power lid-close-battery-action "<setting>"

<setting> ::= nothing|blank|suspend|hibernate|shutdown

就可以了。

不过似乎不能锁屏,System Settings -> Screen 中已经设置过了,没起作用。gsettings我也不熟悉,不知道有没有更好的解决方案。

参考文献: fedora.rasmil.dk/blog/?p=208

我现在在Fedora 15下写这篇短文。

Fedora 15目前安装后的Netbeans 7.0有严重Bug,主要表现在Menu下,有这样几个症状。鼠标hold在一个item上,实际选择的是上一个item。有时鼠标单击无法打开menu,需要按住鼠标才能打开,有时干脆打不开,等一系列奇怪症状。怀疑是Java GUI库和Gnome 3之间存在兼容问题。

解决方案很简单

su -c 'vi /usr/local/netbeans/etc/netbeans.conf'

打开这个文件,在netbeans_default_options中可以搜索到 -J-Dapple.laf.useScreenMenuBar=true 这项,将他修改为false即可。

目前是这么解决的,我还要继续试用下Fedora 15的Netbeans,可能还有更多Bug隐藏着。

很高兴Netbeans 7.0修改了很多我已知的存在于老版本的Bug。

另外,官网上下载的Eclipse 3.6.2 在Fedora 15下打开即崩溃。但是通过Yum安装的Eclipse是正常的。

崩溃的解决方案是这样的:

在eclipse.ini下增加如下两行即可

-Dorg.eclipse.swt.browser.UseWebKitGTK=true
-Dorg.eclipse.swt.browser.XULRunnerPath==/usr/lib/xulrunner-2.0/

Gnome 3的搜索框和消息提示框目前用ibus输入中文连候选词也没有,也不清楚原因及如何解决。

久闻LaTeX大名,由于Linux下常用的LibreOffice实在太过于糟糕,与Microsoft Office差距太大,并且LibreOffice已经是Linux下最好的Office套件了,使用LaTeX来替代LibreOffice恐怕是一种无奈的选择。

但是我从来没有用过LaTeX,连类似的排版工具也从未用过,可以说丝毫没有经验。不过我还是决定试着学习下LaTeX,首先当然是从配置环境开始,我不熟悉LaTeX和类似软件使用的文件格式,可以说,我只认识PDF格式,所以在配置的时候也是奔着PDF而去。网上的LaTeX配置的文章多如牛毛,但是方法竟然都不一样,有简单的,有繁琐的。英文LaTeX环境很容易就可以搞定,但是中文却没有这么简单。我尝试了几个比较简单的方法,全都不可行。复杂的方法,或是说步骤超过5步的,或是要修改配置文件的方法,我全都不尝试,因为一看这种方法就感到头疼。下载TexLive2010也许比较适合我,但是他的大小实在太恐怖,2GB,不知道为什么会这么大,这个大小恐怕已经超过Microsoft Office了。下载的速度超慢,初步算算大约下载2天,不考虑。

后来发现,其实最简单的方法就是使用XeLaTeX,两个好处:

第一,无须配置,安装后即可使用。

第二,支持中文。

第三,直接将文件转为PDF。

安装只需要三个包

sudo apt-get install texlive-xetex latex-cjk-xcjk texlive-latex-recommended

不过依赖包相当多,apt大约下载半多个小时才能安装。这期间无须任何干涉。

安装完之后,可以先写一个简单的测试文件,当然,要带中文

%% example.tex
\documentclass{article}
\usepackage{xeCJK}  %必须加xeCJK包
\setCJKmainfont{WenQuanYi Micro Hei}  %换成本地字体
\begin{document}
chm文件全名是Microsoft Compiled HTML Help,看名字也猜得出是微软的格式,Windows操作系统自带它的阅读器,chm普遍用于帮助文件和电子书,但在国内,他的应用范围更广,几乎很多在线文档本地化后都采用这个格式。一般做技术的不可能不接触它,但是一般Linux发行版本不自带chm的阅读器,只能安装软件,chmsee就是我所用过最好的chm阅读器了,他还是一款国产软件,我猜之所以看不到比他更好地国外软件,也许是因为中国人更有需求吧。

项目地址:http://code.google.com/p/chmsee/

但是Fedora 14的chmsee包有点奇怪,只有1.1.0版本,没有最新的1.3.0版本。1.1.0的Bug很厉害,影响了正常使用,最新版本则修复了这些Bug。但是Fedora 14没有chmsee最新版本,我在网上也没有搜索到适合Fedora的RPM包,惟一的OpenSUSE的RPM包使用yum localinstall安装仍有不能解决的依赖关系,这使得我们不得不用源码来编译安装了。

我看到项目网站上解释他没有发布二进制安装文件的原因是“Linux 的发行版太多了,还是只发布源码比较省事”,我不否认这种说法的正确性,但也不能否认源码编译安装对我这种Linux菜鸟而言确实非常困难。主要原因当然是缺乏库文件,而且一旦缺乏,我往往不知道该下载哪个包来解决,如果出现RPM包常见的依赖性地狱,更是让我绝望,所以,除非确实找不到二进制包并且需求这个软件,否则我绝对不会去编译源代码。

我看到他的项目文件讲了依赖如下:
cmake >= 2.6.4
gtk2 >= 2.18
xulrunner >= 1.9
chmlib
libxml2
libgcrypt
intltool
幸运的是,Yum库中这些软件全都有,不幸的是,安装了后连cmake都通不过,还是有大量库文件缺乏。后来猜测他的库文件可能不是放在这些可执行的程序中,而是放在devel包中,因此尝试安装了他们的devel包,结果竟然成功了(后来发现项目文件中说的很清楚:Before compiling, you need to check following libraries or their development packages already installed on your system.可惜我一开始没有注意),只要cmake一通过,就不会再有依赖性问题了,安装非常成功。下面复述下正确的依赖。
 
cmake
gtk2-devel
xulrunner-devel
chmlib-devel
libxml2-devel
libgcrypt-devel
intltool
版本方面不用担心,Yum库中的软件都符合要求。
\end{document}

这里把文件命名为example.tex。

可以看到,里面动用了一个中文字体——文泉驿微米黑,这是我最喜欢的字体,也是电脑里唯一一个中文字体,你可以修改这个字体来使用你自己喜欢的字体。你可以用

fc-list :lang=zh-cn

来输出你电脑上所有中文字体。

编译example.tex非常简单,只需要使用

xelatex example.tex

即可获得example.pdf文件,打开即可见到效果。

本人对LaTeX一窍不通,如果你说这样配置出的LaTeX环境会有什么什么缺陷我无法应答,不过我认为这也不要紧。只要有一个简单的工作环境,用它稍微学习下LaTeX,让菜鸟们稍微有一点LaTeX的感觉,和高手们有点共同语言,此时再重新用更好的方法配置LaTeX,才是最人性化的做法。如果一开始就使用那种无法理解的方法配置,想提问又被高手们鄙视,还没开始学习就有了不愉快的感觉,这种做法不利于以后的发展。

另外,求一个LaTeX IDE,简单点就可以了。不太想记很多LaTeX语法。

 

发现一个TexLive 2010在国内的下载点 厦门大学开源软件镜像,下载速度很快。如果有TexLive 2010的光盘,那么参考 www.cnblogs.com/hello_seven/archive/2011/02/15/1955598.html 即可非常容易的配置出更完善的LaTeX环境。

修改Empathy新消息提示音

2011年5月12日 15:17

话说Empathy这个声音真的是轻啊,简直和没有差不多,@ghosTM55 发过来的Gtalk,我就坐在电脑前写代码居然没听到。。平时也就算了,万一有个重要事情没听到后果就严重了。因此,我决心要修改Empathy的提示音。Empathy的提示音在哪里修改还真的是没找到,Google后得知,Empathy所有声音都是属于sound-theme-freedesktop这个RPM包的,查询即知,声音都在/usr/share/sounds/freedesktop/stereo下,进入后发现全是oga格式的声音,这个格式对我来说是蛮新鲜的。不知道Linux下如何将通用的MP3格式的声音转化为oga格式,Google后知道Linux有个著名的软件叫gnac,可以做声音格式转换,支持m4a,flac,oga,mp3,wav,spx等格式,官方网站 gnac.sourceforge.net/,介绍 www.lupaworld.com/article-210899-1.html(我承认这是在做广告,自由软件,做个广告什么的不非法吧)。下载源码后编译安装(依赖包我已经不记得了,但确实没有什么神奇的,官网的编译说明已经很详细了,反复使用./configure --prefix=/usr命令然后按要求安装依赖包即可,如果遇到了找不到的包就Google),然后即可运行。到这里一切都很简单,然后就发现问题了,格式转换的时候gnac提示需要一个叫做gstreamer element audioconvert的插件,gnac可以自行查询安装这个插件,但是结果失败,也就是说,这个插件可能不存在于Yum中。我Google了一下,猜测这个插件可能在gstreamer-plugins-ugly里,这个包Fedora的官方Yum中没有,我掏出珍藏的RpmFusion包安装:

su -c "rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm"
su -c "rpm -Uvh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm"

但是并没有解决问题,我把Fedora 14升了下级,依旧没有解决。不得以,干脆发邮件了,与开发者直接交流不是开源软件一直宣传的理念么,邮件地址:gnac-list@gnome.org,内容如下,额。本人英语超烂,勿嘲笑

i am a fedora 14 user, i need to convert some mp3 to oga, but gnac needs an additional plugin called gstreamer element audioconvert. gnac tried to search it by itself, but it is failed, and i alse dont know which rpm it need. so please help me, thank you.

一天后,回复

audioconvert is part of the gstreamer-plugins-base package. 

I've seen several people with fedora 14 complaining about audioconvert in relation to totem...but since it's a general dependency issue, I'll redirect you to the thread that supposedly solves the issue. You may just need to reinstall gs-plugins-base.

apologies to the devs for posting a thread about totem, but it seemed like the easiest thing. http://forums.fedoraforum.org/showthread.php?p=1429783

我立即访问了给出的网页,第一帖给出了一个方案
yum install gstreamer-ffmpeg gstreamer-plugins* -x *devel*

下了上百MB的安装文件,但依然没有解决,继续看那张网页,#2中有这样一句话,basically remove the ~/.gstreamer-x.x/registry*.*,于是立即运行了

rm ~/.gstreamer-0.10/registry*.*

然后运行gnac来格式转换,瞬间完成,替换/usr/share/sounds/freedesktop/stereo下的message-new-instant.oga,测试,成功!这样Empathy的提示音就被替换成功。

很高兴上星期天在本校举办的的Ubuntu 11.04 Release Party(详细可见:http://wowubuntu.com/shanghai-natty-party-review.html),我本人也算是组织者之一吧,Release Party前多次协助组织者uifiddle的工作。会中贡献了自己的电脑,不过没派上什么用场,演讲者一个个都自带笔记本电脑,由于台子小,全把电脑压在了我的电脑上,不仅被压,还被学校那该死的投影仪插,插到后来Ubuntu 11.04索性花屏了,重启到Fedora下才解决。

投影仪里这台电脑就是我的哦。

会场照片,知道哪个是我么?

会后收获很大。私吞一个Canonical官方出的Ubuntu的2G U盘,很漂亮,一个U盘集线器,一张Ubuntu 10.10 官方的光盘,N多纪念贴纸贴满整个寝室,蛮疯狂的说。还和SHLUG人一起吃汉堡王,认识了ghosTM55,LTN,雨蒼,Shell Xu等一系列牛人。

雨蒼不愧是台湾人(中华民国台湾地区),言语中都散发着中华民国人民特有的魅力,这种魅力在我们从小生活在中国大陆的人身上是从没有见过的,事实上上次的拥抱HTML5技术大会上就已经见识过另一个台湾人布丁(hlb)的演讲,幽默的话语,自由的气息,图文并茂的Slides,还有些对GFW的讽刺,已经构成了我对中华民国的主要印象。

 

 

为《Linux内核源码分析》期末考试准备的文章。本来想直接贴出来,但是感觉效果不理想,还是存放在PDF里罢。
 
下载

仅仅是期末考试之后的娱乐节目而已,我们都知道软盘和FAT文件系统已经淘汰N个世纪了。

首先,想必如今没有人家中还在使用软盘,大部分电脑也已经不再附带软驱了,我的本本就是。所以这里的软盘是虚拟出来的。

[bachue@localhost ~]$ dd if=/dev/zero of=floppy.img bs=1024 count=1440
1440+0 records in
1440+0 records out
1474560 bytes (1.5 MB) copied, 0.0217136 s, 67.9 MB/s
[bachue@localhost ~]$ mkfs.vfat floppy.img
mkfs.vfat 3.0.9 (31 Jan 2010)

用dd创建一个1440×1024字节,即1.44MB的虚拟磁盘,按照vfat文件系统进行格式化,就可以模拟出软盘了。

然后使用虚拟机,这里使用的是VMware Player,具有挂载虚拟软盘的功能,据我所知,另一个带有此功能的是微软的虚拟机VPC,而开源界用的较多的VirtualBox,我没有找到这个功能。

在虚拟机中挂载软盘。毫无疑问,使用Linux自己的挂载功能是完全可以的,但是使用Windows,更有实战的味道。(搞笑,谁这年头还会拿个软盘来让你恢复?)

挂载成功。

随便写点神马吧。。表太和谐就行。

文件写入完毕

假设现在出现误操作,删了文件

表痛哭流涕,回Linux修复去。

继续阅读

Fedora 14下编译安装chmsee 1.3.0

2011年2月26日 11:38

chm文件全名是Microsoft Compiled HTML Help,看名字也猜得出是微软的格式,Windows操作系统自带它的阅读器,chm普遍用于帮助文件和电子书,但在国内,他的应用范围更广,几乎很多在线文档本地化后都采用这个格式。一般做技术的不可能不接触它,但是一般Linux发行版本不自带chm的阅读器,只能安装软件,chmsee就是我所用过最好的chm阅读器了,他还是一款国产软件,我猜之所以看不到比他更好地国外软件,也许是因为中国人更有需求吧。

项目地址:http://code.google.com/p/chmsee/

但是Fedora 14的chmsee包有点奇怪,只有1.1.0版本,没有最新的1.3.0版本。1.1.0的Bug很厉害,影响了正常使用,最新版本则修复了这些Bug。但是Fedora 14没有chmsee最新版本,我在网上也没有搜索到适合Fedora的RPM包,惟一的OpenSUSE的RPM包使用yum localinstall安装仍有不能解决的依赖关系,这使得我们不得不用源码来编译安装了。

我看到项目网站上解释他没有发布二进制安装文件的原因是“Linux 的发行版太多了,还是只发布源码比较省事”,我不否认这种说法的正确性,但也不能否认源码编译安装对我这种Linux菜鸟而言确实非常困难。主要原因当然是缺乏库文件,而且一旦缺乏,我往往不知道该下载哪个包来解决,如果出现RPM包常见的依赖性地狱,更是让我绝望,所以,除非确实找不到二进制包并且需求这个软件,否则我绝对不会去编译源代码。

我看到他的项目文件讲了依赖如下:

cmake >= 2.6.4
gtk2 >= 2.18
xulrunner >= 1.9
chmlib
libxml2
libgcrypt
intltool
幸运的是,Yum库中这些软件全都有,不幸的是,安装了后连cmake都通不过,还是有大量库文件缺乏。后来猜测他的库文件可能不是放在这些可执行的程序中,而是放在devel包中,因此尝试安装了他们的devel包,结果竟然成功了(后来发现项目文件中说的很清楚:Before compiling, you need to check following libraries or their development packages already installed on your system.可惜我一开始没有注意),只要cmake一通过,就不会再有依赖性问题了,安装非常成功。下面复述下正确的依赖。
 
cmake
gtk2-devel
xulrunner-devel
chmlib-devel
libxml2-devel
libgcrypt-devel
intltool
版本方面不用担心,Yum库中的软件都符合要求。
 
软件截图:
 
 
可以看到中文乱码,这应该是1.3.0的一个Bug,chmsee采用内部默认的机制来识别编码,但有点问题,项目网站中已经有人提出,想必下一个版本即可修复。在此之前,可以手动修改文件编码为GB2312或是UTF-8,chmsee会缓存每一个曾经打开过的文件的编码设置。
chmsee的安装说明总体上还是很清楚的,至少按照他的说明来安装依赖后编译就不再出错,有些Linux软件就不是这样了,感觉依赖库根本没写全。我猜大概要好好学习下Linux下的编程才能清楚究竟该如何编译吧。如果大家有更好的技巧,请一定要告诉我,谢谢。

使用VirtualBox,一定是看中了他免费的特点(也许还号称开源,虽然我怀疑没有多少人会真的选择OSE版本,缺功能的),否则的话,这个虚拟机和VMware Workstation相比,根本不是一个级别的。VMware完全GUI操作,功能强大,使用方便,运行稳定。VirtualBox的功能就是他一个子集,而且还有大量命令行操作,使用非常不便,Bug也很多,幸亏核心功能还是比较稳定的。

但是在社会主义伟大精神的号召下,我还是想放弃盗版的VMware Workstation,毕竟一台Ubuntu电脑上装一盗版软件实在是不妥。虽然想,但是难度很大,由于学习方面的需求,我对虚拟机的功能要求是非常苛刻的,不仅效率要高,而且一定要有非常先进的母盘差分功能和文件传输功能。前者的意思是多个虚拟机共用一个硬盘文件,当一个虚拟机要向硬盘写入时,实现写时拷贝,就像Linux多个进程共享内存那样,有效的节约了硬盘资源。后者么就是虚拟机和实体机文件传输了。

问题是VirtualBox的这两个功能全都没有,或者说极其落后。Virtual PC和VMware很多年前就有母盘差分和文件拖拽传输,VMware更是实现了丰富的快照功能(快照也是一种简易的差分),而VirtualBox的文件传输必须依靠共享一个文件夹,极其不方便(有人说这样安全,VMware的文件拖拽是不安全的,但在我看来,病毒如果能突破虚拟机,要感染个共享文件夹岂不更加简单,没有人共享文件夹总是只读的吧),他也有快照功能,但是功能弱到绝不可能成为母盘差分的替代品。这也是我多年不使用VirtualBox的主要原因。

不过后来在一个很偶然的机会下,我读到了一篇英文文章(链接),这里面详细描述了VirtualBox的磁盘类型——immutable和writethrough,直到那个时候我才知道原来VirtualBox有很多命令行驱动的隐藏功能,这倒使我对VirtualBox的隐藏功能产生了兴趣,如果这些命令行功能中正好有我想要的,岂不善哉?为此我Google了大量文章,但是收获很少。但我曾经有一次实现了!不知道之前做了神马,最后我把vdi文件权限设为400后,他真的变成了母盘!所有基于他的虚拟机都可以同时开启并且互不影响的操作,但后来我发现,这是个很偶然的操作下诱发的Bug,我无法在另一台电脑上复制这个操作。尤其是VirtualBox进入4.0版本后,似乎还修复了这个Bug。VirtualBox 4.0还取消了存储选项中的一个叫Differencing Disk的选项,之前版本我其实也不知道这个选项究竟干吗用,现在索性还取消了。

我曾经还在Ubuntu中文论坛发过求助帖,但是无一人回帖,令我对这个论坛深感失望。

又是很偶然的,翻了Google排名较后的文件,发现了一篇BlogSpot的英文文章(链接),察看缓存,竟然发现正是我要的!这篇文章最大的特点就是没有用到Differencing Disk的选项,非常符合目前的情况。

创建好虚拟机之后,在VirtualBox Media Manager下选中即将成为母盘的VDI文件,右击Release。这样,既有的虚拟机将和这个VDI文件完全脱离关系。你也许能想出各种让VDI文件孤立的办法,但是请一定要使用上述方法,用其他方法几乎都会报错。

切到终端下(Linux系统的骄傲!VirtualBox是我见过唯一的在Linux平台下使用比在Windows平台下使用更加方便的多平台软件,方便就体现在这里),使用这样一个命令:

VBoxManage modifyhd <disk file>  --type immutable

把VDI文件转换为immutable文件,顺便把文件权限设为400吧,这样的VDI才是真正意义上的母盘。好,现在创建各种基于她的虚拟机吧!

其实之前的动作只是创建immutable盘的标准操作而已(什么是immutable盘?是指每次关闭虚拟机后,之前的所有操作全部回滚,再打开后就像一个从没被操作过的虚拟机一样),后面的才是重点。

图上的只是演示,我觉得在VirtualBox Media Manager下找到新虚拟 机的VDI文件(其实是基于母盘的快照)的路径更方便些,复制这个路径,使用以下命令:

VBoxManage modifyhd <differencing disk file> --autoreset false

把自动回滚取消,这样的immutable盘既实现了母盘差分,又不会在每次关闭后回滚,符合了我的要求。

真够麻烦的,其实Sun/Oracle要加个母盘差分功能很难吗?不可能。但他就是没有这么做,其中的原因么,不得而知了。不过随着进一步的深入研究,应该是能找到比这更方便的操作的。

至于文件传输,还是配个FTP吧,比她自带的共享文件夹功能还方便点。

后来发现:VMware Player也不错,同样也是免费产品,功能还行,非常稳定。与VMware Workstation相比,VMware Player仅仅失去了快照和母盘差分功能,与VirtualBox相比,VMware Player非常方便的文件拖拽功能,和其特色的Unity功能依然胜过他,如果不需求快照和母盘差分功能,还是考虑VMware Player吧,更好些!

刚刚电子邮件收到的,共享下,方便大家下载。粗看了下,感觉这个版本主要就是在强化InnoDB。

点击下载

介绍

MySQL是当今在用的最值得信赖的开源数据库平台。基于其卓越的跨平台、应用程序栈以及瞩目 的性能、可靠性和易用性,现今,许多比较流行的,访问流量大的网站都选择使用MySQL数据库。现在MySQL Oracle提供了一个完整的LAMP(Linux、Apache、MySQL、PHP、Perl、Python 等)框架,基于LAMP,任何规模和志向的用户或客户均可利用现有的最佳技术解决方案和支持构建自己的应用程序和产品。MySQL 5.5 提供了一组专用功能集,在当今现代化、多功能处理硬件和软件以及中间件构架涌现的环境中,极大地提高了MySQL的性能、可扩展性、可用性。

MySQL 5.5融合了MySQL数据库和InnoDB存储引擎的优点,能够提供高性能的数据管理解决方案,包括:

  • InnoDB作为默认的数据库存储引擎
  • 提升了Windows系统下的系统性能和可扩展性
  • 改善性能和可扩展性,全面利用各平台现代多核构架的计算能力
  • 提高实用性
  • 提高易管理性和效率
  • 提高可用性
  • 改善检测与诊断性能

本白皮书介绍性的讲解了MySQL 5.5和InnoDB的一些增强性能,这些增强性能极大地提高了系统和MySQL的性能。下面,我们将详细介绍每一个关键的增强性能及其实现过程。

关于本博客UI方面的一些思考

2010年12月26日 17:33

首先,很高兴Ubuntu新字体进入Google Font Directory(详细),Ubuntu这字体真的很漂亮,可以说是Ubuntu 10.10的最大亮点了。而这个字体进入Google Font Directory意味着我可以用云字体的方法使每一个进入本博客的观众都看到这个字体(还意味着可以从本博客中下载该字体),不管客户端本身是否真的装有这个字体。额..这字体在XP下好像有点糟糕,特别是没开ClearType的XP,全是锯齿。唉,这只能说XP本身的字体渲染太烂,我以前一度以为XP字体全是点阵字体呢,怎么看都感觉不像是TrueType!

我自认为本博客在非XP的PC上看起来还是不错的,符合我自己的审美观吧,但是在手机上却不是这么回事,我的手机是多普达S900,Windows Mobile 6.1操作系统,安装浏览器Opera Mini 5.1。

手机浏览本博客时存在两个严重的问题,第一,打开博客率先看到的是搜索框,分类等一点不重要的内容,而真正的主体部分却被挤到了下面(代码功能也有同样的问题,代码被行号挤到了下面)。这个问题不仅仅存在于手机,把PC的浏览器的宽度缩小到一定尺寸,也一样如此,有时候看上去右边一大块空白,还以为没有正常显示呢。事实上,很多博客都是这样,本博客并非特例,究其原因,是在写HTML的时候,边栏的DOM安排在前面并使用了float:left;导致。解决的方法很简单,把文章的DOM安排在前面,使用float:right;即可,或是干脆把边栏安排到右边去,这样浏览器宽度缩小时被挤下去的就是边栏了。很可惜,虽然知道解决方法却不能做这种修改,因为博客系统的HTML是定死的,不能改。当然,也可以考虑换个主题,有些主题的边栏是在右边的,不过我蛮喜欢现在这个主题,不想改。也可以考虑用Javascript来更换DOM的位置,但是我的Opera Mini几乎不支持Javascript,改了也没用。所以我干脆做了些小动作,上传了一个smallscreen.css的文件,记下他的路径,在博客的header里增加一个标签,这个标签能使得博客宽度在小于900px的时候使用smallscreen.css,反之则不使用(具体实现可见本博客HTML源码)。这个技巧是在看今年的Google IO大会时一个人在讲Dreamweaver对HTML5支持的时候学的,很有用,而且大部分浏览器支持,要想让网页对非PC平台做特别支持,用这招会非常imba。至于smallscreen.css的内容,其实就是把边栏隐藏了。额,我认为不太会有人在用手机浏览本博客的时候对搜索框和分类感兴趣吧。

另外一个严重的问题是,本博客的部分文章实在是太长了,比方说《HTML5设计原理》,用鼠标滚轮滚也可以滚好长时间,《从jQuery中剥离出$.ajax函数》,整整700行代码啊。在手机上,特别是在Opera Mini(没有滚动条)上看本博客的主页,简直是受罪,就为了瞥一眼下一篇文章的标题,不断的滚啊滚,茫茫多的字,根本看不到个尽头,嗯,用户确实可以考虑下是否该取消今天的晚餐了。把整篇文章不加限制的放在主页上,有方便之处,无需用户点击就能看完全文,但是如果文章实在太长,还是来点部分摘要吧。不过我看遍了博客系统的设置,也没能找到类似的设置。想通过smallscreen.css来解决吧,也想不到个好些的策略,没有CSS3,没有Javascript,没有滚动条,怎么才能缩减文章的长度呢,我也想不到了。

【转】HTML5设计原理

2010年12月18日 09:33

我是第一次不加修改的转发整篇文章,其实我也可以给个链接了事,或是按照我过去的性格,绝不不加修改的转发文章。但我今天还是转了,主要目的其实是告诫我自己,要充分重视“设计原理”,虽然我们什么事都讲“原理”,但是只有“设计原理”才能真正表现原作者的思想精髓,才是“原理”中的精华所在。写代码重视实践固然是好,但如果不摸透思想,所学习的一切技术终究只能是皮毛。

思想决定行为,行为决定习惯,习惯决定性格,性格决定命运。       ——这句话我很喜欢

HTML5设计原理 - Jeremy Keith在Fronteers 2010上的主题演讲

今天我想跟大家谈一谈HTML5的设计。主要分两个方面:一方面,当然了,就是HTML5。我可以站在这儿只讲HTML5,但我并不打算这样做,因为如果你想了解HTML5的话,你可以Google,可以看书,甚至可以看规范。
 
实际上,确实有人会谈到规范的内容。史蒂夫·福克纳(Steve Faulkner)会讲HTML5与可访问性。而保罗·艾里什(Paul Irish)则会讲HTML5提供的各种API。因此,我今天站在这里,不会光讲一讲HTML5就算完事了。
 
说老实话,在正式开始之前,我想先交待清楚我所说的HTML5到底是什么意思。这话听起来有点搞笑:这会子你一直在说HTML5,难道我们还不知道 什么是HTML5吗?大家知道,有一个规范,它的名字叫HTML5。我所说的HTML5,指的就是这个规范。但问题是,有些人所说的HTML5,指的不仅 仅是这个规范,还有别的意思。比如说,用HTML5来代指CSS3就是一种常见的叫法。我可不是这样的。我所说的HTML5,不包含CSS3,就是 HTML5。
 
类似的术语问题以前也有过。Ajax本来是一种含义明确的技术,但过了不久,它的含义就变成了“用JavaScript来做一切好玩的东西”。这就 是Ajax,对不对?今天,HTML5也面临同样的问题,它本来指的是一个特定的规范,但如今含义却成了“在Web上做一切好玩的事。”我说的不是这种 HTML5,不是这种涵盖了最近刚刚出现的各种新东东的HTML5。我说的仅仅是规范本身:HTML5。
 
刚才已经说了,我今天想要讲的内容不多,也没有打算介绍HTML5都包含什么。今天我要讲的是它的另一方面,即HTML5的设计。换句话说,我要讲的不是规范里都包含什么,而是规范里为什么会包含它们,以及在设计这个规范的时候,设计者们是怎么看待这些东西的。
 

继续阅读

从jQuery中剥离出$.ajax函数

2010年12月10日 20:41

作为开源社区的PHP框架的内置Ajax模块,我们需要一个功能超强大的Ajax函数,作为一个通用函数。Ajax模块是我负责的,这种函数如果真要我写,恐怕以我的能力是很难做到完美的,毕竟Ajax涉及的知识点非常散,还有大量HTTP协议的知识,我并不全懂,还有各种浏览器兼容问题的存在,防不胜防。就算花一个月去做,恐怕也只能做出个可能存在大量隐蔽BUG的作品。于是,我决定直接从开源产品中找,也就是jQuery的$.ajax函数。

我是个信奉极简约的人,不喜欢为了一个$.ajax就把整个jQuery文件全部包含进来,太大了,70多KB的文件,换成56K/bps的猫,全速也至少10秒(一般我不考虑什么gzip压缩,因为不想把它作为偷懒的理由,虽然号称压缩后只有24K),我不能接受这种速度,所以我就决定从中提取,把jQuery中的$.ajax和一些附属的函数剥离出来,单独形成一个ajax函数。

花了半天时间,非常顺利,jQuery源码并不难懂,至少一定比Linux Kernel源码好懂。不过首个版本没有提取所有功能。比方说Cache功能还没有,因为不了解Ajax的Cache究竟是个什么机制,全局Ajax事件没有,因为感觉意义不大,如果要,就必须剥离$.trigger,这个函数不是很小,剥离就可能导致最终文件变大,有点得不偿失。

可能存在Bug,请注意,当需要解析JSON时,本类中没有自带JSON解析函数,请务必提供JSON.parse()函数用于解码。

继续阅读

Google了很长时间,只知道Gwibber可以借用StatusNet和第三方API上推,但实际操作就发现,只能看推不能发推。至于如何解决这个问题,却说的不多。以至于不少人都在询问。其实Ubuntu中文论坛有个帖子说的很明白。地址:forum.ubuntu.com.cn/viewtopic.php?f=73&t=290640&p=2042552 ,按要求操作即可发推。

 

修改/usr/share/pyshared/gwibber/microblog/network.py

代码:
self.curl.setopt(pycurl.HTTPPOST, [(x, str(y)) for x,y in params.items()])

修改为

代码:
self.curl.setopt(pycurl.POSTFIELDS, urllib.urlencode(params))

已可以发推。gtap version: 0.4
http://code.google.com/p/gtap/issues/detail?id=80

 

由于使用的是StatusNet,协议不可能和Twitter的完全一致,不兼容似乎也正常。但是这么一改的话,我猜大约就不支持StatusNet自己了,仅仅是个猜测,我不懂Python。

Gwibber很不错,操作简单,使用便捷,而且还是系统自带,只是不支持Twitter的List功能,这点很遗憾。如果有的话,简直能和TweetDeck媲美了。

之前试着用PPA升级Gwibber至2.91,结果发现不知道为什么Gwibber不再支持Status了,只支持Twitter,Facebook和Identi.ca这三种服务了,赶紧删掉PPA重装。。

自由万岁,Twitter万岁!

Yum库配置简单方法

2010年12月04日 07:20

好久没写博客了,正如我之前所说,在考试。大学考试就是一堆理论考来考去,我不是一个善于高谈阔论的人,也不是一个擅长考试的人,考的很糟糕,可以说,学习越深入,我就越不擅长考试了。

最近用上了企鹅输入法fcitx 4.0,很棒的输入法,我自从使用Linux以来还没见过这么漂亮的Linux软件呢,只是他的词库不敢恭维,偶尔还会崩溃,但总比ibus强多了。
 
发现Linux上的Office最好的还是OpenOffice 3.2.1版本,虽然比起自带的OpenOffice 3.2只有0.0.1的提升,但是质量真的好很多,不太会死掉了,美观性也大幅增加。LibreOffice项目我当然是支持的,期待的,只是目前还在beta版本,稳定性和OpenOffice 3.2几乎没有差别,所以还没用。
 
Ubuntu Tweak是个很实用的Gnome配置软件,最近才发现。
 
Ubuntu的Gnome-panel版本太低,稳定性很糟糕,一直想升级,可惜不会。Gnome-panel几乎是Gnome桌面的操作系统中最不稳定的组件之一了,无论是在Ubuntu上,还是在Fedora上,都不稳定,GUI,作为一个系统的门面,这样不稳定真的很不好。
 
我们学校搞开源社区了,很高兴,开源的意义我从今年才开始深入认识,这么快也可以为之作贡献了。我们的首要任务是做个我们社区的门户网站,用PHP,在做这个网站之前,我们先做一个PHP框架,这个框架相当于社区的第一个产品,根据Deltamaster的分配,我的任务是Ajax模块,缓存模块和代码优化。
 
我年初帮助Deltamaster做过项目,但结果是以惨败告终的,非但没有做出贡献,反而还在添乱。事后我反思了很久,主要是急功冒进,对任务的认识不够深刻,对语言的思想掌握不够。后者现在已经没什么问题了,前者还在学习。一个程序员,操之过急地编码根本没有意义,画出几张UML图,统筹兼顾,和上面进一步明确任务和接口比这重要的多。
 
RHCE考试推迟到明年一月了,很好,这样时间充裕多了。
 
还有很多话想说,但是不能说了,本文的主题不得不开始了。
 
Yum库的配置网上很多,但在我看来,基本没说清楚,这就是撰文的目的。
 
配置Yum很简单,第一步,用户必须告诉Yum这个库的存在,因此必须在/etc/yum.repos.d中要么创建一个后缀名为repo的文件,要么在已有的repo文件上增加新Yum库的地址,具体写法完全可参考系统自带的文件的写法,以下是我实验库的文件内容:
 
[testyum]                                                   #yum库名字,必须唯一
name=Fedora Test Yum                           #yum库全名,不多解释
baseurl=file:///home/bachue/Downloads   #必须是一个文件夹的地址,可以是FTP,HTTP,当然也可以象我一样为本机地址
enabled=1                                                 #是否启用该库,为1为启用
metadata_expire=7d                                 #源数据过期时间,不多解释
gpgcheck=0                                              #是否检验gpg的key,我是实验库,不需要检验。

更多语法还是请参考已有的repo文件。

完事后,作为用户其实就没啥事了。而Yum库本身还是需要一定的配置,否则不能正常工作。

为什么要配置呢?不配置Yum怎么知道他的库里有哪些包呢?包的详细信息呢?怎么做分组呢?怎么知道包与包之间的依赖关系呢?正是因为不知道,所以要有个配置文件,其实准确的说是源文件,来告诉别人这个Yum库的若干国情。

Yum库的软件,作为实验我挑选了google-chrome-stable和linuxqq的rpm包,这两个软件都是闭源的,所以一定不会出现在官方的Yum库里。

Yum的配置文件有五个,必须放在Yum库的repodata文件夹下,其中有四个(他们是filelists.xml.gz  other.xml.gz  primary.xml.gz  repomd.xml)可以由一句命令createrepo(可能需要安装同名rpm包)自动生成,但最后一个文件比较难对付,第一,他不可能手写,打开就知道,多国语言,想必不可能有人懂这么多语言。第二,可以有命令来生成,和生成前四个文件的命令还是同一个,但他有个古怪的要求,必须有一个其他库的这个文件作为模板,才可以生成,说真的,玩这么多年电脑从没见过这种要求,如果你的电脑上或光盘里已经有Yum库(DVD版本的安装光盘几乎都有),并且有名字中带comps的那个xml配置文件(可能已经被gzip压缩),就可以用他,如果没有,用find命令全系统搜索,关键字是*comps*xml*,我的fedora就有这样一个文件。如果这样都没有找到,那么只能从其他电脑上找了,网上我Google过,没有发现人家把这个文件挂上来。

假设已经找到(不会找不到吧,DVD里真有),生成配置文件的整个命令如下:createrepo -g [该模板文件地址,注意后缀名是xml] [Yum库地址],在我的电脑上,这条命令是这样的,createrepo -g /var/cache/yum/i386/14/fedora/2d112e279cf18476b72e5b30f60c1aa55e0297e7a05f4d9891879ee83d298e11-comps-f14.xml /home/bachue/Downloads/。这条命令将自动在库文件下创建repodata文件夹,并创建好五个配置文件。这样,配置就算完成了。

如果要去试试这个库能否正常工作,一定不要忘了,Yum是有缓存的,如果不久前刚刚扫描过这个Yum库,就不会再去扫描一遍,但你其实已经改过他的配置,或是有新软件入库了,而Yum却不知道,以至于你的操作看上去就像没有生效,这样可能会让你以为Yum没有正常工作。我就出过这样的糗事。清除缓存的命令是yum clean all,一定不要忘了。

讲解完毕,是否很简单呢?

在没学RHCE以前,感觉deb包很强,毕竟不容易出现依赖性问题,学了RHCE,感觉rpm才是真的好,功能实在太强大了。

好久没更新博客了,不是偷懒,而是考试前期太忙了,什么作业都要开始交,上周末就完成了三门课的实验报告,还有一部分课要提前考试。比方说最无聊的文献检索。没办法进行新的学习。等考试结束后,大概就要全面攻RHCE了。

今天验收Windows大作业,这个程序让我花费了很多力气,但是验收时并不怎么顺利。虽然结构和类封装让老师对我的C++水平印象深刻,但是在一段动画上却出了问题,动画不够流畅。

这段动画是一个辅助型的效果,一个Google的Logo的移动动画,要有透明效果。这段动画我完全没有采用过去常用的动画在时间类回调函数里做法,而是把动画做在WM_PAINT里,时间类回调函数仅仅只是更新Logo的位置,并请求刷新界面。问题就出在这里,刷新信息是放在消息队列里的,程序必须接收到重绘消息才会绘图,如果重绘消息过多就不会多次重绘,而是只重绘一次就草草结束(有点掏浆糊)。显然13帧的重绘消息程序是不可能一一处理(虽然我的电脑性能较好,程序处理了大部分信息,如果没有经验,是断然看不出他的不流畅),因此跳帧就出现了。解决方法还是按照老路子走,直接在时间类回调函数内取得HDC,让他动,流畅性将大大提高。

另外,之所以有时界面会闪烁,根本原因是重绘前的一瞬间,界面这块区域被涂白了(通常是因为发送了EraseBackground消息或是BitBlt最后一个参数是WHITENESS),涂白后又立刻在上面绘图,Windows的图形速度并不是很快,这一瞬间还是能被人眼捕捉到,这样就看上去在闪烁。对此的解决方案是,如果是因为EraseBackground的话,请尽可能限制Invalidate系列函数的使用,即使要用,也要尽可能把他的最后一个参数设置为FALSE,如果图像较复杂就干脆用兼容DC做缓冲,使用兼容DC的话是永远没必要EraseBackground的。如果是因为BitBlt的话,那么就尽可能缩小WHITENESS的区域,不让其实就不需要WHITENESS的区域变成WHITENESS,这样闪烁基本上就可以抑制住。再次强调,闪烁不是因为过快频率的重绘,也不是因为过大范围的重绘,而是过多次的瞬间残留影像,一定要对症下药。

虽然验收不顺利,成绩仅仅是A-,但是能获取这么多经验,还是好的。本周五晚上还要在忙活一晚,把程序的这些问题全部去除,争取第二次验收得A。

刚刚在Ubuntu 10.10下安装了Vmware,可能因为新版本尚未发布,老版本7.1.2最高只兼容到Ubuntu 10.04,因此虽然安装顺利,但每次打开时都会显示如下字样“Before you can run VMware, several modules must be compiled and loaded into the running kernel.” 点击Install,键入root密码,显示一个标题为“VMware Kernel Module Updater”的对话框,等待编译,才能启动Vmware。而且这样的编译不是仅仅一次,而是每次打开Vmware都会,即使期间没有重启过。

这显然是个很费时和很麻烦的事,于是我Google了一下,首先确定这个问题仅仅发生在Ubuntu 10.10下,其次,要修复这个问题,也很简单:

只要修改/etc/vmware/config,将VSOCK_CONFED设置为“no”即可解决。

参考文献:
resalxh.wordpress.com/2010/09/09/vmware-player-3-1-1-on-ubuntu-10-10-maverick-meerkat/

看书的时候千万别让我发现,否则明天我的电脑就会多一份PDF文件或者快递就会敲我家的门。这本书是Deltamaster测试PDF软件的时候被我看到的,第二天我就下到了这本书的PDF,仔细翻看,果然是好书。虽然是大陆作者所著,但本书不断的用生活中喜闻乐见的实例生动阐述了原本枯燥的操作系统原理,使那些难点和模糊点不再难懂,我只看了一会,就明显感觉对操作系统原理的理解明显加深,有些过去的疑问也在书中得到了解答。这类书籍在普遍死板的大陆作者中确实非常少见。因此推荐给热爱操作系统的同学们。

至于下载地址神马的,God Bless Google!

今天中华民国建国九十九周年和Ubuntu 10.10发布之日,可谓双喜临门。更巧合的是,二者都以自由作为自己的信仰。

文泉驿,是Linux下最著名的自由中文字体,对于他的微米黑字体,我更是爱不释手,所有的实验报告都坚决使用它,即使是要放到Windows下,我也会将文档转换成pdf格式,以极大程度的使用它。如果查看本博客的CSS代码,也可以发现,正文字体文泉驿微米黑排名第一,在其他博客里,我自己还真没见过第二个这么做的。

平日里我装Ubuntu的时候习惯使用纯英文版,一方面是认为Linux用中文没有意思,如果用终端更不方便,另一方面也是想创造点英语气氛,但是Ubuntu有一点很奇怪,如果安装纯英文的Ubuntu,那么中文就显示得不正常,字的大小粗细都很奇怪,尤其是在Google Chrome下,上Ubuntu中文论坛,尤其明显。当然不允许这种事情发生,所以我每次都把Chrome的每一种字体都显式的指定为文泉驿微米黑,有时,甚至把全系统的字体都指定为文泉驿微米黑,似乎不是什么好事,为了一个中文字体,放弃了所有的英文字体。所以我探索新的方法,终于找到了通过修改字体配置文件/etc/fonts/local.conf来把中文字体指定为文泉驿微米黑,而不改变英文字体的方法:

<fontconfig>
   <match target="pattern">
      <test qual="any" name="family">
         <string>serif</string>
      </test>
      <edit name="family" mode="prepend" binding="strong">
         <string>Ubuntu</string>
         <string>WenQuanYi Micro Hei</string>
         <string>AR PL UMing CN</string>
         <string>AR PL ShanHeiSun Uni</string>
         <string>Bitstream Vera Serif</string>
         <string>DejaVu Serif</string>
         <string>AR PL UKai CN</string>
         <string>AR PL ZenKai Uni</string>
      </edit>
   </match> 
   <match target="pattern">
      <test qual="any" name="family">
         <string>sans-serif</string>
      </test>
      <edit name="family" mode="prepend" binding="strong">
         <string>Ubuntu</string>
         <string>WenQuanYi Micro Hei</string>
         <string>Bitstream Vera Sans</string>
         <string>DejaVu Sans</string>
         <string>WenQuanYi Zen Hei</string>
         <string>AR PL UMing CN</string>
         <string>AR PL ShanHeiSun Uni</string>
         <string>AR PL UKai CN</string>
         <string>AR PL ZenKai Uni</string>
      </edit>
   </match> 
   <match target="pattern">
      <test qual="any" name="family">
         <string>monospace</string>
      </test>
      <edit name="family" mode="prepend" binding="strong">
         <string>WenQuanYi Micro Hei Mono</string>
         <string>Bitstream Vera Sans Mono</string>
         <string>DejaVu Sans Mono</string>
         <string>WenQuanYi Zen Hei</string>
         <string>AR PL UMing CN</string>
         <string>AR PL ShanHeiSun Uni</string>
         <string>AR PL UKai CN</string>
         <string>AR PL ZenKai Uni</string>
      </edit>
   </match> 
</fontconfig>

编辑/etc/fonts/local.conf,把上述XML复制进去即可。如果没有该文件,就创建一个。修改后无需重启,即时起效。

最后赞美下Ubuntu 10.10的新字体"ubuntu",很漂亮。刚刚已经修改博客支持这个字体作为默认英文字体了。

参考文献:forum.ubuntu.org.cn/viewtopic.php?f=8&t=236013&start=0

对获取设备描述表的简单总结

2010年10月09日 18:13

昨天晚上一直在纠结于绘图的问题。相同的创建删除DC的代码,放在WM_PAINT里是对的,放进WM_CREATE和WM_DESTROY就全错了,不知道为什么,后来才想起来,不同的事件必须用不同的创建DC的函数,不能混用。

WM_PAINT里要用BeginPaint和EndPaint函数来取得DC,进行重绘。

WM_CREATE里必须用GetDC来取得DC,ReleaseDC既可以在WM_CREATE,也可以在WM_DESTROY里,实现DC在全局有效。

GetWindowDC获取整个窗口的DC,连同客户区和非客户区,WM_NCPAINT(NC是非客户区,不是脑残)事件负责对非客户区的重绘。ReleaseDC负责删除它。

CreateDC获取整个屏幕的DC,似乎不仅限于屏幕使用,具体怎么用,我也不知道。由DeleteDC负责删除。

至于CreateCompatibleDC想必就不用说了。这函数名字起的不好,叫缓存DC还差不多。

就是这样~~最后热烈庆贺中国再获诺贝尔和平奖。

关于C execlp函数的理解

2010年9月29日 19:05

execlp(從PATH 環境變量中查找文件並執行)

相關函數
fork,execl,execle,execv,execve,execvp
表頭文件 #include<unistd.h>
定義函數 int execlp(const char * file,const char * arg,……);
函數說明
execlp()會從PATH 環境變量所指的目錄中查找符合參數file的文件名,找到後便執行該文件,然後將第二個以後的參數當做該文件的argv[0]、argv[1]……,最後一個參數必須用空指針(NULL)作結束。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤代碼
參考execve()。
範例
	/* 執行ls -al /etc/passwd execlp()會依PATH 變量中的/bin找到/bin/ls */
#include<unistd.h>
main()
{
    execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
}
//執行
//-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

其实上面的描述很奇怪,如果能从PATH中找到第一个参数指定的文件,那何须第二个参数呢,没意义啊?

然后Google了下,看到了www.lslnet.com/linux/f/docs1/i34/big5260214.htm中别人同样的质疑。

这张帖子的楼主索性猜测:execlp函數在實際執行的時候根本沒有用到第二個參數。

说真的,这个猜测过于草率了。

楼下有一张回帖给出了一个反例:execlp("ls","flw","-?",(char *)0)。

应该是execlp("ls","flw","--help",(char *)0)吧,ls是Linux命令,-?是Windows的写法,不能同时运用,疑为他的笔误。这句语句在我电脑上的效果:

Usage: flw [OPTION]... [FILE]...

List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
 
自已在终端上永远试不出这个结果,因为明明调用的是ls命令,不可能显示出Usage: flw来。
再仔细看看上面关于这个函数的描述“然後將第二個以後的參數當做該文件的argv[0]、argv[1]……”
我猛然想到了以前说过main函数是可以传入参数的,我于是尝试了这样的代码:
	int main(int num_args,const char* args[])
{
	for(int i=0;i<num_args;++i)
	{
		std::cout << args[i] << std::endl;
	}
        return 0;
}

在终端而不是IDE里运行这个程序,运行的时候给他带点参数,结果自己打的命令出现的在args[0]的位置,后面的参数出现在了args[1],args[2],args[3]....的位置,可见C程序总会把你运行这个程序用的命令传入args[0]。这样这个问题就解开了。execlp第一个参数是让程序从PATH中找到指定程序运行,第二个参数将传入这个程序的args[0]。

execlp("ls","flw","--help",(char *)0)出现Usage: flw,是因为ls命令在显示帮助的时候会动用args[0],这么设计很正常,因为如果用户打错了命令,总希望用最接近他命令的方式指导他怎么做才对,直接使用他的命令是最方便的。平时args[0]几乎总是等于ls,这是因为ls在PATH中,没必要指示他的位置,但如果使用/bin/ls这样的命令,就可以看出来了。

twitter logo GDI绘制

2010年9月27日 07:09

这次的作业,用GDI绘制任意卡通图,我不会画什么卡通图,于是就画了个twitter的logo。

按1(MM_TEXT),7(MM_ISOTROPIC),8(MM_ANISOTROPIC)会有不同的GDI映射。缩放窗口可以看出他们的区别。

继续阅读

相信C++中Private和Protected继承是最冷门的语法之一吧,以至于以后大多数以C++语法作为模板的语言都没有继承这个语法。我C++学的不算差,学完后几乎每学期都在使用,但是也把这个语法点忘的差不多了。不过今天在和Deltamaster讨论C++如何选择性继承的时候(只继承一部分接口,另一部分接口不继承,如果用户去使用这些不被继承的接口,必须在编译期间报错),他提出了用Protected或Private继承的思想。实现如下:

#include<iostream>
class Parent
{
public:
	void get()
	{
		std::cout << "get" << std::endl;
	}
	void set()
	{
		std::cout << "set" << std::endl;
	}
};
class Child:protected/*private*/ Parent
{
public:
	void get()
	{
		Parent::get();
	}
};
int main()
{
	Child c;
	c.get();
	//c.set();
	system("pause");
	return 0;
}

允许子类继承父类的get方法,而不继承set方法,就是先让子类Protected(或Private)继承父类,使父类所有接口在子类中一律为Protected(或Private),然后重写一个Public的get方法,在其中调用父类的get方法即可,这样就可以做到正常调用子类继承自父类的get方法,而如果调用子类继承自父类的set方法就会编译出错。

以上代码是在Microsoft Visual Studio 2010编写并编译的,本来想在Linux下用Eclipse写,但总感觉CDT有BUG,编译通不过,所以还是在Visual Studio下写。下次装Eclipse再也不装CDT了。

一直不知道Java中Finally的作用,因为总感觉没有什么用,事实上,当初学Javascript时也有同样的疑问,后来Google下,才明白过来。

	public void writeFile(String filePath, String fileName, String args) throws IOException
{
    FileWriter fw = new FileWriter(filePath + fileName);
    try 
    {
        fw.write(args);
    }
    catch (IOException e)
    {
    //1
        fw.close();
        throw e;
    }
    //2
    fw.close();
}
 
这段代码创建了一个FileWriter object,并调用 write 方法。在退出该方法之前,您必须关闭FileWriter object,以避免资源漏洞。为了完成这一任务,我们在 //2 处调用 close,它是该方法的最后一条语句。但是,如果 try 块中发生一个异常会怎么样呢?在这种情况下,//2 处的 close 调用永远不会发生。因此,您必须捕获这个异常,并在重新发出这个异常之前在 //1 处插入对 close 的另一个调用。这样就可以确保在退出该方法之前关闭FileWriter object。这样编写代码既麻烦又易于出错,但在没有 finally 的情况下这是必不可少的。有了 finally,前面的代码就可以重写为以下的形式:finally 关键字是对 Java 异常处理模型的最佳补充。 finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。如果没有 finally,您的代码就会很费解。例如,下面的代码说明,在不使用 finally 的情况下您如何编写代码来释放非内存资源:
 
	public void writeFile(String filePath, String fileName, String args) throws IOException
{
    FileWriter fw = new FileWriter(filePath + fileName);
    try 
    {
        fw.write(args);
    }
    catch (IOException e)
    {
        throw e;
    }
    finally 
    {
        fw.close();
    }
}
 
finally 块确保 close 方法总被执行,而不管 try 块内是否发出异常(或是try块中有突如其来的return)。因此,可以确保在退出该方法之前总会调用 close 方法。这样您就可以确信FileWriter object被关闭并且您没有泄漏资源。
 
参考文献:
tech.ccidnet.com/art/3737/20060510/549039_1.html
hi.baidu.com/laoyouji2008/blog/item/d96467092d28f02f6b60fbb6.html
 
对于一些无可奈何的二元操作(神马是二元操作?二元操作是指当调用一个函数后必须成对调用另一个函数,这两个函数总是成对使用,否则可能会导致严重错误。比如文件的打开和关闭,加锁和释放锁。二元操作本身不是难点,但是人们非常容易忘记调用第二个函数,从而造成隐患,这在一个代码块中有多个如return,break,continue之类跳转语句时极易发生,以前有本书希望我们永远在代码块中只设定一个出口,但是这么做难度很大),由于Java的析构函数总不是很给力(无法确定何时调用,是否会调用,不能用它来包装第二个操作,这和C++完全不一样),我们完全可以使用Finally来完成第二个操作,这样就不会遗忘了。我们只要让第一个操作的那个代码块被try包围,第二个操作写在之后的finally中,catch可以不需要,这样无论接下来有多少个可能导致跳出代码块的语句,第二次操作总会被执行,毋须任何担忧。

安装Proftpd的几点总结

2010年9月18日 07:23

过去Proftpd总尽可能采用自动化安装+图形化使用的办法,偷懒,但是今天安装Proftpd我则采用了官方下载源码+自行编译+文本文件配置FTP,难度毫无疑问比之前大些,但也难不到哪里去。

安装方法详见《鸟哥的Linux私房菜》 linux.vbird.org/linux_server/0410proftpd.php 这里只总结一些鸟哥没有说的部分。

(话说这本书写得真好,通俗易懂,语言幽默,不愧是自由中国啊,令人神往。)

总结一:安装Proftpd出现如下错误:

tcpwrap.c:15:20: error: tcpd.h: No such file or directory

使用apt-get install libwrap0-dev即可。

总结二:中文问题,这个问题真的令人头疼,目前我也没有找到完全解决的办法,只能不断弱化这种错误

在鸟哥那句 ./configure --prefix=/usr/local/proftpd --enable-shadow --enable-autoshadow --with-modules=mod_ratio:mod_readme:mod_wrap 中再增加一个参数 --enable-nls

编译安装后,在proftpd.conf里增加一项:UseEncoding UTF-8 GBK,即可。

这么做的话,当从Windows的客户端或Linux的FTP服务器放入中文文件时他们互相访问都不会有问题,但这时使用Linux的客户端去访问Linux的FTP服务器,则文件名会有乱码(内容不会,似乎是Linux的FTP客户端编码和人家都不一样),不知道如何解决。

参考文献:

www.xpv.cn/home/vsftpdbianyicuowujiejuebanfa.html
blog.wu-boy.com/2010/07/07/2276/

继续阅读

由于电脑重装的缘故,我虚拟机里的Oracle数据库也重新安装了,因为OCP已经考完,我配置的数据库显然不能再局限于OCP考试之用,再说我本来也喜欢开发,而不是做DBA,我计划着让他和PHP连接起来,模仿生产环境,所以在编码上我使用了UTF-8字符集,而不是传统的美式字符。安装自然是一切顺利,不过在打开EM时却发生了java.lang.Exception: Exception in sending Request::null的错误,这个错误以前从未发生过,重启也无效。我估摸着大概是字符集的问题,于是Google下,找到了解决方法:

gedit $ORACLE_HOME/sysman/config/emd.properties

在最后添加agentTZRegion=Asia/Shanghai 重启EMCTL就可以了。

我在上海,所以使用上海的时区。

可以使用 gedit $ORACLE_HOME/sysman/admin/supportedtzs.lst 来找到支持的时区。

参考文献:

hi.baidu.com/zxq211103/blog/item/f00a7a63ad47fc620c33fa0d.html
forums.oracle.com/forums/thread.jspa?threadID=320574&tstart=0&messageID=1374397

1.由于我的一位同学(网名:Deltamaster,域名:softrank.net,我是他的粉丝)对这个脚本的“自动跳转模式”感觉非常困惑,而我确实也难以向他解释,所以放弃了这个功能(因为我是他的极品粉丝)。当初这个功能完全是因为一时脑残,否决了之前的一个功能,又懒得修改已有的代码,所以随便拿另一个功能去替换而已。这个功能本来也确实不需要。

2.默认不再显示那些控件,因为默认设定是我认为最人性化的设定。我现在也认为事先作出最完美的设定,不再需要用户自己动手,同时也可以除去一些无用的控件来使界面更简洁是正确的。不过我仍然保留用户可以自行修改的权利。所以display这个参数依旧存在,修改为true就可以显示所有控件。

Userscript地址: userscripts.org/scripts/show/84200

谷奥地址:guao.hk/posts/super-google-dictionary-greasemonkey-user-script.html

Chrome迷地址:chromi.org/archives/6785

最近在Linux下开发,由于长期使用Visual Studio 2010,对代码提示功能情有独钟,现在在Linux下,使用Eclipse做开发,当然免不了怀念Visual Studio强悍的代码提示,于是在网上搜索了一些文章,整理出关于Eclipse代码提示功能设置的方法。

 

Java:

增强Eclipse 的代码提示功能,具体怎么样来配置?下面开始说步骤:
1. 打开Eclipse,然后“window”→“Preferences”
2. 选择“java”,展开,“Editor”,选择“Content Assist”。
3. 选择“Content Assist”,然后看到右边,右边的“Auto-Activation”下面的“Auto Activation triggers for java”这个选项。其实就是指触发代码提示的就是“.”这个符号。
4. “Auto Activation triggers for java”这个选项,在“.”后加abc字母,方便后面的查找修改。然后“apply”,点击“OK”。
5. 然后,“File”→“Export”,在弹出的窗口中选择“Perferences”,点击“下一步”。
6. 选择导出文件路径,本人导出到桌面,输入“test”作为文件名,点击“保存”。
7. 在桌面找到刚在保存的文件“test.epf”,右键选择“用记事本打开”。
8. 可以看到很多配置Eclipse的信息
9. 按“ctrl + F”快捷键,输入“.abc”,点击“查找下一个”。
10. 查找到“.abc”的配置信息如下:
11. 把“.abc”改成“.abcdefghijklmnopqrstuvwxyz(,”,保存,关闭“test.epf”。
12. 回到Eclipse界面,“File”→“Import”,在弹出的窗口中选择“Perferences”,点击“下一步”,选择刚在已经修改的“test.epf”文件,点击“打开”,点击“Finish”。该步骤和上面的导出步骤类似。
13. 最后当然是进行代码测试了。随便新建一个工程,新建一个类。在代码输入switch,foreach等进行 测试。你立即会发现,果然出了提示,而且无论是敲哪个字母都会有很多相关的提示了,很流畅,很方便。
 
C/C++:
 
打开终端:输入:$ gcc- v
得到类似的:gcc 版本 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)
很容易就看到你当前使用的版本了。
启动Eclipse.进入:Windows-->Preferences-->C/C++找到Environment。增加两个变量:
CPLUS_INCLUDE_PATH: /usr/include/c++/4.1.3(我的gcc版本) 
C_INCLUDE_PATH: /usr/include
 
C/C++的代码提示只在.和->下触发,虽然没有Java下这么强大,不过也够了。因为这里是代码提示最容易发挥威力的地方。
 
补充:Ctrl+Space也能触发代码提示,而且功能更强,几乎总能给出符合需求的提示,不过我不知道如何才能让Eclipse在更多情况下自动触发提示,如果能做到,Eclipse就和Vistual Studio一样强了。
 
本文参考:
http://developer.51cto.com/art/200907/136242.htm
http://blog.chinaunix.net/u/21684/showart_462486.html

Oracle笔记—警示线

2010年9月11日 23:40

一些系统级的Warning警示线和Critical警示线谁大谁小没有严格规定。而像表空间这样的Warning警示线必须严格小于Critical警示线。其实我觉得严格小于是对的,不作规定反倒是很奇怪的。

Oracle笔记—Large Pool的作用

2010年9月11日 23:29

下面对象使用Large Pool:

MTS

—在SGA的Large Pool中分配UGA,语句的并行查询。

—允许进程间消息缓冲区的分配,用来协调并行查询服务器,备份。

—用于RMAN磁盘I/O缓存。

Oracle笔记—PL/SQL关键字问题

2010年9月11日 23:22

大概最容易用到的是SUM吧,Oracle内置函数名字,也是非常常用的变量名字,所以要注意,不要触及关键字。

Oracle笔记—Trace与Track

2010年9月11日 23:16

Oracle既有一个Track文件,也有一个Trace文件,Track和Trace解释很相近,以至于我长期搞不清楚他们的关系。

 

跟踪文件(trace file)能提供调试信息,服务器遇到问题时,它会生成一个包含大量诊断信息的跟踪文件。如果开发人员设置了sql_trace=true,服务器就会生成一个包含性能相关信息的跟踪文件。我们之所以可以使用这些跟踪文件,是因为oracle是一个允许充分测量的软件。编写数据库内核的程序员在内核中放入了调试代码,而且调试代码相当多,这些调试代码是被程序员有意留在内核中的。

 

修改跟踪文件(change tracking file)是一个可选的文件,这是oracle 10g企业版中新增的,这个文件惟一的目的是跟踪自上一个增量备份以来哪些块已经修改。采用这种方式,恢复管理器(recovery manager,rman)工具就能只备份确实有变化的数据库块,而不必读取整个数据库。
在oracle 10G之前的版本,要完成增量备份,必须读取整个数据库文件,查找自上一次增量备份以来修改的块,如果有一个1T的数据库,只增加了500M的新数据,增量备份就必须读取1T的数据,在其中找出要备份的500M新信息,尽管增量备份存储的数据确实少得多,但它还是要读取整个数据库。
在10G企业版中,oracle运行时,如果块被修改,oracle可能会维护一个文件,告诉RMAN哪些块已经修改。创建这个修改跟踪文件的过程相当简单,只需要通过ALTER DATABASE命令就可以完成:

Oracle笔记—CORE_DUMP_DEST

2010年9月11日 23:07

如果出现严重的oracle内部错误,或是oracle support要求你生成一个跟踪文件来得到额外的调试信息,CORE_DUMP_DEST参数则定义了此时这个“内核”文件应该放在哪里。

Oracle笔记—关于ASM_POWER_LIMIT

2010年9月11日 06:54

一直以为ASM_POWER_LIMIT是越小速度越快,但其实是越大速度越快拉。。

 

ASM_POWER_LIMIT specifies the maximum power on an Automatic Storage Management instance for disk rebalancing. The higher the limit, the faster rebalancing will complete. Lower values will take longer, but consume fewer processing and I/O resources.
 
If the POWER clause of a rebalance operation is not specified, then the default power will be the value of ASM_POWER_LIMIT.
 
引用自:http://united-states.frommeyer.nl/documentation/oracle/database/10.1/server.101/b10755/initparams012.htm

在10g中创建字典管理表空间都会出现这样一个错误:Failed to commit: ORA-12913: Cannot create dictionary managed tablespace

查询Oracle官方文档:

 

ORA-12913: Cannot create dictionary managed tablespace

Cause: Attemp to create dictionary managed tablespace in database which has system tablespace as locally managed

Action: Create a locally managed tablespace.

 

这是因为:

 

在Oracle920中,默认系统表空间是local管理,因此不能在数据库中建立数据字典管理的表空间。


如果想要建立数据字典管理的表空间,必须在建立数据库时,将系统表空间改为数据字典管理才可以。

 

一个是环境变量,一个是数据库参数。
 
nls_lang是在客户端设置设置客户端字符集,也就是在环境变量(Linux:~/.bash_profile)中。
 
nls_language在服务端设置,SERVER端的lang,属于parameter,可以由alter system set nls_language='...' scope=spfile 来修改。
 
nls_characterset也是设置服务器的字符集。

Oracle笔记

2010年9月10日 06:11

“如果使用专用服务器连接,会在USER_DUMP_DEST参数指定的目录中生成跟踪文件。如果使用共享服务器连接,则在BACKGROUND_DUMP_DEST参数指定的目录中生成跟踪文件。”

网上来的,这句话似乎是有问题的,因为我的测试数据库自安装起就是用专用服务器连接,但是BACKGROUND_DUMP_DEST依旧有大量Trace文件。还是“bdump是有关后台进程的trace,udump是有关用户的”更正确些。

Oracle笔记

2010年9月10日 06:06

表空间可以Offline就可以ReadOnly的说法显然是错误的,SYSAUX表空间就是最好的证据。

Oracle笔记

2010年9月10日 05:08

alter database backup controlfile to trace;

虽然曾经说过凡是“alter database”的都不能在数据库打开的情况下修改memory,但是这句语句似乎是例外。输入后,trace文件即生成在了$ORACLE_BASE/admin/<sid>/bdump下,可以通过时间(Linux命令: ll -t)去寻找这个文件,打开就可以找到控制文件的恢复SQL语句,似乎还有两个版本,一个NORESETLOGS版本和一次RESETLOGS版本。

 

/*NORESETLOGS版本*/
STARTUP NOMOUNT  //这里没分号?大概startup语句就是不加分号的。
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG

    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/home/oracle/oracle/oradata/orcl/redo01.log'  SIZE 50M,
  GROUP 2 '/home/oracle/oracle/oradata/orcl/redo02.log'  SIZE 50M,
  GROUP 3 '/home/oracle/oracle/oradata/orcl/redo03.log'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  '/home/oracle/oracle/oradata/orcl/system01.dbf',
  '/home/oracle/oracle/oradata/orcl/undotbs01.dbf',
  '/home/oracle/oracle/oradata/orcl/sysaux01.dbf',
  '/home/oracle/oracle/oradata/orcl/users01.dbf',
  '/home/oracle/oracle/oradata/orcl/example01.dbf'
CHARACTER SET WE8ISO8859P1
;
 
/*RESETLOGS版本*/
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/home/oracle/oracle/oradata/orcl/redo01.log'  SIZE 50M,
  GROUP 2 '/home/oracle/oracle/oradata/orcl/redo02.log'  SIZE 50M,
  GROUP 3 '/home/oracle/oracle/oradata/orcl/redo03.log'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  '/home/oracle/oracle/oradata/orcl/system01.dbf',
  '/home/oracle/oracle/oradata/orcl/undotbs01.dbf',
  '/home/oracle/oracle/oradata/orcl/sysaux01.dbf',
  '/home/oracle/oracle/oradata/orcl/users01.dbf',
  '/home/oracle/oracle/oradata/orcl/example01.dbf'
CHARACTER SET WE8ISO8859P1
;

Oracle笔记

2010年9月10日 04:25

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; //开启控制文件自动备份

new RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
new RMAN configuration parameters are successfully stored
 
RMAN> backup database spfile include current controlfile plus archivelog;
 
/*备份归档日志,由于命令中带有plus archivelog,因此手动备份归档日志*/
Starting backup at 09-SEP-10
current log archived //当前日志归档
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=143 devtype=DISK
channel ORA_DISK_1: starting archive log backupset
channel ORA_DISK_1: specifying archive log(s) in backup set
input archive log thread=1 sequence=4 recid=1 stamp=729289389
channel ORA_DISK_1: starting piece 1 at 09-SEP-10
channel ORA_DISK_1: finished piece 1 at 09-SEP-10
piece handle=/home/oracle/oracle/flash_recovery_area/ORCL/backupset/2010_09_09/o1_mf_annnn_TAG20100909T202309_68knfh2s_.bkp tag=TAG20100909T202309 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 09-SEP-10
 
/*备份数据文件,控制文件和服务器参数文件*/
Starting backup at 09-SEP-10
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=/home/oracle/oracle/oradata/orcl/system01.dbf
input datafile fno=00003 name=/home/oracle/oracle/oradata/orcl/sysaux01.dbf
input datafile fno=00005 name=/home/oracle/oracle/oradata/orcl/example01.dbf
input datafile fno=00002 name=/home/oracle/oracle/oradata/orcl/undotbs01.dbf
input datafile fno=00004 name=/home/oracle/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: starting piece 1 at 09-SEP-10
channel ORA_DISK_1: finished piece 1 at 09-SEP-10
piece handle=/home/oracle/oracle/flash_recovery_area/ORCL/backupset/2010_09_09/o1_mf_nnndf_TAG20100909T202312_68knfjll_.bkp tag=TAG20100909T202312 comment=NONE //数据文件备份位置
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:55
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 09-SEP-10
channel ORA_DISK_1: finished piece 1 at 09-SEP-10
piece handle=/home/oracle/oracle/flash_recovery_area/ORCL/backupset/2010_09_09/o1_mf_ncsnf_TAG20100909T202312_68knk68q_.bkp tag=TAG20100909T202312 comment=NONE //控制文件和服务器参数文件位置
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:04
Finished backup at 09-SEP-10
 
/*归档日志再次被备份,事后查看备份文件,发现第一次归档备份文件大小是第二次的数百倍,可能因为是Open Backup,数据库在备份期间生成了重做日志,因此需要再次备份,证据就是Close Backup的时候不会有第二次备份归档日志,他会显示:specification does not match any archive log in the recovery catalog backup cancelled because all files were skipped*/
Starting backup at 09-SEP-10
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archive log backupset
channel ORA_DISK_1: specifying archive log(s) in backup set
input archive log thread=1 sequence=5 recid=2 stamp=729289512
channel ORA_DISK_1: starting piece 1 at 09-SEP-10
channel ORA_DISK_1: finished piece 1 at 09-SEP-10
piece handle=/home/oracle/oracle/flash_recovery_area/ORCL/backupset/2010_09_09/o1_mf_annnn_TAG20100909T202512_68knk991_.bkp tag=TAG20100909T202512 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 09-SEP-10
 
/*由于之前开启了自动备份控制文件和服务器参数文件,因此他们再次被备份*/
Starting Control File and SPFILE Autobackup at 09-SEP-10
piece handle=/home/oracle/oracle/flash_recovery_area/ORCL/autobackup/2010_09_09/o1_mf_s_729289514_68knkby5_.bkp comment=NONE //注意不是放在backupset文件夹下面,而是放在autobackup文件夹下面
Finished Control File and SPFILE Autobackup at 09-SEP-10
 
 
/*
备份完毕,共五个文件,四个在backupset文件夹下,一个在autobackup文件夹下
从上述文字可知,如果开启控制文件自动备份,那么只要发生备份,控制文件和服务器参数文件必然会自动备份,无论备份命令中是否已经显式的要求备份他们了,且自动备份的位置是在autobackup文件夹下。
 
控制文件和服务器参数文件总备份在一起。
 
只要要求备份归档日志(即plus archivelog),归档日志就会有两次备份,分别存储在两个文件下。
*/
 

我的第一篇博文

2010年9月09日 23:47

一直以来都想建立一个Blog,因为对程序员和即将成为程序员的学生来说,Blog是记录自己学习成果的地方,是分享自己心得体会的地方,是宣泄情感的地方。Blog一直以来都是程序员必备。

但是我的Blog却迟迟没有建立,没有技术上的原因,而是基于这个矛盾——希望把Blog建立在海外的空间,不想被中国大陆审查,也不希望在中国大陆无法访问。在没有外国帐户,甚至没有自主经济能力的的情况下,这个矛盾真的很难解决。

我事实上已经有一个海外空间,在0oku.net,5GB,免费,一切都很完美,但是在中国大陆无法访问——不知道为什么,他的首页和FTP服务器都是可以正常访问的,但是自己的空间就是访问不了。如果是在家里,开扇门问题也不大,但是在学校,连8080端口都会被屏蔽的地方,访问自己空间根本就是妄想。

在此之间,我基本上是拿Twitter替代着Blog,这很不像话,Twitter规定最多140字,只能容纳很短很短的心得,几乎没有标签管理功能,我的Twitter又是自我保护的,无法对自己以前发的推进行查询,这样的Blog显然毫无意义,所以我决定,还是先临时建立一个正规的Blog,等到自己有了海外空间,再作迁移。

我之所以一定要一个空间是因为已有的Blog系统总不符合我的口味,比方说我喜欢写文章不写标题,我喜欢写很短很短的文章,就像Twitter那样短,我希望我的Blog能够关联我的Twitter,我还希望在我的空间里构建各种Web应用程序,比如一个更先进更华丽的Twitter管理系统,或是发布各种自己的小作品,我还是Ajax技术和极简主义(既是艺术风格方面也是代码风格方面)的极端崇拜者,这些都是普通的Blog系统所不能给我的。所以我要自己构建,我甚至拒绝使用WordPress,而是从头到尾,决定Blog每一个细节,这是我的性格,也符合天蝎座的普遍性格。

希望早点拥有自己最完美的的海外空间~~