Sam's Dev Life

探索技术,记录生活

其实我们很幸福

一天我们在讨论什么是幸福。 P说:可能就是美好的过往,或者现在回想起来的幸福,对现在有用的,美好的? 那么是不是可以这么说,是不是对现在有用的过完,或者感受美好的过往就是幸福?反之则不是?

H说:幸福可能就是人的自己的感受,自己感觉幸福,就幸福。 在春节档的《流浪地球》中有一个故事线,就是为了应对太阳危机,一部分人主张地球流浪,一部分人追求人类数字化,就是把所有的记忆都留下来,在数字世界里面继续生活。刘德华演的就选择了这么一条线路,最后跟女儿幸福的活在数字世界里面。

我们还讨论了另一种,就是不用感知,”呵呵”的傻子一样,自己的精神世界可能是幸福的。

仔细想,好像主观感受也不是那么一种幸福。

P说:可能就是很有多钱,想做什么做什么? 那能不能做一个思想试验,有一天,世界上所有的东西都可以由你随意使用,想要什么就拿什么;可能你说,还不会开飞机,没事,机长也随时候命;再甚者,喜欢在一起的人,也在一起,呼之则来,挥之则去;反正你想的都会有,而且会轻而易举的得到。

是不是真的很幸福呢?

可能你注意到,轻而易举的得到好像并没有什么味道,那么增加一点难度呢?比如不会开飞机,需要自己去学,那是不是就幸福了呢?比如学点技术飞行,学习游泳,学习演奏,游泳就像菲尔普斯,演奏就像莫扎特。 那么幸福是不是就是所谓的习得什么技能,具备某项能力呢?神说要有光,于是就有了光,你想要什么技能,什么能力,都随你设计,你想通过练习得到还是天生使然都可以随你设计,那是不是就幸福了? 那是不是很幸福呢?想想也还没有味道,没人跟你比,好像这么多技能也没有什么用?比如没有旅行的需求,飞的再快也没用;没有缺乏食物的需求,再好的耕种技能也没有用;没有烦躁的情绪,再美妙的音乐也没有用。

好像都是要快脱水的时候,水才显得珍贵;没有失败的成功,毫无意义;没有失去的得到,毫无价值。

所有的不幸,才是幸福的源泉;没有黑暗就没有光亮;没有了痛苦就没有快乐;所以,我们都很幸福。

数据恢复折腾

数据恢复

背景

事情是这样的,以前年轻不懂事,为了多一点存储空间,一块小的容量的ssd和一块大的机械盘,用扩展模式做了存储,直到有一天,终于坏了。想想我那些照片,至少也是个记忆,还是想能捞多少就多少吧。

于是就把两个硬盘拿出来恢复。于是就开始折腾。

DiskGeneius

凭心而论,真心不错的一款磁盘工具,下载一个免费版本,一看磁盘,还不错,大部分文件都在,而且还能预览,可能是数据写入后就没有怎么动过,顺序维持的比较好。但是需要把文件导出来,需要注册一下。请朋友帮忙,吃个饭也得大几百,注册一个也好。但在注册时候把我整懵了,还区分标注版和专业版,好吧,专业版功能应该是最完整的;下一步,专业版还区分普通锁和U盘锁,U盘锁还分16G和32G,还区分读写速度,彻底懵了,是说U盘的读写速度还是恢复数据的速度?标注版还不提供普通锁,到现在为止我还不知道什么是普通锁。按照逻辑,专业版优于标注版,专业版的防护标注应该要比专业版做的更好。

感叹,为啥把定价做的这么麻烦,假如U盘还只是做个锁,为啥还要分个容量?放弃了。

但是还是感谢DiskGeneius,从DiskGeneius我可以确定两个事情,第一,大部分的数据还在;第二,磁盘是linux的lvm。

LVM

是一种逻辑盘技术,简单概括一下,有三个概念,pv,vg,lv。

pv:物理卷【也可以理解为分区】,把物理磁盘分区就是pv。

vg:卷组,把多个物理盘组成一个卷组,就是把多个物理卷合并在一起,看起来就像一个超大的磁盘。

lv:逻辑卷,在vg这个大盘上再分成多个逻辑卷。

区别,传统的技术直接把pv挂载,pv的大小受限于单个磁盘的大小。lvm技术通过中间的vg,实现了多个物理卷的逻辑组合,不再受限于单个物理盘的容量,理论上可以实现无限大的盘。并且可以通过软件动态扩容,缩容等。

wsl2

那现在的直接想法就是把磁盘挂到linux下,直接用linux读取lvm ext4卷。wsl2太秀了,基本上可以完全替代虚拟机了,比如vmware之类的虚拟机软件。注意,用的wsl2版本,而且需要开启systemd服务。wsl启动之后,修改/etc/wsl.conf

1
2
[boot]
systemd=true

windows powershell 中执行GET-CimInstance -query "SELECT * from Win32_DiskDrive" 可以获取windows的硬盘信息。

通过以下命令把磁盘挂到wsl,注意其中的 —bare参数,大概就是裸盘的意思吧。

1
wsl --mount  \\.\PHYSICALDRIVE0 --bare

没有那么顺利

进入wsl之后,一切很正常,也能正常的看到lv的信息,但是就是mount不了。总是提示superblock信息丢失。这里我折腾了好几天,google了一堆的方案尝试,有个最蛋疼的是,一个晚上fsck,总提示要不要修复,一直要按y,最后还是用pyautogui写了个脚本,按了一晚上y,把fsck执行完,但最终还是失败了。

大致梳理下我走过的坑,在上一步中,用各种lvm工具,能看到我的逻辑卷,但是mount到文件系统的时候,就是不对。大致原因是之前的两块硬盘组成的vg,在vg上分了一个大分区,也就是这个分区占了两个硬盘。举个例子,比如每一个硬盘上有100个块,两个硬盘总共200块,在逻辑分区上的信息是从0-200,但现在物理盘少了一个,100以后的块就找不着了,自然是要错的。网上也有人提出把后面的100-200也用另一块盘补上;我的思路是既然只有0-100,能不能直接把lv的信息改成0-100,但是依旧是没有找到可行的方案。

数据恢复

既然正常读盘的方式走不通,那就直接做数据恢复的,能捞多少算多。DG能做,有没有免费的?一搜果然,大佬TestDisk,但是就是名字取得太低调和不正经,以至于还以为是什么垃圾软件。一搜,才发现是自己浅薄了。

TestDisk和打包一起的PhotoRec,还提供windows版本,没得说了,启动打开windows版本,根据提示选择要恢复的磁盘和保存的路径,几个小时后等着收文件就行。几万个文件恢复处理了,有一点瑕疵就是目录结构和文件名没有还原,而是按照原来的目录1,2,3的依次平铺。

总结教训

数据存储容灾不得忽视,多做几个备份,RAID 0千万要不得,RAID 1虽然空间减一半,但可靠性提升一倍。

TestDisk CN

vertx最简的入门例子-通知发送

https://media2.giphy.com/media/3o72F7RrTPW6jymXew/giphy.gif?cid=7941fdc6fg54eaawj8ga80pv5uqsmxirwsxgo5hsnampr9vn&ep=v1_gifs_search&rid=giphy.gif&ct=g

背景

之前有个通知服务,用httpclient调用外部rest接口,但是总会由于外部的环境不可控,总会把消息堵住,或者延迟。

想起了vertx的异步处理,写了一个例子。只是简单的测试,并没有上生存。

测试结果,对以下几种情况vertx还是能够很好的应对的。

  1. 目标地址不存在,能够迅速返回失败
  2. 目标地址仅监听,不接受连接
  3. 目标地址能够连接,但不返回任何数据
  4. 目标能连接,但返回错误

maven 依赖

1
2
3
4
5
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web-client</artifactId>
<version>4.4.3</version>
</dependency>

Notifier

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import io.vertx.core.AbstractVerticle;
import io.vertx.core.http.HttpServer;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;

public class Notifier extends AbstractVerticle {
@Override
public void start() {
HttpServer server = vertx.createHttpServer();
server.requestHandler(req -> {
req.bodyHandler(buffer -> {
String webhookUrl = req.getParam("target");
String signature = "";
WebClient client = WebClient.create(vertx, new WebClientOptions().setSsl(true));
client.get(443, webhookUrl, "/")
.send()
.onSuccess(r -> System.out.println("Received response" + " " + webhookUrl + " " + r.statusCode()))
.onFailure(r -> System.out.println("error " + " " + webhookUrl + " " + r.getMessage()));
req.response().end("ok");
});
});
server.listen(8000); // 监听端口并启动服务
}
}

Bootstrap

1
2
3
4
5
6
7
import io.vertx.core.Vertx;
public class NotifierBootstrap {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(Notifier.class.getName());
}
}

测试的server

1
2
3
4
5
6
7
8
9
10
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 443)
sock.bind(server_address)
sock.listen(1)
# 注释一下几行,就是一个仅监听,不处理的情况
while True:
print( 'waiting for a connection')
connection, client_address = sock.accept()

故障报导

故障

2023年11月1日

东南亚最大银行,突遭暂停!

2023年10月23日

语雀突发P0级事故!宕机8小时被网友怒喷,运维又背锅?_企业动态_凌敏_InfoQ精选文章

2023年6月8日

宕机超 12 小时,损失过亿,唯品会基础平台负责人被”祭天”

2023年6月8日

广东电信全省基站出现重要网络故障,用户暂不能拨打电话_通信世界网

2023年3月29日(00:14-12:01)

宕机 12 个小时、损失超亿元:唯品会开除基础平台部负责人

2023年3月29日

腾讯将 3 月 29 日凌晨微信 QQ 故障定性为一级事故,多位高管遭问责

2022年12月18日

复盘!阿里云(香港节点瘫痪)的故障情况、问题分析和改进措施

2023年06月06日

