感悟UML中的禅理

2010年4月20日 没有评论

以前听说德国的最高学位只有哲学,不知道是不是德国,是不是这样,呵呵,看了一篇文章瞎了几句,略表悟意,有感.

UML来做一些设计时,开发人员会觉得自己好像不会写程序了。的确用UML降低了开发效率,好处却并不显见。于是我们看到了在教科书中大量地采用UML,看到了用UML解释别人的系统设计。

笔者是从C++开始学习面向对象程序设计的,并被IO流和Borland Turbo Vision这样的OO设计所折服,惊叹于OO编程的优雅,于是致力于学习OO编程。

当我自以为在OO编程上小有心得时,在网上看到了关于UML的介绍。开始了解UML时,我的心情是复杂的。原来软件是这样设计出来的?如果真像Booch所说,那么我们一直在造狗窝,一直不知道怎样造大厦?于是有了学习UML的冲动。但是随着学习的深入,产生了新的问题。UML很难掌握,尽管有“精通UML”之类的书。仅以用例图来说,曾在BBS论坛上遇到无数的人不知道怎样合适地画用例图。UML不但难掌握,而且很“肤浅”——它只是一种表示法而已。它只是一种语言,而用这种语言说出的话到底水平如何,显然取决于说话人的其他素养。

UML和OO思想哪个重要?没有OOA/OOD的深厚功底,学UML有何用?当我试着用UML来做一些设计时,觉得自己好像不会写程序了。用UML降低了我的开发效率,好处却并不显见。另外还有一些其他的问题也在困扰着我,例如:如何以用例驱动的方式设计一个类似Swing这样的类库?为什么书上的例子举来举去都是ATM机?为什么这么多优秀的开放源代码软件,几乎没有声称是以这种方式来设计开发的?我置疑是否这种方式真的有价值。

语言甚至会束缚思想。维特根斯坦应该是持这种观点的。奥威尔在他的名著《1984》中有一段描述,说明“新话”对思想的控制。UML1.x的版本对实际可能的设计做了许多简化,使我对UML有一种“新话”的感觉。我头脑中,曾一度把UML与“符号暴力”相联系。

据说Kent Beck从来不画UML图,最多画点简单的CRC卡片,经常是直奔编码而去。但很多人都不怀疑他是位优秀的OO设计师。于是我大部分时间思考的都是测试驱动,依赖注入,代码即设计这类问题,与UML渐行渐远。

机缘凑巧,我读过一点佛经和故事。给我留下很深印象的是,禅宗六祖惠能是不识字的。禅宗的十六字心传是“教外别传,不立文字。直指人心,见性成佛”。而正是这位不识字的六祖,要求“不立文字”的大德,他的讲稿被整理成了唯一一部由中国人写的被称为经的佛教典籍——六祖坛经。非常矛盾的一件事。坛经记载,惠能还未出家时,听到有人读《金刚经》,“惠能一闻,心明便悟”。这就是“籍教悟宗”。六祖之后,禅宗进入“不立文字”的无字禅时代。视语言为障道之本,视读经为磨砖成镜。然而没有文字终究不便,到了北宋,由于禅宗灯录的大量刊行,参究公案之风日盛,文字禅由之而起。“不立文字”之禅变成了“不离文字”之禅。

忽然间我仿佛明白了UML存在的意义:说不可说之说。“释迦四十九年说,未曾说着一字。”佛曰:不可说。明明不可说,偏又说了那么多。

以前曾经认为,设计OO系统掌握住一个要点就行,即“道法自然”。然后就是“运用之妙,存乎一心”。在这个理论结构里,似乎是没有UML存在的位置。毕竟“道可道,非常道”。但是佛经给了我启发,这些经书在翻来覆去花了很多力气讲一些本来讲不明白的东西。“不立文字”,是“说不得”;“不离文字”,是“说不得的东西如何去说”。对于这种难以言说的东西,人们常常采用寓言或发生在别人身上的故事来说明,即把抽象的道理形象化地释出。

