editorconfig-logo

利用 EditorConfig 定义代码格式,统一代码风格

在多人协作的项目中,为了同一代码格式,可以使用 editorconfig 来定义,这样不仅可以帮助协作者快速了解当前项目要求的代码风格,也可以方便使用一些格式化工具保证代码风格按照预期格式化。 快速了解 What is EditorConfig? EditorConfig helps maintain consistent coding styles for multiple developers working on the same project across various editors and IDEs. The EditorConfig project consists of a file format for defining coding styles and a collection of text editor plugins that enable editors to read the file format and adhere to defined styles. EditorConfig files are easily readable and they work nicely with version control systems. Source: https://editorconfig.org/ ...

2021年1月29日 · Aimer Neige
Rime logo

Linux 下安装 fcitx5 与 Rime

前言 Linux 下中文输入法一直是硬伤,各种方面都没有 windows 或 mac 下好用,最近在逛 github 的时候偶然翻到一个仓库 四叶草拼音输入方案,这个仓库提供的输入方案用起来十分舒服,但是在安装的时候也遇到一些坑,于是写了这篇文章来记录。 测试环境: .............. aimerneige@an ..,;:ccc,. ------------- ......''';lxO. OS: Kali GNU/Linux Rolling x86_64 .....''''..........,:ld; Host: TM1701 .';;;:::;,,.x, Kernel: 5.9.0-kali4-amd64 ..'''. 0Xxoc:,. ... Uptime: 2 hours, 11 mins .... ,ONkc;,;cokOdc',. Packages: 3537 (dpkg) . OMo ':ddo. Shell: zsh 5.8 dMc :OO; Resolution: 1920x1080, 1440x2560 0M. .:o. DE: GNOME 3.38.2 ;Wd WM: Mutter ;XO, WM Theme: Kali-Dark ,d0Odlc;,.. Theme: Kali-Dark [GTK2/3] ..',;:cdOOd::,. Icons: Flat-Remix-Blue-Dark [GTK2/> 3] .:d;.':;. Terminal: gnome-terminal 'd, .' CPU: Intel i7-8550U (8) @ 4.000GHz ;l .. GPU: NVIDIA GeForce MX250 .o GPU: Intel UHD Graphics 620 c Memory: 3698MiB / 15899MiB .' . 安装 fcitx5 sudo apt install fcitx5 启用 fcitx5 im-config 在开启的图形化界面中启用 fcitx5 ...

2020年12月13日 · Aimer Neige

每天一个 Linux 指令

ifconfig ➜ ~ ifconfig enx2c16dba37d18: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.117.154 netmask 255.255.255.0 broadcast 10.0.117.255 inet6 2001:250:c00:218:5bd6:795c:5b92:e787 prefixlen 64 scopeid 0x0<global> inet6 fe80::2224:6ee:2527:f54d prefixlen 64 scopeid 0x20<link> inet6 2001:250:c00:218:44fc:ad73:aeb8:b07d prefixlen 64 scopeid 0x0<global> ether 2c:16:db:a3:7d:18 txqueuelen 1000 (Ethernet) RX packets 110382 bytes 150904005 (150.9 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 30811 bytes 3569027 (3.5 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 26251 bytes 4892192 (4.8 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 26251 bytes 4892192 (4.8 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.7.243 netmask 255.255.255.0 broadcast 192.168.7.255 inet6 fe80::1dea:1bcb:ae17:fa3b prefixlen 64 scopeid 0x20<link> ether d0:c6:37:dd:91:95 txqueuelen 1000 (Ethernet) RX packets 17759 bytes 19498138 (19.4 MB) RX errors 0 dropped 7 overruns 0 frame 0 TX packets 6341 bytes 911629 (911.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ping Linux 服务器无法上网 ...

2020年11月10日 · Aimer Neige

这不是 Bug,而是语言特性

今天遇到一个奇怪的问题: 一个 C 语言初学者写了这样的错误代码: switch (a) { case1: // do something break; case2: // do something break; case3: // do something break; default: break; } 错误很容易解决,但是,在编译这样的程序时,编译器居然没有报错??!! 那么 case1 case2 这些东西是哪里来的? 几番求证无果,最后在翻阅《C 专家编程》这本书的时候突然发现了原因: 首先像下面这样写是可以的: switch (i) { case 5 + 3: do_again: case 2: printf("I loop unremittingly\n"); goto do_again; default: i++; case 3: ; } 这里定义了一个标签 do_again,并且通过 goto 跳转。 原错误代码中 case1 case2 等被编译器理解为了标签。 由于 goto 不被建议使用,博主居然已经忘记了标签和 goto 的用法。 不管怎么说,问题解决了。 这不是 Bug,而是 C 语言的特性。 #(滑稽) 类似地,有如下代码: ...

2020年11月5日 · Aimer Neige

C 函数指针

函数指针在大型的 C 语言项目中十分重要,但是学校对它的介绍一带而过,国内一些介绍函数指针的文章十分粗浅甚至存在错误(这里就不点名了),因此博主写了这篇文章介绍函数指针,希望能够帮助一些 C 语言学习者。 文章部分内容翻译引用于 https://www.geeksforgeeks.org/function-pointer-in-c/ 函数指针的概念 类似变量,函数也会被分配一段存储空间,这段存储空间的首地址即被称做这个函数的地址。而且函数名表示的就是这个地址。既然是地址,我们就可以定义一个指针变量来存放,这个指针变量就叫做函数指针变量,简称函数指针。 函数指针的定义 下面的语句定义了一个指向函数的指针变量 p。其中 void *表示返回值,(*p) 表示 p 是一个指针变量, (int, float) 是函数的参数列表。 void *(*p) (int, float); 这样我们就得到了一个指针变量 p,它的类型为 void * (*)(int, float) 所以函数指针的定义方法为: 函数返回类型 (*指针变量名) (函数参数列表); 这里的函数参数列表类似函数声明,只需写出变量类型即可,并不需要定义变量。 即下面的俩种写法等价并且第二种写法中定义的变量并没有任何意义,建议使用第一种写法,不要使用第二种写法。 void *(*p) (int, float); void *(*p) (int a, float b); 如何对函数指针赋值 int Func(int x); // 函数的声明 int (*p) (int x); // 函数指针的定义 p = &Func; // 函数指针的赋值 p = Func; // 另一种可行的写法 注:对于俩种赋值写法的详细说明见对函数赋值和调用的一些说明 函数指针的调用 #include <stdio.h> int max(int a, int b); // 函数声明 int main(int argc, char const *argv[]) { int a = 12; int b = 32; int (*p)(int, int); // 函数指针定义 p = &max; // 函数指针赋值 int c = (*p)(a, b); // 函数指针的调用 printf("%d\n", c); // 输出 `32` return 0; } // 函数定义 int max(int a, int b) { return a > b ? a : b; } 另一种可行的写法 ...

2020年11月4日 · Aimer Neige

C 语言多线程基础

线程于进程的对比 thread 线程 有共享内存 process 进程 没有共享内存 gcc file.c -lpthread 创建线程 #include <stdio.h> #include <pthread.h> void *myfunc(void *args) { for (int i = 0; i < 50; i++) { printf("%d\n", i); } return NULL; } int main() { pthread_t th1; pthread_t th2; pthread_create(&th1, NULL, myfunc, NULL); pthread_create(&th2, NULL, myfunc, NULL); pthread_join(th1, NULL); pthread_join(th2, NULL); return 0; } 传入参数 #include <stdio.h> #include <pthread.h> void *myfunc(void *args) { char *name = (char *)args; for (int i = 0; i < 50; i++) { printf("%s %d\n", name, i); } return NULL; } int main() { pthread_t th1; pthread_t th2; pthread_create(&th1, NULL, myfunc, "th1"); pthread_create(&th2, NULL, myfunc, "th2"); pthread_join(th1, NULL); pthread_join(th2, NULL); return 0; } 分部计算 ...

2020年11月1日 · Aimer Neige

C 语言静态函数

在 C 语言中,函数默认是全局的。在函数前加“static”关键字可以使一个函数变成静态函数。例如,下面的函数 fun() 是静态的: static int fun(void) { printf("I am a static funciton.\n"); } 与 C 语言中的全局函数不同,对静态函数的访问仅限于声明它们的文件。因此,当我们想要限制函数的访问时,我们可以将函数定义为静态的。另外,如果我们想要在其他文件中使用相同的函数名,我们也可以将函数定义为静态的。 例如,我们在文件 file.c 中存储了下面的程序: // in file `file1.c` #include <stdio.h> static void fun1() { printf("fun1 called.\n"); } 然后,我们在文件 file2.c 中存储了这样的程序: // in file `file2.c` #include <stdio.h> int main(void) { fun1(); return 0; } 接下来,如果我们按照如下的命令编译: gcc file2.c file1.c 你会得到这样的链接错误: undefined reference to `fun1' 这是因为 fun1() 函数在 file1.c 中被定义为静态,因而不能在 file2.c 中引用。

2020年10月31日 · Aimer Neige

在 Windows10 安装和配置 alacritty

注意将本文章提到的路径中 AimerNeige 修改为自己的用户名,之后不再赘述。 安装 alacritty 按照自己的喜好 在 GitHub 下载最新版 release 或自己编译。 本次演示中可执行文件存储目录: C:\Tools\Alacritty\alacritty.exe 配置 alacritty 将配置文件放置在如下目录: C:\Users\AimerNeige\AppData\Roaming\alacritty\alacritty.yml 配置方法和 Linux 下类似。 我的配置文件 将 alacrity 注册为右键菜单启动 新建文本文件,填入如下内容,修改后缀为 .reg 运行,将配置写入注册表。 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Background\shell\alacritty] @="Alacritty terminal here" "Icon"="C:\\Tools\\Alacritty\\alacritty.ico" [HKEY_CLASSES_ROOT\Directory\Background\shell\alacritty\command] @="C:\\Tools\\Alacritty\\alacritty.exe" 当然,你也可以按照自己的喜好手动编辑注册表。 其中 Icon 这一行中使用的的图标文件可以在 GitHub 官方仓库 下载,或者也可以使用自己喜欢的内容。 你也可以将 @="Alacritty terminal here" 修改为自己喜欢的内容。

2020年10月22日 · Aimer Neige

GCC 基础

GCC 简介 GCC 是 Linux 下的编译工具集,是 GNU Compiler Collection 的缩写,包含 gcc 、 g++ 等编译器。这个工具集不仅包含编译器,还包含其他工具集,例如 ar 、 nm 等。 GCC 工具集不仅能编译 C/C++ 语言,其他例如 Objective-C 、 Pascal 、 Fortran 、 Java 、 Ada 等语言均能进行编译。 GCC 在可以根据不同的硬件平台进行编译,即能进行交叉编译,在 A 平台上编译 B 平台的程序,支持常见的 X86 、 ARM 、 PowerPC 、 mips 等,以及 Linux 、 Windows 等软件平台。 GCC 的 C 编译器 是 gcc,其命令格式为 : Usage: gcc [options] file... GCC 下默认文扩展名的含义: 文件扩展名 GCC 所理解的含义 *.c 该类文件为 C 语言的源文件 *.h 该类文件为 C 语言的头文件 *.i 该类文件为预处理后的 C 文件 *.C 该类文件为 C++ 语言的源文件 *.cc 该类文件为 C++ 语言的源文件 *.cxx 该类文件为 C++ 语言的源文件 *.m 该类文件为 Objective-C 语言的源文件 *.s 该类文件为汇编语言的源文件 *.o 该类文件为汇编后的目标文件 *.a 该类文件为静态库 *.so 该类文件为共享库 a.out 该类文件为链接后的输出文件 GCC 下有很多编译器,可以支持 C 语言,C++语言等多种语言 ...

2020年10月17日 · Aimer Neige
nginx-logo

使用 Nginx 搭建静态网页服务

使用 Nginx 搭建静态网页服务本身是一件非常简单的事,但是我之前在 CSDN 找了几篇教程,弄了一下午也没弄好(不愧是屎山淘金),学了一段时间后端和 Linux 后,我大概只用了五分钟就弄好了,这里写一篇文章来帮助一下小白。 阅读须知 在阅读本文章前,你需要准备以下内容 掌握基础的 Linux 命令行操作 (本文章将介绍如何在 Linux 服务器上部署静态网页,需要进行终端操作,因此你必须掌握命令行的使用。如果你打算使用 Windows ,请查阅其他文章。) 拥有一台 Linux 服务器 (可以购买 VPS 也可以使用 虚拟机 本文章以 VPS 为例,并购置了域名 (域名非必须) ) 拥有一个静态网站的源码 (如果仅仅作为学习目的,你可以写一个简单的 HTML 文件,这里以使用 hexo 生成的静态网站为例。) 知道 Nginx 是什么,有什么用 (不需要掌握 Nginx) 不同 Linux 发行版下命令会有所区别,本文章以 Ubuntu20.04 为例 准备服务器 如果你已经有了一台服务器并安装好了 Nginx ,你可以直接跳过这一部分,但是如果你的服务器是新的,没有经过任何配置,请参阅以下内容进行配置。 升级系统 sudo apt update && sudo apt upgrade 安装 Nginx sudo apt install nginx 启动 Nginx sudo systemctl start nginx # 开机自动启动 sudo systemctl enable nginx 测试服务 直接在浏览器访问你服务器的 ip,如果你部署了 DNS 服务的话,你也可以直接使用域名。如果哦看到 Nginx 的欢迎界面,服务器准备成功! ...

2020年10月4日 · Aimer Neige