Archive

Archive for July, 2010

Converting a Javascript array to a function arguments list

July 30th, 2010 yakjuly No comments

1.at the beginning, use “eval”, eval is not safe if raise error, it only show something wrong in eval. we should find the real problem by self.

function dynamic_call(func, params){
var tmpArray = [], text = "window[func](";
for(var i=0;i

tmpArray.push("params[ "+ i + "]");
}
text += tmpArray.join();
text += ")"
alert(text)
return eval(text);
}
dynamic_call("alert", ["haha"])

2. another way use apply
apply like call. but apply support array as arguments

window["alert"].apply(window, ["haha"])

window["alert"].call(window, "haha")

// it also work like this

function Model(){

}
Model.alert = function(){
alert("model alert" + arguments[0])
}

Model["alert"].apply(Model, ["haha"])

Categories: javascript Tags:

利用user agent switcher看iphone网页

July 20th, 2010 yakjuly No comments

User Agent Switcher” 是一个firefox add-on。可以模拟iphone,IE客户端浏览网页。

先将User Agent切换为iphone3.0,然后打开gmail和其他的google站点,qq空间站点,我可以看到iphone的界面和网页代码。
my iphone gmail ui

gmail code

可以看出来这个页面基本上没有html,都是靠javascript生成。

gmail list page

Categories: html5 Tags: ,

Haml/Sass 给你的代码洗洗澡吧

July 16th, 2010 yakjuly No comments

Haml :是一种标记语言,它使html代码变的更加简练。

haml:

#profile
  .left.column
    #date= print_date
    #address= current_user.address
  .right.column
    #email= current_user.email
    #bio= current_user.bio

html:

<div id="profile">
  <div class="left column">
    <div id="date"><%= print_date %></div>
    <div id="address"><%= current_user.address %></div>
  </div>
  <div class="right column">
    <div id="email"><%= current_user.email %></div>
    <div id="bio"><%= current_user.bio %></div>
  </div>
</div>

Sass是CSS3的扩展,它让css变得更加有趣

Sass 与Haml是一对活宝。Haml优化了html,Sass则是优化了css。

Sass在css的基础上添加了四种不同的元素,让css写起来更加方便,看起来更加整洁。

Variable

想在不同的地方使用相同的颜色?需要对文本长度计算高度和宽度?Sass支持使用变量和一些基本的计算以及许多有用的功能

scss:

$blue: #3bbfce;
$margin: 16px;

.content-navigation {
  border-color: $blue;
  color:
    darken($blue, 9%);
}

.border {
  padding: $margin / 2;
  margin: $margin / 2;
  border-color: $blue;
}

sass:

$blue: #3bbfce
$margin: 16px

.content-navigation
  border-color: $blue
  color: darken($blue, 9%)

.border
  padding: $margin / 2
  margin: $margin / 2
  border-color: $blue

产生的css:

/* CSS */

.content-navigation {
  border-color: #3bbfce;
  color: #2b9eab;
}

.border {
  padding: 8px;
  margin: 8px;
  border-color: #3bbfce;
}

Nesting

Sass避免重复的写选择器。相同的效果可以用以下的写法。

scss:

table.hl {
  margin: 2em 0;
  td.ln {
    text-align: right;
  }
}

li {
  font: {
    family: serif;
    weight: bold;
    size: 1.2em;
  }
}

sass:

table.hl
  margin: 2em 0
  td.ln
    text-align: right

li
  font:
    family: serif
    weight: bold
    size: 1.2em

产生的css:

/* CSS */

table.hl {
  margin: 2em 0;
}
table.hl td.ln {
  text-align: right;
}

li {
  font-family: serif;
  font-weight: bold;
  font-size: 1.2em;
}

Mixins

比变量更加有用,mixin允许你重复使用大片的CSS,属性以及选择器。你甚至可以给它们传递参数。(类似函数方法)

Scss:

@mixin table-base {
  th {
    text-align: center;
    font-weight: bold;
  }
  td, th {padding: 2px}
}

@mixin left($dist) {
  float: left;
  margin-left: $dist;
}

#data {
  @include left(10px);
  @include table-base;
}

Sass:

@mixin table-base
  th
    text-align: center
    font-weight: bold
  td, th
    padding: 2px

@mixin left($dist)
  float: left
  margin-left: $dist

#data
  @include left(10px)
  @include table-base

产生的CSS:

/* CSS */

#data {
  float: left;
  margin-left: 10px;
}
#data th {
  text-align: center;
  font-weight: bold;
}
#data td, #data th {
  padding: 2px;
}

Selector Inheritance

Sass可以让一个选择器 继承 另一个选择器 除了重复属性外的其他所有的CSS属性(有点绕,就是相当于优先级比较高)。

Scss:

.error {
  border: 1px #f00;
  background: #fdd;
}
.error.intrusion {
  font-size: 1.3em;
  font-weight: bold;
}

.badError {
  @extend .error;
  border-width: 3px;
}

Sass:

.error
  border: 1px #f00
  background: #fdd

.error.intrusion
  font-size: 1.3em
  font-weight: bold

