Protocol Buffers

cockroach(v20.2)源码编译

别来无恙 提交于 2021-01-09 10:22:07
1.下载代码以及依赖环境 1) 由于github.com国内访问较慢,克隆gitee的镜像 cd /media/lynn/disk_d/codes/database/cockroach mkdir -p src/github.com/cockroachdb/ mv CockroachDB cockroach git clone https://gitee.com/mirrors/CockroachDB.git 2)下载golang-1.15 下载地址 mv go1.15.linux-amd64.tar.gz /usr/lib tar -zxvf go1.15.linux-amd64.tar.gz 2. 下载子模块 1) 修改子模块地址: .gitmodules [submodule "vendor"] path = vendor url = https://gitee.com/jianyun/vendored.git [submodule "c-deps/jemalloc"] path = c-deps/jemalloc url = https://gitee.com/jianyun/jemalloc.git [submodule "c-deps/protobuf"] path = c-deps/protobuf url = https://gitee.com/jianyun

使用 Jetpack DataStore 进行数据存储

白昼怎懂夜的黑 提交于 2021-01-09 08:55:19
作者 / Android 开发技术推广工程师 Florina Muntenescu 与 Google 软件工程师 Rohit Sathyanarayana 欢迎使用 Jetpack DataStore,这是一个经过改进的全新数据存储解决方案,旨在替代原有的 SharedPreferences。Jetpack DataStore 基于 Kotlin 协程和 Flow 开发,并提供两种不同的实现: Proto DataStore 和 Preferences DataStore 。其中 Proto DataStore ,可以存储带有类型的对象 (使用 protocol buffers 实现); Preferences DataStore ,可以存储 键值对 。在 DataStore 中,数据以异步的、一致的、事务性的方式进行存储,克服了 SharedPreferences 的大部分缺点。 SharedPreferences 和 DataStore 对比 SharedPreferences 有一个看上去可以在 UI 线程安全调用的同步 API,但是该 API 实际上执行了磁盘 I/O 操作。此外,apply() 方法会在 fsync() 阻塞 UI 线程。在您应用的任何地方,每当 Service 或 Activity 启动或停止时,就会触发等待 fsync() 的调用。由 apply()

58无埋点数据采集技术在Android端实践

六眼飞鱼酱① 提交于 2021-01-06 18:14:55
本文转载自公众号 58架构师 ,已经作者授权! 作为国内最大分类信息生活服务平台,58集团旗下各个产品都会投入大量人力进行用户行为的分析,来提升运营效率。但是各个产品对用户行为的分析需求基本是相似的。在这样的背景下,我们自研了WMDA 无埋点用户行为分析平台,并提供对PC、M、APP三端支持,帮助各个业务线更好的挖掘用户真实行为。 对于SDK的使用,业务方不需要手动埋点,几行代码,即可实现数据的全量采集。对于移动端SDK来说,采集数据的准确性、及时性、全面性等因素直接决定后续用户行为的分析。本文将从技术选型、技术实现方案角度详细介绍Android端无埋点数据采集技术。 一、技术选型 首先,技术是为需求提供服务的,WMDA的定位是采用无埋点技术来实现用户行为的分析。同时辅助解决手动埋点不易维护,容易出现错埋、漏埋等痛点问题。所以SDK在采集用户行为数据的同时,对开发效率、采集性能、准确性、实时性等有很高的要求,而且需要支持数据的可回溯。 通过对市面上现有埋点技术调研,目前技术方案上大体分为三类: 传统代码埋点 实现方案:Coding阶段手动埋点。 代表解决方案:友盟、百度统计。 优点:灵活、准确,可以定制化。 缺点:业务埋点量非常大,开发成本高,不易维护,如果要修改、新增埋点,需要重新发版。 动态埋点 实现方案:利用AccessibilityDelegate对每个view实例设置代理

Netty面试题(2020最新版)

