喵个咪的博客喵个咪的博客
喵个咪的技术与生活
文章列表
文章分类
文章标签
时间线
喵个咪的技术与生活
文章列表
文章分类
文章标签
时间线
5大类“抗发炎食物”

Date: 1/1/2020Category: 健康养生Tag: 健康养生

天气变化大总觉得特别容易感冒,尤其在冷冷的冬天医背将茶喝下肚全身就暖活了起来,不过并不是所有时候都可以喝姜茶,喝错时间还可能让喉咙越喝越痛。所以说到底该吃什么才能提高免疫力,减少感冒呢?

1. 维生素C

维生素C能够增强免疫系统,因为是水溶性维生素,需要不断透过饮食补充。可以吃:菠菜、芭乐、奇异果、木瓜、彩椒。

2. 姜辣素

姜中的姜辣素能够减缓发炎、促进血液循环、加速新陈代谢。不过要注意如果已经在感冒中,喉咙红肿疼痛,此时就不要再吃姜来刺激喉咙。(也就是重感冒不要喝姜茶!)

3. 花青素

花青素能够加强泌尿系统、减少发炎症状。可以吃:蓝莓、葡萄、黑梅、蔓越莓、茄子。

9 个 FastAPI 的必知资源

Date: 1/1/2020Category: Python编程Tag: fastapi

FastAPI 是 Python 开发人员最新、最流行的 API 框架之一。我们的工程师一次又一次需要将一个或多个第三方库与我们的 API 结合使用,以附加额外的功能和特性来丰富我们的项目。

在今天的这篇文章中,我想与您分享一些对于常规 FastAPI 从业者非常有用的资源。我已经在自己的项目中使用了其中的大部分,并且还包括我计划在不久的将来使用的一些。

那么让我们深入看看吧!

FastAPI-pagination

该库允许您从 API 路由发送简单的分页响应。这在main.py中的几行代码中使用非常方便,而不是自己编写整个分页逻辑。

生与死

Date: 1/1/2020Category: 随笔日志Tag: 随笔日志

迄今为止(2023年5月22日),我看过了太多的天灾人祸,太多的死亡:

  • 1998年,夏季,大水灾;
  • 2008年,1月10日,大雪灾;
  • 2008年,5月12日,汶川大地震;
  • 2014年,3月8日,马航MH370空难;
  • 2014年,4月16日,韩国世越号沉默事故;
  • 2015年,6月1日,东方之星号客轮翻沉实践;
  • 2022年,3月21日,东方航空5735空难;
  • 2022年,10月29日,韩国梨泰院踩踏事故;
  • 2023年,2月11日,土耳其和叙利亚大地震;
后台权限系统

Date: 1/1/2020Category: 产品设计Tag: 产品设计

参考资料

  • 后台权限管理设计思路:三种模型分析
  • 关于系统后台的用户权限设计与思考
ASIO的post和dispatch方法

Date: 1/1/2020Category: C++编程Tag: ASIO

关于这两个方法,我去网上找了一大堆资料,都没有讲清楚是怎么一回事。还是读了ASIO的源代码这才理解。

要提到这两个方法,不得不提一下Windows的两个API:SendMessage和PostMessage。

io_context::post跟PostMessage的行为差不多,投递完消息立即返回,Handler的执行跟它没有半毛钱的关系。

io_context::dispatch可以认为是SendMessage的超集,SendMessage是阻塞的,必须要在消息处理完成之后才返回,当io_context::dispatch在io_context的工作线程中被调用的时候,io_context::dispatch的行为和SendMessage是一致的,必须要在Handler调用完成之后才返回。但是,如果不是io_context的工作线程中调用,则执行了io_context::post一样的行为:将Handler投递到io_context的事件队列中去。

ASIO 定时器完全指南:类型解析、API 用法与实战示例

Date: 1/1/2020Category: C++编程Tag: ASIO

ASIO(Boost.Asio 或独立的 Asio)作为高性能异步 IO 库,提供了灵活且高效的定时器组件,适用于网络编程、异步任务调度、定时触发等场景。本文将系统梳理 ASIO 定时器的核心类型、底层实现、核心 API、实战示例及常见问题,帮助开发者快速掌握其使用方法。

一、ASIO 定时器核心类型解析

ASIO 提供 4 种常用定时器,均基于底层模板类实现,核心差异在于 时钟类型(决定精度、是否受系统时间影响)和 适用场景。先纠正一个常见误区:high_resolution_timer 并非 system_timer,二者是 basic_waitable_timer 的不同时钟特例化,属于并列关系。

使用 cron 和 RClone 实现自动备份文件

Date: 1/1/2020Category: 运维技术Tag: cron, rclone

本文将向您展示如何在 Linux 操作系统中使用 RClone 和 cron 来自动进行文件备份。

现在是星期五下午 6 点,我需要将一些工作和学校文件备份到 Google 云端硬盘。是的,我使用 git 进行编码项目,但这种工作最好保存在 Google Drive 中。所以我想知道是否有一种更快、简单、自动化的方法来备份到 Google Drive,有趣的是,我发现了 RClone。

在本文中您将了解到:

  • 什么是 RClone?
  • 什么是 cron?
  • RClone 和 cron 的基本用法
  • 如何在每周五下午 6:30 自动备份文件
  • Cron日志记录
  • 如何卸载 RClone
Flutter 使用 RxDart & Streams 实现 BLoC模式

Date: 1/1/2020Category: Flutter编程Tag: flutter, RxDart

我将从本系列的第一部分开始构建一个简单的简短应用程序实现,该实现可以从 API 获取最新的技术新闻。在开始之前,我将简要介绍一些关键术语及其含义。

什么是反应式编程?

响应式编程基本上是 使用异步可观察流进行编程。在 Dart 中,流提供异步数据序列。

RxDart 是基于 Dart 的反应式编程实现。如果您来自 Android 开发领域,RxJava + RxAndroid、Coroutines 可能非常适合您。Dart 编程语言中已经实现了类似的概念。RxDart 是 Dart 语言的 ReactiveX 支持的反应式函数式编程库。Dart 已经有一个很好的用于处理 Streams 的包,但 RxDart 用新功能对其进行了扩展。

构建系统

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

Make

  • 官方网站:https://www.gnu.org/software/make/
  • 开源代码库:https://github.com/gitGNU/gnu_make
  • 开发语言:C
5种服务端缓存设计模式

Date: 1/1/2020Category: 设计模式Tag: 设计模式, Cache Aside Pattern, 缓存设计模式

Cache Aside Pattern

Cache Aside Pattern是最经典的缓存 + 数据库读写的模式。

  1. 读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应
  2. 更新的时候,先更新缓存,然后再更新数据库(缓存和数据库双写)

最大的缺点就是需要应用程序侧来编排读写流程。

读取的步骤

  1. 先从缓存中读取数据;
  2. 如果缓存数据不存在,那么从数据库中读取数据;
  3. 写入缓存。
汽车驱动

Date: 1/1/2020Category: 汽车Tag: 汽车

两轮驱动(Two-Wheel Drive,2WD)

两轮驱动,即是由发动机通过变速箱等直接驱动前轮或者后轮,使汽车前进。

  • 前轮驱动(Front-Wheel Drive) - 发动机驱动前面一对车轮
  • 后轮驱动(Rear-Wheel Drive) - 发动机驱动后面一对车轮

四轮驱动(4-Wheel Drive,4WD)

四轮驱动,是指汽车前后轮都有动力,可按行驶路面状态不同而将发动机输出扭矩按不同比例分布在前后所有的轮子上,以提高汽车的行驶能力。一般用4X4或4WD来表示。

使用 Go (Golang) 为 postgresql 实施 更改数据捕获 (CDC)

Date: 1/1/2020Category: Go编程Tag: go, CDC, PostgreSQL

Change Data Capture介绍

变更数据捕获 (CDC) 是一种用于跟踪对数据库中的数据所做的更改的技术,使您能够跟踪数据的演变。在 PostgreSQL 中,CDC 是使用逻辑复制(Logical Replication)功能实现的,它可以选择性地复制对特定表或列所做的更改。

Golang 是一种编程语言,近年来因其速度和简单性而受到欢迎。它也非常适合处理数据库,因为它内置了对 SQL 数据库的支持以及许多用于处理这些数据库的强大库。

在 PostgreSQL 中使用 Golang 和 CDC 是一个强大的组合,因为它允许您轻松地实时捕获和处理对数据库所做的更改。以下是开始在 PostgreSQL 中使用 Golang 和 CDC 需要遵循的基本步骤:

Centos 安装 Golang

Date: 1/1/2020Category: Go编程Tag: go, Centos
vim install_golang.sh
清除Docker产生的垃圾文件

Date: 1/1/2020Category: 运维技术Tag: docker

通过命令df -h查看磁盘空间占用,发现Docker的overlay对磁盘的占用极高。

通过docker system prune -a命令清除掉Docker的无用镜像、缓存、挂载数据,也并没有太多的改善。

通过du -h --max-depth=1或者du -sh *命令查看大文件的占用情况。

参考资料

  • Docker容器占用磁盘内存过大的问题排查
  • Docker 容器磁盘占用100%(/var/lib/docker/overlay2空间占用很大)
CLion 在头文件和源文件之间切换

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

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

MAC

Ctrl + Cmd + Up

Windows、Linux

Ctrl + Alt + Home

云手机

Date: 1/1/2020Category: 架构设计Tag: 云手机
  • Waydroid只能单开一个Android实例,所以要批量部署,可能需要部署多个宿主Ubuntu;
  • Redroid基于Docker部署,一个宿主可以部署多个。

虚拟手机开源方案

  • ReDroid (Remote anDroid) Docker + AnBox
  • Waydroid LXC + AnBox
  • Android-x86
  • BlissOS
使用CMake编译库,并使用GoogleTest测试库

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

安装依赖

sudo apt-get install libgtest-dev
Cococs2dx 瓦片地图

Date: 1/1/2020Category: 游戏开发Tag: Cococs2dx

渲染方式

  • Rectangle/Orthogonal:正交,正常矩形瓦片
  • Isometric:等距瓦片,45度
  • Hexagon:六边形

参考资料

  • Cocos2D-X Tile Map Tutorial: Part 1
  • Cocos2D-X Tile Map Tutorial: Part 2
  • Introduction to Tiled Map Editor: A Platform-Agnostic Tool for Level Maps
  • 笔记:TileMap坐标转换
  • 韩版《传奇2》源码分析与 Unity 重制(四)服务端地图对象管理
Cocos Creator问题集

Date: 1/1/2020Category: 游戏开发Tag: Cocos Creator

小程序真机无法显示ttf字体

根据论坛里面说的是,主要的原因是因为字体的font-family名字里面带有空格。

需要使用字体修改工具High-Logic FontCreator来修改font-family名,修改之后,确实生效了。

  1. 打开FontCreator,将ttf文件拖到FontCreator打开。
  2. 菜单项选择:Font -> Properties,打开Font Properties弹窗。
  3. 在弹窗里面看到有几个子标签页,其中Identification标签页里面的 Font Family即为字体的英文名,自行修改成自己需要的值。
  4. 在Custom标签页里面,可以看到列表里面的第一列是语言ID,第二列是Name ID,简体中文系统上,找到行 Chinese-People's Republic of China Font Family,
  5. 繁体中文或者其他语言的系统下,应该是修改对应的行,没有的也可以Add添加新的行,这个我没有测试,猜测是这样。
  6. 修改完毕后点击OK保存。
  7. 菜单项选择:File -> Export Font As... -> Export as Desktop Font(ttf/otf),弹出Export as Desktop Font(ttf/otf)窗口。
  8. 在弹出窗口中将Outline Format项,通过下拉选择TrueType,不建议选CFF(测试时这个选项可能Identification标签页里面字体名不生效)。
  9. 底部三个按钮点击Export即可。最终保存文件窗口自己选择文件格式。
代码特殊注释完整规范: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²) 循环)或结构混乱,需重构 [] [] [] 低 - 中
计算TRC20地址

Date: 1/1/2020Category: Python编程Tag: Python, TRC20

Python

使用tronpy软件包

from tronpy.keys import PrivateKey

# 指定私钥(请替换为你实际的私钥)
private_key_hex = "your_private_key_hex_string"

# 将十六进制私钥转换为PrivateKey对象
private_key = PrivateKey(bytes.fromhex(private_key_hex))

# 从私钥派生公钥
public_key = private_key.public_key

# 从公钥生成TRC地址
address = public_key.to_base58check_address()

print("私钥 (十六进制):", private_key_hex)
print("公钥 (十六进制):", public_key.hex())
print("TRC地址:", address)
print('\n')
关于C++嵌入Python引用protobuf引起的一个SIGSEGV错误的解决过程

Date: 1/1/2020Category: C++编程Tag: C++, Python

首先,我的应用场景是这样的,我是一个C++为宿主的程序,内嵌了Python,我C++里边有引用C++版的protobuf动态链接库。Python里边也有用到Python版的Protobuf。两者都用了同一版本的protobuf: 3.13.0。

因为我是插件式的系统,我单独测试Python脚本系统插件的时候,一切都是完美的。然后,我将插件集成到主程序里边去,就完犊子了。只要我在Python中import到protobuf的协议,主程序就会以SIGSEGV信号崩掉。

最终堆栈挂在了_message.cpython-35m-x86_64-linux-gnu.so的google::protobuf::DescriptorPool::FindFileByName()这里:

C++ IDE:最适合 C++ 初学者的 IDE 是什么?

Date: 1/1/2020Category: C++编程Tag: C++, IDE

C++ 创建于 1985 年,是一种流行的编程语言,已经使用了 30 多年。这种面向对象的编程语言设计有多种功能设施,包括编译功能。它最初是为系统编程而构建的,但如今它已成为软件开发行业许多项目的绝佳选择。它可用于创建高性能应用程序,例如桌面应用程序、游戏和服务器。

C++ 作为 C 语言的扩展而构建,采用类进行设计,使其代码可重用。C++ 编程语言支持多种操作系统和集成开发环境 (IDE)。作为想要构建令人印象深刻的软件应用程序的初学者,您可能正在寻找 C++ 的最佳 IDE 来轻松构建和启动您的产品。使用本指南为初学者找到最好的 C++ IDE。

什么是 IDE?

C++ 类型转换:旧风格与四种新风格详解

Date: 1/1/2020Category: C++编程Tag: C++, 类型转换

在 C++ 编程中,类型转换是连接不同数据类型的重要手段。C++ 同时支持兼容 C 语言的旧风格强制转型,以及针对特定场景设计的四种新风格强制转型,后者在可读性、安全性和规范性上更具优势。本文将详细解析各类转换的语法、用途及核心差异。

一、旧风格(C-style)强制转型

C 风格强制转型包含两种语法形式,本质功能完全一致,仅括号位置不同:

  • 格式 1:(T) expression(将表达式转换为 T 类型)
  • 格式 2:T(expression)(函数式语法,效果同上)
Kafka Streams 实现 CQRS 模式 — 第 1 部分

Date: 1/1/2020Category: 架构设计Tag: CQRS, Kafka Streams

CQRS 代表:命令查询职责分离(Command Query Responsibility Segregation)。它提倡分离“命令(Command)”和“查询(Query)”的“职责(Responsibility)”。在本文中,我将尝试回答以下问题:

  • 什么是 CQRS?
  • 为什么 Kafka Streams 是实现 CQRS 很自然的选择?
  • 如何使用 Kafka Streams 实现 CQRS 模式?

案例研究:在线订购系统

让我们从一个经典示例开始:零售在线订购系统。它有两个主要用例:

使用 Bazel 创建Go应用程序的Docker容器镜像

Date: 1/1/2020Category: Go编程Tag: Bazel, Docker, Go

如果你知道Bazel,你就会知道它有多棒:它快速可靠。当您在使用多种服务的项目中工作时,甚至可能使用不同的语言,拥有一个快速可靠的构建系统,更重要的是,生成确定性构建是关键。

但是,您可能不知道使用它bazel来构建容器镜像是多么容易。您将从使用bazel应用到您的镜像构建过程中获得所有好处。另外,您不必处理丑陋的Dockerfiles。

crontab

Date: 1/1/2020Category: 运维技术Tag: crontab

什么是cron表达式?

cron表达式是一个具有时间含义的字符串,一般用于定义定时任务的执行时间。

cron表达式的格式

cron使用6-7位制的格式:

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
客户留存率

Date: 1/1/2020Category: 运维技术Tag: 客户留存率

