枫中畅游

关注技术,热爱生活
随笔 - 15, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

2012年8月5日

linux系统之上搭建maven 之nexus服务篇

       今天刚好有点时间,就想在公司的服务器搭建一个私服,以便以后可以唯我所用,当然前提是服务器最好可以上网,否则还需要配置代理服务器,前两天刚好把服务器的网络给配置了下,这边就不详述了!大家一定着急了吧,稍安务燥,这就进入正题,O(∩_∩)O~

        linux安装过程和window主机还是差别挺大的。

1.下载nexus集成版

到这个地方http://www.sonatype.org/nexus/go 下载压缩包,我这边下载的是nexus-2.0.3-bundle.tar.gz这个版本。

2. 解压到相应的目录

tar  -xzvf  nexus-2.0.3-bundle.tar.gz , 我这边放在/home/linjx/opendev/nexus-2.0.3目录下。

 

3. 设置为系统服务

这里需要使用root权限,具体请看http://books.sonatype.com/nexus-book/reference/install-sect-service.html

简单如下:

# cd  /etc/init.d

# cp  /home/linjx/opendev/nexus-2.0.3/bin/jsw/linux-x86-64/nexus ./nexus

# chmod 755 nexus

# chkconfig --add nexus

# chkconfig --levels 345 nexus on

 

4. 编辑/etc/init.d/nexus的文本

4.1. 添加以下变量

RUN_AS_USER=linjx    ## 这个主要为了后面使用,不需要使用root用户启动服务

NEXUS_HOME=/home/linjx/opendev/nexus-2.0.3/

PLATFORM=linux-x86-64

PLATFORM_DIR="${NEXUS_HOME}/bin/jsw/${PLATFORM}"

4.2. 修改以下变量

WRAPPER_CMD="${PLATFORM_DIR}/wrapper"

WRAPPER_CONF="${PLATFORM_DIR}/../conf/wrapper.conf"

 

 

PIDDIR="${NEXUS_HOME}"

 

5. 启动服务

切换会自己的用户,不需要使用root用户;

# service nexus start

 

这个大家出现什么情况,是不是失败了!界面上出现 :Could not write pid file /etc/rc.d/init.d/./nexus.pid: Permission denied通过查看日志文件:

fzdev#[/home/linjx/opendev/nexus-2.0.3/logs] cat w*  

wrapper  | ERROR: Could not write pid file /etc/rc.d/init.d/./nexus.pid: Permission denied

 

怎么办呢,根据信息提示,nexus.pid无法写入,应该还是权限问题,这个应该跟启动当前服务有关。

 

查文档http://books.sonatype.com/nexus-book/reference/install-sect-service.html后发现,一有段信息没有配置,

Change PIDDIR to a directory where this user has read/write permissions. In most Linux distributions, /var/run is only writable by root. The properties you need to add to customize the PID file location is "wrapper.pid". For more information about this property and how it would be configured in wrapper.conf, see: http://wrapper.tanukisoftware.com/doc/english/properties.html

 

大概意思就是服务启动时无法写入pid,就是说init.d这个目录当前用户是没有权限写的,怎么办呢。可以自定义pid写入目录,那么在哪里配置呢,是不是又想起了wrapper.conf了,其他文档中也说明了。

好吧,那就再加个配置吧,这样:PIDDIR="/home/linjx/piddir"

 

然后再启动服务,果然成功了!具体可以看看附件中的详细的日志!



 

6. 启动之后,可以登录首页查看nexus的界面

http://192.168.1.26:8081/nexus/index.html

 

默认管理员用户名/密码: admin/admin123

 



 

posted @ 2013-08-21 09:32 javalinjx 阅读(14933) | 评论 (2)编辑 收藏

使用leiningen搭建clojure开发环境

首先来讲下Leiningen是什么东东?

Leiningen是一个用于自动化(构建)clojure项目的工具。

它可以做到:

    创建新项目

    管理你的项目的依赖关系

    运行测试

    运行一个REPL(读取-求值-打印循环:read-eval-print loop)

    编译java源码

    运行项目

    为项目产生一个Maven风格的POM文件

    为了部署,编译和打包项目

    发布类库到Maven仓库,例如Clojars

    运行Clojure编写的自定义的自动化任务(称为Leiningen插件)

    ... 具体可以查看国内的大牛(killme2008)翻译的Leiningen教程中文版的详细介绍。

好些话说多了点,大家别着急啊,马上就切入主题:

1. 下载安装Leiningen

   linux: 

        1. 确保你是jdk 6 版本以下的。

        2. 下载脚本lein

        3. 把lein加入下当前的$path下(~/bin 是最好的选择)

        4. 赋可执行权限(chmod 755 ~/bin/lein)

  windows:

        1. 可以直接下载打包好的文件,地址是:Leiningen for windows

        2. 点击下载好的*.exe文件进行安装

        3. 安装好后,可以查看环境变量中会有相应的变量被设置好了:

         lein.bat is added to your PATH variable.

        LEIN_JAVA_CMD is set to point to your selected JDK, and the :java-cmd property is set in your              user profile in profiles.clj.

        

        接下来,打开命令窗口,输入命令:lein self-install  ,会自动下载安装leiningen 相关的jar文件。

       

       验证下安装成果: 在命令窗口中输入lein repl ,会自动连上nREPL server,进入repl模式,如下所示:

 

      

Shell代码  收藏代码
  1. C:\Users\linjx>lein repl  
  2. nREPL server started on port 21912  
  3. REPL-y 0.2.0  
  4. Clojure 1.5.1  
  5.     Docs: (doc function-name-here)  
  6.           (find-doc "part-of-name-here")  
  7.   Source: (source function-name-here)  
  8.  Javadoc: (javadoc java-object-or-class-here)  
  9.     Exit: Control+D or (exit) or (quit)  
  10.   
  11. user=>  

 

    如果出现上面的提示,则说明leiningen安装成功,你可以在使用leiningen开发你的clojure之旅了。

    但是往往我们不满足于现状,希望可以更有效的使用lein编写clojure。类似java的idea,eclipse一样,都对编写java提供了强大的工具,那么我们可以选择什么样的工具呢,毫无疑问,Emacs是最合适的工具,没有之一:)

     对于我这断断续续学习emacs的来说,还真不是不容易,昨晚查看了相关的e文说明,在emacs中成功装配了nrepl ,用以后续的开发学习,便记录一下,希望对自己以后查阅,以及需要的人有所帮助。

     首先,我本地有emacs 24 版本的, 这里不想讲emacs 的安装,这个大家自个儿查询下google便可以了。

     在安装好leiningen之后,现在进入nrepl的主页看看,这是个什么东东!

     nrepl.el is an Emacs client for nREPL,the Clojre networked REPL server.It's a great alternative to the now deprecated combination fo SLIME + swank-clojure.

    nrepl.el是emacs作为nrepl的一个客户端,nrepl是一个反对目前slime+swank-clojure组合的最好的替代品。

     下面来看下如何安装nrepl.el:

      1. emacs 24 以及更高版本是构建在package.el之上的,但是emacs 23以下版本的,你需要自己获取package.el .

      虽然我的是24版本的,但是我也下载了package.el,并存放在     C:\Users\linjx\AppData\Roaming\.emacs.d 目前下,这个是我的emacs在windows下的配置目录。

      2. 这里需要提一个文件,即 .emacs 文件,这个是emacs初始化配置的文件,位于C:\Users\linjx\AppData\Roaming 目录下。

         如果你不需要使用Marmalade,则添加配置 到 .emacs文件中,如下所示:

 

Lisp代码  收藏代码
  1. (require 'package)  
  2. (add-to-list 'package-archives  
  3.              '("marmalade" . "http://marmalade-repo.org/packages/"))  
  4. (package-initialize)  

 

 由于使用MELPA the code ,需要添加配置到 .emacs文件中,

     

Lisp代码  收藏代码
  1. (require 'package)  
  2. (add-to-list 'package-archives  
  3.              '("melpa" . "http://melpa.milkbox.net/packages/") t)  
  4. (package-initialize)  

 

  在emacs中打开.emacs文件,并M-x eval-buffer,执行当前的配置。

    

     3.  刷新配置

Lisp代码  收藏代码
  1. M-x package-refresh-contents  回车  

     emacs会自动下载安装Marmalade , melpa相关的配置;

 

     4. 安装nrepl

         输入命令 

命令代码  收藏代码
  1. M-x package-install 回车  
  2.        nrepl 回车  

 

     致此,nrepl集成到emacs的安装完毕,可以使用emacs开发你的hello world!了。

( 当然,emacs还可以与其他集成用来clojure的开发,这里我就不详述了,毕竟没有使用!)

 

现在我们使用lein new 一个clojure项目出来:

1. $  lein new hello

 

2. 打开emacs,在buffer中打开 hello所在的目录下的project.clj文件

 

3. 输入命令:M-x nrepl-jack-in,即可初始化一个nrepl server  和 nrepl client

如下图所示:



 

 

posted @ 2013-07-03 13:40 javalinjx 阅读(8246) | 评论 (0)编辑 收藏

git命令记录

从服务器创建一个本地仓库的clone版本:

git clone /path/to/repository

如果是远端服务器上的仓库,你的命令是这样:

git clone username@host:/path/to/repository

多种方式的URI

 

git add <filename>

git add *

git commit -m "代码提交信息"

 

将本地仓库的head中的东西提交到远程服务器上:

git push origin master(分支名)

欲将本地的仓库连接到某个远程服务器

git remote add origin <server>

 

持续补充,作为自己查询使用

posted @ 2013-07-03 12:18 javalinjx 阅读(253) | 评论 (0)编辑 收藏

Junit 学习笔记

上周空闲,看完了《单元测试之道》,这里对自己的学习做个小结,以便以后查阅: 

 

一般原则:
测试任何可能失败的地方。
测试任何已经失败的地方。
对于新加的代码,在被证明正确之前,都可能是有问题的。
至少编写和产品代码一样多的测试代码。
针对每次编译都做局部测试。
签入代码之前做全局测试。
需要回答的问题:
我如何知道代码运行是否正确呢?
我要如何对它进行测试?
还有哪些方面可能会发生错误?
这个问题是否会在其他的地方出现呢?
测试哪些方面 :使用junit 测试的6个方面,统称为:Right-BICEP:
Right --- 结果是否正确?
B --- 是否所有的边界条件都是正确?
I --- 能查一下反向关联吗?
C --- 能用其他手段交叉检查一下结果吗?
E --- 你是否可以强制错误条件发生?
P --- 是否满足性能要求?
编写测试用例原则,correct边界条件:
conformance (一致性)-- 值 是否和预期的一致。
Ordering(顺序性)--一组值是该有序或者无序的。
Range(区间性)--值是否位于合理的最小值和最大值之内。
Reference(引用 、耦合性)--代码是否引用了一些不在代码本身控制范围之内的外部资源。
Existence(存在性)--值是否存在(例如,是否是非null,非0,在一个集合中等等)。
Cardinatity(基数性)--是否恰好有足够的值?
Time(相对或者绝对的时间性)--所有事情的发生是否是有序的?是否是在正确的时刻?是否恰好及时?
环境方面的因素:
内存耗光。
磁盘用满。
时钟出问题。
网络不可用或者有问题。
系统过载。
调色板颜色数目有限。
显示分辨率过高或者过低。
0-1-n 原则
Mock对象:
真实对象具有不可确定的行为(产生不可预测的结果,如股票行情)
真实对象很难被创建
真实对象的某些行为很难触发(如网络错误)。
真实对象令程序的运行速度很慢。
真实对象有(或者是)用户界面。
测试需要询问真实对象它是如何被调用的(例如,测试可能需要验证某个回调函数是否被调用了)。
真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍问题)。
借助于mock对象,我们就可以解决上面提到的所有问题。在使用mock对象进行测试的时候,总共有3个步骤,分别是:
1. 使用一个接口来描述这个对象。
2. 为产品代码实现这个接口。
3. 以测试为目的,在mock对象中实现这个接口。
mock提供了所有系统功能的现成接口,所以在更多的时候,人们可能(也许吧)会使用它而不是直接调用诸如System.currentTimeMillis()这样的东西,而是躲在接口背后拥有了控制一切行为的能力。
这就是mock对象的全部;伪装出真实世界的某些部分,使你可以集中精力测试好自己编写的代码。让我们接下来看看更加复杂的例子吧。
好的测试是一个A-TPIP:
1. 自动化 (Automatic).  调用测试自动化和检查结果自动化。
2. 彻底的 (Thorough).
3. 可重复 (Repeatable).
4. 独立的 (Independent).
5. 专业的 (Professional).
在你发现bug时,所需要做的就是以下四个步骤:
1.验明bug;
2.编写一个将失败的测试来证明bug的存在。
3.修正代码,让测试通过。
4.验证所有的测试仍然可以通过(也就是,你没有在修补的时候损坏其他的测试)。
测试的频率:
1.编写新的函数    编译并运行本地的单元测试。
2.修正bug    运行测试来让bug现形;修并再次运行单元测试。
3.每次成功编译之后   运行本地的单元测试。
4.每次对版本控制的签入   运行所有的模块或者系统的单元测试。
5. 持续不断地   应当有一台专门的机器来运行完整的构建和测试。每次都应该从头开始,并且整天自动运行(要么是周期性的,要么是每当有版本控制的签入行为的时候)
编码和评审以这样的顺序进行:
1. 编写test case 和/或测试代码。
2. 评审test case 和/或测试代码。
3. 经评审修改test case 和/或测试代码。
4. 编写能通过所有测试的产品代码。
5. 评审产品代码和测试代码。
6. 在每次评审后,修改测试代码和产品代码。
在某些机器上测试失败:
这究竟是为什么呢?这些机器之间有什么区别呢?
比较明显的答案可能是下面这些资源的差异:操作系统版本号、运行库、java运行引擎、数据库驱动等。
统一使用junit 方法的setup 和 tearDown方法。

posted @ 2013-06-17 09:52 javalinjx 阅读(310) | 评论 (0)编辑 收藏

2012年个人总结

   本来这个总结要到31号写的,结果太忙了,到了今天才有时间做个总结。
   首先,工作上,从去年的PPM项目一直延续到今年4月份,终于暂时告一个段落了。基本上没有什么收获,架构陈旧,设计原始。。一向对于代码要求相对比较严格的我,实在是重构到快吐了。耦合度太高了,不知道之前写的人是怎么过来的,心里还挺佩服他可以把这个项目做出来。总体上经历了几个项目的开发,实施。从java技术阵营出来,接触到了C,C++,linux等技术,对于
自己的技术储备又增添了一砖,但都仅限于了解,还达不到熟悉水平。也许是自己就是喜欢java技术吧!
   今年基本上都在外奔波,我和老婆都在外面,话说那会儿她在帝都,我在天津,于是上半年经常两地往返,京津高跌成了我最常用的交通工具:)
    从2011年来公司快两年了,发现自己的开始技术上没有太多的长进,只是自己平时出于对技术的爱好,才能勉强知道相关的新技术的发展,但是还是缺少实践。也许再这样下去,我就搞不了技术了。一直渴望有机会去淘宝一试,但是确由于种种原因未能达成。
   当然今年还有一件重要的事,我们买房了,正式告别了租房的时代,成为了房奴中的一员,哈!这一年,基本没有关注其他的国事,或者经济,当时钓鱼岛事情还是知道的。这一年中,从阅读中得到了不少的收获,看了刘未鹏的〈暗时间〉,看了李笑来的〈把时间当作朋友〉,为何我要提这两本书呢,因为她们带给我了比较多的帮助,虽然有些事情自己也是这么做着,但是却没有坚持,虽然一些事情一直在坚持,却不知道为何要坚持!当然还有技术方面的书籍,这里我就不多说了,可以查看这里http://www.douban.com/people/davylin/ 。   
   今年才看了两部电影(和老婆一起看的):一个是太极,一个是泰囧。话说这个太极真是让人失望,感觉导演故意删减了剧情。
   下面晒一下2012年的榜单:年度电影:泰囧;年度图书:《暗时间》《把时间当作朋友》;年度音乐:我的歌声里,因为爱情;年度技术:clojure(代表人物:dennis)。
   这一年中接触到的新技术有nosql,node.js,clojure,当然还有hadoop,android,ios等等,但都仅限于了解,并没有真正的开始实践,也无从实践,不知道是否有牛人可以指引。
   今年还参与了ROP的前期调研,本想参与开发,但后面却不了了之。参与了anyous的android的客户端开发,结果创新无门,但是现在还在继续中。
   通过新浪微博,认识了很多淘宝系的牛人(这里不一一列举),一步步向他们学习着,在接触到的新技术中,不乏e文资料,深感个人英文水平是软胁。特别是认识了美味系的相关名人,有dennis,sunng,还有胡狼拜月,哈哈,在人脉上似乎收获不少,但是看过书上写的,不是你认识的人多,还是认识你的人多了,才会成为真正的人脉。
   通过今天的学习,对于去年定下的目标基本上都达到了,但是对于java和oracle还是没有达到自己认为应有的高度。(此时,taobao却又在去O运动,这是闹哪门子呢!)
   总之,有所得必有所失,今天失去的就是去老婆相处的时光,希望明天不要出差了:)
   下面说说2013年的展望:
   希望自己可以在所擅长的方向有所突破,可以在一个比较有潜力的团队,使用自己喜欢的语言,对于技术人才高度重视的环境里继续成长。希望可以去两个地方好好休假,体验美好的自然风光。希望交到一些志同道合的朋友,一起开创未来!
   

posted @ 2013-01-06 14:16 javalinjx 阅读(363) | 评论 (1)编辑 收藏

SQL 21 天自学通学习笔记 5

1. 用户操作:

 

    创建:


  1. CREATE USER user  
  2. IDENTIFIED {BY password | EXTERNALLY}  
  3. [DEFAULT TABLESPACE tablespace]  
  4. [TEMPORARY TABLESPACE tablespace]  
  5. [QUOTA {integer [K|M] | UNLIMITED} ON tablespace]  
  6. [PROFILE profile]  
 

 

    修改:

 

  1. ALTER USER user  
  2. [IDENTIFIED {BY password | EXTERNALLY}]  
  3. [DEFAULT TABLESPACE tablespace]  
  4. [TEMPORARY TABLESPACE tablespace]  
  5. [QUOTA {integer [K|M] | UNLIMITED} ON tablespace]  
  6. [PROFILE profile]  
  7. [DEFAULT ROLE { role [, role] ...  
  8. ALL [EXCEPT role [, role] ...] | NONE}]  
 

 

    删除:

 

  1. DROP USER user_name [CASCADE]  
  

    授权,撤销权限:

 

  1. GRANT role TO user [WITH ADMIN OPTION]  
  2.   
  3. REVOKE role FROM user  
 

 

    系统允许 赋于整个系统的权限给用户,角色等:

 

  1. GRANT system_privilege TO {user_name | role | PUBLIC}  
  2. [WITH ADMIN OPTION]  
 

    如果使用了WITH ADMIN OPTION 选项就允许拥有该权限的人将该权限应用给其它

    的用户。

 

 

    你可以使用下边的GRANT 语句来对其它用户授权访问你的表

 

  1. GRANT {object_priv | ALL [PRIVILEGES]} [ (column  
  2. [, column]...) ]  
  3. [, {object_priv | ALL [PRIVILEGES]} [ (column  
  4. [, column] ...) ] ] ...  
  5. ON [schema.]object  
  6. TO {user | role | PUBLIC} [, {user | role | PUBLIC}] ...  
  7. [WITH GRANT OPTION]  
 

 

    如果你想取消对某个对象对于某人的授权你可以使用REVOKE 语句语法如下

 

  1. REVOKE {object_priv | ALL [PRIVILEGES]}  
  2. [, {object_priv | ALL [PRIVILEGES]} ]  
  3. ON [schema.]object  
  4. FROM {user | role | PUBLIC} [, {user | role | PUBLIC}]  
  5. [CASCADE CONSTRAINTS]  
  

posted @ 2012-08-05 11:44 javalinjx 阅读(252) | 评论 (0)编辑 收藏

SQL 21 天自学通学习笔记 4

1. insert select 用法:

 

insert into tablename1 (col1,col2)

select col1,col2 from tablename2 ;

 

2.  删除表:

 

drop table ovner.tablename;

 

3. 创建视图:

 

CREATE VIEW <view_name> [(column1, column2...)] AS

SELECT <table_name column_names>

FROM <table_name>

在视图的select 语句中使用约束是必然的,在使用select 语句中可以应用下边两个规则:

a. 不能使用union操作;

b. 不能使用order by 子句但是在视图中使用group by 子句可以有order by 子句相同的功能;

 

还要注意:1. 对于多表视图你不能使用delete 语句;2.除非底层表的所有非空列都已经在视图中

出现,否则你不能使用insert语句;

 

4. 索引  index:

 

CREATE INDEX index_name ON table_name(column_name1, [column_name2], ...)

 

CREATE INDEX  [schema.]index ON { [schema.]table (column [!!under!!ASC|DESC] [, column [!!under!!ASC|DESC]]  ...) | CLUSTER [schema.]cluster }

 

   当表被删除时,所有与表相关的索引也将被删除.

posted @ 2012-08-05 11:23 javalinjx 阅读(279) | 评论 (0)编辑 收藏