上一篇文章中我描述了一个更强大的JavaScript全栈框架。好吧,我承认他在设计有很多失误,当然,为了避免以后再发生这样的事情我决定还是要先做足充分的调研和实践再开始进行设计,总之就放在那提醒自己了。在本文中,我会纠正之前的错误(主要是实现非常困难以及没有必要的部分),并重新规划设计remux框架。

阅读全文 »

假如我们需要设计一个需要密码才能登录的页面,某些偷懒的大聪明可以很容易地写出这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
function login(password) {
if (password === 'fuck') {
return 'hello';
} else {
return 'wrong password';
}
}

document.getElementById('login-button').addEventListener('click', async () => {
const password = document.getElementById('password').value;
alert(await login(password));
});
阅读全文 »

关于无锁数据结构有很多介绍了,如果想获得开箱即用的方案可以直接找liblfds,不过考虑到liblfds常年没维护,所以很多时候还得自己写,这里记录一下如何用原子操作实现无锁队列。

队列

简单队列

真的是很简单了,就是一个链表,我们使用结构体定义该链表的节点和链表本身

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct queue_node {
struct queue_node* next;
void* data;
};

struct queue {
struct queue_node dummy;
struct queue_node* tail;
};

void init_queue(struct queue* queue) {
queue->dummy.next = NULL;
queue->tail = &queue->dummy;
}
阅读全文 »

众所周知wxWidgets是一个跨平台的GUI库,支持Linux(GTK/X11),Windows和macOS(cocoa),与Qt不同的是,他足够轻量,不需要魔改C++语言本身(qmake说的就是你),而且它调用平台原生API实现GUI,而Qt在Windows上实际上是绘制的界面,所以我打算用wxWidgets来做毕设。

众所周知Windows是现阶段的主流操作系统,而我用来写代码的电脑是mac,所以最终我可能仍然需要提供一个Windows版本的程序,但是我实在是不想在虚拟机上再折腾一套开发环境,所以就想着能不能直接在macOS或者Linux上编译出exe呢?答案是可以的,那就是mingw。

阅读全文 »

项目地址

后端框架跑分

Go有Gin,Java有Tomcat/Spring,Python有Django,PHP本身就是为后端而生,Node.js有http模块,而C/C++……有nginx(?)! 但是众所周知,nginx插件并不好写,而且nginx还要配置文件,实际上也没多少人用nginx插件来写Web后端。

所以我决定来做这件事,我对这个框架的目标是

  • 高性能,既然是用C写,性能一定是优先地位,争取暴打nginx
  • 易用,类似于FaaS的开发和使用体验,如果还能有一个开发用的cli就更好了
  • 灵活,低耦合,可插拔,高度自定义
  • 轻量,少依赖
  • 跨平台,至少支持Linux和macOS
阅读全文 »

也就是优先队列,我们知道STL中提供了一个好用的优先队列priority_queue<T>,C语言中起码有不少库(比如librock)提供了这玩意,所以写这玩意纯属造无意义的轮子。但是我写这玩意主要是因为最近在面试,至少遇到了两次让手写一个堆(不过当时都没写出来,毕竟不会真的有人要手写STL提供的算法和数据结构吧?不会吧?不会吧?),闲着也是闲着,不如锻炼一下,堆还是很好写的。

我写的这个版本用void*模拟泛型,同时能自动扩容,但是缺点也很多,就我自己的感觉是时间复杂度的常数肯定很大,虽然是$O(\log_2 n)$​​​​​,但是有大量的判断,而且插入位置也没有优化,只写了个简单的测试例,总之不推荐在生产环境用(STL不香吗?)。

阅读全文 »

是的,现在api.js成为模块啦!但是我改了下名字,现在他叫restful-proxy,因为我实际上是对RESTful风格的API进行封装,而且用了Proxy,本来是想叫做restful.js的,无奈这个名字已经有人用了(虽然万年没更新,而且也没有我的抽象)。

因为大多数题目的字符串都是小写字母,所以就按照这个设计了,共26个英文字母,每个节点占用26个char。

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
class TrieNode {
public:
array<TrieNode *, 26> node;
TrieNode() : node({nullptr}) {}
void insert(string &s) {
TrieNode *ptr = this;
for (auto c: s) {
c -= 'a';
if (ptr->node[c] == nullptr) {
ptr->node[c] = new TrieNode;
}
ptr = ptr->node[c];
}
}
bool find(string &s) {
TrieNode* ptr = this;
for (auto c: s) {
c -= 'a';
if (ptr->node[c] == nullptr) {
return false;
} else {
ptr = ptr->node[c];
}
}
return true;
}
};