总是使用 GPG 对你的提交进行签名

Troubleshooting

如果你遇到了报错 signing failed: Inappropriate ioctl for device,把 export GPG_TTY="$(tty)" 加入到 .bashrc 就行了

Bash 中的参数扩展

经常容易忘,整理一下,记录下来

使用默认值

${parameter:-word}

如果 parameter 未定义或值为空,将返回 word 的扩展,否则返回 parameter 的值,parameter 本身的值不会变化。

 1 $ echo $a                    (1)
 2 
 3 $ echo ${a:-hello}           (2)
 4 hello
 5 $ echo $a
 6 
 7 $ a=hello                    (3)
 8 $ echo ${a:-world}           (4)
 9 hello
10 $ echo $a
11 hello
  1. 变量 a 未定义

  2. 变量 a 未定义,则返回 hello

  3. 变量 a 赋值

  4. 变量 a 有值且不为空,返回变量 a 本身

Bash 中的序列表达式

Bash 中序列表达式用于产生一个序列,其结构为 {start..end[..step]}。其中 startend 可以为整数或者单个字符,分别表示序列的开始与结束,可选的 step 表示生成的序列的步长,必须为整数,否则表达式无效。

整数序列

startend 都是整数时,产生从 startend,步长为 step 的整数序列。startend 可以包含若干 0 前缀,此时生成的序列中各个序列项的数字个数将相同,不足的补 0 前缀。例如:

 1 $ echo {1..10}                  (1)
 2 1 2 3 4 5 6 7 8 9 10
 3 $ echo {1..10..0}               (2)
 4 1 2 3 4 5 6 7 8 9 10
 5 $ echo {1..10..3}
 6 1 4 7 10
 7 $ echo {01..010..3}             (3)
 8 001 004 007 010
 9 $ echo {01..00010..3}           (4)
10 00001 00004 00007 00010
  1. 未指定步长时,默认为 1

  2. 步长为 0 时,采用步长为 1

  3. 输出序列项都补充到 3 个数字

  4. 输出序列项都补充至 5 个数字

Erlang 中的注册进程

Erlang 中进程间通信主要依靠向进程传递消息,可以用进程的 Pid 代表进程发送消息

1 Pid ! "some message".

当多个进程需要向某进程发送消息时,一种方法是由该进程的父进程将该进程的进程号作为参数传递给所有需要与该进程通信的进程。 当然,还有一种方法,就是使用注册进程。

注册进程

注册进程指进程在虚拟机中注册一个原子作为进程的代表名字,这个原子就可以代表进程。注册的原子具有全局作用域。

这里的全局作用域指:

  • 若工作在非分布式状态,全局作用域指当前的 Erlang 虚拟机

  • 若工作在分布式状态,全局作用域指当前 Erlang 虚拟机节点

也就是说,注册进程所注册的原子可以在当前 Erlang 虚拟机中全局使用。

使用 erlang:register(atom, Pid) 将进程 Pid 注册到原子 atom,之后就可以把此时原子就可以当作 Pid 那样使用消息发送操作符

1 atom ! "some message".

在 Vim 中使用 Gtags 进行代码导航

Gtags 是什么?

Gtags 是 GNU Global 软件包中的一个程序,因为 GNU Global 中最常用的一个程序就是 Gtags,因此如果没有特别说明,我就用 Gtags 代指 GNU Global。GNU Global 是 GNU 项目组开发的类似于 Ctags 的代码导航工具,可以为 Vim, Emacs 等添加代码跳转功能。GNU Global 内置的解析器支持 C, C++, Java, PHP, ASM, YACC 六种语言,通过 exuberant-ctags 扩展可以支持 Ctags 支持的所有语言。

关于 Gtags 与 Ctags 等其它相关工具的比较可以戳这里 Comparison-with-Similar-Tools

GNU Global 里面最常用的两个程序是 gtags gtags-cscope。分别用来替代 ctags cscope

Gtags 和 Global 的使用

和 Ctags 一样,要使用 Gtags,也需要对源代码进行索引,生成 tags 文件。

Perl 中的 Typeglob 及 Exporter 工作原理

每个包都有一个符号表

Perl 中每个包,都有一个符号表,存放了当前包中定义的变量和子例程。符号表是一个名字为 %PackageName:: 的散列表。散列表的键是变量名。

在默认的包(不属于任何包)里,该符号表为 %main:: 或者 %::

既然符号表是一个散列表,那么就可以遍历它。

1 while (my ($k, $v) = each %::) {
2     say "$k => %v";
3 }

仅有使用 our 定义的变量才会被记录进符号表里,而使用 my 定义的变量不会被记录,没有使用这两个关键词定义的变量默认为 our 定义的,所以会记录进符号表。

