Monthly Archives: March 2008

并发相关

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好过了,你们的讨论本来就有答案的

Posted in Uncategorized | 1 Comment

Mercurial续

上次谈到一些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基本使用

Posted in Uncategorized | Tagged | 1 Comment

在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 = "[email protected]" mail.subject = "#{backup_name} backup" mail.text = "no content" mail.attach backup_attach   Net::SMTP.start("localhost") do … Continue reading

Posted in Linux | 5 Comments

在Dreamhost上安装Trac(2)

前文说明了如何在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 ^$ … Continue reading

Posted in 互联网 | Tagged , | Leave a comment

在Dreamhost上安装Trac

在公司使用了一段时间的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到正确的位置,因此需要自己处理一下 然后就可以通过 … Continue reading

Posted in 互联网 | Tagged , | 1 Comment