Avatar

个人介绍

admin CSCEC
兴趣使然的程序员,博而不精,乐学不倦

Self Introduction

少时曾攻经史,长成却成码农。家有懒猫伏膝侧,键盘声中迷蒙。

主业后端开发,大数据、流媒体、游戏后端之类的什么都懂一点。python/golang/java/C++都能写,rust/haskell总是学不会。

不为无益之事,何遣有涯之生:活着就是折腾。

Typescript速成

安装&使用 npm install -g typscript tsc hello.ts 生成1个js文件。 教程推荐:https://wangdoc.com/typescript/ 基础 使用let ok: boolean = false和let ok = new Boolean(1)不同,前者是基本类型,后者是对象。类似C#/Java中的装箱和拆箱。 可以用void标识函数的任意返回值类型; undefined和null是所有类型的子类型,默认情况下可以给任意类型(除了Object类型); tsc编译时加上--strictNullChecks选项,可以让其只能赋给any/unknown类型; 内置类型:boolean, string, number, bigint, symbol,最后两个对应的类没法直接构造数据; 可以将变量声明为any,相当于使用js的弱类型;但是any会带来类型污染,可以用unknown类型代替,此时用之前需要判断类型,类似Go的interface{}必须switch x.(type)才能用一样,在ts里面就是if(typeof a == 'string'); never类型标识不可能存在的类型,不接受任何赋值(交叉类型时有点用); 联合类型。类似Python,可以写出a|b,标识变量可以有多种类型; 值类型:值也可以作为一个类型,可以用来写枚举,let sex: 0| 1; 交叉类型:可以把两个interface合并; 使用type给类型取别名,type A=number|string; 使用typeof获取值的TypeScript类型,注意这里是类型而不是字符串; 但是ts兼容js的typeof用法,此时返回的是字符串。二者的区别是前者一般用于类型声明,编译之后就没了; 元组仍然使用中括号声明:const s:[string, string, boolean] = ['a', 'b', true],这就导致元组必须显式声明,否则会被推断为一个数组; 最后x个元组元素可以配置为可选的,方式是在类型尾部增加?; N个元素如果类型一样,可以用...接数组或者数组表示任意多个元素; 只读的值类型,可以作为元组使用,也可以作为数组使用,例如const arr=[1, 2] as const,此时arr的长度和类型都是固定的; symbol类型一般是给库作者使用的,普通用户用到的机会不大; 使用as进行类型转换,或者使用<string> p这种形式; 使用!后缀进行非空断言; 支持模板字符串,语法是```` 数组 格式为:let array: number[] = [1, 2, 3]; 也可以用泛型格式:let array: Array<number> = [1, 2, 3]; 甚至还可以用接口: interface NumberArray { [index: number]: number; } let array: NumberArray = [1, 2, 3]; 如果数组初始值是空数组,且没有声明类型,在向里面push元素时,会自动推断元素类型,此时可以放入不同类型的元素(推断为联合类型)。但是当初始值非空时,再push不同类型的元素会直接报错; const声明的数组和对象其实是可以改变元素的,需要使用readonly修饰类型:const arr: readonly number[] = [1, 2, 3],此时数组是不可变的; 但是readonly和泛型数组是不兼容的; 函数 首先兼容js中的普通函数: function hello(txt: string):void{ console.log('hello' + txt); } 等价于: const hello: (txt:string)=>void = function(txt){ //... } 注意这里参数名是必须写的,和C语言不一样。包括用type给函数取别名,也要带上参数名。当然实际用的时候的参数名,可以名字不一样。
2024-11-11
8分钟阅读时长

Python技术栈更新

有段时间没用Python写工程了,基本都是写脚本,最近接了个活帮忙搞个爬虫相关项目,需要更新一下技术栈,做个笔记。 web开发:fastapi, 其实还可以接着用flask,不过前者对asyncio支持更完善一些,顺便学一下新东西;至于django还是太重了,写单体估计有点用; 数据库ORM:仍然可以继续使用sqlalchemy,最新的是2.0版本,已经支持asyncio; 爬虫:爬虫相关的技术栈变化不大…scrapy其实不太好用,封装的太厚,而且twisted早就过时了。自己写的话就: 用aiohttp做网络请求; dom解析:仍然是基于lxml的技术栈,主要还是xpath和css-selector来获取元素; 浏览器模拟(动态网页):Playwright代替了Selenium等古早的框架; 打包:用docker就行; 验证码破解:这个相关的网站蛮多的,但是好不好使需要测试一下才知道。包括:yesCapture, 2Capture和穿云等; 其他反爬技术:这个只能随机应变了,现在很多网站都做了反爬,具体手段不一,需要尝试解决; FastAPI fastapi顾名思义,专注于提供API框架,不关心模版引擎、ORM之类的东西,但是自带了API文档(即swagger集成)。所以代码非常简单,不需要Django那套复杂的框架:
2024-01-09
4分钟阅读时长

Jinja2小结

