首页 文章 精选 留言 我的

精选列表

搜索[技能提示],共10006篇文章
优秀的个人博客,低调大师

设计模式(通往高手之路的必备技能)

‘从大处着眼,从小处着手’,以前对这句话一知半解,自从踏出校门走入社会,开始工作以来,有了越来越深的理解,偶有发现这句话用在程序开发中也有用,所以,近段时间开始尝试着分析jQuery源码,分析angularjs源码,学习设计模式。 设计模式的由来 看过GOF的总结的23种设计模式的人,都或多或少的有种似曾相识的感觉,事实确实如此,这些设计模式原来就有,是前人优秀的工作成果,只不过是GOF他们给这些原本就有的东西重新定义了一下,给予这些东西名称和原理,使之更容易被人理解和接受,这本身就体现了GOF的伟大,让好的东西更容易传播。 设计模式的定义 在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。 如何学习设计模式 设计模式也并不是什么洪水猛兽,高不可攀,一个有一定经验的软件开发者都会在不知不觉中使用它,这可能中间经历了很多的尝试,当他看过设计模式后,会发现原来已经有人对它进行过总结。 使用设计模式实现的代码,使用一般的方法都能实现,所以使用设计模式,会无形中增加代码的量,尤其是不正确的使用,更会带来毁灭性的灾难,所以,一般的开发人员唯恐避之不及。 理解‘可复用的面向对象软件基础’ 设计模式的实现都遵循一条原则‘找出程序中变化的地方,并将它封装起来’。在程序设计中总分为可变的地方和不可变的地方,可变的地方我们往往将他封装起来,不可变的地方也即是代码稳定和不可变的部分的,往往这部分代码是可复用的。这也是标题《可复用的面向对象软件基础》的由来。 好了,废话不多说,下面进入常见的设计模式学习。 如何分辨设计模式 有时侯我们经常会遇到这样的问题,许多设计模式的实现看起来几乎一模一样,比如:代理模式和装饰者模式,策略模式和状态模式。 你不仅会大声问,他们有什么区别呢? 其实,从代码结构上看并没什么区别,就像一把手枪,你拿它来杀人,它就是凶器,你拿它来救人它就是武器。跟你的用途有关系,其实最根本的是你的意图。所以,在学习设计模式的时候,不要在在意代码的结构形式,要多留意模式的使用场景,在这种场景下解决了什么问题,多进行对比(使用前,使用后有何差别)。 重新审视JavaScript设计模式 JavaScript从开始被人当成为一种玩具语言,到后来发展为一门流行的可靠的语言。人们从开发做一些简单的交互,到后来Google做的第一个邮件系统,再到后来Google推出的angular框架的出现,js的威力在被人们认识的同时,伴随着浏览器支持js做更多的东西,与此同时它也变得痈肿起来,框架间各种复杂的依赖甚至能让你崩溃。随着ES6, TypeScript, CoffeScript 等各种转编译语言的兴起,无疑给前端开发者带来了不小的学习压力。像React,vue,angular这些当下流行的框架,大家都知道一些,但是要说有深入研究,不见得有多少人。17年年底我发现各个公司的在招人时,对开发人员的要求越来越高,要知道这些框架的原理,要知道某些具体的功能如何实现,同时对于设计模式的考察也越来越突出。所以,基于开发语言的使用环境,以及工作面试需要,我们不得不认真对待JavaScript常见的设计模式。 从前由于使用的局限性,和做的应用相对简单,js不被重视,js就更谈不上设计模式的问题。虽然,现在JavaScript被开发人员越来越重视,但是JavaScript设计模式的讨论还不是那么活跃,有研究和见地的还是少数人,但是研究过源码的同学就会知道,在vue,angular种设计模式已经相当普遍。 作为一个励志成为前端小牛的我,现在也甚是心痒。 目录 ‘大处着眼,小处着手’——设计模式系列 注:这是我个人对设计模式的认识和理解,仅代表个人观点个看法,不足之处欢迎大家指正,随着认识的加深这篇文章(包括设计模式其他系列文章)会不断地进行更新。 javascript 设计模式 面向对象的JavaScript 构造器 设计模式 外观 设计模式 工厂 设计模式 观察者 设计模式 单例 设计模式 持续更新中... 参考资料 学习JavaScript设计模式 腾讯全端 AlloyTeam 设计模式系列文章 JavaScript设计模式与开发实践 其它设计模式相关文章请转‘大处着眼,小处着手’——设计模式系列

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

