glaumar
VRPirates 开发的 Rookie Sideloader 免费提供了几乎所有 Meta Quest 商店的付费游戏,但客户端仅支持 Windows 系统,且目前没有开发 Linux 客户端的计划,这里提供一种在 Linux 下手动下载安装 VRPirates 资源的方法
图片来源:Easy Diffusion 生成(参数), Aseprite 编辑 系统是 ArchLinux , 无线网卡是 Intel Wi-Fi 6 AX200 原因 Windows 快速启动阻止了 Linux 访问本机无线网卡 解决方案 1. 启动 Windows 并关闭快速启动 2. 如果上述操作后还是不行,可以尝试拔掉主机电源线,长按电源键30秒,重新插上线再重启(来自linuxmint论坛,亲测有效)
图片来源:Easy Diffusion 生成(参数), Aseprite 编辑 回文字符串 简单来说就是左右对称的字符串,比如 aba、abba 都是回文字符串。 寻找最长回文子串是很经典的问题,比如 bananas 的最长回文子串就是 anana (LeetCode 上对应的题目 longest-palindromic-substring) 暴力计算(O(n2)) 一个简单的想法是,对于字符串里的一个字符 c: 显然上面的想法会漏掉偶数长度的回文串(比如 cabba ,无论以哪个字符为中心开始找都得不到 abba),我们可以通过插入额外字符来把所有偶数长度的回文串转化为奇数长度,比如我们插入字符 | ,把 cabba 转化为 |c|a|b|b|a| 马拉车算法(O(n)) 马拉车算法其实上面的想法差不多,也是尝试以每一个字符为中心查找局部的最长回文串,不同的是马拉车算法利用来回文串左右对称的特点减少来大量计算 以右边字符串为例子,为方便理解,假设我们已经的计算已经来到了字符 x n m y c v c y c x c y c v c z w 对于 x 左边的任意一个字符,我们都已经计算过并记录了以该字符为中心的最长回文字符串,比如对于 x 左边的第一个 y ,我们知道他的最长回文字符串为 cyc n m y c v c y c x c y c v c z w 现在依次比较 x 两边的字符,经过 6 次比较后,我们确定了以 x 为中心的最长回文字符串 cvcycxcycvc ,为了方便后续说明,我们记作 x回 n m y c v c y c x c y c v c z w 此时如果是暴力计算的话会直接进入下一个循环,但其实可以利用回文字符串的对称性直接算出 x 右边的字符(绿色部分)的最长回文字符串 n m y c v c y c x c y c v c z w (情况 1)对于 x […]
图片来源:Easy Diffusion,参数 在 bittorrent 中, tracker 是组织或个人提供的一个中心化的服务,tracker 服务器 URL 包含在种子文件(.torrent)的 announce 或 announce-list 字段中,bittorrent 客户端通过 HTTP GET 请求向服务端发送本地信息,并从服务器获取其他客户端的信息。 Tracker 请求 以下是 HTTP GET 请求 URL 中的参数: 参数 必要 含义 info_hash 是 种子文件中 info 字段值(bencode编码的字典)的 SHA1 校验和(20字节),种子文件结构查看 这里 peer_id 是 20字节 ,用以识别客户端的唯一 ID,可以是任意值(可见字符或二进制数据),应当在客户端启动时生成 port 是 客户端监听端口号,通常是6881-6889(如果客户端无法在该端口范围内监听,应当主动放弃) event 否 值必须为 started、stopped 或 completed。客户端对 tracker 的第一次请求中应当包含 event=stared ;客户端正常关闭时应当向 tracker 发送 event=stopped ;客户端完成下载时应当向 tracker 发送 event=completed (不要重复发送 event=completed ,tracker 使用该信息统计完成的客户端数量) uploaded 是 使用 ASCII 码表示的十进制数字,表示 event=stared 发送后上传的字节数(官方没标单位,但通常为字节) downloaded 是 使用 ASCII 码表示的十进制数字,表示 event=stared 发送后下载的字节数(官方没标单位,但通常为字节) left 是 使用 ASCII 码表示的十进制数字,未下载的字节数 compact 是 值为 1 时,服务器响应使用更加紧凑的节点格式(6字节 IPv4 地址或 16字节 IPv6 地址,后2字节为端口,均使用网络序)。注意,官方建议 tracker 默认使用 compact 格式,并且该参数对 tracker 服务器来说只是个建议,即使发送 compact=0,tracker 服务器也可以忽略或拒绝响应 no_peer_id 否 指示服务器响应中的 peers 字典不必包含 peer id ,使用 compact=1 时自动忽略该选项 ip 否 客户端所在机器的真实 IP 地址,客户端通过代理与 tracker 服务器连接时需要该参数提供真实 […]
图片来源:https://www.pixiv.net/artworks/113139569 整个 .torrent 文件实际上就是一个包含了约定字段的 bencode 编码字典, bencode 编码规则见 https://blog.geekgo.tech/programming/bencode/ 顶层字段 字段(含空格) 类型 必要 含义 info Dictionary 是 包含文件信息的字典,详细结构见下文 announce String 否 tracker 的 URL announce-list List 否 额外 tracker,列表的每个元素都是一个字符串列表,每个字符串都是一个 tracker 的 URL (另外官方文档里对这些 tracker 的处理顺序有一些要求,详情见 这里) creation date Integer 否 种子创建时间(Unix 时间戳) comment String 否 没有格式要求的文本备注 created by String 否 创建种子的程序名称和版本(实际也可以填任意其他内容) encoding String 否 未在官方文档中找到定义,似乎是字符串编码,值多为 UTF-8,但 The BitTorrent Protocol Specification 已经明确了 “All strings in a .torrent file that contains text must be UTF-8 encoded.”。这里 的解释是 “the string encoding format used to generate the pieces part of the info dictionary in the .torrent metafile ” httpseeds List 否 每个元素是一个 URL,通过在 URL 后添加参数可以直接从这些网站下载需要的 torrent 数据,详见 这里 info 字典结构 info 的结构分为单文件和多文件两种情况 单文件 字段(含空格) 类型 必要 含义 name String 是 文件名 length Integer 是 […]
图片来源:https://www.pixiv.net/artworks/103204899 类型 描述 bencode 原始值 String 以字符串长度为前缀,后跟冒号和字符串 4:spam spam Integer 以 i 为前缀,后跟十进制数字,以 e 为后缀 i3ei-3ei0e 3-30 List 以 l 为前缀,后跟使用 bencode 编码过的元素,以 e 为后缀 l4:spam4:eggse ['spam', 'eggs'] Dictionary 以 d 为前缀,后跟使用 bencode 编码过的元素,每两个元素为一组 key:value,以 e 为后缀( key 必须为 String 并按原始字符串的字典顺序排列) d3:cow3:moo4:spam4:eggse d4:spaml1:a1:bee {'cow': 'moo', 'spam': 'eggs'} {'spam': ['a', 'b']} 参考:
图片来源:https://www.pixiv.net/artworks/65838500 term 表示信号终止进程,core 表示进程产生核心转储文件并退出,ignore 表示忽略该信号,stop 表示信号停止了进程,cont 表示信号恢复了一个已停止的进程 信号 信号值(x86) 默认行为 描述 触发场景 SIGABRT / SIGIOT 6 core 进程终止信号 进程调用 abort()函数时,系统向进程发送该信号 SIGALRM 14 term 实时定时器过期 调用 alarm()或 setitimer()而设置的实时定时器到期,内核将产生该信号 SIGBUS 7(不可移植) core 内存访问错误 使用由 mmap()所创建的内存映射时,如果试图访问的地址超出了底层内存映射文件的结尾,那么将产生该错误 SIGCHLD 17(不可移植) ignore 子进程终止、暂停、继续 子进程终止、子进程因收到信号而停止或恢复时向父进程发送该信号 SIGCONT 18(不可移植) cont 如果被暂停,重新继续执行 将该信号发送给已停止的进程,进程将会恢复运行。当接收信号的进程当前不处于停止状态时,默认情况下将忽略该信号 SIGEMT 未定义 term 硬件错误 UNIX 系统通常用该信号来标识一个依赖于实现的硬件错误。Linux 系统仅在 Sun SPARC 实现中使用了该信号 SIGFPE 8 core 算术异常 在 x86-32 架构中,整数除以 0 总是产生 SIGFPE 信号,但是对浮点数除以 0 的处理则取决于是否启用了 FE_DIVBYZERO 异常。如果启用了该异常(使用feenableexcept()),那么浮点数除以 0 也将产生 SIGFPE 信号,否则,将为操作数产生符合 IEEE 标准的结果(无穷大的浮点表示形式)。 SIGHUP 1 term 挂起 检测到控制终端挂起或者控制进程死亡时,进程会收到 SIGHUP。许多守护进程会在收到 SIGHUP 信号时重新进行初始化并重读配置文件。nohup 命令用于无视该信号 SIGILL 4 core 非法的指令 如果进程试图执行非法(即格式不正确)的机器语言指令,系统将向进程发送该信号 SIGINT 2 term 终端中断信号 当用户键入终端中断字符(通常为 Ctrl-C)时,终端驱动程序将发送该信号给前台进程组 SIGKILL 9 term 杀死 此信号为“必杀(sure kill)”信号,处理器程序无法将其阻塞、忽略或者捕获,故而“一击必杀”,总能终止进程 SIGIO / SIGPOLL 29(不可移植) term I/O 时可能产生 利用 fcntl()系统调用,即可于特定类型(诸如终端和套接字)的打开文件描述符发生 I/O 事件时产生该信号 SIGPIPE 13 term 管道断开 当某一进程试图向管道、FIFO 或套接字写入信息时,如果这些设备并无相应的阅读进程,那么系统将产生该信号 SIGPROF 27(不可移植) term […]
图片来源:《灵笼》特别篇截图 方案一:继承 std::streambuf 详细解释查看 《C++标准库:第2版》 15.13章节 输出流(没有缓冲区) 在不考虑缓冲区的情况下,继承 std::streambuf 并重写两个函数 : 输出流(有缓冲区) 考虑缓冲区的话,需要: 输入流 输入流需要考虑支持回退(basic_istream& unget()),重写 virtual int_type underflow () 函数用以从文件描述符中读取数据到缓冲区,缓冲区前 4 字节保存可回退数据 方案二:使用 __gnu_cxx::stdio_filebuf stdio_filebuf 支持使用文件描述符或者C文件指针(std::__c_file * 即 FILE *)构造,部分构造函数: 使用示例: 注意:对于文件描述符,stdio_filebuf 在析构时会主动调用 close ;但对于 FILE * 则不会主动关闭,需要手动调用 fclose 方案三:使用 boost::iostreams::file_descriptor_source 和 boost::iostreams::file_descriptor_sink boost 的 file_descriptor_source 和 file_descriptor_sink 可以使用文件描述符来构造,继而构造出 boost::iostreams::stream ,部分构造函数: 其中 file_descriptor_source 只能从文件描述符读取数据,file_descriptor_sink 则只能写入数据,file_descriptor_flags 用以控制析构时是否自动关闭文件描述符 参考: 《C++标准库:第2版》 __gnu_cxx::stdio_filebuf< _CharT, _Traits >(3) —— man page File Descriptors —— boost
图片来源:https://www.pixiv.net/en/artworks/74361938 名称 解释 task_struct 中的对应变量(定义在 include/linux/sched.h 中,均为全局ID,内核版本 v2.6.24) 对应的系统调用 PID (Process ID) 字面上是虽然是 进程 ID,实际上就是线程 ID,内核中进程、线程都使用 task_struct 结构表示 task_struct->pid pid_t gettid(void); TGID (Thread Group ID) 线程组 ID,即线程组组长的 PID,真正的进程 ID,如果进程只有一个线程则他的 PID 和 TGID 相同 task_struct->tgid pid_t getpid(void); PGID (Process Group ID) 进程组 ID,多个进程可以组合为进程组,方便向所有成员发送信号,进程组组长的 PID 即为PGID task_struct->signal->__pgrp pid_t getpgrp(void); SID(Session ID) 会话 ID,多个进程组可以组合为会话,会话的组长PGID 即为 SID task_struct->signal->__session pid_t getsid(pid_t pid); PPID (Parent Process ID) 父进程 ID task_struct->parent->pid pid_t getppid(void); 参考:
图片来源:https://www.pixiv.net/en/artworks/74340900 这里的有线设备指带网线的物联网设备,正常情况下这些设备将网线插入家用路由器后即可正常使用 基本思路就是: 网络共享这一部分主流桌面环境和 NetworkManager 都有很好的支持,没有特殊需求的话,直接使用图形界面的网络设置即可 Ubuntu(GNOME) 硬件要求:带 RJ45 网口的 ubuntu PC、无线网卡 步骤 使用无线网卡连接互联网, 创建共享,将无线网络共享给有线网口 将物联网设备网线插入 Linux 机器网口,打开 wireshark 抓取有线网卡的数据包即可 SteamDeck 外接扩展坞(KDE) 硬件要求:SteamDeck、带 RJ45 网口的 TypeC 扩展坞 SteamDeck 是V社推出的游戏掌机,自带的系统 SteamOS 3.0 基于 Arch Linux,默认 KDE桌面环境,本质上就是一台X86架构的 Linux PC,但由于V社对系统魔改,配置上多少还是和其他 Linux 有区别 步骤 在游戏模式中开启开发者模式(Setting -> System -> Enable Developer Mode) 按 steam 键,选择电源,切换到桌面模式(Power -> Switch to Desktop) 使用无线网卡连接互联网 快捷键 Ctrl + Alt + T 打开 Konsole,执行以下命令: 创建共享,将无线网络共享给有线网口 将物联网设备网线插入扩展坞网口,打开 wireshark 抓取有线网卡的数据包即可 参考:
图片来源:https://www.pixiv.net/en/artworks/101574081 最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。 1940年,沃伦·麦卡洛克与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。 1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为「正则集合」的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,随后是Unix上的编辑器ed,并最终引入grep。自此以后,正則表达式被广泛地应用于各种Unix或类Unix系统的工具中。正则表达式的POSIX规范,分为基本型正则表达式(Basic Regular Expression,BRE)和扩展型正则表达式(Extended Regular Express,ERE)两大流派。在兼容POSIX的UNIX系统上,grep和egrep之类的工具都遵循POSIX规范,一些数据库系统中的正则表达式也符合POSIX规范。grep、vi、sed都属于BRE,是历史最早的正则表达式,因此元字符必须转譯之后才具有特殊含义。egrep、awk则属于ERE,元字符不用转譯 。 维基百科 BRE 和 ERE 是 POSIX 标准中定义的两种不同风格的正则表达式, 只支持一些比较基础功能,没有贪婪匹配( .* )和非贪婪匹配( .*? )的区别(具体效果要看具体的实现,GNU的实现中均表现为贪婪匹配,另外一些实现中 .*? 可能导致语法错误),也不支持正、逆向巡视等语法。 BRE语法 . :匹配单个任意字符, 匹配 . 本身使用 \. * :前面的字符或模式重复任意次,匹配 * 本身使用 \* \{m\} :前面的字符或模式重复m次 \{m,n\} :前面的字符或模式重复m到n次 \{m,\} :前面的字符或模式重复m次及以上 \(regexp\) :分组,将 \( 和 \) 之间的内容视为一个整体,有两个作用 ^ :放在正则表达式开头则匹配行首,其他位置匹配 ^ 本身 $ :放在正则表达式末尾则匹配行尾,其他位置匹配 $ 本身 [list] :自定义字符集,可以匹配 [ 和 ] 之间出现的任意字符,例如: a[bcd] 可以匹配”ab”,“ac”或“ad”。且支持使用char1-char2这种省略写法,例如: [0-9]* 可以匹配”1234567890“ , [a-c]* 可以匹配“cabba” [^list] :同上,但匹配所有没有出现在 [ 和 ] 之间的其他字符 另外其他风格的正则表达式中有诸如 \d \w \s 等速记符号(shorthand)表示一些常用字符集,BER和ERE均不支持这种写法,取而代之的是POSIX标准中定义的字符集: POSIX Description ASCII Shorthand [:alnum:] 数字和字母 [a-zA-Z0-9] [:alpha:] 字母 [a-zA-Z] [:ascii:] ASCII字符 [\x00-\x7F] [:blank:] 空格和 Tab [ \t] \h [:cntrl:] 控制字符 [\x00-\x1F\x7F] [:digit:] 数字 [0-9] \d [:graph:] 可视字符 [\x21-\x7E] [:lower:] 小写字母 [a-z] \l [:print:] 可打印字符 [\x20-\x7E] [:punct:] 标点符号 [!”#$%&'()*+, -./:;<=>?@[ […]
图片来源:https://www.pixiv.net/artworks/89845503 有如下三个表格,他们各自对应一个CSV格式文件 Fruit Qty Price Apple 13 1.1 Banana 24 2.3 Pear 7 1.5 Fruit Qty Price Apple 27 5.5 Pear 40 3.04 Watermelon 5 0.99 Fruit Qty Price Banana 12 0.55 Pear 15 2.98 Peach 8 6 使用awk合并上述3个表格,对于相同水果合并数量并求均价 用法: 输出: 合并后输出为CSV格式的单行版本 输出:
图片来源:https://www.pixiv.net/artworks/42320059 大多日志都会在行首添加时间信息,通过在awk脚本内调用date命令把时间信息转换为时间戳进行比较实现日志截取 以linux启动日志为例,以空格为分隔符的话,前三个字段为时间信息 下面的脚本截取 2022-11-11 12:51:44 ~ 2022-11-11 12:52:44 这一分钟内的日志(执行:./logfilter.awk boot.log) 或者略微修改一下,通过命令行传入起止时间 用法