oyaji's Blog

10>11

 

>10

这几天看了几位同行的年终总结,看着看着好像自己的脸变的有点发烫了,猛然间才意识到原来自己是这样茫然的过了一年又一年...

为此写下这点文字,算是自己的年度总结:

1. 以一个高速公里养护管理的项目贯穿始终

    前期的框架开发,系统基本模块和画面雏形功能的构建,由1人开发。
    后期1人接手后做变更维护。有难度的任务由前期的开发人员来调查解决。
    自己做客户沟通,需求定义,测试。

2. 电信项目中实现后台的数据加工处理部分

    在北京联通114电话导航平台的建设中,实现了一个模块的后台数据仓库的建模,和数据加工的过程代码。

3. 在openbiz框架下实现了几个简单的业务功能

    为一个国外房产经纪公司做了一个加工xml文件的界面
    为一家钢材贸易公司做了一个简单的合同管理,和业务进行状态跟踪的系统   

4. 有一个月时间在用CMS为一家公司搭建了网站

儿子后半年上学前班了,大概下午4点多就去接他,也算工作之一吧。

 

剩下的时间,饱食终日、闲暇闲散...

 

>11

1. 工作环境迁移到ubuntu下

2. 开发工具集中到ror下

3. 敏捷方法,敏捷团队,敏捷自己

4. 虽然已经很晚了,但还是觉得有必要再从coding开始下一阶段的人生...

回头看看这两年好像荒废了,在跌倒的地方爬起来。

好像是最后一次的机会了,不期待很精彩,只希望能有所突破

 

 

 

 

ruby编码规范

前言 

本blog是在ruby编程的基础上说明的。在实际的项目中,适当修改本规范使其更适合项目的需要。

source格式

1. 缩进
   为了容易阅读,需要适当的缩进。缩进的长度以2个space为准。请尽量使用space,不要使用tab。
 
if x > 0
  if y > 0
    puts "x > 0 && y > 0"
  end
end

2. 一行中的最大字符数 在一行中输入的字符数最大为80。

3. 空行 在class之间用空行分隔

class Foo
  ...
end
 
class Bar
  ...
end

class Foo
  ...
end
class Bar
  ...
end

另外,在class内部的各种组成单元间用空行分隔

class Foo
  attr :bar
 
  def baz
    ...
  end
 
  def quux
    ..
  end
end

4. 注释 方法定义的内部不追加注释。(当你认为有需要注释的代码的地发,请refactoring) 但class,module等的public方法的功能说明请在RDoc中注明

# 拆分逗号分隔的字符串、结果作为数组返回
def split_csv(str)
  return str.split(/,/)
end

构文规范 

1. class的构成要素 class的构成要素请按下面的顺序来依次进行 

1. include module 
2. 定义常数
3. 定义类变量,类的实例变量
4. 定义public属性的类方法
5. 定义accessor
6. 定义initialize
7. 定义public的实例方法
8. 定义protected的类方法
9. 定义protected的access
10.定义protected的实例方法
11.定义private的类方法
12.定义private的access
13.定义private的实例方法

2. 定义accessor

accessor是指attr_accessor,attr_reader,attr_writer这几个方法

3. 定义方法

定义方法时其参数要用()括起来。但没有参数的时候,不要加()

def foo(x, y)
  ...
end
 
def foo
  ...
end

4. 定义类方法

使用self来定义类方法

class Foo
  def self.foo
    ...
  end
end

class Foo
  def Foo.foo
    ...
  end
end

5. 方法调用

调用方法时要用()将参数括起来。但如果没有参数时不要加()。 
但在调用puts,print,p这几个方法时,参数不用() 

foo(1, "abc")
obj.foo(1, "abc")
bar
print "x = ", x, "\n"

foo 1, "abc"
obj.foo 1, "abc"
bar()

6. block 针对block基本原则是使用do...end

foo(x, y) do
  ...
end
 
x = bar(y, z) do
  ...
end

foo(x, y) {
  ...
}
 
x = bar(y, z) {
  ...
}

但如是行内嵌入的场合,请使用{}

s = ary.collect { |i| i.to_s }.join(",")

s = ary.collect do |i| i.to_s end.join(",")

7. return 要返回方法的值的时候,请使用明确使用return。但请省略()

def add(x, y)
  return x + y
end

def add(x, y)
  x + y
end
 
def add(x, y)
  return(x + y)
end

8. yield

通过yield来调用方法的写法,请参考方法调用

9. 条件分支

if后面的then可以省略。在if !x的判断时,请用unless x来代替,但unless的情况下不要使用else。

if x > 0
  puts "x > 0"
else
  puts "x <= 0"
end
 
unless x
  puts "x is false"
end
 
puts "x is true" if x

if x > 0 then
  puts "x > 0"
end
 
unless x
  puts "x is false"
else
  puts "x is true"
end
 
puts "foo && bar && baz && quux" if foo &&
  bar && baz && quux

10.case 在使用case语句时,省略then

case x
when 1
  ...
when 2
  ...
end

if x == 1
  ...
elsif x == 2
  ...
end
 
case x
when 1 then
  ...
when 2 then
  ...
end

11.不要使用条件分支的值

if x > 0
  msg = "x > 0"
else
  msg = "x <= 0"
end

msg = if x > 0
        "x > 0"
      else
        "x <= 0"
      end

12.循环处理

省略while的do。另在使用while !x的语句时,请用until x来代替

while cond
  ...
end
 
until cond
  ...
end

while cond do
  ...
end

13.无限循环时,请使用loop

while true
  ...
end

14.逻辑运算符

逻辑运算符有! && || (不要使用not and or)

15.三元运算符

条件复杂,或者需要换行的情况下,不要使用三元运算符

命名规范

1. 全体

1. 原则上不使用单词的缩略写法 
2. 作用域较小情况下的循环变量,使用i,j,k并按照这样的顺序来使用
3. 作用域较小情况下的变量密,使用class名称的简写形式也可以

2. 类名,模块名 

类名,模块名中每个单词的首字母大写,不要用’_'这样的分隔字符。 但在HTTP等这样的省略语的情况下,所有的字母都大写

ExampleClass  
HTTPClient

Example_Class
EXAMPLE_CLASS
HttpClient
HTTPclient
HTTP_Client

3. 方法名

方法名中全部的字母都要小写,单词之间用’_'这样的分隔字符。  

add_something

addsSomething
Add_Something

方法名中请使用动词的原形 返回的值是true/false的情况下,动词或者形容词后面加上?。不要用is_这样的写法

visible?

is_visible
is_visible?

如果,对可能改变传入参数的方法后面加上!

split
split! # split带有破坏性的版本

4. 常量名

类名模块名之外的常量定义时,全部字符大写,单词之间用’_'这样的分隔字符。

EXAMPLE_CONSTANT

5. 变量名

全部字符小写,单词之间用’_'这样的分隔字符。

tmp
local_variable
@instance_variable
$global_variable

6. 文件名

文件名全部小写,单词之间用’_'这样的分隔字符。 使用文件中主要的类名经变化之后,作为文件名

foo.rb # 定义foo类
foo-bar.rb # 定义foo-bar类
foo/bar-baz.rb # 定义Foo::BarBaz类(命名空间中的class)

 

