libo的文章

让subversion自动添加Id,Revision等keywords发表于: 2010-01-06 11:56:32

linux下:

1.vim ~/.subversion/config

windows下

1.%APPDATA%\\Subversion\\config
作者:libo 浏览(254) 回复(0) 标签:linux

五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)发表于: 2009-11-08 12:01:26

当Adobe、Microsoft、Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来!

最初来自:sinoprise.com/read.php?tid-662-page-e-fpage-1.html(遗憾的是这个链接已经打不开了),我基本未改动,只是进行了一些排版和整理。
参考文献:http://www.fsf.org/licensing/licenses/

现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses/alphabetical)。我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码,最好也是选择这些被批准的开源协议。

这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考。

BSD开源协议(original BSD license、FreeBSD license、Original BSD license)

BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

作者:libo 浏览(267) 回复(0) 标签:linux

drupaluser正在准备升级发表于: 2009-11-04 22:21:29

各位来访的朋友,感谢对drupaluser的支持

最近在准备进行一个 比较大的升级,升级之后会有一些变动,将整合drupaluser的主站和bbs博客两块

并且最近项目非常忙,所以日志也写的很少了,但是升级完毕之后,会将这个打造为一个web开发爱好者
非常希望看到的效果。

谢谢支持

另外,看到有些朋友想交换连接,在这里说明一下,升级完毕 会统一加上,最近就不动数据了。

谢谢
作者:libo 浏览(269) 回复(0) 标签:php

google的sitemap协议分析2发表于: 2009-09-08 21:56:11

Google SiteMap Protocol是Google自己推出的一种站点地图协议,此协议文件基于早期的robots.txt文件协议,并有所升级。在Google官方指南中指出加入了Google SiteMap文件的网站将更有利于Google网页爬行机器人的爬行索引,这样将提高索引网站内容的效率和准确度。文件协议应用了简单的XML格式,一共用到6个标签,其中关键标签包括链接地址、更新时间、更新频率和索引优先权。
Google SiteMap文件生成后格式如下:




http://www.knowsky.com

2005-06-03T04:20-08:00

always

1.0





http://www.knowsky.com/300687.html

2005-06-02T20:20:36Z

作者:libo 浏览(286) 回复(0) 标签:php

google的sitemap协议分析发表于: 2009-09-08 21:46:34

最近在研究做一个 sitemap 插件,生成了 sitemap 并提交给 google 。于是留心找了一篇关于sitemap协议的格式说明,转载于此。


1
这一行定义了此xml文件的命名空间,相当于网页文件中的标签一样的作用

2
这是具体某一个链接的定义入口,你所希望展示在SiteMap文件中的每一个链接都要用包含在里面,这是必须的。

3 http://xxx.xxx.xxx
描述出具体的链接地址,这里需要注意的是链接地址中的一些特殊字符必须转换为XML(HTML)定义的转义字符

4 2005-06-03T04:20:32-08:00
作者:libo 浏览(276) 回复(0) 标签:php

ubuntu 安装 memcache发表于: 2009-07-20 10:58:38

安装服务器
sudo apt-get install memcached
$ memcached -d -m 50 -p 11211 -u root
参数说明 -m 指定使用多少兆的缓存空间;-p 指定要监听的端口; -u 指定以哪个用户来运行
作者:libo 浏览(392) 回复(0) 标签:linux

负载均衡技术介绍发表于: 2009-06-14 18:17:32

Internet的规模每一百天就会增长一倍,客户希望获得7天24小时的不间断可用性及较快的系统反应时间,而不愿屡次看到某个站点"Server Too Busy"及频繁的系统故障。
作者:libo 浏览(430) 回复(0) 标签:php

avaScript函数调用规则发表于: 2009-05-26 22:08:43

JavaScript函数调用规则一

(1)全局函数调用:
function makeArray( arg1, arg2 ){
return [this , arg1 , arg2 ];
}
这是一个最常用的定义函数方式。相信学习JavaScript的人对它的调用并不陌生。
调用代码如下:
makeArray('one', 'two');
// => [ window, 'one', 'two' ]

这种方式可以说是全局的函数调用。
为什么说是全局的函数?
因为它是全局对象window 的一个方法,
我们可以用如下方法验证:
alert( typeof window.methodThatDoesntExist );
// => undefined

alert( typeof window.makeArray);
// => function

所以我们之前调用 makeArray的方法是和下面调用的方法一样的
window.makeArray('one', 'two');
// => [ window, 'one', 'two' ]





JavaScript函数调用规则二

(1)对象方法调用:
//creating the object
var arrayMaker = {
someProperty: 'some value here',
make: makeArray
};

arrayMaker.make('one', 'two'); // => [ arrayMaker, 'one', 'two' ]
//或者用下面的方法调用:
arrayMaker['make']('one', 'two'); // => [ arrayMaker, 'one', 'two' ]


看到这里跟刚才的区别了吧,this的值变成了对象本身.
你可能会质疑:为什么原始的函数定义并没有改变,而this却变化了呢?

