为什么说openresty是最优秀的开发网站服务器软件?
OpenResty一个全功能的Web应用服务器,它打包了标准的Nginx核心,很多的常用的第三方模块,以及它们的大多数依赖项。
OpenResty通过汇聚各种设计精良的Nginx模块,从而将Nginx有效的变成一个强大的Web应用服务器,Web开发人员可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任 10K+并发连接响应的超高性能Web 应用系统。
openresty性能内存储器容量:
openresty性能需要执行的程序与需要处理的数据就是存放在主存中的。内存储器容量的大小反映了计算机即时存储信息的能力。随着操作系统的升级,应用软件的不断丰富及其功能的不断扩展,人们对计算机内存容量的需求也不断提高。
openresty性能运行Windows 95或Windows 98操作系统至少需要 16 M的内存容量,Windows XP则需要128 M以上的内存容量。内存容量越大,系统功能就越强大,能处理的数据量就越庞大。
Python
Python(发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。
这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。
目前,基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多。
Python的Hello World程序
下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:
#!/usr/bin/env python
print "Hello, world!"
或者:
import sys
sysstdoutwrite("Hello, world\n")
Python的历史
Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为 ABC 语言的一种继承。之所以选中 Python(大蟒蛇的意思)作为程序的名字,是因为他是一个Monty Python的飞行马戏团的爱好者。
ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido 决心在 Python 中避免这一错误(的确如此,Python 与其它的语言如C、C++和Java结合的非常好)。同时,他还想实现在 ABC 中闪现过但未曾实现的东西。
就这样,Python在Guido手中诞生了。实际上,第一个实现是在Mac机上。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。
Python在编程语言中的定位
很多大规模软件开发计划例如 Zope, Mnet 及 BitTorrent Google都在广泛地使用它。
通常认为,Python是一种解释性的语言,但是这种说法是不正确的,实际上,Python在执行时,首先会将py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine来执行这些编译好的byte code。这种机制的基本思想跟Java,NET是一致的。然而,Python Virtual Machine与Java或NET的Virtual Machine不同的是,Python的Virtual Machine是一种更高级的Virtual Machine。这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或NET的功能更强大,而是说和Java 或NET相比,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。
基于C的Python编译出的字节码文件,通常是pyc格式。
Python的特色
可扩充性可说是Python作为一种编程语言的特色。新的内置模块(module)可以用C 或 C++写成。而我们也可为现成的模块加上Python的接口。Python可以使用户避免过分的语法的羁绊而将精力主要集中到所要实现的程序任务上。
Python也被称为是一门清晰的语言。因为它的作者在设计它的时候,总的指导思想是,对于一个特定的问题,只要有一种最好的方法来解决就好了。这在由Tim Peters写的python格言(称为The Zen of Python)里面表述为:
There should be one-- and preferably only one --obvious way to do it
有意思的是,这正好和Perl语言(另一种功能类似的高级动态语言)的中心思想TMTOWTDI(There's More Than One Way To Do It)完全相反。这似乎是人们常把Perl和Python互相比较的重要原因。
Python语言是一种清晰的语言的另一个意思是,它的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。这样有意的强制程序员养成良好的编程习惯。其中很重要的一项就是Python的缩进规则。
例如if语句:
if age<21:
print "You cannot buy wine!\n"
print "But you can buy chewing gum\n"
print "this is outside if\n"
一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。因为自从C这类的语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。
另外Python在其他部分的设计上也坚持了清晰划一的风格,这使得Python称为一门易读性、易维护性好,并且被大量用户所欢迎的、用途广泛的语言。
Python直接编写的程序段有时运行效率甚至高于用C编写的程序。
Python的局限
虽然Python是一个非常成功的语言,但是也有必要明白它的局限性。
1 强制缩进
这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误,而这是用肉眼无法分别的。
2 命令行输出问题
很多时候不能将程序连写成一行,如import sys;for i in syspath:print i。而perl和awk就无此限制,可以较为方便的在shell下完成简单程序,不需要如Python一样,必须将程序写入一个py文件。(对很多用户而言这也不算是限制)
Python的前景
Python在编程领域的占有率一直处于稳步上升之中,根据最新的数据,Python排名第六。前五名分别是Java、C、VB、PHP和C++ 作为一个很年轻的语言,Python的位置已经相当令人振奋了。随着微软将Python纳入Net 平台,相信Python的将来会更加强劲发展。Python 很可能会成为Net平台快速开发的主流语言。欲了解这方面情况,请参考Iron Python的相关信息
著名的搜索引擎 Google 也大量使用Python。更加令人吃惊的是,在Nokia智能手机所采用的Symbian操作系统上,Python成为继C++,Java之后的第三个编程语言!可见Python的影响力之巨大。
Python的应用
Zope-应用服务器
Plone-内容管理系统
Django-鼓励快速开发的web framework
Twisted - Python Network Application Framework Python的网络应用程序框架
TurboGears - 另一个Web应用快速开发框架
Bit Torrent - 著名的BT下载工具
2006年的Google编程大赛已经将Python作为参赛语言之一
lua
Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它的主页是 wwwluaorg。
Lua最著名的应用是在暴雪公司的网络游戏WOW中。
Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。
Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能,这将给Lua带来更加优秀的性能。请访问 http://luajitluaforgenet/ 来了解这个项目。
和Python等脚本不同,Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。不过Lua还是具备了比如数学运算和字符串处理等基本的功能。
Lua 目前的最新版本是 51
1 目标
LUA的目标是成为一个很容易嵌入其它语言中使用的语言。大多数程序员也认为它的确做到了这一点。
很多应用程序使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽世界、博德之门等。
2 特性
LUA有如下特性:
轻量级 LUA语言的官方版本只包括一个精简的核心和最基本的库。这使得LUA体积小、启动速度快,从而适合嵌入在别的程序里。
可扩展 LUA并不象其它许多"大而全"的语言那样,包括很多功能,比如网络通讯、图形界面等。但是LUA可以很容易地被扩展:由宿主语言(通常是C或C++)提供这些功能,LUA可以使用它们,就像是本来就内置的功能一样。
其它特性 LUA还具有其它一些特性:同时支持面向过程编程和面向对象编程;自动内存管理;提供一系列数据结构,包括数组、链表、集合、字典、散列表等;语言内置正则表达式匹配;闭包(closure);函数也可以看做一个值;提供多线程支持;等等。
3 示例代码
是的,你猜对了:hello world
print "Hello, world!"
一个比较复杂一点的例子,但是它展示了什么是闭包:
function create_a_counter()
local count = 0
return function()
count = count + 1
return count
end
end
create_a_counter()返回一个记数器,每次调用这个记数器,都会得到一个比上次大1的值。
函数式语言
Elixir
Elixir 比 Erlang 更容易编写,具有 Haskell 等语言的函数式编程概念。Elixir是基于Erlang 虚拟机的,其广为人知的特点是运行低延时、分布式、可容错的系统,并成功用于Web开发与嵌入式软件领域。
Elm
Elm是一种用于构建 Web 应用程序的函数式语言。业内一般认为,它适用于创建高可交互应用,例如复杂的用户界面,开发人员可以通过 Elm 快速编写富有表现力的系统。Elm 也以没有运行时异常而闻名。
PureScript
PureScript是一种可编译为 JavaScript 的纯函数式编程语言。与 Haskell 最相似的是,PureScript 最适合用于开发 Web 应用程序和服务器端应用程序。
PureScript 支持类型推断,与其他语言相比,需要明显类型注释要少得多。
Swift
Swift是一种由苹果公司开发的通用编译编程语言,最早的设想是替代上一代编程语言Objective-C ,过程中结合了Objective-C、Rust、Ruby 和 Python等语言的编程思想。目前Swift用于开发苹果自己的手机、服务器、台式机上的应用软件。
程序语言
Go
Go语言是由谷歌公司创造的类似C风格的语言。Go 比 C++ 或 Java 更简洁,比 Ruby 或 Python 更安全。
一些缺点: 编码要求严格。比如,不能混用符号和无符号整数。还有一个明显的遗漏,Go语言没有泛型和继承。
但Go语言的优势同样明显,简单且易于使用。Go语言擅长于网络和多线程方面的编程。
面向对象语言
DART
Dart同样来自谷歌公司具有C语言风格。Dart可以轻松编写JavaScript、Java for Android、本地机器代码或独立的 Dart 虚拟机。它还可以运行后端代码。
Dart 非常适合使用事件驱动代码构建用户界面。根据Dart 团队成员的说法,Dart的优势:可选的静态类型、最小的编译时错误和强大的内置编辑器。
Pony
Pony是一种基于无数据竞争类型和垃圾收集的语言,并使用 actor 模型以及称为引用功能的东西。
你可以把 Pony 想象成某种“Rust 遇上 Erlang”的复合体,没有锁,高并发是其主要优点。
Pony 的缺点是 API 稳定性低、很少有高质量的第三方库和有限的本地工具。
TypeScript
TypeScript是一个基于 JavaScript 静态类型定义构建,并由微软维护且开源编程语言。Visual Studio Code 或Visual Studio 是推荐的IDE编辑器,微软大厂的用户体验和错误检查也不用怀疑。
复合编程语言
Hack
Hack是一种作为 PHP 方言的 HipHop 虚拟机的编程语言。于 2014 年由Facebook创建,允许程序员同时使用静态和动态类型(也称为渐进类型),这为编码提供了灵活性。
Julia
Julia是一种高级通用编程语言,用于计算科学和数值分析。Julia 以动态类型和可重现的高性能特性而闻名。
Julia 在数据可视化和机器学习等方面都有大量用途。事实上,它被英国保险公司 Aviva 用于风险计算,纽约联邦储备银行用于金融建模,甚至气候建模联盟用于气候变化建模。它拥有Fortran、C++、R、Java、C 、Python等的接口,这使其成为最受追捧的新语言之一。
Kotlin
Kotlin是运行在 Java 虚拟机中的更快、更流畅的 Java 版本。它现在是Android 开发的首选语言。根据 Android 开发者网站显示,程序员正转而采用 Kotlin,因为该语言的样板代码更少,空指针异常更少,并且与 Java 有互操作性。
Kotlin 可用于在 iOS 和 Android 上运行的应用程序、不使用额外运行时或虚拟机。
Nim
Nim是一种优先考虑可读性的静态类型语言。通过结合多种语言的特性,Nim 为程序员提供了速度和易用性。
它带有 JavaScript 后端、分散的包管理、自动内存管理、C 和 C++ 库的绑定以及用于调试的回溯。作为一种语言,Nim 是有限的,但它包含一组元编程功能,如泛型、模板和宏,因此开发人员可以在避免冗长代码的同时以不同的风格工作。
OCaml作为此列表中较旧的语言,OCaml是一种多范式语言——既有函数式、命令式和类型安全,也具有面向对象功能。
OCaml 的一些优势:定义数据类型很容易。默认情况下,所有变量都是不可变的。API 稳定,具有良好的库向后兼容性。该语言还为独立应用程序提供自动内存管理和单独编译。
Reason
如果比JavaScript 更快、更简单且类型安全会怎样?
这就是创建Reason的 Facebook 开发者想要回答的问题。不过,他并没有从头开始构建一种新语言,而是采用了 OCaml,并将其调整为类似于 JavaScript。
Reason使用项目 BucketScript编译为 JavaScript,并且可以访问 80% 的 JavaScript 工具和生态系统。它还可以编译为准系统、iOS、Android 和微控制器。
Red
Red是一种最初旨在克服 Rebol 语言限制的编程语言。Red 于 2011 年推出,受 Rebol、Lua 和 Scala 等语言的影响,对高级和低级编程都很有用。
该语言可用于开发从高级 GUI 到低级操作系统的所有方面。Red 拥有人性化的语法、低内存占用和垃圾收集等优点。
Rust
Rust解决了一些与 Go 相同的问题,如系统级别的线程和进程安全,,但Rust 更像 C 风格的语法
但Rust语言的缺点:静态类型和缺乏垃圾收集
Rust可直接访问内存意味着程序员可以编写低级代码,如操作系统内核。Rust 也非常适合嵌入式设备、网络服务和命令行编写。
在《开发愤怒的小鸟的Lua语言:Wax框架详解》中介绍了Wax及其优点。在本文中我们首先为大家准备了Wax框架的下载包,您可以把Wax下载下来,与我们一起完成用Wax构建一个简单的应用程序的过程。
这个应用程序显示Twitter上的当前趋势话题列表,可以用按钮来更新内容。当完成整个过程之后没准一个创意就能让你开发出自己的《愤怒的小鸟》。最后的结果:
第一步:分析AppDelegatelua
如果你看一下当前的AppDelegatelua,会注意到几个方面。首先,你会注意到这个Lua文件的第一行。这一行是Objective-C类声明。我们创建了一个名为“AppDelegate”的类,它符合“UIApplocationDelegate”协议。接下来,你会看到文件中唯一的一个方法:“applicationDidFinishLaunching”。每当应用程序启动,就调用这个有名的方法。应用程序现在可以在屏幕上显示内容。“applicationDidFinishLaunching”里面的代码基本上不需要加以说明。它建立了一个蓝色背景的新窗口,然后将一些白色文本放在上面。不过,我们需要的是一个Twitter客户程序,而不是“Hello Lua!”屏幕。不妨先从创建UITableViewController入手。
第二步:熟悉的UITableViewController
在名为“TwitterViewControllerlua”的脚本目录中创建一个新文件。如果你记性很好,会记得为了声明新的Objective-C类,我们需要使用waxClass函数。如果你记性超好,会记得waxClass工作起来像这样:
waxClass{"CLASSNAME","PARENT_CLASS"}
我们需要扩展UITableViewController的一个类,所以它看起来像这样:
waxClass{"TwitterViewController",UITableViewController}
我们已定义了类,现在处理初始化。在我们的“init”方法中,我们把表设成“grouped”,而不是默认状况下的“plain”。由于我们还要显示趋势表,所以也有必要对容纳所有趋势的Lua表进行初始化:
functioninit(self)selfsuper:initWithStyle(UITableViewStyleGrouped)selftrends={}returnselfend
基本上不需要加以说明。
第三步:准备表
我们已有了一张分组表,就需要一个标题。我们用“viewDidLoad:”方法来实现这一步。
functionviewDidLoad(self)self:setTitle("MyFirstWaxApplication")self:tableView():setAllowsSelection(false)end
完全不需要加以说明。我们只要把标题放到屏幕顶部的那个条上,然后防止用户选择表里面的任何行。我们不想用户选择任何行,是因为我们不想处理这个操作。可以在苹果的UITableViewController说明文档页面上看到,你能调用哪些其他方法。只要记住:你得使用“:property()”和“:setProperty(value)”方法,而不是使用属性。按Xcode左上角的“Run”,应用程序看起来应该像这样:
第四步:UITableViewController数据方法
我们的应用程序可以启动,这很好,但我们想要显示一些数据。为了显示这些数据,所有UITableViewController必须实施几个方法,告诉设备显示什么数据。其中第一个方法是“numberOfSectionsInTableView:”,它会返回将在表中显示的群组数量。对该应用程序来说,这一步很容易,因为我们只需要一个表段,即拥有当前趋势的那个表段。
functionnumberOfSectionsInTableView(self,tableView)return1end
是不是很容易现在我们得实施“tableView_numberOfRowsInSection”方法,它告诉设备某个特定的分组会有多少行。对该应用程序来说,这同样很容易,因为我们只有一个表段。记得我们如何用“init”方法对Lua表进行初始化吗只要计数该表中的表项数量,就知道该表需要显示多少行:
functiontableView_numberOfRowsInSection(self,tableView,section)return#selftrendsend
这使用Lua简写方法来计数表中的表项数量。如果你不熟悉Lua表,下面有几个要点:
1 大多数语言中被称为词典的东西在Lua中被称为表。
2 大多数语言中被称为数组的东西被称为带有序数字键的表。
3 “数组”使用从1开始的索引,而几乎其他每种语言使用从0开始的索引。
接下来是“tableView_titleForHeaderInSection”方法。该方法告诉设备显示什么作为某群组的标题。你只要返回某个指定群组的字符串,标题之后会神奇地出现在表行上方:
functiontableView_titleForHeaderInSection(self,tableView,section)ifsection==0thenreturn"CurrentlyTrendingTopics"endreturnnilend
相当简单。现在我们只要往表格填充从Twitter的服务器取来的数据。如果你熟悉Objective-C中的UITableViewControllers,就会认识这下一个方法:
functiontableView_cellForRowAtIndexPath(self,tableView,indexPath)localidentifier="TwitterTableViewControllerCell"localcell=tableView:dequeueReusableCellWithIdentifier(identifier)or UITableViewCell:initWithStyle_reuseIdentifier(UITableViewCellStyleDefault,identifier)localobject=selftrends[indexPath:row()+1]--必须是+1,因为Lua数组从1开始cell:textLabel():setText(object)returncellend
这个方法要复杂一点。首先,我们定义了对同一种类型,但可能有不同内容的所有表格单元(cell)来说很独特的标识符。这种情况下,我们称之为“TwitterTableViewControllerCell”。接下来,我们使用Lua简写方法,获得UITableViewCell的实例。注意夹在这两个方法调用之间的“or”。如果第一个方法调用的结果不是false或nil, “cell”就被设成第一个方法调用的值。否则,“cell”会被设成是第二个方法调用的结果。我们这么做是为了节省内存。这样一来,设备每次只要为屏幕上10个左右的表格单元分配内存,而不是为数据源里面可能拥有的数千个表格单元分配内存。当然,我们不会有数千行要显示,但这仍是个有必要养成的好习惯。接下来,我们把表格单元的内容设成从selftrends“数组”的合适部分获取的趋势。我们知道,该索引从来不会超出selftrends的范围,因为我们通过方法“tableView_numberOfRowsInSection”,将数组大小告诉给了设备。最后,我们返回刚创建的表格单元。如果你现在按“Run”,它应该看起来像这样:
#p#副标题#e#
第五步:从Twitter装入数据
现在说说真正展现Wax魅力的好玩部分:从互联网、或者更准确地说从Twitter的服务器装入JSON数据。先不妨创建一个名为“loadDataFromTwitter”的新方法。该方法会从Twitter的服务器获取JSON数据,然后为表重新装入新数据。
functionloadDataFromTwitter(self) UIApplication:sharedApplication():setNetworkActivityIndicatorVisible(true)--showspinner waxhttprequest{,callback=function(json,response) UIApplication:sharedApplication():setNetworkActivityIndicatorVisible(false)--hidespinner ifresponse:statusCode()==200then selftrends={}--Resetthelistoftrendswhenthetrendsarerefreshed forindex,valueinipairs(json["trends"])do--iterateoveratablewithnumericalkeys tableinsert(selftrends,value["name"])--appendthevaluetothe"array" end end self:tableView():reloadData() end} end
是的,就这么简单。你定义了请求的URL以及请求完毕后执行的回调。Wax自动确认服务器在运行JSON后,会将JSON文本自动转换成Lua表。这使得显示网络活动指示器(设备右上角靠近无线信号指示器的图标)异常容易。返回的JSON看起来像这样。键“trends”保存一组对象,这些对象包含趋势名称和访问提到该趋势的所有Twitter消息的URL。
趋势名称存储到selftrends变量里面后,重新装入tableView,它可以再次调用我们之前定义的所有数据方法。这导致趋势在表中显示,非常类似最终产品。
如果你立即试图运行该应用程序,看上去没什么不同。那是因为该方法从未调用。如果从“viewDidLoad:”里面调用该方法,我们就能确保总是可以显示最新趋势。把这行添加到“viewDidLoad:”方法末行的前一行:
self:loadDataFromTwitter()
如果你点击“Run”,应用程序看起来有点像这样(你得等几秒钟装入趋势,请留意那个活动指示器!):
第六步:添加重新装入按钮
该应用程序相当棒。不过,要是有重新装入按钮让你可以显示最新趋势,就更好了。幸好,这很容易实现。
不妨把重新装入按钮放到屏幕的右上角。苹果其实提供了上面有刷新图标的按钮,以图方便,就用这个按钮吧。先开始用“viewDidLoad:”方法创建一个按钮。把下面这行添加到“loadDataFromTwitter”调用的前面。
local button = UIBarButtonItem:initWithBarButtonSystemItem_target_action(UIBarButtonSystemItemRefresh, self, "loadDataFromTwitter")
这创建了一个UIBarButtonItem:一旦按下按钮,就会对当前对象实例调用“loadDataFromTwitter”方法。如果你想尝试其他风格,可以在这里找到列表。
我们已创建好了按钮,现在需要把它添加到我们的界面上。使用UITableViewController使得这项工作轻而容易,我们只要对导航栏对象实例调用“setRightBarButtonItem:”方法,就像这样(这行位于上面给出的那一行后面):
self:navigationItem():setRightBarButtonItem(button)
如果你各方面都做好了,完成的应用程序应该看起来像这样:
第七步:额外好处
这个项目一个有意思的扩展就是制作更显眼的装入指示器。这可能需要把UIActivityIndicatorView放到其中一个按钮位置。
结论
我希望你觉得这篇教程深入浅出地介绍了Wax。如果你想看到有关某个课题的更多Wax教程,欢迎给我留言。
#p#副标题#e#
0条评论