cnzxh.net by xianhua.zhou
2008-05-09 13:03:43 综合信息
这是一个可以用在Symfony1.0.x的theme插件,支持 layout、templates、partial、js、css及images目录。当启用了theme之后,系统会自动到相应的theme目录下找资源文件,找到并且可用的话就会使用它,若没有找到则使用默认的路径去调用资源文件。

使用了theme的templates目录可能看起来像这样:
.
|-- _bottom.php
|-- blue
|   |-- _bottom.php
|   `-- indexSuccess.php
|-- gray
|   |-- _bottom.php
|   `-- indexSuccess.php
|-- indexSuccess.php


简单使用说明:
1、安装:./symfony plugin-install http://www.cnzxh.net/blog/files/sfThemePlugin-0.1.0.tgz

2、修改 filters.yml,增加sfThemeFilter过滤器:
rendering: ~
web_debug: ~
security:  ~

# generally, you will want to insert your own filters here
theme:
    class: sfThemeFilter

cache:     ~
common:    ~
flash:     ~
execution: ~


3、在 app.yml 文件中加上:
app:
    sf_theme_plugin:
      enabled: on


4、要使用theme的时候,需要设置用户的 theme 属性,如:
 <?php
class mainActions extends sfActions
{
    public function 
executeIndex()
    {   
    }   
    public function 
executeSetTheme()
    {   
        
$theme 'blue';
        
$this->getUser()->setAttribute('theme'$theme'sfThemePlugin');
        
$this->redirect('main/index');
    }   
}
?>


注:由于Symfony中的 sfPartialView.class.php 和 AssetHelper.php 无法被重写,所以只好拷贝了源文件进入插件目录,直接进行核心代码的修改使其支持theme特性。还有一点就是,在每次使用资源文件时都会进行检测其是否可用,所以整体的系统性能会有少许的降低,但一般来说可以忽略不计。
2008-05-06 08:38:08 技术信息
只是一些简单的步骤,更详细的信息可以参考:http://dev.mysql.com/doc/refman/5.0/en/replication.html
2008-05-05 23:15:35 技术信息
MySQL Proxy是一个很不错的东西,MySQL官方支持的,以后应该会有很多基于MySQL的应用构建于此之上。简单的说,MySQL Proxy是一个介于MySQL数据库和数据库操作程序中间的一个代理程序,当客户端程序要操作MySQL数据库时,该操作不是直接发送到MySQL数据库,而是由MySQL Proxy程序转发给MySQL数据库,这样做的好处是可以做负载均衡(如读写分离)、监测数据库操作 、修改数据库操作等等。现在一般人比较关心的是如何实现高可用性或者负载均衡,用MySQL Proxy(注:别忘了还有ndb)基 本可以满足这些需求,当然,加上HeartBeat就更完美了,只要你有足够的硬件环境。而这一切都是免费可得的,只是需要花一些时间去配置罢了。

官方网址:http://forge.mysql.com/wiki/MySQL_Proxy
2008-05-04 13:08:04 技术信息
简单思路,使用 netstat 命令找出含有SYN状态的连接IP,找出其中可能是攻击的IP,再用 iptables 或 shorewall 封掉,写入日志文件。可以把它加入到 crontab job 中,每1分钟或每5分钟运行一次。

下载地址:
http://www.cnzxh.net/blog/files/6_1209873391_denyip.rb.txt
可以试试看 :-)
2008-05-03 11:31:20 技术信息
有时候会用到,比如使用Socket方式传送文件到其它服务器时。
RFC文档:http://www.faqs.org/rfcs/rfc1867.html
PHP的fsockopen函数:http://cn.php.net/fsockopen
Ruby的socket文档:http://www.ruby-doc.org/stdlib/libdoc/socket/rdoc/index.html
http://rubylearning.com/satishtalim/ruby_socket_programming.html
2008-05-01 19:45:25 技术信息
命名空间在最初php5的测试版中曾经出现过,后来正式版出来后就没了踪影,现在又快出来了,在PHP5.3.0的开发版中早已有了。我想那时候Zend Framework中的那些长名字的类应该要改名了,如:
Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive

具体的使用可以参考:http://blog.felho.hu/whats-new-in-php-53-part-1-namespaces.html
2008-04-30 23:30:27 技术信息
随手写的,以后可能会用得着。防人之心不可无,害人之心不可有!
在一个虚拟的网络中需要懂得保护自己,但请不要伤害别人!
2008-03-31 10:28:45 技术信息
Ubuntu8.04正式版就快发布了,这是继6.06之后的第2个会长时间支持的版本(桌面应用:3年,服务器:5年),如果已经等不及的话可以先试试它的Beta版。

參考文章:
https://help.ubuntu.com/community/Installation/FromLinux
(上文针对的是7.04,对8.04也一样通用)

经测试,无法把“/”和“/mnt/installer”的挂载点使用同一个分区,建议在建立“/mnt/installer”分区的时候把“/”也一起建立了比较省事。这样,当安装的时候直接指定一下“/”挂载点所在的分区就行了。

注意:在选择分区的时候要选择手动分区的方式,如果已经有了Grub,最好不要安装Grub(可以在正式格式化分区和安装前进行选择,有一个“高级...”的按钮,点击就可以进行设置了),以免覆盖现有的启动项。或者万一当安装失败的时候,旧的Grub还能进去并使用原来的Ubuntu系统。

最后,当安装成功的时候,只需要在原来的Grub启动项中加上像下面这样的就行了:

title           Ubuntu 8.04 Beta
root            (hd0,9)
kernel          /boot/vmlinuz-2.6.24-12-generic root=/dev/sda10 ro quiet splash
initrd          /boot/initrd.img-2.6.24-12-generic
savedefault
boot

我是装在 /dev/sda10 上,所以在 root那写上 (hd0,9) 就行了。
2008-02-29 09:49:43 综合信息
刚刚才看到新闻,Sun 收购 MySQL 已经于本周二结束了(从2008年1月16日签属收购协议到完成收购,共一个多月的时间),说是花了8亿美元现金和2亿美元股票完成的收购(最近美元不是贬值了吗?)。当初 Adobe 收购 Macromedia 好像是花了 34亿 美元,之前不久的 Google 收购 Youtube 都花了 16.5 亿美元。嗯,不管如何,希望 Sun 能实实在在的为 MySQL 做一些事情,使这个开源数据库更加好用和更加强大。
Sun_MySQL
2008-01-10 17:19:22 综合信息
http://linux.pku.edu.cn?
好像打不开了,怀念那段在北大听Linux讲座的时光和咖啡。:-)

向那些无偿传播Linux知识的牛人致敬!!!

Linux != Windows
(Linux is Not Windows)

2007-12-31 10:16:35 综合信息
不知不觉就走到了2007年的最后一天。今天应该是到上海以来感觉最冷的一天了,从家到公司坐公交车的上班时间从大约1个小时缩短至20多分钟,沿途所见车辆除了公车车就是出租车,除过了几个红绿灯外,基本上是一路畅通无阻。
2007-12-04 10:03:57 技术信息
当上传或列表文件的时候总是显示
Making data connection...

set ftp:passive-mode off 或 set ftp:passive-mode on 都不起作用

在网上搜索了一下,把ssl的支持关了就OK了。
set ftp:ssl-allow 0
2007-11-20 11:12:09 综合信息
最近Gaim在Ubuntu6.06中老是崩溃,装上了一个Pidgin感觉很好用,希望不会再崩溃,试了一下竟然可以用QQ,而不必输入验证码,不错,确实是一个好东西!

http://www.pidgin.im
2007-10-02 18:41:58 技术信息
文件位置:util/sfInflector.class.php,方法“sfInflector::underscore”代码:
 
<?php
//...
  
public static function underscore($camel_cased_word)
  {
    
$tmp $camel_cased_word;
    
$tmp str_replace('::''/'$tmp);
    
$tmp sfToolkit::pregtr($tmp, array('/([A-Z]+)([A-Z][a-z])/' => '\\1_\\2',
                                         
'/([a-z\d])([A-Z])/'     => '\\1_\\2'));

    return 
strtolower($tmp);
  }

//...
?>


一些测试结果(括号中是期望的结果):
-------------
sfInflector::underscore('HelloWorld')      
  =>  hello_world

sfInflector::underscore('HelloWorldAgain')  
  =>  hello_world_again

sfInflector::underscore('HelloWorld2')  
  =>  hello_world2,(hello_world_2)

sfInflector::underscore('HelloWorld234Again')
  =>  hello_world234_again,  (hello_world_234_again)
-------------

所以,当字段含有 数字时的时候需要小心,使用 propel-init-admin 命令生成的页面,无法对该字段进行排序和过滤,其它相关的功能可能也受其影响......

临时解决方法,把该方法修改成:
---------------
 
<?php
//...
 
public static function underscore($camel_cased_word)
 {
   
$tmp $camel_cased_word;
   
$tmp str_replace('::''/'$tmp);
   
$tmp sfToolkit::pregtr($tmp
      array(
'/([A-Z]+)([A-Z][a-z])/' => '\\1_\\2',
       
'/([a-z\d])([A-Z])/'     => '\\1_\\2',
       
'/([\d])([A-Z])/' => '\\1_\\2',
       
'/([A-Za-z])([\d])/' => '\\1_\\2'));
   return 
strtolower($tmp);
 }
//...
2007-09-20 17:23:49 综合信息
以前听过,今天无意中在布衣网上听见,久违的声音,依然热血沸腾!
进入 《解脱》专辑
2007-09-18 19:11:31 综合信息
在一次KTV中听见这首歌,当时觉的很一般,今天仔细听听还真的不错。
2007-08-29 11:00:07 综合信息
早上上班的时候下起了大雨,奇怪的是公交车竟然一路不堵车,车上人也不多,要是平时这个时候车上人肯定很多。

喜欢下雨,特别是下大雨,边听着雷雨声边写程序,是一件很惬意的事情。
2007-08-27 12:55:07 技术信息
今天查看文档时才发现,使用 Criteria::CUSTOM 可使 Criteria 实现自定义条件查询,使得大多数情况下无需直接手写SQL语句。如:
 
<?php
$c 
= new Criteria();
$c->add(UserPeer::FIRST_NAME
"CONCAT(" UserPeer::FIRST_NAME ", ' ', " UserPeer::LAST_NAME ") = '" $username "'"
Criteria::CUSTOM);
$users UserPeer::doSelect($c);
?>

相当于:
SELECT *
FROM users
WHERE CONCAT(first_name, ' ', last_name) = '$username';

2007-08-23 19:12:53 综合信息
一直很喜欢听军营民谣和校园民谣,不过和校园民谣比起来,我更喜欢军营民谣的那种风格。喜欢小曾,喜欢那些纯朴的声音... ...

地址:http://www.laobanzhang.com/manage/zj_manage/yinyue/2006111122162994535.mp3
歌词:
我的老班长,你现在过得怎么样?
我的老班长,你还会不会想起我?
好久没有收到你的信,我时常还会想念你,
你说你喜欢听我弹吉他,唱着我们军营的歌.

我的老班长,我一直记得你的话,
我的老班长,谢谢你给了我坚强.
天黑我已不会再害怕,再苦也不会掉眼泪,
我已经练成真正的男子汉,如今也当上班长啦.

这些年你的家乡变样了吗?
这些年你的愿望实现了吗?
是不是你也离开了自己的家,
是否去了南方,开创新的理想.

这些年班长作成家了吗?
嫂子她长得是什么模样?
能不能寄我一张你俩的结婚相,
让我祝福你们夫妻恩爱久长.

我的老班长,再给你抽根家乡的烟,
我的老班长,我真的好想再跟着你,
我要为你再编一支歌,弹起你爱听的吉他,
等到我们再重逢的那一天,一起放声把歌唱.

啦啦啦……

2007-08-23 10:33:35 技术信息
Symfony 中操作数据库使用的是 Propel ,一个基于PHP5的ORM框架,和Symfony一样,完全面向对象。它可以操作多种数据库,如:MySQL、PostgreSQL、ORACLE、SQL Server,所提供的功能基本上能满足大多数的数据库操作,如:
 
<?php
//新建
$user = new User();
$user->setName('symfony');
$user->setAge(3);
$user->save();

//查询
$user UserPeer::retrieveByPk(1);
echo 
$user->getName() . '  ' $user->getAge() . '<br />   ';
$users UserPeer::retrieveByPks(array(1234));
foreach (
$users as $user) {
    echo 
$user->getName() . '  ' $user->getAge() . '<br />   ';
}

// 更新
$user UserPeer::retrieveByPk(1);
$user->setName('new Name');
$user->save();

// 删除
UserPeer::doDelete(1);
$user UserPeer::retrieveByPk(1);
$user->delete();
?>


也支持一些复杂的查询操作,需要借助 Criteria,如:
 
<?php
// 查询 name = 'symfony' 的记录
$c = new Criteria();
$c->add(UserPeer::NAME'symfony');
$users UserPeer::doSelect($c);

//只查询一条记录
$user UserPeer::doSelectOne($c);

//...也支持 group by、limit、table join 等等特性
?>

但如果需要执行如下的一个SQL查询:
SELECT * FROM users WHERE CONCAT(first_name, ' ' , last_name) = ?
,却无法直接使用 Criteria 来实现,只能直接手写 sql 语句,如:
 
<?php
$query 
"SELECT * FROM users WHERE CONCAT(first_name, ' ' , last_name) = %s";
$query sprintf($query'symfony name');
$conn Propel::getConnection();
$stmt $conn->prepareStatement($query);
$rs $stmt->executeQuery();
while (
$rs->next()) {
    echo 
$rs->getInt('id') . ': ' $rs->getString('first_name') . '<br />';
}
$rs->close();
?>

这点上,ROR 中的 ActiveRecord 优势比较明显一些,如在 ROR 中可以这样操作:
users = User.find(:all, :conditions => ["CONCAT(first_name, last_name) = ?", 'symfony name']);


由于Ruby语言的天生优势,省了很多代码,当然 ROR 所做的还远远不只这些。

Propel 依托 PHP5,借鉴了 Java 中的 JDBC,显得中规中矩,也很灵活,虽然不如 ROR 的 ActiveRecord 好用,但经过 Symfony 的改装,和 Symfony 搭配起来还是挺不错的。