自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

loop in codes

http://weibo.com/kevinlynx

  • 博客(104)
  • 资源 (7)
  • 收藏
  • 关注

原创 Java中隔离容器的实现

Java中隔离容器用于隔离各个依赖库环境,解决Jar包冲突问题。问题应用App依赖库LibA和LibB,而LibA和LibB又同时依赖LibBase,而LibA和LibB都是其他团队开发的,其中LibA发布了一个重要的修复版本,但是依赖LibBase v2.0,而LibB还没有升级版本,LibBase还不是兼容的,那么此时升级就会面临困难。在生产环境中这种情况往往更恶劣,可能是好几层的间接依赖关系。

2015-09-05 11:02:05 6327 2

原创 写了一个分布式名字服务JCM

之前在公司里维护了一个名字服务,这个名字服务日常管理了近4000台机器,有4000个左右的客户端连接上来获取机器信息,由于其基本是一个单点服务,所以某些模块接近瓶颈。后来倒是有重构计划,详细设计做了,代码都写了一部分,结果由于某些原因重构就被终止了。JCM是我业余时间用Java重写的一个版本,功能上目前只实现了基础功能。由于它是个完全分布式的架构,所以理论上可以横向扩展,大大增强系统的服务能力。名字

2015-07-04 17:55:04 3454

原创 基于servlet实现一个web框架

servlet作为一个web规范,其本身就算做一个web开发框架,但是其web action (响应某个URI的实现)的实现都是基于类的,不是很方便,并且3.0之前的版本还必须通过web.xml配置来增加新的action。servlet中有一个filter的功能,可以配置所有URI的功能都经过filter。我们可以基于filter的功能来实现一个简单的web框架。在这个框架中,主要改进URI ac

2015-06-07 17:56:33 3779

原创 Java中的反射及Bean容器的实现

编程语言中的反射(Refection)指的是可以在程序运行期动态加载一个类。与之相关的是自省(Introspection),这个指的是程序自己可以获取一个类型的描述信息,例如获取一个类的所有接口定义、一个接口的所有形参。当编程语言有了这些语言特性之后,可以在很大程度上解决代码耦合问题,所以在Java的世界里,可以看到很多库/框架使用了反射技术。类似Spring的Bean容器实现就是大量运用了反

2015-05-31 15:53:40 3392

原创 Drill中实现HTTP storage plugin

Apache Drill可用于大数据的实时分析,引用一段介绍:受到Google Dremel启发,Apache的Drill项目是对大数据集进行交互式分析的分布式系统。Drill并不会试图取代已有的大数据批处理框架(Big Data batch processing framework),如Hadoop MapReduce或流处理框架(stream processing framework)

2015-05-30 20:35:28 3189

原创 无锁有序链表的实现

无锁有序链表可以保证元素的唯一性,使其可用于哈希表的桶,甚至直接作为一个效率不那么高的map。普通链表的无锁实现相对简单点,因为插入元素可以在表头插,而有序链表的插入则是任意位置。本文主要基于论文High Performance Dynamic Lock-Free Hash Tables实现。主要问题链表的主要操作包含insert和remove,先简单实现一个版本,就会看到问题所在,以

2015-05-05 19:48:13 2766 4

原创 并行编程中的内存回收Hazard Pointer

接上篇使用RCU技术实现读写线程无锁,在没有GC机制的语言中,要实现Lock free的算法,就免不了要自己处理内存回收的问题。Hazard Pointer是另一种处理这个问题的算法,而且相比起来不但简单,功能也很强大。锁无关的数据结构与Hazard指针中讲得很好,Wikipedia Hazard pointer也描述得比较清楚,所以我这里就不讲那么细了。一个简单的实现可以参考我的gith

2015-05-03 20:44:55 2772

原创 使用RCU技术实现读写线程无锁

