额,Rust

首先,我觉得利益和技术需求远不足以撑起Rust社区,那剩下就是情怀了~

近几年新语言的官方定位和实际应用普遍有偏差。Rust是个例外,剑指C++,意在打造一个没有历史包袱的Modern语言。(我觉得阻碍Scala发展的其中一个原因也是迎合Java)。经历了大大小小的版本变革,Rust基本稳定了,并且社区反馈不错。学了点简单内容,记录一下。

管理工具

官方钦定了cargo

cargo new <ProjectName> --bin
cargo check
cargo build
cargo run

不加–bin默认编译出库。编译运行不加–release默认是debug版本。默认会创建git配置可以说非常方便。 Continue reading 额,Rust

Vim备忘录

经常忘事,写个备忘录。

跳转命令
  • hjkl,左下上右。
  • ^H^L^M,页顶,页底,页中。
  • ^F^B^U^D。前后翻一页,上下翻半页。
  • 0 $,行首行尾。我觉得$还不如end好用…
  • wWeEbB,跳词。大写只跳空白。
  • fFtT,跳至字母。大写反跳。; 重复上次跳字母指令。
  • gg,G,文档首,文档尾。
  • *# g* g#,前后跳相同词,n正跳,N反跳,加g无视大小写。
  • / ? 前后搜索,nN正反跳。
  • [[ ]] [] ][,这个比较特殊,第一个括号表示上下,,][和[]是不同方向代表上下跳闭括号。]]和[[是同方向,代表上下跳开括号,这只能算一种解释,原因未知…
  • % 跳至配对括号。
  • ” 回到上次位置。注意是两个英文单引号。

Continue reading Vim备忘录

混乱的名词

曾几何时,我只知有锁,不知有同步。接着互联网兴起,人们开始说异步。当今有一种怪象,销售也席地而坐给人讲技术。我过某传销者说“异步防阻塞”,还就何种“防”法长篇大论 ಠ_ಠ

歧义?

我初入门是学Linux和C。Java那种Synchronized,在我的认知下就是Mutex。后来听说有同步IO和异步IO。看过《UNP》之后,我理解的同步就有了两种含义(也就是说“同步”一词有歧义),当时网络上大多评论也赞同这种观点。但是后来学习了各种技术,知识,我发现自己的观点完全错了。 Continue reading 混乱的名词

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

这是我第一个系统学习的语言,不记得为什么后来没再用。那时候刚刚出现的3.0完全没普及。本文以Python3初学者的角度,看看语言层面有什么好玩的东西。

Print

我的第一个学习资料中,作者使用了大量的print语句log调试。2.x版的print语句(不是函数)简直太方便。我不是很理解3.x版的print函数价值在哪,难道是直接回调?

P.S. 甚至Scala都开始去除部分括号。

运算符

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

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

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命令备忘录

抽象价值之简述

我在《实现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