- 博客(16)
- 资源 (6)
- 收藏
- 关注
原创 无锁,线程安全,延迟加载的单例实现(C#)
单例(singleton)是非常常见,也非常有用的设计模式,当然了, 面试中也是经常会被问到的:)在几乎所有的项目中都能看到它的身影。简而言之,单例保证了一个自定义类型在整个程序的生命周期只被创建一次。要实现一个简单的单例是也很容易的:public class Example{ private static Example instance; private Examp
2013-10-07 21:39:06
4733
原创 大文本文件阅读器设计
我们项目中需要实现一个日志查看控件,这本是一个很简单的需求:写一个通用的控件,将字符串绑定到RichTextBox, 如果要查看日志,将日志赋值给字符串即可。这个控件很简单,在绝大多数情况下工作的都很好。但是最近经常有客户报告说日志打不开,或者打开后就无法响应了。检查后发现这些无法打开的日志都很巨大,文件长度大多都超过几千万行。显然不带任何优化的文本阅读器都撑不住这个级别的文本。通过观察及与客户的
2013-09-19 12:20:04
2743
原创 聊聊Windows程序中的"\r"和"\n"
从学编程的第一天起,我们就接触到了"\r"和"\n"。 "\n" 表示换行(LF, Line Feed),ASCII是0xA。 "\r"表示回车(CR, Carriage Return), ASCII是0xD。 换行是很容易理解的,无需过多的解释。回车是打字机时代的产物,表示回到当前行的最开始。概念本身很简单,如果各个操作系统,框架都严格遵守这个规则,事情就简单多了。 Unix系列, Ap
2013-09-08 14:46:27
5024
原创 再谈关注分离, 基于版本控制的设计
前段时间写了一篇关于关注分离的博客。很巧的是这段时间我们需要在项目里增加一个新特性,又提到了关注分离。背景是这样的:我们有一个ConfigManager类,这个类的职责是读取和写入配置文件。当业务逻辑有配置文件读写要求时,直接调用ConfigManager即可,使得配置文件对业务逻辑完全透明。当时在设计ConfigManager类的时候考虑到了配置文件的格式有可能在将来会改变,实现可能会有bug,
2013-09-01 15:36:43
1358
原创 关注分离
这两天在工作中经常会提到spearation of concern这个概念。我想在这篇博客里讲一下我对这个概念的理解。实际上关注分离并不是一个专属于IT领域的概念。在各个领域我们都在不自觉的考虑如何将任务切割,分配。记得在我读书的时候,看一些开源代码,就是不理解为什么这些所谓的牛逼代码写得那么绕:明明一个简单的new就能创建一个实例,偏要用一个工厂类来生成;明明一个new就能解决的问题,偏偏要拆成
2013-08-11 13:45:29
1245
原创 接口与抽象类
接口(interface)与抽象类(abstract class)的区别是我在面试的时候几乎必问的一个问题,可惜很少有面试者能回答得很好。大多数能说出它们的特性,比如不能实例化,是定义接口的用途等等。但是在实际工作环境中能把这两个运用得很好的并不多。在实际工作中很多.NET程序员会有意识的使用接口,但是很少使用抽象类。C++程序员,由于受到语言的限制(语言本身并没有定义接口这个概念),只会将抽象类
2013-07-28 13:14:17
1173
原创 Linux内核spin_lock与spin_lock_irq分析
在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆。首先看一下代码是如何实现的。spin_lock的调用关系 spin_lock | + -----> raw
2011-09-30 15:45:54
31618
原创 linux内核hlist分析
在Linux内核中,hlist(哈希链表)使用非常广泛。本文将对其数据结构和核心函数进行分析。和hlist相关的数据结构有两个(1)hlist_head (2)hlist_node struct hlist_head { struct hlist_n
2011-09-11 13:23:16
14005
原创 linux内核PID管理
PID即进程描述符在linux kernel中的分配和管理比较复杂。 本文分析了其相关数据结构以及函数。 (代码基于v3.0.3)和PID相关的数据结构有struct pid{atomic_t count;unsigned int level;struct h
2011-09-10 14:53:07
15886
原创 利用mmap /dev/mem 读写Linux内存
使用 hexedit /dev/mem 可以显示所有物理内存中的信息。 运用mmap将/dev/mem map出来,然后直接对其读写可以实现用户空间的内核操作。以下是我写的一个sample#include#include#include#include#inclu
2011-08-02 14:00:50
37223
6
原创 利用iptables&Putty进行端口转发
iptables -Fiptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTiptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth2 -j MASQUERADEiptables -A PREROUTING -t nat -p tcp -d 10.32.100.58 --dp
2011-06-21 15:25:00
2524
原创 git 小技巧
(1)合并两个commit并重新编辑commit description(a) git rebase -i HEAD~3说明: 你想修改最近三次的提交说明,或者其中任意一次,你必须给git rebase -i提供一个参数,指明你想要修改的提交的父提交,例如HEAD~2或者HEAD~3。可能记住~3更加容易,因为你想修改最近三次提交;但是请记住
2011-06-03 15:41:00
1271
原创 Net::Telnet库使用
<br />今天写了一个通过telnet远程控制APC电源远程控制的脚本。调试Net::telnet库费了点时间, 所以打算将其记录下来。<br />sub operate_apc_server{ my $param_ref = shift; my $port = $param_ref->{port}; my $action = $param_ref->{action}; my $list = $param_ref->{list}; my $telnet
2010-11-17 15:17:00
4464
原创 libxml++库 (2) Node, contentNode and Element 比较
libxml库中Node, contentNode还有Element的概念很容易混淆。 做了好几个sample test我才算是区分清楚。xmlpp::Node是base class. xmlpp::contentNode和xmlpp::Element都继承于它。xmlpp::Element的概念很容易理解。就是我们平时理解的xml的element,它可以有attribute,也可以有自己的子节点。 libxml++库里面xmlpp::contentNode这个名字我觉得取得非常不好, 非常让我产生误解。其
2010-09-14 23:52:00
2956
原创 libxml++库 (1) 安装及编译
这几天在学习libxml。 今天尝试安装并编译了一下。 安装 安装很简单。 两条命令: (1) sudo apt-get install libxml++2.6-dev (2) sudo apt-get install libxml++2.6-doc编译安装成功后写了一个hello world程序做了下测试【源代码】#include #include #include "libxml++/libxml++.h"us
2010-09-08 15:19:00
4832
codeigniter
2010-08-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人