首页 文章 精选 留言 我的

精选列表

搜索[混元翻译],共10000篇文章
优秀的个人博客,低调大师

[翻译]Java 核心技术(第7版)(2)

Chapter 7. 图形编程 至此,你还只了解到如何编写从键盘接受输入,进行处理并在控制台显示结果。这并不是现在大多数用户想要的。现代的程序和网页并不是这样运行的。本章将开始介绍编写使用图形用户接口(GUI)的java程序。尤其值得一提的是,你将学会如何编写在屏幕上改变窗体大小和定位窗体,在一个窗体上用各种字体来显示文本,显示图象等等。这将为你后续章节编写有趣的程序提供一些有用的技术。 接下来两章将展示如何处理像按键和鼠标点击这样的事件,如何往你的应用程序中添加例如菜单,按钮这样的接口元素。当你完成这三章后,你将了解编写stand-alone的图形应用程序的本质。 第10章将展示如何编写使用这些特性并嵌入到web页面的applet。要了解更复杂的图形编程技巧,请参阅第2卷。 7.1 Swing简介 当java1.0发布时,它包含了一个为基本的GUI编程提供服务的sun称之为抽象窗口工具集(AWT)的类库。基本的AWT库通过在各个目标平台(Windows,Solaris,Macintosh等等)代理用户接口元素的生成和行为到本地GUI工具集的方式来处理用户接口元素。例如,如果你在java窗口中使用了原始的AWT来 放置一个TextBox,一个潜在的同等的text box将实际处理文本输入。在理论上,目标程序将可以以目标平台的外观在任何平台上运行――强调了Sub的“书写一次,到处运行” 对于简单的应用程序这种”同等“方法运转的很好,但很快就发现要写一个依靠本地用户接口元素的高质量的可移植的图形库是极困难的。象菜单,滚动条,文本域这样的用户接口元素在不同的平台上会有微妙的差异。很难通过这种方法来给用户一种一致的,可预测的用户体验。更糟糕的是,有些图形环境(例如X11/Motif)不象Windows或Macintosh那样有那么丰富的用户接口组件。这反过来进一步限制可移植库通过基于对等 “最小公共特性”方法。最后,用AWT构建的GUI应用不如本地的Windows或Macintosh应用那么好看,也没有那些平台用户预想的那样的功能。更令人沮丧的是,AWT用户接口库在不同的平台上有各种不同的bugs。开发者抱怨他们不得不在各个平台上测试应用程序,从而变成了”Write once,debug everywhere“ 1996年,Netscape创建了一个使用完全不同方法的GUI库――IFC(Internet Foundation Classer)。象按钮,菜单等用户接口元素是被画到空白窗体上去的。唯一需要的同等功能是创建窗体和在窗体上画图。因此,不管程序在哪个平台上运行,Netscape的IFC窗口的外观和行为都一样。Sun和Netscape一起完善了这个方法,创建了一个用户接口库Swing。Swing在java1.1中作为一个附加并在JDK1.2中成为标准库的一个部分。 因此,正向Duke Ellington说的,“要是没有用Swing,它更本不能算是个东西。”Swing现在是非基于对等的GUI工具集。Swing是java基础类(JFC)的一部分。JFC是一个巨大的类库并且包含了远远多余Swing的东西。JFC特性不仅仅包括Swing组件,还包括一个可访问API,一个2DAPI,一个拖放API. 注意: Swing 并不是AWT的替代物――它是建立在AWT架构上的。Swing只是提供给你更多的有用的用户接口组件。当你编写一个Swing程序时,你可以利用AWT的基础知识,甚至来处理。从今往后,当我们意为非基于对等的用户接口类时使用“Swing”,而意为像事件处理这样的窗口工具集的潜在机制我们说”AWT” 当然,基于Swing的用户接口元素在用户的屏幕上显示出来要比使用AWT的基于对等的组件要稍微慢一点。以我们在任一台正常的机器上的经验来说,速度差异并不是个问题。另一方面,选择Swing的理由如下: 1)Swing拥有一组便利的用户接口元素 2)Swing基本不依赖于底层平台。因此它有更少的平台相关的错误 3)Swing提供了跨平台的一致的用户体验 所有这些都意味着Swing有实现Sun的“书写一次,到处运行“口号的能力。 当然,第3条有潜在的缺点:如果用户接口元素在所有平台上看来都一样,那么他们将同本地控件看起来不同,从而使得用户不熟悉它们。 Swing以一种优雅的的方式解决了这个问题。程序员在编写Swing程序时可以赋予程序一个特定的外观模式。 注意:JDK5.0包括一种叫做Synth的新的外观模式。通过Synth,你可以通过提供图象文件和XML描述符而不需要任何编程来定义一种新的外观。 Sun还开发了一种叫做”Metal”(后来市场宣传又取名为”java外观”)的平台独立的外观,然而,大部分程序员还上继续称呼它为”Metal”,我们在书中也这样。 一些人批评Metal庸俗,这在5。0发布版中改进了。现在Metal外观支持多种主题―――颜色和字体的些许变化。默认的主题叫“Ocean”,在本书中,我们在所有的图形程序中使用Swing,Metal外观以及Ocean主题。 注意:现在大部分用户接口编程都使用Swing,只有一个值得注意的例外。Eclipse集成开发环境使用一个叫做类似于AWT的图形工具集SWT,也是在各种平台上映射到本地组件。 最后,如果你以前使用过VB或C#开发过Windows应用,你可能熟悉他们提供图形布局工具和资源编辑器的使用简单性。这些工具帮助你设计应用程序的可视化外观,然后帮你产生很多GUI代码。尽管对于java编程GUI构建器也有,但这些产品并不如Windows提供的工具成熟。然而,要完全理解图形用户接口编程(或者更进一步,我们感觉,要有效使用这些工具),你需要了解如何手工构建一个用户接口。自然地,这通常需要编写许多代码。 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/08/13/475576.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

