Rainshaw's Blog - 折腾分享
type: channel
link: https://blog.gaoruixiao.com/category/share/
items: 制作 Debian12 全自动安装镜像
items: GPG 的正确使用姿势
items: centos 7 下升级自带 sqlite3
items: 在Django3中使用 pathlib.Path 生成 BASE_DIR 时，Pycharm 无法找到 静态文件
items: Kitty 简介
items: ubuntu 20.04 安装 rocm 和 tensorflow
items: ubuntu 压缩及加压文件命令
items: Typecho 插件——MacHighlight 代码语法高亮插件
items: Handsome 主题解决 CodePrettify 代码高亮插件与 Vditor 兼容问题
items: 使用百度云加速获取真实用户 IP

制作 Debian12 全自动安装镜像
type: item
date: 2024-03-10T21:28:56+08:00
description: 参考 附录 B. 使用预置自动进行安装 和 DebianInstaller/Preseed/EditIso - Debian Wiki准备工作安装依赖包安装 genisoimage, xorriso, qemu-system, 分别用于制作镜像，解压镜像和测试镜像apt install genisoimage xorriso qemu-system下载镜像wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.7.0-amd64-netinst.iso解压镜像xorriso -osirrox on -indev debian-12.*.iso -extract / isofiles制作全自动安全镜像创建自动安装配置文件将下面的内容保存为 preseed.cfg。可以看到root密码是123123，非常简单，但我关闭了ssh的密码登录，只能公钥登录，所以不用担心。#_preseed_V1 d-i debian-installer/language string en d-i debian-installer/country string CN d-i debian-installer/locale string en_US.UTF-8 d-i keyboard-configuration/xkb-keymap select us d-i netcfg/choose_interface select auto d-i netcfg/get_hostname string debian d-i netcfg/get_domain string d-i netcfg/wireless_wep string d-i mirror/protocol string http d-i mirror/country string maunal d-i mirror/http/hostname string mirrors.pku.edu.cn d-i mirror/http/directory string /debian/ d-i mirror/http/proxy string d-i passwd/root-login boolean true d-i passwd/make-user boolean false d-i passwd/root-password password 123123 d-i passwd/root-password-again password 123123 d-i clock-setup/utc boolean true d-i time/zone string Asia/Shanghai d-i clock-setup/ntp boolean true d-i partman-auto/method string regular d-i partman-auto-lvm/guided_size string max d-i partman-lvm/device_remove_lvm boolean true d-i partman-md/device_remove_md boolean true d-i partman-lvm/confirm boolean true d-i partman-lvm/confirm_nooverwrite boolean true d-i partman-auto/choose_recipe select atomic d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/confirm_nooverwrite boolean true d-i partman-md/confirm boolean true d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/confirm_nooverwrite boolean true d-i apt-setup/cdrom/set-first boolean false d-i apt-setup/non-free boolean true d-i apt-se…

GPG 的正确使用姿势
type: item
date: 2021-08-16T19:12:00+08:00
description: 关于 GPG 的基本概念，这里就不过多阐述了，没有基础知识的同学建议先学一些网络上的基础教程。要先对 GPG 有一定的基础理解。[scode type="yellow"]本文中生成的 GPG 密钥仅为示例使用，本人并不使用文中的密钥，请注意鉴别。[/scode]准备工作了解 GPG 基本概念，熟悉命令行操作安装好虚拟机或/和下载 Tails 系统镜像一颗追求信息安全的 ❤️核心思想平时只使用子密钥，将主密钥存储在受信的地方例如TPM或进行加密。创建主密钥首先创建一个新的 GPG 密钥对，一定要在虚拟机或者 Tails 或者你信任的电脑上操作。使用 --full-generate-key 和 --expert 来生成密钥对，由于 RSA4096 比 ECC Curve 25519 要安全一点，这里我们的主密钥使用 RSA4096，且只用来 Certify。rainshaw@ubuntu:~$ gpg --full-generate-key --expert gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) (7) DSA (set your own capabilities) (8) RSA (set your own capabilities) (9) ECC and ECC (10) ECC (sign only) (11) ECC (set your own capabilities) (13) Existing key (14) Existing key from card Your selection? 8选择 8 自定义用途Possible actions for a RSA key: Sign Certify Encrypt Authenticate Current allowed actions: Sign Certify Encrypt (S) Toggle the sign capability (E) Toggle the encrypt capability (A) Toggle the authenticate capability (Q) Finished Your selection? s Possible actions for a RSA key: Sign Certify Encrypt Authenticate Current allowed actions: Certify Encrypt (S) Toggle the sign capability (E) Toggle the encrypt capability (A) Toggle the authenticate capability (Q) Finished Your selection? e Possible actions for a RSA key: Sign Certify Encrypt Authenticate Current allowed actions: Certify (S) Toggle the sign capability (E) Toggle the encrypt capability (A) Toggle the authenticate capability (Q) Finished Your selection? q去掉 Sign 签名、Encrypt 加密用途，只保留 Certify 证明用途。RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (3072) 4096使用 4096位 RSA 密钥更安全，基本无法破解。Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in …

centos 7 下升级自带 sqlite3
type: item
date: 2021-07-04T14:48:32+08:00
description: 问题在 centos 7 上面运行 django 3.2 开发服务器时出现：django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).原因时系统自带 sqlite3 版本太低，解决方法是升级就可以了。升级由于 Centos 7 的 yum 源中 sqlite 版本过低，无法直接 yum update，所以才取编译升级。# 下载源码 wget https://www.sqlite.org/2021/sqlite-autoconf-3360000.tar.gz # 编译 tar zxvf sqlite-autoconf-3360000.tar.gz cd sqlite-autoconf-3360000 ./configure --prefix=/usr/local make && make install # 替换系统低版本 sqlite3 mv /usr/bin/sqlite3 /usr/bin/sqlite3_old ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3 echo "/usr/local/lib" > /etc/ld.so.conf.d/sqlite3.conf ldconfig sqlite3 -version再次启动运行 django 开发服务器就 ok 了。

在Django3中使用 pathlib.Path 生成 BASE_DIR 时，Pycharm 无法找到 静态文件
type: item
date: 2021-02-13T21:36:00+08:00
description: 问题描述Django 从 3.1 版本开始，在 setting.py 文件中默认使用 pathlib 生成 BASE_DIR，而 pycharm 很久前就被人报告在支持 pathlib 有 bug，详见以下链接https://stackoverflow.com/questions/64036715/django-pycharm-2020-2-2-not-resolving-static-files-when-using-pathlib-path-tohttps://youtrack.jetbrains.com/issue/PY-45244https://youtrack.jetbrains.com/issue/PY-13911https://youtrack.jetbrains.com/issue/PY-46523解决方案[scode type="blue"]截至目前（2021年2月13日pycharm2020.3.3）pycharm仍未修复此bug[/scode]将 STATICFILES_DIRS 写成如下形式即可STATICFILES_DIRS = [ BASE_DIR / 'static', './static/' ]

Kitty 简介
type: item
date: 2021-01-31T19:59:00+08:00
description: Kitty 简介Kitty is an open-source modular and extensible fuzzing framework written in python, inspired by OpenRCE’s Sulley and Michael Eddington’s (and now Deja Vu Security’s) Peach Fuzzer.Kitty 是一个 python 版本的模糊测试框架。其目标是帮助模糊测试特定的受害者。受害者通常运行于非TCP/IP通道上的私有和内部协议。特性模块性：fuzzer的每一个部分都是独立的，这意味着你能够用相同的监视代码监控不同的程序，用相同的载荷生成工具（aka Data Model）生成的数据可以在不同的信道中传递；扩展性：如过你想测试新的东西，不需要修改Kitty的核心代码。即便不是所有，大部分功能应该在用户代码中实现。这包括监视，控制以及和被fuzz的目标的通信；丰富的数据模型：数据模型的核心要丰富，能够描述高级的数据结构，包括字符串，哈希，长度，条件及其它。而且和其它框架一样，还要设计好，将来需要的时候可以扩展；状态性：支持多阶段的模糊测试。不仅要能描述单独消息的载荷应该是什么样，还要能描述消息的顺序，甚至按照顺序进行fuzzing；客户端和服务端fuzzing：假设你有一个配对的程序栈，你可以对服务端和客户端进行fuzz。这听起来是一个很高的要求，但实际上不是：只需要你像通常一样能够和目标通信即可；跨平台：可以在Linux，OS X和Windows上运行。框架结构kitty 主要架构如下图所示：Fuzzer +--- Model *--- Template *--- Field | +--- Target +--- Controller | | | *--- Monitor | +--- InterfaceFuzzerFuzzer 是最高级的控制结构，由三部分组成 Interface(可视化)、Target(控制被测试的对象)、Model(数据模型)。Fuzzer 从 Model 获取改变后的数据，执行数据交换，从 Target 获取测试报告，在需要时执行更多的操作。一般我们采用自底向上的构造方法，即最后配置 Fuzzer。根据被测试对象的属性，我们可以分别使用 ClientFuzzer 和 ServerFuzzer. Fuzzer 类常用 api：set_model(model) 为 Fuzzer 设置数据模型set_target(target) 为 Fuzzer 设置控制结构set_interface(interface) 为 Fuzzer 设置可视化start() 开始模糊测试stop() 结束模糊测试set_delay_between_test(delay_secs) 设置测试之间的间隙Model数据模型定义了 Fuzzer 要发送的消息的结构。 通常将消息分成几个部分（如头部、长度、负载），并包含这几部分的类型（如字符串、校验码、十六进制编码的32位整数）和这些部分之间的关系。此外，数据模型还描述了不同消息被联系起来形成模糊会话的顺序。数据模型还可以指定模糊发送消息的顺序。TargetTarget 模块负责管理与受测者有关的一切。其主要功能包括：管理 Monitors 和 Controller当受测者是一个 server 时，Target 模块通过向服务器发送请求并处理服务器可能返回的响应来启动模糊会话。当受测者是一个 client 时，Target 模块通过使客户端向服务器发起请求来启动模糊会话。服务器在stack的帮助下将向 client 发送一个模糊的响应。Target 类常用 api:set_controller(controller) 为 Target 设置控制器add_monitor(monitor) 为 Target 添加一个监控器ControllerController 负责将受测者控制到合适的状态以做好测试的准备。 Controller 也需要执行基本的监控，并需要报告受测者是否准备好进行下一次测试。MonitorMonitor 监控受测者的行为，它可以监控网络流量、内存消耗、串行输出或者其它任何内容。kitty.monitors 包提供了基本的监视器类 BaseMonitor，一般需要对其进行继承而不要直接实例化。继承了 BaseMonitor 的子类，建议对以下函数进行继承：__init__() 函数应先调用父类的构造函数进行初始化setup() 函数应对子类新增的变量进行配置后再调用父类的setup函数_monitor_func()函数会在setup函数调用并在新线程内进行无限循环直至发送终止命令，所以此函数一般用…

ubuntu 20.04 安装 rocm 和 tensorflow
type: item
date: 2020-12-10T15:18:00+08:00
description: 前言由于之前一直玩黑苹果，老黄的显卡只能停留在 High Sierra 系统，所以我一直用的 AMD 的显卡 Vega 56，最近由于期末大作业要炼丹，不得不说 AI 届 A 卡无人权，几乎完全都是老黄 CUDA 的天下，老黄这一手提前布局，高啊。正值双十一和双十二的时期，本来打算入手一枚 3070 或 3080，但无奈，当猴当的太称职了，抢了好久都没有买到，只能用已有的显卡炼丹了。要用 A 卡炼丹，只能用 ROCm，但 ROCm 支持的框架很少，不过幸好 Tensorflow 是有社区分支支持的。在配置环境过程踩了不少坑，这里记录一下。安装 ROCm先给出官方文档地址更新系统安装依赖sudo apt update sudo apt dist-upgrade sudo apt install libnuma-dev sudo reboot重启后继续执行下一步添加 ROCm 的 ppa repowget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | sudo apt-key add - echo 'deb [arch=amd64] https://repo.radeon.com/rocm/apt/debian/ xenial main' | sudo tee /etc/apt/sources.list.d/rocm.list更新源并安装 rocm-dkmssudo apt update sudo apt install rocm-dkms源速度较慢，这里建议挂代理sudo vi /etc/apt/apt.conf.d/proxy.conf Acquire{ HTTP::proxy "http://127.0.0.1:1080"; HTTPS::proxy "https://127.0.0.1:1080"; }装好后记得删掉设置权限sudo usermod -a -G video $LOGNAME sudo usermod -a -G render $LOGNAME sudo reboot必须要重启！添加 ROCm 环境变量echo 'export PATH=$PATH:/opt/rocm/bin:/opt/rocm/rocprofiler/bin:/opt/rocm/opencl/bin' | sudo tee -a /etc/profile.d/rocm.sh sudo reboot测试/opt/rocm/bin/rocminfo /opt/rocm/opencl/bin/x86_64/clinfo你应该可以从结果中看到你的显卡安装 tensorflow-rocm同样，先给出官方文档地址首先就是在系统上安装 python 环境，随你喜欢就行，你可以用 conda 也可以用 pyenv 当然直接用系统自带的 python3 也可以创建符合 tensorflow 的虚拟环境，建议 python3.7安装依赖包sudo apt update sudo apt isntall rocm-libs miopen-hip rccl安装 tensorflow-rocmpip install tensorflow-rocm测试import tensorflow as tf tf.__version__ tf.test.is_gpu_available()可能遇到的错误添加 ROCm 的 ppa repo 时wget -q -O - http://repo.radeon.com/rocm/apt/debian/rocm.gpg.key | sudo apt-key add - echo 'deb [arch=amd64] http://repo.radeon.com/rocm/apt/debian/ xenial main' | sudo tee /etc/apt/sources.list.d/rocm.list不要自作聪明的把 xenial 改成 bionic重启出现 HSA_STATUS_ERROR_OUT_OF_RESOURCESFailed to get user name to check for video group membership hsa api call failure at: /data/jenkins_workspace/compute-rocm-rel-2.9/rocminfo/rocminfo.cc:1102 Call returned HSA_STATUS_ERROR_OUT_OF_RESOURCES: The runtime failed to allocate the necessary resources. This error may also …

ubuntu 压缩及加压文件命令
type: item
date: 2020-12-10T14:35:00+08:00
description: 最近由于临近期末，开始做各种大作业，其中有一个炼丹项目，我就再次回到了 ubuntu 。这里记录一下各种压缩文件的压缩和解压的命令。.tar.tar 文件功能：对文件目录进行打包备份（仅打包不压缩）# 解包 $tar -xvf filename.tar # 打包目录 $tar -cvf filename.tar dirname.gz.gz 文件压缩# 解压 $gunzip filename.gz # 或 $gzip -d filename.gz # 压缩文件 $gzip filename.tar.gz .tgz# 解压 $tar -zxvf filename.tar.gz # 压缩目录 $tar -zcvf filename.tar.gz dirname # 解压到目录 $tar -C dirname -zxvf filename.tar.gz.bz2# 压缩文件 $bzip2 -zk filename # 解压 $bunzip2 filename.bz2 # 或 $bzip2 -d filename.bz2.tar.bz2# 解压 $tar -jxvf filename.tar.bz.Z# 解压 $ uncompress filename.Z # 压缩 $comporess filename.tar.Z# 解压 $ tar -Zxvf filename.tar.Z # 压缩 $ tar -Zcvf filename.tar.Z dirname.rar# 解压 $rar x filename.rar # 压缩 $rar a filename.rar dirname.zip# 解压 $unzip -O cp936 filename.zip # 压缩目录 $zip filename.zip dirname # 递归压缩 $zip -r filename.zip dirname[scode type="blue"]欢迎留言补充[/scode]

Typecho 插件——MacHighlight 代码语法高亮插件
type: item
date: 2020-12-05T19:57:00+08:00
description: [scode type="red"]应原插件作者的要求, 本插件已下架.[/scode][collapse status="false" title="下架"]前言Handsome从 v7.3.1 开始支持 Vditor 这一 Markdown 解析器，但 CodePrettify 插件作者一直没有给出与 Vditor 兼容的方法，我之前魔改过一些地方使得两者能够共存，参见[post cid="85" /]但仍然存在一些小的问题，于是萌生了自己做一个代码语法高亮插件的想法，便有了 MacHighlight简介从插件的名字可以看出来，本插件主要是 Mac 风格的高亮样式，如果您有其他需求，可以自行定制 （其实直接将 CodePrettify 的 css 样式拷贝过来就能用，但为了减少兼容工作量，我这里就仅对三个 Mac 风格做兼容工作了）MacHighlight 是一款基于 prismjs 的代码语法高亮插件，支持众多常见的代码语言高亮显示，共提供3种代码高亮风格自由切换，支持显示代码语言类型、行号，以及支持复制代码到剪切板功能，需魔改 Handsome 以使得与 Vditor 兼容。使用方法前往Releases 下载最新版本插件解压后重命名文件夹为 MacHighlight ，再上传至网站的 /usr/plugins/ 目录下启用插件，选择喜欢的样式替换 /usr/themes/handsome/assets/css/handsome.min.css 和/usr/themes/handsome/assets/js/core.min.js文件，相关文件在下方给出。刷新 CDN 缓存，清除浏览器缓存，或者点击 Handsome 插件中的更新离线缓存按钮。下载[scode type="yellow"]仅针对 Handsome v7.3.1 版本进行了测试，如您遇到样式问题，请留言反馈，并附加演示地址。（评论区未启用 Markdown 解析，直接填写网站链接或截图链接即可）[/scode]举例[scode type="green"]绿色提示[/scode]php 代码正常高亮：\```php(语言类型必填) <?php echo 'hello jrotty!'; ?> \``` 删除上边代码中的\流程图正常渲染：sequenceDiagram participant Sender participant Receiver Receiver ->> Receiver: start, create files Sender ->> Sender: start loop send message Sender ->> Sender: read char, visit int(char) files Sender ->> Receiver: send the char(char) Receiver ->> Receiver: count visited files end Sender ->> Sender: end Receiver ->> Receiver: end致谢本插件样式代码来自 @Xcnte 大佬的 CodePrettify 插件，在此表示感谢🙏其他如您遇到样式问题或其他问题，均可在下方留言给出，记得附带演示地址哦～[/collapse]

Handsome 主题解决 CodePrettify 代码高亮插件与 Vditor 兼容问题
type: item
date: 2020-11-21T19:42:00+08:00
description: [scode type="red"]本文内容可能已经过期，或存在部分bug，新方法参见[/scode][post cid="89" /]前言CodePrettify 是一款基于prismjs的代码语法高亮typecho插件，支持众多常见的代码语言高亮显示，共提供11种代码高亮风格自由切换，支持显示代码语言类型、行号，以及支持复制代码到剪切板功能。Handsome 是友人C为 typecho开发的一款主题，Handsome最新版本引入了Vditor这一Markdown解析器，支持了许多新的语法。而据 CodePrettify 作者 Xcnte 的描述，近期内他不考虑做 Vditor.js的兼容，如果要用 CodePrettify 这一插件的话，就要使用 typecho 自带的 markdown 解析器。这样也就无法使用新解析器带来的诸多特性了。这对我来说简直无法忍受，于是花费了一些时间，做了下兼容工作。兼容方法启用 CodePrettify 插件，并进行相应配置（一定要设置成显示行号！）。删除原作者让您添加到主题插件中的 Pjax 回调函数。替换 /usr/themes/handsome/assets/css/handsome.min.css 和/usr/themes/handsome/assets/js/core.min.js文件，相关文件在下方给出。刷新 CDN 缓存，清除浏览器缓存，或者点击 Handsome 插件中的更新离线缓存按钮。下载[scode type="yellow"]仅针对 Handsome v7.3.1 版本进行了测试，如您遇到样式问题，请留言反馈，并附加演示地址。（评论区未启用 Markdown 解析，直接填写网站链接或截图链接即可）[/scode]举例\```php(语言类型必填) <?php echo 'hello jrotty!'; ?> \``` 删除上边代码中的\

使用百度云加速获取真实用户 IP
type: item
date: 2020-11-07T10:39:10+08:00
description: 前不久写了一篇如何在使用 Cloudflare 加速时获取用户的真实 IP[post cid="79" /]由于本博客域名已经备案，于是我使用的是 Cloudflare 国内合作商——百度云加速，为网站提供加速服务，整体使用感觉还不错。百度云加速免费版套餐每天 10G 流量，完全够使用，并且支持 cname 接入，很方便。不过仍然存在着和使用 Cloudflare 一样的问题，即网站的访问日志中都是百度云加速的 IP 地址，并不是客户的真实 IP 地址，这里给出解决办法。解决办法服务器使用的是宝塔面板编译安装的 nginx，默认编译了 gx_http_realip_module 模块，所以只需要到 /www/server/nginx/conf 目录下新建一个名为 baidusu.conf的文件，并将以下内容写入：set_real_ip_from 119.188.9.0/24; set_real_ip_from 42.236.93.0/24; set_real_ip_from 220.170.185.0/24; set_real_ip_from 115.231.186.0/25; set_real_ip_from 183.232.51.0/24; set_real_ip_from 61.182.137.0/25; set_real_ip_from 112.25.90.0/24; set_real_ip_from 59.51.81.128/26; set_real_ip_from 222.216.190.0/24; set_real_ip_from 122.190.2.0/24; set_real_ip_from 125.39.239.0/24; set_real_ip_from 183.61.177.0/24; set_real_ip_from 183.61.236.0/24; set_real_ip_from 124.95.168.128/26; set_real_ip_from 124.95.191.0/24; set_real_ip_from 58.211.2.0/24; set_real_ip_from 117.34.13.0/24; set_real_ip_from 150.138.150.0/24; set_real_ip_from 150.138.149.128/25; set_real_ip_from 157.255.25.0/24; set_real_ip_from 113.207.101.0/25; set_real_ip_from 111.32.135.0/25; set_real_ip_from 42.81.6.0/25; real_ip_header X-Forwarded-For;然后到 nginx 的配置文件中，在 http 模块下添加一行 include baidusu.conf 即可。