首页 文章 精选 留言 我的

精选列表

搜索[mysql索引],共10019篇文章
优秀的个人博客,低调大师

Swift语法快速索引

在WWDC的演示中就可以看出来Swift这个更接近于脚本的语言可以用更少的代码量完成和OC同样的功能。但是对于像我一样在战争中学习战争的同学们来说,天天抱着笨Swift Programming Language Reference之类的大部头看不实际。毕竟还是要养家糊口的。而且,那么1000+页内容讲的东西不是什么都要全部在平时工作中用到的。咱们就把平时用到的全部都放在一起,忘记了立马翻开看看,不知不觉的就学会了之后变成习惯。这样多省事。 变量 1 // Variable 2 var int_variable = 1 // 类型推断 3 var message : String 4 var x = 0.0, y = 0.0, z = 0.0 常量 // Constant let const_int = 1 //const_int = 10 ERROR: can not assign to let value 字符串 // String // 1. 定义 var empty_string = "" var another_empty_string = String() // 2. 拼接 var hello_string = "hello" var world_string = " world" hello_string += world_string // hello world let multiplier = 3 //let multiplier_message = "\(mulitplier) times 2.5 is \(Double(multiplier) * 2.5)" // 3. 比较 var hello_world_string = "hello world" hello_string == hello_world_string // all are "hello world", result is true if hello_string == hello_world_string { println("These two are equal") } Tuple // Tuple // 1. Unnamed tuple let http_not_found = (404, "Not Found") println("tuple item 1 \(http_not_found.0), tuple item 2 \(http_not_found.1)") // 2. Named tuple let (statusCode, statusMessage) = (404, "Not Found") statusCode // 404 statusMessage // "Not Found" let http_not_found2 = (statusCode:404, statusMessage:"Not Found") http_not_found2.statusCode // 404 http_not_found2.statusMessage // "Not Found" // 3. return tuple func getHttpStatus() -> (statusCode : Int, statusMessage : String){ // request http return (404, "Not Found") } 数组 // Array // 1. 定义 //var empty_array = [] // 在swift里没事不要这样定义数组。这是NSArray类型的,一般是Array<T>类型的 var empty_array : [Int] var empty_array2 = [Int]() var fire_works = [String]() var colors = ["red", "yellow"] var fires : [String] = ["small fire", "big fire"]; // Xcode6 beta3里数组的类型是放在方括号里的 var red = colors[0] // 2. append & insert colors.append("black") colors += "blue" colors += fires colors.insert("no color", atIndex: 0) // 3. update colors[2] = "light blue" //colors[5...9] = ["pink", "orange", "gray", "limon"] // 4. remove colors.removeAtIndex(5) //colors[0] = nil ERROR! // other colors.isEmpty colors.count 字典 // Dictionary // 1. 定义 var airports : Dictionary<String, String> = ["TYP":"Tokyo", "DUB":"Boublin"] var airports2 = ["TYP":"Tokyo", "DUB":"Boublin"] var empty_dic = Dictionary<String, String>() var empty_dic2 = [:] // 2. update airports.updateValue("Dublin International", forKey: "DUB") airports["DUB"] = "Dublin International" // 3. insert airports["CHN"] = "China International" // 4. check exists if let airportName = airports["DUB"] { println("The name of the airport is \(airportName).") } else{ println("That airport is not in the airports dictionary.") } // 5. iterate for (airportCode, airportName) in airports{ println("\(airportCode):\(airportName)") } // 6. remove airports.removeValueForKey("TYP") airports["DUB"] = nil 枚举 // Enum // 1. defination & usage enum PowerStatus: Int{ case On = 1 case Off = 2 } enum PowerStatus2: Int{ case On = 1, Off, Unknown } var status = PowerStatus.On enum Barcode { case UPCA(Int, Int, Int) case QRCode(String) } var product_barcode = Barcode.UPCA(8, 8679_5449, 9) product_barcode = .QRCode("ABCDEFGHIJKLMN") switch product_barcode{ case .UPCA(let numberSystem, let identifier, let check): println("UPC-A with value of \(numberSystem), \(identifier), \(check)") case .QRCode(let productCode): println("QR code with value of \(productCode)") } 方法 // Function // 1. 定义 func yourFuncName(){ } // 2. 返回值 func yourFuncNameWithReturnType()->String{ return "" } // 3. 参数 func funcWithParameter(parameter1:String, parameter2:String)->String{ return parameter1 + parameter2 } funcWithParameter("1", "2") // 4. 外部参数名 func funcWithExternalParameter(externalParameter p1:String) -> String{ return p1 + " " + p1 } funcWithExternalParameter(externalParameter: "hello world") func joinString(string s1: String, toString s2: String, withJoiner joiner: String) -> String { return s1 + joiner + s2 } joinString(string: "hello", toString: "world", withJoiner: "&") // 外部内部参数同名 func containsCharacter(#string: String, #characterToFind: Character) -> Bool { for character in string { if character == characterToFind { return true } } return false } containsCharacter(string: "aardvark", characterToFind: "v") // 默认参数值 func joinStringWithDefaultValue(string s1: String, toString s2: String, withJoiner joiner: String = " ") -> String { return s1 + joiner + s2 } joinStringWithDefaultValue(string: "hello", toString: "world") //joiner的值默认为“ ” // inout参数 func swapTwoInts(inout a: Int, inout b: Int) { let temporaryA = a a = b b = temporaryA } var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, &anotherInt) println("someInt is now \(someInt), and anotherInt is now \(anotherInt)") // prints "someInt is now 107, and anotherInt is now 3 类 // Class // 1. 定义 class NamedShape { var numberOfSides: Int = 0 var name: String // *这样定义的初始化函数,其参数在调用的时候必须作为外名称使用 init(name: String) { self.name = name } // *这样定义的参数,在初始化的时候可以不使用外名称 init(_ nickName: String){ self.name = nickName } func simpleDescription() -> String { return "A shape with \(numberOfSides) sides." } }// 2. 继承 & 函数重载 & 属性getter setter class Square: NamedShape { var sideLength: Double init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 4 } func area() -> Double { return sideLength * sideLength } // 函数重载 override func simpleDescription() -> String { return "A square with sides of length \(sideLength)." } } class EquilateralTriangle: NamedShape { var sideLength: Double = 0.0 init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 3 } // 属性的getter setter var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } override func simpleDescription() -> String { return "An equilateral triagle with sides of length \(sideLength)." } } // 3. 使用 var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle") triangle.perimeter triangle.perimeter = 9.9 triangle.sideLength 使用闭包给属性赋初值 struct Checkerboard { let boardColors: Bool[] = { var temporaryBoard = Bool[]() var isBlack = false for i in 1...10 { for j in 1...10 { temporaryBoard.append(isBlack) isBlack = !isBlack } isBlack = !isBlack } return temporaryBoard }() func squareIsBlackAtRow(row: Int, column: Int) -> Bool { return boardColors[(row * 10) + column] } } 类(二) 1. 属性的初始化 2. init函数中修改常量属性 struct Color{ // 在初始化函数中可以修改这些在定义时没有给出初始值的属性 let red, green, blue: Double // stored property(就是下面这样定义的),如果是optional的(结尾时?活着!),可以在初始化函数 // 中不给出初始值,否则必须给出初始值。 var alpha: Double! init(r red: Double, green: Double, blue: Double){ self.red = red self.green = green self.blue = blue } init(white: Double){ red = white green = white blue = white } init(_ aColor: Double){ self.red = aColor self.green = aColor self.blue = aColor } } 3. 构造函数 // 默认init函数 class ShoppingItem { var name: String? // var quantity: Int // 编译错误,要使代码正确需要注释掉这一句 var purchased = false // 除非定义的属性全部都有初始值。optional的属性的默认值是nil。 // 否则的话必须显示定义一个init函数。 init(){ } init(name: String, purchased: Bool){ self.name = name self.purchased = purchased } // 结构体等自定义值类型可以直接在一个init函数中使用self.init(...)的方式调用 // 其他的init函数。但是在class(引用类型)中需要显示制定convenience关键字 // 才可以调用其他的init函数 convenience init(name: String){ self.init(name: "hello", purchased: true) } } var item = ShoppingItem() struct Color{ // 在初始化函数中可以修改这些在定义时没有给出初始值的属性 let red, green, blue: Double // stored property(就是下面这样定义的),如果是optional的(结尾时?活着!),可以在初始化函数 // 中不给出初始值,否则必须给出初始值。 var alpha: Double! init(r red: Double, green: Double, blue: Double){ self.red = red self.green = green self.blue = blue } //在init函数中调用其他init函数 init(white: Double){ // red = white // green = white // blue = white self.init(r: 1.0, green: 2.0, blue:1.0) } } convenience的init函数只能在本类中调用。而一般的init函数(也就是designated init)可以在继承的链中在一个类中调用super类的init函数。 继承 不想什么被继承就在什么的前面放个final关键字(以前有@号,现在木有了)。如果在class前面放final关键字的话,那么整个类不可以被继承。 class ShoppingListItem: ShoppingItem{ final var wishListed: Bool? // 不被继承 override init(){ super.init(name: "what", purchased: false) } } 析构函数 class Vehicle{ var numberOfWheels = 0 var description: String{ return "\(numberOfWheels) wheel(s)" } deinit{ // 析构具体内容 } } 析构函数执行的特点: 1. 系统自动调用,不允许手动调用 2. 执行完本类调执行super类的 3. 执行完析构函数之后实例才释放,所以可以析构函数里可以访问全部属性的值 WEAK和UNOWNED关键字 class Customer{ let name: String var card: CreditCard? init(name: String) { self.name = name } } class CreditCard{ let number: Int /* * weak和owned关键字都用来修饰属性的,为了防止循环引用造成的内存无法释放。 * 区别就在于unowned是一定要有值的。所以unowned只可以用在非可选类型上(non-optional type) */ unowned let customer: Customer init(number: Int, customer: Customer){ self.number = number self.customer = customer } } 在闭包中也会出现这样的问题。如果在闭包中使用了self.xxxProperty也会出现对类实例本身的一个强引用,从而出现了循环引用。PS:在闭包中使用类成员的时候必须要用self.的写法。 } } class HTMLElement { let name: String let text: String? lazy var asHTML: () -> String = { [unowned self] in if let text = self.text { return "<\(self.name)>\(text)</\(self.name)>" } else { return "<\(self.name) />" } } init(name: String, text: String? = nil) { self.name = name self.text = text } deinit { println("\(name) is being deinitialized") } } 其他稍后补充 欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处! 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/3851717.html ,如需转载请自行联系原作者

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