Perl 的包加载机制

Perl 中有两个方法加载包: userequire

1 use warnings;
2 require warnings;

use 和 require 的区别

use 只能加载模块

use warnings; 会在 @INC 目录下寻找文件名为 warnings.pm 的模块,并加载它。

require 可以加载模块和文件

1 # 可以用字符串明确表示文件名
2 require 'strict.pm';
3 
4 # 等价于 require 'warnings.pm';
5 require warnings;
6 
7 # 也可以用来执行文件
8 require 'export.pl';

使用 XPath 获取 XML 文档的数据

XPath 简介

XPath 是使用路径表达式快速在 XML 导航的 W3C 标准

节点类型

XPath 中有七种类型的节点: 元素、属性、文本、命名空间、处理指令、注释以及文档(跟)节点。

对于下面的 HTML

 1 <html lang="zh_CN">                     (1) (2)
 2   <head>                                (3)
 3     <title>Hello XPath</title>          (4)
 4   </head>
 5 
 6   <body>
 7     <!-- comments -->                   (5)
 8     <p>XPath</p>                        (4)
 9   </body>
10 </html>
  1. html 是文档(跟)节点

  2. lang 是属性节点

  3. headbody 是元素节点

  4. Hello XPathXPath 是文本节点

  5. <!-- comments -→ 注释节点

Gentoo 如何选择合适的 USE 选项

对于初次使用 Gentoo 的用户来说,除了内核编译外,最大的疑惑莫过于 USE 变量的作用了,虽然说看见官方的文档说 USE 是用来控制编译选项的,但是却依然不容易理解 USE 到底是怎样工作的。

首先来了解一下 USE 变量的值是如何在 Ebuild 和用户之间交互的。

Ebuild 与用户的交互

Ebuild 提供 USE 选项

一个 ebuild 文件通过设置 IUSE 变量的值来决定这个包提供哪些 USE 可供自定义。比如 dev-vcs/git

1 # 还有很多,这里只节选部分
2 IUSE="+curl cgi emacs +gpg gtk highlight +pcre +perl +python +threads"

表示 dev-vcs/git 提供了如上面这些 USE,前面有 + 表示默认是选中的,没有 + 表示默认不选中。

快速重装 Gentoo

平时用 Gentoo 时有个习惯,Portage 添加了 FEATURES="buildpkg"

这个功能是在安装包的时候,顺便把编译好的二进制包存到 /usr/portage/packages 下,以作重装使用。

所以重装时,就可以用这些二进制包来重装,以避免重复编译浪费时间。

备份 portage 配置文件

包括 /etc/portage/ 目录,/var/lib/portage/{world, world_sets} 等文件,可以用 git 同步到 Github 或者 Bitbucket。

制作二进制包

因为 /usr/portage/packages 下可能存在一个软件的多个版本,而我们只需要最新版本,所以可以使用 eclean packages 清除旧版本的包,只保留最新版本。

而之前没有注意备份二进制包的话,可以使用 quickpkg 创建二进制包。

1 sudo quickpkg --include-config y `equery -qC l *' -F'$cp'`
  • --include-config y 表示连同软件的配置文件一同打包,因此安装了之后无需再次配置。

  • equery -qC l *' -F'$cp' 用来列出当前系统中所有已安装的包。

关于 Gentoo 的 sets, world, word_sets

sets

sets 表示一个拥有若干软件包的集合,相当于软件组。系统预定义了一些 sets,可使用 --list-sets 查看所有 sets (包括自定义)

1 $ emerge --list-sets
2 devel
3 downgrade
4 installed
5 selected
6 system
7 world
8 ...

可以自己定义 sets

将其定义在 /etc/portage/sets 下就行了,比如定义一个 mediasets

1 $ cat /etc/portage/sets/media
2 app-i18n/fcitx
3 app-i18n/fcitx-configtool
4 app-i18n/fcitx-sunpinyin
5 app-misc/screenfetch
6 media-gfx/gimp
7 media-gfx/scrot
8 ...

Gentoo 下 wpa_supplicant 显示ioctl: Invalid argument

电脑拿回来了,新编了个内核。开机没有自动联网。手动启动显示如下。

* Starting WPA Supplicant Daemon ...
ioctl[SIOCSIWPMKSA]: Invalid argument
ioctl[SIOCSIWMODE]: Invalid argument
ioctl[SIOCGIWRANGE]: Invalid argument
ioctl[SIOCGIWMODE]: Invalid argument
ioctl[SIOCSIWAP]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument

后来发现是内核选项的问题。选中 Networking support > Wireless > cfg80211 > cfg80211 wireless extensions compatibility 就行了,默认是没有选中的。