之前写Python的时候其实有接触过一些jinja2,不过没有怎么用过实际上。毕竟前后端分离之后,这些模板语言在web开发上用处并不大。不过ansible选用了它做渲染模板,所以还是需要深入学习一下。比较蛋疼的是,k8s这边因为都是golang生态,所以用的是go template,那就是另外一套东西了。
2024-01-05
2分钟阅读时长

Ansible速成

虽然iac(infracture as code)流行以来,新的技术栈层出不穷,但是一般都是面向k8s或者云服务商的。传统的部署还是用ansible这种仅依赖ssh的最简单。
2024-01-04
6分钟阅读时长

Kcl试用

kcl是蚂蚁金服开源的配置DSL,诞生比较晚,所以吸纳了已有的jsonnet、hcl、cue等方案的优点。 安装 对于linux: wget -q https://kcl-lang.io/script/install-cli.sh -O - | /bin/bash 这个脚本本质上还是从github中下载发行版,所以也需要翻墙。
2024-01-02
4分钟阅读时长

Ytt试用

jsonnet最大的问题其实是:它支持的是json,而不是yaml. 其实这也不是什么问题,因为yaml是json的超集,json本身就是一个合法的yaml. 但是写起来需要将原来的yaml转成jsonnet,输出成yaml就更麻烦,需要在外围加上std.YamlManifest(),这种侵入式的设计感觉很蛋疼。
2023-12-29
5分钟阅读时长

Jsonnet试用

jsonnet这个语言很有意思,它存在的目的就是为了编辑配置。其实使用任何一门带有字符串模板的语言都能完成类似的目的,但是jsonnet的好处是它的封闭性:不要使用额外的依赖完成配置。
2023-12-29
4分钟阅读时长

linux日常使用记录

由于公司开始强制使用Linux桌面系统,记录一下使用中遇到的问题。 发行版选择 本来先尝试了Ubuntu 22.04和KDE Neon做为开发环境,但是体验都不太好: KDE Neon与日常使用的软件兼容性很差,主要是大部分软件都是GTK搞的;
2023-11-24
13分钟阅读时长

ES和kibana简要笔记

由于比赛需要用到es和kibana,重新复习一下这块的内容。 基础概念 ES的概念和其他数据库截然不同,虽然和mongodb同为文档型数据库,但是后者的很多概念更接近于普通的关系型数据库。
2023-11-13
6分钟阅读时长

解决k8s的javaSDK与jackson不兼容问题

k8s的java sdk中json序列化使用了google自家的gosn,但是springboot中默认使用Jackson,我们的业务代码里面也习惯上使用了Jackson。所以直接用k8s sdk会出现各种序列化/反序列化错误,需要做适配。
2023-07-10
3分钟阅读时长

K3s存储插件使用笔记

原理 k8s存储主要依赖PV和PVC的机制,前者由运维人员声明可用的存储,如: apiVersion: v1 kind: PersistentVolume metadata: name: nfs spec: storageClassName: manual capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: server: 10.244.1.4 path: "/" 后者是用户(开发人员)声明的需求: apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs spec: accessModes: - ReadWriteMany storageClassName: manual resources: requests: storage: 1Gi 两者的匹配机制:
2023-06-12
6分钟阅读时长

边缘服务器管理工具选型

这里我们主要的需求是能够穿透内网管理服务器,服务器大部分情况下应当是linux,但是也可能是windows。我们的服务要通过API和这个服务器管理软件进行交互,也就是说要做二次开发,不能直接用。
2023-03-06
4分钟阅读时长

Kotlin要点笔记

实际上学习kotlin的动力一直不足,因为java is enough. 不过最近打算写一个QQ机器人玩,现在流行的框架是基于kotlin的,虽然可以用HTTP API进行桥接,但是这样部署太麻烦,而且性能有影响,索性简单的学习一下kotlin,然后直接扩展。用的教材是阿里的《kotlin核心编程》。
2023-03-05
11分钟阅读时长

KubeEdge要点笔记

安装流程 首先要在云端安装k8s,理论上只需要master节点,可以没有worker,换句话说可以是一个单节点集群(但是要关闭NoSchedule的taint)。
2023-02-21
2分钟阅读时长

K8s要点简记

22年的时候需要使用CICD的时候,看了一遍k8s相关的知识点。买了一本《深入剖析Kubernetes》,大致熟悉了常用的概念。 最近因为工作调动需要做云原生相关的开发,有必要重新复习一遍相关概念,并深入部分章节的细节。
2023-02-10
28分钟阅读时长

Makefile要点简记

虽然现代C/CPP一般使用cmake作为工具链,但是如果要看陈年老项目,makefile相关的知识还是要掌握一些的,不然估计很难理清编译逻辑。这也是c/cpp的技术负债之一。
2023-01-25
3分钟阅读时长

CMake速记

主要参考书籍《Modern CMake for C++》,以及《CMake Best Practices》,使用CMake版本3.25. 建议先看第一本,再看第二本。 使用 一般而言,cmake的使用方式非常简单。在命令行下使用
2023-01-09
17分钟阅读时长

