justudy

just study


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 公益404

Mysql索引哪些事

发表于 2016-11-22

###索引有什么用

  • 为从数据库读取数据加速
  • 强制约束 (唯一索引 UNIQUE, 外键 FOREIGN KEY)
  • 没有任何索引的情况下查询页能正常运行
  • 但是那可能需要执行很长的时间

###你可能听说过的索引类型

  • BTREE索引 – mysql中主要的索引类型
  • RTREE索引 – 只有MyISAM支持, 用于GIS
  • HASH 索引 – MEMORY, NDB 支持
  • BITMAP 索引 – MySQL 不支持
  • FULLTEXT 索引 – MyISAM, Innodb(MySQL 5.6以上支持)

###MyISAM、Innodb索引对比

  • MyISAM

    数据指针指向数据文件中的物理位置
    所有索引都是一样的(指向物理位置))

  • Innodb
    主键索引 (显式或隐式) - 直接将数据存储于索引的叶子节点,而不是指针
    二级索引 – 保存主键索引的值作为数据指针

###BTREE索引能用于什么操作 ?

查询所有 KEY=5 的记录 (点查询)
查询所有 KEY>5 的记录 (开合间)
查询所有 5<KEY<10 的记录 (闭合间)
不适用于:查询KEY最后一个数字等于0的所有记录
因为这不能定义为范围查询操作

###字符索引

这(和数值)没什么区别… 真的
collation是为字符串定义的排序规则
如: “AAAA” < “AAAB”
前缀LIKE 查询是一种特殊的范围查询
LIKE “ABC%” 的意思是:
“ABC[最小值]”<KEY<“ABC[最大值]”
LIKE “%ABC” 无法使用索引查询

###联合索引

是这样进行排序的, 比较首列,然后第二列,第三列以此类推,如:
KEY(col1,col2,col3)
(1,2,3) < (1,3,1)
使用一个BTREE索引,而不是每个层级一个单独的BTREE索引

###索引的开销

索引是昂贵的,不要添加多余的索引
多数情况下,扩展索引比添加一个新的索引要好
写 - 更新索引常常是数据库写操作的主要开销
读 - 需要再硬盘和内存开销空间; 查询优化中需要额外的开销

###索引成本的影响

  • 长主键索引(Innodb) – 使所有相应的二级索引 变得更长、更慢
  • “随机”主键索引(Innodb) – 插入导致大量的页面分割
  • 越长的索引通常越慢
  • Index with insertion in random order – SHA1(‘password’)
  • 低区分度的索引是低劣的 – 在性别字段建的索引
  • 相关索引是不太昂贵的– insert_time与自增id是相关的

###Innodb表的索引

  • 数据按主键聚集
  • 选择最佳的字段作为主键
  • 比如评论表 – (POST_ID,COMMENT_ID) 是作为主键的不错选择,使得单个post的评论聚在一起
  • 或者 “打包” 单个 BIGINT(字段)
  • 主键隐式地附加到所有索引中
  • KEY (A) 实质上是 KEY (A,ID)
  • 覆盖索引,有利于排序

###MySQL是如何使用索引的

查询
排序
避免读取数据(只读取索引)
其他专门的优化

###MySQL优化器的第一法则
在复合索引中,MySQL在遇到返回查询(<,>,BETWEEN)时,将停止中止剩余部分(索引)的使用;但是使用IN(…)的”范围查询”则可以继续往右使用索引(的更多部分)

###MySQL使用索引排序的规则

  • 不能对两个字段进行不同顺序的排序
  • 对非ORDER BY部分的字段只能使用点查询(=)– 在这种情形下,IN()也不行

未命名

发表于 2016-11-20

git commit emoji 使用指南

commit 格式

git commit 时,提交信息遵循以下格式:

1
2
3
4
5
:emoji1: :emoji2: 主题
提交信息主体
Ref <###>

初次提交示例:

1
git commit -m ":tada: Initialize Repo"

emoji 指南

emoji emoji 代码 commit 说明
:art: (调色板) :art: 改进代码结构/代码格式
:zap: (闪电) :zap: 提高性能
:fire: (火焰) :fire: 移除代码或文件
:bug: (bug) :bug: 修复 bug
:ambulance: (急救车) :ambulance: 重要补丁
:sparkles: (火花) :sparkles: 引入新功能
:memo: (备忘录) :memo: 撰写文档
:rocket: (火箭) :rocket: 部署功能
:lipstick: (口红) :lipstick: 更新 UI 和样式文件
:tada: (庆祝) :tada: 初次提交
:white_check_mark: (白色复选框) :white_check_mark: 增加测试
:lock: (锁) :lock: 修复安全问题
:apple: (苹果) :apple: 修复 macOS 下的问题
:penguin: (企鹅) :penguin: 修复 Linux 下的问题
:checkered_flag: (旗帜) :checked_flag: 修复 Windows 下的问题
:bookmark: (书签) :bookmark: 发行/版本标签
:rotating_light: (警车灯) :rotating_light: 移除 linter 警告
:construction: (施工) :construction: 工作进行中
:green_heart: (绿心) :green_heart: 修复 CI 构建问题
:arrow_down: (下降箭头) :arrow_down: 降级依赖
:arrow_up: (上升箭头) :arrow_up: 升级依赖
:construction_worker: (工人) :construction_worker: 添加 CI 构建系统
:chart_with_upwards_trend: (上升趋势图) :chart_with_upwards_trend: 添加分析或跟踪代码
:hammer: (锤子) :hammer: 重大重构
:heavy_minus_sign: (减号) :heavy_minus_sign: 减少一个依赖
:whale: (鲸鱼) :whale: Docker 相关工作
:heavy_plus_sign: (加号) :heavy_plug_sign: 增加一个依赖
:wrench: (扳手) :wrench: 修改配置文件
:globe_with_meridians: (地球) :globe_with_meridians: 国际化与本地化
:pencil2: (铅笔) :pencil2: 修复 typo

参考

  • gitmoji
  • An emoji guide for your commit messages
  • styleguide-git-commit-message
  • emoji-cheat-sheet

复习面向对象的OOA,OOD,OOP

发表于 2016-11-16   |   分类于 设计模式

###OOA

Object-Oriented Analysis:面向对象分析方法

  • 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。

  • OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与部分的关系。

  • OOA在定义属性的同时,要识别实例连接。实例连接是一个实例与另一个实例的映射关系。

  • OOA在定义服务的同时要识别消息连接。当一个对象需要向另一对象发送消息时,它们之间就存在消息连接。

  • OOA 中的5个层次和5个活动继续贯穿在OOD(画向对象的设计)过程中。OOD模型由4个部分组成。它们分别是设计问题域部分、设计人机交互部分、设计任务管理部分和设计数据管理部分。

####OOA的主要原则。

  (1)抽象:从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫作抽象。抽象是形成概念的必须手段。

  抽象原则有两方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特征而得到一批事物的抽象概念。

  抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面。

  过程抽象是指,任何一个完成确定功能的操作序列,其使用者都可以把它看作一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的。

  数据抽象是根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。数据抽象是OOA的核心原则。它强调把数据(属性)和操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做。

  (2)封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。

  (3)继承:特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。

  在OOA中运用继承原则,就是在每个由一般类和特殊类形成的一般—特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和服务,一次性地在一般类中进行显式的定义。在特殊类中不再重复地定义一般类中已定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的全部属性和服务。继承原则的好处是:使系统模型比较简练也比较清晰。

  (4)分类:就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。

  (5)聚合:又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事物的描述。

  (6)关联:是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。

  (7)消息通信:这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求用消息连接表示出对象之间的动态联系。

  (8)粒度控制:一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详察每一部分的具体的细节;考虑某部分的细节时则暂时撇开其余的部分。这就是粒度控制原则。

  (9)行为分析:现实世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖、相互交织。

####面向对象分析产生三种分析模型

  1、对象模型:对用例模型进行分析,把系统分解成互相协作的分析类,通过类图/对象图描述对象/对象的属性/对象间的关系,是系统的静态模型

  2、动态模型:描述系统的动态行为,通过时序图/协作图描述对象的交互,以揭示对象间如何协作来完成每个具体的用例,单个对象的状态变化/动态行为可以通过状态图来表达

  3、功能模型(即用例模型à作为输入)。

####OOA的主要优点

  (1)加强了对问题域和系统责任的理解;

  (2)改进与分析有关的各类人员之间的交流;

  (3)对需求的变化具有较强的适应性;

  (4)支持软件复用。

  (5)贯穿软件生命周期全过程的一致性。

  (6)实用性;

  (7)有利于用户参与。

####OOA方法的基本步骤

  在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:

  第一步,确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。

  第二步,确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。

  第三步,确定主题(subject)。主题是指事物的总体概貌和总体分析模型。

  第四步,确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。

  第五步,确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。   

###OOD

面向对象设计(Object-Oriented Design,OOD)方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。

  面向对象设计(OOD)是一种软件设计方法,是一种工程化规范。这是毫无疑问的。按照Bjarne Stroustrup的说法,面向对象的编程范式(paradigm)是[Stroustrup, 97]:

- 决定你要的类;
- 给每个类提供完整的一组操作;
- 明确地使用继承来表现共同点。

  由这个定义,我们可以看出:OOD就是“根据需求决定所需的类、类的操作以及类之间关联的过程”。

  OOD的目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(interface)的后面,让它们只通过接口相互交流。比如说,如果用OOD的方法来设计一个服务器-客户端(client-server)应用,那么服务器和客户端之间不应该有直接的依赖,而是应该让服务器的接口和客户端的接口相互依赖。

  这种依赖关系的转换使得系统的各部分具有了可复用性。还是拿上面那个例子来说,客户端就不必依赖于特定的服务器,所以就可以复用到其他的环境下。如果要复用某一个程序块,只要实现必须的接口就行了。

  OOD是一种解决软件问题的设计范式(paradigm),一种抽象的范式。使用OOD这种设计范式,我们可以用对象(object)来表现问题领域(problem domain)的实体,每个对象都有相应的状态和行为。我们刚才说到:OOD是一种抽象的范式。抽象可以分成很多层次,从非常概括的到非常特殊的都有,而对象可能处于任何一个抽象层次上。另外,彼此不同但又互有关联的对象可以共同构成抽象:只要这些对象之间有相似性,就可以把它们当成同一类的对象来处理。

####OOD背景知识

  计算机硬件技术却在飞速发展。从几十年前神秘的庞然大物,到现在随身携带的移动芯片;从每秒数千次运算到每秒上百亿次运算。当软件开发者们还在寻找能让软件开发生产力提高一个数量级的“银弹”[Brooks, 95]时,硬件开发的生产力早已提升了百倍千倍。

  硬件工程师们能够如此高效,是因为他们都很懒惰。他们永远恪守“不要去重新发明轮子”的古训。Grady Booch把这些黑箱称为类属(class category),现在我们则通常把它们称为“组件(component)”。

  类属是由被称为类(class)的实体组成的,类与类之间通过关联(relationship)结合在一起。一个类可以把大量的细节隐藏起来,只露出一个简单的接口,这正好符合人们喜欢抽象的心理。所以,这是一个非常伟大的概念,因为它给我们提供了封装和复用的基础,让我们可以从问题的角度来看问题,而不是从机器的角度来看问题。

  软件的复用最初是从函数库和类库开始的,这两种复用形式实际上都是白箱复用。到90年代,开始有人开发并出售真正的黑箱软件模块:框架(framework)和控件(control)。框架和控件往往还受平台和语言的限制,现在软件技术的新潮流是用SOAP作为传输介质的Web Service,它可以使软件模块脱离平台和语言的束缚,实现更高程度的复用。但是想一想,其实Web Service也是面向对象,只不过是把类与类之间的关联用XML来描述而已[Li, 02]。

  在过去的十多年里,面向对象技术对软件行业起到了极大的推动作用。在可以预测的将来,它仍将是软件设计的主要技术——至少我看不到有什么技术可以取代它的。

####OOD到底从哪儿来?

  有很多人都认为:OOD是对结构化设计(Structured Design,SD)的扩展,其实这是不对的。OOD的软件设计观念和SD完全不同。SD注重的是数据结构和处理数据结构的过程。而在OOD中,过程和数据结构都被对象隐藏起来,两者几乎是互不相关的。不过,追根溯源,OOD和SD有着非常深的渊源。

  1967年前后,OOD和SD 的概念几乎同时诞生,它们分别以不同的方式来表现数据结构和算法。当时,围绕着这两个概念,很多科学家写了大量的论文。其中,由Dijkstra和 Hoare两人所写的一些论文讲到了“恰当的程序控制结构”这个话题,声称goto语句是有害的,应该用顺序、循环、分支这三种控制结构来构成整个程序流程。这些概念发展构成了结构化程序设计方法;而由Ole-Johan Dahl所写的另一些论文则主要讨论编程语言中的单位划分,其中的一种程序单位就是类,它已经拥有了面向对象程序设计的主要特征。

  这两种概念立刻就分道扬镳了。在结构化这边的历史大家都很熟悉:NATO会议采纳了Dijkstra的思想,整个软件产业都同意goto语句的确是有害的,结构化方法、瀑布模型从70年代开始大行其道。同时,无数的科学家和软件工程师也帮助结构化方法不断发展完善,其中有很多今天足以使我们振聋发聩的名字,例如Constantine、Yourdon、DeMarco和Dijkstra。有很长一段时间,整个世界都相信:结构化方法就是拯救软件工业的 “银弹”。当然,时间最后证明了一切。

  而此时,面向对象则在研究和教育领域缓慢发展。结构化程序设计几乎可以应用于任何编程语言之上,而面向对象程序设计则需要语言的支持[1],这也妨碍了面向对象技术的发展。实际上,在60年代后期,支持面向对象特性的语言只有Simula-67这一种。到70年代,施乐帕洛阿尔托研究中心(PARC)的 Alan Key等人又发明了另一种基于面向对象方法的语言,那就是大名鼎鼎的Smalltalk。但是,直到80年代中期,Smalltalk和另外几种面向对象语言仍然只停留在实验室里。

  到90年代,OOD突然就风靡了整个软件行业,这绝对是软件开发史上的一次革命。不过,登高才能望远,新事物总是站在旧事物的基础之上的。70年代和80年代的设计方法揭示出许多有价值的概念,谁都不能也不敢忽视它们,OOD也一样。

####OOD和传统方法有什么区别?

  还记得结构化设计方法吗?程序被划分成许多个模块,这些模块被组织成一个树型结构。这棵树的根就是主模块,叶子就是工具模块和最低级的功能模块。同时,这棵树也表示调用结构:每个模块都调用自己的直接下级模块,并被自己的直接上级模块调用。

  那么,哪个模块负责收集应用程序最重要的那些策略?当然是最顶端的那些。在底下的那些模块只管实现最小的细节,最顶端的模块关心规模最大的问题。所以,在这个体系结构中越靠上,概念的抽象层次就越高,也越接近问题领域;体系结构中位置越低,概念就越接近细节,与问题领域的关系就越少,而与解决方案领域的关系就越多。

  但是,由于上方的模块需要调用下方的模块,所以这些上方的模块就依赖于下方的细节。换句话说,与问题领域相关的抽象要依赖于与问题领域无关的细节!这也就是说,当实现细节发生变化时,抽象也会受到影响。而且,如果我们想复用某一个抽象的话,就必须把它依赖的细节都一起拖过去。

  而在OOD中,我们希望倒转这种依赖关系:我们创建的抽象不依赖于任何细节,而细节则高度依赖于上面的抽象。这种依赖关系的倒转正是OOD和传统技术之间根本的差异,也正是OOD思想的精华所在。

####OOD步骤

  细化重组类

  细化和实现类间关系,明确其可见性

  增加属性,指定属性的类型与可见性

  分配职责,定义执行每个职责的方法

  对消息驱动的系统,明确消息传递方式

  利用设计模式进行局部设计

  画出详细的类图与时序图

####OOD设计过程中要展开的主要几项工作

  (一)对象定义规格的求精过程

  对于OOA所抽象出来的对象-&-类以及汇集的分析文档,OOD需要有一个根据设计要求整理和求精的过程,使之更能符合OOP的需要。这个整理和求精过程主要有两个方面:一是要根据面向对象的概念

  模型整理分析所确定的对象结构、属性、方法等内容,改正错误的内容,删去不必要和重复的内容等。二是进行分类整理,以便于下一步数据库设计和程序处理模块设计的需要。整理的方法主要是进行归

  类,对类一&一对象、属性、方法和结构、主题进行归类。

  (二)数据模型和数据库设计

  数据模型的设计需要确定类-&-对象属性的内容、消息连接的方式、系统访问、数据模型的方法等。最后每个对象实例的数据都必须落实到面向对象的库结构模型中。

  (三)优化

  OOD的优化设计过程是从另一个角度对分析结果和处理业务过程的整理归纳,优化包括对象和结构的优化、抽象、集成。

  对象和结构的模块化表示OOD提供了一种范式,这种范式支持对类和结构的模块化。这种模块符合一般模块化所要求的所有特点,如信息隐蔽性好,内部聚合度强和模块之间耦合度弱等。

  集成化使得单个构件有机地结合在一起,相互支持。

