CMake备忘录

在使用CMake之前,我完全没想过会遇到那么多棘手的问题。官方文档叙述的相当隐晦,网络上流传的很多用法都过时了。

首先CMakeList.txt是必要的。

project(nt VERSION 1.0.0 LANGUAGES CXX)
add_executable(nt src/main.cc)

add_library(futils src/futils.cc)

target_include_directories(futils
  PUBLIC
    $
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src
)
target_link_libraries(nt futils)
target_compile_options(nt PRIVATE -Werror)
target_compile_features(nt PRIVATE cxx_std_17)

这是个最简易的模板,后续想到什么再补充。

Fedora淌坑记录

之前用了很久Ubuntu,后来不记得被谁安利用了fedora。其实除了dnf和apt,其他差异都逐渐趋同了。本文会逐渐添加记录。

拼音

我很难想象我是怎么用原装输入法写了那么多字。开这个坑,就是因为原装输入法实在令人崩溃。我也奇怪之前怎么没有考虑装个搜狗。不过fedora26貌似有了云拼音,不妨一试。

sudo dnf install fcitx-cloudpinyin

Continue reading Fedora淌坑记录

重拾Python

我最初学习的语言就是Python,不记得为什么之后没再用过它。那时候刚有python3,完全没普及。本文从初学者的角度,看看python3在语言层面,有什么有趣的东西。

运算符

python的运算符比常规语言多一点,而且令人印象深刻。

  • 常规运算,+ – * / %
  • 地板除,//;乘方,**
  • 交互模式下有_,上一次输出的字符。
  • 赋值,=。可以多重赋值,比如交换变量
    a = 1
    b = 2
    a, b = b, a
    

    Go貌似也学了这一招。

Continue reading 重拾Python

Linux命令备忘录

Linux系统作为日常使用问题还是很多的,所以开篇博文记录一下。

常用命令

这些命令事关生存,理论上不会忘。但还是列一些出来。

  • 手册: man, info
  • 文件目录: ls, cd, mkdir, touch, mv, rm
  • 权限: chmod, chown, chgrp
  • 读操作: cat, less, more, head, more
  • *写*操作: tee,echo
  • 时间: date, cal
  • 进程:ps, kill
  • 网络状态: ip, ifconfig, netstat
  • 关机重启: shutdown, poweroff, halt, reboot
  • 系统状态: top, free, uptime, vmstat, df, du
  • 清屏:clear

Continue reading Linux命令备忘录

发声技术简论

最近学习了一点声乐理论,颠覆了我的认知。首先,它经历过很多变革;其次有大量数据具有误导性。本文选择从国内流行乐展开讲述。接下来的内容没有图片和音频,我只打算从逻辑上说通问题。

声带

有一种说法叫喉头振动机制(Laryngeal Vibratory Mechanisms)。将声带振动分为M0, M1, M2, M3。

  • M0,也就是气泡音(vocal fry)的振动方式
  • M1,重机能发声,以甲杓肌收缩为主导。也就是广义的真声。一般男性极限音高在F4,女性在C5。说的是未经训练,下同。
  • M2,轻机能发声,以环甲肌拉长为主导。也就是广义的假声。一般男性音高极限在G5,女性在A5。
  • M3,哨音,貌似又叫海豚音。这个东西很有意思,理论上有分歧,主流观点认为M3几乎不振动声带,而是由整个喉腔形成哨的结构。

Continue reading 发声技术简论

抽象价值之简述

我在《实现drop函数》一文最后留了个问题:

抽象的价值是否就在于将问题映射到更简单的解空间?

这只是我的Shower Thought。但可以就其展开谈一些有趣的事。

首先,抽象这个词在中英文语境的含义不一样。其次,抽象的概念本身就很难解释(你看我一不小心就递归了:-p)。本文将从一个编程者的角度阐述一些问题。

辞源

抽象的英文是abstract,看词根就是牵拉的意思。15世纪艺术届大量使用abstract表示分离现实物质的行为。比如说抽象画,它的一大要素就是去除事物的外在特征。可能是同期艺术界千奇百怪的作品被冠名“抽象”,让这个词有了“高深”或“难以理解”的含义。

中文的抽象一词源头已经不可考,但它的含义已经被各种后现代艺术,娱乐作品转义了不知道多少次。工程上所谓的抽象出现不超过200年。 Continue reading 抽象价值之简述

现代C++神器之variant

看过这两年的Cppcon都应该对variant印象深刻。说起来这个玩意也不算新,2002年就已经有了boost::variant

说到variant就得提起enumunionunion对非C系编程者可能有点陌生。按照当代角度,enum和union很大一部分作用在于缩减定义域。举例如下:

//choose one implementation below
enum OneTwoTree { ONE, TWO, TREE };
//
union OneTwoTree {
  int ONE;
  int TWO;
  int TREE;
};
//
void foo(OneTwoTree ott);

这里用OneTwoTree限制了相关领域的类型范围,比如说调用foo(4)时编译器就会报错。 Continue reading 现代C++神器之variant

尝试实现《Puyo Puyo》(1)

Puyo Puyo(魔法气泡)可能是我最喜欢的消除类游戏。规则很简单,超过四个方块连起来就会消除。如果结构设计良好,就会引发连锁反应。

13年对战纪念图

右边的结构,左下角黄色块引爆(就是消除,我习惯用引爆)之后,接着会引爆蓝色,接着引爆红色,蓝,红,绿,黄,蓝,红。左边的结构类似,当黄色块落下时会引爆11次,俗称11连锁。对我来说,这个游戏的乐趣就在于尽可能设计连锁最多的结构。 Continue reading 尝试实现《Puyo Puyo》(1)

现代C++神器之comma operator

comma operator也就是逗号。常见的用法不过是以下几种:

int a = 1, b = 2, c = 3;
foo(a, b);
tuple<int, float> t{1, 2.f};

这能有什么独特技巧?接着探索:

int a = 1;
int b = 2;
int c = a, d;
int e = (a, b);

第三行已经有点模糊,展开会比较清晰:

int c = a;
int d;

重点来了,第四行会发生什么? Continue reading 现代C++神器之comma operator