系统架构技能之设计模式-组合模式

一、上篇回顾 我们上篇主要讲述了结构型模式中的外观模式,外观模式作为结构型模式中的一个简单又实用的模式,外观模式通过封装细节来提供大粒度的调用, 直接的好处就是,封装细节,提供了应用写程序的可维护性和易用性。外观模式一般应用在系统架构的服务层中,当我们是多个不同类型的客户端应用程序 时,比如一个系统既可以在通过Web的形式访问,也可以通过客户端应用程序的形式时,可能通过外观模式来提供远程服务,让应用程序进行远程调用, 这样通过外观形式提供服务,那么不管是什么样的客户端都访问一致的外观服务,那么以后就算是我们的应用服务发生变化,那么我们不需要修改没一个客 户端应用的调用,只需要修改相应的外观应用即可。 我们主要是讲述了以下的几种情况,使用外观模式可能更适合: 1、我们在使用第三方类库或者API的时候,我们通过本地的API接口的封装,来完成对第三方API接口的粗粒度外观对象,通过这个外观对象可以 很容易的完成服务的调用。 2、我们在架构设计的过程中,一次的功能访问可能需要同时的调用很多个对象,那么如果我们在服务调用的时候,能够在应用程序调用中一次就 能完成所有要同时调用的对象那该多好啊,外观模式无疑是最好的原则,特别是在分布式应用中,通过远程调用服务,通过外观模式降低应用程序与服务的 交互次数,同时可以降低应用程序的复杂性。 二、摘要 本文将会讲述结构性模式中的另外一个常用的模式-组合模式,我们平时在面向对象的设计中,我想有一个原则经常被提及就是,我们在设计的时候, 对象组合>类的继承,本篇将会将结合简单的实例来说明这方面的优势,并且完成对组合模式的主题思想的掌握。我们这样来简单的理解组合模式,组合模 式就是把一些现有的对象或者元素,经过组合后组成新的对象,新的对象提供内部方法,可以让我们很方便的完成这些元素或者内部对象的访问和操作。我 们也可以把组合对象理解成一个容器,容器提供各种访问其内部对象或者元素的API,我们只需要使用这些方法就可以操作它了。那么对象组合相比继承的 优势有哪些呢?可能具体的优势,也不是一句二句就能表述清楚的,还是我们来看看图形的可视化的描述吧。 我们这里设计的是持久化服务写到一个基类中, 然后继承自该基类的子类都会拥有内置的持久化方法,可能后续我们又要添加其他的针对某个具体的对象类,有一些个性化的服务,我们通过扩展这个类, 进行继承,这样多重继承后,会有一个很大的问题。子类膨胀的问题,而且一般来说继承的重数达到5层左右的时候,性能上可能就会有一定的瓶颈,。也 不是好的设计的思路。这时候对象组合可能为我们提供了更好的解决方案。基于组合方式的话,可能我们可以这样来做,换个思路:就像我们的一个负责的 对象,可以通过简单的对象来组成的道理差不多,其实。 通过上图,我们知道了,组合对象可以 看作是一系列简单的对象组合成负责的对象的一个模式,复杂对象可以看作是简单对象的一个容器。这个复杂对象完成了简单对象的封装,通过这个容器完 成对象内部简单对象的访问。 三、本文大纲 a、上篇回顾。 b、摘要。 c、本文大纲。 d、组合模式的特点及使用场景。 e、组合模式的经典实现。 f、组合模式的其他方案。 g、原型模式使用总结。 h、系列进度。 i、下篇预告。 四、组合模式的特点及使用场景 组合模式是将一系列对象组合成树形结构用来表示整体和部分之间的关系,组合模式的主要目的是达到,访问组合对象和访问单个对象具有一致性。这里的组合对象比较特殊,本身他可以是由其他的对象组合而成,同时,这个组合对象又可以是组成更复杂对象的一个部分。我们来举个例子来说明吧,可能更直观。 这里我们可以理解为一个简单的查询组件可能有要满足 上述的几类查询条件的输入类型,将这个组件作为一个容器,那么同事,这个容器又可以作为另外一个容器的组件来运行,那么我们又可以在分页控件中, 将这个查询组件包含到其中。以为分页提供相应的查询元素的集成。 我们一般在如下场景中使用组合模式比较方便: 1、我们有的时候想用户使用一个复杂对象像使用简单对象一样的方式去访问,并且用户同意使用对象内部的所有的对象时,我们可以考虑使用该模 式。这个怎么理解呢?我们使用复杂对象像使用简单对象一样的方式去访问的话,那么我们可以使用组合对象,我们把这些简单的对象进行组合,用组合对 象进行包装,并且提供相应的操作组合对象内部的方法。结合上图中的例子,我们可以这样理解,我们把查询组件封装成一个用户控件,然后可以在其他的 页面中进行调用。这个时候,我们可能考虑如何分部页面,如何能够动态的维护界面上的控件,是否显示,控件里面显示的文本和值是什么?等等,这些都 是我们可以考虑的元素,那么我们如何来做呢?提供下面的几个方法。我还是给出图来说话吧: 包含上面的这些元素,那么我们可以通过一些相应的方法来进行访 问内部的元素。我们给出简单的示例代码: public QueryControl() { InitializeComponent(); this.InitControlList(); } public event EventHandler handler; private Dictionary<string,Control> _controlList = null; /// <summary> /// 初始化控件信息 /// </summary> private void InitControlList() { this._controlList = new Dictionary<string,Control>(); } /// <summary> /// 返回界面控件中所有的查询条件控件列表 /// </summary> /// <returns></returns> public Dictionary<string,Control> GetControls() { return this._controlList; } /// <summary> /// 添加查询控件到界面中 /// </summary> /// <param name="control"></param> /// <returns></returns> public bool AddControl(string key,Control control) { if(this._controlList.ContainsKey(key)) return false; this._controlList.Add(key,control); return true; } /// <summary> /// 移除指定键值的对象 /// </summary> /// <param name="key"></param> /// <returns></returns> public bool RemoveControl(string key) { if (this._controlList.ContainsKey(key)) return false; this._controlList.Remove(key); return true; } public virtual void OnQuery() { if (this.handler != null) handler(this, new EventArgs()); } public void Query(object sender, EventArgs e) { this.CreateSQL(); this.OnQuery(); } /// <summary> /// 根据选中的条件生成SQL语句 /// </summary> private void CreateSQL() { throw new NotImplementedException(); } 上面的代码很简单就是给出了基本的思路,并不是完整的功能。我们来看其他的可能会用到组合模式的情况 2、如果有的时候,我们希望用户不了解自己使用的对象有多复杂,并且组合对象可以的内部可以自由的变化和组合,但是不会影响到客户应用程序使用这 个组合对象,如果项目中需要新增一个组合对象的时候,客户调用的程序还是一样,不会因为这个组合对象发生变更而发生变化。组合模式在解决整体和部 分之间的问题应用很广泛,也可以降低系统的复杂度,因为我们可以把复杂的组件看作另一个组件的组成部分来处理。就像上面的查询组件,那么我们可以 把查询组件作为分页组件的一个部分来处理。我这里就不给出示例代码了通过上面的情况,我们可以大概的知道,组合模式的使用场景。下面我们就要结合 实例说明组合模式的用处了。 五、组合模式的经典实现 我们先来看看使用经典的组合模式来实现我们上面说的查询控件吧,看看和其他的方案有什么样的不同,不过大体的思路都是一致的,把其他的对象 进行组合成复杂的对象,然后提供操作内部对象的方法,具体的方式可以很多。我们这里还是以上面的查询组件和分页组件为例来说明具体的实现思路,当 然我这里只是给出核心代码,但不是完整的代码: 我们先给出控件内部的完整定义: public QueryPanel() { InitializeComponent(); this.InitControlList(); } public event EventHandler handler; private Dictionary<string,Control> _controlList = null; /// <summary> /// 初始化控件信息 /// </summary> private void InitControlList() { this._controlList = new Dictionary<string,Control>(); } /// <summary> /// 返回界面控件中所有的查询条件控件列表 /// </summary> /// <returns></returns> public Dictionary<string,Control> GetControls() { return this._controlList; } /// <summary> /// 添加查询控件到界面中 /// </summary> /// <param name="control"></param> /// <returns></returns> public bool AddControl(string key,Control control) { if(this._controlList.ContainsKey(key)) return false; this._controlList.Add(key,control); return true; } /// <summary> /// 移除指定键值的对象 /// </summary> /// <param name="key"></param> /// <returns></returns> public bool RemoveControl(string key) { if (this._controlList.ContainsKey(key)) return false; this._controlList.Remove(key); return true; } public virtual void OnQuery() { if (this.handler != null) handler(this, new EventArgs()); } public void Query(object sender, EventArgs e) { this.CreateSQL(); this.OnQuery(); } /// <summary> /// 根据选中的条件生成SQL语句 /// </summary> private void CreateSQL() { throw new NotImplementedException(); } public virtual Control this[string key] { get { return this._controlList[key]; } set { this._controlList[key] = value; } } public virtual IEnumerable<Control> GetControlList() { if (this._controlList.Count > 0) { foreach (Control control in this._controlList.Values) { foreach (Control item in control.Controls) { yield return control; } } } } 这时候我们如果想要重写上面的方案,可能有时候我们的查询控件需要基于上面的几个基本的操作方法进行重写,完成自定义的组合对象的操作: public partial class QueryPanelText : QueryPanel { public QueryPanelText() { InitializeComponent(); } public override Control this[string key] { get { return base.GetControls()[key]; } set { base.GetControls()[key] = value; } } /// <summary> /// 获取集合中的所有控件集合 /// </summary> /// <returns></returns> public override IEnumerable<Control> GetControlList() { return base.GetControlList(); } } 当然我上面并没有改变对象的任何行为,这里定义了公共的行为,有的时候我们需要限制一些对象内部对象的某些行为,这时候我们通过继承公共的 对象来重写对象的行为来完成。例如从组合对象衍生出来的某些组合对象,可能不具有父类的某些行为时,我们可以通过重写父类的行为来完成自定义的操 作。 六、组合模式的其他方案 6.1、通过过滤器来改进上述方案。 有的时候,我们可能并不关心对象中的所有的元素,我们只是操作其中的具有同类特征的对象,比如对于上面的查询控件中的对象,我们可能想要获 取设置条件的控件项,或者说我们相应控制文本框或者下拉框的样式或者高度等等,这个时候,我们需要对组合对象内的元素就行筛选。这个时候,我们可 能可以采用过滤器来实现这样的功能。 对于上面的结果,我们可能需要获取界面中所有的文本框,或者下拉框,或者其他类型的控件等,这时候我们可以如下方式来做,通过接口定义,根 据传入的不同的过滤器,返回过滤后的结果集合。我们先定义一个过滤器接口: public interface ISelectRule { bool IsMatch(Control control); } 我们这里定义一个文本过滤器的实现。 public class TextSelect : ISelectRule { #region ISelectRule 成员 public bool IsMatch(System.Windows.Forms.Control control) { if (control is System.Windows.Forms.TextBox) return true; return false; } #endregion } 我们来看看具体的查询控件内部的获取内部元素的方法: /// <summary> /// 获取集合中的所有控件集合 /// </summary> /// <returns></returns> public IEnumerable<Control> GetControlList(ISelectRule rule) { foreach (Control control in base.GetControls().Values) { if (rule.IsMatch(control)) yield return control; } } 通过上面的几行代码的改进,我们就可以完成对内部的组合对象的改进,这样就可以完成根据不同的查询规则,来返回不同的内部对象集合。 通过上面的迭代器来封装我们的内部组合对象,我们通过迭代器来完成组合对象的过滤。我们还可以通过XML文件来组织我们的对象组合的结构,XML文 件先天性的优势就是结构化的语言,特别适合这样的整体与局部关系的结构,所以我们的组合对象也可以通过XML文件来组织,可以将复杂对象设置为一 个复杂的节点,该节点下包含多个对象时,我们只需要将每个对象设置为一个节点,通过XPath语言完成查询。 6.2XML文件格式的组合模式 使用XML文件来完成组合模式有如下优点: 1、我们有系统提供的类库自动完成对XML文件的操作和访问。 2、XML提供了基于XPath解析的查询语言。 也有一些点,就是操作XML文件,调试起来会比较麻烦,而且进行代码编写和测试是个不太方便的事情。 我们来看看如果我们把上面的获取迭代器的代码,还原成XML文件的格式该如何书写呢? <?xml version="1.0" encoding="utf-8" ?> <Composite> <QueryPanel> <DropDownList name="" type=""/> <DropDownList name="" type=""/> <DropDownList name="" type=""/> <TextBox name="" value="" /> <TextBox name="" value="" /> <TextBox name="" value="" /> <ComboBox name="" value="" /> <ComboBox name="" value="" /> <ComboBox name="" value="" /> <Button name="" value="" /> <Button name="" value="" /> <Button name="" value="" /> </QueryPanel> </Composite> 对于上面的XML文件,那么我们如何获取到这个XML文件中的某些类型的节点呢?比如我如何获取到TextBox呢?这时候我们可以使用Xpath语法来进行 选择: public class XMLSelect { string xPath = "/Composite/QueryPanel/TextBox"; private XmlNodeList list = null; public XmlNodeList GetNodes() { System.Xml.XmlDocument doc = new XmlDocument(); doc.LoadXml("Composite.xml"); list = doc.SelectNodes(xPath); return list; } public List<Control> GetControls() { List<Control> listControls = new List<Control>(); foreach (XmlNode node in list) { System.Windows.Forms.TextBox textBox = new TextBox(); textBox.Name = node.Attributes["name"].Value.ToString(); listControls.Add(textBox); } return listControls; } } 基于上面的形式我们也可以完成组合模式的要求,通过上面的讲解,我们应该对组合模式有了一定的了解。 七、组合模式使用总结 通过上面的简单讲解,我们知道了,组合模式意图是通过整体与局部之间的关系,通过树形结构的形式进行组织复杂对象,屏蔽对象内部的细节,对 外展现统一的方式来操作对象,是我们处理更复杂对象的一个手段和方式。本文以查询控件为例,说明了,查询控件内部的组成元素,及如何操作内部的组 成元素,包括添加元素,删除和处理相应事件的Handler,当然组合模式的作用远比这些强大,后面我们肯定会在一些实例代码中运用到组合模式的。组合 模式如果在条件允许的情况下,我们尽量使用组合模式来处理复杂对象,远比通过继承出来的对象来的有效。 由于本人水平有限,加之理解有误,错误之处还请大家批评指出,多谢大伙的支持和关注! 八、系列进度 九、下篇预告 下篇,我们将会讲述结构性模式中的适配器模式,我想大家对适配器模式应该有不少的了解,因为如果我们经常在项目中使用第三方的或者因为旧的系统与新系 统的接口类型不一致,倒置无法进行调用,这时候我们可以通过适配器模式将旧的接口,转化成可以让我们的新系统调用的接口形式,完成调用,很神奇吧!下篇我们 将会进行详细的阐述。 本文转自 hot的fans 51CTO博客,原文链接:http://blog.51cto.com/2435232/603394

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

