摘要: 每学一门新的编程语言时,在看到介绍该门编程语言的特点时,经常会遇到静态、动态、强、弱、隐式、显式类型等字样,似懂非懂,这里结合网上的资料总结一下它们的含义以及区别,描述不一定专业、准确,但求能进一步理解这些词的概念即可。类型系统(Type System)用于定义如何将编程语言中的数值和表达式归类为许... 阅读全文
posted @ 2014-12-21 20:29 hazir 阅读(5367) 评论(0) 推荐(2) 编辑
摘要: 上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型。本文再通过一个例子来加强一下对 Socket 编程的理解。聊天室程序需求我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所... 阅读全文
posted @ 2014-12-17 11:38 hazir 阅读(50321) 评论(4) 推荐(7) 编辑
摘要: Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TC... 阅读全文
posted @ 2014-12-11 20:02 hazir 阅读(54208) 评论(2) 推荐(7) 编辑
摘要: 用过 Bash 命令行的一定知道,Bash 有几个特性:TAB键可以用来命令补全↑或↓键可以用来快速输入历史命令还有一些交互式行编辑快捷键:C-A/C-E将光标移到行首/行尾C-B/C-F将光标向左/向右移动一个位置C-D删除光标下的一个字符C-K删除光标及光标到行尾的所有字符C-U删除光标到行首的... 阅读全文
posted @ 2014-12-09 22:29 hazir 阅读(25011) 评论(2) 推荐(4) 编辑
摘要: 当我们讨论指针时,通常假设它是一种可以用void *指针来表示的东西,在 x86_64 平台下是 8 个字节大小。例如,下面是来自维基百科中关于 x86_64 的文章的摘录:Pushes and pops on the stack are always in 8-byte strides, andp... 阅读全文
posted @ 2014-12-02 22:26 hazir 阅读(5065) 评论(0) 推荐(5) 编辑
摘要: 在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?…如果你对这些问题都有疑问的话,不妨看看我这篇文章。new 和 delete 到底是什么?如果找工作的同学看一些面试的书,我相信都会遇到这样的题:sizeof 不是函数,然后举出一堆的理由来证明 sizeof 不是函数。在这里,和 sizeof 类 阅读全文
posted @ 2014-03-17 23:01 hazir 阅读(132466) 评论(23) 推荐(26) 编辑
摘要: web 开发框架有很多,例如 Java 中的 Struts、 PHP 中的 Yii、Python 中的 Django 等等,现在很多人都热衷于追求 web 框架开发技术,但至于什么是框架?为什么会出现框架?框架的工作原理是什么?等等问题都没弄明白。看到一篇比较好的文章《What is Web Framework?》,是我看到的讲解比较清楚的一篇博客,特翻译出来与大家分享,但还是推荐大家直接看原文。 阅读全文
posted @ 2014-03-06 13:32 hazir 阅读(53400) 评论(8) 推荐(13) 编辑
摘要: 当我们试图去了解复杂系统时,去除其抽象层,直接关注最底层,我们会更容易去理解。使用这种方法,我们来看一下内存和 I/O 接口的最简单和基础的层:处理器和总线的接口。这些细节是更上层问题的基础,例如线程同步、Core i7 的需求等。然而,由于我是一个程序员,我将忽略一些 EE 人关注的问题。下面展示的是典型的 Core 2 架构:Core 2 处理器有 775 个引脚,大约一半仅仅提供电力,并不传输数据。当你按功能对这些引脚进行分组时,你会惊奇地发现处理器的物理接口非常简单。图示的是涉及到内存或 I/O 口操作的关键引脚:地址线、数据线以及请求引脚。这些操作都发生在前端总线(Front Sid 阅读全文
posted @ 2014-01-20 11:24 hazir 阅读(1360) 评论(0) 推荐(0) 编辑
摘要: Linux 下make命令是系统管理员和程序员用的最频繁的命令之一。管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题。本文我们将用一些实例来讨论 make 命令背后的工作机制。Make 如何工作的对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标。这些目标通常存放在以 “Makefile” 来命名的特殊文件中,同时文件也包含与目标相对应的操作。更多信息,阅读关于 Makefiles 如何工作的系列文章。当 make 命令第一次执行时,它扫描 Makefile 找到目标以及其依赖。如果这些依赖自身也是目标,继续为这些依赖扫描 Makefi 阅读全文
posted @ 2014-01-17 15:12 hazir 阅读(221511) 评论(1) 推荐(7) 编辑
摘要: 不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性。今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码。申明密码学是非常复杂的一门学科,我不是这方面的专家,在很多大学和安全机构,在这个领域都有长期的研究。本文我试图使事... 阅读全文
posted @ 2014-01-16 18:47 hazir 阅读(11533) 评论(2) 推荐(7) 编辑
摘要: cd 命令是 *nix 系统中最基本的命令,它所做的事情是改变你当前所在的目录。本文详细介绍该命令,它所能完成的功能以及关于该命令内在的东西。cd 命令:一个内置命令BASH Shell 是大多 Linux 发行版的默认 shell,BASH 有一些自己的内置命令,cd 就是其中的一个。我将解释什么是内置命令,以及为什么 cd 是一个内置命令。首先,用SHELL环境变量确认你当前的 shell:现在用which命令检查 cd 命令二进制文件所在的路径(如果存在的话):结果什么都没有输出,这是因为系统中不存在 cd 命令的二进制文件。但是你仍然可以运行该命令,这是因为 cd 是 BASH 的内置 阅读全文
posted @ 2013-12-27 19:23 hazir 阅读(10993) 评论(0) 推荐(0) 编辑
摘要: MarkdownPad 是 Windows 平台下一款优秀的 Markdown 编辑器,本文简单介绍 Markdown 以及使用一种方法破解 MarkdownPad 使其升级到专业版。该方法仅限于教育用途,我不为滥用该方法导致的商业纠纷负责!Markdown 简介Markdown 是一种轻量级标记语言,有着及其简单、易学易用的语法,任何人在几分钟之内都可以掌握其基本语法并用来写作,你可以在这里学习markdown的基本语法。其创始人 John Gruber 下面的话高度概括了 Markdown 是什么、优点以及适合哪些人使用:Markdown is a text-to-HTML convers 阅读全文
posted @ 2013-11-29 12:54 hazir 阅读(18349) 评论(22) 推荐(3) 编辑
摘要: Linux 内核版本命名在不同的时期有其不同的规范,我们熟悉的也许是 2.x 版本奇数表示开发版、偶数表示稳定版,但到 2.6.x 以及 3.x 甚至将来的 4.x ,内核版本命名都不遵守这样的约定。本文就简单总结一下关于 Linux 内核版本号那点事:Linux 内核版本号命名四个不同的阶段从内核第一个0.01 版本发布到 1.0 版本。接下来是 0.02, 0.03, 0.10, 0.11, 0.12 (第一个 GPL 版本), 0.95, 0.96, 0.97, 0.98, 0.99,最后才到 1.0。1.0发布之后,直到2.6版本之前,命名格式为 “A.B.C”:数字 A 是内核版本号 阅读全文
posted @ 2013-11-13 09:34 hazir 阅读(5714) 评论(2) 推荐(3) 编辑
摘要: 在 C 语言中,我们不能使用goto语句来跳转到另一个函数中的某个label处;但提供了两个函数——setjmp和longjmp来完成这种类型的分支跳转。后面我们会看到这两个函数在处理异常上面的非常有用。setjmp 和 longjmp 使用方法我们都知道要想在一个函数内进行跳转,可以使用goto语句(不知怎么该语句在中国学生眼中就是臭名昭著,几乎所有国内教材都一刀切地教大家尽量不要使用它,但在我看来,这根本不是语言的问题,而是使用该语言的人,看看 Linux 内核中遍地是 goto 语句的应用吧!),但如果从一个函数内跳转到另一个函数的某处,goto 是不能完成的,那该如何实现呢?函数间跳转 阅读全文
posted @ 2013-11-03 15:54 hazir 阅读(32461) 评论(10) 推荐(19) 编辑
摘要: 前两天看程序,发现在某个函数中有下面这段程序:int n; //define a variable nint array[n]; //define an array with length n在我所学的C语言知识中,这种数组的定义在编译时就应该有问题的,因为定义数组时,数组的长度必须要是一个大于0的整型字面值或定义为 const 的常量。例如下面这样int array1[10]; //validint const N = 10;int array2[N]; //validint n = 10;int array3[n]; //i... 阅读全文
posted @ 2013-10-27 10:18 hazir 阅读(13771) 评论(11) 推荐(5) 编辑

一个代码可以创造一个世界,也可以毁灭一个世界!