非常好,有质疑是正确的。这里涉及到 函数在JavaScript中传递的方式,
函数在JavaScript 里是一个标准的数据类型,
确切的说是一个对象.你可以传递它们或者复制他们.
就好像整个函数连带参数列表和函数体都被复制,
且被分配给了 arrayMaker 里的属性 make,那就好像这样定义一个 arrayMaker :
var arrayMaker = {
someProperty: 'some value here',
make: function (arg1, arg2) {
return [ this, arg1, arg2 ];
}
};





如果不把调用规则二 弄明白,那么在事件处理代码中 经常会遇到各种各样的bug,举个例子:




< script type="text/javascript">
function buttonClicked(){
var text = (this === window) ? 'window' : this.id;
alert( text );
}
var button1 = document.getElementById('btn1');
var button2 = document.getElementById('btn2');

button1.onclick = buttonClicked;
button2.onclick = function(){
buttonClicked();
};
< /script>

点击第一个按钮将会显示”btn1”,因为它是一个方法调用,this为所属的对象(按钮元素) 。
点击第二个按钮将显示”window”,因为 buttonClicked 是被直接调用的( 不像 obj.buttonClicked() ),
这和第三个按钮,将事件处理函数直接放在标签里是一样的.所以点击第三个按钮的结果是和第二个一样的。

所以请大家注意:
button1.onclick = buttonClicked;
button2.onclick = function(){
buttonClicked();
};
this指向是有区别的。


JavaScript函数调用规则三

当然,如果使用的是jQuery库,那么你不必考虑这么多,它会帮助重写this的值以保证它包含了当前事件源元素的引用。
//使用jQuery
$('#btn1').click( function() {
alert( this.id ); // jQuery ensures 'this' will be the button
});

那么 jQuery是如何重载this的值的呢?
答案是: call()和apply();

当函数使用的越来越多时,你会发现你需要的this 并不在相同的上下文里,这样导致通讯起来异常困难。

在Javascript中函数也是对象,函数对象包含一些预定义的方法,其中有两个便是apply()和call(),我们可以使用它们来对this进行上下文重置。





< script type="text/javascript">
function buttonClicked(){
var text = (this === window) ? 'window' : this.id;
alert( text );
}
var button1 = document.getElementById('btn1');
var button2 = document.getElementById('btn2');

button1.onclick = buttonClicked;
button2.onclick = function(){
buttonClicked.call(this); // btn2
};
< /script>







JavaScript函数调用规则四

(1)构造器
我不想深入研究在Javascript中类型的定义,但是在此刻我们需要知道在Javascript中没有类,
而且任何一个自定义的类型需要一个初始化函数,使用原型对象(作为初始化函数的一个属性)定义你的类型也是一个不错的想法,
让我们来创建一个简单的类型
//声明一个构造器
function ArrayMaker(arg1, arg2) {
this.someProperty = 'whatever';
this.theArray = [ this, arg1, arg2 ];
}
// 声明实例化方法
ArrayMaker.prototype = {
someMethod: function () {
alert( 'someMethod called');
},
getArray: function () {
return this.theArray;
}
};

var am = new ArrayMaker( 'one', 'two' );
var other = new ArrayMaker( 'first', 'second' );

am.getArray();
// => [ am, 'one' , 'two' ]
other.getArray();
// => [ other, 'first', 'second' ]

一个非常重要并值得注意的是出现在函数调用前面的new运算符,没有那个,你的函数就像全局函数一样,且我们创建的那些属性都将是创建在全局对象上(window),而你并不想那样。
另外一点,因为在你的构造器里没有返回值,所以如果你忘记使用new运算符,将导致你的一些变量被赋值为 undefined。

所以构造器函数以大写字母开头是一个好的习惯,这可以作为一个提醒,让你在调用的时候不要忘记前面的new运算符.
这样 初始化函数里的代码和你在其他语言里写的初始化函数是相似的.this的值将是你将创建的对象.






总结
我希望通过这些来使你们理解各种函数调用方式的不同,
让你的JavaScript代码远离bugs。
知道this的值是你避免bugs的第一步。
作者:libo 浏览(423) 回复(0) 标签:drupal

jQuery性能优化指南(3)发表于: 2009-05-24 10:00:49

8,尽量使用ID代替Class。

前面性能优化已经说过,ID选择器的速度是最快的。所以在HTML代码中,能使用ID的尽量使用ID来代替class。
看下面的一个例子:
// 创建一个list
var $myList = $('#myList');
var myListItems = '
    ';
    for (i = 0; i < 1000; i++) {
    myListItems += '
  • This is a list item
  • '; //这里使用的是class
    }
作者:libo 浏览(416) 回复(0) 标签:ajax

jQuery性能优化指南(2)发表于: 2009-05-24 09:59:53

4,对直接的DOM操作进行限制

这里的基本思想是在内存中建立你确实想要的东西,然后更新DOM 。
这并不是一个jQuery最佳实践,但必须进行有效的JavaScript操作 。直接的DOM操作速度很慢。
例如,你想动态的创建一组列表元素,千万不要这样做,如下所示:
var top_100_list = [...], // 假设这里是100个独一无二的字符串
$mylist = $("#mylist"); // jQuery 选择到
    元素
    for (var i=0, l=top_100_list.length; i $mylist.append("
  • " + top_100_list[i] + "
  • ");
    }
作者:libo 浏览(483) 回复(0) 标签:ajax