我说那儿黑,他说他恨日光。我说那儿很孤独,他说跟聪明人说话是滥用他的心智。我说他疯了,他说上帝留他不必做精神健全的人(上帝一定会的)。

海鸥过境,雨很是磅礴地下了几天,本以为走后便又会迎来高阳烈日,出乎意料的,风中带有了丝丝凉意。

就像一个力竭的汉子,最后的时光里每经受多一次打击都越发难以恢复之前的意气。

在深圳这种南方城市很难感受落寞的秋意,不像北方的寒地,叶子吸收了暑气而发黄飘落,风不请自来,很有股迫不及待的劲儿要补回夏日的缺席。而在回归线这里,点点的秋意好似害羞的姑娘,生怕被你发现,偷偷掩在夏日的身后,趁着衣角的翻起一下跑向冬天的怀抱,如果不仔细观察你都不会意识到她的存在,颇有些倚门回首嗅青梅的神态。

Read on →
Tec

楔子

前段时间搞完了聊天服务器后也没有很多事情,因为系统瓶颈停留在数据库读写层面,所以研究了一两周的NOSQL和Cache。NOSQL快是快但key-value型的数据结构实在太过简单,感觉真用起来并不是很方便,Cache倒相对来说可行一些,开多一个服务罢了,其实简单的逻辑自己也能实现。就这样纠结来纠结去的,发现其实现在的服务倒也完全够用,压力测试了下,能撑到1500的并发,想来刚上线估计也最多几百号人能同时聊天就不错了,所以就先研究至此,撑不住了再换,不要过早优化嘛。

Read on →

论坛闲逛的时候无意间看见有人推荐李娟的书,清新平淡之类的赞美之词倒是没有在意,单看书名中的阿勒泰便足够将我吸引。

之前很喜欢一位讲新疆的作家是刘亮程,记得初中还是高中学过他得一篇课文叫《一个人的村庄》,明明很有记忆的事情,问了很多同学硬是一个有印象的都没有,奇怪了去。

那里面他写的寒冷尤其生动,说再旺的炉火也抽不走骨头根子里一年年积攒起来的寒意。几乎第一眼便喜欢上了。文章只是他散文集里的一篇,便找了整个册子从头看起,讲他的无聊孤独,地老天荒,看了进去抬头看周围竟有些回不过劲儿来,真好。

Read on →

冬来夏往,就这么着毕业一年。毕业季的时候并没有多少感伤与兴奋,送了几届的人头轮到自己已经累感不爱。

随着艾莉娅踏上驶向布拉佛斯的商船冰与火又用这样一个充满希望的镜头结束了第四季的故事。我记得第三季结束的时候是龙母霸气的看着她的几条龙在天空飞翔,而在这一季的终结,又是她亲手将两条龙锁入地库,不知道它们命运几何。

艾莉娅跑到船头望向大洋深处的镜头美得动人,一片充满未知与希望的新世界,不禁感概生命的奇遇美好。想起开头时罗柏多么意气昂扬却终究抵不住一死,到底最珍贵的东西还是贱命一条,活下去来感知世界的精彩,便是一种自在充盈,无与伦比。

前一集中耶哥蕊特中箭临死,在琼恩怀里时喃喃那句“你什么都不懂”让人动容。连托蒙德都知道耶哥蕊特一直在喋喋不休的讲着要杀死琼恩是因为那至深的爱。生命的美妙再次得以体现,尤以死讲述的最具冲击力。

Read on →
Tec

四五月份折腾完聊天服务器后就放了下来开始做个公司的CMS,重拾PHP的感觉还不错。几年不见多了很多框架,随便挑一个用着也很是方便,感觉现在做应用层的开发真是越来越简单了。各种框架工具一应俱到,从UNIX脱离出来重新投入到一键式的开发环境中真有点说不出的幸福。

开始的时候以为编程的世界是个江湖,每个码农都应该朝着绝顶高手的目标不断努力,只有将自己的武功修炼到化境才能算得上功成名就,渐而渐的却发现自己所处的环境跟江湖有不少区别的。也许在自己不知道的层面上还是各种武林高手呼风唤雨,但就现在自己所处的位置却是一个战场无疑。自己的能力与各种框架工具相比就算提升了几倍也是显得那么微不足道。就好比之前写聊天程序时各种尝试,从多进程到多线程,从线程池到多路复用,就自己的能力而言性能是在可观的提升的,心里也有些小得意。直到后面用上了Libevent…回头看看自己的努力就像天边的浮云,看上去很美而已。

Read on →
Tec

前段时间使用C借助libevent,glib实现了一个简单的可以单聊,群聊的服务器,今天因为需求有些改动所以又翻出来改了一下。果然一日不见如隔三秋,虽说是自己写的东西,但基本上已经忘得七七八八了。觉得有必要在这里记录一下,省得以后又悲剧。

一,工具类

1.libunp.a

用到的第一个库便是它,因为它是《UNIX网络编程》的示例代码的工具库…开头写的测试程序基本都是照着示例代码改来改去,自然也是用的一样的函数来实现。觉得对于一般的读写和各种包裹函数都是很有用的。具体的不用细说,还是认真翻书来得实在。

2.GLib

GHashTable

这里基本的数据结构如哈希表之类的使用了GLib来做主角,另外它的GString也很好用,可以很方便的初始化与格式化字符串,个人感觉比C风格的字符串要好用一些。

GLib哈希表支持各种不同的结构,如果觉得int,string不够用可以直接使用指针,对于我来说已经相当足够。

1
2
3
GHashTable *user_to_bev_map = g_hash_table_new(g_direct_hash,g_direct_equal);
g_hash_table_insert(user_to_bev_map, GINT_TO_POINTER(u_id), GINT_TO_POINTER(bev));
struct bufferevent *bev = g_hash_table_lookup(user_to_bev_map,GINT_TO_POINTER(to_id));

g_direct_hash,g_direct_equal代表初始化的类型,详细的介绍如下:

Hash values returned by hash_func are used to determine where keys are stored within the GHashTable data structure.

The g_direct_hash(), g_int_hash(), g_int64_hash(), g_double_hash() and g_str_hash() functions are provided for some common types of keys.

If hash_func is NULL, g_direct_hash() is used.

Read on →
Tec

开了个头

一部Android手机加上一块Arduino的板子通过USB通信可以实现很多有趣的东西。

2011年Google推出Android开放配件协议AOA及配件开发工具包ADK提供了Android USB或蓝牙进行通信的API,为基于Android系统的智能设备控制外设提供了条件。利用Android,系统可以连接从家用电器到重型机械、机器人等多种设备 原文

Read on →
Tec

总览

All problems in computer science can be solved by another level of indirection

觉得这句话对TCP的分层也很适用。

对TCP/IP协议来说,大体分为五层,

  1. 应用层
  2. 传输层
  3. 网络层
  4. 链路层
  5. 物理层

应用层我们接触的比较多,流行的如HTTP,FTP之类都算,像我在大学里做的PHP开发时基本对HTTP发包没有任何概念,照着教程开eclipse,apache,在浏览器里敲个locahost:8080出来个猫的图案就很开心了。再建个index,上面写句“未满18周岁禁止进入”,就有种天下在手的感觉。

Read on →
Tec

一.关于Socket

如我,刚见这个名词的时候不知所云,因为起点就没找对,首先要在基于对UNIX有所了解的情况下才利于开展工作,便是“一切皆文件”。

在UNIX下,一般的文件可以通过open打开,并返回一个小整数作为标记,后续的操作便是针对这个小整数进行读写。这个小整数被称作描述符,描述符只是引用file的proc结构中一个数组的某个元素的下标而已,它可以代表该文件,但并不是文件本身,我们通过它来与文件建立联系,方便操作。

以此为前提,Socket便是一种特殊的文件,通过socket函数可以创建一个套接字(特殊的文件),它也返回给我们一个小整数,以后所有的函数调用就用该描述符来标示这个套接字。

在UNIX下文件的种类有很多,打开与使用的方式虽然遵循着一定的模式,但也不尽相同。比如想打开一个文本文件需要借助open函数,而且在打开的时候需要告诉open函数该文本的路径位置,以明确打开的目标。

Read on →
Tec

缘起

最近做的一个项目是使用C写的,随着项目的深入发现需要通过不同的数据结构来完成需求,自己简单地去编写已经不能满足要求且在健壮性方面也存在着隐患,于是就琢磨着在网上找找看看有没有什么现成的C工具包来用,就这样,发现了GLib。

先来看下维基上的介绍:

GLib是一个跨平台的、用C语言编写的库,起初是GTK+的一部分,但到了GTK+第二版,开发者决定把跟图形界面无关的代码分开,这些代码于是就组装成了GLib。GLib提供了多种高级的数据结构,如内存块、双向和单向链表、哈希表、动态字符串等。

感觉功能刚好满足需要,类似于C++中的STL,果断搞起。

Read on →