PowerDesigner 12 试用版一直使用下去的方法

大学时候经过导师推荐,我是一直从 9 用上来的,感觉不错。11 版本对 mysql 支持不好。12 已经支持到了 mysql 5。虽然现在更多工作在 Oracle 下,但是 mysql 似乎还是无法彻底扔掉。所以找来 12 用用。

Power Designer 12 官方下载地址:URL http://download.sybase.com/eval/PowerDesigner/powerdesigner12_eval.exe

破解方法不是我搞出来的,放到这里纯粹备忘。请诸位访客忽略下面的内容。

PowerDesigner 12 通用破解方法

修改安装目录下的pdflm12.dll文件,使用二进制编辑器打开此文件,查找:83 C4 14 8B 85 E4 FE FF FF将此字符串改为83 C4 14 33 C0 90 90 90 90

 修改好的文件

如何正确的编译 Zend Framework 手册的 chm 版本

或许早就应该写一下这个方法了,只是一直没有什么心情。这会休息,就随手敲打敲打吧。

由于我的环境是 windows,所以需要额外安装一些辅助软件。windows 下编译 docbook 的方法有许多种。我以前使用 java 写的一个工具,不过后来发现 cygwin 比较方便。

详细的 cygwin 以及 docbook 编译必须的包请看 hohappy 编写的指南:http://www.phpeye.com/article/view/id/55

废话不说了,现在看看如何编译chm。首先需要编译 chm 对应的 xsl。我使用sf.net 下载的 docbook-xsl-1.72.0。其中包含 /htmlhelp/htmlhelp.xsl。 Continue reading “如何正确的编译 Zend Framework 手册的 chm 版本”

关于7月15日腾讯活动的一些反面观点

我这个人是不是太爱唱反调了?呵呵,管他呢。

言归正传。大家先看一帖:http://www.phpchina.com/bbs/thread-30529-1-1.html

首先,小路这帖总结写得,实在是天花乱坠。很多没有参加的朋友看了一定口水直流:腾讯技术使用状况、PHP 的设计模式、PHP 框架的使用、大负载缓存……但是我认为这次聚会就技术而言是失败的。请注意,仅仅是技术而言!

那就先说说腾讯技术使用状况这个话题吧。听完这个使用状况,对于我来说印象最深的就是腾讯 50 亿美金的市值。没错,是这个。至于其他的内容,不知道是美金太吸引我,还是介绍的时候轻描淡写一带而过,反正我没看到腾讯在 web 应用整体技术架构上的闪光点。反而,在一些细节技术上用得非常粗枝大叶。比如拥有众多 C 程序员的腾讯在分流服务器同步上使用的是 shell 脚本实在令我费解;而在 mysql 本身提供了memory table 的前提下,又用 C 编写了一个带有 SQL 查询功能的 cache。当然,架构的细节可能由于一些原因,不能让大家一窥,但是就透漏出来的信息,无法体现腾讯的技术亮点。 Continue reading “关于7月15日腾讯活动的一些反面观点”

为提升便利性,为 ninny Project 添加两个脚本工具

工具存放地址:svn://www.i-fang.com/IfangSites/trunk/app/bin

说明:这些工具是为快速开发编写的,请不要尝试在部署的时候使用。因为,多数服务器无法使用 CLI 方式执行 PHP 脚本。而这些工具只能执行于 CLI 模式下。

  1. collectResouces.php —— 资源收集工具

    我一直为 ACL 中资源的管理而烦恼,所以编写了这个工具。对于通用性资源(module、controller、action)进行采集,并按照顺序插入数据库中的资源表。
    使用方法:php collectResouces.php
  2. createModule.php —— 模块、控制器、动作自动创建工具

    其实编写 Controller Action 和 View Script 的第一步工作都是一样的。创建目录,创建文件,添加固定的内容……对于我来说,很烦。所以编写了这个脚本可以通过简单的 Yes/No 方式自动创建必要的目录、文件、代码框架。
    使用方法:php createModule.php