在一个系统中有一个写线程和若干个读线程,读写线程通过一个指针共用了一个数据结构,写线程改写这个结构,读线程读取该结构。在写线程改写这个数据结构的过程中,加锁情况下读线程由于等待锁耗时会增加。可以利用RCU (Read Copy Update What is rcu)的思想来去除这个锁。本文提到的主要实现代码:gistRCURCU可以说是一种替代读写锁的方法。其基于一个事实:当写线程

2015-04-19 19:12:16 3148

原创 初识JVM byte code

关于JVM和其上的byte code,网上其实有足够多的资料了,我这里就简单做个提纲和介绍,权当记录吧。stack-based VMJava byte code运行在JVM上,就像机器指令运行在物理机上,是需要遵循这个机器的指令规范的。所以认识JVM byte code,是需要稍微了解下JVM的。JVM是一个基于栈(stack-based)的虚拟机。很久以前我还写过类似简单的虚拟机。基

2015-04-06 18:36:40 1532

原创 记一次tcmalloc分配内存引起的coredump

现象线上的服务出现coredump,堆栈为:#0 0x000000000045d145 in GetStackTrace(void**, int, int) ()#1 0x000000000045ec22 in tcmalloc::PageHeap::GrowHeap(unsigned long) ()#2 0x000000000045eeb3 in tcmalloc::Page

2015-04-06 18:34:18 5276

原创 基于内存查看STL常用容器内容

有时候在线上使用gdb调试程序core问题时,可能没有符号文件,拿到的仅是一个内存地址,如果这个指向的是一个STL对象,那么如何查看这个对象的内容呢?只需要知道STL各个容器的数据结构实现,就可以查看其内容。本文描述了SGI STL实现中常用容器的数据结构,以及如何在gdb中查看其内容。stringstring,即basic_string bits/basic_string.h:m

2014-12-03 22:09:31 1998

原创 linux动态库的种种要点

linux下使用动态库,基本用起来还是很容易。但如果我们的程序中大量使用动态库来实现各种框架/插件,那么就会遇到一些坑,掌握这些坑才有利于程序更稳健地运行。本篇先谈谈动态库符号方面的问题。测试代码可以在github上找到符号查找一个应用程序test会链接一个动态库libdy.so,如果一个符号,例如函数callfn定义于libdy.so中,test要使用该函数,简单地声明即可:

2014-11-04 00:57:12 4632

原创 图解zookeeper FastLeader选举算法

zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leader。其默认选举算法为FastLeaderElection。不知道zookeeper的可以考虑这样一个问题:某个服务可以配置为多个实例共同构成一个集群对外提供服务。其每一个实例本地都存有冗余数据,每一个实例都可以直接对外提供读写服务。在这个集群中为了保证数据的一致性,需要有一个Leader来协调一些事务。那么问题

2014-10-19 15:56:18 4244

原创 图解分布式一致性协议Paxos

Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢?:Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。:理解了这两个分布式协议之后(Paxos/2PC),学习其他分布式协议会变得相当容易。学习Paxos算法有两部分:a) 算法的原理/证明;b) 算法的理解/运作。理

2014-10-15 22:42:50 9411

原创 淘宝分布式配置管理服务Diamond

在一个分布式环境中,同类型的服务往往会部署很多实例。这些实例使用了一些配置,为了更好地维护这些配置就产生了配置管理服务。通过这个服务可以轻松地管理这些应用服务的配置问题。应用场景可概括为:zookeeper的一种应用就是分布式配置管理(基于ZooKeeper的配置信息存储方案的设计与实现)。百度也有类似的实现:disconf。Diamond则是淘宝开源的一种分布式配置管理服务的实现。D

2014-10-12 12:57:34 20986

原创 浅析glibc中thread tls的一处bug

最早的时候是在程序初始化过程中开启了一个timer(timer_create),这个timer第一次触发的时间较短时就会引起程序core掉,core的位置也是不定的。使用valgrind可以发现有错误的内存写入:==31676== Invalid write of size 8==31676== at 0x37A540F852: _dl_allocate_tls_init (in /l

2014-10-07 21:36:12 4311

原创 zookeeper节点数与watch的性能测试

zookeeper中节点数量理论上仅受限于内存,但一个节点下的子节点数量受限于request/response 1M数据 (size of data / number of znodes)zookeeper的watch机制用于数据变更时zookeeper的主动通知。watch可以被附加到每一个节点上,那么如果一个应用有10W个节点,那zookeeper中就可能有10W个watch(甚至更多

2014-09-21 20:56:26 24329

原创 基于protobuf的RPC实现

可以对照使用google protobuf RPC实现echo service一文看,细节本文不再描述。google protobuf只负责消息的打包和解包,并不包含RPC的实现,但其包含了RPC的定义。假设有下面的RPC定义:service MyService { rpc Echo(EchoReqMsg) returns(EchoRespMsg) }那么要实

2014-09-18 22:32:41 29796 1

原创 理解git常用命令原理

git不同于类似SVN这种版本管理系统,虽然熟悉常用的操作就可以满足大部分需求,但为了在遇到麻烦时不至于靠蛮力去尝试,了解git的原理还是很有必要。文件通过git管理的文件版本信息全部存放在根目录.git下,稍微看下:$ ls .gitCOMMIT_EDITMSG  HEAD       branches  description  index  logs

2014-09-17 23:25:48 1986

原创 浅析静态库链接原理

静态库的链接基本上同链接目标文件.obj/.o相同,但也有些不同的地方。本文简要描述linux下静态库在链接过程中的一些细节。静态库文件格式静态库远远不同于动态库,不涉及到符号重定位之类的问题。静态库本质上只是将一堆目标文件进行打包而已。静态库没有标准,不同的linux下都会有些细微的差别。大致的格式wiki上描述的较清楚:Global header-----------------

2014-09-15 22:48:21 8296 1

原创 分布式环境中的负载均衡策略

在分布式系统中相同的服务常常会部署很多台,每一台被称为一个服务节点(实例)。通过一些负载均衡策略将服务请求均匀地分布到各个节点,以实现整个系统支撑海量请求的需求。本文描述一些简单的负载均衡策略。Round-robin简单地轮询。记录一个选择位置,每次请求来时调整该位置到下一个节点:curId = ++curId % nodeCnt随机选择随机地在所有节点中选择:id =

2014-09-14 16:31:44 1440

原创 C/C++中手动获取调用堆栈

当我们的程序core掉之后,如果能获取到core时的函数调用堆栈将非常有利于定位问题。在Windows下可以使用SEH机制;在Linux下通过gdb使用coredump文件即可。但有时候由于某些错误导致堆栈被破坏,发生拿不到调用堆栈的情况。一些基础预备知识本文不再详述,可以参考以下文章:函数调用栈的获取原理分析寄存器、函数调用与栈帧需要知道的信息:函数调用对应的call

2014-09-14 14:10:23 6580

实现直接拒接来电

经过简单的google/baidu后,发现android没有现成的API去拒接电话。android可以通过注册BroadcastReceiver截取短信,因为这个broadcast是一个ordered broadcast,所以只要优先级比短信接收程序高,就可以提前终止掉这个broadcast receiver。但是,电话呼入则没有类似的机制。不过,综合网上的一些资料,通过以下大体的步骤,则...

2011-01-16 21:31:50 325

系统自带短信程序源码部分分析

这里并不打算对整个短信源码进行分析,完全是看了某部分代码后的自我总结。我从GIT上clone了Conversation(即短信程序)的所有源码,结果编译不过。不过这对分析它的源码并不造成太大的阻碍。这里主要对短信主界面的数据和UI的交互角度进行分析,因为我自己写的短信程序在加入获取联系人头像功能后,程序启动时花费的查询时间太长。虽然我也觉得系统默认的短信程序,甚至HandcentSMS,启...

2011-01-09 15:42:48 163

编写content provider

Android中content provider提供了一种进程间共享数据的机制。Conetent provider以类似数据库表的机制提供与外部交互的方法。content provider的实现并不对存储形式做要求,可以是数据库、文件、或者网络。要自己编写一个content provider需要注意的事项包括(from official reference):1、派生ContentProv...

2011-01-02 20:50:26 136

获取短信会话列表

Android中的短信并没有正式的content provider可用,在官方文档中没有提供定义。不过依然可以自己定义好URI,然后查询出短信内容。例如conetent://sms则是所有短信所在的path。要将短信按会话分类,原先我是查询出所有短信后,然后再按照thread_id分类。系统自带的短信程序包含一个会话显示界面,每个条目包含:联系人、短信数量、第一条短信等内容。当我的程序处理...

2011-01-02 15:07:51 232

Android: RelativeLayout作为ListView时的布局BUG

当一个ListView的item为一个RelativeLayout时,该ViewGroup下的子view如果配置为 android:layout_alignParentBottom="true",本来是让子view靠近RelativeLayout的底部,但实际运行结果却是靠到顶部。[img]http://dl.iteye.com/upload/attachment/378692/...

2010-12-30 11:17:40 183

Android: 开发短信程序列表界面(QuickContactBadge/ListView混用)

android默认短信程序主界面主要是一个ListView,每个Item上有一个QuickContactBadge([url=http://kevinlynx.iteye.com/blog/854279]这里提到过][/url])。这个可以通过定制ListView使用的adapter来实现。查了些ListView自己写adapter的资料,发现问题很多。主要集中于item带有事件响应,或者...

2010-12-29 22:23:53 145

Android: 弹出快捷联系人操作对话框

题目所说的快捷操作对话框在android的很多地方都有,例如点击短信条目中联系人头像,就会弹出三个操作选项:电话、查看、短信。要实现这样的操作,主要是通过QuickContactBadge这个view。关于这个类的使用,网上资料很少。开始我走了一个弯路,以为这个类是负责那个对话框的。[color=red]其实不是,这个类只是一个普通的图片view,点击它就会弹出这里所说的对话框[/colo...

2010-12-28 21:02:18 203

原创 Android: 写文件到SD卡

考虑到SD卡可能没有被mount,或者其他各种情况,操作SD卡上的文件总需要各种状态的判断。主要是使用Environment类里的一些接口进行判断:[code] private void writeFileToSD() { String sdStatus = Environment.getExternalStorageState(); if(!sdStatus...

2010-12-25 15:42:46 200

Android: Activity、进程、BoradcastReceiver生命周期

Android中Activity和进程的生命周期是一个很重要的问题。Android对进程也采取了垃圾回收之类的机制,这意味着即使用户退出了程序,该进程依然可能存在于系统中。这将直接影响我们写的程序结构。[color=red]一个进程可能有若干个Activity。Activity退出后,进程可能并没有结束。下次用户从桌面启动该Activity时,会直接使用没有结束的进程。所以,想直接在主...

2010-12-24 20:17:53 121

原创 Android: 获取短信的发信人

既[url=http://kevinlynx.iteye.com/blog/843281]上次的测试[/url],通过取得短信里的person字段,然后通过person字段从联系人表里取出联系人信息,总是存在问题:1、如果短信是在建立联系人信息之前收到的,person字段依然是0;2、在我的真机上即使person不为0,Cursor::moveToFirst依然失败,导致获取不出联系人信...

2010-12-17 19:42:53 187

原创 Android: 读取短信

读取短信本身没什么难度,仅仅是读取SQLite数据库而已。[code]public Uri SMS_INBOX = Uri.parse("content://sms/inbox"); private void fillListView() { ListView view = (ListView) findViewById(R.id.sms_list); A...

2010-12-15 21:17:48 301

Android: Tab的使用总结

之前在[url]t.sina.com.cn/kevinlynx[/url]陆续贴了些android开发涉及到的一些code snippets,主要目的是记录,供以后需要的时候查阅方便。但是因为miniblog的字数限制,在记录较多信息的时候还是有诸多不便。so, i'm here.Tab view算是我接触android平台第二个比较迷惑的地方(第一个是ListView的adapter)。...

2010-12-12 20:56:52 98

原创 BLOG试迁移

     没啥话说,可能想换个新的感受一下。这个博客太乱,我积累地写了N多文章,结果不加整理,乱得不像样了。暂时迁移到CPP BLOG吧(我不知道我居然早就在那里注册过 = =) 。努力在新的BLOG写规范的技术文章。据说这个博客还是有些人长期关注的,可是我不是很清楚。大家有意见的话留个言什么的。感谢大家支持。   新BLOG:http://www.cppblog.com/kevinlyn

2008-03-13 00:26:00 2151 2

原创 似乎是新的开始

     很早前就有整理CSDN这个博客的想法,可是觉得工作量巨大且CSDN这个博客系统似乎对分类支持不是很好,总之最终还是因为自己的懒而被搁浅。    这个博客我估计申请了差不多有3年多了吧。因为我发现很早前还有我写的关于gvbasic的东西,很汗颜。我写技术博客从来都不规范,基本属于自己作笔记性质。这两三年来全部精力都拿去关注程序技术了,文笔也变弱了,写的东西前言不搭后语,连思维都不连

2008-03-07 22:00:00 1299 1

原创 理解完成端口(IO completion port)

     关于完成端口网上有很多文章,不过我个人觉得大多都讲得不够清楚。给的例子要不就是给一个复杂的封装,要不就是给一个简单的收发数据。注意,完成端口不仅仅用于网络数据的收发,它可以用于windows 平台的各种IO操作。不过我这里只关注在winsock编程中的应用。    要写出一篇真的让人能够明白的文章,不那么容易。这里我只暂时贴些我的理解。迟些时候如果有空的话,我倒有兴趣写个详细的入

2008-01-27 19:54:00 3211 1

原创 试用Ubuntu

    最近利用闲暇的时间翻,在软件设计哲学上很多地方都和作者产生了共鸣。或者有时候被作者说中了自己的感觉,才发现原来自己也是这样想的。编程感悟确实是一种经验主义,说不清道不明只是有那么一种感觉。    关于KISS原则,keep it simple and stupid,但是如同大部分经验原则一样,即使是unix奉行的简约规则,也不可滥用。所以在软件复杂性一节中作者就谈到了“别简单过头“。   

2008-01-11 01:23:00 2076

原创 寻成都游戏(游戏相关工具)开发工作

     最近想工作,本来想把信息发到GameRes,但是怕被人笑话,所以只好在自己的地盘发了。现在寻成都游戏,以及游戏相关工具程序开发的工作。大公司小公司无所谓,薪水不低就行,别把我当实习生就行。我虽然要08年10月份左右才拿得到毕业证,但是可以保证08年1月10号后全职工作。经常看我博客的人也许对我更了解些,这样在网上发布求职信息,主要是希望可以避免笔试面试那些繁琐的步骤。    先发

2007-12-23 22:42:00 2532 2

原创 HGE使用GDI绘制中文字体

其实这个没什么技术含量。这个技术在我自己的引擎Edge2d中被实现了,这里把其核心部分迁移到HGE中。 大致原理就是:利用GDI将文字信息写到HGE的纹理上(本质也就是DX8纹理),然后再绘制HGE纹理到屏幕上。关键效率的处理在于,使用一个缓存保存这些纹理。每次绘制一个文字时,就查询该文字对应的纹理是否被创建,是的话就直接从缓存中取出纹理然后绘制,否的话就立即创建该纹理并保存纹理到缓存中。

2007-11-19 20:52:00 2852 2

The Art of Assembly Language

The Art of Assembly Language

2013-03-08

ice manual 3.4.2

ice manual 3.4.2 english version

2013-03-08

编译原理虎书随书代码

《现代编译原理C语言版》(虎书)随书附带源码,也可以从书里给的地址下载到。

2010-05-24

unix编程艺术英文版

<Unix编程艺术>英文版,CHM格式。

2010-05-24

Modern C++ Design

C++设计新思维 英文版

2008-01-18

Inside c++ object model

深入C++对象模型英文版

2008-01-17

calogre

在OGRE中使用cal3d

2007-07-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除