RUBY中使用YAML

 
1. YAML (Ain't Markup Language)
YAML是一种直观的能够被电脑识别的的数据数据序列化格式,他并且容易被人类阅读,容易和脚本语言交互的。换种说法,YAML是一种很简单的类似于XML的数据描述语言,语法比XML简单很多。
 
YAML相比XML的优点:
    YAML的可读性好。
    YAML和脚本语言的交互性好。
    YAML使用宿主语言的数据类型。
    YAML有一个一致的信息模型。
    YAML易于实现。
上面5条也就是XML不足的地方。同时,YAML也有XML的下列优点:
    YAML可以基于流来处理;
    YAML表达能力强,扩展性好。
总之,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。
 
YAML的写法:写YAML要比XML快得多(无需关闭标签或引号),并且比'.ini'文档功能更强(ini文档不支持层次)。
 
2. 在Ruby中使用YAML
从Ruby1.8开始YAML变成了标准库。简单的 require 'yaml',require 'yaml/store' 来引入后就可以使用了。
 
ruby中的绝大多数对象可以直接转化成YAML格式的字符串
require 'yaml' # 必须
obj.to_yaml    # 转化成YAML格式
 
反过来 使用YAML::load可以将to_yaml转化后的字符串复原为ruby对象
obj = ...
decoded_obj = YAML::load(obj.to_yaml)
 
类似用法的有:
obj = ... # 略

bin = Marshal.dump(obj)        # 将ruby对象转化成binary格式
loaded_obj = Marshal.load(bin) # 将binary格式的对象还原

require 'yaml'
yml = obj.to_yaml              # 将ruby对象转化成YAML格式
loaded_obj = YAML::load(yml)   # 将YAML格式的对象还原
 
需要注意的是,Marshal不能转化的输入输出对象和proc对象,也同样不能用YAML格式来转化
 
Pstore是在Marshal中使用的对象数据库
因为YAML可以替换Marshal来使用,所以YAML中通过YAML::Store来实现PStore的功能
比如现有代码中使用了PStore库的地发,首先引入 require ‘yaml/store'后,把PStore替换成YAML::Store即可
 
require 'yaml/store'
db = YAML::Store.new('yaml_db')
db.transaction{
  db['data'] = obj
  val1 = db['val1']
}
 
3. 性能
经测试to_yaml和Marshal的dump相比,后者的性能要显著的优于前者的。
当然yaml更适合人来理解对象的内部结构的,使用场合不同
 
进一步学习:

继续阅读

高效程序员的45个习惯

 

你要不断从自己写的代码中得到反馈,并且使用自动化工具不断地构建(持续集成)和测试系统.在前进过
程中,你都会有意识地修改一些代码:在功能不变的情况下,重新设计部分代码,改善代码的质量.这就是所
谓的重构,它是软件开发中不可或缺的一部分---编码永远没有真正意义上的"结束".
---提高个人编程能力和技艺的重要手段。
    方法:在进度上要为programmer做这个事留出时间。或者大家一起review。其实这才是对leader真正的要求。
 
要以迭代的方式进行工作:确定一小块时间(一周左右)的计划,然后按时完成它们.给客户演示每个迭代的
工作成果,及时得到他们的反馈(这样可以保证方向正确),并且根据实际情况尽可能频繁地发布系统版本
让用户使用.
---虽然感觉很罗嗦,但这能很好的避免客户返工事件的发生。前提是客户能配合,但为了系统的成功,想办法说服之。
    让客户一直加入到团队的开发中,学习他们的业务经验,并且保证项目符合他们的真正需求.
 
敏捷方法只需要一个角色:软件开发者,也就是你.项目需要什么你就做什么,
你的任务就是和紧密客户协作,一起开发软件.敏捷依赖人,而不是依赖于项目中的甘特图和里程表.
---敏捷开发中的人要求全能
 
 
 
 
 
 
 
 
 
 
 

ruby 基本知识学习

1. proc

#Proc.new {|x| puts x}
#|x|就相当于一个变量了,这个变量的值是Proc.call()里传递过来的


greeting = Proc.new {|someone| puts "Hi, #{someone}"}
greeting.call("Lily")    ---输出:Hi,Lily

def add(m)
  return Proc.new {|n| n + m }

  # return lambda {|n| n + m }  ---也可以写成这样,lambda将一个block转化成proc对象
end

add10 = add(10)   --- m = 10
add100 = add(100)   --- m = 100

print "40 + 10 = "
puts add10.call(40)  --- n = 40

print "427 + 100 = "
puts add100.call(427)   --- n = 427

2. closure

闭包:即使block被定义时的环境早就消失了,block仍然可以使用其原始作用域中的信息。

比如上例中的

add10 = add(10)   --- m = 10

puts add10.call(40)  --- n = 40

其实:add10对象就是用10这个参数来构造的,那自然在add10这个实例中始终知道10的存在,

      所以在add10.call()时可以使用10

呵呵,个人理解。和著述不一致:)

 

ubuntu 系统异常

1. 发现了几次系统在休眠状态下假死的现象

2. 今天再次在假死状态下强制重启动之后,

   系统的默认主题,字体,颜色等都不正常了

3. 然后重新启动后,用root用户登录之后,主题字体等是正常的

   然后在切换到日常工作账户下,又变回正常状态

 

chito体验

1. 最好有一个链接能直接返回is-programmer首页

2. 需要有个search bar

3. 在站点主页上感觉像现在这样把所有的文章都单纯的分页显示的话,作为一个viewer

    需要有很好的耐心来逐页浏览的。

    ->没有什么好办法吗? 比如以tag分类等...

4. 如果用户登录后,那么访问其他用户的blog时,会有管理tab显示,但点击后会迁移到自己的后台管理界面

   在访问其他用户的blog时,是不是不显示管理tab比较好呢?

5. 在回复中的头像是不是会自动改变呢?

6. 文章中的外部图片链接不能正常显示

7. 在站点首页中有时不能收录全部的个人blog吗?

8. 在管理界面下的trackback输入框的属性设置不对

    size没有随browser自动调整

9. 使用了一下“提交为页面”的功能,很好。

    而且在提交为页面的基础上还能一键切换回文章。赞一个:)