因一个代码拼写错误,17 个生产级数据库被误删、瘫痪 10 小时!

2021年07月13日

2021.07.13 我们是这样崩的

2021年10月28日

Roblox发布宕机报告,并表示关键业务坚决不上云_服务革新_Tina_InfoQ精选文章

榨干AI,算法清单

https://images.unsplash.com/photo-1676245437659-2a05627080e4?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb

突然想知道AI知道哪些算法,于是我连续问了二十多次。最后可能是因为AI记不住上下文了,开始重复回答。我记录下了收集到的结果,但有很多算法我都没有听过。

这次的prompt很宽,”请帮我梳理一个编程算法的清单,只需要算法名称和用途”。然后不断输入继续。

下次再限定一个领域的,比如一个图像处理方面的算法,辅助制造领域的算法,可能就会有更细致的答案。

排序算法:

  • 快速排序:通过分治法对数组进行排序,时间复杂度O(nlogn)
  • 归并排序:通过分治法对数组进行排序,时间复杂度O(nlogn)
  • 堆排序:通过堆结构对数组进行排序,时间复杂度O(nlogn)

查找算法:

  • 二分查找:对有序数组进行快速查找,时间复杂度O(logn)
  • 哈希表查找:通过哈希函数映射到表中快速查找,时间复杂度O(1)图算法:- 深度优先搜索:从根节点开始深度遍历图
  • 广度优先搜索:从根节点开始宽度遍历图
  • 最短路径算法:寻找图中的最短路径,例如Dijkstra算法、Bellman-Ford算法、Floyd算法等字符串匹配:- KMP算法:快速匹配字符串是否包含子串,时间复杂度O(n)
  • Rabin-Karp算法:通过哈希求子串是否匹配,时间复杂度O(n)

动态规划:

  • 爬楼梯问题:计算不同方法爬到楼顶
  • 背包问题:选择不同物品放入背包达到最大价值
  • 最长公共子序列:找出两个字符串的最长公共子序列

加密算法:

  • MD5算法:对字符串进行加密,通常用来验证数据有效性
  • SHA算法:安全HASH算法,比MD5更安全,分SHA-1、SHA-2等标准
  • AES算法:一种常用的对称加密算法,用来对数据进行加密解密

压缩算法:

  • Huffman编码:根据字符出现频率构建Huffman树,再进行编码压缩,常用于文本文件压缩
  • LZ77算法:通过查找重复串进行压缩,常用于PKZIP、WinRAR等格式
  • JPEG图像压缩:通过DCT变换、量化、熵编码等步骤压缩图像,常用于JPG图片格式

其他常用算法:

  • 贪心算法:通过局部最优解找出全局近似最优解,用于解决一些优化问题
  • K近邻算法:通过训练样本找到与输入最邻近的K个样本,用于分类与回归问题
  • 朴素贝叶斯分类器:基于贝叶斯定理与特征条件独立假设进行分类,用于文本分类与垃圾邮件过滤
  • 随机森林:通过集成多个决策树预测结果,用于分类与回归问题,效果较好
  • PageRank算法:Google搜素引擎用于评估网页权重与排名的算法
  • K-Means算法:一种聚类分析算法,将n个观察值划分为k个聚类,k 是预先指定的聚类数

人工智能领域:

  • α-β剪枝算法:用于游戏对弈的搜索算法,提高搜索效率
  • A*搜索算法:一种启发式搜索算法,用于pathfinding与游戏开发
  • 遗传算法:一种启发式随机搜索算法,适用于求解复杂优化问题
  • 最大熵模型:一种概率模型,用于解决分类与回归问题,理论基础简单但效果较好

区块链与比特币:

  • 椭圆曲线数字签名算法(ECDSA):比特币算法中用于钱包地址生成与交易签名
  • Hashcash算法:一种基于hash的PoW算法,用于抵抗垃圾邮件与DDoS攻击
  • Scrypt算法:一种Key衍生算法,用于比特币钱包密钥生成
  • Ethash算法:以太坊使用的PoW算法实现,目的是ASIC局限性要高

数据挖掘与机器学习:

  • SVM算法:一种二分类算法,通过最大间隔分隔超平面对样本进行分类
  • 决策树:一种流行的分类算法,通过树状结构对样本进行分类
  • 逻辑回归:一种分类算法,通过建立样本与类别之间的logit函数进行分类
  • EM算法:一种聚类算法,通过迭代寻找最大似然估计参数对样本进行聚类
  • AdaBoost算法:一种集成学习算法,通过调整各分类器权重实现提高分类准确率

其他:

  • 梯度下降法:一种最优化算法,通过迭代寻找目标函数的最小值
  • Dijkstra算法:一种最短路径算法,用于找到图中最短路径
  • 拓扑排序:对有向无环图进行排序,使得每个顶点之前的顶点都已经排好序

计算机网络:

  • TCP拥塞控制算法:用于控制TCP连接的传输速率,如Tahoe、Reno、NewReno、BIC、CUBIC等
  • DVSRP算法:一种距离矢量路由算法,用于计算网络各节点之间的最短路径
  • OSPF算法:一种链路状态路由算法,用于构建网络链路拓扑并计算最短路径
  • BGP算法:用于在自治系统之间进行路由选择的算法,实现互联网的路由功能

操作系统:

  • 进程调度算法:用于决定将CPU分配给哪个进程,如FCFS、SJF、LRU、RR等算法
  • 页置换算法:用于决定当内存页满时淘汰哪些页,如FIFO、LRU、OPT等算法
  • 存储碎片整理算法:用于整理碎片化的内存空间,如首次适应算法、最佳适应算法等
  • 磁盘调度算法:用于决定磁盘访问哪些请求,以减少磁头移动距离,如FCFS、SSTF、SCAN等

数据库:

  • B+树:一种自平衡的搜索树,用于索引和索引查找,能实现对数据的高速访问
  • Hash索引:通过Hash函数将键值映射到散列桶中,实现快速查找
  • 聚集索引:通过对表中的某一列建立索引,实现快速查找,但会影响插入和修改性能
  • 非聚集索引:不会按索引列的值对记录进行物理排序,lookup需要二次查找,但插入和修改性能好

组合优化:

  • 分支定界法:通过对问题的解空间进行分支与界定,从而缩小搜索规模,用于求解NP难问题
  • Simulated Annealing算法:一种基于蒙特卡罗方法的启发式算法,用于求解NP难问题
  • Tabu Search算法:一种基于禁忌表的启发式算法,用以逃离局部最优解,求解NP难问题
  • 蚁群算法:一种启发式算法,模拟蚂蚁寻找食物的行为,用于解决复杂优化问题

图片与信号处理:

  • 高斯模糊:通过高斯函数对图像进行平滑处理,消除噪声
  • Sobel算子:一种边缘检测算子,用于检测图像中的水平、垂直和对角边缘
  • Canny算子:一种边缘检测算法,通过高低阈值检测和链接实现平滑的边缘检测
  • DCT变换:一种重要的傅立叶变换,用于图像压缩(JPEG)和视频压缩(MPEG)
  • 小波变换:通过多分辨率分析实现图像压缩、去噪、边缘检测等处理
  • Huffman编码:一种编码压缩算法,用于图像压缩减少文件的大小

数据与图像压缩:

  • 位图图像:像素级的无损图像格式,颜色深度高但文件体积大
  • 向量图:通过几何形状描述图像,边界清晰,无损且体积小,但颜色深度受限
  • JPEG:一种有损压缩图像格式,通过DCT变换、量化与熵编码进行压缩
  • PNG:一种有无损压缩格式,支持alpha通道与动画,无专利限制
  • MPEG:利用动态图像压缩算法,用于视频数据的压缩与解压
  • ZIP:一种文件压缩格式,通过LZ77等算法实现无损数据压缩

语音与音频处理:

  • FFT快速傅立叶变换:将信号转换到频域,实现滤波、频谱分析等处理
  • LPCC线性预测编码:利用人声学原理,提取语音参数用于识别与合成
  • MFCC倒谱系数:基于人耳听觉模型,用于语音特征提取与识别
  • CELP码本激励线性预测:一种语音编码技术,用于数字式语音通信
  • MP3:一种有损音频压缩格式,利用MDCT、量化、Huffman等算法进行高压缩

计算机图形学:

  • 线性代数:向量、矩阵运算的基础,用于坐标变换、投影等
  • 几何变换:平移、旋转、缩放、错切、射影变换等,用于图像变形
  • 视点变换:平行投影、透视投影,用于生成3D场景的2D投影图像
  • 光栅化:将3D图形转换成2D像素点的过程,用于显示器显示
  • 渲染:光照计算、纹理映射、阴影生成等,用于增加真实感
  • 锯齿现象:图像中斜线与曲线显示为锯齿状,需要抗锯齿技术处理
  • 纹理映射:将2D图像贴在3D模型表面,增加真实感
  • 几何建模:多边形、曲面、体积等,用于构建3D场景
  • 光照模型:平行光源、点光源、聚光灯等,模拟光照与ombre效果

人工智能:

  • 线性分类模型:感知器、Logistic回归,用于二分类问题
  • 决策树:通过树形结构实现分类与回归
  • 随机森林:通过集成决策树提高预测性能
  • 贝叶斯分类:基于贝叶斯规则与条件独立性实现分类
  • K-近邻算法:通过训练样本最近邻居进行预测
  • 神经网络:感知机、BP神经网络、CNN、RNN等,用于学习复杂函数映射
  • 聚类分析:K-Means、DBSCAN、层次聚类等,用于无监督学习
  • 强化学习:通过AGENT与环境交互,达到最大化奖励
  • 规划:通过有向无环图与启发函数寻找最佳路径,用于游戏开发等
  • 自然语言处理:词向量、情感分析、词性标注、机器翻译等

其他算法:

  • 演化算法:模拟生物进化过程,用于求解复杂优化问题
  • 细胞自动机:利用规则演化一维或二维细胞空间,用于模拟复杂系统
  • L系统:一种形式语言及其解析软件,用于植物生长模拟
  • VI算法:一种启发式视觉嵌入算法,用于知识表示与推理
  • 块链算法:一种去中心化数据结构,用于构建区块链与加密货币
  • MapReduce算法:一种流行的云计算与大数据处理框架
  • 置信区间算法:用于统计分析与机器学习中计算置信区间
  • EM算法:一种神经网络训练算法,用于最大化模型对观测数据的似然估计
  • 蒙特卡罗算法:一种随机模拟算法,用于求解复杂系统不可解决的确定性问题
  • 拟牛顿法:一种二阶优化算法,通过估计hessian矩阵实现快速收敛
  • 协方差矩阵算法:用于计算随机变量之间的相关性矩阵,应用于统计分析与模式识别
  • 主成分分析:一种降维技术,用于提取数据集中主要信息,实现特征选择与数据压缩
  • 卡尔曼滤波:一种递归估计算法,用于对线性动态系统的状态估计
  • 阻塞算法:用于保证进程或线程访问临界资源的互斥,实现运行时的同步与互斥控制

并行算法:

  • fork/join 并行框架:用于并行计算中任务的拆分与合并
  • MapReduce算法:用于大数据云计算框架中的数据处理与计算
  • GPU并行算法:通过显卡实现矩阵、图形运算的并行加速
  • OpenMP算法:通过多线程实现共享内存系统的并行
  • MPI算法:通过消息传递实现分布式内存系统的并行
  • 股权证券化算法:用于将资产拆分成小份并行出售,实现风险分散

密码学算法:

  • DES/3DES算法:一种对称加密算法,用于信息安全
  • RSA算法:一种非对称加密算法,用于信息安全
  • DSA算法:一种数字签名算法,用于信息安全
  • ECC算法:一种基于椭圆曲线的密码算法,用于信息安全
  • MD5/SHA算法:一种哈希算法,用于信息摘要及校验

网络管理算法:

  • OSPF/BGP算法:用于网络路由选择与路径生成
  • Spanning Tree算法:用于生成网络中的最小生成树,避免网络循环
  • DNS算法:用于域名系统中的域名解析及缓存
  • ARP算法:用于以太网中IP地址到MAC地址的解析
  • DHCP算法:用于动态主机配置协议,实现IP地址的自动配置
  • SNMP算法:用于简单网络管理协议,实现网络设备的管理

机器人算法:

  • 通路规划算法:用于确定机器人从起点到终点的最佳路径,如A*算法
  • 运动控制算法:用于控制机器人各关节的运动,实现规划路径的跟踪
  • 定位算法:用于确定机器人在环境中的相对位置与朝向,如里程计与IMU
  • 环境建模算法:用于机器人感知周围环境,建立环境地图,如SLAM算法
  • 路径跟踪算法:用于控制机器人按规划路径行驶,如PID控制算法
  • 机器视觉算法:用于机器人识别环境中的物体,判断空间信息,如SIFT、HOG

生物信息算法:

  • Smith-Waterman算法:用于生物序列的局部比对,找出最优比对结果
  • Needleman-Wunsch算法:用于生物序列的全局比对,实现序列之间的比对
  • BLAST算法:一种生物序列搜索工具,用于快速在数据库中找出相似序列
  • Clustal算法:一种生物序列的多重比对工具,用于分析进化关系
  • MEGA软件:一种生物进化分析工具,利用距离矩阵实现序列的分类与进化树构建
  • PHYLIP软件:一种生物进化分析工具,实现序列的进化树构建与进化分析

其他算法:

  • ε-NFA算法:一种正则表达式到NFA的转换算法,用于正则表达式的匹配
  • AC自动机算法:一种字符串匹配算法,通过状态机实现多个模式串的快速匹配
  • KMP算法:一种字符串匹配算法,通过部分匹配表实现单模式串的快速匹配
  • 模拟退火算法:一种随机搜索优化算法,通过渐减温度逃离局部最优,寻找全局最优解
  • PSO算法:一种基于群体智能的优化算法,通过个体与群体飞行寻找到达最优位置

数据挖掘算法:

  • Apriori算法:一种频繁项集挖掘算法,用于关联规则学习
  • FP-Growth算法:一种频繁项集挖掘算法,通过FP树实现高效挖掘
  • K-均值算法:一种聚类分析算法,将数据划分为K个簇
  • 主成分分析:一种降维算法,通过特征值分解实现
  • Latent Dirichlet Allocation:一种主题模型算法,用于文本主题挖掘
  • 支持向量机:一种监督学习算法,通过最大间隔分离超平面实现分类与回归
  • 朴素贝叶斯:一种分类算法,基于贝叶斯定理与特征条件独立性假设
  • 决策树:一种分类与回归算法,通过树形结构实现预测
  • 随机森林:一种集成学习算法,通过随机森林实现提高分类与回归性能
  • PageRank算法:一种网页排名算法,用于搜索引擎的网页权重计算

推荐算法:

  • 协同过滤算法:一种推荐算法,通过用户兴趣相似性实现推荐
  • 基于内容的推荐:一种推荐算法,通过内容相似性实现推荐
  • 神经网络推荐:一种推荐算法,通过神经网络学习用户兴趣实现推荐
  • 矩阵分解算法:一种推荐算法,通过矩阵分解获取用户兴趣实现推荐
  • PageRank算法:一种推荐算法,通过网页链接构建兴趣图谱实现推荐
  • K-近邻算法:一种推荐算法,通过用户相似邻居兴趣实现推荐
  • 混合算法:综合多种算法优点,提高推荐性能,如协同过滤+内容推荐。

计算社会学算法:

  • 小世界模型:用于研究人际网络中节点之间的最短路径
  • 群体智能模型:用于模拟个体之间相互作用,产生群体智能
  • 传播模型:用于研究信息在社会网络中的传播,如SI、SIS、SIR模型
  • Barabási-Albert模型:用于生成无标度网络,模拟复杂网络的演化过程
  • Markov model:用于研究状态之间的转移概率,预测网络的演化趋势

计算生物学算法:

  • BLAST算法:一种生物序列搜索工具,用于在数据库中快速查找同源序列
  • Smith-Waterman算法:一种生物序列局部比对算法,用于找出最优比对
  • Needleman-Wunsch算法:一种生物序列全局比对算法,用于序列比对
  • Clustal算法:一种生物序列多重比对算法,用于分析序列的进化关系
  • PHYLIP算法:一种生物序列进化分析软件,用于构建进化树
  • MEGA软件:一种生物序列进化分析软件,用于构建进化树与进化分析
  • DNA序列装配算法:用于 fragment 拼接成完整的 DNA 序列
  • 编码区识别算法:用于识别基因组序列中的编码区、内含子与外显子区间
  • SNPs检测算法:用于检测基因组或替代亚基因组中的单核苷酸变异
  • 马尔科夫链蒙特卡罛算法:用于模拟生物序列的演化过程,重构祖先序列

计算化学算法:

  • 分子力场算法:用于计算分子内各原子间的相互作用力,分析分子结构
  • 分子动力学算法:用于模拟分子在一定温度及时间尺度下的运动轨迹
  • 拓扑优化算法:用于搜索分子的空间构型,找到能量最低的构型
  • 化学反应动力学算法:用于研究化学反应速率与反应机理,预测产物
  • 定量构效关系算法:用于建立化合物结构与性质之间的定量模型
  • 化学信息学算法:用于分析和总结大量化合物数据,发现数据间的关联规律

计算经济学算法:

  • 泰勒规则算法:用于预测量化宏观经济变量的变化趋势,如GDP
  • 随机游走算法:用于模拟金融时间序列的随机变化,预测股价变动
  • CAPM模型:用于计算资产的期望收益率,评估资产定价是否合理
  • 马尔科夫过程:用于预测宏观经济变量之间的转移概率,研究经济周期
  • 向量自回归模型:用于研究多个时间序列变量之间的动态联系,预测趋势
  • 时滞模型:用于研究经济变量之间的动态因果关系,判断变量的先行性
  • 联立方程模型:用于研究宏观经济变量的动态互动机理,判断政策效果
  • 震荡器模型:用于模拟经济变量周期性波动的幅度与频率,研究周期机理
  • 阿隆索效应:用于解释通货膨胀与失业率之间的动态关系,作为政策参考

计算金融学算法:

  • 时间序列模型:AR、MA、ARMA、ARIMA,用于预测金融时间序列的变动趋势
  • GARCH模型:用于预测金融时间序列的波动率,研究金融市场的波动性
  • 随机游走算法:用于模拟股票价格等金融变量的随机变化过程
  • 蒙特卡罗算法:用于对复杂金融工具进行风险分析,当实际模型难以解析时
  • 动态规划算法:用于选择投资组合且最大化投资收益,解决资金配置问题
  • 蚁群算法:用于搜索投资策略空间,找到潜在的最优投资策略
  • 神经网络算法:用于学习金融时间序列的复杂模式,实现金融预测

控制算法:

  • PID控制算法:一种广泛用于工业控制的算法,通过比例、积分、微分控制量实现控制
  • LQR控制算法:一种线性二次型调节算法,用于控制线性系统
  • H∞控制算法:一种 robust 控制算法,可以抑制外部噪声的影响,适用于不确定系统
  • 变结构控制算法:一种非线性控制算法,通过切换不同的控制结构实现控制
  • 自适应控制算法:一种智能控制算法,可以根据系统的变化自动调整控制参数
  • 神经网络控制算法:一种智能控制算法,通过神经网络实现对复杂系统的控制
  • 模糊控制算法:一种智能控制算法,利用模糊逻辑实现对不确定系统的控制
  • 广义预测控制算法:一种先进控制算法,预测不同控制量下的系统响应,选择最优控制输入

信号处理算法:

  • 傅里叶变换:用于将信号从时域转换到频域,实现过滤、频谱分析等
  • 小波变换:一种时频分析工具,用于分析非平稳信号
  • 数字滤波器:用于滤除信号中的噪声与干扰分量,如FIR、IIR滤波器
  • K均值算法:用于对信号进行向量量化,实现数据压缩
  • LPC算法:一种语音分析与合成算法,通过预测谱实现信号处理
  • MFCC算法:一种语音特征分析算法,基于人耳听觉模型
  • 奇异值分解:用于信号分离与降噪,提取信号的主要特征分量
  • 隐马尔科夫模型:用于模拟时间序列信号的生成机制,预测未来信号分量
  • bispectrum分析:用于研究信号的二阶统计特性,分析信号的非线性耦合

图算法:

  • DFS/BFS算法:用于遍历图中的所有节点,实现搜索与路径查找
  • Dijkstra算法:用于查找加权图中的最短路径,解决单源最短路径问题
  • A*算法:一种启发式搜索算法,用于在图中查找从起点到终点的最佳路径
  • Prim算法:用于在加权图中查找最小生成树,解决最小权重生成树问题
  • Kruskal算法:用于在加权图中查找最小生成树,基于割的贪心算法
  • 拓扑排序算法:用于对有向无环图进行排序,按节点间的依赖关系排序
  • 最小割算法:用于在流网络中查找源点到汇点的最小割,实现网络流控制
  • 最大流算法:用于在流网络中查找源点到汇点的最大流,实现网络流分配

图像处理算法:

  • 边缘检测:Sobel、Prewitt、Canny 算法,用于检测图像中的边缘
  • 灰度变换:线性变换、对数变换、伽马变换等,用于修改图像灰度
  • 滤波处理:中值滤波、高通滤波、低通滤波、Butterworth等,用于滤除图像噪声
  • 图像分割:阈值分割、边缘分割、区域生长等,用于分割图像成有意义的区域
  • 图像压缩:JPEG、PNG、GIF等,用于减少图像所占存储空间
  • 图像修复:中值滤波、PDE等,用于修复图像中的小划痕或噪点
  • 特征提取:SIFT、SURF、ORB等,用于从图像中提取有意义的特征
  • 图像配准:通过图像特征匹配不同视角下的图像,用于图像拼接或变化检测
  • 图像识别:通过机器学习对输入图像进行分类或者识别物体

压缩算法:

  • Huffman编码:一种可变字长编码算法,用于实现数据的无损压缩
  • LZ77/LZ78算法:一种词典方法数据压缩算法,通过字符串替换实现压缩
  • DEFLATE算法:一种广泛应用于文件压缩的算法,结合LZ77/Huffman 编码
  • JPEG算法:一种有损图像压缩算法,基于DCT变换与量化实现压缩
  • MP3算法:一种有损音频压缩算法,基于时域与频域工具实现压缩
  • MPEG算法:一种视频压缩算法,用于有损动态图像的高度压缩

加密算法:

  • DES算法:一种对称加密算法,基于分组加密技术,密钥长度为56位
  • 3DES算法:一种对称加密算法,通过三重DES运算增强算法安全强度
  • AES算法:一种对称加密算法,基于分组加密技术,密钥长度为128/192/256位
  • RSA算法:一种非对称加密算法,基于大整数分解实现,用于数字签名与加密
  • ECC算法:一种非对称加密算法,基于椭圆曲线,相比RSA更简单更安全
  • MD5算法:一种不可逆加密算法,产生128位哈希值,用于信息校验
  • SHA算法:一种不可逆加密算法,SHA-1/SHA-2,产生160-512位哈希值

并行算法:

  • 消息传递接口:用于分布式内存系统的进程通信与并行
  • 共享内存:通过多线程访问共享数据,在一台机器上实现并行
  • GPU并行:通过显卡上的多核实现矩阵与图形运算的并行加速
  • MapReduce:用于云计算环境下的大规模数据处理与并行
  • MPI:用于分布式集群中进程间的通信与并行,实现跨机器的并行
  • Pthreads:用于多线程环境下进程内的线程管理与并行
  • OpenMP:用于共享内存系统中多线程的自动并行,通过pragma指令实现

Dubbo2.6.3中的RpcContext和ContextFilter

本文介绍了Dubbo2.6.3中的RpcContext和ContextFilter,以及在使用调用链的跟踪工具时出现的问题。通过代码分析,发现Dubbo的attachment是通过ThreadLocal来传递信息,因此在节点丢失时会出现错误的调用关系。同时,本文也提供了相关代码。

缘起

起因,我们在使用调用链的跟踪工具的时候发现这么一个情况。

有下面一个三个模块的系统,A调用B,B调用C,调用都是Dubbo接口调用。

1
2
graph LR
A --> B --> C

通常来说现在大部分的调用链工具都是通过字节码增强,通过ThreadLocal来保存Trace的信息,然后通过调用协议的一些特性在各个节点之间传递。

比如在dubbo中,trace信息就是通过attachment来传递。

单在我们实施的时候出来一点意外,忘记给B模块没有安装agent。

就出现下面的一个错误的调用关系。

1
2
graph LR
A --> C

根据往常的经验中,假如在系统中丢了节点,就会导致调用链断开,而不是错误的连接起来。有一份错误的数据带来的危害可能比没有数据更糟糕。

原因

直到看了dubbo的代码才发现问题。在dubbo的设计中attachment就是通过ThreadLocal来传递信息,于是就把Trace的也顺带的带上了。至于后续如何识别出来还需要另外想办法。

代码不多,全部贴上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.dubbo.rpc.filter;

import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.Filter;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Result;
import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.dubbo.rpc.RpcInvocation;
import com.alibaba.dubbo.rpc.RpcResult;

import java.util.HashMap;
import java.util.Map;

/**
* ContextInvokerFilter
*/
@Activate(group = Constants.PROVIDER, order = -10000)
public class ContextFilter implements Filter {

@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Map<String, String> attachments = invocation.getAttachments();
if (attachments != null) {
attachments = new HashMap<String, String>(attachments);
attachments.remove(Constants.PATH_KEY);
attachments.remove(Constants.GROUP_KEY);
attachments.remove(Constants.VERSION_KEY);
attachments.remove(Constants.DUBBO_VERSION_KEY);
attachments.remove(Constants.TOKEN_KEY);
attachments.remove(Constants.TIMEOUT_KEY);
attachments.remove(Constants.ASYNC_KEY);// Remove async property to avoid being passed to the following invoke chain.
}
RpcContext.getContext()
.setInvoker(invoker)
.setInvocation(invocation)
// .setAttachments(attachments) // merged from dubbox
.setLocalAddress(invoker.getUrl().getHost(),
invoker.getUrl().getPort());

// mreged from dubbox
// we may already added some attachments into RpcContext before this filter (e.g. in rest protocol)
if (attachments != null) {
if (RpcContext.getContext().getAttachments() != null) {
RpcContext.getContext().getAttachments().putAll(attachments);
} else {
RpcContext.getContext().setAttachments(attachments);
}
}

if (invocation instanceof RpcInvocation) {
((RpcInvocation) invocation).setInvoker(invoker);
}
try {
RpcResult result = (RpcResult) invoker.invoke(invocation);
// pass attachments to result
result.addAttachments(RpcContext.getServerContext().getAttachments());
return result;
} finally {
RpcContext.removeContext();
RpcContext.getServerContext().clearAttachments();
}
}
}

用AI写了个生成多行字符串的工具

https://images.unsplash.com/photo-1547042591-aae98619aab5?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb

在编程中,很多时候我们需要处理多行文本,例如读取文件内容、构建HTML或XML等,而多行字符串的需求一直都存在。使用多行字符串可以轻松地在代码中嵌入多行文本,使得代码更加清晰易懂。因此,多行字符串是非常实用的编程工具之一。

Java中的多行字符串特性要JDK 15+,这可能会对一些项目造成限制。网上也找了也有一些解决方案,链接附在末尾。

multiline-string这个思路也有点意思,但是不支持Java 11。于是就决定自己也写一个看看。

prompt: 写一个Java javax.annotation.processing.Processor例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 定义注解
@Retention(RetentionPolicy.SOURCE)
public @interface Hello {
}

// 实现 Processor
@SupportedAnnotationTypes({"in.code123.Hello"})
public class HelloProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// 扫描 Hello 注解
for (Element elem : roundEnv.getElementsAnnotatedWith(Hello.class)) {
// 生成代码
processingEnv.getFiler().generateJavaFile(elem);
}
// 返回 true 表示成功处理
return true;
}
}

例子基本上把框架写了出来,但有不少胡说八道的成分。比如凭空造了一个 generateJavaFile 方法。但是这个是关键,我开始想在原类中直接修改变量的值,或者增加一个方法,中间AI推荐JavaPoet类库,asm的类库,但是最终都没有搞定。希望有经验的朋友不吝赐教。

最后退而求其次,决定生成一个新的类,然后再静态导入方法。

1
2
3
4
5
6
7
8
9
10
11
12
import static io.code123.MultilineUtils.*;

...
/**
* SELECT * FROM user
* WHERE ID = ?
*/
@Multiline
String queryUser;
...

System.out.println("queryUser" + queryUser());

**TIPS:**记录过程中的几个tips。

  1. processingEnv.getElementUtils().``getDocComment(element) 可以取到字段或者类的注释,不包含 /** 等字符
  2. 在构建过程process方法可能会多次调用到,导致最后processingEnv.getFiler().createSourceFile("io.code123.MultilineUtils") 方法时候会报重复创建的错误。具体为什么会多次调用也还不清楚,第一次会传入一个空的elements列表。

https://github.com/adrianwalker/multiline-string

Java 8 multiline string example - Softhints

0%