喵个咪的博客喵个咪的博客
喵个咪的技术与生活
文章列表
文章分类
文章标签
时间线
喵个咪的技术与生活
文章列表
文章分类
文章标签
时间线
健康养生 2Python编程 5随笔日志 1产品设计 1C++编程 10运维技术 34Flutter编程 12编程技术 67设计模式 1汽车 1Go编程 64架构设计 3游戏开发 13量化开发 6物联网开发 7GoWind风行 41生活杂记 1
Windows安裝Flutter开发环境

Date: 1/1/2020Category: 编程技术Tag: Windows, Flutter

安装Flutter

scoop install flutter
破解 WiFi 密码

Date: 1/1/2020Category: 编程技术Tag: WiFi

查看网卡名称

ifconfig
设计思考 - Protocol Buffers 3 为什么这样设计

Date: 1/1/2020Category: 编程技术Tag: Protocol

简单是一件非常困难的事!而深思熟虑的简单,可以给我们与学习最多的思考

Protocol Buffer 的第 3 版删除了一些特性(required, optional...),并且在默认值的设计上,做出了一个看起来很危险的重要决定。乍看之下匪夷所思,网路上也引起多人讨论。通常这种去掉重要功能的决定,都有非常的理由,尝试理解别人的设计,可以让我们看得更远。现在,就让我们尝试从google的角度,思考一下Protocol Buffer的设计吧!

什么是数据血缘

Date: 1/1/2020Category: 编程技术Tag: 数据血缘

大数据时代,数据的来源极其广泛,各种类型的数据在快速产生,数据也是爆发性增长。从数据的产生,通过加工融合流转产生新的数据,到最终消亡,数据之间的关联关系可以称之为数据血缘关系。在数据中台的大背景下,数仓的开发者经常需要解决以下问题:

面对成百上千张的数据表,不知道该如何关联,也不知道这些表具有什么业务价值

执行过长,慢的无法忍受的SQL脚本,却不敢轻易进行整改

数据表是否包含机密数据需要被清理,以及这些机密数据是否被转存导致权限放大

其实,以上的这些问题都可以统一归类为数据发现问题。大部分企业会针对离线数仓任务进行SQL分析,构建表和字段的血缘关系,数据发现包括但不限于: 数据 表/列的业务分类分级和机密字段识别等。

什么是BI

Date: 1/1/2020Category: 编程技术Tag: BI

BI的定义

BI全称:商业智能(Business Intelligence),在传统企业中,它是一套完整的解决方案。将企业的数据有效整合,快速制作出报表以作出决策。商业智能BI在数据架构中处于前端分析的位置,其核心作用是对获取数据的多维度分析、数据的切片、数据的上钻和下钻、cube等。通过ETL数据抽取、转化形成一个完整的数据仓库、然后对数据仓库的数据进行抽取,而后是商业智能的前端分析和展示。

BI的用途

BI工具主要有两种用途。一种是利用BI制作自动化报表,数据类工作每天都会接触大量数据,并且需要整理汇总,这是一块很大的工作量。这部分工作可以交给BI自动化完成,从数据规整、建模到下载。

加权随机(Weight random)算法

Date: 1/1/2020Category: 编程技术Tag: 加权随机, 算法
  1. Linear Scan(线性扫描)
  2. Binary Search(二叉查找)
  3. Hopscotch Selection(跳房子)
  4. Alias Method(别名方法)

Linear Scan(线性扫描)

Binary Search(二叉查找)

Hopscotch Selection(跳房子)

Walker-Vose Alias Method(别名方法)

别名采样方法分为两个步骤:

  1. 做表;
  2. 根据表进行采样。
使用 Flutter 进行 WebRTC 视频通话

Date: 1/1/2020Category: 编程技术Tag: WebRTC

介绍

Flutter 上的 WebRTC 通常通过flutter_webrtc 库实现,该库包含 Flutter 支持的所有平台所需的 WebRTC 代码。该插件抽象出了 WebRTC 中几个难以实现的部分,本文构建的应用程序基于插件中给出的示例代码。

在本教程中,我们将向 Flutter 应用程序添加基于 WebRTC 的通话解决方案。

设置 flutter_webrtc 插件

必须设置各种组件才能实现完整的视频通话体验。第一个是将基础 WebRTC 插件添加到您的 Flutter 应用。在本课中,我们仅关注 Android 和 iOS,但请注意,可能需要进行额外设置才能在其他平台上设置类似的体验。

WebGL的图形引擎

Date: 1/1/2020Category: 编程技术Tag: WebGL

引擎列表

名称 语言 特点
ThreeJS ES5
BabylonJS TypeScript
SceneJS TypeScript
CesiumJS ES5
PlayCanvas ES5
Egret ES5
LayaBox ES5
potree ES5
Vue低版本引起的问题

Date: 1/1/2020Category: 编程技术Tag: Vue

Sass在v4.3.0版本之前使用node-sass需要原生编译libsass导致的问题

