Archive for March, 2008
并发相关
Posted on March 26, 2008 - Filed Under Uncategorized
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好过了,你们的讨论本来就有答案的
Mercurial续
Posted on March 19, 2008 - Filed Under Uncategorized
上次谈到一些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基本使用
在Linux命令行下发送带附件的邮件
Posted on March 10, 2008 - Filed Under Linux
购买的虚拟主机没有备份服务(另外收费),但是很好地有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 |smtp|
smtp.send_message mail.to_s, mail.from, mail.to
end
后来我找到一些更简单的做法
uuencode file.txt file.txt | mail email@address.com
不过这种做法是不会产生附件的,仅仅将文件内容编码之后当content发送
如果你的机器上有装mutt的话,就更简单了
echo "no content" | mutt -s "subject" -a file.txt email@address.com
我现在就是用这种做法
Read More..>>在Dreamhost上安装Trac(2)
Posted on March 6, 2008 - Filed Under Uncategorized
前文说明了如何在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
在Dreamhost上安装Trac
Posted on March 6, 2008 - Filed Under Uncategorized
在公司使用了一段时间的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已经可以开始使用了
待续