maven集成sonar代码分析

这两天项目组做web开发基础框架,需要集成sonar代码分析。

之前也用过sonar,只不过代码分析需要人工触发或者设置linux定时任务,本次web基础框架同时集成了bamboo日构建,故此想在每次代码提交之后即触发代码分析。

阅读这篇笔记假设你已经搭建好了sonar服务,同时安装好了maven。

1.修改maven的配置文件setting.xml,这个文件一般会放在~/.m2或者$MAVEN_HOME/conf目录下。

2.打开这个文件在对应的为知里面添加如下配置。


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settings>
  3.    <pluginGroups>
  4.        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
  5.    </pluginGroups>
  6.    <profiles>
  7.        <profile>
  8.            <id>sonar</id>
  9.            <activation>
  10.                <activeByDefault>true</activeByDefault>
  11.            </activation>
  12.            <properties>
  13.                <!-- Optional URL to server. Default value is http://localhost:9000 -->
  14.                <sonar.jdbc.url>jdbc:postgresql://10.20.0.171:5432/sonar</sonar.jdbc.url>  
  15.                <sonar.jdbc.driver>org.postgresql.Driver</sonar.jdbc.driver>  
  16.                <sonar.jdbc.username>postgres</sonar.jdbc.username>  
  17.                <sonar.jdbc.password></sonar.jdbc.password>  
  18.                <sonar.host.url>http://10.20.0.171:9000</sonar.host.url>  
  19.            </properties>
  20.        </profile>
  21.     </profiles>
  22. </settings>

在此提醒一点,maven-sonar-plugin的会将分析完结果插入sonar指定的数据库中,所以在此需要保证数据库可以外网访问。postgresql为例,

a.更改postgressql.conf

  1. listen_addresses = '*'    

 

b.更改 pg_hba.conf

  1. # IPv4 local connections:
  2. host    all             all             127.0.0.1/32            md5
  3. host    all             all             0.0.0.0/0               trust

 

3. 执行代码分析

  1. mvn clean verify sonar:sonar

Ops!!!出错了!

Ops!!!出错了!

  1. Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar

换个命令执行

  1. mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar

Ops!!!出错了!

  1. Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar (default-cli) on project ruma-web: 'sonar.projectDate' property cannot be older than the date of the last known quality snapshot on this project. Value: '2016-03-17T06:35:16+0000'. Latest quality snapshot: '2016-03-17T14:13:01+0000'. This property may only be used to rebuild the past in a chronological order. -> [Help 1]

搞咩啊,时间不对也不行啊,一看服务器的时间果然不对

尼玛,调整时间再试试吧。

参考我之前的笔记linux时区调整

  1. vi /etc/profile
  2. add line:
  3. export TZ='Asia/Shanghai';
  4. save and exit
  5. source /etc/profile

继续执行

  1. mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar

等待了良久,喝了杯茶(twinings)…..

4.终于成功了

untitled

 

问题真不少啊。

qq:986737506

email:ding_cuiping@163.com

Extjs文件上传格式大小限制

用extjs3实现文件上传时的格式和大小控制
  1. <script type="text/javascript">
  2. //验证图片文件的正则
  3. var img_reg = /\.([jJ][pP][gG]){1}$|\.([jJ][pP][eE][gG]){1}$|\.([gG][iI][fF]){1}$|\.([pP][nN][gG]){1}$|\.([bB][mM][pP]){1}$/;
  4. // var img_reg = /\.jpg$/;
  5. if (!img_reg.test(value)) {
  6. Ext.Msg.alert('提示', '文件类型错误,请选择图片文件(jpg/jpeg/gif/png/bmp)');
  7. o.setRawValue('');
  8. }
  9. var fileInput = document.getElementById('add_image');
  10. if (fileInput != null) {
  11. var fileSize = getFileSize(fileInput);
  12. alert(fileSize);
  13. //允许上传不大于1M的文件
  14. if (fileSize > 512) {
  15. Ext.Msg.alert('提示', '文件太大,请选择小于512kb的图片文件!');
  16. o.setRawValue('');
  17. }
  18. }
  19. </script>

