??xml version="1.0" encoding="utf-8" standalone="yes"?>18禁亚洲深夜福利人口,亚洲日韩精品无码AV海量,亚洲av无码专区在线观看下载 http://www.tkk7.com/nighty/折腾的年?/description>zh-cnSat, 10 May 2025 23:43:40 GMTSat, 10 May 2025 23:43:40 GMT60rsync同步文g的安装笔?/title><link>http://www.tkk7.com/nighty/archive/2013/04/12/397738.html</link><dc:creator>寒武U?/dc:creator><author>寒武U?/author><pubDate>Fri, 12 Apr 2013 04:23:00 GMT</pubDate><guid>http://www.tkk7.com/nighty/archive/2013/04/12/397738.html</guid><wfw:comment>http://www.tkk7.com/nighty/comments/397738.html</wfw:comment><comments>http://www.tkk7.com/nighty/archive/2013/04/12/397738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/nighty/comments/commentRss/397738.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nighty/services/trackbacks/397738.html</trackback:ping><description><![CDATA[pȝ为ubuntu serverQ二台机器A和BQIP为A 192.168.1.111QB 192.168.1.222<br />A为rsync serverQ启动ؓ守护q程QB为备份机Q做为rsync clientQ最后用crontab做一个简单的作业Q定时在B上执行同步文件的功能<br />A的安装和配置如下Q?br />1.  apt-get install rsync   可能提示pȝ已经安装有了<br />2. 配置文g/etc/rsyncd.conf<br />    默认安装时是不会有这个配|文件的Q但是可?cp /usr/share/doc/rsync/examples/rsyncd.conf /etc  把它CZ中的配置文g拯q来<br />    vi /etc/rsyncd.conf    q里参数有点多,但是有些可以先不,x重点?br />    [ftp]  q里是模块,可以配置多个Q这个是pȝ默认l出的一个配|,下面l一个本Z的配|示例:<br />--------------------------------------------------------------------------------------------------<br /><div># so omit the "pid file" line completely in that case.</div><div><span style="color: #008000;">pid file=/var/run/rsyncd.pid</span></div><div>#syslog facility=daemon</div><div>#socket options=</div><div></div><div># MODULE OPTIONS</div><div></div><div>[share]</div><div></div><div><span style="white-space:pre"> </span>comment = public archive</div><div><span style="white-space:pre"> </span><span style="color: #008000;">path = /var/www/pub</span></div><div><span style="white-space:pre"> </span>use chroot = no</div><div><span style="white-space:pre"> </span><span style="color: #008000;">max connections=2</span></div><div>#<span style="white-space:pre"> </span>lock file = /var/lock/rsyncd</div><div># the default for read only is yes...</div><div><span style="white-space:pre"> </span><span style="color: #008000;">read only = no</span></div><div><span style="white-space:pre"> </span>list = yes</div><div><span style="white-space:pre"> </span>uid = nobody</div><div><span style="white-space:pre"> </span>gid = nogroup</div><div>#<span style="white-space:pre"> </span>exclude = </div><div>#<span style="white-space:pre"> </span>exclude from = </div><div>#<span style="white-space:pre"> </span>include =</div><div>#<span style="white-space:pre"> </span>include from =</div><div><span style="white-space:pre"> </span><span style="color: #ff0000;">auth users = rsync</span></div><div><span style="white-space:pre"> </span><span style="color: #ff0000;">secrets file = /etc/rsyncd.secrets</span></div><div><span style="white-space:pre"> </span>strict modes = yes</div><div><span style="white-space:pre"> </span>hosts allow = 192.168.1.222</div><div>#<span style="white-space:pre"> </span>hosts deny =</div><div><span style="white-space:pre"> </span>ignore errors = yes</div><div><span style="white-space:pre"> </span>ignore nonreadable = yes</div><div><span style="white-space:pre"> </span>transfer logging = yes</div><div><span style="white-space:pre"> </span>log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.</div><div><span style="white-space:pre"> </span>timeout = 600</div><div><span style="white-space:pre"> </span>refuse options = checksum dry-run</div><div><span style="white-space:pre"> </span>dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz<br />---------------------------------------------------------------------------------------------<br />q里Q最上面的是pid文g位置。然后配|了一个模块名叫做shareQ最大连接数?Qread only = noQ指定ؓ非只读(不然同步时会有权限问题)<br />而后面的auth users = rsync 是指定一个同步的账户名叫做rsyncQ这个̎L认证文g?etc/rsyncd.secretsQ当然我们要创徏q个文g<br /><br />3.  创徏 /etc/rsyncd.secrets文gQ内容ؓQ?rsync:123  表示rsyncq个用户的密码是123 然后修改文g的权?chmod 600 /etc/rsyncd.secrets<br /><br />4.  rsync server做ؓ守护q程<br />     vi /etc/default/rsync<br />     可以看到开头处q样声明Q?br />------------------------------------<br /><div># start rsync in daemon mode from init.d script?</div><div>#  only allowed values are "true", "false", and "inetd"</div><div>#  Use "inetd" if you want to start the rsyncd from inetd,</div><div>#  all this does is prevent the init.d script from printing a message</div><div>#  about not starting rsyncd (you still need to modify inetd's config yourself).</div><div><span style="color: #ff0000;">RSYNC_ENABLE=inetd</span></div>-------------------------------------------<br />   做ؓ守护q程Q可以设|ؓtrue或是xinetd方式来启动。于是我们安装inetd   sudo apt-get install xinetd<br />   安装好后配置inetd的配|文? vi /etc/xinetd.d/rsync Q输入如下内容:<br />---------------------------------------------------<br /><div>service rsync</div><div>{</div><div>    disable = no</div><div>    socket_type = stream</div><div>    wait = no</div><div>    user = root</div><div>    server = /usr/bin/rsync</div><div>    server_args = --daemon</div><div>    log_on_failure += USERID</div><div>}<br />-------------------------------------------------------<br />然后启动xinetdQ?etc/init.d/xinetd restartQA服务器的rsyncd server完成了Q?br /><br />5.  B服务器由于是clientQ不需要配|,也不需要安装xinetdQ直接可以通过命o行执?br /><div>rsync --delete -azvv rsync@192.168.1.111::share /var/www/pub/<br />q个命o可以直接连接到192.168.111的rsync账户Q它会提CZ输入密码Q就是A中的secrets文g中的密码Q然后同步share模块到本机的/var/www/pub目录Q你可以事前在A机器上创Z个文件如test.txtQ随便写点内容,然后执行些命令,看是不是B上多了这样一个文Ӟ如果是,则表C已l连接成功。你接下来就可以做crontab了!</div></div></div><img src ="http://www.tkk7.com/nighty/aggbug/397738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nighty/" target="_blank">寒武U?/a> 2013-04-12 12:23 <a href="http://www.tkk7.com/nighty/archive/2013/04/12/397738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu Server 12.10 Mysql的主从复制笔?/title><link>http://www.tkk7.com/nighty/archive/2013/04/09/397601.html</link><dc:creator>寒武U?/dc:creator><author>寒武U?/author><pubDate>Tue, 09 Apr 2013 12:33:00 GMT</pubDate><guid>http://www.tkk7.com/nighty/archive/2013/04/09/397601.html</guid><wfw:comment>http://www.tkk7.com/nighty/comments/397601.html</wfw:comment><comments>http://www.tkk7.com/nighty/archive/2013/04/09/397601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/nighty/comments/commentRss/397601.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nighty/services/trackbacks/397601.html</trackback:ping><description><![CDATA[二台服务器,A的内|IP?92.168.1.111QB的内|IP?92.168.1.222QA做ؓmasterQB做ؓSlave<br />1.  配置A的Mysql<br />     (1)  vim /etc/mysql/my.cnf<br />           L[mysqld]D中 server_id =1 和log_bin=/var/log/mysql/mysql-bin.log?注释<br />           加上  binlog-do-db = s3     s3是要同步的数据库的名称Q如果没有这一行,表示同步所有的数据Q另?binlog_ignore_db = mysql。要表示忽略同步的数据库名称为mysqlQ如果有多个要指定同步或是忽略同步的数据Q就配置多行Q保存退出?br />     (2) 创徏一个复制用的̎?名称为repl,允许从远E连接,密码?23456)Q?<br />          GRANT REPLICATION SLAVE, RELOAD,SUPER, NO *.* TO repl@'%' IDENTIFIED BY '123456';<br /><font color="#666666" face="宋体, Arial"><span style="font-size: 12px; line-height: 26px;">        </span></font>FLUSH PRIVILEGES;<font color="#666666" face="宋体, Arial"><span style="font-size: 12px; line-height: 26px;"><br /></span></font>     (3) 重启mysql服务Q或是直接reboot机器也可?br />     (4) q入mysqlQ然后用 show master status\G  查看二进制日志的状态,看到cM以下的结果:<br />          +------------------+----------+--------------+------------------+<div>          | File                      | Position  | Binlog_Do_DB | Binlog_Ignore_DB |</div><div>          +------------------+----------+--------------+------------------+</div><div>          | mysql-bin.000003 |     1376  | s3                  |                           |</div><div>          +------------------+----------+--------------+------------------+</div>2.  配置B的Mysql<br />      (1) vim /etc/mysql/my.cnf<br />           L[mysqld]D中 server_id =1 和log_bin=/var/log/mysql/mysql-bin.log?注释Q把server_id改ؓ2Q要和master机器的不一栗ƈ增加以下内容Q?br />           binlog_do_db=s3<br />           log-slave-updates<br />          保存退?br />     (2) 重启mysql服务<br />     (3) q入mysqlQ执?br />          CHANGE MASTER TO MASTER_HOST='192.168.1.111', MASTER_USER='repl',Master_Port=3306,MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=1376;<br />          SLAVE START;<br />          注意上面的CHANGE语句中,MASTER_LOG_FILE和MASTER_LOG_POS是上面1.4中提到的show master status命o得到的结果,指定二进制文件的名称和开始同步的位置?br />     (4) 查看SLAVE状?    show slave status\G<br /><div>*************************** 1. row ***************************</div><div>               Slave_IO_State: Waiting for master to send event</div><div>                  Master_Host: 192.168.1.111</div><div>                  Master_User: repl</div><div>                  Master_Port: 3306</div><div>                Connect_Retry: 60</div><div>              Master_Log_File: mysql-bin.000003</div><div>          Read_Master_Log_Pos: 1376</div><div>               Relay_Log_File: mysqld-relay-bin.000002</div><div>                Relay_Log_Pos: 1355</div><div>        Relay_Master_Log_File: mysql-bin.000003</div><div>             <span style="color: #ff0000;">Slave_IO_Running: Yes</span></div><div><span style="color: #ff0000;">            Slave_SQL_Running: Yes</span></div><div>              Replicate_Do_DB: </div><div>          Replicate_Ignore_DB: </div><div>           Replicate_Do_Table: </div><div>       Replicate_Ignore_Table: </div><div>      Replicate_Wild_Do_Table: </div><div>  Replicate_Wild_Ignore_Table: </div><div>                   Last_Errno: 0</div><div>                   Last_Error: </div><div>                 Skip_Counter: 0</div><div>          Exec_Master_Log_Pos: 1376</div><div>              Relay_Log_Space: 1512</div><div>              Until_Condition: None</div><div>               Until_Log_File: </div><div>                Until_Log_Pos: 0</div><div>           Master_SSL_Allowed: No</div><div>           Master_SSL_CA_File: </div><div>           Master_SSL_CA_Path: </div><div>              Master_SSL_Cert: </div><div>            Master_SSL_Cipher: </div><div>               Master_SSL_Key: </div><div>        Seconds_Behind_Master: 0</div><div>Master_SSL_Verify_Server_Cert: No</div><div>                Last_IO_Errno: 0</div><div>                Last_IO_Error: </div><div>               Last_SQL_Errno: 0</div><div>               Last_SQL_Error: </div><div>  Replicate_Ignore_Server_Ids: </div><div>             Master_Server_Id: 1</div>    上面的红色二行如果ؓYES则表C已l正常连接,可以q行复制了?img src ="http://www.tkk7.com/nighty/aggbug/397601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nighty/" target="_blank">寒武U?/a> 2013-04-09 20:33 <a href="http://www.tkk7.com/nighty/archive/2013/04/09/397601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Postgresql备䆾的一点笔?/title><link>http://www.tkk7.com/nighty/archive/2013/03/27/397077.html</link><dc:creator>寒武U?/dc:creator><author>寒武U?/author><pubDate>Wed, 27 Mar 2013 14:39:00 GMT</pubDate><guid>http://www.tkk7.com/nighty/archive/2013/03/27/397077.html</guid><wfw:comment>http://www.tkk7.com/nighty/comments/397077.html</wfw:comment><comments>http://www.tkk7.com/nighty/archive/2013/03/27/397077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/nighty/comments/commentRss/397077.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nighty/services/trackbacks/397077.html</trackback:ping><description><![CDATA[    怹没用服务器上装的那个postgresqlQ其实是用来做redmine的数据库的,考虑到mysql可能l常升Q而rails的连接组件在安装上有炚w烦,所以当初就装成postgresql?br />    今天准备备䆾一下,用的phppgadminQ刚开始是提示其中的pg_dump执行路径没有配置Q重新配|好后,导出的结果却是空的损坏文件。于是想了Q还是{到pg的安装目录下执行pg_dump.<br />    服务器装的是centos 6.2Q忘了当初是Z一个用户postgres.postgresq行安装的,用其它用户切换到pg的安装目录下bin/pg_dump是执行不了的Q提C在指定目标下生成导出文件。故猜测应该是postgresq个用户的权限不I<br />    cat /etc/passwd查看一下当前有多少用户Q的有postgres.postgres用户Q密码多?忘了Q反正有rootQ直接passwd修改成新的密码吧Q于是就立马修改了该用户的密码,可以正确切换到postgres用户了,q需要root为postgres指定一个目录有操作权限<br />    chown -R postgres.postgres /var/xxxx   <br />    然后再回到pg的bin目录下,执行pg_dump redmine > /var/xxx/redmine.bak<br />    q下l于正常了,别忘了还得去redmine安装目录下,备䆾下files文g夏V?br />    <br />    仅以此ؓW记Q以后可以查阅?img src ="http://www.tkk7.com/nighty/aggbug/397077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nighty/" target="_blank">寒武U?/a> 2013-03-27 22:39 <a href="http://www.tkk7.com/nighty/archive/2013/03/27/397077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex在企业应用中关于单元试的一U设计思\http://www.tkk7.com/nighty/archive/2012/04/28/376941.html寒武U?/dc:creator>寒武U?/author>Sat, 28 Apr 2012 04:03:00 GMThttp://www.tkk7.com/nighty/archive/2012/04/28/376941.htmlhttp://www.tkk7.com/nighty/comments/376941.htmlhttp://www.tkk7.com/nighty/archive/2012/04/28/376941.html#Feedback1http://www.tkk7.com/nighty/comments/commentRss/376941.htmlhttp://www.tkk7.com/nighty/services/trackbacks/376941.html      用Flex做企业应用将q有一q时间了Q这个过E很累,在国内这斚w的积累不多,真正有参考意义的资料的确非常。经q一D长旉的摸索后Q多也U篏了一点经验,最q的关于单元试的想法做一ҎȝQ由于涉及的知识较多Q这里也只是l出个h的一U思\?/span>
     众所周知QFlex的缺Ҏ开发调试效率较低,而且它只是表现层的一U解x案。在企业应用中最需要解决的是编译生成的swf体积问题Q我想Q何客户都很难接受一个企业应用全部打包在一个swf里,几MB甚至几十MB的初始化q程谁都无法接受Q所以都必不可少地采用Module的加载方式,把不同的业务功能~译成独立的swfQ需要用的时候再d载。把核心功能、通信机制、公q件设计成库项目,~译成swc做ؓRSL让业务模块共享调用,辑ֈ量减少业务模块~译体积的目的。在q方面如果用心优化的话,基本上可以控制到每个swf体积大概?00KB以内Q这样就是互联|方式部|Ԍ客户讉K仍是可以接受的?/span>
    

     该结构图l出了一U整体的设计ҎQFlex的启动肯定得有ApplicationQ这个是用户初登录后W一个加载的swfQ登录就不要用flex了,用jsp或是模板实现吧)。所以它负责加蝲你设计的整个框架Q包含模块加载机制、通信代理方式、基库初始化{等Q而和Java端的通信目前比较有效的仍然是blazedsQ这个技术需要的介绍内容不在本文的范围之内。关于通信接口的实现有一U非常有用的方式是借用Java的动态代理理念,Spring有一个flex的扩展子目叫做springactionscriptQ而这个项目又引用了as3commons的库Q类gapache commons的一些公qӞ。ؓ什么提及这个,因ؓflex本n的反功能api非常隄Q所以as3commons做了扩展,它大大简化了反射的用,而且提供了一个bytecode的工L于操作字节码Q它是实现动态代理的关键。至于ؓ什么要动态代理?目的是辑ֈ在写和JavaҎ的接口时Q可以只声明接口Q不需要实现类Q得减少多少重复代码呀Q)Q而和JavaҎ接口我们又可以开发一个工兯java code 自动转成 as codeQ如果懂得Eclipse插g开发的话还可以q一步做一个插Ӟ辑ֈJava只写一ơ就可以自动生成对应的flex接口Q提高开发效率?/span>
     转入正题Q关于单元测试的概念QFlash Builder?.5已经把flex unit作ؓ内置库了Q这点和Eclipse把junit内置cMQ而flex unit的用网上有大量的资料介l,q里也不多说。flex unit在测试as代码q是不错的,和junit试一P提供了一些简单的Assert断言Q但是你最痛苦的却不是as的测试。企业开发的特点是数据量不大,但是需求坑爹,l常变来变去Q而且l构复杂Q往往一张表很多字段Q关联子表,层属性多。而你如果选择了Flex做了展示层的技术,那必定是看中它比HTML + CSS + JS更强的界面交互功能。的,q点不容质疑QFlex Spark的皮肤机制的提供了很多优秀的特点,不过如果你想U熟掌握它的整个机制Q恐怕得花很多时间阅L代码才行Q而皮肤的制作整对别想让美工独自实玎ͼ它同h需要技术积累的Q介l它需要用几个幅才够。Q何技术方案都一PBS、CS、AIR在实现复杂界面时Q对于开发h员来_最痛苦的莫q于界面的单元测试?/span>
     痛苦在哪里?回看上面那幅架构图,业务功能界面实现在FlexQ业务逻辑在后台JavaQ那么当二个团队同时q行工作的时候,沟通就是最大的成本。解x通的问题必d先前设计时约定好接口和数据结构,那是会媄响双方团队协调的关键因素。当双方同时q行开发的时候,势必存在前台依赖后台的情况,因ؓ它能到达界面的前提得在整个框架蝲入后Qƈ且可以初始化一堆数据,发生了通信Q,Java后台q好_依赖于spring和junit可以做到很好的单元测试。而flexq苦了Q我没有通讯啥都做不了呀Q?/span>
     如何设计单元试Q最大的出发点就是如何切掉和后台通信q接Q看下面的简单结构图

     实现思\介绍Q?/span>
     1.  化Application加蝲q程   --   可以套用你主E序中的加蝲q程Q但是不需要你的主界面其它多余的元素,辑ֈ减少到达试界面的多余步骤(可能少地减鼠标和键盘操作Q?/span>
     2.  定义试配置   --   试哪个模块Q哪个工作流E?你得通过配置的方式来定义Q而不是每ơ都手写代码Q才能方便你的成员用你q个工具
     3.  模拟后台接口实现  --  记得上面说的动态代理吗Q其实是为接口动态生成一个实现类Q然后注入真正通信的实C码,例如WebService、HTTPQ既然可以注入这些通信渠道Q当然就可以注入本地实现cd
     4.  对象查看?nbsp;   --   q个是神马?因ؓ你都不要Java后台了,每次操作一个界面后得提交数据吧Q没有后CQ提交到哪里Q你得必L你的提交对象用界面展C出来吧Q好吧,q个可是个难点!

     我想q四个方面的原则无非是Q减单元测试需要进行的步骤Q最快到达测试界面)Q脱dC赖(自己单模拟后台实玎ͼ可惜flex没有cMjava的mock库,悲剧Q)Q如何查看提交到后台的结果?单元试的目标:界面能正常加载、提交数据正常,如果二者都没问题,那么联调的时候就可以非常Ҏ定位到是Flex的问题还是Java的问题!辑ֈ介分责Q的目标,当然Q如果你所在团队是按模块分的,也就是说flex和java都是同一个h做,那么׃存在责Q问题?/span>

     怎么实现上面的四个步骤呢Q简要地介绍一下吧?/span>
     W?化application加蝲Q其实你可以把第一张图中的application加蝲机制拯q来Q只是主界面可以做得非常单,比如不需要多余的控gQ比如过长的菜单、当前登录h、时间、一陀讄按钮{)Q只留下最核心的能到达你测试界面的入口Q至于怎么设计q个化版的applicationQ那得发挥你本h的创造力Q另外还得看具体的业务?br />
    W?定义试配置。模块如何加载?通信接口本地模拟实现cd义?通过配置昄在appliation做ؓ触发控gQ这些你都得自定义一套xml之类的文件来配置吧,q个需要技巧了Q不能设计得太复杂,因ؓ你的开发h员需要沿用你定义的规范来定义它需要测试的模块Q关于这斚w的知识,可以参考spring加蝲配置文g方式、struts2加蝲定义文g{理念,有一个概忉|比较推荐Q就是struts2中的include配置文gQ允讔R|文件分散,让大家提供代码和文g时减冲H,又可以套用你正常的加载机制?br />
    W?模拟后台接口实现。这个是比较烦的Q模拟机制本w通过动态代理倒是不难实现Q恶心的是你得自己动手用flex单实Cơ后台生成数据、处理数据的逻辑。这里我有个实践的ȝl验分nQ在前期你调试完的后台接口证明是没有问题的,那么可以混合使用Q一部分调试q的接口可以直接用后収ͼ而新接口才本地模拟。一个原则就是后台有的,已经证明E_的就用后収ͼ没有的或是后台还没有完成的你p己模拟?br />
    W?对象查看器。想想flex不能操作数据库、由于安全限制不允许直接操作文g、无法读取本地文件目录。而你的测试数据也怼有关联(特别是在工作方面)Q所以你得想一个方案来保存你的对象l果Q而且得以一Uh性化的方式查看对象内宏V且抛开数据存储的问题,q个对象查看器如何设计就够你头疼的了Q首先是对象得定义成一U格式,一Uh可以看得懂的格式Q比如xmlQ可以支持序列化和反序列化,你得L多余的无用属性和讉K器。又得回到反机制上了,序列化其实不难,隄是反序列化时如何正确地{成原来的对象。列一U本计的l构Q?/span>
     <xxx   type="com.xx.oo.XXClass">
          <aa type="String">aaa</aa>
          <bb type="Boolean">true</bb>
          <list type="mx.collection.ArrayCollenction">
              ....
          </list>
     </xxx>
     对象分简单对象、复杂对象、动态对象等Q如何表达这U结构和保证序列化时不丢失数据需要细心考虑。那么最后如何实现查看器呢?其实有一个参考的范例Q就是Eclipse?#8220;大纲”视图Q经q实늚扩展Q把树视图换成表格树Q这U控件原生没有,有第三方的可以拿来修改)Q看个样囑֐Q?/span>
 
     因ؓ你关注的对象内容无法是q三个方面,属性名、倹{和cdQ又支持以树方式D对象Q已l够你人眼分辩内容了。至于如何有效的保存试数据Qƈ且组l好l构Q这个方面我目前也仍在思考中Q未有较好的思\?/span>
     以上内容仅是Z本h的一U方案,也许有更好的实现ҎQ只是水q不以过q种认识Q希望后l能q一步思考能实现更加完美的单元测试框架?/span>
     ST试更关注的界面的自动化试Q这斚w涉及的知识更多,一般公司是很难有胦力和技术去支持做自动化试Q属于比较高端的范围Q实现是很多回归都靠试团队在实现?/span>


]]>
Flex4 spark中Application工具条自定义的原?/title><link>http://www.tkk7.com/nighty/archive/2011/10/13/361190.html</link><dc:creator>寒武U?/dc:creator><author>寒武U?/author><pubDate>Thu, 13 Oct 2011 10:14:00 GMT</pubDate><guid>http://www.tkk7.com/nighty/archive/2011/10/13/361190.html</guid><wfw:comment>http://www.tkk7.com/nighty/comments/361190.html</wfw:comment><comments>http://www.tkk7.com/nighty/archive/2011/10/13/361190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/nighty/comments/commentRss/361190.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nighty/services/trackbacks/361190.html</trackback:ping><description><![CDATA[<div>      采用Sparkq行Flex的Web应用开发的时候,往往会用一个固定栏Q比如说cMWindows的Q务栏Q我们想把它固定在顶部或是底部,用于某些场景存放一些控件?lt;s:Application>lg中有一?lt;s:controlBarContent>属性和<s:controlBarLayout>Q用于设|Application的一个组件区域(我猜官方Lq个名称大概用意在于此吧Q,下面q段话就是官方的中文注释Q?br /> <fieldset><legend>Title</legend><em style="color: #3366ff">包含?Application 容器控g栏区域中的组仉。Application 容器控g栏区域的位置和外观由 spark.skins.spark.ApplicationSkin cȝ定。默认情况下QApplicationSkin cd义以灰色背景昄?Application 容器内容区域剙的控件栏区域。创定义外观以更Ҏ件栏的默认外观?/em></fieldset></div>      于是可以单的l?lt;s:controlBarContent>区域d各种控gQ以及设|它内在的布局(controlBarLayout)。但是,发现它只能显C在Application的顶部!<br />      q是怎么回事Q根据上面的注释Q感觉应该原因在它的皮肤Q得跟进代码Q看一下究竟?br />      首先扑ֈ<s:Application>控g的标准SkinQ可以在Flash Builder中直接查看?br /> <div align="left">       <img style="border-bottom-color: #000000; border-top-color: #000000; width: 276px; height: 470px; border-right-color: #000000; border-left-color: #000000" border="1" alt="" src="http://www.tkk7.com/images/blogjava_net/nighty/s1.png" width="276" height="470" /><br />      双击打开ApplicationSkinQ里面的代码包含了各USVG囑Ş学的实现api调用Qflex这些库叫FVGQ大意就是SVG的Flex实现版本Q该库实现得q算z!<br />      Application标准皮肤的就是先M个矩形,然后用一个Group来包含不同的形状Q最后一D?lt;s:Group id="contentGroup" width="100%" height="100%" minWidth="0" minHeight="0" />Q代表Application的内容区域,Flex从设计上区分了控件树和布局树,有些复杂Q可以参考官方的文档。因为Application是属于容器,所以必d皮肤中包含这一句,不然E序q行时就看不到它包含的子控g?br />     而前面长长一?lt;s:Group id="topGroup">中是M栏的外观,它用FVG库画了四层:<br />     <span style="color: #3366ff"><!-- layer 0: control bar highlight -->     底部高亮U(用画W填充一个矩形)</span><br /><span style="color: #3366ff">     <!-- layer 1: control bar fill -->              背景填充U性渐变颜?/span><br /><span style="color: #3366ff">     <!-- layer 2: control bar divider line -->  分割U?/span><br /><span style="color: #3366ff">     <!-- layer 3: control bar -->                  controlBar的具体内容容?/span><br />     当然q个controlBar不是自己会出现的Q只有当你填充了内容控g的时候它才显C,所以有includeIn="normalWithControlBar, disabledWithControlBar"Q表C在q二个State下才昄Q什么时候State才包含这二个呢?当然Q就得去看Application.as的实现原理,具体幅׃描述?br />     那么回到最初的问题Q我x变controlBar的位|在下方怎么处理Q?br />     从上面的分析可知其实controlBar的摆放位|是在Skin中定义的Q而它是什么布局Q它昄不显C是通过Application.as本n的代码控制的Q那么我们就只要自定义Application.as的皮肤就可以Q新Z个外观mxmlQ直接复制官方的ApplicationSkin.mxml的代码,然后Q把<s:Group id="contentGroup" width="100%" height="100%" minWidth="0" minHeight="0" />代码Ud<s:Group id="topGroup">代码的上面,在你的Application中强制指定skinClassZ自定义的ApplicationSkinQ或是通过css讑֮卛_?br />     再扩展思维一下,其实我们完全可以把controlBar攑ֈ左边或是双Q甚至Q何位|,都取决你在Skin的定义和Application.as的逻辑控制Q你可以l承Application扩展Q?br />     那么controlBar有什么作用?其实spark的Panel从及它的子类TitleWindow都有controlBar的概念,它能独立于你容器外的区域Q对于你容器本n包含的组件和布局不会产生q扰Q以及你讄了width、height?00%时也不生媄响。如果你不要controlBarQ直接在Application中用布局d一个Group也是可以实现Q但是它从根本上是属于布局树中contentGroup的内容,会受限于布局?br />     Spark Skin的设计的有高明的地方,ҎFlex3的外观,它提供给设计人员的空间实在大得多Q你可以l合囄和FVG库的功能自定义各U外观,当然Q我徏议你多熟悉一下FVG库的应用Q毕竟从外加载图片对flex来说是一个消耗,你的E序也会增肥?/div><img src ="http://www.tkk7.com/nighty/aggbug/361190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nighty/" target="_blank">寒武U?/a> 2011-10-13 18:14 <a href="http://www.tkk7.com/nighty/archive/2011/10/13/361190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CentOS5.5下PHP5.2.10未安装mysql模块的解x?/title><link>http://www.tkk7.com/nighty/archive/2011/08/14/356488.html</link><dc:creator>寒武U?/dc:creator><author>寒武U?/author><pubDate>Sun, 14 Aug 2011 07:53:00 GMT</pubDate><guid>http://www.tkk7.com/nighty/archive/2011/08/14/356488.html</guid><wfw:comment>http://www.tkk7.com/nighty/comments/356488.html</wfw:comment><comments>http://www.tkk7.com/nighty/archive/2011/08/14/356488.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/nighty/comments/commentRss/356488.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nighty/services/trackbacks/356488.html</trackback:ping><description><![CDATA[      <span style="font-size: 12pt">问题描述Q?br />          服务器操作系l是Centos5.5Q此前已l有多套pȝ跑在上面Q且装有PHP5.2.10。Centos5.Xpȝ的稳定yum安装源版本是5.1.6Qƈ不符合最新版本的phpmyadmin(5.2以上版本)Q下载了最新版本phpmyadmin安装后提C缺mysql支持模块?/span><span style="font-size: 12pt">查看了一下发现的是安装php的时候没有装上php-mysql模块。直接重新编译php源码安装比较ȝ?/span><br />     <span style="font-size: 12pt">一个比较方便的ҎQ?/span><br />    <span style="font-size: 12pt">为yumdW三方的源,然后直接用yum -y install php-mysqlq行安装</span><br />    <span style="font-size: 12pt">以下ҎZ|络搜烦到的Q做个记录,斚wȝ之时查阅?/span><br />          导入地址Q?nbsp;   <span style="color: #008000">rpm --import </span><a style="color: rgb(86,182,233)" ><span style="color: #008000">http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka</span></a><br />          ~辑yum源: <span style="color: #008000">vi  /etc/yum.repos.d/CentOS-Base.repo</span><br />          在最下面d如下信息Q?br /><span style="color: #0000ff">                   [utterramblings]</span><br /><span style="color: #0000ff">                   name=Jason's Utter Ramblings Repo</span><br /><span style="color: #0000ff">                   baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/</span><br /><span style="color: #0000ff">                   enabled=1</span><br /><span style="color: #0000ff">                   gpgcheck=1</span><br /><span style="color: #0000ff">                   gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka</span><br /><span style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 12px/18px Verdana, Arial, helvetica, sans-seriff; white-space: normal; orphans: 2; color: rgb(35,35,35); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"> <p style="text-indent: 0px; margin: 5px auto">   <span style="font-size: 12pt">   </span><br /><span style="font-size: 12pt">    然后执行安装命oQ?yum -y install php-mysql    pȝ׃自动从上面添加的源中d合适该版本的php-mysl模块Q安装完成后重启httpd服务Q再讉KOK了?br />    该方法同样适合于默认安装的php5.1.6版本安装成功后再q行升?5.2版本?/span></p></span><img src ="http://www.tkk7.com/nighty/aggbug/356488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nighty/" target="_blank">寒武U?/a> 2011-08-14 15:53 <a href="http://www.tkk7.com/nighty/archive/2011/08/14/356488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse 9.0 安装freemarker~辑?/title><link>http://www.tkk7.com/nighty/archive/2011/05/22/350787.html</link><dc:creator>寒武U?/dc:creator><author>寒武U?/author><pubDate>Sun, 22 May 2011 14:15:00 GMT</pubDate><guid>http://www.tkk7.com/nighty/archive/2011/05/22/350787.html</guid><wfw:comment>http://www.tkk7.com/nighty/comments/350787.html</wfw:comment><comments>http://www.tkk7.com/nighty/archive/2011/05/22/350787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/nighty/comments/commentRss/350787.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/nighty/services/trackbacks/350787.html</trackback:ping><description><![CDATA[<div>    freemarker几天前才发布?.3.17版本Q??1号又发布?.3.18Q距2.3.16已经一q多了。老的~辑器已l不能安装在新版本的eclipse和myeclipse上面了,最新的官方~辑器仍在开发阶D,有网友貌似知道最新的源代码链接位|,不过肯定是不E_的?br />    另一个可选的~辑器就是JBoss Tools 3.2中的FreeMarker~辑器,值得安慰Q启动MyEclipse9.0后进入MyEclipse Configuration Center --> Software --> add siteQ输入Name: freemarker,    <br />    URL: <a >  http://download.jboss.org/jbosstools/updates/stable/helios/</a>  然后在All JBoss Tools 3.2.0下选择FreeMarker IDEQ其它的大概你不需要都不用,也不影响下蝲旉Q然后一路确认安装就OK!</div><img src ="http://www.tkk7.com/nighty/aggbug/350787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/nighty/" target="_blank">寒武U?/a> 2011-05-22 22:15 <a href="http://www.tkk7.com/nighty/archive/2011/05/22/350787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>yum removeD的杯L了三个晚上才修复http://www.tkk7.com/nighty/archive/2011/05/20/350608.html寒武U?/dc:creator>寒武U?/author>Fri, 20 May 2011 01:24:00 GMThttp://www.tkk7.com/nighty/archive/2011/05/20/350608.htmlhttp://www.tkk7.com/nighty/comments/350608.htmlhttp://www.tkk7.com/nighty/archive/2011/05/20/350608.html#Feedback2http://www.tkk7.com/nighty/comments/commentRss/350608.htmlhttp://www.tkk7.com/nighty/services/trackbacks/350608.html       上周服务器的一个PHP软g不能讉KQ查看原因是CentOS的PCRE模块未用utf-8~码引v的,由是搜烦了一些资料照着变更Q没有效果?br />       当时和另一个朋友L共同试删除后重装,׃对Linuxpȝ不熟悉,只会使用常规的命令进行一些皮毛的操作Q就直接用yum removeq行删除Q系l当时还提示是否remove掉相兌?00多个lg或模块。当时也没有多想q接回车!l果------悲剧了,屏幕狂刷Q我意识到pcre是基模块Q所有关联它的或是它兌都删除掉Q系l将遭遇一个灾隑ּ的破坏。等刷完屏幕的字W,最l发玎ͼ所有的bin目录下的命o全部不见了!Q!天哪Q连ls命o都没有,唯独剩下一个cd命o。幸q的是,当时q行在服务器的几个应用还能访问,比如说phpmyadmin?br />
        而后想了惻I试了各U方式去恢复Q都没有办法Q那么,唯一的办法就是尽量备份原有的数据和文Ӟ重装pȝq行环境的重新搭建。还好有其它方式Q可以先把里面重要的文g都提取了出来。然后在q存的phpmyadmin上赶紧进行mysql相关数据库的备䆾。(注:因ؓ是个人的服务器,所以ƈ没有像公怸样做好运营和备䆾计划Q?br />
        W二天决定重装系l了Q管理员用了3个小时才搭徏起CentOS5.5和SSHq程服务端。轮到我和L需要用SSHq行q程的环境搭建。接下来的三天晚上,真是折腾又折腾。计划安装的几个主要软g是:Mysql、PHP、Apache、JDK、Tomcat、Ruby on Rails、Redmine、PHPMyAdmin{?br />

        W一个晚上,N之前装在上面的上q各UY件版本都有点低,所以想q脆直接上最新的Q而CentOS5.5的yum库是取不到这些最新的软g的。所以朋?L 大量地采用了make install和rpm方式来安装,而CentOS本n集成的就只有Apache的版本满뀂装了MySQL5.5+phpMyAdmin3.4Q运行v来了却发现和MySQL5.5和redmine1.1.1有冲H,主要是RoR环境的Mysql驱动有问题,在网上能扑ֈ的都是从http://www.tmtm.org/en/ruby/mysql/ 下蝲?.2.6版本Q这个版本我只试在MySQL5.0情况下正常连接。现在换?.5Q就无法q行了,为此我还特地把Ruby环境?.8.6提高?.8.7Q同栯了redmine官网要求的各URuby工具和RailslgQ折腾无果!最后,我还把异怿息拿出来Q给ruby-mysql的日本作者发了一个emailQ第二天作者回复我Q原来ruby-mysql已经挂到GitHubMQ而且现在已经?.0alpha状态了Q但是他不确定能否工作在ruby1.8.6下?最后感觉还是不行,切换回MySQL5.0Q同样高版本的ruby-mysql驱动也无法连接低版本的MySQL。第一天以p|告终Q?br />
       W二天晚上l折腾,再不停地重新安装Q这时才惌v一个问题:应该退回到pȝ宕机前的所有Y件版本状态,q样原先备䆾的数据才能正常恢复,不会带来额外的版本冲H麻烦。于是折腑ֈ接近晚上12Q?0时发觉方向错了,无奈Q和 L 打了个招|计划明天让管理员再重装一ơ系l,现在目前的系l又被我们搞׃Q?br />
       W三天。就着原来的思\Q重装恢复到以前的版本,又用yum的原来方式装回原来的版本Q这ơ进行顺利。用了二个小Ӟ把常用的Y件恢复了Q同时恢复了数据库。最后只剩下一个问题,redmine的密钥恢复后Q仍然无法连接原来的用户密码Q我惛_能得L阅redmine的用L理模块,看看它究竟是怎么生成密码和检验登录的Q有的事是发现|友扑ֈ另一个方法,是直接在redmine下徏ruby脚本Q调用ActiveReord的User.save()Q存一个自q新密码,不晓得可不可行,找个旉做个实验看看?br />
      回头一惟뀂其实规划、整理、理清服务器的管理工作,比精通Linuxpȝ、各UY解决技术更为重要!

]]>
CentOS下用Phusion Passenger方式部vrails应用 -- redmineCZhttp://www.tkk7.com/nighty/archive/2011/05/19/350542.html寒武U?/dc:creator>寒武U?/author>Thu, 19 May 2011 07:10:00 GMThttp://www.tkk7.com/nighty/archive/2011/05/19/350542.htmlhttp://www.tkk7.com/nighty/comments/350542.htmlhttp://www.tkk7.com/nighty/archive/2011/05/19/350542.html#Feedback1http://www.tkk7.com/nighty/comments/commentRss/350542.htmlhttp://www.tkk7.com/nighty/services/trackbacks/350542.html

    Phusion Passenger模块使得Rails应用可以像PHP模块一栯行在Apache上,非常方便?/span>
   准备条gQCentOS服务器已l装好了Apache2.2和Redmine应用        

    1. 安装Passenger模块
            gem install passenger
            passenger-install-apache2-module
        
            W二个命令是安装passenger的apache2模块Q它已经做得很智能,会提CZ认安装以及最后怎么配置模块到apache中?/span>
            摘出配置D늚内容如下Q?/span>
                Please edit your Apache configuration file, and add these lines:

                LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.7/ext/apache2/mod_passenger.so
                PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.7
                PassengerRuby /usr/bin/ruby

            把红色字体部分拷贝到apache的配|文Ӟ可以是主配置文g/etc/httpd/conf/httpd.confQ也可以是在/etc/httpd/conf.d/目录下新Z个子文g命名为ruby.confQ推荐第二种方式Q更为简z,不会影响L件的配置?/span>
      
    2. 先测试一下passenger是否安装正常

            切换到redmine的安装目录下Qpassenger start  命o试一下是否正常能以paasenger方式启动Q如果没有异常,恭喜Q已l安装完成,剩下的工作就是配|一个虚拟主机和子给你的redmineQ这样可以{到更为常用的80端口上?/span>

    3. 配置rails应用做ؓsub URI模式
             在passenger的官Ҏ档中其实有好几种配置的方式,可以是域名、域名子URI{,很多时候你可能只有一个域名,那么利用sub URI来挂不同的应用就昑־比较
            首先配置一D虚拟主机如下:

        <VirtualHost *:80>
            ServerName www.phusion.nl
            DocumentRoot /websites/phusion
            <Directory /websites/phusion>
        Allow from all
            </Directory>
        </VirtualHost>

           解释一下过E大致是先创Z个硬链接Q如下:

        ln -s /webapps/mycook/public /websites/phusion/rails 
 
     /webapps/mycook/public是你的rails的应用目录下面的public目录Q例如你的redmine安装?var/www/htmlQ这个目录就?br />    /var/www/html/redmine/publicQ后面就是你Apacheȝ录下的创建的一个链接地址railsQ意思就是把/var/www/html/redmine/public
链接?var/www/html/railsQ?var/www/html/rails是实际上不存在的?br /> 然后再配|子目录如下Q?/pre>

<VirtualHost *:80> ServerName www.phusion.nl DocumentRoot /websites/phusion <Directory /websites/phusion> Allow from all </Directory>
RailsBaseURI /rails # <-- These lines have <Directory /websites/phusion/rails> # <-- been added. Options -MultiViews # <-- </Directory> # <-- </VirtualHost>

 最后四句带#注释说明是重点,应用RailsBaseURI命o把rails子URI指定到rails的应用目录,而rails目录是我们上面链接的目录,而实际上会蟩到我们的直接redmine目录?/p>

 



]]>扩展commons dbutils的JavaBean转换方式http://www.tkk7.com/nighty/archive/2011/04/26/349050.html寒武U?/dc:creator>寒武U?/author>Tue, 26 Apr 2011 08:41:00 GMThttp://www.tkk7.com/nighty/archive/2011/04/26/349050.htmlhttp://www.tkk7.com/nighty/comments/349050.htmlhttp://www.tkk7.com/nighty/archive/2011/04/26/349050.html#Feedback0http://www.tkk7.com/nighty/comments/commentRss/349050.htmlhttp://www.tkk7.com/nighty/services/trackbacks/349050.html        引言Q最q又用到dbutilsQ之前一直用Map映射的方式取出select的结果再手工做{换。有写过一文章说MapHandler方式的一个缺P关于commons dbutilslg的一个小~陷分析 Q用q种方式Q在目不大的情况下Q写一些Map到JavaBean的{换代码工作量不大Q但是在数据库表q多q且表中的字D过多的情况下,q种重复的setter感觉有点烦。于是又重新思考了BeanHandler和BeanListHandler的情况,dbutils底层映射用的反射Q性能上肯定有损失Q不q在大多数项目规模不是很大的情况下,q点损失可以忽略Q带来的代码减少却是比较可观?br />         问题在哪里?先看一D官方的CZ代码Q?br />

QueryRunner run = new QueryRunner(dataSource);

// Use the BeanHandler implementation to convert the first
// ResultSet row into a Person JavaBean.
ResultSetHandler<Person> h = new BeanHandler<Person>(Person.class);

// Execute the SQL statement with one replacement parameter and
// return the results in a new Person object generated by the BeanHandler.
Person p = run.query(
    
"SELECT * FROM Person WHERE name=?", h, "John Doe");

        q里有个地方有约束,是要求CZ中的JavaBeancPerson中的字段定义要和数据库的字段定义一致。Java的命名习惯一般是骆峰写法Q例如userIdQ那么数据库中就必须定义为userIdQ而问题在于:有时候我们需要数据库中字D늚定义格式与JavaBean的命名不一P比如数据库定义ؓQuser_idQ而JavaBean则定义ؓuserId
        看源代码可能有点Ҏ_在官方的example面的最下面果然有一D关于自定义BeanProcessor的指引。摘录出来:

      BasicRowProcessor uses a BeanProcessor to convert ResultSet columns into JavaBean properties. You can subclass and override processing steps to handle datatype mapping specific to your application. The provided implementation delegates datatype conversion to the JDBC driver.
      BeanProcessor maps columns to bean properties as documented in the BeanProcessor.toBean() javadoc. Column names must match the bean's property names case insensitively. For example, the firstname column would be stored in the bean by calling its setFirstName() method. However, many database column names include characters that either can't be used or are not typically used in Java method names. You can do one of the following to map these columns to bean properties:
      1. Alias the column names in the SQL so they match the Java names: select social_sec# as socialSecurityNumber from person
      2. Subclass BeanProcessor and override the mapColumnsToProperties() method to strip out the offending characters.


      大概意思就是提供二U方式:一U就是最直接的,用as关键字把colName重命名,另一U方式就是承BeanProcessorc,重写mapColumnsToProperties()Ҏ?br />       那当然是W二U方式更加具有代表性。尝试了一下。代码如下:
    
 1public class CustomBeanProcessor extends BeanProcessor {
 2    
 3    @Override
 4    protected int[] mapColumnsToProperties(ResultSetMetaData rsmd,
 5            PropertyDescriptor[] props) throws SQLException {
 6        int cols = rsmd.getColumnCount();
 7        int columnToProperty[] = new int[cols + 1];
 8        Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);
 9
10        for (int col = 1; col <= cols; col++{
11            String columnName = rsmd.getColumnLabel(col); 
12            if (null == columnName || 0 == columnName.length()) {
13              columnName = rsmd.getColumnName(col);
14            }

15            columnName = colNameConvent(columnName); // 在这里进行数据库表columnName的特D处?/span>
16            for (int i = 0; i < props.length; i++{
17
18                if (columnName.equalsIgnoreCase(props[i].getName())) {
19                    columnToProperty[col] = i;
20                    break;
21                }

22            }

23        }

24        return columnToProperty;
25    }

26
27    /**
28     * 数据库列名重新约?br /> 29     * @param columnName
30     * @return
31     */

32    private String colNameConvent(String columnName) {
33        String[] strs = columnName.split("_");
34        String conventName = "";
35        for (int i = 0; i < strs.length; i++{
36            conventName += StringUtils.capitalize(strs[i]);
37        }

38        StringUtils.uncapitalize(conventName);
39        return conventName;
40    }

41}

        注意mapColumnsToPropertiesҎ的逻辑是从父类的方法中直接复制出来的,然后在第15行那里变了个戏法Q这里的columnName是从数据库中读出来的,自定义一个privateҎ用于转换命名Q这里你可以添加自q命名U束。例如上面就是把 user_id 转化为Java的骆峰写法:userId
       再深入一层思考,你可以在q里q行更多扩展Q以便让自己可以选择不同的命名{换方式。定义了q个Processor之后Q下面看看如何调用:
Connection conn = ConnectionManager.getInstance().getConnection();
QueryRunner qr 
= new QueryRunner();
CustomBeanProcessor convert 
= new CustomBeanProcessor();
RowProcessor rp 
= new BasicRowProcessor(convert);
BeanHandler
<User> bh = new BeanHandler<User>(User.class, rp);
User u 
= qr.query(conn, sql, bh, params);
DbUtils.close(conn);
      是不是非常灵z?如果是想q回Listl果的,把BeanHandler替换成BeanListHanderc,q可以再q一步封装这些操作,抽象到公共模块中去,让外部直接传入sql语句和Classp直接q回惌的结果,当然你得增加泛型的定义。同样D一个封装的例子Q?br />
 1protected <T> List<T> selectBeanList(Connection conn, String sql, Class<T> type,
 2            Object[] params) throws Exception {
 3        log.debug("select sql:[" + sql + "]");
 4        QueryRunner qr = new QueryRunner();
 5        CustomBeanProcessor convert = new CustomBeanProcessor();
 6        RowProcessor rp = new BasicRowProcessor(convert);
 7        ResultSetHandler<List<T>> bh = new BeanListHandler<T>(type, rp);
 8        List<T> list = qr.query(conn, sql, bh, params);
 9        return list;
10    }

        至于Z么扩展这个方法就可以实现q个逻辑得去跟源代码看它的内部实现Q用了一些JavaBean的处理和反映的技巧来做的。具体就不说?br />         ȝQcommonslg都设计得非常好,可扩展性和实用性都非常高。虽然上面D例实C转换逻辑的替换,但是仍然需要开发h员在设计数据库的时候和写JavaBean旉要严格做好规范,避免产生不必要的问题。这斚wRuby On Railsq接内部实玎ͼ动态语a的优点特别能体现Q同时强制你在设计时必须用这U方式,典型的约定优于配|原则。当Ӟ在dbutils里你愿意二种字段名都一样也无可厚非?br />        ~点QBeanProcessor是不支持兌查询的,所以上面的方式也只能局限于单表的{换,q点׃如myBatis和HibernateQ当然用q二个就引入了一些复杂性,如何权衡需要自p量,哪个用得好都一栗本人就不喜ƢmyBatis那种把SQL写到XML中的方式Q见q太复杂的SQL最l在XML里面变得面目全非Q如果是接手别h的代码,是很痛苦的,而且你无法避免只修改XML而不改JavaQ既然二者都要改Q那直接写Java里又有什么区别?单就是美。格式和注释写好一点同样很Ҏ理解Q?

]]>
վ֩ģ壺 Ѵվ߹| 456˳ӰԺ߹| ͵޾Ʒ| ˳С˵վɫ| 뾫ƷA߹ۿ| ɫ޾ƷĻ| ޱ̬һ| ԻƵs| ޴Ƭ߹ۿ| 97ѹۿƵ| ŷŮƵ| Ļþþһ| ۲ӰԺѹۿ| ޵һվƵ| þþþþùƷ| ޾ƷŮþ777777| ڵƵѲ| һ߲ѹۿİƵ | ޾Ʒ456߲| ѹۿƵ| 99ƷƵۿ| Դ߹ۿ| ˳Ƶվ| һŮѲ| Ļþۺ| aƵƷѹۿ| ɫ˵| ԭƵ| ĻӰƵ| þѿaëƬ| ɫվWWWĻ| ޾Ʒa߹ۿapp| Ʒ99þ| һȫٸɫƬ | ޾Ʒ| ó˾þAvѸ | ŷa߹ۿ| | 91˿߹ۿ| ĻƵ| ޹Ʒһ|