Google

星期三, 五月 28, 2008

最感人的诗篇

网易广东湛江网友 ip:125.90.*.*: 2008-05-28 14:46:17 发表
背儿背上走,
儿已破头亡。
廿里踉跄步,
接儿返故乡。
梦里青山在,
醉中绿水长。
那堪人不在,
未语泪双行。
葬儿黄土里,
埋儿山坡上,
人死万事空,
白发痛断肠。
悠悠小河水。
泛起明月光,
时有秋风语,
萤火自来往。
http://comment.news.163.com/reply/post.jsp?type=null&board=news_guonei7_bbs&threadid=4D11N7U30001124J&showdistrict=&pagex=3

标签:

星期二, 五月 27, 2008

无题

骄傲没有成本,代价却不可估量.

标签:

星期一, 五月 26, 2008

无题

牛B不重要,重要的是适当的时候要吹。

标签:

星期日, 五月 25, 2008

Google Sites开始向所有人免费开放 可自由建个人主页

Google Site是一个简易的建站工具,可以使那些不懂

网页设计或者不懂网页代码的用户去组建自己的网站.

Google Site可以让商务人士创建自己的“局域网”,管理团队项目等.另外,团队中的成员也可以建立自己的个人主页,设置自己的工作计划、兴趣爱好等栏目.对于学校用户,Google Site可以作为虚拟教室,供学生展示自己的家庭作业或为学生提供学习、生活等的资料.今天它已经向所有人免费开放,现在你就可以在Google上建立自己的建一个自己的主页.

访问:Google Sites

访问:范例

http://news.csdn.net/n/20080523/116213.html

标签:

星期二, 五月 20, 2008

Linux美化也疯狂 10个最漂亮桌面展示(图)

漂亮的桌面可绝对不仅仅是Windows和Mac的专利,只要您能细心雕琢,让Linux的KDE和GNOME原本傻傻的界面脱胎换骨是没有任何问题的.

以下就是Digg上被推荐的10个最漂亮的Linux桌面,有的是模拟其它操作系统的作品,有的则完全原创,颇具美感.

你最喜欢哪一个呢?


2)

3)

4)

5)

6)

7)

8)

9)

10)


http://news.csdn.net/n/20080519/116063.html

标签: , ,

:)

10:30了,吃药,睡觉,梦周公。

标签:

星期四, 五月 15, 2008

方法

目标刻在石头上,方法写在沙滩上。
要不断的去尝试。这样就会有更大更多的发现。

http://www.yqmisbbs.com/redirect.php?tid=545&goto=lastpost#lastpost

星期三, 五月 14, 2008

使用CodeIgniter框架快速开发PHP应用:分析网站结构(3)

让我们看看内部细节。

再次强调我们并不处理静态网页和对应的URL,我们将会给你看CI如何分析URL请求和如何响应它。 首先,考虑一个正常的英特网请求。用户建立一个连接到你的网站: www.example.com,

然后经过端口发出一个如下的HTTP request:

GET /folder/file.html HTTP/1.0

GET是请求的类型, HTTP/1.0 指定 HTTP 协议的版本, 中间是相对路径和文件名。但是在你的网站上,找不到简单的静态 HTML 文件。取代它的,所有的收入请求被 index.php 文件拦截并进行处理。

如果使用者正在以正确的URL在你的网站上位置上请求页面-一般是通过点击你网页上的超级链接-request一般看起来象这样:

GET /index.php/tests/showall HTTP/1.0

如果使用者不知道精确的URL, CI 会设定一个默认页面(我们一会儿就告诉你怎么做.)

CI的处理步骤是:

+——————————–+
| internet request comes in: |
| "GET http://127.0.0.1" |
+——————————–+
|
v
+——————————–+
| Router:decides which controller|
| should handle this request |
+——————————–+
|
v
+——————————–+ +——————-+
| Controller: analyzes the | —–> | |
| request and responds:maybe | |Model:provides data|
| by getting data from the model | <—– | |
+——————————–+ +——————-+
|
v
+——————————–+
| View:formats the response |
| (in this case as an HTML page) |
+——————————–+
|
v
+——————————–+
| Page is served up to enquirer |
+——————————–+


一个从英特网到你的网站根目录的请求被 index.php 文件拦截,作用就象一个“站由器”。 换句话说, 它调用一个 ‘控制器’, 然后返回一个’视图’.

“路由器”怎么知道调用哪一个控制器? 就象我们已经见到的,有时候request本身包含的信息会告诉它调用哪个控制器。 举例来说,如果请求说:

GET http://127.0.0.1/index.php/welcome/index

并且如果你有一个控制器叫做welcome,这就是被调用的控制器。

welcome控制器

所以, 让我们看welcome控制器。 它被存放在如下路径:
system/application/controllers/welcome.php
它的内容是这样的:

class Welcome extends Controller {

function Welcome() {
parent::Controller();
}

function index() {
$this->load->view(‘welcome_message’);
}

}
?>

文件的第二行开始是一个类。 每个控制器从一个Controller类继承。 在类中包含二个函数或称为方法-welcome() 和incex().
注:CI 要求控制器名字从一个大写字母(class Welcome) 开始, 但文件名是小写字母:
/system/application/controllers/welcome.php

function Welcome() {
parent::Controller();
}

这三行组成构造函数。 注意到 CI 使用PHP 4 构造函数命名规则,兼容于 PHP 5.-CI在PHP 4 和PHP 5 两个版本中都能工作得很好。构造函数在类实例化时被调用,你可以做一些初始化的工作,比如调用函数库和模型层,或者对类的成员变量进行寝化。
这个例子中构造函数中仅一行,调用父类的构造函数。parent::Controller() 。这只是显式地使用父类功能的一种方法。如果你想要详细地了解CI框架中controller类,你可以研读文件 /system/libraries/controller.php 。
(可以放心的是你可以随时查看CI的源代码,它们已经保存在你机器上的某个目录内。)

http://www.anson-ho.com/index.php/2008/04/27/codeigniter-rapid-development-framework-for-the-use-of-php-applications-analysis-of-site-4/

标签:

使用CodeIgniter框架快速开发PHP应用:分析网站结构(2)

另一方面,你必须认识到,MVC只是用来帮助你的一种设计方式,而不是用来约束你的。MVC可以有不同的实现方式。CI 论坛包含许多如何 ‘正确合理’地实现 MVC 的方式。 ( 我应该在控制器部分实现数据库查询功能吗?我能直接从视图发送数据到模型层吗?或者我必须通过控制器来访问?)

与其寻找理论上的正确方式,不如遵循二项有用的原则。 这些在 CI 用户手册上有相关描述:

。松藕合: 类之间尽可能不要彼此依赖。

。组件智能化: 智能化是组件独立实现特定目标的能力。在 CI框架中,每个类和它内部的函数高度地自治。

这些是Rick开发CI要实现的目标, 他们也会成为你开发你自己的网站时的目标。实现这些目标之后,你代码中使用这些类时就不需要担心有什么副作用了。

CI做到了这一点,我的经验是那助手类和类库中的其它类使用用起来十分容易,工作起来效果也不错。

因此, 如果你的控制器直接操作数据库, 或你的在模型层调用视图, CI 代码将会以适当的方式工作-通常没有技术上的问题-但是从MVC理论来看这样似乎是 ‘不正确的’. 不要烦恼,如果非要这样做,做吧!

CI 的网站结构: 控制器和视图

你的整个 CI 网站是动态的。 就是, 可能找不到制作 ‘静态’ 网页的简单的 HTML 代码。 (如果需要你可以添加,但是他们将会在 CI 结构之外.) 那么, 你的网站文件到底在哪里?

当我们安装 CI 的时候,我们注意到应用目录包括名为models、views和controllers的子目录。 每个 CI 框架应用都包含这三大类型。

标签: , ,

使用CodeIgniter框架快速开发PHP应用:分析网站结构(1)

转贴自CI中国

分析网站结构

既然我们已经安装 CI ,我们开始了解它如何工作。
读者已经知道 CI 实现了MVC式样。 通过对目录和文件的内容进行分类, 而不是让代码大块大块地纠集在一起。
这一章,我们将会对 MVC 理论做个简短的介绍, 然后再介绍 CI 的MVC实现方式。特别地,要了解那些目录和文件如何互相交换信息?网站结构是怎样的?以及CI是如何自如地动作于其中的?

这一章将会介绍:

。MVC 如何架构一个动态网站
。CI如何接收和分析request以及如何调配指定的代码来reponse
。这些指定的代码如何编制
CodeIgniter 语法
。CI提供的各种类和函数,你自己编写的类和函数
。如控向controllers传递URL参数
。如何编写运行良好的视图并把动态内容传递给它们。
。如何返回信息给上网者
。文件和类如何传递信息和互相调用
。助手类文件有什么用?
。有助于网站设计的一些特别提示

MVC-到底有什么用?

MVC,在本文领域内,指的是一个动态网站的组织方法。 设计模式是1979年由挪威人,Trygve Reenskaug首次提出来的,这里是一些概要:
。模型是包含数据的对象,他们与数据库交互,对这些数据进行存取,使其在不同的阶段包含不同的值,不同的值代表了不同的状态,具有特定的含意。
。视图显示模型的状态,他们负责向使用者显示数据。(虽然他们通常是 HMTL 视图, 但是,他们可能是任何形式的接口。 比如PDA屏幕或WAP手机屏幕)
。控制器用来改变模型的状态,他们操作模型,提供动态的数据给视图。
CI框架包含模型、视图和控制器的子目录。 他们里面的每个文件都有.php文件后缀, 包含有特定命名约定的类。
CI 帮助你遵循MVC的约定, 使你更有效地组织代码。 CI允许你有最大的灵活性,你可以获得 MVC 结构的所有好处。
当你编程的時候,试着始终用 MVC 来思考问题。尽可能确保你的 ‘视图’ 聚焦于显示, ’控制器’纯粹地用来控制数据流。 把应用逻辑保留在数据模型和数据库中。

这样,如果你决定开发新的视图,你不必在任何一个控制器或模型中修改代码。 如果你需要更新 ‘商业规则’ ,你只需要在模型中修改代码。

标签: , ,

;)

C/C++还是最棒的

Object Pascal也不错,至少目前Free Pascal的发展比Delphi的命运好像好一点

Python易学易用,语法太灵活了,缩进还是没有;号爽

UML 2.0还没有达到易用,易懂的程度,也许以后描述问题不用它了吧

PHP做网站很不错,CodeIgniter框架也不错,就是对XHTML的支持,特别是UTF-8的支持不是很理想。

标签: , , , , , , ,

为PE文件增加新节,并在新节中增入SHELL CODE加载指定DLL

附件下载:add_section.rar

代码见:http://www.pediy.com/bbshtml/bbs8/pediy8-732.htm

标签: , , ,

Reverse engineer MS Access/Jet databases

# jet2sql.py - M.Keranen  [07/12/2000]
# --------------------------------------------------------------------
# Creates ANSI SQL DDL from a MS Jet database file, useful for reverse
# engineering database designs in E/R tools.
#
# Requires DAO 3.6 library.
# --------------------------------------------------------------------
# Usage: python jet2sql.py infile.MDB outfile.SQL

import sys, string, pythoncom, win32com.client

const = win32com.client.constants
daoEngine = win32com.client.Dispatch('DAO.DBEngine.36')

class jetReverse:
def __init__ (self, infile):

