2013年10月24日星期四

debian软件源source.list文件格式说明 - beanmoon

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
debian软件源source.list文件格式说明 - beanmoon  阅读原文»

在安装完debian操作系统之后大家做的第一件事大概就是修改source.list文件了吧,否则你是无法在线更新软件的,那么source.list文件中的各个配置项的具体含义你搞懂了么?下面就以我的source.list文件为例为大家讲解一下。

deb http://mirrors.163.com/debian/ wheezy main non-free contrib
deb http://mirrors.163.com/debian/ wheezy-proposed-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ wheezy main non-free contrib
deb-src http://mirrors.163.com/debian/ wheezy-proposed-updates main non-free contrib

其中可以把每一行分为四个部分,说白了,当你在线更新某个软件时,debian就是遵照这四个选项(准确的说是后三项)的指示找到软件来给你安装的:

deb ### ftp地址 ### 版本代号 ### 限定词
deb ### http:
//mirrors.163.com/debian/ ### wheezy ### main non-free contrib

其中,

1. 第一部分

第一部分为deb或者deb-src,其中前者代表软件的位置,后者代表软件的源代码的位置

2. 第二部分

第二部分为你的ftp镜像的url,以我的为例,我是用的是大陆速度较快的网易镜像。在浏览器中打开此链接以后会发现有如下内容:

其中:

/dists/ 目录包含"发行版"(distributions), 此处是获得 Debian 发布版本(releases)和已发布版本(pre-releases)的软件包的正规途径. 有些旧软件包及 packages.gz 文件仍在其中.

/pool/ 目录为软件包的物理地址. 软件包均放进一个巨大的 "池子(pool)", 按照源码包名称分类存放. 为了方便管理, pool 目录下按属性再分类("main", "contrib" 和 "non-free"), 分类下面再按源码包名称的首字母归档. 这些目录包含的文件有: 运行于各种系统架构的二进制软件包, 生成这些二进制软件包的源码包.

你可以执行命令 apt-cache showsrc mypackagename, 查看 'Directory:' 行获知每个软件包的存放位置. 例如: apache 软件包存放在 pool/main/a/apache/ 目录中.

另外, 由于lib*软件包数量巨大, 它们以特殊的方式归档: 例如, libpaper 软件包存放在 pool/main/libp/libpaper/.

还有一些目录:

/tools/:用于创建启动盘, 磁盘分区, 压缩/解压文件, 启动 Linux 的 DOS 下的小工.
/doc/:

基本的 Debian 文档, 如 FAQ, 错误报告系统指导等..

/indices/:

维护人员文件和重载文件.

/project/:

大部分为开发人员的资源, 如:

project/experimental/

本目录包含了处于开发中的软件包和工具, 它们均处于 alpha 测试阶段. 用户不应使用这些软件, 因为即使是经验丰富的用户也会被搞得一团糟.)

3. 第三部分

第三部分表示你的debian版本号(注意,不是某个软件的版本号,而是debian本身的版本号),也有人称这是对debian软件包的一种水平划分(这种说法还是比较形象的),具体这一项怎么写,可以参看http://mirrors.163.com/debian/dists/网页里面的内容(如下图),大致来说按版本的旧-->新程度有这么几大类:oldstable,stable,testing,sid

1.oldstable顾名思义,就是以前的稳定发行版了,在本例中oldstable就是Debian6.0.8目录的一个链接,两者内容完全一致。

2.stable是指现在的稳定发行版,对于每个debian来说,每个稳定发行版都会有一个代号,如debian 6叫做squeeze,debian 7叫做wheezy,由于在笔者写本文的时候稳定版是debian7,所以stable就是wheezy的一个链接。

3.testing指目前还暂时处于测试阶段的debian发行版,如wheezy往下发展就是jessie了,所以testing代指的就是jessie目录,它是jessie的一个链接。

4.unstable那就是不稳定版本了,但在这个目录清单里我们并没有看到unstable目录,其实它还有一个代号:sid,我们知道debian的发行版本名称大都来自玩具总动员中的角色名称,而sid就是那个专门破坏玩具的邻居家坏小孩,所以就把unstable这个不稳定的软件目录起名为sid了,这里面的软件一般都是最新的,稳定性、安全稳定值得商榷,如果你想做试验小白鼠,大可使用这里的软件。经过一段时间的测试,这里面的软件可能会进入下一个阶段testing目录从而出现在下一个debian发行版中,要么就夭折被直接抛弃了。

4. 第四部分

好了,从水平的角度介绍完debian发行版,现在我们进入这些目录大致看一下里面的内容(以stable目录为例):

我们会发现每个目录都会包括contrib、main、non-free等几个目录,那么这些目录又是什么东东呢?

以垂直的观点来看 Debian 软件的分布:maincontribnon-freenon-us
因为 Debian 是非营利组织,但是组织架构严谨,有一套完善的软件管理方式。基于其对软件 free 度的一种坚持,对不同版权软件包的录入有一些限定。
下面是对它们的一些简要介绍:
main Debian 里最基本及主要且符合自由软件规范的软件 ( packages )。
contrib 这里头软件虽然可以在 Debian 里头运作,即使本身属于自由软件但多半却是相依于非自由 ( non-free ) 软件。
non-free 不属于自由软件范畴的软件。
non-us 这个分类里头的软件都来自非美国地区,当中可能有牵扯到专利、加密..等等问题。
marillat 对应 Christian Marillat 的软件仓库,包括mplayer, transcode等。
rareware 对应 rarewares.org 的软件仓库, 包括很多音效程序,如lame, musepack, beep media player等。
ustc 对应 debian@ustc 维护的一些软件包,如 mule-gbk, gaim-openq, scim, stardictdicts, patched xpdf, irssi, xmms。
java
对应 Blackdown java。包括 j2re, j2sdk ,mozilla java plugin。
firefly 对应打过firefly补丁的包,包括 fontconfig mozilla mozilla-firefoxpango1.0 qt-x11-free xft
misc 对应其它无分类的包,包括 nvidia-kernel,winex3, rox, chmsee等

5. 关于源的混用问题第一部分

一般不建议混用 stable, lenny和 unstable 的源。因为很多软件之间都有不同程度的相依性,强行的结果会造成更多软件相依、相斥问题的产生,最终可能影响系统稳定与整个软件升级制度的正常运作。
需要把源从 stable 升到 lenny, unstable 或者是从 lenny 升到 unstable 源是非常简单的,只要修改 sources.list 里的源就好了。但反过来,降级是一种几乎不可能的任务…

6. 按需修改自己的sources.list

Debian 有自己独特的版本系统,整个系统有三个版本,分别为稳定版(stable),测试版(testing)和不稳定版(unstable/sid)。每次发布的版本都是稳定版,而测试版在经过一段时间的测试证明没有问题后会成为新的稳定。因为稳定版是会更新的,为了便于区分不同时期的稳定版,每个版本又有自己特有的代号(codename),现在的稳定版称为 wheezy(debian7),测试版称为jessie。而不稳定版的代号永远是 sid。
sources.list的写法
1)找到包含distspool这两个目录的那个目录,把地址记下来,比如http://mirrors.163.com/debian/;

2)打开dists,里面包含的目录名字,记下来。比如http://mirrors.163.com/debian/,dists/包含wheezy、testing等。把这些目录名字记下来。

3)打开pool目录,看看里面包含哪些组件目录,比如main、contrib、non-free;

4)书写格式:deb<1记下来的地址><2记下来的目录名><3记下来的名字>, 如:
deb http://mirrors.163.com/debian wheezy man contrib non-free

7. 更新软件包列表信息,升级debian

修改/etc/apt/sources.list 之后一般会运行下面两个命令进行更新升级:
sudo apt-get update
sudo apt-get dist-upgrade
其中 :
update - 取回更新的软件包列表信息
dist-upgrade - 发布版升级
第一个命令仅仅更新的软件包列表信息,所以很快就能完成。
第二个命令是全面更新发布版,一般会下载几百兆的新软件包。
其实在运行完第一个命令后系统就会提示你进行更新升级。因为修改了源,所有这次更新的改动可能会很大,比如安装某个包可能会删除太多的其他包,所有系统会提示你运行“sudo apt-get dist-upgrade”进行全面升级或使用软件包管理器中的“标记全部软件包以便升级”功能进行升级。两者效果是一样的。

本文系原创,转载请注明出处:http://www.cnblogs.com/beanmoon/p/3387652.html

参考链接:

jQuery 2.0.3 源码分析 回溯魔法 end()和pushStack() - Aaron.  阅读原文»

了解了jQuery对DOM进行遍历背后的工作机制,可以在编写代码时有意识地避免一些不必要的重复操作,从而提升代码的性能

从这章开始慢慢插入jQuery内部一系列工具方法的实现

关于jQuery对象的包装

var $aaron = $("aaron");

通过对sizzle的分析呢,jQuery选择器,反正最终都是通过dom接口实现取值的, 但是通过jQuery处理后返回的不仅仅只有dom对象,而是一个包装容器

返回的jQuery对象:$aaron

image

jQuery对象,其中有个prevObject这个是干嘛用的呢?


jQuery对象栈

