firefox衍生版、修改版介绍

     有一点需要告知下:使用了下面的修改版/第三方/衍生版的firefox,很多事国外定制的,所以字符集设置的是en-us,再浏览一些大型网站如淘宝,腾讯微博的时候会跳转到对应的英文站点页面,可能带来不便。
今天,firefox 9 放出来了,作为firefox的忠实粉丝,自然是要去尝鲜的。
现在,chrome风头正盛,那么多人歌颂chrome,为什么我仍然坚持firefox呢?理由如下:
1.google的霸道作风我一直很讨厌。如:官方死活不提供离线安装(有人说有离线版的,确实有,但是为什么不在官网贴出来呢,藏着掖着干嘛?对于我这种办公室男,网络带宽有限,我对在线安装不感冒),firefox就做的很好,有一个公开的FTP可以随时去查看上面的各种资源:ftp://ftp.mozilla.org/pub/ (据说,google程序员的电脑最低配置32G内存,带宽更是牛逼,但是天朝表示无语,全世界表示压力很大,大概也是这个原因吧,google的程序员认为在线安装就1秒钟的事情,为什么不在线安装呢?这也是google的chrome OS失败的原因。google总是以为现在的网络已经到了泛滥的地步了,实际上并非如此)。其次,chrome安装不给人任何选择余地,没有任何选项,强行安装到系统盘(有人又要说,你可以XXX啊,但chrome凭啥如此霸道),这明明是流氓软件的作风。
2.还是google自以为是的霸道作风,用自己的观点来决定产品。很长时间以来,chrome 14之前的版本居然不支持退出时清除浏览记录,必须写脚本或手工清除,我很无语(不信的话,网络上还可以搜到类似的技巧)
3.chrome多进程,占用内存极大,动辄上G内存,伤不起,就那么一点提速,对我来说没感觉。

因此,本人对chrome无爱。
扯回正题,所谓firefox衍生版、修改版其实就是在mozilla的源代码上重新编译的,通过设置了一些编译参数,使得性能得到提升,当然,幅度不会很大,有一些更高级的优化措施,如使用更优的指令和组件等。比较有名的衍生版有:
1.pale moon。沧月,官网http://www.palemoon.org/。目前最新版8.0,还有3.6.28的经典版,默认英语界面,可下载中文包,感觉性能和速度提升比较明显。更新也很勤快。
2.lawliet,最新版9.0,国人所为,下载地址http://code.google.com/p/lawlietfox/
3.pcxfirefox,最新版8.0.1,国人所为,内存占用稍大。http://code.google.com/p/pcxfirefox
4.tete009,最新版9.0 http://www1.plala.or.jp/tete009/en-US/software.html
5.fx-ayakawa/ 凌川  http://code.google.com/p/fx-ayakawa/
不再更新和质量不高的就不再列出。

转:JavaScript 的死与生

很好的一篇文章:JavaScript is Dead. Long Live JavaScript! 下面是概要翻译与我的阅读笔记:

JavaScript 的成功得益于在正确的时间出现在正确的地点。JavaScript 的兴起与浏览器的支持息息相关。你瞧,VBScript 就没这么好运气。

JavaScript 很流行,但它有先天缺陷。Brendan Eich 当初只花了 10 天时间就把 JavaScript 设计出来了,作为 JavaScript 之父,BE 如是说:


与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:“它的优秀之处并非原创,它的原创之处并不优秀。”


