详情

全站展示位

C++ Static关键字详解方寸之间

C++的static有两种用法:面向过程程序设计中的static(延续C语言)和面向对象程序设计中的static。 面向过程: 静态全局变量: 该变量在全局数据区分配内存; 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化); 静态全局变量在声明它的整个...。。。

推荐

分类目录归档:ENglISh |

技術文章及人生思考

心灵鸡汤

泪洒通知书

文/赵同胜

我的录取通知书比别人迟发了一个多月,得到消息时,我已在补习班上了两周的课。

我的高考发生在38年前。于我这个“泥娃”而言,高考是通往“外界”唯一的一条出路,我很清楚高考对我意味着什么。

那年的高考说不上圆满,但也没糟糕到哪儿去。天生好理科,对文科没有丁点的感觉,结果也在意料之中,数理化科科优秀,而语文和政治果然不及格。无奈与大学失之交臂,好歹上了中专线,跳出农门也算有了指望。

娘一脸欢喜,我也如释重负。可天意弄人,当别人拿着录取通知书兴高采烈去学校报到时,我的通知书却迟迟不见踪影。娘急得整宿睡不着觉,脸上写满了焦躁。当过村干部的娘不甘心儿子就这么不明不白落榜,生性好强的她要去寻个究竟。可是,这对于一个没怎么见过世面的农家妇女来说,谈何容易?娘拖着一双残腿到了县上,县上的人一句话就把娘支走了,无奈,娘倒了几次车,几经辗转,到了市里,得到的答复是:压根就没有这个学生的档案。娘一惊,感到了事态的严重。娘瞪着眼睛,哆嗦着嘴唇,连一句完整的话都说不出来了。娘马不停蹄回到县里,接待她的人依旧是一副麻木的面孔,娘急了,怒了,言称卖房子卖地,也要弄个水落石出。再到市里,依然无果,娘很失落地坐在院子里,仰天长叹,伤心落泪。突然,一个领导模样的人和娘打招呼,娘认出来了,是曾在村里下过乡的老李。问明了情况,老李领着娘折回招生办,简单了解了一下情况后,老李对招生办的人说了一番言辞强硬的话,然后让娘回家等消息。

几天后,通知书终于到了,我和娘将它捧在手里,相拥而泣,泪水不小心滴落在通知书上。娘慌了,赶紧掏出手绢,轻轻地将泪水拭去,可还是留下了淡淡的印痕。

原来,是村里的对立面使了手段,在神不知鬼不觉中托人扣押了我的档案。若不是娘的坚持,若不是巧遇老李,我的第一次高考注定会成为一个“谜案”。

列表展示

主站展示位

Arch Linux 如何切换内核方寸之间

切换内核不是一件容易的事。我建议你有一个实际的理由这样做,而不仅仅是实验/为了好玩。虽然这本身并不是一个困难的过程。因为 linux 发行版通常设置为与特定内核配合使用。虽然有些不像其他发行版那样与内核紧密相连,但许多发行版维护者选择特定的内核是有原因的。Arch Linux 发行版不像 Ubuntu,RHEL

How to prettify git log output方寸之间

4 formats git log --color --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit git log --color --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit git log --color --stat --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit git log --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit Config with alias For example: use 4th format. git config --global alias.logs

CRLF与LF的差异方寸之间

