windows ssh client

Posted by wxianfeng Fri, 30 Jul 2010 16:25:00 GMT

如果你是命令行爱好者,我想ssh应该是你用的最多的工具了,那么在windows有好的ssh client吗,个人用过下面三个client,总结下来,力荐 secureCRT ,

1, putty

download:
http://www.newhua.com/soft/2186.htm

比较简单 , 小巧, 免费 , 支持语法高亮, 单tab , 值得推荐, 适合服务器 机器不多的情况下使用 , 如果你需要同时连接 多个 电脑的话 , 那么用起来就麻烦了

2,ssh secure shell client

download:
http://www.onlinedown.net/soft/20089.htm

免费, 也是单标签 , 默认没有语法高亮 , 同时 带了 ssh 文件上传功能 , 如果你需要上传文件 , 又需要 命令行管理服务器 , 那么 ssh secure shell client 还是不错的

3,SecureCRT

download:
http://www.onlinedown.net/softdown/46646_2.htm

最后推荐secureCRT ,默认不支持 语法高亮, 杀手锏的是支持多标签和rz上传,sz下载功能,可以保存会话状态(密码), 还有就是不免费, 但是晚上破解版的 到处都是 , 下载后 更改 一些配置 ,例如,语法高亮等,配色, 用起来还是很
爽的。。。

centos 中的支持VIM高亮配置 和 中文乱码解决:

(1),在SecureCRT中设置 选项→会话选项→终端→仿真→终端:Linux,选中ANSI Color,全局设置的话,选择 选项→ 全局选项 设置即可

(2), 选项 → 会话选项 → 外观 修改字符编码为 UTF-8 (很重要,必须设置)

(3),

>vim /etc/vimrc
syntax on # 添加语法高亮 开启
set encoding=utf-8 # 修改编码为 utf-8

服务器端是ubuntu的话 , CRT 使用 rz,sz 命令的话,必须安装 lrzsz

sudo apt-get install lrzsz

centos :

yum install lrzsz

mac:

>wget ftp://ftp.kfki.hu/pub/Sun/freeware/SOURCES/lrzsz-0.12.20.tar.gz
>tar -zvxf lrzsz-0.12.20.tar.gz
>cd lrzsz
>./configure --prefix=/usr/local/lrzsz
>make
>make install
>ln -s /usr/local/lrzsz/bin/lrz /usr/bin/lrz
>ln -s /usr/local/lrzsz/bin/lsz /usr/bin/lsz

rz 上传到当前目录,sz下载到 user目录下 ,例如: C:\Users\Administrator\Downloads

SEE:
http://blog.s135.com/post/207/
http://tuhaitao.javaeye.com/blog/504919


rails + mongodb 入门demo

Posted by wxianfeng Thu, 15 Jul 2010 05:49:00 GMT

NoSQL 渐渐火了起来,最近同事也在讨论这个问题,一不做,二不休,就学习了下,mongodb是采用C++写的,开源,免费,目前已经有公司(10gen)在背后提供商业支持,文件之小,windows下载二进

制包解压后是45M左右,linux下的就更小了,读写操作性能之高,即使是在大数据量,大并发的情况下,也能保持良好的性能,可以索性,例如可以结合memcached,sphinx使用,哇。。。cool。。。
这两天利用mongodb + sinatra 做了个短地址服务网址,当然只是自娱自乐一把而已,domain太ugly了,地址是 http://url.wxianfeng.com,这编来介绍

rails中使用mongodb的入门教程,是railscasts上的那篇教程,但是有许多注意点,在此重点指出。
在开始这个demo前,如果你对mongodb还不熟的话,建议先学习下mongodb,就想先学习下mysql 一样,掌握一些基本的操作过程
我的环境:windows xp + rails 2.3.5 + mongodb 1.4.4 + mongo_mapper 0.8.2

1,安装需要的gem包

gem install mongo_mapper

如果顺利的话,可以安装成功,并且包依赖的其他gem也都同时安装上了 , 例如我在美国的linode服务器上,直接执行上面命令,就安装成功了,但是在大陆无法安装成功,至少我是经过下面的安装步

骤成功的:

gem install jnunemaker-validatable --source http://gemcutter.org
gem install bson --source http://rubygems.org
gem install mongo --source http://gemcutter.org
gem install plucky --source http://gemcutter.org
gem install mongo_mapper --source http://gemcutter.org

2,新建rails工程,修改你的enviroment.rb

config.gem "mongo_mapper",:source=>"http://gemcutter.org"
config.frameworks -= [:active_record] # - 代表不加载 active_record

在这里需要注意,当你需要使用scaffold生成代码时,必须把 – 给去掉,来加载active_record,因为scaffold默认需要使用activerecord,当你开启server时,再把 – 号给加上

4,修改 database.yml

development:
  adapter: mysql
  encoding: utf8
  reconnect: false
  database: trade_supplier_development
#  pool: 5
  username: root
  password: root
#  socket: /var/run/mysqld/mysqld.sock
  host: localhost

需要保证mysql的username,和 password正确,还是为了能使用 scaffold

5,添加 配置,在 config/initializers 下新建 mongo_config.rb

MongoMapper.database = "todo-#{Rails.env}"  

配置连接时的db name,start server时不会建立 db,当插入数据时会 同时建立 db 和 collection

6,修改Model

class Project 
  include MongoMapper::Document
  key :name, String, :required => true
  key :priority, Integer
  many :tasks 
end
class Task 
  include MongoMapper::Document
  key :project_id, ObjectId
  key :name, String
  key :completed, Boolean
  belongs_to :project
end

核心部分就是Model部分,db中的字段是根据 key来动态改变的,没有shama,没有migrate,当你添加新的key时,原有的数据不会改变,上面的两个model是1对多的关系,例如mongo——mapper 可以来

实现 1对1,1对多,多对多的关系,并且和 activerecord操作非常之相像

7,启动 mongodb
进入mongodb bin 目录下

mongod.exe --dbpath E:/mongodb/data

8,启动server

thin start

这一步会提示安装 bson_ext gem包, 我在linux中安装成功了,在windows无法顺利安装,貌似只能在UNIX中安装,需要make编译,但是只要你安装bson包,程序都可以顺利跑起来,BSON是json的binary

形式,这样会节省存储空间,最重要的是减少网络消耗

9,ok

http://localhost:3000/projects 瞧瞧

DEMO源码下载:
http://www.uushare.com/user/fl1429/file/3274129

See:
http://asciicasts.com/episodes/194-mongodb-and-mongomapper


centos 5.5 install svn server

Posted by wxianfeng Wed, 14 Jul 2010 05:10:00 GMT
为了个人的项目代码的同步,例如我在公司写的代码,回家后还能继续同步写下去,在我的VPS上搭了个svn server,搭建步骤:

1,安装subversion

yum update 
yum install subversion

3,创建和配置代码仓库

cd /usr/local/system
svnadmin create vcs

# 配置工程
vim vcs/conf/svnserve.conf
# 取消掉如下两行的注释
# auth-access = write
# password-db = passwd
 
# 配置该工作的用户与密码
vim vcs/conf/passwd
[users]
wxianfeng = 12345

4,启动svn server

cd /usr/local/system
svnserve -d -r vcs

5,导入工程

svn import wxianfeng_com svn://173.230.155.150/wxianfeng_com  -m "first import" --username wxianfeng --password 12345 # 远程 或本机导入
svn import wxianfeng_com file:///localhost/wxianfeng_com # 本机导入

前面的wxianfeng_com 是本地的文件夹,后面的wxianfeng_com 是svn仓库的project name , 或者你可以借助netbeans,eclipse带的svn客户端直接导入netbeans中或eclipse中的project到svn仓库中

6,checkout项目

svn co svn://173.230.155.150/wxianfeng_com

以上就可以做到一个仓库,多个项目的目的了,当有另外一个project时,直接import即可,如果想删除仓库中的某个工程,可以执行delete命令

svn delete svn://173.230.155.150/wxianfeng_com -m "delete project"

See:
http://www.tonyspencer.com/2007/03/02/setup-a-subversion-server-in-4-minutes/
http://blog.itmem.com/archives/1207


centos 5.5 安装 php + phpmyadmin

Posted by wxianfeng Thu, 08 Jul 2010 05:48:00 GMT

这几天真是和phpmyadmin有缘啊,老是和他接触,今天又在我的linode VPS上搭建了个phpmyadmin,用来管理mysql数据库,装好后才猛然发现我的数据库中中文全部是乱码,但是rails读出来后是中文,也就是大家看到我现在的这个blog是中文,但是mysql里是乱码,看了下所有的编码都是utf-8形式,诡异的问题,这个问题比较棘手,必须解决。但是今天写的是 centos 5.5 上如何搭建phpmyadmin ,和其他系统的安装的大同小异

1,安装php

yum install php – enablerepo=centosplus

注意 – 和 enablerepo 之间有个空格 , 加上 – enablerepo=centosplus 为了安装到5.x的php,如果直接 yum install php 的话 , 则安装的是php 4.x 系列

以后更新php 可以执行下面的命令:

yum update php –enablerepo=centosplus

结束后 可以用 php -v 查看安装的版本信息

2,安装phpmyadmin

到phpmyadmin官网下载 phpmyadmin , 注意下载的版本 必须注意支持的mysql 和 php 版本

我用的是 2.1 版,安装和配置过程:

>cd /usr/local/system # 进入到该目录下,这个一般是我的工作目录,你可以任意指定 
>wget http://downloads.sourceforge.net/project/phpmyadmin/phpMyAdmin/2.11.10/phpMyAdmin-2.11.10-all-languages.tar.gz?use_mirror=cdnetworks-kr-1&27689465 # 下载 phpmyadmin
>tar -zvxf phpMyAdmin-2.11.9.5-all-languages.tar.gz # 解压
>mv phpMyAdmin-2.11.9.5-all-languages phpmyadmin # rename
>cp config.sample.inc.php config.inc.php
>vi config.inc.php
$cfg['blowfish_secret'] = ‘TypeAnything_for_Secure’; # 找到 $cfg['blowfish_secret']  值为后面的值
>vi /etc/httpd/conf.d/phpmyadmin.conf
Alias /phpmyadmin /usr/local/system/phpmyadmin # 添加该代码

3,配置apache的端口

>vi /etc/httpd/conf/httpd.conf
Listen:8080 # 修改Listen 端口为 8080

4,重启 apache

service httpd restart
>netstat -antup # 可以查看端口启动情况

5,访问phpmyadmin

http://localhost:8080/phpmyadmin

报错,php 不能加载 mysql 模块 ,因为 php 没有安装 mysql 扩展,安装之:

>yum install php-mysql - enablerepo=centosplus

再次访问 phpmyadmin .OK 成功了

tips:
登录phpmyadmin出现下面错误 #2002 Cannot log in to the MySQL server
修改config.inc.php 的localhost 为 127.0.0.1 即可

>vim config.inc.php

我的phpmyadmin地址:
http://wxianfeng.com:8080/phpmyadmin

See:
https://www.sevenl.net/blog/how-to-install-lamp-phpmyadmin-and-vsftp-on-centos-5-3-using-yum/
http://imthi.com/blog/linux/install-or-update-php-5-on-centos.php


mysql 导入大量数据

Posted by wxianfeng Sat, 03 Jul 2010 05:30:00 GMT

想让你的本地mysql数据库某个表迅速产生大量数据吗,例如 500 万条 , 来进行性能测试 , 我就遇到了这个情况 , 导入过程如下:

测试环境 : windows xp + mysql 5.1

myisam 引擎的表导入:

表结构如下:
members(id,name.password,city,created_at,updated_at)

id是int型,name,password,city 都是varchar型,created_at,updated_at 是 datetime类型,其中 city字段 有索引

1,关闭表的索引

ALTER TABLE members DISABLE KEYS;

关闭keys , 会在导入过程中对新的record不建索引,加快导入速度.

2,导入数据

load data infile 'E:/members.txt' into table members fields terminated by ","   optionally enclosed by '"'  lines terminated by "\r\n" (name,password,city,created_at,updated_at);

fields terminated by “,” 字段分隔符, lines terminated by “\r\n” 行分隔符, 注意windows下的默认行换行符是 \r\n ,UNIX 下的换行符是 \n , optionally enclosed by ‘"’ 对于 字符型字段 加双引号 , 不是指字符型的,例如int 则不加双引号

members.txt 文件内容形式:

"wxianfeng","wxianfeng","beijing","2010-06-30 00:07:45","2010-06-30 00:07:48"
"kaili","kaili","suzhou","2010-06-30 00:07:45","2010-06-30 00:07:48"

最后 (name,password,city,created_at,updated_at) 指定依次导入的字段

那么 members.txt 又是怎么来的呢 , 你可以导出一个表瞧瞧就知道了 , 导出方法如下:

select * from members into outfile 'E:/members.txt' fields terminated by "," optionally enclosed by '"';

那么下面就是你有什么办法快速生成上面的 members.txt 了,我用ruby写了个脚本生成了 500 万条数据:

# members(name,password,city,created_at,updated_at)

citys = %w(beijing shanghai guangzhou nanjing wuhan xihan hangzhou dalian jinan hefei)

arr = ('0'..'9').to_a + ('a'..'z').to_a

File.open("E:/members_1.txt","a+") do |file|
  2_000_000.times do |ele|
    p "generate --- #{ele}"
    str = ''
    5.times { |t| str << arr[rand(arr.size)] }
    time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
    file.write("\"#{str}\",\"#{str}\",\"#{citys[rand(citys.size)]}\",\"#{time}\",\"#{time}\"\n")
  end
end

最后生成 500 万条数据后 , 导入的速度非常之快 , 据官方介绍 load data infile 的方式是sql导入速度的20倍 ,快的根本原因我想应该还是生成的文件小,纯粹数据的形式,容易快速加载到内存里

3,再开启 KEYS

ALTER TABLE members ENABLE KEYS;

innodb 引擎表的导入:

1,导入前关闭表的唯一性校验

SET UNIQUE_CHECKS=0;

2,关闭自动提交
innodb型的表是事务安全的,每一条sql执行后都会自动提交,关闭后将会提交导入速度

SET AUTOCOMMIT=0;

3,导入数据

和之前 myisam 表的导入方式相同, 但是有一点不同的是,生成members .txt 数据的时候 ,把id也生成,因为innodb类型的表是按照主键顺序保存的,对于给定有序的文本,比没有顺序的要快的多

4,开启之前的 唯一性和事务自动提交功能

SET UNIQUE_CHECKS=1;
SET AUTOCOMMIT=1;

最主要的还是要使用 load data infile 的导入方式,无论怎样, 你不要使用 单条 insert ,一条一条的插入, 这样网络io开销会巨大,速度很慢 , 实在不行,你应该构造 一个insert into 多个value的方式来导入 , 也会快很多,这个就是默认的mysqldump导出表数据所用的方法,还可以发现 在导入之前 , 它进行了锁表:

LOCK TABLES `members` WRITE; 
insert into members values (......),(......),(....)
UNLOCK TABLES;

ref:
参考了 网易出的那本mysql书籍


capistrano + nginx + thin + subversion 自动部署

Posted by wxianfeng Fri, 02 Jul 2010 19:45:00 GMT

以前部署app还是用很老套的ssh客户端,windows我使用 SSH Secure Shell Client , linux 上使用 Filezilla , 传代码非常之慢,今天体验下rails capistrano 自动部署 , 确实挺方便的 , 实现了ssh远程登录操作的一系列操作 , capistrano 的实现原理是 , 本地客户端 执行命令,实质进行了一系列远程操作,部署同步的根本是check 版本控制系统的最新版,版本控制系统可以是subversion,git等 , 我用的是 subversion,步骤:

我的环境;nginx + thin + capistrano 2.5.19 (客户端) + centos 5.5 + subversion

1,安装 capistrano

gem install capistrano

2,rails app加入 capistrano 配置文件

capify .

3,配置 config 下的deploy.rb ,最核心的东西都在这个文件里

set :application, "wxianfeng_com" #  工程名, 随便写了 

set :repository,  "svn://173.230.155.150/wxianfeng_com"   # svn 地址
set :scm, :subversion # 使用 suversion版本控制
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
set :scm_username, 'wxianfeng'   # svn 用户名
set :scm_password, '123456'  #svn 密码
set :checkout, "export" # 使用export方式, svn版本信息不需要 track下来

role :web, "173.230.155.150"                          #  这三个填你服务器的ip地址
role :app, "173.230.155.150"                          # 
role :db,  "173.230.155.150", :primary => true # 
# role :db,  "your slave db-server here"

set :deploy_to, "/usr/local/system/www/wxianfeng_com"  # 部署到remote 服务器路径
set :deploy_via, :remote_cache # 通过 remote_cache 方式部署 ,还有一种本地copy的方式
set :user, "root"  # remote 服务器的用户名 
set :runner, "root" # 同上
set :password, "123456" # 服务器的 root 密码

set :rake, "/usr/bin/rake" # 服务器上rake 命令path
default_run_options[:shell] = false 
default_run_options[:pty] = true
set :use_sudo, true # 允许使用 sudo

namespace :deploy do
  
  task :start , :roles => :app do
    invoke_command "cd  .." # invoke_command 是连到 服务器上执行的命令
    invoke_command "thin start -C /etc/thin/thin.yml"
  end
  
  task :stop ,:roles => :app  do
    invoke_command "killall thin" # or "thin stop -C /etc/thin/thin.yml"
  end

  task :restart, :roles => :app, :except => { :no_release => true } do
    #run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
    invoke_command "cd .."
    invoke_command "thin restart -C /etc/thin/thin.yml -O" #  -O 是onebyone(关一个,启一个) 启动thin ,注意是 大写
  end

  desc "Symlink shared configs and folders on each release."
  task :symlink_shared do
    run "rm -rf #{release_path}/public/files" # 创建 软连接, 保证服务器上 图片的 同步
    run "ln -nfs #{shared_path}/public/files #{release_path}/public/files" # or  current_path    run 等同于 invoke_command
  end


end

after 'deploy:update_code', 'deploy:symlink_shared' # 在 deploy:update_code 执行后 callback deploy:symlink_shared

以上当你执行 cap deploy 后 大体执行过程是 先 update_code 然后 deploy:symlink_shared 最后 deploy:restart 服务器 , 上面有一个thin的配置 /etc/thin/thin.yml,如果没有的话, 可以到服务器上生成:

thin config -C /etc/thin/thin.yml -c /usr/local/system/www/wxianfeng_com/current  -s 3 -e production -p 3000

4,部署
第一次部署需要运行下面的命令:

cap deploy:setup

报错:

sh: sudo: command not found 

解决:

>vi  /etc/sudoers
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults    requiretty #将这行注释掉

这个命令会在服务器上配置好相关的目录结构.然后再运行:


cap deploy:check



检查通过

第一次部署用的命令是:


cap deploy:cold

以后部署都可以直接用:

cap deploy

修改 nginx 配置:

 root   /usr/local/system/www/wxianfeng_com/current/public/;



修改 root 根目录为 cpistrano 的 current_path 的 public 目录
ok , 你以后更新代码 只需要 cap deploy 就ok了 , 前提是你先 commit 代码到 svn 服务器上 , 用capistrano好处还有一个可以 备份代码 , 因为每一次部署 其实就是相当于 track了svn版本里的最新代码

See:
http://gautamrege.wordpress.com/2009/11/10/capistrano-nginx-thin-deployment-on-linode/
http://weekface.info/2010/03/15/rails-git-capistrano
http://rustammamedov.wordpress.com/2009/12/27/capistrano-nginx-mongrel-deployment/