Sass在v4.3.0版本之前都是使用的node-sass,而node-sass的底层依赖 libsass,libsass是一个原生库,因此,在Windows下面需要强制用户必须安装python2和Visual Studio才能编译成功。这并不是一件很友好的事情,而且经常导致编译不成功。

Vite permission denied 问题

Date: 1/1/2020Category: 编程技术Tag: Vite
 ERROR  error when starting dev server:                                                                                                                                                                                                                                11:51:39  
Error: listen EACCES: permission denied 0.0.0.0:3100
    at Server.setupListenHandle [as _listen2] (node:net:1723:21)
    at listenInCluster (node:net:1788:12)
    at Server.listen (node:net:1876:7)
用户画像

Date: 1/1/2020Category: 编程技术Tag: 用户画像

用户画像的3种标签类型

用户画像建模其实就是对用户“打标签”,从对用户打标签的方式来看,一般分为3种类型:①统计类标签;②规则类标签;③机器学习挖掘类标签。

下面我们介绍这3种类型的标签的区别:

  1. 统计类标签

    这类标签是最为基础也最为常见的标签类型,例如,对于某个用户来说,其性别、年龄、城市、星座、近7日活跃时长、近7日活跃天数、近7日活跃次数等字段可以从用户注册数据、用户访问、消费数据中统计得出。该类标签构成了用户画像的基础。

  2. 规则类标签

    该类标签基于用户行为及确定的规则产生。例如,对平台上“消费活跃”用户这一口径的定义为“近30天交易次数≥2”。在实际开发画像的过程中,由于运营人员对业务更为熟悉,而数据人员对数据的结构、分布、特征更为熟悉,因此规则类标签的规则由运营人员和数据人员共同协商确定;

  3. 机器学习挖掘类标签

    该类标签通过机器学习挖掘产生,用于对用户的某些属性或某些行为进行预测判断。例如,根据一个用户的行为习惯判断该用户是男性还是女性、根据一个用户的消费习惯判断其对某商品的偏好程度。该类标签需要通过算法挖掘产生。

Ubuntu安装CMake

Date: 1/1/2020Category: 编程技术Tag: CMake

1. 使用Apt安装

sudo apt update; sudo apt upgrade;
sudo apt install cmake;
JavaScript/TypeScript 前端实现文件上传到 MinIO 完整指南

Date: 1/1/2020Category: 编程技术Tag: TypeScript

以往前端实现文件上传到服务端,常用方案为 HTTP 上传或 FTP 上传,但这两种方式均存在明显短板:HTTP 上传易受网络波动影响,可靠性较差;FTP 配置复杂且安全性不足。随着对象存储服务(Object Storage Service, OSS)的普及,这一问题得到了有效解决。 对象存储(基于对象的存储)是一种专为海量非结构化数据设计的存储架构。与传统存储不同,它将数据封装为独立对象,捆绑元数据和唯一标识符,便于快速查找与访问。OSS 提供与平台无关的 RESTful API 接口,支持在任意应用、任意时间、任意地点存储和访问各类数据。

目前主流的开源 OSS 方案包括 MinIO和Ceph。其中 MinIO 凭借轻量、易用、兼容 S3 接口等优势,使用率持续攀升,成为开源对象存储的首选方案之一。本文将详细介绍如何基于 JavaScript/TypeScript 前端实现文件上传到 MinIO。

TypeScript IP 计算器

Date: 1/1/2020Category: 编程技术Tag: TypeScript

验证IP有效性

// 验证IP有效性
function isValidIP(ip: string): boolean {
  const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
  return reg.test(ip);
}
时序数据库应用 -TimeScaleDB

Date: 1/1/2020Category: 编程技术Tag: 时序数据库

数据库简介

TimescaleDB是基于PostgreSQL的时序数据库插件,完全继承了PostgreSQL的功能,TimescaleDB是一个开放源代码的时间序列数据库,针对快速提取和复杂查询进行了优化。它使用“完整的SQL”,并且与传统的关系数据库一样易于使用,但是扩展的方式以前只适用于NoSQL数据库。与这两种方案(关系型和NoSQL)所要求的权衡相比,TimescaleDB为时间序列数据提供了两种方案的最佳选择:

时序数据库应用 - MongoDB

Date: 1/1/2020Category: 编程技术Tag: 时序数据库

数据库简介

搭建本地Docker数据库

参考资料

时序数据库应用 - ElasticSearch

Date: 1/1/2020Category: 编程技术Tag: 时序数据库

数据库简介

搭建本地Docker数据库

docker pull bitnami/elasticsearch:latest

docker run -d \
--name elasticsearch-test \
-p 9200:9200 \
-p 9300:9300 \
-e ELASTICSEARCH_USERNAME=elastic \
-e ELASTICSEARCH_PASSWORD=elastic \
-e xpack.security.enabled=true \
-e discovery.type=single-node \
-e http.cors.enabled=true \
-e http.cors.allow-origin=http://localhost:13580,http://127.0.0.1:13580 \
-e http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization \
-e http.cors.allow-credentials=true \
bitnami/elasticsearch:latest

docker pull appbaseio/dejavu:latest

docker run -d \
--name dejavu-test \
-p 13580:1358 \
appbaseio/dejavu:latest


http://localhost:13580/
Unix时间戳

Date: 1/1/2020Category: 编程技术Tag: 时间戳

关于Unix时间戳(Unix timestamp)

时间戳(Timestamp) 也被称作为 Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从世界协调时间(Coordinated Universal Time,即UTC)或称 格林威治时间的 1970年01月01日00时00分00秒(00:00:00 GMT) 起至现在的总秒数。Unix时间戳不仅被使用在Unix系统、类Unix系统中,也在许多其他操作系统中被广泛采用。

笨贼问题

Date: 1/1/2020Category: 编程技术Tag: 算法

3月24日上午10点30分左右,罗某保存了贩卖机上原本的收款码,并将两张伪造二维码贴在了口罩自动贩卖机上。只要有人扫码,他支付宝收到转账,就用自己手机扫一下事先拍好的贩卖机二维码照片完成购买,这样虽然有个时间差,但顾客也能拿到口罩,自己又轻松赚到了差价,为了以假乱真,罗某还设置了首单减一块钱的优惠,买一个口罩需要14元,两个29元。截止到24日下午6时,贩卖机上的二维码被民警发现并撕除,罗某通过此方法共非法获利74元。

新闻来源: 都要注意!6元口罩突然涨到14元?这个自动贩卖机,一查果然有猫腻!

服务器基准测试

Date: 1/1/2020Category: 编程技术Tag: 基准测试

基准测试(benchmark)是针对系统设计的一种压力测试,目标是为了掌握系统的行为。

利特尔法则(Little’s law)

利特尔法则(英语:Little's law),基于等候理论,由约翰·利特尔在1954年提出。利特尔法则可用于一个稳定的、非占先式的系统中。

利特尔法则可用来确定在途存货的数量。此法则认为,系统中的平均存货等于存货单位离开系统的比率(亦即平均需求率)与存货单位在系统中平均时间的乘积。

利特尔法则的公式描述为:

Lead Time(产出时间) = 存货数量 × 生产节拍 或 TH(生产效率) = WIP(存货数量) / CT(周期时间)

解决Selenium的报错:stale element reference: element is not attached to the page document

Date: 1/1/2020Category: 编程技术Tag: Selenium

第一次使用Selenium后,在循环处理时,我遇到了一个莫名其妙的错误,我被卡住了一阵子,故而我留下本文作为备忘录。

stale element reference: element is not attached to the page document
SaaS系统RBAC后台权限管理

Date: 1/1/2020Category: 编程技术Tag: RBAC

RBAC 是基于角色的访问控制(Role-Based Access Control )在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。

RBAC 简介

RBAC 认为授权实际上是 Who 、What 、How 三元组之间的关系,也就是 Who 对 What 进行 How 的操作,也就是“主体”对“客体”的操作。

REST 设计原则

Date: 1/1/2020Category: 编程技术Tag: REST

我交谈过的大多数开发人员最终都会谈论 REST,他们都希望构建尽可能最好的 REST API。这当然会引发关于什么是好的 REST API 的常见讨论,或者您应该如何确保您的 API 是 REST风格的。有时,气氛会很紧张,所以我决定写一篇文章来解决这个问题。

这篇文章旨在收集我所认为的 REST 背后的主要设计原则。我当然会更新该文档,以反映我的任何不足或任何可以帮助任何有疑问的人的新想法。

什么是REST

REST 或“表述性状态传输”是一种架构风格,它定义了 Web 服务的设计和行为方式。REST 定义了一组必须遵循的约束,以便在互联网上的系统之间提供更好的互操作性。遵循这些原则的 Web 服务被认为是 REST风格的。

Redis键空间通知

Date: 1/1/2020Category: 编程技术Tag: Redis

有需求,Key到期的时候需要一个通知给服务器端用于感知数据的改变。刚好Redis提供了一个Keyspace Notifications功能,可以让服务器端监听某个Key的到期事件。

官方文档说,这个功能是很耗费CPU的,所以,默认是关闭的。需要开启的话,可以使用命令:

config set notify-keyspace-events KEA
Reactor模式

Date: 1/1/2020Category: 编程技术Tag: Reactor

参考资料

  • 《Go组件设计与实现》-netpoll的总结
  • Go netpoll I/O 多路复用构建原生网络模型之源码深度解析
  • Go netpoller 原生网络模型之源码全面揭秘
  • epoll在Golang中的应用
  • 百万 Go TCP 连接的思考: epoll方式减少资源占用
QUIC协议开源实现列表

Date: 1/1/2020Category: 编程技术Tag: QUIC

框架和开源实现

C/C++

Name Version Roles Handshake
Microsoft's MsQuic draft-27/28/29/30/31/32 client, server TLS 1.3 RFC
Facebook's mvfst draft-29 library, client, server TLS 1.3
Google's Chromium Q043, Q046, Q050, T050, T051, draft-27, draft-29 library, client, server QUIC Crypto, TLS
ats (Apache Traffic Server) draft-29 client. server TLS 1.3
LiteSpeed's lsquic Draft-32, Draft-29, Draft-28, Draft-27, Q043, Q046, and Q050. library, client, server QUIC Crypto, RFC 8446
ngtcp2 draft-29, draft-30, draft-31, and draft-32 library, client, server TLSv1.3 (RFC 8446)
Cloudflare's nginx-cloudflare draft-27, draft-28, draft-29 server TLSv1.3 (RFC8446)
picoquic draft-32/31/30/29/28/27 library and test tools, test client, test server TLS 1.3 (using picotls)
Pluginized QUIC draft-29 library, client, server TLS 1.3 (using picotls)
quant draft-33, draft-34, v1 library, client, server TLS 1.3
Fastly's quicly draft-27 client, server TLS 1.3 (final)
nginx-quic draft-27 .. draft-32 server TLSv1.3 (RFC8446)
Alibaba's xquic draft-29 library TLSv1.3
Google's quiche draft-29 library TLSv1.3
Protobufjs

Date: 1/1/2020Category: 编程技术Tag: Protobuf

7.x.x和6.x.x差异

6是运行时和CLI都在一起,7则拆分开来了。

pnpm install -D protobufjs
pnpm install -D protobufjs-cli
Protobuf生成golang代码的4种方法

Date: 1/1/2020Category: 编程技术Tag: Protobuf

要将Protobuf协议生成目标语言的代码,必须要通过生成器protoc来实现,protoc是通过插件机制来实现各种语言的生成功能。

插件生成文件一览表

插件名 生成文件名
protoc-gen-go XXXXX.pb.go
protoc-gen-go-grpc XXXXXX_grpc.pb.go
protoc-gen-go-http XXXXXX_http.pb.go
protoc-gen-go-errors XXXXXX_errors.pb.go
protoc-gen-validate XXXXXX.pb.validate.go
protoc-gen-openapiv2 XXXXXX.swagger.json
protoc-gen-openapi openapi.yaml
Prometheus的四大指标类型

Date: 1/1/2020Category: 编程技术Tag: Prometheus

Prometheus有4大指标类型(Metrics Type),分别是:

  1. Counter(计数器)
  2. Gauge(仪表盘)
  3. Histogram(直方图)
  4. Summary(摘要)

1. Counter(计数器)

计数器表示一种单调递增的指标,除非发生重置的情况下下只增不减,其样本值应该是不断增大的。

例如,可以使用Counter类型的指标来表示服务的请求数、已完成的任务数、错误发生的次数等。

2. Gauge(仪表盘)

仪表盘类型代表一种。它可以理解为状态的快照,Gauge通常用于表示温度或者内存使用率这种指标数据,也可以表示能随时增加或减少的“总数”,例如当前并发请求的数量node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)等。在使用Gauge时,用户往往希望使用它们等。