参考资料

  • 甚麼是客戶保留率? 如何計算客戶保留率?
  • APP用户留存率计算公式和预估方法
  • 用户留存|教你统计日留存、周留存、月留存率更准确的方法
  • 出色的应用留存率是如何炼成的?
  • 关于游戏的留存
  • 小游戏玩家留存策略
  • 6 个重要的移动游戏留存指标及计算方法
  • App的留存率多少才合格?行业App留存参考
  • 微信小游戏大盘留存数据:益智、模拟品类次留高于40%
  • 留存:4 大策略提升 2 类留存官方
  • 如何提升网赚游戏的用户留存率,我们总结出了可复用的分析方法
部署EFK

Date: 1/1/2020Category: 运维技术Tag: EFK
  • ElasticSearch
  • Fluentd
  • Kibana

Docker Run

docker network create app-tier --driver bridge
部署RustDesk服务器

Date: 1/1/2020Category: 运维技术Tag: RustDesk

两个可执行程序:

  • hbbs - RustDesk ID注册服务器,是管各个客户端 ID 的,每个客户端都有一个唯一的 ID 。
  • hbbr - RustDesk中继服务器,是负责检测、中转各个客户端连接和数据传输。

端口占用情况:

  • TCP(21115, 21116, 21117, 21118, 21119)
  • UDP(21116)

进程占用端口情况:

  • hbbs - 21115(tcp), 21116(tcp/udp), 21118(tcp)
  • hbbr - 21117(tcp), 21119(tcp)
本地部署Docker开发环境

