我想干嘛要改呢,倒是不太懂也是一个原因,其实很简单,我就是不想改,我觉得没有必要,于是今天还是自己写出来个例吧:
如果如下表格代码:
![]() |
改为后div code:

"??"的地方自己填上合适的数字就可以了.
最后附上css2.0工具代码的下载:http://www.csunet.cn/cxh/downview.asp?downl_ID=5
div的属性难记问题就解决了。。。
1:配置,链接access数据库是如此简单
2 : 模板引擎Smarty深入浅出介绍
Smarty技术是PHP的精髓所在,随着PHP版本的逐渐提高,原来的很多方法也许太过时了,下面我就针对最新的PHP5.1.1版本的使用,配置说说如何配置.
下面是一步步的来的,请注意:
1: 在官方下载模板库文件: http://smarty.php.net/download.php
下载了就解压,看见一个文件夹了,是个 smarty.x.x,打开,里面有个libs 文件夹,ok,注意这个东西就是我们要的.
2: 在你的网站目录下面,比方我的php网站IIS在物理硬盘的 d:/web/web/php下面,在这个文件夹下面建立:一个文件夹 test,然后我们把刚提到的 libs文件夹复制道test 文件夹下面.{ * 请看本文最后的注释 TIPS1}
3:在test 文件夹下面再建立4个文件夹;
cache
configs
templates
templates_c
4:建立文件 text.htm:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title><{$title}></title>
</head>
<body >
<{$content}>
</body>
</html>
保存在 templates 目录下面.
5:然后建立文件模板配置文件: config.php
<?php
include "../libs/Smarty.class.php";
$NowPathArray=explode("test",str_replace("\\","/",dirname(__FILE__))) ;
@define("root_path", $NowPathArray[0]);
@define('__SITE_ROOT', root_path."test");
$tpl = new Smarty();
$tpl->template_dir = __SITE_ROOT . "/templates/";
$tpl->compile_dir = __SITE_ROOT . "/templates_c/";
$tpl->config_dir = __SITE_ROOT . "/configs/";
$tpl->cache_dir = __SITE_ROOT . "/cache/";
$tpl->left_delimiter = '<{';
$tpl->right_delimiter = '}>';
?>
保存在主目录也就是 test下面.
6 :在test新建文件test.php文件,输入:
<?php
require "config.php";
$tpl->assign("title", "测试成功了,这是标题");
$tpl->assign("content", "这是内容");
$tpl->display('test.htm');
?>
7:在浏览器测试test.php显示为:
这是内容
恭喜,配置成功.否则,失败,再检查是不是按照我说的来的.
Tips1 :为了能在网站全局使用Smarty技术,我们可以修改PHP.inc里面的
<B>
; Windows: "\path1;\path2"
include_path = ".;c:\php\includes"
</B>
改为:
------------------->
; Windows: "\path1;\path2"
include_path = ".;c:\php\includes;d:\web\web\php\libs"
使用模板的时候,像前面一样的方式使用,不要
include "../libs/Smarty.class.php";
直接使用就行了的.
十分钟学会 xajax
learn xajax in 10 minutes(原文摘自xajaxproject 官方wiki)
译者按: xajax 最大的特点是他采用了xml response,这样我们可以用php来布置,处理异步传送数据之后,网页内容的更新。而这些操作其它的ajax 框架都是由js来完成的的。xajax 使我们只需要写一些php函数,就可以实现。
所有学好xajax的关健在于熟练掌握 xajaxresponse 类。
tutorials:learn xajax in 10 minutes
教程:十分钟学会 xajax
using xajax in a php script
一个使用的xajax的php脚本:
include the xajax class library:
调用xajax类库:
require_once("xajax.inc.php");
instantiate the xajax object:
实例化xajax对象
$xajax = new xajax();
register the names of the php functions you want to be able to call through xajax:
注册一个你想用xajax来调用的php函数名(与javascript中的函数名相对应 xajax_myfunction)
$xajax->registerfunction("myfunction");
write the php functions you have registered and use the xajaxresponse object to return xml commands from them:
编写那个你刚刚已经注册的php函数,并从中用 xajaxresponse 对象来返回xml指令集
function myfunction($arg)
{
// do some stuff based on $arg like query data from a database and
// put it into a variable like $newcontent
//对参数$arg做一些诸如:从数据库中获取数据后定义给$newcontent 变量的基本操作
// instantiate the xajaxresponse object
//实例化 xajaxresponse 对象
$objresponse = new xajaxresponse();
// add a command to the response to assign the innerhtml attribute of
// the element with id="someelementid" to whatever the new content is
// 在响应实例中添加一个命令,用来将id为someelementid的innerhtml元素属性
// 变为任何新的内容.
$objresponse->addassign("someelementid","innerhtml", $newcontent);
//return the xml response generated by the xajaxresponse object
//返回由 xajaxresponse 对象所生成的xml 响应
return $objresponse->getxml();
}
before your script sends any output, have xajax handle any requests:
在你脚本传送出任何东西前,xajax都要处理所有请求
$xajax->processrequests();
between your
在该页的和标签之间插入下列代码,使xajax实例可以自己生成所必需的js
printjavascript(); ?>
PS3安装Linux Fedora Core 6教程
下面进入正题。
[准备工作]
1,Linux Fedora Core 6 PPC版DVD ISO镜像(BT下载):
http://torrent.fedoraproject.org/torrents/Zod-dvd-ppc.torrent
下载完毕后刻盘备用。
2,下载Sony发布的Other OS安装程序:
http://www.playstation.com/ps3-openplatform/data/otheros.self
下载完毕后,找一个记忆棒,在里面建立/PS3/otheros/目录,把文件放进去。
3,下载Sony发布的Addon Packages CD:
http://dl.qj.net/PS3-Linux-Addon-Disc-PlayStation-3/pg/12/fid/11308/catid/514
下载完毕后刻盘。刻录完毕后,打开光盘的/kboot/目录,把里面的otheros.bld文件也复制到刚刚那个记忆棒的/PS3/otheros/目录中。光盘仍然备用。
4,USB键盘、鼠标准备。
[安装过程]
如果你的硬盘是买来的默认状态,请到Settings -> Format Utilities里面,格式化你的硬盘。
格式化之前请把你PS3硬盘上的东西备份一下,比如游戏存档、下载的游戏Demo、视频、MP3、照片什么的,不要格了之后再哭。
格式化时要注意选择给Linux系统分配空间,至于是给PS3留10G还是给Linux 10G就看你了。我选的是给Linux 10G。格式化完毕后会重起。
把刚刚准备好的记忆棒插入读卡器中(如果是20G版的,可能需要用U盘替代)。
正常启动到XMB界面,到Settings -> System Settings -> Install Other OS。系统会开始检测,并找到你记忆棒中储存的OtherOS安装程序。此时一路OK即可。
系统会运行otheros.self。此时继续安装。完成后系统重起。
重起之后,你就会发现PS3并没有启动到XMB界面,而是会进入一个上面有两个企鹅的图形界面。这个就是kboot命令行。在这里你就可以进行FC6的安装了。
此时,插入Linux Fedora Core 6的DVD安装盘。
在命令行输入install-fc sda,回车。此时安装程序开始运行。
首先,会提示插入FC6安装盘:
Please insert Fedore Core install DVD.
Is it OK? (y/n):
按Y回车。
下面会出现询问安装最大还是最小化的组件:
1) Fedora Core 6 minimum install
2) Fedora Core 6 maximum install
Select install system?
建议选择2,否则装出来的系统啥都干不了……按2,回车。
最后提示安装程序会删除Linux分区上的所有数据:
Caution!!. All data in in /dev/sda are removed.
IS it OK? (y/n)
按Y回车。
此时,安装正式开始。请把贱手拿开,不要按任何键。我第一次安装就是因为不小心多按了几下回车,导致在安装Addon Packages CD的时候直接跳过——直接后果是长达4小时的安装前功尽弃!!!
下面你可以该干吗干吗去了,4个小时,把Ace Combat X拿出来通一遍吧……或者拿WE10踢两三个杯赛什么的……
4个小时过去后,PS3会自动把FC6的光盘吐出,提示你插入Addon Packages CD。
Please insert a Addon Packages CD.
Is it OK? (y/n)
此时先插入光盘,等待10秒的样子让光驱准备好,然后按Y回车。
安装一通以后,会请你设置UNIX根密码什么的,按照提示输入即可。
最后会返回到kboot提示符。安装完成。此时可以输入reboot重起PS3。
重起之后,首先还是只能看到kboot的那个界面。甚至还会启动带kboot:命令提示符。但是注意上方有一条提示:commit interval 5 seconds。此时啥都不要动,静待5秒。kboot会自动结束,屏幕一黑,上方原来有两个企鹅的地方现在下面多出六个小企鹅,肚子上面写着 SPU…………这个就是代表认出PS3的CPU了吧。
一阵启动文字后再次黑屏,正式出现FC6自己的启动界面(就是会一项一项后面带绿色的[OK]的)。启动完毕后,会出现熟悉的登录提示:
localhost login:
在里面输root回车。
然后提示输入Password。
在里面输入正确的密码后回车。注:输入时系统不会显示星号代替你输入的字符,只管输就好了。
登录成功后即可到达提示符:
[root@localhost ~]#
下面要进入XWindow。
这个时候直接打startX基本上是直接花屏,因为系统不支持现在的显示模式。需要先打个命令,设置显示模式。命令详解:
ps3videomode: switch video mode dynamically
This command shows current video settings such as resolution, frame rate, color space, and so on, and switches them dynamically.
usage: ps3videomode [options] options: --help, -h print this message
--video, -v
--full, -f use full screen mode
--dither,-d use dither ON mode
Video mode ID:
0:automode
YUV 60Hz 1:480i 2:480p 3:720p 4:1080i 5:1080p
YUV 50Hz 6:576i 7:576p 8:720p 9:1080i 10:1080p
RGB 60Hz 33:480i 34:480p 35:720p 36:1080i 37:1080p
RGB 50Hz 38:576i 39:576p 40:720p 41:1080i 42:1080p
VESA 11:WXGA 12:SXGA 13:WUXGA
full screen mode:
Ping 探测是Windows系统中最常用的工具之一,它同时也是“网络流氓”寻找下手
目标的最常用的工具,当“网络流氓”一次发送的数据包大于或等于65532K时,系统
就很有可能死机,通过Ping 命令可以制造ICMP风暴,堵塞网络,所以Ping 命令对
于系统的危害不可小覤,那么我们在Windows 2000系统中,在没有防火墙保护的状态
下,如何屏蔽Ping探测,避免系统被“网络流氓”盯上呢?你可以通过以下方法来
实现。
步骤1 点击“网上邻居”,选择“属性”再指向要配置的“网卡”,再用右键选取
“属性”,再依次点“TCP/IP”->“高级”->“选项”->“TCP/IP筛选”。
步骤 2 接着在TCP端口编辑框中点击“只允许”,在下面加上需要开的端口,一般
打开80、20、21、25端口,应用于浏览网页,上传文件、收发邮件便行了。
步骤 3 编辑UDP端口,选择“全部不允许”,最右边的一个编辑框是定义IP协议过
滤的,我们选择只允许TCP协议通过,点“确定”关闭设置框。
上面设置了“只允许TCP协议通过”,只可惜微软在这里的IP协议过滤并不包括ICMP
协议 ,所以还需要在IP安全机制(IP Security)上着手。
步骤1 打开“本地安全策略”,选择“IP安全策略”,再指向“管理IP筛选器”,
在IP过滤规则:ICMP_ANY_IN,源地址选“任何IP ”,目标地址选“我的IP地址”(
本机),协议类型是“ICMP”,切换到“管理过滤器操作”,增加一个名为“Deny”
的操作,操作类型为“阻止”。
步骤2 接着再用右键选取本机的IP安全策略,选择“新建IP安全策略”,建立一个
名称为“ICMP Filter”的过滤器,通过增加过滤规则向导,我们把刚刚定义的
ICMP_ANY_IN过滤策略指定给“ICMP Filter”。
最后在操作选框中选择我们刚刚定义的Deny 操作,退出向导窗口,右击“ICMP
Filter”并启用它,现在任何地址进入的ICMP报文就都会被丢弃了。
在本地安全策略里启用新的过滤策略后,就会有一个关闭所有进入ICMP报文的过滤
策略和丢弃所有报文的过滤操作了。通过此番设置后,您就再也不用担心“网络流
氓”对系统进行骚扰了。
第二种方法:使用下面的软件。
Steganos Internet Anonym Pro 6
这是一套功能强大的网路身份隐藏工具软件,所以请使用在正当的防卫用途。我们
在网路上浏览网页或是下载各式各样的文件的同时,有成千上万的人使用监视用或
是入侵用的软件正在虎视眈眈的预备攻击我们,而这套软件就是用来防止如此攻击
或是窥视的工具软件,你可以透过这套软件很简单的隐藏自已的身份(ip)或是将我
们所经过的网站讯息、Cookkies、暂存文件都消除,所以你可以如有网路隐形人一
般的出入所有的网路,而不留痕迹
经过试用发现,自己的ip是1秒钟变化一次,哈哈,用显示ip的网站测试,我一会在
英国,一会儿在加拿大,真是好用啊!!
安装注意:安装后不要急于测试,先关闭所有的浏览器,然后重新打开。如果还没
有效果,那么重新启动,保证见效。
注册码:123-114-115-107-054
JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握 JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。
1、 JDK的下载和安装
JDK又叫做J2SE (Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,http://java.sun.com/j2se/downloads.html。
下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。新建环境变量CLASSPATH,增加路径.;C:\j2sdk1.4.2\lib\dt.jar;C:\j2sdk1.4.2\lib\tools.jar。这样JDK就安装好了。
2、 JDK的命令工具
JDK的最重要命令行工具:
java: 启动JVM执行class
javac: Java编译器
jar: Java打包工具
javadoc: Java文档生成器
这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。
二、 JDK Documentation
Documentation 在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。
三、 Java应用的运行环境
Java的应用可以简单分为以下几个方面:
1、 Java的桌面应用
桌面应用一般仅仅需要JRE的支持就足够了。
2、 Java Web应用
Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为三层:
Browser层:浏览器显示用户页面
Web层:运行Servlet/JSP
DB层:后端数据库,向Java程序提供数据访问服务
3、 Java企业级应用
企业级应用比较复杂,可以扩展到n层,最简单情况会分为4层:
Browser层:浏览器显示用户页面
Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互
Web层:运行Servlet/JSP
EJB层:运行EJB,完成业务逻辑运算
DB层:后端数据库,向Java程序提供数据访问服务
4、 Java嵌入式应用
Java嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从Sun下载J2ME开发包,J2ME包含了嵌入式设备专用虚拟机KVM,和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。
书籍篇
学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。
很多人学习Java是从《Thinking in Java》这本书入手的,但是这本书是不适合初学者的。正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。
对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《Thinking in Java》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。
在所有的Java书籍当中,其实真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation 里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍 Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过 Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外,Documentation也是编程必备的手册。有了 Documentation,什么其他的书籍都不需要了。
过程篇
学习Java的第一步是安装好JDK,写一个Hello World程序。其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。
第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下。《Thinking in Java》这本书上面是讲了这些概念的。
第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。可以多看看《Thinking in Java》这本书,对面向对象的讲解非常透彻。
第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个。但是真正对于我们来说最核心的只有4个,分别是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;
这四个包的学习,每个包的学习都可以写成一本厚厚的教材。比较好的学习方法是这样的:
首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。
对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。你们要了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That′s all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查 Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住 3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。
第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步,Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些:
java.text.*;
java.net.*;
javax.naming.*;
这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。
方法篇
Java 作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。
举个例子,我们都编过Hello World程序:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不这样写?想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的 public取掉,再试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个 String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。
虽然这样比较费时间,不过一个例子程序这样反复破坏几次之后。就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。
另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面 Copy & Paste ,Search & Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。
所以其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,强烈推荐你看看JDK基础类库的Java 源代码。在JDK安装目录下面会有一个src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下 Sun是怎么写Java程序的,规范是什么样子的。打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。
资源篇
1、 http://java.sun.com/ ;(英文)
Sun的Java网站,是一个应该经常去看的地方。不用多说。
2、 http://www-900.ibm.com/developerWorks/cn/ ;
IBM的developerWorks网站,英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站,也是Web Services,Java,Linux极好的网站。强烈推荐!!!
3、 http://www.java-cn.com/ ;(中文)
JAVA 中文站,目前国内资料最全、会员最多的JAVA技术网站,人气极高。有《JAVA电子书库》、《JAVA视频库》(国内唯一)、《JAVA技术文摘库》、《JAVA源代码库》、《JAVA工具库》、《招聘求职广场》等主要栏目,还有一些专家栏目。目前会员有5万多,VIP会员近1000人。无论是菜鸟还是老鸟,都能在此网站中找到自己所需要的东东!! 最强烈推荐!!!!!!
4、 http://www.javaworld.com/ ;(英文)
关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用,这里比较好。
11、 http://sourceforge.net/ ;
SourgeForge是一个开放源代码软件的大本营,其中也有非常非常丰富的Java的开放源代码的著名的软件。
同学们,这是我写的一个计算器的源代码,希望可以给你们以启迪。
另外,这仅仅是一个参考,还有很大的提升空间,具体怎么提升请自己仔细思考后把它改写出来,用EMAIL的形式发给我。
一个优秀的程序员就是通过不断的读别人写的经典代码,重写别人的代码(相当于小学时候默写课文那样),然后修改和优化别人的代码,并能凭自己的能力独立(也就是说,不拘泥于别人的思想和套路,而非不跟别人协作,一个懂得协作并非常默契的团队才是程序员发挥自己个人能力的天堂,个人英雄主义是不适用于程序开发的)写出自己的优秀代码。
好了,不罗嗦了,自己研究代码吧:
Calculator.java
//用于算术运算的抽象类,由ComputeCalculator类进行继承
public abstract class Calculator {
public Calculator() {
}
public abstract void add(); //加法方法
public abstract void minus(); //减法方法
public abstract void multiply(); //乘法方法
public abstract void divide(); //除法方法
public abstract void paramPass(char param); //算术符号
}
ComputeCalculator.java
//Calculator的子类,用于实现具体算法
public class ComputeCalculator extends Calculator {
public double ary0; //定义一个变量用于第一个参数
public double ary2; //定义一个变量用于第二个参数
public char ary1; //定义一个变量用于运算符号
public ComputeCalculator(double DoubleNum1, double DoubleNum2) {
this.ary0 = DoubleNum1;
this.ary2 = DoubleNum2;
}
public void paramPass(char param) {
this.ary1 = param;
switch (ary1) { //运算符号合法性的判断,如果合法则进行相应的运算
case '+': //加法运算
add();
break;
case '-': //减法运算
minus();
break;
case '@': //乘法运算
multiply();
break;
case '/': //除法运算
divide();
break;
default: //运算符号不合法
System.out.println("您输入的运算符号错误,请将第二个参数改为+、-、@、/四种运算符号中的一种!");
}
}
public void add() { //加法运算方法
System.out.println("计算结果为:" + ary0 + " + " + ary2 + " = " +
(ary0 + ary2));
}
public void minus() { //减法运算方法
System.out.println("计算结果为:" + ary0 + " - " + ary2 + " = " +
(ary0 - ary2));
}
public void multiply() { //乘法运算方法
System.out.println("计算结果为:" + ary0 + " * " + ary2 + " = " +
(ary0 * ary2));
}
public void divide() { //除法运算方法
if (ary2 == 0) { //除数为0的情况
System.out.println("被除数为0,无法进行计算");
} else { //正常的除法运算
System.out.println("计算结果为:" + ary0 + " / " + ary2 + " = " +
(ary0 / ary2));
}
}
}
Js.java
//main()方法所在类,程序入口点,也是对前面两个类的调用和逻辑处理
public class Js {
public Js() {
}
public static void main(String[] args) {
try { //异常处理
double a; //定义一个变量用于接收第一个参数
double c; //定义一个变量用于接收第三个参数
char ch[] = (args[1]).toCharArray(); //定义一个变量用于接收第二个参数
Calculator compute ; //调用类,以进行计算
a = Double.parseDouble(args[0]); //接收第一个参数,并进行数据类型转换
if (a >= Double.MIN_VALUE && a <= Double.MAX_VALUE) { //判断参数内容是否合法
c = Double.parseDouble(args[2]); //接受第三个参数,并进行数据类型转换
if (c >= Double.MIN_VALUE && c <= Double.MAX_VALUE) { //判断参数内容是否合法
compute = new ComputeCalculator(a, c);
compute.paramPass(ch[0]); //对第二个参数进行合法性判断
} else { //如果第三个参数不合法,则提示错误
System.out.println("您输入的格式错误,请将第三个参数改为阿拉伯数字");
}
} else { //如果第一个参数不合法,则提示错误
System.out.println("您输入的格式错误,请将第一个参数改为阿拉伯数字");
}
} catch (Exception e) { //处理异常
System.out.println("第1个参数应该为0到9之间的阿拉伯数字");
System.out.println("第2个参数应该为运算符号(+、-、@、/)");
System.out.println("第3个参数应该为0到9之间的阿拉伯数字");
System.out.println("请重新输入数据并计算");
}
}
}
/*转贴请保留以下信息*/
作者:张杰
URL:http://spaces.msn.com/members/newbdez33/
http://www.phpboom.com/
由于工作需要,需要使用PHP实现对网站内大量数量进行全文检索,
而且目前最流行的全文检索的搜索引擎库就是Lucene了,
它是Apache Jakarta的一个子项目,并且提供了简单实用的API,
用这些API,就可以对任何基本文本的数据(包括数据库)进行全文检索。
因为PHP本身就支持调用外部Java类,所以先用Java写了一个类,
这个类通过调用Lucene的API,实现了两个方法:
* public String createIndex(String indexDir_path,String dataDir_path)
* public String searchword(String ss,String index_path)
其中createIndex是创建索引方法,
传入了两个参数分别是indexDir_path(索引文件的目录),dataDir_path(被索引的文件目录),返回被索引的文件列表字符串,
另一个是searchword,通过传入的关键字参数(ss)对索引进行检索,index_path就是索引文件的目录。返回所有检索到的文件。
这里是源代码,很简单,大家可以参考一下:TxtFileIndexer.java
而PHP程序就调用这两个方法,实现对Lucene的调用,从而达到全文检索的目的。
PHP的调用方法如下:
先创建一个我们写的TxtFileIndexer类的实例,
$tf = new Java('TestLucene.TxtFileIndexer');
然后就按正常PHP类的调用方法的方式进行调用,首先创建索引:
$data_path = "F:/test/php_lucene/htdocs/data/manual"; //定义被索引内容的目录
$index_path = "F:/test/php_lucene/htdocs/data/search"; //定义生成的索引文件存放目录
$s = $tf->createIndex($index_path,$data_path); //调用Java类的方法
print $s; //打印返回的结果
这次再试试检索:
$index_path = "F:/test/php_lucene/htdocs/data/search"; //定义生成的索引文件存放目录
$s = $tf->searchword("here is keyword for search",$index_path);
print $s;
另外要注意Java类的路径,可以在PHP里设置
java_require("F:/test/php_lucene/htdocs/lib/"); //这是个例子,我的类和Lucene都放到这个目录下
这样就可以了,是不是很简单。
PHP源代码:test.php
接下来我把环境配置说一下,
首先需要有Java SDK,是必须的,我使用的是1.4.2版的,其它版本应该也没问题。
PHP5,试过PHP4,应该可以。
由于PHP5带的Java扩展没调通,并且以前用过调用Java效率很低,很慢,所以使用了 Php/Java Bridge 这个项目。
1.下载JavaBridge
URL:http://sourceforge.net/projects/php-java-bridge/
目前版本是
php-java-bridge_3.0.8_j2ee.zip
解包后把
JavaBridge\WEB-INF\cgi\java-x86-windows.dll
JavaBridge\WEB-INF\lib\JavaBridge.jar
复制到 c:\php\ext 目录下,并把
java-x86-windows.dll 改名为 php_java.dll
2.修改php.ini(例)
extension=php_java.dll
[Java]
java.class.path = "C:\php\ext\JavaBridge.jar;F:\test\php_lucene\htdocs"
java.java_home = "C:\j2sdk1.4.2_10"
java.library.path = "c:\php\ext;F:\test\php_lucene\htdocs"
3.重启Apache即可。
4.可以找一些文件进行索引
在test.php里可以修改索引文件和数据文件的路径。
TxtFileIndexer.java的37行限制了只索引html后缀的文件,有需要也可以修改。
根据目前的情况(JavaBridge支持Linux和Freebsd),完全可以在
linux或freebsd/apache2/php4/lucene/JavaBridge
环境下运行。
本文章可能会随时更新,另外这里可以访问:
用PHP调用Lucene包来实现全文检索
我的MSN是 z33
欢迎技术探讨:)
package test;
public class Vector{
public Vector(){
System.out.println(
"my.Vector");
}
}
在C:\DOC下有一个TEST目录,生成Vector.class 。Vector.java和Vector.class都置于TEST
目录内。
然后我再编译下面的语句:
import test.*;
public class LibTest{
public static void main(String[] args){
Vector v=new Vector();
}
}
则出现如现错误:
C:\DOC\TEST javac LibTest.java
LibTest.java:5: cannot access Vector
bad class file: .\Vector.class
class file contains wrong class: test.Vector
Please remove or make sure it appears in the correct subdirectory of the classpa
th.
Vector l=new Vector();
^
1 error
然而我把import test.*;改为import.Vector;则能成功编译。望各位大虾帮忙解决。
在CLASSPATH中加上.;.代表当前目录,如果不加,编译器在编译LibTest.java时,找test包就不会在当前目录内找,因为找不到,加上就可以了。
加上也不行啊。早就加了。就是不行。
classpath=.;C:\DOC
本人解决方法:
注意目录结构
作为package, test.java 应放C;\doc\test目录中
Libtest.java放在c:\doc下,
classpath设为".;c:\doc\;"
然后
1. c:\doc>javac test\*.java
2. c:\doc>javac *.java
3. c:\doc>java Libtest //ok
D:\Javawork\jt>javac LibTest.java
LibTest.java:4: cannot access Vector
bad class file: .\Vector.java
file does not contain class Vector
Please remove or make sure it appears in the correct subdirectory of the classpa
th.
Vector v = new Vector();
^
1 error
(你的文件没有问题,主要是你的classpath里面有了test目录的java文件。。。)
出现这个问题,你要注意各个文件放的目录,千万不要在不同的目录里面里面有重复的文件。。。。
千万要注意编译顺序啊。。。
不知道说清楚了没有。。。。。要是看到我操作就好了。,。

