阿里云域名续费优惠口令(com和cn续费优惠)- 2022

购买/续费云产品之前,找找优惠码是一个好习惯。

最近续费自己的 .com 域名,发现官方提供了优惠码,可以便宜一些。

获取方法是: 关注公众号“阿里云企航”,在输入框中输入“优惠口令”,即可自动回复当前最新可用的优惠口令 ,下面是我在2022年12月获取到的。

商品 行为 口令
com英文域名 续费 商标优选即买即用
cn英文域名 续费 商标智能在线检索
xin(普通词) 注册 只争朝夕
xin(普通词) 续费 不负韶华
xin(溢价词) 续费 抱诚守信

使用优惠码优惠前续费 .com 需要 75 :

使用优惠码后便宜了 6 块钱:

省的少也是钱,这是最近发现的省钱技巧,欢迎一起交流~

参考文献

[摘录]《微信小程序开发入门与实践》 – 雷磊

微信小程序开发入门与实践 雷磊 53个笔记

◆ 前 言

小程序中没有DOM,请放弃“首先获取DOM,再操作DOM”的思维

替代DOM操作的方法是“数据绑定”。控制组件显示隐藏、切换CSS样式、控制滚动条,这些很容易用DOM思维思考常见功能在小程序中都是通过“数据绑定”实现的

小程序运行在一个JSCore中,它本身不支持Web中的window及DOM对象

一本书是永远不可能替代官方API文档的。

◆ 第1章 微信小程序简介

除了游戏和直播,微信官方并没有明确限制你不能做什么类型的小程序

MINA是官方小程序的内部开发代号,也是小程序运行框架的别名

◆ 第3章 从第一个简单的“Welcome”页面开始小程序之旅

根目录下面有3个文件:app.js、app.json和app.wxss。一个小程序项目必须有这3个描述App的文件,它们必须放在应用程序的根目录下

pages文件夹下就有2个页面,分别是index页面和logs页面

每个页面可以由4个文件构成,分别是:.js、.wxml、.wxss和.json文件

不同的是wxml文件里的标签元素不可以使用HTML标签,只能使用小程序自己封装的一些组件

实际上小程序的样式编写语言就是CSS,只是把.css文件换成了.wxss文件

小程序的4种页面级别文件同3个应用程序级别文件相比,多出了一个wxml页面标签文件

要显示welcome这个页面,必须让小程序的MINA框架知道这个页面的“存在”以及这个页面的具体位置(文件路径)

MINA框架将会自动去寻找页面路径,并将页面的.json、.js、.wxml和.wxss这4个文件进行整合

即使我们的welcome页面中没有任何JavaScript代码,依然需要在welcome.js中主动调用一下Page()方法

welcome.json文件同样不可以为空,即使你目前不想在.json文件中配置任何属性,也需要加入一个空的{}

小程序官方推荐的布局方式:Flex布局

小程序的大小不能超过1MB,超过则无法真机运行和发布项目

[插图]

本地资源在wxss中是无法使用的

早期时候,主流的浏览器对Flex布局的支持并不完善,造成了很多开发者不知道有这种布局的存在或者使用非常少,我们还是习惯使用传统的position和float属性来布局

Flex也称为“弹性布局”,主要作用在容器上

使用display:flex将这个view变成了一个弹性盒子

使用flex-direction这个属性指定view内元素的排列方向

首先要了解一个Flex布局非常重要的概念:轴。

.container样式中的属性align-items: center,可以让三元素水平居中

在小程序里,长度单位既可以使用rpx,也可以使用px

rpx可以使组件自适应屏幕的高度和宽度

建议以iPhone 6的宽度750个物理像素作为标准,来做设计图

保持页面元素之间的分布可以保持“一定的比例关系”,这种情况下应该使用rpx。

如果border动态变化,那么它会在屏幕尺寸较大的手机上变得很粗,这并不是我们想要的效果

小程序的模拟器选择项下,给出了每种机型的分辨率。要强调的是,这里的分辨率指的是逻辑分辨率pt,而非物理分辨率

在container view的外边,小程序还有一个默认的容器元素:page。

window配置可项用来设置小程序的状态栏、导航栏、标题和窗口的背景色

书籍绝大多数是用来引导入门和分享思想的,它不应该替代官方的API文档

◆ 第4章 文章列表页面

数据绑定是小程序中最重要的概念,它是和传统的Web网页编程相比最大的不同

小程序的image组件提供了4种缩放模式和9种裁剪模式

小程序里强制规定,只允许有最多五层父子页面

建议页面最多不要超过3层。

redirectTo不存在这个问题,因为当跳转到另一个页面后,上一个页面被强制卸载掉了。

◆ 第5章 模块、模板与缓存

还需要使用module.exports向外部暴露一个接口。

小程序也提供了一个称作模板的技术来支持对wxml组件的封装,但是这种封装仅仅只是wxml的代码片段

就必须消除template对于外部变量名的依赖,可以使用扩展运算符“…”展开传入对象变量来消除这个问题

import需要先引入template,然后再使用template;但include不需要预先引入,直接在需要的地方引入模板即可。

include模式非常简单,就是简单的代码替换,不存在作用域,也不能像import一样使用data传递变量

如果模板仅仅是静态wxml,不涉及数据的传递,可以使用include。但如果模板涉及数据绑定,还是建议使用import

引用样式文件的语法是@import “src”。

页面的JS文件中,我们使用Page(object)来注册页面,并在object中指定页面的生命周期函数等。同样,可以在app.js文件中使用App(object)来注册小程序,并在object中指定小程序的生命周期函数等

最好的初始化数据库的时机是在应用程序启动时

小程序的本地缓存有容量上限,最大不允许超过10MB

在处理缓存相关问题时,开发者要保持头脑清醒,否则有时候一个小小的缓存没更新的问题,将浪费开发者大量的时间

JavaScript里并不是没有面向对象,只不过它是用原型链的方式来实现对象的继承机制

◆ 第6章 文章详情页面

在template上注册事件是无效的

[今日一梗] 体验一下用语言让人窒息的感觉

一个听不懂基础对话逻辑的酒店前台

她告诉我们:酒店前台不负责收快递,你们的快递别丢在这里,外边就有菜鸟驿站。不然快递丢了我们负不起责任。 我们:好的,我们知道了。 快递:我给你们放到酒店前台了,记得去拿一下。 我:酒店前台不是不收快递吗?你别放那里,放驿站吧。 快递:可我已经放了,都走远了,你们去拿一下吧,谢谢啊。 (挂) 我去拿快递。 酒店前台:跟你们说了很多次了,前台不收快递!怎么还放在这? 我:我知道,不是我放的,是快递员硬要放在这的,他人已经走远了,对不住啊。 (一般事情到这就结束了对吧?) 酒店前台:可是我们前台不收快递,你放在这是不合规矩的。 我:???是快递员放在这的,我说了他不听。 前台:再跟你说一遍,我们酒店前台不收快递。 (周围人看过来了) 我:我再说一遍,是快递员自己放在这的,不是我要求他放的。 前台:可我们酒店前台没有收快递这个责任,要是东西丢了,我们不负责任。 我:?????????我知道啊,不是我放的啊。 前台:知道你还把快递放在这?丢了我们不管。 我(彻底被惹毛了):我他妈问你一遍,‘是快递员放的不是我放的’这几个字是有什么超出你母亲给予的畸形小脑所不能理解的词汇量吗? 前台:麻烦你态度好一点,我们酒店前台本来就不能放快递,这是规定。 我:还在快递……——大堂经理的电话是多少?忍不了了。 前台:经理不在。 我:购物小程序有他的电话,还有总经理的电话。 前台:??? 不知道是哪个经理过来的,反正是个穿西装,经典酒店盘头带工牌的,一来就给我们道歉,说对员工的培训不到位。 我就当场给前台写了一张逻辑思维导图————从对话逻辑开始,来梳理到底是谁没听懂。 结果前台看完思维导图,直接开启阿巴阿巴模式(不是我恶意玩梗,是那个前台真的开始阿巴阿巴了。) 然后前台委屈地说:本来我们这里就不收快递,我只是提醒他们别忘了。 结果大堂经理比我更会看盲点:“既然你这么严格执行规定,那怎么会客人的快递会出现在前台呢?” 前台:???????(阿巴阿巴模式又开启了) 她同事赶紧解释:是那个快递员擅自放进来的,应该去问保安啊! 大堂经理:“既然你亲眼看到了是快递员放的,为什么却要一而再再而三地逼迫客人不要把快递放在这?是客人放的吗?不是对吧?” 然后还是那个前台:“那保安他怎么放人….。” 大堂经理一下就怒了(本来该我发火的,但我没想到经理冒火了):“是自己的问题就说自己的问题,不要扯到别人身上去!保安?你怎么不去怪酒店大门?如果是客人不知道,或者客人自己硬要放东西在我们这,我们就说清楚,丢失概不负责!但客人没有这样做,我们的重点是:客人并没有这样做,你却说他做了,明白吗?” 最后我们得了赔偿的免费饮料跟水。 ——————至今我都不能理解那前台的杠精逻辑是怎样的,由于当时的经理已经在骂人了,我也没好意思问下去。

《买衣服》

一家女士JK店,我看到了一个让我迷惑不解的导购。 陪我妹妹买JK制服(女高中生制服),有个女生想买DK(男高中生制服) 导购员:这是男装。 女生:我知道,我想试试。 导购员:可是这个是男款。 女生:????????? 我:????????? 女生只好说明情况:“我们社团的活动,我们女生也要穿这种男款制服表演节目,所以我想试试。” 导购:那你们为什么不买女款?这是男款。 我:????????????????????? 女生:我们只买男款,有我能穿的吗? 导购突然开始漫不经心地整理衣服:“你穿不了,这是男款。” 我:???????????????????? 女生:帮我拿个小号的吧,我试试小号的外套。 导购:男款没有小号。 女生:那男款有哪些码? 导购:你穿不了,毕竟这是男款。 女生:可是我没还试啊。 导购:都不用试,男款跟女款不一样,你硬要试男款干嘛?肯定穿不了。 我:?????????????????? 女生最后翻了个白眼走了,导购还在那整理衣服,然后有个阿姨过来问她:“这些我不了解,有什么推荐吗?” 导购(看也没看那个阿姨):“你穿不了啊,这些是学生装,你穿不了。” 阿姨:“??????我给我女儿买….算了,走了,在这里买个东西真费神。” 我也带着我妹妹走了,这些店不知道是谁惯出来的————你别说什么二次元规矩不一样,真高贵也不用来三次元开店了,就该在网上开店买给纸片人收二次元币吃虚拟饭。

生日蛋糕事件

———————《其实杠精很大程度上可能真的是语言理解有问题,但他们意识不到,所以就有了以下效果》 我在温江住的时候,遇到的蛋糕店事件: 客人:我有点急,你们一个生日蛋糕需要做多久? 店员:你要多大尺寸的? 客人:五寸就好,要这种巧克力的。 店员:好的,现做也需要XX小时,您可以等吗? 客人:那有点久了,算了。 (这是正常的是吧?但我遇到的是这样的: 客人:我有点急,我要赶快买一个生日蛋糕走,你们现做蛋糕最快是多久? 店员:不行,快了做不出来。 我:???????? 客人:??????? 客人:那你们平时做一个蛋糕需要多久? 店员:真的快不了。 客人:???????你就直接告诉我如果现在,现做一个蛋糕,需要多长时间好吗? 店员:10寸的一般需要XX小时,您看您可以吗? 客人:来得及。这样,我就要一个这个(指橱窗里的蛋糕模型),需要尽快带走,做个八寸,我一会要去赶飞机,你们尽快一点就行。 店员:我理解您的心情,但这个是模型不可以带走的。 我:?????????????? 客人:?????????????我赶飞机你别跟我开玩笑好吗 店员:噢噢,所以您是现做是吗? 客人:废话。 店员:那您是需要哪种蛋糕? 客人:…..这个(指橱窗里),做个八寸的,是不是更小一点的你们会做得很快些? 店员:所以是八寸吗? 客人:我是问更小的尺寸会不会做得更快些?比如五寸? 店员:所以是五寸还是八寸呢? 客人:你在逗我玩是吗?我要赶飞机,马上要带一个蛋糕走,你们快点回答行吗? 店员:对不起….那您是要八寸还是要五寸? 我:他在赶时间!请快点给他做一个五寸的巧克力小森林蛋糕!样品编号是24!请做快一点!我都听懂了! 店员:好的———但是我们这个快不了,所以您还是要现做是吗? 客人:?????????????? 我:???????????? 窗户后的蛋糕师:????????? 我对客人说道:这样,哥,您去外卖软件下单一个离你抵达机场最近的蛋糕店,预订一个蛋糕,下了飞机就能打车去取,比在这浪费时间强。 客人对我表示了感谢,骂了一句店员就走了。

《工作的杠精》

我有点明白为什么有些老板遇上个傻助理会开始破口大骂了。 我之前去一个公司帮人改拍摄,我让那个助理改下分镜头的几个场景,他打字,我说。 他说不能改,都是写好了的。 我说改了之后我去跟客户那边协商,其余事他不用管,只管改就行了。 助理:这就是客户定好了的。 我:客户说了可以改,我跟他们说好了。 助理:但我这边没收到任何消息。 我:他们跟我私聊的,给你看下(递手机)。 助理:但我没收到消息,你这就是不行。 我:什么叫你没收到消息呢?是需要老板给你发消息确认下吗? 助理:就是我这里没收到消息。 我:是需要什么消息呢?是客户的还是老板的? 助理:(白眼)就是没收到,没收到消息就是没收到,我不能改。 我:…那我自己改?你去喝茶,这里我来弄。 助理:你得跟编剧还有摄影师说,这是编剧写好了的分镜,也是客户定好了的。 我:可是客户说要改啊。 助理:编剧呢? 我:编剧当然是听客户要求啊。 助理(有点茫然):哦….那…老板怎么说? 我:我就是老板请来改分镜改剧本的。 助理:哦…可是编剧他们知道吗? 我:??????????????????????????????——知道。 助理:摄影师他们都知道吗? 我:??????????????????????????????你不想改我来改,好吗? 助理:不行,这是公司的电脑,外人不能用。 我:??????????????????????????????把分镜发我文档吧。 助理:好。 他发了一个PDF格式(图片模式)的过来。 我:????????????????????为什么? 助理:因为这个分镜是定好了的,所以对外我们只能发PDF格式。 我:可是我要改啊….算了算了,你真行,等我。 最终我给老板打了个电话,老板给他打了个电话,我在外面都听到了电话那头老板破口大骂的声音,然后就换了个人来帮我打字。 也就是拍摄时,我已经看不到他了(真的被辞退了),真好。 那老板告诉我,也是幸好遇到了我,要是他去对接客户,估计客户就撤资走人了。 因为之前客户问他一个问题,他也是非要给人杠两句。 客户想看样片,他回:我们没剪完,要发完整的。 客户说把剪完的发我看下,他回:那你得去问剪辑师,不是问我。 客户:???????????????????? 客户:剪辑师微信在哪? 他:稍等。 然后他就让客户等着,等一天了,剪辑师把东西剪完了,他就把完整的样片发给了客户。 客户第一次收到了样片被气得鬼火冒。

来源

查询谷歌账号注册时间方法(2022)

谷歌查看注册时间 具体方法如下:

打开“管理您的 Google 帐号”

打开“数据和隐私设置”

打开“您使用的应用和服务中的数据”-“下载或删除您的数据”-“下载您的数据”

选择 “Google 导出”选择“Google 帐号”

下载压缩包后,就可以查看html数据内容了

参考文献

[摘录]《OpenResty完全开发指南:构建百万级别并发的Web应用》 – 罗剑锋

OpenResty完全开发指南:构建百万级别并发的Web应用 罗剑锋 131个笔记

◆ 第1章 总论

[插图]

OpenResty使用四位数字作为版本号,形式是:a.b.c.x,其中前三位数字是内部Nginx的版本,作为大版本号,第四位数字是OpenResty自己的发布版本号,也就是小版本号

​​/usr/local/openresty/ #安装主目录
├── bin #存放可执行文件
├── luajit #LuaJIT运行库
├── lualib #Lua组件
├── nginx #Nginx核心运行平台
├── pod #参考手册(restydoc)使用的数据
└── site #包管理工具(opm)使用的数据​​

利用UNIX的“Shebang”(#! ),在脚本文件里的第一行指定resty作为解释器

[插图]

◆ 第2章 Nginx平台

Nginx是一个高性能、高稳定的轻量级HTTP、TCP、UDP和反向代理服务器

配置HTTP相关的功能需要使用指令http{},定义OpenResty里对外提供的HTTP服务,通常的形式是: ​​http { #http块开始,所有的HTTP相关功能
 server { #server块,第一个Web服务
 listen 80; #监听80端口
 location uri { #location块,需指定URI
 … #定义访问此URI时的具体行为
 } #location块结束
 } #server块结束
 server { #server块,第二个Web服务
 listen xxx; #监听xxx端口
 … #其他location定义
 } #server块结束
} #http块结束​​ 由于http块内容太多,如果都写在一个文件里可能会造成配置文件过度庞大,难以维护。

反向代理(Reverse Proxy)是现今网络中一种非常重要的技术,它位于客户端和真正的服务器(即所谓的后端)之间,接受客户端的请求并转发给后端,然后把后端的处理结果返回给客户端

◆ 第3章 Lua语言

Sol”这个词在葡萄牙语(巴西官方语言)里是太阳的意思,而“Lua”的意思就是月亮。

知名的应用有Adobe Lightroom、Fire-fox、Redis等,而游戏则有《魔兽世界》《愤怒的小鸟》《我的世界》等。

Lua语言提供六种基本的数据类型

Lua的字符串形式非常灵活,单引号或者双引号都可以,字符串里也允许使用转义符

Lua还用“[[…]]”的形式支持raw string,括号内的字符不会转义,在写正则表达式或者字符串里有引号、斜线的时候非常方便

与多行注释类似,“[[…]]”的形式也支持在括号中间插入“=”,而且如果“[[”后面是一个换行,那么Lua会自动忽略这个换行,在书写大量文字时是个非常方便的特性

Lua字符串的另外一个特点是只读的

Lua语言在内部使用一个全局散列表来管理所有的字符串,所以多个相同的字符串不会占用多份内存

Lua语言里的变量有作用域的概念,分为局部变量和全局变量,名字区分大小写

局部变量需要使用关键字“local”声明,作用域仅限本代码块(文件内或语句块内),没有关键字“local”声明的变量都是全局变量,而且不需要声明就可以直接使用

在Lua里应当尽量少使用全局变量,多使用局部变量

因为“局部化”,解释器查找的速度也更快

一个比较常用的全局变量是:“_”(下画线,也是合法的变量名)

Lua语言里没有“常量”,实践中我们通常用全大写名字的变量来表示常量

Lua里的运算有算术运算、关系运算、逻辑运算、字符串运算等

不等比较使用的是“~=”

在执行大于或小于比较操作时Lua会检查变量的类型,如果类型不同就会出错

但“==”和“~=”的行为则不同,如果类型不同会直接返回false

为了避免发生意外,必须用函数tonumber()/tostring()显式转换数字或字符串后再做比较运算

Lua的逻辑运算符有and、or和not三个

nil和false认为是假,其他都是真,包括数字0

x and y,如果x是真,返回y,否则返回x

x or y,与and操作正好相反,如果x是真,返回x,否则返回y

not x,只返回true/false,对x取反

Lua对字符串连接操作提供了一个特别的运算符“..”

连接运算还可以自动把数字转换为字符串,无须显式调用tostring()函数:

字符串连接操作应当尽量少用,因为每一次字符串连接就会创建一个新的字符串对象

如果多次操作超长字符串(例如几十MB的大块数据)就可能会导致LuaVM内存耗尽,发生错误。

计算字符串的长度可以用另一个特别的运算符“#”

字符串的关系运算基于字符序(例如最常用的ASCII码表)逐个检查,但相等比较是直接计算内部保存的散列值

很多时候对nil运算都会导致错误

如果一个变量可能是nil,最好使用or运算给它一个默认值

Lua里的语句包括赋值语句、分支语句和循环语句

Lua语句的格式非常自由,不强制要求缩进。语句末尾可以使用“;”表示结束,但不是必需的

使用“do…end”的形式就声明了一个语句(代码)块

Lua使用“=”在变量里存储一个确定类型的值

Lua还允许用逗号分隔,在一个语句里声明或赋值多个变量

如果给一个变量赋值为nil,就表示删除了这个变量

Lua的分支语句只有一种,就是if-else

多重分支需要使用“elseif”

Lua语言的循环语句有while、repeat-until和for三种

repeat-until循环与while差不多,但条件判断与while意义是相反的

Lua的for循环语句有两种形式:数值循环和范围循环

for的数值循环类似其他语言的标准for语句,但形式上要简洁一些

变量var从m前进(或后退)到n,执行循环体里的语句,参数step是用于控制var前进或后退的步长,可以省略,默认是1

for循环里的变量var会自动声明为局部变量

可以用break或者return直接跳出循环,用法与其他语言相同,但必须在语句块的最后——也就是后面紧跟着end/until关键字

如果想要在任意的位置结束循环,可以使用“do break end”的形式

OpenResty使用的LuaJIT扩展支持goto,可以变通实现continue

在Lua语言里函数是一类特殊的变量,它持有一个语句块,能够使用参数执行语句块(也就是“调用”),然后返回结果

Lua的函数就是变量,也可以(最好)使用local局部化。

可以传入任意数量的实参,少的默认值是nil,多的则被忽略

函数的返回值使用return语句,可以用逗号分隔返回多个值,但如果被调用时使用圆括号包围则只会返回一个值

Lua函数的参数都是传值(但表除外)

如果调用时只有一个传入的参数,而且这个参数是字符串或者表,那么Lua允许省略函数的“()”,直接在函数名后写参数

但Lua的表更加灵活,能够模拟出array、list、dict、set、map等常见数据结构,或者其他任意复杂的结构

Lua表里作为索引的key可以是任何非nil值,所以当key类型是整数时表就相当于数组,key类型是字符串时表就相当于字典或关联数组

Lua表对value的类型没有任何限制,当然也可以是另外一个表,从而实现多个表的嵌套。

Lua里定义表使用花括号“{}”

直接使用“{}”就是一个空表,在里面简单地列出表内的元素就声明了一个数组形式的表,使用“key=value”的形式就可以声明为字典形式的表

使用“key=value”的形式时key不需要用单引号或双引号,如果必须要用(例如key里有空格或者其他特殊符号)则要使用“[key]=value”的形式

定义表时的逗号“,”也可以改用分号“;”,两者没有不同,但可以做一些形式上的区分

Lua的表是动态的数据结构,不仅可以访问已有的元素,也可以随时向表里添加或删除元素

操作表里的元素需要使用方括号“[]”

当表作为数组来使用时整数下标索引必须从1开始计数

如果key是字符串我们也可以直接使用点号“.”来操作

运算符“#”可以计算形式表里的数组元素数量,配合for循环可以实现遍历数组

对于字典形式的表,暂时没有办法能够直接获取元素的数量,使用“#”会返回0

for循环语句的第二种形式——范围循环主要用于遍历表里的元素,但需要两个标准库函数的配合:ipairs()和pairs()。

模块就是一个函数集合,通常表现为一个Lua表,里面有模块作者提供的各种功能函数,使用点号“.”即可访问

使用require函数可以加载模块,参数是模块所在的文件名(省略后缀)

通常我们需要用变量来保存require函数的返回结果

require在加载模块的同时会执行文件里的代码

如果使用字符串作为key,那么表本身就是对象,可以任意存储变量和函数

封装”方面,Lua不提供private、public这样的修饰词,表里的所有成员都是公开的

如果想要实现私有成员,那么可以在模块文件里用local修饰

“多态”特性对于Lua来说非常简单,由于表是动态的,里面的成员都能够在运行时随意替换,没有编译型语言静态绑定的烦恼。

继承”在Lua语言里是不提倡的特性,替代方案是使用“原型”(prototype)模式,从一个“原型”对象“克隆”出一个新对象,然后再动态变更其属性,从而达到与“继承”类似的效果。

“原型”模式需要使用Lua的高级特性“元表”(metatable)和函数setmetatable()。

元表描述了表的基本行为,有些类似C++或者Python里的操作符重载,我们需要用的是“__index”元方法,它重载了Lua里查找key的操作,也就是table.key。

函数setmetatable(t, meta)把表t的元表设置为meta并返回t。

如果meta里设置了“index”方法,那么对t的操作t.key也会同样作用到meta上,即meta.key。这样,表t就“克隆”了表meta的所有成员,表meta就成为了表t的“原型”。 可以通过下面的例子来进一步理解Lua的“原型”操作: ​​local proto = {} — 首先声明一个原型对象,暂时是空表
function proto.go() — 为表添加一个方法,即成员函数
 print(“go pikachu”)
end
local mt = { index = proto } — 定义元表,注意重载了“index”
local obj = setmetatable({}, mt) — 调用setmetatable设置元表,返回新表
obj.go() — 新对象是原型的“克隆”,可以执行原型的操作​​ 代码里的关键操作是定义元表mt,里面只需要设置“index”方法,然后再使用函数setmetatable从mt克隆出一个新的对象。 这两个步骤也可以合并为一次操作:

Lua为面向对象的方式使用表内成员函数提供一个特殊的操作符“:”,它的功能与“.”基本相同,但在调用函数时会隐含传入一个“self”参数

“:”和self不仅可以用在函数调用时,也可以用在函数定义时

“:”其实是一种“语法糖”,是简化的“.”写法

建议尽量使用“:”,它更简洁一些

应该用OpenResty自己的ngx.re系列函数

过table.insert的效率并不高,我们可以用如下的方式更高效地在末尾添加元素:

a[#a + 1] = ‘nginx’ — 利用“#”运算符获取长度来添加元素​​

io库里是操作文件的函数,由于文件通常存储在磁盘上,而且是阻塞操作,速度很慢,在OpenResty里应当尽量少用。

在读取数据时,可以使用参数“a”(即all)读取整个文件,或者“l”(即line)读取一行,使用数字则读取指定长度的字节

os库包含有操作系统和时间日期相关的函数

形象(但不很准确)地来说,“闭包”就是一个“活的函数”,存在于程序的“高维空间”,可以任意操作函数外部的数据

如果想要Lua代码更加健壮,我们可以使用保护模式来执行可能出错的函数

pcall(protected call)是base库里的一个特殊函数,它“保护调用”一个函数,绝对不会出错,并以true/false返回调用结果

◆ 第4章 LuaJIT环境

LuaJIT是Lua语言的另一个实现,包括一个汇编语言编写的解释器和一个JIT编译器

使用“::label::”的形式定义标签,之后就可以随时用goto改变程序的流程

LuaJIT增强了table库,为它添加了一些新函数,其中较有用的有table.new、table.clear和table.clone。

函数table.clear把表置为空表,但保留之前分配的内存

函数table.clone是OpenResty的LuaJIT分支独有特性,可以高效地“浅”拷贝表(shallow clone)

ffi库不仅可以调用系统函数和OpenResty内部的C函数,还可以加载so形式的动态库,调用动态库里的函数

LuaJIT总是先用解释器运行编译后的字节码,并在运行时做“热点分析”,如果某段代码足够“热”,就会自动触发JIT编译器,尝试把字节码再编译成本地的机器码,让程序能够以最快的速度运行。

有的Lua函数因为实现的代价较高所以不会被编译,只能以字节码的形式运行,这些被称为NYI(Not Yet Implemented)。

◆ 第5章 开发概述

OpenResty提供一个专用指令“content_by_lua_block”,可以在配置文件里书写Lua代码,产生响应内容

启动应用需要使用“-c”参数,让OpenResty以指定的配置文件运行:/usr/local/openresty/bin/openresty -c “pwd/hello.conf”

5.1节的例子是最简单的OpenResty应用,只有一个配置文件,应用代码写在了配置文件里。但实际的项目要比它复杂很多,配置文件和应用代码最好分离管理维护,此外还会有其他的监控脚本、日志文件、数据文件等,必须要用很好的目录层次把它们组织起来。 通常一个OpenResty应用的目录结构如下:[插图] ​​path/to/application #应用的主目录
├── bin #脚本目录,存放各种脚本文件
├── conf #配置目录,存放Nginx配置文件
│ ├── http #存放HTTP服务的配置文件
│ ├── stream #存放TCP/UDP服务的配置文件

在OpenResty里ngx_lua和stream_lua分别属于两个不同的子系统,但指令的功能和格式基本相同

OpenResty目前关注的是initing和running这两个阶段,并做了更细致的划分。

开发者必须较好地理解这些阶段的含义和作用,再结合自己的实际业务需求,选择恰当的阶段编写代码实现功能

OpenResty使用“定时器”来周期性地(一次或多次)执行“后台任务”。

这些接口大部分位于全局表ngx里,无须require即可访问(不过也有部分例外)

与Lua自带的标准库函数不同,它们基于Nginx的事件机制和Lua的协程特性,都是“100% nonblocking”的,能够让我们轻松编写出同步非阻塞的高效代码

OpenResty自带了很多Lua库(位于安装目录的lualib内), lua-resty-core是其中最重要的一个,它使用ffi重新实现了OpenResty里原有的大多数函数,并增加了一些新的功能。

◆ 第6章 基础功能

ngx.sleep是OpenResty提供的同步非阻塞的睡眠函数,可以“睡眠”任意的时间长度但不会阻塞整个服务,这时OpenResty会基于协程机制转而处理其他的请求,等睡眠时间到再“回头”继续执行ngx.sleep后续的代码。

MessagePack是一种二进制数据编码格式,与JSON相比更加小巧紧凑,适合序列化传输大批量的数据。

OpenResty在表ngx.re里提供六个正则表达式相关函数,它们的底层实现是PCRE库,速度极快,完全可以代替Lua标准库的字符串匹配函数

正则替换也有两个函数:ngx.re.sub和ngx.re.gsub,我们在使用时最好不要加“o”选项(原因见6.5.2节

ngx.re.gsub是ngx.re.sub的增强版,可以执行多次正则替换

Cache的容量通常都是有限的,需要使用某种算法更新淘汰数据,较常见的有FIFO、LFU、LRU等

OpenResty基于LRU算法提供了一个方便易用的Cache库lua-resty-lru-cache,并且支持过期时间功能(expire)

cache对象的功能接口十分简单易用,提供基本的set/get/delete等操作,用起来就像是一个Key-Value的散列表,缓存内的元素也可以是任何Lua数据(数字、字符串、函数、表等),无须序列化或反序列化

◆ 第7章 HTTP服务

状态码表示HTTP请求的处理状态,目前RFC规范里有一百多个,在OpenResty里只定义了少量最常见的,

◆ 第8章 访问后端

必须利用Redis、MySQL等数据库服务存储缓存、会话和其他数据,利用Kafka、RabbitMQ等消息队列服务异步发送消息,以及访问Tomcat、PHP等业务服务,访问ZooKeeper、Consul等配置服务,综合协调这些后端才能为最终用户呈现出一个功能完备的应用服务。

第一反应要三思

人的第一反应或许常常是处于本能的,

而本能或是条件反射多是为了生存思考,

这种条件下产生的行为一定是“自私”的。

时常管好自己的第一反应,

这种行为也分为多种境界。

一句话脱口而出之前好好想想,是不是出于本能,是不是出于条件反射。

如果是,那就三思,充分思考过后再说,毕竟说出去的话是收不回来的。

另一层境界,一件事情发生之前,第一反应的思考方向。

产生这种想法,首先判断一下,是不是出于本能,是不是条件反射。

如果是,思考一下这种思路是不是真的有用,是不是真的为大局考虑。

如果有悖这几个方向,那就得调整一下。

毕竟思路错了,行为就错了,犯下的错误更加深远,更加难以挽回。

坚持习惯从身边的点滴做起

每天都想早睡,但有时候就是容易晚睡,如何才能实现早点睡呢。

发现其实也很简单,将睡下之前的所有工序提早做完,再去做可能拖延的事情。

以我自己为例,可能导致我晚睡的大概有这几种事情:

  1. 看书看入迷;
  2. 看电影或电视剧入迷;
  3. 做东西、研究某样技术入迷;
  4. 了解某样知识入迷;
  5. 做东西入迷。

这些事情都有一个共同的特征,那就是灵活性极强,可以搞很久很久,也可以很快结束。

那么耽误我入睡的事情都有哪些呢:

  1. 洗漱花费时间;
  2. 洗澡洗衣服花费时间;
  3. 不想洗衣服花费时间;

综上,如果以上两个清单中同时有情况命中,那我当天一定就是晚睡无疑了。

破解的方法也很简单,那就是现在就去做。

如果我想要早睡,那我就把睡前所有工序完成,只要我想立刻就能去睡。

另外,把那些自己不想做的事情,现在就做掉。

比如我不想洗袜子、洗衣服,因为不想做这件事可能就会拖延到很久,很多次因为这种事情拖延到两三点才睡。拖到最后还不是要做的,那就赶快去做了,然后再来做自己入迷的事情。

将那些可能分担自己精力的事情先做完,然后集中精力做那些需要聚精会神的事情。

如此一来,既能不耽误事情,又能养成良好习惯。

总结一下,想要坚持好喜欢,又想要做想做的事,两全其美的方法,就是现在就去做。

前事不忘,后事之师

前事不忘,后事之师。

今天,是我国第9个 南京大屠杀死难者国家公祭日 85年前的今天 侵华日军制造了 惨绝人寰的大屠杀

那段痛苦的历史,是所有中国人不能忘却的记忆。 通过纪念日的形式,每年加强一次, 所有中国人绝对不能忘记。

还记得那年在南京城, 侵华日军南京大屠杀遇难同胞纪念馆。

一个个令人痛彻心扉的数字, 一幅幅令人毛骨悚然的照片, 一件件指向罪恶之人的铁证, 无一不让我刻骨铭心。

作为后人, 能做的就是不要忘记, 让这段痛苦的历史, 成为自己日后向上的动力, 努力让自己变得更强大, 如果可能, 为强大的祖国奉献微薄之力。

参考文献

精神力充能跟吃饭一样重要

除了吃饭,好要注意补充精神力。

吃饭可以补充能量,让人有力气去做事情。

但越发的发现,吃饭不能补充人的精神力。

每天面对错综复杂的现实情况,我们的精神世界很容易疲惫。

为了生存,需要用最大的力气去努力做事。

出了耗费自己的力气,对于精神力也是一种损耗。

补充精神力的方式,因人而异。

可能是看书、看电影、听音乐、一个人走路,甚至是,看《爱情公寓》?

总结一下,但凡事能够让自己感到轻松,带来勇气的事情,就可以用来充能。每个人方式不同,根据自己的实际情况调整。

我愿称这种力之为“精神力”,其重要地位仅次于吃饭。