配置rails的vim环境

今天分享一款 vim 的 rails 插件: vim-rails

使用该插件可以方便的在多个文件之间进行跳转。如在控制器的 action 上按 gf 键会自动跳转到对应的视图文件。

也可以使用 :Emodel, :Eview, :Econtroller, 命令在模型、视图以及控制器之间进行跳转。

该插件还提供了对 rails 的一些关键字的高亮。

并且还可以直接在 vim 中使用 :Rails 命令。

同时还有 vim-rakevim-bundler 两个插件提供了 rakebundle 的 vim 命令接口。

如果是用的 vundle 进行插件管理的话,可以直接在 .vimrc 配置中添加如下内容即可:

1
2
3
Bundle 'tpope/vim-rails'
Bundle 'tpope/vim-rake'
Bundle 'tpope/vim-bundler'

然后再在vim执行命令 :BundleInstall 即可。

博客终于迁移完成了!

折腾了两天,终于将博客从之前的WordPress迁移到Jekyll上来了。

我的博客是从2009年开始使用WordPress的,至今也有5年多了。最近感觉WordPress提供的文章编辑功能不是很方便,本来是想着改用别的博客系统的。但是一直纠结着始终没换。一是由于懒,感觉能用就行了,不想折腾了。二是由于找不到比较好的系统。

这样就纠结了一年多。最近突然发现了Octopress,感觉很不错。于是果断地选择迁移过来。

环境搭建好了之后,接下来就是数据的迁移了。原打算之前的数据都不要了,准备从头再来的。毕竟之前的文章也写得不咋滴。
也许是自己比较怀旧吧,最终还是写了一个脚本将WordPress的数据输出为Markdown文件。
程序地址: https://github.com/wusuopu/wordpress-to-octopress

数据输出之后发现布局全乱了,又得重新调整一下格式。唉~,只是麻烦啊!

配置elixir的vim环境

elixir是建立在Erlang虚拟机之上的一种函数式编程语言。下面介绍elixir的两个vim插件。


首先是语法高亮支持: https://github.com/elixir-lang/vim-elixir


其次是snippets支持: https://github.com/carlosgaldino/elixir-snippets
这个需要先安装 snipMate 插件。


如果也是用的 vundle 进行插件管理的话,可以直接在 .vimrc 配置中添加如下内容即可:


Bundle ‘elixir-lang/vim-elixir’
Bundle ‘carlosgaldino/elixir-snippets’

au BufNewFile,BufRead *.exs set ft=elixir


然后再在vim执行命令 :BundleInstall 即可。

配置coffeescript的vim环境

coffeescript是构建在javascript基础上一门语言,它在运行时会编译在javascript。下面介绍vim用来开发coffeescript的两个插件。

首先是语法高亮支持: https://github.com/kchmck/vim-coffee-script

其次是snippets支持: https://github.com/carlosvillu/coffeScript-VIM-Snippets
这个需要先安装 snipMate 插件。

如果也是用的 vundle 进行插件管理的话,可以直接在 .vimrc 配置中添加如下内容即可:

Bundle 'kchmck/vim-coffee-script'
Bundle 'carlosvillu/coffeScript-VIM-Snippets'

au BufNewFile,BufRead *.coffee set ft=coffee

VIM编译参数

每次重装系统之后都要重新编译一次VIM,为了方便就将编译参数记录如下:


./configure –prefix=/opt/vim –enable-acl –enable-cscope –enable-largefile –enable-multibyte –enable-sniff –enable-mzschemeinterp –enable-xim –enable-tclinterp –enable-perlinterp –enable-python3interp –enable-pythonint
erp –enable-rubyinterp –enable-netbeans –enable-gui –enable-luainterp –enable-nls –enable-xsmp –enable-xsmp-interact –enable-fontset –with-features=huge –with-x


上面的参数中启用了对tcl、perl、python、ruby、lau的支持。同时为了使用系统的剪切板还启用了对X的支持。


我的VIM配置文件: https://github.com/wusuopu/my-vimrc

Docker使用笔记