Date: 1/1/2020Category: 运维技术Tag: Docker

  • Bash的换行符为 \

  • CMD的换行符为 ^

  • Powershell的换行符为 `

参数简析:

  • -p 宿主机端口:容器端口

需要设置Host:

# Added by Docker Desktop
192.168.1.6 host.docker.internal
192.168.1.6 gateway.docker.internal
# To allow the same kube context to work on the host and the container:
192.168.1.6 kubernetes.docker.internal
# End of section
部署Jitsi Meet

Date: 1/1/2020Category: 运维技术Tag: Jitsi Meet

Jitsi项目组成

  • Jitsi Meet,与WebRTC兼容的JavaScript应用程序,使用Jitsi Videobridge提供高质量、可扩展的视频会议。基于React和React Native构建
  • Jitsi Videobridge(JVB) - 与WebRTC兼容的服务器,用于在会议参与者之间路由视频流。
  • Jitsi Conference Focus (jicofo) - 用于Jitsi会议的服务器端焦点组件,用于管理媒体会话,并充当每个参与者和视频桥之间的负载平衡器。
  • Jitsi Gateway to SIP (jigasi) - 允许常规SIP客户端加入Jitsi会议的服务器端应用程序
  • Jitsi Broadcasting Infrastructure (jibri) - 用于录制和/或流式传输Jitsi会议的一组工具,通过启动虚拟帧缓冲区中呈现的Chrome实例,并使用ffmpeg捕获和编码输出来工作
Docker简单部署Traefik微服务网关

Date: 1/1/2020Category: 运维技术Tag: Traefik, Docker

什么是Traefik?

Traefik 是一款开源的反向代理与负载均衡工具,它监听后端的变化并自动更新服务配置。Traefik 最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。目前支持 Docker、Swarm,Marathon、Mesos、Kubernetes、Consul、Etcd、Zookeeper、BoltDB 和 Rest API 等后端模型。

什么是微服务网关?

微服务网关是整个微服务API请求的入口,可以实现过滤Api接口。并且可以实现用户的验证登录、解决跨域、日志拦截、权限控制、限流、熔断、负载均衡、黑名单与白名单机制等。

用Docker轻松搭建Swagger环境

Date: 1/1/2020Category: 运维技术Tag: Swagger, Docker

概要

我将介绍如何构建运行在 Docker 上的 Swagger 环境。

成果

Swagger Editor

网页的左侧是编辑器,右侧是Swagger UI,可以实时查看notation和查看定义文档。 如果将稍后描述的示例复制并粘贴到左侧,结果将显示在右侧,所以请尝试一下。

swagger_editor

Swagger UI

swagger_ui

Docker Hub 镜像源

Date: 1/1/2020Category: 运维技术Tag: Docker Hub, Docker
提供商 公共镜像 私有镜像
网易云 http://hub-mirror.c.163.com
百度云 https://mirror.baidubce.com
腾讯云 https://ccr.ccs.tencentyun.com
Docker Proxy https://dockerproxy.com
华为云 https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com https://{你的ID}.mirror.swr.myhuaweicloud.com
阿里云 https://1nj0zren.mirror.aliyuncs.com http://{你的ID}.mirror.aliyuncs.com
DaoCloud http://f1361db2.m.daocloud.io
七牛云 https://reg-mirror.qiniu.com
Azure https://dockerhub.azk8s.cn
Docker中国区官方 https://registry.docker-cn.com
中国科学技术大学(适用于校园网) http://docker.mirrors.ustc.edu.cn
Docker内部安装软件

Date: 1/1/2020Category: 运维技术Tag: Docker
docker exec -it {容器名} "apt update"
docker exec -it {容器名} "apt install {软件名}"
Docker 容器中安装VIM

Date: 1/1/2020Category: 运维技术Tag: Docker, VIM

Docker的容器当中一般是没有安装任何编辑器的,vi和vim神马的都没有.如果想要在容器中使用编辑器,需要自己去安装.
但是,在 Docker 中执行:apt-get update报错:

E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
Docker在国内没有代理的解决方案

Date: 1/1/2020Category: 运维技术Tag: Docker

Docker的国内代理都失效了,不抱怨,只讲如何解决问题。

简单来说,就是把本地的镜像导出来,然后打成压缩包,再拷贝到服务器上去,然后再导入。

导出镜像

docker save bitnami/minio:latest -o minio.tar
Windows11 启动 Docker 提示端口被占用 无法启动

Date: 1/1/2020Category: 运维技术Tag: Docker

今天Windows11升级重启了,我启动RabbitMQ,然后提示端口被占用,而无法启动Docker. 提示信息如下:

listen tcp 0.0.0.0:1883: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
为Docker容器运行的PostgreSQL安装插件

Date: 1/1/2020Category: 运维技术Tag: Docker, PostgreSQL

准备

查看PostgreSQL的版本号(有些插件带大版本号):

SELECT version();
Docker修剪未使用对象

Date: 1/1/2020Category: 运维技术Tag: Docker

Docker 采用保守的方法来清理未使用的对象,例如镜像(Image)、容器(Container)、数据卷(volume)和网络(Network)。也就是说,除非您明确告诉 Docker 这样做,否则每个对象都永远不会被删除。结果导致了 Docker 最终使用了大量的磁盘空间。对于每种类型的对象,Docker 都提供了一个 prune(删除)命令。此外,您可以一次清理多个对象类型。本主题介绍如何使用每个命令。

镜像(Image)修剪

docker image prune该命令可以清理未使用的镜像。默认情况下,该命令仅删除挂起的镜像。挂起的镜像是没有标签且不被其他容器引用的镜像。要删除挂起的镜像,只需要键入:docker image prune

使用Docker发布静态网站

Date: 1/1/2020Category: 运维技术Tag: Docker

创建Dockerfile

注册Docker Hub账号

Docker清理磁盘空间

Date: 1/1/2020Category: 运维技术Tag: Docker

在日常运维当中,Docker会产生一些运行时的临时文件,我们需要定时的清理掉他们,不然将会对磁盘造成极大的压力。

探查命令

查看整个Docker系统的磁盘占用情况:

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

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

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

汉字注音

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

拼音指南

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

Apache Doris 4.x 在量化交易中的完整应用实践

Date: 1/1/2020Category: 量化开发Tag: Doris, 量化交易

前言

在量化交易场景中,实时行情接入、多维度 K 线聚合、技术指标计算、策略回测与绩效监控是核心能力诉求。Apache Doris 4.x 凭借高性能 OLAP 引擎、实时物化视图、标准 SQL 兼容、Kafka 实时接入等特性,成为量化投研与实盘交易的理想存储计算引擎。

本文基于 Doris 4.x 构建一站式量化交易数据平台,覆盖分钟级行情存储、实时聚合、技术指标、策略选股、AI 辅助决策、回测复盘全流程,可直接用于生产环境部署。

一、整体架构设计

本方案采用分层量化数仓架构,兼顾实时性、查询性能与投研易用性:

Flutter中父子Widget之间如何进行高效通信

Date: 1/1/2020Category: Flutter编程Tag: Flutter, Widget

Flutter 的 widget系统 允许 父widget 和 子widget 之间无缝通信。了解如何双向调用方法可以显著增强应用的架构和性能。在本文中,我们将探讨如何从 父widget 调用 子widget 的方法,反之亦然。

从父部件调用子部件的方法

在 Flutter 中,可以使用属于子State类型的全局键GlobalKey来从父级调用子Widget中定义的方法。

例如:假设我们有一个名为ChildWidget的子窗口小部件

class ChildWidget extends StatefulWidget {
  const ChildWidget({super.key});

  @override
  State<ChildWidget> createState() => ChildWidgetState();
}

class ChildWidgetState extends State<ChildWidget> {
  int value = 0;

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 10,
      child: Container(
        height: 200,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(10),
          color: Colors.green,
        ),
        child: Column(
          children: [
            const Text(
              "Child Widget",
              style: DemoTextStyle.headline1,
            ),
            ElevatedButton(onPressed: () {}, child: const Text("Call Parent")),
            Center(
              child: Text(
                'Child value:  $value',
                style: DemoTextStyle.copyWith(
                    fontSize: 18, fontWeight: FontWeight.normal),
              ),
            ),
          ],
        ),
      ),
    );
  }

  void changeValue() {
    setState(() {
      value++;
    });
  }

  void changeValueDynamic(int val) {
    setState(() {
      value = val;
    });
  }
}
Ent代码生成工具链

Date: 1/1/2020Category: Go编程Tag: Go, Ent, SQL

Ent是Facebook开源的一个GO语言的ORM框架。它提供了一系列的工具,可以做到:

  1. SQL生成schema;
  2. schema生成protobuf的message;
  3. schema生成gPRC的service。

创建go项目

go mod init entimport-example
Entgo 实现 软删除(Soft Delete)

Date: 1/1/2020Category: Go编程Tag: Go, Ent, SQL

我们在开发程序的过程中,会遇到一个常见的需求——删除表中的数据。

但是有时候,业务需求要求不能永久删除数据库中的数据。比如一些敏感信息,我们需要留着以方便做历史追踪。 这个时候,我们便会用到软删除。

Entgo本身是不直接支持的,但是,要实现也并不是很难的事情。

什么是软删除?

软删除(Soft Delete) 是相对于 硬删除(Hard Delete) 来说的,它又可以叫做 逻辑删除 或者 标记删除。

Excel表格七种配色组合

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

excel_style_title.jpg

excel_style_1.jpg

excel_style_2.jpg

excel_style_3.jpg

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'))
探索 Flutter 中的 Sealed Class

Date: 1/1/2020Category: Flutter编程Tag: Flutter, Sealed Class

Dart 3 在 Flutter 中引入了 密封类(Sealed Class)。如果您来自于类似 Kotlin 这样的现代编程语言,您可能已经知道它们有多么强大。如果没有,在本文结束时您将了解到关于密封类的全部内容。

密封类(Sealed Class)是一项强大的功能,使开发人员能够创建受限制的类层次结构。与常规类不同,密封类只能在同一文件中扩展,这使得它们成为表示有限相关类集的绝佳选择。

了解密封类

如何获取微信小程序的资源

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

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

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

小程序所在的位置

首先,它有两个路径:

C:\Users\{Windows用户名}\Documents\WeChat Files\Applet\{小程序ID}
Python 人脸识别

Date: 1/1/2020Category: Python编程Tag: 人脸识别

人脸识别十大关键技术

1. 人脸检测(Face Detection)

“人脸检测”的作用就是要检测出图像中人脸所在位置。人脸检测算法的原理简单来说是一个“扫描”加“判定”的过程。即首先在整个图像范围内扫描,再逐个判定候选区域是否是人脸的过程。因此人脸检测算法的计算速度会跟图像尺寸大小以及图像内容相关。在实际算法时,我们可以通过设置“输入图像尺寸”、或“最小脸尺寸限制”、“人脸数量上限”的方式来加速算法。

2. 人脸配准(Face Alignment)

“人脸配准”所实现的目的是定位出人脸上五官关键点坐标。当前效果的较好的一些人脸配准技术基本通过深度学习框架实现。这些方法都是基于人脸检测的坐标框,按某种事先设定规则将人脸区域抠取出来,缩放到固定尺寸,然后进行关键点位置的计算。另外,相对于人脸检测,或者是后面将提到的人脸特征提取的过程,人脸配准算法的计算耗时都要少很多。

Firefly ROC-RK3588S-PC

Date: 1/1/2020Category: 物联网开发Tag: RK3588S

默认安装的是Android系统,我们不需要,我们需要一个Ubuntu Desktop。

安装工具

  • 安装RK USB驱动 DriverAssistant
  • 安装运行 RKDevTool
  • 下载固件:Ubuntu、Debian、Buildroot……

开发板进入到Loader模式

  1. 先断开电源;
  2. USB线一端插入到OTG口,另外一端插入到电脑;
  3. 按住RECOVERY 键(需要注意,为了防止误触,它的按钮被隐藏在侧面,手指头探下,将黑色的按钮往白色的按钮基座抠);
  4. 接通电源;
  5. RECOVERY 键持续摁住大约2秒。
解决 Flutter 项目更新至 Android Studio Ladybug (2024.2.1) 后出现的问题

Date: 1/1/2020Category: Flutter编程Tag: Flutter, Android Studio

升级到Android Studio Ladybug | 2024.2.1后,我在 Flutter 项目中遇到了一些问题。幸运的是,我通过修改一些配置文件找到了一个简单的解决方案。如果您面临类似的挑战,请按照以下步骤让您的项目重回正轨。

修改settings.gradle:

id "com.android.application" version "8.3.2" apply false
修复Flutter一些iOS编译错误

Date: 1/1/2020Category: Flutter编程Tag: Flutter, iOS

Сocoapods trunk URL couldn’t be downloaded

逐行运行此命令

gem uninstall cocoapods 
arch -x86_64 brew install cocoapods 
arch -x86_64 brew reinstall cocoapods 
cd ios 
pod cache clean --all 
pod install (如果m1 macOS 运行这个“arch -x86_64 pod install”)
pod update
刚进入Flutter吗?适合初学者食用,GetX是否适合你呢?

Date: 1/1/2020Category: Flutter编程Tag: Flutter, GetX

是否使用 GetX?

看到有许多人在讨论 GetX 如何如何,通常很多人是刚进入 Flutter 的初学者,一眼望去,有许多状态管理可以选择,感觉无从下手,所以提出自己的询问,我觉得这些人做得很好,他们在决定投入之前,会先尝试一下询问社群。

在这里,我先给出个我的意见:

不建议你使用,尤其在专业以及大型的产品上更不应该使用,而且它也无法帮助你的职业发展。

Flutter学习实录

Date: 1/1/2020Category: Flutter编程Tag: Flutter

数字格式化

可以使用intl实现该功能。

首先安装库:

flutter pub add intl
搭建Flutter的鸿蒙开发环境

Date: 1/1/2020Category: Flutter编程Tag: Flutter, 鸿蒙

安装鸿蒙开发环境

首先,需要下载安装两个东西:DevEco Studio和command-line-tools,在这个网址去下载。

DevEco Studio是Jetbrains定制的IDE,使用起来和Android Studio也差不太多。

安装好之后,然后通过内置的SDK管理器去下载SDK,进入SDK管理器的路径是:File -> Settings -> OpenHarony SDK。找一个合适的版本下载。默认本地安装路径:C:\Users\{用户名}\AppData\Local\OpenHarmony\Sdk。

Flutter切换源

Date: 1/1/2020Category: Flutter编程Tag: Flutter

国内镜像列表

提供商 PUB_HOSTED_URL FLUTTER_STORAGE_BASE_URL
上海交大 https://mirror.sjtu.edu.cn/dart-pub https://mirror.sjtu.edu.cn
清华大学 https://mirrors.tuna.tsinghua.edu.cn/dart-pub https://mirrors.tuna.tsinghua.edu.cn/flutter
OpenTUNA https://opentuna.cn/dart-pub https://opentuna.cn/flutter
CNNIC http://mirrors.cnnic.cn/dart-pub http://mirrors.cnnic.cn/flutter
Flutter中国(七牛云) https://pub.flutter-io.cn https://storage.flutter-io.cn
腾讯云 https://mirrors.cloud.tencent.com/dart-pub https://mirrors.cloud.tencent.com/flutter
Flutter使用Sealed Class让状态类更强大

Date: 1/1/2020Category: Flutter编程Tag: Flutter, Sealed Class

记得之前在写Kotlin的时候,对于Kotlin所提供的Sealed Class的功能感到惊喜,我还给Sealed Class封上了enum 2.0的称号,它拥有Class的特性,可以将状态封装起来,使用when语法的时候,还可以详尽列出所有的子项,而在Flutter当中,其实也有sealed class可以用,在Dart 3.0中,也已经将sealed class加入到了Dart的武器库。

enum

假如,我们现在要实现一个 收音机 功能,我们可以使用enum声明其状态,代码如下:

字体渲染

Date: 1/1/2020Category: 游戏开发Tag: 字体渲染

位图字体(Bitmap Font)

最简单的文本渲染方式是:点阵字体 (Dot-matrix-fonts) 也叫位图字体 (Bitmap-fonts)。

位图字体通过将所需的独特字形光栅化为单个纹理(称为 纹理图集(Texture atlas)),使用的时候再找到对应的字符的 UV,再绘制文本。

位图字体(Bitmap Font)

期货相关

Date: 1/1/2020Category: 量化开发Tag: 期货, Futures

期货合约(Futures Contract)

期货合约(英语:futures contract),简称期货(英语:futures),是一种跨越时间的交易方式,金融衍生工具的一种。买卖双方透过签订合约,同意按指定的时间、价格与其他交易条件,交收指定数量的现货。通常期货集中在期货交易所,以标准化合约进行买卖,但亦有部分期货合约可透过柜台交易进行买卖,称为场外交易合约。交易的资产通常是商品或金融工具。双方同意购买和出售资产的预定价格被称为远期价格。未来的指定时间 - 即交付和付款发生时 - 称为交货日期。因为它是标的资产的函数,期货合约是衍生工具。

期货的基本制度

使用高德地图实现地理围栏

Date: 1/1/2020Category: 物联网开发Tag: 地理围栏

什么是地理围栏(Geo-fencing)?

地理围栏(Geo-fencing)是LBS的一种新应用,就是用一个虚拟的栅栏围出一个虚拟地理边界。当手机进入、离开某个特定地理区域,或在该区域内活动时,手机可以接收自动通知和警告。有了地理围栏技术,位置社交网站就可以帮助用户在进入某一地区时自动登记。

地理坐标系

我们通常用经纬度来表示一个地理位置,但是由于一些原因,我们从不同渠道得到的经纬度信息可能并不是在同一个坐标系下。

  • 高德地图、腾讯地图以及谷歌中国区地图使用的是GCJ-02坐标系
  • 百度地图使用的是BD-09坐标系
  • 底层接口(HTML5 Geolocation或ios、安卓API)通过GPS设备获取的坐标使用的是WGS-84坐标系
地理空间搜索

Date: 1/1/2020Category: 物联网开发Tag: GEO

Redis

Redis 3.2.0版本开始,提供了GEO系列命令,可以用搜索、索引地理位置信息。

索引地理位置信息

GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
Git设置网络代理

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

设置HTTP代理

git config --global http.proxy http://127.0.0.1:1080
git submodule

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

添加子模块

git submodule add <url> <path>
go-wind-cms 微服务架构设计:为什么基于 Kratos?

Date: 4/9/2026Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在内容管理系统(CMS)向微服务、云原生升级的浪潮中,技术框架的选型直接决定架构的稳定性、扩展性与开发效率。作为基于 Go 语言打造的企业级 Headless CMS,go-wind-cms 摒弃了传统单体架构的局限,采用微服务架构设计,而其核心技术底座,选择了由 B 站开源、社区共建的 Kratos 微服务框架。

很多开发者会疑惑:Go 语言生态中不乏 Go-Zero、Go-Micro 等优秀微服务框架,go-wind-cms 为何独选 Kratos?答案并非单一维度的技术偏好,而是 Kratos 的设计理念、核心特性与 go-wind-cms 的业务场景、产品定位高度契合——从标准化治理到可观测性,从生态协同到业务适配,Kratos 为 go-wind-cms 提供了“开箱即用、可扩展、易维护”的微服务解决方案,完美解决了 CMS 微服务化过程中的核心痛点。

从埋点到决策:Go Wind UBA 帮你一站式搞定用户行为全链路分析

Date: 4/9/2026Category: GoWind风行Tag: Golang, Go-Kratos, GoWind, UBA

在数字化时代,用户行为数据早已成为企业突破增长瓶颈、优化产品体验、防范业务风险的核心资产。无论是互联网产品的迭代优化、营销活动的精准落地,还是企业内部的安全管控,都离不开对用户行为的深度洞察。然而,传统用户行为分析流程中,埋点繁琐、数据割裂、分析滞后、决策脱节等痛点,往往让企业陷入“数据多而无用”的困境——花费大量精力采集数据,最终却无法将数据转化为可落地的业务决策。

Go Wind UBA(User Behavior Analytics,用户行为分析)的出现,正是为了破解这一行业痛点。作为基于Go语言研发的一站式用户行为全链路分析工具,它以“埋点轻量化、数据一体化、分析智能化、决策场景化”为核心,打通从数据采集(埋点)、数据处理、智能分析到决策落地的全流程,让企业无需搭建复杂的技术架构,就能快速挖掘用户行为背后的价值,实现“数据驱动业务”的核心目标。

搜索算法实现 - Golang版

Date: 1/1/2020Category: Go编程Tag: Golang, 算法

算法列表

  • [X] 顺序查找(Sequential Search)
  • [X] 二叉树查找(Binary Search)
  • [X] 三叉树查找(Ternary Search)
  • [X] 插值查找(Interpolation Search)
  • [X] 斐波那契查找(Fibonacci Search)
  • [X] 指数查找(Exponential Search)
  • [X] 树表查找(Tree table lookup)
  • [X] 分块查找(Blocking Search)
  • [ ] 哈希查找(Hash Search)
排序算法实现 - Golang版

Date: 1/1/2020Category: Go编程Tag: Golang, 算法

算法列表

  • [X] 冒泡排序(Bubble Sort)
  • [X] 鸡尾酒排序(Cocktail Sort)
  • [X] 选择排序(Selection Sort)
  • [X] 插入排序(Insertion Sort)
  • [X] 归并排序(Merge Sort)
  • [X] 原地归并排序(In-place Merge Sort)
  • [X] 堆排序(Heap Sort)
  • [X] 快速排序(Quick Sort)
  • [X] 希尔排序(Shell Sort)
  • [X] 计数排序(Counting Sort)
  • [X] 基数排序(Radix Sort)
  • [X] 桶排序(Bucket Sort)
  • [X] 二叉排序树排序(Binary Tree Sort)
  • [X] 鸽巢排序(Pigeonhole Sort)
  • [X] 侏儒排序(Gnome Sort)
  • [ ] 块排序(Block Sort)
Go单协程事件调度器:游戏后端的无锁有序与响应时间掌控

Date: 1/1/2020Category: Go编程Tag: Golang, 算法

在游戏后端架构设计中,单协程(单线程)事件调度器(Event Loop) 是实现 “绝对消息顺序” 与 “无锁状态管理” 的核心方案。

相较于多线程模型所面临的锁竞争、竞态条件、数据一致性等复杂问题,单协程调度器通过 完全串行化执行 所有核心逻辑,从根本上规避了并发安全风险——这一特性对于对状态准确性要求极高的游戏场景(如玩家血量、金币、技能释放结果、战斗胜负判定)具有决定性意义。

然而,串行执行也带来了严苛的约束:任何一个事件的处理延迟,都会直接放大为全服玩家的体验损耗。因此,单协程调度器的核心设计目标,是在保证逻辑有序性的前提下,极致控制响应时间,守住系统稳定性红线。

Go 接口与代码复用:替代继承的设计哲学

Date: 1/1/2020Category: Go编程Tag: Golang

一、前言

Go 是 Google 设计的类 C 静态类型语言,兼顾底层性能与开发效率。它并非传统意义上的面向对象(OOP)语言 —— 没有 class 关键字,也不支持传统的 “继承” 语法,但通过 接口的隐式实现 和 结构体组合(嵌入),Go 能灵活实现 OOP 的核心特性(多态、代码复用),且设计更简洁、无继承带来的耦合问题。 与 C++ 相比,Go 的设计哲学是 “组合优于继承”:用接口实现多态,用结构体嵌入实现代码复用,既避免了继承的复杂语法,又解决了多重继承的歧义问题。本文将通过类比 C++ 的接口 / 继承逻辑,详解 Go 如何实现类似效果。

初学者友好:Go-Kratos 集成 go-crud,Ent ORM CRUD 无需重复编码,轻松上手

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

对于刚接触 Go 微服务开发的初学者来说,直接上手 “框架 + ORM” 的组合常显复杂。而 kratos-ent-example 项目已为我们搭建好了 Go-Kratos 与 Ent 的基础集成框架,本文将基于该项目,聚焦如何快速接入 go-curd 工具简化 CRUD(增删改查)操作,全程以 step-by-step 的方式讲解,新手也能轻松跟随实操。

先明确核心工具关系:kratos-ent-example是 “基础骨架”(已整合 Kratos 与 Ent),go-curd是 “效率工具”(封装重复 CRUD 逻辑),我们的核心目标是 “在现有骨架上装工具,让数据操作更简单”。

初学者友好:Go-Kratos 集成 go-crud,GORM ORM CRUD 无需重复编码,轻松上手

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

对于刚接触Go微服务开发的初学者来说,直接上手“框架+ORM”的组合常显复杂。而kratos-gorm-example项目已为我们搭建好了Go-Kratos与GORM的基础集成框架,本文将基于该项目,聚焦如何快速接入go-curd工具简化CRUD(增删改查)操作,全程以step-by-step的方式讲解,新手也能轻松跟随实操。

先明确核心工具关系:kratos-gorm-example是“基础骨架”(已整合Kratos与GORM),go-curd是“效率工具”(封装重复CRUD逻辑),我们的核心目标是“在现有骨架上装工具,让数据操作更简单”。

Golang设置网络代理

Date: 1/1/2020Category: Go编程Tag: Golang

打开模块支持

go env -w GO111MODULE=on
Golang WebRTC

Date: 1/1/2020Category: Go编程Tag: Golang, WebRTC

参考资料

  • Golang WebRTC. How to use Pion 🌐Remote Controller
  • Getting Web Development Right: WebRTC Tutorial — Golang and React.
  • From zero to fully functional video conference app using Go and webRTC
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:API管理

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

开门见山,Kratos内置的RPC是gRPC,而gRPC是基于Protobuf作为 接口规范的描述语言(IDL,Interface Description Language)。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:后端权限控制

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

后端的权限控制主要分为两种:

  • API权限控制;
  • 数据权限控制。

在本文,我们不讨论数据权限的控制,主要讲API的权限控制。

在GO的世界里面,我们能够使用到的解决方案有:

  • Casbin
  • Open Policy Agent(OPA)
  • Zanzibar
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:后端项目结构说明

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind
├─.docker
│  └─compose
├─api
│  ├─gen
│  │  └─go
│  │      ├─admin
│  │      │  └─service
│  │      │      └─v1
│  │      ├─file
│  │      │  └─service
│  │      │      └─v1
│  │      ├─system
│  │      │  └─service
│  │      │      └─v1
│  │      └─user
│  │          └─service
│  │              └─v1
│  └─protos
│      ├─admin
│      │  └─service
│      │      └─v1
│      ├─file
│      │  └─service
│      │      └─v1
│      ├─system
│      │  └─service
│      │      └─v1
│      └─user
│          └─service
│              └─v1
├─app
│  └─admin
│      └─service
│          ├─cmd
│          │  └─server
│          │      └─assets
│          ├─configs
│          └─internal
│              ├─data
│              │  └─ent
│              ├─server
│              └─service
├─pkg
├─script
└─sql
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:kratos-bootstrap 入门教程(类比 Spring Boot)

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

kratos-bootstrap 是 GoWind Admin 底层核心的应用引导框架,承担着类似 Java 生态中 Spring Boot 的角色 —— 通过标准化初始化流程、统一配置管理、简化组件集成,为开发者屏蔽基础设施搭建的复杂性。借助它,开发者无需重复编写微服务启动、配置加载、中间件注册等样板代码,可直接聚焦业务逻辑开发。本文将详细讲解如何在 GoWind Admin 中通过 kratos-bootstrap 完成应用初始化、配置管理、组件集成等关键操作,并对比 Spring 等主流框架的设计理念,帮助开发者快速上手。

一、kratos-bootstrap 在 GoWind Admin 中的角色:类比 Spring Boot 的「基础设施引擎」

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:Casbin集成指南

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

GoWind Admin(风行)作为开箱即用的企业级前后端一体中后台框架,致力于解决中后台系统开发中的通用问题,而权限管理作为中后台系统的核心安全能力,是框架设计的重中之重。Casbin 作为一款功能强大、灵活易用的开源访问控制框架,能够完美适配 GoWind Admin 的权限管理需求。本文将详细讲解 Casbin 的核心原理、配置规则,并完整呈现其在 GoWind Admin 中的集成流程与最佳实践。

一、Casbin 简介:企业级权限管理的优选方案

Casbin(https://github.com/casbin/casbin)是一款专注于访问控制的开源库,核心目标是帮助复杂系统解决权限管理的灵活性与安全性难题,也是国内开源项目中的优秀代表。其最大优势在于采用元模型设计思想,不局限于固定的权限模型,而是支持 ACL(访问控制列表)、RBAC(基于角色访问控制)、ABAC(基于属性访问控制)、RESTful 等多种经典访问控制模型,同时允许开发者根据业务需求自定义权限规则,具备极强的扩展性。 凭借卓越的设计与稳定性,Casbin 已获得全球众多企业的认可:Intel、IBM、腾讯云、VMware、RedHat、T-Mobile 等企业将其用于开源项目,Cisco、Verizon 等企业在闭源系统中采用。项目由北京大学罗杨博士于 2017 年 4 月发起,罗杨博士长期深耕云计算访问控制领域,发表数十篇相关学术论文,并在 ICWS、IEEE CLOUD、ICICS 等顶级学术会议宣讲研究成果,Casbin 正是其学术研究与工程实践结合的核心产物。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:ClickHouse集成指南

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

ClickHouse 是一款由俄罗斯搜索引擎公司 Yandex 开发的开源列式存储数据库,专为海量数据实时分析设计。它以极致的查询性能和高吞吐写入能力著称,尤其擅长处理PB 级别的结构化数据,并能在毫秒到秒级内完成复杂的聚合分析(如多维度统计、漏斗计算、用户行为分析等),是大数据分析、数据仓库、实时报表等场景的核心工具。

ClickHouse 的核心概念

概念 说明
表(Table) 类似关系型数据库的表,存储结构化数据,但底层按列存储。
引擎(Engine) 决定表的存储方式、查询特性和分布式行为,是 ClickHouse 的核心设计。例如:
- MergeTree 系列:最常用,支持索引、分区、副本,适合海量数据存储;
- Log 系列:轻量无索引,适合临时小表;
- Distributed:分布式表,用于管理集群分片。
分区(Partition) 按规则(如时间、地区)将表数据拆分,查询时可快速过滤分区,减少扫描范围(如按 “日期” 分区,查询 “2023 年 10 月数据” 仅需扫描对应分区)。
主键(Primary Key) 用于排序和快速查找,不同于关系型数据库的唯一约束,ClickHouse 主键允许重复,主要作用是优化查询性能。
跳数索引(Skip Index) 辅助索引,用于快速判断某一范围内是否存在符合条件的数据(如 “数值是否在 100-200 之间”),进一步减少扫描量。
分片(Shard) 集群中数据的物理拆分单位,每个分片存储表的一部分数据,分布在不同节点,实现并行处理。
副本(Replica) 同一分片的冗余备份,用于故障恢复和负载均衡(查询可分散到不同副本),保证数据不丢失。
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:代码生成工具集

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

我们为go-wind-admin这个项目打造了一个代码生成工具集。

  • cfgexp 用于将服务本地配置导入到远程配置系统,支持:Etd、Consul、Nacos……
  • sql2orm 用于把数据库的表结构导入,并且生成为ORM代码,支持:ENT、GORM……
  • sql2proto 用于把数据的表结构导入,并且生成gRPC、REST的Protobuf代码。
  • sql2kratos 用于把数据的表结构导入,并且生成一整套的Kratos服务代码。
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:如何进行Docker部署后端

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

Docker 部署具备环境一致性、可移植性强、部署高效等优势,是企业级应用落地的优选方案。风行·GoWind Admin 后端已将所有Docker部署相关操作封装至 Makefile 中,实现极简部署体验。本文将详细介绍两种核心部署方式、服务增减时的配置调整方法,助力开发者快速完成后端服务的容器化部署。

一、部署前提

  • 本地环境已安装 Docker(建议版本 20.10+)及 Docker Compose(建议版本 2.10+),可通过 docker -v``、docker compose version 命令验证安装。
  • 已获取 GoWind Admin 项目源码,进入后端项目根目录(即 backend 目录),所有部署命令均在此目录执行(特殊说明除外)。
  • 确保部署环境网络通畅,可正常拉取 Docker Hub 公共镜像(如 postgres、redis 等依赖组件)。
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:如何搭建开发环境

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

开发环境的稳定与规范是高效开发的基础。风行·GoWind Admin 作为前后端一体的企业级中后台框架,需搭建适配的前端、后端开发环境以保障开发流程顺畅。本文将详细拆解前端、后端开发环境的搭建步骤,涵盖工具安装、插件配置、网络代理设置等核心内容,适配 Windows/macOS 主流系统,助力开发者快速完成环境初始化。

一、前端开发环境搭建

前端基于 Vue + TypeScript 技术栈,需安装代码管理、开发IDE、运行环境及依赖管理工具,同时配置 Protobuf 相关插件以支持接口定义解析。

1. 必备开发工具清单

以下工具为前端开发核心依赖,确保代码拉取、项目编译、依赖管理等流程正常运行:

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:ElasticSearch集成指南

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

ElasticSearch(简称 ES)是 Elastic 技术栈的核心组件,一款开源分布式全文搜索引擎,基于 Lucene 引擎构建,兼具实时数据存储、检索与分析能力。其分布式架构天然支持水平扩展,能轻松应对海量数据场景,凭借高吞吐、低延迟、高可用的特性,广泛应用于中后台系统的日志分析、全文检索、业务监控、数据可视化等核心模块。

GoWind Admin(风行)作为企业级前后端一体中后台框架,已对 ElasticSearch SDK 进行封装,提供标准化配置、依赖注入、通用 CRUD 封装等能力,开发者可快速集成 ES 实现数据检索与分析需求。本指南将从核心概念、环境部署、框架集成、实战示例四个维度,完整讲解 ES 与 GoWind Admin 的集成过程。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:前端权限控制

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台系统中,前端权限控制是保障数据安全、规范用户操作边界的核心能力。风行·GoWind Admin 前端权限控制核心聚焦于功能权限管控,根据控制粒度的不同,分为「页面级权限」和「按钮级权限」两大模块,覆盖从“页面访问”到“操作执行”的全链路权限管控需求。本文将详细拆解两种权限的实现原理、启用方式、核心代码及最佳实践,助力开发者快速落地权限管控方案。

一、页面级权限:管控页面访问边界

页面级权限的核心目标是控制用户能否访问特定页面,主要通过「菜单隐藏」和「路由拦截」两种手段实现——未授权用户既无法在侧边栏看到目标菜单,也无法通过直接输入URL跳过菜单访问页面,进而实现对用户访问“财务报表”“人事管理”等核心页面的精准管控。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:极速搭建微服务应用

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台系统开发中,开发者常常面临两大痛点:一是微服务架构搭建繁琐,从项目初始化到多服务协同需要大量手动配置;二是前后端协同成本高,接口定义、数据模型同步往往耗时费力。而 GoWind Admin(简称「风行」)的出现,正是为了解决这些问题 —— 它基于 gow CLI 工具,提供了一套开箱即用的企业级前后端一体中后台框架,让开发者能以极低成本快速搭建微服务体系。

什么是 GoWind Admin?

GoWind Admin 是一套聚焦企业级中后台场景的微服务开发框架,基于 Go 语言生态(依托 go-kratos 微服务框架)打造,整合了前后端开发所需的核心工具链。其核心优势在于「一键生成」与「高度可配置」:通过 gow 命令行工具,开发者可以快速初始化项目、创建微服务、生成接口与数据层代码,无需从零搭建架构,极大缩短开发周期。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:基于 Ent 从零实现新服务

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

本文将指导开发者在 GoWind Admin 企业级前后端一体中后台框架中,从零开始构建一个完整的 gRPC 服务。我们所指的 “服务” 即 gRPC 中的 service,通常包含特定数据集的 CRUD(增删改查)操作,遵循框架规范实现高可维护性与可扩展性。

前置准备

在开始前,请确保已完成以下环境准备:

开发环境

  • Go 1.19+(推荐 1.21+,支持最新语言特性)
  • Git(版本控制)
  • Protobuf 编译器(protoc,用于编译 proto 文件)
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:基于 GORM 从零实现新服务

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

本文将指导开发者在 GoWind Admin 企业级前后端一体中后台框架中,从零开始构建一个完整的 gRPC 服务。我们所指的 “服务” 即 gRPC 中的 service,通常包含特定数据集的 CRUD(增删改查)操作,遵循框架规范实现高可维护性与可扩展性。

前置准备

在开始前,请确保已完成以下环境准备:

开发环境

  • Go 1.19+(推荐 1.21+,支持最新语言特性)
  • Git(版本控制)
  • Protobuf 编译器(protoc,用于编译 proto 文件)
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:为什么选 Golang+Vue3 这套组合?

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

企业级 Admin 系统的技术选型,既要兼顾高性能与稳定性,也要平衡开发效率与可扩展性。go-wind-admin 作为开箱即用的全栈 Admin 解决方案,最终选定 Golang 生态(后端) + Vue3 生态(前端) 的技术组合,并非偶然 —— 而是精准匹配企业级管理系统核心需求的必然选择。本文将深度拆解这套技术栈的选型逻辑,以及它如何为项目赋能。

一、后端技术栈:Golang 生态的 “精准狙击”

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:InfluxDB集成指南

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

InfluxDB 是一款采用 Go 语言开发的开源分布式时序数据库,专为时间序列数据的高效存储、查询与分析设计,由 InfluxData 公司主导开发。其核心优势在于高频写入性能、时序数据索引优化及原生聚合分析能力,广泛应用于 IoT 设备监控、系统性能指标采集、日志时序分析、金融行情跟踪等场景。在企业级中后台系统中,InfluxDB 可快速对接 GoWind Admin 框架,为实时监控面板、历史数据追溯、趋势预测分析等功能提供稳定的数据存储支撑。

一、InfluxDB 核心概念深度解析

InfluxDB 的数据模型与传统关系型数据库存在显著差异,理解以下核心概念是实现高效集成的基础。可通过与 MySQL 概念的类比快速建立认知:

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:站内信

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级后台管理系统中,站内信是核心沟通组件之一,承担着系统通知、用户互动、业务提醒等关键场景需求。基于 Go 语言微服务框架 Kratos 构建的 Go Wind Admin,将站内信模块封装为「开箱即用」的标准化组件,无需从零开发即可快速集成,大幅降低开发成本。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:介绍

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

风行(GoWind Admin)是一款开箱即用的企业级Golang全栈中后台管理框架,品牌slogan:让中后台开发如风般自由。

系统后端基于GO微服务框架go-kratos,前端基于Vue微服务框架Vben Admin,兼顾微服务的扩展性与单体部署的便捷性。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:JWT 集成指南

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台系统开发中,身份认证与授权是核心安全能力。JWT(JSON Web Token)凭借其无状态、轻量化、跨平台的特性,成为分布式系统中身份校验的优选方案。GoWind Admin 作为企业级前后端一体中后台框架,已将 JWT 核心逻辑封装至 github.com/tx7do/kratos-authn 组件中,彻底简化了底层引擎初始化、策略加载、签名验证等重复开发工作。开发者只需遵循以下标准化步骤,即可快速完成 JWT 集成,无缝对接框架的 OPA 权限管控体系,构建安全可靠的身份认证链路。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:分层设计的取舍之道(从 “简单粗暴” 到依赖倒置)

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在后端开发领域,分层设计是破解系统复杂度、提升可维护性的“核心心法”。对于 GoWind Admin 这类企业级中后台框架而言,API 层、Service 层(业务逻辑层)与 Data 层(数据访问层)的交互模式,直接决定了框架的灵活性、开发效率与长期演进能力。其中,Service 层与 Data 层的耦合程度,更是架构设计的“关键胜负手”。​

本文将聚焦 GoWind Admin 的实际开发场景,深入剖析“Service 层直接引用 Data 层 Repo”(简单粗暴方案)、“基于依赖倒置的接口解耦”(工程化方案)以及“新增 biz 层的进阶方案”三种核心模式,拆解分层设计的取舍逻辑——架构设计没有“最优解”,只有“最适配当前场景的解”,尤其对于需要兼顾“开箱即用效率”与“企业级扩展需求”的中后台框架而言,平衡感至关重要。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:列表查询规则指南

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台系统中,列表查询是贯穿“数据管理、业务审核、统计分析”的核心高频场景——从用户列表的多条件筛选,到订单数据的时间区间查询,再到报表的排序分页,其易用性与灵活性直接决定研发效率与业务操作体验。风行·GoWind Admin 作为开箱即用的 Go 语言后台管理系统,以“降低开发成本、提升研发效率”为核心设计理念,针对性打造了一套“配置化、高兼容、可扩展”的列表查询规则,让开发者无需关注底层 SQL 实现,仅通过简单配置即可完成复杂查询需求。

一、核心设计理念:声明式语法与 Go 生态适配

GoWind Admin 列表查询规则的设计,深度借鉴了 Python 生态中 Django ORM、SQLAlchemy 等优秀框架的“声明式语法”核心思想——通过贴近自然语言的配置方式屏蔽底层数据访问细节,让开发者聚焦业务逻辑而非 SQL 拼接。但不同于简单照搬,我们基于 Go 语言“强类型、高性能”的特性做了全链路适配,最终实现“简洁直观”与“原生兼容”的平衡:

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:Makefile 在后端开发中的应用与 Windows 环境配置

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台框架的开发过程中,高效的工程化管理是提升团队协作效率、保障开发流程规范的核心。GoWind Admin(风行)作为一款基于 Go 微服务框架 go-kratos 和 Vue 前端框架 Vben Admin 的全栈解决方案,其后端工程化体系中,Makefile 扮演了至关重要的角色 —— 它通过统一的命令集简化了复杂的构建流程,实现了环境初始化、依赖管理、代码生成、服务部署等操作的自动化,让开发者能够聚焦业务逻辑而非繁琐的工具链配置。本文将系统介绍 Windows 环境下 make 工具的安装方法、Makefile 的分层设计逻辑,以及核心命令的实战应用。

一、Makefile 在 GoWind Admin 后端开发中的核心价值

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:MongoDB集成指南(从部署到实战全攻略)

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

MongoDB 是一款开源的文档型 NoSQL 数据库,以灵活的 Schema 设计、原生 JSON/BSON 支持、高可扩展性和高性能查询著称,非常适合处理中后台系统中的非结构化 / 半结构化数据(如用户行为日志、动态表单配置、多维度报表、个性化配置等)。

GoWind Admin(风行)是面向企业级场景的前后端一体中后台框架,本文将从「环境部署→配置集成→模型设计→仓储实现→最佳实践」全流程讲解如何在 GoWind Admin 中优雅集成 MongoDB,覆盖开发、部署、调优全环节。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:OPA 集成指南:从原理到实践

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

Open Policy Agent(简称 OPA)是一款开源的通用策略引擎,核心价值在于实现“策略即代码”(Policy as Code),将分散在各系统中的权限控制、资源访问规则等策略逻辑抽离出来,进行统一管理、版本控制与执行。如今,OPA 已成为云原生生态中策略管控的事实标准,被 Netflix、Cloudflare、Pinterest、Chef 等巨头广泛应用——从内部 API 权限管控、Kubernetes 集群资源调度,到终端产品的 IAM 功能实现,均能看到其身影。

OPA 由 Styra 公司于 2016 年开源,2018 年加入 CNCF(云原生计算基金会)成为沙箱项目,2021 年 2 月正式毕业,其快速晋升的背后,是社区的高度活跃与行业对统一策略管控需求的迫切性。本文将从 OPA 核心原理、Rego 语言入门,逐步深入到 GoWind Admin 企业级中后台框架的完整集成流程,帮助开发者快速落地权限管控能力。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:5 分钟快速启动

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

go-wind-admin 作为开箱即用的企业级 Admin 全栈解决方案,核心优势之一是通过 backend/script 目录的 自动化脚本 降低跨系统部署门槛。本文以 “脚本驱动 + 实操验证” 为核心,优化步骤连贯性与细节提示,补充用户高频踩坑点,帮你更顺畅地完成从环境到服务的全流程搭建。

前置检查清单(启动前必看)

避免因基础条件缺失导致流程中断,启动前确认以下事项:

  1. 操作系统权限:Windows 需 管理员身份 打开 PowerShell;Linux/macOS 需拥有 sudo 权限(执行脚本时可能需要)。
  2. 网络状态:确保能访问 GitHub、Docker Hub、Homebrew/Scoop 源(建议提前配置国内镜像,见各系统备注)。
  3. 磁盘空间:预留至少 10GB 空间(用于存储 Docker 镜像、依赖包、编译产物)。
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:数据脱敏和隐私保护

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

Go Wind Admin 的数据脱敏能力,是基于 Protobuf 生态下的arrakis-digital/protoc-gen-redact插件实现的 —— 通过在 Protobuf 消息定义中为敏感字段(如手机号、身份证号)添加脱敏注解(如((redact.custom).string = "r*d@ct*d")),由插件自动生成适配业务的脱敏方法(如 Go 语言的Redact()方法),无需侵入业务逻辑即可完成敏感数据的遮挡处理,同时保持与 Protobuf 消息结构的强绑定,避免跨层配置不一致问题。配微服务接口、日志打印、数据存储等场景的隐私保护需求。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:用 JavaScript/Lua 解锁动态业务扩展能力

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台系统开发领域,「业务规则频繁迭代」与「个性化需求快速响应」始终是困扰开发团队的核心痛点。试想这样的场景:电商平台的促销规则需随节日实时调整, SaaS 系统需为不同行业客户定制专属审批流程,风控系统需根据最新风险模型动态更新校验逻辑…… 传统「代码开发 - 编译打包 - 部署上线」的全流程,往往需要数小时甚至数天才能完成迭代,严重滞后于业务节奏。

脚本引擎的嵌入式集成,为这一困境提供了优雅的破局思路——通过动态执行脚本代码,实现业务逻辑的「热更新、热部署」,无需重启服务即可完成规则迭代与需求适配。GoWind Admin(风行)作为一款主打「开箱即用」的企业级前后端一体中后台框架,精准洞察这一需求,深度整合 kratos-bootstrap 生态中的 script_engine 组件(https://github.com/tx7do/kratos-bootstrap/tree/main/script_engine),实现了对 JavaScript、Lua 两种主流脚本语言的无缝支持,让开发者能够以极低成本嵌入动态逻辑,为中后台系统注入「随需而变」的灵活基因。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:集成 Swagger UI 打造交互式 API 文档

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台系统开发中,接口调试、测试与文档同步始终是困扰前后端团队的核心痛点:接口变更后文档未及时更新、手动编写文档效率低下、调试工具切换繁琐等问题,严重影响开发协作效率。而 OpenAPI 规范(原 Swagger 规范)及其配套工具 Swagger UI,正是解决这些问题的最优解之一。

笔者在使用 Python 生态的 FastAPI 框架时,发现其内置的 Swagger UI 体验极佳——开发者可直接通过 http://127.0.0.1:8000/docs 访问交互式 API 文档,实现接口可视化调试与测试,无需额外部署工具。受此启发,我们将这一方案借鉴到 GoWind Admin(基于 Kratos 框架的企业级前后端一体中后台框架)中,实现了 API 文档的自动化生成与嵌入式访问。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:定时任务

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在后台管理系统中,定时任务是一个很实用的功能,可以帮助我们自动执行一些周期性的任务,比如定期清理数据、发送邮件提醒等。

在go里面,如果想要简单的实现一个周期性任务,我们可以用cron或者gron等仿linux的crontab的库。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:如何上传文件

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在一个CMS和Admin系统里面,文件上传是一个极其重要的功能之一。

在Kraots-Admin里面,我们把所有的文件都落地到MinIO。MinIO是一个非常优秀的分布式文件管理系统。

通常,后端可用的有两种上传方式:

  1. 通过Kratos的服务向MinIO申请预签名URL,然后通过预签名URL向MinIO上传文件。
  2. 直接向Kratos的服务上传文件,然后,微服务再将文件落地到MinIO。

方式一,这是最优的解决方案,因为文件不会经过微服务,直接上传到MinIO,减轻了微服务的压力。并且,MinIO支持分布式部署,可以很好的扩展。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:用户表从简单到租户的演进

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

先解决有没有,再解决好不好

极简User

CREATE TABLE users (
    id BIGINT PRIMARY KEY,
    authority VARCHAR(50),
    password VARCHAR(255)
);
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:深度解析 Wire 依赖注入集成实践

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台框架开发中,依赖管理是贯穿全生命周期的核心挑战 —— 随着项目规模扩张,手动创建对象、传递依赖会导致代码耦合度陡增、测试成本居高不下、维护难度指数级上升。依赖注入(DI)通过 “控制反转” 机制,将对象的创建与依赖传递解耦,成为解决这一问题的最优解之一。本文以 GoWind Admin(风行)框架为实践载体,深度解析 Google 开源的编译期依赖注入工具 Wire,并完整呈现其在企业级中后台框架中的标准化集成方案。

一、基础认知:什么是依赖注入(DI)?

依赖注入(Dependency Injection,DI)是实现控制反转(IoC)的核心技术,其核心思想可概括为:对象的依赖由外部容器提供,而非对象自身创建。这里的 “依赖” 指对象运行所需的其他组件(如数据库连接、配置实例、业务服务等),“注入” 则是外部容器将依赖主动传递给目标对象的过程。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:自动化解放双手,初学者快速搭建系统并自动生成前端接口

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

作为后端开发者,你是否曾为前后端接口联调反复沟通?作为前端新手,是否觉得手动封装 Rest 接口繁琐又易出错?今天就为大家推荐一套高效组合拳——GoWind Admin(开箱即用的全栈中后台框架)+ protoc-gen-typescript-http(Protobuf 驱动的 TS 接口生成器),让你从零到一快速搭建企业级管理系统,还能自动生成类型安全的前端接口,生产力直接翻倍!

一、先搞懂:这两个工具到底是什么?

动手实操前,我们先理清核心工具的定位,避免盲目上手:

1. GoWind Admin:企业级中后台的「脚手架王者」

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架・内置微服务接口数据聚合能力

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

让复杂归于简单,让聚合成为本能。

在微服务架构盛行的今天,企业中后台系统正面临前所未有的开发与性能双重挑战:前端需从数十个独立服务中零散拉取数据,网络请求冗余、状态管理繁琐;后端逻辑分散、接口复用性差、N+1 查询问题泛滥,既拖累开发效率,也让系统性能持续承压。如何在坚守系统解耦原则的同时,高效组装业务视图、简化开发链路?GoWind Admin(风行) 应运而生——一款专为现代企业打造的全栈中后台框架,以“开箱即用 + 内置智能聚合”为核心理念,彻底破解微服务时代的数据拼装难题,让开发者从接口拼接的繁琐工作中解放出来。

Headless 架构优势:内容与展示解耦,一套 API 打通全端生态

Date: 4/9/2026Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在前端技术飞速迭代的当下,用户触点早已从单一的 Web 端,延伸至小程序、APP、平板、智能设备等多元场景。传统的 “前后端一体” 架构(如 PHP/Java 渲染模板)在面对多端适配时,暴露出耦合严重、开发效率低、体验不统一等核心痛点。

而 Headless(无头)架构 作为一种以 API 为核心、内容与展示完全解耦的架构模式,正成为企业级应用、内容平台与数字化系统的主流解决方案。结合 风行 GoWind 等基于 Go 语言的 Headless CMS / 后端架构,其能实现一套 API 同时支撑 Web、小程序、APP、React/Vue、Taro 等全端开发,在效率、灵活性、扩展性上形成降维打击。

GoWind Content Hub|风行,开箱即用的企业级前后端一体内容中台

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

风行(GoWind HCH)是一款基于 Golang 全栈构建的企业级 Headless 内容中台(HCH=Headless Content Hub,无头内容中枢),以开箱即用的产品形态、灵活可扩展的架构设计,为企业打造全域内容管理与分发的一体化解决方案,助力企业打破内容孤岛,实现全场景内容高效运营。

为什么选择风行内容中台?

在数字化时代,企业内容资产的价值愈发凸显,但传统内容管理模式普遍面临「架构僵化、多端适配难、权限管控粗、运营效率低」等痛点。风行内容中台从企业实际业务场景出发,构建了「轻量化部署、全能力覆盖、高灵活拓展」的产品体系:

  • 全栈技术底座:基于 Golang 高性能后端框架打造,兼顾稳定性与并发能力,多前端技术栈适配满足不同团队技术选型需求;
  • Headless 核心架构:内容生产与展示层解耦,通过标准化 API 实现内容跨端、跨平台无缝分发,适配 Web、小程序、APP 等全终端场景;
  • 企业级权限体系:从租户、部门、角色到按钮级权限的全维度管控,满足大型组织复杂的权限划分与数据隔离需求;
  • 可视化高效运营:无需代码开发,通过可视化配置完成内容建模、菜单管理、站点配置等核心操作,大幅降低运营成本,提升内容上线效率。
Go 语言 CMS 横评:风行 GoWind 对比传统 PHP/Java CMS 核心优势

Date: 4/9/2026Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

一、前言

在内容管理系统(CMS)领域,PHP(如 WordPress、织梦、帝国 CMS)与 Java(如 Jeecms、SiteServer)长期占据主流市场,前者以低成本、易上手著称,后者以企业级稳定性立足。但随着 Go 语言在高并发、云原生、微服务场景的爆发式普及,基于 Go 开发的轻量高性能 CMS 开始成为中小站点、企业官网、资讯平台、跨境独立站的新选择,其中风行 GoWind 作为国产优质 Go 原生 CMS 代表,凭借 Go 语言底层优势和轻量化设计,在性能、部署、运维、成本等维度对传统 PHP/Java CMS 形成了差异化竞争力。

GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:数据权限体系设计与实现

Date: 1/1/2020Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

在企业级中后台应用的建设中,数据权限是保障信息安全、符合业务合规要求的核心能力,更是平衡系统安全性与业务灵活性的关键支点。它不仅要精准解决 “谁能看到什么数据” 的核心问题,更需兼顾系统的可维护性、可扩展性与用户体验。GoWind Admin(风行)作为开箱即用的企业级全栈中后台框架,内置多层次、细粒度、高可扩展的一体化数据权限体系,从租户全局隔离到动态策略维度全面覆盖,原生支持单租户 / 多租户 SaaS 部署,让企业级应用的权限管理从 “重复开发” 变为 “开箱即用”。

一、数据权限的五大核心粒度层级

Golang 并发模式:扇入、扇出

Date: 1/1/2020Category: Go编程Tag: Golang, 设计模式

个人喜爱 Golang 的最突出原因之一是:我们可以轻松构建高可用且非阻塞的程序。

在本系列文章中,我将尝试回忆 Golang 中可用的模式。我将采用每种模式,并详细讨论它们适合的位置以及如何有效地使用它们。

什么是扇入扇出。这是一种将数据从多个流或从一个流汇聚到多个流或管道的单一数据流的方法。

generate函数

为了讨论这个模式,我们首先需要一个数据源。这是一个可以用作数据源的数据生成器。

func generate( data string) <-chan string{
    channel := make(chan string)
    
    go func() {
        for {
            channel <- data
            time.Sleep(time.Duration(100*time.Millisecond))
    
        }
    }()
    return channel
}
Golang 人脸识别

Date: 1/1/2020Category: Go编程Tag: Golang, 人脸识别

参考资料

  • 手把手 Golang 实现静态图像与视频流人脸识别
  • Golang人脸识别
Golang模块版本管理

Date: 1/1/2020Category: Go编程Tag: Golang

GO模块版本号

模块的开发人员使用模块版本号的每个部分来表示版本的稳定性和向后兼容性。对于每个新版本,模块的发布版本号具体反映了自上一版本以来模块更改的性质。

当您开发使用外部模块的代码时,您可以在考虑升级时使用版本号来了解外部模块的稳定性。当您开发自己的模块时,您的版本号将向其他开发人员表明您的模块的稳定性和向后兼容性。

发布的模块在语义版本控制模型中使用版本号发布,如下图所示:

version-number

如何使用 Golang 查询 MongoDB

Date: 1/1/2020Category: Go编程Tag: Golang, MongoDB

如何使用 Golang 连接 MongoDB

连接 MongoDB 非常简单,只需连接 MongoDB 生成的 uri。

然后我们可以使用 client.Database() 函数来确保我们连接到正确的数据库。

package main

import (
	"context"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
	if err != nil {
		log.Fatal(err)
	}

	db := client.Database("testdb")

	// disconnect the mongo client when main is completed
	defer func() {
		if err = client.Disconnect(ctx); err != nil {
			panic(err)
		}
	}()
}
Golang在func中分配的变量通过参数传递出函数域之后变nil的问题

Date: 1/1/2020Category: Go编程Tag: Golang

最近在Go上面碰到了一个传出参数的问题:

func testOutString(out *string) {
	if out == nil {
		// str := "hellow"
		// out = &str
		out = new(string)
	}
	*out = "hello"
}

func main() {
	var str *string
	testOutString(str)
	fmt.Println(str)
}
使用Bazel构建Golang程序

Date: 1/1/2020Category: Go编程Tag: Golang, Bazel

在这篇简短的文章中,我们将介绍如何将 Golang 与 Bazel 构建系统结合使用。

具体来说,我们将讨论三个场景:

  1. 从头开始一个 Golang 项目;
  2. 将一个现有的 Golang 项目转换为 Bazel 构建;
  3. 以及将一个第三方 Golang 项目引入到您的 Bazel 构建系统。

从头开始一个 Golang 项目

让我们从将 Go 与 Bazel 结合使用的基础知识开始。

为此,我们需要从 https://github.com/bazelbuild/rules_go 获取 Go 语言的官方构建规则。

无头内容管理系统 Headless CMS

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

什么是 Headless CMS?

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

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

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

怎样把C++代码编译成WASM

Date: 1/1/2020Category: C++编程Tag: C++, WASM
怎样编译PostgreSQL扩展并安装到容器中去

Date: 1/1/2020Category: 运维技术Tag: Docker, PostgreSQL

通常PostgreSQL容器当中会内置一些扩展,一般存放在:/usr/lib/postgresql/{PostgreSQL版本号}/lib,扩展的实体都是.so文件,如果容器当中存在着扩展的so文件,那么就可以顺利的通过SQL语句进行安装,否则,则不能够顺利的安装,这时候,就需要编译扩展并拷贝进容器。

https://yum.postgresql.org/repopackages/

如何 Docker 化一个 GO 应用程序

Date: 1/1/2020Category: 运维技术Tag: Docker, Go

使用 Golang,可以构建小到简单的可执行工具大到完整的 Web 服务器的任何东西。为了交付应用程序,使用 Docker 是首选,它允许我们创建一个包含项目运行所需的一切的自包含环境。值得一提的是,Docker 命令行界面本身也是使用 GO 所开发。

为任何 GO 应用程序编写 Docker 镜像

通常,从一个尽可能小且具有所需基本依赖项的基本镜像开始,是一个好主意。alpine 镜像通常是一个可靠的选择,因为它们仅包含操作系统所需的最低限度。

所以,我们可以这样写 Dockerfile:

FROM golang:alpine3.15
怎样在Go语言中生成随机种子

Date: 1/1/2020Category: Go编程Tag: Golang, 随机种子

time.Now().UnixNano

这是用的最多的,但是,也是安全隐患最大的方法。

从表面上看go的时间方法最大精度到纳秒,但是好像其实并不能到达的绝对的纳秒精度。

测试结果很不好,碰撞很高。

import "time"

func TestSeedNanoTime(t *testing.T) {
	var seeds = make(map[int64]bool)
	for i := 0; i < 100000; i++ {
		seed := time.Now().UnixNano()
		seeds[seed] = true
		fmt.Println(seed)
	}
	fmt.Println(len(seeds))
}
如何在MacOS下安装Flutter开发环境

Date: 1/1/2020Category: Flutter编程Tag: Flutter, MacOS

通过Google推出的Flutter framework,我们可以更为方便的开发跨平台APP,开发出来的APP能够在iOS、Android、Web、macOS、Windows和Linux上都可以执行。

在开发 Flutter App 之前,我们必须要先准备好开发环境,下面我将介绍如何在Mac环境下从零开始Flutter App的开发环境。

  • 安装Xcode;
  • 安装Android Studio;
  • 安装VS Code;
  • 安装CocoaPods;

安装Xcode

怎样在Ubuntu下面安装GCC

Date: 1/1/2020Category: 运维技术Tag: Ubuntu, GCC

获取系统版本信息

lsb_release -a
怎样在MacOS下安装游戏引擎Godot 4

Date: 1/1/2020Category: 游戏开发Tag: MacOS, Godot

在本文中,我将向您展示如何在 Mac 上安装Godot 4 游戏引擎。

在MacOS下面有两种安装途径可供使用:

  1. Godot官网下载软件包安装;
  2. brew安装。

1. Godot官网下载软件包安装

步骤 1. 安装 .Net SDK(可选)

Godot从4.0版本开始支持C#作为其脚本语言。

如果您希望能够使用 C# 编写和构建 Godot 项目,则需要先安装 .Net SDK。

从微软官方下载页面下载并安装:https://dotnet.microsoft.com/zh-cn/download

怎样在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许可协议”。

如何在 Superset Docker 容器中安装 MySQL 驱动

Date: 4/9/2026Category: 运维技术Tag: Docker, Superset

Apache Superset 是一款功能强大的开源数据挖掘与可视化平台,支持多种数据源连接、自定义仪表盘和细粒度权限控制,广泛应用于数据运维与分析场景。由于 Superset 官方 Docker 镜像未默认集成 MySQL 驱动,在实际运维中,需手动安装驱动才能实现与 MySQL 数据库的正常连接。本文将详细介绍两种 Docker 部署方式(Docker run 和 Docker Compose)下,MySQL 驱动的完整安装流程,同时兼顾 Apache Doris 驱动安装(适配多数据源需求),并提供数据库配置方法和常见注意事项。

一、前置说明

可能是因为MySQL是使用的GPL协议,所以Superset官方镜像中未包含MySQL驱动,需要手动安装。

如何在 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
沖咖啡|咖啡掛耳包更好喝貼士

Date: 1/1/2020Category: 健康养生Tag: 咖啡

平日冲咖啡挂耳包/滤挂式咖啡时,如果把挂耳包直接挂在杯边,有可能会挂耳会滑落。UCC分享能将挂耳包固定在原位的简单方法。

冲咖啡挂耳包正确步骤▼▼

冲咖啡挂耳包正确步骤▼▼

1. 先将咖啡挂耳包向下轻甩2至3下,让咖啡粉沉底。

先将咖啡挂耳包向下轻甩2至3下,让咖啡粉沉底。

如何发布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
如何解压Unity WebGL游戏的UnityWebData1.0资源包

Date: 1/1/2020Category: 游戏开发Tag: Unity WebGL

什么是 UnityWebData

UnityWebData 文件是在 WebGL 游戏中与 WebAssembly 文件一起加载和使用的文件,主要是组合所有资产(Asset)、资源(Resource)和元数据(Meta)文件的文件。

UnityWebData

UnityWebData的结构体

本节介绍基于UnityWebData1.0的二进制文件的结构进行介绍。

需要注意:int值必须以Little Endian方式读取。

使用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%,可存储大量结构化数据,支持事务、索引等数据库核心特性。
怎么样在Windows下使用Make编译Golang程序

Date: 1/1/2020Category: Go编程Tag: Make

GNU的Make是一个又古老又强大的构建工具,在我们的开发当中用得普遍。就Makefile的语法而言也不算复杂,没有特别复杂的需求的话,很容易就上手了,维护起来也容易,拿Make来做程序构建是一个好主意。

更复杂一点的项目构建可以选择Google的Bazel,但是通常的项目(至少70%-80%的项目)都没有这么复杂的需求。

在Unix、Linux、BSD、macOS等xNix下面使用Make是很方便的,很自然的,因为是出厂自带。

你一定用过htop,但你有看懂每个选项吗?

Date: 1/1/2020Category: 运维技术Tag: htop

main.webp

身为一个工程师,不管你写的是前端、后端、全端还是什么端,一定多少用过htop,就算真的没用过也会听同事说过。htop 是一个process manager,他可以让你看到执行中的process、系统资源的使用量,也可以让你轻松kill 掉任何一个process,总之,你想得到的功能统统都有~

虽然,大家都说htop 很好用,但许多人打开htop 也只看得懂CPU、Mem、PID、Command 这些简单的选项,对于Load average、NI、State、SHR 就没那么熟悉。

大群组IM设计

Date: 1/1/2020Category: 架构设计Tag: IM

参考资料

  • 从无到有:微信后台系统的演进之路
  • 网易云信 - 超大群概述
  • IM技术分享:万人群聊消息投递方案的思考和实践
  • 现代IM系统中聊天消息的同步和存储方案探讨
在 Postgres Docker 容器中安装扩展

Date: 1/1/2020Category: 运维技术Tag: Postgresql, Docker

最近,我想使用 Fluent 迁移器来为我的 postgres 数据库做种,该数据库作为 Docker 容器运行。我基本上有一个表 User,它有一个需要自动生成的 UUID 类型的主键。

我的迁移代码如下所示。

Create.Table(User.TABLE_NAME)
    .WithColumn("id").AsGuid().NotNullable().WithDefaultValue(SystemMethods.NewGuid).PrimaryKey()
    .WithColumn("username").AsString().NotNullable()
    .WithColumn("password").AsString().NotNullable();
使用 Docker Compose 安装 Mattermost

Date: 1/1/2020Category: 运维技术Tag: Mattermost, Docker

本文适合那些正在寻找使用 Docker Compose 安装 Mattermost 的详细且简单的指南的人。

Mattermost是一种开源、可自托管的在线聊天服务,具有文件共享、搜索和集成功能。它被设计为组织和公司的内部聊天工具,主要将自己定位为 Slack 和 Microsoft Teams 的开源替代品。

💾您可以在GitHub上找到本指南中使用的存储库。

安装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/

「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.

使用 Swift 和 HomeKit 释放物联网和家庭自动化的力量

Date: 1/1/2020Category: 物联网开发Tag: Swift

IoT(物联网) 是指由物理设备、车辆、家用电器和其他嵌入电子设备、软件、传感器和连接功能的物品组成的互连网络,使这些对象能够连接和交换数据。

HomeKit 是Apple 的家庭自动化框架,为智能家居设备之间的通信提供了通用平台。它使开发人员能够轻松创建可以从中央位置控制智能家居设备(例如灯、锁、恒温器等)的应用程序。

Swift 是 Apple Inc. 为 iOS、iPadOS、macOS、watchOS 和 tvOS 开发的一种功能强大的开源编程语言。 Swift 广泛用于为 Apple 平台开发应用程序,并已成为许多开发人员的首选语言。

Javascript弃用方法的替换方法

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

substr替换成slice;


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和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);
    });
}
Kratos微服务框架API工程化指南

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

Kratos的RPC默认使用的是gRPC,与此同时我们还可以通过gRPC的grpc-gateway功能对RESTfull进行支持。这样,我们就可以同时支持gRPC和REST了。而这一切Kratos都已经封装好,无需知道底层的一切,用就好了。

Golang微服务框架Kratos应用分布式计划任务队列Asynq

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

任务队列(Task Queue) 一般用于跨线程或跨计算机分配工作的一种机制。其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。

任务队列的输入是称为任务(Task)的工作单元。专用的工作进程不断监视任务队列以查找要执行的新工作。

在Golang语言里面,我们有像Asynq和Machinery这样的类似于Celery的分布式任务队列。

Kratos微服务框架下的认证和鉴权

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

从单体应用迁移到微服务架构,虽能收获松耦合、可扩展等诸多优势,但也引入了新的安全挑战。微服务通过开放 API 实现服务间通信,与单体应用相比:​

  • 攻击面显著扩大:每个独立服务都需单独保障安全性,风险点呈指数级增加​
  • 通信安全性要求更高:API 调用不仅要验证身份,还需保障传输安全与可用性​

因此,微服务架构需要一套与单体应用截然不同的安全解决方案,核心聚焦于认证(Authentication) 与鉴权(Authorization) 两大核心能力。

一、认证与鉴权的核心区别​

认证和授权的区别

使用Bazel构建你的Kratos微服务

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

Kratos是一个微服务框架,既然是微服务,那么一个工程下肯定会存在不少的服务,一个服务就是一个二进制可执行程序,那么我们将会面对一个问题:如何去构建(Build)这些服务程序。这件事情,通常都交由构建系统去做。我们能够选择的构建系统有很多:Make、CMake、Bazel……那么,我们又该如何选择一个构建系统呢?

项目结构简单,服务少,我们完全可以使用Make来进行构建。要学会使用Make,您需要学会使用Makefile来编写构建脚本,如果整个构建只是组织一些简单的编译命令,那还好,学习和使用都会是简单轻松的事情。

但是,理想很丰满,现实很骨感。在实际的工程实践中,一切都会朝着复杂的方向发展。服务的数量肯定不会少,工程的组织结构也肯定不会简单,那么,构建也就会变得相应的复杂起来,需要编写大量的Makefile,Makefile的复杂度也越来越大了。另外还有,构建环境的搭建问题,持续集成的问题,自动构建的问题,构建时间变长的问题……抱歉,面对这样复杂的工程环境,Make难以满足我们的需求。

Kratos微服务框架实现权鉴 - Casbin

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

Casbin(https://github.com/casbin/casbin)是一套访问控制开源库,致力于帮助复杂系统解决权限管理的难题。同时也是一个国产开源项目。Casbin采用了元模型的设计思想,既支持ACL(访问控制列表),RBAC(基于角色访问控制),ABAC(基于属性访问控制)等经典的访问控制模型,也支持用户按照自身需求灵活定义权限。Casbin已经被Intel、IBM、腾讯云、VMware、RedHat、T-Mobile等公司开源使用,被Cisco、Verizon等公司闭源使用。具体详见Casbin主页(https://casbin.org/)。

Kratos 微服务轻松对接 CFG 日志系统

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos
  • ClickHouse
  • Fluent Bit
  • Grafana
跟我一起用Golang微服务框架实现一个CMS系统

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

微服务,是一种分布式软件架构。采用了分而治之的方法去解决复杂的应用问题。我们可以把复杂的系统拆解成不同的服务,并使之可以方便的进行横向扩容,提升整个系统的负载。

任何一个系统,它都需要一个管理系统,即便是使用微服务的架构也是需要的。在本文里,我们将使用B站开源的Golang语言微服务框架Kratos去实现一个最简单的CMS:博客系统。

Kratos微服务框架下实现CQRS架构模式

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

命令查询的责任分离Command Query Responsibility Segregation 通常被简化为 命令查询分离,即读写分离。

在特定的场景下,它可以提供更好的性能。但是,在强一致性方面,它并不能够保证。而且,还会带来认知负担。所以,实际运用上,需要谨慎。

什么是 CQRS

这个概念出自于 命令与查询分离(CQS, Command Query Separation),出自于1987 年 Bertrand Meyer 的 《面向对象软件构造》(Object-Oriented Software Construction)一书,其原始概念是我们可以把对象操作分为:命令(Command)和 查询(Query)两种形式。

Kratos微服务轻松对接EFK日志系统

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

在早期的单体服务时代,如果想要在生产环境中通过日志去定位业务逻辑的Bug或者性能问题,那么我们需要让运维人员逐个远程登入服务器,逐个服务实例去查询日志文件,这样排查问题的效率是相当的低,当线上发生了紧急状况的时候,人都要急死,却又无法有效率的排查出问题所在,更不用说解决问题。

而在微服务时代,服务实例部署在不同的物理机上,各个微服务的日志也被分散储存在不同的物理机上。当服务集群足够大,成百上千,甚至上万,此时再使用上述的传统方式查阅日志,那已经是不可完成的任务。因此,我们需要集中化管理分布式系统中的日志,其中有开源的组件如Syslog,用于将所有服务器上的所有服务的日志进行收集、汇总。

Kratos微服务框架常见问题解答

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

为什么Protobuf定义成int64,转成json之后却变成了string类型?

比如说,定义了一个proto文件

message PartyMusicSearchItem {
    string name = 1;
    int32  fileSize = 2;
    string author = 3;
    string musicId = 4;
    int32 type = 6;
    int64 createdAt = 7;
    int64 lastTime = 8;
}
Kratos 下使用 Protobuf FieldMask 完全指南

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

当我们使用 gRPC 进行跨服务通讯时,调用方往往只需要响应中的部分字段 —— 冗余字段不仅会增加网络传输成本,更可能触发不必要的下游依赖调用(比如为了返回一个非核心字段,需要额外调用 2 个服务)。​

在微服务场景中,这种「无效计算 + 无效传输」的开销会被放大:一次 RPC 级联 3~5 个下游是常态,而响应体中 60% 以上的字段可能都是调用方不需要的。​

此时,我们需要一种「字段按需筛选」机制:

  • GraphQL 用「字段选择器」实现​
  • JSON:API 用「稀疏字段集」实现​
  • 而 gRPC 生态中,Protobuf FieldMask 是标准且高效的解决方案。
Golang微服框架Kratos与它的小伙伴系列 - 分布式事务框架 - DTM

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

在 GO 语言生态中,DTM(Distributed Transaction Manager) 是一个开源的分布式事务管理服务,专门用于解决微服务架构下分布式事务的一致性问题。它以轻量、易用、高性能为特点,支持多种分布式事务模式,是 GO 语言开发者在处理跨服务数据一致性时的常用工具。

DTM 的核心功能与特点

1. 支持多种事务模式

DTM 针对不同业务场景,实现了主流的分布式事务协议,包括:

  • TCC(Try-Confirm-Cancel):适用于核心业务场景,通过拆分业务为 “尝试”、“确认”、“取消” 三个阶段,保证最终一致性。
  • SAGA:适用于长事务场景,将分布式事务拆分为多个本地事务步骤,每个步骤对应一个补偿操作,若某步失败则执行反向补偿。
  • 本地消息表(Local Message Table):基于消息的异步确认机制,通过本地事务与消息发送的原子性,确保跨服务操作的最终一致。
  • 事务消息:结合消息队列实现,通过 “半消息”、“确认发送”、“消费确认” 等机制,保证消息可靠投递与业务操作的一致性。
  • XA:基于数据库的 XA 协议(如 MySQL 的 XA 事务),适用于对强一致性要求高且支持 XA 协议的数据库场景。
Golang微服框架Kratos与它的小伙伴系列 - ORM框架 - Ent

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

什么是ORM?

面向对象编程和关系型数据库,都是目前最流行的技术,但是它们的模型是不一样的。

面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。

简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。

ORM 把数据库映射成对象。

  • 数据库的表(table) --> 类(class)
  • 记录(record,行数据)--> 对象(object)
  • 字段(field)--> 对象的属性(attribute)
Golang微服框架Kratos与它的小伙伴系列 - ORM框架 - GORM

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

什么是ORM?

面向对象编程和关系型数据库,都是目前最流行的技术,但是它们的模型是不一样的。

面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。

简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。

ORM 把数据库映射成对象。

  • 数据库的表(table) --> 类(class)
  • 记录(record,行数据)--> 对象(object)
  • 字段(field)--> 对象的属性(attribute)
Kratos微服务与它的小伙伴系列 - 依赖注入库 - Wire

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

什么是依赖注入?

依赖注入 (Dependency Injection,缩写为 DI),是一种软件设计模式,也是实现控制反转(Inversion of Control)的其中一种技术。这种模式能让一个物件接收它所依赖的其他物件。“依赖”是指接收方所需的对象。“注入”是指将“依赖”传递给接收方的过程。在“注入”之后,接收方才会调用该“依赖”。此模式确保了任何想要使用给定服务的物件不需要知道如何建立这些服务。取而代之的是,连接收方物件(像是 client)也不知道它存在的外部代码(注入器)提供接收方所需的服务。

依赖注入涉及四个概念:

  1. 服务:任何类,提供了有用功能。
  2. 客户:使用服务的类。
  3. 接口:客户不应该知道服务实现的细节,只需要知道服务的名称和 API。
  4. 注入器:Injector,也称 assembler、container、provider 或 factory。负责把服务引入给客户。 依赖注入把对象构建与对象注入分开。因此创建对象的 new 关键字也可消失了。
golang微服务框架Kratos实现GraphQL服务

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

GraphQL 是一种用于应用编程接口(API)的查询语言和服务器端运行时,它可以使客户端准确地获得所需的数据,没有任何冗余。

GraphQL 由 Facebook 开发,并于 2012 年首次应用于移动应用。GraphQL 规范于 2015 年实现开源。现在,它受 GraphQL 基金会监管。

GraphQL有什么用?

GraphQL 旨在让 API 变得快速、灵活并且为开发人员提供便利。它甚至可以部署在名为 GraphiQL 的集成开发环境(IDE)中。作为 REST 的替代方案,GraphQL 允许开发人员构建相应的请求,从而通过单个 API 调用从多个数据源中提取数据。

Kratos 大乱炖 —— 整合其他Web框架:Gin、FastHttp、Hertz

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

Kratos默认的RPC框架使用的是gRPC,支持REST和protobuf两种通讯协议。其API都是使用protobuf定义的,REST协议是通过grpc-gateway转译实现的。使用protobuf定义API是具有极大优点的,具有很强的可读性、可维护性,以及工程性。工程再大,人员再多,也不会乱。

一切看起来都是很美好的。那么,问题来了,我们现在使用的是其他的Web框架,迁移就会有成本,有风险,不可能一下子就把历史存在的代码一口气转换过来到Kratos框架。那我可以在Kratos中整合其他的Web框架做过渡吗?答案是:可以的。Kratos是基于的插件化设计,万物皆可插。

Kratos微服务框架物联网IoT实战:设备实时地图

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

IoT,也就是物联网,万物互联,在未来肯定是一个热点——实际上,现在物联网已经很热了。

那好,既然这一块这么有前途。那我们就来学习怎么开发物联网系统吧。可是,作为一个小白,两眼一抹黑:我想学,可是我该如何开始?这玩意儿到底该咋整呢?

于是,我各种找资料,各种学习——此处省略一亿个字,其中的艰辛,其中的曲折,总之就是:说来都是泪,欲哭却无声——总算是有了基础的认知,有了一个模糊的方向。我知道了物联网设备通讯协议MQTT、CoAP、LwM2M,知道了微服务,知道了MQ,知道了Websocket,知道了REST,知道了gRPC……有了这些认知,看起来可以开始做技术选型了。

Golang微服务框架Kratos应用Kafka消息队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。

在本文当中,您将了解到:什么是消息队列?什么是Kafka?怎样在微服务框架Kratos当中应用Kafka进行业务开发。

什么是消息队列

消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。

Golang微服务框架Kratos应用分布式任务队列Machinery

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

任务队列(Task Queue) 一般用于跨线程或跨计算机分配工作的一种机制。其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。

任务队列的输入是称为任务(Task)的工作单元。专用的工作进程不断监视任务队列以查找要执行的新工作。

在Golang语言里面,我们有像Asynq和Machinery这样的类似于Celery的分布式任务队列。

基于 Go-Kratos 与 MCP 的推荐服务实战指南

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

在微服务与多模块协同场景下,实现服务间的标准化通信与流程调度是核心挑战。本文聚焦 go-kratos-mcp-demo 项目,讲解如何基于 Go-Kratos 框架与 MCP(模块化协同协议)构建可扩展的推荐服务,涵盖服务契约设计(proto)、模块化流程编排、召回/过滤/排序等关键模块的实现与测试,并展示实战部署与可观测性方案。

技术基石:Go-Kratos 与 MCP 的协同架构

项目技术选型围绕 “模块化协同” 核心需求展开,Go-Kratos 与 MCP 构成架构的两大支柱,形成 “框架赋能 + 协议规范” 的协同模式:

Golang微服务框架居然可以开发单体应用?—— Kratos单体架构实践

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

TL;DR

微服务框架也是可以用于开发单体架构(monolith architecture)的应用。并且,单体应用也是最小的、最原始的、最初的项目状态,经过渐进式的开发演进,单体应用能够逐步的演变成微服务架构,并且不断的细分服务粒度。微服务框架开发的单体架构应用,既然是一个最小化的实施,那么它只需要使用到微服务框架最小的技术,也就意味着它只需要用到微服务框架最少的知识点,拿它来学习微服务框架是极佳的。

本文将围绕着一个我写的demo项目:kratos-monolithic-demo开展,它既是一个微服务框架Kratos的最小化实践,也是一个工程化实践的完全体。从中你可以学习到:

golang微服务框架Kratos实现消息队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

什么是消息队列

MQ就是消息队列,是Message Queue的缩写。消息队列是一种通信方式。消息的本质就是一种数据结构。因为MQ把项目中的消息集中式的处理和存储,所以MQ主要有解耦,并发,和削峰的功能。

为什么要使用消息队列

1. 异步

通常的微服务实现里面,都是通过RPC进行微服务之间的相互调用,这是同步的。如果消息队列的话,可以实现异步的调用。至于异步有啥好处呢,主要是为了削峰。

2. 削峰

同步的调用会带来一个问题:瞬时流量。客户的调用同步接口节奏,你是无法把控的,流量将会是忽高忽低的,猛的来一波,搞不好系统就崩了溃了。

Golang微服务框架Kratos应用MQTT消息队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。

在本文当中,您将了解到:什么是消息队列?什么是MQTT?怎样在微服务框架Kratos当中应用MQTT进行业务开发。

什么是消息队列

消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。

Kratos微服务框架下的TLS单向和双向认证

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

什么是SSL

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

Golang微服务框架Kratos应用NATS消息队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。

在本文当中,您将了解到:什么是消息队列?什么是NATS

什么是消息队列

消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。

消息中间件是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的构建。

Golang微服务框架Kratos应用NSQ消息队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。

在本文当中,您将了解到:什么是消息队列?什么是NSQ?怎样在微服务框架Kratos当中应用NSQ进行业务开发。

什么是消息队列

消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。 消息中间件是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的构建。

Kratos微服务框架实现权鉴 - OPA

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

Open Policy Agent,官方简称OPA,旨在统一不同技术和系统的策略执行。今天,OPA 被科技行业内的巨头们所使用。例如,Netflix 使用 OPA 来控制对其内部 API 资源的访问。Chef 用它来为他们的终端用户产品提供 IAM 功能。此外,许多其他公司,如 Cloudflare、Pinterest 等,都使用 OPA 在他们的平台上执行策略(如 Kubernetes 集群)。

OPA 最初是由 Styra 公司在 2016 年创建并开源的项目,目前该公司的主要产品就是提供可视化策略控制及策略执行的可视化 Dashboard 服务的。

Golang微服务框架Kratos应用Pulsar消息队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。

在本文当中,您将了解到:什么是消息队列?什么是Pulsar?怎样在微服务框架Kratos当中应用Pulsar进行业务开发。

什么是消息队列

消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。

Golang微服务框架Kratos应用RabbitMQ消息队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。

在本文当中,您将了解到:什么是消息队列?什么是RabbitMQ?怎样在微服务框架Kratos当中应用RabbitMQ进行业务开发。

什么是消息队列

消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。

Golang微服务框架Kratos应用RocketMQ消息队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。

消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。

在本文当中,您将了解到:什么是消息队列?什么是RocketMQ?怎样在微服务框架Kratos当中应用RocketMQ进行业务开发。

什么是消息队列

消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。

将Kratos微服务程序运行为Linux守护进程

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

supervisor

安装supervisor

Centos:

# 先安装 EPEL
yum install -y epel-release

# 安装supervisor
sudo yum -y install supervisor

# 设置为开机启动
sudo systemctl enable supervisord

# 启动进程
sudo systemctl start supervisord
Golang微服务框架kratos实现SignalR服务

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

基于 SignalR 可以实现客户端和服务器之间进行即时通信。

适合 SignalR 的应用场景:

需要从服务器进行高频率更新的应用。 示例包括游戏、社交网络、投票、拍卖、地图和 GPS 应用。 仪表板和监视应用。 协作应用。 协作应用的示例包括白板应用和团队会议软件。 需要通知的应用。 社交网络、电子邮件、聊天、游戏、旅行警报和很多其他应用都需使用通知。

SignalR 自动选择服务器和客户端能力范围内的最佳传输方法,如WebSockets、Server-Sent Events、长轮询。Hub 是一种高级管道,允许客户端和服务器相互调用方法。 SignalR 自动处理跨计算机边界的调度,并允许客户端调用服务器上的方法,反之亦然。SignalR 提供两个内置协议:基于 JSON 的文本协议和基于 MessagePack 的二进制协议。

Golang微服务框架kratos实现Socket.IO服务

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

Socket.IO 是一个面向实时 web 应用的 实时通讯库。它使得服务器和客户端之间实时双向的通信成为可能。底层使用EngineIO。SocketIO的的客户端使用Engine.IO-Client,服务端使用Engine.IO实现。

Socket.IO 主要使用WebSocket协议。但是如果需要的话,Socket.IO 可以回退到几种其它方法,例如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取,并且在同时提供完全相同的接口。尽管它可以被用作WebSocket的包装库,它还是提供了许多其它功能,比如广播至多个套接字,存储与不同客户有关的数据,和异步IO操作。

Golang微服务框架kratos实现SSE服务

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

我也是最近才知道SSE的,问了下周围的人,发现知道的人也着实不多的。我是怎么知道SSE的呢?我看了下OpenAI的API,有一个Stream模式,就是使用的SSE实现的。说白了,这就是一个HTTP长连接通过服务端持续发送数据到前端的协议。在网络不稳定的情况下,它比Websocket要更好。

什么是SSE

Server-Sent Events(简称 SSE)

严格地说,HTTP 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。

也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。

Golang微服务框架Kratos轻松集成并使用Swagger UI

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

在我们的开发当中,调试接口,测试接口,提供接口文档给前端,那都是非常频繁的工作内容。

那么,我们需要用什么方法和工具来实施这些工作内容呢?

Swagger,或者说OpenAPI。

下面先让我们了解一下下什么是Swagger,什么是OpenAPI。

什么是 OpenAPI

OpenAPI 是编写 RESTful API 的全球标准。它是一种规范,使得全球开发人员可以标准化 API 的设计,并在从头开始编写 REST API 时遵守所有安全、版本控制、错误处理和其他最佳实践。不仅仅是从头开始,即使现有的 API 也可以进行微调以符合全球标准。

golang微服务框架Kratos实现分布式任务队列

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

任务队列(Task Queue) 一般用于跨线程或跨计算机分配工作的一种机制。其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。

任务队列的输入是称为任务(Task)的工作单元。专用的工作进程不断监视任务队列以查找要执行的新工作。

在Golang语言里面,我们有像Asynq和Machinery这样的类似于Celery的分布式任务队列。

Golang微服务框架Kratos实现Thrift服务

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

什么是Thrift

Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,并提供多种服务器工作模式;用户通过Thrift的IDL(接口定义语言)来描述接口函数及数据类型,然后通过Thrift的编译环境生成各种语言类型的接口文件,用户可以根据自己的需要采用不同的语言开发客户端代码和服务器端代码。2007年由facebook贡献到apache基金,是apache下的顶级项目,具备如下特点:

  • 支持多语言:C、C++ 、C# 、D 、Delphi 、Erlang 、Go 、Haxe 、Haskell 、Java 、JavaScript、node.js 、OCaml 、Perl 、PHP 、Python 、Ruby 、SmallTalk
  • 消息定义文件支持注释,数据结构与传输表现的分离,支持多种消息格式
  • 包含完整的客户端/服务端堆栈,可快速实现RPC,支持同步和异步通信
跟我一起用Golang微服务框架Kratos实现一个用户行为分析系统(UBA)

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

本文将带你了解什么是 BI(商业智能) 和 UBA(用户行为分析),并且使用go语言和微服务框架kratos去实现一个UBA系统。

这个系统简单的描述就是:前端通过埋点SDK上报前端采集到的埋点数据,后端的代理服务(Agent Service)接收到了埋点数据之后,将数据入列到Kafka当中,然后我们消费Kafka当中的消息,入库到ClickHouse当中,分析服务对入库的埋点数据进行分析并且生成报表,最后在前端页面进行展示。

什么是BI?

BI,即商业智能,指利用大数据分析、现代数据仓库等技术收集企业最新数据、形成BI报表并及时为企业员工提供BI数据分析报告,实现对业务数据的深入挖掘以获取更多商业价值。大多数企业每天都会收集海量业务数据,这些数据来自其 ERP 软件、电商平台、供应链以及许多其他内部和外部数据源。要想充分利用这些数据,制定由数据驱动的决策,现代商业智能 (BI) 系统必不可少。

GO微服务框架Kratos上传文件

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

首先,我们需要知道:Kratos能够上传文件。

其次,我们需要知道:需要一些手工代码来支撑(不能够代码生成一波流)。

最后,我们所有的文件都落地到MinIO当中。对于使用过各种上传方案的我而言,MinIO是一个非常完美的文件解决方案。

在这里,我们不讨论前端的上传,我们只讨论后端的上传。我另外有一篇偏向于前端的文章,有兴趣的同学可以阅读它:JavaScript/TypeScript前端实现文件上传到MinIO。

golang微服务框架Kratos实现Websocket聊天室

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

什么是WebSocket

WebSocket 协议主要为了解决基于 HTTP/1.x 的 Web 应用无法实现服务端向客户端主动推送的问题, 为了兼容现有的设施, WebSocket 协议使用与 HTTP 协议相同的端口, 并使用 HTTP Upgrade 机制来进行 WebSocket 握手, 当握手完成之后, 通信双方便可以按照 WebSocket 协议的方式进行交互

WebSocket 使用 TCP 作为传输层协议, 与 HTTP 类似, WebSocket 也支持在 TCP 上层引入 TLS 层, 以建立加密数据传输通道, 即 WebSocket over TLS, WebSocket 的 URI 与 HTTP URI 的结构类似, 对于使用 80 端口的 WebSocket over TCP, 其 URI 的一般形式为 ws://host:port/path/query 对于使用 443 端口的 WebSocket over TLS, 其 URI 的一般形式为 wss://host:port/path/query

Kratos微服务框架实现权鉴 - Zanzibar

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

用户的权限管理对每个项目来说都至关重要。不同的业务场景决定了不同的权限管理需求,不同的技术栈也有不同的解决方案:

  1. 如果你在写一个Ruby On Rails应用,那你可能会选择cancan;
  2. 如果你在写一个Java Spring应用,那你可能会选择Spring Security 或者 Apache Shiro;
  3. 如果你正在使用K8S,那你很可能需要与K8S的鉴权模块打交道。
libuv实现定时器Timer

Date: 1/1/2020Category: C++编程Tag: C++, libuv
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"
游戏的本地化和国际化

Date: 1/1/2020Category: 游戏开发Tag: 本地化, 国际化

有3个专有名词:

  • I18N - 国际化,internationalization,缩写源自于在I和N之间有18个字母。
  • L10N - 本地化,localization,缩写源自于在L和N之间有10个字母。
  • M17N - 多语言化,multilingualization,缩写源自于在M和N之间有17个字母。

国际化 (I18N)

该术语用于设计、分析和采用支持本地市场甚至全球市场多语言的软件。

国际化是指去本地化,移除本地语言写的提示信息,异常信息,区域信息等,采用国际标准或者提取资源。

帧同步和状态同步

Date: 1/1/2020Category: 游戏开发Tag: 状态同步, 帧同步

帧同步/锁步同步 (Lockstep Synchronization)

什么是帧同步:帧同步常被RTS(即时战略)游戏常采用。在游戏中同步的是玩家的操作指令,操作指令包含当前的帧索引。一般的流程是客户端上传操作到服务器, 服务器收到后并不计算游戏行为, 而是转发到所有客户端。这里最重要的概念就是 相同的输入 + 相同的时机 = 相同的输出。

实现帧同步的流程一般是:

  1. 同步随机数种子。(一般游戏中都设计随机数的使用, 通过同步随机数种子,可以保持随机数一致性)
  2. 客户端上传操作指令。(指令包括游戏操作和当前帧索引)
  3. 服务器广播所有客户端的操作。(如果没有操作, 也要广播空指令来驱动游戏帧前进)。
Mac 删除键(Delete) 这三招你会吗?可大幅加快打字速度!

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

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

fn + delete,删除右边文字

fn + delete

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

如何配制泡泡水

Date: 1/1/2020Category: 生活杂记Tag: 泡泡水

基础泡泡水

  • 950毫升温水
  • 115克白砂糖
  • 120毫升洗碗液

超级泡泡水

  • 1400毫升水
  • 65克玉米淀粉
  • 120毫升洗碗液
  • 13克泡打粉
  • 15毫升甘油或玉米糖浆

彩色泡泡水

  • 300毫升温水
  • 30克白砂糖
  • 80毫升洗碗液
  • 食用色素

芳香泡泡水

  • 240毫升温水
  • 120毫升温和的,或者无香型洗手液
  • 精油
  • 30到60毫升甘油或玉米淀粉(可选)
Markdown简易教程

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

一、Markdown

简介

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

应用

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

编辑器

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

微服务技术选型:从生态架构视角看go-kratos的不可替代性

Date: 1/1/2020Category: Go编程Tag: Golang, Go-Kratos

在 Go 语言微服务生态中,单一框架的能力边界往往决定项目上限,而 “核心框架 + 生态扩展” 的架构协同性,才是长期支撑业务迭代的关键。面对 Gin、Go-Micro、Kitex 等选项,go-kratos 不仅自身架构卓越,更通过kratos-transport(通信扩展)、kratos-authn/authz(安全扩展)、kratos-cli(工具扩展)及go-wind-admin/cms/go-crud(应用模板),构建了 “核心定义标准、扩展补全能力、应用落地业务” 的全链路架构体系。本文从架构视角拆解这一生态,解析技术选型优先选择 go-kratos 的深层逻辑。

机器学习有关的库

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

基础概念

机器学习

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

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

  • 属于决策核心的计算算法。
  • 组成决策的变量和特征。
  • 支持(训练)系统学习的具有已知答案的相关基础知识。
MQTT服务器使用HTTP进行用户认证

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

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

  • RabbitMQ
  • EMQX.

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

Docker部署开发服务器

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用X509进行认证

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

什么是SSL

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

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
2024年Flutter必知必会的5+1个降本增效软件包

Date: 1/1/2020Category: Flutter编程Tag: Flutter

我从 2018 年初就开始使用 Flutter,我仍然对自己为客户和公司开发和部署应用程序的速度感到惊讶。由于我的开发周期的重点是提供有价值的产品,因此我避免重新发明轮子,这就是为什么我有一个在大多数项目中使用的安全和流行的软件包列表。今天我将分享我最常用的 5+1 个 Flutter 包,以帮助您完成下一个项目。

1. cached_network_image

随着移动应用程序对富媒体内容的需求不断增长,高效的图像加载和缓存变得至关重要。 cached_network_image 是一个可靠的解决方案,可以无缝处理图像加载、缓存和错误处理。通过在本地智能缓存图像,即使在具有挑战性的网络条件下,该软件包也能确保流畅且响应迅速的用户体验。凭借其简单性和性能,cached_network_image 几乎在我所有的应用程序中使用,以最佳效率提供具有迷人视觉的应用程序。

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/
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
OHLC

Date: 1/1/2020Category: 量化开发Tag: OHLC

OHLC

  • 开盘价(Open):这被视为特定时间段或时间范围开始时资产或加密代币的开盘价。
  • 最高价(High):这是给定时间范围内资产交易的最高价格
  • 最低价(Low):这是指定时间段内资产的最低交易价格。
  • 收盘价(Close):这是指定时间结束时资产的最后交易价格。

OHLCV

  • Open: opening price
  • High: highest price
  • Low: lowest price
  • Close: closing price
  • Volume: volume of transactions
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) 完成后才会执行下一笔,确保整个系统的数据一致性。

OpenAI 助手API

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

添加依赖库

go get github.com/Azure/azure-sdk-for-go
从OpenAPI文档生成Typescript的d.ts文件

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

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

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

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

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

数织 (Nonogram)

Date: 1/1/2020Category: 游戏开发Tag: 数织

什么是数织?

数织是一种逻辑游戏,以猜谜的方式绘画黑白位图。在一个网格中,每一行和列都有一组数,玩家需根据它们来填满或留空格子,最后就可以由此得出一幅图画。例如,“4 8 3”的意思就是指该行或列上有三条独立的线,分别占了4、8和3格,而每条线最少要由一个空格分开。传统上,玩家是以黑色填满格子,和以“×”号标记一定不需要填充的格子。数织是一个NP完全的问题。

数织是在1987年由日本人西尾彻也发明的。数织的日文名称是“お絵かきロジック”,意思是“绘画逻辑”。数织初见于日本的谜题杂志,玩家用纸和笔来玩。随后,任天堂以“Mario's Picross”为名推出了两款Game Boy和九款超级任天堂游戏。现时NDS上亦有名为Picross DS的同款游戏。2015年十二月,任天堂推出了名为“Pokemon Picross”的3DS游戏。

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
人体姿态识别

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

参考资料

  • Github开源人体姿态识别项目OpenPose中文文档
  • MediaPipe Pose
  • 基于人体姿态识别的AI健身系统
  • 基于深度学习的人体姿态估计技术与应用
  • On-device, Real-time Body Pose Tracking with MediaPipe BlazePose
Postgres 全文搜索:数据库中的搜索引擎

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

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

SELECT col FROM table WHERE col LIKE '%some_value%';
PostgreSQL查询交叉表

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

什么是交叉表?

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

概念

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

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

PostgreSQL Docker容器修改时区

Date: 1/1/2020Category: 运维技术Tag: PostgreSQL, Docker

做了一些配置的修改之后,查询到的数据倒是显示的是+8的时区,可是,执行show timezone;之后,不论怎么样都是显示的是UTC时间。

环境变量

docker-compose的相关配置如下:

services:
  postgres:
    environment:
      - TZ=Asia/Shanghai
      - PGTZ=Asia/Shanghai
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  -- 删除时间
);
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时,用户往往希望使用它们等。

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
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
Python如何操作Docx文档

Date: 1/1/2020Category: Python编程Tag: Python, Docx

python下面关于文档操作的工具倒是多的,比如:

  • win32com
  • python-docx
  • pydocx
  • docx2pdf
  • Aspose.Words
  • python-docx-template
Python修改pip的软件源

Date: 1/1/2020Category: Python编程Tag: Python

国内常用软件源列表

提供者 地址
豆瓣 https://pypi.doubanio.com/simple/
腾讯 https://mirrors.cloud.tencent.com/pypi/simple/
阿里 https://mirrors.aliyun.com/pypi/simple/
网易 https://mirrors.163.com/pypi/simple/
清华 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 https://pypi.mirrors.ustc.edu.cn/simple/
北京外国语大学 https://mirrors.bfsu.edu.cn/pypi/web/simple/
Qt 6 实战:C++ 调用 QML 回调方法(异步场景完整实现)

Date: 1/1/2020Category: C++编程Tag: C++, Qt

在 Qt 6 开发中,C++ 与 QML 混合编程是常见场景。当 C++ 处理异步操作(如登录验证、网络请求、数据库查询)时,需要将结果通知给 QML 界面,回调函数是最直观的通信方式之一。本文将基于你提供的代码框架,补充关键细节、修复潜在问题,并完整实现从 C++ 调用 QML 回调的全流程。

一、核心场景说明

我们需要实现:

  1. QML 调用 C++ 的 login 方法(传入用户名、密码和两个回调函数:成功回调 onSuccess、失败回调 onFailure);
  2. C++ 异步处理登录逻辑(模拟耗时操作);
  3. 登录完成后,C++ 调用对应的 QML 回调函数,将结果(成功响应 / 错误信息)传递给 QML。
Qt6 QML 自定义 DateTimePicker 组件:完整实现与使用指南

Date: 1/1/2020Category: C++编程Tag: C++, Qt

在 Qt 开发中,原生的日期时间选择组件往往难以满足个性化的 UI 设计和交互需求(如深色主题、自定义时间范围、键盘导航等)。本文基于 Qt6.10 版本,从零实现一款功能完整、交互友好的 DateTimePicker 组件,支持日期 + 时间联动选择、时间范围限制、键盘 / 鼠标双交互、深色主题适配等特性,可直接集成到 QML 项目中。

一、组件核心特性

特性 说明
深色主题适配 内置统一的深色系样式常量,支持快速切换主题
完整时间维度选择 支持年、月、日、时、分、秒全维度选择,日历网格可视化展示
时间范围限制 通过 minDateTime/maxDateTime 限制可选时间范围,禁用超出范围的选项
双交互模式 支持鼠标点击 / 悬停、键盘方向键 / Tab/Enter/Escape 操作
智能视觉反馈 选中状态高亮、禁用状态灰显、悬停效果、焦点区域提示
快捷操作 内置「今天」快捷按钮,一键恢复当前系统时间
自动月份切换 点击非当前月日期时,自动切换到对应月份
Qt 优雅实现线程安全单例模式(模板化 + 自动清理)

Date: 1/1/2020Category: C++编程Tag: C++, Qt

在 Qt 开发中,单例模式是高频使用的设计模式,用于全局共享一个实例(如配置管理、网络服务、日志系统等)。一个健壮的 Qt 单例需要满足 线程安全、自动清理、通用性强、支持任意构造参数 等核心需求。本文将基于模板封装 + 管理器的设计思路,实现一套可直接复用的单例框架,并详细讲解其设计原理与最佳实践。

一、单例模式的核心诉求

在 Qt 环境中,单例的设计需要解决以下关键问题:

  1. 线程安全: 多线程并发调用时避免创建多个实例;
  2. 自动清理: 程序退出时自动释放资源,避免内存泄漏(尤其配合 Qt 的 QCoreApplication::aboutToQuit 机制);
  3. 通用性: 支持任意类作为单例,无需重复编写单例逻辑;
  4. 灵活构造: 支持带参数的构造函数,且不丢失参数语义;
  5. 安全校验: 避免未初始化就调用实例的错误;
  6. 可手动控制: 支持主动初始化 / 销毁单例。
量化交易

Date: 1/1/2020Category: 量化开发Tag: 量化交易

「程序交易」(Program Trading)也可以称为「量化交易」(Quantitative Trading) ,投资人通过计算机程序「全自动」执行投资交易。

其优势在于可以大量节省时间盯盘,也可以同时关注多种商品。程序交易可以避免人性的主观影响,透过软件严格执行保持交易的一致性。

什么是量化交易?起源为何?

  • 量化交易简单来说就是将自己的金融操作方式,用很明确的方式去定义和描述,透过程序去回测验证,评估后确认方法具有交易优势后,让程序依照所设定的规则去执行交易。

  • 量化交易开始于1980年代初,大型投资机构利用程序设计的方式将交易规则明确的以程序语言定义,将交易流程系统化,至今有大多数的对冲基金(hedge fund)用到量化交易。在华尔街,传统的主观操盘手,将面临淘汰的压力,已经很少对冲基金利用基本面来选股了。

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
Reactor模式

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

参考资料

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

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

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

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

config set notify-keyspace-events KEA
REST 设计原则

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

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

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

什么是REST

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

使用 Docker 部署 CoTURN 新手指南

Date: 1/1/2020Category: 运维技术Tag: Docker, CoTURN

在本指南中,我们将学习如何在 Docker 容器中运行 CoTURN。COTURN 是一款免费的开源 TURN 服务器,可用于 WebRTC 视频和音频通信以及 VoIP 服务

先决条件

  • 您应该在系统上安装 docker。了解如何在系统上安装 docker 超出了本文的范围
  • 建议但不要求具备一些 docker 基础知识

安装

Docker 提供了 CoTURN 镜像,可用于在容器中轻松设置 CoTURN 服务器

步骤 1 拉取 Docker 镜像

安装docker coturn。从云存储库Docker Hub中拉取coturn的docker镜像。

SaaS系统RBAC后台权限管理

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

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

RBAC 简介

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

解决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
服务器基准测试

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

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

利特尔法则(Little’s law)

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

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

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

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

Spine骨骼动画版本降级

Date: 1/1/2020Category: 游戏开发Tag: Spine

下载Skeleton Viewer

下载页面:https://zh.esotericsoftware.com/spine-skeleton-viewer

打开界面

java -jar skeletonViewer.jar
股票

Date: 1/1/2020Category: 量化开发Tag: 股票

交易制度

  • 竞价制度
  • 做市商制度

竞价制度

撮合交易也叫竞价交易,它由买卖双方直接进行交易,或将委托交给各自的代理经纪商,由代理经纪商将委托者的委托呈交到交易市场,在市场的交易中心以买卖双向价格为基准实行撮合,达成交易。 撮合交易(竞价交易)的类型包括:连续竞价方式和集合竞价方式。

  • 集合竞价交易制度(Call Auction Mechanism)
  • 连续竞价交易制度(Continues Auction Mechanism)

集合竞价交易制度(Call Auction Mechanism)

笨贼问题

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

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

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

24款最佳Roguelike游戏

Date: 1/1/2020Category: 游戏开发Tag: Roguelike

roguelike 的魅力在于:重复奖励和诱人的希望,无论是因为你收集的新工具、你开发的新技能,还是你增强的新统计数据,你的下一次运行都会更加成功比最后一次。Roguelike 游戏很难停止,因为通常情况下,你会在某些方面有所进步。

尽管 Roguelike 的流行是最近才出现的现象,但其历史可以追溯到 40 多年前——准确地说,是从 1980 年开始。

尽管如此,Roguelike 游戏直到最近十年左右才进入主流。事实上,它们已经变得如此流行。天哪,2021 年最好的游戏之一是 PlayStation 工作室的 Roguelike 游戏。这导致了市场的某种程度的饱和,通常很难知道数百种游戏中哪一款最适合您。这就是我们进来的地方。

ThingsBoard设备登陆认证

Date: 1/1/2020Category: 物联网开发Tag: ThingsBoard

ThingsBoard设备有关的表

thingsboard_device_table

  • device_profile 这个表相当于国内的“产品”的概念
  • ota_package 这个表是OTA升级包相关的数据
  • device 这个表是设备的数据
  • device_credentials 这个表是设备的登陆验证凭证信息
ThingsBoard设备激活

Date: 1/1/2020Category: 物联网开发Tag: ThingsBoard
  • HTTP POST /provision

递交给HttpTransportContext

传递到了DefaultTransportService::process当中做处理。

public enum DeviceProfileProvisionType {
    DISABLED,
    ALLOW_CREATE_NEW_DEVICES,
    CHECK_PRE_PROVISIONED_DEVICES
}
ThingsBoard 规则引擎分析

Date: 1/1/2020Category: 物联网开发Tag: ThingsBoard

微服务系统架构

系统架构

规则引擎系统架构

系统架构

系统默认的规则链

规则链

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系统中,也在许多其他操作系统中被广泛采用。

传统 CMS 太笨重?试试 Headless 架构的 GoWind,轻量又强大

Date: 4/9/2026Category: GoWind风行Tag: Golang, Go-Kratos, GoWind

做企业官网、资讯平台、多端内容分发,你是否也被传统 CMS 的“笨重”折磨?部署时要配置一堆环境,启动慢到让人耐心耗尽,多端适配还要重复开发,稍微调整一下页面就要动后端代码,内存占用居高不下,运维起来更是费心费力。

在“轻量高效、多端融合”成为主流需求的今天,传统 CMS(如 PHP 系的 WordPress、织梦,Java 系的 Jeecms)的单体架构早已跟不上节奏。而 Headless 架构(无头架构) 的风行 GoWind,凭借 Go 语言原生优势与 Headless 核心设计,彻底打破传统 CMS 的桎梏,用“轻量不简陋、强大不复杂”的体验,成为中小企业、开发者的首选 CMS 解决方案。

时序数据库应用 - 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/
时序数据库应用 - MongoDB

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

数据库简介

搭建本地Docker数据库

参考资料

时序数据库应用 -TimeScaleDB

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

数据库简介

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

交易所类型:股票、期权、加密货币等

Date: 1/1/2020Category: 量化开发Tag: 交易所

有多种类型的交易所可以促进金融工具的交易。最常见的交易所类型是:

股票(Stock) 和 ETF 交易所

股票和 ETF 交易所受美国证券交易委员会( SEC )监管,是最常见和最知名的资产交易所类型。股票和 ETF 交易所允许投资者和交易者买卖股票和交易所交易基金 ( ETF )。

股票代表着对公司的所有权,可以像任何其他类型的资产一样买卖。ETF 是在证券交易所交易的投资基金,由股票、债券、商品和/或其他资产的投资组合组成。

期权(Options)交易所

期权交易所受美国商品期货交易委员会 ( CFTC )监管,是一种衍生资产交易所。期权交易所允许交易者买卖期权合约。

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);
}
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。

Ubuntu安装CMake

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

1. 使用Apt安装

sudo apt update; sudo apt upgrade;
sudo apt install cmake;
Ubuntu 安装 CoTURN

Date: 1/1/2020Category: 运维技术Tag: CoTURN

使用apt安装

sudo apt-get -y update
sudo apt-get -y install coturn
Unity AssetBundle文件

Date: 1/1/2020Category: 游戏开发Tag: Unity

什么是AssetBundle

AssetBundle 为资源的集合,可包含贴图(Textures),材质(Materials),声音(Audio),动画资源(Animation Clips & Animator controllers),文字(Text assets),甚至场景(Scenes) 等各式资源,允许游戏在运行时向远端服务器(Remote server),要求载入AssetBundle 并且使用里头的资源。

因此可以利用AssetBundle 功能来制作关卡更新资源包,下载新的关卡资源,即是DLC (Downloadable content)。亦可用来更新游戏,例如特殊节庆时,更新游戏贴图材质,让游戏与玩家一同过节。

升级旧版本的Unity项目

Date: 1/1/2020Category: 游戏开发Tag: Unity

UnityEngine.Application' does not contain a definition for bundleIdentifier'

把 Application.bundleIdentifier修改为Application.identifier。

升级粒子系统

Unity2018.2.x之后,旧版 Particle System 相关API就完全移除掉了,这个升级器是Unity官方发布的,它可以ParticleEmitter, ParticleAnimator, ParticleRenderer等组件转换为ParticleSystem 和 ParticleSystemRenderer组件。

用户画像

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

用户画像的3种标签类型

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

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

  1. 统计类标签

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

  2. 规则类标签

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

  3. 机器学习挖掘类标签

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

使用 PgBouncer 提高性能并减少 PostgreSQL 的负载

Date: 1/1/2020Category: 运维技术Tag: PgBouncer

如何改进 PostgreSQL 数据库服务器架构连接管理

这篇博文将会逐步介绍如何使用 PgBouncer 连接池来改进 PostgreSQL 数据库服务器架构连接管理、减少 PostgreSQL 服务器上的负载并提高性能。

以下是我们在本文中将要讲解的内容的细分主题:

  • PostgreSQL 数据库服务器如何工作
  • 使用 PgBouncer 池化器提高效率
  • 如何安装和配置 PgBouncer
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)
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才能编译成功。这并不是一件很友好的事情,而且经常导致编译不成功。

WebGL的图形引擎

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

引擎列表

名称 语言 特点
ThreeJS ES5
BabylonJS TypeScript
SceneJS TypeScript
CesiumJS ES5
PlayCanvas ES5
Egret ES5
LayaBox ES5
potree ES5
使用 Flutter 进行 WebRTC 视频通话

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

介绍

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

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

设置 flutter_webrtc 插件

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

加权随机(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. 根据表进行采样。
什么是BI

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

BI的定义

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

BI的用途

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

什么是数据血缘

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

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

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

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

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

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

Roguelike与Roguelite究竟是什么?

Date: 1/1/2020Category: 游戏开发Tag: Roguelike, Roguelite

如果有留意独立游戏,应该不时会看到「Roguelike」或「Roguelite」等字眼,我们介绍过的独立游戏中亦不乏此类作品。下文会为大家科普「Roguelike」的种种,以后看到游戏介绍中有这些字眼时,便知道是否自己想玩的类型了。

《Rogue》的诞生

原来「Roguelike」并不是一个生字,而是由「Rogue」及「like」两字组成,指的是「像Rogue的游戏」。《Rogue》,全名《Rogue: Exploring the Dungeons of Doom》,是由Michael Toy 和Glenn Wichman开发的地下城冒险游戏,当时两人都是加州大学克鲁兹分校的学生。

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

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

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

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

破解 WiFi 密码

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

查看网卡名称

ifconfig
Windows下释放Docker所占用的WSL磁盘空间

Date: 1/1/2020Category: 运维技术Tag: Docker, WSL

使用下面的命令清理镜像:

docker system prune
Windows安裝Flutter开发环境

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

安装Flutter

scoop install flutter
Windows Server 部署 Docker

Date: 1/1/2020Category: 运维技术Tag: Windows, Flutter

Docker Desktop安装不了,只能安装Docker Toolbox。

通过国内镜像站下载:

  • 阿里云:https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
  • DaoCloud: https://get.daocloud.io/toolbox/
WSL2重启

Date: 1/1/2020Category: 运维技术Tag: Windows, WSL

列出WSL子系统

wslconfig /list
wsl --list
wsl -l -v
WSL2设置网络代理

Date: 1/1/2020Category: 运维技术Tag: Windows, WSL

为了生计所迫,有时候不得不需要在WSL2下面使用代理。

获取到宿主的访问IP地址

WSL2要访问宿主的服务,并没有那么容易,并不能简单的通过127.0.0.1来访问,需要获取到宿主的访问IP地址。有两种办法可以访问宿主的IP:

  1. cat /etc/resolv.conf命令获取nameserver;
  2. 如果安装了Docker,可以获取host.docker.internal。

推荐使用第一种方法。

配置代理