[翻译]Java 核心技术(第7版)(1)

关于本书 第7章,我们开始专注于应用编程。我们将展示如何做窗口,如何在窗口上画图,如何画几何图形,如何用字体来格式化文本,如何显示图象。 第8章详叙AWT(抽象窗口工具)的事件模型。你将看到如何编写响应象鼠标电击或按键这样的事件的处理代码。同时你还将了解到如何处理像按钮和面板这样的基本GUI元素。 第9章详叙Swing这个GUI 工具。Swing使你可以创建跨平台的图形用户接口。你将了解关于各种按钮,文本组件,边框,滑动条,菜单以及对话框的知识。然而,一些更高级的组件将在第2卷里讨论。 当你读完第9章,你就了解了所有用来写Applet(可以在嵌入web页面的小程序)的机制了,因此,applet就是第10章的主题。我们将展示一些有用和有趣的applet,但更重要的是,我们会用一种程序发布的方法来看待applet。我们会描述如何打包应用程序到JAR文件中,如何通过Java Web Start机制来在Internet上发布应用程序。最后,我们将解释java程序员如何存取他们发布过的配置信息。 第11章讨论异常处理。这是java用来处理“好的程序也会发生坏的事情”这样一个事实的健壮性机制。例如,在一个文件下载的过程中,网络连接可能会不存在,一个磁盘可能没有空间了等等。异常处理机制提供了分离正常处理代码和错误处理的一种有效的方法。当然,即使对你程序进行了各种异常请情况的处理,它仍然可能死掉。在本章的第2部分,我们将提供许多有用的除错技巧。最后,我们将通过各种工具来理解例子:JDB debugger,一个集成开发环境的debugger,一个profiler,一个代码覆盖测试工具积极AWT robot。 第12章的主题是输入/输出处理。在java中,所有的I/O都通过流来进行处理。流使你以一种统一的方式来与任何数据(象文件,网络连接,或者内存块)交流。我们将详叙使得处理Unicode变的简单的读写类。我们将展示你使用对象序列化机制(这使得保存和加载对象变得简单和方便)下的内幕。最后,我们将介绍新增到JDK1。4的一些库:支持更高级和有效的文件操作的新的I/O类,以及正则表达式类库。 我们将通过减少JDK5。0的一个高级特性―――泛型编程来结束本书。泛型编程将使你的程序更具可读性并且更安全。我们将展示如何使用强类型的集合并且去除难看和不安全的转换。 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/08/13/475572.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Openstack安装部署指南翻译系列 之 硬件需求

