作者存档

eclipse的Toggle Block Selection Mode功能

2011年11月25日 没有评论

用eclipse3.6一段时间了,今天无意中发现了Toggle Block Selection Mode功能,其用途就是文本编辑器支持块选择模式。何为块选择模式呢,就是类似于ultraedit的列模式。似乎这个功能在eclipse3.5版本就推出来了的。

这个功能其实蛮有用的,比如一个文件有很多行,现在只想把每行前面的10个字符复制出来,那么在块选择模式下就很容易做到了;另外在html之类的文件中可以辅助找出html标签是否不匹配,前提的html文件写的比较规范。

启用此功能的快捷键为:Alt+Shift+A,通过这个它可以在快选择模式和普通模式间进行切换。

分类: Java 标签:

深入理解struts2的namespace

2011年11月23日 没有评论

struts2提供了一个命名空间的概念,可以通过package的namespace属性来设置,使用它可以避免action的名字冲突,同时也可以在逻辑上给action分类。关于namesapce的很多信息,可以参考strtus的官方文档,地址是:http://struts.apache.org/2.2.3.1/docs/namespace-configuration.html

个人觉得,这个里面还是很多信息没有表达清楚。例如该文档最后有一段话如下:

Namespaces are not a path!
Namespace are not hierarchical like a file system path. There is one namespace level. For example if the URL /barspace/myspace/bar.action is requested, the framework will first look for namespace /barspace/myspace. If the action does not exist at /barspace/myspace, the search will immediately fall back to the default namespace “”. The framework will not parse the namespace into a series of “folders”. In the Namespace Example, the bar action in the default namespace would be selected.

大概意思就是说,如果在某个命令空间下没有找到对应的action,然后就直接去缺省的命名空间下。但事实真的如此吗?

通过一些测试,发现似乎遵循如下的规则:

1.假设请求路径的URI,例如url是:http://www.netingcn.com/path1/path2/test.do

2.首先寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为test的action,若找到则执行,否则转步骤5;如果不存在这个package则转步骤3。

3.寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为test的action,若找到则执行,否则转步骤5;如果不存在这个package则转步骤4。

4. 寻找namespace为/的package,如果存在这个package,则在这个package中寻找名字为test的action,若找到则执行,转步骤5;如果不存在转步骤5。

5. 如果存在缺省的命名空间,就在该package下查找名字为test的action,若找到则执行,否则页面提示找不到action;否则提示面提示找不到action。

上述一个很重要的地方就是一旦找到对应的namespace的package就停止向上级路径查找了,另外缺省命名空间(package中没有指明namespace属性或namespace属性值为空)的package的可以不存在。

以前一直比较困惑的是,当访问http://www.netingcn.com/test.do成功,那类似http://www.netingcn.com/x/test.do,http://www.netingcn.com/x/y/test.do也能正常访问,而且执行的同一个action。而上述的试验结果可以很好的解释这个疑惑了。但是个人觉得这样的设计不是太好,决定去源码看个究竟,在org.apache.struts2.dispatcher.mapper.DefaultActionMapper找到关于如何在namespace中查找action的操作,有如下代码:

    protected void parseNameAndNamespace(String uri, ActionMapping mapping, ConfigurationManager configManager) {
        String namespace, name;
        int lastSlash = uri.lastIndexOf("/");
        if (lastSlash == -1) {
            namespace = "";
            name = uri;
        } else if (lastSlash == 0) {
            // ww-1046, assume it is the root namespace, it will fallback to
            // default
            // namespace anyway if not found in root namespace.
            namespace = "/";
            name = uri.substring(lastSlash + 1);
        } else if (alwaysSelectFullNamespace) {
            // Simply select the namespace as everything before the last slash
            namespace = uri.substring(0, lastSlash);
            name = uri.substring(lastSlash + 1);
        } else {

注意到其中alwaysSelectFullNamespace这个信息,原来它属于struts.properties常用配置的一项,其作用是控制是否一直在最后一个slash之前的任何位置选定namespace。由于struts2默认是设置是false,所以导致按照上述试验结果成功,当把alwaysSelectFullNamespace在strtus.properties中设置为true时,此时struts2查找action就不会递归路径去查找package,而是直接找路径对应的package,如果没有找到就去默认命名空间下查找,这就是官方文档中所采用的说法。

个人建议把alwaysSelectFullNamespace设置为true,明确指定action在属于命名空间的package中,不会操作url路径随便输入的问题,同时执行效率也会略有提高。

linux的uniq命令

2011年11月21日 没有评论

使用uniq命令可以过滤掉文本文件中重复的行以及统计等等功能,同时它也接受来着管道的输入。借助awk,甚至可以对行中的列进行操作,例如统计nginx日志信息中独立ip数、列出访问次数最多的ip等。需要注意的地方是uniq只对相连的行进行处理,所以一般情况下要先进行sort操作。

假设有名为test.txt文本文件,其信息为:

ab
ac
ab
ac
ac
ad
ac

执行命令

uniq test.txt

此时得到的结果为:

ab
ac
ab
ac
ad
ac

从结果可以看到,这里只对3,4行的ac进行过滤,这显然不是我们需要的结果,原因就是uniq只对相连的行进行运算了,现在先用sort排序,然后再执行uniq,例如:

sort test.txt | uniq

这时的结果为:

ab
ac
ad

可以看到再没有重复行了。

例如通过nginx日志统计独立ip的个数:

awk '{print $1}' /path-to-log-dir/access.log | sort | uniq | wc -l

查询访问最多的前10个ip

awk '{print $1}' /path-to-log-dir/access.log  | sort | uniq -c | sort -nr | head -10
分类: Linux 标签: ,

使用neuxs搭建maven私服

2011年11月18日 评论已被关闭

私服的好处很多,可以在私服上建立公司内部仓库,把公司的内部构件部署上去供其他人或项目使用;能够部署第三方构件,某些第三方构建在公共的仓库中没有,如果项目中需要使用,就可以把第三方构建部署到自己的私服上,这样mavne中就能正常使用了;在没有私服的情况,项目开发的每个人都需要从远程的中央库下载依赖的构建,浪费带宽不说,效率还低;等等……。

  • 安装nexus

1、下载

下载地址:http://nexus.sonatype.org/downloads/,这里列出了所有版本,挑一个最新版本来使用。Nexus提供了两种安装方式,一种是内嵌Jetty的bundle,只要你有JRE就能直接运行。第二种方式是WAR,你只须简单的将其发布到web容器中即可使用。为了方便就直接选用bundle版本。本文下载的是nexus-oss-webapp-1.9.2.3-bundle.tar.gz 。

2、安装

在指定的目录解压下载的文件

tar xvf nexus-oss-webapp-1.9.2.3-bundle.tar.gz

解压后会看到两个文件夹,分别是nexus-oss-webapp-1.9.2.3和sonatype-work,前者包含了nexus的运行环境和应用程序,后者包含了你自己的配置和存储构件的地方。nexus-oss-webapp-1.9.2.3/conf/plexus.properties中可以修改端口信息已经工作区的路径。

3、启动nexus
进入nexus-oss-webapp-1.9.2.3/bin/jsw/目录,然后根据OS的版本进入相应的目录,在linux下,运行./nexus start即启动了服务,直接运行./nexus会看到提示信息。neuxs默认监听端口是8081,此时在浏览器中运行访问http://nexus-server-ip:8081/nexus应该可以看到neuxs的界面。

  • 配置nexus

新搭建的neuxs环境只是一个空的仓库,需要手动和远程中心库进行同步,nexus默认是关闭远程索引下载,最重要的一件事情就是开启远程索引下载。登陆nexus系统,默认用户名密码为admin/admin123。 点击左边Administration菜单下面的Repositories,找到右边仓库列表中的三个仓库Apache Snapshots,Codehaus Snapshots和Maven Central,然后再没有仓库的configuration下把Download Remote Indexes修改为true。然后在这三个仓库上分别右键,选择Repari Index,这样Nexus就会去下载远程的索引文件。

新建公司的内部仓库,步骤为Repositories –> Add –> Hosted Repository,在页面的下半部分输入框中填入Repository ID和Repository Name即可,比如分别填入myrepo和 my repository,另外把Deployment Policy设置为Allow Redeploy,点击save就创建完成了。

修改neuxs仓库组

Nexus中仓库组的概念是Maven没有的,在Maven看来,不管你是hosted也好,proxy也好,或者group也好,对我都是一样的,我只管根据groupId,artifactId,version等信息向你要构件。为了方便Maven的配置,Nexus能够将多个仓库,hosted或者proxy合并成一个group,这样,Maven只需要依赖于一个group,便能使用所有该group包含的仓库的内容。

neuxs-1.9.2.3中默认自带了一个名为“Public Repositories”组,点击该组可以对他保护的仓库进行调整,把刚才建立的公司内部仓库加入其中,这样就不需要再在maven中明确指定内部仓库的地址了。同时创建一个Group ID为public-snapshots、Group Name为Public Snapshots Repositories的组,把Apache Snapshots、Codehaus Snapshots和Snapshots加入其中。

到这里neuxs的安装配置就完成了,下面介绍如何在mavne中使用自己的私服。 阅读全文…

分类: Java, Linux 标签: ,

netstat命令的常见用法

2011年11月17日 没有评论
  • 查看系统服务监听状况
netstat -tunlp
  • 查看连接某服务端口最多的的IP地址
netstat -nat | grep "10.150.185.178:80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -20
  • TCP各种状态列表
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -rn
或
netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

另外分析access.log获得访问前10位的ip地址可以用如下命令:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
分类: Linux 标签: ,

maven部署构件至Nexus私服

2011年11月17日 没有评论

首先在Nexus中创建一个自己私有的仓库,步骤为Repositories –> Add –> Hosted Repository,在页面的下半部分输入框中填入Repository ID和Repository Name即可,比如分别填入myrepo和 my repository,点击save就创建完成了。

如果要把构建部署至私服中,需要在构建的 pom.xml 文件增加 distributionManagement 配置项,有多种协议可以用来部署构建,这里主要讲两种。

  • 第一种配置如下:
<project>
	[...]	
	<distributionManagement>
		<repository>
			<id>myrep</id>
			<name>my repository</name>
			<url>file:/usr/local/mvn-private-server/nexus-oss-webapp-1.9.2.3/./../sonatype-work/nexus/storage/myrep/</url>
		</repository>
	</distributionManagement>
	[...]
</project>

说明:其中id就是需要部署构建的仓库Id,name似乎不重要,可以随便输入,url就是仓库的configuration中Default Local Storage Location项的对应的信息。采用此种方法,服务器不会对部署操作进行认证,同时配置也把仓库的物理存储地址完全暴露,感觉不是太好。

  • 第二种配置如下:
<project>
	[...]	
	<distributionManagement>
	  <repository>
		<id>tagphi</id>
		<url>http://nexus-server-ip:8081/nexus/content/repositories/myrep</url>
	  </repository>
	</distributionManagement>
	[...]
</project>

说明:上述的distributionManagement信息可以在对于的仓库的Summary中找到。

配置好后,此时执行mvn deploy,部署应该不会成功,根据提示信息,重新执行 mvn deploy -e 或 mvn deploy -X,此时能看到具体的错误信息,报Return code is: 401错,这个是因为发布者没有权限,需要把用户认证信息配置在maven的settings.xml中,该文件在mavne安装包下的conf目录下,这是一个全局配置,同时可以把该文件复制到 userdir/.m2 目录下,这样配置就只对当前用户生效。在settings.xml文件中servers段中添加如下信息

    <server>
      <id>myrep</id>
      <username>deployment</username>
      <password>password</password>
    </server>

其中id就是部署仓库的id,username是作为部署用户,Nexus系统默认的deployment,密码为deployment123,可以在security — users中找到,如果需要设置密码,在用户列表中找到该用户,在该用户上点击右键,会出来一个菜单供重置密码或修改密码。此时在执行 mvn deploy,应该可以看到成功发布了。当第二次执行 mvn deploy 又失败,这次失败原因是Return code is: 400,该错误的原因是在创建仓库时在configuration中的Deployment Policy设置为了Disable Redeploy,修改为Allow Redeploy即可。

the NTP socket is in use, exiting

2011年11月16日 没有评论

centos下使用如下命令手动同步服务器时间

	ntpdate ntp.fudan.edu.cn
	或
	ntpdate ntp.api.bz

出现“the NTP socket is in use, exiting”错误。造成该原因是系统ntpd服务器正在运行中,可以通过 ps aux | grep ntpd 查看,如果还是要手动同步时间,就必须先停止该服务,命令为:

	service ntpd stop

然后再通过 ntpdate ntp.fudan.edu.cn 即可手动同步时间了。另外注意,如果想把它加入到crontab中,最好把ntpdate命令的完整路径带上,即/usr/sbin/ntpdate ntp.fudan.edu.cn,否则可能在某些版本的linux中不会被执行,同时用chkconfig把ntpd修改成不是自动运行的状态。

分类: Linux 标签:

清理MySql的日志文件mysql-bin.00000

2011年11月15日 1 条评论

有一个应用运行在aws的ec2上面,由于存储硬盘比较小,只有8G左右的容量,最初刚配置好环境(按照了php、mysql、nginx等),使用的硬盘只有不到3G,运行一段后,发现硬盘已经用了5G多了,即使清除了nginx的日志,硬盘还是接近5G。决定找出是谁占用了硬盘空间。

通过命令

du -h –max-depth=1 /

查看根目录下每个文件夹所占用存储的大小,发现/var占用了快3G,进一步使用du命令,发现是存放mysql数据文件的文件夹占用了绝大部分空间,进入该文件夹,发现有很多mysql-bin.00000开头的文件,而且其中的某些达到了1G以上,google发现原来这些用户是mysql记录的日志文件,用于数据库崩溃后恢复数据和主从数据库进行数据同步的。如果没有进行主从数据库,可以通过修改配置文件让mysql关闭记录操作日志功能,关闭只需要在log-bin=mysql-bin前加上一个“#”即可,不要忘记重启mysql服务。

清理日志方法为:

PURGE MASTER LOGS TO 'mysql-bin.000013'; 
或
PURGE MASTER LOGS BEFORE '2010-10-18 00:00:00'; 

另外可以通过 RESET MASTER 来删除整个日志文件,注意,如果使用主从数据库,在操作前先确保从数据库已经完全同步了主数据库的数据。
上述命令都是登陆到mysql后执行的。

javascript 正则表达式 全局修饰符

2011年11月10日 没有评论

在javascript中定义一个正则表达式可以有如下形式:

直接量语法
var re = /pattern/attributes //注意后面不能有分号
创建 RegExp 对象的语法
var re = new RegExp(pattern, attributes);

参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。

参数 attributes 是一个可选的字符串,包含属性 “g”、”i” 和 “m”,分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

如果用错了attributes中的g修饰符,可能会导致意想不到的结果。例如如下例子中。

var str = "abc123";
var re = /a.c/g
var result1 = re.test(str);
var result2 = re.test(str);
var result3 = re.test(str);

可能第一眼看上去result1、result2、result3都为true吧,但是执行一下,得到的结果有些让人费解,result2为false。即使在var result2 = re.test(str)前对str从新赋值为str = “abctest”,得到结果还是false。为什么会这样呢?其实造成这个结果的原因就是在正则表达式中用全局匹配修饰符(/g),如果去掉/g,即re=/a.c/得到的结果就都为true。现在知道问题出在什么地方,但更深层的原因是什么呢?查看文档,发现RegExp对象有一个lastIndex的属性,如果使用了全局修饰符,那么执行test方法后,lastIndex就会记录匹配的字符串在原始字符串中最后一位的索引加一,例如执行了var result1 = re.test(str)后lastIndex为3,如果没有发现匹配lastIndex置为0。当下次再执行时,对给定的字符串匹配不是从开头位置,而是要依据lastIndex提供的位置,由于这个原因,所以导致上例中result2的值为false。另外也能通过程序重置lastIndex值。不知道这能不能算是javascript引擎的一个Bug。

最后总结一下正则表达式相关的一些操作,RegExp对象本身的方法有exec和test,字符串对象能使用正则的方法有search、match、replace和split。其中真正能用到全局修饰符的只有match和replace,所以在考虑使用正则表达式的时候不要滥用/g。

window中findstr命令的用法

2011年11月8日 没有评论

findstr是window系统自带的命令,用途是查找指定的一个或多个文件文件中包含(或通过参数 /V来控制不包含)某些特定字符串的行,并将该行完整的信息打印出来,或者打印查询字符串所在的文件名。其用途和用法都类似linux下的grep命令,基本用法如下:

findstr 参数 "搜索字符串" [[drive:][path]filename[ ...]]

其中参数可以组合多个,[drive:]、[path]是可选的,如果省略,默认是查找当前目录,至少指定一个文件,可以同时指定多个,用空格分隔,另外文件名可以使用通配符,例如所有文本文件,就可以写成 *.txt 即可。

另外findstr的输入也可以接受来自管道的输出,例如命令:netstat -nao | findstr “8080″ 可以查看命令netstat输出的信息中所有包含“8080”字符串的行。

用法1:打印出文件demo.txt中包含“hello world”字符串的行的完整信息(不区分大小写),并且打印出行号。

findstr /NI /C:"hello world" demo.txt

注意:不能漏写”/C:”,否则含有hello或者world的行都作为结果打印出来。

用法2:找出并打印出目录C:\deom下(包括其子目录)所有含有字符串“netingcn.com”的文本文件的文件名。

findstr /MSI "netingcn.com" *.txt

通过findstr /? 可以看到帮助信息,帮助信息如下:

在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。
  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索匹配文件。
  /I        指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
  /O        在每个匹配行前打印字符偏移量。
  /P        忽略有不可打印字符的文件。
  /OFF[LINE] 不跳过带有脱机属性集的文件。
  /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file   从指定文件读文件列表 (/ 代表控制台)。
  /C:string 使用指定字符串作为文字搜索字符串。
  /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir    查找以分号为分隔符的目录列表
  strings   要查找的文字。
  [drive:][path]filename
            指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there" 。  'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找
"hello there"。

一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类别: 任何在字符集中的字符
  [^class] 补字符类别: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  \x       Escape: 元字符 x 的文字用法
  \    字位置: 字的结束

参数/B等价于在搜索字符串前的”^”符号。

参数/E等价于在搜索字符串后的”$”符号。

参数/S会对目录进行递归查询。

参数/C就是强制把输入的子字符串作为查询目标,否则输入的字符串中有空格的话,findstr会以“或”的逻辑来进行查找。

参数/D可以实现对多个存放在不同路径的文件夹进行查询。

分类: 其它 标签: ,

无觅相关文章插件,快速提升流量