docker是一个Linux下的应用容器引擎。使用它可以很方便地将程序以及依赖都打包到一个可移植的容器中。最后体验了一下,使用docker配置了一个Web开发环境。这样就不用担心每次重装系统之后都要重新配置开发环境。

安装

首先是安装docker应用程序,目前只有64位系统才能使用。

$ [sudo] apt-get install apparmor apparmor-profiles apparmor-utils
$ [sudo] apt-get install aufs-tools
$ [sudo] apt-get install cgroup-lite

$ wget https://get.docker.io/builds/Linux/x86_64/docker-latest.tgz
$ [sudo] tar xf docker-latest.tgz -C /

基本用法

安装完成之后使用 [sudo] docker -d 命令启动docker的daemon进程。

以下是一些常用命令的用法介绍:

docker version            # 查看版本
docker search TERM        # 搜索镜像
docker pull NAME[:TAG]    # 下载镜像

启动镜像:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run IMAGE -t -i /bin/bash                        # 进入镜像的shell环境
docker run IMAGE -p 12345:8000 -t -i /bin/bash          # 进入镜像的shell环境,将主机的12345端口映射到容器的8000端口

容器与镜像管理:

docker ps [OPTIONS]                              # 列出容器
docker images [OPTIONS] [NAME]                   # 列出镜像
docker rm [OPTIONS] CONTAINER [CONTAINER...]     # 删除容器
docker rmi IMAGE [IMAGE...]                      # 删除镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]    # 根据修改的容器创建一个新的镜像
docker commit -m "centos" f9ccb5cef3c0 wusuopu/centos6
docker push NAME[:TAG]                                  # 上传镜像
docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]     # 查看一个容器或者镜像的详细信息
docker logs CONTAINER     # 查看日志
docker start CONTAINER [CONTAINER...]                   # 启动镜像
docker stop CONTAINER [CONTAINER...]                    # 停止镜像
docker tag [OPTIONS] IMAGE [REGISTRYHOST/][USERNAME/]NAME[:TAG]   # 给镜像打tag
docker diff CONTAINER     # 查看容器文件系统的变化
docker cp CONTAINER:PATH HOSTPATH                       # 将文件从容器复制到主机

导入、导出:

docker export CONTAINER                                 # 导出容器到标准输出
docker export red_panda > latest.tar

docker import URL|- [REPOSITORY[:TAG]]                  # 导入文件为镜像
docker import http://example.com/exampleimage.tgz
cat exampleimage.tgz | sudo docker import - exampleimagelocal:new

nginx + php + FastCGI配置

最近在弄PHP,于是乎把配置过程作一个笔记以免忘了。


PHP安装、配置


我是通过源代码编译的形式进行安装的,基本步骤如下:


$ tar xf php-5.5.12.tar.bz2
$ cd php-5.5.12
$ ‘./configure’ ‘–prefix=/opt/myphp’ ‘–with-mysql’ ‘–enable-safe-mode’ ‘–enable-ftp’ ‘–enable-zip’ ‘–with-jpeg-dir’ ‘–with-bz2’ ‘–with-png-dir’ ‘–with-freetype-dir’ ‘–with-iconv’ ‘–with-libxml-dir’ ‘–with-xmlrpc’ ‘–with-zlib-dir’ ‘–with-gd’ ‘–enable-gd-native-ttf’ ‘–with-curl’ ‘–with-gettext’ ‘–with-pear’ ‘–enable-fpm’ ‘–enable-fastcgi’ ‘–with-ncurses’ ‘–with-mcrypt’ ‘–with-mhash’ ‘–with-openssl’ ‘–with-pcre-dir’ ‘–enable-pdo’ ‘–enable-phar’ ‘–enable-json’ ‘–enable-mbstring’ ‘–with-pdo-mysql’ ‘–with-pdo-sqlite’ ‘–with-readline’ ‘–enable-bcmath’
$ make
$ sudo make install


安装完成之后进入安装目录修改配置文件 lib/php.ini (没有则创建),添加时区设置:


date.timezone=Asia/Shanghai


然后运行PHP的FastCGI服务:


./bin/php-cgi -b 9000


nginx配置


nginx可以直接从仓库进行安装:


sudo pacman -S nginx


或者:


sudo apt-get install nginx


安装完成之后修改配置,添加一条新的虚拟主机:


server {
listen 8000;
server_name localhost;

root /var/www;

location / {
index index.php;
}

location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
}

}


然后再创建文件 /var/www/index.php


<?php
phpinfo();
?>


现在通过浏览器访问 http://127.0.0.1:8000/ 应该就可以看到效果了。

使用ruby开发vim插件

作为一个Vimmer和Pythoner,之前折腾过用python编写vim插件。现在作为半个Rubist,又开始继续折腾。


在开始编写插件之前,你需要确认 Vim 是否支持 Ruby,通过以下命令来判别:


$ vim –version | grep +ruby

如果输出为空,则表示你当前的vim不支持Ruby,需要重新编译一下,并启用对Ruby的支持。


顺便说下我当前的环境是:



  • vim 7.4

  • ruby 2.1.0


环境检查没有问题那么就开始吧。

在~/.vim/plugin目录下创建一个 demo.vim 文件。


在开头写上以下代码:


if !has(‘ruby’)
echo “Error: Required vim compiled with +ruby”
finish
endif

这段代码就是用 VimL 编写的,它将检查 Vim 是否支持 Ruby。


接下来再判断该插件是否已经加载过了,以免重复加载:


if exists(‘g:loaded_ruby_demo_plugin’)
finish
endif
let g:loaded_ruby_demo_plugin = 1

所有的检查都没有问题,则开始插件的正文了。先定义一个函数。


function! DemoFun1()
ruby<<EOF
buf = VIM::Buffer.current
puts “current buffer name: #{buf.name} number: #{buf.number} length: #{buf.length}”
EOF
endfunction

function与endfunction是vim中用于定义函数的,在”ruby<<EOF”和”EOF”之间部分的是Ruby代码。这个例子是输出当前缓冲区的名字、编号以及总行数。

执行命令:call DemoFun1(),应该就可以看到输出结果了。


然后再举个例子说下函数的参数处理。


function! DemoFun2(arg1)
ruby<< EOF
puts “you input: #{VIM.evaluate(‘a:arg1’)}”
EOF
endfunction

这里定义了一个函数接收一个参数,然后将其输出。使用 VIM.evaluate 将vim的变量转化为Ruby的变量。


为了方便我们再定义两个命令,以简化对这两个函数的调用。


command! -nargs=0 DemoFun1 call DemoFun1()
command! -nargs=1 -rang DemoFun2 call DemoFun2(<f-args>)

要获取完整的代码可以访问: https://gist.github.com/wusuopu/c1182efefa85d4f6839b


接下来再简单说下vim中Ruby的使用。


vim为Ruby提供了一个VIM模块,通过它可以在Ruby中访问vim的接口。同时还提供了两个全局变量:$curwin、$curbuf,它们分别代表了当前窗口对象以及当前缓冲区对象。


VIM模块中有 Buffer 和 Window 两个对象,分别是用来对缓冲区和窗口进行操作的。同时VIM模块还提供了message、set_option、command和evaluate四个函数。


想要查看更多的帮忙信息,可以在vim中执行如下命令:


:help ruby

好了,先写这么多吧,其余的自己去尝试吧。

vim的symfony2开发环境配置

安装

最近在用Symfony2框架进行开发,正所谓工欲善其事必先利其器。为了提高开发效率,因此将vim配置为symfony的IDE。


我安装的是phpcomplete-extended-symfony这款插件 https://github.com/m2mdas/phpcomplete-extended-symfony


它有些依赖在文档中没写清楚,我也是折腾了好久才搞定的,于是做个笔记记录一下。


我总共安装了以下插件:



  • neocomplete.vim

  • vimproc.vim

  • unite.vim

  • phpcomplete.vim

  • phpcomplete-extended

  • phpcomplete-extended-symfony

  • vim-twig


我是使用的Vundle进行vim插件管理,因此在 .vimrc 配置中添加以下内容:


Bundle ‘Shougo/neocomplete.vim’
Bundle ‘Shougo/vimproc.vim’
Bundle ‘Shougo/unite.vim’
Bundle ‘shawncplus/phpcomplete.vim’
Bundle ‘m2mdas/phpcomplete-extended’
Bundle ‘m2mdas/phpcomplete-extended-symfony’
Bundle ‘evidens/vim-twig’