基于 Zend Framework 的整合快速开发结构

在思考现有项目代码重构的过程中的附带产品。主要是基于 Zend Framework 并对其中一些内容进行扩展、整合。放弃部分灵活性,同时提高耦合度为代价,换取开发速度的提升。

我准备将这个项目的代号命名为“ninny”。

项目SVN : svn://www.i-fang.com/IfangSites

项目页面:http://blog.xxiyy.com/?page_id=21

欢迎拍砖。

现有 E-R 图,权限控制部分

E-R 图

php 5 中使用get成员方法返回对象可能存在的问题。

"错误的类设计可能会改变本不应该改变的成员属性。"这个问题是在看 Java 的时候书中提到的。PHP5 默认传递的也是引用,那么可能也存在这个问题。于是跳下床来,做了个试验。果然……

先看一段代码:

<?php 
/**
 * privateClass 
 *
 * 一个私有的类,在 publicClass 中使用
 */
class privateClass
{
    
/**
     * name
     *
     * 保存一个名字 
     * 
     * @var string
     * @access protected
     */
    
protected $name '';
    
/**
     * __construct
     *
     * 构造函数 
     * 
     * @param string $name 
     * @access public
     * @return void
     */
    
public function __construct($name)
    {
        
$this->setName($name);
    }

    /**
     * getName 
     *
     * 获得名字
     * 
     * @access public
     * @return string
     */
    
public function getName()
    {
        return 
$this->name;
    }

    /**
     * setName
     *
     * 设置名字 
     * 
     * @param string $name 
     * @access public
     * @return void
     */
    
public function setName($name)
    {
        
$this->name $name;
    }
}
Continue reading "php 5 中使用get成员方法返回对象可能存在的问题。"

就之前性能测试反馈的一些补充

我说过对于FXXX 不在公开场所将其同 Zend Framework 比较的这样的话。所以我在这里做一些补充说明,一些是关于技术的,一些是关于技术人员应有的技术涵养的。

在收到性能测试的反馈之后,我特别进行了测试:

在 include(‘FXXX.php’) 之前定义:

define(‘NO_LEGACY_FXXXPHP’, true);

则 FxxxPHP 只会载入两个文件:FXXX.php (核心)和 Config/DEBUG_MODE_CONFIG.php(默认的设置文件,用于调试模式)。而不会再载入 Compatibility.php 文件。此时,开发者按照 FxxxPHP 1.0.70 的规范编写应用程序即可。而 Compatibility.php 是为了方便 FxxxPHP 1.0.60 应用程序升级而设置的。

于是,我将这个开关加到之前的测试之上。很遗憾,在50次测试中,只有两次 FXXX 比 Zend Framework 快。

据说,在 L 兄的测试中通过修改了两行多余的代码,使得 FXXX 的执行快过了 Zend Framework。我没有办法测试,因为他并没有给出这个修改方法。不过我想也有可能的,因为框架本身在 loadClass 上的工作几乎完全相同。那么通过优化是完全可以得到相同的效能。 Continue reading “就之前性能测试反馈的一些补充”

关于 Zend Framework 和国产 FXXX 在类加载性能上的测试

 之前,FXXX 的主要开发者 L 兄曾经在 phpchina 上同我做过一些讨论。当然讨论的结果似乎不能令人满意。FXXX 对于我一直所诟病的数据库支持对于 L 兄来说似乎不是什么大的问题。而 Zend Framework 对于他来说似乎也是一直拥有效率黑洞,以及大而不精等诸多糟粕。Zend Framework 即将成为 PEAR2 是 L 兄一个比较精辟的形容。

项目中最初推翻 FXXX 转而使用 Zend Framework 主要是由于 Orcale 的支持问题。但是这个问题似乎是 FXXX 的软肋,不能碰,一碰就招致狂风暴雨般的质问。当然,质问的内容不是框架的数据库支持。而是触碰这个软肋的人的技术水平问题。而 Zend Framework 的性能黑洞,也让我带着意思疑虑。Zend Framework 的性能是否真的不可调和,这个框架是否真的又臃肿,又庞大?带着这个问题,我做了以下试验:

