Jquery 表格工具 — 2dc_jqgrid————–

Posted by wosmvp on May 24th, 2009 filed in Plugin, Rails应用, web前端技术, 敏捷开发, 测试方法
Comment now »

它整合了 InPlaceEdit分页搜索,添加,删除等功能,甚至还可以处理附属关系的表格

功能不可谓不强大,但代码却是来的简单的很!

————————–

- Ajax enabled
- Sorting
- Pagination
- Search
- CRUD operations (add, edit, delete)
- Multi-selection (checkboxes)
- Master-details
- Themes
- And more ...
--------------

The jQuery grid plugin is an amazing Javascript project providing multi-functions Ajax datagrids for your web applications.简而言之,居家旅行杀人放火逃命跳墙之必备良品!

在官方文档面前,任何其它文档都是失色的 http://www.2dconcept.com/jquery-grid-rails-plugin

在这里就不无聊的敷述一下过程了

简单的谈几其它个问题:

1,它的例子代码太“重量级”:

针对它第一个例子方法的优化:

原方法:

users = User.find(:all) do
    if params[:_search] == "true"
      pseudo    =~ "%#{params[:pseudo]}%" if params[:pseudo].present?
      firstname =~ "%#{params[:firstname]}%" if params[:firstname].present?
      lastname  =~ "%#{params[:lastname]}%" if params[:lastname].present?
      email     =~ "%#{params[:email]}%" if params[:email].present?
      role      =~ "%#{params[:role]}%" if params[:role].present?
    end
    paginate :page => params[:page], :per_page => params[:rows]
    order_by "#{params[:sidx]} #{params[:sord]}"
  end

修改后:

users = User.find(:all) do |x|
    if params[:_search] == "true"
       [:pseudo,:firstname,:lastname,:email,:role].map do |m|
           x.send(m) =~ "%#{params[m]}" if params[m].presend?
       end
    end
    paginate :page => params[:page], :per_page => params[:rows]
    order_by "#{params[:sidx]} #{params[:sord]}"
end

2, 第二个问题就是如果你上面的order_by排序排字字段使用了SQL的关键字会出现问题的!
上解决方案:
order_by “`#{params[:sidx]}` #{params[:sord]}” if
!params[:sidx].blank?

3,上我自己做的中文翻译 :) 点击下载
你需要修改javascripts/jqgrid/jquery.jqGrid.js第10行附近来使用此中文翻译

并且我还修改了源码 vendor/plugins/2dc_jqgrid/lib/2dc_jqgrid.rb第233行,将其中的caption “Search” 修改为“搜索”
(PS:我知道偷偷修改源码,这是很不好的的做法,那怕是字符串的修改,但实在没有找到更优雅一点的办法,有时间再深入它的源码看看吧 :)


Nginx + Passenger 开发Rails应用

Posted by devon on May 22nd, 2009 filed in Rails应用
1 Comment »

在Rails开发过程中,如果同时开发多个项目,需要经常切换,使用 script/server 去启动应用会比较麻烦,而采用nginx(或apache) + passenger可以节约时间,提高效率。

1、安装passenger
下载Passenger,目前最新的版本为2.2.2,并解压到passenger的安装目录:

1
2
tar xzvf passenger-2.2.2.tar.gz /usr/local/passenger
./passenger-2.2.2/bin/passenger-install-nginx-module

按提示操作安装nginx与passenger。

也可以通过gem方式来安装:

1
2
gem install passenger
passenger-install-nginx-module

2、配置nginx
/usr/local/nginx/conf/nginx.conf,在http段加上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http{
	...
	passenger_root /usr/local/passenger;
	passenger_ruby /usr/local/bin/ruby;
 
	server {
		listen 80;
		server_name app1;
		root /Users/jack/app1/public;
		passenger_enabled on;
		rails_env development;
   	}
 
	server {
		listen 80;
		server_name app2;
		root /Users/jack/app2/public;
		passenger_enabled on;
		rails_env development;
   	}
	...
}

3、启动与停止nginx的命令

