工作日志
CSS之标签导致我的字体全变成斜体了
这几天在调整UCHOME的SPACE的页面,无意中调了一个东西,导致页面很多地方成了斜体。我用FONT-STYLE进行强制限制也不行,搞了我很长时间。到最后找到规律了,发现所有斜体的地方都是<em></em>标签中,难道是这个问题。
网上查了资料才知道,在HTML中,EM强调文本,通常用斜体显示。这个我还真没注意过。
在我的这个情况下,主要的作用是用来调用CLASS做显示的。解决办法就是,不想用斜体来显示的话,把EM改成SPAN。不过这样的话,我的工作量有点大,于是我在CSS中对这个标签做了重新定义,呵呵用的就是FONT-STYLE,这下起作用了。
具体这么些的,大家来COPY吧
em{font-style:normal}
如何找回Windows显示桌面图标快捷方式
本人是个糊涂人,经常把xp的显示桌面的快捷方式,然而用的有thinkpad,键盘没有windows键,这就郁闷了,没得替换。找了很多发现了制作Windows XP显示桌面图标快捷方式。
步骤如下:
新建文本,在里边输入如下
[shell]
command=2
iconfile=explorer.exe,3
[taskbar]
command=toggledesktop
单击“文件”,选择“另存为”,命名为“显示桌面.scf ”。
此时就会出现一个显示桌面的图标。哈哈,这下方便了,可以把它放到任何想放的地方,我当然就放在快速启动了
linux下LFTP的高级应用
在我刚刚发现LFTP的时候,我就注意到了它功能强大的mirror功能。
因为它可以给 mirror 命令传入参数,控制同步的行为:
–reverse 上传到FTP上,也可以使用 -R
–delete: 如果远程目录下已经没有某个文件,而本地有,则删除这个文件。
–only-newer: 只下载新的文件。mirror的判定新文件是通过文件大小和修改时间来判定的,我们可以使用–ignore-time,来屏蔽时间判定,这样mirror只通过大小来判断新闻,是同步速度加快。
–exculde: 不包含某个目录。
–verbose: 详细输出。
比如:
mirror –delete –only-newer –verbose work bak/
自动备份服务器work文件夹,到本地当前目录的 bak文件夹下,并且删除已经不存在的文件,并且只下载最新的文件,再给出详细的输出。
用 lftp 的 -e 选项,把命令直接接在 lftp 之后:
lftp -u username,password -e”mirror –delete –only-newer –verbose /work bak/” ftpIP
也可以用 at 选项指定备份的时间:
lftp at 01:00 -u username,password -e”mirror –delete –only-newer –verbose /work bak/” ftpIP
这样每天 1 点就会执行备份任务。
根据经验,ftp比rsync快很多,以后如果有大量数据备份,还是考虑使用ftp好,所以还是用好LFTP吧
关于PHP开发框架的现状
新一代框架的诞生
PHP社区在被RoR震晕后,没有陷入过多的争论。而是立即行动起来,开始了新一代框架的设计。首先出现的第一批框架几乎都是RoR的克隆。例 如PHP on Trax(连名字都借鉴Ruby on Rails)和TaniPHP、Akelos等。这些框架最大的特点就是力求100%克隆RoR,不管是采用的架构、设计模式,还是使用方法。
这几个框架一开始确实吸引了开发者的注意,但随着开发者的深入了解,这些框架头上的光环逐步褪色。晦涩难懂的架构、糟糕的性能,以及太多的限制,让这些框架难以在实际项目中运用。
此时,许多PHP开发者认为可以借鉴RoR的设计思想,但不应照搬RoR的结构和实现。为此,一些同样推崇快速开发的框架开始在PHP社区出现。这些框架中,CakePHP和Symfony可谓佼佼者。
CakePHP
CakePHP充满了RoR的影子,从ActiveRecord模式到视图的布局管理都和RoR非常相似。而且CakePHP一开始也尝试实现与?RoR一样的许多东西。但CakePHP的开发团队后来发现PHP语言和Ruby语言存在巨大区别,因此RoR中的许多设计即便能够在PHP中实现,但是缺乏实用价值的。
CakePHP在发展中逐步走出了RoR的阴影,开始探索更能发挥PHP语言本身优势的架构和实现。因此有一段时间CakePHP的API发生了剧烈的变化,以致其他开发者纷纷停下脚步处于观望状态。
但由于前期一些架构的不合理和对RoR太多的模仿,导致CakePHP的核心部分越来越难以理解,运行性能也不尽人意。而且CakePHP将一个庞大的数据库操作对象作为所有业务对象的基础。这虽然利于快速开发,但却导致对业务逻辑对象的测试非常困难。
CakePHP的Model类太复杂,超过1600行代码。这个类不但尝试实现?ActiveRecord模式,同时还尝试封装行数据集,甚至连数据库访问也包含在内。因此,?Model?类不但难以理解,而且根本无法进行单元测试。而开发者还要从?Model?类派生自己的类,并将领域逻辑实现为这些派生类的方法。
对于较小型的项目,CakePHP非常理想。出色的快速开发能力、丰富的API和详尽的文档都可以帮助开发者很快完成工作。但随着项目规模的增加,CakePHP的局限性也变得突出。
而FleaPHP则干脆完全抛弃Active Record,采用更适合脚本语言的Table Data Gateway模式来封装数据库操作。不但性能更好,而且使用上也更方面。同时仍然提供了对关联记录的自动化处理。
Symfony
Symfony是一个非常成熟的框架,大量利用了已有的开源项目。Symfony使用Mojavi的核心代码实现了框架的MVC模式,利用?Propel作为数据库抽象层。Symfony不仅功能强大,而且对Ajax有全面的支持。加上官方网站提供的大量文档和教程,并拥有一个活跃的社区,因此受到许多开发者的欢迎。
Symfony最大的问题也在于使用了太多风格迥异的开源项目来组合成框架。由于Mojavi和Propel本身都相当复杂,因此Symfony的结构非常复杂,难以理解和学习。
symfony似乎要J2EE将struts+hibernate+spring这些东西融合在一起放在PHP里使用。symfony从一开始就要告诉全世界,PHP是可以做企业级大项目的,不是你们所想的过家家游戏.
Symfony,是一个非常有活力的应用程序开发框架。但它也有一些显著的缺点:
1、使用了庞大的?Creole?和?Propel?作为数据源层。虽然实现了功能超强的数据库访问 功能和对象关系影射(真正的对象关系与关系式数据库之间的影射),但性能损失太大,代价高昂;
2、用?XML?文件配置数据库,YAML?文件配置应用程序,造成了项目的维护困难;
3.试图封装太多基础的东西,让框架应用看上去更面向对象(连$_GET、$_POST都封装)
不过对于希望选择一个框架作为企业内部系统基础架构的企业来说,Symfony的成熟度、丰富的文档和活跃的社区都是值得考虑的。毕竟企业内部系统更为看重的是稳定性和长期的支持。
商业利益与大道至简
看到PHP开发框架的潜在商业价值后,Zend.com联合IBM宣布将要推出一个真正能够发挥PHP优势的开发框架。一时间,这个消息在整个PHP社区引起了地震。大家都开始期盼这个具有“官方”背景的开发框架能够为PHP开发者指出一条正确的道路。
不过世事难测,就在Zend Framework团队公布几个代码片断后,立即就有开发者指出这些代码片段是不可能实现的。事实证明这些代码片段不过是美好的理想。限于PHP语言本身 的能力,Zend Framework最终没有实现当初承诺提供的类似RoR中ActiveRecord模式的实现品。
Zend Framework
Zend Framework大量应用了PHP5中面向对象的新特征:接口、异常、抽象类、SPL等等。这些东西的应用让Zend Framework具有高度的模块化和灵活性。同时,因为严格遵循“针对接口编程”和“单一对象职责”等原则,让Zend Framework很有希望成为一个出色的企业应用开发框架。
但不幸的是Zend Framework直到今天,也没有做出更多的突破。在使用Zend Framework开发时,框架对应用程序自身最重要的领域逻辑分离没有提供任何帮助。如果希望开发出真正健壮的企业应用,仍然需要开发者做出相当的努 力,并且在Zend Framework之上建造自己的基础设施。
针对这点,批评者指出Zend Framework虽然大量应用PHP5的新特征,但却没有将这些相对于PHP4的优势转化为能够为开发者提供帮助的东西。
对于简单和小型的项目来说,Zend Framework不但不能提高开发效率。反而因为在框架中应用了大量面向对象设计和PHP5的新特征,对开发者提出了更高的要求,间接增加了项目的开发 成本。而对于较大的项目和企业应用,Zend Framework倒是一个不错的基础。但要创建一个成功的应用,仍然需要付出不小的努力。并且要时刻注意Zend Framewok的性能问题。
Code Igniter
Code Igniter可以说是一匹黑马。Code Igniter出现之时正是Symfony和CakePHP大行其道、Zend Framework万众期待的时刻。可凭借着独特的设计思想,Code Igniter吸引了大批开发者。这点从其火爆的官方论坛就可得到证实。
Code Igniter推崇“简单就是美”这一原则。没有花哨的设计模式、没有华丽的对象结构,一切都是那么简单。几行代码就能开始运行,再加几行代码就可以进行 输出。大部分日常开发中用到的东西都可以立即找到,并且可以很容易的使用。Code Igniter可谓是“大道至简”的典范。
但是,Code Igniter本身的实现不太理想。内部结构过于混乱,虽然简单易用,但缺乏扩展能力。因此在发展到1.5系列版本时,作者不得不通过增加各种hooks来为框架提供扩展能力。
国内PHP开发框架
国内虽然过去也曾有开发者发布过一些框架,但这些框架要么太过简单,要么和某一类型的应用紧密耦合,缺乏通用性。直到进入2006年,随着PHP在国内的大量应用和追捧,真正的国产PHP开发框架才陆续发布。
FCS
FCS是从Java的Struts结构移植过来的中文PHP开发框架,使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,借 鉴了国外一些不错的思想,尤其是Java框架方面,因此熟悉Java的开发人员相对比较容易上手,其模版引擎、缓存机制、认证机制和扩展性方面均表现不凡。
在借鉴国外优秀思想的同时,FCS也更多地考虑了国内的应用开发需要。PHP4兼容、完全支持UTF-8,以及PATHINFO支持等,更加有利于国 内的主机环境和开发需要。秉着易用和易扩展的原则,FCS采用容易理解的项目、模块和操作机制加上内置的一些自动化操作方法,让应用开发变得更加简单,其 功能可以通过基类库以及各种插件的形式灵活扩展,从而满足日益增长的业务需求。正是因为具备良好的开发结构,使得FCS在开发大型应用的时候并不会显得有 很多障碍,基于构件的方式,以及配合框架的项目管理机制同样可以让你在处理大型应用的时候一展所长。
FCS力求精简的代码和全中文化的文档、注释,有利于国内PHP开发人员学习和掌握,不过根据目前的情况来看,官方的文档和社区支持目前还比较缺乏,而且对Ajax的支持还不够全面,因此国内的应用成熟度还不够。
FleaPHP
FleaPHP从发展上看,是一个具有一定历史的框架。在过去三年中,FleaPHP是作者发布了从PFC1到PFC3系列和flea1试验框架后,推出的第一个真正成熟、稳定的开发框架。
与许多其他框架不同,FleaPHP设计之初,就是围绕快速开发和充分利用PHP自身优势两个重点展开的。因此FleaPHP最大的特点就是极高的模块化程度和扩展能力。
FleaPHP框架的核心非常小,但通过灵活的配置,可以组合出各种类型的基础架构。对于简单的脚本页面,FleaPHP不需要载入MVC模式,只需 要为应用程序提供业务逻辑和数据库服务。而对于复杂的应用程序,FleaPHP可以完成从MVC模式调用、访问控制、数据验证到文件上传、图片处理等各种 各样的任务。
正是因为这种出色的定制和扩展能力,FleaPHP真正接近了“满足从简单应用到企业开发的各种需求”这个目标。而且与许多其他框架不同,?FleaPHP是一个完全在实际开发中精炼出来的框架。因此伴随着FleaPHP的发展,各种各样的实际应用也相继出现。在FleaPHP官方网站上,可 以看到各种各样的实际应用。从最简单的企业宣传网站,到复杂的社区网站、企业内部系统等等,不一而足。
FleaPHP作为一个完全国产的框架,具有完全中文化的文档、代码注释,并且在扩展功能上也注重考虑国内开发者的实际需求。因此相对于国外的各种框架,FleaPHP更容易被国内开发者所接受。
但是,也正因为处在国内,FleaPHP面临比国外同行多得多的困难。缺乏足够的贡献者、无礼的责难,以及充满怀疑的眼光,这些都让FleaPHP的 开发团队成员需要更多的奉献精神。而且由于缺乏足够的贡献者,FleaPHP框架目前在文档和扩展功能方面,与其他成熟框架相比还有不小的差距。
并且与其他所有的PHP开发框架一样,FleaPHP也没有找到帮助开发者分离应用程序领域逻辑的途径。虽然有指导文档,但对于初级开发者来说,一个可以拿来就用的领域逻辑基础会显得很实用。
反思与进取
RoR带来的冲击波还远未平息,但PHP开发者们已经在开始反思一味追随RoR的脚步是否真的能够为PHP开发带来质变?
RoR之所以能够取得如此巨大的成功,除了RoR本身的设计思想外,还有一个重要原因就是RoR充分利用了Ruby这种语言的特长。将Ruby动态语言的优势发挥得淋漓尽致。而在PHP中如果只是单纯照搬RoR中设计,则要处处遇到PHP语言本身的限制。为了绕开这些限制,开发者不得不用一些难以理解 的技巧来解决问题。但这样一来通常会导致框架的结构变得晦涩难懂、性能受到损害。
在这种反思中,Code Igniter、FleaPHP等框架就是对这个问题的最好回答。只有充分利用PHP语言本身的优势,才能真正让PHP开发变得更简单、更有趣。
发展到今天,各种PHP开发框架虽然具有各自的特色,但几乎都是为了提高开发效率而努力。但是,虽然其中部分框架注意到了提高应用程序可维护性的问题,但都没有为领域逻辑分离这个至关重要的问题提出解决方案。而这正是这些框架在未来的发展目标。
对于简单的Web应用和复杂的企业应用,两者之间的差别就注定了采用一种固定的架构是无法满足需求的。因此像FleaPHP这样能够提供自定义架构能力的框架,可以让开发者尝试用一个框架的不同组合来解决从简单到复杂的不同程度的需求。
未来,PHP将成为Web开发领域中越来越重要的平台。因此我们相信会出现更多更好的开发框架。虽然作为开发者来说,并不一定需要采用某一个框架来解决问题。但正是因为这些不断出现的框架,我们对使用PHP开发Web应用的理解和把握得到了一次次的推动。
如何配置邮箱服务器域名的解析
当我们配置好邮件服务器,服务器也开始运行了,但我们要对外进行邮件服务就需要对服务器进行域名绑定。
首先我们要做一个名为mail.murray.cn的A纪录,地址指向邮件服务器的IP
然后我们做一个头为空的MX纪录,如murray.cn,地址指向刚刚做好的A纪录,mail.murray.cn
这样,等域名解析生效,就我们的邮件服务就可以外面访问了。
PHP正则相关的几个preg函数
preg_match: 字符串比对解析。
preg_match_all: 字符串整体比对解析。
preg_replace: 字符串比对解析并取代。
preg_split: 将字符串依指定的规则切开。
preg_match字符串比对解析
语法: int preg_match(string pattern, string subject, array [matches]);
返回值: 整数/数组
内容说明: 本函数以 pattern 的规则来解析比对字符串 subject。比对结果返回的值放在数组参数 matches 之中,matches[0] 内容就是原字符串 subject、matches[1] 为第一个合乎规则的字符串、matches[2] 就是第二个合乎规则的字符串,余类推。若省略参数 matches,则只是单纯地比对,找到则返回值为 true。
preg_match_all字符串整体比对解析
语法: int preg_match_all(string pattern, string subject, array matches, int [order]);
返回值: 整数
内容说明: 本函数以 pattern 的规则来整体解析比对字符串 subject。比对结果返回的值放在数组参数 matches 之中,并依顺序值 order 排序。参数 order 的值有 PREG_PATTERN_ORDER 及 PREG_SET_ORDER 二种。若没有 order 值,则系统自动以 PREG_PATTERN_ORDER 代入 order 值中。返回值为合乎比对结果的数目,若没有或错误则返回 [...]
mysql中my.ini的优化参数
1)、back_log:
要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。
当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,我把它改为500。
(2)、interactive_timeout:
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800,我把它改为7200。
(3)、key_buffer_size:
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存,所以我把它改为402649088(400MB)。
(4)、max_connections:
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 Too many connections 错误。 默认数值是100,我把它改为1024 。
(5)、record_buffer:
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128K),我把它改为16773120 (16M)
(6)、sort_buffer:
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M),我把它改为 16777208 (16M)。
(7)、table_cache:
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64,我把它改为512。
(8)、thread_cache_size:
可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。我把它设置为 80。
(10)、wait_timeout:
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800,我把它改为7200。
WINDOWS下mysql服务器出现大量unauthenticated user的解决办法
当我们对mysql进行show processlist查看时,出现大量unauthenticated user,并导致mysql的连接数太大。
原因不用多讲,不管连结的的方式是经过 hosts 或是 IP 的模式,他都会对 DNS 做反查。mysqld 会尝试去反查 IP -> dns ,由于反查解析过慢,无法应付快速多量的查询。这就是为什么会有这么多unauthenticated user。
解决办法:修改my.ini文件,在 [mysqld] 行下添加 –skip-name-resolve ,重新启动mysql服务
格式如下:
[mysqld]
–skip-name-resolve
注:网上答案有太多时linux下my.cnf的办法,虽然大同小异,但还是让我们这些菜鸟不敢尝试,现在公布windows下的具体格式,希望有所帮助
Flash 与深度(Z轴)有关全局函数或方法
方法
全局函数
功能描述
返回值
MovieClip.attachMovie()
无
从库中创建一个电影剪辑实例。
被创建的电影剪辑的引用
MovieClip.createEmptyMovieClip()
无
创建一个空的电影剪辑
被创建的电影剪辑的引用
MovieClip.createTextField()
无
创建一个文本框
无返回值
MovieClip.duplicateMovieClip()
duplicateMovieClip()
创建一个电影剪辑的拷贝
被创建的电影剪辑的引用
Button.getDepth()
无
返回电影剪辑、按钮、文本框的深度
深度数值
MovieClip.getInstanceAtDepth()
无
返回占据指定深度的电影剪辑
指定深度下电影剪辑的引用
MovieClip.getNextHighestDepth()
无
返回最高的可用深度
深度数值
MovieClip.removeMovieClip()
removeMovieClip()
移除动态创建的电影剪辑
无返回值
MovieClip.swapDepths()
无
交换两个电影剪辑的深度
无返回值
MovieClip.swapDepths()
无
交换两个电影剪辑的深度
无返回值
另外DepthManager是一个专门对深度进行管理的类,利用它的方法我们可以管理任何组件或影片剪辑的深度(包括 _root)分配。把它的方法一起列出,在这里要大家有个了解,现在不要求你去掌握的。
方法
描述
DepthManager.createChildAtDepth()
在指定深度处创建指定元件的子级。
DepthManager.createClassChildAtDepth()
在指定深度处创建指定元件的子级。
DepthManager.createClassObjectAtDepth()
在特殊最深剪辑中的指定深度处创建指定类的实例。
DepthManager.createObjectAtDepth()
在最深剪辑中的指定深度处创建一个对象。
DepthManager.setDepthAbove()
将深度设置到指定实例之上。
DepthManager.setDepthBelow()
将深度设置到指定实例之下。
DepthManager.setDepthTo()
将深度设置为最深剪辑中的指定实例。
FLASH对象深度(Z轴)-初探
Flash中的对象除了在平面上的坐标位置外,另外还有个立体的Z轴,那就是对象的深度。
深度具体就是些数字,比如1、2、3、100000…。Flash中用这些数字来表示当前对象的层叠位置。
控制对象的深度,一是通过拖动图层的上下关系,二是通过在同一图层上多个对象的排列层次的改变。
深度值大的靠前,深度值小的靠后。深度大的会遮盖住深度小的对象。 影片剪辑的深度值的范围是从 -16384 到 1048575。
时间轴区(-16384 到 -1)主要用于放置Flash 编辑时的对象,且对象不可用脚本移除。
动态区(0到1048575)实现运行时的动态创建、动态访问和动态移除
这个区是我们最需要的,也是我们可以通过as可以控制的。大家看这个区是从0开始的,符合我们的习惯吧,所以在这个区域可以放置那些可以动态创建和移除的对象。这里是你开发的自由区,如果在时间轴区的对象,你可以先进行交换深度到这里,然后你想怎么做都可以了,杀了它也是允许的了。
扩展区(1048576到2130690045)实现运行时的动态创建、动态访问,但不支持使用脚本移除对象。