大多数人应该对这两个并不陌生,但是你有深入了解过这两个概念吗?今天我们通过这篇来深入探讨一下,希望你读完这篇文章之后不会再感到困扰。 CRLF 与 LF:换行到底是什么? 要真正理解 CRLF 与 LF 换行的问题,我们需要复习一些排版历史。 人们使用字母、数字和符号来相互交流。但是计算机只能理解和处理数字。由于计算机上的文件由人类可读的字符串组成,因此我们需要一个允许我们在这两种格式之间来回转换的系统。 ASCII 标准就是这样的系统——它将 A 和 z 等字符映射到数字,弥合了人类语言和计算机语言之间的鸿沟。 有趣的是,ASCII 标准不仅仅适用于字母和数字等可见字符。某个子集是控制字符,也称为非打印字符。它们不用于渲染可见字符;相反,它们用于执行独特的操作,例如删除前一个字符或插入换行符。 LF 和 CR 就是两个这样的控制字符,它们都与文件中的行尾有关。它们的历史可以追溯到打字机时代,因此我将简要介绍其工作原理,以便了解为什么我们有两个不同的控制字符而不是一个。然后,我们将看看这如何影响开发人员的体验。 LF:换行 LF(Line Feed)代表“换行”,但你可能更熟悉术语换行符(转义序列 \n)。简单地说,这个字符代表一行文本的结束。在 Linux 和 Mac 上,这相当于新文本行的开始。这种区别很重要,因为 Windows 不遵循此约定。我们了解回车之后再讨论为什么不同。 CR:回车 CR(Carriage Return)代表回车(转义序列\r),将光标移动到当前行的开头。终端上的下载进度条就是通过CR实现的,通过使用回车符,你的终端可以通过将光标返回到当前行的开头并覆盖任何先前呈现的文本来将文本动画化。 打字机和回车(CR) 将一张纸固定在称为托架的机械卷上,为设备送入一张纸。每次击键时,打字机都会使用墨水在您的纸张上打印字母,将笔架向左移动以确保键入的下一个字母会出现在前一个字母的右侧。 当然,一旦当前行的空间用完,打字员就需要向下移动到纸张上的下一行。这是通过旋转滑架将纸张相对于打字机的“笔”向上移动一定距离来完成的。但是还需要重置托架(carriage),以便键入的下一个字符将与纸张的左侧边距对齐。换句话说,打字员需要某种方式将托架返回到其起始位置。而这正是回车的工作:一个金属杆连接到托架的左侧,当推动时,将托架返回到其起始位置。 电传打字机和回车换行(CRLF) 进入 20 世纪初,出现了电传打字机。基本上,它的工作方式与手动打字机相同,除了不是打印到物理纸上,而是通过传输器通过物理电线或无线电波将消息发送给接收方。 虽然打印方式不同,但是同样需要使用换行符 (LF) 和回车符 (CR),而且这些设备需要同时使用换行符 (LF) 和回车符 (CR) 以允许打字员从下一行文本的开头输入。毕竟手动打字机就是这样工作的,只是它没有任何“字符”的概念,因为它是一种机械操作的设备。 我们可以将 LF 和 CR 视为代表水平或垂直方向上的独立运动,而不是同时代表两者,这样更容易将其形象化。为了实现这个功能,电传打字机在一些最早的操作系统中设定了 CRLF 行尾的标准,比如流行的 MS-DOS。将CR 代表“回车”——CR 控制字符将打印头(“回车”)返回到第 0 列,而无需推进纸张。 LF 代表“换行”——LF 控制字符在不移动打印头的情况下将纸张前进一行。因此,如果您想将打印头返回到第 0 列(准备打印下一行)并推进纸张(以便在新纸上打印),则需要 CR 和 LF。 MS-DOS 使用 CRLF 的两个字符组合来表示文件中的行尾,现代 Windows 计算机一直使用 CRLF 作为行尾。同时,从一开始,Unix 就使用 LF 来表示行尾,为了一致性和简单性而放弃了 CRLF。 Apple 最初仅在 Mac Classic 上使用 CR,但最终在 OS X 上改用了 LF,与 Unix 一致。 虽然这似乎是操作系统之间的差异,但 CRLF 与 LF 的这个问题已经引起人们很长时间的头痛。其实按照今天的标准 CRLF 是多余的——同时使用回车和换行是假设你受到打字机的物理限制,你必须明确地向上移动你的纸,然后重置移动到左边距。但是对于电子文件,将换行符定义为隐式完成换行和回车的工作就足够了。换句话说,只要操作系统定义换行符表示下一行从开头开始而不是从某个任意的列偏移处开始,那么除了换行之外,我们不需要显式回车——一个符号可以完成两者的工作。 现在我们知道CRLF和CR是如何起源的,接下来我们来学习以下怎么处理相关的问题。 检查和转换行尾(在 Bash 中) 在 bash中,你可以使用带有 A 标志的 cat 查看特定文件的行尾: 如果文件使用 CRLF,您将在每行末尾看到字符串 ^M$,其中 ^M 表示回车,$ 表示换行。下面是一个示例: line one^M$ line two^M$ line three^M$ 如果文件使用 LF,那么您只会看到美元符号: line one$ line two$ line three$ ps: 你可以使用dos2unix命令行程序将文件从CRLF转换为LF。 Git中的行尾 诚然,这需要很多背景知识!但这是值得的,因为我们终于准备好讨论与 git 相关的行尾(以及如何在任何给定的代码库中解决 CRLF 与 LF 的问题)。 我们从前面可以知道CRLF和LF是不同的字符表示,因此缺少通用行结尾为 git 等版本控制软件带来了麻烦,这类软件依赖于非常精确的字符比较来确定文件自上次签入以来是否发生了变化。如果开发人员使用 Windows 并且另一个使用 Mac...

