当前位置: 首页 > news >正文

在 openresty 中使用 capnp lua 库

1. 安装必要的工具和库

apt-get install capnproto luarocksluarocks install lua-capnproto
luarocks install lua-cjson

lua-cjson 库不是必须的,是由于后面的演示程序要使用,就一起装上了。

可以看下库的安装位置:

root@350983744ebf:~# luarocks show lua-capnprotolua-capnproto 0.1.4-5 - Lua-capnproto is a pure lua implementation of capnproto based on LuaJIT.Lua-capnproto is a pure lua implementation of capnproto based on LuaJIT.License:        BSD
Homepage:       https://github.com/calio/lua-capnproto
Installed in:   /usr/localModules:capnp (/usr/local/share/lua/5.1/capnp.lua)capnp.compile (/usr/local/share/lua/5.1/capnp/compile.lua)capnp.util (/usr/local/share/lua/5.1/capnp/util.lua)handwritten_capnp (/usr/local/share/lua/5.1/handwritten_capnp.lua)handwritten_data_generator (/usr/local/share/lua/5.1/handwritten_data_generator.lua)random (/usr/local/share/lua/5.1/random.lua)schema_capnp (/usr/local/share/lua/5.1/schema_capnp.lua)test (/usr/local/share/lua/5.1/test.lua)tool (/usr/local/share/lua/5.1/tool.lua)Depends on:lua ~> 5.1 (using 5.1-1)

默认库都是安装到了 /usr/local/share/lua/5.1/ 目录下。

2. 编译 capnp 文件

先将 openresty 自带的 luajit 程序目录加入 PATH 路径中:

export PATH=$PATH:/usr/local/openresty/luajit/bin

新建一个AddressBook.capnp 文件,内容如下:

@0xdbb9ad1f14bf0b36;  # unique file ID, generated by `capnp id`struct Person {id @0 :UInt32;name @1 :Text;email @2 :Text;phones @3 :List(PhoneNumber);struct PhoneNumber {number @0 :Text;type @1 :Type;enum Type {mobile @0;home @1;work @2;}}employment :union {unemployed @4 :Void;employer @5 :Text;school @6 :Text;selfEmployed @7 :Void;# We assume that a person is only one of these.}
}struct AddressBook {people @0 :List(Person);
}

然后编译 capnp 文件:

root@350983744ebf:~# capnp compile -olua AddressBook.capnp
root@350983744ebf:~# ls -lh
total 36K
-rw-r--r-- 1 root root  532 Oct 22 21:18 AddressBook.capnp
-rw-r--r-- 1 root root  21K Oct 22 21:20 AddressBook_capnp.lua

得到 AddressBook_capnp.lua 文件。

3. 写一个测试程序

新建一个目录,将 AddressBook_capnp.lua 文件放到这个目录。

root@350983744ebf:~# mkdir /usr/local/openresty/lua
root@350983744ebf:~# cd /usr/local/openresty/lua
root@350983744ebf:/usr/local/openresty/lua# cp /root/AddressBook_capnp.lua .

在这目录新建一个 lua 程序文件 main.lua,内容如下:

local addressBook = require "AddressBook_capnp"
local capnp = require "capnp"
local cjson = require "cjson"
local util = require "capnp.util"local data = {people = {{id = 123,name = "Alice",email = "alice@example.com",phones = {{number = "555-1212",["type"] = "MOBILE",},},employment = {school = "MIT",},},{id = 456,name = "Bob",email = "bob@example.com",phones = {{number = "555-4567",["type"] = "HOME",},{number = "555-7654",["type"] = "WORK",},},employment = {unemployed = "Void",},},}
}local bin = addressBook.AddressBook.serialize(data)
local decoded = addressBook.AddressBook.parse(bin)ngx.say(cjson.encode(decoded))

这个程序将一个 lua 数据【数据格式是按照 AddressBook.capnp 文件定义的】序列化成 capnp 二进制数据,然后将二进制数据反序列化成 lua 数据,最后使用 cjson 库将 lua 数据序列化成 json 格式,使用 nginx 输出。

4. 验证程序

修改 nginx 配置文件【 /usr/local/openresty/nginx/conf/nginx.conf】内容为:

worker_processes  1;events {worker_connections  1024;
}http {lua_package_path "/usr/local/openresty/lua/?.lua;;";server {listen       80;server_name  localhost;location /capnp {content_by_lua_file /usr/local/openresty/lua/main.lua;}}
}

启动 nginx 并验证结果:

root@350983744ebf:~# /usr/local/openresty/nginx/sbin/nginx        root@350983744ebf:~# 
root@350983744ebf:~# curl 127.0.0.1/capnp
{"people":[{"phones":[{"number":"555-1212","type":"MOBILE"}],"id":123,"name":"Alice","employment":{"school":"MIT"},"email":"alice@example.com"},{"phones":[{"number":"555-4567","type":"HOME"},{"number":"555-7654","type":"WORK"}],"id":456,"name":"Bob","employment":{"unemployed":"Void"},"email":"bob@example.com"}]}

和预期相符。

相关文章:

在 openresty 中使用 capnp lua 库

1. 安装必要的工具和库 apt-get install capnproto luarocksluarocks install lua-capnproto luarocks install lua-cjsonlua-cjson 库不是必须的,是由于后面的演示程序要使用,就一起装上了。 可以看下库的安装位置: root350983744ebf:~# …...

私藏小技巧:让微信朋友圈营销方便化的小窍门!

微信,这个拥有十亿用户的社交软件,已经成为生活中不可或缺的一部分。 而朋友圈,这个微信的基础功能,是聚宝盆,也是一切流量的尽头。 现在公域+私域的流量增长变现体系很火。朋友圈是一切公域流量的尽头&a…...

Centos使用tomcat部署jenkins

jenkins的最新版本已经不在支持jdk8,支持的jdk环境如下: 安装jdk环境 yum -y install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64安装tomcat tomcat官网 cd /optwget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.82/bin/apache-tomcat…...

uni-app打包apk实现自动更新

一、直接复制粘贴就可用(豪横) app.vue文件里写 //app.vue里写 <script>export default {onShow: function() {console.log(App Show)},onHide: function() {console.log(App Hide)},onLaunch: function() {let appVersion uni.getSystemInfo({success: function(e) {ap…...

SRS srs-bench

1 srs-bench 音视频压测工具&#xff0c;包括RTMP/FLV/WebRTC/GB28181等&#xff0c;未来还会完善。 SB(SRS Bench) is a set of benchmark and regression test tools, for SRS and other media servers, supports HTTP-FLV, RTMP, HLS, WebRTC and GB28181. For RTMP/HLS/F…...

HackTheBox-Starting Point--Tier 1---Appointment

文章目录 一 题目二 实验过程 一 题目 Tags Web、Databases、Injection、Apache、MariaDB、PHP、SQL、Reconnaissance、SQL Injection译文&#xff1a;Web、数据库、注入、Apache、MariaDB、PHP、SQL、侦察、SQL 注入Connect To attack the target machine, you must be on …...

【工具】Java请求带http重定向的地址 自动进行重定向

【工具】Java请求带http重定向的地址 自动进行重定向 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;public class HTTPGETWithMultipleHeaders {public static voi…...

接口自动化测试方案

1、引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 XXXXX&#xff0c;XXX 所属部门 XX 备注 1.3 文档目的 本文档主要用于指导XXX-YY项目常用接口自动化测试…...

TikTok文化探索:热议时事与社会话题

在当今数字时代&#xff0c;社交媒体平台如TikTok已经成为了我们日常生活中不可或缺的一部分。它不仅仅是一个娱乐应用&#xff0c;也是一扇窥视世界、探讨时事和社会话题的窗户。本文将深入探讨TikTok如何成为文化探索的平台&#xff0c;热议时事和社会话题&#xff0c;以及它…...

springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作

第一步&#xff1a;在mongodb的官网里面创建云服务器 点进去 这是免费的&#xff0c;由于是一个项目只可以创建一个&#xff0c;这里我已经创建好了 用本地的mongodb服务也是可以的 第二步&#xff1a;点击connect,下载连接mongodb的软件&#xff1a;MongoDBCompass 第三步&am…...

QWEN technical report

通义千问-Qwen技术报告细节分享 - 知乎写在前面大家好&#xff0c;我是刘聪NLP。 阿里在很早前就开源了Qwen-7B模型&#xff0c;但不知道为什么又下架了。就在昨天阿里又开源了Qwen-14B模型&#xff08;原来的7B模型也放出来了&#xff09;&#xff0c;同时还放出了Qwen的技术报…...

提升MODBUS-RTU通信数据刷新速度的常用方法

SMART PLC的MODBUS-RTU通信请参考下面文章链接: 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客MODBUS通讯非常简单、应用也非常广泛,有些老生常谈的问题,这里不再赘述,感兴趣的可以参看我的其它博文:SMART200PLC MODBUS通讯专题_RXXW…...

PyTorch 与 TensorFlow:机器学习框架之战

深度学习框架是简化人工神经网络 (ANN) 开发的重要工具&#xff0c;并且其发展非常迅速。其中&#xff0c;TensorFlow 和 PyTorch 脱颖而出&#xff0c;各自在不同的机器学习领域占有一席之地。但如何为特定项目确定理想的工具呢&#xff1f;本综合指南[1]旨在阐明它们的优点和…...

超简单理解冒泡排序

1.冒泡排序(Bubble Sort) 较简单排序算法。 它会遍历若干次要排列的数列&#xff0c;每次遍历&#xff0c;会从前往后比较相邻两个数的大小。 如果前者比后者大&#xff0c;就交换他们位置。遍历一次最大元素在数列末尾。重复直到数列有序。 那么遍历需要一个变量控制范围。…...

模拟IC设计工程师成长日记

很多IC设计的新人&#xff0c;不知道进入IC设计行业后会有哪些成长和学习的地方。 很多初入IC设计职场的人也都会比较恐慌&#xff0c;成长进步需要一个时间和经验的积累 今天给大家找了一个叫“模拟IC设计“攻城狮”的成长日记供大家参考. 以模拟IC设计工程师的身份进入职场&a…...

修炼k8s+flink+hdfs+dlink(六:学习namespace,service)

一&#xff1a;什么是namespace&#xff1f; 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间&#xff0c;它们在逻辑上彼此隔离。 他们可以为您和您的团队提供组织&#xff0c;安全甚至性能方面的帮助&#xff01; 二&a…...

法语导游就业前景如何?

随着国际交流的日益频繁&#xff0c;旅游业正在迅猛发展。尽管全球讲法语的人数并不算多&#xff0c;但讲法语的国家分布广泛。因此&#xff0c;如何成为一名合法的法语导游&#xff0c;以及法语导游的就业前景如何&#xff0c;成为了法语爱好者比较关注的问题。 我们知道&…...

iOS自动混淆测试处理笔记

1 打开 ipa&#xff0c;导出ipa 路径和配置文件路径会自动填充 2 点击 开始自动混淆测试处理 自动混淆测试是针对 oc 类和oc方法这两个模块进行自动混淆ipa&#xff0c;并ipa安装到设备中运行&#xff0c;通过检测运行ipa包是否崩溃&#xff0c;来对oc类和oc方法进行筛选。如果…...

C51--单片机中断

51单片机是单线程模式&#xff0c;需要用到硬件中断。 一、中断系统 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理器CPU正在处理某件事的时候&#xff0c;外界发生了紧急事件请求&#xff0c;要求CPU暂停当前工作&#xff0c;转而去处理这个紧急…...

Linux中关于glibc包导致的服务器死机或者linux命令无法使用的情况

glibc是gnu发布的libc库&#xff0c;即c运行库。glibc是linux系统中最底层的api&#xff0c;几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外&#xff0c;它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX …...

艾泊宇产品战略:华为手机品牌是如何从低端到高端的

华为在过去一直以几百块钱的低端手机为主&#xff0c;但如今已经可以跟苹果一争高下。 这个转变是华为经过了近二十年的艰苦努力才实现的。 我艾泊宇作为一个亲历者深度研究了华为的成长历程&#xff0c;发现这是一个经典的商业教科书案例。 这里面有很多值得今天中国企业学…...

视频批量AI智剪:提升剪辑效率的秘密方法

随着视频内容的爆炸式增长&#xff0c;剪辑师面临着巨大的工作压力。传统的剪辑方法往往效率低下&#xff0c;无法满足快速、高质量的剪辑需求。为了解决这个问题&#xff0c;视频批量AI智剪技术应运而生&#xff0c;成为提升剪辑效率的秘密方法。 视频批量AI智剪是指利用人工…...

linux环境执行jar脚本

一、前言 平常工作中&#xff0c;我们的开发的项目部署到linux环境&#xff0c;以jar包的方式运行&#xff0c;涉及jar包的启动、停止、查看状态等&#xff0c;我们可以通过脚本的方式进行维护&#xff0c;减少自己敲打一长串的命令少敲一个字母或者多敲一个字母&#xff0c;方…...

特权同学FPGA官方全资料包括电子书下载

特权同学FPGA官方全资料包括电子书下载 特权同学倾情奉献海量FPGA学习资料 链接:http://pan.baidu.com/s/1bptgnKF 下载器安装说明 链接:http://pan.baidu.com/s/1dFNXvrV SF-AT7 USB3.0+LVDS+FPGA开发套件 链接:http://pan.baidu.com/s/1c24bVZa SF-HSC USB3.0+LVDS…...

《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力

10.4.1 模型 Bahdanau 等人提出了一个没有严格单向对齐限制的可微注意力模型。在预测词元时&#xff0c;如果不是所有输入词元都相关&#xff0c;模型将仅对齐&#xff08;或参与&#xff09;输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现…...

iOS_Crash 四:的捕获和防护

文章目录 1.Crash 捕获1.2.NSException1.2.C异常1.3.Mach异常1.4.Unix 信号 2.Crash 防护2.1.方法未实现2.2.KVC 导致 crash2.3.KVO 导致 crash2.4.集合类导致 crash2.5.其他需要注意场景&#xff1a; 1.Crash 捕获 根据 Crash 的不同来源&#xff0c;分为以下三类&#xff1a…...

spring boot项目运行jar包读取包内resources目录下的文件

spring boot项目运行jar包读取包内resources目录下的文件 摘要码代码相关文章 摘要 Spring Boot 项目打包成 jar 包后&#xff0c;resources 目录下的文件将会被打包到 jar 包中。如果需要在 Spring Boot 项目运行 jar 包后读取 resources 目录下的文件&#xff0c;可以使用 t…...

浙大陈越何钦铭数据结构06-图1 列出连通集

题目 给定一个有N个顶点和E条边的无向图&#xff0c;请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时&#xff0c;假设我们总是从编号最小的顶点出发&#xff0c;按编号递增的顺序访问邻接点。 输入格式: 输入第1行给出2个整数N(0<N≤10)和E&…...

C# Winform编程(9)网络编程

网络编程 HTTP网络编程IPAddress IP地址类WebClient类WebRequest类和WebResponse类 WebBrowser网页浏览器控件TCP网络编程TcpClient类TcpListener类NetworkStream类Socket类 HTTP网络编程 IPAddress IP地址类 IPAddress类代表IP地址&#xff0c;可在十进制表示法和实际的整数…...

RabbitMQ中方法channel.basicAck的使用说明

方法channel.basicAck的作用 在RabbitMQ中&#xff0c;channel.basicAck方法用于确认已经接收并处理了消息。 方法的参数说明 public void basicAck(long deliveryTag,boolean multiple) 参数&#xff1a; long deliveryTag 消息的唯一标识。每条消息都有自己的ID号&#x…...