jQuery内部维护着一个jQuery对象栈。每个遍历方法都会找到一组新元素(一个jQuery对象),然后jQuery会把这组元素推入到栈中。

而每个jQuery对象都有三个属性:context、selector和prevObject,其中的prevObject属性就指向这个对象栈中的前一个对象,而通过这个属性可以回溯到最初的DOM元素集


简单的测试demo

父元素ul,嵌套了li节点, 我们现给li绑定一个事件

<ul id="aaron">
parent
<li>child</li>
</ul>

这个很简单找到ul下面的li,绑定即可

var aaron = $("#aaron");
aaron.find(
'li').click(function(){
alert(
1) //1
})

此时我又想给父元素绑定一个事件,我们是不是又要在aaron上绑定事件?

通过find处理后,此时的上下文是每一个li了,所以必须要重新引用aaron父元素

aaron.click(function(){
alert(
2) //1
})

所有jQuery引入一个机制,可以回溯到之前的dom元素集合

通过end()方法

aaron.find('li').click(function(){
alert(
1)
}).end().click(
function(){
alert(
2)
})


jQuery为我们操作这个内部对象栈提供了两个非常有用的方法:

  • .end()
  • .andBack()

调用第一个方法只是简单地弹出一个对象(结果就是回到前一个jQuery对象)。第二个方法更有意思,调用它会在栈中回溯一个位置,然后把两个位置上的元素集组合起来,并把这个新的、组合之后的元素集推入栈的上方。

利用这个DOM元素栈可以减少重复的查询和遍历的操作,而减少重复操作也正是优化jQuery代码性能的关键所在。

.end() 方法

大多数 jQueryDOM遍历 方法来操作 jQuery 对象实例,并创建一个新的对象,匹配一个不同的 DOM 元素集合。当发生这种情况时,实际上是新的元素集合被压入到对象内部维护的栈中。每次过滤方法都会被压入栈中。当我们需要返回到前一个状态时,我们可以使用end() 进行出栈操作,来返回栈中的前一个状态。

假设页面上有几个短的列表

<ul class="first">
<li class="foo">list item 1</li>
<li>list item 2</li>
<li class="bar">list item 3</li>
</ul>
<ul class="second">
<li class="foo">list item 1</li>
<li>list item 2</li>
<li class="bar">list item 3</li>
</ul>

end() 方法主要用于 jQuery 的链式属性中。当没有使用链式用法时,我们通常只是调用变量名上的前一个对象,所以我们不需要操作栈。使用 end() 时,我们可以一次性调用所有需要的方法:

$('ul.first').find('.foo').css('background-color', 'red')
.end().find(
'.bar').css('background-color', 'green');

链式的原理就是要返回当前操作的上下文

错误的:

跟上面的demo一样,上下文被切换了,所以下面find(‘bar’)出错了

$('ul.first').find('.foo').css('background-color', 'red').find('.bar').css('background-color', 'green');

正确的:

首先在链式用法中只在第一个列表中查找样式为 foo 的项目,并将其背景色变成红色。然后 end()返回调用 find() 之前的状态。因此,第二次 find() 将只会查找 <ul class="first"> 中的 '.bar',而不是继续在<li class="foo"> 中进行查找,结果是将匹配到的元素的背景色变成绿色。上述代码的最终结果是,第一个列表中的第 1 和第 3 个列表项的背景色有颜色,而第二个列表中的任何项目都没有背景色。

$('ul.first').find('.foo').css('background-color', 'red')
.end().find(
'.bar').css('background-color', 'green');

总的来说end方法就是回溯到上一个dom合集,因此对于链式操作与优化,这个方法还是很有意义的


源码实现

既然是回溯到上一个dom合集,那么肯定end方法中返回的就是一个jQuery对象了,所以我们看源码

其实就是返回prevObject对象了

end: function() {
return this.prevObject || this.constructor(null);
},

prevObject在什么情况下会产生?

在构建jQuery对象的时候,通过pushStack方法构建

jQuery.fn.extend({
find:
function( selector ) {

...........................省略................................

//通过sizzle选择器,返回结果集
jQuery.find( selector, self[ i ], ret );

// Needed because $( selector, context ) becomes $( context ).find( selector )
ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
ret.selector
= this.selector ? this.selector + " " + selector : selector;
return ret;
}

pushStack:将一个DOM元素集合加入到jQuery栈。

pushStack: function( elems ) {

// Build a new jQuery matched element set
var ret = jQuery.merge( this.constructor(), elems );

// Add the old object onto the stack (as a reference)
ret.prevObject = this;
ret.context
= this.context;

// Return the newly-formed element set

没有评论:

发表评论