testme.html
code:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title>
ajax
</title>
<script language="javascript">
function createRequest(){
if(typeof XMLHttpRequest!="undefined") {
return new XMLHttpRequest();
}else if(typeof ActiveXObject!="undefined"){
var xmlHttp_ver = false;
var xmlHttp_vers = ["MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp","Microsoft.XmlHttp"];
if(!xmlHttp_ver){
for(var i=0;i<xmlHttp_vers.length;i++){
try{
new ActiveXObject(xmlHttp_vers[i]);
xmlHttp_ver = xmlHttp_vers[i];
break;
}catch(oError){;}
}
}
if(xmlHttp_ver){
return new ActiveXObject(xmlHttp_ver);
}else{
throw new Error("Could not create XML HTTP Request.");
}
}else{
throw new Error("Your browser doesn't support an XML HTTP Request.");
}
}
var xmlHttp;
function sendPostRequest()
{
xmlHttp = createRequest();
var shownum=document.getElementById("shownum").value;// html页面中一个id为shownum的input表单
var url = "http://localhost/phpwork/phpajaxtest.php";//要发送到的URL
var queryString = "shownum" + "=" + shownum;
//向服务端发送请求
xmlHttp.open("post", url, true);//这里的第三个参数为true为异步方式处理
xmlHttp.onreadystatechange = showData;//异步方式处理,当状态改变时会调用onreadystatechange属性指定的回调函数showData
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");//这一句是用post方法发送的时候必须写的
xmlHttp.send(queryString);//发送你构建成的数据,如果为“get”方法时,这里可以写成xmlHttp.send(NULL);
}
function showData()
{
var msg=document.getElementById("status");
//第4步
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
//只有当readyState为4并且status为200时,才表示符合要求
//下面这一句话,就相当于上面说的第5步,处理返回的结果
msg.innerHTML = xmlHttp.responseText;
}
}
else
{
switch(xmlHttp.readyState)
{
case 0:
msg.innerHTML="未初始化...";
break;
case 1:
msg.innerHTML="加载中...";
break;
case 2:
msg.innerHTML="连接完成...";
break;
case 3:
msg.innerHTML="交换数据...";
break;
default:
break;
}
}
}
</script>
</head>
<body>
<div>要发送的数据:<input name="shownum" type="text" id="shownum" value="root">
<input type="button" name="search" value="发送" onClick="sendPostRequest()">
(输入root,xdy108)</div>
<div id="status"></div>
</body>
</html>
phpajaxtest.php
code:
<?php require_once('Connections/conn.php'); ?>
<?php
$colname_Recordset1 = "-1";
if (isset($_POST['shownum'])) {
$colname_Recordset1 = (get_magic_quotes_gpc()) ? $_POST['shownum'] : addslashes($_POST['shownum']);
}
mysql_select_db($database_conn, $conn);
$query_Recordset1 = sprintf("SELECT `Host`, `User`, Password, Select_priv FROM `user` WHERE `User` = '%s'", $colname_Recordset1);
$Recordset1 = mysql_query($query_Recordset1, $conn) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body>
<table border="1">
<tr>
<td>Host</td>
<td>User</td>
<td>Password</td>
<td>Select_priv</td>
</tr>
<?php do { ?>
<tr>
<td><?php echo $row_Recordset1['Host']; ?></td>
<td><?php echo $row_Recordset1['User']; ?></td>
<td><?php echo $row_Recordset1['Password']; ?></td>
<td><?php echo $row_Recordset1['Select_priv']; ?></td>
</tr>
<?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
</table>
</body>
</html>
<?php
mysql_free_result($Recordset1);
?>
conn.php
code:
<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_conn = "localhost";
$database_conn = "mysql";
$username_conn = "root";
$password_conn = "12345";
$conn = mysql_pconnect($hostname_conn, $username_conn, $password_conn) or trigger_error(mysql_error(),E_USER_ERROR);
?>
user.sql
code:
# phpMyAdmin SQL Dump
# version 2.5.7
# http://www.phpmyadmin.net
#
# 主机: localhost
# 生成日期: 2006 年 12 月 13 日 05:58
# 服务器版本: 5.0.19
# PHP 版本: 5.1.2
#
# 数据库 : `mysql`
#
# --------------------------------------------------------
#
# 表的结构 `user`
#
CREATE TABLE `user` (
`Host` char(60) collate utf8_bin NOT NULL default '',
`User` char(16) collate utf8_bin NOT NULL default '',
`Password` char(41) character set latin1 collate latin1_bin NOT NULL default '',
`Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Reload_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Shutdown_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Process_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`File_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`References_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Show_db_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Super_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Repl_slave_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Repl_client_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`Create_user_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
`ssl_type` enum('','ANY','X509','SPECIFIED') character set utf8 NOT NULL default '',
`ssl_cipher` blob NOT NULL,
`x509_issuer` blob NOT NULL,
`x509_subject` blob NOT NULL,
`max_questions` int(11) unsigned NOT NULL default '0',
`max_updates` int(11) unsigned NOT NULL default '0',
`max_connections` int(11) unsigned NOT NULL default '0',
`max_user_connections` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges';
#
# 导出表中的数据 `user`
#
INSERT INTO `user` VALUES ('localhost', 'root', '*00A51F3F48415C7D4E8908980D443C29C69B60C9', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', 0, 0, 0, 0);
INSERT INTO `user` VALUES ('localhost', 'xdy108', '001002', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', 0, 0, 0, 0);
发现输入xdy108,root的时候能无刷新返回,否则如xdy,ro等就会无返回结果,其原因是用了:WHERE `User` = '%s'", $colname_Recordset1);没有用like.
如下图:

code:
import java.sql.*;
public class MysqlConn {
static{
try {
Class .forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.print("Sucess loading JDBC_ODBC Bridge Drive...");
}
catch (Exception e){
System.out.print("Erro loading JDBC-ODBC Bridge Driver...\n");
e.printStackTrace();
}
}
public static void main(String[] args) {
try{
Connection con1=DriverManager.getConnection("jdbc:odbc:choa_samples","root","12345");
}
catch(SQLException e){
e.printStackTrace();
}
}
}
Script: /blog/index.php
SQL: SELECT * FROM `boblog_blogs` WHERE `property`<>'3' ORDER BY `sticky`DESC, `pubtime` DESC LIMIT 0,
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Errno.: 1064
搞得我郁闷死了,竟然发现有人说是boblog_blogs的表出现错误,我把所有的表都修复了,然后还是不对,然后再用google搜索,然后我发现好像不行,访问不了,然后我就用baidu看了一下,发现使我感到很郁闷。。。
饭后想不通,然后继续baidu,最后我发现bo-blog里面有如下问题。。。
解决方法也很简单:
将安装包内install\copy下的mod_config文件上传覆盖FTP里/data目录下的同名文件即可恢复,(最好是将mod_config.php del掉然后呢,就弄ftp上去,我是这样弄得。。。)
[ AJAX介绍 ]
Ajax是使用客户端脚本与Web服务器交换数据的Web应用开发方法。Web页面不用打断交互流程进行重新加裁,就可以动态地更新。使用Ajax,用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面。
异步JavaScript和XML(AJAX)不是什么新技术,而是使用几种现有技术——包括级联样式表(CSS)、JavaScript、XHTML、XML和可扩展样式语言转换(XSLT),开发外观及操作类似桌面软件的Web应用软件。
[ AJAX执行原理 ]
一个Ajax交互从一个称为XMLHttpRequest的JavaScript对象开始。如同名字所暗示的,它允许一个客户端脚本来执行HTTP请求,并且将会解析一个XML格式的服务器响应。Ajax处理过程中的第一步是创建一个XMLHttpRequest实例。使用HTTP方法(GET或POST)来处理请求,并将目标URL设置到XMLHttpRequest对象上。

转自:
http://gnu.freehostingguru.com/gpl/
引用:
声明!
这是一份 GNU 通用公共授权非正式的中文翻译。它并非由自由软件基金会所发表,亦非使用 GNU 通用公共授权的软件的法定发布条款─只有 GNU 通用公共授权英文原文的版本始具有此等效力。然而,我们希望这份翻译能帮助中文的使用者更了解 GNU 通用公共授权。
This is an unofficial translation of the GNU General Public License into Chinese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL--only the original English text of the GNU GPL does that. However, we hope that this translation will help Chinese speakers understand the GNU GPL better.
GNU 通用公共授权
第二版, 1991年6月
著作权所有 (C) 1989,1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
允许每个人复制和发布本授权文件的完整副本,
但不允许对它进行任何修改。
导言
大多数软件授权声明是设计用以剥夺您共享与修改软件的自由。相反地,GNU通用公共授权力图保证您分享与修改自由软件的自由-确保软件对所有的使用者都是自由的。通用公共授权适用于大多数自由软件基金会的软件,以及任何作者指定使用本授权的其他软件。(有些自由软件基金会的软件,则适用GNU函式库通用公共授权规定。)您也可以让您的软件适用本授权规定。
当我们在谈论自由软件时,我们所指的是自由,而不是价格。我们的通用公共授权是设计用以确保使您拥有发布自由软件备份的自由(以及您可以决定此一服务是否收费),确保您能收到源码或者在您需要时能得到它,确保您能变更软件或将它的一部分用于新的自由软件;并且确保您知道您可以做上述的这些事情。
为了保障您的权利,我们需要作出限制:禁止任何人否认您上述的权利,或者要求您放弃这些权利。如果您发布软件的副本,或者对之加以修改,这些限制就转化成为您的责任。
例如,假如您发布此类程序的副本,无论是免费或收取费用,您必须将您所享有的一切权利给予收受者。您也必须确保他们也能收到或得到原始程序码。而且您必须向他们展示这些条款的內容,使他们知到他们所享有的权利。
我们采取两项措施來保护您的权利:(1)以著作权保护软件,以及(2)提供您本授权,赋与您复制、发布并且/或者修改软件的法律许可。
同时,为了保护作者与我们(按:指自由软件基金会),我们想要确定每个人都明白,自由软件是沒有担保责任的。如果软件被他人修改并加以传播,我们需要其收受者知道,他们所得到的并非原始版本,因此由他人所引出的任何问题对原作者的声誉将不会有任何的影响。
最后,所有自由软件不断地受到软件专利的威胁。我们希望能避免自由软件的再发布者以个人名义取得专利授权而使程序专有化的风险。为了防止上述的情事发生,我们在此明确声明:任何专利都必须为了每个人的自由使用而核准,否则就不应授与专利。
以下是有关复制、发布及修改的明确条款及条件。
复制、发布与修改的条款与条件
0. 凡著作权人在其程序或其他著作中声明,该程序或著作会在通用公共授权条款下发布,本授权对其均有适用。以下所称的"程序",是指任何一种适用通用公共授权的程序或著作;并且一个"基于本程序的著作",则指本程序或任何基于著作权法所产生的衍生著作,换言之,是指包含本程序全部或一部的著作,不论是完整的或经过修改的程序,以及(或)翻译成其他语言的程序(以下"修改"一词包括但不限于翻译行为在內)。被授权人则称为"您"。
本授权不适用于复制、发布与修改以外的行为;这些行为不在本授权范围内。执行本程序的行为并不受限制,而本程序的输出只有在其內容构成基于本程序所生的著作(而非只是因为执行本程序所造成)时,始受本授权拘束。至于程序的输出內容是否构成本程序的衍生著作,则取决于本程序的具体用途。
1. 您可以对所收受的本程序源代码,无论以何种媒介,复制与发布其完整的复制物,然而您必须符合以下要件:以显著及适当的方式在每一份复制物上发布适当的著作权标示及无担保声明;维持所有有关本授权以及无担保声明的原貌;并将本授权的副本连同本程序一起交付予其他任何一位本程序的收受者。
您可以对让与复制物的实际行为收取一定的费用,您也可以自由决定是否提供担保以作为对价的交换。
2. 您可以修改本程序的一个或数个复制物或者本程序的任何部份,以此形成基于本程序所生的著作,并依前述第一条规定,复制与发布此一修改过的程序或著作,但您必须符合以下要件:
(a) 您必须在所修改的挡案上附加显著的标示,阐明您修改过这些挡案,以及修改日期。
(b) 您必须就您所发布或发行的著作,无论是包含本程序全部或一部的著作,或者是自本程序或其任何部份所衍生的著作,整体授权所有第三人依本授权规定使用,且不得因此项授权行为而收取任何费用。
(c) 若经过修改的程序在执行时通常以交互方式读取命令时,您必须在最常被使用的方式下,于开始进入这种交互式使用时,列印或展示以下宣告:适当的著作权标示及无担保声明(或者声明您提供担保)、使用者可以依这些条件再发布此程序,以及告知使用者如何浏览本授权的副本。(例外:若本程序本身是以交互的方式执行,然而通常却不会列印该宣告时,则您基于本程序所生的著作便无需列印该宣告。)
这些要求对修改过的著作是整体适用的。倘著作中可识別的一部份并非衍生自本程序,并且可以合理地认为是一独立的、个別的著作,则当您将其作为个別著作加以发布时,本授权及其条款将不适用于该部分。然而当您将上述部分,作为基于本程序所生著作的一部而发布时,整个著作的发布必须符合本授权条款的规定,而本授权对于其他被授权人所为的许可及于著作整体。
因此,本条规定的意图不在于主张或剥夺您对于完全由您所完成著作的权利;应该說,本条规定意在行使对基于程序所生的之衍生著作或集合著作发布行为的控制权。
此外,非基于本程序所生的其他著作与本程序(或基于本程序所生的著作)在同一储存或发布的媒介上的单纯聚集行为,并不会使该著作因此受本授权条款约束。
3. 您可以依前述第一、二条规定,复制与发布本程序(或第二条所述基于本程序所产生的著作)的目的码或可执行形式,但您必须符合以下要件:
(a) 附上完整、相对应的机器可判读源码,而这些源码必须依前述第一、二条规定在经常用以作为软件交换的媒介物上发布;或
(b) 附上至少三年有效的书面报价文件,提供任何第三人在支付不超过实际发布源码所需成本的费用下,取得相同源码的完整机器可读复制物,并依前述第一、二条规定在经常用以作为软件交换的媒介物上发布该复制物;或
(c) 附上您所收受有关发布相同源码的报价资讯。(本项选择仅在非赢利发布、且仅在您依前述b项方式自该书面报价文件收受程序目的码或可执行形式时,始有适用。)
著作的源码,是指对著作进行修改时适用的形式。对于一个可执行的著作而言,完整的源码是指著作中所包含所有模组的全部源码,加上相关介面的定义挡,还加上用以控制该著作编译与安裝的描述。然而,特別的例外情况是,所发布的源码并不需包含任何通常会随著所执行作业系统的主要组成部分(编译器、核心等等)而发布的软件(无论以源码或二进位格式),除非该部分本身即附加在可执行程序中。
若可执行码或目的码的发布方式,是以指定的地点提供存取位置供人复制,则提供可自相同地点复制源码的使用机会,视同对于源码的发布,然而第三人并不因此而负有将目的码连同源码一起复制的义务。
4. 除本授权所明示的方式外,您不得对本程序加以复制、修改、再授权或发布。任何试图以其他方式进行复制、修改、再授权或者发布本程序的行为均为无效,并且将自动终止您基于本授权所得享有的权利。然而,依本授权规定自您手中收受复制物或权利之人,只要遵守本授权规定,他们所获得的授权并不会因此终止。
5. 因为您并未在本授权上签名,所以您无须接受本授权。然而,除此之外您別无其他修改或发布本程序或其衍生著作的授权许可。若您不接受本授权,则这些行为在法律上都是被禁止的。因此,藉由对本程序(或任何基于本程序所生的著作)的修改或发布行为,您表示了对于本授权的接受,以及接受所有关于复制、发布或修改本程序或基于本程序所生著作的条款与条件。
6. 每当您再发布本程序(或任何基于本程序所生的著作)时,收受者即自动获得原授权人所授予依本授权条款与条件复制、发布或修改本程序的权利。您不得就本授权所赋予收受者行使的权利附加任何进一步的限制。您对于第三人是否履行本授权一事,无须负责。
7. 若法院判决、专利侵权主张或者其他任何理由(不限于专利争议)的结果,使得加诸于您的条件(无论是由法院命令、协议书或其他方式造成)与本授权规定有所冲突,他们并不免除您对于本授权规定的遵守。若您无法同时符合依本授权所生义务及其他相关义务而进行发布,那么其结果便是您不得发布该程序。例如,若专利授权不允许其他人直接或间接取得复制物,通过您以免付权利金的方式再发布该程序,您唯一能同时滿足该义务及本授权的方式就是徹底避免进行该程序的发布。
若本条任一部份在特殊情况下被认定无效或无法执行时,本条其余部分仍应适用,且本条全部于其他情况下仍应适用。
本条的目的并不在诱使您侵害专利或其他財产权的权利主张,或就此类主张的有效性加以争执;本条的唯一目的,是在保障藉由公共授权惯例所执行自由软件发布系统的完整性。许多人信赖该系统一贯使用的应用程序,而对经由此系统发布的大量软件有相当多的贡献;作者/贡献者有权决定他或她是否希望经由其他的系统发布软件,而被授权人则无该种选择权。
本条的用意在于将本授权其他不确定的部分徹底解释清楚。
8. 若因为专利或享有著作权保护的介面问题,而使得本程序的发布与/或使用局限于某些国家时,则将本程序置于本授权规范之下的原著作权人得增列明确的发布地区限制条款,将这些国家排除在外,而使发布的许可只限在未受排除的国家之內或之中。在该等情况下,该限制条款如同以书面方式订定于本授权內容中,而成为本授权的条款。
9. 自由软件基金会得随时发表通用公共授权的修正版与/或新版本。新版本在精神上将近似于目前的版本,然而在细节上或所不同以因应新的问题或状况。
每一个版本都有个別的版本号码。若本程序指定有授权版本号码,表示其适用该版本或是"任何新版本"时,您可以选择遵循该版本或任何由自由软件基金会日后所发表新版本的条款与条件。若本程序并未指定授权版本号码时,您可以选择任一自由软件基金会所发表的版本。
10. 若您想将部分本程序纳入其他自由程序,而其发布的条件有所不同时,请写信取得作者的许可。若为自由软件基金会享有著作权的软件,请写信至自由软件基金会;我们有时会以例外方式予以处理。我们的决定取决于两项目标:确保我们自由软件的所有衍生著作均维持在自由的状态,并广泛地促进软件的分享与再利用。
无担保声明
11. 由于本程序是无偿授权,因此在法律许可范围內,本授权对本程序并不负担保责任。非经书面声明,著作权人与/或其他提供程序之人,无论明示或默许,均是依「现况」提供本程序而并无任何形式的担保责任,其包括但不限于,就适售性以及特定目的的适用性为默示性担保。有关本程序品质与效能的全部风险均由您承担。如本程序被证明有瑕疵,您应承担所有服务、修复或改正的费用。
12. 非经法律要求或书面同意,任何著作权人或任何可能依前述方式修改与/或发布本程序者,对于您因为使用或不能使用本程序所造成的一般性、特殊性、意外性或间接性损失,不负任何责任(包括但不限于,资料损失,资料执行不精确,或应由您或第三人承担的损失,或本程序无法与其他程序运作等),即便前述的著作权人或其他人已被告知该等损失的可能性时,也是一样。
-条文结束-
您的新程序该如何采用这些条款?
如果您开发了一个新程序,并且希望能够让它尽可能地被大众使用,达成此目的的最好方式就是让它成为自由软件,任何人依这些条款规定都能就该软件再为发布及修改。
为了做到这一点,请将以下声明附加到程序上。最安全的作法,是将声明放在每份源码挡案的起始处,以有效传达无担保责任的讯息;且每份挡案至少应有「著作权」列以及本份声明全文位置的提示。
用一行描述程序的名称与其用途简述
著作权所有(C) 〈年份〉〈作者姓名〉
本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本。
本程序是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定目的适用性所为的默示性担保。详情请参照GNU通用公共授权。
您应已收到附随于本程序的GNU通用公共授权的副本;如果没有,请写信至自由软件基金会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA。
同时附上如何以电子及书面信件与您联系的资料。
若程序是以交互方式运作时,请在交互式模式开始时,输出简短提示如下:
Gnomovision 第69版,著作权所有 (c) 年份 作者姓名
Gnomovision不负担保责任,欲知详情请键入'show w'。这是一个自由软件,欢迎您在特定条件下再发布本程序;欲知详情请键入'show c'。
所假设的指令'show w'与'show c'应显示通用公共授权的相对应条款。当然,您可以使用'show w'与'show c'以外的指令名称;甚至以鼠标键击或选菜单方式进行-只要是合于您程序需要的方式都可以。
如有需要,您亦应取得您的雇主(若您的工作为程序设计師)或学校就本程序所签署的「著作权放弃承諾书」。其范例如下,您只要修改姓名即可:
Yoyodyne公司,茲此放弃James Hacker所写之'Gnomovision'程序(该程序产出编译器所需资讯)所有的著作权利益。
〈Ty Coon公司签章〉,1989年四月一日
Ty Coon公司,副总裁
本通用公共授权并不允许您将本程序并入专有程序中。若您的程序是一子程序函数库时,您可能认为允许专有应用程序与该函式库相连结会更有帮助。若这是您所想做的,请使用GNU函式库通用公共授权代替本授权。
http://www.phpx.com/happy/thread-122499-1-1.html上有很多讨论
1。理论
在普通HTTP上,一般表单中的密码都是以明文方式传到服务器进行处理的。这无疑给了坏人以可乘之机!这里我们就说说怎么传输密码才是安全的!
与其传输密码本身,到不如传输其加密后的形式。MD5是个不错的选择。第一,不同的资源几乎不可能生成相同的MD5摘要,第二,MD5的编码方式是不可逆推的。有了这些特性,我们就可以让MD5摘要公开的在Internet上传输,而不必担心密码被坏人知道。然后在服务端也将密码通过同样的方式加密,最后比较这两个字符串。
然而,我们不能为了登陆而将密码md5后直接通过Internet传输,因为坏人虽然不会知道我们的密码,但肯定会知道这个特殊的字符串可以授权他们访问我们的网站!
这就是公匙和私匙要解决的问题,首先由服务器提供一个随机字符串,然后客户端将这个随机字符串和密码相加后再加密!
每次登陆时,服务器会产生不同的随机字符串,这样你的密码没有变,但是通过上面的方法加密后的MD5摘要却完全不同。这样就算坏人得到了这些MD5摘要,他们也不可能分析出你的密码!
这种方法中,服务器提供的随机字符串叫做"公匙",寿命很短,并可以被任何人利用;你的密码叫做"私匙",寿命很长,而且永远也不会被人知道。
2。实现
客户端Javascript并没有提供现成的md5算法,但我们在 google 上用 "md5 javascript" 搜索,就可以得到很多md5在Javascript上实现的例子。
在PHP中我就不用多说了,直接用md5()这个函数就可以搞定!随机字符串我们可以用session来存储(PHP就是强啊~~)
3。注意
在JS中,中文都是UTF-8格式的,所以如果你的密码是中文,而且存储在服务端的密码的编码方式是GB2312,那么两个密码加密后的字符串是完全不同的!
# 1: November 17, 2006, 2:10 pm, 炎藤 said:
每次登陆时,服务器会产生不同的随机字符串,这样你的密码没有变,但是通过上面的方法加密后的MD5摘要却完全不同。
这样的话,第一次的密码不是和第二次登入的密码完全不同了吗?
那么用户第二次登入的时候不就总失败了?
不好意思我是初学者,不知道这方面的内容
请多指教
加我MSN lwjct@hotmail.com
QQ: 44219991
# 2: November 17, 2006, 2:38 pm, longbill said:
输入的密码每次都是一样的,只是每一次在网络中传输的密码字符串不同而已,这样除非别人知道你的密码,否则不会骗过服务器的