更改默认的mysql和mongodb数据dbpath

修改mysql

sudo /etc/init.d/mysql stop
sudo cp -R -p /var/lib/mysql /newpath
sudo chown mysql:mysql /newpath
vi /etc/mysql/my.cnf
#####Look for lines beginning with /var/lib/mysql. Change /var/lib/mysql in the lines with the new path.
sudo /etc/init.d/mysql restart

修改mongodb

sudo service mongod stop
vi /etc/mongodb.conf

####
Change this:
dbpath=/var/lib/mongo

With:
dbpath=/home/myuser/data/mongo
###

cp -ra /var/lib/mongo  /home/myuser/data/mongo

chown mongodb:mongodb /home/myuser/data/mongo

sudo service mongod start

nginx 备忘

1)域名恶意绑定

今天发现一个域名被恶意绑定IP了,解决办法是在Nginx中加一个默认的server。
看过这篇How nginx processes a request文章应该知道,Nginx会找到一个server配置来处理请求:

  server {
    listen       80;
    server_name  nginx.org  www.nginx.org;
    ...
  }

上面的配置文件如果不是来自nginx.org或者www.nginx.org的话也会走这个server,这是因为我们没有指定default_server

  server{
    listen       80;
    server_name  nginx.org  www.nginx.org;
    ...
  }

  server{
    listen       80 default_server;
    rewrite   ^(.*) http://www.nginx.org permanent;
    ...
  }

上面的配置文件就可以了,如果不是来自指定域名的请求,就会走下面的default_server,然后再让它永久重定向到我们网站就解决域名恶意绑定的问题了。

2)gzip

看文档 HttpGzipModule模块

3)alias vs root

location  /i/ {
  alias  /spool/w3/images/;
}

“/i/top.gif” => “/spool/w3/images/top.gif”

location  /i/ {
  root  /spool/w3/images/;
}

“/i/top.gif” => “/spool/w3/images/i/top.gif”

Learn Ruby Metaprogramming 备忘

又见元编程,元编程是拿语言本身当做操作的对象。
元编程是Ruby的一种自省能力。

1)继承族谱
顶层的是BasicObject(ruby1.9新增)

ruby-1.9.2-rc2 > BasicObject.superclass
 => nil

Object继承自BasicObject

ruby-1.9.2-rc2 > Object.superclass
 => BasicObject

Module继承了Object

ruby-1.9.2-rc2 > Module.superclass
 => Object

Class继承了Module

ruby-1.9.2-rc2 > Class.superclass
 => Module

注意观察:

Class.new.ancestors
 => [#class:0x000000022ef638, Object, Kernel, BasicObject]
Class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]
BasicObject.class
 => Class

2)main
不管是java还是c,都有个main函数作为程序的入口,ruby的在哪呢?其实我们一直在用:

ruby-1.9.2-rc2 > self
 => main
ruby-1.9.2-rc2 > self.class
 => Object

我们写的代码其实都是在这个top-level对象main中发生的,一切都是对象,看吧,一点也不奇怪。

3)constants

Module#const_get
Module#const_set
Module#remove_const

来看看ruby中的一般的常量(大写开头):

irb(main):001:0> A = "1"
=> "1"
irb(main):002:0> self.class.const_get(:A)
=> "1"

我们定义一个类的时候,其实也无形中给class这个类增加了一个常量,例如:

irb(main):004:0> class Zires;end
=> nil
irb(main):005:0> Class.constants.grep("Zires")
=> ["Zires"]

irb(main):008:0> Class.constants - Object.constants
=> []

另外,constants在ruby中还扮演着类似文件路径的作用,例如:

module C
  File = "in C"
  class Doc
    File = "in c/doc"
    def root
      p File
      p ::C::File # 类似绝对路径,absolute path
    end
  end
end

irb(main):018:0> C::File
=> "in C"
irb(main):019:0> Doc::File
NameError: uninitialized constant Doc
  from (irb):19
  from :0
irb(main):020:0> C::Doc::File
=> "in c/doc"
irb(main):021:0> C::Doc.new.root
"in c/doc"
"in C"
=> nil

4) dynamic define code

