Archive for 03月, 2007
-
网站总算又重见天日了,
星期五, 03月 23rd, 2007
网站总算又重见天日了,
-
Smarty 入门
星期一, 03月 19th, 2007
序言
刚开始接触样版引擎的 PHP 设计师,听到 Smarty 时,都会觉得很难。其实笔者也不例外,碰都不敢碰一下。但是后来在剖析 XOOPS 的程序架构时,开始发现 Smarty 其实并不难。只要将 Smarty 基础功练好,在一般应用上就已经相当足够了。当然基础能打好,后面的进阶应用也就不用怕了。
这篇文章的主要用意并非要深入探讨 Smarty 的使用,这在官方使用说明中都已经写得很完整了。笔者仅在此写下一些自己使用上的心得,让想要了解 Smarty 却不得其门而入的朋友,可以从中得到一些启示。就因为这篇文章的内容不是非常深入,会使用 Smarty 的朋友们可能会觉得简单了点。
目前本文已经第三次修订了,本想多加一些料进来;不过碍于时间的关系,很多 Smarty 的进阶技巧笔者并没有研究得很透彻,所以也不敢拿出来现眼,但笔者相信这篇文章应该能够满足大多数想学习 Smarty 的初学者了。当然本文有谬误的地方也欢迎告知,笔者会在下一次的修订中更正的。
P.S. 请在 1024 x 768 的环境下看会比较好。
2004/02/09
Smarty介绍
什么是样版引擎
不知道从什么时候开始,有人开始对 HTML 内嵌入 Server Script 觉得不太满意。然而不论是微软的 ASP 或是开放源码的 PHP,都是属于内嵌 Server Script 的网页伺服端语言。因此也就有人想到,如果能把程序应用逻辑 (或称商业应用逻辑) 与网页呈现 (Layout) 逻辑分离的话,是不是会比较好呢?
其实这个问题早就存在已久,从交互式网页开始风行时,不论是 ASP 或是 PHP 的使用者都是身兼程序开发者与视觉设计师两种身份。可是通常这些使用者不是程序强就是美工强,如果要两者同时兼顾,那可得死掉不少脑细胞…
所以样版引擎就应运而生啦!样版引擎的目的,就是要达到上述提到的逻辑分离的功能。它能让程序开发者专注于资料的控制或是功能的达成;而视觉设计师则可专注于网页排版,让网页看起来更具有专业感!因此样版引擎很适合公司的网站开发团队使用,使每个人都能发挥其专长!
就笔者接触过的样版引擎来说,依资料呈现方式大概分成:需搭配程序处理的样版引擎和完全由样版本身自行决定的样版引擎两种形式。
在需搭配程序处理的样版引擎中,程序开发者必须要负责变量的呈现逻辑,也就是说他必须把变量的内容在输出到样版前先处理好,才能做 assign 的工作。换句话说,程序开发者还是得多写一些程序来决定变量呈现的风貌。而完全由样版本身自行决定的样版引擎,它允许变量直接 assign 到样版中,让视觉设计师在设计样版时再决定变量要如何呈现。因此它就可能会有另一套属于自己的样版程序语法 (如 Smarty) ,以方便控制变量的呈现。但这样一来,视觉设计师也得学习如何使用样版语言。
样版引擎的运作原理
首先我们先看看以下的运作图:
一般的样版引擎 (如 PHPLib) 都是在建立样版对象时取得要解析的样版,然后把变量套入后,透过 [...] -
在BIOS中嵌入应用程序的方法及实现
星期日, 03月 18th, 2007
一种在BIOS中嵌入应用程序的方法及实现
介绍
本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理对别的品牌的BIOS也一样适用,仅需稍加修改。文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证。
一. BIOS简述
这里所讲的BIOS是指计算机主板上的BIOS,是整个计算机的关键和灵魂,计算机一启动就是执行BIOS程序,它负责加电自检,初始化计算系统,响应用户对系统配置的修改,记录数据到CMOS中,将常驻程序库(Runtime Program)常驻于内存中,提供给系统和应用程序调用,经过一系列复杂操作后,最后将控制权转移给操作系统。
一开始BIOS容量仅有8K,随着计算机复杂程度的提高,以及即插即用、高级电源管理等方面的需要,再加上个别主板厂商添加的辅助功能,BIOS容量迅速增大,目前通常主板上BIOS容量为256Kb,有些已经达到512Kb,这些BIOS中常常还会有几十Kb的剩余空间,而且由于BIOS多采用FlashRom作为存储芯片,便于修改,这就为我们在BIOS中嵌入自己的程序提供了便利。
在BIOS中嵌入程序具有多方面的应用,有些主板厂商在BIOS中嵌入杀毒程序,硬盘恢复精灵,超频工具等,提高了产品的竞争力;台湾威胜公司和Elegent公司联合开发出了嵌入在BIOS中的小型浏览器操作系统,整个BIOS大小仅有512Kb,计算机无需硬盘即可上网冲浪;有些监控系统由于功能简单,完全可以把程序做到BIOS中,一开机就自动运行,既提高了可靠性,又降低了成本。另一方面,将病毒嵌入到BIOS中,一开机就常驻内存也完全可以做到。
BIOS代码虽短,但技术含量相当高,全世界仅有AWARD、PHOENIX、AMI、ACER等几家公司有研发BIOS系统的能力(AWARD 已被PHOENIX收购),其他主板厂商有的是直接购买,有的也会在以上几家公司提供的平台上进行少量功能扩展。作为个别应用的场合,就要完全靠自己对BIOS进行改造。
二. 嵌入程序的基础知识
在进行工作前需要几个必备的工具,一个是AWARD公司的BIOS刷新工具AwdFlash;另一个Award BIOS 察看修改工具Cbrom;还有一个是MicroSoft 的汇编工具Masm6.11;最后是作者推荐的二进制文本编辑器HexWorkshop,这些工具都可以从网上下载,下面假定读者已经熟练使用这些工具,具体操作步骤不再祥述。
前面提到BIOS程序是存放在FlashROM芯片中的,实际上它是经过压缩后再存放进去的,仅留下少量启动代码和解压缩程序保持原样,BIOS的执行过程其实相当复杂,好在我们无需去了解其中的详细流程,但有一点应当清楚,BIOS程序实际上也是采用的模块化设计思想,用Cbrom可以察看到BIOS中各个子模块的名称,性质,压缩率等信息,BIOS在执行过程中会将这些模块解压缩到内存中,验证模块的合法性和正确性,如果满足条件,就会转到模块的入口处执行。这里面的详细机制和由来需要参考PNPBIOS协议、PNPISA协议、PCI总线协议和EISA总线协议,内容繁多,本文不拟做深入探讨。
BIOS中有一种模块是ISA模块,来源于ISA协议,由于ISA协议属于早期的协议,内容相对简单,BIOS对ISA模块的验证也较为简单,容易满足,我们可以将自己的程序做成ISA模块挂到BIOS中,这样机器一启动,我们的程序就会启动,而且我们程序的运行是先于操作系统的。
三. 程序设计详细步骤
1. 设计准备
由于系统固有的限制,BIOS中每个模块的大小不能超过64Kb,这里是指没有压缩前的大小,这和DOS下COM程序的限制很相似,实际上我们在用MASM6.11进行编程时的确采用是COM程序的模板,由编译器生成COM文件。然而它又和一般的COM文件具有以下几点不同:
1. 首先它有自己的堆栈段,堆栈大小默认为1K,而COM文件的堆栈是在64K之内的,默认是从段内偏移量0FFFEh处开始。
2. COM文件一开始就是执行代码,而模块一开始是模块头,储存有与模块相关的信息。模块执行代码的入口点在模块中的某一处。
3. COM文件执行完后返回到操作系统,通常通过子功能号4ch的中断INT21h返回到DOS,而模块是远程调用返回,也就是说必须用RETF返回。
4. ISA模块最后一个字节是校验码,所有的字节相加必须为0,BIOS利用这点来验证一个ISA模块的正确性。COM文件没有这点要求。
5. COM文件执行时是先被完整地复制到段内偏移量100h处,然后再执行,而模块的段内偏移量不能确定,有的模块会是0。所以涉及到段内偏移量的汇编指令,如LEA、OFFSET要谨慎适用。
下表是ISA模块头的格式,其中仅列出了几个最基本的相关字段,这是协议中的内容,我们在编写模块头时,需要严格遵循下表的格式:
偏 移 长 度 值 说 明
0h 1 55h 模块标签字节1
1h 1 AAh 模块标签字节2
2h 1 * 模块长度(以512字节为单位)
3h 3 * 入口点,BIOS对此位置做远调用,这里往往放一条跳转指令
6h~19h 20 * 保留
表一 模块头格式
通常一个BIOS嵌入程序设计的基本流程如下,每一步都很关键,有必要给出详细说明:
1. 首先用汇编编写DOS下的COM程序,必须注意到程序是先于操作系统执行的,所以程序中不能调用任何DOS的中断服务。为了程序转化方便,也不要用.code,.startup等汇编伪指令,尽量采用早期的汇编编写方式,争取对整个程序结构的完全控制。
2. 调试通过后,在COM文件前加上文件头,改变返回指令为RETF,控制文件大小为512字节的整数倍,重新编译生成COM文件。
3. 在HexWorkshop中调入刚生成的COM文件,利用其中的checksum工具生成文件的校验码,用100h减去该8位校验码后填入文件最后一个字节。再次生成文件的校验码,确认为零。
4. 用Cbrom将文件作为ISA模块嵌入到BIOS中,在本文中的操作为 “Cbrom save.bin/isa hello.com”,其中save.bin是事先用AwdFlash备份的BIOS文件。注意反复操作时,要先将前一个给释放掉,操作为“Cbrom save.bin/isa release”。
5. 用AwdFlash将新的BIOS文件烧录到FlashROM中。重起计算机,检验程序。
进行以上实验前,最好自备编程器,万一计算机不能正常启动,也可以重新恢复BIOS,如果可以用本身具有双BIOS保护功能的计算机进行实验则更加保险。
下面设计两个简单的Hello程序,分别采用了两种不同的方式,两个程序都是在屏幕上显示一行字“Hello!Press F1 to continue…”,当按下F1功能键后,程序退出,计算机继续启动。
2. Hello程序一
下面给出的源代码是在上面流程2中的文件,所以已经添加了文件头,编译后生成的COM文件是不能在DOS下执行的,请读者务必注意。另外由于程序功能简单,所以在这里文件大小限制为512字节,对不同规模的程序,会有一些小小的变动。程序中所有的中断调用都是BIOS中断服务调用,具体调用规则不做详细说明,请读者查阅有关资料。
;Hello源程序一
code segment
assume cs:code,ds:code
start:
signature db 55h,0aah
comlength [...] -
更新Tomcat5.5+MySql数据库连接池配置方法
星期日, 03月 18th, 2007
网上写了很多tomcat+mysql数据库连接池的配置方法,但在新的tomcat5.5中很多已不在适用.下面的方法是最简单方便的最新配置方法.
1> 下载驱动JDBC驱动http://dev.mysql.com/downloads/connector/j/5.0.html , 解压缩得到jar文件,如mysql-connector-java-5.0.4-bin.jar,复制到%tomcat%\common\lib下.
2>建立虚拟目录并配置连接池.
在%tomcat%\conf\Catalina\localhost\目录下建立一个与工程同名的xml文件.这里我的工程叫udateTesting,所以我建立叫udateTesting.xml文件,打开文件添加如下内容.
<context path="/udateTesting" docBase="D:\Tomcat 5.5\webapps\udateTesting" reloadable="true" crossContext="true" debug="0" >
<resource name="jdbc/mytest" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="liuwen" password="liuwen" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=GBK"/>
</context>
上面,您需要更改path为”/“,docBase为”“,username为数据库用户名,password为数据库密码,url为”jdbc:mysql:///?useUnicode=true&characterEncoding=GBK”.
配置完毕.
3>测试
在工程路径下新建一个jsp文件为test.jsp.
<%@page contentType="text/html;charset=gbk"%>
<%@page import="java.sql.*"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.*"%>
<html>
<body>
<%try{ Context initCtx=new InitialContext();
DataSource db = (DataSource)initCtx.lookup("java:comp/env/jdbc/mytest");
Connection conn = db.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * FROM admin");
out.println("User-list"+"<br />");
while(rs.next()){
out.print(rs.getString(1)+" ");
out.print(rs.getString(2)+"<br />"); }
rs.close();
stmt.close();
conn.close();
}catch(Exception e){
out.print(e);}%>
</body>
</html>
注意更改为您自己的sql代码. -
jsp中的日期问题及其它
星期日, 03月 18th, 2007
日期问题
1、获取服务器端当前日期:
<!–page import="java.util.Date–>
<!–r> Date myDate = new Date();
–>
输出结果:
引用
Fri Jan 05 21:39:40 CST 2007
2、获取当前年、月、日:
<!–page import="java.util.Date–>
<!–r> Date myDate = new Date();
int thisYear = myDate.getYear() + 1900;
int thisMonth = myDate.getMonth() + 1;
int thisDate = myDate.getDate();
–>
输出结果:
引用
2007 1 5
3、按本地时区输出当前日期
<!–page import="java.util.Date–>
<!–r> Date myDate = new Date();
out.println(myDate.toLocaleString());
–>
结果:2007-1-5 21:43:27
4、获取数据库中字段名为”publish_time“、类型为Datetime的值
<!–page import="java.util.Date–>
<!–r> …连接数据库…
ResultSet rs = …
Date sDate = rs.getDate("publish_time");
–>
5、按照指定格式打印日期
<!–page import="java.util.Date–>
<!–page import="java.text.DateFormat–>
<!–r> Date dNow = new Date();
SimpleDateFormat formatter = [...]