openstack 管理 - 索引(备忘)

命令行管理介绍 openstack 命令行管理一 - br-ex 网络设定 (备忘) openstack 命令行管理二 - 镜像管理 (备忘) openstack 命令行管理三 - tenant 管理 (备忘) openstack 命令行管理四 - 资源管理 (备忘) openstack 命令行管理五 - 磁盘配额管理(备忘) openstack 命令行管理六 - 用户管理 (备忘) openstack 命令行管理七 - 角色管理 (备忘) openstack 命令行管理八 - 服务管理 (备忘) openstack 命令行管理九 - flavor管理[主机模板] (备忘) openstack 命令行管理十 - 密钥管理 (备忘) openstack 命令行管理十一 - 安全组管理 (备忘) openstack 命令行管理十二 - 内部网络[instance专用]管理 (备忘) openstack 命令行管理十三 - 外部网络[外部连接专用]管理 (备忘) openstack 命令行管理十四 - 路由管理 (备忘) openstack 命令行管理十五 - 浮动 IP 管理 (备忘) openstack 命令行管理十六 - 网络测试 (备忘) openstack 命令行管理十七 - 宿主主机管理 (备忘) openstack 命令行管理十八 - instance管理 (备忘) openstack 命令行管理十九 - 日志管理 (备忘) openstack 命令行管理二十 - instance novnc 访问管理 (备忘) openstack 命令行管理二十一 - 云盘管理 (备忘) 安装配置介绍 openstack 管理二十二 - cinder 连接多个存储 backend openstack 管理二十三 - nova compute 连接 ceph 集群 openstack 管理二十四 - ceph 与 vm 连接测试记录 openstack 管理二十五 - rpm 方式部署 openstack(架构说明) openstack 管理二十六 - rpm 方式部署 openstack [mariadb] openstack 管理二十七 - rpm 方式部署 openstack [rabbitmq] openstack 管理二十八 - rpm 方式部署 openstack [keystone] openstack 管理二十九 - rpm 方式部署 openstack [glance] openstack 管理三十 - rpm 方式部署 openstack [cinder] openstack 管理三十一 - rpm 方式部署 openstack [nova] openstack 管理三十二 - rpm 方式部署 openstack [neutron] openstack 管理三十三 - rpm 方式部署 openstack [compute] 管理 openstack 管理三十四 - neutron dhcp agent 管理

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

微服务架构概念索引

微服务从2013年(或许更早)开始就越来越热,从BAT之类的巨头到小小的只有几个人的技术公司,无不在谈论微服务。虽然现在才火热起来,但是实际上微服务的概念早在半个世纪之前在理论层面就出现了。关于微服务理论介绍的文章太多,口才优秀的人可以分成上中下九章给你说上一天,本文仅用于总结微服务知识结构,略做引导。 云源生(Cloud Native) 现在但凡和软件技术有点裙带关系的机构、组织、人士都在谈论各种“云”。还有不少公司以云××、××云、×云×作为公司的名称。与IT技术沾一点边或者完全不沾边的各路人马都可以随时抛出“云应用”、“云计算”、“云数据”等听起来就很高大上的术语持续忽悠着你。 对于云技术(微服务)而言,2013年是一个分水岭,在这之前有一些零散的分布式应用的意识,但是没有一个系统性的概括。然后在2013年Matt Stine的Cloud Native概念横空出世。Cloud Native是一系列概念的集合,围绕这一系列标准可以构建从技术架构、到运维管理、再到团队协作的整体性框架。他让基于微服务的应用搭建过程成为一个标准流程,主要涵盖以下几点内容。 微服务(分布式系统)。 首先,微服务本身就是一个很具体的概念,简单的说就是:根据性能要求横向拆分为相同功能的负载均衡节点,根据业务要求纵向拆分为不同功能的服务节点。 其次,微服务这个术语下还涵盖了大量概念,也是一个概念的集合,比如:熔断、降级、心跳检查、消息队列、负载均衡、服务注册、服务发现、去中心化、服务通信(RPC、RMI、TCP/IP)、分布式事物(分布式数据库)、分布式存储、分布式同步对象(数据)、缓存穿透、缓存雪崩、业务追踪、统一日志管理、API网关等等。每一个概念都是一种标准,都有一项或多项技术在支撑。通常优秀的微服务框架都会实现以上部分功能,同时支持内部或外部扩展。比如要防止缓存穿透可以自己写一个Bloom Filter(布隆过滤器),或者缓存用Redis(>4.0)并添加过滤器插件,再或者在物理缓存之前再使用Redisson、Hazelcast之类的内存级缓存。 最后,微服务也特指云服务分布式系统的底层技术。比如Dubbo、Spring Cloud、以及后面要提到的一系列Service Mesh框架等,都会把他们称为微服务框架。 虽然微服务这个术语自身已经有了足够丰富的内容,但是他仅仅是“云”技术的一个环节。 康威定律。 在使用微服务框架的时候,不知道各位有没有想过这些问题:为什么微服务技术或团队是现在的结构?为什么微服务开发需要和敏捷模型(迭代模型)配合?为什么使用微服务的公司能够容忍团队之间使用不同的语言? 以上这些问题早在半个世纪之前就给出了答案——康威定律。康威定律是微服务技术团队的基础理论,他主要由四个定律组成: 组织的沟通方式通过系统的设计结构来约束:沟通成本呈现指数增长(人于人之间的连线),必须把业务/小团队边界压缩在固定人员中(5~15人)。 无法完美但能高效。Bug永远有,与其追求无Bug的完美系统,不如追求可允许的修复速度,进而通过反复验证强化系统。这是敏捷开发、持续集成发布、自动化监控的本源——即使测试覆盖到100%也没法避免不出现bug,但是能在波及面可控的范围内快速解决问题。 线性团队同质化,业务团队内聚化。看下面2个图就明白(图片来源于网络,如有侵权请联系立即删除)。 1) 2) 图1)是一个线性团队,前端、后端、数据库分工明确层次清晰,然后开发出来的系统也会呈现出对应的样子,因为团队划分的结构决定了系统的最终形态。 图2)是一个以业务划分的团队,每一个团队都有一个完整的从前端到后端的“生态”。然后开发出来的系统就会各成一派别。 第三定律告诉我们小团队内部的沟通往往密集而且更加高效,按照这个方式划分的每个子系统自然会逐渐内聚,而团队之间更加倾向以接口沟通耦合性更低。仔细观察,现在包括BAT在内的互联网公司都是图2的团队结构。 系统的拆解倾向性。在架构演进的过程中,随着系统规模的增加合理的解决方法都是将复杂的问题拆分。比如数据库并发太高无法承担了,我们一般会执行以下几个步骤: 增加Redis之类的缓存工具,将原本是物理数据库的一个问题拆解成2个子问题,并分别去解决对应的更多问题。 横向按字段拆表,将一些频繁更新的字段独立到独立的表去以关联的形式存在。 纵向按照数据业务特征(例如时间)分区数据。 敏捷开发与敏捷基础设施:在康威定律中已经解释了敏捷开发(迭代开发)对于微服务架构的重要性。说白了敏捷开发就是一种流程规范外加一些适合与流程规范的工具,比如GitLab、Jira之类的工具等被称为敏捷基础设施,敏捷工具和方法众多,比如每日站会、卡片式任务等等,这需要根据团队的需要和结构因地适宜。 DevOps:DevOps(Development、Operations)并没有指定具体的技术实现,他就是一个从软件开发到产品上线发布的流程规范,只不过这个流程现在有大量的工具为我们提供支持。流程包括: 需求管理。 编码开发,单元测试(Junit、Jest白盒测试)。 QA(黑盒测试)。自动化测试(Server walker)、代码质量监控(Sonar、EsLint)、接口测试(Jmeter、Loadrunner)。 上线发布运维。包括压力测试、多节点的运维管理、以及Cloud Foundry, Kubernetes, Apache YARN, and Apache Mesos等云平台的使用。 这其中每一个过程都可以写成一本书。本人比较推崇CMMI的敏捷模型配合各种工具来使用。 CI(Continuous Integration)/CD(Continuous Deployment):个人理解CI/CD应该属于DevOps的范畴,他的核心关注点在程序员代码交付和缺陷测试之上。我们知道在任何时候,技术开发人员和测试人员都应该是密切配合的,一个迭代周期之内应该是开发推进测试,测试驱动开发。并不用把这个过程想象得太复杂,实际上可以用Jenkins相关的各种插件实现代码持续集成、自动化检测、测试环境持续发布上线。 更多内容:除了以上几点,Cloud Native还涵盖了对一些细节的描述,比如分布式事物(最终一致性、容错性、可用性、缓存与实体同步)、弹性伸缩等。 相关文章和博客: 微服务学习阅读清单:这是本节开始提到的Matt Stine个人博客提供的阅读学习清单,对于了解云技术非常有价值。附带说下,在Matt Stine2013年提出Cloud Native时还是Pivotal的Cloud Foundry负责人之一,现在已经是Pivotal的CTO了。有空也可以看看他的各种推文。附带推荐这篇文章——关于Cloud Native架构与Matt Stine的一次对话。 微服务架构的理论基础-康威定律:这篇文章对康威定律的介绍非常透彻,也有许多自己的解读。值得一读。 Micro Service与Service Mesh 到目前为止微服务这个概念或者相关技术已经发展了许多年,相关的问题不断的被发现和解决,理论也在不断的完善。现在最火热的技术当属Service Mesh,在很多人看来它代表了微服务的最近技术潮流,或被称为第二代微服务技术。目前Service Mesh具有代表性的开源项目主要是: Linkerd。 Envoy。 Istio。 Conduit。 NginMesh。 Kong。 上面这些项目,最火热的当属Istio了,含着金钥匙出生自大厂(Google、IBM)。上面的技术框架中前两者被称呼为第一代Service Mesh,后面的被称为第二代。据说国内唯品会公司的技术团队长期致力于Service Mesh的使用,不过没看到什么开源的项目出现。 一句话总结Service Mesh与之前微服务技术的差异:非侵入、分层设计、伴随模式(SideCar)。 关于Micro Service与Service Mesh的几篇优秀的博文: 微服务和服务网格架构概念整理这是百度搜索的排名第一,内容优秀。 唯品会的Service Mesh三年进化史我最早接触到Service Mesh的概念是源于和一名前唯品会架构师的合作,后来搜到了这篇文章。本文优点在于他在介绍演进过程的同时还将很多实现基本功能的开源技术都罗列了出来,对新上项目做技术选型有不错的参考价值。 蚂蚁金服的 Service Mesh 演进之道这篇文章介绍了Service Mesh在金融级别的解决方案,细节介绍比较透彻。同时还讲解了一些从传统架构迁移到Service Mesh的经验。 从后面的这2篇文章可以看到,国内的大公司虽然起初都有使用开源Service Mesh框架的意愿,但是都走上的自研的道路。目前的各路Service Mesh架构远没达到Spring Cloud这种开箱即用层度,用来之后要花许多时间去解决各种坑,小规模团队慎用。 Boiler Plate Patterns与Boilerplate Boiler Plate Patterns这个词来源于Spring官网关于Spring Cloud的介绍,直译为“锅炉样板模式”。首次见到时略微迷惑,曾一度怀疑自己之前对设计模式的理解是不是有什么偏差。经过一番了解之后有了大致的心得,在此记录总结。 原文在Spring Cloud的开篇位置:“Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns.”按字面意思直译为:一个平衡和谐的分布式系统会导致“锅炉样板模式”,使用Spring Cloud能够让开发者通过这个模式快速的搭建服务和应用。Boiler Plate Patterns这个术语概括总结Spring Cloud的基本使用模式,所以弄明白它背后的安逸对于使用Spring Cloud非常重要。 很多后端开发的码友应该知道样板式代码的问题,它的英文原文就是Boilerplate Code。在很多长期维护的系统中,经过几代人的“耕耘”之后样板式代码的问题尤为明显。此外在前端开发中, Boilerplate是一个著名的开源HTML模板,也指代那些以及制作好,只要修改文字内容的网站模板。所以Boiler Plate Patterns可以理解为Spring Cloud为每一个微服务节点提供一种开发样板,业务开发人员按照样板结构去开发即可。一个优秀的架构师在做技术选型或编写底层框架时,时时刻刻都会考虑面向业务的开发人员会以何种方式去使用框架,有统一的样板或者模式来遵循是对于任何刚使用框架的开发者都是非常有价值的。 Memory Footprint、TPS、QPS 评估微服务框架优劣的主要有三个指标,分别是Memory Footprint、TPS、QPS。Memory Footprint是指内存占用情况,按照蚂蚁金服那一篇Service Mesh文章的介绍,一个与应用伴随的微服务节点占用内存应该控制在20M以下。按照Java的Jvm机制内存的占用并不太好评估,但是非大文件处理的应用控制在50M以内。 TPS(Transactions Per Second,事物处理/秒)和QPS(Queries Per Second,查询处理/秒)一般用于衡量吞吐量,通常大规模应用的TPS会要求过万。 这也是Golang在高并发分布式的新环境下发展出来的优势,很多Golang节点的TPS能到十万级别,而内存占用能控制在20M以内。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

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

用户登录
用户注册