如何摧毁Rails中的元素

##Destroy##
我们往往会生成比如controller,model或是db 文件,但后来发现我们不需要了,想重来,怎么办呢?
所以我们需要destroy

##删除model或是controller##

1
rails destroy model MODEL_NAME|CONTROLLER_NAME

##删除db:migration##

1
rails d migration MIGRATION_NAME

TDD:spec_helper

Rails 有自带的Test框架,当我们不使用本身框架的时候则在创建controller的时候加入 --no-test-framework

RSpec 生成器

1
rails g rspec:install

集成測試

1
$ rails generate integration_test static_pages

根據http://railstutorial-china.org/chapter3.html 中例子,在做TDD環節的時候會說找不到visit這個方法,原因並不是你沒有capybara,而是之前你沒有加載,所以需要修改spec/spec_helper.rb

spec/spec_helper.rb
1
2
3
4
5
require 'capybara/rails'
require 'capybara/rspec'
include Capybara::DSL
.....
config.include Capybara::DSL

Rails little note 1

##rails cli##
Active Record 支持的数据类型

  • :binary
  • :boolean
  • :date
  • :datetime
  • :decimal
  • :float
  • :integer
  • :primary_key
  • :string
  • :text
  • :time
  • :timestamp

###rails migration###

Migration 是继承 ActiveRecord::Migration 的一个子类,它实现了两个方法: up (执行需要的改变)和 down (恢复所做的改变)
Active Record 提供以下独立于数据库的方法,用来执行普通数据定义任务的方法:

  • add_colmn
  • add_index
  • change_column
  • change_table
  • create_table
  • create_join_table
  • drop_table
  • remove_column
  • remove_index
  • rename_column
ruby 创建一个migration
1
rails generate migration MIGRATION_NAME

使用up/down方法
Migration里面的down方法能复原up方法所造成的变更。也就是说如果执行了up然后 再执行down,那么数据库的schema应该会没有改变。所以说,如果用up建立一个数据表, 就应该在down方法中删除它。明智的做法会使用跟up完全相反的顺便来做这些事情。

回滚(Rolling Back)
另一个常见的任务是回滚最后一个版本。比如你不小心打错了要修正。输入回滚命令时可以 不用输入先前版本的版本号,直接这样就行了:

1
$ rake db:rollback

这样会执行最后一个migration的down方法。如果要恢复多个migrations的话,可以多给 一个STEP参数:

1
$ rake db:rollback STEP=3

这样会执行最后3个migrations的down方法。

要回滚然后重新执行最后一个migration的话可以直接执行db:migrate:redo。如果要回滚 重新执行的不止一个版本时可以用STEP参数,就跟db:rollback的用法一样:

1
$ rake db:migrate:redo STEP=3

这两个rake任务只是用起来比较方便,让你可以不用输入一大串版本号数字。除了输入比较 方便外没有比db:migrate多做什么额外的工作。

4.2 重置数据库
最后是db:reset任务,它会删除数据库,然后重新建立数据库并在重新建立的数据库中 载入当前的schema。

所谓的载入schema跟执行全部的migrations是不一样的,请参照: schema.rb 。

4.3 执行指定的migration
如果你需要执行一个指定的migration的up或down方法,那么你可以用db:migrate:up和 db:migrate:down这两个任务。你只需指定版本号,就可以触发它的up或down方法:

1
$ rake db:migrate:up VERSION=20080906120000

以上会执行20080906120000这个版本的migration的up方法。它会去确认这个migration之前有 没有跑过,所以,如果Active Record认为20080906120000已经跑过,那么执行 db:migrate:up VERSION=20080906120000将不会做任何操作。

###rails 删除控制器###

1
rails destroy

vim-split 分屏显示

关于vim分屏编辑

  • vim -o file1 file2:水平分割窗口,同时打开file1和file2

  • vim -O file1 file2:垂直分割窗口,同时打开file1和file2