试验内容:为了检测 Zend Framework 的性能到底如何,我必须选择一个参照对象。很遗憾,优秀的 FXXX 被选中了。因为这个性能的疑虑正是 L 兄带给我的,所以………….解铃还需系铃人。

那么对两个框架所有的部分都进行测试,似乎不太可能。这绝对是超出我能力范围的。那么我选择了 Loader 作为测试的内容。两个框架都有各自的加载类的方法。而这个方法又是在所有使用框架的开发中需要使用的。

Zend_Loader::loadClass() vs FXXX::loadClass()

我首先在Doc Root  目录中创建了 Zend 和 FXXX 目录,用于存放两个框架必要的文件。既然是测试 Loader 那么只要存放必要的 Loader 文件就可以了。顺便可以测试一下两个框架的耦合度。 Continue reading “关于 Zend Framework 和国产 FXXX 在类加载性能上的测试”

手册中 Zend_Db_Table 的表关系例子的 E-R 图及部分解释

在 Zend Framework 的 9.8. Zend_Db_Table Relationships 章节中,介绍了使用 Zend_Db_Table 关联表的例子。我听过不少人都觉得这部分相当难理解。我觉得手册如果能给出例子中所用数据表的E-R图,那么能帮助大家更清晰的理解这个例子。

E-R 图:

Zend_Db_Table 例子中的 E-R 图

建表用 SQL 语句 (MYSQL 5.0):


— 表的结构 `accounts`

CREATE TABLE `accounts` (
`account_name` varchar(50) NOT NULL,
PRIMARY KEY (`account_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


— 表的结构 `bugs`

CREATE TABLE `bugs` (
`bug_id` varchar(50) NOT NULL,
`reported_by` varchar(50) NOT NULL,
`assigned_to` varchar(50) NOT NULL,
`verified_by` varchar(50) NOT NULL,
PRIMARY KEY (`bug_id`),
KEY `reported_by` (`reported_by`),
KEY `assigned_to` (`assigned_to`),
KEY `verified_by` (`verified_by`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; Continue reading “手册中 Zend_Db_Table 的表关系例子的 E-R 图及部分解释”

Zend Framework 代码分析——Zend_Loader

Zend_Loader 应该是 Zend Framework 中相对简单的类。所有方法都为静态方法,用于加载(loading)类或文件(loadClass、loadFile、autoload、registerAutoload 方法),以及加载类或文件时进行的必要判断(isReadable 方法)。

Zend_Loader 从 3834 版本被加入 Zend Framework 并没有太多的改动。除了 4259 版本添加了 registerAutoload 方法。

public static function loadClass($class, $dirs = null)

方法是高效的加载类的方法。类的文件命名必须是 {$className}.php。当第二个参数 $dirs 为文件夹名或元素是文件夹名的数组时,将从这些文件夹中找到第一个匹配的文件进行加载。而如果 $dirs 为 null,则将类名的下划线作为分隔,划分为文件夹。例如 Zend_Foo_Bar,将会加载 Zend/Foo/Bar.php这个文件。若无法在上述所有地方找到可用的文件加载类,则将对 include_path进行搜索。

if (class_exists($class, false) || interface_exists($class, false)) {

return;

}

首先判断是否已经加载,这里使用了 interface_exists,在 php 中 interface 可以被认为是一种特殊的类。

if ((null !== $dirs) && !is_string($dirs) && !is_array($dirs)) {

require_once 'Zend/Exception.php';
throw new Zend_Exception('Directory argument must be a string or an array');

}
if (
null === $dirs) {

$dirs = array();

}
if (
is_string($dirs)) {

$dirs = (array) $dirs;

}

若类和接口没有被加载,则对 $dirs 进行验证,判断是否为合法的类型:null、字符串、数组,否则抛出异常。而最终 $dirs 都将转换为数组处理。 Continue reading “Zend Framework 代码分析——Zend_Loader”