置顶随笔
Java NIO 主要是Channel, SelectionKey, Selector 三个类之间的关系,下面的例子就是演示如果使用NIO来处理请求的:
/** *
*/
package dongzi.nio.exercise.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
/**
* @author kyle
*
*/
public class SelectSockets {
private static final int PORT_NUMBER = 1234;
/**
* @param args
*/
public static void main(String[] args) {
new SelectSockets().go(args);
}
private void go(String[] args) {
int port = PORT_NUMBER;
if (args.length > 0) {
try {
port = Integer.parseInt(args[0]);
} catch (Exception e) {
}
}
System.out.println("Listening port: " + PORT_NUMBER);
try {
Selector selector = Selector.open();
startServer(port, selector);
while (true) {
int n = selector.select();
if (n == 0) {
continue;
}
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
SocketChannel channel = server.accept();
registerChannel(selector, channel, SelectionKey.OP_READ);
sayHello(channel);
}
if (key.isReadable()) {
readDataFromChannel(key);
}
}
it.remove();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private ByteBuffer buffer = ByteBuffer.allocate(1024);
private void readDataFromChannel(SelectionKey key) throws IOException {
int count = 0;
SocketChannel channel = (SocketChannel) key.channel();
buffer.clear();
while ((count = channel.read(buffer)) > 0) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
buffer.clear();
}
if (count < 0) {
channel.close();
}
}
private void sayHello(SocketChannel channel) throws IOException {
if (channel == null) {
return;
}
buffer.clear();
ByteBuffer buffer = ByteBuffer.wrap("Hi, there \r\n".getBytes());
buffer.flip();
channel.write(buffer);
}
private void registerChannel(Selector selector, SocketChannel channel,
int opRead) throws IOException {
if (channel == null) {
return;
}
channel.configureBlocking(false);
channel.register(selector, opRead);
}
private void startServer(int port, Selector selector) throws IOException,
ClosedChannelException {
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
ServerSocket serverSocket = serverChannel.socket();
serverSocket.bind(new InetSocketAddress(port));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
}
2013年11月21日
# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量资源 # free -m # 查看内存使用量和交换区使用量 # df -h # 查看各分区使用情况 # du -sh <目录名> # 查看指定目录的大小 # grep MemTotal /proc/meminfo # 查看内存总量 # grep MemFree /proc/meminfo # 查看空闲内存量 # uptime # 查看系统运行时间、用户数、负载 # cat /proc/loadavg # 查看系统负载磁盘和分区 # mount | column -t # 查看挂接的分区状态 # fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备) # dmesg | grep IDE # 查看启动时IDE设备检测状况网络 # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息进程 # ps -ef # 查看所有进程 # top # 实时显示进程状态用户 # w # 查看活动用户 # id <用户名> # 查看指定用户信息 # last # 查看用户登录日志 # cut -d: -f1 /etc/passwd # 查看系统所有用户 # cut -d: -f1 /etc/group # 查看系统所有组 # crontab -l # 查看当前用户的计划任务服务 # chkconfig –list # 列出所有系统服务 # chkconfig –list | grep on # 列出所有启动的系统服务程序 # rpm -qa # 查看所有安装的软件包
2013年5月25日
这篇文章清晰的讲述了继承, 实现, 依赖, 关联,组合的概念及他们之间的关系,以下是原文内容:
这是一堂关于UML基础知识的补习课;现在我们做项目时间都太紧了,基本上都没有做过真正的class级别的详细设计,更别提使用UML来实现规范建模了;本篇主要就以前自己一直感觉很迷糊的几种class之间的关系进行整理,让我们在真正用UML进行比如类图设计时能够更加清晰明了;以下就分别介绍这几种关系:
继承
指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;
实现
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;
依赖
可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;
关联
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;
聚合
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
组合
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;
2013年4月3日
当我们使用静态的Scaffolding的时候, 我们经常会用到一些自定义的validator, 那么我们怎样自定义国际化的message呢?
或者说我们定义怎样的一个key, Grails能查到它呢?
这里,用户自定义Validator的key的pattern是:
[Class Name].[Property Name].validator.invalid
我们在开发使时常会用到资源文件,这可能是为了多语言、国际化的需要,也可能是使用了国外开源项目的原因,这就需要中文转ascii将中文转换为ASCII 编码,或者将 ASCII 转换为中文,那么我们就可以使用 JDK 自带的转换工具 native2ascii 。
for example:
No1、中文转换为 ASCII 编码
步骤:1 、在 D 盘新建 chinese.txt 文件,内容为:
parameter.project.title=这是中文
2、在环境变量中设置好 JDK 路径
3、进入 dos 控制台,并进入 D 盘目录
4、输入命令: native2ascii -encoding gb2312 chinese.txt ascii.txt 回车
那么在D 盘目录下生成 ascii.txt 文件,内容为:
parameter.project.title=\u8fd9\u662f\u4e2d\u6ascii码 中文587
No1、 ASCII 编码转换为中文
步骤:1 、在 D 盘新建 ascii.txt 文件,内容为:
parameter.project.title=\u8fd9\u662f\u4e2d\u6ascii码 中文587
2、在环境变量中设置好 JDK 路径
3、进入 dos 控制台,并进入 D 盘目录
4、输入命令: native2ascii -reverse -encoding UTF8 ascii.txt chinese.txt 回车
那么在D 盘目录下生成 chinese.txt 文件,内容为:
parameter.project.title=这是中文
2013年1月17日
1. chkconfig脚本格式:
#!/bin/sh
#chkconfig 2345 55 45
#上面为固定格式:2345 表示运行级别,55表示开机执行顺序,45为关机顺序
#description:this is just a demo of chkconfig script
case “$1” in
start)
<start-script>
;;
Stop)
<stop-script>
;;
Status)
Echo <the information you want to display>
;;
*)
Echo “the usage of the script”
Case
2. 然后将脚本保存,并赋予执行权限,再复制到/etc/init.d目录
#chmod a+x <myscript>
#copy <myscript> /etc/init.d
3. 使用chkconfig命令添加成服务
#chkconfig --add <myscript>
#chkconfig --level 35 <myscript > on
#chkconfig --list <myscript>
4. 然后就可以通过service命令管理了
#service <myscript> start | stop | status
5. 下面是我写的一个实例脚本,大家可以参考一些格式:
#!/bin/sh
#chkconfig: 2345 99 99
#description:the script to set the network at run level 2345
IN=eth0
OUT=eth1
HOST_NAME=cluster1.yang.com
INIP=192.168.10.10
OUTIP=192.168.136.10
MASK=255.255.255.0
IP=/sbin/ip
IFC=/sbin/ifconfig
ROUTE=/sbin/route
#flush the address
case "$1" in
start)
#echo "flush the address..."
#$IP addr flush dev eth0
#$IP addr flush dev eth1
echo "set the address..."
$IFC $IN $INIP netmask $MASK up
$IFC $OUT $OUTIP netmask $MASK up
echo "set the hostname..."
hostname $HOST_NAME
echo "set the default gateway..."
$IP route flush all
$ROUTE add default gw 192.168.136.2
echo "finshed!!!"
;;
stop)
echo "flush the network setting..."
$IP addr flush dev eth0
$IP addr flush dev eth1
echo "flush finshed!!!"
;;
status)
echo "hostname is $HOST_NAME"
$IFC eth0
$IFC eth1
;;
*)
echo "requires start,stop or status"
;;
esac
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
在Linux中chkconfighttpd任务添加,Apache服务器的最新稳定发布版本是httpd-2.2..0,官方下载地址是:http://httpd.apache.org/download.cgi。我们通过下面的步骤来快速的搭建一个web服务器。
1、下载源码文件httpd-2.2.0.tar.gz 到linux服务器的某个目录。
2、解压文件 # tar zxvf httpd-2.2.0.tar.gz .
3、配置 # ./configure –refix=/usr/local/apache //指定安装目录,以后要删除安装就只需删除这个目录。
4、编译和安装。 # make ; make install .
5、编写启动脚本,把它放到目录 /etc/rc.d/init.d/里,这里取名为httpd,其内容如下:
- #!/bin/bash
- #description:http server
- #chkconfig: 235 98 98
- case "$1" in
- start)
- echo "Starting Apache daemon..."
- /usr/local/apache2/bin/apachectl -k start
- ;;
- stop)
- echo "Stopping Apache daemon..."
- /usr/local/apache2/bin/apachectl -k stop
- ;;
- restart)
- echo "Restarting Apache daemon..."
- /usr/local/apache2/bin/apachectl -k restart
- ;;
- status)
- statusproc /usr/local/apache2/bin/httpd
- ;;
- *)
- echo "Usage: $0 {start|stop|restart|status}"
- exit 1
- ;;
- Esac
注意:#description:http server 这一行必须加上,否则在执行命令
# chkconfig –add httpd
时会出现“service apache does not support chkconfig”的错误报告。
#chkconfig: 2345 98 98 表示在执行命令
# chkconfig –add httpd 时会在目录 /etc/rc2.d/ 、/etc/rc3.d/ /etc/rc5.d 分别生成文件 S98httpd和 K98httpd。这个数字可以是别的。
6、执行命令 # chkconfig –add httpd ,进入目录/etc/rc3.d/检查是否生成文件 S98httpd及K98httpd.
7、启动服务 # service httpd start .
2012年10月15日
关键词final在Java中有多重用途,既可被用于instance变量、static变量
也可用于classes或methods,表示不允许客户覆写它们。
当一个方法被声明成final,在两个领域中显得有位重要:
- class设计
- 运行期性能
在程序设计里,有时我们不希望我们的方法被重写或覆盖,final关键字保证了这一点。
final关键字是怎么影响性能的呢?
当我们的方法被声明成static,final和private, 此方法将成为Inlining(内联函数)的候选者。此类方法可以在编译期被静态决议(staticallyresolved),而不需要动态决议(dynamicResolution)。以方法本体(methodbody)替换方法调用(methodcall)会使代码执行速度更快。
将方法声明为static、final和private会带来一些缺点:这样的方法无法通过Subclassing(子类化)进行扩展。这就束缚了derived class通过class函数做事情的机会。inlined方法只有在被多次调用的情况下,才会获得令人侧目的性能提升。这是因为当一个方法被inline后,就不再需要负担方法调用的额外开销。因此,方法被调用愈多次,节省就愈多。
不过inlining也可能使你的代码体积变大。如果这个方法有许多调用点,.class文件的体积便会膨胀,这是因为原本只需存储一份的函数码,由于inline而在所有调用点被复制了一份。
2012年9月26日
Java NIO 主要是Channel, SelectionKey, Selector 三个类之间的关系,下面的例子就是演示如果使用NIO来处理请求的:
/** *
*/
package dongzi.nio.exercise.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
/**
* @author kyle
*
*/
public class SelectSockets {
private static final int PORT_NUMBER = 1234;
/**
* @param args
*/
public static void main(String[] args) {
new SelectSockets().go(args);
}
private void go(String[] args) {
int port = PORT_NUMBER;
if (args.length > 0) {
try {
port = Integer.parseInt(args[0]);
} catch (Exception e) {
}
}
System.out.println("Listening port: " + PORT_NUMBER);
try {
Selector selector = Selector.open();
startServer(port, selector);
while (true) {
int n = selector.select();
if (n == 0) {
continue;
}
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
SocketChannel channel = server.accept();
registerChannel(selector, channel, SelectionKey.OP_READ);
sayHello(channel);
}
if (key.isReadable()) {
readDataFromChannel(key);
}
}
it.remove();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private ByteBuffer buffer = ByteBuffer.allocate(1024);
private void readDataFromChannel(SelectionKey key) throws IOException {
int count = 0;
SocketChannel channel = (SocketChannel) key.channel();
buffer.clear();
while ((count = channel.read(buffer)) > 0) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
buffer.clear();
}
if (count < 0) {
channel.close();
}
}
private void sayHello(SocketChannel channel) throws IOException {
if (channel == null) {
return;
}
buffer.clear();
ByteBuffer buffer = ByteBuffer.wrap("Hi, there \r\n".getBytes());
buffer.flip();
channel.write(buffer);
}
private void registerChannel(Selector selector, SocketChannel channel,
int opRead) throws IOException {
if (channel == null) {
return;
}
channel.configureBlocking(false);
channel.register(selector, opRead);
}
private void startServer(int port, Selector selector) throws IOException,
ClosedChannelException {
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
ServerSocket serverSocket = serverChannel.socket();
serverSocket.bind(new InetSocketAddress(port));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
}
There are 5 different steps or milestones in a
products lifecycle from beginning to release. These are:
Stage 1 - First Cycle -
QA Handoff/Acceptance - This is the milestone that determines if a
product is stable enough to be tested against. When a product reaches this stage, it is generally released to QA Testers to begin the testing stage of the produt.
Stage 2 - Alpha phase The product is still in QA review, but the testing scenarios are a little more destructive in nature, in an attempt to start shaking out most of the bugs in a product.
Stage 3 - Beta phase- the product is at a stability level that it can be released to select customers in the customer base for further testing in the 'real world'. This usually shakes out more bugs in a product.
Stage 4 - Release Candidate - This stage is towards the end of the cycle - The product has gone through its testing paces, and is being certified as ready for release.
Stage 5 - GA -The product is ready for the world!
Reference:
http://answers.yahoo.com/question/index?qid=1006020204792
2012年1月30日
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
Q:Windows Server 2003 中寻找端口与进程的关联 A:如果发现一些从没见过的端口号,你怎么分辩出该端口是不是木马开放的端口?或者在进程列表中发现陌生的进程时,是否想知道该进程在你的系统中开了什么 端口? 一,根据进程查端口号首先在开始菜单的“运行”框中输入“cmd.exe”进入命令提示符窗口,先键入“tasklist”命令将列出系统正在运行的进程 列表,把你要查的进程所对应的“PID”号记下或复制。把进程的PID好记下后,接下来就用这个PID号把该进程所开的端口显示出来了。在当前的命令符下 继续键入“netstat -ano | find 1140”命令,其中“netstat -ano”参数表示以数字形式显示所有活动的TCP连接以及计算机正在侦听的TCP、UDP端口,并且显示查找进程ID(PID)号;“|find 1140”表示查找进程PID为“1140”的TCP连接以及TCP、UDP端口的侦听情况(在实际应用中,需要把你刚才记下或复制的PID号替换掉这里 的1140)。按“回车”键后,就会显示出该进程所开的端口号。 二,根据端口号查进程 在命令提示符窗口中输入“netstat -ano”命令,列出系统当前的端口列表,该命令的作用已在上面提过了。-o参数的作用主要是显示各端口对应的进程PID号,现在把你要查的端口对应的进 程PID号记下或复制。然后在命令提示符下继续输入tasklist /fi“PID eq 788”(在实际应用中,需要把你复制或记下的PID号替换掉这里的788),这行语句/fi参数表示在“tasklist”中筛选,而“ID eq 788”则是指定筛选的条件,按“回车”键后,就会显示出端口对应的进程。 三,查出进程对应的程序 知道了端口和进程的关联后,如何再进一步查出该进程是那个软件或程序的进程呢?下面的操作就需要用到Windows2000(Server或 Professional版都可以)安装光盘中的一个工具。首先在安装光盘的“Support\Tools\”目录下,用解压软件打开 “support.cab”压缩包,找到“tlist.exe”文件,将此文件释放到任一目录,如“D:\Support”。然后在命令提示符窗口中切换 到此目录,运行“tlist.exe”命令,把要查的进程对应的PID号记下或复制(第一列就是进程的PID号),然后继续输入“tlist.exe 2012”命令(你输入的时候,需要将刚才记下的PID号替换掉这里的2012),“CmdLine:”后面显示的就是该进程对应的软件所在的目录。除此 之外,返回信息中还列出了该进程所调用的文件,得到了这些信息就可以很容易查出进程对应的程序了。假如想关闭某个进程,可把该进程的PID号记下,在命令 提示符下输入“taskkill/pid 2400”(2400是PID号)就可以将PID号为2400的进程关闭,如果要强制关闭该进程,只须在这条命令的后面加个“/f”参数即可。
来源:
http://www.cn6154.com/ask/question.php?id=2623
2011年12月14日
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
1. Win+E - 显示所有桌面,方便的左右选择。
2. Alt+Ctrl+Left/Right Arrow -切换桌面
3. Alt+Ctrl+Shift+Left/Right Arrow – 移动当前窗口到其他桌面
4. Alt + Shift+ Up Arrow – 以很酷的方式显示当前窗口
5. Alt+F9/F10 – 最小化/最大化当前窗口
6. Alt+F5 -不最大化当前窗口
7. Alt+F7 – 激活当前窗口的移动选项,你可以使用方向键移动当前窗口,甚至移动到其他桌面。
8. Alt+F8 – 用方向键调整当前窗口大小
9. Ctrl + Alt + D – 显示桌面/恢复当前窗口
10. Alt+ Tab – 切换窗口
Nautilus
11. Shift+Ctrl+N – 新建文件夹, 很有用
12. Alt + Enter – 查看选择文件/文件夹的属性,代替单击右键选择属性
13. Ctrl + 1/2 – 改变文件夹视图查看方式,图标视图/列表视图
14. Ctrl + W – 关闭当前Nautilus窗口
15. Ctrl + Shift + W – 关闭所有Nautilus窗口
16. Ctrl+T – 在Nautilus中新建一个标签
17. Alt + Up/Down Arrow – 移动到父文件夹/选择的文件夹
18. Alt + Left/Right Arrow – 后退/前进
19. Alt + Home -直接移动到主文件夹
20. F9 – 开关显示Nautilus侧边栏
21. Ctrl + H -开关显示隐藏文件夹
22. Ctrl + Alt + L -锁屏
23. Alt + F1 – 打开应用程序菜单
24. Alt + F2 – 打开运行应用程序对话框
25. Win + 鼠标滚轮 – 放大/缩小屏幕