设置Linux最大文件描述符的数量

今天组员在配置Jenkins,实然发现了很多Java File Exception,说too many files open. 我们马上联想到一定是达到了Linux的最大文件描述符数量的上限了。

Google了一下就知道了如何修改。首先这个设置分为两级,即System Level和Shell Level。

System Level设置

用下面的命令查看一下,

然后用root权限修改/etc/sysctl.conf里的fs.file-max的值。CentOS 6的默认值是6百多万,一定是Shell Level太小了。

Shell Level设置

查看shell level能打开的数量用limit -n(bash: ulimit -n), 我们得到的结果是1024,确实太小。

要通过修改/etc/security/limits.conf文件,重新设置这个值。

在最后加上两句,

*是指对所有用户。

我得写一笔–解决的第一个Oracle DB的问题

在服务器上安装了Oracle DB XE 11g release 2, 开始运行一切正常,但突然有一天,不行了。SQL Developer说连接找不到,到了服务器上,运行

得到的状态是“No listener”, “Connection Refused”.

为啥呢?后来才发现是因为我安装了Jenkins, 这个万恶的东西,把很多目录的权限给改了。其中之一就是Oracle在/var/tmp目录下文件的权限。

修改成777就行了。

好了,一切正常了!

 

JBoss+Maven+Cargo开发EJB的Hello World!

Team要使用EJB了,不再使用以前比较山寨的CGI+Google Protocol; 同时构建工具也变成了Maven。这几天做了些实验,想写一个最简单的Hello World。有一个EJB的Service,再有一个Client去使用这个服务。

几天下来有点小崩溃,相对EJB 3的教程来说,配置实在太麻烦,有太多的属性、参数、版本要做了。好在最后取得了成功,记在这里做个小结。

1. 工具的安装

Maven 3

从Apache的网站上下载,然后把${MAVEN_HOME}/bin目录加到系统的PATH下。

JBoss AS

我这里下载的是JBoss AS 7.1.1.Final压缩包。这里的版本非常重要,它和之后开发的其他包有依赖关系。

假设JBoss被解压到${JBOSS_HOME}下。

NOTE: 解压之后一定在JBoss的bin下运行add-user.bat,安装一个管理用户。这个很重要。

2. 写一个EJB的服务

写一个简单EJB服务很简单,我们可以有Maven的archetype生成一个工程的框架。

一路回车之后,就得到了一个Server的工程文件夹结构。但删掉默认生成的App.java和AppTest.java.

然后在org.yli.learn.server中,加入两个类。一个是接口SayHello,一个是EJB Bean类SayHelloBean.

里面用到一些EJB 3的Annonation,大家自己查查书吧。

下一步就是修改pom.xml文件了,这里我们只要加入一些编译的依赖就行。

然后你可以编译安装了。

3. EJB Bean的部署

我选择了Cargo来部署Bean到JBoss里,好像有一个plugin叫jboss-as的,也可以做一样的事情。

我们只要在pom.xml加上:

然后就可以用mvn的goal来部署和运行JBoss了

  • 部署: mvn cargo:deployer-deploy
  • 运行: mvn cargo:run或cargo:start

好了,这样我们写好的EJB就部署到了JBoss的容器中。

4. EJB的Client

这部分的配置有点让我的崩溃,花的时间也最多。

基本步骤也是先用maven建立一个框架,比如我们的工程是org.yli.learn:client:jar:1.0, 包名是org.yli.learn.client.

我们在包里有一个Client,它会去向JBoss获取service并使用。

POM文件里有相关的依赖

然后你可以用mvn clean package来编译打包了。

很重要的一点,就是要添加一个properties文件。在src/main下面,建立一个resources的文件夹,然后在里面新建文件jboss-ejb-client.properties. 我这里使用的是一些默认的选项,具体文档在JBoss的Confluence里有介绍。

好了,可以用mvn exec:exec来运行了!

你可以顺利看到Hello, Jason!

真太不容易了!但现在的感觉很爽啊! 😀

 

JavaScript里的变量作用域

JavaScript的确有很多和C-like编程语言不一样的地方,就比如简章的变量作用域。让写惯了C++/Java的我很不习惯。

C/C++/Java里的变量作用域被称为block scope, 也就是块作用域。但JavaScript里可不一样,它的作用域称为function scope-函数域。简单点说,就是变量不管在哪声明,在整个函数范围内是可见的。

举个例子先:

怎么样,是不是有点别扭?j, k在for block之外,在function block之内就可以被访问。

那如果是下面这个函数呢,

这个也是正确的,它等价于:

简单的说,就是变量像是被提到函数开始的地方声明,这被称为hoisting(informally).

所以JavaScript不能像C/C++/Java那样,在使用变量时才就近声明该变量,反而应该为了避免这种默认提前声明所产生的误解,自己手动把变量声明写到函数开始的地方。唉,不爽! 😥

XHTML学习总结

一切都要从头学起啊!(还记得大一时学习HTML的样子,那叫一个认真啊! :oops:)

XHTML就是HTML和XML的结合物,要求了更加严格的语法,比如:

  • XHTML元素必须被正确地嵌套。
  • XHTML元素必须被关闭。
  • 标签名必须是小字字母。
  • XHTML文档必须拥有根元素。
当然还有更多规则:
  • 属性名称必须小写。
  • 属性值必须加引号。
  • 属性不能简写。
  • 用Id属性代替name属性(这个不知道有啥用。 :?:)
  • XHTML DTD定义了强制使用的HTML元素。
XHTML的文件类型声明,也就是
在XHTML文档中,文档类型声明一定要位于首行!存在三种XHTML的文档类型,即:
  • STRICT(严格类型)
  • TRANSITIONAL(过渡类型)
  • FRAMESET(框架类型)
对应的DTD分别是:
Strict
Transitional
Frameset

Web开发,我来啦!

虽然很突然,但还是来了,公司的下一个产品终于跳到Web上了。做了桌面客户端这么久了,真想换换风格,去看看Web的开发是怎么样做的。

可现在心里极度的没底,好多的新技术要学啊,前端后端要学习一堆。

不过俺不怕,相信自己一定可以的!!!

哈哈,Web开发,我来啦! 🙂