1.1.1.1.控制节点 控制器节点运行身份服务,镜像服务,计算的管理部分,网络的管理部分,各种网络代理和仪表板。它还包括支持服务,如SQL数据库,消息队列和NTP。 可选地,控制节点运行块存储,对象存储,编排和计量服务的部分。 控制器节点至少需要两个网络接口。 1.1.1.2.计算节点 计算节点运行虚拟机实例的Compute的管理程序部分。默认情况下,Compute使用KVM虚拟机管理程序。计算节点还运行网络服务代理,将实例连接到虚拟网络,并通过安全组向实例提供防火墙服务。 可以部署多个计算节点。每个节点至少需要两个网络接口。 1.1.1.3.块存储节点 可选的Block Storage节点包含块存储和共享文件系统为实例提供服务的磁盘。 为了简单起见,计算节点和此节点之间的服务流量使用管理网络。生产环境应实施单独的存储网络,以提高性能和安全性。我们的生产环境是通过划分VLAN使用单独的存储网络。 可以部署多个块存储节点,我们该项目使用1个块存储节点。每个节点至少需要一个网络接口。 1.1.1.4. 共享存储 可选的共享存储节点包含共享存储服务,用于提供共享存储。 我们的生产环境使用单独的存储网络,以提高性能和安全性。 此服务需要两个节点。每个节点至少需要一个网络接口。 本文转自yuweibing51CTO博客,原文链接:http://blog.51cto.com/yuweibing/1981166,如需转载请自行联系原作者

优秀的个人博客,低调大师

《WCF技术内幕》翻译2:《WCF技术内幕》绪论