扶醉桌前 提交于 2021-01-05 01:18:27
1.Netty 是什么? Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是基于nio的,它封装了jdk的nio,让我们使用起来更加方法灵活。 2.Netty 的特点是什么? 高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。 传输快:Netty 的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。 封装好:Netty 封装了 NIO 操作的很多细节,提供了易于使用调用接口。 3.Netty 的优势有哪些? 使用简单:封装了 NIO 的很多细节,使用更简单。 功能强大:预置了多种编解码功能,支持多种主流协议。 定制能力强:可以通过 ChannelHandler 对通信框架进行灵活地扩展。 性能高:通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。 稳定:Netty 修复了已经发现的所有 NIO 的 bug,让开发人员可以专注于业务本身。 社区活跃:Netty 是活跃的开源项目,版本迭代周期短,bug 修复速度快。 4.Netty 的应用场景有哪些? 典型的应用有:阿里分布式服务框架 Dubbo,默认使用 Netty 作为基础通信组件,还有 RocketMQ

golang protobuf序列化分析

匆匆过客 提交于 2021-01-01 01:55:53
data.proto message ColumnarValue { uint32 id= 1; int32 typ = 2; repeated bytes values = 3; } data.go.proto type ColumnarValue struct { Id uint32 `protobuf:"varint,1,opt,name=id,json=id,proto3" json:"id,omitempty"` Typ int32 `protobuf:"varint,2,opt,name=typ,json=typ,proto3" json:"typ,omitempty"` Values [][]byte `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` } 序列化 func (m *ColumnarValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalTo(b) if err != nil { return nil, err } return b[:n], nil } func (m *ColumnarValue) MarshalTo

zeromq总结

爷,独闯天下 提交于 2020-12-30 17:57:07
概述 我们真正需要的是这样一种消息软件,它能够做大型消息软件所能做的一切,但使用起来又非常简单,成本很低,可以用到所有的应用程序中,没有任何依赖条件。因为没有了额外的模块,就降低了出错的概率。这种软件需要能够在所有的操作系统上运行,并能支持所有的编程语言。 ZMQ就是这样一种软件:它高效,提供了嵌入式的类库,使应用程序能够很好地在网络中扩展,成本低廉。 ZMQ的主要特点有: ZMQ会在后台线程异步地处理I/O操作,它使用一种不会死锁的数据结构来存储消息。 网络组件可以来去自如,ZMQ会负责自动重连,这就意味着你可以以任何顺序启动组件;用它创建的面向服务架构(SOA)中,服务端可以随意地加入或退出网络。 ZMQ会在有必要的情况下自动将消息放入队列中保存,一旦建立了连接就开始发送。 ZMQ有阈值(HWM)的机制,可以避免消息溢出。当队列已满,ZMQ会自动阻塞发送者,或丢弃部分消息,这些行为取决于你所使用的消息模式。 ZMQ可以让你用不同的通信协议进行连接,如TCP、广播、进程内、进程间。改变通信协议时你不需要去修改代码。 ZMQ会恰当地处理速度较慢的节点,会根据消息模式使用不同的策略。 ZMQ提供了多种模式进行消息路由,如请求-应答模式、发布-订阅模式等。这些模式可以用来搭建网络拓扑结构。 ZMQ中可以根据消息模式建立起一些中间装置(很小巧),可以用来降低网络的复杂程度。

c#、java、C++下编译protobuf文件

倾然丶 夕夏残阳落幕 提交于 2020-12-28 18:47:16
1)java protoc.exe --java_out=./ game.proto 使用 package org.example.pb; public class Main { public static void main(String[] args) { BatteryData.EditProfileReq.Builder builder = BatteryData.EditProfileReq.newBuilder(); builder.setUface(1); } } 根据option java_package = "com.yjgis.test"; 和option java_outer_classname = "BatteryData"; 决定生成的文件名字和路径下。 而且即使这2行有,但是如果生成的是其它语言的文件,那么这2行对其它语言的生成也是没有影响的。 pom.xml <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.5.1</version> </dependency> 2)cpp protoc.exe --cpp_out=./ game.proto 生成game.pb.h game.pb.cc这2个文件 3

