Posts

第三次挑战 llc

每次进行 LLVM 开发,都会浪费 3min 的构建时间。 $ time ninja -C build modc ninja: Entering directory `build' [2/2] Linking CXX executable modc real 3m10.

收藏夹

一个垃圾爱好者的收藏夹 没有实现目录 外部引用 (external reference) 星姐姐的收藏夹 软件集合 suckless https://suckless.org/ suckfull GNU Software https://www.

使用 Freebsd Current

FreeBSD Current 是 FreeBSD 源码树的最新开发版本,不稳定,且从源码更新。 这里从 Freebsd 手册 翻出更新 FreeBSD Current 的方法。 目前,FreeBSD 源码树移动到了 git 托管,地址是 https://git.

FreeBSD Ports - 如何给 FreeBSD 打包

FreeBSD Ports 系统使用 Makefile 来描述软件包信息。相比 Arch Linux Buildsystem 来说,FreeBSD Ports 灵活性非常差,要打个包比较恶心。 ${WRKSRC} - 是软件包源码解压的地方,一般是 work/软件包名 $STAGEDIR - 是打包用的小系统目录,软件包编译后安装在这个目录用来打包,一般是 work/stage work/pkg 中存放 make package 生成的 pkg 包文件 准备 Makefile 一般来说,最小 Makefile 模板是这样:

Windows 控制台应用程序隐藏控制台

blender 的早期版本中,启动 blender 后会先显示一个控制台窗口,接着消失,弹出新的窗口。也许意味着控制台应用程序是可以隐藏控制台的。功夫不负有心人,找到了几种解决方法: 1 - 控制控制台窗口 ShowWindow(GetConsoleWindow(), SW_HIDE); 需要用到两个 Windows API: ShowWindow 设置指定窗口显示状态 GetConsoleWindow 返回控制台窗口句柄 获取控制台窗口句柄,然后修改他的显示状态。 但是官网不建议继续使用 GetConsoleWindow 接口。

编译 linux 内核相关的问题

在 Arch Linux 上,编译 Linux 内核需要依赖两个默认没有提供的工具: bc: An aribitrary precision calculator language (https://www.gnu.org/software/bc/) cpio: A tool to copy files into or out of a cpio or tar archive (https://www.

Java 程序启动

你们说,带群友翻 jdk 代码会不会很酷? 拜托,超酷的好不好。 假设 首先假设在工作目录中指定并启动编译好的主类: $ java MainClass 至于 jar 包,你用压缩软件打开,然后打开文件 META-INF/MANIFEST.MF,里面 Main-Class 那一行就写着主类:

Blackarch 脚本两则

sysclean.sh - 清理系统 #!/bin/sh # 清理孤包 # pacman -Rscn # -R 删除 # -s 包括目标包的依赖 # -c 包括依赖目标包的包 # -n 忽略文件备份 # -Q 查询 # -t 查询孤包 不再被依赖或可选依赖的包 # -d 查询作为依赖安装的包 # -q 只打印包名(对脚本很有用) pacman -Rscn $(pacman -Qtdq) # 更新源文件 (extra/pkgfile包的 pkgfile) pkgfile -u # 更新 mlocate 数据库 (core/mlocate 包) updatedb pacman-db-upgrade # 清理包缓存 两个 -c 清理缓存中所有文件 yes | pacman -Scc # 同步缓存的写入到持久性存储中 sync tuning.

内核事件通知机制

当进程持有充分大数量的资源时,如何跟踪资源的状态变成了问题,与其挨个轮询,不妨换一种思路,让内核通知我们。 比如在网络编程的条件下,我们可能会同时处理多种连接,可以使用这种接口让内核通知我们哪些套接字可以读写,传入连接等。 在 FreeBSD 中,使用 kqueue() 相关设施提供事件通知机制。 在 Linux 中,使用 epoll() 相关设施提供事件通知机制。 kqueue kqueue() 需要用到的头文件是:

gcc 关于链接库的参数顺序

现象: buildbot@worker:/buildbot/allbuild/build$ make cc -c -o main.o main.c cc -c -o send.o send.c cc -c -o status.

su 以其他用户启动程序,但账号不可用

本文章假设以超级用户 root 发起操作 Phabricator 中,守护程序 ./bin/phd 需要以 daemon-user 启动,在 Debian 中该用户名为 daemon。 所以如果不想给该守护进程默认的 root 权限,需要以 daemon 身份启动该程序。 (因为 daemon 的 sudoers 配都配了)

docker-compose 中让容器依赖与实际服务是否可用

Phabricator 是一组开发软件用的工具。它包括了代码审查(code review),仓库托管(repository hosting),漏洞追踪(bug tracking),项目管理(project management)等工具。 其中 Phabricator 包含了一个守护进程,为了将其装进 docker 容器中,我是用 ENTRYPOINT 脚本在容器启动时,容器进程启动前来启动守护进程。 下头的是:该守护进程会在连接数据库失败后立即退出,并且普通的 docker-compose 的 depends_on 声明对其没有效果,主要是数据库容器启动后需要一段时间。

简单使用 frp

frp 是一个专注于内网穿透的高性能的反向代理引用。 它最常见的使用场景是:由于众所周知的原因,云服务器上访问某些服务速度感人,让服务器流量走本地机器。 以及,让云服务器做出口对外服务,配合搭建混合云,让一些信息的储存和计算发生在本地。 这里给出最简单的一个常见的配置:向服务器暴露本地机器的服务。 这里使用本地端口 5000 做示例,在服务器上暴露为相同的 5000 端口。 服务器的配置如下: [common] bind_port = 7000 ; frp 服务端口 ; 同时要配置网络防火墙(服务器安全组),使得该端口对外可见 token = xxx ; 令牌,用作简单的身份认证 ; 可以使用 python 标准库 secrets 生成: ; import secrets ; secrets.

编写 systemd service 单元文件

要使用 systemd 管理自定义的服务,需要编写单元文件。 对于一般的服务来说,使用 .serivce 的服务单元即可。 将文件放置于 /etc/systemd/system,符号链接也行,但是需要读取权限(不太清楚)。 每次修改单元文件记得使用 systemctl daemon-reload 重新加载单元文件。 模板 对于普通的服务,使用这样的模板: [Unit] Description=这里填写服务说明 After=network.

Vite 配置解析别名

就像 Webpack 那样,比如 @/ 表示源码根目录,这样对公共组件非常有用。 Vite 配置 使用 Vite 配置中的 resolve.alias 配置: import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import path from 'path' export default defineConfig({ plugins: [vue()], // Vue 的插件 resolve: { alias: { // 该文件就在项目根目录 __dirname 就是这个目录,.

Git 服务器,但对标 kernel.org

Linux 内核官网 https://kernel.org 里头,Git 协议所给的链接打开以后是 cgit 生成的页面,这个没有难度。 然而亮点就在这个站点的每个仓库的克隆链接与 cgit 链接几乎相同。 browser: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/ clone https: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 感谢这篇文章的内容,给出了同时提供两种服务的 nginx 配置。

在 Arch Linux 中手动构建 chroot jail

建立 chroot 目录,下面称之为 $root mkdir $root 建立 pacman 需要的 /var/lib/pacman 目录 mkdir -p $root/var/lib/pacman 安装 bash 和基本工具 coreutils

创建不使用任何框架的 Vite 项目

Vite 是下一代基于 ESM 的前端工具,提供代码打包,搭建开发服务器,热重载,项目生成等功能。 官方以及第三方的脚手架中,或多或少使用了框架,但是为了学习前端基础本身,编写小型原型,创建不使用框架的项目也许会有帮助。我们的项目也许会足够小,不被框架本身所打扰太多。 npm 部分 创建项目,初始化 npm 包 创建一个空文件夹,cd 进去,使用 npm 初始化包。 $ npm init .

Grub 初探

grub 的命令行显得些许神秘,但是在勇气和机缘巧合下,我了解到了一些基本操作。 文件系统相关 在鼓起勇气粗略阅读 grub 文档后,找到了如何列出设备,浏览文件系统。 grub 的设备记法是使用圆括号包裹的字符串,例如我的 arch 的 /boot/grub/grub.cfg 中将 root 设置为 hd0,msdos1,然后这么引用:($root)/usr/share/grub/themes/xxx/theme.txt。

可执行代码加载到内存并执行

比如咱们刚学了 boot0 这种 freestanding binary object 怎么生成,于是之前的 mmap & call 程序就可以用这个手法,而不是手动从 elf 格式里头扣 payload: payload.c ${CC} -ffreestanding -nostdinc -nostdlib -Wl,--oformat,binary -Wl,--no-dynamic-linker $< -o $@ echo "generate payload" && xxd $@ .

阅读 Vixie cron

[scode type="yellow”]都是猜测,没有经过验证,验证在咕咕咕,请自行辨别。[/scode] 来源 我选择阅读的源码来自 FreeBSD 源码树,其中的目录 usr.sbin/cron 中的 cron 实现。 主函数 main 其中 secres 的含义是每秒执行的任务,这个 cron 实现支持 @every_second 定义每秒执行的任务,除了我们熟知的 cron 表达式,这个实现还有 @ 开头的表达式支持,比如 @reboot 指的是开机以后执行一次的任务。

C++ 编写的多项式解析

输入为描述多项式的字符串,使用自动机将其解析为结构化的数据 输入示例: 2 x^2 2x x 2x^2 代码: #include <cstdlib>#include <ctype.h>#include <stdio.h>#include <sstream>#include <vector> // 项 struct term { int mul; int exp; }; // 多项式 typedef std::vector<term> poly; enum poly_parse_state { ppoly_init, // 初始状态 ppoly_mul, // 系数 ppoly_var, // 变量 ppoly_exp, // 指数 ppoly_tem, // 产生一个项 ppoly_suc, // 产生一个多项式 ppoly_err // 错误 }; // 状态转移 #define transfer_state(s) {state = s; break;} // 读取 #define move() { \ do{ \ ch = is.

lldb 入门

命令结构 lldb 的命令不像 gdb 那么自由,而是比较结构化。 命令结构的形式是: <名词> <动词> [-选项 [选项值]] [参数...] 让 lldb 启动进程后停在入口点(是程序镜像的入口点,不是 C 语言的入口点 main。linux 中,可执行文件格式 elf 中 elf 头有一个项目叫入口点,一般进入 C 语言运行时,再调用 C 语言的 main 函数),并且向程序传递参数 argv0 argv1

FreeBSD 时间片实现猜测

[scode type="yellow”]都是猜测,没有经过验证,验证在咕咕咕,请自行辨别。[/scode] 0x1 - atpic interrupt entry - atpic_intr# sys/amd64/amd64/atpic_vector.S:45-53 - 宏定义 sys/amd64/amd64/atpic_vector.S:55-70 - 声明

记录一次 Linux 启动盘备份 Windows 文件

起因 昨晚(2月28日凌晨),我安装了 20H2 质量更新,于是和往常一样选择 更新并关机。只不过这次更新十分缓慢,我在一旁刷了至少 10 分钟的抖音,仍然不见电脑断电。于是,我做出了令我后悔的降智操作:长按电源键 5 秒,松开按键的那一刻就如同拔掉电源一样。保险起见我打算再开机看一下有没有问题。结果不负众望,系统挂了。 忘了 VIRTIO_忘了 Wal00000.sys (记错警告) 尝试修复 自带的诊断 根本不用动,就自己重启,自己诊断。然后无法解决。

Clang 使用 MinGW 环境

安装 [MinGW64] ? 官网没了 llvm 找一个喜欢的版本(最新(笑)),在 Pre-Built Binaries:里找Windows (64-bit) MinGW 安装目录的 bin 文件夹加入 PATH 环境变量(推荐放到用户变量里)

RFC 索引

HTTP/1.1 [RFC 8615] [RFC 7230] Message Syntax and Routing [RFC 7231] Semantics and Content [RFC 7232] Conditional Requests [RFC 7233] Range Requests [RFC 7234] Caching [RFC 7235] Authentication HTTP/2

Makefile 探索

手动指定 语法 规则大致是这样: 目标文件: 源文件 构建目标的命令 ${变量名} 变量替换 ${CC} C 编译器 示例 prog: a.o b.o ${CC} a.

MySQL 容器与字符乱码

引言 学校的课程需要 Mybatis 连接 MySQL 数据库,本人不才无法成功安装 MySQL for windows。所幸留了两三个虚拟机可以试试。 启动服务器 大致思路是容器映射出虚拟机,虚拟机映射出主机。 docker 使用 -p 选项让容器使用主机端口 我的 VirtualBox 修改虚拟机配置,将主机端口映射到虚拟机中(NAT 网络地址转换) docker 启动命令:

[转载] 非人性(反人类)方式提升性能办法总结(待更新)

本文仅致以热衷于提升性能的开发者,总结几年内的经验与办法,阐述一些意识到或意识不到的性能提升办法。很多时候,某种编程写法仅仅只是出于习惯/可维护性/行业惯例,但不是性能。这里献丑一下,挖掘出来,以下某些观点可能让人感觉很痛苦,但值得反思。 谨慎使用正则表达式 对于正则表达式,很多开发者已经很熟悉了。当然正则表达式也确实带来了很多好处,对于复杂字符串规则的把握,代码可维护性,实乃字符处理的一大开发区。 然而今天这里不是为正则表达式歌功颂德的,我的观点是谨慎使用正则表达式。如果开发者自身有更好的更高性能的实现方式完成正则表达式功能的话,那么应该优先采用更好的方式实现,例子参考于: https://gitee.com/deng_dan_jun/function_finishing/blob/master/常见正则表达式C++实现函数 一个理想的正则表达式实现应该是编译器扫描用户的代码,解析其正则表达式语义,实现一段等同于顶尖高手实现的代码嵌入到工程里面调用。可惜这仅仅还是理想,当今的正则表达式库依然未能实现这点,因此在使用正则表达式的时候,需要谨慎对待。 谨慎使用格式化操作函数\库 这里说的格式化,形如sprintf,也是字符处理的一大利器,然而,复杂的格式化操作同样也会带来性能上的损耗。参考例子: https://user.qzone.qq.com/1075716088/infocenter 以及 https://blog.csdn.net/q229827701/article/details/41015483 读者可以自己使用直写方式实现,对比性能,会有数倍的差距,对于更为复杂的格式化操作,性能损耗会更大。此条原理本质上与第一条类似。 最好不要在循环里面反复创建变量 这点看似简单,但是大部分工程都存在这个问题。很多优秀的算法本身也因为使用者这点不太良好的习惯而影响到性能。如果反复创建的是创建开销大的对象,例如STL容器则问题影响会更大。 网上很多测试例子以一些简单的类型如int等进行测试,认为反复创建影响甚微,然而忽视了一点,对于一些复杂开销大的自定义类型,编译器根本无法做到很良好的优化。假如有这样一段代码:

Mastodon docker notes

原文 修改自: literal 1. 克隆 mastodon $ git clone https://github.com/tootsuite/mastodon $ cd mastodon $ git checkout <你钟意的版本> 2.

LLVM Language Reference Manual

LLVM 语言参考 概要 LLVM 是一个基于静态单赋值(Static Single Assignment, SSA)的中间表示。 提供类型安全,底层操作符,弹性和清晰的表示“一切”高级语言的能力。 是用在LLVM汇编策略所有情况的所有方面的公共代码表示。 引言 LLVM 代码表示,设计被用在三个形式上: 作为内存中的编译器IR 作为磁盘上的字节码表示(适应即时编译器(Just-In-Time)的快速加载) 作为人类可读的汇编语言表示 这些允许LLVM为高效的编译器翻译和分析提供一个强大的中间表示,并且提供一个自然的意义去调试和可视化翻译。 LLVM三种不同的形式都是等价的。 这个文档描述人类可读的表示和记号。

PostgreSQL for Windows

服务控制 PostgreSQL 工具 pg_ctl start -D 数据库目录 pg_ctl stop -D 数据库目录 Windows sc 工具 rem 开启 > sc start 服务名字 rem 关闭 > sc stop 服务名字 注册服务

FFmpeg 图片序列转视频

ffmpeg -f image2 -y -r 24 -start_number 23 -i %04d.jpg video.mp4 -f image2 格式为图片序列 -r 24 帧率为 24fps -start_number 23 图片序列输出从 23 帧开始 %04d 图片序列文件名格式

Python 做数值计算作业

求矩阵范数 import numpy as np m = np.array([ [2,-2,-3], [0, 5, 1], [0, 0, -7] ]) print(np.

fpipe.py 函数管道

# 定义 def fpipe(functions, parameter, debug=False): for f in functions: if debug: print('%s: (%s)' % (f.

unistd.h 索引

通用 | 1003.1 - 1990 进程控制 _exit - 程序退出 fork - 创建新进程 sleep - 挂起线程一段时间 pause - 暂停,直到收到信号 exec 系列

literalman 探索

mandoc -T html 就能输出网页 mandoc(1) HTML Output oh-my-zsh 的 colored-man-pages 干了什么 设置了一堆 LESS_TERMCAP_* 系列环境变量,将默认的终端控制序列换成彩色的 less 的 line.

style(9) - FreeBSD 内核源码文件风格指南

style(9) FreeBSD 内核开发人员手册 style - 内核源码文件风格指南 这个文件指定 FreeBSD 源码树中内核源码的推荐风格。同时也是推荐用户代码风格指南。许多风格规定隐含在例子中。在假设风格在问题前保持沉默,仔细检查例子??? /* * Style guide for FreeBSD. Based on the CSRG's KNF (Kernel Normal Form).

Discourse 装论坛送的版规

这是一个文明讨论的地方 在论坛上请表现得像在公共公园一样得体。我们一群人共享着一个公共社区资源 — 一个通过不断进行讨论以分享我们技能、知识和兴趣的地方。 这些都不是死规矩或者是草率决定,只是一些帮助社区的人们来判断的规定。试用这些指引来保持干净和充满灵感的文明的公开论坛。 改善讨论 帮助我们让这个地方变成一个讨论的好地方。你可以总是一致的做一些帮助改善讨论的事,即使是小事也行。如果你不确定你的帖子有益于讨论,认真想一想你要说什么再发布。 这里讨论的主题对我们很重要,并且我们希望你也觉得这些内容对你很重要。尊重这些讨论的主题,以及讨论他们的人们,特别是当你不同意他们所说的时候。 改善讨论的一种方法是找一找已经发生过的事。请在发帖或创建你自己的主题前,花一些时间浏览这些主题,这样你更有机会遇见和你有共同爱好的人。 即使你不同意他人时,尊重他人 你可能想表达你的不同意。这没问题。但是,记住_批评观点,而不是人_。请避免: 指名道姓。 人生攻击。 回复帖子无关于帖子的内容。 下意识的反驳。 相反,提供合理的观点改善讨论。

Python 应用打包器

zipapp 模块 将 Python 应用打包成 pyz (zip) 格式 import sys import os import os.path import shutil import re import py_compile import zipapp import argparse parser = argparse.

zeit.co 站点的 CSS 特效

从hyper.is右上角发现的,hyper是从xterm.js发现的,同时发现的还有ttyd。 这网站的顶栏是半透明的,而且加了模糊特效(突然质感就上来了 其实应该不难做 backdrop-filter: saturate(180%) blur(5px); background-color: rgba(0, 0, 0, 0.5);

FreeBSD 上配置桌面环境

概述 这篇文章尝试从各个角度介绍在 FreeBSD 上配置桌面环境。 简单介绍一下术语: Xorg: X 窗口系统的开源实现,是处于底层的图形界面环境。 桌面环境: 基于 Xorg 进一步提供例程,资源,更高一层的图形环境。 显示管理器: 图形化的登录器 & 准备 X 环境,就是为了让你不必从终端启动 X 环境的工具。 窗口管理器: 管理多窗口实例的程序,比如窗口遮挡,窗口操作 如何进入桌面环境呢?

布林博士的台词

怎么样,弗里曼博士? 我们开价已经够高了,还不考虑成交? 戈登才不会跟你谈什么无聊的条件。 我十分体谅你不愿意在朋友面前谈这事儿。 先让他们上路,然后我们好好聊聊。 别挣扎了,亲爱的。 爸爸,非常抱歉。 朱迪斯?你知道你在干什么吗? 我们在做我一个人做不了的事,我们要阻止你。 成了。 卫兵,快进来。 他们知道你是叛徒。他们不会放过你的!朱迪斯-莫斯曼博士。求你了! 对不起,华莱士。你没时间了。 别。 快点!

Vim 与 LSP

Language Server Protocol (LSP) 语言服务协议 Vim 做 LSP Client,和 LSP Server 进行通信。 LSP Server 有:

《完美》专题研讨会

Chapter 11. Course (讲座) Items You Love at Members-Only Prices 那些再会员特价时你喜爱的东西 Why did you come here today?