self.jetfilename=infile
self.dtbs = daoEngine.OpenDatabase(infile)

return

def terminate(self):
return

def writeTable(self, currTabl):
self.writeLine('\ncreate table ' + chr(34) + currTabl.Name + chr(34),"",1)
self.writeLine('(',"",1)

# Write Columns
cn=0
for col in currTabl.Fields:
cn = cn +1
self.writeColumn(col.Name, col.Type, col.Size, col.Required, col.Attributes, col.DefaultValue, col.ValidationRule, currTabl.Fields.Count-cn)

# Validation Rule
tablRule = currTabl.ValidationRule
if tablRule <> "":
tablRule = " check(" + tablRule + ") "
self.writeLine("",",",1) # add a comma and CR previous line
self.writeLine(tablRule,"",0)

# Primary Key
pk=self.getPrimaryKey(currTabl)
if pk <> "":
self.writeLine("",",",1) # add a comma and CR previous line
self.writeLine(pk,"",0)

# End of table
self.writeLine("","",1) # terminate previous line
self.writeLine(');',"",1)

# Write table comment
try: sql = currTabl.Properties("Description").Value
except pythoncom.com_error: sql=""
if sql <> "":
sql = "comment on table " + chr(34) + currTabl.Name + chr(34) + " is " + chr(34) + sql + chr(34) +";"
self.writeLine(sql,"",1)

# Write column comments
for col in currTabl.Fields:
try: sql = col.Properties("Description").Value
except pythoncom.com_error: sql=""
if sql <> "":
sql = "comment on column " + chr(34) + currTabl.Name + chr(34) + "." + chr(34) + col.Name + chr(34) + " is " + chr(34) + sql + chr(34) + ";"
self.writeLine(sql,"",1)

# Write Indexes
self.writeIndexes(currTabl)

return

def writeColumn(self, colName, colType, length, requird, attributes, default, check, colRix):
# colRix: 0 based index of column from right side. 0 indicates rightmost column

if colType == const.dbByte: dataType = "Byte"
elif colType == const.dbInteger: dataType = "Integer"
elif colType == const.dbSingle: dataType = "Single"
elif colType == const.dbDouble: dataType = "Double"
elif colType == const.dbDate: dataType = "DateTime"
elif colType == const.dbLongBinary: dataType = "OLE"
elif colType == const.dbMemo: dataType = "Memo"
elif colType == const.dbCurrency: dataType = "Currency"
elif colType == const.dbLong:
if (attributes & const.dbAutoIncrField): dataType = "Counter"
else: dataType = "LongInteger"
elif colType == const.dbText:
if length == 0: dataType = "Text"
else: dataType = "char("+str(length)+")"
elif colType == const.dbBoolean:
dataType = "Bit"
if default == "Yes": default = "1"
else: default = "0"
else:
if length == 0: dataType = "Text"
else: dataType = "Text("+str(length)+")"

if default <> "":
defaultStr = "default " + default + " "
else: defaultStr = ""

if check <> "":
checkStr = "check(" + check + ") "
else:
checkStr = ""

if requird or (attributes & const.dbAutoIncrField):
mandatory = "not null "
else:
mandatory = ""

sql = " " + chr(34) + colName + chr(34) + " " + dataType + " " + defaultStr + checkStr + mandatory
if colRix > 0:
self.writeLine(sql,",",1)
else:
self.writeLine(sql,"",0)

return

def getPrimaryKey(self, currTabl):

# Get primary key fields
sql = ""
for idx in currTabl.Indexes:
if idx.Primary:
idxName = idx.Name
sql = " primary key "
cn=0
for col in idx.Fields:
cn=cn+1
sql = sql + chr(34) + col.Name + chr(34)
if idx.Fields.Count > cn : sql = sql + ","
return sql

def writeIndexes(self, currTabl):

# Write index definition
nIdx = -1
for idx in currTabl.Indexes:
nIdx = nIdx + 1
idxName = idx.Name
tablName = currTabl.Name
if idx.Primary:
idxName = tablName + "_PK"
elif idxName[:9] == "REFERENCE":
idxName = tablName + "_FK" + idxName[10:]
else:
idxName = tablName + "_IX" + str(nIdx)

sql = "create "
if idx.Unique: sql = sql + "unique "
if idx.Clustered: sql = sql + "clustered "
sql = sql + "index " + chr(34) + idxName + chr(34)
sql = sql + " on " + chr(34) + tablName + chr(34) + " ("

# Write Index Columns
cn=0
for col in idx.Fields:
cn = cn + 1
sql = sql + chr(34) + col.Name + chr(34)
if col.Attributes & const.dbDescending:
sql = sql + " desc"
else:
sql = sql + " asc"
if idx.Fields.Count > cn: sql = sql + ","

sql=sql + " );"

self.writeLine(sql,"",1)
return

def writeForeignKey(self, currRefr):

# Export foreign key
sql = "\nalter table " + chr(34) + currRefr.ForeignTable + chr(34)
self.writeLine(sql,"",1)

sql = " add foreign key ("
cn = 0
for col in currRefr.Fields:
cn = cn + 1
sql = sql + chr(34) + col.ForeignName + chr(34)
if currRefr.Fields.Count > cn: sql = sql + ","

sql = sql + ")"
self.writeLine(sql,"",1)

sql = " references " + chr(34) + currRefr.Table + chr(34) + " ("
cn = 0
for col in currRefr.Fields:
cn = cn + 1
sql = sql + chr(34) + col.Name + chr(34)
if currRefr.Fields.Count > cn: sql = sql + ","

sql = sql + ")"
if (currRefr.Attributes & const.dbRelationUpdateCascade) <> 0:
sql = sql + " on update cascade"
if (currRefr.Attributes & const.dbRelationDeleteCascade) <> 0:
sql = sql + " on delete cascade"
sql=sql+";"
self.writeLine(sql,"",1)