Class#new
Module#define_method
Module#remove_method
Module#method_defined?

看下面的例子:

oop = "Oops!"

class Oops
  def say
    p "I say #{oop}"
  end
end

Oops.new.say #=>undefined local variable or method `oop'

oops = Class.new do

  define_method :say do
    p "I say #{oop}" 
  end

end

oops.new.say # => "I say Oops!"

5) dynamic run code

Object#send
Object#instance_eval
Module#module_eval
Module#class_eval
Kernel#eval

block
Proc
proc
lambda
method

send:

ruby-1.9.2-p180 > 1.send(:+, 2)
 => 3

eval&binding:

ruby-1.9.2-p180 > eval("1+2")
 => 3

ruby-1.9.2-p180 > x = 1
 => 1
ruby-1.9.2-p180 > eval("x + 2")
 => 3

def bind_x(x)
  x = x
  binding
end

ruby-1.9.2-p180 > eval("x + 2", bind_x(2))
 => 4

instance_eval:

ruby-1.9.2-p180 > 1.instance_eval { self + 2}
 => 3

class_eval:

1.class.class_eval do
  def add_2
    self + 2
  end
end

ruby-1.9.2-p180 > 1.add_2
 => 3

ruby中有好几个’家伙’能响应call方法,与eval家族的区别是,他们具有延迟性:

#Proc Objects

z = Proc.new { |x| p "#{x}"}
z.call("a") # call的时候才执行
 #=> "a"

l = lambda { |x| p "#{x}"}
l.call("b")
 #=> "b"

p = proc { |x| p "#{x}"}
p.call("c")
 #=> "c"

def myself(x)
  p "#{x}"
end

 m = method(:myself).class
 #=> Method
 m.call("d")
# => "d"

Proc vs proc vs lambda vs method 相同点:

#1)都响应call方法
#2)method可以转化为proc,其余都是Proc的对象
ruby-1.9.2-p180 > Proc.new{}.class
 => Proc
ruby-1.9.2-p180 > lambda{}.class
 => Proc
ruby-1.9.2-p180 > proc{}.class
 => Proc

ruby-1.9.2-p180 > method(:myself).to_proc.class
#=> Proc

***block其实也是Proc***

Proc vs proc vs lambda vs method 不同点:

#1)lambda 是Kernel方法,proc 也是Kernel方法,Proc是类,method是obj方法
#2)关于return,看例子比较
def check(callable)
  callable.call
  return "I AM Here!"
end

check lambda { return 10 }
# => "I AM Here!"

check Proc.new { return 10 }
# => LocalJumpError: unexpected return

check proc { return 10
# ruby1.8可能输出"I AM Here!",ruby1.9把proc和Proc统一了
# proc其实就是Proc.new
# => LocalJumpError: unexpected return

def myself ; return 10 ; end
check method(:myself)
# => "I AM Here!"

#3)关于参数
l = lambda { |x| p "#{x}"}
p = Proc.new { |x| p "#{x}"}
ruby-1.9.2-p180 > p.arity
# => 1
ruby-1.9.2-p180 > l.arity
# => 1
 
ruby-1.9.2-p180 > p.call
# => ""

ruby-1.9.2-p180 > l.call
# => ArgumentError: wrong number of arguments (0 for 1)

#4)lambda? 方法

ruby-1.9.2-p180 > lambda {}.lambda?
 => true
ruby-1.9.2-p180 > proc{}.lambda?
 => false

#5)简便写法
# lamda1.9新增
ruby-1.9.2-p180 > ->(x){ p "#{x}"}.class
# => Proc

#6)method可以 unbind
#  看 UnboundMethod

6) callbacks

method_missing
const_missing

included and extended
method_added and singleton_method_added
method_removed and method_undefined
singleton_method_removed and singleton_method_undefined
inherited
 
# 这些方法看文档吧,比较全

erlang operator 备忘

erlang中的运算符
1)算术运算符

Arithmetic Operators

Arithmetic Operators

1> +1.
1
2> -1.
-1
3> 1+1.
2
4> 2/2.
1.0
5> 5 div 3.
1
6> 5 rem 3.
2

