分类 Computer Science 下的文章

简介

Snowflake 是 Twitter 提出一种的分布式唯一序列号生成算法,理论上单节点 1 毫秒可以生成 4096 个(每秒四百万个)唯一序列,这个序列是个 long 类型的数字,在数据库中的存储和查询也非常高效。其原理很简单,却又很精妙。

原理

Snowflake 算法生成的序列号充分地利用了每一个比特位,需要占用 8bytes(64bits) 空间,这 64 个 bit 一共分成 4 部分:

0         | 00000000000000000000000000000000000000000 | 0000000000    | 000000000000
定值,1 位 | 时间戳(毫秒),41 位                        | 节点序号,10 位 | 自增序列,12 位

- 阅读剩余部分 -

进行 PHP 开发时,一般会用到 Apache 或者是 nginx 去作为 web server。

我是在 Windows 环境下进行开发的,使用 Apache 的时候,我会把 Apache 的 bin 目录加入到环境变量中去,这样我只要打开 Powershell 就能直接使用 httpd 命令来启动 Apache 了;又或者我会将它注册成服务,这样使用 net start apache2.4 也可以快速启动,很方便。

后来使用到了 nginx,我也尝试同样的方法——将 nginx 目录加入到环境变量,重启 Powershell(以管理员身份运行),直接执行 nginx 命令,发现报错了:

- 阅读剩余部分 -

某天突然想了个关于结构体的问题,由于很久没有接触 C 语言,一开始并不知道其实这个问题本身就存在语法错误的问题,但正是因为对 C 知识的遗忘,才有了这次探索与巩固。

0x00 最初的问题

假设有如下结构体:

struct foo
{
    /* some other variables...*/
    struct foo bar;
};

那么我在定义一个 foo 变量的时候,

int main()
{
    struct foo hello;
    return 0;
}

会不会因为结构体里有一个循环引用而造成“内存爆炸”呢?

- 阅读剩余部分 -

校园网的拨号客户端用的是师兄写的 c3h,周日至四每天晚上十二点断网之后程序会进行一次重连,但是交换机会无响应,然后程序就会退出(写成不退出也不是不行,只是大半夜的你没事往交换机那边一直发起认证请求是件很奇怪的事情啊),等到了第二天早上七点程序就需要重新启动。之前用的方法是设置个定时任务,每天早上7:10 reboot 一下路由器,但是这样软重启会造成极路由 1S 重启之后总内存只能识别到 20MB 左右(而断电重启是能正确识别到 128MB 的内存的),这样无线就很容易崩,因此现在写了个 shell 脚本,用来代替之前的 reboot,定期每天早上检测一下 c3h 挂掉没有,如果没有挂掉了就重新启动一个。

- 阅读剩余部分 -