nighty

折腾的年华
posts - 37, comments - 143, trackbacks - 0, articles - 0

posted @ 2011-03-09 16:48 寒武纪 阅读(13720) | 评论 (4)编辑 收藏

1.  Redmine安装前提条件

官方的安装指南:http://www.redmine.org/projects/redmine/wiki/RedmineInstall

Notes:

Ruby 1.9 is not supported yet. You have to use Ruby 1.8.x as stated above.
RubyGems 1.3.1 or higher is required (Rails 2.3.5 will fail with RubyGems 1.5.0 and later, stick to previous versions of RubyGems)
Rake 0.8.3 or higher is required
Rack 1.0.1 is required. If you don't have this exact version, database migration would fail.
I18n 0.4.2 is required for Redmine >= 1.0.5

 安装主要版本选择:ruby 1.8.6rubygems1.3.5rake 0.8.3rack 1.0.1I18n 0.4.2rails 2.3.5

     
2.  yum安装ruby

使用yum安装ruby相关的软件

yum -y install ruby ruby-devel ruby-libs ruby-irb ruby-rdoc ruby-mysql

如果没有ruby-mysql则从http://www.tmtm.org/en/ruby/mysql/ 下载手动安装

3.
升级ruby
1.8.6版本

/etc/yum.repos.d/ 目录下创建yum源文件ruby.repo,内容如下:

--------------------------------------------------------------------------------

[ruby] 
name=ruby 
baseurl=http://repo.premiumhelp.eu/ruby/ 
gpgcheck=0 
enabled=0 

--------------------------------------------------------------------------------

升级ruby

yum --enablerepo=ruby update ruby

4.  安装rubygems1.3.5

因为直接通过yum安装的rubygems0.9.4,所以选择手工下载安装的方式

wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
tar xzvf rubygems-1.3.5.tgz
cd rubygems-1.3.5
ruby setup.rb

安装完后运行gem –v检查一下版本是否正常,(当然还可以直接用yum安装,然后通过gem本身的更新来实现,那从rubyforge下载的就应该是.gem结束的升级文件)

5.  安装rails 2.3.5

gem install rails –v=2.3.5

6.  安装Rack 1.0.1

gem install rack –v=1.0.1

7.  安装Rake 0.8.3

gem install rake –v=0.8.3

8. 安装I18n 0.4.2

gem install -v=0.4.2 i18n

9.  下载和安装redmine1.1.1

wget http://rubyforge.org/frs/download.php/74128/redmine-1.1.1.tar.gz

拷贝压缩文件到要安装的目录,比如 /var/www目录下,解压

tar xzvf redmine-1.1.1.tar.gz

cd redmine-1.1.1

配置数据库连接yml文件(redmine目录下进行如下操作)

cd config

cp database.yml.example database.yml

vi database.yml

添加如下内容:

production:
adapter: mysql
database: redmine
host: localhost
username: root
password: xxx
socket: /var/lib/mysql/mysql.sock

数据库要预先创建好,如果你装好了mysql,直接运行mysql -uroot -p 登录,然后create database redmine,主机名、用户名、密码也要写对。

10.   生成会话密钥

 rake config/initializers/session_store.rb

11.  rails数据库生成和数据初始化

rake db:migrate RAILS_ENV=production
rake redmine:load_default_data RAILS_ENV=production

12.  运行测试

如果没有异常,在redmine安装目录下执行启动服务器的命令:

ruby script/server -e production &

这样redmine就会侦听本机IP3000端口,输入URLhttp://IP:3000 就可以看到登陆界面,如果是本机就直接 http://localhost:3000

但这样只是以独立的方式启动redmine的服务器,在后台执行,有些不足,因为客户端的访问日志会在终端上直接显示。并且你退出终端时,服务器进程也会跟着关闭,后面再介绍启动和关闭脚本的编写,以及如何用nginx做反向代理,或是用Apache也可以,这个网上可以搜索到很多资料。

13.  附注:redmine默认端口是3000,如果你是远程操作,直接访问主机的IP或是域名是无法打开主页的,因为centosiptables默认是没有开通3000端口的,所以需要开放端口。

打开iptablesvi /etc/sysconfig/iptables

添加下面一行到文件里面

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT

然后重启iptables

/sbin/service iptables restart

