Archive for 十月, 2007

Zend_Session学习笔记(源码)

Posted by 机器人 on 29th 十月 2007 in php/javascript

摘自:zendFramework官方参考文档

/**
         * @author hqlong
         * @created:2007-10-1
         */
        public function indexAction(){
            require_once 'Zend/Session/Namespace.php';

            $defaultNamespace = new Zend_Session_Namespace('Default');
            if (isset($defaultNamespace->numberOfPageRequests)) {
            $defaultNamespace->numberOfPageRequests++;
            // this will increment for each page load.
            } else {
            $defaultNamespace->numberOfPageRequests = 1; // first time
            }
            echo "Page requests this session: ", $defaultNamespace->numberOfPageRequests;

            $authNamespace = new Zend_Session_Namespace('Zend_Auth');
            //$authNamespace->lock();
            $authNamespace->unlock();
            $authNamespace->user = "myusername";

            echo $authNamespace->user;
            //in a web services component
            $webServiceNamespace = new Zend_Session_Namespace('Some_Web_Service');
            $webServiceNamespace->user = "mywebusername";

            //防止每个请示有多个实例

            // create an instance of a namespace
            $authSpaceAccessor1 = new Zend_Session_Namespace('Zend_Auth');

            // create another instance of the same namespace, but disallow any new instances
            $authSpaceAccessor2 = new Zend_Session_Namespace('Zend_Auth', true);

            // making a reference is still possible
            $authSpaceAccessor3 = $authSpaceAccessor2;

            $authSpaceAccessor1->foo = 'bar';

            if($authSpaceAccessor2->foo=='bar') echo 'ok'; else echo 'not ok';

            try {
                $aNamespaceObject = new Zend_Session_Namespace('Zend_Auth');
            } catch (Zend_Session_Exception $e) {
                echo "Cannot instantiate this namespace
                since $authSpaceAccessor2 was created\n";
            }

        }

 

机器人 2007-10-29 于北京

JOIN联表中ON,WHERE后面跟条件的区别

Posted by 机器人 on 24th 十月 2007 in mysql

对于JOIN的连表操作,这里就不细述了,当我们在对表进行JOIN关联操作时,对于ON和WHERE后面的条件,不清楚大家有没有注意过,有什么区别,可能有的朋友会认为跟在它们后面的条件是一样的,你可以跟在ON后面,如果愿意,也可以跟在WHERE后面。

这对于有的情况来讲,可能会是正确的,不过那种正确纯属于运气好,给撞上了。对于JOIN后面所跟条件,它们在ON和WHERE后面究竟有一个什么样的区别呢?

在JOIN操作里,有几种情况。LEFT JOIN,RIGHT JOIN,INNER JOIN等。

为了清楚的表达主题所描述的问题,我简要的对LEFT,RIGHT,INNER这几种连接方式作一个说明。

下面就拿一个普通的博客系统的日志表(post)和分类表(category)来描述吧。

这里我们规定有的日志可能没有分类,有的分类可能目前没有属于它的文章。

1.    LEFT JOIN:

(保证找出左联表中的所有行)

查出所有文章,并显示出他们的分类:

 

SELECT p.title,c.category_name FROM post p LEFT JOIN category c ON p.cid = c.cid

2.    RIGHT JOIN:

(保证找出右联表中的所有行)

查询所有的分类,并显示出该分类所含有的文章数。

 

SELECT COUNT(p.id),c.category_name FROM post p RIGHTJOIN  category c ON p.pid = c.cid

3.    INNER JOIN

(找出两表中关联相等的行)

查询有所属分类的日志。(即那些没有所性分类的日志文章将不要我们的查询范围之内)。

 

SELECT p.title,c.category_name FROM post p INNER JOIN category c ON p.cid = c.cid.

这种情况和直接两表硬关联等价。

现在我们回过头来看上面的问题。

对于第一种情况,如果我们所ON 的条件写在WHERE 后面,将会出现什么情况呢?

即:

 

SELECT p.title,c.category_name FROM post p LEFT JOIN category c WHERE  p.cid = c.cid

对于第二种情况,我们同样按照上面的书写方式。

 

SELECT COUNT(p.id),c.category_name FROM post p RIGHTJOIN  category c WHERE p.pid = c.cid

如果运行上面的SQL语句,就会发现,它们已经过滤掉了一些不满足条件的记录,可能在这里,大家会产生疑问了,不是用了LEFT和RIGHT吗?它们可以保证左边或者右边的所有行被全部查询出来,为什么现在不管用了呢?对于出现这种的问题,呵呵!是不是觉得有些不可思议。

出现这种的问题,原因就在WHERE和ON这两个关键字后面跟条件。

好了,现在我也不调大家味口了,给大家提示答案吧。

对于JOIN参与的表的关联操作,如果需要不满足连接条件的行也在我们的查询范围内的话,我们就必需把连接条件放在ON后面,而不能放在WHERE后面,如果我们把连接条件放在了WHERE后面,那么所有的LEFT,RIGHT,等这些操作将不起任何作用,对于这种情况,它的效果就完全等同于INNER连接。对于那些不影响选择行的条件,放在ON或者WHERE后面就可以。

记住:所有的连接条件都必需要放在ON后面,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用。

这个问题是前几天在我们phpoo讨论区里提的问题,一直没有写出比较详细的区别,其实这个问题完全可以用一句话描述清楚,那么,为什么我要在这里写上这么多啰嗦的话,主要是因为在对自己的知识进行巩固的同时,我也希望能给更多的朋友带来方便,而且现在我们的phpoo团队里各成员的水平参差不齐,所以为了照顾更多的人,才多啰嗦了这么几句,希望团里面的高手们不了笑话。