假设nginx安装在/usr/local/nginx目录里。将如下命令加到~/.bashrc(linux)、 ~/.bash_profile(Mac)

1
2
3
alias sn='sudo /usr/local/nginx/sbin/nginx' 
alias kn='sudo kill `cat /usr/local/nginx/logs/nginx.pid `' 
alias rn='kn; sn'

4、增加应用的host到/etc/hosts,如:

1
2
127.0.0.1 app1
127.0.0.1 app2

这样,在开发时,可以在浏览器中,直接用app1, app2去访问各个应用,再也不用去script/server之类的了。


Leopard为不同的应用程序保留输入法状态

Posted by devon on February 11th, 2009 filed in Uncategorized
1 Comment »

Mac 10.5(Leopard)去掉了为单独窗口设置单独输入法的选项,取而代之的是全局输入法,需要不停的切换切换切换,很不方便。(这个功能在tiger上还可以使用的)

用inputswitcher可以替换的实现这个功能。步骤为:

  1. 下载并安装 SIMBL
  2. 下载 inputswitcher , 并解压
  3. InputSwitcher.app → /Applications
  4. InputSwitcherClient.bundle → /Library/Application Support/SIMBL/Plugins
  5. 启动InputSwitcher.app,并重启其它应用程序,就可以为不同的应用程序窗口保留输入法状态了。

参考:http://limechat.net/inputswitcher/


ruby on rails dictionary for macosx

Posted by devon on February 8th, 2009 filed in Plugin
Comment now »

在Dictionary中搜索API。

使用方法:

  • 下载文档
  • 解压至~/Library/Dictionaries/ 或 /Library/Dictionaries/
  • 打开Dictionary → Preferences, 选中ruby, 并拖至最顶点,这样,就可以spotlight来搜索API了。


Satellite: a self-syncing distributed wiki

Posted by HoLin on January 22nd, 2009 filed in Ruby应用
Comment now »

介绍

satellite is a self-syncing distributed wiki with file uploads and all sorts of other useful features like offline editing.

主要的特性有:

  • textile的wiki语法
  • 支持文件上传
  • 所有文档基于git存储与管理
  • 离线编辑,并可自动同步到服务器
  • 支持代码高亮
  • 全面快捷键支持

经我们测试,用于个人知识管理,非常棒。

安装

  • 安装 Git! (and Ruby)
  • 获取代码,原始代码在”这里”:http://github.com/kenpratt/satellite/tree/master ,我们fork出了一个版本(http://github.com/holin/satellite/tree/master),根据中文环境和自己的实际需求增加了一些功能,具体看 satellit扩展功能
1
$ git clone git@github.com:holin/satellite.git satellite
  • 安装gems, {color:red}注意 ,rack要求使用0.4版本(其它版本未完整测试,最新的0.9rack不能用)
1
2
3
4
$ sudo gem install rack mongrel metaid erubis RedCloth coderay
 $ cd path/to/satellite
 $ git submodule init
 $ git submodule update
  • 配置应用,下方其他中有公开git repository申请说明
1
cd path/to/satellite
  • edit conf/production.rb
  • production.rb example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# production configuration
 
# URI of master git repository for wiki content
config.master_repository_uri = 'git+ssh://repo.or.cz/srv/git/pkmh.git'
 
# user information to use for git content submissions
config.user_name = 'holin'
config.user_email = 'holin@example.com'
 
# logging level (:error, :warn, :info, :debug)
config.log_level = :warn
 
# automatically reload app when app files change? (for development)
config.auto_reload = true
  • 启动server
1
2
3
$ bin/start_satellite  
** Starting Satellite_2
** Satellite_2 is now running at http://0.0.0.0:4000/
  • 访问http://localhost:4000/