return

def writeQuery(self, currQry):

sql = "\ncreate view " + chr(34) + currQry.Name + chr(34) + " as"
self.writeLine(sql,"",1)

# Write Query text
sql=string.replace(currQry.SQL,chr(13),"") # Get rid of extra linefeeds
self.writeLine(sql,"",1)

# Write Query comment
try: sql = currQry.Properties("Description").Value
except pythoncom.com_error: sql=""
if sql <> "":
sql = "comment on table " + chr(34) + currQry.Name + chr(34) + " is " + chr(34) + sql + chr(34)
self.writeLine(sql,"",1)

return

def writeLine(self,strLine, delimit, newline):
# Used for controlling where lines terminate with a comma or other continuation mark
sqlfile.write(strLine)
if delimit: sqlfile.write(delimit)
if newline: sqlfile.write('\n')
return


if __name__ == '__main__':
if len(sys.argv)<2:
print "Usage: jet2sql.py infile.mdb outfile.sql"
else:
jetEng = jetReverse(sys.argv[1])
outfile = sys.argv[2]

sqlfile = open(outfile,'w')

print "\nReverse engineering %s to %s" % (jetEng.jetfilename, outfile)

# Tables
sys.stdout.write("\n Tables")
for tabl in jetEng.dtbs.TableDefs:
sys.stdout.write(".")
if tabl.Name[:4] <> "MSys" and tabl.Name[:4] <> "~TMP":
jetEng.writeTable(tabl)

# Relations / FKs
sys.stdout.write("\n Relations")
for fk in jetEng.dtbs.Relations:
sys.stdout.write(".")
jetEng.writeForeignKey(fk)

# Queries
sys.stdout.write("\n Queries")
for qry in jetEng.dtbs.QueryDefs:
sys.stdout.write(".")
jetEng.writeQuery(qry)

print "\n Done\n"

# Done
sqlfile.close()
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52267
jetEng.terminate()

标签: ,

25个顶级PHP模板引擎

为了找到一个好的模板引擎,我在互联网上进行搜索,目前已经整理出了以下名单:

Smarty
Smarty的特点是将模板编译成PHP脚本,然后执行这些脚本。很快,非常灵活。

Heyes Template Class
一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离。

FastTemplate
一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理。

ShellPage
一个简单易用的类,可以让你的整个网站布局基于模板文件,修改模板就能改变整个站点。

STP Simple Template Parser
一个简单、轻量级并且易于使用的模板分析类。它可以从多个模板中组装一个页面,把结果页面输出到浏览器或者文件系统。

OO Template Class
一个你可以用在自己程序中的面向兑现的模板类。

SimpleTemplate
一个可以创建和结构化网站的模板引擎。它可以解析和编译模板。

bTemplate
短小但是快速的模板类,允许你把PHP逻辑代码从HTML修饰代码中分离。

Savant
一个强大且轻量级的PEAR兼容模板系统。它是非编译型的,使用PHP语言本身做为它的模板语言。

ETS - easy template system
可以使用完全相同数据重组模板的模板系统。

EasyTemplatePHP
适用于你的站点的一个简单但是强大的模板系统。

vlibTemplate
一个快速、全能的模板系统,它包含一个缓存和调试类。

AvanTemplate
多字节安全的模板引擎,占用很少系统资源。它支持变量替换,内容块可以设置显示或隐藏。

Grafx Software’s Fast Template
一个修改版本的Fast Template系统,它包括缓存功能,调试控制台以及沉默去除为赋值块。

TemplatePower
一个快速、简单、功能强大的模板类。主要功能有嵌套的动态块支持,块/文件包含支持以及显示/隐藏未赋值的变量。

TagTemplate
这个库的功能被设计来使用模板文件,同时允许你从HTML文件检索信息。

htmltmpl: templating engine
一个适用于Python和PHP的模板引擎。它面向希望在项目中分离代码和设计的web应用开发人员。

PHP Class for Parsing Dreamweaver templates
一个分析Dreamweaver模板的简单类,被用于Gallery 2 和WordPress的自定义模块中。

MiniTemplator (Template Engine)
针对HTML文件的一个紧凑型模板引擎。对于模板变量和块定义它具有简单的语法。其中块可以嵌套。

Layout Solution
简化网站开发和维护。它拥有常用的变量和页面元素使你不需要重复做页面布局工作。

Cached Fast Template
它已经纳入 FastTemplate ,允许你缓存模板文件,甚至可以在分离的块内容上缓存不同的规格。

TinyButStrong
一个支持MySQL, Odbc, Sql-Server和ADODB的模板引擎。它包含7个方法和两个属性。

Brian Lozier’s php based template engine
只有2K大小,非常快并且是面向对象设计。

WACT
一个从设计中分离代码的模板引擎。

PHPTAL
一个PHP下面的XML/XHTML模板库。

http://www.yeeyan.com/articles/view/2930/1993

标签: , , , , , , ,

PHP 6 的新特性

PHP的下一个版本,V6,包含了很的新特性和语法改进,会使它在面向对象方面性更易用。其他重要的特性:比如在核心函数中对Unicode (统一编码)的支持,这意味着 PHP 6提供了更好的更可靠国际支持。

PHP已经很流行,被无数的站点使用,被大部分因特网接入商所支持,被Yahoo这样的大网络公司使用着。在即将来临的PHP版本中准备增加一些成功的新特性,使PHP在某些场合下更易用更安全。你准备好接受 PHP 6 了吗?如果你明天就升级了,你的程序会运行得很好吗?你该怎么办?这篇文章集合了PHP 6的改变,他们中的一些备份移植到版本的PHP v5.x,您目前的脚本可能需要进行一些调整。