UML所做的正是相同的事,于是我们看到了在教科书中大量地采用UML,看到了用UML解释别人的系统设计。也许我们能通过学习教科书中的UML和别人设计的UML实现“籍教悟宗”。

UML也是一种想像力的培训,让您在一切都还没有的时候,生动地想象出系统将来的样子。一个伟大的设计师,必是具有超凡想像力的人。UML是渡河的筏,对于已在河对岸的人,自然不需要;对于未渡而想渡的人,却是非常需要的东西。此时我的感觉就是:“向来枉费推移力,今日自在水中行。”

原文: http://developer.51cto.com/art/200702/40465.htm

分类: 其他 标签:

MySQL ERROR "** syntax to use near 'USING BTREE,KEY `Email` (`Email`) USING BTREE"

2010年4月13日 没有评论

报错:

[Err] 1064 – 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 ‘USING BTREE,
KEY `Email` (`Email`) USING BTREE

       分析问题在使用了InnoDB 的 BTREE上面,查看了一下数据库 InnoDB是默认数据库引擎类型,应该问题不是这里面

mysql备份还原时,查看错误日志,内容如下:
Error Code: 1064 C You have an error in your SQL syntax; check themanual that corresponds to your MySQL server version for the rightsyntax to use near ‘USING BTREE

分析原因可能使用了高版本的SQL语句在低版本中导入,

最后在网上查找整理出以下几个解决方法:
1,升级MYSQL数据库到相应的对应版本(这个可能很麻烦)

2.导出文件中的源码:
PRIMARY KEY (`row_id`) USING BTREE,
UNIQUE KEY `columnAindex` (`columnA`),
KEY `columnBindex` (`columnB`) USING HASH,
KEY `columnCindex` (`columnC`) USING BTREE,

全部替换为:
PRIMARY KEY USING BTREE  (`row_id`),
UNIQUE KEY `columnAindex` (`columnA`),
KEY `columnBindex` USING HASH (`columnB`),
KEY `columnCindex` USING BTREE (`columnC`),

将导出文件中的所有索引类型(USING BTREE 等)挪到索引列(columnB等)的前面,问题解决

3,程序代码ENGINE=MyISAM DEFAULT CHARSET=latin1或者程序代码ENGINE=InnoDBDEFAULTCHARSET=latin1
全部替换为程序代码
ENGINE=MyISAM
可以将SQL文件分批COPY建立SQL文件,然后 分批导入.
这样方便查找具体是那个地方出错,如:
ERROR 1074 at line 1802: Too big column length for column ‘Cjieshao’(max = 255
. Use BLOB instead
说明文件字符长度超过当前版本. MYSQL4.0只支持255个,当高版本如MYSQL5.0导入时候就要注意修改长度为255再导入就会正常
ERROR 1064 at line 3034: You have an error in your SQL syntax.   Checkthe manua
that corresponds to your MySQL server version for the right syntax touse near
‘collate utf8_swedish_ci default NULL,
PRIMARY KEY   (`sshyid`)
解决方法: 去掉 ‘collate utf8_swedish_ci 就正常
.sql -u root -p密码

分类: MySQL 标签:

基于Centos部署Redmine项目管理系统

2010年4月4日 没有评论

Redmine安装指南

1.系统需求
Ruby 1.8.7 on Rails 2.3.5
数据库 (参考下面的兼容数据库列表)

可选的:
SVN 客户端(版本不低于1.3),用于版本库浏览功能(必须配置到您的 PATH 设置中)
RMagick (用于将甘特图输出至PNG图形文件)

支持的数据库:
MySQL 4 或更高版本(推荐)
文本已经运用yum提前部署好,方法如下:
yum install -y mysql mysql-server mysql-devel
PostgreSQL 8 (8.3版本未经充分测试)
SQLite 3

2.Ruby on Rails部署
mkdir /opt/source
cd /opt/source
wget http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7.tar.gz
tar zxvf ruby-1.8.7.tar.gz
cd ruby-1.8.7
./configure
make && make install
cd ext/zlib
ruby extconf.rb –with-zlib-include=/usr/include –with-zlib-lib=/usr/lib
cd ../../
make && make install

cd /opt/source
wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.6.tgz
tar zxvf rubygems-1.3.6.tgz
cd rubygems-1.3.6
ruby setup.rb

gem install rails -v=2.3.5
gem install mysql

3.检查Ruby on Rails状态
ruby -v

ruby 1.8.7 (2008-05-31 patchlevel 0) [i686-linux]
gem list

*** LOCAL GEMS ***

actionmailer (2.3.5)
actionpack (2.3.5)
activerecord (2.3.5)
activeresource (2.3.5)
activesupport (2.3.5)
mysql (2.8.1)
rack (1.0.1)
rails (2.3.5)
rake (0.8.7)

4.数据库设置(以Mysql为例)
启动Mysql数据库
/etc/init.d/mysqld start

创建数据库与设置权限
mysql -u root -p
Enter password:

mysql> create database redmine character set utf8;
mysql> grant all on redmine.* to ‘redmine’@’localhost’ identified by ‘redmine’;
mysql> flush privileges;

5.配制 redmine 环境和数据库
cd /opt/source
wget http://rubyforge.org/frs/download.php/69449/redmine-0.9.3.tar.gz
tar zxvf redmine-0.9.3.tar.gz
mv redmine-0.9.3 /opt/redmine
cd /opt/redmine/config
cp database.yml.example database.yml
vi database.yml

production:
adapter: mysql
database: redmine
host: localhost
username: redmine
password: redmine
encoding: utf8

在程序的根目录下运行以下命令来创建数据库结构:
cd /opt/redmine/
RAILS_ENV=production rake config/initializers/session_store.rb
rake db:migrate RAILS_ENV="production"

运行以下命令,向数据库中导入默认的配置数据:
rake redmine:load_default_data RAILS_ENV="production"
这一步操作是可选的,但 强烈推荐 您执行它,您也可以从头开始一步步填写自己的配置参数。此命令将导入默认角色、跟踪标签、状态、工作流程和枚举值。

6.运行WEBrick服务器来测试安装

ruby script/server -e production

当WEBrick启动后,使用浏览器访问 http://localhost:3000/ 您将看到系统的欢迎界面。
使用默认的用户名和密码登录:
* 用户名: admin
* 密码: admin
Redmine补充附录

1.Redmine备份方式:
Redmine的备份应该包括: * 数据(保存在redmine数据库中) * 附件(保存在Redmine安装目录的 files 目录中)

以下是一个可以进行每天备份的简单脚本程序(假设您使用mysql数据库):
cat >> /var/spool/cron/root << EOF
# Redmine Database
0 1 * * * /usr/bin/mysqldump -u redmine -p redmine redmine | gzip > /opt/backup/db/redmine_`date +%y_%m_%d`.gz
# Redmine Attachments
30 1 * * * rsync -a /opt/redmine/files /opt/backup/files
EOF

2.SMTP服务器配置

在 config/environment.rb 文件中,您可以设置您的SMTP服务器的参数:

* config.action_mailer.smtp_settings: SMTP服务器配置
* config.action_mailer.perform_deliveries: 设置为 false 以禁用邮件发送功能

修改此文件后需要重新启动服务器。

原文: http://www.20071231.com/ruby-on-rails-based-project-management-system-to-deploy-redmine.html/comment-page-1/:

补充:
RedMine集成环境: http://bitnami.org/stack/redmine

分类: 其他 标签:

常用项目制图软件比较(visio2007 SmartDraw ConceptDraw EDraw Max visio2010)

2010年4月2日 没有评论

        最近新项目需要做技术方案,因此免不了要画许多流程图,visio有其优点,比如说visio中画完的图可以全部框住粘到word文档里,然后在word文档里使用。在word里双击直接可以进入visio进行图形编辑。但缺点也明显,软件太大,操作繁琐(尤其箭头的操作),主题和色彩装饰效果简单,缺乏高亮效果等等。

visio2007效果图及评价

visio2007总评:

效果华丽指数

操作易用指数

破解版获取指数

与word兼容性:

   现在介绍另外三款比较时尚简单的软件。

   SmartDraw拥有visio所有功能,可以与word文档进行互动,并且由于其最早为苹果设计的,所以图形很是华丽。其最出彩的是对箭头和线段的操作,使用ctrl与方向键,就可以完成作图,操作也相当简单。但其缺点是对中文支持的有限,可能在一些处理上会有乱码,而且破解版的比较难找。

   简单效果图如下:

官方有华丽的演示视频:

http://www.smartdraw.com/videos/demo/index.htm

SmartDraw总评:

效果华丽指数

操作易用指数

破解版获取指数

与word兼容性:

下载地址:http://www.smartdraw.com/downloads/downloadb.aspx?WT.svl=download

   第二款软件是ConceptDraw,这个软件效果依旧华丽,但操作比较复杂,而且与微软的东西风格区别很大,但相比较SmartDraw软件比较小。

ConceptDraw总评:

效果华丽指数

操作易用指数

破解版获得指数

与word兼容性:

下载地址(需注册,呵呵):http://www.conceptdraw.com/scripts/resources/dwndtrial_cdo_load.php?prod=office&platf=win&lang=en

     

   最后一个是EDraw,这个软件个人比较推荐,使用也比较简单,操作风格与office也一样。但效果比visio好,而且里面的图标也比visio好看。

效果图:

EDraw总评:

效果华丽指数

操作易用指数

破解版获得指数

与word兼容性:

演示地址:http://xbeta.info/files/edraw2.htm

免费版下载地址:http://www.edrawsoft.com/download/EDrawMindMap.exe

专业试用版下载地址:http://down.tech.sina.com.cn/download/d_load.php?d_id=16379&down_id=1

  其实最期待的是visio2010了,现在已经有beta版本了,终于微软发现了其UI的丑陋,并做出调整。

官方截图:

visio2010总体评价

效果华丽指数

操作易用指数

破解版获得指数

与word兼容性:

原文地址:http://hi.baidu.com/johntech/blog/item/071671ef3d0c64dfb21cb154.html

分类: 其他 标签:

Sersync 开源服务器文件实时同步工具

2010年3月30日 没有评论

        这是金山逍遥团队贡献的一个开源软件sersync,主要用于服务器同步,web镜像等功能。基于boost1.41.0,inotify api,rsync command.开发。

测试环境 CentOS,ubuntu。

源码地址:

http://code.google.com/p/sersync/
    目前使用的比较多的同步程序版本是inotify-tools,另外一个是google开源项目Openduckbill(依赖于inotify- tools),这两个都是基于脚本语言编写的,其设计思路同样是采用inotify与rsync命令。 相比较上面两个项目,本项目优点是:
1.sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(我稍后会提到),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
2.相比较上面两个项目,sersync配置起来很简单:在http://code.google.com/p/sersync/downloads /list 处下载源码(分为32版本,与64位版本),其中bin目录下已经有我编译好的2进制文件,配合bin目录下的xml文件直接使用即可。
3.另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
4.本项目自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步。
5.本项目自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。
6.本项目自带socket与http协议扩展,满足您二次开发的需要。

基本架构:

   利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。


  

设计简析

   如上图所示,线程组线程是等待线程队列的守护线程,当队列中有数据的时候,线程组守护线程逐个唤醒,当队列中inotify事件交多的时候就会被全部唤醒一起工作。这样设计的目的是能够同时处理多个inotify事件,重发利用服务器的并发能力(核数*2+2)。

   之所以称之为线程组线程,是因为每个线程在工作的时候,会根据服务器的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步,当要同步的文件较大的时候,这样设计可以保证各个远程服务器可以同时获得要同步的文件。

   服务线程 的作用有三个,首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成rsync_fail_log.sh脚本,记录失败的事件。 同时每隔10个小时执行脚本一次,同时清空脚本。服务线程的第三个作用是crontab功能,可以每隔一定时间,将所有路径整体同步一次。

   过滤队列的建立是为了过滤短时间内产生的重复的inotify信息,例如在删除文件夹得时候,inotify就会同时产生删除文件夹里的文件与删除文件夹 得事件,通过过滤队列当删除文件夹事件产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条事件减轻了同步的负担。同时对于修改文件 的操作的时候,会产生临时文件与重复操作。

原文:http://blog.csdn.net/zhoukunta/archive/2010/01/27/5261800.aspx

分类: 架构 标签:

UML建模之时序图(Sequence Diagram)

2010年3月26日 没有评论

我的做品^o^  



一、时序图简介(Brief introduction

      二、时序图元素(Sequence Diagram Elements

角色(Actor

对象(Object

生命线(Lifeline

控制焦点(Focus of Control

消息(Message

自关联消息(Self-Message

Combined Fragments

  三、时序图实例分析(Sequece Diagram Example Analysis

时序图场景

时序图实例

时序图实例分析

      四、总结(Summary

一、时序图简介(Brief introduction

      时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。顺序图中显示的是参与交互的对象及其对象之间消息交互的顺序。时序图中包括的建模元素主要有:对象(Actor)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)等等。

二、时序图元素(Sequence Diagram Elements

角色(Actor

  系统角色,可以是人、及其甚至其他的系统或者子系统。

对象(Object

对象包括三种命名方式:

第一种方式包括对象名和类名;

第二中方式只显示类名不显示对象名,即表示他是一个匿名对象;

第三种方式只显示对象名不显示类明。

生命线(Lifeline

生命线在顺序图中表示为从对象图标向下延伸的一条虚线,表示对象存在的时间,如下图

控制焦点(Focus of Control

控制焦点是顺序图中表示时间段的符号,在这个时间段内对象将执行相应的操作。用小矩形表示,如下图。

      

消息(Message

消息一般分为同步消息(Synchronous Message),异步消息(Asynchronous Message)和返回消息(Return Message.如下图所示:

同步消息=调用消息(Synchronous Message

消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义。

异步消息(Asynchronous Message

消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的。

返回消息(Return Message

返回消息表示从过程调用返回

自关联消息(Self-Message

表示方法的自身调用以及一个对象内的一个方法调用另外一个方法。

Combined Fragments

Ø        Alternative fragmentdenoted “alt” if…then…else对应

Ø        Option fragment (denoted “opt”) Switch对应

Ø        Parallel fragment (denoted “par”) 表示同时发生

Ø        Loop fragment(denoted “loop”) for 或者 Foreach对应

三、时序图实例分析(Sequece Diagram Example Analysis

时序图场景

完成课程创建功能,主要流程有:

1、请求添加课程页面,填写课程表单,点击【create】按钮

2、添加课程信息到数据库

3、向课程对象追加主题信息

4、为课程指派教师

5、完成课程创建功能

时序图实例

时序图实例分析

1、序号1.0-1.3完成页面的初始化

2、序号1.4-1.5课程管理员填充课程表单

3、序号1.6-1.7课程管理员点击【Create】按钮,并响应点击事件

4、序号1.8    Service层创建课程

5、序号1.9-1.10 添加课程到数据库,并返回课程编号CourseId

6、序号1.11-1.12 添加课程主题到数据库,并返回主题编号topicId

7、序号1.13        给课程指派教师

8、序号1.14        向界面抛创建课程成功与否的消息

四、总结(Summary

      时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。顺序图中显示的是参与交互的对象及其对象之间消息交互的顺序。时序图中包括的建模元素主要有:对象(Actor)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)等等。最后,以课程创建功能演示一时序图实例。

作者:灵动生活
出处:http://www.cnblogs.com/ywqu

分类: 其他 标签:

网银登陆困难 自动退出问题

2010年3月24日 没有评论

       今天总公司那边听说网络出现很奇怪的问题,所有电脑都不能正常登陆网银(工行,招行的都不行),过去看了一下,确实挺让人觉得郁闷的,按理全网都不能正常登陆,要么是路由器设置有问题,要么就是中了局域网病毒,但是仔细查看了一下状况,局域网中毒可以排除,问题应该出现在路由器上面。
推测可能是端口设置问题吧, 但找了半天也没发现端口有仍何问题。因为那个管路由器啥也不懂,一问三不知,最后只好试试恢复出厂设置吧。于是问他们要宽带账号密码,奇怪了给我整了两个账号,我还以为他们有两个网呢,后来,他告诉我是双线路路由,突然想到前几天看到的一些关于集群负载均衡共享Session问题,会不会是因为双线路造成的通讯问题?。。。太佩服我自己了,问题解决了
原来是双线路造成整个访问网银过程中出现通讯线路不一致导致的问题,后来仔细看了一下路由器有个线路均衡策略设置的。。。。

分类: 其他 标签:

常见命名方法:骆驼命名法、帕斯卡命名法、匈牙利命名法

2010年3月22日 没有评论

MyData 就是一个帕斯卡命名法
而myData是一个骆驼命名法,它第一个单词的第一个字母小写,后面的单词首字母大写,看起来像一个骆驼
而iMyData是一个匈牙利命名法,它的小写的i说明了它的形态,后面的和帕斯卡命名相同,指示了该变量的用途.

一、匈牙利命名法:广泛应用于象Microsoft Windows这样的环境中。

      Windows 编程中用到的变量(还包括宏)的命名规则匈牙利命名法,这种命名技术是由一位能干的 Microsoft 程序员查尔斯・西蒙尼(Charles Simonyi) 提出的。

匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先m_(成员变量),再指针,再简单数据类型,再其他。例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。

    匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。

匈牙利命名法中常用的小写字母的前缀:

前 缀       类  型
a               数组 (Array)
b               布尔值 (Boolean)
by             字节 (Byte)
c              有符号字符 (Char)
cb            无符号字符 (Char Byte,没有多少人用)
cr             颜色参考值 (ColorRef)
cx,cy         坐标差(长度 ShortInt)
dw           Double Word
fn              函数
h                Handle(句柄)
i                整型
l              长整型 (Long Int)
lp             Long Pointer
m_          类的成员
n            短整型 (Short Int)
np          Near Pointer
p            Pointer
s           字符串型
sz         以null做结尾的字符串型 (String with Zero End)
w        Word

二、骆驼命名法:

        骆驼式命令法,正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。例如,下面是分别用骆驼式命名法和下划线法命名的同一个函数:

   printEmployeePaychecks();

    print_employee_paychecks();

     第一个函数名使用了骆驼式命名法――函数名中的每一个逻辑断点都有一个大写字母来标记;第二个函数名使用了下划线法—-函数名中的每一个逻辑断点都有一个下划线来标记。

    骆驼式命名法近年来越来越流行了,在许多新的函数库和Microsoft
Windows这样的环境中,它使用得当相多。另一方面,下划线法是c出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍。

三、帕斯卡(pascal)命名法:

       与骆驼命名法类似。只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写

       如:public void
DisplayInfo();

              string UserName;

              二者都是采用了帕斯卡命名法.

在C#中,以帕斯卡命名法和骆驼命名法居多。

原文:http://www.zouyang.net/post/220.html

分类: 其他 标签:

高性能PHP框架DooPHP

2010年3月21日 没有评论

       DooPHP 是一个 PHP 敏捷开发框架,同样采用 MVC 设计模式和对象关系映射(ORM)技术,可以有效的提高开发效率。

       DooPHP 本身的设计更注重的是其核心性能,而不是花哨的功能,它更适合那些不想花太多时间学习一种框架或者一门新的语言的人。

如果你不喜欢某些框架产生的那些后期难以维护和修改的设计(frameworks that generates frontend/backend design which are usually hard to modify and maintain later on),那么 DooPHP 一定适合你。DooPHP 给你干净的视图文件,而不是难以理解的思想。

如果下面这个介绍列表让你欣喜,那么你一定会喜欢上 DooPHP。

1. 高性能
2. 较低的学习曲线
3. 高度灵活性
4. 轻量级,全部文件加起来不超过1M

具体来说:

1. 它不会改变你使用 PHP 的习惯。依然支持$_GET。
2. 它具有很高的兼容性。It works with shared hosting accounts and various environment.
3. 它只需要三个配置文件。 即只需要设置你的项目路径。
4. 它不需要使用命令行,SSH也不是必须的。
5. 它不是另一个版本的RoR克隆,没有特别的编码规范约束。
6. 它具有清晰、完整的文档。
7. 它具有松耦合特性,可用于其他外部项目。
8. 它可以很轻松的结合第三方类。
9. 如果使用Netbeans开发,还会有代码提示支持。
10. 它具有完整的API,能够很好的结合AJAX 或者 Flash/Flex进行混合开发。
11. 它的 URL 被设计成对搜索引擎和人类友好。
12. 它本身非常灵活,并且具有可扩展的模版引擎。
13. 它针对common settings, routes, DB configs, DB relationship进行了几种控制。

中文手册:http://www.peehp.com/doo/index.php

分类: PHP 标签:

利用"二进制"来控制权限

2010年3月18日 没有评论

一、利用位与
1.介绍:

这里我介绍一种很常用,也比较Professor的权限控制思路。
这里我用java语言描述,其实都差不多的。自己转一下就可以了。
为了方便,我们这里定义a^b为:a的b次方
这里,我们为每一个操作设定一个唯一的整数值,比如:

删除A---0
修改A---1
添加A---2

删除B---3
修改B---4
添加B---5
。。。

理论上可以有N个操作
这取决于你用于储存用户权限值的数据类型了。

这样,如果用户有权限:添加A---2;删除B---3;修改B---4
那用户的权限值 purview =2^2+2^3+2^4=28,也就是2的权的和了(之前打错了)。
化成二进制可以表示为11100
这样,如果要验证用户是否有删除B的权限,就可以通过位与运算来实现。
在Java里,位与运算运算符号为&
即是:int value = purview &((int)Math.pow(2,3));
你会发现,当用户有操作权限时,运算出来的结果都会等于这个操作需要的权限值!
原理:
位与运算,顾名思义就是对位进行与运算:
以上面的式子为例:purview & 2^3 也就是 28&8
将它们化成二进制有
   11100
&  01000
——————-
   01000 == 8(十进制) == 2^3
同理,如果要验证是否有删除A---0的权限
可以用:purview &((int)Math.pow(2,0));
即:
   11100
  & 00001
————————
    00000 ==  0(十进制)  != 2^0

这种算法的一个优点是速度快。可以同时处理N个权限
如果想验证是否同时有删除A---0和删除B---3的权限
可以用purview&(2^0+2^3)==(2^0+2^3)?true:false;
设置多角色用户。根据权限值判断用户的角色。。。

下面提供一个java的单操作权限判断的代码:
//userPurview是用户具有的总权限
//optPurview是一个操作要求的权限为一个整数(没有经过权的!)
public static boolean checkPower(int userPurview, int optPurview)
{
      int purviewValue = (int)Math.pow(2, optPurview);
      return (userPurview & purviewValue) == purviewValue;
}

当然,多权限的验证只要扩展一下就可以了。

2.原理:
其实
添加A---2  2^2 ==  4 ==  00100
删除B---3  2^3 ==  8 ==  01000
修改B---4  2^4 ==  16 ==  10000
三个值相加就是11100B == 28(D)了

也就是说,让每一个操作权限值都是只有一个1和N个零组成的唯一排列
这样,几个权限相加时就不会出现进位的问题了。保证了每个操作权限都是独立的。
权限值只是一个代号,与大小无关。

3.注意:
(1)一个系统可能有很多的操作,因此,请建立数据字典,以便查阅,修改时使用。
(2)如果用数据库储存用户权限,请注意数值的有效范围。操作权限值请用唯一的整数!
(3)java里一个int是2^32大小,所以不会将权限都分在一个组里,都会分成几个模块,对一个模块用int类型有31个权限分配,一般都可以满足了。建议分组或用大一点的long型。

二、直接用1010……..表示
直接用字符串:010101111010011010000………
判断:0就是没权限,1就是有权限。

原文:http://huangy82.blog.163.com/blog/static/490698272009102310216497/

分类: PHP 标签: