/images/avatar.jpeg

《养虾者说》

永州之野产异蛇,柳子已言之详矣。今网络之域有异虾焉,名曰OpenClaw,其形赤螯如钩,其性通灵善务。或曰:“此虾能代耕、代织、代贾、代弈,虽千里之遥,驱策如臂使也。”然其害亦不可不察,余闻而志之。

2025年全球 MoonBit 编程创新赛:《中国象棋战役版》开发技术揭秘:位运算驱动的极简架构

MoonBit 编程创新赛与中国象棋战役版

一、缘起:从井子棋到象棋战役

  • 2024年MGPIC赛事中,CS赏金猎手战队曾基于wasm4开发井子棋游戏,却因平台限制无法实现复杂象棋逻辑而遗憾搁置。2025年赛事规则迎来关键突破——允许结合JavaScript构建前端界面,这为复杂交互打开了大门。

RAC-Python进程假死根本原因分析

问题现象

  • 一个Python进行执行特定操作时,CPU占用100%。有阻塞情况发生,无法处理其它任务。服务状态是正常的。服务进程并没有崩溃。

分析原因

问题定位

  • 由于服务日志与系统日志没有报任何错误信息,给问题排查定位带来了一定的阻碍。
  • 因此,借助Python 程序的采样分析器py-spy来帮助我们排查问题,py-spy主要使用Rust语言编写。开销低,使用另外的进程对Python程序监控,无需插桩等改动代码, 绿色无污染,可以安全的对生产代码作监控。通过生成的火焰图可知,程序阻塞在一个re的正则函数上。 /20241026-rac-python%E8%BF%9B%E7%A8%8B%E5%81%87%E6%AD%BB%E6%A0%B9%E6%9C%AC%E5%8E%9F%E5%9B%A0%E5%88%86%E6%9E%90/640.webp

正则分析

  • 正则表达式的复杂度通常取决于其模式的长度和复杂性。当正则表达式包含多个非贪婪匹配和通配符,这通常会导致回溯(backtracking),尤其是在匹配失败时。回溯会增加正则表达式的执行时间,尤其是在输入文本较长的情况下。
  • 正则表达式的执行时间通常与输入文本的长度成正比。对于一个长度为 n 的输入文本,最坏情况下,正则表达式的复杂度可能是 O(n^2),尤其是在存在大量回溯的情况下。
  • 如果输入文本较短,且正则表达式的匹配路径较为简单,复杂度可能接近 O(n)。如果输入文本较长,且正则表达式包含多个非贪婪匹配和通配符,复杂度可能接近 O(n^2)。

测试验证

  • 分别观测数据规模为1,5,10,15,20 的正则处理的时间
  • 得到时间消耗分别为0.05s, 0.11s, 2,29s,18.89s, 81.97s
  • 直观感觉这是一个指数级别的增涨。为了更加直观观测,可以使用二次拟合(抛物线法)做个拟合图。 /20241026-rac-python%E8%BF%9B%E7%A8%8B%E5%81%87%E6%AD%BB%E6%A0%B9%E6%9C%AC%E5%8E%9F%E5%9B%A0%E5%88%86%E6%9E%90/Quadratic.png
  • 从拟合图可直观观测到, 前两个点增长较为平缓, 从第三个点开始,斜率徒增。以下是拟合代码。
import numpy as np
import matplotlib.pyplot as plt

# 给定的数据
x = np.array([1, 5, 10, 15, 20])
y = np.array([0.05, 0.11, 2.29, 18.89, 81.97])

# 计算二次多项式拟合的系数
coefficients = np.polyfit(x, y, 2)
a, b, c = coefficients

# 生成拟合曲线上的点
fit_curve = a * x**2 + b * x + c

# 绘制原始数据点和拟合曲线
plt.scatter(x, y, color='blue', label='Data points')
plt.plot(x, fit_curve, color='red', label='Quadratic fit')

# 添加图例和标签
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Quadratic Fit')

# 显示图形
plt.show()
  • 问题得到了定位与验证,是由于一个正则解析不合理导致。

解决方案

  • 对文本进行分段匹配,避免一次性匹配整个文本。

经验总结

  1. 对正则的处理一定要格外小心,尽量使用复杂度低的正则解析。若有复杂的解析表达式,尽可能对其拆分,分段处理。
  2. 需要对正则表达式进行测试,尤其是不同量级规模的文本。增加对文本规模的限制。
  3. 灵活运用py-spy等性能分析工具,提升排查问题效率

最后分享一段关于正则的笑话:

Nginx配置SSL证书

  1. 查看nginx启动用户和使用用户是否一致

ps aux | grep nginx

  1. 更改配置文件, 把 user www-data 改为 root

sudo vim /etc/nginx/conf/nginx.conf

  1. 重启服务

sudo service nginx restart

蓝桥 卷“兔”来袭编程竞赛专场-10仿射加密 题解

赛题介绍

挑战介绍

  • 仿射密码结合了移位密码和乘数密码的特点,是一种替换密码。它是利用加密函数一个字母对一个字母的加密。加密函数是  y=ax+b(mod m) ,且  a,b∈Zm  (a、b 的值在 m 范围内),且 a、m 互质。 m 是字符集的大小,例如以 26 个字母作为编码,则  m=26  时,a 只能是 1、3、5、7、9、11、15、17、19、21、23、25 其中之一,b 为 0-25 之间的一个值,包括 0 和 25。

蓝桥 卷“兔”来袭编程竞赛专场-09凯撒加密 题解

赛题介绍

挑战介绍

恺撒密码也称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。采用的是替换方法对信息中的英文字符循环替换为字母表序列中该字符后面或前面的第 N 个字符。例如当  N = 2  时,所有的字母 A 都会被替换成 C,B 替换成 D,以此类推。即字母表的对照关系如下:

蓝桥 卷“兔”来袭编程竞赛专场-08列置换加密 题解

赛题介绍

挑战介绍

  • 列置换加密是明文以每行固定字数(key 的字母种类数,一般情况下 key 会选择字母不重复的单词)一行一行写下,如果最后一行字数小于每行的固定字数,则使用特殊符号补充,这样就形成了一个矩阵。然后依照 key 的字母顺序对矩阵列的位置进行调整,最后再将排列好的列依次读取,得到密文。例如:
  • 明文: welcometolq
  • key: qiao
  • 补充字符: ,
  • 首先确定 qiao 有 4 个字母,长度为 4。然后按照 26 个英文字母的顺序对 qiao 进行编号,越靠前的字母编号越小,可以得到的编号依次是 4-2-1-3。
  • 然后对明文分行。每行 4 (key 的长度)个字母,则可以写成 4 列:
1234
welc
omet
olq,
  • 由于最后一行缺一个字母,就使用补充字符填充。
  • 最后根据 key 的编号顺序对矩阵的列顺序调整,就有:
4213
cewl
tmoe
,loq
  • 然后一列一列地依次读取内容,就得到密文:ct,emlwooleq
  • 解密的方式和加密时的顺序相反,通过字母总数和 key 的长度获得列数,其次根据列数将密文一列一列地展开,然后通过 key 的编号顺序调整列位置,最后一行一行读取内容就可以得到明文。

挑战目标

  • 补充文件  column_permutation.py  下  column_permutation_encryption(text)  函数中的 TODO 部分,使其实现我们需要的功能:
  • 输入一段文本,使用 key: qiao  和补充字符: , (英文逗号)对内容进行列置换加密,并将密文返回。
  • 如果输入的文本中没有内容,则返回  None 。
def column_permutation_encryption(text: str) -> str:
    """TODO
    """
    encryption_text : str = ''
    return encryption_text

挑战要求

  • 题目需使用 Python3 完成,不能使用标准库和第三方库。
  • 函数传入的 text 为字符串类型,可能为空、 None  等值。
  • 不得修改文件路径、文件名  column_permutation.py  以及函数名  column_permutation_encryption(text) 。
  • 请只保留文件  column_permutation.py  及文件中函数,不要添加测试或执行代码,避免检测时出错。
  • 线上环境调试代码时,请使用  python3 column_permutation.py  命令调用 Python3。

参考样例

# 样例 1
text = "welcometolq"; encryption_text = "ct,emlwooleq"
# 样例 2
text = "welcometolq "; encryption_text = "ct emlwooleq"
# 样例 3
text = "w"; encryption_text = ",,w,"
# 样例 4
text = None; encryption_text = None

注意:最终实现效果以完全满足要求为准,而不是仅满足如上样例。

蓝桥 卷“兔”来袭编程竞赛专场-07明码加密 题解

赛题介绍

挑战介绍

  • 清末,电报技术进入中国。上海大北水线电报公司在 1871 年选用了六千八百九十七个汉字,代以四码数字,编写成了中国最早的电报明码本。为了传输的内容可以保密,又设计出了将明码本加密的方法,于是就有了比较复杂的密码。后来,这种加密技术被应用在军事和商业情报机构中。
  • 加密的具体方法是:例如“布”这个字的电报电码为 1530,加密和减密的钥匙均为 9853。先用明码的四个数字分别与加密钥匙的四个数字相加,例如第一位数相加  1 + 9 = 10 ,凡 10 都作  0 ;第二位数相加  5 + 8 = 13 ,隐去 10,只作  3 ;第三位数相加  3 + 5 = 8 ;第四位数相加(如果是 0,则作 10 )  10 + 3 = 13 ,隐去 10,只作  3 。那么“布”的明码 1530 就成了密码 0383。解密时相反,使用密码减去解密钥匙的四个数字,即可获得明码,从而找到对应的文字。

挑战目标

补充文件  plain_code.py  下  plain_code_encryption(numb)  函数中的 TODO 部分,使其实现我们需要的功能: