---------------------------自己动手做智能产品:嵌入式JavaScript实现---------------------------
人类的想象力可以说是永无止境的,“创造”(making)这个词可以说是最适合描述人类经历的词汇之一了,它包括作画、设计、建造或者编程。回望自己所创之物,心中浮起 “这是我创造的”念头——这可以说是我所知的最美妙感觉之一了。
时至今日,我们已不单单能创建那些无生命物体,还可以让那些原本无生命的物体变得栩栩如生,让物体变得更加“聪明”。本书会告诉你如何利用微控制器让物体变得可编程化。
通过日常生活中的物品和技能学习,你将可以学习到如何创造数码相机、打印机、机器人,或者早期的电视机等。只要往下看,你会了解你日常所用的物品是如何组成的以及它们背后那些关于创造的故事,也将学会如何使用目前世界上数百万Web工程师正在使用的计算机语言——JavaScript。因为有了计算机语言解释器的帮助,你将见到你所添加的一行行代码实际产生的影响。
我喜欢在生活中创造并完成一件事情。希望本书可以激励你去创造和学习,并在其中找到乐趣。
本书排版约定
本书使用以下排版约定:
斜体(Italic)
用于菜单项、URL链接、邮件地址、文件名和文件扩展名。
等宽字体(?Constant width?)
用于程序清单,或者是所引用的程序元素,如变量或函数名、数据类型、语句和关键字。
等宽粗体(?Constant width bold?)
用于表示命令或是读者应输入的其他内容。
等宽斜体(?Constant width italic?)
用于表示需要由用户提供的值或者根据上下文确定的值所替换的内容。
. 该符号表示提示或一般注释。
该符号表示需要注意的信息或警告。
使用本书代码示例
本书补充资料(如代码示例、练习等)可从以下网址下载:https://github.com/espruino/making-things-smart。
本书是为了帮助你完成那些想要完成的事情。正常情况下,本书所提供的代码用例都可以在你的程序或者文档中使用。除非需引用大段的示例代码,否则你不需要得到我们的许可。例如,将本书中的某部分代码用于程序中并不需要得到许可,但是若想将本书的代码用于销售或者打包在CD-ROM中发布则需要得到我们的许可。引用本书中的内容或者示例代码来回答问题不需要许可,但是如果需要将本书的重要示例代码加入你的产品文档中则需要得到我们的许可。
我们希望读者在引用本书内容时指出出处(但非强制要求),通常包括书名、作者、出版社和国际标准书号。比如:“Making Things Smart by Gordon F. Williams (O’Reilly). Copyright 2017 Gordon F. Williams, 978-1-680-45189-4”。
在使用本书代码示例的过程中,如果你发现错误或者需要获得以上所提许可,欢迎通过以下邮箱联系我们:
bookpermissions@makermedia.com。
O’Reilly Safari
Safari(之前称为Safari Books Online)是一个以会员制为基础,为企业、政府、教育机构和个人提供图书服务及培训内容的平台。
会员可以访问众多的书籍、培训视频、学习资源、互动教程和专题课程等资源,这些资源来自全球的250多家出版社,包括O’Reilly Media、Harvard Business Review、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology等。
若需了解更多相关信息,请访问 http://oreilly.com/safari。
本书网址为http://shop.oreilly.com/product/0636920031246,https://www.oreilly.com/catalog/errata.csp?isbn=0636920031246列出了本书的勘误。
致谢
首先要感谢Maker Media团队给我机会完成本书——尽管这是我的第一本书——感谢他们有足够的耐心指导我如何去写一本书!我也十分感谢Brian Jepson和Anna Kaziunas France,尽管他们现在已经不在Maker Media了,但我会开始写作本书是因为他们在其中起了至关重要的作用。
我要感谢我那了不起的太太Marianne——不仅仅是因为她在我写作本书的过程和我平时工作中给予的帮助,还因为她在过去10年中给予了我自信,并支持我那些疯狂的想法,让我可以专心工作。
如果没有最初这些了不起的支持者,本书和Espruino可能都不会存在。在最开始时正是在他们的帮助下我才完成了第一块Espruino开发板,并且从那之后,在他们的持续帮助下,Espruino才会一步步走向今天的成熟。Espruino论坛中的成员们做出了巨大的贡献,在他们的赞助下,我才有更多时间去完成更多的基于Espruino的有趣项目。同样要十分感谢那些在GitHub中向我提交漏洞报告的人们,正是在他们的帮助下,我才能完善该项目。
我现在采用的绝大部分都是开源软件,像Linux(Mint)、GCC、Chromium、Eclipse、Atom、Gimp、Inkscape和LibreOffice等工具。GCC常常被忽视,在我刚开始Espruino相关工作时,许多嵌入式设备还没有一个可用的、免费的C编译器。
ST微电子公司的Laurent Desseignes和Sebastien Marsanne在STM32的Espruino开发板方面给予了巨大的支持,还有Michael Dietz 等其他在Nordic Semiconductor译注工作的开发者们,在我们开发Puck.js期间也给予了我们巨大的帮助。
谷歌的Fran?ois Beaufort 很出色地帮我们完成了Web Bluetooth和Chrome浏览器物理层的支持,绿色软件园(Green Park Software)的David Park则完成了一个WebBLE 应用程序,该程序在iOS操作系统中实现了Web Bluetooth的支持。还需感谢ARM mbed的Rob Moran、Jonathan Austin、Hugo Vincent 和Simon Ford,他们给了我宝贵的建议,并帮助宣传了Espruino,促使micro:bit 这样的设计方式在Espruino中得以实现。
剑桥大学计算机实验室也提供了巨大的帮助——不仅仅因为它所给予我的教育,还因为它在我毕业之后仍给予了我持续支持。Stuart Newstead可以说是一位梦幻级导师,是他让我知道不能将所有时间都花在写代码上,而需要关注更多其他的事情!
我还要感谢Tim Hunkin和Rex Garrod,他们在20世纪80年代主持的电视节目《机器的秘密生活》(The Secret Life of Machines)对我有巨大的影响。本书中的打印机项目正是为了对标和模仿他们节目中所提到的传真机。
最后,我想说如果没有我的父母Fred和Pat Williams,我可能永远都不会做这件事情。如果在成长道路中没有他们的帮助和支持(如那些无止境供应的电脑器件和电子组件),我也许永远不会走向软件和电子这条路。我的整个童年都在制作和实验,那些电视节目中所提到的项目我都可以直接在我父亲做的设备中进行实验。希望本书可以帮助孩子们更多地像我童年一样,拥有充满兴奋和奇迹的经历。
---------------------------Nginx Lua开发实战---------------------------
为什么写这本书
在接手安防云任务之前,我做了近10年传统安防分布式平台的工作。安防云任务是基于云计算平台和P2P技术向用户提供SaaS服务。最初我的方案是将我们熟悉的分布式平台改造成云服务,进行互联网部署。
针对消费级摄像机的应用,我们对服务进行了裁剪,只留下几个服务器。但是需要几个资深的C++服务器开发工程师提供技术支持。后来,新来的架构师经过一段时间的消化后,提出了Nginx+Lua+Redis架构。他一个人只花费一个多月的时间就把业务服务写好了。这件事情让我感受到了Nginx+Lua的魅力。
Nginx+Lua架构带来的改变还远不止节约时间和成本。从做大型系统的角度来看,它还会带来更多的东西:
调试方便:因为它不需要编译代码,相关访问模块是成熟稳定的,只需要调试新加的业务代码即可。大型系统特别是分布式系统,调试一个功能或代码的链条太长了,非常容易出错。
降低耦合:因为架构的限制,代码只能在必需的阶段管理器中开发,代码是一个个.lua文件,耦合性大大降低。
框架良好:因为先进的异步式多进程架构,可以充分利用系统资源。如果自行开发并维护这样一个框架,需要大量的人力、物力。
上手容易:Lua代码良好的结构和可读性,使其上手速度更快。团队成员经过快速培训就可以上手。
在学习和使用ngx_lua的过程中我发现,网络上资料其实非常多,但是非常零散,没有整体性。虽然技术本身是很清晰和易用的,但是对于刚接触这门技术的开发者来说,想要有条理、系统地把这些知识学完,可能会走一些弯路。因为很多资料已经过时了,甄别和调试会耗费很多时间和精力,同时查阅英文文档也比较花时间。于是,我就有了把自己的学习过程和心得整理成书的想法。
随后的时间里,我将自己学习Nginx下Lua开发的思路,以及这个过程中的资料一点点总结出来加以整理,终成本书。希望本书可以帮助跟我有一样需求的研发工程师快速了解并掌握Nginx下Lua开发技术。
本书的主要内容和特色
通常我们学习一门语言、一门技术的时候,都是这样一个过程:初学这项技术时,我们通常需要知道Lua语言的细节,需要知道Nginx的结构;当我们着手学习时,首先需要搭建一个学习环境,以便了解系统的结构和运行机制,同时用于编写测试代码;运行第一个测试代码的时候,需要对Nginx进行配置,但是并不熟悉Nginx的配置,对于nginx.conf里的内容比较头疼;等到我们掌握了这项开发技术,开始业务系统开发了,又往往需要针对具体问题查找配置指令的用法和参数,以及查阅API的详细用法。
所以,本书按照这样的不同需求,对Nginx下Lua开发技术的不同关注点做了描述。
Nginx的基本知识,包含Nginx的使用、配置、安装、技术架构、技术特点、主要工作流程等。
外围关系型数据库、NoSQL数据库、缓存等的使用范围、安装、使用方法、配置,如MySQL、PostgreSQL、MongoDB、Redis、Memcached。
Lua语法详解,包含Lua系统库。
Lua常用库,包含Redis、MySQL、Memcached、PostgreSQL、MongoDB、Bit、lfs、restry.http、lcurl、FFI、cjson、Template、WebSocket。
两个相对完整的Lua实例,结合实例以巩固涉及的知识点。
ngx_lua的配置指令和API,详细介绍了每一个官方指令和API。
我希望无论是对于Nginx Lua的初学者,还是对于经验丰富的开发者,都可以通过本书学到基础知识,找到常用库的API说明,而不用查阅其他资料及官方英文文档。
本书面向的读者
本书适合初学Nginx下Lua开发的工程师使用。通过本书可以比较系统地学习Lua语言,学习框架下经常用到的各组件使用方法,学习Nginx下Lua程序开发;可以参照本书的内容搭建学习环境,逐一测试各组件访问代码,并可通过后面的例子编写自己的访问代码和访问库。
本书适合有经验的Nginx和Lua开发工程师使用。通过本书可以快速查阅相关数据库、缓存、库的使用方法;可以查阅Nginx配置指令;还可以查阅ngx_lua配置指令和API。
本书同样适合做服务器端开发的资深工程师使用。书中讲解了Nginx的核心架构和主要的工作流程,也讲解了Nginx为了提高性能和并发所使用的一些关键技术,这些技术和算法对我们开发自己的高性能服务器有重要指导意义。
如何阅读本书
本书主要分五部分:
第一部分(第1~5章)介绍Nginx的基本操作,同时讲解了MySQL、PostgreSQL、Redis、Memcached、MongoDB、OpenResty的基本操作。通过对本部分的学习可以掌握这些服务的安装和使用方法,一般用于研发环境的搭建。这里还讲解了Nginx核心技术和工作流程,用于帮助读者进一步掌握Nginx的架构和流程。各个层次的读者都可以从本部分读起。
第二部分(第6~7章)详细讲解了Lua脚本语言和Lua通用库。学习Lua语言或查阅Lua语法的初学者可以直接阅读该部分相应章节。
第三部分(第8~10章)讲解了在Nginx开发中经常使用的一些技术,如JSON数据交换格式、nginx.conf配置方法和配置指令;还讲解了Nginx下Lua开发的实现机制。学习Nginx配置的读者,学习和查阅JSON的读者可以直接阅读该部分相应章节,也可以跳过其他章节,直接学习Nginx下Lua的实现机制。
第四部分(第11~26章)详细介绍了常用Lua库和数据库等组件的使用方法,包括Redis、MySQL、Memcached、PostgreSQL、MongoDB、Bit、lfs、restry.http、lcurl、FFI、cjson、Template、WebSocket。要了解和学习这些内容的读者,可以直接阅读对应章节。这里同时给出了两个Lua编程实例代码,要总体了解这项编程技术的读者可直接翻阅相应章节。
第五部分(第27~28章)详细介绍了ngx_lua的配置指令和ngx_lua API,目的是帮助读者在工作中快速检索配置指令和API。
勘误和资源
由于时间有限,技术能力有限,虽然已经尽量客观,在写作过程中排除自己主观的内容,但难免有错误和不准确的地方,热忱希望你的批评和指正。
欢迎通过邮箱和我联系:13067722617@163.com。
致谢
首先需要感谢我的太太一直以来对我的信任和支持,她是我一路走来的动力。写这本书的时候,九哥已经10岁了,他已经知道我在做什么了,他以我为荣,我也以他为傲。感谢我的丈人、丈母娘对我们的爱和一直以来的帮助。
写这本书的时候,我的父母又来到了我们的身边,为了和我们年轻人相处得更融洽,他们做出了巨大的改变。
最后要感谢出版社的杨福川和李艺,没有你们的努力是不会见到这本书的。感谢你们的支持和信任!