如果你现在使用不是PHP,但是一直在考虑它,考虑一下它的新特性。这些特点,从Unicode的核心支持到XML支持,使它更容易为你写的功能填补PHP的应用。

PHP 6 新特性

PHP 6当前已经作为开发者快照使用,所以你可以下载和试用一下这篇文章列出很多特性,这些特性已经在当前的快照中实现了。见资源

改进 Unicode 支持

在PHP的核心函数中,有很多对Unicode 字符串的支持的改进,这些新特性将产生巨大的影响因为它允许PHP为国际字符提供更多的支持。所以如果一个开发者或者架构师使用不同的语言,例如Java程序语言,是因为它具有超过PHP的国际化支持的话,当支持改进时他会花一点时间来考虑一下PHP。

因为今天你已经可以下载到开发者版本的 PHP V6,你将看到一些功能函数已经支持Unicode字符串。有一个函数清单已经被测试和验证了完全可以处理Unicode,参见资源

命名空间

命名空间是一种避免因函数或者类之间的命名冲突而使你的函数和类以及方法无法读取,而不使用前缀命名惯例的一种方法。因此,通过使用命名空间,你可以命名别人可能已经使用的类名,而不用担心在运行时会出错。表一提供了一个在PHP中使用命名空间的示例。

您不用在源代码中做更新或更改,因为你写的任何PHP代码可以不包含命名空间而运行得很好。因为命名空间特性似乎会移植到PHP 5.3 X中,如果它可以使用,您可以在自己的程序中引用命名空间。

表一,命名空间示例

php
// I'm not sure why I would implement my own XMLWriter, but at least
// the name of this one won't collide with the one built in to PHP
namespace NathanAGood;
class XMLWriter
{
// Implementation here...
}

$writer = new NathanAGood::XMLWriter();

?>

Web 2.0 特性

依赖于你怎么使用PHP和你现在脚本的是什么样子的,现在的语言和语法差异,可能会或者不会最大程度的影响下面一些特性,这是指那些直接让你引用的Web 2.0功能到你的PHP应用程序。

SOAP

SOAP是一种网络服 务“说话”的协议,并且支持不少其他语言,例如Java和微软的.NET,虽然有其他的方法来驱动和使用网络服务,比如 表象化状态转变(Representational State Transfer )REST,SOAP仍然在使不同平台具有可操作性中是最常用的。此外,SOAP在PHP扩展和PEAR库中使用,SOAP在PHP中默认是不支持的,因 此你启用这个扩展或者叫你的ISP启用。此外,PEAR包允许你建立SOAP客户端和服务器,如SOAP包。

如果你改变了默认设置,SOAP将会在PHP 6中启用。这个扩展将提供你很容易的的实现SOAP客户端和SOAP服务,允许你编写的应用提供使用或者网络服务。

如果SOAP扩展是默认设置,那就意味着你不能在PHP中设置它们,如果您开发的PHP应用程序并且它们发布到一个ISP服务器上,您可能需要检查一下你的ISP,以验证SOAP并启用为他们升级。

XML

在PHP 5.1中XMLReader 和XMLWriter已经变成PHP核心的一部分,这使你工作起来更轻松如果在你的PHP程序中需要使用到XML的话。和SOAP扩展一样,如果你使用SOAP或者XML这是个好消息因为PHP 6比已经出炉的PHP4 更适合你。

被删除的东西

除了具有的一些新功能,PHP 6引擎将删除一些在前面版本中已经有的功能。大部分这些功能,如register_globalssafe_mode 在目前的PHP中被视为“破的”。因为他们可能会暴露一些安全风险。PHP在努力的清除中,在下一个版本中这些将从PHP中删除或者废弃。反对者认为大部分ISP或者企业会保留现在的脚本因为升级到PHP6会破坏现在的的脚本,但是支持者认为很高兴看到PHP团队修补了这些漏洞,并且提供了一个干净,安全的运行工具。

将从PHP删除的功能有:

magic_quotes register_globals register_long_arrays safe_mode

http://www.yeeyan.com/articles/view/muxi/7659

标签:

星期二, 五月 13, 2008

Lazarus Unicode说明

Lazarus對Unicode的支援還需要進一步開發,尤其是在Windows平台上。以下提供一些基本的資訊,讓想要加強Lazarus對Unicode支援的人參考,如果您發現這些資訊有誤、不足或過時了,請您不吝修正、補充或更新它,謝謝。

如果您已經初步了解Unicode的標準,且您已經在Delphi上面有使用過WideString這個型別來撰寫程式,會有助於您理解Lazarus對Unicode支援的加強工作。如果您使用過非Latin編碼的字元集來撰寫腳本語言,也會有些幫助的。

請注意: 實作的細節部分目前還在討論中,這部分的文件隨時都有可能更新。


http://wiki.freepascal.org/LCL_Unicode_Support/zh_TW

标签: , , , ,

How To Control Your Updates in ADO Through "Update Criteria"

SUMMARY

The ADO Client Cursor Engine allows you to control how it builds the action queries that update the database according to the changes you make to the recordset object. This article is designed to help you understand how to control how ADO performs these updates.

Back to the top

MORE INFORMATION

When you open a recordset against the Customers table in the Northwind database (NWind.MDB) and use a client side cursor, ADO retrieves enough information about the structure of the table in order to use an action query to update the table.

An action query is a query that modifies a database and does not return data. For example, "UPDATE Customers SET CompanyName = 'Acme' WHERE CustomerID = 17" is an action query.

ADO determines which field, or set of fields, is the primary key and uses that information to make sure it can find the correct row in the database to update. If you are going to perform updates with the client cursor engine, make sure you have a primary key defined in your table. If you don't, you may accidentally update more rows than you intended.