.badError
  @extend .error
  border-width: 3px

产生css:

/* CSS */

.error, .badError {
  border: 1px #f00;
  background: #fdd;
}

.error.intrusion,
.badError.intrusion {
  font-size: 1.3em;
  font-weight: bold;
}

.badError {
  border-width: 3px;
}
更多文章:

Why use HAML (and SASS)? I already know HTML.

Haml And Sass in 15 muntinues (ppt)

Categories: rails Tags:

rails3 !!! Missing the mysql gem. Add it to your Gemfile: gem ‘mysql’, ’2.8.1′

July 16th, 2010 yakjuly No comments

Rails3中 rake db:create 或 rake db:migrate 时出错

rake aborted!
!!! Missing the mysql gem. Add it to your Gemfile: gem 'mysql', '2.8.1'
/usr/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/connection_adapters/mysql_adapter.rb:22:in `mysql_connection'

原因:rails3中使用bundler 管理gem,尽管system中包含gem mysql 仍然报错。

解决:找到rails_app_path下 的 GemFile。添加 gem ‘mysql’

更多:Rails3:使用bundler管理gems

Categories: rails, ruby Tags: ,

Rails3:使用bundler管理gems

July 16th, 2010 yakjuly No comments

bundler 是一套为了 Rails3 所打造的全新 Gem dependencies 管理工具:一套基于 Rubygems 的更高阶套件管理工具,适合让 Application 管理多套 Gems 依存关係的複杂情境。而你在 Rails3 中 (Bundler 不只用在 Rails3,其他例如 Sinatra 或是 Rails2 也都可以使用) 要使用的 Gems,也都必须宣告在它的 Gemfile 裡,没写在裡面的话,就算手动 require 也找不到。这跟已往你可以直接 require 任意 rubygems 不同,在使用 Bundler 的环境中,要 require 什麽 rubygems 必须透过 Gemfile 管理。

Gemfile 的寫法大致如下:

 # 第二个参数可以指定版本
  gem "rails", "3.0.0.beta3" 

  # 如果 require 的档名不同,可以加上 :require
  gem "sqlite3-ruby", :require => "sqlite3"

  # 可以用 Git 当做来源,甚至可以指定 branch, tag 或 ref。
  gem 'authlogic', :git => 'git://github.com/odorcicd/authlogic.git',
                            :branch => 'rails3'

  # 可以直接用电脑裡的其他目录
  gem "rails", :path => '/Users/ihower/github/rails'

  # Group 功能可以让特定环境才会载入
  group :test do
    gem "rspec-rails", ">= 2.0.0.beta.8"
    gem "webrat"
  end

设定好 Gemfile 之后,我们有一些指令可以用:

  • bundle check 可以检查目前缺少哪些 rubygem,然后你可以手动透过 sudo gem install 安装到系统裡。
  • bundle install 安装所有需要的套件。如果系统已经有装了,就用系统的,不然会装到 $BUNDLE_PATH 下,预设是你家目录 ~/.bundle (因此请不要用 sudo 执行 bundle install)。如果来源是 git (例如上述的 authlogic),每次执行 bundle install 就会自动 git pull 更新,十分方便。
  • bundle lock 和 bundle unlock 会做 snapshotting 记录下目前所有套件的版本在 Gemfile.lock,建议这个档桉也一起 commit 出去。适合要佈署或多人开发时,可以确保大家的版本都一致。
  • bundle package 如果你的 Server 没联外网路,或是怕 rubygems.org 连不上,可以用这个指令把所有套件都打包到 vendor/cache 下。基本上,跟以往 Rails 1.X 2.X 时代佈署时会建议你尽量打包依存套件并 commit 出去,在使用 Bundler 后已经大大地不需要了,因为透过 bundle lock 我们就可以确保每台机器上执行的套件版本一致。
  • bundle exec 因为 Bundle 可以说是独立出一个套件环境,所以如果有非 Rails 的指令需要执行,而且你的系统 Gems 又没有安装,那就会需要透过 bundle exec XXX 来执行。例如 bundle exec cucumber。
  • bundle show gem_name 可以查看这个 gem 的目录位置
  • bundle open gem_name 可以用编辑器打开这个 gem 的目录

开发 Rails3 实际用一阵子之后,发现很偏好将套件装成 Gem 了(如果有提供 Gem 版的话),之前 Rails 1.X 2.X 时代会比较喜欢装成 Plugin,因为想说别人要装 Gem 可能会有问题,以及佈署也怕出包。但是有了 Bundler 之后,只要 Bundle install 就可以装好并确保大家的版本一致会动。不像已往的 rake gems:install 超不可靠。可以透过 Bundle 装这些依存套件也减少了需要 commit 出去的 vendor/plugin 档桉,让你的专桉 repository 变乾淨了。另外,我也超喜欢的 Bundler 可以支援 Git 来源,只要 bundle install 就会更新,不需要额外的管理工具去烦恼更新 plugins。

其他推荐阅读:

转至:http://ihower.tw/blog/archives/4464

Categories: rails, ruby Tags: