自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(164)
  • 资源 (1)
  • 收藏
  • 关注

原创 RabbitMQ使用不当导致的队列堵塞问题及解决办法

本接盘侠接手的一个服务使用RabbitMQ和其他服务进行消息传输。接手后发现:有时候RabbitMQ中明明有元素,但是不会回调DefaultConsumer的handleDelivery函数,于是队列无法消化,越堵越长。通过jstack查看,发现rabbitmq消费者线程堵塞在socketinputstream的socketRead0函数。通过搜索,发现这篇文章:《Queue consumer

2015-10-14 21:03:13 30105

原创 使用JavaMail发送邮件时判断发送结…

1、获取邮件发送结果   网上看大多数例子,都是调用Transport类的sendMessage方法后就收工了。但sendMessage方法没有返回值的,而且是一个异步的方法(也就是函数调用结束的时候邮件的发送过程并未结束)。我们可以通过Transport的addTransportListener方法增加邮件发送结果的Listener,Listener接口有三个方法:void message

2015-10-10 09:24:17 12217 2

原创 升级CentOS6.6后Java新建线程抛出O…

原来Java服务运行在CentOS5.4上正常,最近部署到CentOS6.6服务器上。结果运行一段时间后,程序在执行新建线程操作的时候抛出异常:“java.lang.OutOfMemoryError:unable to create new nativethread”。这种情况一般是因为JVM内存不足,通过调整JVM内存参数就能搞定。但是我们的Java服务已经分配了很大的内存,当前实际使用并不

2015-10-10 09:24:14 634

原创 解决RabbitMQ队列超长QueueingCons…

我们的服务器使用RabbitMQ作为消息中转的容器。某天我怀疑RabbitMQ队列是否都能及时消化。于是用命令查询了下:rabbitmqctllist_vhosts | grep -P ".*\.host" | xargs -i rabbitmqctl list_queues-p {} | grep "queue"。 不查不知道,一查吓一跳:大多数服务器的队列基本上都是空的,但是有些服务器的

2015-10-10 09:24:12 4434 1

原创 解决Java从MySQL读取大量数据时卡…

今天晚上突然有个服务无法启动。这个服务在启动的时候会从数据库中加载一些数据。查看日志:有开始加载的日志,但没有完成加载的日志,判断问题是在加载数据时卡住。用top查看进程,发现CPU占用为0%。又怀疑可能是因为jvm内存不够,用jstat查看jvm内存使用情况,发现各区内存占用率较低,连younggc都没有出现。再用jstack查看线程栈,发现线程卡在JDBC底层的TCP套接字读取上: --

2015-10-10 09:24:10 13585

原创 DevOp经验谈:直接操作线上数据库…

首先声明尽量避免这么干,直接动手修改线上数据库是很没有节操的运维方式。当你这么做的时候,得认识到这不是一个好主意,是否有可能避免?比如很多这种问题是由于同步错误导致的,举个例子:写入mysql的时候,由于ooxx的问题,写入redis缓存失败,最后导致redis里的数据和mysql不一致。这种时候,应该要写一个校正的工具,根据mysql的数据重新生成redis缓存数据。   但有时候,直接修改

2015-10-10 09:24:07 1738

原创 DevOp经验谈:服务故障排查的第一…

近来接手了一个比较大型的项目,由于系统内部服务数量较为众多,且没有物理机或者虚拟机的隔离措施。导致系统出现故障的概率大大增加,带给维护很大的压力。最近这段时间也是久病成医,现在总结服务故障排查的一些经验,在此文和大家分享下。  我有些时候会对技术人员提出这样的问题:如果服务出故障了,比如http服务无法返回或者返回很慢,应该要怎么排查? 大多数的人的回答是到服务器上看日志。其实这个答案并不

2015-10-10 09:24:05 631

原创 MYSQL实践心得:table_open_cache…

MYSQL默认的table_open_cache为64,这个数值是偏小的,如果max_connections较大,则容易引起性能问题。    表现:数据库查询效率慢,showprocesslist 发现比较多的查询正在opening table。    进一步确认,执行以下语句:mysql> show global statuslike 'open%tables%';+--------

2015-10-10 09:24:02 788

原创 变量和函数是否应该设置为static

面向对象的语言中变量和函数可以设置为static,这样就隶属于类本身而不是类的实例对象。一般来说:   对于普通变量,更倾向于设置为非static,因为static的类变量是全局变量,全局变量的弊端大家应该都了解。常见的一个编程错误就是错误地是用来了static变量,结果几个实例对象相互影响导致错误。    对于常量变量,更倾向于采用static的方式,再加上const、final修饰。因为

2015-10-10 09:24:00 553

原创 在QT的信号和槽中使用自定义类型

QT的信号和槽机制由于实现的年代比较久远,所以采用的是代码预编译而不是更时髦的模板技术来实现。但实际使用起来还是挺方便的。也能够很好地用于跨线程的通信场景,比如后台线程取到数据后通知UI线程显示。      最近遇到一个有趣的问题:我们在一个信号中用了自定义类型,之前使用完全没有问题。后来我们改到非UI线程中发射信号,结果槽函数就调用不到了。       通过查看运行时日志,发现QT在co

2015-10-10 09:23:57 2495

原创 版本号的比较函数

网上搜索了下,没发现太好的实现,于是自己实现了。原理就是按点号切割字符串后从前往后转换成数字进行比较,所以 2.11.3 > 2.6.2(如果直接比较字符串,结果是错误的) 。可以支持不同长度的版本号比较, 1.2.3 > 1.2。不支持带数字的版本号进行比较,比如 1.2.3a vs1.2.3b,会直接异常( Integer.valueOf方法扔异常)。如果有此需求应该自己实现版本比

2015-10-10 09:23:55 945

原创 Java、IOS、C之间进行RSA密文传输

有了之前三个终端进行AES加解密的经验,实现RSA加解密倒不是太复杂。两个关键点:1)RSA需要密钥文件,且密钥文件的格式很重要;2)padding方式需要一致,比较被广泛支持且被很多RAS实现设置为默认padding方式的是PKCS1PADDING V1.5,建议采用。      我是在linux下用openssl生成公钥、私钥文件的,分三个步骤,命令如下:      1、生成公钥pub

2015-10-10 09:23:53 967

原创 使用boost::bind/std::bind进行封…

boost::bind( ps:在c++11中被引入标准库,变成std::bind)是C++进行封包操作的利器。可以很简单地把一个函数(包括类成员函数)调用及其部分/全部参数封装成一个对象(boost::function),以供之后调用。可以理解成这是对C语言函数指针的升级,毕竟使用函数指针来进行回调,经常是用void*来指定上下文,麻烦且容易出错。     boost::bind的实现原

2015-10-10 09:23:50 1317

原创 顺藤摸瓜研究应用程序如何监控文件…

之前写过服务,需要动态加载配置文件。做法是后台启动一个线程,每隔一段时间看下文件是否发生了变化(通过大小+最后修改时间),如果有变化就重新加载。可用是可用,但感觉效率不高也不够及时。最近听闻JavaNIO可以监控文件。Java 7 NIO.2 文件监视服务简介 。 看一下类图:           具体实现有:Windows的版本,Linux的版本,轮询的版本。这就很有趣了,说明Win

2015-10-10 09:23:48 447

原创 对开发日志的一些心得

开发日志是很能体现一个开发者能力和逻辑思维的项目。写得好的程序,日志有序完备,能够用于跟踪关键路径,方便定位问题,有时还可以帮助进行性能优化。而比较差的代码,要么日志残缺不全,要么絮絮叨叨还把握不了关键路径,无助于定位问题。本文主要讲讲我对开发日志的一些心得。      1、使用不同级别的日志,关注高级别缺陷日志     现在很多开发环境的日志类提供了多级别的日志输出(如果没有日志类或者日

2015-10-10 09:23:45 3148

原创 SQLite批量插入Android代码示例

参考之前博文:《如何向SQLite批量插入大量记录和其他一些使用心得》------------------------------代码的分割线---------------------------importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteStatement;pu

2015-10-10 09:23:42 416

原创 SQLite批量插入IOS代码示例

参考前一篇博文:《如何向SQLite插入大量记录和其他一些使用心得》    SQLite批量插入的IOS代码示例(因为使用的是C API,C/C++用法与之类似):   -------------------------代码的分割线-------------------------// 打开数据库的部分省略if (![self beginTransaction]) {    DLo

2015-10-10 09:23:40 553

原创 SQLite批量插入和其他一些使用心得

SQLite是我在客户端上使用得最多的数据库,方便易用稳定强大,其支持很多的平台和语言:我分别在Windows(C++、QT)、Android、IOS上开发过使用SQLite来保存客户端本地数据的应用。下面说说对使用SQLite的一些心得。    1、批量插入。很多人发现使用SQLite插入大量数据的时候非常慢。我有印象刚使用SQLite的时候发现插入2000条数据(10列左右)居然要好几

2015-10-10 09:23:38 1279

原创 "《英雄联盟》支撑最高750万同时在…

今天在CSDN上看到《英雄联盟》支撑最高750万同时在线用户的聊天服务打造 一文。因为这一年多来,自己主要在做一款IM产品,对其他IM产品比较关注,所以在此做做笔记和写下读后感。     1、高性能:“支撑750万并发用户,2700万日活跃用户,每秒钟需要处理的消息上万条,每台服务器每天处理消息达十亿条。”,"每个Chat服务器都可以支撑数百万连接数。"。单服务器能支持的并发连接数和Whats

2015-10-10 09:23:35 575

原创 程序员应该具备的能力

好的程序员我觉得需要具备以下五方面的能力:1、组织代码的能力 。有能力将代码组织得结构良好没有坏味道(参考《重构》一书)、模块内高内聚、模块间低耦合。2、操作数据结构的能力。实际应用开发一般不要求ACM题做得多好多快,但要能熟练掌握常用数据结构和算法。很多人说使用类库就好了,很多时候确实如此,但如果连名字都不知道怎么找到类库呢?数据结构的原理都不知道怎么对比评判以做出选择呢?而且如果连个二

2015-10-10 09:23:33 697

原创 IOS和Java进行AES密文传输(ECB&nb…

可以参考之前写的:Java和C/C++进行DES/AES密文传输。现在老革命遇到新问题,需要开发IOS应用。之前了解了一定的加密知识,整个过程还是比较顺利的。    使用CommonCryptor.h的方法进行加解密。几个关键参数设置如下:    加密算法:kCCAlgorithmAES128 (kCCAlgorithmAES也一样);     iv:设置为nil就可以了。因为ECB方

2015-10-10 09:23:30 991

原创 小工具:批量转换文件夹下的特定类…

网上没找到好的,于是自己用Java写了个小工具。=======================代码的分割线=============================import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream

2015-10-10 09:23:28 276

原创 IOS如何在容器类(如NSMutableSet)…

在项目中有某个功能需要用到多个delegate对象,这就需要把delegate放到容器中,但又不想保存强引用导致delegate对象不能被释放。所以希望能在容器中只保存delegate对象的弱引用。搜索发现大家常用的方法应该是采用NSValue的valueWithNonretainedObject 和 nonretainedObject来对弱引用进行封装。但是我测试发现,这么做虽然不会阻止对

2015-10-10 09:23:26 539

原创 遇到技术问题的时候,建议使用如下…

遇到技术问题的时候,建议使用如下的搜索顺序:1、查看官方文档。比较大的sdk,如安卓和QT的文档都十分完备。但比较小的开源软件则不一定;2、使用Google和 StackOverFlow, 分别用英文关键词和中文关键词搜索;3、使用bing, 分别用英文关键词和中文关键词搜索;4、使用baidu,使用中文关键词搜索。另外取决于情况,有时候可以询问周围有相关经验的开发者。很多时候听君一席话

2015-10-10 09:23:23 2330

原创 关于代码注释的认识更新

对代码注释我的认识有过几次改变。     刚工作的公司对注释有所要求,鼓励大家多写注释,作为新人也就接受了这种观点,可能也写了不少“这个类是用来打印hello,world”的废话注释呵呵。或者“inti = 0; //这个变量用来保存用户年度缴纳金额之和”这种不注重变量/函数命名而是使用注释来说明的错误写法。      后来开发经验渐长,受一些最好的注释就是没有注释的思想影响,倾向于不写

2015-10-10 09:23:21 472

原创 高效地反向逐行读取文件

在某些时候,我们需要从文本中读取最后几行。这时候如果采用基于流的文件读取方式,在文件大的时候效率十分低下,因为要把整个文本读取一遍才能定位到最后几行。本文提供的实现采用逐块回退读取文件数据的方式,提供快速且内存可控的反向逐行读取功能。上代码吧:class BackwardLineReader{public:    //指定文件路径、换行符、每次读取的字节数、最大的缓存大小(用于避免由于

2015-10-10 09:23:18 806

原创 可去重的消息队列:AntiDuplicateL…

LinkedBlockingQueue经常用于线程间的消息队列。一个或多个消费者线程阻塞在take操作,生产者线程往队列里面offer新的消息。有时候,可能希望不要在队列中有重复的请求。我实现的AntiDuplicateLinkedBlockingQueue可实现此目的。代码很简单,就是用一个LinkedList来实现队列,一个HashSet来实现去重。====================

2015-10-10 09:23:16 7239

原创 Java和C/C++进行DES/AES密文传输

本来觉得DES、AES这种流行加密算法,使用起来应该很简单。但研究后发现有两个变数:1)分块的方式。加密是逐块进行的。分块方法有:CBC、ECB、CFB……2)padding的方式。当数据的位数不及块的大小时,需要填充。填充方式有:NoPadding、PKCS5Padding……如果加解密端采用不同的分块方式或padding方式,即使都是采用DES/AES算法,同样无法解密成功。上次需要C

2015-10-10 09:23:13 725

原创 使用std::map和std::list实现LRU(…

最近偶然需要使用LRU缓存,搜索了一下,发现STL和boost里没有现成的。于是就用map和list简单实现了下。通过了单元测试。因为逻辑蛮简单的(加上满满注释不到100行),应该不会有错哈。欢迎大家体验。源码除了std外,只使用了boost::function,如果不想使用boost类库,完全可以用函数指针替换掉(注释中有说明),但是那么做要传入类的成员函数就麻烦了嘿。    LRU最简单

2015-10-10 09:23:11 1513

原创 QT控件的visible属性

很多QT的新手设置是老手在使用QT控件的visible属性的时候,很容易犯错。比如show()或者setVisible(true)后,isVisible()应该返回true吧?但其实QT控件的visible属性是一个综合属性:“CallingsetVisible(true) or show() sets the widget to visible status if allits parent

2015-10-10 09:23:08 1930

原创 QT程序如何获知鼠标enter/leave通…

今天想实现类似QQ消息盒子的功能:当鼠标进入通知栏图标的时候弹出一个小窗口,当鼠标离开通知栏图标的时候隐藏该窗口。但发现QSystemTrayIcon不是继承QWidget(why?这是为了跨平台,跨平台是个坑爹货啊)!所以不能很简单地enterEvent/leaveEvent。怎么办呢?开始Google。1)排行比较靠前的解决方案:http://www.qtcn.org /bbs/simpl

2015-10-10 09:23:06 1659

原创 谈谈网络编程中应用层(基于TCP/UDP…

对于初涉网络编程的开发人员来说,在通信协议的设计上一般会有所困惑。一般的网络编程书籍上也较少涉及这方面的内容。估计是觉得太简单了。这块确实是不难,但如果不了解,又很容易出篓子或者绕弯路。下面我就来谈谈基于TCP/UDP的协议设计。   1、基于TCP的协议设计     TCP是基于流的协议。但大部分网络应用一般会有个更小的处理单元,我们称之为帧(FRAME)。是否分帧   如上

2015-10-10 09:23:03 714

原创 对软件架构的一些思考(V2.0)

最近看了一些技术书籍,结合自己的工作体会。对软件架构有了一些新的体会,在这里总结一下。如果说原始的看法是V1.0,那现在的想法就是V2.0吧。   我虽然早就是党国认证的系统架构师,但对软件架构的看法其实是非常偏实用主义的。记得我在某篇博文里说,何为好的架构?就是在整个软件开发过程中都不会后悔的技术决定,小到函数设计,大到模块划分,仅此而已。这种看法是正确的,但也是无用的。毕竟我们做出一个决

2015-10-10 09:23:01 427

原创 基于Boost线程库实现Java中atomic…

Java的java.util.concurrent.atomic包的说明是“ A small toolkit of classesthat support lock-free thread-safe programming on singlevariables”。挺贴切的。是实际多线程编程时很方便的一组类。最近我使用boost里的thread库模仿实现了下,没有单元测试,但应该是正确的。因为它

2015-10-10 09:22:59 503

原创 两种定制行为的方式:使用参数和使…

很多能力相对不足的开发。在被指出重复代码要求修改的时候,常有一个困惑:两段代码的确基本一样,但又略有不同或者有较多不同,这样怎么处理。这时候有两个常规武器:使用参数或者使用多态。   两者之中,使用参数是更常用的方式。其历史很悠久,在C语言时代,大家都是这么提取函数的。缺点是假如要定制的行为比较复杂,会导致要传入一堆的参数,然后代码中各种if-else、switch,降低了代码的可读性,维护

2015-10-10 09:22:56 332

原创 C++没有所谓的"赋值构造函数"

发现蛮多C++coder存在一个误会:"string str2 = str1;" 调用赋值构造函数。"string str2(str1);"调用拷贝构造函数。   但其实C++有拷贝构造函数(有人叫复制构造函数),有赋值运算符重载,但没有赋值构造函数!    "string str2= str1;" 和 "string str2(str1);"效果完全一样,都是调用拷贝构造函数。  

2015-10-10 09:22:54 340

原创 C++中用字符串来切割字符串

参考之前写的:http://blog.sina.com.cn/s/blog_48d4cf2d0100r9hv.html。主要是增加一个regexEscape函数,免得只想使用字符串而不是正则表达式时数反斜杠数得眼花。有写几个测试用例,应该没啥大问题。   =======================代码的分割线================================#includ

2015-10-10 09:22:52 382

原创 建议编程时不要注释无用代码

工作中,发现很多程序员习惯注释掉旧代码。我是不赞同这种做法的:我建议如果这些代码还有用,就将其提取出来,变成函数/类等会编译的单元,如果没用了就直接删除。不然日子久了,往往代码中充斥着大量旧代码注释。造成额外的维护负担:谁都不记得这些注释的作用了,又不知道能否直接删除。即使知道这些代码的作用,要用的时候反注释后可能也是一堆编译错误,未必比重写好多少。   额外的负担其实还不是主要原因。其实更

2015-10-10 09:22:49 4704

原创 组合未必优于继承

因为我曾经坚信“组合优于继承”,“只要implement,不要extend”。写这篇文章,某种意义上算是对我曾经有偏见的继承/多继承道个歉,以后我会将它们加入常规武器中。   我和很多面向对象初学者一样,都经历过滥用继承的阶段。我刚开始学习面向对象,使用的是C++,开发时最主要是使用类来划分程序模块。因为用继承来扩展一个类十分方便而直观,所以我和很多面向对象的初学者一样十分喜欢使用继承。但是

2015-10-10 09:22:47 407

原创 初中时影响我人生观的一件事

最近面试了不少C/C++程序员,技术上都达不到要求,我都灭灯了。HR恨我牙痒痒。其实有时我做决定时也有烧心的感觉,这与我初中的一段经历有关。   那已是15年前的事情了,彼时我是个内向而又敏感的初中生。父母在事业单位工作。有段时间江湖传言单位要改制,职工全部下岗。父母很焦虑,常在家中唉声叹气。我表面不动声色,但其实也十分焦灼。这样的状态持续了大半年,最后传言被证伪,全家人都松了一口气。现在可

2015-10-10 09:22:44 1062 1

NSData+CommonCrypto

NSData通用加解密算法扩展。Created by Jim Dovey on 31/8/2008.

2016-02-01

空空如也

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

TA关注的人

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