Tinode源码解析

概述 有朋友需要做一个im,简单做了一下技术调研,开源的实现其实蛮多的,这里挑几个说一下: Synapse/dendrite,matrix系,客户端比较多,比较推荐的应该是element.io. 稳定版本是python写的,性能很一般,golang/rust的服务端还没有stable,不建议使用; Tinode/chat: 即本文主角,golang编写,架构比较简单,有MySQL就能跑,轻量级方案。支持web/ios/android,界面长得比较像telegram;支持chatbot. 国内用有点水土不服,主要是推送等组件依赖国外大厂的服务(S3, Firebase等),国内根本连不上,需要自己改成个推之类的方案。由于方案比较轻量,消息可靠性上有一些缺陷,内置了chatbot支持(可以用Python写); Open-IM-Server:据说是某个腾讯核心人员离职后自己开源的。服务端golang,架构基于微服务,有商业产品,自己试了一下目前版本大概有16个微服务,依赖kafka&zk、mysql、etcd、redis、miniIO和MongoDB。架构比较合理,早期是写扩散模型,v2.3之后群聊改为读扩散模型。主要问题是架构比较重,文档写的烂,需要自己分析代码,小团队维护比较吃力;另外客户端开源的只是demo,bug满天飞,不能直接拿来用。 turms-im/turms:java写的,读扩散模型。maintainer比较有自信,号称开源界最先进的方案,文档确实写的不错,很详细的技术分析。不过star数不多,实际使用者估计也寥寥。而且作者喜欢自研,Log/注册中心/配置中心这些都是自研的…有种自嗨过了头的感觉。整体来讲架构比较中庸,技术细节把控的比较好。java团队可以考虑,代码还比较易读,而且没有商业版,作者没有恰饭需求;客户端没有开源产品,只有sdk; wildfirechat/im-server:也是java做的,主要卖商业版,开源的功能做的很全了,和国内生态也结合的蛮好。开源版强行指定了使用七牛云做文件夹存储,然后服务端端口强行指定了80/1883,另外开源版不支持集群模式;国内的小规模内部使用推荐使用该项目(<10w人); Rocket.chat/mattermost:面向B端,类似zulip/Slack这种IM,有复杂B端需求的团队建议优先考虑。界面不太符合普通人使用im(qq/微信/钉钉)的习惯,办公人士用比较合适; 这几个项目是客户端生态做的最好的了,基本能开箱即用。其他一些如goim之类的,没有客户端只有服务器,那还不如用mqtt自己写一个,毕竟有emqx这种高性能broker,写一个im真不算啥难事。聊天存储用influxdb或者MongoDB,元数据存MySQL。设计好推拉模型,读写扩散,消息时序,topic规则,一个基本的im软件还是能很快成型的。
2022-11-14
12分钟阅读时长

SRE读书笔记

SRE相关的书籍,截止目前google出了2本,分别是2016年的的《Site Reliability Engineering: How Google Runs Production Systems》和2020年的《The Site Reliability Workbook》。这两本书是互补关系,需要先阅读第一本,然后再看第二本。
2022-09-22
11分钟阅读时长

Ginkgo使用笔记

go自带的单元测试比较适合测一个小函数,如果要做一系列的流程测试,则显得较为繁琐。 推荐使用ginkgo来做流程测试,BDD风格写出来的测试代码非常容易读懂和维护。
2022-09-05
2分钟阅读时长

Influxdb Cluster集成

本文记录在golang项目中集成influxdb-cluster需要的知识储备。 术语 database 和MySQL中一致 batch \n分割的多行数据,用来批量写入。 influxDB推荐5000~10000个点批量写入以提高性能。
2022-09-01
3分钟阅读时长

Zabbix配置记录

安装服务 这里演示的是物理机环境监控场景,容器场景还是更推荐k8s+prom来搞。 版本是zabbix6.0 LTS,官方已经不提供CentOS7的安装包了,所以这里推荐使用docker安装,后面升级也比较方便。
2022-07-13
6分钟阅读时长

Golang定时器要点

golang内置的定时器是基于多个四叉堆封装调度的,增删定时器的效率是O(lgn),所以大量定时器本身可能成为性能瓶颈。可以考虑使用开源的时间轮算法实现方案进行替换。不过一般情况下不需要考虑该问题,如果时间轮真的万能的话,官方肯定就重构了。
2022-04-07
2分钟阅读时长

Windows+wsl2后端开发环境搭建

2023/11/16 Update: wsl2 2.0通过镜像网络解决了所有网络问题,已经不用折腾了。 2023/2/2 Update: wsl已经解决了systemd和网络问题,现在已经基本无障碍使用,移除了大部分无用的配置步骤。
2022-03-04
7分钟阅读时长

Gb28181解析

国标GB28181(以下简称国标或者gb)文档分析的文档我去年其实写过一版,但是由于原来的电脑炸了,文档还没来得及传上去就丢了(痛苦),所以还要重写一版做笔记。
2022-03-02
18分钟阅读时长