artTemplate模板引擎不支持全局函数的解决方案

这几天在使用artTemplate模板引擎,但是发现在定义模板中不能使用全局函数,有点不可思议。经过研读相关文档与源码发现:如果想在模板中使用全局函数,需要在 template.helper 中重新定义一次,自我感觉有些设计缺陷。 

不过找到了修复这个缺陷的解决方案:

第一:修改源代码

// ============================
} else if (helpers[name]) {
	value = "$helpers." + name;
// 全局函数,这里只处理函数,不处理变量,因为有可能全局变量与data中的变量冲突,导致结果出错
} else if (typeof window[name] == "function") {
	// value = "window." + name;
	value = '';
} else {
	value = "$data." + name;
}
// 全局函数不需要重新声明
if (value) {
	headerCode += name + "=" + value + ",";
}
uniq[name] = true;
// ============================

第二:在data参数中定义要使用的函数,这个方法与上面提到的template.helper中重新定义是同一种思路

// ============================
var data = {},html;
function myfun(isAdmin,show){
	return (isAdmin ? "ok" : "no") + show;
}
data.myfun = window.myfun;
html = template('test', data);
document.getElementById('content').innerHTML = html;
// ============================

参考来自:
https://github.com/aui/artTemplate/
https://github.com/aui/artTemplate/wiki/syntax:native

同时也希望作者把这个问题得到更加完善的优化~~

12
Oct 2014
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

简析Javascript变量作用域链

Javascript语言与服务端编程语言有一些不同,比如事件驱动、函数内定义新函数、函数即类、作用域链等等,这些特性促使这门语言相当奇葩。这一小节就来看看这个作用域链。

彻底搞明白作用域链原理,可以让你的程序少一些bug,也会节省一些开发调试时间。下面开始一段简单的代码:

<html>
<head></head>

<body>
<input id="test" type="text" />
</body>

<script>
function $(id) {
	return document.getElementById(id);
}

function fun1() {
	var a= 1;
	function inner() {
	    a++;
	    alert(a);
	}
	$("test").onclick = inner;
}
fun1(); 
</script>

</html>

这是一个非常容易读懂的事件绑定代码,先推测一下每次点击 input 会提示什么内容,然后拿这代码亲自执行一遍,看看你的推测对不对。如果是对,非常恭喜你,如果不对,那就接着往下看吧。

函数 inner 中的 a 没有使用 var 定义,所以执行时会使用当前函数外层的作用域,逐层向外查找,此时发现有定义 var a= 1,就停止查找,此时变量 a  的作用域就是fun1函数内部。此时变量 a 虽然在 函数 fun1 中,但是不会被垃圾回收机制回收掉,这是为什么,请关注 Javascript 变量生命周期。

相关概念:
函数运行在其定义的作用域,而不是执行的作用域。这个与作用域链是一个意思,只是表达方式不同。

24
Mar 2014
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

【转载】MySQL 数据库性能优化之缓存参数优化

在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣的朋友们有所帮助。

数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO。本文先从 MySQL 数据库IO相关参数(缓存参数)的角度来看看可以通过哪些参数进行IO优化:

阅读剩余部分...

19
Jan 2014
AUTHOR WiFeng
CATEGORY Web,DataX
COMMENTS No Comments

如何使用C++开发PHP扩展(下)

上文中介绍了使用C++编写简单PHP扩展的方法,但是更多的情况是业务中已经有独立的 api 库,形式为 libxxx.a / libxxx.so,PHP程序中需要调用这些 api,所以这时就要编写PHP扩展来实现。这时是使用静态库 libxxx.a ,还是使用 libxxx.so 呢 ?常见的做法是使用静态库 libxxx.a ,下面一步一步介绍:

阅读剩余部分...

18
Jan 2014
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS 5 Comments

如何使用C++开发PHP扩展(上)

目前,PHP编程语言也是相当成熟,各种文档,各种问题,只要Google一下,总有你想要的答案。当然“如何开发PHP扩展”的文章也不少,但是很少有专门来介绍使用C++开发PHP扩展的介绍。C++编程语言功能的强大,促使好多公司后台程序选择使用它,因此碰到的大多数情况是需要我们用C++来扩展 PHP。PHP源码中的扩展骨架工具,默认生成的是支持 C 语言,如果要使用C++开发,有些参数需要另行配置。下面将用一个简单的示例来说明。

阅读剩余部分...

16
Jan 2014
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS No Comments

编译PHP扩展的两种方式

编译的两种方式其实很简单,这里记录只是为了以后遇到这种情况时不加思索地运用上,而不是花费一些时间去回忆。

C/C++程序编译有两种方式:动态编译、静态编译。PHP 是使用 C/C++程序开发的一门脚本语言,其扩展编译也就脱离不了前面提到的两种,动态、静态。站在PHP程序的角度,动态编译就是扩展生成一个 .so 文件,然后在 php.ini 中加载这个 .so 文件,此时即可调用其中的函数或者是类方法;静态编译就是在安装 PHP 时把其扩展文件内容编译到 PHP 内部,然后不需要做任何事情,就可以直接调用其中的函数或者还是类方法。这二者有什么优缺点呢?采用静态编译方式,程序在调用其函数/类方法时要快一些;采用动态编译方式,在有新扩展需要添加到PHP中时不需要重新编译PHP,只需要编译该扩展下的文件,然后把 .so 文件引入即可。二者均有利弊,使用时视情况而定是最好的方法。下面用Linux 平台下的操作来说明其编译过程。

阅读剩余部分...

8
Dec 2013
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS No Comments

Xss 处理

预防xss,页面中不同区域的字串应该使用不同的手段来处理,而不是一概的htmlspecialchars,简单+实用。

<?php
/**
 * Xss 处理
 *
 * 作者: 刘卫锋 (kevonliu@tencent.com)
 * 创建时间: 2013-07-04
 *
 * $Id: Xss.php 48518 2013-07-05 03:35:04Z kevonliu $
 */

class Xss {

    /**
     * 处理链接字串
     *
     * @param string $str
     * @return string
     */
    public static function link($str) {

        $pairs = array(
            '\'' => '%27',
            '"'  => '%22',
            '<'  => '%3C',
            '>'  => '%3E',
        );

        return strtr($str, $pairs);
    }

    /**
     * 处理js中的字串
     *
     * @param string $str
     * @return string
     */
    public static function js($str) {

        // See ECMA 262 section 7.8.4 for string literal format
        $pairs = array(
            // "\\" => "\\\\",
            // "\"" => "\\\"",
            // '\'' => '\\\'',
            '\"' => '\\x22',
            '\'' => '\\x39',
            '\\' => '\\x92',

            # To avoid closing the element or CDATA section
            '<' => '\\x3c',
            '>' => '\\x3e',

            # To avoid any complaints about bad entity refs
            '&' => '\\x26',

            # Work around https://bugzilla.mozilla.org/show_bug.cgi?id=274152
            # Encode certain Unicode formatting chars so affected
            # versions of Gecko don't misinterpret our strings;
            # this is a common problem with Farsi text.
            "\xe2\x80\x8c" => "\\u200c", // ZERO WIDTH NON-JOINER
            "\xe2\x80\x8d" => "\\u200d", // ZERO WIDTH JOINER
        );

        return strtr($str, $pairs);
    }

    /**
     * 处理html中的字串
     *
     * @param string $str
     * @return string
     */
    public static function html($str) {

        $pairs = array(
            '"'  => '&quot;',
            '\'' => '&#039;',
            '&'  => '&amp;',
            '>'  => '&gt;',
            '<'  => '&lt;',
        );
        return strtr($str, $pairs);
    }

}

?>

以上是php版本的代码,其他语言均类似。
欢迎指正,共同进步~~ 

25
Nov 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

获取客户端IP用什么方式?

在这个灌水盛行的年代,我们必须要对那些心怀不轨,总是想着做点啥坏事的青年们,致以亲切的祝福:最近还好吗,是不是闲的蛋疼。

本博客使用Typecho 程序搭建,添加验证码插件后,垃圾评论还是有不少。隔个5-6天就有20多条,前几天修正了验证码插件当中的一个bug,稍微减缓了一点,不过还是有一些。这里就再对后台 “同一IP发布评论的时间间隔限制为N钟”这个功能动点手脚吧。首先要说明的是,这个功能并不能阻挡这些“灌水青年”的恶劣行为,这是因为基于Typecho程序,这个IP可以伪造,致使上面的设置起不到作用。但是这并不能认为是Typecho的bug,因为当你了解了它的用意之后就会明白。

阅读剩余部分...

10
Nov 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

程序员如何面对需求变化

在工作中也接触过各种各样的项目,有的注重时间,有的注重质量,有的注重成本。有些项目会随着时间的推移侧重点会有所改变,比如刚开始可能注重质量、后来开始注重成本、最后可能注重时间,因此在这个变化中项目经理为了整体把控好这个项目,一些需求的变动也是再所难免。即使没有上面说的这些情况,一个项目从开始到结尾,需求的变化肯定是会有的。对于互联网行业,一个新产品的出现往往会立为一个项目,这里主要也是针对这样项目来进行描述。产品需求需求变化意味着什么,意味着程序要要不停的修改之前编写的代码,同时也就意味着不能按时下班。那么程序员怎么才能够更好的应对产品的这些快速的需求变化呢?于是乎,业界的高人提到了敏捷、迭代,但是真正能运用好,还是要经过千锤百炼。

阅读剩余部分...

3
Nov 2013
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS No Comments

浅谈HTTPS

HTTP是每个web开发人员再熟悉不过的网络传输协议,可是对于他的大哥HTTPS,我们又有多少了解呢?我在这里就把网络上的一些对于他们的阐述整理一番。

阅读剩余部分...

26
Sep 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments