当前位置: 首页 > 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 …...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...