编程

第三次挑战 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() 需要用到的头文件是:

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

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

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

比如咱们刚学了 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 - 声明

Clang 使用 MinGW 环境

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

Makefile 探索

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

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

本文仅致以热衷于提升性能的开发者,总结几年内的经验与办法,阐述一些意识到或意识不到的性能提升办法。很多时候,某种编程写法仅仅只是出于习惯/可维护性/行业惯例,但不是性能。这里献丑一下,挖掘出来,以下某些观点可能让人感觉很痛苦,但值得反思。 谨慎使用正则表达式 对于正则表达式,很多开发者已经很熟悉了。当然正则表达式也确实带来了很多好处,对于复杂字符串规则的把握,代码可维护性,实乃字符处理的一大开发区。 然而今天这里不是为正则表达式歌功颂德的,我的观点是谨慎使用正则表达式。如果开发者自身有更好的更高性能的实现方式完成正则表达式功能的话,那么应该优先采用更好的方式实现,例子参考于: 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等进行测试,认为反复创建影响甚微,然而忽视了一点,对于一些复杂开销大的自定义类型,编译器根本无法做到很良好的优化。假如有这样一段代码:

LLVM Language Reference Manual

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

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).

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);

Vim 与 LSP

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