Postgresql按时间分组统计查询(年月日周时分秒)

Date: 1/1/2020Category: 编程技术Tag: PostgreSQL
create table public."user" (
  id integer primary key not null, -- id
  create_time bigint, -- 创建时间
  update_time bigint, -- 更新时间
  delete_time bigint, -- 删除时间

  created_at TIMESTAMP, -- 创建时间
  updated_at TIMESTAMP, -- 更新时间
  deleted_at TIMESTAMP  -- 删除时间
);
PostgreSQL查询交叉表

Date: 1/1/2020Category: 编程技术Tag: PostgreSQL, 交叉表

什么是交叉表?

交叉表(Cross Tabulations) 是一种常用的分类汇总表格。利用交叉表查询数据非常直观明了,被广泛应用。交叉表查询也是数据库的一个特点。

概念

在统计学中,交叉表是矩阵格式的一种表格,显示变量的(多变量)频率分布。交叉表被广泛用于调查研究,商业智能,工程和科学研究。它们提供了两个变量之间的相互关系的基本画面,可以帮助他们发现它们之间的相互作用。卡尔·皮尔逊(Karl Pearson)首先在“关于应变的理论及其关联理论与正常相关性”中使用了交叉表。

多元统计学的一个关键问题是找到高维应变表中包含的变量的(直接)依赖结构。如果某些有条件的独立性被揭示,那么甚至可以以更智能的方式来完成数据的存储。为了做到这一点,可以使用信息理论概念,它只能从概率分布中获得信息,这可以通过相对频率从交叉表中容易地表示。

Postgres 全文搜索:数据库中的搜索引擎

Date: 1/1/2020Category: 编程技术Tag: 全文搜索

在我的 SQL 之旅的早期,我认为在数据库中搜索一段文本主要涉及这样的查询:

SELECT col FROM table WHERE col LIKE '%some_value%';
人体姿态识别

Date: 1/1/2020Category: 编程技术Tag: 人体姿态识别

参考资料

  • Github开源人体姿态识别项目OpenPose中文文档
  • MediaPipe Pose
  • 基于人体姿态识别的AI健身系统
  • 基于深度学习的人体姿态估计技术与应用
  • On-device, Real-time Body Pose Tracking with MediaPipe BlazePose
Ping结果正则表达式解析

Date: 1/1/2020Category: 编程技术Tag: Ping

Windows

ping结果示例

中文:

ping www.baidu.com -n 3

正在 Ping www.a.shifen.com [120.232.145.185] 具有 32 字节的数据:
来自 120.232.145.185 的回复: 字节=32 时间=45ms TTL=49
来自 120.232.145.185 的回复: 字节=32 时间=627ms TTL=49
来自 120.232.145.185 的回复: 字节=32 时间=49ms TTL=49

120.232.145.185 的 Ping 统计信息:
    数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 45ms,最长 = 627ms,平均 = 240ms
从OpenAPI文档生成Typescript的d.ts文件

Date: 1/1/2020Category: 编程技术Tag: OpenAPI

一开始我走入了误区,应该从Protobuf生成dts,但是,现在来看,通过OpenAPI文档生成dts文件会更好一些。

首先,Protobuf对于前端来说,知识面几乎没有交集。你要找出知道Protobuf的前端,这并不是一件很容易的事情。但是,你要问前端OpenAPI,Swagger,他一定能够会告诉你,必须的知道。

其次,Protobuf通常都是后端定义,后端使用,要开放VSC的权限给前端,有时候会是一个很艰难的问题。那么,现实是,通常生成的工作都要后端去做——这就给工作中带来了极大的不便。

综上,通过Protobuf生成dts其实并不是一个明智之举。

OpenAI 助手API

Date: 1/1/2020Category: 编程技术Tag: OpenAI

添加依赖库

go get github.com/Azure/azure-sdk-for-go
OLTP 和 OLAP

Date: 1/1/2020Category: 编程技术Tag: OLTP, OLAP

OLTP 和 OLAP:这两个术语看起来相似,但指的是不同类型的系统。在线事务处理 (OLTP) 实时捕获、存储和处理来自事务的数据。在线分析处理 (OLAP) 使用复杂的查询来分析来自 OLTP 系统的汇总历史数据。

OLTP

什么是OLTP?

OLTP 是指Online Transactional Processing 的简称,这个词中 Transactional 是非常重要的,代表的是说他的处理通常包含了读以及写,通常OLTP 是指系统能够处理大量的更新以及新增的查询。所以在传统的OLTP 系统中,数据的正确性以及一致性是首要要达到的目标之一。所以一般的OLTP 中会常常听到ACID (Atomatic, Consistent, Isolated, Durable) 合规。这代表他们遵循着一个事务(Transaction) 完成后才会执行下一笔,确保整个系统的数据一致性。

OCR

Date: 1/1/2020Category: 编程技术Tag: OCR
  1. Tesseract https://github.com/tesseract-ocr/tesseract
  2. PaddleOCR https://github.com/PaddlePaddle/PaddleOCR
  3. EasyOCR https://github.com/JaidedAI/EasyOCR
  4. chineseocr https://github.com/chineseocr/chineseocr
  5. chineseocr_lite https://github.com/DayBreak-u/chineseocr_lite
  6. CnOCR https://github.com/breezedeus/cnocr
  7. TrWebOCR https://github.com/alisen39/TrWebOCR
npm/pnpm/yarn切换源

Date: 1/1/2020Category: 编程技术Tag: npm, pnpm, yarn
  • 国内镜像
提供商 搜索地址 registry地址
淘宝 https://npmmirror.com/ https://registry.npmmirror.com
腾讯云 http://mirrors.cloud.tencent.com/npm/
华为云 https://mirrors.huaweicloud.com/repository/npm
浙江大学 http://mirrors.zju.edu.cn/npm/
南京邮电 https://mirrors.njupt.edu.cn/nexus/repository/npm/
MSB 和 LSB

Date: 1/1/2020Category: 编程技术Tag: MSB, LSB

MSB 最高有效位(The Most Significant Bit)

LSB 最低有效位(The Least Significant Bit)

参考资料

  • Most Significant Bit
  • Least Significant Bit
MQTT用X509进行认证

Date: 1/1/2020Category: 编程技术Tag: MQTT

什么是SSL

SSL(安全套接字层) 及其后继者 TLS(传输层安全性) 是用于在联网计算机之间建立经过身份验证和加密的链接的协议。 尽管SSL协议已随着以下版本的发布而被弃用 TLS 1.0,在1999年,将这些相关技术称为“ SSL”或“ SSL /TLS。” 最新版本是 TLS 1.3,定义于 RFC 8446 (八月2018)。

MQTT 协议下的Last Will and Testament(LWT,遗嘱消息)

Date: 1/1/2020Category: 编程技术Tag: MQTT

Last Will and Testament(LWT,遗嘱消息)其作用是当客户端异常断开(如网络中断)时,EMQ X 自动发布一条预设的遗嘱消息,通知系统该用户离线。

该消息由MQTT的服务端(Broker)发出。

该消息,在客户端正常离线的时候不会被发出,只有客户端非正常断开网络连接的时候才会发出。

LWT的Topic设计上,从两个维度设计分别为:

  1. 用户维度:user/status/{user_id}
  2. 设备维度:device/status/{device_id}
MQTT服务器使用HTTP进行用户认证

Date: 1/1/2020Category: 编程技术Tag: QTT

MQTT开源服务器有不少,我只用了两个Erlang开发的开源服务器:

  • RabbitMQ
  • EMQX.

现实中,我们需要提供一个HTTP认证服务器,来认证我们的MQTT客户端.

Docker部署开发服务器

机器学习有关的库

Date: 1/1/2020Category: 编程技术Tag: 机器学习

基础概念

机器学习

机器学习 (ML) 是人工智能 (AI) 的一部分,属于计算科学领域,专门分析和解释数据的模式及结构,以实现无需人工交互即可完成学习、推理和决策等行为的目的。简单来说,机器学习即支持用户向计算机算法馈送大量数据,然后让计算机分析这些数据,并仅根据输入数据给出数据驱动型建议和决策。如果算法识别出任何更正,它会整合更正信息,改进未来决策。

机器学习由三个部分组成:

  • 属于决策核心的计算算法。
  • 组成决策的变量和特征。
  • 支持(训练)系统学习的具有已知答案的相关基础知识。
Markdown简易教程

Date: 1/1/2020Category: 编程技术Tag: Markdown

一、Markdown

简介

`Markdown` 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。

应用

当前许多网站都广泛使用 Markdown 来撰写帮助文档或是用于论坛上发表消息。例如:GitHub、简书、知乎等

编辑器

推荐使用Typora,官网:https://typora.io/

Mac 删除键(Delete) 这三招你会吗?可大幅加快打字速度!

Date: 1/1/2020Category: 编程技术Tag: MacOS

在Windows 上有「Delete」跟「Backspace」两个按键,一个是往左删除字符,一个是往右删除字符;可是在Mac 上却只有一个delete 键,要怎样灵活的用它,让它变得跟Windows 一样好用呢?

fn + delete,删除右边文字

fn + delete

fn + delete 可以让光标向右边删除文字,跟Windows 的 del 键功能一样。

Linux库导出信息查看

Date: 1/1/2020Category: 编程技术Tag: Linux

nm

# 查看静态库或动态库定义了哪些函数
nm -n --defined-only xxxx.a
nm -g -C --defined-only xxxx.so
nm -D xxxx.so

# 显示hello.a 中的未定义符号,需要和其他对象文件进行链接.
nm -u hello.o

# 在 ./ 目录下找出哪个库文件定义了close_socket函数. 
nm -A ./* 2>/dev/null | grep "T close_socket"
Javascript和Typescript下如何通过 async/await 优雅地使用 FileReader

Date: 1/1/2020Category: 编程技术Tag: Javascript, Typescript

FileReader的使用机会很多,但是它是异步的,因此很容易出现回调地狱。

我们可以使用async/await特性,它允许我们以同步的方式调用异步代码。

封装成方法

export async function readTextFile(file: File) {
    const reader = new FileReader();
    reader.readAsText(file);
    return new Promise((resolve, reject) => {
        reader.onload = () => resolve(reader.result);
        reader.onerror = () => reject(reader.error);
    });
}

export async function readBinaryFile(file: File) {
    const reader = new FileReader();
    reader.readAsArrayBuffer(file);
    return new Promise((resolve, reject) => {
        reader.onload = () => resolve(reader.result);
        reader.onerror = () => reject(reader.error);
    });
}

export async function readAsText(file: File) {
    const reader = new FileReader();
    reader.readAsText(file);
    return new Promise((resolve, reject) => {
        reader.onload = () => resolve(reader.result);
        reader.onerror = () => reject(reader.error);
    });
}

Date: 1/1/2020Category: 编程技术Tag: JetBrains, IDE

JetBrains IDE 基本快捷键


导航快捷键

快捷键 说明
Ctrl + Tab(^ Tab) 切换标签页(还要进行此选择,效率差些)
Ctrl + E(⌘ E) 查看最近打开的文件
Ctrl+B 或 Ctrl+单击 (⌘ B 或 ⌘ + 单击) 立即跳转到符号的定义
Ctrl + Alt + B 立即跳转到符号的实现
Ctrl + Shift + T (⇧ ⌘ T) 跳转至测试
Ctrl + Alt + F7 (⌘ ⌥ F7) 显示用例
Shift + Shift(⇧⇧) 快速查找任意内容
Ctrl + Shift + A 快速查找并使用编辑器所有功能(必记)
Ctrl + N (⌘ O) 快速查找类
Ctrl + Shift + N (⌘ ⇧ O) 通过文件名快速查找工程内的文件(必记)
Ctrl + Shift + Alt + N (⌘ ⇧ ⌥ O) 通过一个字符快速查找位置(必记)
Javascript弃用方法的替换方法

Date: 1/1/2020Category: 编程技术Tag: Javascript

substr替换成slice;

「TL;DR = 太长了,懒得看」:几个很实用,你却不一定知道的网络英文缩写

Date: 1/1/2020Category: 编程技术Tag: TL;DR

OTP = One True Pairing = 天生一對

用来表示你认为是天生一对的两个角色。

ex.

  • The Weeknd and Bella Hadid are my OTP. (The Weekend 和Bella Hadid 是我心目中的天生一对。)

DFTBA = Don’t Forget To Be Awesome = 记得要棒棒的!

通常用在与朋友道别的时候。平常我们可能会祝愿对方有个美好的一天,但比较熟的朋友之间说DFTBA 反而有种戏谑趣味感。

ex.

安装QT开发环境

Date: 1/1/2020Category: 编程技术Tag: Qt

Qt(发音同 “cute”)是一套跨平台的 C++ 应用程序开发框架,由挪威公司 Trolltech(后被诺基亚、Digia 收购,现为 The Qt Company)开发,核心目标是让开发者用 “一次编写,到处运行”(Write Once, Run Everywhere)的方式,高效开发出在不同平台上(Windows、Linux、macOS、Android、iOS、嵌入式系统等)具有一致功能和体验的应用程序。

官方下载网址:http://download.qt.io/

使用Dexie操作前端数据库IndexedDB 教程

Date: 1/1/2020Category: 编程技术Tag: Dexie, IndexedDB

Dexie.js 是对前端本地数据库 IndexedDB 的 API 进行封装的轻量级库,它简化了 IndexedDB 复杂的原生操作,提供了更简洁、直观的语法,便于开发者快速实现前端本地数据的持久化存储。

一、为什么选择 IndexedDB?

前端常见的本地存储方案(Cookie、LocalStorage、SessionStorage)均存在存储容量限制,无法满足大数据量的存储需求。IndexedDB 作为浏览器原生的本地数据库,具备大容量存储优势,具体对比如下:

  • Cookie:存储容量不超过 4KB,主要用于存储会话标识等少量信息;
  • LocalStorage:存储容量介于 2.5MB ~ 10MB 之间,仅支持字符串存储;
  • SessionStorage:存储容量与 LocalStorage 相当,但仅在当前会话有效,页面关闭后数据丢失;
  • IndexedDB:存储容量不低于 250MB,支持占用本地磁盘空间的 50%,可存储大量结构化数据,支持事务、索引等数据库核心特性。
如何发布Android APP到Google Play

Date: 1/1/2020Category: 编程技术Tag: Android, Google Play

生成签名

在项目的android目录下执行以下命令:

keytool  -genkey -v -keystore ./app_key.jks -keyalg RSA -keysize 4096 -validity 10000 -alias flutter_key
如何在 CentOS 7 上安装 OpenCV

Date: 1/1/2020Category: 编程技术Tag: CentOS, OpenCV

第 1 步:安装 OpenCV 的依赖项

使用以下命令安装编译 OpenCV 所需的所有依赖项:

yum groupinstall "Development Tools" -y

yum install cmake3 gcc gtk2-devel numpy pkconfig -y
怎样在Ubuntu下面安装Clang

Date: 1/1/2020Category: 编程技术Tag: Ubuntu, Clang

LLVM项目是一个模块化的、可重用的编译器和工具链集合。尽管它的名字-LLVM与传统虚拟机(low level virtual machine)名字相似。但“LLVM”这个名字本身不是一个缩略词,它就是这个项目的全称。所以,不要再把LLVM叫做low level virtual machine。

LLVM开始于伊利诺斯大学的一个研究项目。目的是提供一个现代的、基于SSA的、能够支持任意静态和动态编译的编程语言的编译策略。此后,LLVM成长为伞项目下的一个子项目。其中许多是被广泛用于各种各样的商业生产和开源代码项目以及学术研究中。LLVM项目源码采用“Apache 2.0许可协议”。

无头内容管理系统 Headless CMS

Date: 1/1/2020Category: 编程技术Tag: Headless CMS

什么是 Headless CMS?

Headless CMS 是一种 内容管理系统(Content Management System),它将【头部Head】表示层(内容呈现的地方)与【身体Body】后端(内容管理的地方)分离开来。即,把表示层和后端信息层分离开了。

这样,我们可以根据需要在 Web、移动和数字媒体平台上重复使用和重新混合内容。您甚至可以在印刷品中重复使用您的内容。

与格式无关的内容为所有参与者(作者、开发人员和用户)提供了变革性的体验。

git submodule

Date: 1/1/2020Category: 编程技术Tag: Git

添加子模块

git submodule add <url> <path>
Git设置网络代理

Date: 1/1/2020Category: 编程技术Tag: Git

设置HTTP代理

git config --global http.proxy http://127.0.0.1:1080
如何获取微信小程序的资源

Date: 1/1/2020Category: 编程技术Tag: 微信小程序

之前,都是找的Andriod的文件,但是,这很麻烦,因为需要Root,不然无法访问。找到文件,拷贝也是一件很麻烦的事情。

现在,电脑版的微信也是可以使用小程序的,所以,从电脑上去寻找小程序的资源就变得切实可行。

小程序所在的位置

首先,它有两个路径:

C:\Users\{Windows用户名}\Documents\WeChat Files\Applet\{小程序ID}
Excel列数和列字母的转换

Date: 1/1/2020Category: 编程技术Tag: Excel, TypeScript, C#, Go

TypeScript版

// 列数 -> 列字母
function ColumnNumberToName(num: number): string {
  if (num < 1 || num > 16384) {
    return ''
  }

  if (num > 26) {
    const digit1 = String.fromCharCode((num - 1) / 26 + 64)
    const digit2 = String.fromCharCode(((num - 1) % 26) + 65)
    return digit1 + digit2
  } else {
    return String.fromCharCode(num + 64)
  }
}

// 列字母 -> 列数
function ColumnNameToNumber(name: string): number {
  let num = 0
  if (name.length == 1) {
    num = Number(name[0].charCodeAt(0)) - 64
  } else if (name.length == 2) {
    num = (Number(name[0].charCodeAt(0)) - 64) * 26 + Number(name[1].charCodeAt(0)) - 64
  }
  return num
}

console.log(ColumnNumberToName(1))
console.log(ColumnNumberToName(26))
console.log(ColumnNumberToName(27))


console.log(ColumnNameToNumber('A'))
console.log(ColumnNameToNumber('Z'))
console.log(ColumnNameToNumber('AA'))
Excel表格七种配色组合

Date: 1/1/2020Category: 编程技术Tag: Excel, 配色

excel_style_title.jpg

excel_style_1.jpg

excel_style_2.jpg

excel_style_3.jpg

如何在Word文档中批量添加汉字注音

Date: 1/1/2020Category: 编程技术Tag: Word, VBA, Go

所谓的汉字注音,就是给汉字上方加注拼音。

汉字注音

在Office里面,这个功能叫做 “拼音指南”(Phonetic Guide)。

拼音指南

拼音指南一次只能够处理最多30个字,一篇文章不可能只有30个字,上百个字是很正常的,人工处理就会很累。所以,需要做到自动化,做到自动化有两种方式可以做到:

代码特殊注释完整规范:IDE 支持、使用示例与团队协作指南

Date: 1/1/2020Category: 编程技术Tag: 代码注释, IDE

一、完整注释表格

注释名 核心作用说明 适用场景细分 VSC VS JetBrains 优先级建议
TODO 功能未实现(尚未启动开发) 新需求、未动工的模块 / 接口 [x] [x] [x] 中 - 高
TODO:HIGH/MID/LOW 带优先级的未实现功能 需区分紧急程度(如 HIGH = 迭代必做,LOW = 后续优化) [] [] [x] 自定义
UNDONE 功能未完成(已开发部分,待收尾) 开发中被打断、需补充细节 / 边界处理的功能 [] [x] [] 中
FIXME 已发现明确 Bug,需修复 可复现、定位清晰的缺陷(含潜在风险未复现的问题) [] [] [x] 高
FIXME:URGENT 紧急 Bug 修复 线上故障、阻塞测试的核心流程缺陷 [] [] [x] 最高
BUG 已确认的具体缺陷 区别于 FIXME:更侧重 “已复现 + 影响范围明确” 的 Bug(如 “用户 ID>1000 时查询失败”) [] [] [] 高
HACK 临时解决方案 / 取巧实现 功能可用,但代码不优雅(如硬编码、规避框架限制),待重构 [] [x] [] 中
XXX 待优化问题(设计 / 实现不规范) 非紧急缺陷,如命名不规范、冗余代码、逻辑可简化(优先级低于 HACK/FIXME) [] [] [] 低 - 中
UnresolvedMergeConflict 未解决的代码合并冲突 Git 合并分支时产生的冲突,需手动对比处理 [] [x] [] 最高
NOTE 重要说明 / 备注 记录设计思路、依赖条件、使用限制(如 “依赖第三方 SDK v2.3.0,升级需改签名”) [] [] [x] -
DEPRECATED 已废弃的代码 / 接口 不建议继续使用,后续版本会删除(需标注替代方案) [] [] [x] -
REVIEW 需代码审查 / 复核 复杂逻辑、高风险模块(如权限控制、支付流程),需团队复核 [] [] [] 中
OPTIMIZE 性能 / 结构优化 代码可运行,但效率低(如 O (n²) 循环)或结构混乱,需重构 [] [] [] 低 - 中
使用CMake编译库,并使用GoogleTest测试库

Date: 1/1/2020Category: 编程技术Tag: GoogleTest

安装依赖

sudo apt-get install libgtest-dev
CLion 在头文件和源文件之间切换

Date: 1/1/2020Category: 编程技术Tag: CLion

该快捷方式在键盘图中称为“相关符号”。

MAC

Ctrl + Cmd + Up

Windows、Linux

Ctrl + Alt + Home

构建系统

Date: 1/1/2020Category: 编程技术Tag: Make, CMake, Ninja

Make

  • 官方网站:https://www.gnu.org/software/make/
  • 开源代码库:https://github.com/gitGNU/gnu_make
  • 开发语言:C