####OO方法的特点和面临的问题

  OO方法以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是OO方法最主要的特点和成就。OO方法的应用解决了传统结构化开发方法中客观世界描述工具与软

  件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法。

  但是同原型方法一样,OO方法需要一定的软件基础支持才可以应用,另外在大型的MIS开发中如果不经自顶向下的整体划分,而是一开始就自底向上的采用OO 方法开发系统,同样也会造成系统结构不合理、各部分关系失调等问题。所以OO方法和结构化方法目前仍是两种在系统开发领域相互依存的、不可替代的方法。

####OOD能给我带来什么?

  问这个问题的人,脑子里通常是在想“OOD能解决所有的设计问题吗?”没有银弹。OOD也不是解决一切设计问题、避免软件危机、捍卫世界和平……的银弹。OOD只是一种技术。但是,它是一种优秀的技术,它可以很好地解决目前的大多数软件设计问题——当然,这要求设计者有足够的能力。

  OOD可能会让你头疼,因为要学会它、掌握它是很困难的;OOD甚至会让你失望,因为它也并不成熟、并不完美。OOD也会给你带来欣喜,它让你可以专注于设计,而不必操心那些细枝末节;OOD也会使你成为一个更好的设计师,它能提供给你很好的工具,让你能开发出更坚固、更可维护、更可复用的软件。

###OOP

面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和组件:

  组件 - 数据和功能一起在运行着的计算机程序中形成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。

  抽象性 - 程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。

  封装 - 也叫做信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。

  多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。

  继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。

  由于抽象性、封装性、重用性以及便于使用等方面的原因,以组件为基础的编程在脚本语言中已经变得特别流行。Python 和 Ruby 是最近才出现的语言,在开发时完全采用了 OOP 的思想,而流行的 Perl 脚本语言从版本5开始也慢慢地加入了新的面向对象的功能组件。用组件代替“现实”上的实体成为 JavaScript(ECMAScript) 得以流行的原因,有论证表明对组件进行适当的组合就可以在英特网上代替 HTML 和 XML 的文档对象模型(DOM)。

设计模式、技术和直觉构成严峻的挑战。这是选择编程语言之前必须认识到的,尽管不同语言的设计特性可能促进或者阻碍这一转化。

  在网络应用的增长中,一个很重要的部分是小型移动设备和特殊Internet设备的爆炸性增长。这些设备各有各的操作系统,或者只在某种特定的设备领域内有共同的操作系统。我们现在还可以一一列举出这些设备——家庭接入设备、蜂窝电话、电子报纸、PDA、自动网络设备等等。但是这些设备领域的数量和深入程度将会很快变得难以估量。我们都知道这个市场大得惊人,PC的兴起与之相比不过小菜一碟。因此在这些设备的应用程序市场上,竞争将会相当残酷。获胜的重要手段之一,就是尽快进入市场。开发人员需要优秀的工具,迅速高效地撰写和调试他们的软件。平台无关性也是制胜秘诀之一,它使得程序员能够开发出支持多种设备平台的软件。

  我预期的另一个变化是,我们对于代码(Java)和数据(XML)协同型应用程序的开发能力将会不断提高。这种协同是开发强大应用程序的核心目标之一。我们从XML的迅速流行和ebXML规范的进展中,已经看到了这个趋势。ebXML是一个针对电子商务和国际贸易的,基于XML的开放式基础构架,由联合国贸易促进和电子商务中心(UN/CEFACT)与结构性信息标准推进组织(OASIS)共同开发。

  我们能否期望出现一个真正的面向组件(component-oriented)的语言?它的创造者会是谁呢?

  Stroustrup: 我怀疑,这个领域中之所以缺乏成果,正是因为人们——主要是那些非程序员们——对“组件”这个意义含糊的字眼寄予了太多的期望。这些人士梦想,有朝一日,组件会以某种方式把程序员赶出历史舞台。以后那些称职的“设计员”只需利用预先调整好的组件,把鼠标拖一拖放一放,就把系统组合出来。对于软件工具厂商来说,这种想法还有另一层意义,他们认为,到时候只有他们才保留有必要的技术,有能力编写这样的组件。

  这种想法有一个最基本的谬误:这种组件很难获得广泛欢迎。一个单独的组件或框架(framework),如果能够满足一个应用程序或者一个产业领域对所提出的大部分要求的话,对于其制造者来说就是划算的产品,而且技术上也不是很困难。可是该产业内的几个竞争者很快就会发现,如果所有人都采用这些组件,那么彼此之间的产品就会变得天下大同,没什么区别,他们将沦为简单的办事员,主要利润都将钻进那些组件/框架供应商的腰包里!

  小“组件”很有用,不过产生不了预期的杠杆效应。中型的、更通用的组件非常有用,但是构造时需要非同寻常的弹性。

  在C++中,我们综合运用不同共享形式的类体系(class hierarchies),以及使用templates精心打造的接口,在这方面取得了一定的进展。我期待在这个领域取得一些有趣和有用的成果,不过我认为这种成果很可能是一种新的C++程序设计风格,而不是一种新的语言。

  Lindholm: 编写面向组件的应用程序,好像更多的是个投资、设计和程序员管理方面的问题,而不是一个编程语言问题。当然某些语言在这方面具有先天优势,不过如果说有什么魔术般的新语言能够大大简化组件的编写难度,那纯粹是一种误导。

  微软已经将全部赌注押在C#上,其他语言何去何从?

  Stroustrup: C++在下一个十年里仍然将是一种主流语言。面对新的挑战,它会奋起应对。一个创造了那么多出色系统的语言,绝不会“坐视落花流水春去也”。

  我希望微软认识到,它在C++(我指的是ISO标准C++)上有着巨大的利益,C++是它与IT世界内其他人之间的一座桥梁,是构造大型系统和嵌入式系统的有效工具,也是满足高性能需求的利器。其他语言,似乎更注重那些四平八稳的商用程序。

  竞争

  C#会不会获得广泛的接受,并且挤掉其他的语言?

  Lindholm: 通常,一种语言既不会从别的语言那里获利,也不会被挤掉。那些坚定的Fortran程序员不还用着Fortran吗?对于个人来说,语言的选择当然因时而异,但就整体而言,语言的种类只会递增,也就是说,它们之间的关系是“有你有我”而不是“有你没我”。

  对于一个新语言的接受程度,往往取决于其能力所及。Java技术被迅速接受,原因是多方面的,Internet和World Wide Web接口,在其他技术面前的挫折感,对于Java技术发展方向的全面影响能力,都是原因。另一个重要的原因是Java独立于厂商,这意味着在兼容产品面前可以从容选择。

  C#是否会获得广泛接受?视情况而定。总的来说,那些对于平台无关性和厂商无关性漠不关心的程序员,可能会喜欢C#。那些跟微软平台捆在一起人当然可能想要寻找VB 和VC的一个出色的替代品。但是对于程序跨平台执行能力特别关注的程序员,将会坚守Java之类的语言。这种能力对于多重访问设备(multiple access devices)和分布式计算模型至关重要,而Java语言提供了一个标准的、独立于厂商运行时环境。

  Stroustrup:C#的流行程度几乎完全取决于微软投入的资金多少。看上去C#的兴起肯定会牺牲掉其他一些语言的利益,但是事实上未必如此。Java的蓬勃发展并没有给C++带来衰败。C++的应用仍然在稳定增长(当然,已经不是爆炸性的增长了)。也许其他的语言也还能获得自己的一席之地。

  不过,我实在看不出有什么必要再发明一种新的专有语言。特别是微软,既生VB,何需C#?

发展 vs. 革新

  (Evolution vs. Revolution)

  C++是一种发展型的语言,Java和C#似乎更像是革新型语言(它们是从头设计的)?什么时候,革新型的语言才是必需的呢?

  Lindholm: Java技术并非凭空出世,反而更像是发展型的。Java所有的特性,在Java平台推出之前,都至少已经存在于另一种环境之中。Java的贡献在于,在众多的特性和权衡中,做出了合理的选择,使得产品既实用,又优雅。Java技术对于程序员的态度是:抚养,但不溺爱。

  Stroustrup:从技术上讲,我并不认为Java和C#是什么“从头设计的”革新型语言。倘若Java是从技术原则出发,从头设计,大概就不会模仿C/C++那种丑陋和病态的语法了(不必惊讶,Stroustrup在很多场合表示过,C++采用C的语法形式,实在是迫于兼容性。他本人更偏爱Simula的语法——译者)。

  我认为,只有当程序员们面对的问题发生了根本的变化的时候,或者当我们发现了全新的、极其优越的程序设计技术,又完全不能为现存语言所支持的时候,我们才需要全新的语言。问题是,我们恐怕永远也碰不到那些“根本”、“全新”的情况。

  我以为,自从OOP问世以来,可称为“根本”的新型程序设计技术,唯有泛型程序设计(generic programming)和生成式程序设计(generative programming)技术,这两项技术主要是源于C++ templates技术的运用,也有一部分曾经被视为面向对象和函数式语言(functional languages)的次要成分,现在都变成正式、可用和可承受的技术了。我对于目前C++模板(template)程序设计的成果非常兴奋。例如,像POOMA, Blitz++和MTL等程序库,在很多地方改变了数值计算的方式。

  C#的一个“卖点”,就是它们的简单性。现在Java是不是快失去这个卖点了?

  Stroustrup:新语言总是宣称自己如何如何简单,对老语言的复杂性颇多非议。其实这种所谓的“简单性”,简单地说,就是不成熟性。语言的复杂性,是在解决现实世界中极为烦琐和特殊的复杂问题的过程中逐渐增加的。一个语言只要活的时间够长,总会有某些地方逐渐复杂起来,或者是语言本身,或者是程序库和工具。C++和Java显然都不例外,我看C#也一样。如果一种语言能够度过自己的幼年时代,它会发现,自己无论是体积还是复杂性都大大增加了。

  Lindholm:Java技术的的功能在增加,需要学习的东西也在增加。不过功能的增加并不一定带来复杂性的增加。Java技术的发展,并没有使学习曲线更加陡峭,只是让它继续向右方延展了。

  标准

  标准化语言和开放型语言各自的优点和缺点何在?

  Lindholm:对于一个开放、不允许专有扩展、具有权威的强制性标准语言或者运行环境来说,不存在什么缺点。允许专有扩展就意味着允许厂商下套子绑架客户。特别重要的是,必须让整个平台,而不只是其中一部分完全标准化,才能杜绝厂商们利用高层次的专有API下套子。客户要求有选择厂商的自由,他们既要有创造性,又需要兼容性。

  Stroustrup:对于一个语言,如C/C++来说,建立正式标准(如ISO标准)最大的好处,在于可以防止某一个厂商操纵这种语言,把它当成自己的摇钱树。多个厂商的竞争给用户带来的是较低的价位和较好的稳定性。

  专有语言的好处,一是流行,二是便宜(不过等你被套牢了之后,情况就会起变化),三是对于商业性需求可以做出快速的反应。

  标准化语言的特点之一是,它不能忽略特殊用户的需求。比如我在AT&T中所考虑的东西,其规模、可靠性和效率要求,跟那些普通厂商关注的大众软件相比,根本不可同日而语。那些公司很自然只关注主要的需求。

  然而,多数大机构和身处前沿的公司,都有着特殊的需求。C++的设计是开放、灵活和高效的,能够满足我所能想象的任何需求。跟其他的现代语言相比,C++的家长式作风可谓少之又少,原因就在这。当然,不能赞赏这一点的人会诟病C++的“危险”。

  拥有正式和开放标准的语言主要是为编程工具的使用者和客户服务的,而拥有专属“标准”的语言,主要是为厂商服务的
转自

复习面向对象的OOA、OOD、OOP

发表于 2016-11-16

mysqlExplain解析

发表于 2016-11-07

EXPLAIN列的解释

  • table

    显示这一行的数据是关于哪张表的

  • type

    这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL(后面有详细说明)
    possible_keys
    显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

  • key
    实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
  • key_len
    使用的索引的长度。在不损失精确性的情况下,长度越短越好
  • ref
    显示索引的哪一列被使用了,如果可能的话,是一个常数
  • rows
    MYSQL认为必须检查的用来返回请求数据的行数
  • Extra
    关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢
    extra列返回的描述的意义:

  Distinct
一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
  Not exists
MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
  Range checked for each
  Record(index map:#)
没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
  Using filesort
看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行
  Using index
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
  Using temporary
看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上
  Where used
使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题

不同连接类型的解释(按照效率高低的顺序排序)
  system
表只有一行:system表。这是const连接类型的特殊情况
  const
表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
  eq_ref
在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
  ref
这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
  range
这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况
  index
这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)
  ALL
这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

轮询与心跳机制

发表于 2016-11-03   |   分类于 架构

在很多的平台应用中,都有这样的需求,平台内包括多个子系统或者属于其管控范围内的其他平台,需要对这些系统进行统一的监控,来查看当前的运行状态或者其他运行信息,我们的应用也有这样的一个情况,需要再外网服务端(平台)上监控,其下运行的多个内网服务端的网络状况,查阅了写资料后确立了2种可实现的方式。
简单的说就是服务端需要实时了解其下运行的客户端的情况。

  1. 轮询机制

    轮询:概括来说是服务端定时主动的去与要监控状态的客户端(或者叫其他系统)通信,询问当前的某种状态,客户端返回状态信息,客户端没有返回或返回错误、失效信息、则认为客户端已经宕机,然后服务端自己内部把这个客户端的状态保存下来(宕机或者其他),如果客户端正常,那么返回正常状态,如果客户端宕机或者返回的是定义的失效状态那么当前的客户端状态是能够及时的监控到的,如果客户端宕机之后重启了那么当服务端定时来轮询的时候,还是可以正常的获取返回信息,把其状态重新更新。

  1. 心跳

    心跳:最终得到的结果是与轮询一样的但是实现的方式有差别,心跳不是服务端主动去发信息检测客户端状态,而是在服务端保存下来所有客户端的状态信息,然后等待客户端定时来访问服务端,更新自己的当前状态,如果客户端超过指定的时间没有来更新状态,则认为客户端已经宕机或者其状态异常。

心跳机制详解

docker学习笔记

发表于 2016-11-02   |   分类于 docker

###简介

容器与管理程序虚拟化有所不同,管理程序虚拟化通过中间层将一台或多台独立的机器虚拟运行于物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。
由于客居于操作系统,容器智能运行与底层宿主机相同或相似的操作系统。

###docker组件

  • Docker客户端和服务端

    docker是C/S架构的程序

  • Docker镜像

    镜像相当于容器的”源代码”。体积小,易于分享,存储和跟新。

  • Registry

    docker用registry来保存用户构建的镜像。类似gitHub,docker仓库是docker hub.

  • Docker容器

    包含了:

    • 一个镜像格式
    • 一系列标注操作
    • 一个执行环境

###docker能做什么

  • 加速本地开发和构建流程,使其更加高效,更加轻量化。
  • 能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。
  • 用docker创建隔离的环境来进行测试。
  • 构建一个多用户的平台Pass
  • 高性能、超大规模的宿主机部署
  • ……

docker相关命令

docker rmi $(docker images –filter dangling=true -q)
执行这条命令删除pull过程或者create过程产生的临时镜像,剩下的都是有用的镜像。镜像是一层层叠加起来的,你使用的是带名字和tag的发布镜像,那些中间镜像没有名字,只有哈希,所以叫none。。

docker run -it –name hahah ubuntu /bin/bash

查找本地是否存在ubuntu:latest镜像
存在就启动

不存在就从docker hub查找镜像下载保存到本地

使用ubuntu镜像创建一个容器

–name 指定容器别名

-d 将容器放到后台运行

docker rm 删除容器

删除所有容器

docker rm `docker ps -a -q`

docker start 启动容器

docker restart 重启容器

docker stop $name 停止容器

docker attach 进入容器会话

docker logs 获取守护容器的日志

docker logs -f 跟踪守护式容器的日志

  • 查看当前系统中的容器列表

    docker ps -a

  • 查看容器内的进程

    docker top $name

  • 在容器内部运行进程

    • 在容器中运行后台任务

      docker exec -d $name touch /etc/new_config_file

      -d 表叔运行一个后台进程

    • 在容器内运行交互命令

      docker exec -i -t $name /bin/bash

      -i -t 创建tty并捕捉STDIN

  • 自动重启容器

    docker run --restart=always --name $name -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

    –restart=on-failure

    –restart=on-failure:3

  • 深入容器,对容器进行详细的检查返回其配置信息

    docker inspect $name

###构建镜像

####查找镜像
docker search ubuntu

####构建镜像

  • docker commit 命令
  • docker build命令和Dockerfile文件

#####docke commit

  1. 进入一个基础容器
  2. 修改容器内容
  3. docker commit
    docker commit -m '提交信息' --authon="justudy" $name justudy/nginx:webserver

    justudy/nginx指定了镜像的用户名和仓库名,并增加了一个webserver标签

    可以使用 docker inspect justudy/nginx:webserver 查看镜像信息。

#####用Dockerfile构建镜像

Dockerfile使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令构建一个新的镜像

大致流程:

  1. docker从基础镜像运行一个容器
  2. 执行一条指令,对容器做出修改
  3. 执行类型docker commit 的操作,提交一个新的镜像层
  4. docker在基于刚提交的镜像运行一个新容器
  5. 执行dockerfile的下一条指令,知道所有指令都执行完毕

编写好Dockerfile
执行dockerbuild

  1. 构建镜像时设置标签

    docker build -t ‘justudy/demo:v1’ .

  2. 从git仓库构建docker镜像

    docker build -t ‘justudy/demo:v1’ git@github.com:justudy/demo

####Dockerfile指令

  1. CMD

    CMD指令用于指定一个容器启动时要运行的命令
    CMD ["/bin/bash", "-1"]
    在Dockerfile中只能指定一条CMD命令

  2. ENTRYPOINT

    ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

    docker run 后面带的命令会作为参数传递给ENTRYPOINT

  3. WORKDIR

    从镜像创建一个新容器时,在容器内部设置一个工作目录。CMD和ENTRYPOINT指定的程序会在这个目录下执行。

    1
    2
    3
    4
    WORKDIR /opt/webapp/db
    RUN bundle install
    WORKDIR /opt/webapp
    ENTRYPOINT ["rackup"]
docker run -w  可指定工作目录
  1. ENV

    ENV指令用来在镜像构建过程中设置环境变量
    ENV RVM_PATH /HOME/RVM

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    ENV TARGET_DIR /opt/app
    WORKDIR $TARGET_DIR
    ```
    docker run -e "TARGET_DIR=/opt/app" -e传递环境变量
    5. USER
    USER指定用来指定该镜像以什么样的用户去执行
    `USER nginx`
    docker run -u 命令指定用户
    6. VOLUME
    用来向基于镜像创建的容器添加卷,一个卷式可以存在于一个或者多个容器内的特定目录。
    `VOLUME ["/opt/project"]`
    7. ADD
    用来讲构建环境下的文件和目录复制到镜像中
    `ADD _linux/var/spool/cron/crontabs/root /var/spool/cron/crontabs/root`
    8. COPY
    COPY不会提取解压文件
    `COPY ./composer.json /app/`
    9. ONBUILD
    为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,该镜像的触发器将会执行

ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src && make
```

####讲镜像推送到Docker Hub

镜像构建完毕,将他上传到docker hub。
docker push youruser/yourimage

编码规范整理

发表于 2016-10-31   |   分类于 Python

最近学习python,由于python的语法十分精简,利用业余时间,争取更深入学习Python。编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的。所以根据PEP 8整理了一份。

PEP8 Python 编码规范

一 代码编排
1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。

二 文档编排
1 模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
2 不要在一句import中多个库,比如import os, sys不推荐。
3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。

三 空格的使用
总体原则,避免不必要的空格。
1 各种右括号前不要加空格。
2 逗号、冒号、分号前不要加空格。
3 函数的左括号前不要加空格。如Func(1)。
4 序列的左括号前不要加空格。如list[2]。
5 操作符左右各加一个空格,不要为了对齐增加空格。
6 函数默认参数使用的赋值符左右省略空格。
7 不要将多句语句写在同一行,尽管使用‘;’允许。
8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。

四 注释
总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。
1 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。比如:

# Description : Module config.
# 
# Input : None
#
# Output : None

2 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x
但是这种方式尽量少使用。
3 避免无谓的注释。

五 文档描述
1 为所有的共有模块、函数、类、方法写docstrings;非共有的没有必要,但是可以写注释(在def的下一行)。
2 如果docstring要换行,参考如下例子,详见PEP 257
“””Return a foobang

Optional plotz says to frobnicate the bizbaz first.

“””

六 命名规范
总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格。
1 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。
2 模块命名尽量短小,使用全部小写的方式,可以使用下划线。
3 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
4 类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。
5 异常命名使用CapWords+Error后缀的方式。
6 全局变量尽量只在模块内有效,类似C语言中的static。实现方法有两种,一是all机制;二是前缀一个下划线。
7 函数命名使用全部小写的方式,可以使用下划线。
8 常量命名使用全部大写的方式,可以使用下划线。
9 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。
9 类的属性有3种作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public属性前,前缀一条下划线。
11 类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。
12 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。比如:类Foo中声明a,访问时,只能通过Foo._Fooa,避免歧义。如果子类也叫Foo,那就无能为力了。
13 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。

七 编码建议
1 编码中考虑到其他python实现的效率等问题,比如运算符‘+’在CPython(Python)中效率很高,都是Jython中却非常低,所以应该采用.join()的方式。
2 尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x。
3 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception。
4 异常中不要使用裸露的except,except后跟具体的exceptions。
5 异常中try的代码尽可能少。比如:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
要优于
try:

# Too broad!

return handle_value(collection[key])
except KeyError:

# Will also catch KeyError raised by handle_value()

return key_not_found(key)
6 使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如:
Yes: if foo.startswith(‘bar’):优于
No: if foo[:3] == ‘bar’:
7 使用isinstance()比较对象的类型。比如
Yes: if isinstance(obj, int): 优于
No: if type(obj) is type(1):
8 判断序列空或不空,有如下规则
Yes: if not seq:
if seq:
优于
No: if len(seq)
if not len(seq)
9 字符串不要以空格收尾。
10 二进制数据判断使用 if boolvalue的方式。

golang学习笔记

发表于 2016-10-25
  • 变量必须预先申明定义,变量会在声明时直接初始化。如果变量没有显式初始化,则被隐式地赋予其类型的零值(zero value),数值类型是0,字符串类型是空字符串””。申明了变量就必须引用
  • Go语言只有for循环这一种循环语句

    1. 普通的循环

      1
      2
      3
      for initialization; condition; post {
      // zero or more statements
      }
2. 类似while的循环

    
1
2
3
4
// a traditional "while" loop
for condition {
// ...
}
3. 死循环
1
2
3
4
// a traditional infinite loop
for {
// ...
}
4. for循环的另一种形式, 在某种数据类型的区间(range)上遍历,如字符串或切片
1
2
3
4
for _, arg := range os.Args[1:] {
s += sep + arg
sep = " "
}
每次循环迭代,range产生一对值;索引以及在该索引处的元素值。这个例子不需要索引,但range的语法要求, 要处理元素, 必须处理索引。
  • 变量申明

    1
    2
    3
    4
    s := ""
    var s string
    var s = ""
    var s string = ""
  • 25个关键字

    break default func interface select
    case defer go map struct
    chan else goto package switch
    const fallthrough if range type
    continue for import return var

  • 预定义名称

    内建常量: true false iota nil

    内建类型: int int8 int16 int32 int64

    uint uint8 uint16 uint32 uint64 uintptr
    float32 float64 complex128 complex64
    bool byte rune string error
    

    内建函数: make len cap new append copy close delete

    complex real imag
    panic recover
    
  • Go语言主要有四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明

  • 变量申明

    var 变量名字 类型 = 表达式

如果用“var x int”声明语句声明一个x变量,那么&x表达式(取x变量的内存地址)将产生一个指向该整数变量的指针,指针对应的数据类型是int,指针被称之为“指向int类型的指针”。如果指针名字为p,那么可以说“p指针指向变量x”,或者说“p指针保存了x变量的内存地址”。同时p表达式对应p指针指向的变量的值。一般p表达式读取指针指向的变量的值,这里为int类型的值,同时因为p对应一个变量,所以该表达式也可以出现在赋值语句的左边,表示更新指针所指向的变量的值。

  • 常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一

  • r := […]int{99: -1}
    定义了一个含有100个元素的数组r,最后一个元素被初始化为-1,其它元素都是用0初始化。+

国外程序员收集整理的PHP资源大全

发表于 2016-10-14   |   分类于 PHP

ziadoz在 Github发起维护的一个PHP资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、Web 工具、书籍、电子书、经典博文等等。伯乐在线对该资源列表进行了翻译,译文如下:

依赖管理

依赖和包管理库

Composer/ Packagist:一个包和依赖管理器
Composer Installers:一个多框架Composer库安装器
Pickle:一个PHP扩展安装器
其他的依赖管理
其他的相关依赖管理

Satis:一个静态Composer存储库生成器
Composition:一个在运行时检查Composer环境的库
Version:语义版本的解析和比较库
NameSpacer-转化下划线到命名空间的库
Patch Installer-使用Composer安装补丁的库
Composer Checker-校验Composer配置的工具
框架

Web开发框架

Symfony2-一个独立组件组成的框架
Zend Framework 2-另一个由独立组件组成的框架
Laravel 4-另一个PHP框架
Aura PHP-独立组件的框架
Yii2- 另一个PHP框架
Nette- 另一个由个体组件组成的框架
PPI Framework 2-一个互操作性框架
Phalcon-通过C扩展实现的框架
其他框架

其他Web开发框架

Symfony CMF- 创建自定义CMS的内容管理框架
Knp RAD Bundle-Symfony 2的快速应用程序(RAD)包
框架组件

来自Web开发框架的独立组件

Symfony2 Components-Symfony2组件
Zend Framework 2 Components-ZF2组件
Aura Components-PHP5.4组件包
Hoa Project-另一个PHP组件包
微型框架

微型框架和路由

Silex- 基于Symfony2组件的微型框架
Slim- 另一个简单的微型框架
Bullet PHP-用于构建REST APIs的微型框架
Fast Route- 快速路由库
Pux-另一个快速路由库
其他微型框架

其他相关的微型框架和路由

Silex Skeleton-Silex的项目架构
Silex Web Profiler-Silex web调试工具条
Stack- Silex/Symfony的可堆叠中间件库
Slim Skeleton-Slim架构
Slim View-Slim的自定义视图集合
Slim Middleware-Slim的自定义中间件集合
模板

模板化和词法分析的库和工具

Twig-一个全面的模板语言
Twig Cache Extension-一个用于Twig的模板片段缓存库
Mustache-一个Mustache模板语言的PHP实现
Phly Mustache-另一个Mustache模板语言的PHP实现
MtHaml- 一个HAML 模板语言的PHP实现
PHPTAL-一个 TAL模板语言的PHP实现
Plates-一个原生PHP模板库
Lex-一个轻量级模板解析器
静态站点生成器

预处理工具来生成Web页面的内容

Sculpin-转换Markdown和Twig为静态HTML的工具
Phrozn- 另一个转换Textile,Markdown和Twig为HTML的工具
HTTP

用于HTTP和网站爬取的库

Guzzle-一个全面的HTTP客户端
Buzz-另一个HTTP客户端
Requests-一个简单的HTTP库
HTTPFul-一个链式HTTP库
Goutte-一个简单的web爬取器
PHP VCR-录制和重放HTTP请求的库
URL

解析URL的库

Purl-一个URL处理库
PHP Domain Parser-一个本地前缀解析库
Email

发送和解析邮件的库

SwiftMailer- 一个邮件解决方案
PHPMailer- 另一个邮件解决方案
Fetch-一个IMAP库
Email Reply Parser-一个邮件回复解析库
Stampie-邮件服务库,不如 SendGrid, PostMark, MailGun和 Mandrill.
CssToInlineStyles-一个在邮件模板内联CSS的库
文件

文件处理和MIME类型检测库

Gaufrette-一个文件系统抽象层
Flysystem- 另一个文件系统抽象层
Canal-一个检测互联网媒体类型的库
Apache MIME Types-一个解析Apache MIME类型的库
Ferret- 一个MIME检测库
Hoa Mime-另一个MIME检测库
Lurker-一个资源跟踪库
PHP File Locator-一个在大型项目定位文件的库
PHP FFmpeg-一个用于 FFmpeg视频包装的库.
CSV- 一个CSV数据处理库
Streams 流

处理流的库

Streamer- 一个面向对象的流包装库
Dependency Injection依赖注入

实现依赖注入设计模式的库

Pimple- 一个小的依赖注入容器
Auryn- 另一个依赖注入容器
Orno Di-另一个可伸缩的依赖注入容器
PHP DI-一个使用注释实现的依赖注入
Acclimate-一个依赖注入容器和服务定位的通用接口
Imagery 图像

处理图像的库

Imagine-一个图像处理库
PHP Image Workshop-另一个图像处理库
Intervention Image-另一个图像处理库
GIF Frame Extractor-一个提取GIF动画帧信息的库
GIF Creator- 一个通过多张图片创建GIF动画的库
Image With Text-一个在图像中嵌入文本的库
Color Extractor-一个从图像中提取颜色的库
Testing 测试

测试代码和生成测试数据的库

PHPUnit-一个单元测试框架
DBUnit-PHPUnit的数据库测试库
ParaTest- PHPUnit的并行测试库
PHPSpec-基于功能点设计的单元测试库
Codeception-一个全栈测试框架
AspectMock- PHPUnit/ Codeception 模拟框架。
Atoum-一个简单的测试库
Mockery-一个用测试的模拟对象库
Phake-另一个用测试的模拟对象库
Prophecy-一个可选度很高的模拟框架
Faker-一个伪数据生成库
Samsui- 另一个伪数据生成库
Alice-富有表现力的一代库
Behat-一个行为驱动开发(BDD)测试框架
Pho-一个行为驱动开发测试框架
Mink-Web验收测试
HTTP Mock- 一个在单元测试模拟HTTP请求的库
VFS Stream-一个用于测试的虚拟文件系统流的包装器
VFS-另一个用于测试虚拟文件系统
Locust-一个用Python编写的现代加载测试库
Continuous Integration 持续集成

持续集成的库和应用

Travis CI- 一个持续集成平台
PHPCI-一个PHP的开源持续集成平台
Sismo- 一个持续测试服务库
Jenkins一个 PHP 支持的持续集成平台
JoliCi- 一个用PHP编写的由Docker支持的持续集成客户端
Documentation 文档

生成项目文档的库

Sami-一个API文档生成器
APIGen-另一个API文档生成器
PHP Documentor 2-一个API文档生成器
phpDox- 一个PHP项目的文档生成器(不限于API文档)
Security 安全

生成安全的随机数,加密数据,扫描漏洞的库

HTML Purifier-一个兼容标准的HTML过滤器
RandomLib-一个生成随机数和字符串的库
True Random-使用 www.random.org生成随机数的库
SecurityMultiTool-一个PHP安全库
PHPSecLib-一个纯PHP安全通信库
TCrypto-一个简单的键值加密存储库
PHP IDS- 一个结构化的PHP安全层
PHP SSH-一个试验的面向对象的SSH包装库
IniScan-一个扫描PHP INI文件安全的库
SensioLabs Security Check-一个为检查Composer依赖提供安全建议的web工具
Zed- 一个集成的web应用渗透测试工具
Passwords 密码

处理和存储密码的库和工具

Password Compat-一个新的PHP5.5密码函数的兼容库
phpass- 一个便携式的密码哈希框架
PHP Password Lib-一个生成和校验密码的库
Password Policy- 一个PHP和JavaScript的密码策略库
Password Validator- 校验和升级密码哈希的库
Zxcvbn PHP-一个基于Zxcvbn JS的现实的PHP密码强度估计库
Code Analysis 代码分析

分析,解析和处理代码库的库的工具

PHP Parser-一个PHP编写的PHP解析器
PHPPHP- 一个PHP实现的PHP虚拟机
PHPSandbox-一个PHP沙盒环境
Dissect-一个词法和语法分析的工具集合
PHP Mess Detector-一个扫描代码缺陷,次优代码,未使用的参数等等的库。
PHP Code Sniffer-一个检测PHP、CSS和JS代码标准冲突的库
PHPCPD- 一个检测复制和粘贴代码的库
PHP Analyser-一个分析PHP代码查找缺陷和错误的库
PHP CS Fixer- 一个编码标准库
PHP Manipulator-一个分析和修改PHP源代码的库
PHP Metrics-一个静态测量库
PHP Refactoring Browser-一个重构PHP代码的命令行工具集
UBench- 一个简单的微型基准检测库
Athletic-一个基于注释的基准检测库
Mondrian- 使用使用图论的代码分析工具
Scrutinizer-一个审查PHP代码的web工具
PHPLOC-一个快速测量PHP项目大小的工具
xHprof-另一个PHP分析工具
PHPCheckstyle-一个帮助遵守特定的编码惯例的工具。
Debugging 调试

调试代码的库和工具

xDebug-一个调试和分析PHP的工具
PHP Debug Bar- 一个调试工具栏
PHP Console-一个web调试控制台
Barbushin PHP Console-另一个使用Google Chrome的web调试控制台
PHPDBG- 一个交互的PHP调试器
Tracy-一个简单的错误检测,写日志和时间测量库
Build Tools 构建工具

项目构建和自动化工具

Go-一个简单的PHP构建工具
Bob- 一个简单的项目自动化工具
Phake-一个PHP克隆库
Box- 一个构建PHAR文件的工具
Phing-一个灵感来自于Apache Ant的PHP项目构建系统
Task Runners 任务运行器

自动运行任务的库

Task-一个灵感来源于Grunt和Gulp的纯PHP任务运行器
Robo-一个面向对象配置的PHP任务运行器
Bldr-一个构建在Symfony组件上的PHP任务运行器
Navigation导航

构建导航结构的工具

KnpMenu- 一个菜单库
Cartographer-一个站点地图生成库
Asset Management 资源管理

管理,压缩和最小化web站点资源的工具

Assetic- 一个资源管理的管道库
Pipe-另一个资源管理的管道库
Munee-一个资源优化库
JShrink-一个JavaScript最小化库
Puli- 一个检测资源绝对路径的库
Geolocation 地理位置

为地理编码地址和使用纬度经度的库

GeoCoder-一个地理编码库
GeoTools-一个地理工具相关的库
PHPGeo-一个简单的地理库
GeoJSON-一个地理JSON的实现
Date and Time 日期和时间

处理日期和时间的库

Carbon- 一个简单的日期时间API扩展
ExpressiveDate-另一个日期时间API扩展
CalendR- 一个日历管理库
Event 事件

时间驱动或非阻塞事件循环实现的库

React-一个事件驱动的非阻塞I/O库
Rx.PHP- 一个reactive扩展库
Ratchet- 一个web套接字库
Hoa WebSocket-另一个web套接字库
Hoa EventSource-一个事件源库
Evenement-一个事件分发库
FuelPHP Event-另一个事件分发库
Logging 日志

生成和处理日志文件的库

Monolog- 一个全面的日志工具
KLogger-一个易用的PSR-3兼容的日志类
E-commerce 电子商务

处理支付和构建在线电子商务商店的库和应用

OmniPay-一个框架混合了多网关支付处理的库
Payum- 一个支付抽象库
Sylius- 一个开源的电子商务解决方案
Thelia-另一个开源的电子商务解决方案
Money- 一个Fowler金钱模式的PHP实现
Sebastian Money-另一个处理货币值的库
Swap-一个汇率库
PDF

处理PDF文件的库和软件

Snappy-一个PDF和图像生成器库
WKHTMLToPDF-一个将HTML转换为PDF的工具
Database 数据库

使用对象关系映射(ORM)或数据映射技术的数据库交互库

Doctrine-一个全面的DBAL和ORM
Doctrine Extensions-一个Doctrine行为扩展的集合
Propel- 一个快速的ORM,迁移库和查询构架器
Eloquent-Laravel 4 ORM
Baum-一个Eloquent的嵌套集实现
Spot2-一个MySQL的ORM映射器
RedBean-一个轻量级,低配置的ORM
Pomm-一个PostgreSQL对象模型管理器
ProxyManager-一个为数据映射生成代理对象的工具集
Migrations 迁移

帮助管理数据库模式和迁移的库

PHPMig-另一个迁移管理库
Phinx- 另一个数据库迁移管理库
Migrations-一个迁移管理库
Doctrine Migrations-一个Doctrine迁移库
NoSQL

处理NoSQL后端的库

MongoQB-一个MongoDB查询构建库
Monga-一个MongoDB抽象库
Predis- 一个功能完整的Redis库
Queue 队列

处理事件和任务队列的库

Pheanstalk-一个Beanstalkd 客户端库
PHP AMQP-一个纯PHP AMQP库
Thumper- 一个RabbitMQ模式库
Bernard-一个多后端抽象库
Search 搜索

在数据上索引和执行查询的库和软件

ElasticSearch PHP-ElasticSearch的官方客户端库
Elastica-ElasticSearch的客户端库
Solarium-Solr的客户端库
SphinxQL query builder-Sphinx搜索引擎的的查询库
Command Line 命令行

构建命令行工具的库

Boris- 一个微型PHP REPL
PsySH- 另一个微型PHP REPL
Pecan-一个事件驱动和非阻塞内核
GetOpt- 一个命令行选择解析器
OptParse-另一个命令行选择解析器
Commando-另一个简单的命令行选择解析器
GetOptionKit-另一个命令行选择解析器
Cron Expression-计算cron运行日期的库
ShellWrap-一个简单的命令行包装库
Hoa Console-另一个命令行库
Shunt- 一个在多台远程机器上并行运行命令行的库
Cilex-一个构建命令行工具的微型框架
Authentication 身份验证

实现身份验证的库

Sentry-一个混合的身份验证和授权的框架库
Sentry Social-一个社交网络身份验证库
Opauth-一个多渠道的身份验证框架
OAuth2-一个OAuth2身份验证服务,资源服务器和客户端库
OAuth2 Server-另一个OAuth2服务器实现
PHP oAuthLib-另一个OAuth库
TwitterOAuth-一个Twitter OAuth库
TwitterSDK-一个完全测试的Twitter SDK
Hawk-一个Hawk HTTP身份认证库
HybridAuth-一个开源的社交登陆库
Markup 标记

处理标记的库

Decoda-一个轻量级标记解析库
PHP Markdown-一个Markdown解析器
CommonMark PHP-一个对 CommonMark spec全支持的Markdown解析器
Dflydev Markdown-另一个Markdown解析器
Parsedown-另一个Markdown解析器
Ciconia- 另一个支持Github Markdown风格的Markdown解析器
Cebe Markdown-一个快速的可扩展的Markdown解析器
HTML5 PHP- 一个HTML5解析和序列化库
Strings 字符串

解析和处理字符串的库

ANSI to HTML5-ANSI到HTML5的转化库
Patchwork UTF-8-一个处理UTF-8字符串的便携库
Hoa String-另一个UTF-8字符串库
Stringy-一个多字节支持的字符串处理库
Color Jizz-处理和转换颜色的库
UUID- 生成UUIDs的库
Slugify-转换字符串到slug的库
Urlify- 一个Django的 URLify.jsPHP通道
Text- 一个文本处理库
SQL Formatter-一个格式化SQL语句的库
UA Parser- 一个解析用户代理字符串的库
Numbers 数字

处理数字的库

Numbers PHP-处理数字的库
Math-处理大数字的库
ByteUnits- 在二进制和度量系统中解析,格式化和转换字节单元的库
PHP Units of Measure-一个计量单位转换的库
PHP Conversion- 另一个计量单位转换的库
LibPhoneNumber for PHP-Google电话号码处理的PHP实现库
Filtering and Validation 过滤和验证

过滤和验证数据的库

Filterus- 一个简单的PHP过滤库
Respect Validate-一个简单的验证库
Valitron-另一个验证库
Upload- 一个处理文件上传和验证的库
DMS Filter- 一个注释过滤库
MetaYaml-一个支持YAML,JSON和XML的模式验证库
ISO-codes-验证各种ISO和ZIP编码的库(IBAN, SWIFT/BIC, BBAN, VAT, SSN, UKNIN)
REST和API

开发REST-ful API的库和web工具

Apigility-一个使用Zend Framework 2构建的API构建器
Hateoas-一个HOATEOAS REST web服务库
HAL-一个超文本应用语言(HAL)构建库
Negotiation-一个内容协商库
Drest-一个将Doctrine实体暴露为REST资源节点的库
Restler-一个将PHP方法暴露为RESTful web API的轻量级框架
Caching 缓存

缓存数据的库

Alternative PHP Cache (APC)- 打开PHP伪代码缓存
Cache-一个缓存库(Doctrine部分)
Stash-另一个缓存库
数据结构和存储

实现数据结构和存储技术的库

Ardent-一个数据结构库
PHP Collections- 一个简单的集合库
Serializer-一个序列化和反序列化数据的库
PHP Object Storage-一个对象存储库
Fractal-一个转换复杂数据结构到JSON输出的库
Totem-一个管理和穿件数据交换集的库
PINQ-一个PHP实时Linq库
JsonMapper-一个将内嵌JSON结构映射为PHP类的库
Notifications 通知

处理通知软件的库

Nod-一个通知库(Growl等)
Notificato- 一个处理推送通知的库
Notification Pusher-一个设备推送通知的独立库
Notificator-一个轻量级的通知库
Deployment 部署

项目部署库

Pomander-一个PHP应用部署工具
Rocketeer-PHP世界里的一个快速简单的部署器
Envoy-一个用PHP运行SSH任务的工具
Plum- 一个部署库
国际化和本地化

国际化(I18n)和本地化(L10n)

Aura.Intl
第三方API

访问第三方API的库

Amazon Web Service SDK- PHP AWS SDK官方库
S3 Stream Wrapper-Amazon S3流包装库
Stripe-Stripe官方PHP库
Campaign Monitor-Campaign Monitor官方PHP库
Digital Ocean-Digital Ocean API 接口库
Github- Github API交互库
PHP Github API-另一个Github API交互库
Twitter OAuth-Twitter OAuth工作流交互库
Twitter REST- Twitter REST API交互库
Dropbox SDK- The official PHP Dropbox SDK library.
Dropbox SDK- Dropbox SDK官方PHP库
Twilio- The official Twilio PHP REST API.
Twilio- Twilio官方PHP REST API
MailgunThe official Mailgun PHP API.
MailgunMailgun官方PHP REST API
Extensions 扩展

帮组构建PHP扩展的库

Zephir-用于开发PHP扩展,且介于PHP和C++之间的编译语言
PHP CPP-一个开发PHP扩展的C++库
Miscellaneous 杂项

不在上面分类中的有用库和工具

Spork-一个处理forking的库
JSON Lint- 一个JSON lint工具
JSONPCallbackValidator-验证JSONP回调的库
Pagerfanta-一个分页库
Ruler- 一个简单的无状态的生产环境规则引擎。
LiteCQRS-一个CQRS(命令查询责任分离)库
Sslurp- 一个使得SSL处理减少的库
PHP Option一个可选的类型库
Metrics-一个简单的度量API库
Sabre VObject- 一个解析VCard和iCalendar对象的库
Annotations-一个注释库(Doctrine部分)
Whoops-一个不错的错误处理库
Finite-一个简单的PHP有限状态机
LadyBug-一个dumper库
Procrastinator-运行耗时任务的库
Compose-一个功能组合库
SuperClosure-一个允许闭包序列化的库
Jumper- 一个远程服务执行库
Underscore-一个Undersccore JS库的PHP实现
PHP PassBook-一个iOS PassBook PHP库
PHP Expression-一个PHP表达式语言
RMT- 一个编写版本和发布软件的库
Wise- 一个配置管理器
Opengraph-一个开放图库
Essence-一个提取web媒体的库
Embera-一个Oembed消费库
Graphviz-一个图形库
Monad PHP一个简单Monad库
Flux-一个正则表达式构建库
Patchwork- 一个重新定义用户的函数库
Galapagos-语言转换进化
Design Patterns PHP-一个使用PHP实现的设计模式存储库
PHPCR- 一个Java内容存储库(JCR)的PHP实现
Functional PHP- 一个函数式编程库
ClassPreloader- 一个优化自动加载的库
Lib Country-一个国家和地区数据的库
Lib Accessor-一个简化访问的库
PHPStack-一个PHP编写的TCP/IP栈概念
Nmap-一个Nmap PHP包装器
Code Mover-一个移动代码的库
Iter-一个使用生成器提供迭代原语的库
Lambda PHP-一个PHP中的Lambda 计算解析器
Country List- 所有带有名称和ISO 3166-1编码的国家列表
PHP-GPIO- 用于Raspberry PI的GPIO pin的库
print_o- 一个对象图的可视化器
Alias-一个类别名库
Software 软件

创建一个开发环境的软件

PHP安装

在你的电脑上帮助安装和管理PHP的工具

HomeBrew-一个OSX包管理器
HomeBrew PHP-一个HomeBrew的PHP通道
PHP OSX- 一个OSX下的PHP安装器
PHP Brew-一个PHP版本管理和安装器
PHP Env- 另一个PHP版本管理器
PHP Switch- 另一个PHP版本管理器
PHP Build- 另一个PHP版本安装器
VirtPHP- 一个创建和管理独立PHP环境的工具
Development Environment 开发环境

创建沙盒开发环境的软件和工具

Vagrant-一个便携的开发环境工具
Ansible- 一个非常简单的编制框架
Puppet-一个服务器自动化框架和应用
PuPHPet-一个构建PHP开发虚拟机的web工具
Protobox-另一个构建PHP开发虚拟机的web工具
Phansible- 一个用Ansible构建PHP开发虚拟机的web工具
Virtual Machines 虚拟机

相关的PHP虚拟机

HipHop PHP-Facebook出品的PHP虚拟机,运行时和JIT
HippyVM-另一个PHP虚拟机
Hack- 一个PHP进行无缝操作的 HHVM编程语言
IDE 集成开发环境

支持PHP的集成开发环境

Netbeans-一个支持PHP和HTML5的IDE
Eclipse for PHP Developers-一个基于Eclipse平台的PHP IDE
PhpStorm-一个商业PHP IDE
Web Applications Web应用

基于Web的应用和工具

3V4L一个在线的PHP shell
DBV-一个数据库版本控制应用
PHP Queue-一个管理后端队列的应用
Composer as a Service- 作为一个zip文件下载Composer包的工具
MailCatcher- 一个抓取和查看邮件的web工具
Resources 资源

各种提高你的PHP开发技能和知识的资源,比如书籍,网站,文章

PHP网站

PHP相关的有用网站

PHP The Right Way-一个PHP最佳实践的快速指引手册
PHP Best Practices- 一个PHP最佳实践指南
PHP Weekly- 一个PHP新闻周刊
PHP Security- 一个PHP安全指南
PHP FIG- PHP框架交互组
PHP UG-一个帮助用户定位最近的PHP用户组(UG)的网站
Seven PHP-一个PHP社区成员采访的网站
Nomad PHP-一个在线PHP学习资源
PHP Mentoring-点对点PHP导师组织
Other Websites 其他网站

web开发相关的有用网站

The Open Web Application Security Project (OWASP)-一个开放软件安全社区
WebSec IO- 一个web安全社区资源
Web Advent-一个web开发人员日历
Semantic Versioning-一个解析语义版本的网站
Atlassian Git Tutorials-一个Git教程系列
Hg Init-一个Mercurial教程系列
Servers for Hackers- 一个关于服务器管理的新闻通讯
PHP 书籍

PHP相关的非常好的书籍

Scaling PHP Applications- 一本Steve Corona关于扩展PHP应用程序的电子书
The Grumpy Programmer’s Guide to Building Testable PHP Applications-一本Chris Hartjes关于构建PHP应用程序测试的书
Grumpy PHPUnit-一本Chris Hartjes关于使用PHPUnit进行单元测试的书
Mastering Object-Orientated PHP- 一本Brandon Savage关于PHP面向对象的书
Signaling PHP-一本Cal Evans关于在CLI脚本捕获PCNTL 信号的书
Securing PHP: Core Concepts-一本Chris Cornutt关于PHP常见安全条款和实践的书
Modernising Legacy Applications in PHP-一本Paul M.Jones关于遗留PHP应用进行现代化的书
其他书籍

与一般计算和web开发相关的书

The Linux Command Line-William Shotts关于Linux命令行的一本书
Understanding Computation-Tom Stuart关于计算理论的一本书
The Tangled Web — Securing Web Applications- Michal Zalewski关于web应用安全的一本书
Elasticsearch: The Definitive Guide-Clinton Cormley和Zachary Tong编写的与Elasticsearch工作的一本指南
Eloquent JavaScript-Marijin Haverbeke关于JavaScript编程的一本书
Vagrant Cookbook-Erika Heidi关于创建 Vagrant环境的一本书
Pro Git-Scott Chacon和Ben Straub关于Git的一本书
PHP视频

PHP相关的非常不错的视频

Taking PHP Seriously- 来自Facebook Keith Adams 讲述PHP优势
PHP Town Hall- 一个随意的Ben Edmunds和Phil Sturgeon的PHP播客
Programming with AnthonyAnthony Ferrara的视频系列
PHP阅读

PHP相关的阅读资料

Create Your Own PHP Framework- 一部Fabien Potencier的关于如何创建你自己的PHP框架的系列文章
Seven Ways to Screw Up BCrypt- 一篇关于纠正BCrypt实现的文章
Preventing CSRF Attacks-一篇组织CSRF攻击的文章
Don’t Worry About BREACH- 一篇关于BREACH攻击和CSRF令牌的文章
On PHP 5.3, Lamda Functions and Closures-一篇关于lambda函数和闭包的文章
Use Env- 一篇关于使用unix环境帮助的文章
Composer Primer- Composer初级
Composer Versioning-一篇关于Composer版本的文章
Composer Stability Flags-一篇关于Composer稳定性标志的文章
Innocent Villagefolk or a Pillagin’ Pirate?-一篇关于PHP从其他语言获取想法的文章
Predicting Random Numbers in PHP-一篇关于生成随机数的文章
A 20 Point List for Preventing XSS in PHP-一篇关于组织XSS的文章
PHP Sucks! But I Like It!-一篇关于PHP利弊的文章
PHP Is Much Better Than You Think-一篇关于PHP语言和生态圈的文章
PHP Internals Reading PHP内核阅读

阅读PHP内核或性能相关的资料

PHP RFCs- PHP RFCs主页(请求注解)
PHP Internals Book- 一本由三名核心开发编写的关于PHP内核的在线书
Print vs Echo, Which One is Faster?-一篇关于打印和echo性能的文章
The PHP Ternary Operator. Fast or Not?-一篇关于三元操作性能的文章
Disproving the Single Quotes Myth-一篇关于单,双引号字符串性能的文章
You’re Being Lied To- 一篇关于内核ZVALs的文章
How Long is a Piece of String-一篇关于字符串原理的文章
Understanding OpCodes-一篇关于伪代码的文章
How Foreach Works-StackOverflow 关于foreach回答的详情
When Does Foreach Copy?-一篇关于foreach原理的文章
How Big Are PHP Arrays (And Values) Really?- 一篇关于数组原理的文章
Why Objects (Usually) Use Less Memory Than Arrays-一篇关于对象和数组原理的文章
PHP Evaluation Order-一篇关于PHP评估顺序的文章
开发人员的PHP源代码: 1 2 3 4-关于PHP源代码的系列
垃圾收集: 1 2 3关于PHP垃圾收集原理的系列

摘自伯乐在线
https://github.com/jobbole/awesome-php-cn

12…4
周强

周强

个人站

32 日志
11 分类
16 标签
GitHub 知乎
Links
  • 个人站
  • laravel博客
  • 校园QA
© 2015 - 2016 周强
由 Hexo 强力驱动
主题 - NexT.Muse