band是按位与运算,bor是按位或运算,bxor是按位异或,bsl按位左移,bsr按位右移,注意最后的结果都是二进制。

1> 2#10 band 2#110.
2
2> 3#10 bor 2#100.
7 %这里3#10先换算成了2#11
3> 2#10 bxor 2#11.
1
4> 2#10 bsl 2.
8
5> 2#10 bsr 2.
0

2)比较运算符

Comparison Operators

Comparison Operators

data type的大小排序:

number < atom < reference < fun < port < pid < tuple < list < bit string

=:=和==,/=和=/=的区别:

1> 1 == 1.0.
true
2> 1=:=1.0.
false
3> 1 /= 1.0.
false
4> 1 =/= 1.0.
true

3)逻辑运算符
四个,not,and,or,xor

1> not true.
false
2> true and false.
false
3> true xor false.
true
4> true or garbage.
** exception error: bad argument

4)数组运算
最后还有个数组运算,++或者–,很简单

1> [1,2] ++ [3,4].
[1,2,3,4]
2> [1,2] -- [3,4].
[1,2]
3> [1,2] -- [1,4].
[2]
4> [1,2] ++ [1,4].
[1,2,1,4]
5> [1,2] -- [1,2].
[]

learn erlang 备忘

基本语法和数据类型

1)使用`.`作为一段代码的结束,例如:

2+5.
%>7

2)变量,以大写字母开头,并且只许”匹配”一次,例如:

Z = 1.
%>1
Z = 2.
%>** exception error: no match of right hand side value 2

3)Atoms(原子),是Erlang中的一种数据类型,以小写字母开头,或者以大写字母开头,但有类似引号的闭合符号包裹着。Atoms就是个简单的名字,不能有值,例如:

zires = 8.
%> ** exception error: no match of right hand side value 8
'ZIRES'
%>'ZIRES'

4)fun(匿名函数),可以有可选条件when,例如:

f = fun (X) -> X+1 end.
%#Fun<erl_eval .6.13229925>
f(2).
%>3

Fun2 = fun (X) when X>=5 -> gt; (X) -> lt end.
Fun2(7).
%>gt

调用函数还有如下形式,

fun Name/Arity
fun Module:Name/Arity

#其中Name是函数名,原子类型,Arity是整数类型,表示参数个数

例如,

fun lists:append/2([1,2], [3,4])
%> [1,2,3,4]

5)Number,有integer和float两种数据类型。$char 返回char的ASCII值

base#value
Integer with the base base, which must be an integer in the range 2..36.
In Erlang 5.2/OTP R9B and earlier versions, the allowed range is 2..16.

#base#value表示比特位,二进制
2#101. 就是2的平方*1+2的一次方*0+2的零次方*1

例子:

$A.
%>65

2#101.
%>5

2.3e-3.
%>0.0023

65.
%>65

6)复合数据类型Tuple,Tuple中每一个称为元素(element),官方的例子:

P = {adam,24,{july,29}}.
%>{adam,24,{july,29}}

element(1,P).
%>adam

element(3,P).
%>{july,29}

P2 = setelement(2,P,25).
%>{adam,25,{july,29}}

tuple_size(P).
%>3

tuple_size({}).
%>0

%反过来不行
{a,b} = {X,b}.
%>* 1: variable 'X' is unbound

7)复合数据类型List,List中每一个也称为元素(element),一个List[H|T]有Head(头)和Tail(尾),官方的例子:

L1 = [a,2,{c,4}].
%>[a,2,{c,4}]

[H|T] = L1.
%>[a,2,{c,4}]

H.
%>a

T.
%>[2,{c,4}]

L2 = [d|T].
%>[d,2,{c,4}]

length(L1).
%>3
length([]).
%>0

7)严格上说,在erlang中并没有string类型,string其实是代表字符串的数字的数组,string只能由双引号包起来,例子:

[83,117,114,112,114,105,115,101].
%>"Surprise"

"erlang""good"
%>"erlanggood"

模式匹配

erlang中的等号不是赋值操作符,而是表示模式匹配,左边匹配右边,变量进行绑定,例子:

{X,abc} = {"lala",abc}.
X.
%>"lala"

{X,Y} {333,ghi,"cat"}.
%>匹配失败,身形不一样

[H|T] = "cat".
H.
%>99
T.
%>"at"

“_”可以在模式匹配中作为占位符使用

{_,_,C} = {1,2,3}.
C.
%>3

f()可以用来取消之前的绑定,重新给变量绑定新的值。

X = 1.
f().
X = 2.
%>2

rails rails3 备忘

有些东西可能看起来很简单,并且可能确实很简单。下面都是在实际过程中遇到过的问题,好记性不如烂笔头,花几分钟记下来,何乐不为呢?

1)rails3 deprecated的方法

# 前面是不推荐的做法
save(false) == save(:validate => false)

2)strip_links(html)和strip_tags(html)

strip_links('<a href="http://www.rubyonrails.org">Ruby on Rails</a>')
# => Ruby on Rails
strip_tags("Strip <i>these</i> tags!")
# => Strip these tags!

3)实例变量和类变量

详见, 实例变量和类变量的区别

4)引入FileUtils模块

require 'fileutils.rb'
include FileUtils

5)动态创建方法(dynamically define method)
http://ruby.dzone.com/news/dynamically-created-methods-ru
6)某一个action只想完成自己的事,而不渲染页面

render :nothing => true
# 只返回200状态码

7)文件上传如何测试,我们知道,单单给出文件的磁盘地址是不够的,幸好rails有fixture_file_upload来模拟一个文件上传的路径

# 2.x版本在spec_helper.rb文件中增加
include ActionController::TestProcess
# rails3 版本在 spec_helper.rb文件中增加
include ActionDispatch::TestProcess

Image.new(:attachment => fixture_file_upload('/home/zires/guan1.gif', 'image/gif'))

8)大文件的下载,当我们的下载文件不在public下(不是所有人都能访问的时候),send_file解决了这个问题

before_filter :login_required
def download
    send_file '/home/railsway/downloads/huge.zip', :type=>"application/zip", :x_sendfile=>true
end
# x_sendfile 参数确保了Lighttpd/Apache2服务器下,只占用很少的内存,并且不会堵塞其他的请求

9)rails3中不 escape tags

< %=raw @user.post %>

10)Gemfile 中指定branch tag ref

gem 'xxxxx',
        :git => 'git://github.com/xx.git',
        :branch => 'xx',
        :tag => 'xxxxx',
        :ref => 'xxxx'

11)String#constantize 和 Object#const_get
在元编程的时候,有时需要动态生成method,如何把一个字符串转成类呢?例如option_type转成OptionType,并且能响应find方法。

"option_type".camelize #=> "OptionType"
"option_type".camelize.constantize #=> OptionType
"option_type".camelize.constantize.send(:find, 1)

# or
class String
  def to_class
    Object.const_get(self)
  end
end

git 备忘

1)如何取消上一次的提交

git reset --soft HEAD^
git commit -a -c ORIG_HEAD #ORIG_HEAD 是reset时对HEAD的拷贝

2)如何取消全部的本地修改

# 如果你没有提交
git checkout .
# 如果你提交了先
git reset
# 然后
git checkout .

3)如果我想切另外一个分支,但是当前分支有了修改,当前分支修改还没有完成,所以又不想提交,怎么办?

# 临时保存当前分支的修改
git stash
# 更复杂点
git stash save [--keep-index] [<message>]
# 列出所有的stash
git stash list
# 恢复
git stash apply
# or
git stash pop


注意:这个命令不会保存当前分支中Untracked的文件,所以记得在切到其他分支的时候,谨慎使用git clean

4)设定user name 和 email

# 全局设定
git config --global user.name "zires"
git config --global user.email "xxx@xx.com"

# 或者切到一个单独的repos中单独设置
git config user.name "zires"
git config user.email "xxx@xx.com"

5)打补丁

# git format-patch -n {commit_id}
git format-patch -1 {commit_id}
# 会生成一个0001-{commit message}.patch的文件

git am 0001-{commit message}.patch.patch # 或者
git apply 0001-{commit message}.patch.patch