使用跨平台技术h5+实现应用图片本地缓存

在大哥王(andy)神一样的带领下,我们牛逼闪闪的走上了使用h5plus技术实现跨平台技术开发的道路,一路高歌!!!

下面我要分享的内容是如何实现图片本地缓存。
废话不说,直接看代码:
  1. /**
  2. *声明获取图片的方法
  3. *@param{Object} picUrl 图片的网络地址
  4. *@param{Object} defaultPic 默认图片
  5. *@param{Object} element 图片源元素
  6. */
  7. function fetchImage(picUrl, defaultPic, element){
  8. //将图片网络地址进行md5摘要。
  9. var filename = hex_md5(picUrl);
  10. element.setAttribute("src", defaultPic);
  11. //尝试加载本地图片
  12. plus.io.resolveLocalFileSystemURL("_downloads/"+ filename,function(entry){
  13. //加载本地图片成功
  14. entry.file(function(file){
  15. if(file.size==0){
  16. //console.log("2.1图片为空显示默认");
  17. element.setAttribute("src", defaultPic);
  18. }else{
  19. var path = plus.io.convertLocalFileSystemURL("_downloads/"+ filename);
  20. //console.log("2.1加载本地图片"+path);
  21. element.setAttribute("src", path);
  22. }
  23. });
  24. },function(e){
  25. //加载本地图片失败,本地没有该图片,尝试从网络下载图片并保存本地,保存文件名为url摘要md5
  26. var dtask = plus.downloader.createDownload(picUrl,{filename:filename},function(d, status){
  27. //下载完成
  28. if(status ==200){
  29. if(d.downloadedSize==0){
  30. //console.log("2.2图片为空显示默认");
  31. element.setAttribute("src", defaultPic);
  32. }else{
  33. //console.log("2.2下载网络文件成功"+d.url);
  34. element.setAttribute("src", d.url);
  35. }
  36. }
  37. });
  38. dtask.start();
  39. });
  40. }
以上主要用到h5plus的两个重要的api
1.Downloader模块管理网络文件下载任务,用于从服务器下载各种文件,并支持跨域访问操作。
2.IO模块管理本地文件系统,用于对文件系统的目录浏览、文件的读取、文件的写入等操作。通过plus.io可获取文件系统管理对象。
详见官方:
刚开始做的时候准备使用html5的indexedDB存储图片来的,但是后来发现在移动设备上不好用。参考https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
 

使用bamboo构建play工程

首先登录bamboo
一、创建一个代码源,说简单点就是让bamboo知道你的项目在gitlab或者hg上的地址。
页面往下翻,点击Add repository按钮。
 

把这个页面填好,有问题请google翻译,点击“SAVE REPOSITORY”。
二、创建一个构建计划
点击首页中间的大大的“CREATE”按钮

填好点击“Configure Plan”。
三、编写构建任务
在首页列表中找到你刚建的plan
然后点击铅笔编辑来到下面这个页
Default Job里面已经有一个拉取代码任务。
接下来大家要根据自己的实际情况编写构建计划,下面我写个例子。
1.新建一个Script Task用来编译脚本,编译语句自己写,可以写成text,也可写成脚本文件。
2.新建Script Task将编译完的文件拷贝到目标服务器
本来应该用Scp Task,但是死活不好使,所以就用Script Task了,但是使用Script Task远程拷贝需要服务器做免密登录。
什么?不知道免密登录?自行google!

3.新建一个SSH Task登录目标服务器执行部署操作,下面这只是例子。
具体的脚本还得看实际情况,比如修改配置文件和拷贝静态文件等操作,那么如果你是play framework,还可以参考《为play工程写一个状态管理的脚本并且随机启动http://www.heartarea.net/?p=118
以上正文。

为play工程写一个状态管理的脚本并且随机启动

step1.先写脚本啦,废话不说,代码如下:
#!/bin/bash ### BEGIN INIT INFO # Provides: Frank Ting # Required-Start: $network $local_fs $remote_fs # Required-Stop:: $network $local_fs $remote_fs # Should-Start: $all # Should-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Baccy-router # Description: Baccy-router ### END INIT INFO PID="$(cat /var/lib/projects/baccy-router-1.0-SNAPSHOT/RUNNING_PID)" export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 start(){ if [ -z $PID ] then /var/lib/projects/baccy-router-1.0-SNAPSHOT/bin/baccy-router -Dhttp.port=9090& echo "baccy-router is starting" return 0 else echo "baccy-router already started " return 1 fi } stop(){ kill $PID echo "baccy-router is stopping" PID="" } status(){ if [ -z $PID ] then echo "baccy-router is not running" else echo "baccy-router is running" fi } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo "Usage: {start|stop|restart|status}" exit 1 esac exit 0

step2.移动到/etc/init.d目录下,名字我改成baccy-router,然后增加执行权限

chmod 755 baccy-router
mv baccy-router /etc/init.d
/etc/init.d/baccy-router start
/etc/init.d/baccy-router status
/etc/init.d/baccy-router restart
step3.加入到linux服务中,就可以随机启动啦
insserv /etc/init.d/baccy-router
reboot

PS:也可以往linux计划(crontab )里添加进程检查策略,详情请咨询google。

playframework切换连接池c3p0(转载并整理)

众所周知,playframework使用的连接池是boneCP,但是确实十分坑爹,因为连接池中对象不能正常释放,导致连接池疯狂向数据库创建连接,最后导致应用获取不到可用连接而报错。当然不是我一个人遇到这个问题,stackoverflow的老外也被坑了一大片。

那么优秀程序员的品质得到体现,github上的hadashi写了一个插件解决了我们的问题。
  1. This plugin provides an alternative to BoneCP as the connection pool manager inPlay2.1.The main reason for doing this is that I have seen issues with connections not being released properly by BoneCP when there are low max connections available.
当然貌似有人盗版,不知道是谁抄谁,无所谓嘛,不要在乎那些细节,我参考的是如下地址:
其实按照他的步骤一步步执行就好了。
第一、在build.sbt里面引用插件源
  1. libraryDependencies ++=Seq(
  2. "jp.furyu"%%"play-c3p0-plugin"%"0.2.1"
  3. )
第二、创建conf/play.plugins文件,录入如下内容
  1. 5000:jp.furyu.play.c3p0.C3p0Plugin
第三、让原有的db插件失效,修改application.conf
  1. dbplugin=disabled
第四、配置数据源
  1. db.default.user=pointshub
  2. db.default.password=pointshub
  3. db.default.url="postgres://pointshub:pointshub@10.20.0.156:5432/pointshub"
  4. db.default.driver=org.postgresql.Driver
  5. db.default.maxPoolSize=200
  6. db.default.minPoolSize=20
  7. db.default.initialPoolSize=40
  8. db.default.acquireIncrement=5
  9. db.default.maxIdleTime=10m
  10. db.default.maxConnectionAge=1h
  11. db.default.idleConnectionTestPeriod=10m
  12. db.default.preferredTestQuery="select 1;"
  13. db.default.checkoutTimeout=3s
以上为转载整理,请参阅。
PS:之前写东西上来就“废话不说,直接上码”,今天废话几句就是想弘扬一下像hadashi这样的优秀程序员的品质。

apache2 linux安装 配置

  1. 安装
  2. apt-get install apache2
  3. cd /etc/apache2/
  4. vi apache2.conf
  5. cd /etc/apache2/sites-available
  6. vi default
修改配置        
  1.         DocumentRoot /home/ftp
  2. <Directory/>
  3. Options FollowSymLinks
  4. AllowOverride None
  5. </Directory>
  6. <Directory/home/ftp/>
  7. Options Indexes FollowSymLinks MultiViews
  8. AllowOverride None
  9. Order allow,deny
  10. allow from all
  11. </Directory>
重启
  1. /etc/init.d/apache2 restart

psql常用命令大全

psql常用命令大全

\d [
table ]

列出数据库中的表,或(如果声明了)表 table 的列/字段.如果表名是用统配符 “*”)声明的,列出所有表和表的列/字段信息.

\da

列出所有可用聚集.

\dd
object

列出
pg_description
里对声明的对象的描述,对象可以是一个表,表中的列/字段,类型,操作符或聚集. 

小技巧:并非所有对象在
pg_description
里有描述.此后期命令在快速获取 Postgres 内部特性时很有用.

\df

列出函数.

\di

只列出索引.

\do

只列出操作符.

\ds

只列出序列.

\dS

列出系统表和索引.

\dt

只列出非系统表.

\dT

列出类型.

\e [
filename ]

编辑当前查询缓冲或文件
filename
的内容.

\E [
filename ]

编辑当前查询缓冲或文件
filename
的内容并且在编辑结束后执行之.

\f [
separator ]

设置域分隔符.缺省是单个空白.

\g [ {
filename | |command } ]

将当前查询输入缓冲送给后端并且(可选的)将输出放到 filename 或通过管道将输出送给一个分离的Unix shell 用以执行 command

\h [
command ]

给出声明的 SQL 命令的语法帮助.如果 command 不是一个定义的 SQL
命令(或在 psql 里没有文档),或没有声明 command ,这时 psql将列出可获得帮助的所有命令的列表.如果命令 command 是一个通配符(“*”),则给出所有 SQL 命令的语法帮助.

\H

切换 HTML3 输出.等效于 -H 命令行选项.

\i
filename

从文件
filename
中读取查询到输入缓冲.

\l   

列出服务器上所有数据库.

\m

切换老式监视器样的表输出,这时表周围有边界字符包围着.这是标准 SQL 输出.缺省时,psql 只包括列/字段间的分隔符.

\o [ {
filename | |command } ]

将后面的查询结果输出到文件
filename
或通过管道将后面结果输出到一个独立的Unix shell 里执行 command.如果没有声明参数,将查询结果输出到 stdout

\p

打印当前查询缓冲区.

\q

退出 psql 程序.

\r

重置(清空)查询缓冲区.

\s [
filename ]

将命令行历史打印出或是存放到
filename
.如果省略 filename ,将不会把后继的命令存放到历史文件中.此选项只有在 psql 配置成使用输入行时才有效.

\t

切换输出的列/字段名的信息头和行记数脚注(缺省是开).

\T
table_options

允许你在使用HTML
3.0
格式输出时声明放在表 table … 中的标记选项.例如,border
将给你的表以边框.这必须和 \H 后期命令一起使用.

\x

切换扩展行格式.当打开时,每一行将在左边打印列/字段名而在右边打印列/字段值.这对于那些不能在一行输出的超长行是很有用的.HTML 行输出模式也支持这个标记.

\w
filename

将当前查询缓冲区输出到文件
filename

\z

生成一个带有正确
ACL
(赋予/禁止 权限)的数据库中所有表的输出列表.

\! [
command ]

回到一个独立的Unix
shell
或执行一个Unix 命令 command

\?

获得关于反斜杠 (“\”)
命令的帮助.

 

 

一般选项

\c[onnect]
[
数据库名|- [用户名称]]

联接到新的数据库 (当前为 “test”)

\cd [目录名]              改变当前的工作目录

\copyright               显示
PostgreSQL
用法和发布信息

\encoding
[
编码]          显示或设置客户端编码

\h [名字]    
        SQL
命令的语法帮助, * 可以看所有命令的帮助

\q                退出 psql

\set [名字 []]          设置内部变量, 如果没有参数就列出所有

\timing            查询计时开关切换 (目前是
关闭)

\unset 名字        取消(删除)内部变量

\! [命令]            shell 里执行命令或者开始一个交互的 shell

 

信息选项

 

\d [名字]        描述表, 索引, 序列, 或者视图

\d{t|i|s|v|S}
[
模式] ( “+” 获取更多信息)

列出表/索引/序列/视图/系统表

\da [模式     列出聚集函数

\db [模式     列出表空间 ( “+” 获取更多的信息)

\dc [模式     列出编码转换

\dC             列出类型转换

\dd [模式     显示目标的注释

\dD [模式]       列出域

\df [模式     列出函数 ( “+” 获取更多的信息)

\dg [模式]       列出组

\dn [模式]       列出模式 ( “+” 获取更多的信息)

\do [名字]       列出操作符

\dl             列出大对象, \lo_list 一样

\dp [模式]       列出表, 视图, 序列的访问权限

\dT [模式]       列出数据类型 ( “+” 获取更多的信息)

\du [模式     列出用户

\l               列出所有数据库 ( “+” 获取更多的信息)

\z [模式      列出表, 视图, 序列的访问权限 ( \dp 一样)

 

 

 

命令: ABORT

描述:    
终止当前事务

语法:

ABORT [ WORK | TRANSACTION ]

 

命令: ALTER DATABASE

描述:    
改变一个数据库

语法:

ALTER DATABASE 名字 SET 参数 { TO | = } { | DEFAULT
}

ALTER DATABASE 名字 RESET 参数

ALTER DATABASE 名字 RENAME
TO
新名字

ALTER DATABASE 名字 OWNER TO
新属主

 

命令: ALTER GROUP

描述:    
改变一个用户组

语法:

ALTER GROUP 组名称 ADD
USER
用户名称 [, … ]

ALTER GROUP 组名称 DROP USER
用户名称 [, … ]

ALTER GROUP 组名称 RENAME
TO
新名称

 

命令: ALTER INDEX

描述:    
改变一个索引的定义

语法:

ALTER INDEX 索引名称

动作 [, … ]

ALTER INDEX 索引旧名称

RENAME TO 索引新名称

动作为以下之一:

OWNER TO 新属主

SET TABLESPACE indexspace_name

 

命令:  ALTER SEQUENCE

描述:    
改变一个序列生成器的定义

语法:

ALTER SEQUENCE 名字 [
INCREMENT [ BY ]
递增 ]

[MINVALUE 最小值 | NO
MINVALUE ] [ MAXVALUE
最大值 | NO MAXVALUE ]

[ RESTART [ WITH ] 开始 ] [
CACHE
缓存 ] [ [ NO ] CYCLE ]


 SELECT setval(‘”anti”.”anti_menu_menuid_seq”‘, 180, true);

 

命令: ALTER TABLE

描述:    
改变一个表的定义

语法:

ALTER TABLE [ ONLY ] 表名 [ * ]

action [, … ]

ALTER TABLE [ ONLY ] 表名 [ * ]

RENAME [ COLUMN ] 字段名 TO 新字段名

ALTER TABLE 表名

RENAME TO 新表名

action 为下面的一种:

ADD [ COLUMN ] 字段名
类型 [ 字段约束 [ … ] ]

DROP [ COLUMN ] 字段名 [ RESTRICT | CASCADE ]

ALTER [ COLUMN ] 字段名 TYPE 类型 [ USING 表达式 ]

ALTER [ COLUMN ] 字段名 SET DEFAULT 表达式

ALTER [ COLUMN ] 字段名 DROP DEFAULT

ALTER [ COLUMN ] 字段名 { SET | DROP } NOT NULL

ALTER [ COLUMN ] 字段名 SET STATISTICS integer

ALTER [ COLUMN ] 字段名 SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }

ADD 表约束

DROP CONSTRAINT 约束名字 [ RESTRICT | CASCADE ]

CLUSTER ON 索引名称

SET WITHOUT CLUSTER

SET WITHOUT OIDS

OWNER TO 新属主

SET TABLESPACE 表空间名字

 

命令: ALTER TRIGGER

描述:    
改变一个触发器的定义

语法:

ALTER TRIGGER 名字 ON RENAME TO 新名字

 

命令: ALTER USER

描述:    
改变一个数据库用户

语法:

ALTER USER name [ [ WITH ] option [ … ] ]

where option can be:

CREATEDB | NOCREATEDB

| CREATEUSER | NOCREATEUSER

| [ ENCRYPTED | UNENCRYPTED ] PASSWORD ‘password’

| VALID UNTIL ‘abstime’

ALTER USER name RENAME TO newname

ALTER USER name SET parameter { TO | = } { value |
DEFAULT }

 

命令: COPY

描述:    
在一个文件和一个表之间拷贝数据

语法:

COPY 表名 [ ( 字段 [, …]
) ]

FROM { ‘文件名‘ |
STDIN }

[ [ WITH ]

[ BINARY ]

[ OIDS ]

[ DELIMITER [ AS ] ‘delimiter’ ]

[ NULL [ AS ] ‘null string’ ]

[ CSV [ QUOTE [ AS ] ‘quote’ ]

[ ESCAPE [ AS ] ‘escape’ ]

[ FORCE NOT NULL column [, …] ]

 

COPY 表名 [ ( 字段 [, …] ) ]

TO { ‘文件名‘ |
STDOUT }

[ [ WITH ]

[ BINARY ]

[ OIDS ]

[ DELIMITER [ AS ] ‘delimiter’ ]

[ NULL [ AS ] ‘null string’ ]

[ CSV [ QUOTE [ AS ] ‘quote’ ]

[ ESCAPE [ AS ] ‘escape’ ]

[ FORCE QUOTE column [, …] ]

 

命令: CREATE TABLE

描述:    
定义一个新的表

语法:

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY |
TEMP } ] TABLE table_name (

{ column_name data_type [ DEFAULT
default_expr ] [ column_constraint [ … ] ]

| table_constraint

| LIKE parent_table [ { INCLUDING |
EXCLUDING } DEFAULTS ] } [, … ]

)

[ INHERITS ( parent_table [, … ] ) ]

[ WITH OIDS | WITHOUT OIDS ]

[ ON COMMIT { PRESERVE ROWS | DELETE ROWS |
DROP } ]

[ TABLESPACE tablespace ]

 

where column_constraint is:

 

[ CONSTRAINT constraint_name ]

{ NOT NULL |

NULL |

UNIQUE [ USING INDEX TABLESPACE tablespace
] |

PRIMARY KEY [ USING INDEX TABLESPACE
tablespace ] |

CHECK (expression) |

REFERENCES reftable [ ( refcolumn ) ] [
MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]

[ ON DELETE action ] [ ON UPDATE action ] }

[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY
DEFERRED | INITIALLY IMMEDIATE ]

 

and
table_constraint is:

 

[ CONSTRAINT constraint_name ]

{ UNIQUE ( column_name [, … ] ) [ USING
INDEX TABLESPACE tablespace ] |

PRIMARY KEY ( column_name [, … ] ) [
USING INDEX TABLESPACE tablespace ] |

CHECK ( expression ) |

FOREIGN KEY ( column_name [, … ] )
REFERENCES reftable [ ( refcolumn [, … ] ) ]

[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE
] [ ON DELETE action ] [ ON UPDATE action ] }

[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED |
INITIALLY IMMEDIATE ]

openstack环境上安装kafka

openstack环境上安装kafka

1.按照官网下载解压
选择你喜欢的版本,拷贝链接,然后cd到你喜欢的目录下。执行如下命令
  1. wget http://mirrors.cnnic.cn/apache/kafka/0.8.2.1/kafka-0.8.2.1-src.tgz
  2. tar -xzf kafka-0.8.2.1-src.tgz
2.编辑conf/server.properties文件
  1. advertised.host.name=59.46.101.43 外网访问地址
3.按照官方文档启动zookeeper、kafka,创建topic
  1. bin/zookeeper-server-start.sh config/zookeeper.properties
  2. bin/kafka-server-start.sh config/server.properties
  3. bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
以上就完成了安装。
4.完成两个端口的外网映射,2181和9092保证外网可以telnet可达
5.完成回路配置,保证内网虚机上ping外网地址59.46.101.43可达
6.然后就可以使用了,按照官网的生产和消费命令试一下吧
  1. bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
  2. bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning