MJsonViewer v2.0 插件发布

可能是第一个支持嵌套 json 解析的火狐 json 插件。正如,之前写的那样,因为持续开发,主要是因为喜欢火狐,而且确实有新的需求进来了。 距离上一次的插件发布已经过去了两个多月了,其实总的使用下来还是比较舒服的。不过,有几个小的缺点也还是要说一下。如果一个 json 中的 k-v 的 v 包含了一个嵌套的 json,一般的 json 解释器都是将其作为 string 来解析。 这就带来了一个问题。在软件开发中,我们经常会在 json 中嵌套 json,从而导致在浏览器中的浏览体验极差。加上最近的四个需求: MikeCoder/MJsonViewer [Feature request] Detect if a string value contains JSON and provide an option to format it enh... [阅读全文]

使用 C 尝试内存管理

在之前苦读『垃圾回收的算法与实现』,也想着什么时候能够自己手动实现一把。加上自己对 redis 也还是算熟悉,也是知道他的内存碎片问题的严重性。所以,就想着这两者结合看看能有什么好玩的地方。 首先就是,如何进行内存的管理。众所周知,C 的内存管理通常使用 malloc 和 free 两个操作进行,于是乎,如果我们需要进行申请堆区的内存空间,(以下的讨论通通以堆区申请内存空间为主,栈区分配的内存通通不考虑),往往就会直接的 malloc(sizeof(xx)),然后再在不需要的时候直接调用 free 进行。但是,操作系统在进行内存分配的时候,并不能保证多次 malloc 的物理空间地址连续,加上内存的换页,就会导致性能的低下,操作系统需要不停的进行换页操作。 而且,在 MacOS(10.13.1) 上,malloc 的策略是,如果有可用的连续空间,直接分配,如果... [阅读全文]

Makefile 的多目录结构写法

因为最近迷上了 C 语言。所以开始进行的一些项目的编写都是采用的 C 语言。这么就会带来一个小的问题,就是 makefile 的写法问题。 比如一个目录结构是这样的: . ├── LICENSE ├── ReadMe.md ├── TODO.md ├── makefile ├── src │   ├── makefile │   └── ... └── test ├── makefile └── ... 如何协调好三个 makefile 的作用。这边我自作主张的给自己的 makefile 链做了一个如下的约定: 每一个单独的 makefile 可自己执行 makefile 中的变量以上级传递的变量为准 如果出现冲突,以上级为准... [阅读全文]

如何阅读 C 语言的声明

众所周知,C 语言的一大难点就在于变量声明。 比如说如下的几个例子: char* const *(*next)(); char *(*c[10])(int **p); void (*signal(int, void(*)(int)))(int); 基本上每一个都是晦涩难懂,看了简直像杀人。但其实也是相对来会所比较简单的一个。如果熟悉编译原理,其实可以通过人脑编译器的手段来解决难懂问题。毕竟,代码也需要编译器进行翻译。 首先我们得知道运算符号的优先级顺序。这里只说在声明期间会出现的符号。主要分为变量名,括号内内容,后缀操作符如:[], (),前缀操作符如: *,类型描述符如:const, volatile, 其中, 如果 const 或 volatile 后面跟着类型如 int, long 等,... [阅读全文]

JSON 解析器

这篇博客主要是最近开始玩 C,所以准备找个东西练手,突然发现,顺手写个 JSON 解析器吧。于是就开始了。 相对于其他比较成熟的上层语言。C 主要的问题就是没有基础的数据结构,而且相对于弱类型语言而言,C 的类型在解析的时候有个类型转换的坑。但是相对于其他的强类型语言而言,C 又有一个好处,那就是没有一个 void* 解决不了的问题,如果有,那就用两个。 不过相对于工作时的清闲,现在上课的时候确实没有什么时间进行额外的代码编写。所以断断续续写了一周多。 主要的使用方法就是: struct value *val = parse_new(); char *json1 = "{\"fff\":[2,4,5,6]}"; parse(val, json1); map_display(*(struct map*)val->value)... [阅读全文]

C 的假装 OOP 写法

之前微博上说 C 的一个好处就是没有什么是一个 void* 解决不了的,然后因为自己用 C 写一个小程序,遇到了一个问题,就是因为 C 是强类型,但是如果需要写一个相对通用的数据结构。这个稍微有点麻烦。 比如说,hashmap,我们常用的都是 <string, string> 的一个 map,于是,相对来说的话,hash 函数比较容易。但是,如果是需要实现 Java 那样的通用数据结构呢,是不是需要对每个特定的数据对象写一个? 所以这边就扯到了这么个比较好玩的技巧。 先看下效果: main.c #include "value.h" #include "value_a.h" #include "value_b.h" int main(void) { struct value v1; va... [阅读全文]