C++继承/多态/虚函数方寸之间

继承 访问控制和继承 访问publicprotectedprivate同一个类yesyesyes派生类yesyesno外部的类yesnono 一个派生类继承了所有的基类方法,但下列情况除外: 基类的构造函数、析构函数和拷贝构造函数。 基类的重载运算符。 基类的友元函数。 一个问题 #include <iostream> class A{ private: int a; char b; }; class B: public A{ public: char getc(){return this->c;} private: char c='j'; }; int main() { B test; cout<<test.getc()<<endl; cout<<sizeof(int)<<endl; // output is 4 cout<<sizeof(char)<<endl; // output is 1 cout<<sizeof(test)<<endl; // output is 8 } 如果把A的private属性a,b变成public属性,那么test的size就变成了12 继承类型 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。 保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 在多继承时,如果省略继承方式,默认为private 多态 C++多态性是通过虚函数来实现的 多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。 多态的四种形式 多态总体上分为:编译时的多态(静态多态)和运行时的多态(动态多态)。又被细分为:参数多态,包含多态,过载多态,强制多态。前两种为通用多态,后两种为特定多态。 参数多态:采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型。如 C++语言中的函数模板和类模板属于参数多态。参数多态又叫静态多态,它的执行速度快,异常少,调用在编译时已经确定。参数多态是应用比较广泛的一种多态,被称为最纯的多态。 包含多态:在许多语言中都存在,最常见的例子就是子类型化,即一个类型是另外一个类型的子类型。一般需要进行运行时的类型检查,属于动态多态。包含多态的基础是虚函数。虚函数是引入了派生概念后用来表现基类和派生类的成员函数之间的一种关系。 过载多态:同一个名字在不同的上下文中所代表的含义不同。典型的例子是运算符重载和函数重载,属于静态多态。 强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。程序设计语言中基本类型的大多数操作符,在发生不同类型的数据进行混合运算时,编译程序一般都会进行强制多态。程序员也可以显示地进行强制多态的操作。如 int+double,编译系统一般会把 int 转换为 double,然后执行 double+double 运算,这个int->double 的转换,就实现了强制多态,即可是隐式的,也可显式转换。强制多态属于静态多态。 相关概念 多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。  a、编译时多态性:通过重载函数实现  b、运行时多态性:通过虚函数实现 <<

iwd命令浅析方寸之间

介绍 iNet Wireless Daemon(iwd) 项目旨在为基于 Linux 的设备提供全面的Wi-Fi连接解决方案,由Intel团队进行维护开发。该项目的核心目标是通过不依赖于任何外部库,并最大限度地利用Linux内核提供的功能来优化资源利用率:存储、运行时内存和链路时间成本。是一个仅依赖于Linux内核和运行时C库的自包含环境(self-contained environment)。 项目架构 iwd的基本架构如下图所示: iwd需要使用ell(Embedded Learning Library)这个库来进行编译守护进程和控制实用程序的开发版本。 iwd将Linux内核的crypto子系统用于所有加密操作,不使用OpenSSL或任何其他用户空间加密库。 安装 直接使用各个发行版自带的包管理器下载即可,这里以arch系的pacman为例: pacman -S iwd 安装完软件包之后,直接使用systemctl enable iwd.service命令启动iwd服务。 基本使用方法 启动iwctl 键入以下命令进入交互式命令行: $ iwctl [iwd]# 注意:这里的[iwd]#是交互式命令行的提示符。 连接到网络 首先,如果你不知道无线设备名称,使用下面的命令列出所有 Wi-Fi 设备: [iwd]# device list 然后,要扫描网络: [iwd]# station device scan 然后,您可以列出所有可用的网络: [iwd]# station device get-networks 最后,要连接到网络: [iwd]# station device connect SSID 如果你想要手动断开网络链接,使用以下命令: [iwd]# station device disconnect 要列出以前已连接到的网络: [iwd]# known-networks list 要忘记已知网络: [iwd]# known-networks SSID forget 要显示 WiFi 设备的详细信息(如 MAC 地址): [iwd]# device device show 要显示连接状态,包括 Wi-Fi 设备的连接网络: [iwd]# station device show 如果你想进行其他操作,可以在交互式命令行中输入help获取帮助信息。 进阶使用 使用内置的网络配置 iwd内置DHCP客户端以及静态配置IP地址的功能,所以你可以不用使用独立的dhcpd软件包来管理网络。 如果使用iwd的网络配置功能,需要编辑/etc/iwd/main.conf并添加以下部分(如果不存在就手动创建): [General] EnableNetworkConfiguration=true MAC地址随机化 01. 基本方法 IWD在版本初期已经支持将MAC地址随机化了,不过刚开始在IWD的整个生命周期内仅对地址随机化了一次。在1.6版本中,添加了基于每个网络的随机地址的功能。这个功能可以在IWD的主配置文件(默认为/etc/iwd/main.conf)中启用此功能: # main.conf [General] AddressRandomization=network p.s.如果设置_AddressRandomization=once__,MAC地址只在iwd启动或硬件启动时第一次被检测到时随机化一次_;如果设置AddressRandomization=disabled,显而易见,就是不隐藏MAC地址,使用真实地MAC地址。 其实这个时候的MAC地址并不是真正意义上的随机,而是伪随机,因为这个MAC地址是使用SHA256摘要从永久适配器地址和所连接的SSID生成的--这也就意味着,如果使用同一个网络所随机化生成的MAC地址是一样的。通常来说,对于普通用户来说已经足够了。 02. 高级方法 如果你想使用IWD来完全随机化你的MAC地址,那么可以使用AlwaysRandomizeAddress选项来生成。 AlwaysRandomizeAddress=true 下面列举一些常用网络配置选项:![常用网络配置选项](/media/editor/Screenshot 2023-01-14 222054_20230114222118417000.png)03. 设定随机化范围 iwd配置中还有一个AddressRandomizationRange选项,用来控制地址的哪一部分是随机化的,那一部分是真实的。 当你把“AddressRandomizationRange”设置为“nic”时,仅NIC特定的字节(最后3个字节)是随机的。有一点要注意,随机范围限制为00:00:01至00:00:FE。物理网卡的mac地址用于前3个字节。 当使用“AddressRandomizationRange”设置为“full”时,MAC地址的6个字节都是随机的。

如何将Julia添加到Jupyter Notebook方寸之间

Julia是一门灵活的动态语言,适合用于科学计算和数值计算,并且性能可与传统的静态类型语言媲美。JupyterNotebook是目前最流行的数据科学Web程序,功能涵盖数据清理和转换,数值模拟,统计建模,数据可视化,机器学习等。本文旨在使用IJulia将Julia集成到Jupyter交互式环境中。本文假设你已经安装好了Julia和Jupyter环境。 第一步 在命令行键入julia,运行Julia程序,出现以下提示: $ julia _ _ _(_)_ | Documentation:

C++ Static关键字详解方寸之间

C++的static有两种用法:面向过程程序设计中的static(延续C语言)和面向对象程序设计中的static。 面向过程: 静态全局变量: 该变量在全局数据区分配内存; 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化); 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的; 静态全局变量不能被其它文件所用; 其它文件中可以定义相同名字的变量,不会发生冲突; 静态局部变量: 该变量在全局数据区分配内存; 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化; 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0; 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束; 静态函数: 在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。 其它文件中可以定义相同名字的函数,不会发生冲突; 面向对象 静态数据成员 对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。 静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。 静态数据成员和普通数据成员一样遵从public,protected,private访问规则。 静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。 类的静态数据成员有两种访问形式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名> 静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值> 静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了; 同全局变量相比,使用静态数据成员有两个优势: 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性; 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能; 静态数据函数 类体外的函数定义不能指定关键字static; 静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数; 非静态成员函数可以任意地访问静态成员函数和静态数据成员; 静态成员函数不能访问非静态成员函数和非静态数据成员; 调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:<类名>::<静态成员函数名>(<参数表>)调用类的静态成员函数; 由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长; 静态成员函数可以继承和覆盖,但无法是虚函数 Rerference

[译]费曼技巧:最好的学习方式方寸之间