配置文件,initialize中的配置都可以在production.rb里面通过config.xxx = ??? 来配置

  • lib/configration.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def initialize
    # defaults values
    self.app_name               = 'Satellite'
    self.server_ip              = '0.0.0.0'
    self.server_port            = 7000
    self.master_repository_uri  = ''
    self.user_name              = ''
    self.user_email             = ''
    self.sync_frequency         = 60
    self.app_dir                = File.join(File.dirname(File.expand_path(__FILE__)), '../')
    self.conf_dir               = File.join(app_dir, 'conf')
    self.template_dir           = File.join(app_dir, 'templates')
    self.static_dir             = File.join(app_dir, 'static')
    self.log_dir                = File.join(app_dir, 'log')
    self.data_dir               = File.join(app_dir, 'data')
    self.log_level              = :info
    self.log_file_name          = 'app.log'
    self.auto_reload            = false
    self.prettify_exceptions    = true
    self.max_upload_filesize    = 200
    self.authentication         = false
    self.authenticator          = nil
  end

Mac下配置开机启动

  • 下载 Lingon
  • 写启动server脚本satellite.sh
1
2
3
4
5
#!/bin/sh
 
export PATH=/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:/Applications/:$PATH
 
cd /Users/devon/wiki && bin/start_satellite
  • 运行Lingon,配置User Deamon
  • 注销,并重新登录。测试是否正确配置

其他


shoulda on rails

Posted by HoLin on January 7th, 2009 filed in Rails应用, 敏捷开发, 测试方法
2 Comments »

在新项目中配置shoulda

1
2
3
4
5
6
7
rails shoulda_demo -d mysql
cd shoulda_demo/
 
script/plugin install git://github.com/thoughtbot/shoulda.git
sudo gem install thoughtbot-factory_girl --source http://gems.github.com
script/plugin install git://github.com/technicalpickles/factory_girl_on_rails.git
script/plugin install git://github.com/hardbap/coulda.git

测试model

生成model

1
script/generate coulda_model subject

写测试代码,编辑文件 test/unit/subject_test.rb

1
2
3
4
5
6
require File.dirname(__FILE__) + '/../test_helper'
 
class SubjectTest < ActiveSupport::TestCase
  should_have_many :questions
  should_require_attributes :name
end

运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
FF.............
Finished in 0.301899 seconds.
 
  1) Failure:
test: Subject should have many questions. (SubjectTest)
    ...:
Subject does not have any relationship to questions.
<nil> is not true.
 
  2) Failure:
test: Subject should require name to be set. (SubjectTest)
    ...:
Subject allowed nil as a value for name.
<false> is not true.
 
15 tests, 28 assertions, 2 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.434793 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"  
Errors running test:units!

出错,编辑文件 app/models/subject.rb 来让测试通过

1
2
3
4
class Subject < ActiveRecord::Base
  has_many :questions
  validates_presence_of :name
end

再次运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
E..............
Finished in 0.333493 seconds.
 
  1) Error:
test: Subject should have many questions. (SubjectTest):
NameError: uninitialized constant Question
    ...
 
15 tests, 31 assertions, 0 failures, 1 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.460992 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"  
Errors running test:units!

还是通不过,新建question model

1
2
3
4
5
6
7
8
9
HoLin:tiku holin$ script/generate coulda_model question
      exists  app/models/
      exists  test/unit/
      exists  test/factories/
      create  app/models/question.rb
      create  test/unit/question_test.rb
      create  test/factories/question_factory.rb
      exists  db/migrate
      create  db/migrate/20090107064242_create_questions.rb

运行测试

1
2
3
4
5
HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
You have 1 pending migrations:
  20090107064242 CreateQuestions
Run "rake db:migrate" to update your database then try again.

需要先完成所有的Migration,那就完成他们吧。

1
2
3
4
5
6
HoLin:tiku holin$ rake db:migrate
(in /Users/holin/work/kuxuesoft/tiku)
==  CreateQuestions: migrating ================================================
-- create_table(:questions)
   -> 0.0347s
==  CreateQuestions: migrated (0.0351s) =======================================

再运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/question_test.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.323642 seconds.
 
15 tests, 32 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.438684 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"

通过测试

测试controller

生成controller

1
2
3
4
5
6
7
8
HoLin:tiku holin$ script/generate controller subjects
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/subjects
      exists  test/functional/
      create  app/controllers/subjects_controller.rb
      create  test/functional/subjects_controller_test.rb
      create  app/helpers/subjects_helper.rb

编写测试代码,编辑文件test/functional/subjects_controller_test.rb

1
2
3
4
5
6
7
8
9
10
require 'test_helper'
 
class SubjectsControllerTest < ActionController::TestCase
 
  context "on POST to :create" do
    setup { post :create, :subject => {:name => 'CET-6', :desc => 'description goes here' } }
    should_assign_to :subject
    should_redirect_to "subject_url(@subject)" 
  end
end

运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
..........FE.....
Finished in 0.603312 seconds.
 
  1) Failure:
test: on POST to :create should assign @subject. (SubjectsControllerTest)
    [...]:
The action isn't assigning to @subject.
<nil> expected to not be nil.
 
  2) Error:
test: on POST to :create should redirect to "subject_url(@subject)". (SubjectsControllerTest):
NoMethodError: undefined method `subject_url' for #<SubjectsControllerTest:0x227f428>
    ...
 
17 tests, 28 assertions, 1 failures, 1 errors
rake aborted!
Command failed with status (1): [/usr/local/bin/ruby -Ilib:test "/usr/local...]
 
(See full trace by running task with --trace)

添加routes

1
map.resources :subjects

运行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
..........FE.....
Finished in 0.536594 seconds.
 
  1) Failure:
test: on POST to :create should assign @subject. (SubjectsControllerTest)
    [...]:
The action isn't assigning to @subject.
<nil> expected to not be nil.
 
  2) Error:
test: on POST to :create should redirect to "subject_url(@subject)". (SubjectsControllerTest):
ActionController::RoutingError: subject_url failed to generate from {:controller=>"subjects", :action=>"show", :id=>nil}, expected: {:controller=>"subjects", :action=>"show"}, diff: {:id=>nil}
    ...
 
17 tests, 28 assertions, 1 failures, 1 errors
rake aborted!
Command failed with status (1): [/usr/local/bin/ruby -Ilib:test "/usr/local...]
 
(See full trace by running task with --trace)

编辑app/controllers/subjects_controller.rb, 增加create action

1
2
3
4
5
6
7
8
9
10
11
12
13
class SubjectsController < ApplicationController
 
  def create
    @subject = Subject.new(params[:subject])
    if @subject.valid? && @subject.save
      flash[:message] = "添加成功"
      redirect_to subject_url(@subject)
    else
      render :action => 'new'
    end
  end
 
end

运行测试

1
2
3
4
5
6
7
8
9
HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.................
Finished in 0.687698 seconds.
 
17 tests, 29 assertions, 0 failures, 0 errors

测试通过

测试需要登陆的操作、嵌套context

编写测试代码,编辑文件test/functional/subjects_controller_test.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
require 'test_helper'
 
class SubjectsControllerTest < ActionController::TestCase
 
  context "do these after logged in" do
 
    setup {
      @request.session[:user_id] = User.first.id
    }
 
    context "on POST to :create" do
      setup { 
        post :create, :subject => {:name => 'CET-6', :desc => 'description goes here' } 
      }
      should_assign_to :subject
      should_redirect_to "subject_url(@subject)"
    end
 
    context "on POST to :create without subject name" do
      setup { 
        post :create, :subject => {:desc => 'description goes here' } 
      }
      should_assign_to :subject
      should_redirect_to "new_subject_url"
    end
 
  end
end

运行测试

1
2
3
4
5
6
7
8
9
HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...................
Finished in 0.572731 seconds.
 
19 tests, 31 assertions, 0 failures, 0 errors

参考资源


Git服务器安装

Posted by devon on January 6th, 2009 filed in 源代码管理
Comment now »

Git on Ubuntu Server

安装Git-Core:

1
2
3
4
sudo apt-get update # 可选步骤
sudo apt-get dist-upgrade # 可选步骤
 
sudo apt-get install git-core

因为要用到 Gitosis ,所有,需要安装python setuptools

1
sudo apt-get install python-setuptools

安装 Gitosis

1
2
3
4
5
6
mkdir ~/src
cd ~/src
git clone git://eagain.net/gitosis
 
cd gitosis
sudo python setup.py install

增加名为Git的用户

1
sudo adduser --system --shell /bin/sh  --gecos 'git version control' --group --disabled-password --home /home/git git

上传公钥到USER用户的根目录下(如果没有,用 ssh-keygen -t rsa 生成)

1
2
3
scp .ssh/id_rsa.pub USER@YOUR_SERVER:
sudo -H -u git gitosis-init < /home/USER/id_rsa.pub
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

到这一步,基本上都安装好了,到本地进行测试:

1
git clone git@YOUR_SERVER:gitosis-admin.git

成功后,在本地将有一个gitosis-admin目录,里面有gitosis.conf,keydir。

为Rails项目配置git
打开gitosis.conf,增加一块内容,members为某个用户的公钥~/.ssh/id_rsa.pub中的名字(在该文件的最后在)

1
2
3
[group myrailsapp]
members = vince@urbanpuddle
writable = myrailsapp

然后,提交修改

1
2
git commit -a -m "created a new repository"
git push

将本地代码提交到git中

1
2
cd myrailsapp
git init

创建 .gitignore 文件,用于忽略某些不需要进行代码管理的内容

1
2
3
4
5
.DS_Store
log/*.log
tmp/**/*
config/database.yml
db/*.sqlite3

提交代码

1
2
3
4
git remote add origin git@YOUR_SERVER:myrailsapp.git
git add .
git commit -a -m "initial import"
git push origin master:refs/heads/master

接下来,可以增加成员的公钥到系统中了

1
2
3
4
cd gitosis-admin
cp ~/alice.pub keydir/
cp ~/bob.pub keydir/
git add keydir/alice.pub keydir/bob.pub

修改gitosis.conf

1
2
3
4
[group myteam]
- members = jdoe
+ members = jdoe alice bob
  writable = free_monkey

提交修改

1
2
git commit -a -m "Granted Alice and Bob commit rights to FreeMonkey"
git push

其它成员就可以获取代码了

1
git clone git@YOUR_SERVER:myrailsapp.git

请参考 Hosting Git repositories, The Easy (and Secure) Way

原文请参考 : http://enjoyrails.com/wikis/Git安装


Rails中检测SWF尺寸

Posted by devon on January 5th, 2009 filed in Rails应用
Comment now »

安装:

1
2
cd vendor/plugins
svn export http://ruby-imagespec.googlecode.com/svn/trunk/ image_spec

使用:

1
2
3
4
image = ImageSpec::Dimensions.new('/path/to/your/file')
 
image.width
image.height

例子:

1
2
3
4
5
6
>> image = ImageSpec::Dimensions.new("#{RAILS_ROOT}/a.swf")
=> #<ImageSpec::Dimensions:0x2570d94 @height=670, @width=868>
>> image.width
=> 868
>> image.height
=> 670


页面调用flash文件之路径问题(IE)

Posted by wengjian on January 4th, 2009 filed in web前端技术
Comment now »

今天发现一个很诡异的问题 :
页面调用一个swf文件(该文件在kecheng.example.net/courses 这个目录下),该swf文件内部as调用其他的swf文件(文件在其他的域名目录下,跟页面调用的那个swf文件不在同目录下),在ie下 第一次可以调用 刷新后无法调用。
(页面地址:http://kecheng.example.net/courses/flash_s/4)

调用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
function show_flash(swf_url) {
	var so = new SWFObject(swf_url,'aa','710','532','8','#ffffff'); 
	so.addParam('allowscriptaccess','always'); 
	so.addParam('wmode','transparent'); 
	var base_url = swf_url.replace(/\/[^/]*$/, '/')
	so.addParam('base', base_url); 
	so.addParam('allowfullscreen','true'); 
	so.addVariable('width','710'); 
	so.addVariable('height','532'); 
	so.write('flash_viewer'); 
}
 
show_flash('');

查询adobe网站查到 有base这个属性 (官网地址)
base - . or [base directory] or [URL]. Specifies the base directory or URL used to resolve all relative path statements in the Flash Player movie. This attribute is helpful when your Flash Player movies are kept in a different directory from your other files.

这个属性可以指定as调用swf文件的相对路径的路径基准.
例如: a.swf文件处于 www.aa.com/kecheng 下,b1.swf、b2.swf 2个文件处于www.bb.com/kecheng 下其中b1.swf文件as代码调用b2.swf文件 。在www.aa.com/kecheng下的a.swf文件调用b1.swf文件 ,如果不加base这个属性的话 b1.swf是调用不到b2.swf这个文件的(因为b2.swf文件的路径已经变成www.aa.com/kecheng 了) 加上属性 就可以指定其相对路径的基准是www.bb.com/kecheng 这样就可以调用到b2.swf文件了。
但是在IE6.7下刷新页面后b2.swf文件就调用不到了 使用iewatch 发现页面刷新后b2.swf的路径已经变成www.aa.com/kecheng了,base属性在ie下失效了,但是删除ie临时文件又可以了,然后刷新又不可以了。
通过iewatch 观察后,发现可能是ie缓存的问题 ,就在调用地址上加了上一个随机数字

1
show_flash('?'+ Math.random());

问题解决。

此问题非常诡异,虽然解决了,但是更深层次的原因还是没弄明白,望哪位高手解释下!


Git一分钟教程

Posted by devon on December 31st, 2008 filed in 源代码管理
Comment now »

流程:取代码 → 每次工作前更新代码到最新版本 → 修改代码 → 提交代码到服务器

取代码及修改全局设置

设置用户名与邮箱

1
2
git config --global user.name "My Name"
git config --global user.email "my@email.com"

从已有的git库中提取代码

1
git clone git@server:app.git myrepo

每次更改代码的操作

更新本地代码到最新版本(需要merge才能合到本地代码中)

1
git fetch

合并更新后的代码到本地

1
git merge

更新代码方式的另一种方法(git pull是git fetch和git merge命令的一个组合)

1
git pull

修改代码后,查看已修改的内容

1
git diff --cached

将新增加文件加入到git中

1
git add file1 file2 file3

从git中删除文件

1
2
git rm file1
git rm -r dir1

提交修改

1
git commit -m 'this is memo'

如果想省掉提交之前的 git add 命令,可以直接用

1
git commit -a -m 'this is memo'

commit和commit -a的区别, commit -a相当于:

  • 第一步:自动地add所有改动的代码,使得所有的开发代码都列于index file中
  • 第二步:自动地删除那些在index file中但不在工作树中的文件
  • 第三步:执行commit命令来提交

提交所有修改到远程服务器,这样,其它团队成员才能更新到这些修改

1
git push

其它常用命令

显示commit日志

1
git log

不仅显示commit日志,而且同时显示每次commit的代码改变。

1
git log -p

回滚代码:

1
git revert HEAD

你也可以revert更早的commit,例如:

1
git revert HEAD^

将branchname分支合并到当前分支中。(如果合并发生冲突,需要自己解决冲突)

1
git merge branchname

解决冲突

当merge命令自身无法解决冲突的时候,它会将工作树置于一种特殊的状态,并且给用户提供冲突信息,以期用户可以自己解决这些问题。当然在这个时候,未发生冲突的代码已经被git merge登记在了index file里了。如果你这个时候使用git diff,显示出来的只是发生冲突的代码信息。

在你解决了冲突之前,发生冲突的文件会一直在index file中被标记出来。这个时候,如果你使用git commit提交的话,git会提示:filename.txt needs merge

在发生冲突的时候,如果你使用git status命令,那么会显示出发生冲突的具体信息。

在你解决了冲突之后,你可以使用如下步骤来提交:

第一步(如果需要增加文件):

1
git add file1

第二步:

1
git commit