绪论 总述 服务是现代软件架构的一个主要部分,WCF是构建基于Microsoft Windows系统的服务程序平台。WCF编写的服务可以与其它供应商的服务交互(例如, IBM, BEA, and Novell),WCF为行业标准的演化提供了足够的空间。对于传输,WCF支持TCP/IP、HTTP、 Microsoft消息队列 (MSMQ)、命名管道。WCF同样支持一系列WS-*规范(读作WS-星)协议,比如WS-Addressing, WS-ReliableMessaging (WS-RM), WS-AtomicTransaction (WS-AT), WS-Security, WS-SecureConversation, WS-Trust, 和WS-Federation。使用WCF的应用可以收发SOAP消息和朴素的旧XML消息。将来,微软会扩展WCF支持新的传输、协议、和消息结构。微软把WCF当做服务的IO系统。尽管将来无法确定,但是可以肯定地说 在可预见的将来微软不会使用其它技术取代WCF。许多产品象微软BizTalk Server和 Windows Live Server都兼容了WCF就是很好的证明。 这本书的目标就是是读者具备使用WCF设计、开发、和维护服务必要的知识。在我看来,这些任务超出了单独的WCF编程模型。成功需要理解服务背后的原则、WCF服务编程模型、和WCF底层架构。 这种组织并不是新的理念;它来自于过去的经验。当面向对象变的流行以后,从面向过程到面向对象转变的开发者和架构师需要了解远不止编程语言的语法。如果面向过程的开发者在不了解面向对象情况下开始使用现代的编程语言,他们只能使用新语言来创建面向过程的应用。虽然这些代码可以编译和运行,但是他们不可能使用面向对象语言的许多特性。这个就是我关于不能体会面向服务的优势而去学习WCF开发者的看法。 有些人认为这种方法是在浪费时间。换句换说,WCF团队已经从正常的编程模型里成功抽象出消息底层架构,这样就没有必要去学习底层的面向服务的模式,或者WCF如何实现这些模式。我完全不认同这个观点。这种抽象可以使得WCF团队更快地开发。但是它绝对没有完全解放开发者和架构师转到面向服务和理解WCF内部如何工作的重任。成功的接受象C++或者JAVA面向对象语言需要开发者从面向过程到面向对象转变他们的思维,相同的是,WCF的学习者也需要从面向组件到面向服务去提升自己的认知。如果我们转变失败,我们将会遇到许多缺少面向服务特征的风险。简单编写WCF程序和编译、运行只是万里长征的一小步。从长远来看理解WCF技术内幕和理解新的编程模式同等重要。 虽然我们不理解面向服务架构的特征,但是我们应该知道WCF的底层架构。换句话说,我们应该了解我们的平台。通用语言运行时(CLR)对于这种情况提供了支持性的事实。CLR团队干的很漂亮,他们从开发者那里抽象出垃圾收集器和JIT编译器。结果,在不懂或者很少知道这些子系统如何工作的情况下,我们就可以写出Microsoft .NET Framework应用程序。比如,迁移到C#的C++开发者,在不知道垃圾收集器的情况下,会本能地为每个声明的类型增加一个finalizer 。不知不觉地,这个开发者就会增加分配的时间和这些对象的声明周期。对于大多数C++开发者来说,简单说一句“不要这样做”是不够的。他们想知道为什么。技术上来说,为一个类型增加一个finalizer不是个bug,单身它确实是许多书籍和培训课程耗费许多时间要强调的东西。 同理,知道WCF底层架构可以避免在WCF上浪费不必要的精力,并且开发者可以调整他们的程序功能去满足业务需求。例如,在构造函数里改变绑定的可靠消息参数可以动态地调节各个终结点之间的消息编排。WCF团队已经抽象去这些功能并部分通过绑定暴露出来。这种消息编排有时是必要的,并且只有理解消息编排的开发者才能正确决定何时使用这个特性。进一步讲,想调试一个使用可靠消息的程序就必须掌握可靠消息的配置。 我希望此书可以在面向服务的关键概念、WCF服务编程模型、和WCF底层架构之间取得平衡。本书将给你一个了解WCF技术内幕的严谨视野,你可以设计、构建、调试、维护可扩展和可靠的分布式应用。。 1.面向的读者: 这本书适合那些想学习如何设计、编写、或者测试WCF分布式应用的架构师、开发人员、和测试人员。本书的前面一些章节对想学习更多或者评估WCF的业务决策者也有帮助。这本书不适合初级开发者或刚学习.NET Framework编程的开发者。倘若如此,我推荐你在阅读本书之前先阅读Jeffrey Richter的CLR via C# (Microsoft Press, 2006)或者Jeff Prosise的Microsoft .NET 编程(Microsoft Press, 2002)。如果你是熟悉一些分布式应用开发的阅读者,将会有所帮助。但是不是必须的。 2.本书结构: 本书分为3部分。第一部分,“介绍WCF”,描述了面向服务应用的原则,介绍了主要的WCF子系统,并且描述了这些子系统之间如何交互。第一部分包括一个关于面向服务的章节,另外一个是关于消息的概念,最后一个是关于WCF架构。从高层次来说,WCF由两个基本的层组成:通道层和服务模型层。第二部分,WCF通道层和第三部分WCF服务模型层分别描述了通道层和服务模型层。第二部分开始一章描述了消息类型,然后是通道和通道管理器。第三部分章节涵盖绑定、契约、分发器和客户端。第二和第三部分的每个章节剖析了各自相关主题的重要类型。并且提供了例子代码去阐述这些知识。总体来说,本书带领读者由基本概念到WCF核心机制,然后是WCF主要的编程接口(API)。换句话说,这本书作了对WCF彻底的剖析。 3.例子代码和系统需求: 所有本书讨论的例子都可以在本书附录的网址里下载: http://www.microsoft.com/mspress/companion/9780735623064 微软出版社在下列地址提供了书籍的后续支持服务: http://www.microsoft.com/learning/support/books/ 本书展示的代码是.NET Framework 3.0所写。安装.NET Framework 3.0及其需求在此网址: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=10CC340B-F857-4A14-83F5-25634C3BF043 4.问题和评论: 如果你有任何关于此书的不能在前面网站解决的评论,问题,或想法,请通过EMail发送到微软出版社: mspinput@microsoft.com或者通过信件直接与微软出版社《WCF技术内幕》的编辑:Redmond, WA 98052-6399。请注明哪个软件产品在之前的网站中未能提供支持服务。 本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/318648,如需转载请自行联系原作者

优秀的个人博客,低调大师

Linux 小知识翻译 - 「i386」是什么?

