romkk-shi

做猪做狗都不做程序员

 献个自己的清明节哀悼书   文/微尘 

不管你从事什么行业的工作,千万别从事计算机软件行业的开发工作。我发誓,今生我入错行,来世我做猪做狗,不做程序员!

软件开发行业的的特点决定的开发人员痛苦的一生,有如下原因:

1、我即将设计的东西用户无法看到或者想象到
    比如建筑行业吧,你要盖房子,没问题开放单位会请人设计效果图,或者画出标准图纸,包括用的钢筋、水泥、瓷砖等等所有材料都可以标上要求。
    再说抽象点的广告设计,广告设计基本上可以做出过样板或者效果图,即使错了修正起来也是容易。最主要是美术东西是可以描述的。

   不管从事哪个行业,你能做的东西别人大概都有个粗略的概念,但软件就没有,你做出来的东西可*作性如何,你做出来的东西美感效果如何,这都关系到双方的责任界定问题。

2、我即将设计的东西是否是客户所描述的东西
   软件东西涉及到从外观表现到内在的逻辑,外观表现还好,客户说不好看,我就改一改,可要命的是有些开发工具无法实现,那就只能跳楼,比如说人家说要IE那种性感美,可你设计出来的传统美,更糟糕的是你的开发平台无法实现那种骨美,这个时候你就抱着你的软件哭吧。

   逻辑的东西更不提,很多时候客户要什么都描述不清楚,或者就是描述错误。好了你的需求分析做出来,他们也签字了。可最后东西出来,经过运行测试,人家说你理解错啦!怎么办,跟他争吗?有意义吗?欲哭无泪,欲死不能!到了这个程度只能自己骂自己笨,不清楚中国话是可以进行多种理解的吗?也只能怪自己没有具备神通看出客户的内心。

   以上所说的,还是正常错误,不是故意整你,如果你碰到故意整你的客户,那么不上吊都要自杀的了。

3、特别是制度化的软件犹如地狱
   如果是开发什么杀毒软件啊,应用、工具软件等好办。无法就是象WINDOWS那么傻瓜式,后面的版本升级也不用花太多的精力,请几个美工或者找个论坛征求下意见,就可以:我变我变,七十二变不够可以八十一变。
   
   可如果你是帮客户进行制度化软件的实施,特别是用产品包软件去帮客户进行制度化实施。不掉层皮也要抽点筋还不知道能否顺利结束。一般销售人员可以天花乱坠地吹或者跟客户做演示,这也是每办法的办法,谁让他们是业务员,业务人员的目标就是业绩、提成,业绩提成。而开发人员往往也是最讨厌业务人员了。因为牛是你吹的,可责任是我付的!这就好比中国教育部有句话:书记领导下校长负责制。书记可以领导,错了,该杯黑锅的时候由校长抗着!这是怎么样的天理啊!话说多了,业务人员错了有钱拿,错得越多签单越快,开发人员就死得越早。

    制度化的东西是最不好弄,没有理由,没有建设性,人家就是如此的制度,你不能提建议要求该制度,完全一种强奸的感觉。就是你当孙子去!为了那几文钱!

4、人家是越老越值钱,我们是越老越贬值
   除了卖色、唱、身等行业有这个特点外,看来也就开发行业有这个特点。

   你年轻,你有本钱,没问题,三天不睡觉,白天睡觉晚上干活,你牛!到了你30岁,你就知道死字是如何写的了。

   还有就是不知道是哪些傻瓜,天天弄出什么新技术,关键技术,你跟不跟?不跟,那么不如提前退休回家种番薯还好了。跟吧,你能跟多久,到你结婚的时候看着老婆在睡觉你却在愁眉苦脸啃那烂书;等你孩子出生了,你孩子要换尿片的时候,你能说等等我在看书呢?


5、人家要钱有钱,要面子有面子,我却灰头灰脸
   各个行业都有爆发户,惟独开发人员无法爆发!为什么呢,你就靠那么点小工资能做什么?人家企业部门经理月薪都是几十K算,我们的计量单位还是元,更别说那些总经理了,看着他们的收入,我数都不会数,一个字,晕;二个字,真晕。

   当你的孩子在同学中说,我爸爸是程序员,意味着怎么呢?A、那么老了还做程序员啊 B、就是编编程序的 C、顶多是个工匠(就是修理修理的那种) 。

综合上所述:
 A、我下定决心,排除万难,不管做什么,不做程序员!
 B、我请求上天,如果要让我当程序员,那么就让我去做畜生好了!
 C、为了我的孩子,我要发奋图强,我要翻身!
posted @ 2007-08-01 09:35 路边的石头-java 阅读(571) | 评论 (4) | 编辑 收藏
 
linux下安装mysql

想使用Linux已经很长时间了,由于没有硬性任务一直也没有系统学习,近日由于工作需要必须使用Linux下的MySQL。本以为有Windows下使用SQL Server的经验,觉得在Linux下安装MySql应该是易如反掌的事,可在真正安装和使用MySQL时走了很多弯路,遇见很多问题,毕竟Linux 和Windows本身就有很大区别。为了让和我一样的初学者在学习的过程中少走弯路,尽快入门,写了此文,希望对您有所帮助。


二、安装Mysql

1、下载MySQL的安装文件
安装MySQL需要下面两个文件:
MySQL-server-5.0.9-0.i386.rpm
MySQL-client-5.0.9-0.i386.rpm
下载地址为:http://dev.mysql.com/downloads/mysql/5.0.html,打开此网页,下拉网页找到“Linux x86 RPM downloads”项,找到“Server”和“Client programs”项,下载需要的上述两个rpm文件。

2、安装MySQL
rpm文件是Red Hat公司开发的软件安装包,rpm可让Linux在安装软件包时免除许多复杂的手续。该命令在安装时常用的参数是 –ivh ,其中i表示将安装指定的rmp软件包,V表示安装时的详细信息,h表示在安装期间出现“#”符号来显示目前的安装过程。这个符号将持续到安装完成后才停止。
1)安装服务器端
在有两个rmp文件的目录下运行如下命令:
[root@test1 local]# rpm -ivh MySQL-server-5.0.9-0.i386.rpm
显示如下信息。
warning: MySQL-server-5.0.9-0.i386.rpm: V3 DSA signature: NOKEY, key ID 5072e1f5
Preparing... ########################################### [100%]
1:MySQL-server ########################################### [100%]
。。。。。。(省略显示)
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h test1 password 'new-password'
。。。。。。(省略显示)
Starting mysqld daemon with databases from /var/lib/mysql
如出现如上信息,服务端安装完毕。测试是否成功可运行netstat看Mysql端口是否打开,如打开表示服务已经启动,安装成功。Mysql默认的端口是3306。
[root@test1 local]# netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
上面显示可以看出MySQL服务已经启动。
2)安装客户端
运行如下命令:
[root@test1 local]# rpm -ivh MySQL-client-5.0.9-0.i386.rpm
warning: MySQL-client-5.0.9-0.i386.rpm: V3 DSA signature: NOKEY, key ID 5072e1f5
Preparing... ########################################### [100%]
1:MySQL-client ########################################### [100%]
显示安装完毕。
用下面的命令连接mysql,测试是否成功。
三、登录MySQL

登录MySQL的命令是mysql, mysql 的使用语法如下:
mysql [-u username] [-h host] [-p[password]] [dbname]
username 与 password 分别是 MySQL 的用户名与密码,mysql的初始管理帐号是root,没有密码,注意:这个root用户不是Linux的系统用户。MySQL默认用户是root,由于初始没有密码,第一次进时只需键入mysql即可。
[root@test1 local]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.0.16-standard
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
出现了“mysql>”提示符,恭喜你,安装成功!
增加了密码后的登录格式如下:
mysql -u root -p
Enter password: (输入密码)
其中-u后跟的是用户名,-p要求输入密码,回车后在输入密码处输入密码。

注意:这个mysql文件在/usr/bin目录下,与后面讲的启动文件/etc/init.d/mysql不是一个文件。

四、MySQL的几个重要目录

MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件、配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为 Linux本身的目录结构就比较复杂,如果搞不清楚MySQL的安装目录那就无从谈起深入学习。

下面就介绍一下这几个目录。

1、数据库目录
/var/lib/mysql/

2、配置文件
/usr/share/mysql(mysql.server命令及配置文件)

3、相关命令
/usr/bin(mysqladmin mysqldump等命令)

4、启动脚本
/etc/rc.d/init.d/(启动脚本文件mysql的目录)
五、修改登录密码

MySQL默认没有密码,安装完毕增加密码的重要性是不言而喻的。

1、命令
usr/bin/mysqladmin -u root password 'new-password'
格式:mysqladmin -u用户名 -p旧密码 password 新密码

2、例子
例1:给root加个密码123456。
键入以下命令 :
[root@test1 local]# /usr/bin/mysqladmin -u root password 123456
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

3、测试是否修改成功
1)不用密码登录
[root@test1 local]# mysql
ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)
显示错误,说明密码已经修改。
2)用修改后的密码登录
[root@test1 local]# mysql -u root -p
Enter password: (输入修改后的密码123456)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.0.16-standard
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
成功!
这是通过mysqladmin命令修改口令,也可通过修改库来更改口令。

六、启动与停止

1、启动
MySQL安装完成后启动文件mysql在/etc/init.d目录下,在需要启动时运行下面命令即可。
[root@test1 init.d]# /etc/init.d/mysql start

2、停止
/usr/bin/mysqladmin -u root -p shutdown

3、自动启动
1)察看mysql是否在自动启动列表中
[root@test1 local]# /sbin/chkconfig –list
2)把MySQL添加到你系统的启动服务组里面去
[root@test1 local]# /sbin/chkconfig – add mysql
3)把MySQL从启动服务组里面删除。
[root@test1 local]# /sbin/chkconfig – del mysql
七、更改MySQL目录

MySQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步:

1、home目录下建立data目录
cd /home
mkdir data

2、把MySQL服务进程停掉:
mysqladmin -u root -p shutdown

3、把/var/lib/mysql整个目录移到/home/data
mv /var/lib/mysql /home/data/
这样就把MySQL的数据文件移动到了/home/data/mysql下

4、找到my.cnf配置文件
如果/etc/目录下没有my.cnf配置文件,请到/usr/share/mysql/下找到*.cnf文件,拷贝其中一个到/etc/并改名为my.cnf)中。命令如下:
[root@test1 mysql]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

5、编辑MySQL的配置文件/etc/my.cnf
为保证MySQL能够正常工作,需要指明mysql.sock文件的产生位置。 修改socket=/var/lib/mysql/mysql.sock一行中等号右边的值为:/home/mysql/mysql.sock 。操作如下:
vi my.cnf (用vi工具编辑my.cnf文件,找到下列数据修改之)
# The MySQL server
[mysqld]
port = 3306
#socket = /var/lib/mysql/mysql.sock(原内容,为了更稳妥用“#”注释此行)
socket = /home/data/mysql/mysql.sock (加上此行)

6、修改MySQL启动脚本/etc/rc.d/init.d/mysql
最后,需要修改MySQL启动脚本/etc/rc.d/init.d/mysql,把其中datadir=/var/lib/mysql一行中,等号右边的路径改成你现在的实际存放路径:home/data/mysql。
[root@test1 etc]# vi /etc/rc.d/init.d/mysql
#datadir=/var/lib/mysql (注释此行)
datadir=/home/data/mysql (加上此行)

7、重新启动MySQL服务
/etc/rc.d/init.d/mysql start
或用reboot命令重启Linux
如果工作正常移动就成功了,否则对照前面的7步再检查一下。

八、MySQL的常用操作

注意:MySQL中每个命令后都要以分号;结尾。

1、显示数据库
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.04 sec)
Mysql刚安装完有两个数据库:mysql和test。mysql库非常重要,它里面有MySQL的系统信息,我们改密码和新增用户,实际上就是用这个库中的相关表进行操作。

2、显示数据库中的表
mysql> use mysql; (打开库,对每个库进行操作就要打开此库,类似于foxpro )
Database changed

mysql> show tables;
+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
+-----------------+
6 rows in set (0.01 sec)

3、显示数据表的结构:
describe 表名;

4、显示表中的记录:
select * from 表名;
例如:显示mysql库中user表中的纪录。所有能对MySQL用户操作的用户都在此表中。
Select * from user;

5、建库:
create database 库名;
例如:创建一个名字位aaa的库
mysql> create databases aaa;
6、建表:
use 库名;
create table 表名 (字段设定列表);
例如:在刚创建的aaa库中建立表name,表中有id(序号,自动增长),xm(姓名),xb(性别),csny(出身年月)四个字段
use aaa;
mysql> create table name (id int(3) auto_increment not null primary key, xm char(8),xb char(2),csny date);
可以用describe命令察看刚建立的表结构。
mysql> describe name;

+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(3) | | PRI | NULL | auto_increment |
| xm | char(8) | YES | | NULL | |
| xb | char(2) | YES | | NULL | |
| csny | date | YES | | NULL | |
+-------+---------+------+-----+---------+----------------+

7、增加记录
例如:增加几条相关纪录。
mysql> insert into name values('','张三','男','1971-10-01');
mysql> insert into name values('','白云','女','1972-05-20');
可用select命令来验证结果。
mysql> select * from name;
+----+------+------+------------+
| id | xm | xb | csny |
+----+------+------+------------+
| 1 | 张三 | 男 | 1971-10-01 |
| 2 | 白云 | 女 | 1972-05-20 |
+----+------+------+------------+

8、修改纪录
例如:将张三的出生年月改为1971-01-10
mysql> update name set csny='1971-01-10' where xm='张三';

9、删除纪录
例如:删除张三的纪录。
mysql> delete from name where xm='张三';

10、删库和删表
drop database 库名;
drop table 表名;

九、增加MySQL用户

格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"
例1、增加一个用户user_1密码为123,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MySQL,然后键入以下命令:

mysql> grant select,insert,update,delete on *.* to user_1@"%" Identified by "123";
例1增加的用户是十分危险的,如果知道了user_1的密码,那么他就可以在网上的任何一台电脑上登录你的MySQL数据库并对你的数据为所欲为了,解决办法见例2。

例2、增加一个用户user_2密码为123,让此用户只可以在localhost上登录,并可以对数据库aaa进行查询、插入、修改、删除的操作(localhost指本地主机,即MySQL数据库所在的那台主机),这样用户即使用知道user_2的密码,他也无法从网上直接访问数据库,只能通过 MYSQL主机来操作aaa库。

mysql>grant select,insert,update,delete on aaa.* to user_2@localhost identified by "123";

用新增的用户如果登录不了MySQL,在登录时用如下命令:

mysql -u user_1 -p -h 192.168.113.50 (-h后跟的是要登录主机的ip地址)

十、备份与恢复

1、备份

例如:将上例创建的aaa库备份到文件back_aaa中

[root@test1 root]# cd /home/data/mysql (进入到库目录,本例库已由val/lib/mysql转到/home/data/mysql,见上述第七部分内容)
[root@test1 mysql]# mysqldump -u root -p --opt aaa > back_aaa

2、恢复

[root@test mysql]# mysql -u root -p ccc < back_aaa
posted @ 2007-07-30 13:58 路边的石头-java 阅读(271) | 评论 (0) | 编辑 收藏
 
MySQL 版本 卸载与安装

1)首先查找以前是否安装MySQL 3.23.54?

命令:rpm -qa | grep mysql

可以看到两个MySQL包:mysql-server、mysql-devel-3.23.54a-11。

2)删除命令:

rpm -e --nodeps 包名

3)然后删除mysql老版本的开发头文件和库

rm -fr /usr/lib/mysql

rm -fr /usr/include/mysql

之后可以正常安装了。


posted @ 2007-07-30 11:02 路边的石头-java 阅读(146) | 评论 (0) | 编辑 收藏
 
MySQL 忘记口令的解决办法

如果 MySQL 正在运行,首先杀之: killall -TERM mysqld。
启动 MySQL :/usr/bin/safe_mysqld --skip-grant-tables &
就可以不需要密码就进入 MySQL 了。

然后就是
>use mysql
>update user set password=password("new_pass") where user="root";
>flush privileges;
重新杀 MySQL ,用正常方法启动 MySQL 。

posted @ 2007-07-30 10:58 路边的石头-java 阅读(138) | 评论 (0) | 编辑 收藏
 
当会话超时时重定向

对于所有 Web 应用程序来说,安全是非常重要的。一个安全问题是当变量超出会话范围时您可能需要考虑限制用户访问 Web 应用程序的特殊页面。出现这个问题时,您可能想要求用户再次登录,然后才能继续。

 

目录

- 

概述

- 

创建一个具有两页的项目

 

使用 Servlet Filter

- 

修改按钮动作处理器方法

- 

小结

 




本技巧适用于以下技术和资源

NetBeans IDE 6.0、5.5.1 和 5.5

 

JavaServer Faces Components/
Java EE Platform

1.2 with Java EE 5*
1.1 with J2EE 1.4

Travel Database

不需要

BluePrints AJAX Component Library

不需要

* 到发布本文时止,Sun Java System Application Server 只支持 Java EE 5。

现在,本文中的技巧已适用于 Sun Java Application Server PE 9.0 Update Release 1 和 Tomcat 5.5.17。如果您使用其他服务器,请查看发行说明和 FAQ 了解已知问题和解决办法。有关所支持服务器和 Java EE 平台的详细信息,请参阅发行说明。

概述

本技巧介绍当会话超时或达到空值时您如何将该用户重定向到另一个页面。在这种情况下,您希望在加载页面时执行重定向。但是使用超级链接不起作用,按钮动作处理器方法的标准代码也不起作用。

处理该情况的最可靠方法是使用 Servlet Filter。而且使用 Servlet Filter 还非常高效,因为一旦设置了此过滤器,您便可以在项目中的任何页面或组件中使用。同时您还可以为按钮动作处理器方法编写自定义代码,后一种方法不如前面的方法可靠,原因是该方法取决于 web.xml 文件中的设置。修改后的动作处理器代码还必须包含于您要测试会话是否超时的所有页面上。尽管本技巧介绍如何修改按钮动作处理器,但建议您尽可能使用 Servlet Filter 方法。

无论您选择哪种方法,要使代码正常工作,您还需要在 web.xml 文件中设置一个会话超时值;例如,将会话超时值设置为 1 分钟:

 <session-config>
       <session-timeout>1</session-timeout>
 </session-config> 

创建一个具有两页的项目

您可以自己轻松创建此示例。在您的可视 Web 应用程序中设置两个页面:页面1 具有一个按钮和一个显示会话超时消息的 ErrorPage。如果用户在达到 web.xml 文件中设置的超时值之前,单击页面 1 上的按钮,则不会发生任何事情(因为会话尚未超时)。但是,如果已经达到了超时值,即表示该会话已经超时,则该按钮会将用户带到 ErrorPage。

请记住,当会话超时时查看重定向是否正常工作,您必须等待超过您在 web.xml 文件中设置的超时值之后才能单击该按钮。

使用 Servlet Filter

当会话超时时重定向用户的最佳方法是使用 Servlet Filter。使用该方法,您不需要对按钮动作处理器的代码进行任何修改。

常规步骤如下:

l          使用 GUI 创建一个 Filter 类并将它的过滤器映射设置为 Servlet 和 Faces Servlet。

l          将 Servlet Filter 类中的代码替换为自定义代码。

l          部署项目。

下面是完成此操作的方法。

1.       首先,创建 Filter 类。在 NetBeans 6.0 中,右键单击该项目,然后单击 New -> Other 打开 File Type 对话框。(在 NetBeans 5.5 或 5.5.1 中,右键单击该项目,然后单击 New->File/Folder 可打开该对话框。)然后在该对话框屏幕的 Categories 列(如果它尚未高亮显示)中选择 Web,在 Files Type 列中选择 Filter。单击 Next。

2.       将显示 New Filter 对话框。在 Class Name 中输入 SessionCheckFilter,然后单击 Next。(您可以为此过滤器使用任何名称。)

3.       在 Configure Filter Deployment 对话框中,在 Filter Mappings 框(如果尚未高亮显示)中选择 SessionCheckFilter,然后单击 Edit。

图 1. Configure Filter Deployment 对话框 (单击可放大图像)

4.       在 Filter Mapping 对话框中,选中 Servlet 并确保它设置为 Faces Servlet。然后单击 Finish。

图 2:Filter Mapping 对话框

5.       现在,在源编辑器中打开 SessionCheckFilter 类,然后用以下代码替换整个类。

代码示例 1:用于重定向的 SessionCheckFilter 代码

public class SessionCheckFilter implements Filter {
 private static int firstRequest = 0;
 public void doFilter(ServletRequest request, ServletResponse response,
                    FilterChain chain) throws IOException, ServletException {
      HttpServletRequest hreq = (HttpServletRequest)request;
      HttpServletResponse hres = (HttpServletResponse)response;
      HttpSession session = hreq.getSession();
      if (session.isNew()) {
          if(firstRequest == 0){
               firstRequest++;
          } else {
               hres.sendRedirect("faces/ErrorPage.jsp");
               return;
          }
      }
      chain.doFilter(request, response);
 }
 public void init(FilterConfig filterConfig) throws ServletException {}
 public void destroy() {}
}

Servlet Filter 采用 doFilter 方法进行它的所有处理。它获得对会话的参考并测试会话是否是新的会话或者用户是否仍然在上一个会话中。如果是新的会话,则代码会增加变量 firstRequest,它表示这不再是新的会话。但是,如果用户仍然位于相同的会话中并且该会话已经超时,则 Servlet Filter 会将该用户重定向到一个设置为处理超时问题的页面。在本例中,为 faces/ErrorPage.jsp。

现在,您可以部署和运行该项目了。当您等待超过超时值(在本例中,为 1 分钟)之后单击主页面上的按钮时,过滤器会将您重定向到错误页面。无论您以前单击该按钮多少次,都会发生该重定向。还请注意,Servlet Filter 适用于任何页面和任何组件。您不需要为页面上的组件编写任何特殊的代码。

修改按钮动作处理器方法

您也可以为按钮动作处理器方法编写一些自定义的代码以在会话到期时将用户重定向到另一个页面。

除了设置超时值之外,要使该方法正常工作,还要确保将 web.xml 文件中的 javax.faces.STATE_SAVING_METHOD 参数设置为 client。如果设置为 server,则按钮动作方法将永远也不会被调用,无论超时值的设置如何都是如此。要验证和更改此参数的设置,请展开 web.xml 文件的 Context Parameters 部分。如果 javax.faces.STATE_SAVING_METHOD 的值设置为 server,请使用 Edit 按钮将属性值更改为 client。

图 3:设置 javax.faces.STATE_SAVING_METHOD 参数

所有关键代码都位于按钮动作处理器方法中。在 Java 源编辑器中打开 Page1 按钮动作处理器方法,并向该方法中添加以下代码。输入该代码之后,请使用 Fix Imports 函数导入该代码使用的类。

代码示例 2:用于会话超时重定向的按钮动作处理器

 public String button1_action() {
        ExternalContext externalContext = getFacesContext().getExternalContext();
        HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
        HttpSession session = request.getSession();
        if (session.isNew()) {
          try {
            String errorPageURL = externalContext.getRequestContextPath() +
                "/faces/ErrorPage.jsp";
            externalContext.redirect(errorPageURL);
          } catch(IOException ioe) {
            System.out.println("==============");
            ioe.printStackTrace(System.out);
            System.out.println(ioe.toString());
            System.out.println("==============");
          }
        } else {
          System.out.println("==============");
          System.out.println("*** Session is not New ***");
          System.out.println("==============");
        }
     return null;
}

该动作处理器方法的关键部分位于开始部分。前三个方法为:

 ExternalContext externalContext = getFacesContext().getExternalContext();
 HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
 HttpSession session = request.getSession();

为您提供一个该会话本身的处理器。

接下来,您检查该会话是否是新会话,或者是否用户仍然处于相同(上一个)会话中。如果是新会话,则执行 try 块中的代码;否则,用户仍然处于相同会话中,并且动作处理器方法返回。try 块中的重定向代码如下:

 if (session.isNew()) {
   try {
     String errorPageURL = externalContext.getRequestContextPath() +
        "/faces/ErrorPage.jsp";
   externalContext.redirect(errorPageURL);

上面的代码建立了到您要重定向到的页面的路径,在本例中为错误页面 ErrorPage.jsp。路径为 Web 应用程序上下文和重定向到的页面名称的组合。代码使用 ExternalContext.getRequestContextPath 方法返回请求 URI 的一部分,该部分标识请求的 Web 应用程序上下文,并且还向此上下文中附加重定向页面的名称 (/faces/ErrorPage.jsp)。

然后,调用 ExternalContext.redirect 方法,将它的绝对 URL 路径传递给重定向页面。redirect 方法将客户端请求重定向到指定的 URL。它还在当前请求的 FacesContext 实例上调用 responseComplete 方法。

小结

尽管两种方法都可以正常工作,但很容易看出使用 Servlet Filter 是处理会话超时时重定向问题的最简单方法。您不仅可以使用 IDE 对话框创建 Servlet Filter,使所需要添加的代码非常简单。而且使用 Servlet Filter 还不需要在要检查会话是否超时的每个页面上(或者包括在多个组件动作处理器中)重定向逻辑。
posted @ 2007-07-30 09:32 路边的石头-java 阅读(541) | 评论 (0) | 编辑 收藏
 
在 10 分钟之内创建 Ruby Weblog

本教程介绍如何在 10 分钟之内创建一个博客。本教程运行支持 Ruby 的 NetBeans IDE 6.0 (M10)。

内容

- 

教程要求

- 

设置

- 

创建 Ruby on Rails 项目

- 

配置数据库

- 

创建模型

- 

使用 Scaffold

- 

迁移 Forward

- 

使列表看起来更像博客

教程要求

本教程需要以下软件:

l          Java Standard Development Kit (JDK) version 6.0

l          支持 Ruby 的 NetBeans IDE 6.0 (M10)

设置

l          将 derbyclient.jar (jdk1.6.0_home/db/lib/derbyclient.jar) 复制到您的 jruby lib 目录 (NetBeans_install_dir/ruby1/jruby-1.0/lib)。

创建 Ruby on Rails 项目

1.       在 NetBeans IDE 中,选择 File > New Project。

2.       在 Categories 字段中选择 Ruby,在 Projects 字段中选择 Ruby on Rails Application,然后单击 Next。

3.       在 Project Name 字段中键入 RubyWebLog,然后单击 Finish。

4.       浏览 Projects 窗口。如下图所示,Projects 窗口按类别对项目进行分组。展开每个节点可查看每个类别中的类型。

配置数据库

1.       在 Projects 窗口中,展开 Configuration 节点。

2.       打开 database.yml。

3.       在 database.yml 中,删除 development: 下的默认数据库配置并替换为以下配置:

代码示例 1:在 database.yml 中开发数据库配置

 adapter: jdbc
 driver: org.apache.derby.jdbc.ClientDriver
 url: jdbc:derby://localhost:1527/sample
 username: app
 password: app

 4. 确保您使用代码示例 1 中所示的正确格式。如果使用制表符,则可能会在迁移数据库时遇到错误。

5.打开 environment.rb 并在内容为 Rails::Initializer.run do |config| 的行上面插入以下代码:

代码示例 2:Ruby 代码

if RUBY_PLATFORM =~ /java/
 require 'rubygems'
 RAILS_CONNECTION_ADAPTERS = %w(jdbc)
end

 

6.打开 Services 窗口,展开 Databases 节点,并检查示例 {app on APP} 数据库是否已连接。

如果示例数据库标记的 jdbc 节点已中断,则 IDE 未连接到数据库。要连接到示例数据库,请右键单击示例数据库的 jdbc 节点,然后从弹出菜单中选择 Connect。如果出现 Connect 对话框,则对 Password 输入 app,选择 Remember Password During This Session,然后单击 OK。

创建模型

在本部分中,您使用 Rails 生成器创建一个迁移。迁移是一种使用版本跟踪数据库更改的方式。

1.       切换回 Projects 窗口,右键单击 Model 节点,然后选择 Generate。

2.       在 Rails Generator 对话框中,在 Arguments 字段中键入 Post,然后单击 OK。

作为模型生成的一部分,为您创建了一个迁移 001_create_posts.rb:

3.       展开 Database Migrations > migrate 节点并打开 001_create_posts.rb。

4.       如下图所示,向 up 方法中添加标题列(以粗体显示):

代码示例 3:001_create_posts.rb 的代码

class CreatePosts < ActiveRecord::Migration
 def self.up
    create_table :posts do |t|
      t.column "title", :string
    end
 end
 
 def self.down
    drop_table :posts
 end
end

 

5.当运行数据库迁移时执行 self.up 方法。当停止数据库时运行 self.down 方法。self.down 方法将数据库回滚到以前的版本。

6.在 Projects 窗口中,右键单击 RubyWebLog 节点,然后选择 Migrate Database > To Current Version。

该操作运行数据库迁移。输出窗口表示迁移 CreatePosts 的时间。下面是某些常见错误的纠正方法:

o                                org.jvyamlb.ScannerException: ScannerException null, mapping values are not allowed here. 表示 database.yml 文件的格式有问题。请检查是否使用了制表符进行缩进。

o                                The driver encountered an error: cannot load Java class org.apache.derby.jdbc.ClientDriver. 请验证是否如设置中所述复制了 derbyclient.jar 文件。

7.切换到 Services 窗口,展开 jdbc > Tables 节点查看生成的 posts 表以及关联的 schema_info 表。

如果没有看到新的条目,请右键单击 Tables 节点,然后选择 Refresh。

使用 Scaffold

在本部分中,使用 Ruby on Rails scaffold 功能。Scaffold 提供创建、编辑、查看和破坏博客中条目的基本界面。

1.       切换回 Projects 窗口,右键单击 Controllers 节点,然后选择 Generate。

2.       在 Rails Generator 对话框中,在 Name 字段中键入 Blog。将 Views 字段保留为空。单击 OK。

3.       向 blog_controller.rb 中添加以下代码,该代码提供围绕该模型的一个简单的 CRUD 应用程序:

代码示例 4:blog_controller.rb 的代码

class BlogController < ApplicationController
 scaffold :post
end

4.       在 Configuration 节点下,打开 routes.rb 并在最后一个 end 语句之前添加以下代码:

map.connect '', :controller => "blog"
 

5.       展开 Public 节点并删除 index.html。

现在,当运行该应用程序时便会自动加载该博客。

6.       单击工具栏中的 Run Main Project 按钮启动 WEBrick 服务器并启动浏览器。

下面是该应用程序的第一个页面。

7.       单击 New post。

8.       输入一个标题,然后单击 Create。

下面是博客列表的示例。

迁移 Forward

在这里,您通过添加其他迁移(向编辑页面中添加正文)来更改数据模型。

1.       右键单击 Database Migrations 节点,然后选择 Generate。在 Rails Generator 对话框中,在 Arguments 字段中键入 AddBody,然后单击 OK。

Ruby 便创建了一个名为 002_add_body.rb 的版本迁移脚本。

2.       按照如下方式修改 002_add_body.rb:

代码示例 5:002_add_body.rb 的代码

class AddBody < ActiveRecord::Migration
 def self.up
    add_column 'posts', 'body', :text
 end
 
 def self.down
    remove_column 'posts', :body
 end
end

3.       右键单击 RubyWebLog 节点,然后选择 Migrate Database > To Current Version。

4.       返回到浏览器并单击 Edit 链接查看 Ruby 如何识别新的正文字段。

5.       单击 Back 返回到 Listing Posts 页面,并创建更多博客条目。例如:

使列表看起来更像博客

到目前位置,scaffold 已经创建了一个基本的 CRUD 应用程序,使用该应用程序可以轻松测试该模式。这里您生成 scaffold,将其作为修改用户界面的基础。

1.       在 Projects 窗口中,右键单击 Views 节点,然后选择 Generate。

2.       在 Rails Generator 对话框中,从 Generate 下拉列表中选择 scaffold。

3.       在 Model Name 字段中键入 Post,在 Controller Name 字段中键入 Blog。保留 Actions 字段为空。单击 OK。

4.       展开 Views > blog 并打开 list.rhtml。删除 <h1> 和 <table> 标记并将其替换为以下代码:

代码示例 6:list.rhtml 的代码

<h1>The Ruby Blog</h1>
 
<% @posts.each do |post| %>
 <h2><%= post.title %></h2>
 <p><%= post.body %></p>
 <small> <%= link_to 'Permalink', :action => 'show', :id => post %></small>
 <hr>
<% end %>

5.       保存 list.rhtml 并刷新您的浏览器。

6.       要首先用最新的条目显示博客,请通过向 @posts in list.rhtml 的结尾添加 .reverse 颠倒排序顺序:

      <% @posts.reverse.each do |post| %>
  

当保存该文件并刷新您的浏览器时,该博客显示如下:


posted @ 2007-07-30 09:28 路边的石头-java 阅读(356) | 评论 (0) | 编辑 收藏
 
Java实用经验总结--其他

1.   Map的遍历
有人看了这个标题可能发笑,因为这实在太简单,难道我在凑字数?可是根据我自己的经验来说,人的岁数长的时候记忆力却不跟着长,倒有不进反退的现象。我就是虽然写过很多遍但仍然用到的时候就忘个干净,在这里写一下强化记忆J
SortedMap pDataMap = new TreeMap();
Iterator itor = pDataMap.entrySet().iterator();
       while(itor.hasNext()){
           Map.Entry vEntry = (Entry) itor.next();
            vEntry.getKey();
    vEntry.getValue();
            //做一些其他的事……
}
2.   文件操作
本文主要关注简单的对象序列化的相关操作,对于更为详细的操作过程,请参照《Java编程思想 2e》。
2.1.文件过滤器
文件过滤器主要用在FileChooser或者File.listFiles()方法中,用于过滤掉一些与本程序无关的类型文件。本例给出一个察看给定文件后缀名的文件过滤器,对于给定的文件察看其文件名,如果和给定的后缀名一致则返回true,否则返回false。
publicclass RecorderFileFilter implements FilenameFilter
{
    /**后缀名 **/
        String postfixStr;
 
        public RecorderFileFilter(String postfix){
            this.postfixStr = postfix;
        }
 
        publicboolean accept(File dir, String name) {
            /**只判断后文件的缀名是否正确即可 **/
            if( name.endsWith(postfixStr) )
                    returntrue;
                else
                    returnfalse;
        }
}
2.2.对象的保存与读取
首先介绍一下我的程序的存储结构:我的数据保存在两种类型的文件中,即“时间字符串.data”和“时间字符串.plan”两种类型。其中.data文件是一个HashMap<String,String>类的序列化文件,而.plan文件是一个SortedMap<String,String>类的序列化文件。他们都保存在“user.dir/data”目录下。下面的这些方法的功能是读取/保存这个目录下数据文件,如果你想保存你自定义的文件到指定目录,下面的代码至需要稍微修改一下即可使用:
/**用以标识读入数据的类型,也是文件后缀名**/
    publicstaticfinal String DATA_TYPE = ".data";
    publicstaticfinal String PLAN_TYPE = ".plan";
 
    /**以程序运行目录作为基目录**/
    publicstatic File appDir = new File(System.getProperty("user.dir"));
    publicstatic File imgDir = new File(appDir,"img");
    publicstatic File dataDir = new File(appDir,"data");
    publicstatic File reportDir = new File(appDir,"report");
 
    publicstatic FileInputStream fIn;
    publicstatic FileOutputStream fOut;
    publicstatic ObjectInputStream objIn;
    publicstatic ObjectOutputStream objOut;
 
 
    /**---------------功能函数部分----------------------**/
    /**
     *查找并读入"user.home/data/"目录下所有的记录文件,将其放到一个Map中
     *HashMap的Key为文件名,也是欠款人帐户的ID号。
     *关于获得的文件的具体信息请参照技术说明书。
     *如果pType=DATA_TYPE,则dataMap的格式为<String,HashMap>
     *     pType=PLAN_TYPE,则dataMap的格式为<String,SortedMap>
     *@returnSortedMap
     */
    publicstatic HashMap loadAll(String pType){
        /** 数据文件名(简历账号的时间)即为ID **/
        HashMap vDataMap = new HashMap();
 
        /**后缀名为data的即为数据文件**/
        File[] dataFiles = dataDir.listFiles(new RecorderFileFilter(pType));
 
        for(int i = 0; i < dataFiles.length; i++){
            try{
                if( pType.equals(FileUtil.DATA_TYPE) ){
                    HashMap<String,String> hMap = (HashMap<String,String>)loadObjectFromFile(dataFiles[i]);
                    /**去掉文件名的后缀名即或得key,也就是欠款帐户ID**/
                    vDataMap.put(hMap.get("id"),hMap);
                }elseif( pType.equals(FileUtil.PLAN_TYPE) ){
                    SortedMap<String,SortedMap> hMap = (SortedMap<String,SortedMap>)loadObjectFromFile(dataFiles[i]);
                    /**去掉文件名的后缀名即或得key,也就是欠款帐户ID**/
                    vDataMap.put(StringUtil.clearFileName(dataFiles[i]) ,hMap);
                }else
                    thrownew Exception("读取了错误的文件类型");
 
            }
            catch(Exception ex) {
                MessageUtil.showErrMsg("读取数据时出现错误,数据有可能丢失!"+
                    "\n 文件名为:"+dataFiles[i].getName());
            }
        }
        return vDataMap;
    }
 
 
    /**
     *将给定内容存入文件中.
     *@parampContentMapMap其所装内容为<id(String), HashMap或SortedMap>
     */
    publicstaticvoid saveAll(HashMap<String,String> pDataMap,SortedMap<String,String> pPlanMap){
        Iterator itor = pDataMap.entrySet().iterator();
        while(itor.hasNext()){
            Map.Entry vEntry = (Entry) itor.next();
            String id = (String) vEntry.getKey();
            saveToFile(id,pDataMap,pPlanMap);
        }
    }
 
 
    /**
     *将制定欠款账户的信息存入文件中
     *@paramidString          这个信息在保存欠款协议时不可或缺
     *@parampDataMapSortedMap
     *@parampPlanMapSortedMap
     */
    publicstaticvoid saveToFile(String id, HashMap<String,String> pDataMap,
        SortedMap<String,String> pPlanMap){
        try{
        if( pDataMap != null )
       saveObjectToFile(new File(dataDir,id+DATA_TYPE), pDataMap);
            if( pPlanMap != null )
                saveObjectToFile(new File(dataDir,id+PLAN_TYPE), pPlanMap);
    }
        catch(Exception ex) {
            MessageUtil.showErrMsg("保存数据时出现错误,数据没有被正确保存!");
        }
    }
 
 
    /**
     *将文件中的序列化对象读出来
     *@parampFileFile
     *@returnObject
     *@throwsException
     */
    publicstatic Object loadObjectFromFile(File pFile) throws Exception {
        fIn = new FileInputStream(pFile);
        objIn = new ObjectInputStream(fIn);
        Object obj = objIn.readObject();
        fIn.close();
        objIn.close();
        return obj;
    }
 
 
    /**
     *将对象序列化到相应的文件中去--保存数据时候专用,因为该函数将数据保存在appDir/data目录下
     *@parampFileNameString
     *@paramobjObject
     *@throwsException
     */
    publicstaticvoid saveObjectToFile(File pFile,Object pObj) throws Exception
    {
        fOut = new FileOutputStream(pFile);
        objOut = new ObjectOutputStream(fOut);
        objOut.writeObject(pObj);
        fOut.close();
        objOut.close();
    }
 
2.3.其他
由于每个程序都有图标文件,所以从制定目录读入图标应该是每个程序都会用到的。其次,删除指定目录下的指定类型文件似乎也很常用J
    /**从img文件夹中获取图标**/
    publicstatic ImageIcon getImageIcon(String pImageFileName){
       File imgFile = new File(imgDir,pImageFileName);
       ImageIcon imageIcon = new ImageIcon(imgFile.getAbsolutePath());
       return imageIcon;
    }
 
    /**清除reportDir目录下所有html文件**/
    publicstaticvoid clearReportFiles(){
        File vReportDir = new File(reportDir.getAbsolutePath());
        File[] vReportFiles = vReportDir.listFiles(new FilenameFilter(){
        publicboolean accept(File dir, String name){
                if( name.endsWith("html"))
                    returntrue;
                returnfalse;
        }
    });
        for(int i = 0; i < vReportFiles.length; i++)
            vReportFiles[i].delete();
}

posted @ 2007-07-30 09:26 路边的石头-java 阅读(316) | 评论 (0) | 编辑 收藏
 
商业黑客潜规则:首宗被破DDOS攻击案始末

7月26日,网游运营商完美时空(Nasdaq:PWRD)在纳斯达克市场挂牌交易,上市首日便大涨27.5%。

  此时风光无限的完美时空,却在一个多月前遭遇了一场令人哭笑不得的推销。

  完美时空当时发表的声明称,“中国网络史上最大规模的黑客DDOS攻击在6月11日凌晨上演”,并称公司因此遭受了数百万元的经济损失。

  完美时空随即向北京市海淀区警方报案,后经调查,该起黑客攻击的目的竟然是为了推销某公司生产的防火墙产品。

  先黑网站再卖设备

  7月25日,海淀区警方宣布,破获了一起以DDOS手段实施的黑客攻击案,这次攻击给联众、完美时空等几家网络游戏公司造成了近千万元的经济损失。而有关人员发起攻击的目的很简单,就是为了推销上海遐迩网络科技(发展)有限公司(下称遐迩网络)生产的抗DDOS防火墙。

  时间回溯到6月10日,完美时空公司技术部工作人员突然发现大量攻击数据从网上涌来,开始攻击公司网站。到6月11日下午,攻击流量总计超过了100G,这已经大大超过了完美时空租赁的带宽。

  随后,由于数据包过于庞大,完美时空公司网站和旗下4款大型网络游戏全部数据完全被阻断,网络充值系统也被迫关闭。

  接到完美时空公司报案的海淀警方在一个多月前已经接到过类似的报警。据了解,自4月23日开始,联众在北京等地的服务器遭遇猛烈攻击,众多玩家无法进入游戏,在联众公司采取补救措施的时候,攻击却越来越猛。但是几天后,攻击便自行停止了。

  颇为蹊跷的是,在攻击结束后的数日内,联众技术部的人员就接到了推销电话,自称来自遐迩网络公司的销售人员称,如果采用该公司的设备,就可以很好地抵御这种DDOS攻击。

  抱着试试看的心态,联众租用了该公司的相关设备。在采用该公司的防火墙产品后,果然针对联众的攻击随之大幅度下降。由于遐迩网络公司的一套防火墙需要近百万元,燃眉之急稍解的联众决定停用该公司的防火墙产品。但是让联众没有想到的是,第二天,网络攻击又再次大规模爆发,联众在上海、北京等地的数个服务器先后被攻击瘫痪。

  “没想到一停用就再次遭受大规模攻击。”联众总裁伍国樑相当气愤地告诉记者,在这种情况下,联众无奈向海淀区警方报案。

  6月14日,海淀警方抓获了上海遐迩网络公司的4名工作人员,目前,这4人因涉嫌破坏计算机信息系统,已被海淀区检察院批准逮捕。

  海淀警方公布的消息显示,这4名工作人员交代了自己利用黑客手段向多家网络游戏公司发动网络攻击,以便通过攻击来销售自己公司防火墙设备的事实。

  海淀警方还称,除了联众和完美时空之外,上述人员此前还攻击过2家网络游戏公司,并成功的销售了自己的防火墙设备。

  商业黑客泛滥

  公开资料显示,遐迩网络公司成立于2004年5月,是一家致力于网络安全产品研发的专业机构,公司研发的抗拒绝服务系统已经通过多个机构的认证,并已申请国家专利,在业内颇有名气。

  7月27日,记者来到遐迩网络公司所在的上海浦东新区张杨路上一个不太起眼的小区里。门口并没有醒目的公司标记,办公室看起来也不显眼。“这已经是6月份的事情了,我们不想再谈。”遐迩网络公司有关人士拒绝了记者的采访要求。

  上述遐迩网络公司4名销售人员的这种“先攻击、再销售”的黑客式销售模式,在外界看来确实匪夷所思。但据记者了解,在IT行业,类似的事件并不鲜见。

  自2007年1月24日起,杭州天畅科技的游戏网站和《大唐风云》、《大唐》等游戏的服务器,均出现较为严重的不稳定状况,导致网站和游戏服务器无法登陆。

  杭州天畅科技的调查显示,大量不明来历的数据包每天对网站和游戏服务器发起攻击,堵塞了网络,造成断网现象。

  “我们也经常遭遇到各种黑客的DDOS攻击,很难查。”征途网络董事长史玉柱也向记者抱怨。在这种情况下,征途网络不得不采用各种防火墙设备来防止类似的攻击。

  据记者了解,DDOS攻击也被称为拒绝服务攻击,该攻击可以利用网络通讯协议本身固有的缺陷,通过伪造超过服务器处理能力的请求数据,造成服务器响应阻塞,从而使正常的用户请求得不到应答,以实现其攻击目的。

  正是基于这种攻击的隐蔽性及其所带来的巨大危害,DDOS攻击很多时候都被利用来攻击对手。“市场上有很多高手专门给一些公司做这种攻击行为。”上海一家网络安全设备公司的负责人告诉记者,“整个网络上这种攻击是很泛滥的,一些是发自网络安全公司;一些发自竞争对手。”

  而很多中小企业由于没有专业的防范力量,在遭受攻击时一般都会采用“及时”推销上门的防火墙设备。

  “一般来说,生产这种防火墙的公司都会先试着攻击对方的网站,找出技术漏洞,然后提醒客户购买产品,但是并不会损害客户的网站,这在行业里面已经不是什么秘密。”上述网络安全设备公司负责人告诉记者。不过,他坦承,像完美时空、联众等这种遭到明显敲诈的行为,在业内还不算多。

  DDOS攻击罪责悬念

  国家计算机网络应急技术处理协调中心的一份研究报告也显示,黑客攻击目前已经形成了一条隐蔽的产业链,目前在我国网络安全黑色产业链产值已超过2.38亿元,造成的损失则超过76亿元,已经形成了不可忽视的地下经济力量。

  “还是必须加大处罚力度。”一直从事数据安全业务的GDS万国数据公司总裁黄伟认为。据了解,目前中国的互联网立法情况要落后现实许多,《计算机信息网络国际联网安全保护管理办法》中规定制造和传播病毒是违法的,但是对于木马、黑客程序、DDOS攻击等并没有清晰的界定。

  有业内人士认为,这种DDOS网络攻击犯罪有两个明显不同于传统犯罪的特色:其一是犯罪现场的不确定性,带来了电子证据的法律效力及有关损失的评估难题;其二是立法执法跟不上形势,很难了解犯罪行为造成的破坏价值。

  实际上,这种攻击行为不只是影响到像完美时空这样的企业,如果这种攻击被用于攻击基础网络时,带来的损失就更加不可估量了。

  有关人士认为,目前,国内的相关信息安全立法还比较滞后,而且缺乏完整性、严密性和足够的震慑力。

  “必须用法律和技术相结合的手段来应对网络黑客的攻击,在增强行业自律和用户自我保护意识的同时,必须增强网络安全产业的服务链。”黄伟强调。


posted @ 2007-07-30 09:24 路边的石头-java 阅读(203) | 评论 (0) | 编辑 收藏
 
Java实用经验总结--日期、数字篇
     摘要: 1.   日期部分 对于像日期、时间和钱这样的对象来说,不同的国家、地区都有不同的显示格式。即便是同一地区,也可能存在差异。但是在不考虑国家化,时间格式相对固定的情形下,对于时间的处理还是相对比较简单的。在我最近所作的一个小程序里面,遇到了一些与日期有关的且不考虑国际化和复杂格式的问题。例如如何求两个日期所差的天数,所差的月数;将日期类转化为规定格式的字符串,将规定格式的日期...  阅读全文
posted @ 2007-07-30 09:22 路边的石头-java 阅读(383) | 评论 (0) | 编辑 收藏
 
NEC新压缩技术 比JPEG2000快30倍

NEC周三(7/25)表示完成一项既可保有与现存JPEG压缩规格相同压缩率,又能大幅加速JPEG图文件压缩速度的无损压缩(lossless compression)技术。

一般的JPEG格式仅对应8bit色阶,因此在医疗、卫星航空、科学研究等领域常因此丧失图像精准度,对于这些特殊领域来说,若要使用现有不失真的图像压缩技术,则装置所需的演算处理能力势必要提高,结果将导致庞大的图像数量往往需要以天为单位进行转文件,而且也无法应用在例如数字相机等低电力的轻便装置中。

新技术的压缩图片与现有的JPEG-LS、JPEG2000压缩率相当,最大支持色阶却有16bit,压缩速率是JPEG-LS的10倍以上、JPEG2000的30倍以上;同时对应从图像中低分辨率的部份依序进行压缩/解压缩的图像显示方式,让使用者能和使用JPEG档案一样,在图像档案尚未全部接收完成前即可看见概略图像。

NEC
已在7/23于西班牙巴塞隆纳举行的IGARSS 2007会议中发表此技术,而研究成果已经被日本宇宙航空研究机构(JAXA)预定采用于2010年后的金星探测计划


posted @ 2007-07-30 09:21 路边的石头-java 阅读(253) | 评论 (0) | 编辑 收藏
 
仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页 
 
<2025年6月>
日一二三四五六
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

 公告


 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 63
  • 文章: 0
  • 评论: 27
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(2)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • Java技术(2) (rss)
  • Web技术(1) (rss)
  • 专题技术(3) (rss)
  • 业内新闻(6) (rss)
  • 操作系统(3) (rss)
  • 数据库 (rss)
  • 生活娱乐(2) (rss)

随笔档案

  • 2007年8月 (31)
  • 2007年7月 (32)

搜索

  •  

最新评论

  • 1. re: 一张所有XP用户都感吃惊的图片[未登录]
  • 晕,这有什么好惊奇的,容易的很!
  • --无名
  • 2. re: 一张所有XP用户都感吃惊的图片
  • 看下什么目录
  • --xiaoyu211940
  • 3. re: 一张所有XP用户都感吃惊的图片
  • 000
  • --Super·shen BLOG 李禄燊
  • 4. re: 一张所有XP用户都感吃惊的图片
  • czvzxc
  • --ww
  • 5. re: Java实用经验总结--Swing篇
  • 真的不错

    谢谢啦
  • --windrain

阅读排行榜

  • 1. Java实用经验总结--Swing篇(1249)
  • 2. 使用xfire建立webservice (1053)
  • 3. 解决在linux下awt调用错误的问题(926)
  • 4. 机器猫全部剧场版的下载地址(918)
  • 5.  一张所有XP用户都感吃惊的图片(744)
  • 6. java 分布式RMI的简单使用(733)
  • 7. 做猪做狗都不做程序员(571)
  • 8. 当会话超时时重定向(541)
  • 9. 用开源组件jcaptcha做jsp彩色验证码 (511)
  • 10. 使用Spring框架和AOP实现动态路由(480)
  • 11. 北京图盟科技有限公司(Mapabc.com)基础研发部诚聘英才(415)
  • 12. Java实用经验总结--日期、数字篇(383)
  • 13. Web Service在电信行业数据业务中的应用 (376)
  • 14. 写得蛮好的linux学习笔记 (375)
  • 15. 如何编写代码才能使得效率高 (363)
  • 16. RMI使用手记(361)
  • 17. 在 10 分钟之内创建 Ruby Weblog(356)
  • 18. AJAX+jsp无刷新验证码实例(347)
  • 19. Linux下生成验证图片的问题说明(340)
  • 20. 80年代初出生的十大尴尬 (337)

评论排行榜

  • 1.  一张所有XP用户都感吃惊的图片(10)
  • 2. 做猪做狗都不做程序员(4)
  • 3. 机器猫全部剧场版的下载地址(3)
  • 4. AJAX+jsp无刷新验证码实例(1)
  • 5. 北京图盟科技有限公司(Mapabc.com)基础研发部诚聘英才(1)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 路边的石头-java