写在前面 最近读书的时候偶然发现了费曼技巧,所以查阅了一些资料,找到了这篇文章,写的还不错,就翻译了一下给大家看看,原文在这里。 其实费曼技巧原理很简单,当时了解到的时候,就感觉有点像我给自己的父母去解释一些新的概念的时候的思路:用简单的语言去解释一些较为复杂的概念,在这个思路的转换期间,你也就学会了这个概念。 如果你正在寻找一种方法来增强你的学习并变得更聪明,那么费曼技术可能就是绝对学习任何东西的最佳方法。 费曼技巧(Feynman Technique)有四个步骤: 选择想学习的概念 假装正在将其教给小孩子 找出解释中的空白(gaps,自己不理解的部分);回到原始资料,以更好地理解它。 查看并简化(可选) 如果你不学习,就表示停滞不前。但是,我们如何获得关于所学知识的反馈?以及我们如何去学习新的学科并找出我们现有知识中的空白? 两种知识 费曼了解了解某事和知道某事的名字之间的区别,这是他成功的最重要原因之一。我们大多数人专注于错误的知识类型。第一种知识集中在知道事物的名称,即所谓的事物名称。第二种知识重点是实际了解一些东西,即了解一些东西。 “说自己知道自己的想法但无法表达的人通常不知道自己的想法。” —莫蒂默·阿德勒 费曼技巧 第一步:教给孩子(Teach it to a child) 取出一张空白的纸。在顶部写下你要学习的主题。现在,把你要了解的所有知识写出来,就像在教给孩子一样。不是你的聪明成人朋友,而是12岁的孩子,而且他的词汇量和注意力跨度足以理解基本概念和关系。 事实证明,我们欺骗自己的方法之一就是我们使用了复杂的词汇和行话,以掩盖我们缺乏理解的事实。 当你以一种可以让孩子理解的简单语言从头到尾写下一个想法时,你会强迫自己更深入地理解该概念,并简化这些想法之间的关系和联系。其中一些可能很容易理解。在这些地方你可以清楚地了解该主题。在其他时候,你会很挣扎。这些是你在理解上有一些空白的地方。 第二步:检查(Review) 只有当你遇到知识上的空白时,即你忘记了重要的东西,无法解释它,或者只是在思考一些因素如何相互作用时,才能真正开始学习。 既然你已经知道自己陷于何处,那就回到原始资料重新学习它,直到可以用基本术语进行解释。当你可以不加专业术语地阐述自己的理解时,就可以表明自己真正理解它了。这是学习新知识所必需要的努力,如果你跳过这一步会导致“已经理解了“的错觉。 确定自身的理解范围还可以限制您可能犯的错误,并增加应用知识时获得成功的机会。 第三步:组织和简化(Organize and Simplify) 现在,你有了一组手工制作的笔记。检查它们,以确保你没有错误地从原始资料中借用任何专业术语。将它们整理成一个简单的解释,你可以说出来给自己听。如果阐述的不简单或听起来令人困惑,则表明你对该领域的理解仍需要一些努力。 如果你一遍又一遍地遵循这种方法去学习新的知识,最终将得到一个装订满各种主题页的活页夹。如果你每年花费一些时间整理这种活页夹,你会发现你已经学会了很多东西。 第四步:可选:传播(Transmit) 如果你真的想确定自己的理解力,那就把它说给某个人听(最好是对这门学科了解甚少的人,或者找到那个12岁的孩子!)。对你掌握的知识的最终考验是你将知识传达给他人的能力。 费曼技巧不仅是学习的绝妙方法,而且还是进入不同思维方式的窗口,可让你将想法分解并从头开始进行重构。你不仅可以加强自己的学习,而且还可以加强他们的学习。重要的是,以这种方式处理问题可以使你了解那些不知道他们自己在说什么的人。(请参阅贝茨模拟)Feynman的方法直观地认为,智力是成长的过程,与Carol Dweck的著作很好地吻合,后者很好地描述了固定和成长心态之间的差异。

Archlinux Install & ConfigArch Linux Installation Guide on HP Pavilion方寸之间

My computer details: Computer: HP Pavilion laptop CPU: Intel i5-8250U GPU: NVIDIA MX150 Pre-installation Verify the boot mode To verify if it is UEFI mode, use this command: ls /sys/firmware/efi/efivars If it show some details, the system is UEFI. Otherwise, the system may be booted in BIOS or CSM mode. Connect to the internet Because I'm using HP laptop. so i just need connect to wifi with this command wifi-menu. If you want to connect to wired network, reference official guide about dhcpcd You can check this connection by ping www.archlinux.org. Update the system clock Use timedatectl set-ntp true to ensure the system clock is accurate, to check the service status, use timedatectl status. Partition the disks Use lsblk or fdisk -l to vertified device. First, run fdisk /dev/sda(note: if your device is /dev/sdX, run fdisk /dev/sdX), and you will enter the fdisk dialog. Next enter m...

Git中的一个特殊hash方寸之间

最近了解了一点Git的内部原理,看到了一个特殊的hash,所以写了这一篇文章来分享自己的看法。 ============== 既然你读这篇文章,那就意味着你应该比较熟悉Git的一系列操作,不过,在你使用 Git 的时候,你有没有遇到以下hash: 4b825dc642cb6eb9a060e54bf8d69288fbee4904 可能你会觉得git中的每个对象都有一个hash值,谁会注意hash的数值。确实,没有人会注意。 但是上面的这个hash确实是一个很特别的hash,接下来就来说明为什么这个hash是一个特殊的存在。 git中hash从哪里来? 每个 git 存储库,即使是空存储库也将包含这段hash。这可以通过 git show 验证: $ git show 4b825dc642cb6eb9a060e54bf8d69288fbee4904 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 那么这个hash是从哪里来的呢?在这之前我们需要了解一点Git的知识:Git 的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容。 我们可以使用git hash-object命令来存储一个对象并获取该对象的键。 $ echo 'test' | git hash-object -w --stdin 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 Git 内部存储的数据类似下面这样,其中每个对象都有其对应的hash值: ps:如果你仍然好奇,Pro Git 的 Git Internals 章节有更多详细介绍。 那么接下来说正题,这个特殊hash是如何产生的呢?它实际上是一棵空树的哈希值。可以通过为空字符串的/dev/null创建对象哈希来验证: $ git hash-object -t tree /dev/null 4b825dc642cb6eb9a060e54bf8d69288fbee4904 //或者 $ echo -n '' | git hash-object -t tree --stdin 4b825dc642cb6eb9a060e54bf8d69288fbee4904 空树hash的特殊用处 空树hash可以与git diff一起使用。例如,如果你想检查目录中的空白错误,您可以使用 --check 选项并将 HEAD 与空树进行比较: $ echo

Make a TODO robot with Github Actions方寸之间

What's Github Actions Github Actions is a CI(continuous integration) and CD(continuous deployment) service that help you automate your software development workflows in the same place you store code and collaborate on pull requests and issues. It was launched in October 2018 and was officially available to all users in November 2019. With Github Actions you can write individual tasks, called actions, and combine them to create a custom workflow. Workflows are custom automated processes that you can set up in your repository to build, test, package, release, or deploy any code project on GitHub. You can create workflows using actions defined in your repository, open source actions in a public repository on GitHub, or a published Docker container image. But workflows in forked repositories don't run by default. If you don't want to create your actions by yourself, you can discover actions in the GitHub Marketplace, also...

黑科技:使用GitHub搭建自己的短链接服务方寸之间

前两天偶然在GitHub发现一个挺有意思的项目,可以不依赖自己的服务器、数据库来构建一个短链接服务。自己尝试了一下,还挺简单的。这里记录一下自己的构建流程,感兴趣的小伙伴可以自己尝试一下。 Prerequisites 新建两个GitHub仓库,一个用来做服务器存储源码、提供服务(url_shortener),一个用来做数据库存储链接(url_shortener_db) 注册一个域名(可选),如果没有的话,可以直接使用GitHub pages的域名(username.github.io)。不过我是用了自己注册的域名:blog.johan.zone 获取及配置源码 首先,你需要获取这个服务的源代码,你可以直接fork这个源码仓库,当然也欢迎fork我的代码仓库。 然后,克隆自己的仓库到本地(当然,你也可以直接在GitHub网页上操作),修改404.html文件的GITHUB_ISSUES_LINK字段,指向自己的url_shortener_db仓库,这个仓库的issues就是作为存储你的链接的数据库: var GITHUB_ISSUES_LINK =

Linux挂起和休眠的区别方寸之间

linux的挂起和休眠之间的区别到底是什么? Linux有三种挂起方式:挂起至RAM(通常称为suspend)

快速查看github代码库中某次commit的记录方寸之间

如果你想要学习一个开源库,最好的方法就是从头开始看源码,所以你可能想要从第一次commit开始看。有的人可能觉

ArchLinux最新安裝教程方寸之间

前言 自从3月份从Arch换到Fedora系统之后,刚开始感觉还不错,因为大部分东西都已经帮你搞定了,自己只要

How to prettify git log output方寸之间

4 formats git log --color --date=format:'%Y-%m-%d %H:%M

博客寄语:

    There are two wolves who are always fighting. One is darkness and despair. The other is light and hope. The question is... which wolf wins?

实时播报:

博客号-学习成长

相信每一分耕耘都有每一分收获,致力帮助博客主所创作的博客能更快的被收录! 如果有其它需求,可联系下方邮箱。