Saturday, May 24, 2008

在windows和linux下观察自己的port

windows下进入命令行
natstat -a -n


linux下
sudo nmap -sU //看udp端口
sudo nmap -sT //看tcp端口

Tuesday, May 20, 2008

Linux下如何让时间成为文件名

如题,具体做法

#include
........
char* create_filename_by_time()
{
time_t t = time(0);
strftime(file, sizeof(file),"%Y_%m_%d%X.sgf"
,localtime(&t));
return file;
}
........

Linux

用Java NIO构建异步服务器程序

最近常用c++写服务器程序,unix下我用asio轻松的构建了异步io的服务器
并实现了单线程对应多个socket的功能,但是java的tutorial上依旧只有同步
的服务器例子,而且是为每一个客户建立一个线程,后来我发现了java.nio这个
包,专门是用来写异步I/O程序的,以下是一个简单的我写的例子程序:

××××××××××××××××××××××××
服务器端
××××××××××××××××××××××××

package neo.server;
import java.io.FileInputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.channels.FileChannel;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.nio.charset.Charset;import java.nio.charset.CharsetDecoder;import java.util.Iterator;
/** * 测试文件下载的NIOServer * * @author tenyears.cn */

public class NIOServer {

static int BLOCK = 4096;

// 处理与客户端的交互

public class HandleClient {

protected FileChannel channel;

protected ByteBuffer buffer;
public HandleClient() throws IOException

{

this.channel = new FileInputStream(filename).getChannel();

this.buffer = ByteBuffer.allocate(BLOCK);

}
public ByteBuffer readBlock()

{

try {

buffer.clear();

int count = channel.read(buffer);

buffer.flip(); if (count <= 0)

return null;

} catch (IOException e) {

e.printStackTrace(); }

return buffer;

}
public void close() {

try { channel.close();

} catch (IOException e) {

e.printStackTrace(); }

}

}

protected Selector selector;

protected String filename = "d:\\bigfile.dat"; // a big file

protected ByteBuffer clientBuffer = ByteBuffer.allocate(BLOCK);

protected CharsetDecoder decoder;
public NIOServer(int port) throws IOException {

selector = this.getSelector(port);

Charset charset = Charset.forName("GB2312");

decoder = charset.newDecoder();

}
Selector protected Selector getSelector(int port) throws IOException {

ServerSocketChannel server = ServerSocketChannel.open();

Selector sel = Selector.open();

server.socket().bind(new InetSocketAddress(port));

server.configureBlocking(false);

server.register(sel, SelectionKey.OP_ACCEPT);

return sel; }

// 监听端口

public void listen() {

try {

for (;;) {

selector.select();

Iterator iter = selector.selectedKeys().iterator();

while (iter.hasNext()) {

SelectionKey key = (SelectionKey) iter.next();

iter.remove();

handleKey(key);

}

}

} catch (IOException e) {

e.printStackTrace();

}

}
/** * 处理key所代表的事件 * @param key * @throws IOException */ protected void handleKey(SelectionKey key) throws IOException

{

if (key.isAcceptable())

{ // 接收请求

System.out.println("receive connection....");

ServerSocketChannel server = (ServerSocketChannel) key.channel();

SocketChannel channel = server.accept();

channel.configureBlocking(false);

channel.register(selector, SelectionKey.OP_READ);

} else if (key.isReadable())

{ // 读信息

System.out.println("begin reading....");

SocketChannel channel = (SocketChannel) key.channel();

int count = channel.read(clientBuffer);

if (count > 0) {

clientBuffer.flip();

CharBuffer charBuffer = decoder.decode(clientBuffer);

System.out.println("Client >>" + charBuffer.toString());

SelectionKey wKey = channel.register(selector, SelectionKey.OP_WRITE);

wKey.attach(new HandleClient()); }

else

channel.close();

clientBuffer.clear(); }

else if (key.isWritable()) { // 写事件

System.out.println("begin writing");

SocketChannel channel = (SocketChannel) key.channel();

HandleClient handle = (HandleClient) key.attachment();

ByteBuffer block = handle.readBlock();

if (block != null)

channel.write(block);

else {

handle.close();

channel.close();

}

}

}
public static void main(String[] args) {

int port = 12345;

try {

NIOServer server = new NIOServer(port);

System.out.println("Listernint on " + port);

while (true) { server.listen(); } } catch (IOException e) { e.printStackTrace(); } }}

Friday, May 16, 2008

(转)eclipse使用技巧

Template:Alt + / 修改处:窗口->喜好设定->工作台->按键->编辑->内容辅助。 个人习惯:Shift+SPACE(空白)。 简易说明:编辑程序代码时,打sysout +Template启动键,就 会自动出现:System.out.println(); 。 设定Template的格式:窗口->喜好设定->Java->编辑器->模板。
程序代码自动排版:Ctrl+Shift+F修改处:窗口->喜好设定->工作台->按键->程序代码->格式。 个人习惯:Alt+Z。 自动排版设定:窗口->喜好设定->Java->程序代码格式制作程序。样式页面->将插入tab(而非空格键)以内缩,该选项取消勾选,下面空格数目填4,这样在自动编排时会以空格4作缩排。
快速执行程序:Ctrl + F11 个人习惯:ALT+X修改处:窗口->喜好设定->工作台->按键->执行->启动前一次的启动作业。 简易说明:第一次执行时,它会询问您执行模式, 设置好后,以后只要按这个热键,它就会快速执行。 ..我觉得很顺手^___^
自动汇入所需要的类别:Ctrl+Shift+O 简易说明: 假设我们没有Import任何类别时,当我们在程序里打入:
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
此时Eclipse会警示说没有汇入类别,这时我们只要按下Ctrl+Shift+O,它就会自动帮我们Import类别。
查看使用类别的原始码:Ctrl+鼠标左键点击 简易说明:可以看到您所使用类别的原始码。
将选取的文字批注起来:Ctrl+/简易说明:Debug时很方便。 修改处:窗口->喜好设定->工作台->按键->程序代码->批注
视景切换:Ctrl+F8 个人习惯:Alt+S。 修改处:窗口->喜好设定->工作台->按键->窗口->下一个视景。 简易说明:可以方便我们快速切换编辑、除错等视景。
密技篇: 一套Eclipse可同时切换,英文、繁体、简体显示: 1.首先要先安装完中文化包。 2.在桌面的快捷方式后面加上参数即可, 英文-> -nl "zh_US"繁体-> -nl "zh_TW" 简体-> -nl "zh_CN"。 (其它语系以此类推) 像我2.1.2中文化后,我在我桌面的Eclipse快捷方式加入参数-n1 "zh_US"。 "C:\Program Files\eclipse\eclipse.exe" -n "zh_US" 接口就会变回英文语系噜。
利用Eclipse,在Word编辑文书时可不必将程序代码重新编排: 将Eclipse程序编辑区的程序代码整个复制下来(Ctrl+C),直接贴(Ctrl+V)到 Word或WordPad上,您将会发现在Word里的程序代码格式,跟Eclipse 所设定的完全一样,包括字型、缩排、关键词颜色。我曾试过JBuilder 、GEL、NetBeans...使用复制贴上时,只有缩排格式一样,字型、颜 色等都不会改变。
外挂篇: 外挂安装:将外挂包下载回来后,将其解压缩后,您会发现features、 plugins这2个数据夹,将里面的东西都复制或移动到Eclipse的features 、plugins数据夹内后,重新启动Eclipse即可。
让Eclipse可以像JBuilderX一样使用拖拉方式建构GUI的外挂: 1.Jigloo SWT/Swing GUI Builder : http://cloudgarden.com/jigloo/index.html ; 下载此版本:Jigloo plugin for Eclipse (using Java 1.4 or 1.5) 安装后即可由档案->新建->其它->GUI Form选取要建构的GUI类型。
2.Eclipse Visual Editor Project:http://www.eclipse.org/vep/ ; 点选下方Download Page,再点选Latest Release 0.5.0进入下载。 除了VE-runtime-0.5.0.zip要下载外,以下这2个也要: EMF build 1.1.1: (build page) (download zip) GEF Build 2.1.2: (build page) (download zip)
3.0 M8版本,请下载:EMF build I200403250631GEF Build I20040330 VE-runtime-1.0M1
安装成功后,便可由File->New->Visual Class开始UI设计。 安装成功后,即可由新建->Java->AWT与Swing里选择 所要建构的GUI类型开始进行设计。VE必须配合着对应 版本,才能正常使用,否则即使安装成功,使用上仍会 有问题。
使用Eclipse来开发JSP程序: 外挂名称:lomboz(下载页面) http://forge.objectweb.org/project/showfiles.php?group_id=97 ; 请选择适合自己版本的lomboz下载,lomboz.212.p1.zip表示2.1.2版, lomboz.3m7.zip表示M7版本....以此类推。 lomboz安装以及设置教学: Eclipse开发JSP-教学文件
Java转exe篇:实现方式:Eclipse搭配JSmooth(免费)。1.先由Eclipse制作包含Manifest的JAR。 制作教程 2.使用JSmooth将做好的JAR包装成EXE。 JSmooth下载页面: http://jsmooth.sourceforge.net/index.php ; 3.制作完成的exe文件,可在有装置JRE的Windows上执行。
Eclipse-Java编辑器最佳设定: 编辑器字型设定:工作台->字型->Java编辑器文字字型。 (建议设定Courier New -regular 10)
编辑器相关设定:窗口->喜好设定->Java->编辑器
外观:显示行号、强调对称显示的方括号、强调显示现行行、显示打印边距,将其勾选,Tab宽度设4,打印编距字段设80。 程序代码协助:采预设即可。语法:可设定关键词、字符串等等的显示颜色。附注:采预设即可。 输入:全部字段都勾选。 浮动说明:采预设即可。 导览:采预设即可。
使自动排版排出来的效果,最符合Java设计惯例的设定: 自动排版设定:窗口->喜好设定->Java->程序代码制作格式。
换行:全部不勾选。
分行:行长度上限设:80。样式:只将强制转型后插入空白勾选。内缩空格数目:设为4。
Eclipse的教学文件: Eclipse 3.0系列热键表 - 中英对照解说版 (by sungo) ~New~Window+GCC+CDT用Eclipse开发C、C++ (by sungo) ~New~
其它: 扩充Eclipse的Java 开发工具(中文) 使用Eclipse开发J2EE 应用程序(中文) 使用Eclipse平台进行除错(中文) 用Eclipse进行XML 开发(中文)开发Eclipse外挂程序(中文) 国际化您的Eclipse外挂程序(英文) 将Swing编辑器加入Eclipse(英文)如何测试你的Eclipse plug-in符合国际市场需求(英文)
Eclipse的相关网站: http://eclipse-plugins.2y.net/eclipse/index.jsp ; http://www.eclipseplugincentral.com/ ; Eclipse相关教学[简体]
写程序写到很累了,想休息一下??玩玩小Game是 不错的选择,下面介绍使用Eclipse玩Game的Plug-in。
补充外挂篇: Eclipse-Games: http://eclipse-games.sourceforge.net/ ; 版本选:Latest Release 3.0.1 (Release Notes) Sat, 3 Jan 2004
外挂安装完后,重新开启Eclipse。 窗口->自订视景->其它->勾选Game Actions。 再将Eclipse关闭,重新再启动,就可以开始玩噜。(共有4种:采地雷I、采地雷II、贪食蛇、仓库番。)
(Eclipse 2.1.2 +中文化 玩Game -仓库番)
补充:(于Eclipse使用assertion机制)Eclipse版本:2.1.3 release。
JDK1.4版新加入的assertion机制(关键词:assert),由于JDK1.4编译器预设是兼容1.3,所以要使用assert必须在编译时加上-source 1.4的参数.
C:\>javac -source 1.4 XXX.java 执行时则必须加-ea 或-enableassertions参数启动。
C:\>java -ea XXX
如要在Eclipse中使用assertion机制,请作以下设定: 设定一:(编译设定)Windows->Preferance->Java->Compiler->Compliance and Classfiles 页面。将..JDK Compliance level->Compiler compliance level调成1.4。
设定二:(执行设定) Run->Run->(x)=Arguments页面,在VM arguments加入-da参数,按下 Run button便可看到启动assertion后的执行结果。
(Eclipse 2.1.3 release + assertion测试)
新版(m8+)的eclipse可以设vm arguments 另外提供一种设法,是在eclipse启动时加入vm arguments(跟加大eclipse预设内存大小的方式一样) 这样就不用每次run都得需去设vm arguments

Wednesday, May 14, 2008

mysql导入导出数据库

几个常用用例:
1.导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

3.导入数据库
先建一个空的数据库
常用source 命令进入mysql数据库控制台,
如mysql -u root -p
mysql>create DATABASSE database
范例:mysql -uabc_f -p database < abc.sql(导入数据库database从abc.sql文件)


4.导入数据库
常用source 命令进入mysql数据库控制台,
如mysql -u root -p
mysql>use 数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:wcnc_db.sql

段错误(转载)

linux下大家常常会碰到的一种错误是段错误,这里的去除段错误的一种方法叫做分析
core文件,一般情况core文件是默认不生成的,怎样让core文件生成呢?我们先这么做
××××××××××××××××××××××××××××××××
xiaosuo@gentux test $ ulimit -c
0
xiaosuo@gentux test $ ulimit -c 1000
xiaosuo@gentux test $ ulimit -c
1000
xiaosuo@gentux test $ ./a.out
段错误 (core dumped)
xiaosuo@gentux test $ ls
a.out core d.c f.c g.c pango.c test_iconv.c test_regex.c
××××××××××××××××××××××××××××××××××
然后我们就可以用gdb进行调试
xiaosuo@gentux test $ gdb ./a.out core

至于gdb的使用,大家可以用man命令看一下

怎样登陆被封禁的google blog

不知道中国政府保护民族企业为什么这么敬业?反正blogspot被封禁多次了。。。。。
贴一下登陆被封blogspot的方法:
1,windows下,在windows/system32/drivers/etc/hosts 里面添加一条
72.14.219.190 <你的用户名>.blogspot.com
2,linux下,在/etc/hosts里面添加一条
72.14.219.190 <你的用户名>.blogspot.com
这样你就可以登上blogspot了

Friday, May 2, 2008

Java和C++的include和import的一些区别

一个大的c++系统,你在某个文件里面添加一行
#include "*****.h"
这是相當危险的一件事情,为什么呢?
因为*****.h里面可能包含了其他的头文件,而这些头文件里面的一些声明
可能在你包含*******.h这个文件里面或者他所包含的文件里面还没有定义,
他会报:invalid use of undefined type ******
也就是说 c++中,你的头文件的包含顺序有可能会使你的程序报错

在一个大的Java系统中,你在某个文件中添加一行
import **.**.**;
这是很安全的一件事情,因为你导入的那个类他导入的类不会被你导入
比如说A类导入了Point,B类导入了A,但是当B类要用的Point的时候,他還是
得导入Point类,这是的所有的类有了相对独立性