major与minor 首先,我们需要了解Linux下块设备的major与minor的概念。 对于Linux用户,可以尝试执行在自己的电脑上执行一下ls -l /dev | grep -E 'nvme|sd。输出大概会长这样: crw——- 1 root root 250, 0 Mar 9 13:25…
Linux内核调试环境的搭建 QEMU+GDB
最近在折腾Linux内核,但是折腾调试环境以及修改内核的编译选项就折腾了我一晚上的时间。 我使用的调试环境包括: QEMU(用于软件模拟系统执行环境,方便对硬件各寄存器等状态进行调试,为了方便起见,这里使用x86_64环境) GDB 以下是我的折腾步骤: Step 0. 安装必要工具 需要确保你已经有以下软件包(对于Debian/Ubuntu): build-essential gdb qemu-system-x86 rsync(用于带权限的文件复制) 如果你采用其他发行版,可以参考对应发行版的相关Wiki,以及使用软件包管理器的搜索功能。 Step 1. 准备内核 Substep…
博客复更
最近在研究Linux内核相关的东西,准备写几篇文章记录一下。但是自己的博客太久没有打理了。 本来打算将博客迁移到Hugo上,但是发现评论的迁移和搜索的实现比较麻烦,因此最终还是决定继续使用WordPress。 之前WordPress最让我头疼的问题是在于代码高亮插件。在不同的代码高亮插件间切换令人崩溃。同时由于我使用的代码高亮插件在遇到<和>字符的时候会自动escape,但是在编辑器中每次打开再保存会又escape一次,不知道为什么会有这样奇怪的设定。这也就导致了我一直纠结于博客系统而就放弃了内容上的更新。 今天仔细研究了一下相关方案,发现WordPress上有一个插件可以很好地解决问题,插件名叫WP Githuber MD。可以直接在里面使用Markdown来编写,同时还自带了优化Markdown文档的种种插件,比如用于代码高亮的prism.js,以及用于数学公式的KaTex。 改了几篇文章下来,感觉比之前使用WordPress编辑器+各种插件+部分手写HTML要方便不少。最终决定采用这个方案继续写博客了。也感谢大家这么多年来对我的博客的支持,希望接下来继续生产许多有价值的内容。
HDU 6657 – Acesrc and Cube Hypernet
题意: 给一个纸条,问是否可以折成一个立方体,纸条用一个h*w的矩阵上的#来描述,h<=100,w<=100,T<=30(数据组数)。 分析: 当时多校赛场上读完题就想到了可以枚举点然后BFS填充格子,只要有一个起点能满足不重复地填充给出图形上的所有#号点,且立方体被填满,就输出yes。由于h<=100,w<=100,所以最大的正方体的边长为100/4=25,因此我们枚举点25*25,check使用25*25*6的复杂度可以完成。 不过因为后来跟榜先搞别的题去了这题就先放一边,结果我们队后来因为开车那题自闭到最后. 这题的难点在于处理BFS时转向的问题。 我们可以先建立一个三维坐标,第一维是所属的面,第二维和第三维是这个坐标在这个面中的位置。如下图所示,中间的数字是面坐标的编号。 然后对于编号1的面,向周围4个面走的时候都是直接走即可,不需要进行坐标变换。 而对于需要进行坐标变换的情况,比如从0这个面一直向上走,走到4,需要将x和y坐标对调,然后逆时针转90°,再继续填充这个格子。 对于6个面,向4个方向走只有6*4=24种情况,所以直接把这24种情况x和y和方向的变化写出来(可以用if或者switch),然后直接做就完了。 然后就直接上一段很丑的代码吧。(为什么这么丑还要写博客呢,因为这算是在多校期间补的题中AC的人最少的一道题吧) 代码: #include <bits/stdc++.h> using namespace std; int…
二维ST表学习笔记
众所周知,ST表是一种离线解决RMQ(区间最值)问题的方法。 可以在O(n \log {n} ) 的时间内进行预处理,然后在O(1)时间内查询到结果。 复习一维 我们先来复习一下,一维st表的预处理和查询过程。 对于预处理,我们先定义一个名为st的二维数组,其中st[i][j]表示以i为起点,从起点开始(含起点)往后2^j个元素的最值。 满足i+2^j-1不越界 因为2^0 = 1 ,因此st[i][0]=a[i] 然后我们用2个for循环去打表就行了 接着是查询,这里我画了个图来解释。 其中橙色的线表示两个区间。 一维代码…
CQU选课小技巧
很多CQU的学生都遇到一个问题,选课的时候明明选完了,但是在提交上去的最后一步却遇到了Service Unavailable的情况,导致选课全部作废,需要重新选。 其实,借助Chrome浏览器和Fiddler可以很好地帮助我们解决这个问题。 问题根源:抢课系统在遇到提交失败的时候会丢失我们所选课的列表 解决方案:使用抓包工具,如果提交选课结果没有成功,就将提交上去出错的请求重放一遍 这里就不继续阐述诸如“看见加载不要继续点刷新”一类大家都知道的小技巧了 选课之前,你需要先安装好Chrome和Fiddler,Chrome建议安装SwitchyOmega插件,并按照这样设置。 点击上面菜单的黑色圆圈 然后点击选项 之后点击“新建情景模式” 然后按照下图设置代理协议HTTP,代理地址127.0.0.1,代理端口8888 (这个是Fiddler的默认配置) 之后应用选项。 然后打开fiddler,点击Tools,Options,按照这样设置 去掉Capture…
把树莓派作为Wi-Fi路由器(IPv6 passthrough、5GHz 11ac)
最近刚入手了Raspberry Pi 3B+. 打算当做一个高可玩性的路由器用。 毕竟这代硬件配备了千兆以太网(受限于USB总线带宽只能跑到250Mbps左右),和11ac Wi-Fi(受限于SDIO总线只能跑到110Mbps左右)。 参考资料:https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md 我准备实现以下几个功能: Wi-Fi工作在11ac模式(如果你想使用11n模式,建议在hostapd配置部分参考这里),达到433Mbps的Link Speed Wi-Fi共享以太网口的网络,IPv4使用NAT模式 IPv6使用穿透模式(可适用于几乎所有学校和家庭的IPv6环境,甚至你的手机开启个人热点后通过USB连接在Pi上也可以用这种方式使后端设备得到IPv6地址) 接下来开始操作: 0x00. 切换到root用户 sudo su 0x01….
在macOS下编写C++程序
还是由于最近身边许多同学换到了macOS,他们多数曾经是OIer或者大学打算读计算机,跑来问我如何在macOS下编写C++程序,这里介绍一下我的方法。 (如果你已经熟悉在Linux或是WSL下写程序,那这篇真的没啥好看的) 首先,你需要安装编译器。 由于Xcode会自带一个clang LLVM编译器(与gcc不同,如果写了UB可能会和gcc编译的程序运行结果不同),你只需要去App Store安装Xcode并运行一次即可。 然后,你需要安装一个代码编辑器。 推荐2个代码编辑器: Sublime Text Visual Studio Code 然后,准备一个好用的终端环境 推荐参考这篇文章:https://blog.cyyself.name/2018/07/macos/ 你可以选择先处理一下bits/stdc++.h问题 参考这里:https://github.com/tekfyl/bits-stdc-.h-for-mac 执行以下shell代码:…
macOS终端调教历程
工欲善其事,必先利其器。 最近,我的许多朋友换了电脑,其中有不少换了Mac。他们也常常来问我macOS下如何编译程序,VS Code与VS区别等等。其中他们多数是准备在macOS上学习C++、Python等语言。 考虑到身边许多朋友需要这个,而我自己的电脑也需要整理一下,所以今天把电脑数据备份了下然后重装了系统,希望能把我自己配置macOS的历程分享给大家,为大家提供一些帮助。 在做如下操作前,请先到App Store安装好Xcode。 由于Xcode下载需要等待较长时间,在此之前,你可以先了解一下基本的Unix命令。如cd、ls、echo、cat等。 顺带了解一下nano编辑器的使用。 首先,一个好用的软件包管理器有助于环境的配置。 经常使用Linux发行版的朋友肯定对包管理器不陌生。可以用它来管理安装的软件包,并实现软件批量升级。同时还可以一行命令搞定软件安装。比如Debian、Ubuntu使用的apt,CentOS、Fedora使用的yum。 这里推荐一个Mac上的包管理器,Homebrew。 我们只要打开浏览器,将中间的命令一整行复制下来,到终端中粘贴,然后回车。 在安装过程中,你可能遇到需要输入密码的时候。需要提醒大家的是,这里输入密码是看不到输入密码的提示的,许多初学者的感觉是密码没有输进去。不过不要紧,只要在键盘打完当前用户的密码,然后按回车即可。 第二,一个好用的Shell有助于效率的提升 在此安利一下zsh,一个比自带的bash好用得多的Shell,还有各种插件可以添加。 待homebrew安装完后,我们可以来安装一下zsh。 在终端中输入…