When you use a client side recordset, ADO exposes a property in the recordset's Properties collection called "Update Criteria." This property allows you to control the information in the WHERE clause in the action query that ADO builds to update the database. The default value for this property is 2 - adCriteriaUpdCols. By default, ADO will use the primary key and all fields being updated in the WHERE clause of the action query. For example:
   rsCustomers.CursorLocation = adUseClient
rsCustomers.Open "SELECT * FROM Customers", cnNWind, _
adOpenStatic, adLockOptimistic, adCmdText
rsCustomers.Fields("CompanyName").Value = "Acme"
rsCustomers.Update
will cause ADO to execute the following action query
   UPDATE Customers SET CompanyName = 'Acme'
WHERE CustomerID = 'ALFKI' AND CompanyName = 'Alfreds Futterkiste'
The WHERE clause contains information about the primary key and the original value for the field to update. This ensures that if another user has modified the value of the CompanyName field to a value other than the value that ADO originally retrieved, ADO will not update that row and will raise an error instead.

To change the value of this property, use code similar to the following
   rsCustomers.CursorLocation = adUseClient
rsCustomers.Properties("Update Criteria").Value = adCriteriaAllCols
rsCustomers.Open "SELECT * FROM Customers", cnNWind, _
adOpenStatic, adLockOptimistic, adCmdText
rsCustomers.Fields("CompanyName").Value = "Acme"
rsCustomers.Update
This code will cause ADO to include every field in the WHERE clause. You would use this value for the "Update Criteria" property if you want to make sure that the update made by the current user will only succeed if no changes have been made to any fields in that row in the table.

The available constants for this property are as follows:
   adCriteriaKey = 0

Uses only the primary key

adCriteriaAllCols = 1

Uses all columns in the recordset

adCriteriaUpdCols = 2 (Default)

Uses only the columns in the recordset that have been modified

adCriteriaTimeStamp = 3

Uses the timestamp column (if available) in the recordset
NOTE: Specifying adCriteriaTimeStamp may actually use adCriteriaAllCols method to execute the Update if there is not a valid TimeStamp field in the table. Also, the timestamp field does not need to be in the recordset itself.

http://support.microsoft.com/default.aspx?scid=kb;EN-GB;q190727&GSSNB=1

标签: , ,

不注册调用ActiveX Dll

那本书(Advanced Visual Basic)中让vb能够函数指针的方法不错,但是要添加类型库,还要自己创建轻量com对象显得颇为麻烦.我想,不如直接利用vb自己建对象算了.
代码如下:


'建一class,如下

'---------------------------------------------------------------------------------------
' Module : cFucPtr
' DateTime : 2006-2-7 17:36
' Author : Lingll
' Email : lingll_xl@163.com
' HomePage : http://lingll.yeah.net/
' Purpose :
'---------------------------------------------------------------------------------------

Option Explicit

'存储加载dll后获得的函数地址
Private m_NewFucPtr As Long

Public Function DllGetClassObject( _
ByRef rclsid As UUID, ByRef riid As UUID, ByRef ppv As IClassFactory) As Long

End Function

Public Sub SetFunctionPtr(newptr&)
m_NewFucPtr = newptr
End Sub


'再建一module

Option Explicit

Public Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long
Public Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Public Type typAsm
code(1) As Long
End Type
Public asm As typAsm


'然后,初始化时,让asm为如下值,
asm.code(0) = &HFF515859
asm.code(1) = &H90003460
'这个是汇编代码,具体是
'pop ecx
'pop eax
'push ecx
'jmp DWORD PTR [eax + 52]
'这是抄回来的,具体原理我不太清楚,如下是原注释
'Here's the magic asm for doing the function pointer call.
'The stack comes in with the following:
'esp: return address
'esp + 4: this pointer for FunctionDelegator
'All that we need to do is remove the this pointer from the
'stack, replace it with the return address, then jmp to the
'correct function. In other words, we're just squeezing the
'this pointer completely out of the picture.
'The code is:
'pop ecx (stores return address)
'pop eax (gets the this pointer)
'push ecx (restores the return address)
'jmp DWORD PTR [eax + 4] (jump to address at this + 4, 3 byte instruction)
'The corresponding byte stream for this is: 59 58 51 FF 60 04
'We pad these six bytes with two int 3 commands (CC CC) to get eight
'bytes, which can be stored in a Currency constant.
'Note that the memory location of this constant is not executable, so
'it must be copied into a currency variable. The address of the variable
'is then used as the forwarding function.


'下面是调用代码:
Dim tadd As Long, vTab&
Dim tobj As cFucPtr

Dim tLib&

Dim tUn As olelib.IUnknown
Dim tDem As dllDemo.IDemo
Dim tFac As olelib.IClassFactory

Set tobj = New cFucPtr

'加载dll
tLib = LoadLibrary(App.Path & "\dllDemo.dll")
If tLib <> 0 Then
tadd = GetProcAddress(tLib, "DllGetClassObject")
End If

Dim asmadd&
If tadd <> 0 Then
'获取vtable地址
CopyMemory vTab, ByVal ObjPtr(tobj), 4
asmadd = VarPtr(asm)
'替换掉cFucPtr.DllGetClassObject地址
CopyMemory ByVal (vTab + (8 - 1) * 4), asmadd, 4

'设置函数地址
tobj.SetFunctionPtr tadd

tobj.DllGetClassObject ClsId_Obj, iid_iclassfactory, tFac


If Not tFac Is Nothing Then
tFac.CreateInstance Nothing, iid_iunknow, tUn
Set tFac = Nothing
Set tDem = tUn
Set tUn = Nothing
tDem.test
End If
End If
Set tDem = Nothing
If tLib <> 0 Then FreeLibrary tLib

'一定要在所有对象都释放掉了才能使用FreeLibrary,不然会出错


将上面的代码修改一下,就可以很方便的在vb中使用函数指针了,hoho,vb可以用函数指针咯,不写了.

http://www.xker.com/page/e2007/0116/9680.html

标签: , , , ,

四川挺住

纪念那些在地震中消失的人们。
支持所有正在为此忙碌的人们。

星期日, 五月 11, 2008

NVIDIA发炮:用CPU衡量PC性能的时代已经过去

性能的标准。而在其中GPU又将是核心的核心。GPU的时代已经到来。”NVIDIA亚太区高级市场总监庄海欧今日下午在接受专访时说。

视觉享受是不是多余的?

为了佐证他的结论,庄海欧打开了微软开发的可从不同角度显示城市地理情况的三维地图软件,和一个能够在三维空间里自由显示图片的软件,华丽相比传统的二维显示有着革命性的改变。他说,这种炫特的效果,只有通过GPU的处理才能呈现。3D显示的时代已经带来,人们可以看到的显示效果都将发生改变。

他又拿出自己的iPod Photo,“视觉的享受是不是多余的,如果你用过那些给你带来不同感受的产品,就不会有这种的疑问。早先人们听iPod只能按照艺人、唱片、歌曲名的方式选取曲。但现在苹果提供了按封面选取的服务。这就是不同的视觉感受,不过现在苹果提供的服务还是最初级的3D效果,而且在滑动封面时还比较卡,如果用了GPU它一定会给你不同的感受。而日常使用的GPS,如果有了三维的呈现,精准度也会大不同。”

GPU挑战大型机

庄海欧用一个个不同的例子来佐证GPU的神奇。他说,在高性能计算中GPU的作用更加强大,以往以CPU为处理核心的大型计算机多台联网才而可以完成的计算,通过GPU处理只需很少的终端,其成本也只有原来的十分之一。

庄海欧表示,人们应该改变对服务器和PC的选购标准。“同样的价格,如果选用一个更好的GPU,普通的CPU带来的视觉感受一定会比相反的选择高数倍。同样,对于石油勘探、宇宙模型计算、动态画面模拟等高性能计算领域,资金投资在GPU,会比用在CPU上为你带来数倍,甚至数十倍效果提升。”

和英特尔AMD比速度

不过CPU制造商们 也并没有闲着。AMD在并购ATI时看重的就是后者在显示领域的优势。而在并购ATI之初,AMD就提出开发CPU+GPU组合的Fusion处理器设 想。而英特尔在今年IDF(英特尔技术开发者大会)上也表示,将开发一套面向可编程的显示计算通用架构芯片Larrabee架构,它令CPU内整合图形处 理芯片成为现实。

面对两家竞争对手的提出的整合概念,NVIDIA并不特别担心。庄海欧表示,CPU和GPU是两个完全不同,CPU是解决程序运行,GPU核心是解决并行计算,两者很难实现完全融合。而且独立显卡与集成显卡的优劣,犹如台式机和笔记本电脑在性能上差别,前者永远会好于后者。目前,NVIDIA与英特尔和AMD也都保持着良好的合作关系,他们也希望NVIDIA可以为其提供更好的GPU,实现更好的整机机能。

“条条大路通罗马,就看谁跑得快,所有的竞争都是在比速度。”庄海鸥说。


http://news.csdn.net/n/20080509/115809.html

标签: , ,

Borland以2300万美元卖掉CodeGear开发工具部门

2008年5月7日,Thoma Cressey Bravo下的公司Embarcadero Technologies,宣布他们已经签署了一份对Borland Software Corporation (NASDAQ: BORL) 的资产收购协议, 收购其旗下的CodeGear公司。交易将会在30-60天内结束。公司合并后,将会在Embarcadero Technologies名下运作。

Thoma Cressey Bravo的合伙人Orlando Bravo说:“应用程序和数据库开发正在降温,这两家公司的协作是非常及时且合理的。”Jim Douglas, CodeGear的CEO说:“今天的宣布对于我们CodeGear的客户、员工、合作伙伴和社区来说,是一个好消息。我们可以将资源更集中的专注在我们的核心产品和市场上”。

整个收购额大约在2300万美元左右, 而Borland将继续拥有CodeGear大约700万的未收账款的权力。

CodeGear 所销售的产品都是Borland最知名的,包括JBuilder、Java开发工具、Delphi与C++Builder。最近CodeGear还创造了PHP与Ruby的开发工具。

两年前,Borland首席执行官Tod Nielson宣布计划卖掉这个工具部门,好让它能与应用生命周期管理产品线分开。工具部门难以生存是因为来自免费开放源代码产品的竞争,尤其是Eclipse IDE。

CodeGear产品主要是以个别程序设计师为主,而生命周期管理产品则是为整组的开发者、测试人员与架构师而设计。

该消息宣布后,Borland迟迟无法找到买主。

这次出面买下的Embarcadero主要销售资料库管理与设计工具,年营收6000万美元。这项收购将可让这家公司接触到好几百万使用CodeGear软件的开发人员。

http://news.csdn.net/n/20080509/115826.html

标签: , ,

让人悲伤的消息,CodeGear被收购

Borland出售Code Gear予Embarcadero公司

旧金山消息-Borland公司已将其开发工具部门CodeGear出售给Embarcadero Technologies公司。

Embarcadero称,这将合并开发工具市场和数据库工具市场上的领袖厂商。收购涉及金额高达3000万美金,将在30-60日内完成收购。

“CodeGear拥有忠实的开发者社区和全球渠道,是公认的市场领导者,”Embarcadero Technologies公司CEO Wayne Williamd在声明说。“通过对其强大产品线的整合,Embarcadero将扩展到新市场、开发先进产品、引领业界飞跃。两家公司的合并将为客户及合作伙伴释放巨大潜能。”

