1. Configure Https

    Https just means "http with ssl". In order to enable SSL, we need a certificate which is either self-signed or signed by an external Cerificate Authority. A self-signed certificate need to be imported when browsing. For easy-to-use purposes, use an external cerificate here. http://www.startssl.com/ and https://buy ...

    read more
  2. Vim for Rails

    使用vim来进行Rails开发,对配置过程略做记录,前提vim已安装完毕。
    1、 安装pathogen
    pathogens是vim的插件管理工具,可简化对vim插件的管理。
    安装如下:

    mkdir -p ~/.vim/autoload ~/.vim/bundle; \
    curl -LSso ~/.vim/autoload/pathogen.vim \
        https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim;
    

    然后在.vimrc中加入:

    execute pathogen#infect()
    " 加在下列配置之前
    syntax on
    filetype plugin indent on
    

    2、 rails.vim
    rails插件,无需多介绍。
    常用快捷键:

    gf ...
    read more
  3. Metaprogramming(code generator)

    根本没有什么元编程,只有编程!?
    CodeWriter

    • 注1: 由于代码字符串和块非常相似,因此,在很多情况下,可以选择使用任 意一种。但是,一般情况下,只要能用块就尽量用块。

    • 注2: 使一个模块可以通过钩子方法扩展它的包含者。

    module M
      def self.included(base)
        base.extend(ClassMethods)
      end
    
      module ClassMethods
        def my_method
          'a class method'
        end
      end
    end
    
    class C
      include M
    end
    
    C.my_method   # =>  "a class method"
    
    read more
  4. Meta programming(Class)

    在Ruby中,使用class定义类时,实际上是在运行代码,这与java之类的静态语 言有很大的差别。
    另外,类只是一个增强的模块,因此,任何适用于类的东西也 适用于模块。
    Object Definitions
    * 注1:在类(或模块)定义时,类本身充当了当前对象self的角色。

    result = class MyClass
      self
    end
    
    result     # =>  MyClass
    
    • 注2:Ruby中总是存在一个当前对象self,与此类似,也总是存在一个当前类 (或模块)。每当通过class关键字来打开一个类时,这个类就成为当前类, 但是使用class关键字需要一个类的名字。 如果只有一个类的引用,需要用class_eval()方法打开这个类。

    • 注3:类实例变量仅仅是属于Class类对象的普通实例变量。它仅仅可以被类 本身所访问,而不能被类的实例或之类所访问。

    • 注4:类方法的实质,它们只是一个类的单件方法。

    • 注5: 在类定义中使用一个类方法。

    • 注6: eigenclass是一个对象特有的隐藏类,它是单件方法存在的地方。Ruby中可以使用如下语法进入eigenclass的作用域。

    class << an_object 
      # do ...
    read more
  5. Metaprogramming(Block)

    块继承自“函数式编程语言(functional programming languages)”的世界。
    blocks
    * 注1: 在一个方法中,可以向Ruby询问当前的方法调用是否包含块。这可以通 过Kernel#block_given?()方法来做到。

    • 注2: 如果在一个扁平作用域中定义了多个方法,这这些方法可以用一个作用 域们进行保护,并共享绑定,这种技术称为共享作用域。

    • 注3: 传递给instance_eval()方法的块称为一个上下文探针,因为它就像是一 个深入到对象中的代码片段,对其操作。

    class C
      def initialize
        @x="a private instance variable"
      end
    end
    
    obj=C.new
    obj.instance_eval(@x) #=>"a private instance variable"
    
    • 注4: 有时,你会创建一个对象,仅仅是为了在其中执行块 ...
    read more
  6. Metaprogramming(Methods)

    Ruby是动态语言,没有静态类型检查,同时也提供了很多java等静态语言无法提 供的编程技巧。本章主要专注于消除重复代码的技巧,通过用两种不同的方式对一 段代码的重构来展示Ruby的强大功能,涉及的知识点比较少。
    methods
    * 注1: method_missing()是Kernel中的一个实例方法,当Ruby找不到调用的方 法时,它最后就会调用这个名为method_missing()的方法。

    • 注2: 移除一个对象中的所有方法,以便把它们转换成幽灵方法。

    重构例子

    # 原始代码
    class Computer
      def initialize(computer_id, data_source)
        @id = computer_id
        @data_source = data_source
      end
      def mouse
        info = @data_source.get_mouse_info(@id)
        price = @data_source.get_mouse_price(@id)
        result = "Mouse: #{info} ($#{price})"
        return "* #{result}" if price >= 100 ...
    read more
  7. Metaprogramming(ObjectModel)

    在Ruby程序中,除了对象之外,还有类、模块以及实例变量这些语言构件。这 些语言构件存在于其中的系统称为对象模型。在对象模型中,你可以找到诸 如"这个方法来自哪个类"和"当我包含这个模块是会发生什么"此类问题的答案。
    ObjectModel
    * 注1: class关键字更像是一个作用域操作符而不是类型声明语句,它的确可以 创建一个还不存在的类,不过也可以把这看成是一个副作用。对于class关键 字,其核心任务是把你带到类的上下文中,让你可以在其中定义方法。

    • 注2: 修改已有类的特性时,由于粗心导致bug,像这种鲁莽的修改方式被称为 猴子补丁。不过,如果是正确的运行打开类这种技术,猴子补丁也可以表示为 一个褒义词,会很有用。

    • 注3: 对象是一组实例变量外加一个指向其类的引用。对象的方法并不存在于对象本身,而是存在于对象的类中。在类中,这些方法被称为类的实例方法。 类是一个对象(Class类的一个实例)外加一组实例方法和一个对其超类的引用。 值得注意的是,实例变量存放在对象中,而方法存放在类中,比如

    class MyClass
      def my_method ...
    read more
  8. Metaprogramming(Tutorial)

    元编程(Metaprogramming),简单来说,就是写出编写代码的代码。正式的定义为:编写在运行时操纵语言构件的代码。 Ruby是一门对元编程支持很强大的语言(只是比lisp弱一点),而且,元编程 也是通向Ruby的高级编程之路。可以说,除非掌握了元编程否则不能算是真正掌 握了Ruby。 下图简要总结了的基本内容,经验有限,不足之处请多指正。
    RubyMetaprogramming
    就如蜘蛛侠大叔曾经说的,能力越大,责任越大。元编程赋予了你强大的能力,同时也意味着你需要肩负更大的责任。

    read more
  9. A* Algorithm

    A*算法是一种经典的启发式搜索算法,公式表示为:f(n)=g(n)+h(n),其中f(n) 是从初始点到目标点的估价函数,g(n)是从初始点到节点n的代价,h(n)是从节 点n到目标节点的估计代价,保证找到最短路径关键在于估价函数h(n)的选取。
    一、几个相关知识:
    启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。

    估价函数:从当前节点移动到目标节点的预估费用;这个估计就是启发式的。在寻路问题和迷宫问题中,我们通常用曼哈顿(manhattan)估价函数。

    A*算法的特点:A*算法在理论上是时间最优的,但是也有缺点:它的空间增长是指数级别的。

    A*算法与BFS:可以这样说,BFS是A ...

    read more

« Page 2 / 4 »

blogroll

social