如果朋友你感兴趣:可以加入我们的论坛一起探讨该主题:http://bbs.phpexp.cn/viewthread.php?tid=79&extra=page%3D1

又快到11点了,完了,今天好像看不了书了。哎!没关系,和老单聊十几分钟天就休息。。

机器人 2007-10-24 10:43 于北京。

SQL:LEFT JOIN 多次连接同一张表

Posted by 机器人 on 22nd 十月 2007 in mysql

以前一直没有注意到LEFT JOIN 多次向同一表进行连接所带来的快捷,本来以为一条SQL语句实现不了,后来同事给指点了下,最后用了一条SQL语句给解决了。实在找不到比较容易的例子来说明这个问题,所以暂时只能先帖上SQL语句了,等那天想到了,再把详细清单给附上。

代码如下:

SELECT
    [募资公布日]=CONVERT(varchar(10),CFIP2,121),
    [发行起始日]=CONVERT(varchar(10),PublishDate,121),
    [发行截止日]=CONVERT(varchar(10),CFIP1,121), [发行方式]=CFIP28,
    [发行类型]=CFIP5,
    [发行前总份额]=CFIP7,
    [扩募比例]=CFIP6,
    [权益登记日]=CONVERT(varchar(10),CFIP14,121),
    [除权基准日]=CONVERT(varchar(10),CFIP15,121),
    [本次发行份额]=CFIP8,
    [单位面值]=CFIP9,
    [单位发行价]=CFIP10,
    [单位发行费用]=CFIP11,
    [募集资金合计]=CFIP17,
    [发起人认购]=CFIP12,
    [社会认购份额]=CFIP26,
    [发行中签率]=CFIP18,
    [认购倍数]=CFIP22,
    [扩募协调人]=ISNULL(p.FParty5,'-'),
    [上市推荐人]=ISNULL(p1. FParty5,'-'),
    [主承销商]=ISNULL(p2. FParty5,'-')
FROM CFIP c LEFT JOIN FParty p ON c.Symbol = p.Symbol AND  p.fparty1='发行协调人'
LEFT OUTER JOIN FParty p1 ON c.Symbol = p1.Symbol AND p1.fparty1='基金管理人'
LEFT JOIN FParty p2 ON c.Symbol = p2.Symbol AND p2.fparty1='主承销商'
WHERE c.Symbol = '500011'

 

这里需要说明的是当CFIP表多次向FPARTY表发出左关联,就能一次性取得FPARTY表中多条记录的值。

