易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
[转载]使用IIS 7.0 PowerShell 创建web站点,Web应用,虚拟路径和应用程序池

[转载]使用IIS 7.0 PowerShell 创建web站点,Web应用,虚拟路径和应用程序池

在博客园代震军BLOG 上,他翻译了:使用IIS 7.0 PowerShell 创建web站点,Web应用,虚拟路径和应用程序池,因为可能会在以后使用windows服务器,所以相对比较关心一下,也就复制了一份做为资料。

原文网址:http://www.cnblogs.com/daizhj/archive/2008/12/22/1352019.html
作者:代震军(我看原文最后还有个人信息,也一并转载,省得说我复制部份,呵呵)

原文如下:

原文链接:Creating Web-Sites, Web Applications, Virtual Directories and Application Pools

在本文中您将学会如何去创建WEB站点,Web Applications, 虚拟目录和应用程序池.

介绍

IIS PowerShell 名空间包括诸如: Web-Sites, Apps, Virtual Directories 和 Application Pools.

使用内置的PowerShell cmdlets可以很容易创建一个名空间项和管理该项.

创建Web站点

如果您熟悉PowerShell 的话,就会知道在各种PowerShell 名空间下New-Item cmdlet 通常被用于创建

新项。 举个例子,当前命令 "New-Item c:\TestDirectory" 会创建一个新的文件夹 (尽管多数人使用New-Item

的别名命令 "MD" 或 "MKDIR" ). 在IIS 7.0 PowerShell 名空间下,New-Item 也常用于创建新的Web站点.

参数

在创建一个文件系统路径时,您需要指定一个路径名称. 不巧的是当前创建WEB站点时这是不够的. 除了像

文件系统路径这样的参数之外,还需要network bindings. 下面的命令用于创建一个新的WEB站点并使用dir命令

进行显示:

PS IIS:\Sites> New-Item iis:\Sites\TestSite -bindings @{protocol="http";bindingInformation=":80:TestSite"} -physicalPath c:\test

PS IIS:\Sites
> dir

Name ID State Physical Path Bindings
---- -- ----- ------------- --------
Default Web Site 1 Started f:\inetpub\wwwroot http *:80:
TestSite
2 Started c:\test http :80:TestSite

这里直接使用了 -physicalPath 参数. 然而您可能会问: -bindings 看起来咋这么复杂?.

在构造时通常使用hashtable (在 这里 了解更多PowerShell hash tables信息). hash table 中的键值对表示一个

设置集合,该集合在IIS站点bindings section中会反射出相关属性:

<bindings>
<binding protocol="http" bindingInformation=":80:TestSite" />
</bindings>

现在我们找出了一个使用hash table的原因: IIS 配置是可以使用属性进行扩展的。 (查看 这里 了解更多信息) . 您

可以想像一下使用其它属性扩展 <binding> 元素节点. hash table 的键值对提供了这种弹性.

坦白说,该语法有一点复杂. 我们正在考虑在Tech Preview中封装一些典型任务:比如创建站点的方法或脚本。

删除站点

下面是删除刚创建的站点.

PS IIS:\ >Remove-Item IIS:\Sites\TestSite

创建Web Applications

创建Web Applications 要比创建站点要容易. 下面:

PS IIS:\> New-Item 'IIS:\Sites\Default Web Site\DemoApp' -physicalPath c:\test -type Application


Name ApplicationPool EnabledProtocols PhysicalPath
---- --------------- ---------------- ------------
DemoApp DefaultAppPool http c:\test

您仅需指定的一个参数是 type (-type) ,因为在一个站点下,您可能要创建一个Applications 或一个虚拟路径.

通过指定 -type 参数,就会告之 IIS Provider 要创建一个application.

要删除这个 application 的话,也可以使用Remove-Item(见上面删除站点).

创建虚拟目录

要创建虚拟目录,您也要使用New-Item cmdlet. 下面会在指定站点(Default Web Site)下创建两个虚拟目录。

一个位于站点下,一个位于刚创建的 Web Application (DemoApp)下面.

PS IIS:\> New-Item 'IIS:\Sites\Default Web Site\DemoVirtualDir1' -type VirtualDirectory -physicalPath c:\test\virtualDirectory1

Name PhysicalPath
---- ------------
DemoVirtualDir1 c:\test\virtualDirectory1