然后再执行BundleInstall命令进行下载安装。


注意:vim-twig插件不是必需的,安装它只是为了编写twig模板时能够高亮。


使用


接下来说说使用流程。


1.vimproc需要编译

进行vimproc的安装目录,执行make命令进行编译。详细内容请阅读它的README文件。


2.安装ctags工具

由于当前的ctags工具不支持PHP的新特性,如命名空间、traits、interface,于是就需要给ctags打补丁。


下载打过补丁的ctags源代码:


$ wget “https://github.com/shawncplus/phpcomplete.vim/blob/master/misc/ctags-better-php-parser.tar.bz2?raw=true“ -O ctags-better-php-parser.tar.bz2

编译安装:


$ tar xvjf ctags-better-php-parser.tar.bz2
$ ./configure
$ make
$ sudo make install

3.安装 composer.phar


$ curl -s https://getcomposer.org/installer | php

4.修改vim配置

在vim中添加如下配置:


au FileType php setlocal omnifunc=phpcomplete_extended#CompletePHP
let g:phpcomplete_index_composer_command = ‘composer.phar’

5.开始使用

进入Symfony项目的根目录,执行命令生成tags文件:


$ ctags -R –fields=+aimS –languages=php

然后使用vim打开该tags文件,根据提示创建索引文件。完成之后索引文件会创建在 .phpcomplete_extended 目录中。下次在项目的根目录下打开vim,如果提示 “Index Loaded.”则表示配置成功了。接下来编写代码时就会有补全提示以及use语句的自动补全了。


注意:在使用该插件时需要把自动切换目录功能给禁用掉,添加设置: set autochdir! 。否则会出现无法加载索引,从而补全不了。这个问题在文档中没说,我也是折腾了好久才发现的。

Redis使用笔记

Redis是一个键值型数据库,之前花了些时间体验了一下Redis,感觉还是很不错的。而且Redis学习起来也很容易,差不多花几个小时应该就能入门了。当时我是看的《the little redis book》,初学者可以看看。

安装

下载软件包: http://redis.io/download

首先运行服务器程序:

$ redis-server

程序默认是监听6379端口。

然后再运行客户端程序:

$ redis-cli

基本数据类型

运行客户端程序连接上Redis服务之后,所有的操作都可以通过该命令行交互完成。

Redis有5种不同的数据类型:字符串、散列表、列表、集合、有序集合。所有的数据在Redis中都是以键值对的形式保存的。

以下介绍这几种类型数据的基本操作。

String

设置一个键的值为字符串:

set <key> <value>

获取该键的值:

get <key>

字符串相关的命令:

help @string

Hashes

设置一个散列值:

hset <key> <k> <v>

获取该键的值:

hget <key> <k>  
hgetall <key>

散列相关的命令:

help @hash

Lists

添加值:

lpush <key> <v>

移除值:

lpop <key>  
help @list

Set

添加值:

sadd <key> <v>[ <v> ..]  
help set

Sorted Sets

类似于集合(Set),但是提供了排序(sorting)和秩划分(ranking)的功能。

添加值:

zadd key score member [score] [member]   
help @sorted_set

其他

有效期

设置某个值在seconds秒后到期:

expire <key> seconds

设置某个值在time时刻到期:

expireat <key> time

查看到期时间:

ttl <key>

清除到期时间:

persist <key>

事务(Transactions)

multi  
do something  
exec

multi和exec之间的命令作为原子操作。

在multi之前调用watch可监听值的变化,若该值被其他客户端修改,事务将会运行失败。

杂项

选择数据库:

select index

清除当前数据库所属key:

flushdb

清除所有数据库所属key:

flushall

查看key所储存的值的类型:

type key

Redis相关的命令手册: http://redis.io/commands

在应用程序中使用Redis

Redis提供了多种语言的绑定,以Ruby为例:

require 'redis'
r = Redis.new
r.set 'key', 1234
puts r.get 'key'
puts r.keys

输出结果应该为:

"1234"
["key"]