机器人 2007-10-22  10:29 于 北京 (准备休息了,一般在睡觉之前,总喜欢看上半小时的书,也就是说,我是晚11:00关灯睡觉

SHOW一张个人彩色文本照片

Posted by 机器人 on 22nd 十月 2007 in mylife

Zend_Acl权限控制表

Posted by 机器人 on 22nd 十月 2007 in php/javascript

载自:zendframework中文手册

简介

Zend_Acl 提供轻量并灵活的访问控制列表 (ACL,access control list) 功能和权限管理。一般地,应用软件可以利用这样的功能限制某些特定对象来访问特定保护的对象。

在本文档中,

Resource (资源)是一个限制访问的对象。

Role (角色)是一个可以发出请求去访问Resource的对象。

简单地说就是:Roles 请求访问 Resources。例如,如果一个人要用汽车,这样,这个人就是发出请求的 Role,而这辆汽车就是 Resource,所以使用这辆车就在控制之中了。

通过规范和访问控制列表(ACL)的使用,应用软件可以控制如何授权给发出请求的对象(Roles)来访问被保护的对象(Resources)。

2.1.1. 关于资源(Resource)

在 Zend_Acl 中,创建建一个 Resource 非常简单。Zend_Acl 提供了Zend_Acl_Resource_Interface 使开发者创建 Resources 非常容易。为了使Zend_Acl把某个对象当作一个Resource,一个类只需要实现这个只包含了一个方法 getResourceId() 的接口。 另外,Zend_Acl_Resource是一个包含在 Zend_Acl 里作为一个基本的 Resource 实现的类,开发者可以任意扩展它。

Zend_Acl 提供了一个树结构,它可以添加多个 Resources (或者叫“访问控制下的区域”)。因为 Resources 被存储在这样一个树结构,所以它们可以被组织成从一般(树根)到特殊(树叶)。基于特殊Resource的查询将自动从Resource的等级结构中搜索分配给祖先Resources的规则,它允许简单的规则继承。例如,要把一个缺省的规则应用到一个城市的每个建筑物,就简单地把这个规则分配给这个城市,而不是把规则分配给每个建筑物。然而,有些建筑物也许要求例外的规则,在Zend_Acl里,很容易地通过分配例外规则给每个有这样要求的建筑物来实现。一个 Resource 可以从唯一的一个父 Resource 继承,而这个父 Resource 也有它自己的父 Resource,等等。

Zend_Acl 也支持基于 Resources 的权限(例如:"create", "read", "update", "delete"), 开发者可以根据 Resource 分配影响全部或者特殊权限的规则。

2.1.2. 关于角色(Role)

象 Resources 一样,创建一个 Role 也非常简单。 Zend_Acl 提供了 Zend_Acl_Role_Interface 使开发者创建 Roles 非常容易。为了使Zend_Acl把某个对象当作一个 Role,一个类只需要实现这个只包含了一个方法 getRoleId() 的接口。 另外,Zend_Acl_Role是一个包含在Zend_Acl里作为一个基本的 Role 实现的类,开发者可以任意扩展它。

在 Zend_Acl, 一个 Role 可以从一个或多个 Role 继承,这就是在 Role 中支持规则的继承。例如,一个用户 Role,如 “sally”,可以属于一个或多个 Role,如:“editor”和“administrator”。开发者可以分别给“editor”和“administrator”分配规则,而 “sally”将从它们俩继承规则,不需要直接给“sally”分配规则。

虽然从多重角色继承的能力非常有用,但是多重继承也带来了一定程度的复杂性。下面的例子来示例含糊情形和Zend_Acl如何解决它。

测试代码:

<?php
    /**
     * Zend_Acl测试代码
     * @created:2007-10-22
     */
    class AclController extends Zend_Controller_Action {
        public function init(){
            $this->_helper->viewRenderer->setNoRender();
            require_once 'Zend/Acl.php';
        }
        public function indexAction(){
            $acl = new Zend_Acl();
            require_once 'Zend/Acl/Role.php';
            $acl->addRole(new Zend_Acl_Role('guest'))
            ->addRole(new Zend_Acl_Role('member'))
            ->addRole(new Zend_Acl_Role('admin'));

            $parents = array('guest', 'member', 'admin');
            $acl->addRole(new Zend_Acl_Role('someUser'), $parents);
            require_once 'Zend/Acl/Resource.php';
            $acl->add(new Zend_Acl_Resource('someResource'));

            $acl->deny('guest', 'someResource');
            $acl->allow('member', 'someResource');
            echo $acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';
        }
        /**
         * 2.1.4. 注册角色(Role)
         * @date 2007-10-22
         */
        public function test2Action(){
            $acl = new Zend_Acl();
            // 用 Zend_Acl_Role 把组添加到 Role 注册表 
            require_once 'Zend/Acl/Role.php';
            // Guest 不继承访问控制
            $roleGuest = new Zend_Acl_Role('guest');
            $acl->addRole($roleGuest);
            // Staff 从 guest 继承
            $acl->addRole(new Zend_Acl_Role('staff'), $roleGuest);
            /* 另外, 上面的也可这样来写:
            $roleGuest = $acl->addRole(new Zend_Acl_Role('staff'), 'guest');
            //*/
            // Editor 从 staff 继承
            $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
            // Administrator 不继承访问控制
            $acl->addRole(new Zend_Acl_Role('administrator'));
        }
        /**
         * 定义访问控制
         * @date 2007-10-22
         * @author hqlong
         */
        public function test3Action(){
            $acl = new Zend_Acl();
            require_once 'Zend/Acl/Role.php';
            $roleGuest = new Zend_Acl_Role('guest');
            $acl->addRole($roleGuest);
            $acl->addRole(new Zend_Acl_Role('staff'), $roleGuest);
            $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
            $acl->addRole(new Zend_Acl_Role('administrator'));
            // Guest 只可以浏览内容
            $acl->allow($roleGuest, null, 'view');
            /* 另外, 上面也可写为:
            $acl->allow('guest', null, 'view');
            //*/
            // Staff 从 guest 继承浏览权限,但也要另外的权限
            $acl->allow('staff', null, array('edit', 'submit', 'revise'));
            // Editor 从 Staff 继承 view, edit, submit 和 revise 权限
            // 但也要另外的权限
            $acl->allow('editor', null, array('publish', 'archive', 'delete'));
            // Administrator 不需要继承任何权限,它拥有所有的权限
            $acl->allow('administrator');
        }
        /**
         * 查询 ACL
         *
         */
        public function test4Action(){
            $acl = new Zend_Acl();
            require_once 'Zend/Acl/Role.php';
            $roleGuest = new Zend_Acl_Role('guest');
            $acl->addRole($roleGuest);
            $acl->addRole(new Zend_Acl_Role('staff'), $roleGuest);
            $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
            $acl->addRole(new Zend_Acl_Role('administrator'));
            // Guest 只可以浏览内容
            $acl->allow($roleGuest, null, 'view');
            /* 另外, 上面也可写为:
            $acl->allow('guest', null, 'view');
            //*/
            // Staff 从 guest 继承浏览权限,但也要另外的权限
            $acl->allow('staff', null, array('edit', 'submit', 'revise'));
            // Editor 从 Staff 继承 view, edit, submit 和 revise 权限
            // 但也要另外的权限
            $acl->allow('editor', null, array('publish', 'archive', 'delete'));
            // Administrator 不需要继承任何权限,它拥有所有的权限
            $acl->allow('administrator');
            echo $acl->isAllowed('guest', null, 'view') ? "allowed" : "denied"; // 允许
            echo $acl->isAllowed('staff', null, 'publish') ?"allowed" : "denied"; // 禁止
            echo $acl->isAllowed('staff', null, 'revise') ?
            "allowed" : "denied"; // 允许
            echo $acl->isAllowed('editor', null, 'view') ?
            "allowed" : "denied"; // 允许,因为从 guest 继承而来
            echo $acl->isAllowed('editor', null, 'update') ?
            "allowed" : "denied"; // 禁止,因为对于 'update' 没有 allow 规则
            echo $acl->isAllowed('administrator', null, 'view') ?
            "allowed" : "denied"; // 允许,因为 administrator 有所有权限
            echo $acl->isAllowed('administrator') ?
            "allowed" : "denied"; // 允许,因为 administrator 有所有权限
            echo $acl->isAllowed('administrator', null, 'update') ?
            "allowed" : "denied"; // 允许,因为 administrator 有所有权限echo $acl->isAllowed('guest', null, 'view') ?

            echo $acl->isAllowed('staff', null, 'publish') ?
            "allowed" : "denied"; // 禁止

            echo $acl->isAllowed('staff', null, 'revise') ?
            "allowed" : "denied"; // 允许

            echo $acl->isAllowed('editor', null, 'view') ?
            "allowed" : "denied"; // 允许,因为从 guest 继承而来

            echo $acl->isAllowed('editor', null, 'update') ?
            "allowed" : "denied"; // 禁止,因为对于 'update' 没有 allow 规则

            echo $acl->isAllowed('administrator', null, 'view') ?
            "allowed" : "denied"; // 允许,因为 administrator 有所有权限

            echo $acl->isAllowed('administrator') ?
            "allowed" : "denied"; // 允许,因为 administrator 有所有权限

            echo $acl->isAllowed('administrator', null, 'update') ?
            "allowed" : "denied"; // 允许,因为 administrator 有所有权限
        }
        public function test5Action(){
            $acl = new Zend_Acl();
            require_once 'Zend/Acl/Role.php';
            $roleGuest = new Zend_Acl_Role('guest');
            $acl->addRole($roleGuest);
            $acl->addRole(new Zend_Acl_Role('staff'), $roleGuest);
            $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
            $acl->addRole(new Zend_Acl_Role('administrator'));
            // Guest 只可以浏览内容
            $acl->allow($roleGuest, null, 'view');
            /* 另外, 上面也可写为:
            $acl->allow('guest', null, 'view');
            //*/
            // Staff 从 guest 继承浏览权限,但也要另外的权限
            $acl->allow('staff', null, array('edit', 'submit', 'revise'));
            // Editor 从 Staff 继承 view, edit, submit 和 revise 权限
            // 但也要另外的权限
            $acl->allow('editor', null, array('publish', 'archive', 'delete'));
            // Administrator 不需要继承任何权限,它拥有所有的权限
            $acl->allow('administrator');
            // 新 marketing 组从 staff 组继承许可
            $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
            require_once 'Zend/Acl/Resource.php';
            $acl->add(new Zend_Acl_Resource('newsletter'));           // newsletter
            $acl->add(new Zend_Acl_Resource('news'));                 // news
            $acl->add(new Zend_Acl_Resource('latest'), 'news');       // latest news
            $acl->add(new Zend_Acl_Resource('announcement'), 'news'); // announcement news
            // Marketing must be able to publish and archive newsletters and the latest news
            $acl->allow('marketing', array('newsletter', 'latest'), array('publish', 'archive'));
            // Staff (和 marketing, 通过继承), 禁止修订 latest news
            $acl->deny('staff', 'latest', 'revise');
            // Everyone (包括 administrators) 禁止归档 news announcements
            $acl->deny(null, 'announcement', 'archive');
            echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
            "allowed" : "denied"; // denied

            echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
            "allowed" : "denied"; // allowed

            echo $acl->isAllowed('staff', 'latest', 'publish') ?
            "allowed" : "denied"; // denied

            echo $acl->isAllowed('marketing', 'latest', 'publish') ?
            "allowed" : "denied"; // allowed

            echo $acl->isAllowed('marketing', 'latest', 'archive') ?
            "allowed" : "denied"; // allowed

            echo $acl->isAllowed('marketing', 'latest', 'revise') ?
            "allowed" : "denied"; // denied

            echo $acl->isAllowed('editor', 'announcement', 'archive') ?
            "allowed" : "denied"; // denied

            echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
            "allowed" : "denied"; // denied

            // 除去 “禁止 staff 修订最近的新闻”(和marketing, 由于继承的原因) (等于允许staff修订最近的新闻 Jason注)
            $acl->removeDeny('staff', 'latest', 'revise');

            echo $acl->isAllowed('marketing', 'latest', 'revise') ?
                 "allowed" : "denied"; // allowed

            // 除去 marketing 发布和归档 newsletters 的许可
            $acl->removeAllow('marketing', 'newsletter', array('publish', 'archive'));

            echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
                 "allowed" : "denied"; // denied

            echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
                 "allowed" : "denied"; // denied
            // 允许 marketing 对 latest news 有所有的许可
            $acl->allow('marketing', 'latest');

            echo $acl->isAllowed('marketing', 'latest', 'publish') ?
                 "allowed" : "denied"; // allowed

            echo $acl->isAllowed('marketing', 'latest', 'archive') ?
                 "allowed" : "denied"; // allowed

            echo $acl->isAllowed('marketing', 'latest', 'anything') ?
                 "allowed" : "denied"; // allowed
        }
    }
?>

机器人 2007-10-22 于 北京

动态载入js

Posted by 机器人 on 19th 十月 2007 in php/javascript

 

<script type="text/javascript">
    function LoadJs(sSrc){
        var oHead = document.getElementsByTagName('head')[0];
        var oScript = document.createElement('script');oScript.type = "text/javascript";
        oScript.src = sSrc;
        oHead.appendChild(oScript);
    }
</script>

机器人 2007-10-19 于北京

ajax跨域请求的解决方案

Posted by 机器人 on 19th 十月 2007 in php/javascript

对于所谓的跨域问题,可能没有亲自接触过的朋友很难想像他是怎么回事。

为了让大家有个比较清醒的认识,先请看下面的例子:

当前我的站点为:http://hqlong.com;

那么所有基于http://hqlong.com的访问都属于当前主机域,如果我在当前网内想访问外面的某一网站:http://www.test.com,那么这里,这个站点就已经不再属于当前站点的域了,这里,就称之为跨域访问。

IE和基于Mozilla的浏览器处理跨域请求有所不同。你可以在IE中执行跨域请求;然而,这需要改变浏览器默认的安全设置,或者添加特定的主机到你的“信任主机”列表中。所以当我们在想进行请求域外的一个请求的,这里,就出现了跨域访问,当然,这肯定也是不能成功的。

在实际项目中,很有可能需要用来异步请求域外的站点,对于这种,情况,我们应该怎么办呢?

虽然ajax不具有域外访问的功能,但我们域内的服务器端程序可具有这种访问功能,即:php可以向域外的站点发出请求。所以我们可以把访问的功能转移给本域内的php程序,让它来完成对域外站点的访问。

大致通信流程如下:

ajax -请求->>  http://hqlong.com/auth.php(域内php程序) --请求->> http://www.test.com(域外站点)

ajax请求域内的代码,我这里就不列出来了。大家可以像平时写ajax代码那样来写,只要把需要传递的参数向域内的php程序传递过去就行了,建议大家使用prototype框架的ajax对象来进行请求,它可以使大家很方便得创建一个ajax对象来进行异步请求。

下面来看一下我们的php程序怎么向域外站点进行访问的,当然,如果大家使用zendframework框架的话,里面有现存的Zend_Http_Client类来进行我们的http请求。不过没使用也没关系,我们可以自己写一个。其实它们请求的原理是一样的。

    1.首先建立到目标站点的连接。

    2.向连接资源写入传递的信息。

   这里是我本机的一段测试代码。大家可能把里面的主机,URL,和参数改成自己的来使用。

代码如下:

 

$req = "username=".trim($_POST['username'])."&password=".trim($_POST['password']);
    $header   .=   "POST /test.php HTTP/1.0\r\n";//请求页面
    $header   .=   "HOST: hqlong.com\r\n";//访问主机hqlong.com
    $header   .=   "Content-Type: application/x-www-form-urlencoded\r\n";
    $header   .=   "Content-Length:".strlen($req)."\r\n\r\n";
    //建立起和hqlong.com的连接
    $fp   = fsockopen('hqlong.com', 80,  $errno, $errstr, 30);
    if(!$fp){

    } else {
        fputs($fp,$header.$req);
        while(!feof($fp)){
            $res = fgets($fp, 1024);
            echo $res;
        }
    }
    fclose   ($fp);

 相信上面的请求代码大家一定不会陌生,在这里,大家需要特别注意http头信息的书写格式,一旦它被书写错了,那么我们所请求的页面将不知道如何来解析我们的请求。注意上面的 \r\n,一定要特别注意。

好了,基本上整个实现过程就这样了,虽然在这里没有给大家赋上完整的可运行的源代码,但我相信,大家应该是可以理解的。如果有什么不明白,或者不清楚的地方,欢迎随时进行交流。

机器人 2007-10-19 11:04 (周末人的心情就是不一样)。

 

javascript:事件对象

Posted by 机器人 on 18th 十月 2007 in php/javascript

原文:http://www.w3schools.com/htmldom/dom_examples.asp

Examples:

1. 鼠标的哪个按键被点击?

<html>
<head>
<script type="text/javascript">
function whichButton(event)
{
if (event.button==2)
{
alert("You clicked the right mouse button!")
}
else
{
alert("You clicked the left mouse button!")
}
}
</script>
</head>

<body onmousedown="whichButton(event)">
<p>Click in the document. An alert box will alert which mouse button you clicked.</p>
</body>

</html>

2. 当前鼠标的光标坐标是多少?

<html>
<head>
<script type="text/javascript">
function show_coords(event)
{
x=event.clientX
y=event.clientY
alert("X coords: " + x + ", Y coords: " + y)
}
</script>
</head>

<body onmousedown="show_coords(event)">

<p>Click in the document. An alert box will alert the x and y coordinates of the mouse pointer.</p>

</body>
</html>

3. 被按下键的unicode码是多少?

<html>
<head>
<script type="text/javascript">
function whichButton(event)
{
alert(event.keyCode)
}

</script>
</head>

<body onkeyup="whichButton(event)">
<p><b>Note:</b> Make sure the right frame has focus when trying this example!</p>
<p>Press a key on your keyboard. An alert box will alert the unicode of the key pressed.</p>
</body>

</html>

4. 当前鼠标的光标相对于屏幕的坐标是多少?

<html>
<head>

<script type="text/javascript">
function coordinates(event)
{
x=event.screenX
y=event.screenY
alert("X=" + x + " Y=" + y)
}

</script>
</head>
<body onmousedown="coordinates(event)">

<p>
Click somewhere in the document. An alert box will alert the x and y coordinates of the cursor, relative to the screen.
</p>

</body>
</html>

5. 当前鼠标的光标坐标是多少?

<html>
<head>

<script type="text/javascript">
function coordinates(event)
{
x=event.x
y=event.y
alert("X=" + x + " Y=" + y)
}

</script>
</head>
<body onmousedown="coordinates(event)">

<p>
Click somewhere in the document. An alert box will alert the x and y coordinates of the cursor.
</p>

</body>
</html>

6。shift键是否按下?

<html>
<head>
<script type="text/javascript">
function isKeyPressed(event)
{
  if (event.shiftKey==1)
    {
    alert("The shift key was pressed!")
    }
  else
    {
    alert("The shift key was NOT pressed!")
    }
  }
</script>
</head>

<body onmousedown="isKeyPressed(event)">

<p>Click somewhere in the document. An alert box will tell you if you pressed the shift key or not.</p>

</body>
</html>

7. 当前被点击的是哪一个元素?

<html>
<head>
<script type="text/javascript">
function whichElement(e)
{
var targ
if (!e) var e = window.event
if (e.target) targ = e.target
else if (e.srcElement) targ = e.srcElement
if (targ.nodeType == 3) // defeat Safari bug
   targ = targ.parentNode
var tname
tname=targ.tagName
alert("You clicked on a " + tname + " element.")
}
</script>
</head>

<body onmousedown="whichElement(event)">
<p>Click somewhere in the document. An alert box will alert the tag name of the element you clicked on.</p>

<h3>This is a header</h3>
<p>This is a paragraph</p>
<img border="0" src="ball16.gif" width="29" height="28" alt="Ball">
</body>

</html>

8. 当前发生的是什么事件?

<html>
<head>
<script type="text/javascript">
function getEventType(event)
  {
  alert(event.type);
  }
</script>
</head>

<body onmousedown="getEventType(event)">

<p>Click in the document.
An alert box will tell what type of event
that was triggered.</p>

</body>
</html>

 

机器人 2007-10-18 11:20 于 北京

linux(F7)硬盘安装

Posted by 机器人 on 13th 十月 2007 in linux/server

由于这段时间一直比较忙,本来早想抽时间来对这些锁事进行整理,一直没有找到合适的时间,今天礼拜五,可以晚睡一会,进而来完成这项工作,这样不但能供日后自己参考,还能为更多的朋友提供方便。

对于从硬盘安装,或许都不是很陌生,比如在安装xp系统的时间,如果没有光盘,那么我们可能从DOS来引导系统的安装,那么在进行linux安装时,同样也可能采用这种方式,不过为了能加载linux的引导程序,不能再使用window的引导程序,而应用使用能够引导linux内核的引导装载程序,这里我们使用grub来引导linux系统的安装。

下面是详细的安装步骤:

1. 首先将ISO文件放在文件格式为FAT的盘符中

2.. 然后我们需要下载grub引导装载程序,让它来引导linux内核程序的加载,这里我们需要下载grub4dos.

3. 将其中的grldr和grub.exe copy到C盘 根目录,将里面的boot文件夹拷贝到c:\下.将linuxFC7的镜像文件中的vmlinuz和initrd.img 文件也copy到 c盘 根目录下。注意:这里vmlinuz和initrd.img这两个文件并不是非要放在C盘目录下,也可以放在其它盘符当中。

4. 再用记事本打开上面copy在C盘下的\boot\grub中的menu.lst文件: 第一个title指令是启动的是windows,保留第一个title,将多余的代码删除或在前面加#号注释掉,然后将下面代码 

title F7
root (hd0,4)
kernel /vmlinuz
initrd /initrd.img

我的文件如下: 

# This is a sample menu.lst file. You should make some changes to it.
# Added items for installing GRUB [ which is on your DOS drive C: ] to MBR

color black/cyan yellow/cyan
timeout 60
default 0

title DOS/Win9x/Me/NT/2K/XP on (hd0,0)
root (hd0,0)
chainloader +1

title fc7
root (hd0,4)
kernel /vmlinuz
initrd /initrd.img

添加到第一个title的后面,并且注意:这里的(hd0,4)是可变的,它就是我们放vmlinuz和initrd.img这两个文件的盘符,如果刚才我们不把它们放在C盘,而放在D盘,则相应的驱动器编号就为这里的(hd0,4)即:D盘,如果是放在E盘或其它盘符,则依次类推。

5. 最后:

在C:\boot.ini里的未尾添加:C:\GRLDR

我的boot.ini文件如下: 

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
C:\BOOT\BootDisk.bin="由虚拟启动软盘启动"
C:\GRLDR

下面就可能重启电脑,当出现引导菜单时,选择 F7即可进行F7的安装界面,在后面,会有一步,询问我们是需要从那里来安装系统,我们选择从硬盘安装即可,然后选择ISO所在的盘符,便可进行安装。。

只是做一个备忘,所以没有写出很详细的步骤。。。 

 

机器人 2007-10-13 北京。

转载:是什么使人成就伟大

Posted by 机器人 on 12th 十月 2007 in mylife

是什么使人成就伟大?

What It Takes To Be Great

是什么使Tiger Woods如此伟大,成为世界顶级高尔夫球手?是什么使Warren Buffett 成为“股神”?我们曾经认为:每一个伟大的人,他们都是天才,都天生就具有了成就他们事业所需的才能。就如Buffett在不久前告诉《财富》杂志说的 “他是天生就具有管理资本的能力的。”这可是百万份之一概率的事情。要不,你拥有天才,要不没有。

事情并没有这样简单。一方面,你没有拥有一种你注定适合做某项事业的天赋,因为既定的天赋并不存在。你不是天生的CEO,或天生的投资家,或天生的象棋冠军。你要成就伟大,就只有通过极大量的多年的艰辛努力。同时,仅有简单的艰苦努力还不够,还必须是持续不断的、甚至是痛苦的艰苦努力才行。例如,Buffett就是一个很好的例子,他是出了名的有纪律,并花了大量的时间研究企业的财务状况。所以,好消息是,假如你缺乏天赋,那将没有关系—— 天赋与伟大很少有、甚至是没有关系。你能够进入任何领域,甚至使你自己成就伟大。科学家已经在广泛的领域进行研究,并得出了高度一致的结论:天赋并不意味着智力、能动性、或者个性特征的杰出。它只是一种潜在的能把某项事情做得特别好的能力。以英国为基础的研究人员Michael J Howe, Jane W Davidson和John A Sluboda在大量研究的基础上得出结论:“我们研究的事实。。。并不支持这样的观念——优秀是拥有天赋的结果。”

让我们来看一看研究人员是怎样得出这样的结论的。事实上,每一个领域都有许多人开始时学得很快,然后变慢,再后,就完全停止了发展。然而,只有另外的少数人,能够多年、甚至几十年持续不断地在进步,直至成就伟大。令人好奇的问题是——为什么一些人能够持续地进步?或这些人是怎样持续进步的?弗罗里达州立大学的K.Anders Ericsson教授说,他们是通过对许多领域伟大的成功人士的持续观察来寻求答案的。自从1993年Ericsson教授以及他的两个同事发表了令人注目的论文起,世界范围的科学家已经进行了多个领域的广泛研究,许多研究专注在体育、象棋比赛等比较容易测量与评估的领域,但是,大量的研究同样在其他领域进行,其中包括商业。

研究得出的第一个主要的结论是:没有任何人可以不经过艰苦的努力而成就伟大。如果你相信你找到了一个适合你的领域,并一开始就注定你会成功,这很好,但事实不是这样。没有证据显示,不经过实践与训练就能有高水平的表现。这更加证明:没有“免费的午餐”的道理在更广泛的领域同样适用。许多人之所以成就伟大,都是经过数十年艰苦的努力才达到世界级水平的,这种模式被研究人员叫着“10年规则”。Bobby Fischer在16岁就成为世界象棋冠军,“10年规则”适用吗?毫无疑问,他的经历正好证实了这一规则。在获得冠军时,尽管他只有16岁,但已经经过了9年极其艰苦的训练。南加利福尼亚大学John Horn教授和 加利福尼亚大学Hiromi Masunaga 教授经过观察研究,认为“10年规则描绘了一个粗略的评估,而且,大多数的研究表明,10年达到世界级水平只是一个最低的估计,还不是平均水平。” 在许多领域,如音乐、文学等精英们要达到他们的事业颠峰,大约需要20至30年的时间。

因此,伟大不是上天赐予的。成功要求付出许许多多艰辛的努力。而且这样还不够,因为许多人尽管付出了十多年艰辛的努力,却没有通往伟大,甚至没有取得明显的成功。那么,又是什么原因呢?在许多领域表现得最好的人,都是那些花费了很多时间来寻求“精细训练”的实践者。所谓精细训练就是为了改善表现、为了超越现有的能力、为了对现有表现提供反馈并高水平的不断重复。比如,简单地击完一桶球不算是“精细训练”,这就是为什么许多高尔夫球手不能进步的原因。用8号铁杆击球300次,每次的目标是误差在20码内,而且追求80%的命中率,持续地观察击球的结果,同时不断地作出适当的调整,并且每一天都坚持这样的训练几个小时,这就叫着“精细训练”。坚持是至关重要的。正如Ericsson指出的“粗略地发现:不同领域的精英们,他们每一天,包括周末,都是进行这样的精细训练。”

这种发现在不同的领域同样大量存在。Ericsson和他的同事们研究了20多岁的小提琴演奏者,最好的一队(由音乐学校老师们评判)在他们的演奏生涯中一般要1000小时的精细训练,比较好的一组一般需要7500小时,再次一级的一组需要5000小时。在外科、保险销售,甚至是每一项的体育运动都存在着同样的故事。更多的精细训练就等同于更好的表现。大量的精细训练就等同于造就伟大的表现。

并不是所有的研究人员都完全同意才能神秘论的假设,不过他们的反对不适针对核心论点,其中一点,他们认为天赋这件事情是难于琢磨的。比如,两个运动员同样地辛苦训练,如何解析新英格兰爱国者队四分卫Tom Brady能够在比赛最后的两分钟表现出更高的水平?研究人员同样注意到,比如天才儿童在一个不寻常的早期能够讲话、读书,或者演奏乐器。但是,经过研究,这些例子一般地与他们的父母有着较高的相关。同时,许多天才儿童不能持续地在他们早期优秀的领域走向伟大,同样,许多伟大的成功者在他们幼年的时候并没有表现出特别优秀的天赋。当然一些重要的特性是来自遗传,如身高体重和智力,但这些因素对影响一个人不能做的事情要多过影响他能做的事情。一个5英尺高的人一定不可能成为美国国家联盟足球队员,一个7英尺高的人也一定不可能成为奥林匹克体操员。 Ericsson指出,甚至这些限制也可能比你想象的要低,“一些国际象棋冠军的IQ只有90多。”研究进行得越多,精细训练可以成就伟大的设想就被越坚固地证实。

以上这些说法都是学术性的研究,简单的事实也可以证明伟大是如何炼就的。举一个有说服力的例子,如惠斯顿。丘吉尔是一位口吃病人,经过强制地练习演说,终于成为20世纪最伟大的演说家。Vladimir Horowitz 说“假如我一天不练习,我自己知道;假如我两天不练习,我妻子知道;假如我三天不练习,全世界都知道。”他无疑是一个极其严格的精细训练者。世界级的音乐家如Ignane Paderewski 和Luciano Pavarotti同样引证这一道理。许多伟大的运动员在常规的训练中都被传说为魔鬼式的训练。在篮球方面,Michael Jordan的强烈的训练超越于团队训练之上(假如Michael Jordon拥有巨大的打篮球的天分,那么他在中学时就应该不会被淘汰出校队了),在足球方面,一直拥有盛誉的Jerry Rice曾经被15支球队认为他动作太慢而淘汰。他训练极其刻苦,以致其他球员跟着他都被累倒了。研究发现,Tiger Woods是教科书式的经典例子。在他只有一岁半的时候,他父亲就带他接触了高尔夫,并一直鼓励他艰苦地练习,当Woods在18岁成为美国最年轻的业余高尔夫冠军时,他已经经过了至少15年的精细训练。研究还发现,Woods从没有停止过寻求进步,每天都花费大量时间进行训练,甚至两次重新改变挥杆的动作,以追求挥杆比以前做得更好。

各种事例,科学地或带有传奇色彩地都说明了“精细训练”是成功之源。那另外一个问题:做生意如何训练?事实上,商业的许多因素是完全可以通过训练获得的。比如介绍产品、谈判、评估、财务报表的分析等种种技能,都可以经过训练获得。尽管如此,这些还不足以体现伟大管理的本质。在信息不完全的不确定的环境下,要求作出判断和决定,与人们互动,寻求信息,这些能力才是做生意最需要的,那么,这些能力可以训练吗?是的,可以。当然不是以训练萧邦练习曲的方式进行训练。

相反,这些训练就是关乎你怎样做你每天都在从事的工作。在工作之中,不断地创造着训练,这要求你作出一些关键的变化。首先,做任何事情都要有一个新的目标:不仅仅是完成任务,你的目标是使你所做的每一件事都做得更好。包括发现新的信息,分析信息和解释信息以及写任务分析报告——这些都是可以提高的技能。在主持公司董事会之前,你需要对公司的战略寻求一个深度的理解,对即将到来的市场变化形成一个连贯一致的观点,同时为讨论建立一个基调。任何人在工作中做任何事,从最基本的任务到最高位置的工作,都是一种可以提高的技能。

由这种思维模式武装起来的人,将会以一种新的方式投入工作。研究表明:他们会更深入地处理信息,也更持久地保持信息。他们寻求更多的关于他们所从事工作的资讯,和更积极寻找其他解决问题的方法,他们对未来采用一个更长远的眼光。在各种事物中,这种思维模式都持续一致。你不仅仅是正在做某项工作,从更深的意义上说,你是在工作的过程中不断提高,这种对待工作的不同态度是非常重的。比如,一个业余歌手学习一节音乐课,他们以快乐来体验课程,作为紧张的宣泄。但是,对于一个专业歌唱家来说,情况正好相反:他们提升注意力,专注于课程的细节,以求提高表演能力。同样的活动,不同的用心,结果也就不同。

反馈是至关紧要的,在生意上获得反馈应该是容易获得的。但是,许多人并不寻求反馈,他们仅仅在等待反馈,有一半的人是希望最好没有反馈回来的。高盛公司的领导力培训主管Steve Kerr说“在你做一件事时,假如你不知道自己可以达到怎样的成功水平,有两件事会发生:其一,你不会做得更好,其二,你不再关心结果。”在一些公司,像 GE,经常的反馈是一种公司文化。假如你不能幸运地获得反馈,那么你就积极地寻找反馈吧。

在整个过程中,你的目标是建立一个所谓的“你的商业的精神模式”——指出怎样的因素适合集合在一起以及它们相互之间如何发生作用。你关注得越多,你的精神模式就越得到加强,你在商业上的表现也变得更加好。Andy Grove(Intel 的创始人)能够把整个世界正在改变的技术产业的模式保持在他的头脑中,以使Intel适应这种变化的需要。Microsoft’s 的创始人Bill Gates有同样的习惯:他能够看到PC的最终变化,因此他让每一个人的书桌上都有一台电脑的目标,也就创造了一个大得难以想象的市场。同样地,John D. Rockefeller当工业化正在改变世界时,石油作为一个新产业,他看得相当长远。Napoleon可能是最伟大的一个,他不仅能够把广泛的冲突的因素纳入自己的脑袋中,而且,更为重要的是,当这些因素发生他所不希望的变化时,他还能够极快做出反映。所有这些,都得益于平常众多的精细训练——只有经常地这样做,精细训练才能在建立起有效的思维模式中发挥作用,否则,只是偶然地这么做,也是毫无益处的。

对大多数人来说,工作已经足够辛苦,无须使它更加艰苦。那些额外增加的步骤是如此的困难和痛苦,以至于他们几乎不能做到。但是,这是成就伟大的必经途径。假如成就伟大是一件容易的事情,那么,伟大就不稀罕。现在我们讨论伟大的另一个问题,即当专家们懂得,极大量的行为努力和精细训练可以成就伟大时,对于这些可以成就伟大的行为是如何产生?专家们却知道得很少。其中的一个研究人员总结到“我们仍然不知道哪些因素鼓励个体从事精细训练。” 正如Michigan大学商业学校教授Noel Tichy 在对管理人员进行了30年的研究后,他说“一些人会比另外一些人更加积极主动,但是,我不能回答为什么会这样。”现实是,我们对一些自然地赋予的天分没有足够的把握,这一天分隐藏这样一个假设——我们能够做到我们所希望做到的(假如我们足够努力的话)。奇怪地,这个想法并不普遍。相反,人们沉溺于另外一个假设——如果人们发现他们内在的才能,他们将会达到名誉与富裕的彼岸。但是,这个观点的条件被忽略了,因为在成功路上,人们必然会碰到无法回避的种种困难,在经受困难考验的过程中,人们会认为自己并没有拥有天赋,于是就放弃了努力。

或许,我们不能期望大多数人都成就伟大。那是不现实的。但是,令人欣喜的消息是:伟大不是为少数人而预定的,你,乃至每一个人都可以成就伟大。

机器人 2007-10-12 10:10 于 北京