到此为止就完成redmine的安装,过程比较繁琐,主要是各种组件和模块的版本匹配问题。大多数情况下根据安装的错误提示和Google就可以解决滴。

 

posted @ 2011-03-01 09:47 寒武纪 阅读(3078) | 评论 (1)编辑 收藏

        非常喜欢这种轻量级的JDBC封装,比起Hibernate和iBatis,可以非常自由和灵活地运用和自行二次封装,由于dbutils的BeanHandler转换方式采取了反射技术,在性能上肯定有所损失,所以项目中基本上都使用MapHandler方式来转换数据,当然就是自己写的代码多一点,也无所谓。一般的查询、子查询、联合查询、包括视图查询等等都很正常,但是发现一个比较小的问题,就是在使用聚合函数的场所,例如:select user_type, count(*) as count from `user` group by user_type这种类型查询的时候,MapHandler方式不起作用,as列都变成key为空串的K-V对,导致有许多地方使用map.get("")代码的情况出现,这种写法当然是不太好的,容易出问题。
        鉴于前面没有时间了解,就都粗略使用了上面那种粗暴的map.get("")来处理,最好的情况是让dbutils组件能自动识别到as类型的列名。于是有空了就专门看了看它的源代码,发现最主要的一段代码如下:
 1public Map<String, Object> toMap(ResultSet rs) throws SQLException {
 2        Map<String, Object> result = new CaseInsensitiveHashMap();
 3        ResultSetMetaData rsmd = rs.getMetaData();
 4        int cols = rsmd.getColumnCount();
 5
 6        for (int i = 1; i <= cols; i++{
 7            result.put(rsmd.getColumnName(i), rs.getObject(i));
 8        }

 9
10        return result;
11    }
        CaseInsensitiveHashMap是dbutils自定义的一个Map,忽略键大小写的K-V字典,但是key使用的是ResultSetMetaData.getColumnName(),我想问题大概出在这里,于是认真翻了翻java的api文档(开发做久了容易遗忘基础),果然,原来getColumnName()是:获取指定列的名称;而as关键字之后,使列名称变成用于显示的意义,这个时候应该使用getColumnLabel():获取用于打印输出和显示的指定列的建议标题。建议标题通常由 SQL AS 子句来指定。如果未指定 SQL AS,则从 getColumnLabel 返回的值将和 getColumnName 方法返回的值相同。自己手动试验了一下,果然如所料,问题就出在这里。
        所以呢,如果想要dbutils在自动转换Map及MapList时能识别聚合函数的列名,那么最好的做法就是重载这种方式,懒一点的,你就干脆修改上面那段代码,让它判断是否使用了as关键字。个人暂时搞不清楚官方为什么没有考虑这一步,有时间再思考一下!

posted @ 2011-02-12 17:33 寒武纪 阅读(2997) | 评论 (7)编辑 收藏

    在项目中刚好有一个地方需要在服务器端处理一个请求后,重定向到另一个Action,这样浏览器的url才会变成另一个url,用户重新刷新时,才不会弹出一个对话框问你是不是要重新提交form。于是就自然而然地用了redirectAction。大概如下:
   
1<result name="myInfoSuccess" type="redirectAction">
2    myapp_myInfo.action?msg=${msg}
3</result>

    因为重定义会丢失所有的请求参数和值栈,所以这里转向时,加了一个请求参数msg,msg在要重定向的action中设置。
    问题来了,重定向到myapp_myInfo.action时,这个Action里面取出msg参数时变成乱码!!! 不论中文或是英语还是数字,全是乱码,折腾了一翻,URLEncoderURLDEncoder进行URL Base64编码和解码处理,包括new String(msg.getBtye("ISO-8859-1"), "UTF-8")这种处理方式仍无法奏效。google了一下并且抱起书本认真看了看struts2重定向问题后。大概有了个思路。
    所有的重定向操作都会丢失所有的请求参数、请求属性等,当然包括Action的处理结果也会丢失。 
    首先搞清楚redirect、redirectAction的区别:
    1. redirect类型struts2是调用HttpServletResponse的sendRedirect(String)方法来重定向到指定的资源,可以是一个视图结果,也可以是其它类型的Action;
    2. redirectAction同样是重新生成一个全新的请求。但是struts2内部却是使用ActionMapperFactory提供的ActionMapper来重定向,它只能跳转到另外一个Action;

         由于redirectAction使用的是ActionMapper来重定向,也就同时使用ActionMapper的编码方式重新进行编码,这就导致了后面在取出参数时变成乱码,没有具体阅读它的源代码,但是多次不同的编码再想重新还原出来就有点麻烦了。而redirect是使用HttpServletResponse来重定向,就不存在上面的问题。最后改为redirect来重定向,结果如下:
1<result name="myInfoSuccess" type="redirect">
2    <param name="location">myapp_myInfo.action?msg=${msg}</param>
3    <param name="encode">true</param>
4</result>
        注意:在myapp_myInfo.action对应的Action必须对msg参数做一次转码,因为前面的Action过来时就做了URL base64编码,如果直接发给浏览器,就会在浏览器看到一串带%的URL base64编码字符,所以要加上
1String msg = URLDecoder.decode(getMsg(), "UTF-8");
2setMsg(msg);
       把它设置回为中文,浏览器才能正常。

       还得提到另一个重定向类型chain,它是Action链,还能维持当前的值栈不变。不过用它重定向后,虽然跳到其它Action,但是在浏览器端的URL是不会变化的,这样开头提到的那个问题仍是无法解决的!

posted @ 2011-01-14 16:41 寒武纪 阅读(6742) | 评论 (3)编辑 收藏

     摘要: 项目中使用了FreeMarker做为视图技术,相对来说因为freemarker在视图上有一些逻辑处理功能,某些地方就显得比较方便,特别是macro的使用,当然也不是说JSP就没有这个功能,只是以前用JSP写起来没有这么顺手.......  阅读全文

posted @ 2010-11-10 15:43 寒武纪 阅读(3076) | 评论 (3)编辑 收藏

     摘要: 都说roller在国外是二次开发博客系统的首选,但是下载源代码之后发现是它是基于netbeans项目结构开发的。平时用习惯了Eclipse,所以想搬到MyEclipse上面,但没有想到居然那么不容易,折腾了整整一天,才最终跑起来。网上的参考信息太少,大概都是那二三篇的转贴,全部结合起来就差不多可以解决,借此总结一下,希望用到的朋友有参考作用!  阅读全文

posted @ 2009-11-22 21:04 寒武纪 阅读(2233) | 评论 (2)编辑 收藏

     摘要:   阅读全文

posted @ 2009-10-14 17:41 寒武纪 阅读(2146) | 评论 (1)编辑 收藏

    最近的二个项目,由于规模较小,都是十张表之内,而且表关联非常少。所以用了一下iBatis做为数据库关系映射,本着减少手写JDBC代码的目的,想着可以减少工作量。但是却遇到了二个令人郁闷的问题。由于环境的限制,使用了jdk1.4.x编译的iBatis2.3版本,没有使用最近的。

    第一问题:  其中的一个项目,有一个表为它配置了sql Map的一个delete操作,非常简单,大概就是delete from xxx where id=#value#这样的语句,然后用sqlMapClient进行操作,日志打印完全正常,没有报任何Exception,返回影响记录数也是正确的。但是进数据库一看,巍然不动!左查查,右查查,查不出任何毛病。更奇怪的是,数据库表之间的所有关联和索引全部取消,还是存在这问题。其它的三个字段比较少的表,这样配置,同样的api调用却正常!这个出问题的数据库表字段大概20+个左右。

    第二个问题:另一个项目,是二期重构,本来一期也不复杂,全部是使用JDBC实现的,只是有些表的字段太多,JDBC写到烦,特别是处理一些NULL的插入,还有批处理时异常日志的详细处理也有点烦。近期做二期升级,就算采用iBatis来减少一些代码量,于于喜涮涮地搞上去了,代码的确减少了许多。单元测试也能通过,后来就设置了比较复杂的数据。发现问题的现场如下:在一个业务接口中,一个事务中包含了许多SQL操作,有delete,也有insert,大概十个sql语句左右,全部放在一个batch中执行,整个batch提交一个事务。测试环境提供了31个类似的业务数据,总共执行31个事务,采用for的循环执行调用,每逢索引 i = 10*n  的时候就会卡住,这个操作得花很长时间,最后能通过。后来进行跟踪,发现是在执行第一个语句delete一个记录(delete from xxx where id='xx')同样也是单表删除。搜索了google,baidu,没有任何资源,翻遍了文档没有任何说明,查了网站FAQ也没有办法。于是,只能.......郁闷!

   为什么遇到delete都会有这个问题?不晓得有没有高手遇到同样的问题,这里算是总结的同时也提问,希望有遇到相同类型的高手给个解决的方案。如果不行,就得倒回去用JDBC实现,就此iBatis的体验使用也就搁置,估计以后也不会碰它了。Hibernate就不用了,有点小题大作。
   google了才知道,原来iBatis的书籍、论坛、资料、讨论等等相比Hibernate要少很多。学习是很简单,但是遇到这种细节的时候,又不太愿意花时间去研究源代码(都是现实所逼,有个球时间呀?)。所以选框架要慎重!!!

posted @ 2009-08-21 16:52 寒武纪 阅读(4295) | 评论 (24)编辑 收藏

     摘要:   阅读全文

posted @ 2009-07-31 15:58 寒武纪 阅读(2135) | 评论 (6)编辑 收藏

Java环境安装
    1.  从sun主页下载JDK for Linux版本。这里下载的是jdk-6u6-linux-i586.bin。
    2. 用root用户登录ubuntu,或是在普通用户下用su命令切换用户。切换到所需的安装目录。类型:cd <目录路径名>   例如,要在 /usr/java/ 目录中  安装软件,请键入:cd /usr/java/,把jdk-6u6-linux-i586.bin文件拷贝这个目录里面,设置权限为可执行类型:chmod a+x jre-6u6-linux-i586.bin
    3. 启动安装过程。键入:./jre-6u<version>-linux-i586.bin。接下来会提示二进制的许可协议,键入yes回车即可。安装过程如果遇到一些问题,都同样键入yes就可以。
    4. 一路下来,最后看到Done字样,就完成了Java环境的安装。安装的位置就是当前目录 /usr/java,当然你可以选择在别的位置。可以用ls命令查看一下是否正常。

环境变量配置
   上面安装完毕后,直接在shell里面输入java是不起作用的,需要先配置一下环境变量。一般都会用export命令,不过这样设置只对当前shell起作用,重启或是切换到别的shell会话就不起作用了。可以选择配置 .bashr文件。用vi或是gedit打开,在末尾添加下面的内容
   export JAVA_HOME=/usr/java/jdk1.6.0_06
   export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
   export PATH=$PATH:$JAVA_HOME/bin
   然后保存。再在shell里面试验一下是否安装成功。echo一下各个变量是否正常,然后输入java -version看看。
  还有一种方式是修改/etc/profile,这样相当于修改系统配置文件,对所有用户都有影响,我在尝试的过程可能输入了一些异常字符,导致整个ubuntu无法用GUI登录,无奈只能用文本登录,然后再次把profile改回来才正常。
   好了之后可以先试一下用vi新建一个Hello的Java文件,然后编译一下试运行。

Eclipse安装
   Linux下面的Eclipse在ubuntu的界面渲染下看起来非常漂亮。先从Eclipse社区下载一个Linux版本的,这里下载的是europa版本的gz包。只要解压到一个目录就可以,这里选择/opt/eclipse下面。Eclipse是解压就可以使用的。不过为了方便,我们在桌面做一个启动器把启动目标指向到Eclipse的安装目的地,选择里面已有的图标文件,这样就完成了。不过默认Eclipse是找不到Java执行路径的,有网友写了这样一个脚本eclipse.sh 放到/usr/local/bin目录下,记得加上775权限。然后把启动器位置指到这里eclispe.sh。下面是eclipse.sh的内容:
    #!/bin/bash
    #
    # 执行 eclipse 2.1.1
    #
    export JAVA_HOME=/usr/java/XXX
    export CLASSPATH=/usr/java/XXX/lib
    /opt/eclipse/eclipse -vm /usr/java/XXX/bin/java -data ~/workspace &
    # -vm 参数用以指定使用哪一个 jvm 来执行Eclipse,
    # -date参数用以指定Eclipse的数据目录。在此指定其存在用户根目录(~)下的workspace目录中
  
   还有一个比较笨的方法,Eclipse默认会去找它自己目录下是不是有jre存在,如果有,它就可以启动,那么你可以直接把先前安装好的JDK里面的JRE目录整个复制到Eclipse里面。然后就可以直接运行了。下面看一下效果
  

posted @ 2008-08-29 17:07 寒武纪 阅读(38166) | 评论 (6)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页