Ubuntu 18.04 必做操作

新开一个栏目,专门记录开发中常见的命令和操作

新装完Ubuntu Server之后要做几个操作,才能让他更好用:

  1. 更新软件源
  2. 安装必备软件
  3. 设置系统代理

Ringbuffer环形缓冲区

前言

环形缓冲区是很常用的数据结构,用途很广泛。我目前遇到的使用场景就是TCP分片转回TCP流,一个线程读取TCP分片拆包,写入缓存区,另一个线程从缓存区中读取,互相不影响。

为此Google了一番,发现了kfifo这个Linux内核的实现,十分精妙。

原理

基本原理

struct kfifo {   
    unsigned char *buffer;    /* the buffer holding the data */   
    unsigned int size;    /* the size of the allocated buffer */   
    unsigned int in;    /* data is added at offset (in % size) */   
    unsigned int out;    /* data is extracted from off. (out % size) */   
    spinlock_t *lock;    /* protects concurrent modifications */   
};

先看一下基本定义,buffer是数据缓存区,size是缓存区长度,in/out是输入输出指针位置(%size后就是真实指针了)。

size需要检测是否为2的次幂,不是的话需要升到2的次幂。方便后续计算。(可以看内核的roundup_pow_of_two实现)

in、out每次操作都+对应的读写长度,通过取模运算回落size区间。

data := kfifo.buffer[kfifo.out % kfifo.size:kfifo.in % kfifo.size]

data就是有效数据的缓存区区间。

快速取模

kfifo使用了二进制的位运算实现了2的幂取模运算,并且利用了无符号数的溢出做回绕。很精妙的设计。

首先,缓存区尺寸要取整为2的幂次,这样可以利用位运算进行取模。

M mod N = M & (N-1),当N为2的幂次时有效。

取模运算对于计算机来说运算速度也是很慢的(虽然你感觉不出来),而位运算就是分分钟的事了。

回绕

无符号数溢出后,就会变成0从头开始,借助这个特性可以绕开逻辑判断。

宏碁TMB117测评

2018-07-17夜 深圳 狂风暴雨配闪电

前言

买了个摸鱼用的笔记本,宏碁TravelMate B117,使用体验还挺好。

我的需求很简单:

  1. 能运行Manjaro
  2. 电池耐用
  3. 尺寸小
  4. 便宜

选来选去就选到了这个笔记本。基本配置是这样的:

  • Intel 奔腾 N3710 处理器
  • 4GB 内存 / 128GB 闪存
  • 11.6英寸1366*768屏幕

最重要的是:这个本子我买的时候特价只要2399,现在2499也不是很贵。

京东购买页

逃离北京,移居深圳

很早之前就应该写这篇文章了,毕竟已经来这边两个多月了,是时候总结一下这次的北京大逃离了。

(长篇唠唠叨叨流水账预警)

引子

刚毕业的时候有两个选择,北京or深圳。家里建议我选择北京,毕竟离家近,都是北方生活可以很好的习惯。最主要的是冬天有暖气,回家还方便。再加上之前去过一次北京稍稍有点认识地方,毕业就去了北京找工作。具体找工作怎么经历按下不提,最后在16年9月份在北京站住脚了。隔了几个月,因为之前经历了城中村,加上老板给涨了一下薪水,觉得应该提高一下居住水平,我就和同事搬到了五环边上的清河地区一起合租。房租从之前的单间1000每月涨到2500一个次卧。

经历了北京的低端人口大清理,我在清河地区的房子再续租已经从5200一个月涨到了6800一个月,再加上糟糕的天气和公司里的各种斗争搞事,我觉得不应该在这样下去了。所以2018过年期间下了决心,必须走。(压垮我的最后一根稻草应该是涨薪的时候只给涨了900块钱,和糊弄人没什么区别,本来基数就少,涨一次抠抠搜搜连房租涨幅都追不上)

离职

要离职肯定要提前申请,折腾快一个月的交接。三个人分别接收了我不同领域的任务,然后开了离职证明。(有个小插曲:离职证明网上下载的模板,领导给盖完公章说我应该没事看看文化方面的知识,全因为离职证明的那段话没空两格? 拜托那是百度搜到的模板诶,不知道老板讨这个嘴上面子有什么意思,可能是小孩子脾气?)

因为是裸辞,拿着我的所有东西离开的时候还是蛮爽的。开开心心的走出办公楼坐上回家的公交。就这么在家颓废了一个月。当然,到了出信用卡账单的时候就很方,要交最后一次房租,要还一个月放纵的生活费,也是一笔超大的开支。毕竟每个月都是动态平衡,虽然攒不下钱但不至于负债。没了工作只能用之前的存款生抗,也是没办法。

启程

定下要走了,收拾了一大堆东西,能拿走的都拿走了。拿不走的一部分送给室友一部分拜托室友等有地址了帮忙邮到广东。去深圳有好多种方法,我和家里人一起去他们帮我拿着大量的行李,肯定不能坐飞机也不能坐高铁,毕竟没有这么大的储物空间。最后买了北京西到深圳的硬卧,在车上折腾了一天一夜。硬卧车可以放很多行李,至少我的两只行李箱两只双肩背和两袋子锅碗瓢盆都能装得下。(不要考虑动卧,动卧只有床底下能放少量扁的行李,亲身体会。)

Project621 (Minecraft类体素游戏计划)

一直以来都想做一个自己的游戏,玩了MC之后更是觉得这个是自己想要的游戏。

然而Minecraft有很多缺点,既然它不开源只好自己做一个了,权当实现自己的梦想。

我对MC的一些想法

首先,一个开放的地图格式必不可少。理想情况下,高端玩家可以通过第三方工具直接读写地图存档。

而且,MC里修建建筑等有个很大的问题,WorldEdit并不好用。我不是说WE不好,问题是在MC现有的框架先没法更好的制作地图。一个良好的内置地图编辑器是必不可少的,最起码需要有平滑更改地形起伏, 放置不规则形状河道和湖的功能,这样地图作者在构建属于自己的世界时不会浪费过多的精力在地形的打造上。这应该是游戏厂商提供的工具之一。

其次,应该有一套简单的脚本系统,MC现在的JSON命令能做的事还是太少了,如果引入简单的脚本系统比如JavaScript、Groovy、Lua,整个地图的可玩性会得到极大地提升。

想象一下,你现在做了一张生存地图,想播放特定的音效,最好的办法是Game.playsound("example.ogg")一句话搞定,然而在MC里做不到,很多地图里的哭声是靠不停地刷恶魂宰恶魂实现的。(内牛满面君那么可爱为什么要伤害它)

如果这种游戏引入了可以和游戏内核交互的脚本系统,生存冒险地图的可玩性会直线上升!而且地图作者的压力也会减少很多,不用想办法触发闪电了,也不用弄自动宰恶魂机了,轻轻松松一句代码实现。

而且这个游戏对建筑党也不是很友好,想一下你是不是经常缺少某些颜色的方块?彩色羊毛什么的根本不够用啊!如果我做的话,至少会有一个RGB的颜色刷,方便改颜色。(1.12.2的彩色混凝土是个好东西,可惜颜色还是太少了)