这里有我的脚丫印😄

程序媛


  • 首页

  • 归档

把旧的数据库中的数据 load 到新数据库(新数据库表字段有差异)

发表于 2016-10-25 |

把旧的数据库中的数据 load 到新数据库(新数据库表字段有差异)

  1. 安装 gem 'yaml_db'
    照例:
    Gemfile 中 加入 gem 'yaml_db' 并 bundle

  2. 在旧的数据库环境下( database.yml 连接对应的数据库),运行 rake db:data:dump,会生成文件 db/data.yml。这个里面会把数据导出成数组格式。
    如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    users:
    columns:
    - id
    - email
    - nickname
    - created_at
    - updated_at
    records:
    - - 1
    - a@a.com
    - 1
    - ss
    - '2016-10-25 11:35:41'
    - '2016-10-25 14:26:11'
  3. 安装 gem 'bulk_insert'
    照例:
    Gemfile 中 加入 gem 'bulk_insert' 并 bundle

  4. 在新的数据库环境下(修改database.yml连接对应的数据库),写 task ,读取data.yml文件,并写入新的数据库。
    rake -T 可以查看所有 rake 命令,找到自己的 rake 命令 并执行(本例:rake new_db:new_db_load)。

    task 代码:

    文件目录:lib/tasks/new_db_migration.rake

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    namespace :new_db do
    desc 'migrate old db data to new db'
    task :new_db_load => :environment do
    old_db = YAML.load_file('db/data.yml')
    User.bulk_insert(set_size: 100) do |worker|
    old_db['users']['records'].each do |record|
    worker.add(
    id: record[0], email: record[1], status: (record[2] == 1), nick_name: record[3], created_at: record[4], updated_at: record[5]
    )
    end
    end
    puts 'user finish'
    puts 'done!'
    end
    end

    上面我做的变更是 status ,原来是 0 或者1 ,现在改成 true 或 false ,通过 status: (record[2] == 1) 来符合新的结构。其余的变更都可以类似处理。

gem 'gaffe' 异常页面美化

发表于 2016-10-24 |

参考链接:https://github.com/mirego/gaffe

step1. gem ‘gaffe’

step2. bundle install

step3. 在 config/initializers/gaffe.rb 中写入

1
2
3
4
5
6
# config/initializers/gaffe.rb
Gaffe.configure do |config|
config.errors_controller = 'ErrorsController'
end
Gaffe.enable!

step4. 创建ErrorsController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ErrorsController < ApplicationController
include Gaffe::Errors
# Make sure anonymous users can see the page
skip_before_action :authenticate_user!
# Override 'error' layout
layout 'application'
# Render the correct template based on the exception “standard” code.
# Eg. For a 404 error, the `errors/not_found` template will be rendered.
def show
# Here, the `@exception` variable contains the original raised error
render "errors/#{@rescue_response}", status: @status_code
end
end

step5. 创建自己的(也可以用它默认的),目录为views/errors/not_found.erb 这种。如下图是这个gem的文件,我们可以覆盖:

step6. 修改config/environments/development.rb,可以看到报错的页面都会给特定的页面,比如404.erb等,但是在开发或者测试环境还是不要设置,因为错误信息看不到,我们自己不好看错误。(Rails prefers to render its own debug-friendly errors in the development environment, which is totally understandable. However, if you want to test Gaffe’s behavior in development you’ll have to edit the config/environments/development.rb file.)

1
2
# Make Rails use `exceptions_app` in development
config.consider_all_requests_local = false

测试环境可以这样干:
config/environments/test.rb

1
2
3
4
5
# Make Rails use `exceptions_app` in tests
config.consider_all_requests_local = false
# Render exceptions instead of raising them
config.action_dispatch.show_exceptions = true

jquery fileupload 上传

发表于 2016-10-24 |

参考链接:https://github.com/carrierwaveuploader/carrierwave

使用 jquery.fileupload.js 上传图片

  1. gem 'carrierwave' 和 gem 'mini_magick'
  2. bundle
  3. 执行rails generate uploader image 会生成app/uploaders/image_uploader.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
# encoding: utf-8
class ImageUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/"
end
process resize_to_fit: [800, 800]
version :small do
process resize_to_fit: [200, 200]
end
end
  1. 在controller中 action 可以使用
    1
    2
    3
    4
    uploader = ImageUploader.new
    uploader.store!(my_file)
    uploader.url # => '/url/to/my_file.png' # size: 800x600
    uploader.thumb.url # => '/url/to/thumb_my_file.png' # size: 200x200

我的场景是,在页面用jquery uploader 到后面action上传图片,回传image_url 到页面,页面点击保存的时候再保存到相关的数据库表。

见截图:

1
2
3
4
5
6
7
8
9
class ImagesController < ApplicationController
def create
uploader = ImageUploader.new
uploader.store!(params['picture-upload'])
render json: {image_url: uploader.small.url}
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
function pictureUpload(prize){
$(".picture-upload").click();
$".picture-upload").fileupload({
type:'POST',
url:'/images',
dataType: 'json',
singleFileUploads: true,
maxFileSize: 2000000,
start: function (e) {
$(".progress-upload").removeClass('hide');
$(".upload-button i").addClass('hide');
$(".upload-button span").addClass('hide');
},
progressall: function(e, data){
var progress = parseInt(data.loaded/data.total * 100, 10);
$(".progress-upload .bar").css('width',progress + '%');
},
done: function(e, data){
$(".edit-button .prize-picture").attr('src',data.result.image_url);
$(".upload-button").remove();
$(".edit-button").removeClass('hide');
},
});
}

ch04 对象、变量和常量

发表于 2016-10-04 |
  • 对象
  • 类
  • 变量
  • 常量

4.1 对象

在 Ruby 中,表现数据的基本单位称为对象(object)。

  • 数值对象

    1、-10、3.1415 等是表示数字的对象,另外还有表示矩阵、复数、素数、公式的对象。

  • 字符串对象

    “你好”、”hello” 等表示文字的对象。

  • 数组对象、散列对象

    表示多个数据的集合的对象。

  • 正则表达式对象

    表示匹配模式的对象。

  • 时间对象

    比如 ”2013年5月30日早上9点“ 等表示时间的对象。

  • 文件对象

    一般我们可以理解为表示文件本身的对象,但确切来说,它是对文件进行读写操作的对象。

  • 符号对象

    表示用于识别方法等名称的标签的对象。

除此之外, Ruby 还有范围对象(Range)、异常对象(Exception)等。

4.2 类

Ruby 的类(class)表示的就是对象的种类。

对象拥有什么特性,这些都是由类来决定的。

下图是刚刚介绍过的对象及其所属类的对应关系(这些都是 Ruby 默认提供的):

「 XX 类的对象 」,我们一般会说成 「 XX 类的实例(Instance) 」。

例如,我们会说 「 字符串对象 foo 是 String 类的实例 」。

4.3 变量

变量就像是对象的名片。

Ruby 中有四种类型的变量。

  • 局部变量(local variable)
  • 全局变量(global variable)
  • 实例变量(instance variable)
  • 类变量(class variable)

变量的命名方式决定了变量的种类。

  • 局部变量
    以英文字母或者_开头
  • 全局变量
    以$开头
  • 实例变量
    以@开头
  • 类变量
    以@@开头

除以上四种类型外,还有名为伪变量(还有一种叫预定义变量,书中没有详细介绍)的特殊变量。
伪变量是 Ruby 预先定义好的代表某特定值的特殊变量,因此即使我们在程序里给伪变量赋值,它的值也不会改变。Ruby中,nil、true、false、self等都是伪变量。它们表面上虽然看着像变量,但实际的行为又与变量有差别,因此称为伪变量。

局部变量与全局变量

局部变量是指 变量在程序中的有效范围(也称变量的作用域)是局部的。

全局变量,不管变量在程序的哪个部分使用,程序就认为它们是同一个变量。

局部变量作用范围只在自己所在的代码块中。全局变量作用范围在所有程序中。

一般并不推荐使用全局变量。全局变量在程序的任何地方都可以修改,因此在规模较大的程序中使用时,会增加程序不必要的复杂度,给阅读程序、修改程序造成意想不到的麻烦。

首次给局部变量赋值的同时,该局部变量就被初始化了。如果引用了未初始化的局部变量,会抛出异常。

执行示例:

实例变量与类变量,第8章会详细说明。

4.4 常量

常量的作用和变量一样,是某个对象的 「 名片 」。与变量不同的是,对已经赋值的常量再进行赋值时,Ruby 会做出警告。

执行示例:

常量以大写英文字母开头。
例如 Ruby 的运行版本「 RUBY_VERSION 」、运行平台「 RUBY_PLATFORM 」、命令行参数数组「 RARGV 」等,都是 Ruby 预定义好的常量。

4.5 保留字

Ruby 关键字一览表:

这些关键字被称为保留字,如果用做变量名,Ruby 会提示我们语法错误。

执行示例:

4.6 多重赋值

除了「 变量 = 值 」这种给变量赋值的方法,Ruby 中还提供了只用一个表达式就能给多个变量赋值的简便方法。

4.6.1

比如:

1
2
3
4
5
6
a = 1
b = 2
c = 3
# 可以简化为
a, b, c = 1, 2, 3

如果一组不相关的变量进行多重赋值,程序会变的难懂,因此建议对彼此相关变量进行多重赋值。

即使 = 号左右两边列出的数量不相等,Ruby 也不会报错。

1
2
a, b, c, d = 1, 2
# a = 1 b = 2 c = nil d = nil

变量部分比较少时,Ruby 会忽略掉该值,不会分配多余的值。

1
2
a, b, c = 1, 2, 3, 4
# a = 1 b = 2 c = 3 4不会被分配

变量前加上 * ,表示 Ruby 会将未分配的值封装为数组赋值给该变量

1
2
3
4
5
a, b, *c = 1, 2, 3, 4, 5
# a = 1 b = 2 c = [3, 4, 5]
a, *b, c = 1, 2, 3, 4, 5
# a = 1 b = [2, 3, 4] c = 5

4.6.2 置换变量的值

1
2
3
4
5
a, b = 0, 1
tmp = a # 暂时保存变量a的值
a = b # 将变量b的值赋值给a
b = tmp # 将原本变量a的值赋值给变量b
p a, b # => [1, 0]

使用多重赋值,只需一行程序就搞定了。

1
2
3
a, b = 0, 1
a, b = b, a # 置换变量a、b的值
p a, b # [1, 0]

4.6.3 获取数组的元素

用数组赋值,左边有多个变量时,Ruby 会自动获取数组的元素进行多重赋值。

1
2
3
4
ary = [1, 2]
a, b = ary
p a # => 1
p b # => 2

4.6.4 获取嵌套数组的元素

1
2
3
4
5
ary = [1, [2, 3], 4]
a, b, c = ary
p a # => 1
p b # => [2, 3]
p c # => 4
1
2
3
4
5
6
ary = [1, [2, 3], 4]
a, (b1, b2), c = ary # 对与数组结构相对应的变量赋值
p a # => 1
p b1 # => 2
p b2 # => 3
p c # => 4

只要等号左边的变量的结构与数组的结构一致,即使再复杂的结构,多重赋值都可以轻松对应。

专栏

以变量名开头来决定变量的种类,这是 Ruby 中对变量命名时唯一要坚决遵守的规则。

◎ 不要过多使用省略的名称

◎ 对于多个单词组合的变量名,使用 _ 隔开各个单词,或者单词以大写字母开头
Ruby 的变量名和方法名使用前者,类名和模块名使用后者。

ch03 创建命令

发表于 2016-10-03 |

3.1 命令行的输入数据

到目前为止,我们写的程序都是向屏幕输出数据。现在我们考虑一下怎么输入数据。

代码示例:

执行结果:

如图可以看出,执行命令 ruby print_argv.rb 1st 2nd 3rd 中所传递的 1st 2nd 3rd 这三个参数(在命令行指定多个脚本参数时,各参数之间用空格间隔),可以用 #{ARGV[0]} 这种方式获取。(其中 ARGV 是 Ruby 预定义好的数组)

使用 ARGV 后,程序需要用到的数据就不必都写在代码中。同时,抽取数据、保存数据等普通的数组操作对于 ARGV 都是适用的。

代码示例:

执行示例:

把字符串转换为整数,可以使用 to_i 方法。

代码示例:

执行示例:

3.2 文件的读取

Ruby 脚本除了读取命令行传递过来的字符串参数外,还可以读取预先写在文件里的数据。

Ruby 的源代码中,有一个名为 ChangeLog 的文本文件。文件里面记录了Ruby相关的修改日志。

备注Ruby的源代码可以从Ruby官网下载。ChangeLog 文件可以在Ruby的github库里找到。
• Ruby源码下载地址:https://www.ruby-lang.org/zh_cn/downloads/ • github上的ChangeLog文件地址:https://raw.github.com/ruby/ruby/v2_0_0_0/ChangeLog

3.2.1 从文件中读取内容并输出

读取文件内容的流程:

  1. 打开文件
  2. 读取文件的文本数据
  3. 输出文件的文本数据
  4. 关闭文件

代码示例:

执行示例:

如果只是读取文件内容,其实直接适用 read 方法会使程序更简单

代码示例:

执行示例:

更进一步,如果不使用变量,一行代码就可以到搞定啦。

3.2.2 从文件中逐行读取内容并输出

一下子读取全部文件 耗时,浪费内存(读取的内容会保存在内存中,遇到大文件,程序会崩溃)

所以需要 放弃 「 读取文件全部内容 」 ,改为 「 逐行读取并输出 」。

如图:read 和 each_line 的区别

代码示例:

3.2.3 从文件中读取指定模式的内容并输出

用 Ruby 实现 grep 命令 ( Unix中有一个 grep 命令 ,grep 命令利用正则表达式搜索文本数据,输出按照指定模式匹配到的行 )

代码示例:

执行示例:

图中 ,命令 ruby simple_grep.rb filename read_text.rb 的意思就是执行 simple_grep.rb 程序,第一个参数为要匹配的字符串 我这里是 filename ,第二个参数为 要搜索的文本文件 我这里是 read_text.rb ,执行结果,就是这个 read_text.rb 中的两行包含的 filename 数据。

3.3 方法的定义

定义方法:

def 方法名
希望执行的处理
end

定义好方法后,需要 「 调用 」,Ruby 才知道我们要执行这个方法。

代码示例:

执行示例:

3.4 其他文件的引用

被其他程序引用的程序,成为库(library)。

Ruby 使用 require方法引用库:

require 希望使用的库名

库名可疑省略后缀 .rb

如图:库与引用库的程序

把 simple_grep.rb 作为库供给其他程序使用。

代码示例:

注:库与脚本放在同一文件夹时,需要用 ./来明示文件存放在当前目录。

执行示例:

Ruby 提供了很多标准库,我们可以通过 require 来引用。

如图:计算出了Ruby的生日——1993年2月24到今天为止的天数:8622

pp 方法

除了 p 方法外,Ruby 还提供了一个类似的方法——pp(pretty print)。
使用 pp 方法,需要引用 pp 库。

代码示例:

示例代码:

我没发现有啥区别。。。但是书上说,pp方法会在输出对象的结果时,会适当的换行以调整输出结果,可以更容易看懂。。。

ch02 便利的对象

发表于 2016-10-02 |

不同数据间的组合无法用字符串或数值这样简单的对象来表示,因此我们需要一个可以用以表示数据集合的数据结构。

本章介绍:

  1. 数组和散列这两种新的数据结构。
  2. 处理字符串时常用的工具——正则表达式。

「 数组、散列 这样保存对象的对象,我们称为容器。 」

2.1 数组

2.1.1 数组的创建

数组(array)是一个按顺序保存多个对象的对象,它是基本容器之一。
我们一般称为数组对象或者Array对象。

一个简单的数组:

1
names = [ "小林","林","高野","森冈" ]

2.1.2 数组对象

空数组对象:(还有其他方式创建数组,之后会继续介绍)

1
names = []

2.1.3 从数组中抽取对象

抽取方法:

数组名[索引]

1
2
3
names = [ "小林","林","高野","森冈" ]
name[0] # 这种方式可以取出第一个元素
print("第一个名字为:", names[0],".\n") # 结果为 第一个名字为:小林

执行示例:

「 数组的索引值是从0开始 」,并非1. 因此 names[1] 不是数组第一个元素,而是第二个元素。

2.1.4 将对象保存在数组中

names[0] = “野尻”

上图可以看出 数组第一个元素 从 “小林” 变成了 “野尻”。

如果想添加额外的元素,可以继续添加之后的索引
如图:

2.1.5 数组的元素

任何对象都可以作为数组元素保存到数组中。

如:

1
2
3
num = [2, 1, 3, 5, 9]
mixed = [2, "哥", 3, "你", 9]

2.1.6 数组的大小

1
array.size

如图:

2.1.6 数组的循环

each 方法的语法如下:

数组.each do |变量|
希望循环做的处理 (这里称为块 block)
end

(解说:块的开始部分为|变量|,each方法会把数组元素逐个拿出来,赋值给指定的 |变量|,那么块里面的方法就可以通过访问该变量,实现循环遍历数组的操作。)

本图是原文中的,更加清晰点。

每循环一次,就会把当前的数组元素赋值给变量 n ,

2.2 散列

散列(hash)也是一个程序里常用到的容器。
散列是键值对(key-value pair)的一种数据结构。
Ruby中,一般以字符串或者符号(Symbol)作为键(key),来保存对应的对象(value)。

2.2.1 什么是符号

如图:

1
2
sym = :foo # 表示符号":foo"
sym2 = :"foo" # 意思同上

符号能实现的功能,大部分字符串也能实现。
但是判断 「 是否相等 」的处理中,使用符号更有效率。

符号与字符串可以相互转换。

符号使用 to_s 可以 转成为 字符串。
字符串使用 to_sym 可以 转换为 符号。

2.2.2 散列的创建

使用{}创建,使用 => 定义key和value ;

如:

1
address = { :name => "高桥" , :pinin => "gaoqiao", :postal => "123123" }

当键是符号时,可以写成下面这样

1
address = { name: "高桥" , pinin: "gaoqiao", postal: "123123" }

2.2.3 散列的使用

从散列里取出对象(value):

散列名[键]

保存对象时使用的方法:

散列名[键] = 希望保存的对象

2.2.4 散列的循环

散列的 each 语法:

散列.each do |键变量, 值变量|
希望循环做的处理
end

如图:

2.3 正则表达式 (Regular expression)

使用正则表达式可以非常简单的实现以下功能:

  • 将字符串与模式(pattern)相匹配
  • 使用模式分割字符串

模式与匹配

正则表达式的语法如下:

/模式/

如:/Ruby/ 就这样 把希望匹配的内容直接写出来。

匹配正则表达式与字符串的方法是:

/模式/ =~ 希望匹配的字符串

若匹配成功,则返回匹配部分的位置。(字符和数组的索引一样,都是从0开始计数。所以字符串的首个字符位置为0)。
若匹配失败,则返回 nil。

如图:

/Ruby/i 加个 i 表示不区分大小写。
如图:

nil 是什么?

nil 是一个特殊的值,表示对象不存在。
像在正则表达式中表示无法匹配成功一样,方法不能返回有意义的值时就会返回 nil 。数组或者散列里获取对象时,若指定不存在的索引或键时,得到的返回值也是 nil。

如图:

if 语句 和 while 语句在判断条件时,如果碰到 false 和 nil ,都会认为是 「 假 」,除此以外都认为是 「 真 」。因此,除了可以使用返回值为 true 或者 false 的方法,还可以使用 「 返回某个值 」 或者返回 「 nil 」的方法作为判断条件表达式。

如图:

执行示例:

ch01 Ruby 初探

发表于 2016-10-01 |

1.1.1 ruby命令的执行方法

helloruby.rb (Ruby 文件)

1
print("Hello,Ruby.\n")

进入此文件被保存的文件夹目录,在 terminal 中执行

step0. cd rubylearning/ch01 (这里写你自己的文件夹路径)
step1. ruby helloruby.rb

1.1.2 irb 命令的执行方法

与ruby命令一样,irb命令在控制台执行,不过不需要指定程序文件。

step0. terminal 输入 irb
step1. 继续输入 print(“Hello,Ruby.\n”)

执行结果

在控制台写的程序可以马上在控制台里执行,这对进行简单的小测试非常方便。但是,这个方法并不适合大程序,这时我们应该考虑使用ruby命令。

退出 irb : 输入 exit 或 Ctrl+d

1.2 程序解说

字符串、数值、时间等各种数据,在Ruby中都是对象。

print是一个方法。所谓方法,就是对象的行为。
print方法的作用就是输出()里的内容。
我们在说明print方法时,会说“print方法会把作为参数传递过来的字符串,输出到控制台中”。

1.3 字符串

1.3.1

字符\n是换行符。利用换行符,我们可以用普通的字符达到换行的效果

除了\n以外,当我们想在字符串里嵌入特殊符号时,也会用到\
程序会对字符串里\后的字符做特殊处理。因此,如果字符串里需要包含\,程序要写成\

1
print("Hello, \"Ruby\".\n")

输出结果为:Hello, “Ruby!”.

1
print("Hello \\ Ruby!")

输出结果为:Hello \ Ruby!

1.3.2 ‘’ 与 “”

在单引号里,像\n这样的特殊字符不经过转义,程序会原封不动地直接输出。
但也有例外,例如在字符串里想嵌入\与单引号时,还是需要在之前加上\。也就是像这样,

1
print('Hello, \\ \'Ruby\'.')

输出结果为:Hello, \ ‘Ruby’.

1.4 方法的调用

Ruby在调用方法时可以省略(),

1
print "Hello, Ruby.\n"

虽然这种写法可以方便地输出多个字符串,但是如果遇到比较复杂的参数,使用()会更加便于理解。因此,建议在习惯Ruby的语法之前,不要使用省略()的写法。

1.5 puts 方法

puts方法与print方法稍有区别,puts方法在输出结果的末尾一定会输出换行符。
如:

1
puts "Hello, Ruby."

不过,当参数为两个字符串时,各字符串末尾都会加上换行符,如

1
puts "Hello, ", "Ruby!"

1.6 p方法

把字符串 “100” 和 100 输出区别开来,如

使用p方法时,换行符(\n)、制表符(\t)等特殊字符不会转义,会直接输出。
(原则上,p方法是提供给编程者使用的。)

1.7 中文的输出

魔法注释:(从Ruby 2.0开始,若没指定魔法注释,Ruby会默认使用UTF-8编码方式,因此,在Ruby 2.0中如果希望代码采用UTF-8的编码方式时,可省略魔法注释。)

1
# encoding: GBK

以UTF-8编码方式在控制台输出结果,可像下面这样执行命令:

ruby -E UTF-8 脚本文件名 ← 脚本执行
irb -E UTF-8 ← irb启动

1.8 数值表示与计算

1.8.1 数值表示

Ruby中的字符串是以字符串对象的形式存在的。同样地,数值也是以“数值对象”的形式存在的。

四则运算:

1.8.2 数学相关的函数

Ruby中还可以使用数学函数,如平方根、sin和cos等三角函数、指数函数等。使用数学函数时,必须在函数前加上Math.标识。
(irb命令后的选项–simple-prompt会简化irb的输出结果。)

这个例子中,其结果值为“9.265358966049024 * 10的-5次幂”,也就是0.00009265358966049024。

1.9 变量

变量是程序里不可缺少的元素之一。可以将其理解为给对象贴上的标签。

变量还可以清晰地表示某个值所代表的含义。因此,为变量起一个容易理解的名称是非常重要的。建议大家平时多加注意,最好使用area、volume等意义明确的单词作为变量名。

传递给print方法的字符串参数也可以像下面这样写:

1
2
3
4
print "表面积 = #{area}\n"
# 或者
puts "表面积 = #{area}\n"

在字符串里使用#{…}这样的写法,可以把通过计算后得到的值嵌入到字符串中。输出结果里除了可以嵌入变量名,也可以嵌入”表面积 =#{(xy + yz + zx) 2}\n”这样的计算公式,得到的输出结果是一样的。

1.10 注释

我们在程序里可以写注释。注释虽然写在程序里面,但程序并不会执行注释的内容,也就是说,注释的内容对程序的执行结果不会产生任何影响。

Ruby 中用 # 表示(单行)注释的开始。
另外,行的开头用 =begin 和 =end 括起来的部分也是注释

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
=begin
《Ruby基础教程(第4版)》示例注释的使用示例
2006/06/16创建
2006/07/01追加一部分注释
2013/04/01第4版更新
x = 10 # 宽
y = 20 # 长
z = 30 # 高
# 计算表面积和体积
area = (x*y + y*z + z*x) * 2
volume = x * y * z
# 输出
print "表面积=", area, "\n"
print "体积=", volume, "\n"
=end

1.11 控制语句

控制语句大致可以分成以下几类。

  • 顺序控制:按照程序的编写顺序,从头到尾执行。
  • 条件控制:若某条件成立,则执行〇〇,否则执行××。
  • 循环控制:在某条件成立之前,反复执行〇〇。
  • 异常控制:发生某种异常时,执行〇〇。

1.12 条件判断:if~then~end

1
2
3
4
5
6
7
# (这里的条件一般指能返回 true 或者 false 的表达式)
# 这里的 then 也可以省略
if 条件 then
条件成立时执行的处理
else
条件不成立时执行的处理
end

1.13 循环

1.13.1 while语句

1
2
3
4
# do 可以省略
while 循环条件 do
希望循环做的处理
end

例子

1
2
3
4
5
6
# 按顺序输出从1到10十个数字
i = 1
while i <= 10
print i, "\n"
i = i + 1
end

1.13.2 times 方法

1
2
3
4
# 循环次数确定,使用 times 会更加简单
循环次数.times do
希望循环做的处理
end
1
2
3
100.times do
print "All work and no play makes Jack a dull boy.\n"
end

times 方法被称为迭代器 (iterator).迭代器就是指用于执行循环处理的方法。

vim 初试

发表于 2016-09-28 |

rspec base on ruby

参考链接 (http://rspec.info/)

链接中使用的vim

通过尝试,暂时知道vim的一些知识。

vim 是可以在 终端(terminal) 中编辑文件的编辑器

在 终端(terminal)中输入 vimtutor 会出来 vim 的使用教程

step 0.
mkdir test
cd test

step1. vim Gemfile

就可以新建一个名字为 Gemfile 的文件

在出现的一堆 ~ 最上面开始编辑这个文件里面的内容。

输入完毕,按 esc 键退出编辑模式,再输入 :write 即可保存这个文件.

之后输入 :q 即可退出 vim

在 cd test 中 输入 atom . 在atom中打开,可以看到,已经新增了一个 Gemfile 文件

在 vim 中可以新建文件夹 :!mkdir lib 即可新建文件夹 lib

Serendipity 「 惊喜 」

发表于 2016-09-27 |

Serendipity 「 惊喜 」

笑来老师的 《七年就是一辈子》 阐述了 惊喜与创造惊喜的方法论
有以下几点:

  1. 你必须相信你自己会有好运的
  2. 尽量不做可能倒霉的事情
  3. 保持开放
  4. 持续学习
  5. 创造更多的连接
  6. 保留适当的随机

因为刚刚收到面试结果:我被录用了。真的十分开心。看到邮件之后很高兴、兴奋、振奋!
回复邮件之后。也问了一同面试的人,看看他们结果如何。听到有同学被录用了,也真替他们高兴啊;听到没有被录用的,其实我挺伤心的。因为都是我很好的朋友,不能和他们一起工作,很遗憾。毕竟大家可以更多的一起成长。

为什么以 Serendipity 「 惊喜 」命名,其实是自己有了这个机会,真的挺不容易的,收到录用通知,也是一个 Serendipity ,也希望自己之后能多多遇到和创造 Serendipity 。

真心感谢Xdite老师,以及同学们对我不断的鼓励和支持。是他们的相伴成长,才让我变得头脑更清晰,目标更明确。和班里一个朋友私聊的时候,说过这真是改变自己的命运也没夸张啊!

之前因为自己的学历问题,一直出去找工作碰壁,所以没自信,也不敢展示自己。
但是这次不是,根本没有因为学历问题受到任何影响,这是我一直以来最梦寐的结果。
还记得自己当时跟别人形容我这次对工作的期待:我希望一个能原原本本接受我的公司,一个认可我能力的公司,一个持续进步的公司。
这次,真的是完全符合我的期待,上天对我真是太好,真的是一个大大的Serendipity!

我跟Xdite老师说过,我想自己能有一个爆发点。Xdite老师给我的回答,我一直记得。现在想来,那也许就是最正确的方式:

如果你觉得自己还不能爆发,还没有爆发,只要做好你自己现在最该做好的事就行了。

我发现,积极参与、认真做好现在每天该做的事就是最好的达到爆发点的积累方式啊。
这就是笑来老师说的这几点吧。想想呢?平时这样做,兴许就能出现 Serendipity。

  1. 尽量不做可能倒霉的事情
  2. 保持开放
  3. 持续学习
  4. 创造更多的连接

我想这和老师说的本质上都是一个意思。

老师的点拨,当时有可能不太理解,但是要记住。总有一天会恍然大悟。

我想这是下篇了或者后记了吧

从开始相遇到现在,期间擦出了很多奇妙的“火花”,更是让我心中依依不舍。
这些相互磨合、相互交融的思想和进步的灵魂,深深感染了我、撼动了我。这其中带来的又哪里会是简单的值不值得。我想,这会是一段深刻的记忆。对我来说,这可以说是改变命运的事情。

我的打算,

以后当然要持续进步,保持干劲,争取能达成自己期望的自己!
和同学们保持密切联系,更是能促进彼此进步,希望我们都能更好的成长。

Mac Tips

发表于 2016-09-16 |

Mac Tips

分享:https://pan.baidu.com/s/1bS8NGM

  • 终端里面直接说英语

    • 说英语时我们当然希望有标准发音。在Mac中不需要字典,直接在终端里输入say yes,Mac就会说英语了
    • (自己试验, say yes 会发出yes的英语,say + 英语单词 可以发出 英语单词的读音)
  • 选择文本 (这个你试试,超级棒)

    • 用command+鼠标,可以选中不同位置的文本内容。
    • 用option+鼠标,可以对文本进行块选。(如果想对一列字进行删除或添加,可用这个选中后删除或输入文字,可以删除整列文字或在整列文字前添加一个文字)
  • 使用键盘快捷键通过 Spotlight 快速搜索。

    • 右箭头键 移到下一个搜索结果

    • 下箭头键 移到上一个搜索结果

    • 上箭头键 移到下一个类别中的第一个搜索结果

    • Command (⌘)-下箭头键 移到上一个类别中的第一个搜索结果

    • Command (⌘)-上箭头键 显示 Mac 上的搜索结果路径

    • Command (⌘) 打开所选结果

    • Return 键 在 Finder 中查看文件或应用程序

    • Command (⌘)-R 或 Command (⌘)-连按 打开搜索结果已选定的 Finder 窗口

    • Option-Command (⌘)-空格键

    • 若要选取不同的快捷键,请打开“Spotlight”偏好设置 — 选取苹果菜单 >“系统偏好设置”,点按“Spotlight”,然后从面板底部的弹出式菜单中选取快捷键。您也可以点按弹出式菜单,然后按下要使用的按键。

  • 显示桌面

    • command + F3
    • 四指外划
      (我自己实验了下。
      除去小拇指的四指外划,可以实现,但是有时候大拇指没有和其他三指同时,就会变成选中文字了。
      除去大拇指的四指外划,也可以间接实现,这样外划可以调出所有正在打开的面板,最上方有几个选项,分别是dashboard,桌面一、桌面二)
  • 输入法

    • 中英文混合输入,输入中文的时候,打开 caps lock 键,可以直接输入英文,关掉又切换回中文
    • 选词,通过 + - (或左右按键) 符号可以切换字或词,通过[ ](或上下按键)可以展开选词列表并进行切换
    • 打开输入法偏好设置,可以设置自动校正模糊音
    • 用’可以进行手动粉刺,比如fang’an(方案)
    • 使用shift+6可以输入表情符号 ;-)
  • 程序切换

    • command + tab 可以切换程序。(个人实验:按住command + tab 然后,不放command,点击tab,直到找到想要到达的程序)
    • command + shift + tab 可以进行逆序切换。方法同上
  • 截图

    • shift+command+3:全屏幕截图;
    • shift+command+4:通过鼠标选取截图。
    • 截取的图片默认存放在桌面上,以时间命名。
      系统默认截图格式是png,你可以通过如下命令修改截图文件类型,例如:
      defaults write com.apple.screencapture type -string JPEG
    • 如果在以上两个截屏动作中加入ctrl键,可以实现直接把图片保存在剪贴板而不是实体文件,这样你可以通过command+v直接把截取的图片内容复制到图像处理软件或Pages、Keynote等文件中。
  • 删除文件

    • command+delete删除文件,如果想彻底清除,使用shift+command+delete就会自动清空废纸篓。
  • 维护你的mac

    • 当你在使用系统时如果发现出现异常,那么就该进行日常维护了。
      打开磁盘管理,选中你的系统盘,点“击“修复磁盘权限”,对磁盘权限进行检查和修复。完成之后还可以手动执行维护脚本:

      sudo periodic daily
      sudo periodic weekly
      sudo periodic monthly

      也可以一次全部执行:
      sudo periodic daily weekly monthly
      一般执行完这些操作后,你的Mac就会充满活力,继续上路。这些操作可以定期执行。

  • 输入pmset noidle,Mac不休眠

    • 如果你想离开电脑一段时间,又不想让电脑进入睡眠状态,有个简单的命令可以帮助你做到这一点。在终端中输入:pmset noidle,即可。只要该命令一直运行,Mac就不会进入睡眠状态。关掉终端或ctrl+c可以取消该命令。
      pmset是OS X提供的命令行管理电源的工具,其功能远不止于此。
      pmset -g,查看当前电源的使用方案
      sudo pmset -b displaysleep 5,设置电池供电时,显示器5分钟内进入睡眠
      sudo pmset schedule wake “02/01/13 20:00:00”,设置电脑在2013年2月1日晚8点唤醒电脑
      感兴趣的可以使用man pmset查看详细信息。
  • 强制关闭程序

    • 总有程序关闭不了,这时候我们就需要:
      方法一:option+command+esc,调出强制退出应用程序的窗口,选择要退出的进程即可。
      方法二:打开活动监视器,类似windows的任务管理器一样操作就好了。
      方法三:命令行下的kill命令,比如想杀掉
  • 几个简单的命令

    • 打开终端程序,输入date会显示当前日期,输入cal会显示日历,输入uptime会显示系统从开机到现在所运行的时间。
  • Spotlight搜索command 键定位 (没实验成功)
    用Spotlight搜索的时候,搜到文件时,我们有时候会需要打开该文件所在的文件夹,这时候按住command
    键,点击文件即可打开Finder,并定位到该文件所在文件夹。

    • 显示隐藏桌面内容快捷键
      • 我们经常会在桌面上堆满文件夹和文件,有时候会很方便,有时候会觉得很乱。其实我们可以通过以下命令来决定什么时候显示,什么时候隐藏。
        chflags hidden ~/Desktop/ //隐藏桌面内容
        chflags nohidden ~/Desktop/
        //显示桌面内容
        如果觉得输入麻烦,用TextExpander或Alfred设置成snippet即可
  • 隐藏程序

    • 当我们不想在使用当前程序的时候看到其他程序的时候,可以使用快捷键option+command+h,这时除了你正在使用的程序,其他所有的程序都会被隐藏起来,有助于你专心工作。想切换到其他程序时,可以使用command + tab
  • 显示隐藏文件

    • 在终端里输入ls -a,可以显示该目录下的隐藏文件。在Finder中输入shift+command+.可以显示隐藏文件,想恢复原来的设置,再输入一遍shift+command+.即可。
  • 快速创建便签

    • 便笺是我们很常用的功能,可以把一些临时性的文字内容贴到桌面上,大家是如何做的呢?复制文字,打开便笺程序,新建便笺,粘贴文字!Too young too complicated,我们只需要选中文字,然后shift+command+y,就行了。
  • 文件比较
    1、对于单个文件的比较,一般使用diff或vimdiff就可以了,比如:
    vimdiff destfile.txt sourcefile.txt
    vim会非常清晰的显示出文件的不同,还有很多快捷方式帮助你查看和操作文件,这个命令比较适合命令行爱好者。
    2、对于大批量文件的比较,还是图形化比较工具更合适一些。OS X自带了FileMerge比较工具,可以满足部分需求,但对于中文编码文件或大文件经常会崩溃,很奇怪Apple一直不解决这个问题。
    3、推荐一款收费软件,VisualDiffer(25元),UI、功能和稳定性都非常不错,实在是居家旅行、代码比较、查找问题的必备利器。

  • mac 通用快捷键

    • 这部分内容之前陆续介绍过,但还是有童靴希望有个汇总,基于二八原则,我把最常用的快捷键罗列一下,对于非开发者,应该够用了

      Command+Tab 任意情况下切换应用程序-向前循环
      Shift+Command+Tab 切换应用程序-向后循环
      Command+Delete 把选中的资源移到废纸篓
      Shift+Command+Delete 清倒废纸篓(有确认)
      Shift+Option+Command+Delete 直接清倒废纸篓
      Command+~ 同一应用程序多窗口间切换
      Command+F 呼出大部分应用程序的查询功能
      Command+C/V/X 复制/粘贴/剪切
      Command+N 新建应用程序窗口
      Command+Q 彻底退出当前应用程序
      Command+L 当前程序是浏览器时,可以直接定位到地址栏
      Command+”+/-“ 放大或缩小字体
      Control+Space 呼出Spotlight
      Command+Space 切换输入法
      对于最后两个快捷键,我个人比较习惯Control+Space切换输入法,所以做了自定义的配置。

    • 终端命令open

      • 我们之前介绍过如何在Finder中浏览文件时进入当前目录的shell界面,那个插件叫做Go2Shell。当然我们也会有在shell下打开当前目录的Finder的需求,运行如下命令即可:
        open .

        当然open也可以打开其他目录,比如
        open /Users

        open还可以直接打开文件,打开程序,指定程序打开文件,打开网址等等,例如
        open a.txt
        open -a Safari
        open -a TextMate a.txt
        open http://news.sina.com.cn

  • mac键盘

    • 很多人第一次用Mac的键盘是会发现,苹果也太抠门了,退格键没了,PageUP/PageDown/Home/End也没了。别担心,您不是还有delete键和上下左右方向键么?delete相对于退格键,fn+delete可以往前删,fn+上下左右方向键可以实现PageUP/PageDown/Home/End的功能,一个都不能少.
1…456…9

陈云莉 m18301662790@gmail.com

记录一些技术点,留下一些生活感悟

82 日志
25 标签
© 2017 陈云莉 m18301662790@gmail.com
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.3