python图形处理库Python Imaging Library (PIL)

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/python_pil/

pil站点: http://www.pythonware.com/products/pil/index.htm
pil下载: http://effbot.org/downloads/Imaging-1.1.6.tar.gz
pil文档: http://www.pythonware.com/library/pil/handbook/index.htm
  
[安装]

$ tar zxvf Imaging-1.1.6.tar.gz
$ cd Imaging-1.1.6
$ python setup.py build_ext -i
$ python selftest.py
$ python setup.py install

安装完毕后,可在python安装目录下的site-packages找到PIL安装目录。

-- EOF --

ZendFramework 使用数据表前缀

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/use_dbprefix_in_zendframework/

目录结构
zend framework dirs

在 config.ini 定义 prefix

[general]
adapter  = PDO_MYSQL
host     = localhost
username = root
password = 123456
dbname   = test
charset  = utf8
prefix   = pf_    //表前缀

index.php 中将 prefix 注册

// 读取数据库配置
$dbconfig = new Zend_Config_Ini('../config/config.ini', 'general');
// 配置数据库
$database = Zend_Db::factory($dbconfig->adapter,$dbconfig->toArray());
// 设置数据库编码
$database->query("set names {$dbconfig->charset};");
Zend_Db_Table::setDefaultAdapter($database);
Zend_Registry::set('database',$database);
// 数据表前缀
Zend_Registry::set('dbprefix',$dbconfig->prefix);

在 library/Custom 目录下新建文件 Db.php 继承 Zend_Db_Table 类

class Custom_Db extends Zend_Db_Table
{
    public function __construct()
    {
        $dbprefix = Zend_Registry::get('dbprefix');
        $this->_name = $dbprefix.$this->_name;
        parent::__construct();
    }
}

最后在 model 中继承 Custom_Db 即可

class User extends Custom_Db
{
    protected $_name = 'users';     //在Custom_Db中会自动加上表名的前缀
    protected $_primary = 'userid'; //主键
}

-- EOF --

为wordpress添加coolcode插件的quicktag

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/add_coolcode_quicktag_for_wordpress/

修改 wp-includes/js/quicktags.js 文件

1. 找到

edButtons[edButtons.length] =
new edButton('ed_code'
,'code'
,'<code>'
,'</code>'
,'c'
);

在后面添加

edButtons[edButtons.length] =
new edButton('ed_coolcode'
,'coolcode'
,''
,'</coolcode>'
,'x'
);

2. 找到

	else if (button.id == 'ed_link') {
		document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(edCanvas, ' + i + ');" value="' + button.display + '" />');
	}

在后面添加

    else if (button.id == 'ed_coolcode') {
		document.write('<input type="button" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertCoolcode(edCanvas, ' + i + ');" value="' + button.display + '" />');
	}

3. 在文件末尾添加

function edInsertCoolcode(myField, i, defaultLang, defaultLine) {
    if (!defaultLang) {
		defaultLang = 'php';
	}
    if (!defaultLine) {
		defaultLine = 'off';
	}
    if (!edCheckOpenTags(i)) {
        var codeLang = prompt('输入需要加亮的程序语言', defaultLang);
        var codeLine = prompt('是否显示行号(on, off)', defaultLine);
        edButtons[i].tagStart = '<' + 'coolcode';
        if (codeLang) {
            edButtons[i].tagStart = edButtons[i].tagStart + ' lang="'
                                    + codeLang + '"'
        }
        if (codeLine) {
            edButtons[i].tagStart = edButtons[i].tagStart + ' linenum="'
                                    + codeLine + '"';
        }
        edButtons[i].tagStart = edButtons[i].tagStart + '>';
        edInsertTag(myField, i);
    }
    else {
		edInsertTag(myField, i);
	}
}

-- EOF --

Cakephp 笔记

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/cakephp_note/

1. 自定义 layout

在 cakephp 中 layout 默认指向 /app/views/layouts/default.thtml
如果要自定义 layout,需要在 controller 中定义:
var $layout = 'mydefault';
layout 则指向了 /app/views/layouts/mydefault.thtml

2. 创建不使用数据库表的 model 或者改变 model 对应的表名

我需要创建一个不使用任何表的model。例如,我想通过 $validate 数组方便底验证输入数据,保持model逻辑的正确性。但创建 model 时对应的表不存在,CakePHP 就会报错。通过在 model 中加入以下代码可以解决这个问题:

var $useTable = false;

你也可以通过这种方法改变model对应的表名。

var $useTable = 'some_table';

3. 快速创建后台管理

如果你需要创建后台管理程序,并且希望所有管理action都位于某个特定文件夹下,那么打开 config/core.php 并将下面这一行的注释去掉:

define('CAKE_ADMIN', 'admin');

这样所有以"admin_"开头的action都可以通过 /admin/yourcontroller/youraction 来访问。例如,如果在 posts controller 中创建了名为 "admin_add" 的 action,那么可以通过 www.example.com/admin/posts/add 访问这个action。这样就可以方便地为 admin 目录设置密码以避免他人随意访问。

4. 自定义404页面

如果你需要自定义404页面,只需创建 /app/views/errors/error404.thtml。

5. 让controller使用其他model

如果你的controller需要调用来自不同model的数据,只要在controller开头使用如下代码:

class yourController extends AppController {
var $uses = array('Post','User');
}

这样controller就能访问Post和User model了。

-- EOF --

Cakephp 的回调函数

转载时请标明文章原始出处和作者信息, 作者: lostsnow.
http://www.lsproc.com/blog/cakephp_callback_function/

Model的Callbacks

我们在model中增加了一些回调函数以帮助你在model操作前后能够织入一些业务逻辑(原文为sneak in,借用了AOP中的织入一词,因为从操作来看这些回调函数等同于AOP中的advice)。为了获得这样的能力,需要使用model中的一些参数并且在你的model中覆写这些方法。

beforeFind(string $conditions)

beforeFind()回调函数是在model的find方法执行前的前置操作。你可以加入任何检索前的业务逻辑。你覆写该方法只要保证在前置操作成功后返回true来执行真正的find方法,返回false中断find方法就可以了。(译注:在一些复杂场景中,需多次持久化的情况下请慎用)。

afterFind(array $results)

使用afterFind回调函数能够更改find方法的返回结果集,或者在检索动作完成后加上一些业务逻辑。该函数的参数$results为经过回调函数处理以后的find检索结果集。

beforeValidate()
beforeValidate回调函数能够在model校验数据之前更改model中的一些数据。同样也可以用来在model校验之前加入更为复杂的额外校验规则。和beforeFind一样,必须保证返回true来调用真正的操作,返回false来中断校验乃至save操作。

beforeSave()

和先前介绍的回调函数类似,在校验完成之后,保存动作之前加入额外的处理(如果校验失败是不会触发该回调函数的)。返回true或者false,不再赘述。
一个比较常见的beforeSave的应用场景就是在保存动作之前格式化日期属性以适应不同的数据库:

// Date/time fields created by HTML Helper:
// This code would be seen in a view 

$html->dayOptionTag('Event/start');
$html->monthOptionTag('Event/start');
$html->yearOptionTag('Event/start');
$html->hourOptionTag('Event/start');
$html->minuteOptionTag('Event/start'); 

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ 

// Model callback functions used to stitch date
// data together for storage
// This code would be seen in the Event model: 

function beforeSave()
{
    $this->data['Event']['start'] = $this->_getDate('Event', 'start'); 

    return true;
} 

function _getDate($model, $field)
{
    return date('Y-m-d H:i:s', mktime(
        intval($this->data[$model][$field . '_hour']),
        intval($this->data[$model][$field . '_min']),
        null,
        intval($this->data[$model][$field . '_month']),
        intval($this->data[$model][$field . '_day']),
        intval($this->data[$model][$field . '_year'])));
}

afterSave()

放置任何你想要在保存后执行的代码在这个回调函数中。[ToDo 如果保存出错是否会触发?]

beforeDelete()

放置删除前的逻辑代码。想要删除操作执行则返回true,否则返回false。

afterDelete()

放置任何你想要在删除后执行的代码在这个回调函数中。

controller中的回调函数

Cake的controller特别提供了许多回调方法,你可以用它们在一些重要的controller方法之前或者之后插入一些逻辑。如果要利用这些功能,请在你的controller中用这里描述的参数和返回值定义这些方法。

beforeFilter

在每个controller action调用前执行。它是一个检查当前sessoin状态和检查用户角色的好地方。

afterFilter

在每个controller action调用后执行。

beforeRender

在controller逻辑之后,并且在输出视图之前被调用。

-- EOF --