搞个大新文

菜单

菜单

  • 博客
  • 邮件
  • 订阅
  • 登陆

页面

  • About
  • 关于本站
  • 分类
  • 友链
  • 技术栈(超级持续更新
  • 时光轴
  • 登录
  • 追番
  • 隐私政策

最近的帖子

  • 操作系统的边界在哪里
  • PythonSTG开发心路
  • 东方Project同人例会录制/直播指北
  • 张量分析大观
  • ConvNext品鉴-东方Project角色识别

档案

  • September 2026
  • May 2026
  • March 2026
  • February 2026
  • December 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025

September 2026

  • 操作系统的边界在哪里

    引言哪里是操作系统?Linux Kernel 的维护者说,提供Syscall的是操作系统。汇编爱好者说,提供系统调用库函数的下面的是操作系统。ArchLinux佳豪说,上面这些加上一些Terminal,一些Network Manager,和一个Pacman,就是操作系统。Ubuntu用户说,这个桌面和内置的小软件以下是操作系统。余承东说鸿蒙是操作系统。正在许愿Vibe coding的文科生说,deepseek帮我复刻一些windowsxp。操作系统的上面。在内存中心呼唤系统的自陷要找到操作系统的上边界,让我们深入所谓用户软件和操作系统在书上所定义的,发生切换的一瞬间。目态与管态要理解为什么会有“切换的瞬间”,就要知道为什么需要这么做,他们在切换什么。另外的一组名字叫做用户态和内核态,原因很简单,互联网上的软件千千万万,良莠不齐,需要给内核操作和用户操作彻底隔离开(不只是在两种状态,后面会提到)。包括系统指令的地址空间都是用户不可达的,需要让用户软件不触及操作系统的正常允许。你也不想qq崩溃直接给系统拉闸了吧。但是那些系统方法总得用吧,不能用户程序啥也不做,所以需要用一种特殊的方式来切换系统模式系统调用对于一般的程序员,能够碰到最下面的地方就是库函数,这里我们以c语言举例。比如write()方法,write(fd, buf, count)传递参数首先这几个参数(标识符,写入内容地址头,长度)会被重写为汇编能识别的参数,然后调用write函数mov edx, 5 lea rsi, [rip + hello] mov edi, 1 call write 注意这下面的call是正常汇编的调用函数,此时PC的值改为call+指令长+偏移指向write函数开头。返回地址(RSP)压入用户栈。此时我们的参数们还在刚才塞进去的寄存器里面。执行系统调用此时执行系统调用(ABI)前,必须填写以下的规范化系统调用参数,这个过程具体有点太具体了,远远超过了408会考察的范围,总之会把刚才的参数传递进去。RAX = 系统调用号 RDI = 参数1 RSI = 参数2 RDX = 参数3 R10 = 参数4 R8 = 参数5 R9 = 参数6在这一堆参数传递完毕后,终于到了那传说中操作系统的边界syscall硬件隐指令首先硬件会自动关中断,保存现场(原始PSW…

    永久链接至 “操作系统的边界在哪里”

May 2026

  • PythonSTG开发心路

    前言相关的文档参考详见PySTG DocsPython + OpenGL 东方 Project 风格弹幕射击游戏引擎文档快速开始仓库地址在GitHub - qwqpap/PythonSTG: Finally we find that python has invaded TouhouFinally we find that python has invaded Touhou. Contribute to qwqpap/PythonSTG development by creating an account on GitHub.GitHubqwqpap这里还是主要介绍一下心路历程和技术细节啊嗯。怎么来的最开始想做这个的来源是2024年末想要用Luastg搓点好玩的弹幕小游戏在你矿1.5次例会上面玩,最开始就是一直用的Luastg,包括在2025年的时候在第二届百校天则大大方方卖的东方做题狙也是这么来的。当时还非常非常原始,用Luastg的原版demo爆改了三面和一些ui贴图啥的就拿来卖,感觉也对不起当时花金币的游客。之后就沉寂了很久,期间倒是一直有厚米催我更新,但是比较懒。直到后面办九州拾遗,要做一个惊天地泣鬼神的牛逼stg,就想着直接整个重写一次得了,来接入Nonebot,其实现在想想我估计Luastg也能支持这个,但是总是有反复造轮子的快乐在里面的。于是去年考研结束后就开始开发这个,最开始想法是用Rust做底层计算,再以一个Python库的形式供流程脚本调用,事后发现Rust的严格内存管理和我的狂放风格不是很搭边。于是捡起来了大一用过的Numba+Numpy的组合直接在Python内部实现弹幕计算,惊人的,效率高到难以想象,甚至比Luastg和Zun自己的cpp引擎效率还要高得多。这点让我很高兴。高速的PythonGLI的罪恶通常认为Python是非常低效的语言,因为使用了解释器导致无法预编译程序,所以效率瓶颈在解释器的执行速度上,所以在面对超大数组的遍历等操作时就会被别的非解释型语言拉开非常大的差距。在多线程互锁行为中,Python提供了非常复古的GIL方式,通过上锁来确保每次访问机器码的只有一个进程,这还不是最卡顿的。CPython采用了时间片轮转算法来控制各个进程的使用,并且每5ms就将当前执行之进程直接踹死到就绪队列,在本例的计算密集行为中…

    永久链接至 “PythonSTG开发心路”

March 2026

  • 东方Project同人例会录制/直播指北

    前言 遗憾的,虽然之前许多北京地区的东方例会都是我录制和直播,但是我要毕业了。 如果有错误内容请务必向我指出,发送邮件给我就好 [email protected] 这篇文章旨在让大家能够少踩坑,在尽可能减少预算的前提下最高质量地保存这一美好的活动回放。 注意,前提是你需要有一台支持外录功能的相机,这并不会特别昂贵。 相机 这一部分会简要介绍相机的传感器,镜头焦距,以及其对于录制的影响,如果你已经熟练了解这一部分,请直接跳过 认识你的传感器尺寸 通常我们以“全画幅”为标准,全画幅相机通常意味着比较多的进光量,也就意味着更好的画质,当然这不是必须的。 所以还会有“半画幅”,也叫做APS-C画幅,字面意思其传感器尺寸会小一些,与此同时画质会略弱(相对吧)。 再在这之下还有M43画幅,一英寸画幅,这都更加迷你了。通常在小于M43画幅的机器可能使用的是“不可更换镜头” 关于镜头我们最需要关注的是焦段。 认识你的镜头焦段 通常我们以全画幅机器为所有焦段的标准。越长的焦段,你能录制的范围就越窄,也就是最直观的”放得越大“,让我在这里引用佳能的一个小图片。 那么同样的,对于焦段越小的镜头,其能录制的就越广。 如果想要变大变小不得了,你需要变焦镜头,这也是录制例会最理想的镜头类型,通过变焦这个操作来实现可以放大拍特写,也可以缩小拍全景。 这里有一些值得注意的点。 首先是光圈,不可避免的光学问题导致变焦镜头光圈会小一点,所以理所应当导致进光量小,画质差一些。这里就不赘述虚化问题了,一般录制过程中不会有大的影响。 其次是镜头的焦段推荐,一般我认为需要在32mm以下到最大100mm以上的变焦镜头是比较方便的(这里是全画幅的焦段) 如果你的画幅不是全画幅,注意注意,需要把镜头的物理焦段乘上具体的裁切系数才是实际的焦段,这需要你自己查。 必要的外部设备 在开始录制之前,你必须要准备必要的外部设备来支持这一场非常长久的录制。 电脑 为了录制和直播,电脑是必不可少的,需要安装一个叫做OBS的软件,这个我们之后再慢慢说。 同时,电脑的硬盘需要足够大,通常对于一般半天的东方例会我推荐500GB以上的剩余磁盘大小。 三脚架 我去哥们,你总不能用手端着吧。 你需要一个自己用着舒服的三脚架,这并没有什么特别的要求,非常主观,自己高兴就好。 记得带上快拆版。 假电池 如果 如果你的廉价老相机的供电接口并不稳定…

    永久链接至 “东方Project同人例会录制/直播指北”
  • 张量分析大观

    前言 其实是这个B课重修了,正好考完研仔细研究一下到底在说什么事情,也借这个机会好好复习一下一些基本的张量表示方法。 张量是怎么来的 标量-0维张量 在最开始的时候,初中物理接触到的东西是非常简单的物理量,举一个小例子 ρ⋅V=m 对于均匀连续物体的密度与质量,满足以上一个简单的表达式。 我们会说密度与质量都是一个标量,标量代表着它没有任何的方向性,是一个很单纯的数字。 那我们更进一步,注意到这个式子 I=U⋅(R1​) 似乎也是一个标量表达式,但是隐隐约约似乎还记得电流是有方向的,于是我们引入带有两个方向的电场强度这个变量。 矢量-1维张量 对于经典的:物体的动量,我们还记得这个式子 P=mv 这个式子中动量与速度都是一个带有方向与大小的矢量。 矢量我们可以给它写开,比如三维情况,速度就会有三个分量,二维就有两个,但是注意 我们说的现实世界的维度和张量的维度没有任何关系,此处的矢量依旧是一个一维的张量。 二维张量 J=σE 其中σ是电导率这个单位。 所以这个时候需要思考的是,电导率要如何表达出来。 对于各向同性材料,不难想象,电流的方向与电场的方向一定是一致的,也就是说σ可以是一个简单的数字就好。 但是我们假设(实际也确实有这种材料)一种材料,其在x方向上拥有良好电导性,y方向完全不具备导电性。 如图,不难发现需要两个电导率相关的参数来表示这个线性变换。 但是这两个0它应该是0吗? 学过线性代数的好厚米可以瞬间发现,我们所选的坐标正好是矩阵的基向量组合,并不具有很好的普遍性,于是我们换一个普遍情况来看看: 此时我们注意到,对于任意的x方向与y方向的电场强度,任意一个方向的电场强度都会同时在坐标轴的两个方向产生一个不同的电流强度。 如果没有看懂,也能注意到图上至少出现了四个变换后的电流强度,如何描述这种变换呢。 [Jx​Jy​​]=[σxx​σyx​​σxy​σyy​​][Ex​Ey​​] 注意到此时σ是一个下标含有两个坐标的分量,让我们用矩阵乘法来把这个表达式拆开 (Jx​Jy​​)=(σxx​σyx​​σxy​σyy​​)⋅(Ex​Ey​​)⟹{Jx​=σxx​Ex​+σxy​Ey​Jy​=σyx​Ex​+σyy​Ey​​ 最好的看待方式就是发现其实 σxy​ 就是在说:Y方向的电场强度会对x方向的电流强度产生如何之影响。 特别特别要注意的是,这个地方的…

    永久链接至 “张量分析大观”

February 2026

  • ConvNext品鉴…

    前言 为了给例会群里搞点乐子,于是决定搞一个东方角色的识别,首先想到的其实就是ConvNext网络,对于这个一百来个角色的分类任务,它足以胜任。 qwqpap/touhou_guess · Hugging Face ConvNext网络介绍 (99+ 封私信 / 90 条消息) ConvNeXt—— 一个能挑战 Vision Transformer 的卷积神经网络(万字长文,从原理到代码演示) – 知乎 懒得介绍了,看看知乎得了 数据来源 预期的角色数量大概在120多人,有一些旧作的角色可能被狠狠抛弃了。 事后发现纯狐和三花也被忘掉了) 每个角色大概100多个图片,最开始的数据集来自于Preacher-26/touhou-embeddings-dataset · Datasets at Hugging Face 特别感谢Preacher老师的分享。 之后再次获得了Renko_1055的神秘python脚本,使我的数据集数量获得了极大的提高。 稍微修改一下 对于原版的ConvNext,我们需要给最后一层网络直接改成全链接到所有的角色上面输出一百多个预测值。 import os import pandas as pd import numpy as np import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader import torchvision.transforms as transforms from PIL import Image import timm from sklearn.metrics import f1_score, precision_score, recall_score import matplotlib.pyplot as plt import json from tqdm import tqdm 设置设备 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') print(f'Using device: {device}') 读取角色列表 with open…

    永久链接至 “ConvNext品鉴-东方Project角色识别”
2025的档案