0%

本文主要参考:viewsourcecode.org/snaptoken/kilo/02.enteringRawMode.html

标准IO流介绍

通常情况下每个程序加载后都会有3个流被fopen——stdinstdoutstderr,它们是标准C中的FILE*指针。在unix环境对应的文件描述符为0、1、2(宏定义为STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO)。当然,程序退出的时候它们也会被fclose。

不要简单地把stdin视作键盘缓冲区,stdout视作屏幕缓冲区,尽管多数时候确实像这么回事。关键在于unix中的IO重定向,这三个流都可以被重定向到任意的文件或设备中,一切皆文件嘛。

1
2
3
4
5
6
7
int main(int argc, char* argv[])
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d + %d = %d\n", a, b, a+b);
return 0;
}

上述代码中的执行过程看似是先在命令行下输入两个数字,然后打印出两数之和,但只要动点手脚…

阅读全文 »

必要说明:目前C语言本身并不支持反射,本文仅是讨论利用编译器特性实现部分类似反射机制的思路和方法。

引子

反射,简单理解就是通过字符串获取对应的类型或者函数,比如下面这段代码,可以根据用户输入的参数直接调用对应的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct cmd {
void (*fn) (char*, char*);
const char* name;
};

#define reflect(x) __attribute__((section("cmds")))\
struct cmd __##x = {x,#x};

void add(char* a, char* b)
{
printf("%d\n", atoi(a) + atoi(b));
}
reflect(add);

void del(char* a, char* b)
{
printf("%d\n", atoi(a) - atoi(b));
}
reflect(del);

int main(int argc, char* argv[])
{
extern struct cmd __start_cmds;
extern struct cmd __stop_cmds;

for (struct cmd* c = &__start_cmds; c < &__stop_cmds; c++) {
if (strcmp(c->name, argv[1]) == 0) {
c->fn(argv[2], argv[3]);
}
}

return 0;
}
阅读全文 »

elf.h: No such file or directory

现象

1
scripts/sorttable.c:27:10: fatal error:elf.h: No such file or directory

macOS中并未包含elf.h,可以在 github.com/bminor/glibc/blob/master/elf/elf.h 获取,建议将其放到/usr/local/include目录下,编译时会自动搜索此路径,如果依旧提示找不到elf.h,可以使用使用HOSTCFLAGS强制指定。

解决方案

1
2
3
4
5
# 下载elf.h头到/usr/local/include
curl https://raw.githubusercontent.com/bminor/glibc/master/elf/elf.h > /usr/local/include/elf.h

# 编译时指定搜索路径
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- HOSTCFLAGS=“-I/usr/local/include”
阅读全文 »

作为一个程序员,确切地说是一名嵌入式Linux程序员,看到《UNIX传奇》一书出版后,欣喜若狂!我花了两天时间读完,酣畅淋漓!正如本书封面所写,这是一本关于UNIX的历史与回忆,你只需要稍微有点相关背景知识,读起来几乎全程无障碍。当然,不论作者还是译者,大佬毕竟是大佬,没有他们过硬的文笔,又怎能让我们这帮后生看到如此绚烂的传奇。

在本书之前,我对UNIX的历史已略知一二,它的前身(或者说反面教材)是Multics,一个因第二系统效应盲目追求大而全的失败案例。不论如何,身为参与者的肯·汤普森因此收到启发,加上对操作系统的狂热兴趣,仅花三周时间就写出了UNIX雏形。之所以效率如此之高,是因为她老婆恰巧在那期间带着孩子出门探望公婆…果然,成大事的男人离不开女人的“支持”(玩笑话)。

阅读全文 »

因为对未来有开家小店的想法,我翻开了《零售的哲学》一书,怎么说呢,感觉打开方式不对😄。不可否认,我很喜欢这本书,但它讲的是武功心法,而非招式套路。

本书作者铃木敏文有种老一辈日本企业家精神,或者说真正的工匠精神,尤其是在讲述自己的内心想法和问题视角时,我甚至会觉得:“这家伙不会是稻盛和夫本人吧?”一眼洞穿问题的本质,脚踏实地地披荆斩棘。

卖方市场 vs 买方市场

书中很多次强调从卖方市场到买方市场的思维转变,这两个词从经济学的角度来看,无非是由于供需关系导致的买家卖家是谁爷的结论。但我从书中所感受到的是另一种论调:

阅读全文 »

开发手册

本文档旨在帮助你启动并运行真正的GitHub API应用。我们会覆盖从认证到处理结果、到与其它APP合并结果等你所需要直到的一切。

这里的每个教程都会有一个工程,每个工程都放在我们的公共仓库platform-samples中。

按照惯例,让我们过一遍API的核心概念吧。

概览

大多数应用都会在你所熟悉的语言中存在一款封装库,但重要的是你得熟悉这些API底层的HTTP方法。

如何你打算使用其它客户端的话,没什么比cURL更好用的轮子了,注意在你发起请求的时候必须先发送有效的User Agent Header

Hello World

来不及解释了快上车吧!打开你的命令行终端并敲下如下指令:

1
2
curl https://api.github.com/zen
Keep it logically awesome.
阅读全文 »

昨晚一直读到凌晨1点,酣畅淋漓。好久没有这么爽快了,这或许就是读小说的乐趣所在吧,不必绞尽脑汁去思考,只需要把身体摆成“大”字,跟随剧情,一点点被感染。读到结尾时,我甚至有种舍不得读完的感觉:“啊?就要结束了,谜团还没完全解开呐…”

到目前为止,东野圭吾的小说我一共读过两部:《解忧杂货店》、《白夜行》。怎么说呢,这是两种不同的故事风格,没什么类比性,我就不好对东野圭吾的笔法“指指点点”了。不过它们有个共同点——故事的时间跨度很大,每个章节都是碎片化的,一定要等到最后才会真相乍现。

小说最后似乎留有遗憾——雪穗的结局…但这恰恰是最值得玩味的地方,想必这恰恰会成为读者们争论的焦点。(作者的笔法真实精湛啊)

个人观点:雪穗结局已经很明显了,她不会被抓,因为她从始至终都是干净的。她也不会因为亮司的死而痛苦万分,因为他不是她爱的人

那…

雪穗和亮司到底属于什么关系?

阅读全文 »

Your Customers Do not Mean What They Say

我从来没有遇到过一个客户能够开心地告诉我他们想要什么——通常都是陷入细节里。问题在于客户不总是告诉你完整的真相。他们一般也不会撒谎,但他们所说的是客户术语,而非开发术语。他们使用自己术语和上下文。他们忽略了重要的细节。他们假设你已经在他们公司呆过20年,可以像他们一样。事实上很多客户根本不知道他们最想要的到底是什么,事情就会更复杂。有些人可能掌握了“全局”,但他们很难有效地传递出自己的愿景细节。其他人可能对整体愿景关注的少一些,但他们知道自己不想要的是什么。所以,你怎么可能将一个软件项目交付给一个无法告诉你自己内心想法的业主呢?非常简单。很他们更多地互动。

阅读全文 »

You Gotta Care about the Code

优秀的程序员不需要用夏洛克·福尔摩斯来证明其编写的代码是良好的。而坏的程序员…则不行。他们生产了垃圾却要让我们来擦屁股。你想写出优秀的作品,你想要成为一名优秀的程序员,对么?

好的代码不会凭空冒出来,这里边儿不会有运气成分。为了得到好的代码,你必须更努力的工作。如果你确实注重好的代码,你就会得到它。

阅读全文 »