企业级网络监控系统“必备技能”

网络可用性监控系统通常是应用程序出现故障时的第一道防线。IT组织的各个团队免不了在出事时互相推委责任,这时网络可用性监控系统就是一个必不可少的工具。 事实上,只要部署了正确的系统,这种推卸责任的现象甚至都不可能再出现。这种可用性监控工具有完备的警报和错误隔离功能。拥有这种工具,网络团队就可以提前处理服务问题。 网络可用性监控系统市场中有各种各样的产品,既有只支持有限功能和规模的开源工具,也有来自IBM和惠普等大型企业IT管理供应商的大型企业产品。在购买监控系统时,采购团队必须将企业需求与各种产品的网络监控特性。 在收集供应商的征询方案(RFP)时,有几点是必须考虑的:方便部署、可用性、兼容现有基础架构、可扩展性及与大量IT管理工具的集成支持。 部署模式 在考虑网络可用性监控系统的部署方式时,第一个问题是了解清楚授权模式。不同供应商的授权方式大相径庭。有一些按照不同的监控功能来销售许可证,而其他一些则按照企业需要管理的设备或逻辑对象的数量来收费。一定要仔细检查他们的授权方式,以确定系统的使用成本及维护难度。 下一个要注意的问题是实际部署模式。采购团队应该弄清楚供应商是否提供了关于系统配置的最佳实践指导。此外,有一些监控系统是独立部署的软件包,而另一些则要求单独安装各个组件,其中包括数据库、检测系统、分析引擎和前端控制台。通常,如果供应商的产品部署中包含多个组件,那么就会采用后一种部署方式,以实现最大的可扩展性和灵活性,但是这种方法也会给某些企业增加额外的复杂性。 易用性 采购团队应该确保网络可用性监控系统的现有需求能够保证所选择的系统能够高效地运行。但是现实并非总是如此。企业管理协会的研究表明,企业中存在大量中看不中用的存架软件——即一些耗费时间且成本昂贵的工具软件。 管理控制台是网络人员要评估的一个最重要的网络监控系统特性。系统上是否有面向典型用户的合理图表功能?命令是否足够简单?相关人员需要经过多少的培训才能学会使用系统?在这种情况下,通过一次概念验证过程,让网络管理人员真实地体验这个系统,能够帮助保证系统的顺利使用并为企业产生价值。 兼容现有网络基础架构 许多组织都在企业环境中混合使用多种供应商的产品。例如,他们可能会使用一两家供应商的交换机,然后再使用另一家的边界路由器。而且,可能还会使用另一家供应商的无线设备。在评估网络可用性监控系统时,风格团队需要确定该工具支持哪一些供应商和平台。 这个评估过程可能需要扩大到网络基础架构之外。许多企业还会监控这些系统连接的服务器和存储。在检查一个管理系统所支持的供应商和设备时,采购团队还必须界定它能够管理的技术类型。这其中包括虚拟化技术和云服务。 系统可扩展性 网络可用性监控系统可能会由于所能管理的风格规模不同而大相径庭。有一些供应商的产品能够监控上百个设备,而其他供应商的产品则能够监控成千上万个设备。而且,有一些系统只能够监控一个位置,但是其他产品则可以覆盖整个企业。 一定要确定网络监控系统所能支持的最大规模和分布程度,而且更重要的是要确定供应商实现可扩展性的方式。某一个供应商可能能够在一台服务器上监控一个包含成千上万台设备的大型分布式网络。而其他供应商则可能将多个服务器部署到企业各个位置,然后通过一个前端控制台将它们绑定在一起。这些差别都将影响系统的使用方式和复杂程度。 互操作性 和其他产品类似,这种网络监控系统也属于大型IT管理系统的一部分。采购团队应该评估企业是否需要集成其他的管理产品。例如,网络工程团队可能会使用可用性监控系统去监控和管理网络,而网络运营团队则可能会使用更高级的服务保证系统。这两种系统之间的集成将促进不同团队之间的协作。 其他潜在的网络监控系统特性还包括网络性能管理、日志分析、应用性能管理、网络变更与配置管理等等。事实上,许多网络可用性监控供应商都提供了大量的IT管理工具及其不同程度的集成技术。然而,对于第三方平台的集成,采购团队还应该评估供应商的技术合作伙伴生态系统、认证类型及这些集成技术附带的联合支持。 总结 前面提到的每一个网络监控系统特性构成了RFP的主体部分,它们是可用性监控系统的采购依据。市场中有大量不同形态的产品,而且许多供应商往往言过其实。因此网络团队一定要全面理解监控系统的需求,再将这些需求与所评估产品的功能相关联。采购团队应该回答所有这些问题,并且在产品评估过程中验证这些问题,然后才能够作出采购决策。 作者:Shamus McGillicuddy 翻译:曾少宁 来源:51CTO

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

大数据技能修炼的个人道场

版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。 https://blog.csdn.net/wireless_com/article/details/50663978 大数据技术火热而且火爆,学习大数据的课程和资料也泛滥如潮,而大数据研发环境又不是随便就可以搭建起来的,如何有一个自己随时可用的大数据修炼道场呢? 网上有很多hadoop单机版的搭建教程,但大多是基础组件,如果想窥探Hadoop 的整个生态系统,并建立一个人的大数据环境,从而修炼大数据的各种技术,我觉得非 HDP 的Sandbox 莫属了。 HDP 的Sandbox 是一个基于虚拟机的单节点hadoop集群,相当于一个伪分布式环境,学习和使用都非常的轻松便捷。虚拟机既支持VMware也支持VirtualBox,完全可以在windows和mac 上无缝执行,需要注意的是需要64位的主机多核cpu并支持虚拟化。 以virtualbox为例,三步,只需三步,就可以搭建自己修炼大数据技术的环境了。 1)先去下载安装virtualbox, https://www.virtualbox.org/wiki/Downloads,选好自己的所需的版本,下载安装。 2)下载HDP sandbox, http://hortonworks.com/products/hortonworks-sandbox/#install,选择virtual box 版本即可,文件较大,接近9个G,要有耐心。 3)启动Virtualbox,倒入HDP sandbox镜像,import 完成后如下图: 忽略那个我自己的ubantu镜像,启动HDP sandbox 即可。 从Ambri开始,就可以逐渐走进Hadoop 的ecosystem 了。 如果只是想马上实践大数据平台计算的应用,可以直接利用云服务。 AWS 的大数据云服务: https://aws.amazon.com/cn/elasticmapreduce/ 这是EMR,当时实时流处理也很强。 阿里云的大数据云服务: https://www.aliyun.com/product/emapreduce只可惜还在公测,没了ali 的名头 青云的大数据云服务: https://www.qingcloud.com/products/big_data_platform后起之秀,也不错,只是HBase 还没有商用。 其他的云PaaS 大数据计算没有过多尝试,不敢妄言了。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

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部分的功能。

用户登录
用户注册