10.文章标题中单词,在文章页中小写的,在列表页中是大写的

    没啥不好,呵呵

11.希望chito加个mb,能时不时的记下的啥:) (被禁了后才知道原来已经有点依赖了mb~)

 

感受:

1. is-programmer是个小众的bloger,但难能可贵的是小而精;感觉茫茫人海中不约而同的聚在这儿的人,有很多的共同之处...

ubuntu 截屏工具shutter

收joe(http://joe.is-programmer.com/posts/18028.html)的启发,试用shutter工具

安装步骤

1. sudo add-apt-repository ppa:shutter/ppa

2. sudo apt-get update

3. sudo apt-get install shutter

2011.1.21

给ubuntu安装了

1. putty

   sudo apt-get install putty

2. dia

   类似windows下visio的工具

  sudo apt-get install dia

3. sqlite3

   sudo apt-get install sqlite sqlite3

4. sqlitebrowser

   sudo apt-get install sqlitebrowser

 

ubuntu 安装awn,ror

ubuntu下安装awn

在ubuntu下启用avant来实现mac的windows navigator panel效果
   1. 在包管理器中输入avant,勾选avant-windows-navigate-panel来安装
   2. 通过alt+f2来启动 avant-window-navigator
   3. 通过在awn的配置画面中勾选“start awn automatically"来实现自动启动。
 
ubuntu 下安装ror
步骤
1. sudo apt-get install ruby 1.9.2
    但安装之后,ruby -v却是:1.8.7
    估计是命令的用法不对,其实后面的版本号没起作用
2. sudo apt-get install rubygems
    gem -v确认版本 1.3.7
3. 用gem install rails 之后,在gem list下和rails相关的gem都安装好了
    但在命令行下,rails -v仍然报错。“程序 rails 尚未安装"
    改正:在agile web development with rails Fourth edition 中发现在此处正规的做法时用gem来安装rails
                如果安装了之后出现上面的问题,那么需要在用户的 .bashrc文件中追加 
                export PATH=/var/lib/gem/1.8/bin:$PATH
    用上面的方面在.bashrc中追加了export path后,rails -v就正常了。  
    然后用apt-get remove rails 命令来删除用apt-get install的rails 2.3.5

rails resource汇总贴

from http://wiki.jameswu.me/index.php/Ruby

一般性站点

 

英文资源

Rails现实中的应用系统
很有用,至少可以了解到有哪些站点用到了Rails
RoR官方站
既然是官方站点,必然是要经常看看的了
RoR官方教程
相当不错的文档,后面还是需要多多学习
Ruby Enterprise Edition
RoR运行在这个平台上,效率会有很大的提高。
RubyGems
 
Wiki上的RoR
 
RoR API文档
 
RoR的23个应用程序
 
RubyInside
 
Rails Magazine
 
Rails插件
官方的插件平台,可以搜索需要的插件
RubyInstaller
在Windows上使用Ruby,那么安装这个是最为方便的

工具

Html/XML

Nokogiri
一个据说比Hpricot快7倍的库

正则表达式

Ruby正则表达式
这是一个在线的正则表达式分析工具,相当不错
Ruby Expression
Ruby表达式收集,蛮多的
 

单元测试

RSpec
这算是新一代的测试框架了,超越了JUnit

中文资源

官方的中文Ruby论坛
 
JavaEye的Ruby论坛
 
ChinaOnRails
 
Rails小抄
 

编辑器相关

Rails开发工具之Vim
看起来不错,有很多人跟帖,里面有配置好的配置文件
还是得说说vim的强大

 

Rails

主机托管

Rails Machine
 
SoftLayer
看起来更加专业的一个Rails托管主机商,应该比RailsMachine更加强大。因为[1] 英文版版 里面就是从Railsmachine迁移过去的
Capistrano
Rails部署的必然选择,采用这个可以大幅度降低部署工作量

有用链接

Rails性能问题

{|ihower.tw| blog }
台湾的,下面的链接也是这个人写的。这里面关于Rails3的文章很多
Ruby on Rails 實戰手冊
台湾的一份Rails实战手册,相当不凑
http://blog.xdite.net/
另外一个台湾的Rails博客
Rails Cheat Sheet
所有关于Rails的常用命令都将搜罗进来
Capistrano
自动化部署工具
heroku
Rails部署平台

Rails方案

图表类

  1. Rails 图表解决方案汇总 -- 总结得比较全面,基本上已经满足需求

JQuery

rails和jquery ajax的结合

Beginners guide to Jquery + Ruby On Rails




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee