Mono的早期历史

Mono的早期历史 Miguel de Icaza 2003.10.13 Q: 你好,冒昧地问一下,是否在dotGnu of .NET 之前Mono项目就已经开始了?我很好奇。 我在那时候开始着手Mono项目的开发,对于Mono,事情大概是这样的: 2000年9月份,当.NET的文档出现的时候,我就开始对这个技术充满了兴趣,然后和所有人一样开始对字节码解释器进行研究,但是我面临一个问题:没有详细描述metadata的说明。 .NET的最终文档是在2001年1月22日的时候发布了,那段时间我开始写信给.NET的相关人员,希望能得到那份遗漏的关于metadata的文档。 我一边等待回复,一边开始开发自己的C#编译器,顺便当作第一个学习C#的练习工作,然后开始写解释器。 写编译器的这段时间,Rhys联系了我,他已经通过反编译获得了一些早期的metadata代码格式,这是一项非常有趣的工作,那时候我们小组只有三个人一起努力:Rhys、Saurik和我。 Sam Ruby发布了ECMA委员拥有的C#的二进制文档,虽然这并不是本来的安排。我并不知道事情会朝哪个方向发展,但是在2001年4月份,ECMA委员会发布了那份遗漏的文档。 这就意味着我自己的C#编译器可以完成解析器的工作了,然后我开始在周围让大家试用我的编译器,同时我们可以开始完整地学习文档,用于构建一个开源项目。 我们的研发工作包括:构建一个metadata读取器,这个工作人让我们很痛苦,因为Saurik已经做了一个了,他感觉他的代码没有被利用,而Rhys也有一个读取器,我个人并不是很喜欢(因为它不是基于Linux/Gnumeric代码风格)。 从2000年9月份开始,我就感叹.NET框架的魅力,当我们在Ximian内部讨论它的优点的时候,我们会跟其他人的工作联想起来,比如“Labs”组织的CORBA、SOAP和Perl团队为Gnome绑定基础服务(别忘记了:支撑我们工作的动力是我们希望我们的APIs只需要编写一次,就可以使用任何语言来调用) “Labs”组织的努力工作最终结果是:Bonobo-conf,ORBit2, bonobo-activation, Soup, 和Perl/Gtk绑定,目的是希望创建工具提高我们的生产力:用更少的时间开发更多的应用,提升更高的抽象和标准在桌面应用上,以节省我们的时间和开发成本。 他们的产品是积极有效的,但是所有这些用.NET框架都可以轻易实现。 但是当我们完成学习的时候,我很清楚地知道是有可能去构建这样一种技术,他可以成为未来linux桌面的高效开发工具。请记住:从这个角度说,我们正在开发一个最大的桌面应用程序,随着时间的向前发展,最终都会开源(比如Mozilla和OpenOffice最开始也是收费产品,后面也变得开源了)。 虽然我们已经拥有在构建开源项目的经验,但还要处理一些相对重要的代码还是很痛苦。 Nat Friedman强力支持我们,希望我们的努力能获得更大的突破,我们获得了在Ximian实验室的管理权,大部分在Ximian实验室的开发人员都加入了Mono团队。我们团队的目标就是希望能创造出一个工具以提高开发人员的工作效率。 我们保持平静,让我们的团队慢慢迁移到Mono项目中,大家逐步收缩自己手头上的项目,仅仅有两位保留在原来的项目,最后,Dietmar, Paolo, Dick和我都开始为Mono项目工作。 Ravi马上就会加入我们,他会帮助我们开发C#编译器。 很显然,一个小团队是不可能开发出一个完整的.NET框架的替代品的,所以我计划把Mono变成一个开源的项目。负责市场推广的Jon Perr知道我们把项目推广出去。 我们原来计划在2001年7月19日公开发布,这样我们就可以赶上O’Reilly会议,Tim O’Reilly一直都很支持我们的项目,他从一开始就帮助Mono,当它还是一个很小项目的时候。当我们发布我们的项目的时候,我们同时发布了metadata框架、C#编译器和一些初始类库。 所以官方地说,Mono的发布日期是那天,但是它酝酿了很久。 对我来说,什么最重要并不是关键,因为Mono项目之于我意味着:一项帮助Linux在桌面获得成功的技术。当然,它有自己的生命发展周期,Mono并不是因为Ximain/Novell选择它所以才有它,对它的贡献和选择来自它的贡献者和选择者。所以,Mono要变得强大和壮大也要靠它的使用者。 希望这样能回答你的问题。 英文源地址 http://lists.ximian.com/pipermail/mono-list/2003-October/016345.html

January 29, 2013

开源Mono

1、 Mono是什么 Mono诞生于2001年,他的创始人是全球开源世界排名第5的墨西哥传奇程序员Miguel de Icaza和他的朋友。Mono最开始的团队Ximian被Novell收购,所以Mono项目一直是由Novell赞助。2011年Novell被收购,Mono的团队濒临被解散,Mono处于非常危险的境地。这时候,拥有大将风范的Miguel de Icaza领导团队自立门户,创办了Xamarin(http://www.xamarin.com/)公司,并担任CTO,Mono免于灾难。目前Xamarin公司发展迅猛,2012年7月获得了一笔1200万美金的风险投资,公司现在致力于开发出好用、高效、好玩的移动应用平台。 Mono是.NET Framework 的一种开源实现。 Mono项目将使开发者使用C#写的.NET应用程序,能在任何Mono支持的平台上运行, 包括Linux、 Unix、FreeBSD和Windows。Mono项目将使大家能开发出各种跨平台的应用程序, 并能极大提高开源领域的开发效率。 作为一个有机的.NET整体, 它包括一个C#编译器, 一个公用语言运行时环境,以及相关的一整套类库,他甚至还包括IDE、调试工具和文档浏览器。 Mono项目的网址是:http://www.mono-project.com 2、 Mono的意义 Miguel de Icaza希望Mono希望实现“一次编写,到处运行”。Mono的目标是跨平台,跨语言。如果Mono成功的话,语言和平台对开发者的影响将变的很小,这也是Miguel de Icaza在创建Mono的时候就希望的——Linux的普通用户可以编写自己的程序(详《Mono的一些早期故事》见http://lists.ximian.com/pipermail/mono-list/2003-October/016371.html )。Miguel de Icaza是GHOME的创始人,他自己深知要想让现代程序员采用c、c++语言为linux家族创建普通的应用程序太难了,这也是为什么他致力于推进Mono的原因,因为C#确实是目前最伟大最优美的语言,简单、易学,既可以快速开发出应用程序,也可以写出有深度的程序。目前Miguel de Icaza的目标在移动,他相信目前是移动互联网发展的高潮期,操作系统没有稳定,未来会诞生出操作系统层面的开发工具,他知道可能不会是java、也可能不会是object c,他希望是Mono,这也是为什么出现了MonoTouch和Mono for android。 当然Miguel de Icaza对C#也是很有感情的,从C#诞生之日就一直在推动C#语言的发展,他还亲自编写C#的编译器(这个编译器是基于gun的)。 3、 Mono 的未来 未来有无限种可能,而Mono的未来相信Miguel de Icaza自己很清楚,并且他会为此不断奋斗,他希望更多开源世界的人一起进来推动Mono。他并不是不喜欢c和c++,但是这两门语言不是桌面需要的;而java确实不怎么样,更何况现在活在oracle下面。C#是标准的、开放的(这也许是得益于它的创始人安德森),Miguel de Icaza基于它写出了Mono,相信Mono会有一个伟大的未来,即使不伟大,我们也可以用它来做伟大的事。

January 25, 2013

我们团队决定采用Mono进行移动开发

经过一个多月时间的深思熟虑,我还是决定和团队的成员选择Mono作为我们的移动开发框架,理由有三个:C#太优美了;我们希望跨平台跨语言开发程序;为开源世界贡献力量。 我在2010年下半年开始参与ios应用的开发,现学了object-c,开发出了一个应用,当时公司还有团队在开发android的应用,2010年正直移动开发的爆发前夜。2011年的时候有同事聊过想一起出去做点事情,而移动互联网肯定是重点。于是开始着手做一些准备,无意间了解到了Mono的创始人开始创立自己的公司了,公司全力投入MonoTouch(Mono在很久以前也听说过)的研发,并且知道Mono for android正在开发中,很兴奋。我写信给Miguel de Icaza,咨询他关于他们产品的研发时间,他很快做了回复,并且说未来几个月时间就会推出产品。可惜后面公司变动,我去了百度,专注于LAMP下的开发。 2012年中,我辞掉百度的工作,开始热血沸腾的“创业”,中途历经挫折,差点“未成创业,已经失业”,最后找到一个避风港,继续编写代码。到今天,终于再次有机会做移动端的开发了。我最后还是选择了Mono!

December 22, 2012

[转]Emgu cv中的SIFT算法实现

SIFT算法大家都比较熟悉,网上的版本很多,刚开始接触时我主要研究的是C++,因为相对于C#,基于OPEN CV C++的SIFT算法资料更多,但是由于想要实现较为理想的界面效果,最终还是放弃了使用C++转而使用C#。 C#中SIFT算法主要分为三种: 1)脱离Emgu cv平台,完全手动实现所有SIFT算法函数,这样的程序虽然实现有些困难,但是完全可借助已有的C++程序做更改,而且这样做最大的好处就是对SIFT算法的原理有更深的理解。 2)实现时使用少量Emgu cv函数(例如影像的读取,灰度值获得等),但是大部分工作还是依赖于.net平台自行完成。 3)基本上程序完全借助于Emgu cv提供的接口,核心函数完全由Emgu cv提供。 前两类程序资源较多,大家也很容易下载,第三类程序资源相对较少,因此我今天简单为大家介绍第三类算法的实现方法,首先回顾一下SIFT算法计算步骤: 1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。 2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。 3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。 4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。 使用Emgu cv实现上述步骤非常简单,程序如下: //确定匹配图像 Bitmap bt1 = new Bitmap(@“C:\Users\GAOXIANG\Desktop\111.jpg”); Bitmap bt2 = new Bitmap(@“C:\Users\GAOXIANG\Desktop\222.jpg”); //将图像转为Emgu cv的处理格式 Image<Gray, byte> img1 = new Image<Gray, byte>(bt1); Image<Gray, byte> img2 = new Image<Gray, byte>(bt2); //使用Emgu cv探测图片特征点 SIFTDetector sift = new SIFTDetector(); var f1 = sift.DetectFeatures(img1, null); var f2 = sift.DetectFeatures(img2, null); 到此已经获得了两张相片的特征点f1,f2,接下来就是将相互匹配的特征点相连: for (int i = 0; i < f1.Length; i++) { double[] dist = new double[f2.Length]; int n = 0; int index = 0; for (int j = 0; j < f2.Length; j++) { ...

November 29, 2012

svn命令copy使用

名称 svn copy — 拷贝工作拷贝的一个文件或目录到版本库。 概要 svn copy SRC DST 描述 拷贝工作拷贝的一个文件或目录到版本库。_SRC和DST_既可以是工作拷贝(WC)路径也可以是URL: WC -> WC 拷贝并且预定一个添加的项目(包含历史)。 WC -> URL 将WC或URL的拷贝立即提交。 URL -> WC 检出URL到WC,并且加入到添加计划。 URL -> URL 完全的服务器端拷贝,通常用在分支和标签。 注意 你只可以在单个版本库中拷贝文件,Subversion还不支持跨版本库的拷贝。 别名 cp 变化 如果目标是URL则包括版本库。 如果目标是WC路径,则是工作拷贝。 是否访问版本库 如果目标是版本库,或者需要查看修订版本号,则会访问版本库。 选项 --message (-m) TEXT --file (-F) FILE --revision (-r) REV --quiet (-q) --username USER --password PASS --no-auth-cache --non-interactive --force-log --editor-cmd EDITOR --encoding ENC --config-dir DIR 例子 拷贝工作拷贝的一个项目(只是预定要拷贝—在提交之前不会影响版本库): $ svn copy foo.txt bar.txt A bar.txt $ svn status A + bar.txt 拷贝你的工作拷贝的一个项目到版本库的URL(直接的提交,所以需要提供一个提交信息): ...

November 20, 2012

svn命令delete使用

名称 svn delete — 从工作拷贝或版本库删除一个项目。 概要 svn delete PATH... svn delete URL... 描述 _PATH_指定的项目会在下次提交删除,文件(和没有提交的目录)会立即从版本库删除,这个命令不会删除任何未版本化或已经修改的项目;使用--force选项可以覆盖这种行为方式。 URL指定的项目会在直接提交中从版本库删除,多个URL的提交是原子操作。 别名 del, remove, rm 变化 如果操作对象是文件则是工作拷贝变化,对象是URL则会影响版本库。 是否访问版本库 对URL操作时访问 选项 --force --force-log --message (-m) TEXT --file (-F) FILE --quiet (-q) --targets FILENAME --username USER --password PASS --no-auth-cache --non-interactive --editor-cmd EDITOR --encoding ENC --config-dir DIR 例子 使用svn从工作拷贝删除文件只是预定要删除,当你提交,文件才会从版本库删除。 $ svn delete myfile D myfile $ svn commit -m "Deleted file 'myfile'." Deleting myfile Transmitting file data . Committed revision 14. 然而直接删除一个URL,你需要提供一个日志信息: ...

November 20, 2012

svn命令diff使用

名称 svn diff — 比较两条路径的区别。 概要 diff [-r N[:M]] [TARGET[@REV]...] diff [-r N[:M]] --old OLD-TGT[@OLDREV] [--new NEW-TGT[@NEWREV]] [PATH...] diff OLD-URL[@OLDREV] NEW-URL[@NEWREV] 描述 显示两条路径的区别,svn diff有三种使用方式: **svn diff [-r N[:M]] [–old OLD-TGT] [–new NEW-TGT] [PATH…]**会显示_OLD-TGT和NEW-TGT的区别。如果给定路径PATH,它会被看作OLD-TGT和NEW-TGT的相对路径,输出也会限制在这些路径的区别上。OLD-TGT和NEW-TGT可以是工作拷贝路径或者是URL[@REV]。OLD-TGT缺省是当前工作目录,而NEW-TGT缺省是OLD-TGT。N缺省是BASE,M缺省时当前目录的版本,但如果NEW-TGT是一个URL,则默认是HEAD。svn diff -r N设置OLD-TGT的修订版本为N,svn diff -r N:M设置NEW-TGT的修订版本是M_。 svn diff [-r N[:M]] URL1[@N] URL2[@M]是svn diff [-r N[:M]] –old=URL1 –new=URL2的缩写。 _TARGET_是一个URL,然后可以使用前面提到的--revision或“@”符号来指定N和M。 如果_TARGET_是工作拷贝路径,则--revision选项的含义是: --revision N:M 服务器比较 TARGET@N和TARGET@M。 --revision N 客户端比较_TARGET@N_和工作拷贝。 (无--revision) 客户端比较base和 TARGET的TARGET。 如果使用其他语法,服务器会比较_URL1和URL2各自的N和M。如果省掉N或M_,会假定为HEAD。 缺省情况下,svn diff忽略文件的祖先,只会比较两个文件的内容。如果你使用--notice-ancestry,比较修订版本(也就是,当你运行svn diff比较两个内容相同,但祖先历史不同的对象会看到所有的内容被删除又再次添加)时就会考虑路径的祖先。 别名 di 变化 无 是否访问版本库 获得工作拷贝非BASE修订版本的区别时会 ...

November 20, 2012

svn命令add使用

名称 svn add — 添加文件、目录或符号链。 概要 svn add PATH... 描述 添加文件、目录或符号链到你的工作拷贝并且预定添加到版本库。它们会在下次提交上传并添加到版本库,如果你在提交之前改变了主意,你可以使用svn revert取消预定。 别名 无 变化 工作拷贝 是否访问版本库 否 选项 --targets FILENAME --non-recursive (-N) --quiet (-q) --config-dir DIR --auto-props --no-auto-props --force 例子 添加一个文件到工作拷贝: $ svn add foo.c A foo.c 当添加一个目录,svn add缺省的行为方式是递归的: $ svn add testdir A testdir A testdir/a A testdir/b A testdir/c A testdir/d 你可以只添加一个目录而不包括其内容: $ svn add --non-recursive otherdir A otherdir 通常情况下,命令svn add *会忽略所有已经在版本控制之下的目录,有时候,你会希望添加所有工作拷贝的未版本化文件,包括那些隐藏在深处的文件,可以使用svn add的--force递归到版本化的目录下: $ svn add * --force A foo.c A somedir/bar.c A otherdir/docs/baz.doc [...]

November 16, 2012

svn命令blame使用

名称 svn blame — 显示特定文件和URL内嵌的作者和修订版本信息。 概要 svn blame TARGET... 描述 显示特定文件和URL内嵌的作者和修订版本信息。每一行文本在开头都放了最后修改的作者(用户名)和修订版本号。 别名 praise、annotate、ann 变化 无 是否访问版本库 是 选项 --revision (-r) REV --username USER --password PASS --no-auth-cache --non-interactive --config-dir DIR --verbose 例子 如果你希望在测试版本库看到blame标记的readme.txt源代码: $ svn blame http://svn.red-bean.com/repos/test/readme.txt 3 sally This is a README file. 5 harry You should read this.

November 16, 2012

svn命令checkout使用

名称 svn checkout — 从版本库取出一个工作拷贝。 概要 svn checkout URL[@REV]... [PATH] 描述 从版本库取出一个工作拷贝,如果省略_PATH_,URL的基名称会作为目标,如果给定多个URL,每一个都会检出到PATH的子目录,使用URL基名称的子目录名称。 别名 co 变化 创建一个工作拷贝。 是否访问版本库 是 选项 --revision (-r) REV --quiet (-q) --non-recursive (-N) --username USER --password PASS --no-auth-cache --non-interactive --config-dir DIR 例子 取出一个工作拷贝到mine: $ svn checkout file:///tmp/repos/test mine A mine/a A mine/b Checked out revision 2. $ ls mine 检出两个目录到两个单独的工作拷贝: $ svn checkout file:///tmp/repos/test file:///tmp/repos/quiz A test/a A test/b Checked out revision 2. A quiz/l A quiz/m Checked out revision 2. $ ls quiz test 检出两个目录到两个单独的工作拷贝,但是将两个目录都放到working-copies: ...

November 16, 2012