3/14, 109«123456»

辛苦的升级

2010-7-24 12:44:27 开发者 抢沙发(0)

从3.2.15 逐步升级到 5.0.0 真受痛苦,之后的版本由于本人愚钝。。。还是无法升级至最新的isroc。。。。

 

话说最新的编辑器让我非常郁闷。。。缺少了代码的所见即所得的部分。。。。

Kissy UI 官方网公布

2010-7-7 19:18:07 AJBridge 抢沙发(0)

 感谢 “日月土成”“手气不错” 的贡献,kissy UI 上线。

地址:http://kissyui.com/

 

你会说:“纳尼~~  这不是 kiss  YUI 么?”

没错!咱们就是和YUI有着很渊源的关,但又不是它!

 

不过话说回来,大家都太忙了,建设站点还需要一些时间。

不过一定会有惊喜,请期待吧!

攻击Google的Jarlsberg,学习安全漏洞知识

2010-5-12 12:40:23 新闻 抢沙发(0)

 http://www.infoq.com/cn/news/2010/05/Jarlsberg

 

很多人都想知道黑客是如何攻击并进入到系统的,为了帮助他们,Google创建了一个特殊的名为Jarlsberg 的实验室,其中的应用程序满是安全漏洞,开发者可以利用它以实践的方式学习到潜在的漏洞是什么样的,恶意用户是如何利用这些漏洞的,以及如何做才能免受攻 击。

这个实验室是围绕安全漏洞的不同类型来组织的,对于每个漏洞,都有找寻和攻击漏洞的任务可供完成。 该实验室使用了下列三种主要的技术:

  • 黑盒:用户看不到应用程序的源代码,因此他们需要猜测服务器工作的方式,从而设法利用安全漏洞。
  • 白盒:以开源应用的形式提供了源代码(Python)。 用户可以阅读代码,从而找到弱点所在。
  • 灰盒:实验室会给出一些应用程序是如何编写的提示,但不会让用户看到完整的源代码。

Jarlsberg特意使用了大量特 性,以扩大应用程序的攻击面。

  • 代码片段中的HTML: 用户可以在代码片段中包含特定的HTML代码。
  • 文件上载: 用户可以向服务器上载文件,例如,在他们的代码片断中包含图片。
  • Web形式的管理: 系统管理员可以使用web界面来管理系统。
  • 新建账号: 用户可以创建属于自己的账号。
  • 模板语言: Jarlsberg模板语言(JTL)是种新语言,它使得开发者可以更容易地编写网页,作为直接与数据库连接的模板。 你可以在jarlsberg/jtl.py找 到JTL的相关文档。
  • AJAX: Jarlsberg使用AJAX来实现在主页和代码片断页中的刷新。 如果不需要特别关注AJAX内容,你可以忽略Jarlsberg中的AJAX部分。

在Jarlsberg中,你可以找到、利用并最终修复以下安全漏洞:

  • 跨站点脚本攻击(XSS)
  • 跨站点伪造请求攻击(XSRF)
  • 跨站点包含脚本攻击(CSSI)
  • 客户端状态操控攻击
  • 路径模式发掘攻击
  • 拒绝服务攻击(DoS)
  • 执行代码攻击
  • 配置漏洞
  • AJAX漏洞攻击

你可以在本地运行该实验室,以在整个学习过程中完全掌控该实验室;或者也可以在Google的云中作为沙盒实例运行。 该实验室大部分是基于Creative Commons Attribution 3.0协议发布的,但也有一部分是基于Creative Commons Attribution-No Derivative Works 3.0协议发布的,这使得对于大学培训学生或者公司培训员工,让他们理解并 保护他们系统免受安全漏洞影响都是很理想的。

查看原文:Learning About Security Vulnerabilities by Hacking Google’s Jarlsberg

生成随机字符串的密封类

2010-5-11 11:35:11 开发者 抢沙发(0)

C# 代码 

 

  1. using   System;   
  2.   using   System.Security.Cryptography;   
  3.     
  4.   namespace   YNIT.Components   
  5.   {   
  6.   ///   <summary>   
  7.   ///   生成随机字符串的密封类,不能被继承   
  8.   ///   </summary>   
  9.   public   sealed   class   RandomStr     
  10.   {   
  11.   private   static   readonly   int   defaultLength   =   8;   
  12.     
  13.   private   static   int   GetNewSeed()   
  14.   {   
  15.   byte[]   rndBytes   =   new   byte[4];   
  16.   RNGCryptoServiceProvider   rng   =   new   RNGCryptoServiceProvider();   
  17.   rng.GetBytes(rndBytes);   
  18.   return   BitConverter.ToInt32(rndBytes,0);   
  19.   }   
  20.     
  21.   private   static   string   BuildRndCodeAll(int   strLen)     
  22.   {   
  23.   System.Random   RandomObj   =   new   System.Random(GetNewSeed());     
  24.   string   buildRndCodeReturn   =   null;   
  25.   for(int   i=0;   i<strLen;   i++)     
  26.   {   
  27.   buildRndCodeReturn   +=   (char)RandomObj.Next(33,125);   
  28.   }   
  29.   return   buildRndCodeReturn;   
  30.   }   
  31.     
  32.   #region   输出随机字符串   
  33.   ///   <summary>   
  34.   ///   输出长度为8的随机字符串   
  35.   ///   </summary>   
  36.   ///   <returns>长度为8的随机字符串</returns>   
  37.   public   static   string   GetRndStrOfAll()     
  38.   {   
  39.   return   BuildRndCodeAll(defaultLength);   
  40.   }   
  41.     
  42.   ///   <summary>   
  43.   ///   输出指定长度的随机字符串   
  44.   ///   </summary>   
  45.   ///   <param   name="LenOf">长度</param>   
  46.   ///   <returns>指定长度的随机字符串</returns>   
  47.   public   static   string   GetRndStrOfAll(int   LenOf)     
  48.   {   
  49.   return   BuildRndCodeAll(LenOf);   
  50.   }   
  51.   #endregion   
  52.         
  53.   private   static   string   sCharLow   =   "abcdefghijklmnopqrstuvwxyz";   
  54.   private   static   string   sCharUpp   =   "ABCDEFGHIJKLMNOPQRSTUVWXYZ";   
  55.   private   static   string   sNumber   =   "0123456789";   
  56.     
  57.   private   static   string   BuildRndCodeOnly(string   StrOf,int   strLen)     
  58.   {   
  59.   System.Random   RandomObj   =   new   System.Random(GetNewSeed());     
  60.   string   buildRndCodeReturn   =   null;   
  61.   for(int   i=0;   i<strLen;   i++)   
  62.   {   
  63.   buildRndCodeReturn   +=   StrOf.Substring(RandomObj.Next(0,StrOf.Length-1),1);   
  64.   }   
  65.   return   buildRndCodeReturn;   
  66.   }   
  67.     
  68.   #region   输出指定范围随机字符串   
  69.   ///   <summary>   
  70.   ///   输出长度为8的小写字母加数字的字符串   
  71.   ///   </summary>   
  72.   ///   <returns>长度为8的小写字母加数字的字符串</returns>   
  73.   public   static   string   GetRndStrOnlyFor()     
  74.   {   
  75.   return   BuildRndCodeOnly(sCharLow   +   sNumber,defaultLength);   
  76.   }   
  77.     
  78.   ///   <summary>   
  79.   ///   输出指定长度的小写字母加数字的字符串   
  80.   ///   </summary>   
  81.   ///   <param   name="LenOf">长度</param>   
  82.   ///   <returns>指定长度的小写字母加数字的字符串</returns>   
  83.   public   static   string   GetRndStrOnlyFor(int   LenOf)     
  84.   {   
  85.   return   BuildRndCodeOnly(sCharLow   +   sNumber,LenOf);   
  86.   }   
  87.     
  88.   ///   <summary>   
  89.   ///   输出长度为8的指定字符串   
  90.   ///   </summary>   
  91.   ///   <param   name="bUseUpper">是否含有大写字母</param>   
  92.   ///   <param   name="bUseNumber">是否含有数字</param>   
  93.   ///   <returns>长度为8的指定字符串</returns>   
  94.   public   static   string   GetRndStrOnlyFor(bool   bUseUpper,bool   bUseNumber)     
  95.   {   
  96.   string   strTmp   =   sCharLow;   
  97.   if   (bUseUpper)   strTmp   +=   sCharUpp;   
  98.   if   (bUseNumber)   strTmp   +=   sNumber;   
  99.     
  100.   return   BuildRndCodeOnly(strTmp,defaultLength);   
  101.   }   
  102.         
  103.   ///   <summary>   
  104.   ///   输出指定长度的指定字符串   
  105.   ///   </summary>   
  106.   ///   <param   name="LenOf">长度</param>   
  107.   ///   <param   name="bUseUpper">是否含有大写字母</param>   
  108.   ///   <param   name="bUseNumber">是否含有数字</param>   
  109.   ///   <returns>指定长度的指定字符串</returns>   
  110.   public   static   string   GetRndStrOnlyFor(int   LenOf,bool   bUseUpper,bool   bUseNumber)     
  111.   {   
  112.   string   strTmp   =   sCharLow;   
  113.   if   (bUseUpper)   strTmp   +=   sCharUpp;   
  114.   if   (bUseNumber)   strTmp   +=   sNumber;   
  115.     
  116.   return   BuildRndCodeOnly(strTmp,LenOf);   
  117.   }   
  118.   #endregion   
  119.   }    

 

容量单位_K_M_G_T_P_E_Z_Y

2010-5-10 17:10:34 常识 抢沙发(0)

 单位全称  缩写        换算

 
Kilo    K  1K字节 = 1,024个字节
Meg     M 1M字节= 1,048,576字节
Giga      G 1G字节 = 1,073,741,824字节
Tera     T  1T字节 = 1,099,511,627,776字节
Peta    P  1P 字节= 1,125,899,906,842,624字节
Exa     E  1E字节 = 1,152,921,504,606,846,976字节
Zetta    Z  1Z字节 = 1,180,591,620,717,411,303,424字节
Yotta    Y 1Y字节 = 1,208,925,819,614,629,174,706,176字节 
 
Prefix Symbol 1000m 10n Decimal Short scale Long scale Since[1]
yotta Y 10008 1024 1000000000000000000000000 Septillion Quadrillion 1991
zetta Z 10007 1021 1000000000000000000000 Sextillion Trilliard 1991
exa E 10006 1018 1000000000000000000 Quintillion Trillion 1975
peta P 10005 1015 1000000000000000 Quadrillion Billiard 1975
tera T 10004 1012 1000000000000 Trillion Billion 1960
giga G 10003 109 1000000000 Billion Milliard 1960
mega M 10002 106 1000000 Million 1960
kilo k 10001 103 1000 Thousand 1795
hecto h 100023 102 100 Hundred 1795
deca da 100013 101 10 Ten 1795
    10000 100 1 One  
deci d 100013 10−1 0.1 Tenth 1795
centi c 100023 10−2 0.01 Hundredth 1795
milli m 1000−1 10−3 0.001 Thousandth 1795
micro µ 1000−2 10−6 0.000001 Millionth 1960[2]
nano n 1000−3 10−9 0.000000001 Billionth Milliardth 1960
pico p 1000−4 10−12 0.000000000001 Trillionth Billionth 1960
femto f 1000−5 10−15 0.000000000000001 Quadrillionth Billiardth 1964
atto a 1000−6 10−18 0.000000000000000001 Quintillionth Trillionth 1964
zepto z 1000−7 10−21 0.000000000000000000001 Sextillionth Trilliardth 1991
yocto y 1000−8 10−24 0.000000000000000000000001 Septillionth Quadrillionth
 

[转载]HG:Mercurial - 分布式版本控制系统

2010-4-30 10:16:35 开发者 抢沙发(0)

 

1、下载地址:Mercurial 主页,安装时一定要同意其自启动。
        Mercurial 是一个轻量级的分布式版本控制系统,它以方便的控制、极强的扩展性赢得了众多开放源代码项目的青睐。本文从版本控制系统中的基本概念、操作和扩展性等方面,有侧重的介绍了 Mercurial。此外本文列出了几个其他常用的分布式版本控制系统,并和 Mercurial 作了简单的比较。通过阅读本文,读者可以了解基础的Mercurial操作,进而熟悉这个备受青睐的工具。
Mercurial 是一种轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。相对于传统的版本控制,具有如下优点:
  • 更轻松的管理。传统的版本控制系统使用集中式的 repository,一些和 repository相关的管理就只能由管理员一个人进行。由于采用了分布式的模型,Mercurial 中就没有这样的困扰,每个用户管理自己的 repository,管理员只需协调同步这些repository。
  • 更健壮的系统。分布式系统比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响。
  • 对网络的依赖性更低。由于同步可以放在任意时刻进行,Mercurial 甚至可以离线进行管理,只需在有网络连接时同步。

版本控制系统中的 repository 就像一个仓库一样,用来存储被管理的数据文件,包含数据文件的不同版本。传统的版本控制系统中,这样的repository 是集中式的。除了这样一个集中式的 repository 之外,每个用户会有一份自己的工作版本拷贝。用户通过命令同步自己的拷贝和集中式的repository。
分布式版本控制系统中的 repository 则采用的是对等网络式的方式。传统集中式的管理中,只有一份 repository,其他的只是工作拷贝,不包含额外的版本。分布式的管理当中,每个用户所持有的都是一个真实的 repository,当中存储有不同的版本信息和维护一个 repository 的必要的辅助元数据。这样一个对等工作模式当中,用户通过交换下文即将提到的 changeset 来完成同步。
这样做的一些优点在于,工作的并行度将大大的提高。每个用户都可以带着这样的repository,从这里他可以把当前的工作拷贝切换到 repository 里面存储的任何一个版本。这个版本可以是之前正在工作的版本,现在需要合并进一些别人的意见,也可以是用户私有的一个版本,当前正在做很多前瞻性的工作,还没有能同步给其他用户使用。也同样是因为这样的模式,每个用户可以任意把自己的 repository 当中的一个版本交换给其他用户,而不需要对自己手头正在工作的版本进行回退。下图是这样一个灵活的工作模式的演示。

在使用 Mercurial 的系统中每个改动隔离在各自的 repository 里,既避免把不相关的代码混杂起来, 又便于一个接一个的测试每一部分工作,用户做的每个改动称为一个 revision。一般会有一个所有用户都可以访问得到的 repository 保存了项目的“主要”版本,工作repository 是用户自己做事情的地方,实现新的特性,修改漏洞,重构,实验等,当完成改变后,你可以 push 到共用的 repositor y中,即完成了一个 revision。
一个或多个文件的改变集合在一起形成一个逻辑单元,称为 changeset。每一个 changeset由两部分内容描述,版本号和 changeset 标识,例如:
	changeset:   207:58e4906e69e3 
冒号前面的数字代表版本号,它用来标识本地 changeset。这个版本号只有在用户的本地repository 中才有意义。冒号后面的那个很长的十六进制串是 changeset标识, 它是确定changeset的全局唯一标识符, 在所有包含这个 changese 的 repository 中都相同。多个用户之间讨论changeset,一般使用这个 changeset 标识,而不是上面说的版本号,因为完全有可能每个用户的 repository 中同样的 changeset 版本号不同。
Head 表示 repository 中每个分支最新的 revision,通常在合并几个分支时会用到这个概念。
Tip 是最新的一个 changeset 的版本号的一个别名。在命令中任何使用版本号的地方都可以使用 tip 来代替最新的 changeset的版本号。Tip在各个repository中是不同的,同时一个repository 中只有一个 tip。
Log 命令按时间顺序从近到远的记录着在 repository 中发生的每一次事件。可以通过指定-v诊断输出选项来获得更多更详细的历史信息,或者指定—debug选项来获得历史信息中的一切细节。

以下是一些实际使用 Mercurial 中常用的例子。Mercurial 的原意是元素周期表当中的汞元素,但是 Mercurial 这样的单词显然不太适合日常使用。事实上 Mercurial 的命令取了元素周期表当中汞元素的化学符号:hg,所有的 Mercurial 命令都以 hg 开始。
    $ hg command [options]
其中 command 是 Mercurial 的命令。每个命令的具体的命令行选项可以使用:
    $ hg help command
来获得。
我们使用 clone 命令克隆一个 repository,它生成一个完整的 repository 复本,这样我们就有一个本地私有的 repository 来工作。
例如:
     $ hg clone  http://foo.com/hg/project1
如果所有都没问题,clone 命令输出:
    destination directory: project1
    requesting all changes
	adding changesets
	adding manifests
	adding file changes
	added 127 changesets with 448 changes to 143 files
	139 files updated, 0 files merged, 0 files removed, 0 files 	unresolved
此时,我们应该在当前目录下发现一个目录叫 project1,目录下的文件是我们刚克隆的 repository 的精确复本。在 Mercurial 中,每一个 repository 是自包含的。当你克隆一个repository 后,新 repository 变成克隆时它的精确复本,但是后续的两个 repository 当中任一方改变都不会在对方显示,除非用户使用 pull 或 push 命令明确地传递改变,这个将在后面介绍。
另外,每个用户可以使用 init 命令将本地的一个目录初始化为一个 Mercurial 的 repository,只需要在那个目录下运行:
   $ hg init
如果设置好了同步共享的发布方式,其他用户就可以来克隆该用户的 repository 了。
进入工作目录,使用我们喜欢的编辑软件修改,例如我们要修改 main.py 让它增加打印一行输出:
def main():
    print "I'm in the a function."
    print "Great joy of using Mercurial!"  #新加的一行
if __name__ == "__main__":
    sys.exit(main())
完成之后退出编辑器,任务完成。有了刚才的修改我们就可以创建一个changeset。
在创建 changeset 之前如果想确认一下哪些文件被改动了,可以使用 status 命令。
$ hg status
M main.py
使用 diff 命令可以检查实际文件内容的改变:
diff -r a58db6f0e482 main.py
--- a/main.py   Thu Nov 29 13:38:38 2007 +0800
+++ b/main.py   Thu Nov 29 13:46:10 2007 +0800
@@ -1,5 +1,6 @@ def main():
 def main():
     print "I'm in the a function."
+    print "Great joy of using Mercurial!" #新加的一行
 if __name__ == "__main__":
     sys.exit(main())
diff 命令的默认输出是通用的补丁格式,易于在各种系统之间交换和讨论。
创建一个 changeset 后我们就可以用 commit 命令提交了。
$ hg commit
这个命令把我们带到一个编辑器内,缺省的编辑器是 vi,同时给我们展示了几行如下的文字:
HG: user: Guolian Yun <yunguol@cn.ibm.com>
HG: changed main.py
第一行是空的,接下来的几行表明哪些文件将进入本 changeset。为了改变 changeset,我们必须描述它的原因,这通常称为 changeset注释。让我们输入一些:
I’m using Mercurial!
HG: user: Guolian Yun <yunguol@cn.ibm.com>
HG: changed main.py
接着,保存并退出编辑器,如果一切正常,commit 命令将没有任何提示地输出。
让我们看看status命令现在告诉我们什么?
$ hg status
什么也没有!我们的改动已经提交到changeset里了,那里没有修改的文件需要提交的。Repository 中内容和当前工作目录的内容一致了。
现在可以检查以下最新的改动是不是包含刚才所添加的 changeset 注释,使用 tip 命令就可以显示了:
$ hg tip:
changeset:   2:2874393e3d9c
tag:         tip
user:        Guolian Yun <yunguol@cn.ibm.com>
date:        Thu Nov 29 10:10:39 2007 +0800
summary:     I'm using Mercurial!
目前新的 changeset 只存在本地 repository 中,如果想和其它 repository 分享改动,我们需要使用 push。
$ hg push project2
project2 为你想要 push 的目标 repository 的名字。
想要得到所有在别的 repository中而在本地repository中没有的改动,可以采用 pull命令。
$ hg pull project3
project3为我们想要得到更新的目标repository的名字。
在 Pull 后,缺省情况下Mercurial不更新工作目录。这意味着虽然repository现在有changeset,但在工作目录中的 main.py 文件仍然是 pull 之前老的内容。
如果只想从hg clone的 repository 中更新当前 revision 到最新版,可以直接采用:
$ hg pull -u
上文当中的 push 和 pull 的操作,是处于不同位置的 repository 之间的同步。之前给出的两个例子是本地目录 repository 之间的同步。Mercurial 还支持以下形式的 repository 之间的同步:
file://local/filesystem/path
http://[user@]host[:port]/[path]
https://[user@]host[:port]/[path]
ssh://[user@]host[:port]/[path]
其中 file 协议和本地目录相同。在 http 和 https 协议上使用push命令,需要在远端的服务器上启用相关的属性。ssh协议是众多系统中支持的shell。
标准的 Mercurial 发行包中还附带一个 Python CGI 脚本 hgweb.cgi, 可以用来参考搭建一个多用户可以集中式的同步改动的界面,如下图所示:

 

 

Mercurial 系统中提供一种扩展机制来添加新的命令。通过扩展添加的命令可以在现有的Mercurial 系统的基础上添加新的功能,这些命令跟随 hg 后被调用时就像原生的命令一样。本文介绍两个常用的Mercurial扩展:Patchbomb和Mq。
Patchbomb是一个在Mercurial系统中利用发送邮件的方式来交换changeset的扩展。Patchbomb添加了一个新的email命令。通过调用 hg email 命令,changeset 提交时的信息的第一行将作为邮件的主题,信件的正文包括完整的 changese t提交信息,以 patch 的形式发布出来的 changeset 完整补丁。如果一次发送的是多个changeset,那么Patchbomb会提示输入本次 changeset 集的总提示信息,这部分信息将作为第一封信,信件主题以[PATCH 0 of N]开头,changeset 则会以[PATCH i of N]将的主题开头发出,其中i是 changeset在本地 repository 当中的顺序。多changeset 系列邮件中,每封信会在邮件头中包含合适的回复信息,这样在邮件客户端可以清晰的显示出系列 changeset 之间的层次关系。
Patchbomb 支持使用本地系统中的 sendmail 程序来发送邮件,同时支持使用 SMTP 邮件服务器。用户如果长期固定为某个项目工作,还可以将邮件的收件地址和发信地址提供给Patchbomb,免去每次手动输入的麻烦。这一切都可以在 Mercurial 统一的 .hgrc 当中设置,以下是一个完整的例子。
[extensions]
hgext.patchbomb =
[email]
method = smtp # 还可以在这里指定/usr/sbin/sendmail
from = Zhengang Li <lizg@cn.ibm.com>
to = groupmail@foo.com
[smtp]
host = smtp.foo.com
Patchbomb 作者为Bryan O’Sullivan,该扩展现在随同 Mercurial 系统一起发布,用户不需额外下载安装,只需如上例中一样启用即可。
Mq 扩展的全名是Mercurial Queues,顾名思义该扩展将用户本地的多个 changeset 排列到队列中。原先分布式版本控制系统中,changeset 一旦提交并不能修改。有了 Mq 扩展之后,用户可以将本地的任意数量的 changeset 存放至一个本地的队列当中,对这些 changeset 用户除了可以使用传统的 changeset 上的任何命令之外,还可以修改changeset,包括提交信息和版本补丁的改动。
启用 Mq 扩展的办法同其他扩展一样,在 .hgrc 当中添加如下信息:
[extensions]
hgext.mq=
Mq的命令是一系列以字母q打头的命令,qinitqnewqrefreshqdiffqpop和qpush等。Qinit 用来初始化用来存放补丁队列的目录,qnew创建一个新的补丁changeset,qrefresh 将改动刷新到当前的补丁当中去,qdiff 将当前的补丁打印到屏幕,qpop 和 qpush 用来移动当前存放在队列顶部的补丁。完整的 q 系列命令可以从 hg help给出的列表中获得。
Mq中所有的 changeset 补丁存放在项目顶层目录的.hg/patches下面,用户可以手动修改这些补丁当中的提交信息。Changeset 补丁的顺序存放在.hg/patches/series文件当中,同样的,用户可以修改这些补丁的顺序。
Mq的作者是Chris Mason,该扩展现在随同 Mercurial 系统一起发布,用户不需额外下载安装。
如果现有的扩展不能满足用户的要求,编写自己的扩展也不困难。Mercurial 使用 Python编写,编写一个新的扩展相当于在 Mercurial 系统的 hgext 包当中编写一个新的模块。具体的扩展实现还有些约定的规则,用户可以参考 Mercurial 所提供的文档。

分布式版本控制系统领域还有一些其他的系统,如GNU arch,monotone,Bazaar,git,darcs。
各类系统在各在一定的领域内长处,如GNU arch在GNU Savannah主机上应用,Bazaar 主要用于 Ubuntu Linux 系统的开发当中,git 源于Linux kernel 的开发,现在在多处和内核相关的项目中使用。他们大多数提供友好的Web界面和多种版本同步协议的支持。Git 和Gnu arch 由 C 和 shell 脚本语言编写实现,monotone 由C++语言实现,darcs 由 Haskell语言实现,Bazaar 和本文介绍的 Mercurial 由 Python 语言实现。从开放和扩展性方面来说,类似 Python 这样的脚本语言的更易于用户编写自己的扩展。
在众多的分布式版本控制系统中,Mercurial 是最年轻的,它的第一个版本发布于2005年4月。Mercurial 吸收了众多前辈的特性,被众多的项目采用。

Mercurial 基本的概念和操作熟悉之后,读者可以进一步阅读参考资料当中的文献,进一步了解Mercurial 的系统维护和实现细节。
 
 
KINGFO:其他指南 http://hgbook.red-bean.com/read/

 

UML4AS:UML for ActionScript and Flex ---ASer的福音

2010-4-22 9:33:54 新闻 抢沙发(0)

 UML4AS - UML for ActionScript and Flex is a UML editor with advanced CodeSync technology.

The UML4AS Forum is up at http://www.uml4as.com/forum.

 

 UML4AS Web Site is Online

http://www.uml4as.com/ 

 

UML4AS 是一款通过代码同步技术(CodeSync),面向actionscript创建UML的一款专业工具。

UML4AS 4月底将发布公开的Alpha版本,5月的发布Beta版本~~~

届时将会有 开源的免费版本  以及  “能够承受”的价格的付费版本(唉,米国人真幸福。。。)

一些特性

  1. 将作为IDE插件的一部分(基于Eclipse 的版本?如Flashbuilder)
  2. CodeSync技术:  同步处理代码(后台运行并处理模型至代码)
  3. 同2 ,在CodeSync技术,允许用户以灵活的方式同步修改模型和代码。

 UML4AS 官方站点: http://www.uml4as.com/

UML4AS 官方论坛:http://www.uml4as.com/forum

以下是部分内测版本截图,点击可看大图:

 

 

 

牢骚

2010-4-20 10:07:05 心情 抢沙发(0)
  1.  15年是个上限,是常胜的上限~我们7周年了~!
  2. 互联网生命过程: 创新 ------ 得气(获得人气)  ------  固守 ---------   “借鉴” -------   一直“借鉴”  -----  “被获得”  -----  保守 ------衰变 ------  衰败
3/14, 109«123456»