PS IIS:\
> New-Item 'IIS:\Sites\Default Web Site\DemoApp\DemoVirtualDir2' -type VirtualDirectory -physicalPath c:\test\virtualDirectory2

Name PhysicalPath
---- ------------
DemoVirtualDir2 c:\test\virtualDirectory2

创建应用程序池

创建应用程序池更简单. 仅需指定一个名称即可.

PS IIS:\> new-item AppPools\DemoAppPool

Name State
---- -----
DemoAppPool {}

简单吧,不是吗? 现在让我们将这些知识点连起来做一个完整的方案.

将所有知识点连在一起

在这个方案中,我们将执行下面这些步骤:

  1. 创建一系列的文件系统路径用于绑定站点, web applications 和虚拟文件。
  2. 向新创建的目录下拷贝一些简单的web内容。
  3. 创建一个新的应用程序池。
  4. 创建一个新的站点,一个新的 application 以及两个虚拟目录并将其绑到新创建的应用程序池上。
  5. 使用浏览器请求(访问这些内容)。

步骤 1: 创建目录

我们使用 New-Item cmdlet 来创建新的文件系统目录. 执行下面命令 (如不想指定-type 参数的话,可使用'md'):

New-Item C:\DemoSite -type Directory

New
-Item C:\DemoSite\DemoApp -type Directory

New
-Item C:\DemoSite\DemoVirtualDir1 -type Directory

New
-Item C:\DemoSite\DemoVirtualDir2 -type Directory

步骤 2: 拷贝内容

现在向这些目录中写入一些 html 内容(文件):

Set-Content C:\DemoSite\Default.htm "DemoSite Default Page"

Set
-Content C:\DemoSite\DemoApp\Default.htm "DemoSite\DemoApp Default Page"

Set
-Content C:\DemoSite\DemoVirtualDir1\Default.htm "DemoSite\DemoVirtualDir1 Default Page"

Set
-Content C:\DemoSite\DemoVirtualDir2\Default.htm "DemoSite\DemoApp\DemoVirtualDir2 Default Page"

步骤 3: 创建新的应用程序池

为站点创建一个新的应用程序池 'DemoAppPool' (如之前的例子中您也创建的话,请先删除它).

New-Item IIS:\AppPools\DemoAppPool

Step 4: 创建新的站点, Web Applications 和虚拟目录并绑定到应用程序池上

这里简化一下,我们创建 DemoSite, DemoApp 和两个虚拟目录:

DemoVirtualDir1 绑定到DemoSite 下

DemoVirtualDir2 绑定到DemoApp 下

我们将DemoSite 和 DemoApp 绑定到之前创建的 DemoAppPool 上. 为了不与'Default Web Site' 冲突,

这里DemoSite 的端口设置为 8080:

New-Item IIS:\Sites\DemoSite -physicalPath C:\DemoSite -bindings @{protocol="http";bindingInformation=":8080:"}

Set
-ItemProperty IIS:\Sites\DemoSite -name applicationPool -value DemoAppPool

New
-Item IIS:\Sites\DemoSite\DemoApp -physicalPath C:\DemoSite\DemoApp -type Application

Set
-ItemProperty IIS:\sites\DemoSite\DemoApp -name applicationPool -value DemoAppPool

New
-Item IIS:\Sites\DemoSite\DemoVirtualDir1 -physicalPath C:\DemoSite\DemoVirtualDir1 -type VirtualDirectory

New
-Item IIS:\Sites\DemoSite\DemoApp\DemoVirtualDir2 -physicalPath C:\DemoSite\DemoVirtualDir2 -type VirtualDirectory

好,下面就要请求这些web 内容了。

步骤 5: 请求Web 内容

当然,您可以打开浏览器并敲入地址 http://localhost:8080/ ,以及其它链接(上面已创建)。但本文是PowerShell

的walkthrough 所以我们使用 .NET WebClient classes 来实现这个请求:

$webclient = New-Object Net.WebClient

$webclient.DownloadString("http://localhost:8080/");

$webclient.DownloadString("http://localhost:8080/DemoApp");

$webclient.DownloadString("http://localhost:8080/DemoVirtualDir1");

$webclient.DownloadString("http://localhost:8080/DemoApp/DemoVirtualDir2");

If you feeling adventurous you can also use Internet Explorer object itself:

$ie = new-object -com InternetExplorer.Application

$ie.Visible = $true

$ie.Navigate(http://localhost:8080/);

总结

本文中,您了解了如何使用PowerShell创建WEB站点, Web Applications, 虚拟目录和应用程序池.

除此之外,我们还使用 PowerShell 创建了一个功能(函数)化的完整方案.

译者注: PowerShell Provider for IIS 7.0 (x86) - CTP2下载连接,请点击这里:)

当然除了上面的方式来管理IIS站点之外,还可以使用Microsoft.Web.Administration(该dll位于"Windows\

System32\inetsrv目录下)。下面的PS脚本就是实现指量创建,删除等站点操作功能的:

function Setup-IIS
{
param([int]$NumSites)
for($i=0 ; $i -lt $NumSites ; $i++)
{
$Appfolder = "c:\inetpub\webroot\Site$i"
if (-not (test-path $Appfolder))
{
md
$AppFolder -force | out-null
$defaultHTM = "$Appfolder\default.htm"
echo
"This is site $i" | out-file $defaultHTM
}
}
}
function Cleanup-IIS
{
param([int]$NumSites)
[System.Reflection.Assembly]
::LoadWithPartialName("Microsoft.Web.Administration")

$mgr = new-object Microsoft.Web.Administration.serverManager

for($i=0 ; $i -lt $NumSites ; $i++)
{
$AppPoolName= "AppPool_$i"
$SiteName = "WebSite_$i"
$Appfolder = "c:\inetpub\webroot\Site$i"
$mgr.Sites.Remove($mgr.Sites[$SiteName])
$mgr.ApplicationPools.Remove($mgr.ApplicationPools[$AppPoolName])
if (test-path $Appfolder)
{
rd
$Appfolder -recurse
}
}
$mgr.CommitChanges()
}

function Makewebs-IIS
{
param([int]$NumSites)

$start = get-date
[System.Reflection.Assembly]
::LoadWithPartialName("Microsoft.Web.Administration") | out-null

$mgr = new-object Microsoft.Web.Administration.serverManager

for($i=0 ; $i -lt $NumSites ; $i++)
{
$AppPoolName= "AppPool_$i"
$SiteName = "WebSite_$i"
$portNumber = 8000 + $i
$mgr.ApplicationPools.Add($AppPoolName) | out-null
$Appfolder = "c:\inetpub\webroot\Site$i"

$site = $mgr.Sites.Add($SiteName,$Appfolder,$portNumber)
$site.ServerAutoStart = $true

$app = $site.Applications[0]
$app.ApplicationPoolName = $AppPoolName
#$site.Bindings.Add("*:$portNumber:", "http") | out-null
}
$mgr.CommitChanges()

$duration = [DateTime]::Now - $start
write
-host "Total seconds: " + $duration.TotalSeconds.Tostring()
}

我们只要以“管理员身份”运行Powershell,并在命令行下输入如下(以创建站点为例)代码:

>Makewebs-IIS 10

这样就会批量创建10web站点了:)

好了,今天的内容就先到这里了。


原文链接:http://www.cnblogs.com/daizhj/archive/2008/12/10/1352019.html

作者: daizhj, 代震军

Tags: iis7,powershell,powershell provider

网址: http://daizhj.cnblogs.com/

————EOF————

由于PowerShell将会成为未来CMD的替代品,对于它,有很多人都在关注着,也曾经下载了一个关于PowerShell的介绍和简单使用 的PDF,(在家里),等有空的时候也一并上传

小二入库

小二入库

今天早上,打车去了物流公司,取回了开花石头发给我的小二,很感谢他。
其实关于小二,很久前就有了联系了,然而正当要运的时候,奥运会开幕了,结果是再也不能运液体了。一直拖啊拖的,终于石头想了办法,得知某物流公司肯运了,而且不能保价。
看到包装盒,感觉石头很用心。
再次感谢。。。估计应该没破

浅复制与深复制中的传值与传址

浅复制与深复制中的传值与传址

说实话,我看到这个标题的时候没有看懂,确实没有理解本文的标题想表达什么意思。看完之后我是理解了。先贴上原文,再谈我的理解。。。

原文地址:http://www.cn-cuckoo.com/2008/12/24/shallow-or-deep-copy-and-pass-by-value-or-reference-270.html

内容如下:

这个标题念起来有点拗口,但却是理解数据结构的关键。标题中的4个术语,对应的英文分别是:shallow copy(注意,不是shadow copy)、deep copy、pass by value、pass by reference(或pass by address)。传址和传引用是一回事。

一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型(immutable)和可变类型(mutable)。为什么这么分呢?这涉及到内存分配问题。对于不可变类型,只要分配有限的内存空间即可,而对于不可变类型,理论上则要分配没有大小限制的空间。因此,这么分是出于合理利用系统资源的考虑。实际上,堆内存和栈内存分别用于保存不可变类型值和可变类型值。

什么是不可变类型?就是该值一旦赋予某个变量,就只属于某个变量,不能同属于其他变量。如:

var stringValue = “I’m immutable data structure, mean you can’t modify me!”;
var anotherStringValue = stringValue;
stringValue = “I have changed”;

此时,anotherStringValue中保存的值会不会也变成“I have changed”?不会。因为

var anotherStringValue = stringValue;

照stringValue中保存的字符串的原样,复制一个字符串(相应地,在内存中分配一块新空间),并将该字符串赋给 anotherStringValue。换句话说,这两个变量虽然保存的值相同,但它们的值并不在一块内存中。因此,修改任何一个变量,都不会影响另一个变量。即

stringValue = “I have changed”;

只会影响stringValue的值。但是,确切来讲,stringValue = “I have changed”;并不是修改stringValue,而是创建了一个新字符串(相应地,在内存中分配一块新空间),然后让stringValue引用该字符串——更像是替换变量的值;原来的字符串呢?因为没有变量引用它,也就成为垃圾了(当然,垃圾所占用的内存会被回收)。

由此可见,赋值操作对于不变类型而言,传递的是内存中的值本身。那么,对于可变类型呢?当然,传递的是内存中值的引用(或者说地址),而且无论传递多少次,内存中始终都只有一份原始值——毕竟可变类型大小莫测,只保存一份原始值能最大限度节省内存空间。例如:

var objectValue = {1:1,’s’:’string’,'innerObject’:{’innerArray’ : [1,2,3]}};
var anotherObjectValue = objectValue;
objectValue[1] = 100;
anotherObjectValue[1]; //100

不言自明,这里的anotherObjectValue通过赋值操作,从objectValue那里只获得了对原始对象( {1:1,’s’:’string’,'innerObject’:{’innerArray’ : [1,2,3]}})的引用,也就是该对象在内存中的地址,或者说“门牌号码”。因此,修改通过objectValue修改原始对象的第一个元素(objectValue[1] = 100;),结果当然会在anotherObjectValue[1]这里得到反映了。

在JavaScript中,给函数传递参数是按照上述默认约定——即对不可变类型,传值;对可变类型,传址——进行的。如:

function example(str, obj){
……
}
example(stringValue,objectValue);

调用example函数时,第一个参数传递的是实际的字符串值,第二参数传递的是对象的引用(内存地址)。

在PHP中,定义函数时可以指定相应参数是传值还是传址——通常是传值。其实,这也很容易理解:假如函数要求为某个可变类型参数传值,而不是传址,那么也就意味着内存中会因此多出一份该类型值的副本。相应地,在函数中修改这份新副本,不会影响函数外的原副本。因为新旧副本在内存中就不是同一个地址。说到这,也就引出了浅复制和深复制的概念。事实上,浅复制和深复制的区别恰恰在于复制可变类型时,是传值还是传址。如果是像往常一样传址(传引用),那么就是浅复制。如果是传值,那么就是深复制。浅复制和深复制到底有什么区别呢?以下面的Python代码为例:

>>> x = {’username’: ‘admin’, ‘machines’: [’foo’, ‘bar’, ‘baz’]}
>>> y = x.copy()
>>> y[’username’] = ‘mlh’
>>> y[’machines’].remove(’bar’)
>>> y
{’username’: ‘mlh’, ‘machines’: [’foo’, ‘baz’]}
>>> x
{’username’: ‘admin’, ‘machines’: [’foo’, ‘baz’]}

调用字典x的copy方法返回一个新字典并赋值给y,新字典中带有与原字典相同的键-值对。注意,copy方法采用浅复制创建的新字典,与原字典有区别也有联系。区别体现在,对于原字典中不可变的值,如数字、字符串、元组等,会在新字典中重新生成一份新副本;因此,修改(实际上是替换,或者说是重新赋值)这些键的值(y[’username’] = ‘mlh’)不会影响原字典。联系体现在,对于原字典中可变的值,如列表、字典,不会在新字典中生成新副本,而只复制值的引用,即新字典中相应的键保存的是引用,当然,原字典中相应的键保存的也是引用,而且这两个引用都指向同一块内存地址。这就是所谓的浅复制。因此,如果修改的是可变类型的值(y[’machines’].remove(’bar’)),就一定会影响引用该值的原字典项了。

深复制则不然。深复制是实实在在地把原字典中所有的值全都照原样子重新创建一遍,无论是不变类型值,还是可变类型值。执行深复制后,内存中会存在两份完全一样的数据段,但分别处于不同内存空间中,即地址不同。而且,分别由不同变量(原字典、新字典)引用。因此,经过深复制后修改一个字典,不会影响另一个字典。Python的copy模块中的deepcopy函数可以实现深复制:

>>> from copy import deepcopy
>>> d = {}
>>> d[’names’] = [’Alfred’, ‘Bertrand’]
>>> c = d.copy()
>>> dc = deepcopy(d)
>>> d[’names’].append(’Clive’)
>>> c
{’names’: [’Alfred’, ‘Bertrand’, ‘Clive’]}
>>> dc
{’names’: [’Alfred’, ‘Bertrand’]}

显然,修改深复制得到的新值不会影响原值;而修改浅复制得到的“新”值,在某种程度上仍然会影响原值。
作者想表达的意思应该是在javascript中变量的复制和赋值,对于普通的变量而言,赋值仅仅是一个复制,而对于对象而言,赋值则是一个引用。

比如:var a=1;var b=a;

在这里,b其实是a的一个复制,所以b=1,正因为是复制,所以复制完后,b和a就没有任何关系了,当a重新赋值的时候,对于b则没有影响,同样,对于b再重新赋值,对a也没有影响 。

但是,如果a是一个对象,那就不一样了

例如var test ={a:1,b:2};var test1 =test;

在这样的情况下,test1就不再是test的复制了,而是直接取了test的地址,所以对于Test的值的改变,也影响到了test1,比如我test.a = 2,那么我test1.a的值也就自动变成了2

这点其实在PHP5里面已经也这样了,在PHP4的时候,对象的赋值也是一个复制,所以我们为了保证只有一个实例,往往都是采用:$a = &$b ;但是从5开始则不一样,对于对象而言,如果没有特别指定的操作,那么就相当于是对地址的一个引用。效果和上面的JS代码类似。

作者在最后举了一个PYTHON的例子来说明深复制,其实也就是为对象也做一个拷贝而不是采用引用,这个,当然在PHP里也有,clone就是实现的这个效果。HOHO

平安夜

平安夜

老外的节日中国人在过,不过也算是国外的新年吧
圣诞快乐,朋友们。。。
剩蛋,生蛋才行,过两天还有圆蛋。。。

可惜我还要上课,郁闷啊。。。回家的时候带了两杯老婆喜欢的咖啡,希望她也快乐。

VI命令备份

VI命令备份

网上找来的,因为需要在命令行下使用vi,不得己了。。。。人都是逼出来的嘛。

  进入vi的命令

  vi filename :打开或新建文件,并将光标置于第一行首

  vi +n filename :打开文件,并将光标置于第n行首

  vi + filename :打开文件,并将光标置于最后一行首

  vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处

  vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename

  vi filename....filename :打开多个文件,依次编辑

  移动光标类命令

  h :光标左移一个字符

  l :光标右移一个字符

  space:光标右移一个字符

  Backspace:光标左移一个字符

  k或Ctrl+p:光标上移一行

  j或Ctrl+n :光标下移一行

  Enter :光标下移一行

  w或W :光标右移一个字至字首

  b或B :光标左移一个字至字首

  e或E :光标右移一个字j至字尾

  ) :光标移至句尾

  ( :光标移至句首

  }:光标移至段落开头

  {:光标移至段落结尾

  nG:光标移至第n行首

  n+:光标下移n行

  n-:光标上移n行

  n$:光标移至第n行尾

  H :光标移至屏幕顶行

  M :光标移至屏幕中间行

  L :光标移至屏幕最后行

  0:(注意是数字零)光标移至当前行首

  $:光标移至当前行尾

  屏幕翻滚类命令

  Ctrl+u:向文件首翻半屏

  Ctrl+d:向文件尾翻半屏

  Ctrl+f:向文件尾翻一屏

  Ctrl+b;向文件首翻一屏

  nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

  插入文本类命令

  i :在光标前

  I :在当前行首

  a:光标后

  A:在当前行尾

  o:在当前行之下新开一行

  O:在当前行之上新开一行

  r:替换当前字符

  R:替换当前字符及其后的字符,直至按ESC键

  s:从当前光标位置处开始,以输入的文本替代指定数目的字符

  S:删除指定数目的行,并以所输入文本代替之

  ncw或nCW:修改指定数目的字

  nCC:修改指定数目的行

  删除命令

  ndw或ndW:删除光标处开始及其后的n-1个字

  do:删至行首

  d$:删至行尾

  ndd:删除当前行及其后n-1行

  x或X:删除一个字符,x删除光标后的,而X删除光标前的

  Ctrl+u:删除输入方式下所输入的文本

  搜索及替换命令 :

  /pattern:从光标开始处向文件尾搜索pattern

  ?pattern:从光标开始处向文件首搜索pattern

  n:在同一方向重复上一次搜索命令

  N:在反方向上重复上一次搜索命令

  :s/p1/p2/g:将当前行中所有p1均用p2替代

  :n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代

  :g/p1/s//p2/g:将文件中所有p1均用p2替换

  选项设置

  all:列出所有选项设置情况

  term:设置终端类型

  ignorance:在搜索中忽略大小写

  list:显示制表位(Ctrl+I)和行尾标志($)

  number:显示行号

  report:显示由面向行的命令修改过的数目

  terse:显示简短的警告信息

  warn:在转到别的文件时若没保存当前文件则显示NO write信息

  nomagic:允许在搜索模式中,使用前面不带“”的特殊字符

  nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始

  mesg:允许vi显示其他用户用write写到自己终端上的信息

  最后行方式命令

  :n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下

  :n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下

  :n1,n2 d :将n1行到n2行之间的内容删除

  :w :保存当前文件

  :e filename:打开文件filename进行编辑

  :x:保存当前文件并退出

  :q:退出vi

  :q!:不保存文件并退出vi

  :!command:执行shell命令command

  :n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指

  定n1,n2,则表示将整个文件内容作为command的输入

  :r!command:将命令command的输出结果放到当前行 。

Help Test jQuery 1.3 Beta 1

The jQuery team has been working hard on the new release of the jQuery library and it’s ready for some in-depth testing! jQuery 1.3 is not ready for production use yet but we need help to weed out any bugs that might’ve snuck through.

看上去jQuery团队们都很辛苦,所以,小白鼠们,你们也辛苦一点,把BUG测试的多一点,我们在以后的项目中才敢正常的应用啊。

自己也是用jQuery的,应该也会测试一些,特别是针对这次更新的功能:

  • Selector Engine - The selector code has undergone a complete rewrite - it’s likely that some edge cases still exist here.
  • DOM Manipulation (append/prepend/before/after) - This code has also undergone a large rewrite along with some of the logic for executing inline script elements.
  • .offset() - Another method that has been completely rewritten.
  • Event Namespaces - The logic for handling namespaced events has been completely rewritten.
  • Event Triggering - When triggering an event the event now bubbles up the DOM - this is likely to cause some problems.

选择器改写,DOM控制器又是大的改写,.offset改写,事件命名空间改写,不知道改写后效率会怎么样,当然,估计改写也应该是冲着效率而去的,否则改写的意义也不是特别大了。

事件触发,针对DOM的事件触发?估计问题也会挺多,他们也是这么认为的。DOM太难控制了,毕竟不是每个页面都是按照规范来写的。

如果你写了一些代码,并认为它触发了这些BUG,你可以提交到:http://dev.jquery.com/ ,当然提交的代码尽量是简短一些,提交的时候也需要将你的mail写上,这样,jQuery Team可能在修改后会通知你的哦。

做个自己的头像

做个自己的头像

经常看到好友的MSN头像变成卡通型的,也没有感觉到奇怪,是的,他们都是艺术类的,有这样的头像很正常。比如我以前的同事小田,头像都是自己画的,那还有什么不可能呢?

今天川姐也向我秀了一下她的头像,经询问才知道原来是通过某个网站自动生成。兴冲冲的冲向这个网站,花了我大约15分钟左右,做了这个头像。黑黑。。。。

[localfile=2]

网址是:http://faceyourmanga.it/levostrefacce.php?lang=eng

看到的朋友,如果觉得好玩。也去做一张吧,呵呵

浏览器的战争

浏览器的战争

写这篇文章是在看到CB上有条新闻,搜狗推出了自己的浏览器。
先怀念一下,DOS下的网景。

作为一个网页开发人员,虽然我并非搞设计的,但做出来的页面配合公司的美工同事们,也需要对一个个的页面进行测试,所以电脑里就装了各种各样不同核心的浏览器:IE,firefox,opera,网景,safari,最近的chrome在电脑里也有一席之地

总体来说,基本上就是ie,opera,gekeo,webkit等几个有限的核心,其他的都是在这些内核上套点皮而己

国内,自从最初的myie推出了多TAB的浏览器,就开始一发不可收拾,后来所说myie的作者因与XX功有染,导致没有后续开发,但因为他的思想很先进,代码也开源了,所以从那之后,国内的greenbrowser,myie2(maxthon),the world,tt等浏览器如雨后春笋般的冒了出来,至今也活跃在浏览器的舞台上

再后来,360也出浏览器了,也就是将sandbox和the world进行了整合,今天,又看到说搜狗也出浏览器了。所以就特别的感慨 呀。。。

搜狗,这两年的动作很多,先是输入法,接着又搞这个浏览器了。确实让人大吃一惊。。。。

国外的浏览器市场也是烽烟四起,抛开几个大型公司不谈,N多基于IE的核心的浏览器也是层出不穷,什么avant browser,以前还有日本的sni...(不记得名字了),现在日本的Lunascape5又出来了,居然是三核心。。。

对于这样的纷争,对我们搞WEB的人来说实在是一件很痉的事情,除了IE不支持W3C外其他的几个核心对于W3C的支持还是挺不错的。相传,IE8将100%支持W3C,只是不知道是真是假 。。

期待明年1月,IE8给我们带来的惊喜。

可惜苦的都是前端,每做一个页面,都要为不同的浏览器写HACK

来自jljlpch的jQuery详解

来自jljlpch的jQuery详解

能够用厚厚的PDF来解释jQuery的人不多,但确实是有一个。看到这篇文章也是一个意外,是从订阅的某个人的博客里找到的。他看到这篇文章也很意外,于是乎,我也就很意外的转载了一下。
原文地址:http://jljlpch.javaeye.com/blog/234218
作者:jljlpch
原文中的PDF下载地址:

我会做个镜象的。。。
原文如下:

jQuery是一个非常优秀的JS库,与Prototype,YUI,Mootools等众多的Js类库相比,它剑走偏锋,从web开发的实用角度 出发,抛除了其它Lib中一些中看但不实用的东西,为开发者提供了优美短小而精悍的类库。其使用简单,文档丰富,而且性能高效,能极大地提高web系统的 开发效率。因此可以说是web应用开发中最佳的Js辅助类库之一。大部分开发者正在抛弃Prototype,而选择Jquery做为他们进行web开发的 JS库。

如是开发人员仅仅只知道文档中的简单的使用方法,却不明白Jquery的运行原理和内部机制,在使用jquery时,肯定会碰到许多的问题。这些问 题有一部分是Jquery的Bug。大部分是自身的使用不当而造成的。而文档的简单的使用说明很难解决问题。在调试基于jQuery的web应用时,很多 时候都要跟踪进入jQuery对象分析其运行状态以了解出错的原因。

如果对于web的应用的页面运行性能和效率有所要求的话,那么我们更应该去明白其运行机理和核心源码。但是jQuery源码不像其它的类库那样,它 有点晦涩,难懂。这就是本源码分析的原因,让所有使用jQuery的读者,能快速上手jQuery的源码,并在开发中得心应用。

Jquery的网络资源丰富,但Baidu了很久,很难找到那种完全深入地分析Jquery源码的文稿。倒是Jquery的开发者,John Resi的《Pro Javascript Techniques》涉及到Jquery的源码的分析,但是其主指还是在于JavaScript的使用。那本书并不能使我们完全细致地了解Jquery 的源码。

写个这个源码分析的理由其实很简单,在工作中使用jquery经常出问题,不得不分析其源码,我把分析的源码放在blog。其标题是jquery core 源码分析。结果有一网友竟评论说打到标题党,可见还是有很多人像我这样想完全了解jquery的core代码。

从自己能看懂,到自己写出来。发现自己有一个质的提高。但是由于水平有限,分析过程的难免有错误。请大家多多指教。不过嘴下能留情就最好了。有什么问题可以到blog:jljlpch.javaeye.com去访问和评论。附件附有打包的源码。

分析源码,最难的地方不是你能理解,你能分析得出来。如果把所有的分析都写在源文件中,我想很多人看不了多少行就会中止的。很难有人有兴趣对得源码一行行地去分析。何把源码有机地组合起来,串成一条线是本教程的最为头疼的地方。


读书的最高境界是厚积薄发。分析源码也是一样。对于4,5千行的jquery源码,我们如何做到心中有数,知道什么功能在什么函数里内 呢? 什么函数用在什么地方呢?这样就得把所有的函数有机分类地重组起来,想着Jquery的主要目的和自己对于js方面的理解。我把整个Jquery薄发成三 个单词 query-->manipulate-->expand。

jquery一个很紧缩的lib,它的主要目的就是对dom元素进行操作。那么dom元素的从哪里?
到dom树中去找。这就是 query。$(),Jquery的构建就是一个query的过程。我们可以把这个query范围放大一点,它不光是从dom中查找的CSS selector,还有可能是从html的片断中去寻找的dom元素生成,更进一步就是直接的dom元素(集)。$()的构建就是从这里出发的。
query到元素集,这个query的过程还没有最终完成。因为这些结果集不一定满足我们的要求,那么就要筛选,要过滤。要进行数组方面的相关的操作。这就涉及到jquery对象的类数组的特征。我们就可以把这些类数组的相关的函数放在一起来分析。

当最终的需求的集合形成,我们要的完成我们真正要做的,对集合中的dom元素进行操作。
怎么操作?操作什么呢?不就是对dom元素的attribute,class, style,css,event等进行操作吗?
细化一下:
1、我们可以把attribute,class,style都看作是是属性的操作,还有expando的自定义的属性。这就涉及到jquery.data。
2、对dom元素的内容。什么是内容。innerHtml是。all childNodes也是,value也可以算。对于内容的操作就有追加,插入,前插,后插,内部前插和内部后插。那当然不能少了clone,remove这些操作。
3、 CSS是可以在dom元素中单独出来分成一块来做分析的。对于css的操作,不就是 height,width,innerHeight,innerWidth,out(height,widith)的操作,还有元素的位置 (position,offset),display or not。这就是对于CSS的操作。
4、Event也是元素的操作中的一部分。这一部分除了addEvent,fireEvent,removeEvent,和domready就没有别的啦。
5、Ajax是给元素从服务器中找内容填充的。真正用到最多不还是load吗,对于getScript,getJson之类全都是在jQuery.ajax的函数的基础而出来。
6、 Fx可以看做是CSS的操作。但是其又高于CSS。对于FX,最基本不就show,hide,slide(down,up),fade(in,out)这 几种用法。无论什么用法,都基于时间的长短映射到元素CSS的属性值的对对应比率的大小。采用setInterval间隔来运行就形成了动画。这就 animate()函数。所有效果的发源地。

想想整个jquery就是这么简单。当然如果没有去身体力行去自己分析,无论什么教程都是没有用的。

其实query-->manipulate是表层的东西。还有一个高层的就是expand。这涉及到一个lib的架构与设计。

这部分我们可以从源码的角度去解读对于js lib的架构。
除了扩展性(extend)之后,一个lib肯定是要花大力气去考虑它的性能。
考虑它的内存使用。
这是站在设计Jquery的角度去分析。

想了很久,但是这一部分还没有写入目前的源码分析中。

镜象PDF下载:6da9ef7a85b819adaa8f587b6582ea08