编程语言

golang单例模式

单例模式(singleton)是设计模式的一种,其定义是:

Ensure a class has one instance, and provide a global point of access to it.也就是:保证类只有一个实例,而且有一个全局访问点。

go支持部分的 oo 编程,但不支持不支持构造/析构函数,也不支持 static 参数,所以 oo 中常用的单例模式的实现 go 中是不行的。然而 go 有自己的方式:

Tags: 

go的类型以及方法

go自称是一门简单安全的语言,是新时代的 c 语言, not c++ 。

声明新的类型

go 除了内置的整型、浮点型、复数和字符串之外,还可以灵活定义其他类型,方式也很简单:

Tags: 

c++线程池实现

咳咳。c++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等。线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复。” 貌似没有问题吧。但是写起程序来的时候就出问题了。

废话不多说,先上实现,然后再啰嗦。(dont talk, show me ur code !)

站点迁移

只怪当时太年轻,选择了 SAE + Drupal 。 当时 SAE 还是免费的,现在早就不是了。更令人可悲的是使用了 drupal ,一个复杂得让人有些无语的 CMS 框架,对于只是想建立一个小站而不会做过多修改的人来说可能是一个不错的选择,但是对于另外一些人就不是了。

以后 me 的内容更新会放到 http://www.lrj.name 之上,那是 me 用 Node 实现的一个个人站点,虽然还很简陋,但是自己完全可控。 运行在 OpenShift 之上。

本站点依然可用, 所有的访问也都是有效的。 如果 u 是本来在访问 http://www.lrj.name ,后来网页链接跳到了本站之上也不要奇怪。

Tags: 

意想不到的c++:程序结果的多输出

不修改 main 函数, me 们能多大程度去影响程序的输出结果呢?!或是说,如何才能在不修改 main 的情况下去修改程序的输出结果?面试中可能经常问到的一个问题:下面是输出 hello,world 的程序代码

Tags: 

centos下安装llvm+clang

不知道从神马时候开始,llvm+clang 就进入了 me 的眼球,以前只知道有 gcc,有 vc++。llvm 是个编译器的 back-end,像 JVM 或是 .NET 的 CLR (公共语言运行时), clang 是编译器的 front-end,负责将 c、c++、objective-c、objective-c++ (objective-c 和 c++的混合) 编译成中间语言。 c++11/14 支持最好的两个编译器 gcc 和 clang,前者版本到了 4.8.2 (GCC),后者 3.4 (Clang)。gcc 是前辈,而 clang 是后起之秀,对于学习 c++14 来说更好的选择是 clang (完全支持 c++11 语言、库和 c++14 的所有草案)。

me 使用的是 centos 系统,使用赶脚很不爽,上面很多包没有安装是一方面,另一方面有些包的版本过低,如果自己安装的话,使用命令 $rpm -ql package 完全搜不到(安装信息),O__O"…。前面安装 GCC 4.8.1 如此,这次安装 llvm+clang 亦如此。

c++11介绍

废话少说

Tags: 

ATT汇编(gas:gnu assembly)

前话

汇编不用多数,就是符号化了机器指令,是一种很低级(靠近硬件)的编程。很多人接触比较多的是 windows 下的 Intel 汇编,然而 unix/linux 下 or 使用 gcc 的话,用的是 ATT 汇编。(unix 最初是 AT&T 实验室中的 Ken Thompson 发明的。)

Intel 汇编和 ATT 汇编使用的指令基本一样,就是写法上有些差异,鉴于前者有很多人介绍,而后者相对比较少,故有了此篇文章。 (me 也曾经想在 linux 看下汇编的写法,然而搜到的基本都是 Intel 汇编,赶脚很失落,O__O"…)

ATT 汇编格式

ATT 汇编大体格式是: 指令 源操作数 目的操作数 ,比如将 10 移动到 eax 寄存器的写法: movl $10, %eax

Tags: 

gcc命令

GCC说明

GCC 最初是 GNU C Compiler 的缩写,也就是最初是 c 编译器,后来演变成了 GNU Compiler Collection 的缩写,也就是成了一个编译器的集合。GCC 可以编译 c 、c++、、objective-c、objective-c++、java、pascal、ada 等语言,不过很多时候 me 们关心的是如何编译 c 和 c++。linux 主要是用 c 写的,其上的各种实用工具(比如各种命令)一般也是 c 写成的;而 GCC 最初也是用 c 写的,后来改用了 c++。

通常用 gcc 命令来编译 c 文件,用 g++ 命令来编译 c++ 文件。不过也可以使用 gcc 来编译 c++ 文件(链接 libstdc++ 库而不是 glibc 库)。下面主要是通过 gcc 命令来说明编译,g++ 的基本是一样的。

编译过程

假设现在有一个 hello.c 文件:

Tags: 

go语言的排序和搜索

晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题。排序 sort 是个基本的操作,当然搜索 search 也是。c 提供一个 qsort 和 bsearch,一个快排一个二分查找,不过是使用起来都不方便; c++ 中的 sort 貌似很不错,因为 c++ 支持泛型(或是说模板),所以很多东西使用起来很方便。go 是通过 sort 包提供排序和搜索,因为 go 暂时不支持泛型(将来也不好说支不支持),所以,go 的 sort 和 search 使用起来跟类型是有关的,或是需要像 c 一样写比较函数等,稍微显得也不是很方便。

补注: 近来又看 go 的排序, 发现以前对 go 的排序理解的有点浅了。 go 的排序思路和 c 和 c++ 有些差别。 c 默认是对数组进行排序, c++ 是对一个序列进行排序, go 则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个 slice (分片, 类似于数组),或是包含 slice 的一个对象。

排序(接口)的三个要素:

Tags: 

Pages