服务器端编程语言对比:C/C++, C#.NET, Java, Go, Rust

若如初见. 提交于 2020-12-28 01:23:30
对比指标 C/C++ C#.NET Java Go Rust 计算斐波那契数列第60个数字(循环实现) 计算斐波那契数列第10个数字(递归实现) uint16比特位的设置 uint16比特位的查找 自定义快速排序 自定义stack的pop/push 自定义链表的构建 自定义链表的查找 Protobuf消息编码 Protobuf消息解码 AES加密 AES解密 并发读写数据 格式化日志 申请48byte内存 自定义类型初始化 责任链方法调用 JSON编解码 内存直接拷贝 对象复制 字符串匹配 hashmap性能 自定义html解析 自定义html解析 获取当前时间戳 打印64k行日志 斐波那契数列三层调用处理(GRPC框架) 斐波那契数列三层调用处理(自定义框架) 来源: oschina 链接: https://my.oschina.net/u/4271269/blog/4845045

TensorFlow Lite for Android示例

最后都变了- 提交于 2020-12-23 03:58:17
一、TensorFlow Lite TensorFlow Lite 是用于移动设备和嵌入式设备的轻量级解决方案。TensorFlow Lite 支持 Android、iOS 甚至树莓派等多种平台。 二、tflite格式 TensorFlow 生成的模型是无法直接给移动端使用的,需要离线转换成.tflite文件格式。 tflite 存储格式是 flatbuffers。 FlatBuffers 是由Google开源的一个免费软件库,用于实现序列化格式。它类似于Protocol Buffers、Thrift、Apache Avro。 因此,如果要给移动端使用的话,必须把 TensorFlow 训练好的 protobuf 模型文件转换成 FlatBuffers 格式。官方提供了 toco 来实现模型格式的转换。 三、API TensorFlow Lite 提供了 C ++ 和 Java 两种类型的 API。无论哪种 API 都需要加载模型和运行模型。 而 TensorFlow Lite 的 Java API 使用了 Interpreter 类(解释器)来完成加载模型和运行模型的任务。后面的例子会看到如何使用 Interpreter。 四、TensorFlow Lite实现手写数字识别 下面的 demo 中已经包含了 mnist.tflite 模型文件。(如果没有的话

理解Java序列化

房东的猫 提交于 2020-12-16 06:38:43
前言 Java对象是在JVM中产生的,若要将其进行传输或保存到硬盘,就要将对象转换为可传输的文件流。而目前Java对象的转换方式有: 利用Java的序列化功能序列成字节(字节流),一般是需要加密传输时使用。 将对象包装成JSON字符串(字符流),一般使用JSON工具进行转换 。 protoBuf工具(二进制),性能好,效率高,字节数很小,网络传输节省IO。但二进制格式可读性差。 一、序列化基础 序列化:Serialization(序列化)是一种将对象以一连串的字节描述的过程 反序列化:反序列化deserialization是一种将这些字节重建成一个对象的过程 序列化机制算法: 所有保存到磁盘中的对象都有一个序列化编号 当程序试图序列化一个对象时,程序先检查该对象是否已经被序列化过。如果从未被序列化过,系统就会将该对象转换成字节序列并输出;如果已经序列化过,将直接输出一个序列化编号。 1、应用场景 持久化对象 :把对象的字节序列永久地保存到硬盘上 Java中能够在JVM中创建可复用的Java对象,但只用JVM运行时,对象才能存在,即对象的生命周期不可能比JVM生命周期更长。但实际情况可能遇到需要当JVM停止时也需要对象依旧存在,因而就需要对对象进行持久化,并在JVM停止的情况下,能够对保存的对象进行持久化。 对象复制 :通过序列化,将对象保存在内存中