- 博客(291)
- 资源 (30)
- 收藏
- 关注
原创 Refine! Refine! Refine!
不会调试就不会写代码,不会Refine就不可能写出好代码!Refine之前:#ifndef RTMP_LOG_H#define RTMP_LOG_H#include #include #include using namespace std;#include #include #define ccrtmp_memset(str, n) memset(str, n
2013-01-05 16:11:57 1302
原创 linux的errno
/**g++ error_test.cpp -g -O0 -o error_test./error_test 9*/#include #include #include #include int main(int argc, char** argv){ if(argc <= 1){ printf("Usage: %s \nFor example:\n
2012-12-29 22:40:14 875
翻译 Linus Torvalds:用户程序被破坏永远是Kernel的问题!
http://www.csdn.net/article/2012-12-25/2813136-linus-says-Mauro-shut-upLinus Torvalds:用户程序被破坏永远是Kernel的问题!发表于2小时前| 499次阅读| 来源CSDN| 4 条评论| 作者王然LinusLinux摘要:一直以“大嘴”著称的Linux之父——
2012-12-25 13:12:42 1767
原创 zmq: transport bridging, the pub-sub forward proxy
/*g++ pub-sub-bridge-publisher.cpp -lzmq -g -O0 -o objs/pub-sub-bridge-publisher*/#include #include #include #include #include #include int main(int argc, char** argv){ void* context = zm
2012-12-23 12:33:57 1614
原创 zmq: reqester-replyer router-dealer pattern.
/**g++ req-rep-router-dealer-requester.cpp -lzmq -g -O0 -o objs/req-rep-router-dealer-requester*/#include #include #include #include #include int main(int argc, char** argv){ void* context
2012-12-23 12:03:32 1720
原创 zmq: request-reply multiple clients to multiple server, brute force way
/**g++ req-res-N2M-brute-force-server.cpp -lzmq -g -O0 -o objs/req-res-N2M-brute-force-server*/#include #include #include #include #include #include int main(int argc, char** argv){ void
2012-12-23 10:53:59 1367
原创 zmq: dynamic discovery problem
/**g++ pub-sub-dynamic-discover-publisher.cpp -lzmq -g -O0 -o objs/pub-sub-dynamic-discover-publisher*/#include #include #include #include #include #include int main(int argc, char** argv){
2012-12-23 10:16:12 1694
原创 四个梦中的解决方案
梦中想到了几个靠谱的方案:1. Edge直播推流:直接使用代理方式即可,不需要做缓存。2. Edge点播方案:没有cache时使用代理方式,并发起一个cache请求,由cache进程完成后改为本地点播方式。3. 服务器不能同时使用两套架构,ST和ZeroMQ不能同时用,他们的方案不一样。换言之,只能用ST。4. 客户端应提供js方式的as接口,譬如js实现的NetConnectio
2012-12-23 08:49:42 1170
原创 zmq: basic patterns Request-Reply, Publisher-Subscriber, Denvilator-worker-sink.
#include#include /*g++ req-rep-server.cpp -lzmq -g -O0 -o objs/req-rep-server*/int main(int argc, char** argv){ void* context = zmq_ctx_new(); void* responder = zmq_socket(context, ZMQ_
2012-12-22 13:50:23 1258
转载 程序员如何做出“不难看”的设计
今天学了下色彩,这篇文章说的很对,特别是色彩使用,用HSB代替RGB。对比下面两个图:哪个看着舒服?前面的图是RGB选的颜色,后面的是用HSB调出来的。摘要:程序员在写代码的时候往往只注重功能的实现和性能的提升,忽视了外观和易用性,其实很多时候只要注意一些基本的规则,就可以大幅度提高产品的观感。经常看到程序员展示自己做的东西,有一些是创业项目
2012-12-12 18:09:31 1013
原创 linux加载指定目录的so文件
例如,有个so在/tmp/libs/libzmq.so.3:[winlin@dev6 libs]$ ls /tmp/libs/ -lhtotal 2.5Mlrwxrwxrwx 1 winlin winlin 15 Dec 12 12:58 libzmq.so -> libzmq.so.3.0.0lrwxrwxrwx 1 winlin winlin 15 Dec 12 12:58
2012-12-12 13:12:05 8183
转载 Multithreaded Magic with ØMQ
http://zeromq.wdfiles.com/local--files/whitepapers%3Amultithreading-magic/imatix-multithreaded-magic.pdfMultithreadedMagic with ØMQFast multicore applications inany language with no painA
2012-12-09 13:38:03 4949
转载 Solving 11 Likely Problems In Your Multithreaded Code
http://msdn.microsoft.com/en-us/magazine/cc817398.aspxConcurrency HazardsSolving 11 Likely Problems In Your Multithreaded CodeJoe DuffyConcurrency is everywhere. Se
2012-12-09 13:22:36 3541
翻译 Internet Application (IA) architecture:网络服务器架构
以下节选自:http://state-threads.sourceforge.net/ ,描述了常见网络架构,翻译在后面。2. Existing Architectures There are a few different architectures that are commonly used by IAs. These include the Multi-Process, Mu
2012-11-30 10:09:00 214
翻译 网络服务器模型(Internet Application Architectures)
异步非阻塞socket,在读写client时可能会EAGAIN,读不全或者写不完,这时候就需要保存状态,下次能读或能写时候继续从这个状态开始工作。但较为复杂的逻辑会导致状态很多,基本上每个包成为一个状态,譬如RTMP握手部分:1. Client send C0C12. Server send S0S1S23. Client send C2若用状态模型,必须用两个状态:C0C1和
2012-11-28 16:28:55 238
原创 64位整型和32位整型,表示微妙级别的时间
若使用64位整型和32位整型,能表示微妙级别的时间多长呢?#define __STDC_FORMAT_MACROS#include #include #include #include #include using namespace std;int main(int argc, char** argv){ if(true){ u_int64_t
2012-11-18 10:49:37 4411
原创 Mp4格式分析:Adobe的sample1_1500kbps.f4v文件格式之三:mp4 to rtmp packets
上篇文章讲了解析mp4的帧序列,这篇文章讲读取帧的时间戳和类型,以及打包成rtmp packet。RTMP/FLV结构mp4的mdat的video/audio数据,需要加上5个字节的头,打上时间戳后才能以rtmp包发送出去,rtmp包和flv的格式是一样的。所以flv的包可以直接读取tag的data后发送,而mp4的数据需要在前面加5个字节的头后才能作为data发送出去。下图是fl
2012-11-18 09:01:03 3556
原创 Mp4格式分析:Adobe的sample1_1500kbps.f4v文件格式之二:moov分析
MOOV的stbl(SampleTable)包含了关于Sample(Audio/Video)如何组织的。每个audio/video track box都有个stbl,描述了chunk和sample的对应关系。stbl的结构stbl的结构如下:Mp4把mdat(存放媒体数据的box)分为Chunk,每个Chunk包含Sample,Sample即为视频的帧或音频数据。m
2012-11-16 18:50:34 3463
原创 Mp4格式分析:Adobe的sample1_1500kbps.f4v文件格式之一,文件结构
F4v是MP4的子集,由adobe定义。网上资料大多关于mp4的box,对于整体结构,特别是chunk-sample(video/audio)的关系说得很模糊。分几篇文章来说明mp4文件结构。第一篇关于mp4的整体结构,mp4的box结构请参考其他文章。mp4典型的结构如下图,由三个box组成:Adobe的sample文件,sample1_1500kbps.f4v的结构
2012-11-16 17:55:11 3968
原创 自我介绍
自我介绍:2007年毕业于中南大学信息学院。2006年出版《ASP.net程序员成长攻略》。立志成为CTO,大型复杂系统软件方向。2010年设计和实现基于插件的浪弯流媒体flash播放器。2011年基于ffmpeg的python-gearman转码集群。2012年负责组建蓝汛高负载高性能服务器团队。2013.1公司年会评为蓝汛2012年度优秀员工最佳新人奖。2013
2012-11-15 15:05:07 2127 3
转载 开源日志:关于GO语言的资料汇总
Rob Pike谈Google Go:并发,Type System,内存管理和GC概要 Rob Pike谈Google Go,内容涉及:无类OOP编程、Go的接口、采用Goroutines和Channels的并发特性,以及Go中帮助缩短GC间歇的一些特性。 个人简介 Rob Pike是Google的首席工程师。最近,他参与开发了Go语言。在此之前,Rob在贝尔实
2012-11-08 09:13:04 3143
翻译 开源日志:Linus Torvalds’s Lessons on Software Development Management
网上找到了linus的访谈,但是翻译过来的明显是机器翻译,所以我尽力而为的翻译。Linus Torvalds’s Lessons on Software Development Management If anyone knows the joys and sorrows of managing software development projects, it would be
2012-11-06 17:50:08 1529
原创 开源日志:关于IDE/源代码编辑
做c/c++开发,windows下的IDE是Microsoft visual studio;linux下也有很多,编译和调试环境主要是gcc/g++/gdb,基于它的IDE有很多。我其实是在windows下写源代码,linux开启samba共享,直接用beyond compare同步到共享目录,然后用make/gdb调试。Source Insightsource insight用得好的
2012-11-03 10:15:25 2161
原创 开源软件日志
于老师是个了不起的CTO,他给了我很多建议,有一条进入了我的心中:”现在这个阶段,代码写得够多了,就要尽量少写代码,多看多想“。我也不知道看什么,看看开源软件吧,现在开源的世界很大,看看有哪些优秀的开源软件吧,对比一下,写个日志。每周末找时间看看。
2012-11-03 09:45:30 1259
原创 linux c获取本机网卡ip地址
获取本机网卡绑定的IPv4地址。int GetLoalIP(vector& local_addr){ int ret = ErrorCode::Success; local_addr.clear(); ifaddrs* ifap; if(getifaddrs(&ifap) == -1){ return ErrorCode::Syste
2012-10-10 19:14:56 1862
原创 linux社区让程序员幸福
linux程序员是幸福的,特别是现代linux程序员。是的,是有很多不幸的程序员,称为”苦逼程序员”。可这不是程序员这个职业的错,每个职业都有苦逼的人。从工作性质上来讲,程序员这个职业提供了更多幸福的可能。职业的幸福感来源于是否人是否觉得这个职业幸福,较少的挫败感、无奈、失落。我觉得做linux程序员最大的益处,是这个社区有生命力,不断的完善和提供了机会和可能来减少苦力,从语言和开
2012-09-13 11:44:46 1198
原创 IPhone4S自定义铃声
IPhone不越狱无法使用黑名单功能,但可以制作一个无声的铃声,把黑名单电话设置为静音的铃声,就不用管它的打扰了。但是试了一下,好麻烦,大多是铃声制作好了,但是无法同步铃声,搞了很久终于搞出来了!详细记录IPhone4S如何自定义铃声。第一步:iTunes安装在PC上安装iTunes。用USB连接IPhone4S到电脑。在PC上运行iTunes。第二步:授权
2012-09-13 01:49:36 2659
原创 [MEMO] bash常用命令实例
操作某个目录下的子目录:统计某个目录所有子目录有多少行代码:(cd src; files=`ls`; for file in $files; do echo "stat dir$file"; find $file -name "*.*pp"|xargs wc -l|grep"total"; done) 取文件名/扩展名/路径之类:取路径的文件名:path="/h
2012-09-06 17:02:22 1547
原创 给程序猿和程序媛
邮箱:chengli.yang at chinacache.com (防止垃圾邮件,把at替换成@)网址:www.chinacache.com
2012-09-02 22:36:36 281
原创 研发招聘通告
邮箱:chengli.yang at chinacache.com (防止垃圾邮件,把at替换成@)网址:www.chinacache.com
2012-09-02 11:31:58 278
原创 epoll_wait的timeout的误差
epoll_wait(timeout)会有一定的误差,一般是1/1000。CentOS release 5.5 (Final)Linux CCN-YZ-1-3n1 2.6.37-1 #2 SMP Fri Feb 25 14:50:02 CST 2011 x86_64 x86_64 x86_64 GNU/Linux/**build:g++ epoll-wait-devia
2012-08-23 11:41:22 4729
原创 强大的grep
从海量日志找到自己要的数据,grep工作得很好。1. 假设只关注warn和fatal日志,实际上程序还会打印出trace日志,可以用grep过滤:server 1990 false 21010 | egrep "(\[warn\])|(\[fatal\])" > error.log 2>&1 &2. 假设现在有3000个client连接,需要找出delay比较严重的client
2012-08-22 16:25:08 1052
原创 一个refine/refactor的例子
我觉得refine比refactor的幅度大,refactor主要是等价替换,而refine有时候直接寻找更好的方案。Server在管理Client的BufferTime,即决定什么时候应该发包的这部分逻辑,最初是这么写的:u_int32_t Connection::PerformIO(){ u_int32_t ret = PErrorCode::Success;
2012-08-21 13:05:07 1788
原创 关于软件测试的看法
我是少数自发去做过一段时间测试的研发,所以经常有朋友问我一些问题:如何做自动化测试?如何提高测试的精准度?如何提高测试的速度?告诉我如何测试?某某公司是如何做测试的?而且很神奇的是,这些问题往往不会在最初的产品研发阶段提出来,而是当产品发布,客户反馈出bug时,才会问这些”重要“的问题。为什么在后期才会关注这些问题?因为测试喜欢被当作替罪羊:如果研发尽力了,产品设计尽力了,
2012-08-13 18:25:28 1228 1
原创 使用原型——不要做躺在炸弹上的勇士
我们只能对我们熟知的东西编程,熟知必须要知道和了解。而知识是无限扩展的未知体,了解更多也意味着更多的未知。所以需要软件工程,需要design和arch,需要高级程序员和架构师,需要项目经理,需要软件团队,需要软件方法。当然,最需要的其实是限定问题的范围。譬如需求分析和产品计划,就是将问题简化,不必要的功能千万不要做,不做超前的计划,因为那是未知的知识的边缘。简单,一定要简单,只有简单的东西
2012-08-10 14:05:53 2506
原创 总结c++内存错误的典型情况
最近遇到了c++几张内存错误的几种典型情况:1. 拷贝构造函数导致重复释放:http://blog.csdn.net/winlinvip/article/details/76638622. 内存越界导致错误:这个在http://blog.csdn.net/winlinvip/article/details/7822762 提到过。3. 非虚析构函数导致内存泄漏:http://blog.
2012-08-09 10:48:27 1439
原创 任何时候都应初始化变量
指针不初始化,直接释放会导致内存错误,这个都很明白,变量的初始化,就没有那么的挑剔了,有时候初始化,有时候不。原因是指针若不初始化,基本上就玩完,变量很大程度上不会出问题。不过它隐藏的危险比指针更可怕:会导致程序莫名其妙的怪异行为。考虑如下代码:bool all_sent_out;if(!mfarm->SendMessage(&all_sent_out)){ exit(-
2012-08-08 14:40:24 1291
原创 异步Socket(非阻塞模式)的应用
异步Socket(非阻塞模式)的应用若Socket是同步模式(即阻塞模式):1. send(1024)需要等1024个字节发完了才会返回(或者socket被关闭了)。这使得server在和低速的client通信时被阻塞,所以高性能server要使用非阻塞方式。2. recv(1024)不会等1024个字节,但必须要有数据才行,否则会被阻塞。所以阻塞的recv通常需要判断是否有数
2012-08-08 13:05:41 2933
原创 socket效率到底如何
两台服务器用千兆交换机连接,带宽为1000Mbps,socket的效率到底如何?若server尽量快向client写数据,client收到数据后就丢弃,是否能占满千兆带宽?测试发现和每次发送的包大小有关系,TCP包为1000bits(125字节)以上就能占满带宽:因此,若client足够多而且都在请求数据,但是带宽上不去,就是服务器程序的问题了。协议本身会降低带宽,使用rtmp
2012-08-07 18:21:38 7192
Pattern.Oriented.Software.Architecture.Volume.2
2012-11-29
mp4 file format引用文档
2012-11-04
The.Cpp.Programming.Language.Special.Edition
2012-10-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人