i386是指 *CPU* 的种类,也可以指 *CPU* 的架构(architecture)。 现在的 CPU 一般都用 「Core 2 Duo」或者「Athlon」,「Xeon」,「Opteron」之类的比较酷的名称来称呼。 Linux诞生的时候,CPU作为一个重要的组件,一般用型号来称呼它。 i386的i代表 Intel。 Intel公司最先生产的,从4004开始的CPU系列中,386(80386)是第一个32位的CPU。 Linux刚开始就是作为386架构上兼容POSIX的内核来开发的。之后CPU的性能虽然越高,但是一直都兼容「386」架构的, 所以Linux上运行的各种程序,只要在「386」上编译之后,就可以在大部分的PC上运行了。 但是,「386」诞生于1985年,现在来看已经很古老了。 现在很多Linux发行版都是是针对「Pentium」之后的CPU的。 名称中包含「i586」的软件包就是针对「Pentium」架构的CPU的。 Linux中用 uname 命令看到的「i686」则是指「Pentium Pro」之后的架构。 可能我们会认为在「i586」或者「i686」架构CPU的机器上,使用针对「i586」或者「i686」编译的二进制应用程序会比兼容「386」架构的二进制应用程序更好。 但在实际使用中,在「i586」或者「i686」架构CPU的机器上,使用「i586」或者「i686」下编译的二进制应用程序并没有发现大幅度的性能提升。 因此,倒不如为了通用性,只在安装Linux时,选择和CPU架构相同的内核,而在Linux内核上运行的各种程序就可以直接使用在「i386」架构下编译好的软件包就行, 现在很多Linux发行版中的软件包就是这么做的,能够正常运行是最重要的。 本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/p/3751387.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

#翻译# 把 ElasticSearch 当成是 NoSQL 数据库

Elasticsearch 可以被当成一个 "NoSQL"-数据库来使用么? NoSQL 意味着在不同的环境下存在不同的东西, 而erestingly 它并不是真的跟 SQL 有啥关系. 我们开始只会觉得 "可能"而已, 所以细细研究了 Elasticsearch 的各种属性,包括它已经为了成就最具灵活性,可伸缩性和性能优异的分析查询引擎的那些属性. 文章转载自 开源中国社区 [http://www.oschina.net]

优秀的个人博客,低调大师

改善OpenStack上DHCP的性能 【已翻译100%】

你有没有碰到过OpenStack中,VM失去IP地址的问题?如果有的话,你知道那可能是什么问题 ——特别是如果你拥有大量的节点和VM。你的客户会因为没有明显原因却断了与VM的连接而感到 挫败。甚至云的支持团队会为log文件里没有提示却出现问题感到挫败。 听起来很熟悉? 在这篇blog里,我将会分享我的一些关于Openstack网络的经验,特别是承担为VM分配IP地址的责任的DHCP子组件。 为什么我们会把问题归咎于DHCP组件?因为这些特定的问通常都是由这个小但明显微不足道的OpenStack组件导致的。 **DHCP agent和DNSmasq ** 在OpenStack中,neutron-dhcp-agent为实例提供ip地址。理论上,neutron-dhcp-agent可以支持多种 后端,但现在它只支持dnsmasq。当启动一个实例时,分配和配置(ip)的程序包含一个在dnsmasq config中储存ip地址的进程,接着启动或重载dnsmasq。通常,OpenStack在每个网络中只有一个neutron-dhcp-agent负责spawn一个dnsmasq,所以一个庞大的网络(包含所有子网)中只会有一个dnsmasq提供服务。理论上,并且根据实用的实验室测试,dnsmasq应该能每秒处理1000个DHCP请求,但这里有些事实要说明下: 1.租赁时间。默认情况下是120s,你大概会知道,在租赁时间内,dhcp客户端会尝试中途延长租赁时间。这意味着每个VM会一分钟更新一次他们的ip地址。 2.去启动一个包含65535个静态租赁的DNSmasq实例几乎需要4分钟(3分43秒)。一般这会发生在neutron为新的VM分配新的ip地址,接着强行reload DNSmasq时。在此时,将没有DHCP服务会为相应的私有Neutron网络提供服务。 3.如果你没有在dnsmasq的配置中使用no-ping选项——这是应归于对安全担忧的OpenStack的默认设置——你会因非常慢的服务速度感到痛苦,因为在dnsmasq中,一个分开的pinger进程会被用于检查所提供的ip地址是否已经在使用中。包含no-ping选项,dnsmasq将能在10分钟内为160个请求提供服务并且不会失去它们,尽管这依赖于核心(core)速度和CPU速度。 4.Ubuntu和CentOS有mac地址表(neighbour table)被限制到/128/512/1024(net.ipv4.neigh.default.gc_thresh1/2/3)个记录。因为如此,不经常使用的 IP 记录将会异常快速老化(IP records that are not frequently used will age abnormally fast)这会影响网络性能并拖慢系统把流量发送至dhcp agent所在节点上的正确的mac地址的能力。 5.企图通过显著的增加ip的租赁时间去解决这些性能问题,这会导致neutron释放ip地址这方面的大问题(如果你的云负载均衡地改变)。默认情况下,neutron会为一个VM分配一个ip地址达24小时(neutron will allocate an IP address to a VM for 24 hours),独立于实际的租赁时间。当然,默认情况下,neutron不会为已经终止了的实例提供ip地址直至24小时。 你可以采取的措施 幸运的是,你可以做点事解决问题,如果你使用openstack并拥有一个地址空间大于255个地址(/24)的私有网络, 接着你应该考虑调整dnsmasq和network节点自身的默认参数。 1.增加ip的租赁时间以减少每秒来自VM的尝试更新ip地址的请求数量。根据一般的场景计算新的租赁时间, 记住虚拟机生命周期的平均时间。由于一个Bug,设置太大的租赁时间值会强迫OpenStack在数据库中保留这个ip地址为“used”的状态。即使VM已经被删除,因为neutron的租赁时间在数据库中,neutron将不会释放这个ip地址。 2.增加MAC地址表的尺寸使其能服务至少一千个主机。要做到这样,典型地,你可以设置dhcp-agent所在主机 的sysctl变量(通常在/etc/sysctl.conf)。视情况,你可以在所有与网络有关的节点执行以下操作,这些变量 如此设置: net.ipv4.neigh.default.gc_thresh1 = 1024 net.ipv4.neigh.default.gc_thresh2 = 4096 net.ipv4.neigh.default.gc_thresh3 = 8192 3.为DNSmasq的默认参数加上no-ping选项。这个改变能够使其每秒处理多10-20个请求,因为在被实际分配之前,dnsmasq无需再尝试ping那些ip。如果你使用OpenStack作为你的基础设施的一部分,记住,你必须谨慎地考虑这个选项。比如,如果你正使用提供者网络(provider networks)并且你的VM与其他物理服务器、设备、等等是单一L2域的组成部分,IP冲突是可能发生的的,可以造成严重破坏。 Neutron社区必须思考的改变 不幸地,在neutron中没有任何办法能为用户解决24小时ip分配的问题(the problem of 24 hour IP allocation),这个问题应该从neutron自身的改变去解决。一个简单的解决方法是在neutron或dhcp-agent中增加一个可配置的参数以修改租赁时间,并把它用作neutron数据库中的分配周期。这个方法表面看上去很完美但是仔细检查一下,你会意识到这会大大增加neutron-api/neutron-db的负载。所以这不是一个正确或不正确的方法去解决问题。 取而代之的是,neutron应该在实例被终止时简单地从数据库中移除ip地址。这会解决所有问题并在云上实现 动态负载和ip地址的完美重用。【实际上,这恰好是Icehouse版本的情况,尽管目前问题有所减轻】 结论 正如我说的,我的所述只是覆盖了一个很小的OpenStack网络的子组件——DHCP服务。正如你所看到的, 如果配置不正确,特别是当你使用了DNSmasq的默认选项将会导致许多痛苦。上面我所推荐的希望能帮助你 了解如何选择具体的DNSmasq选项和如何根据情况调整他们

优秀的个人博客,低调大师

使用 TLS 认证远程访问 Docker 【已翻译100%】

通常情况下Docker只在 UNIX socket下生效. 一般只有本地调用生效. 如果要远程调用可以有以下三种方式: 使用nginx转发通讯到Docker 用SSH和socat处理链路 创建Docker daemon监听开放的端口 第一种实现起来比较繁琐. 第二种需要在客户端服务端安装 socat. 由于其连接未加密,任何人都可以拦截Docker的通讯信息. 直到有了 Docker implemented TLS auth in 0.10才完美的解决了这个问题. 有三种简单的方式来实现: I. 生成证书 需要生成三种证书类型: CA 证书用来生成客户端和服务端证书 远端Docker使用的客户端生疏 服务端使用的Docker daemon证书 我用Ruby写了生成这三种证书的代码.你只需要拷贝相关的代码 clone this repository 并运行下面的命令: $ gem install certificate_authority $ ruby certgen.rb example.com CA certificates are in ~/.docker/ca Client certificates are in ~/.docker Server certificates are in ~/.docker/example.com 证书都生成在~/.dockerpath下. II. 拷贝服务端证书到远端 脚本生成 Docker daemon需要的键值和证书~/.docker/example.com(example.com 是你的域名). 在服务端拷贝到~/.dockerdirectory下: rsync -ave ssh ~/.docker/example.com/ root@example.com:~/.docker/ III. 在远端配置Docker Docker daemon在0.10后支持--tlsverify 来提供加密的远端连接 假设你是用的是 Ubuntu 12.04 LTS并已经安装了Docker .其它环境下可能有些不同. 只需要在/etc/default/docker加入下面配置: DOCKER_OPTS="--tlsverify -H=unix:///var/run/docker.sock -H=0.0.0.0:4243 --tlscacert=/root/.docker/ca.pem --tlscert=/root/.docker/cert.pem --tlskey=/root/.docker/key.pem" 之后重启 Docker daemon: service docker restart 如果有错Docker daemon就会启动不了. 可以通过 under/var/log/upstart/docker.log来调试. 就是这么简单! 现在通过--tlsverify就能连接到远端Docker实例了: docker --tlsverify -H tcp://example.com:4243 images 它会使用 ~/.docker下的证书来验证连接. 如果使用的是其他的类型, 可以通过--tls* 来查询docker --help的帮助文档 documentation. 官方的TLS创建网址在这里 can be found on Docker site.

优秀的个人博客,低调大师

在终端中运行 Swift 程序 【已翻译100%】

在读完苹果开发者文档( Apple Developer Docs)后,我发现: "Xcode的调试器包括一个Swift语言的交互版本,叫做REPL(Read-Eval-Print-Loop)...可以通过Xcode的控制台或终端来访问" 不幸的是,它并没有告诉你怎样从终端访问。好在这也不是什么难事。 输入如下命令即可(无论你用哪个beta,换掉app的名字) alias swift="/Applications/Xcode6-Beta2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift" 在终端窗口,你看到如下信息。现在输入swift,你会看到欢迎页面。 注意: 当出现一个新的beta时,你需更新你的别名,输入相同的命令,不同的app名.例如 Xcode6-Beta3.app. 现在可以看到你的Swift代码: 最后,如果你输入 :help,那么LLDB的调试命令就唾手可得。 为什么你不加载Swift Playground? 这是一个好问题。不用启动Xcode 6 Beta并打开一个Swift Playground,就可以无语法错误地编程,这种能力我个人十分欣赏。同样,我肯定要遵守保密协议(NDA),我不会贴出Xcode 6的截图直到它最终发行。

优秀的个人博客,低调大师

使用 Docker 作为 Python 开发环境 【已翻译100%】

(或者让我们绕过virtualenv) 本文中,我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法。虽然我本人专注于Python的Flask微框架,但本文目的是演示如何通过Docker更好地开发和共享应用程序,(由任何语言和框架开发的应用程序)。Docker通过封装依赖项,大大减少了开发环境和正式产品的差距。 大多数Python开发人员在开发中使用virtualenv。它提供了一种易用的机制让应用程序使用自己专用的依赖项,这些依赖项可能与在其它应用程序或操作系统存在冲突(尤其是不同的Pyhton版本,还有不同的库版本等等)。个人而言,我对virtualenv一直没有太大兴趣,原因如下: 我经常忘记启用它,或者在切换工程时忘记切换它,这会遇到含糊的出错信息,另人倍感困惑。 它无法提供“纯粹的”隔离,只能是Python级别的隔离(系统库和非python的依赖项仍然会出问题)。 我通常不想在正式产品中运行它,这就意味着在开发环境和正式产品的不一致。 它让人感觉有点“黑客”作法:它是依靠修改脚本和设置新路径实现的。 ( 查看 pythonrants的这篇文章 了解更多为什么你可能不想用virtualenv ) 那么,怎么做Docker才能变得更好呢?Docker本质上提供了非常轻量化的VMs(在说法上可以称为“容器”),我们可以使用其创建一个高标准隔离并能大大减少失配的开发和产品环境。(如果你不熟悉Docker,却还想学习更多,你可以查看我在爱丁堡技术座谈会上介绍Docker的谈话)。 当我们建立一个小型的可视化Web APP,我自己和Mark Coleman使用这种方法(文档在这)。这(里面)划出了一个基本镜像安装Python 2.7,还有一些Flask管理以及PostgreSQL的内容。我会依据这个镜像去开发一个hello world的Web应用。我假设你是在Linux上开发,并且你已经有git,还安装了Docker,MacOS的指令应该非常类似。通过克隆和建立基本镜像开始: $ git clone https://github.com/mrmrcoleman/python_webapp $ docker build -t python_webapp . 现在,我们需要为容器中添加一些代码并详细写明。我们打算新建一个仅仅指向Docker镜像的项目来完成这项工作,而不是直接修改之前的项目。 创建一个具有下列结构的新项目: ├── Dockerfile ├── example_app │ ├── app │ │ ├── __init__.py │ │ └── views.py │ └── __init__.py ├── example_app.wsgi 或者克隆该地址的示例项目: https://github.com/amouat/example_app.git 在example_app/app/_init_.py中写入: from flask import Flask app = Flask(__name__) from app import views 使另一个_init_.py为空。在views.py中写入: from app import app @app.route('/') @app.route('/index') def index(): return "Hello, World!" 以上就是我们的一个hello world应用的最小flask版本。我在 这个教程中也使用过类似的代码,所以如果你刚刚接触Flask或者Python,你可以根据上述提到的教程,使用Docker而不是virtualenv继续学习。 为了使之运行在Docker容器内部,我们还需要做一些操作。在我们的实例Apache服务器中,example_app.wsgi文件包含了连接Python代码和web服务器的指令。该文件应当包含下列内容: import site site.addsitedir('/opt/example_app/') from app import app as application 最终,我们需要一个Dockerfile来构建容器并运行容器。在我们的实例中,它看起来是这样的: FROM python_webapp MAINTAINER amouat ADD example_app.wsgi /var/www/flaskapp/flaskapp.wsgi CMD service apache2 start && tail -F /var/log/apache2/error.log ADD那行为启动WSGI注入了一些代码。CMD那行在启动容器,启动apache web服务器时获取任何可能的错误信息,并将其发送至stdout。 如果你下列操作: $ docker build -t example_app . $ docker run -p 5000:5000 -v $(pwd)/example_app:/opt/example_app/ -i -t example_app 你应当会得到这样的回馈:通过浏览器打开地址localhost:5000,你会看到你的网站正在运行。如果你实在VM或者vagrant中运行,记得打开5000端口。 现在我们运行了web服务器,已经非常接近我们在产品中使用的东西了(我有意的使用Apache来做这点而不是Python默认的web服务器)。我们通过从主机向容器映射的方式向容器中注入代码;也可以在Dockerfile命令行中是用ADD来添加代码,但那样的话当我们队代码进行改动时,每次都需要重新构建容器。 然而,这仍然不是很好 ;开发中我们真的希望使用很大程度上帮助我们调试的Python web服务器。该高兴的是我们不用对Dockerfile进行任何修改。在example_app文件从创建一个run.py文件开始,按照一下内容: !flask/bin/python from app import app app.run(debug = True, host='0.0.0.0') 这将启动Python的带调试的web服务器并监听所有连接,我们也能从容器外访问。现在用下列命令重启容器: $ docker run -p 5000:5000 -v $(pwd)/example_app:/opt/example_app/ -i -t example_app python /opt/example_app/run.py 你能看到网页又运行了。这次我们显式地提供运行的命令("python /opt/example_app/ryn.py"),它覆盖了Dockerfile中的CMD行的设置。现在如果编辑在主机上的源程序,就能马上看到网页上的改变。 让我们花点时间看看我们的收获: 一个运行在隔离容器中的web应用,容器完全封装了应用的Python依赖项和系统依赖项。 能够使用现有编辑器或IDE开发代码并直接查看变化,就像在本地编辑一样。 比以前更接近正式产品的运行环境。 没有使用virtualenv。 如果你想知道如何以这种方式建立程序发布的途径,可以看看Mark Coleman写的关于前面提到的可视化Web应用的文章。 不幸的是,这一切还不完美。还有下列几个问题: 你可能仍会遇到需要使用virtualenv或其等价解决方案的情况,例如库的操作系统版本与你的程序所需版本间的冲突。 我们还没完全解决数据托管的问题,仍需做某些测试。 我假设的“产品”是一个Docker容器,但实际情况常常并非如此而且Docker托管本身也刚刚起步。 尽管如此,我仍然认为这向软件开发的更好未来迈了一大步,大大减轻了部署软件和管理依赖项的痛苦。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册