<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.5.1" -->
<rss version="0.92">
<channel>
	<title>Sparkle's Workshop</title>
	<link>http://weavesky.com</link>
	<description></description>
	<lastBuildDate>Wed, 07 May 2008 13:22:38 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>我为什么放弃使用cacti</title>
		<description>本来想趁着把cacti从我的生产服务器中移除之前，把我之前的安装配置写成一篇文章，结果发现我已经无法理解cacti是怎么配置的，这也是我放弃使用它的其中一个原因。

在这里，我先说说cacti和mrtg、rrdtool之间的关系，或许还有一些朋友不是很了解。mrtg和rrdtool都是Tobi Oetiker的作品，rrdtool是一个循环式数据库工具，它只负责存储数据，而mrtg是一个采集和画图工具。经常我们能看到cacti和mrtg的对比，那是因为他们两者的功能是一致的，都是采集画图，其实cacti也是是用rrdtool来存储数据，甚至更多其他的网管软件，都是使用rrdtool来存储，我只想说，rrdtool是一个神物。绝大部分人都认为cacti比mrtg好，的确，mrtg比较久远了，功能也比较欠缺，cacti通过php和mysql的辅助提供更多的功能，也提供更直观的界面

但是，cacti太复杂了。需要php（还好），需要mysql（我真的没有的话怎的），还有那个烂鬼snmp协议（当然，mrtg也是通过snmp采集协议的）。我真的不明白，snmp是一个怎样的简单网络管理协议，我觉得一点也不简单，也不直观。或许可能是因为我没有受过正统的网管培训的缘故？说实在话，我真的不知道当初我是怎么把linux下面的snmpd的配置调出来的，基本上完全不明白每一个参数是什么意思，参数又是怎么跟网络流量，硬盘空间挂上关系。当然，如果你的对象是一些cisco设备就不一样，一般情况下他们都是预配置好暴露什么数据。但是如果你的设备是一台linux服务器，那使用snmp协议就变得很麻烦。

我需要一种agent模式的网管软件，而不是一个什么简单通用的网络协议，agent跟它的采集器之间跑什么协议我不关心，当然如果可以简单地做二次开发就更好了。其实，在linux下使用snmp来采集数据，某种程度都可以说是一种agent模式，因为我需要在linux机器上安装snmpd这个agent，只是这个agent很难配置。反正我都要在linux上面安装软件的，何不选择一个很直观的agent模式的软件呢，而且是可以直接调用shell之类的实现监控script的功能，说实在话，怎么通过snmpd然后调用script或许我需要的数据，我真的不知道。

于是，我选择了nagios，很简单明了的使用方法，和plugins编写方法，我甚至还用ruby写了一个script来监视某个进程是否还在运行的plugin。可惜nagios并不支持数据采集，它仅仅是一个监控，监视某些状态值是否正确，而没有把数据值的历史记录下来，nagios并不使用rrdtool。其实，nagios并不是跟cacti/mrtg等同的工具，我还需要一个采集画图的工具。再搜索nagios资料的时候，我发现twitter也是是用nagios的，另外他们还是用了munin。munin正是我也需要的东西，agent模式，不需要mysql，方便的插件编写。我只花了半天时间就把它使用起来了，迟点还打算写一些munin的插件。

我是没有打算把cacti的安装配置使用写下来了，迟点我把nagios和munin的一些心得写下来吧。
 </description>
		<link>http://weavesky.com/2008/05/07/no-more-cacti/</link>
			</item>
	<item>
		<title>并发相关</title>
		<description>http://www.javaeye.com/post/498557



copy on write array list
ConcurrentHashMap
ReentrantLock
ReentrantReadWriteLock
CAS
我都有在用，JDK内置
一直都想写一些关于它们的文章，不过始终太松散，而且我是知道原理然后直接用API而已

我随便说一些
楼主的copy on write模式是可取的，JDK很早就引入copy on write array list来处理Listener部分，在写入非常非常少的情况下，copy on write其实是很好的。至于楼主的实现好不好就不知道了

ConcurrentHashMap用了多个锁来处理，里面有一个一个的bucket来隔离锁，默认就是16个bucket&锁。但是它也有缺点，就是不能保证数据绝对准确，例如他的size就是不准确的。但是它肯定是线程安全的

ReentrantLock是可以代替synchronized的东西，除了写起来比synchronized难稍稍。默认是non-fair模式，比synchronized快很多，如果改成fair就会下降到跟synchronized差不多

ReadWriteLock很简单，read不互斥，write互斥

CAS就是AtomicInteger之类的了，使用了CPU的交换指令，理论上比锁快，但是在高并发的环境一样会下降


你们还是看一下JDK源代码和JavaDoc好过了，你们的讨论本来就有答案的 


 </description>
		<link>http://weavesky.com/2008/03/26/about-concurrent/</link>
			</item>
	<item>
		<title>Mercurial续</title>
		<description>上次谈到一些Mercurial的事情，后来因为忙别的事情没有继续写下去。中途跟cyfdecyf通过几次email讨论Mercurial。总体来说，我对Mercurial和分布式版本管理的理解还是比较松散的，比较难形成文章，但还是很希望把我所知道的写出来。

我对分布式版本管理的理解很简单。首先这里假设你有一般版本管理软件的概念（CVS或者SVN）。假设你在家里装了一个SVN服务器，你在家里编写的代码都提交上去。在公司也装了一个SVN，你在公司编写的代码也都提交上去。这里就有两个完全独立的SVN服务器了。分布式版本管理，就是这两个SVN服务器之间可以互相提交，其操作就像你提交上其中一台SVN那样，SVN之间互相提交就会将多个changeset同时提交。而且这两个SVN服务器没有主次之分，这样处理是很容易混乱的，实际上，我们会架设另一个SVN服务器，作为两个SVN的父，两个SVN向父提交changeset。这个行为仅仅是方便我们管理的一个比较好的参考做法，并没有强制。另外，当然SVN服务器是不支持互相提交的，于是我们需要一个分布式版本管理软件。

个人觉得，一台SVN就好像一台MySQL，我们只有一个数据库。而分布式版本管理就好像Master-Master MySQL集群。有经验的朋友就会知道，在集群中使用自增字段是不可取的，就像SVN的changeset id是自增的不能适应分布一样。做MySQL集群很经常会用UUID作为主键，分布式版本管理也使用了类似的机制来保证多个库之间的changeset有唯一的ID不会冲突。这个已经是比较细节的处理问题。这里暂时不打算细节研究具体的机制或者使用方法，先有一个大概的概念，看软件的refrence很快会上手的。

再待续

预告：
权限问题
Mercurial目前的情况
远程模式
在Dreamhost上使用Mercurial
Mercurial基本使用 </description>
		<link>http://weavesky.com/2008/03/19/mercurial-more/</link>
			</item>
	<item>
		<title>在Linux命令行下发送带附件的邮件</title>
		<description>购买的虚拟主机没有备份服务（另外收费），但是很好地有SSH权限和Cron权限，于是写了一个简单的shell脚本备份打包mysql的数据，然后email到我的邮箱。但是Linux的mail命令并不能发送附件，于是自己写了一个小程序来发送附件。由于我比较熟悉Ruby，于是就用Ruby来实现，当然你也可以用Python或者Perl来实现

to_mail = ARGV[0]
backup_name = ARGV[1]
backup_attach = ARGV[2]

require 'net/smtp'
require 'rubygems'
require 'mailfactory'

mail = MailFactory.new
mail.to = to_mail
mail.from = "backup@weavesky.com"
mail.subject = "#{backup_name} backup"
mail.text = "no content"
mail.attach backup_attach

Net::SMTP.start("localhost") do &#124;smtp&#124;
  smtp.send_message mail.to_s, mail.from, mail.to
end


后来我找到一些更简单的做法

uuencode file.txt file.txt &#124; mail email@address.com

不过这种做法是不会产生附件的，仅仅将文件内容编码之后当content发送

如果你的机器上有装mutt的话，就更简单了

echo "no content" &#124; mutt -s "subject" -a file.txt email@address.com

我现在就是用这种做法
 </description>
		<link>http://weavesky.com/2008/03/10/mail-an-attachment-at-linux/</link>
			</item>
	<item>
		<title>在Dreamhost上安装Trac(2)</title>
		<description>前文说明了如何在Dreamhost安装Trac。安装完了怎么开始使用呢

因为Dreamhost是一个虚拟主机，因此我们不能使用tracd来启动，我们对外的唯一途径就是80端口的web server，也就是apache。而且我们不能自行安装apache的mod，于是也不能使用mod_python或者mod_wsgi的模式，也就是说只能用cgi或者fastcgi的模式，而本文只介绍fastcgi的做法

首先假设我们的站点的目录是~/mysite，而trac的目录在~/mytrac，而且我们已经初始化了一份trac

这里我把站点的目录和trac的目录分开，这样方便管理，而且站点其实需要很少文件的。我们只需要一个index.fcgi和一个.htaccess

这里是index.fcgi的内容

#!/bin/bash

export TRAC_ENV="${HOME}/mytrac"

export LD_LIBRARY_PATH=${HOME}/python/lib:${LD_LIBRARY_PATH}
export LD_RUN_PATH=${HOME}/python/lib:${LD_RUN_PATH}
export PATH=${HOME}/python/bin:$PATH

exec ${HOME}/python/bin/python ${HOME}/python/share/trac/cgi-bin/trac.fcgi


由于我们的python是安装在用户目录的，因此需要更多的预设环境变量
其实你也可以直接copy trac.fcgi过来在头部加上配置，但是我更喜欢自己些一个文件然后exec默认的fcgi文件
而且我exec的时候，可以直接指定使用的python的路径，而在trac.fcgi头部标注路径的做法似乎不太生效

接下来就是.htaccess文件

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [L]
RewriteRule ^$ index.fcgi

AuthType Basic
AuthName "Trac"
AuthUserFile ${HOME}/mytrac/trac.htpasswd
Require valid-user

首先就是rewrite了，把所有的请求都rewrite给index.fcgi
然后就是认证。非常可惜，Dreamhost并不支持在.htaccess里面使用Location指令，因此我不得不把整个site都加入验证了，因此我的site变得完全private了，本来应该只是针对/login做验证。我尝试了很久都没有解决方案

so it's done </description>
		<link>http://weavesky.com/2008/03/06/install-trac-on-dreamhost-2/</link>
			</item>
	<item>
		<title>在Dreamhost上安装Trac</title>
		<description>在公司使用了一段时间的Trac，觉得很不错，于是想在Dreamhost上安装一个Trac，方便记录自己的一些想法，也可以用作跟朋友一起做一些小项目。本文就是介绍如何在Dreamhost上安装Trac

Dreamhost的wiki里面也有提及如何安装Trac，但是相应的版本比较旧了，而且感觉也不是很完整，在参考wiki来安装的时候也碰到不少问题。最后还是决定安装目前最新版的Trac 0.11。之前介绍的在公司安装的是0.10，一来在windows下0.10一来的包都有二进制版本，二来那个时候0.11还没有很成熟。现在Trac官方网站已经把0.11的安装说明作为默认的了，看来0.11很快就要发布了。另外也因为在linux下安装本身就没有现成的二进制包，而0.11依赖的包更少，更容易安装。

Dreamhost上的python版本是2.3.5，另外因为没有办法使用根用户，所以索性在自己的用户底下安装最新的python2.5.1，更加容易处理。

从python网站下载Python-2.5.1.tgz，然后参看Dreamhost的wiki安装

cd
mkdir python
tar -zxvf Python-2.5.1.tgz
cd Python-2.5.1
./configure --prefix ~/python/ --enable-shared
make
make install
install -c -m 644 ./libpython2.5.a ~/python/lib/
install -c -m 755 ./libpython2.5.so ~/python/lib/
install -c -m 755 ./libpython2.5.so.1.0 ~/python/lib/

我把它安装在我的用户目录的python/下，有几个lib在用户模式下安装并不会copy到正确的位置，因此需要自己处理一下

然后就可以通过

~/python/bin/python

来测试是否正常工作

接着修改我们的.bashrc

export LD_LIBRARY_PATH=${HOME}/python/lib:${LD_LIBRARY_PATH}
export LD_RUN_PATH=${HOME}/python/lib:${LD_RUN_PATH}
export PATH=${HOME}/python/bin:$PATH


再测试一次正常工作

. ~/.bashrc
python


剩下来的工作，主要就是参看Trac官方提供的Install手册

先安装easy install

wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py


接着用easy install安装Trac和依赖的包

easy_install Pygments
easy_install Genshi
easy_install Trac


运行

tracadmin

成功，现在Trac已经可以开始使用了

待续 </description>
		<link>http://weavesky.com/2008/03/06/install-trac-on-dreamhost/</link>
			</item>
	<item>
		<title>令你的Mac Term更好用</title>
		<description>一直都认为Mac的Term很难用,包括内置的,还有很多人推荐的iTerm
我一直都在用iTerm,但是有很多问题,显示不了中文,输入不了中文,在VI或者一些软件下面不能用方向键(甚至我ssh到一台linux主机都不能用)

在windows平台的时候,使用putty或者securecrt等term软件,都有一大堆设置可以使用.而iTerm不停出新版本,也不见有多少个设置.就算用Linux,也没有那么多问题.还真的有狠心把MacBook装成Linux算了的想法

网上没有任何这方面的资料,还到一些blog里面留言询问别人的心得,也没有结果

研究了很久,终于知道怎么处理了

首先是方向键问题,我突然想想有可能emacs的键位可以使用,结果真的可以.^N ^P ^B ^F分别代表上下左右,这样用了一段时间
后来突然想起我在securecrt在设置把TERM改成Linux,改不会是有影响
于是在~/.profile加入

export TERM=linux

果然,方向键都有效了,整个操作变得跟Linux一样.原来securecrt的设置只是主动传给shell,而并不是它自己的设置.而且ssh到linux主机也正常了.后来研究发现,TERM会跟随ssh传递到远端shell,当然你可以自己再修改一次.

然后就是中文问题了,经过研究发现,我的Linux系统里面有一个文件/etc/inputrc
里面有一些关于meta的设置,而MacOS下面并没有这个文件
于是我在~/.inputrc加入一样的meta设置
 </description>
		<link>http://weavesky.com/2008/02/29/make-your-mac-term-better/</link>
			</item>
	<item>
		<title>给《程序员》写的MINA文章已经出刊了</title>
		<description>第一次给杂志写文章，没什么经验，行文一般般,呵呵。不过也是能顺利出刊。

对文章有任何意见和建议,或者讨论MINA,可以在这里留言

迟点我再写一些MINA的心得 </description>
		<link>http://weavesky.com/2008/02/26/mina-article-for-magazine/</link>
			</item>
	<item>
		<title>在CentOS4上安装JMagick</title>
		<description>用Java做网站经常要处理用户上传的图片，例如生成缩略图等等。虽然Java可以使用Java2D进行一些图片操作，但是功能和效率实在太差了。目前比较好的是用JMagick来进行图像处理，不过JMagick是通过JNI调用ImageMagick的，对平台有一定依赖。本篇文章就是在CentOS4上安装JMagick。

版本问题
CentOS4内置的软件版本一直都比较低，ImageMagick就只有6.0.7。另外JMagick也很久没有更新了，最新版是6.2.6-0，对应使用ImageMagick 6.2.6。而ImageMagick官方网站上只有6.3.8。情况有点混乱，最后决定使用最新版的ImageMagick和最新版的JMagick，似乎工作正常。

从ImageMagick官方ftp上下载最新版的ImageMagick和JMagick（是的，这里也有下载），分别解开。进入ImageMagick目录，运行

./configure --prefix=/usr/local/ImageMagick
make
make install

因为我不想跟系统的ImageMagick相冲，于是安装到独立的目录里面了

然后进入JMagick的目录，运行

./configure --prefix=/usr/local/jmagick \
--with-magick-home=/usr/local/ImageMagick \
--with-java-home=/opt/jdk
make all
make install


因为我的jdk是自己安装的，所以直接指定了。如果你遇到找不到java的错误，检查一下你是否配置了JAVA_HOME环境变量等，实在不行，就加上这个

export PATH=/opt/jdk/bin:$PATH


如果提示找不到ImageMagick相关资源，就加上这个

export PATH=/usr/local/ImageMagick/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/ImageMagick/lib


安装成功之后，就是在tomcat里面使用的问题了，我不习惯在整个系统里面增加环境变量的做法，一般来说，我会在具体的引用启动脚本里面加上环境变量的配置

打开tomcat/bin/catalina.sh，在顶部加入

LD_LIBRARY_PATH=/usr/local/ImageMagick/lib
CATALINA_OPTS="-Djava.library.path=/usr/local/jmagick/lib"


测试成功 </description>
		<link>http://weavesky.com/2008/02/21/jmagick-on-centos4/</link>
			</item>
	<item>
		<title>SSH over proxy</title>
		<description>一直都是用SecureCRT连接ssh服务器
由于我们的网络环境比较特殊，服务器在电信，但是我们办公的出口是网通
于是我用了一个在双通机房的sock服务器来proxy
SecureCRT很简单就可以设置使用代理了

今天在研究rsync，打算over ssh来使用
用cygwin装了rsync和openssh
但是直接用ssh连接实在太慢了
研究了半天，终于搞定ssh的proxy配置

从这里得知，通过在~/.ssh/config加入ProxyCommand来实现
但是我试过几个版本的netcat，都没有-X -x的参数
而connect-proxy根本不知道在哪里能找到

有一个朋友说可以用Corkscrew，但是它只支持http proxy

还有一个connect.c，不过网站挂了

最后终于被我找到这个，似乎就是connect.c的新网站，使用方法都一模一样

Features of connect.c are:
    * Supports SOCKS (version 4/4a/5) and https CONNECT method.
    * Supports NO-AUTH and USERPASS authentication of SOCKS
    * Partially supports telnet proxy (experimental).
    * You can input password from tty, ssh-askpass ...</description>
		<link>http://weavesky.com/2008/02/18/ssh-over-proxy/</link>
			</item>
</channel>
</rss>