Embarcadero说,合并将把Embarcadero造就成全球最大的平台独立软件供应商。

“这对CodeGear客户、雇员、合作伙伴和社区是个大好消息,”CodeGear CEO Jim Douglas在声明中说。“我们将拥有更多资源,集中于核心产品及市场。”

CodeGear生产Java和Windows开发工具,例如JBuilder、Delphi等。该公司也在进入Ruby on Rails开发工具市场。

CodeGear于2006年从Borland公司独立出来,当时Borland决定将业务集中在应用程序生命周期管理市场,但找不到合适的买主来收购开发工具部门,于是CodeGear成为独立的子公司。

合并后的机构将以Embarcadero Technologies的名义运作,不过还没决定是否完全放弃CodeGear的名称。

在2300万美元的收购价之外,Borland还将保有700万美元的CodeGear应收账款

http://news.csdn.net/n/20080509/115830.html


标签: , ,

星期六, 五月 10, 2008

如何通过smarty生成静态化网页

Smarty最大的功能是做模版的页面缓存。也就是通过Smarty可以完成两个步骤:编译+解析

第一步:编译。是指把模版文件的标签替换为纯php,再保存在缓存位置,保存的文件扩展名是PHP,我把这个步骤叫做编译(这是我自己的叫法,不是官方的)

第二步:解析。也就是把刚才编译的PHP文件解析执行而已~~这个就不用多做解释了

切入正题,在Smarty.class.php文件中加入如下代码

function MakeHtmlFile($file_name, $content)
{ //目录不存在就创建
if (!file_exists (dirname($file_name))) {
if (!@mkdir (dirname($file_name), 0777)) {
die($file_name."目录创建失败!");
}
}

if(!$fp = fopen($file_name, "w")){
echo "文件打开失败!";
return false;
}


if(!fwrite($fp, $content)){
echo "文件写入失败!";
fclose($fp);
return false;
}

fclose($fp);
chmod($file_name,0666);
} 这个函数的作用就是保存文件~~

调用方法如下

require '../libs/Smarty.class.php';


$smarty = new Smarty;


//…………省略变量定义和赋值


//$smarty->display('index.tpl');
$content=$smarty->fetch("index.tpl");

$smarty->MakeHtmlFile('./index.html',$content);//生成

http://hi.baidu.com/anvycn/blog/item/a313761ec50fbaf01bd5768d.html

标签: , , , ,

提高网页打开速度的一些小技巧

互联网带宽越来越宽,似乎让网页的加载速度得到了质的飞跃。其实不然,因为随着带宽的提高,网页上的对象也越来越多,因此加快网页打开速度还是一个重要的课题。加快网页的打开速度,有三个路径,一是提高网络带宽,二是用户在本机做优化,三是网站设计者对网页做一定的优化。这篇文章站在一个网站设计者的角度,分享一些优化网页加载速度的小技巧。



一、优化图片

几乎没有哪个网页上是没有图片的。如果你经历过56K猫的年代,你一定不会很喜欢有大量图片的网站。因为加载那样一个网页会花费大量的时间。

即使在现在,网络带宽有了很多的提高,56K猫逐渐淡出,优化图片以加快网页速度还是很有必要的。

优化图片包括减少图片数、降低图像质量、使用恰当的格式。

1、减少图片数:去除不必要的图片。

2、降低图像质量:如果不是很必要,尝试降低图像的质量,尤其是jpg格式,降低5%的质量看起来变化不是很大,但文件大小的变化是比较大的。

3、使用恰当的格式:请参阅下一点。

因此,在上传图片之前,你需要对图片进行编辑,如果你觉得photoshop太麻烦,可以试试一些在线图片编辑工具。懒得编辑而又想图片有特殊的效果?可以试试用过调用javascript来实现图片特效

二、图像格式的选择

一般在网页上使用的图片格式有三种,jpg、png、gif。三种格式的具体技术指标不是这篇文章探讨的内容,我们只需要知道在什么时候应该使用什么格式,以减少网页的加载时间。

1、JPG:一般用于展示风景、人物、艺术照的摄影作品。有时也用在电脑截屏上。

2、GIF:提供的颜色较少,可用在一些对颜色要求不高的地方,比如网站logo、按钮、表情等等。当然,gif的一个重要的应用是动画图片。就像用Lunapic制作的倒映图片

3、PNG:PNG格式能提供透明背景,是一种专为网页展示而发明的图片格式。一般用于需要背景透明显示或对图像质量要求较高的网页上。

三、优化CSS

CSS叠层样式表让网页加载起来更高效,浏览体验也得到提高。有了CSS,表格布局的方式可以退休了。

但有时我们在写CSS的时候会使用了一些比较罗嗦的语句,比如这句:


margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;

你可以将它简化为:

margin: 10px 20px 10px 20px;

又或者这句:

A paragraph of decorated text


Second paragraph


Third paragraph


Forth paragraph



可以用div来包含:


A paragraph of decorated text


Second paragraph


Third paragraph


Forth paragraph




简化CSS能去除冗余的属性,提高运行效率。如果你写好CSS后懒得去做简化,你可以使用一些在线的简化CSS工具,比如CleanCSS

四、网址后加斜杠

有些网址,比如"www.kenengba.com/220",当服务器收到这样一个地址请求的时候,它需要花费时间去确定这个地址的文件类型。如果220是一个目录,不妨在网址后多加一个斜杠,让其变成www.kenengba.com/220/,这样服务器就能一目了然地知道要访问该目录下的index或default文件,从而节省了加载时间。

五、标明高度和宽度

这点很重要,但很多人由于懒惰或其它原因,总是将其忽视。当你在网页上添加图片或表格时,你应该指定它们的高度和宽度,也就是height和width参 数。如果浏览器没有找到这两个参数,它需要一边下载图片一边