水平显示

  • :split(:sp) – 把当前窗水平分割成两个窗口。(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在终端下,CTRL-S可能会冻结终端,请按CTRL-Q继续。
  • :split filename – 水平分割窗口,并在新窗口中显示另一个文件。
  • :nsplit(:nsp) – 水平分割出一个n行高的窗口。
  • :[N]new – 水平分割出一个N行高的窗口,并编辑一个新文件。 (CTRL-W n或 CTRL-W CTRL-N)
  • ctrl+w f –水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 。
  • C-w C-^ – 水平分割一个窗口,打开刚才编辑的文件。

垂直显示

  • :vsplit(:vsp) – 把当前窗口分割成水平分布的两个窗口。 (CTRL-W v或CTRL CTRL-V)
  • :[N]vne[w] – 垂直分割出一个新窗口。
  • :vertical 水平分割的命令: 相应的垂直分割。

关闭子窗口

  • :qall – 关闭所有窗口,退出vim。
  • :wall – 保存所有修改过的窗口。
  • :only – 只保留当前窗口,关闭其它窗口。(CTRL-W o)
  • :close – 关闭当前窗口,CTRL-W c能实现同样的功能。 (象 :q :x同样工作 )

调整窗口大小

  • ctrl+w + –当前窗口增高一行。也可以用n增高n行。
  • ctrl+w - –当前窗口减小一行。也可以用n减小n行。
  • ctrl+w _ –当前窗口扩展到尽可能的大。也可以用n设定行数。
  • :resize n – 当前窗口n行高。
  • ctrl+w = – 所有窗口同样高度。
  • n ctrl+w _ – 当前窗口的高度设定为n行。
  • ctrl+w < –当前窗口减少一列。也可以用n减少n列。
  • ctrl+w > –当前窗口增宽一列。也可以用n增宽n列。
  • ctrl+w | –当前窗口尽可能的宽。也可以用n设定列数。

切换和移动窗口

如果支持鼠标,切换和调整子窗口的大小就简单了。

  • ctrl+w ctrl+w: 切换到下一个窗口。或者是ctrl+w w。
  • ctrl+w p: 切换到前一个窗口。
  • ctrl+w h(l,j,k):切换到左(右,下,上)的窗口。
  • ctrl+w t(b):切换到最上(下)面的窗口。
  • ctrl+w H(L,K,J): 将当前窗口移动到最左(右、上、下)面。
  • ctrl+w r:旋转窗口的位置。
  • ctrl+w T: 将当前的窗口移动到新的标签页上。

RHCE TEST 2012

考试环境:

  • 考试为上机考试。
  • 在一台真实机系统中,已经预安装好虚拟机,要求所有的考试题必须在虚拟机中完成。
  • 必须按要求配置好网络。
  • 在iptables配置中如需要拒绝访问,请使用REJECT(考试过程中iptables默认策略均为ACCEPT)
  • 考试过程中,可以选择语言环境为繁体中文

注意:

  • 所有的光盘中的软件包已经在http://instructor.example.com/pub/rhel6/dvd
  • 你可以用真实机来验证虚拟机中的考试实验是否正确完成.
  • example.com 域所在网络是192.168.0.0/24; cracker.com域所在的网络是172.16.0.0/16,一般在题意中被要求拒绝的网络。

RHCSA考试题:

  • 配置好你的主机名,ip地址,网关,DNS,要求: 同样可以通过setup命令进行修改
  • 主机名:serverX.example.com
  • IP:192.168.0.100+X/24
  • 网关:192.168.0.254
    修改/etc/hosts;/etc/sysconfig/network;/etc/sysconfig/network-script/ifcfg-eth0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DNS:192.168.0.254

    修改hosts文件_vim /etc/hosts_
    192.168.0.XserverX.example.com

    修改ifcfg-layouteth0 vim /etc/sysconfig/network-scripts/ifcfg-eth0
    IPADDR=192.168.0.X
    NETMASK=255.255.255.0
    GATEWAY=192.168.0.254
  • 添加3个用户
  • 用户harry,natasha,tommy
  • 要求harry,natasha用户的附加组为admin组,tommy用户的登陆shell为非交互式shell。
    1
    2
    3
    4
    $ groupadd admin;useradd -G admin harry; useradd -G admin natasha; useradd -s /sbin/nologin tommy
    $ groupadd admin;
    $ useradd harry; useradd natasha; useradd -s /sbin/nologin tommy;
    $ groupmens -g admin -a harry; groupmens -g admin -a natasha;
  • 在/home下创建一个目录
  • 目录名为admins
  • 要求所属组为admin组
  • 组成员可以读写,其它用户没有任何权限
  • 同组成员在目录下创建的文件的所属组也为admin组
1
2
3
4
mkdir /home/admins;
chgrp admin /home/admins
chmod 2770 /home/admins
chmod 3770 /home/admins
  • 以用户harry的身份配置任务计划
  • 每天的14:23分,执行echo hello 命令
    1
    2
    3
    crontab -u harry -e;
    23 14 * * * echo hello
    chkconfig crond on;#check crond status
  • 找出harry拥有的文件,拷贝到目录/opt/dir下

    1
    find / -user harry -type f -exec cp -rfp {} /opt/dir/ \;
  • 从文件/root/install.log中找出包含core的行,写入到文件/tmp/testfile中,要求顺序与/root/install.log中一致

    1
    cat install.log |grep core > /tmp/testfile
  • 创建一个100M的交换分区,并开机自动生效,但不影响原有的swap分区

    1
    2
    3
    4
    fdisk /dev/vda; mkswap /dev/vdaX; swapon /dev/vdaX;partprobe;
    /etc/fstab:
    uuid="...." swap swap defaults 0 0
    check swap: swapon -s

mamp1.9.5 mysql5.59 and Ruby mysql2

Unfortunately, the most reecent MAMP version (as of March 2011) has upgraded from MySQL 5.1 to MySQL 5.5. And MySQL, in turn, has switched from GNU Make (with ./configure) to CMake (with cmake .).

  • Download Source http://sourceforge.net/projects/mamp/files/mamp/
  • Unzip Source and copy mysql-5…..tar.gz
  • cli:

    1
    2
    3
    4
    5
    6
    7
    8
    class="brush :shell"
    $ cd /tmp
    $ mv /Users/yourname/Desktop/mysql-5.5.9.tar.gz .
    $ tar xf mysql-5.5.9.tar.gz
    $ cd mysql-5.5.9
    $ sudo port install cmake
    $ cmake . -DMYSQL_UNIX_ADDR=/Applications/MAMP/tmp/mysql/mysql.sock \
    -DCMAKE_INSTALL_PREFIX=/Applications/MAMP/Library
  • 修改编译出错的文件 unittest/mysys/my_atomic-t.c

1
2
3
4
5
6
7
int64 b=0x1000200030004000LL;
a64=0;

/*my_atomic_add64(&a64, b);

ok(a64==b, "add64"); 注释这段代码*/
ok(1, "add64"); /* 添加这句代码,目的是直接返回测试成功结果 */
  • 编译源代码

    1
    $ make -j 3
  • 复制编译好的文件

    1
    2
    3
    $ cp libmysql/*.dylib /Applications/MAMP/Library/lib/
    $ mkdir -p /Applications/MAMP/Library/include/mysql
    $ cp include/* /Applications/MAMP/Library/include/mysql
  • 开始安装mysql

    1
    2
    3
    4
    5
    6
    7
    $ sudo env ARCHFLAGS="-arch x86_64" gem install mysql2 -- \
    --with-mysql-config=/Applications/MAMP/Library/bin/mysql_config
    $ sudo install_name_tool -change \
    /tmp/mysql-5.5.9/libmysql/libmysqlclient.16.dylib \
    /Applications/MAMP/Library/lib/libmysqlclient.16.dylib \
    /opt/local/lib/ruby/gems/1.8/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle
    $ rm -rf /tmp/mysql-5.5.9 /tmp/mysql-5.5.9.tar.gz:
  • TIPS: 使用macport安装.

    1
    $ sudo port install rb-mysql

git常用命令

#建立代码仓库

##仓库初始化
init config

1
$ git init

##当前目录被称为工作树

1
2
$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email you@yourdomain.example.com

设置用户名和邮箱,此信息会保存在每次commit的log中,使用git log察看
常用操作
add commit revert

1
$ git add .

将当前目录生成一个快照放到一个临时存储区域,创建索引

1
2
$ echo "zh" > .gitignore
$ git add .

忽略zh目录,不要放到当前缓存中更新
有关 gitignore 文件的诸多细节知识可阅读其使用手册: $ man gitignore

1
$ git commit

将索引中的代码提交,可选参数-m ‘messages’可以增加备注信息,
如果不指定则调用默认的编辑器编辑message

1
$ git revert filename

从代码库中恢复某个文件

##查看日志
log show

1
$ git log

##查看项目的更新记录

1
$ git log --stat --summary

#查看每一次版本的大致变动情况

##项目版本的更新细节:

1
$ git show dfb02e6e4f2f7b573337763e5c0013802e392818

##后面的值为版本号
除了使用完整的版本号查看项目版本更新细节之外,也还可以使用以下方式:

1
2
$ git show dfb02 # 一般只使用版本号的前几个字符即可
$ git show HEAD # 显示当前分支的最新版本的更新细节

每一个项目版本号通常都对应存在一个父版本号,也就是项目的前一次版本状态。
可使用如下命令查看当前项目版本的父版本更新细节:

1
2
3
$ git show HEAD^ # 查看 HEAD 的父版本更新细节
$ git show HEAD^^ # 查看 HEAD 的祖父版本更新细节
$ git show HEAD~4 # 查看 HEAD 的祖父之祖父的版本更新细节

#还原代码库
reset
将代码库还原至某个版本
git-reset 命令有三个选项:–mixed 、 –soft 和 –hard 。我们在日常使用中仅使用前两个选项;

第三个选项由于杀伤力太大,容易损坏项目仓库,需谨慎使用。
–mixed 是 git-reset 的默认选项,它的作用是重置索引内容,将其定位到指定的项目版本,而不改变你的

工作树中的所有内容,只是提示你有哪些文件还未更新。
–soft 选项既不触动索引的位置,也不改变工作树中的任何内容,但是会要求它们处于一个良好的次序之内。
该选项会保留你在工作树中的所有更新并使之处于待提交状态。
协同开发
clone pull push

1
2
$ cd work
$ git clone lyr@192.168.0.7:~/work/m2ge m2ge

通过ssh访问远端的某个git目录 将工作树复制到本地,如果不指定文件夹则和远端一致。
ssh 协议: 账户@IP:工作树路径
clone之后 就在本地创建了一个工作目录,所有的提交删除工作都可以在本地进行,不需要频繁操作主分支

1
$ git clone lyr@192.168.0.7:~/work/m2ge

#项目开发

1
2
3
$ git add 增加改动的文件
$ git commit 向本地代码库提交
$ git pull 获取远端代码

#解决版本合并问题

1
$ git push 提交代码到远端库

git的代码是分布式管理的。所以每个机器上都保存了完整的版本库代码。

#建立一个等价库

1
2
3
$ mkdir -p ~/project/m2ge.git
$ cd ~/project/m2ge.git
$ git --bare init --shared

#分支管理
branch checkout merge

1
2
3
4
5
6
$ git branch 察看当前分支
$ git branch local 建立一个分支
$ git checkout local 切换分支为local, 进行开发工作add commit ...
$ git checkout master 将当前分支切换为master
$ git merge locallocal分支与当前分支合并
$ git branch -d local 删除local分支

没有完成merge的分支是无法直接删除的,需要用到-D参数强制删除

JSON简述

什么是JSON
http://www.json.org/json-zh.html

#如何加载JSON

##JAVASCRIPT 对象的表示法
基本语法: {name: value, name: value, name: value,name: value,}
其中name 表示对象的属性名, 若属性名含空格, 则需引号把盖名称括起来。 value表示属性值, 可以是各种基本数据类型。

##JSON支持的各种数据类型
Boolean exp: {active:true}
String {title: “jquer”}
Number {count: 28}
Object {count,result:[12,34]}
Array {values:[1,flase,”test”[2,3],{2,34}]}
Null 是一个预定义的对象,若通过json表示发送一个null 值,单词null 必须小写才有效

##JQuery使用
JQuery.getJSON(url[,data][,callback(data, textStatus)])

url: URL地址
data: 是字符串或映射给通过请求发送到服务器的数据
callback: 是请求成功时执行的回调函数,其参数data表示服务器返回的数据
textStatus: 表示响应状态文本。

Php data object

提供了一种数据库无关的机制来在php6中链接、读取和操作各种各样的RDBMS平台。开发者采取一致的方式来跨各个数据库平台操作,从而改进可一致性和可伸缩性,同时不需要非官方的第三方抽象层。

#PDO($dsn);Data Source Name

格式:
protocol:key=value;key=value…

  • key: host,username,password,port,dbname

#query()

在PDO类里有一个简单的查询方法query(),并返回PDOStatement类型的实例化类。PDOStatement类起实现了名为Traversible的借口;这意味着它支持直接迭代。 在该类伤迭代产生一系列关联数组,每个数组等于一行输出;但每个关联数组条目同时包含key/value和index/value数据,所以需要 is_numberic() 来过滤index/value.

#PDOStatement类
永远不会直接创建PDOStatement类。

#prepare()

prepare() 方法生成了PDOStatement的实例,查询由PDOStatement保存而返回的数据比仅仅直接迭代使实例要复杂。 prepare() 的SQL查询字符串包含了一个未带引号的参数 :username

#prepare和query的差异性

  1. 尽管返回一个PDOStatement的实例,但并没有执行查询。通过分离语句的准备和查询的执行,可以在执行之前进一步地查询该语句
  2. 使用PDOStatement的fetch()来一次性获取数据库返回的每个行数据,而不是用forearch()来迭代PDOStatement的实例.这样可以灵活地传递一个参数:一个常量PDO::FETCH_ASSOC. 这个意味着所返回的数据一个只包含的key/value的数据关联数组,没有以前的混合index/value的数组
  3. 可以方便地每次仅返回一行数据,如果没有其他的行返回,那么fetch()返回false.类似结构化方法fetchAll()可以一次将所有的行返回到包含多个关联数组的耽搁数组中

#bindParam()
bindParam(‘:username’,$strUsername,PDO::PARAM_STR)

仅仅获得一个变量并将其传递给PDO引擎,从而告诉PDO引擎在何处将其绑定到初始SQL语句。常量PARAM_STR告诉PDO引擎传递参数的字符串。因为应用必要的引号以构造最终的参数是字符串。因为应用必要的引号以构造最终的SQL语句是PDO和RDBMS的责任.

#bindValue()与bindParam()

bindValue() 不会接受一个PHP变量为参数;相反,它需要硬编码的值作为参数.同样,如果试图将一个硬编码的值传递给bingParam,该方法将失败,它需要一个通过引用传递的变量.
优点:

  1. 抽象性
  2. 安全性 不易SQL注入攻击。 将HTTP_POST和GET参数以转义SQL中具有特殊意义的所有字符。 使用一些不常用的非ASCII字符集时容易出错
  3. 可移植性 使用参数化的预置豫剧可以一次性解决这个问题。
  4. 性能 通过使用单条预置语句,底层的数据库能够知道应用程序中某个流行查询在结构上自始至终保持不变

#PDOStatement的事务与提交

默认情况下,PDO假设到数据库的写操作应该是自动提交的。