简洁的想法

仁爱、喜乐、和平、忍耐、恩慈、良善、信实、温柔、节制

在 Mac 下用 Homebrew 安装 MySQL

| Comments

在 Mac 下用 Homebrew 安装 MySQL, 网上的教程倒是很多,不过大多数都很默契地雷同。如果稍有点定制要求,就无从下手了。

我先也不免俗,从基本的开始:

一、首先安装 Homebrew

1
2
3
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
$ brew install git
$ brew update

二、安装 MySQL

用下面的命令就可以自动安装了:

1
$ brew install mysql

如果想让 MySQL 开机自动启动,可以如下操作:

Use FFmpeg to Burn Subtitles Into the Video

| Comments

FFmpeg 是个强大的跨平台软件,在Mac下使用的时候要稍注意一下。我这记录一下自己的摸索过程。

我想在一个 MP4 文件里面添加字幕,不是把 .srt 字幕文件集成到 MP4 文件里,然后在播放器里选择字幕,这种集成字幕比较简单,速度也相当快:

1
ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy output.mp4

我希望字幕直接显示出来,其实也不难,两句命令而已:

1
2
ffmpeg -i subtitle.srt subtitle.ass
ffmpeg -i input.mp4 -vf ass=subtitle.ass output.mp4

但在 Mac 下处理不成功,我看到有错误信息:

1
2
3
Fontconfig error: Cannot load default config file
[Parsed_ass_0 @ 0x102d00000] No usable fontconfig configuration file found, using fallback.
Fontconfig error: Cannot load default config file

看来是 Fontconfig 出了问题,我的解决方案是:

一、在~/.bashrc 最后添加一句:

1
export FONTCONFIG_PATH=/opt/X11/lib/X11/fontconfig

使之有效:

1
source ~/.bashrc

二、编辑 /opt/X11/lib/X11/fontconfig/fonts.conf 在字体目录添加 /Library/Fonts

1
2
3
4
5
6
7
8
:
<!-- Font directory list -->

  <dir>/opt/X11/share/fonts</dir>
  <dir>/usr/X11R6/lib/X11/fonts</dir>
  <dir>~/.fonts</dir>
  <dir>/Library/Fonts</dir>
:

再次运行添加 ass 字幕的命令就可以了,简单吧。市面上那么多视频处理软件,我估计都是FFmpeg加了个UI而已,如果命令行用得好,效率会高很多的。

更多 fontconfig 的信息可以参考这里

Ruby – Block Proc and Lambda

| Comments

Block是Ruby中相当sexy的特性。对于常年在C/C++中Coding的码农来说,不管是表达方式还是思考方式都有点让人感觉不适应。 Block是一个统称,中文名称又叫闭包,英文是Closure,表现形式有block, Proc and lambda。Proc是对block的面向对象的封装, lambda是对Proc的进一步封装。

block

虽然Ruby中万物皆对象,但block是作为一个特性而存在,不是对象。也许很多Rails程序员还没看Ruby语法就已经用scaffold写Blog了,对别人程序中的一些代码连蒙带猜也很看得差不多懂,就比如下面的代码:

1
2
3
4
5
6
my_array = [ 1, 2, 3, 4, 5 ]
my_array.each { | number | puts number}
my_array.each do | number |
  puts number
end
my_array.each_index { | index | puts "number has #{index}" }

简单来说,each后面的几种表达就是block,上面的例子就是调用Array对象的block方法。看起来好像很神秘,其实我们也可以为自己的类定义一个block方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyArray
  attr_accessor :my_arr
  def initialize( my_arr )
    @my_arr = my_arr
  end

  def my_each( &my_block )
    for i in 0..@my_arr.length-1
      my_block.call( @my_arr[i] )
    end
  end
end

a = MyArray.new( [1,2,3,4] )
a.my_each { | number | puts number }

结果很简单

1
2
3
4
1
2
3
4

之所以很多变量和方法都加个my前缀,是因为我想告诉大家这都是自定义的,是不是很帅?哦,不好意思,是不是很sexy?

既然已经说到自定义了,不能这样就结束了,我们可以再复杂一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyArray
  attr_accessor :my_arr
  def initialize( my_arr )
    @my_arr = my_arr
  end

  def my_each( &my_block )
    for i in 0..@my_arr.length-1
      my_block.call( @my_arr[i], i )
    end
  end
end

a = MyArray.new( [ 1, 2, 3, 4 ] )
a.my_each { | number, index | puts "number at #{index} has value #{number}" }

结果如下:

1
2
3
4
number at 0 has value 1
number at 1 has value 2
number at 2 has value 3
number at 3 has value 4

接下来不得不说一下yield这个关键字,我们从简单的例子开始:

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyArray
  attr_accessor :my_arr
  def initialize( my_arr )
    @my_arr = my_arr
  end

  def my_yield
    yield
  end
end

a = MyArray.new( [ 1, 2, 3, 4 ] )
a.my_yield { puts "yield is also sexy!" }

请大家无视1,2,3,4, 上面的例子只会输出yield is also sexy!, 也就是说 a.my_yield 后面的所有内容都跑到 my_yield 中,替换了 yield,简单吧。

下面开始对其升级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyArray
  attr_accessor :my_arr
  def initialize( my_arr )
    @my_arr = my_arr
  end

  def my_yield
    yield( @my_arr )
  end
end

a = MyArray.new( [ 1, 2, 3, 4 ] )
a.my_yield {| my_tmp_arr |
  puts "yield with parameter!"
  my_tmp_arr.each{| number | puts number}
}

输出如下:

1
2
3
4
5
yield with parameter!
1
2
3
4

如果你不是高手,我相信你会回头再品一下代码的,这个my_yield中到底发生了什么事?其实也不难,按照上例中的,把a.my_yield后面的全部甩到my_yield中替换yield, 然后用@my_arr替换my_tmp_arr就可以了。

Proc

前面说到Proc是Ruby对block的面向对象的封装,简单来说,就是我自己定义一个可以多次重用的block。还是看个例子吧,比如我想计算一个长方形的面积:

1
2
rectangle_area = Proc.new{ | a, b | puts a * b }
rectangle_area.call( 5, 6 )

如果我的想固定长边,只输入宽度就好了,那我可以加入一个参数:

1
2
3
4
5
6
7
8
def rectangle_area_with_length (length)
  Proc.new{ | width | width * length }
end

area = rectangle_area_with_length(6)
area.call(3)
area[3]
area.class # => Proc

最后两种call的方式都行,结果都是18。我啰嗦一句,Ruby语法是可以省略return的,所以上面函数的返回值是个Proc,Proc里面的block返回值是width * length,没了return,眼睛里的确清静了很多。

lambda

lambda是Ruby的一个函数,用来创建Proc

1
2
3
multiply_lambda_proc = lambda { | x, y | x * y }
# and we can call as a normal Proc
multiply_lambda_proc.call( 3, 4 ) # return 12

其与 Proc 主要有两个不同点:

第一,lambda 会检查参数,而 Proc 不会。

1
2
3
4
5
6
7
8
multiply_lambda_proc = lambda { | x, y | x * y }
multiply_proc = Proc.new { | x, y | x * y }

multiply_lambda_proc.call( 3, 4, 5 ) # ArgumentError: wrong number of arguments (3 for 2)
multiply_proc( 3, 4, 5 ) # return 12 as normal

# This last command's error shows that Proc auto assigns missing argument with nil
multiply_proc( 3 )  # TypeError: nil can't be coerced into Fixnum

第二,lambda 会返回它的调用函数,但 Proc 会结束它所位于的 function。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def return_from_proc
  ruby_proc = Proc.new { return "return from a Proc" }
  ruby_proc.call
  return "The function will NOT reach here because a Proc containing a return statement has been called"
end

def return_from_lambda
  ruby_lambda = lambda { return "return from lambda" }
  ruby_lambda.call
  return "The function will reach here"
end

puts return_from_proc # display return from proc
puts return_from_lambda # display The function will reach here

参考: RUBY BLOCK, PROC & LAMBDA

理解Ruby中block的本质

Mac OS X 10.8.2 Problems After Update

| Comments

Mac OS X 升级到10.8.2 以后,至少Retina Mac Pro 连接HDMI设备会出现问题,表现是笔记本和外接设备都黑屏,并且有个大大的鼠标,就像是分辨率变小了似的。

系统升级到OS X 10.8.2 (12C60)之后也没有改观。

Google之后发现三步可以解决问题:

1
2
3
sudo rm /Library/Preferences/com.apple.windowserver.plist
rm ~/Library/Preferences/ByHost/com.apple.windowserver.C751F3F4-AAAF-5E66-BDBF-91FD6960CC19.plist
sudo shutdown -r now

第二步最后的文件名windowserver后面可能有点不一样,第三步是重启电脑,有打开的文件别忘记先存盘。

Mac Octopress IOError Invalid Python Installation

| Comments

经过这么多天的与Warning的邂逅,今天终于开云见日迎来了一个Error. 就在全国人民喜迎这个IOError之际,我三省吾身,不知道是因为升级了Mountain Lion 还是因为我最近折腾系统太厉害的缘故,好好的一个Octopress今天居然在rake generate的时候给我报错:

1
2
3
4
5
6
7
8
9
10
11
Building site: source -> public
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 565, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 547, in main
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 278, in addusersitepackages
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 253, in getusersitepackages
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 243, in getuserbase
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sysconfig.py", line 523, in get_config_var
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sysconfig.py", line 419, in get_config_vars
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sysconfig.py", line 298, in _init_posix
IOError: invalid Python installation: unable to open /usr/include/python2.7/pyconfig.h (No such file or directory)

前面一堆文件都是在/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/,不知道为什么最后会找到这个文件夹去/usr/include/python2.7/

这类找不到文件的问题在*nix下其实还是很好解决的,只要我能找到这个文件, 再把它ln过去就好了:

1
2
$ sudo mkdir /usr/include/
$ sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/ /usr/include/python2.7

RStudio non-UTF8 Warning Message

| Comments

Rstudio 是一个不错的R语言IDE, 因为集成knitr, 使得这样一个编程IDE可以用Markdown来生成漂亮的PDF文本,甚至可以用LaTEX的语法加入公式,这样小篇幅的科技短文都可以用Markdown来写了。

我饶有兴致地安装了RStudio,结果一运行居然报了一个Warning,看来最近我的Warning不少。

1
2
3
4
5
6
7
8
9
During startup - Warning messages: 
1: Setting LC_CTYPE failed, using "C" 
2: Setting LC_COLLATE failed, using "C" 
3: Setting LC_TIME failed, using "C" 
4: Setting LC_MESSAGES failed, using "C" 
WARNING: You're using a non-UTF8 locale, therefore only ASCII 
characters will work. 
Please read R for Mac OS X FAQ (see Help) section 9 and adjust your 
system preferences accordingly. 

解决的方法也就一句话,放在R控制台运行一下就好了:

1
system("defaults write org.R-project.R force.LANG en_US.UTF-8")

PDF Version Found 1.5 but Allowed 1.4

| Comments

用Latex的时候,如果嵌入的PDF图片版本是1.5,而Latex只支持1.4的时候,就会出现很多Warning:

pdflatex (file ./graphics/abcde.pdf): PDF inclusion: found PDF version <1.5>, but at most version <1.4> allowed...

Warning只是不好看,PDF还是会正确生成的,我不愿像传说中的程序员那样不关心Warning,但也无力把PDF图片改成1.4的版本,只好用sed大法了:

1
2
$ cd graphics
$ for i in *.pdf; do sed -i -e  "s/%PDF-1.5/%PDF-1.4/" $i; done

附上那个老掉牙的程序员笑话吧:

有一个小伙子在一个办公大楼的门口抽着烟,一个妇女路过他身边,并对他说,“你知道不知道这个东西会危害你的健康?我是说,你有没有注意到香烟盒上的那个警告(Warning)?” 小伙子说,“没事儿,我是一个程序员”。 那妇女说,“这又怎样?” 程序员说,“我们从来不关心Warning,只心关心Error。”

Fatal Error: stdio.h File Not Found

| Comments

OS X 10.7.3 安装XCode 4.3.1 之后,如果你也安装了命令行: Preferences > Downloads > Components and click install on Command Line Tools

那再编译什么东西的时候,就有可能收到报错信息,比如我就是在bundle install的时候得到如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Installing rb-fsevent (0.4.3.1) with native extensions
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
creating Makefile
CFLAGS='-isysroot /Developer/SDKs/MacOSX10.7.sdk -mmacosx-version-min=10.7 -mdynamic-no-pic -std=gnu99 -Os -pipe -Wmissing-prototypes -Wreturn-type -Wmissing-braces -Wparentheses -Wswitch -Wunused-function -Wunused-label -Wunused-parameter -Wunused-variable -Wunused-value -Wuninitialized -Wunknown-pragmas -Wshadow -Wfour-char-constants -Wsign-compare -Wnewline-eof -Wconversion -Wshorten-64-to-32 -Wglobal-constructors -pedantic' /usr/bin/clang -isysroot /Developer/SDKs/MacOSX10.7.sdk -mmacosx-version-min=10.7 -mdynamic-no-pic -std=gnu99 -dead_strip -framework CoreServices -o '/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rb-fsevent-0.4.3.1/bin/fsevent_watch' fsevent/fsevent_watch.c
fsevent/fsevent_watch.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^
1 error generated.
extconf.rb:59:in `<main>': Compilation of fsevent_watch failed (see README) (RuntimeError)


Gem files will remain installed in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/rb-fsevent-0.4.3.1 for inspection.
Results logged to /usr/local/rvm/gems/ruby-1.9.3-p194/gems/rb-fsevent-0.4.3.1/ext/gem_make.out
An error occured while installing rb-fsevent (0.4.3.1), and Bundler cannot continue.
Make sure that `gem install rb-fsevent -v '0.4.3.1'` succeeds before bundling.

如果用心看一下,报的是stdio.h file not found.

其实问题出在这个command line tools上,可以用下面这个命令修正:

1
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/

MongoDB Scaffolding Devise Omniauth CanCan (2)

| Comments

1. Devise
2. Omniauth
3. CanCan

Devise

现在安装Devise, 和使用其它数据库一样, 首先在Gemfile加入devise, 然后安装Devise:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
$ vi Gemfile
...
gem 'devise','2.1.0'
...
$ bundle install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. If you are deploying Rails 3.1 on Heroku, you may want to set:

       config.assets.initialize_on_precompile = false

     On config/application.rb forcing your application to not access the DB
     or load models when precompiling your assets.

===============================================================================

MongoDB Scaffolding Devise Omniauth CanCan (1)

| Comments

Ruby on Rails 的学习曲线还算是有一点陡的, 作为一个初学者, 建议先看一下Ruby的语法书, 再看一下Rails的入门教材和示例, 但真正做项目的时候, 可能就要和各种各样Gems打交道了, 因为自己走了很多弯路, 所以想把一些笔记分享出来, 希望对新生有点帮助.

我准备用一个Blog的示例把Scaffolding MongoDB Devise Omniauth CanCan串起来.

  1. MongoDB
    1.1 Help
    1.2. CRUD
    1.3. Security
    1.4. Port
  2. 准备工作
  3. Git
  4. Scaffold
    4.1. 添加字段
    4.2. 验证输入
    4.3. 表关联
    4.4. 引用关联