(摘选自阮一峰的翻译:JavaScript 诞生记

JavaScript 的不足,最明显之处是语法。


糟糕冗长的语法


可选参数和默认值


function(a, b, option) {  option = option || {};  // ...}

上面的代码中,option 是可选参数,当没有传递时,默认值是 {}. 然而,传递的 option 值有可能是假值(falsy 值)。严格来写,得如下判断:


function(a, b, option) {  option = arguments.length > 2 ? option : {};  // ...}
注意:option = typeof option !== 'undefined' ? option : {} 也有可能是错误的,因为传递过来的可能就是 undefined

当不需要 b 参数,删除后,基于 arguments.length 的判断很容易导致忘记修改而出错:
function(a, option) {
  option = arguments.length > 2 ? option : {};
  // ...
}

如果能增加以下语法该多好呀:
function(a, b, option = {}) {
  // ...
}


Let


闭包很强大,也很恼火:
for (var i=0, ilen=elements.length; i<ilen; i++) {
  var element = elements[i];
  LIB_addEventListener(element, 'click', function(event) {
    alert('I was originally number ' + i);
  });
}

上面的代码经常在面试题中出现,解决办法是再包裹一层:
for (var i=0, ilen=elements.length; i<ilen; i++) {
  var element = elements[i];
  (function(num) {
    LIB_addEventListener(element, 'click', function(event) {
      alert('I was originally number ' + num);
    });
  }(i));
}

阅读剩余部分...

转:Simple JavaScript Template : substitute

我们在平常使用字符串拼接的时候(如下例),会发现代码的可维护性和易读性将变得更加糟糕(代码中一堆的变量、双引号、单引号, 加号等,相信当情况更为复杂时,头一定发晕):


var url= 'http://www.plannabc.net/',
    title
= '落草为根——专注前端技术&关注用户体验',
    text
= '怿飞's Blog';

var link = '
<a href="' + url + '" title="' + title+ '">' + text+ '</a>';

如果上述代码变为:


var obj = {
    url
: "http://www.plannabc.net/",
    title
: "落草为根——专注前端技术&关注用户体验",
    text
: "怿飞's Blog"
};
var link = '<a href="{url}" title="{title}">{text}</a>';
substitute
(link, obj)

一切变得怡然自得。

阅读剩余部分...

windows下架设svn服务器及与apache的结合

    因为自己工作时需要频繁修改文件,老把文件弄乱了,而且电脑常崩溃,就想自己搭个SVN服务器,这样就不怕丢文件了。下面的内容大部分来自于网络,少了些修改和补充。
一、准备工作
1、获取 Subversion 服务器程序

到官方网站(http://subversion.apache.org/packages.html)下载最新的服务器安装程序。目前最新的是1.7.2版本,有好几个人维护的SVN,可以随便选一个下载,就选http://sourceforge.net/projects/win32svn/这个吧,我也没比较哪个好,反正也差不多。

2、获取 TortoiseSVN 客户端程序

从官方网站 http://tortoisesvn.net/downloads获取最新的 TortoiseSVN 。TortoiseSVN 是一个客户端程序,用来与 subvers 服务器端通讯。Subversion 自带一个客户端程序 svn.exe ,但 TortoiseSVN 更好操作,提高效率。

二、安装服务器端和客户端

安装 Subversion(以下简称SVN)的服务器端和客户端。下载下来的服务器端是个 zip 压缩包,直接解压缩即可,比如我解压到 E:\svns 。客户端安装就不说了。

三、建立版本库(Repository)

运行Subversion服务器需要首先要建立一个版本库(Repository)。版本库可以看作是服务器上集中存放和管理数据的地方。

开始建立版本库。首先建立 e:\svn 空文件夹作为所有版本库的根目录。然后,进入命令行并切换到subversion的bin目录。输入如下命令:

svnadmin create E:\svn\repos1
此命令在 E:\svn 下建立一个版本库 repos1 。repos1 下面会自动生成一些文件夹和文件。
我们也可以使用 TortoiseSVN 图形化的完成这一步:
先建立空目录 E:\svn\repos1 ,注意一定是要空的。然后在 repos1 文件夹上“右键->TortoiseSVN->Create Repository here...”,然后可以选择版本库模式,这里使用默认的FSFS即可,然后就创建了一系列文件夹和文件,同命令行建立的一样。

阅读剩余部分...

转:理解inode

一、inode是什么?

理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

inode包含文件的元信息,具体来说有以下内容:


  * 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

  * 文件的读、写、执行权限

  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  * 链接数,即有多少文件名指向这个inode

  * 文件数据block的位置


可以用stat命令,查看某个文件的inode信息:


  stat example.txt


总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。

阅读剩余部分...

转:迅雷、快车下载地址加密算法

转自:http://www.yexiwei.com/post/219/
留下备用
1、迅雷专用链接编码

在原地址前面加”AA”,后面加”ZZ”(不包括引号),地址变为

AAhttp://www.yexiwei.com/10k.jpgZZ

此地址base64编码为

QUFodHRwOi8vd3d3LnlleGl3ZWkvMTBrLmpwZ1pa

迅雷专链即在上地址前加thunder://,即

thunder://QUFodHRwOi8vd3d3LnlleGl3ZWkvMTBrLmpwZ1pa

2、快车专用链接编码

在原地址前后都加上”[FLASHGET]“(不包括引号),地址变为

[FLASHGET]http://www.yexiwei.com/10k.jpg[FLASHGET]

此地址base64编码为

W0ZMQVNIR0VUXWh0dHA6Ly93d3cueWV4aXdlaS5jb20vMTBrLmpwZ1tGTEFTSEdFVF0=

快车专链即在上地址前加flashget://,注意后面还要加上”&符号”,符号怎么得出不清楚,在最后面加的是我的个人信息,至今未有人报告转换错误,即

Flashget://W0ZMQVNIR0VUXWh0dHA6Ly93d3cueWV4aXdlaS5jb20vMTBrLmpwZ1tGTEFTSEdFVF0=&yexiwei

转:Nginx源码剖析之内存池,与内存管理(3)

全文总结

    来自淘宝数据共享平台blog内的一篇文章对上述Nginx源码剖析之内存池,与内存管理总结得很好,特此引用之,作为对上文全文的一个总结:

    Nginx的内存池实现得很精巧,代码也很简洁。总的来说,所有的内存池基本都一个宗旨:申请大块内存,避免“细水长流”。
3.1、创建一个内存池
    nginx内存池主要有下面两个结构来维护,他们分别维护了内存池的头部和数据部。此处数据部就是供用户分配小块内存的地方。


    //该结构用来维护内存池的数据块,供用户分配之用。  
    typedef struct {  
        u_char *last; //当前内存分配结束位置,即下一段可分配内存的起始位置  
        u_char *end; //内存池结束位置  
        ngx_pool_t *next; //链接到下一个内存池  
        ngx_uint_t failed; //统计该内存池不能满足分配请求的次数  
    } ngx_pool_data_t;  
    //该结构维护整个内存池的头部信息。  
    struct ngx_pool_s {  
        ngx_pool_data_t d; //数据块  
        size_t max;  //数据块的大小,即小块内存的最大值  
        ngx_pool_t *current;    //保存当前内存池  
        ngx_chain_t *chain; //可以挂一个chain结构  
        ngx_pool_large_t *large;    //分配大块内存用,即超过max的内存请求  
        ngx_pool_cleanup_t *cleanup;    //挂载一些内存池释放的时候,同时释放的资源。 
        ngx_log_t *log;  
    }; 
有了上面的两个结构,就可以创建一个内存池了,nginx用来创建一个内存池的接口是:

    ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)(位于src/core/ngx_palloc.c中);

调用这个函数就可以创建一个大小为size的内存池了。

   

阅读剩余部分...

转:Nginx源码剖析之内存池,与内存管理(2)

Nginx源码剖析之内存管理




ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
    ngx_pool_t  *p;
    
    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
    //ngx_memalign()函数执行内存分配,该函数的实现在src/os/unix/ngx_alloc.c文件中(假定NGX_HAVE_POSIX_MEMALIGN被定义):
    
    if (p == NULL) {
        return NULL;
    }
    
    p->d.last = (u_char *) p + sizeof(ngx_pool_t);
    p->d.end = (u_char *) p + size;
    p->d.next = NULL;
    p->d.failed = 0;
    
    size = size - sizeof(ngx_pool_t);
    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
    //最大不超过4095B,别忘了上面NGX_MAX_ALLOC_FROM_POOL的定义
    
    p->current = p;
    p->chain = NULL;
    p->large = NULL;
    p->cleanup = NULL;
    p->log = log;
    
    return p;
}
例如,调用ngx_create_pool(1024, 0x80d1c4c)后,创建的内存池物理结构如下图:

3.jpg3.jpg

紧接着,咱们就来分析下上面代码中所提到的:ngx_memalign()函数。

阅读剩余部分...

    Page :
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. ...
  8. 38