- 博客(53)
- 资源 (19)
- 收藏
- 关注
原创 怎么把春节慰问信写成condolence letter呢?
公司打算给员工家庭寄送春节的贺喜关怀卡, 链接发给所有的员工, 让大家填写个申请。我一看那个链接地址, 发现其中居然有condolence这个单词, 是哪位这么有学问, 把慰问信翻译成condolence letter呢? 我读书不多, 你不要开这种玩笑好不好? 不过, 不只是我发现了这个问题, 还有其他同事也对此进行了吐槽。 其实, 也算是小事一桩, 只当复习了一个六级单词吧,
2015-01-31 20:55:13 8020 1
原创 亲历印度人把t读成d
昨天, 在公司园区里面等班车, 一老外过来问我:Will the shuttle bus go to "ei den"? 我愣了一会儿后说:It will first go to B2, and then to A. 她满意地点头致谢 不过我第一次确实没有听懂“ei den”, 后来琢磨了一会儿, 突然发现, 原来A10用地道的印度英语表达就是“ei den”啊, 还好, 我没有指
2015-01-31 20:15:24 8759
原创 Windows和Linux上分别怎样实现等待某个线程结束?---用WaitForSingleObject和pthread_join
Windows和Linux上分别怎样实现等待某个线程结束呢, 我们先看Windows的情形, 直接上代码:#include #include DWORD WINAPI Fun1Proc(LPVOID lpParameter){ int i; for(i = 0; i < 100; i++) { cout << "son thread" << i + 1 << endl;
2015-01-29 23:26:27 12197 6
原创 gcc编译出现undefined reference to ‘pthread_create‘的解决方法
下面, 我们先看一个linux多线程程序:#include #include void* threadFunc(void* p){ while (1) { printf("a"); } return NULL;} int main (){ pthread_t id; pthread_create (&id, NULL, threadFunc, NULL);
2015-01-29 22:59:11 47842
原创 父线程退出后, 子线程会退出么?(我在Windows和Linux上都验证过)
我们来看一个常见的基本问题:父线程退出后, 子线程会退出么? 我不喜欢人云亦云, 一贯主张大胆假设, 小心求证,貌似有点实证主义色彩了, 不多说, 直接看程序:#include #include DWORD WINAPI ThreadFun(LPVOID pM){ while(1) { printf("子线程的线程ID号为:%d\n", GetCurrentT
2015-01-29 22:27:24 18037 11
原创 一个低概率bug的定位过程---多线程操作文件时一定要注意
某测试MM反馈了一个与文件有关的低概率问题, 我和我带的那个同事(以下简称我们)都没有重现到这个问题。 但是, 某人(我不认识, 也没有见过面)在电话会议中说这个问题多么多么严重, 还把我们骂了一顿, 语言相当龌蹉, 而且非常生硬, 装得很像个啥领导似的。 虽然涛哥我为人随和善良, 工作积极尽责, 但遇到这种满嘴脏话的人, 涛哥也不是好惹的, 结果, 你懂的。 然后对方直接问: 你谁啊?
2015-01-29 00:07:11 9416 1
转载 STL容器比较
由于找不到最原始的地方, 所以只能给这里:http://blog.csdn.net/dodolzg/article/details/6127949STL的容器可以分为以下几个大类: 一:序列容器, 有vector, list, deque, string.二 : 关联容器, 有set, multiset, map, mulmap, hash_set, hash_ma
2015-01-27 23:58:04 7635
原创 今天看到了'\xff'这样的字符,记录一下
废话就不说了, 直接上代码:// VC++6.0#include int main(){ int i = '\xff'; printf("%d\n", i); // -1 char c1 = '\xff'; printf("%d\n", c1); // -1 unsigned char c2 = '\xff'; printf("%d\n", c2); // 255
2015-01-26 23:10:41 15292 1
原创 复习一下DNS---顺便玩玩nslookup www.baidu.com命令
与其说复习, 还不如说学习。 大学学的那点计算机网络知识, 早就还给老师了。 不过还得感谢该老师, 没有让我挂科,在此感谢一下。当然,把计算机网络教成一门靠背诵过关的课, 我也是醉了。 先来简要谈一下几个基本的概念。 域名: 不说复杂的, 说简单点, 你可以把它理解为一个串。 DNS服务器: 说白了, 就是一台电脑。 IP: IP就是
2015-01-26 23:02:57 12288 4
原创 小议TCP带外数据(OOB--out of band)
首先要说明的是: udp没有带外数据, 而tcp有。 下面, 我们来聊聊tcp带外数据。 当客户端和服务端建立了tcp连接之后, 我们可以说, 建立了一个tcp通道, 于是乎, 数据可以在这个通道上奔波。 这个tcp通道又可以叫做tcp通带, 总之就是一条道路。 带是什么? 如果你还不明白, 那你就把你的裤带解开, 然后把裤带拉直, 看到了吧, 带就是一条路, 一个通道。
2015-01-23 00:21:32 10075 2
原创 在Windows上, 为什么不要将select函数作为定时器?---因为经常返回WSAEINVAL
我们知道, 在linux上, sleep函数的单位是s, 那怎么进行微妙级别的定时呢? 用select函数即可。 但是, 在Windows上, 强烈不建议将select函数用作定时器(该语句出自大名鼎鼎的Windows Socket这本书), 下面我们来实战一下: 看程序:#include #include #pragma comment(lib, "ws2_32.lib"
2015-01-22 22:41:32 11163
原创 ping不通某ip, 但向它发arp请求居然有响应?--- 谈谈一个奇葩非问题的定位过程
先来抽象介绍一下这个bug单. 现象: 测试同事发现, 在局域网内, pc(w.x.y.10)和某设备S(w.x.y.z.20)都 ping不通某ip(w.x.z.30), 但设备S(w.x.y.z.20)在检测ip(w.x.y.30)的时候, 居然是通过的。 我来翻译一下: pc(w.x.y.10)和某设备S(w.x.y.z.20)都 ping不通某ip(w.x.
2015-01-22 22:24:20 21645 1
原创 玩转重要的select函数并分析其行为
说明: 尽管select函数在Windows和Linux上的用法有些差异, 且这些差异值得我们特别注意, 但从功能上来讲, 他们还是差不多的。 本文, 我们仅仅考虑Windows上的select函数。 关于select函数的原型和用途, 百度和谷歌的介绍到处都是, 在本文中, 我就不赘述了, 我们仅仅来玩代码并作简要分析。 如果有不对或者偏颇的地方, 大家可以各抒己见, 共
2015-01-21 21:56:23 9496 13
原创 fwrite和fread函数针对的是字符(无边界), 而不是字符串(以'\0'作为边界)
在前面, 我们讨论过:TCP中send和recv函数针对的是字符(无边界), 而不是字符串(以'\0'作为边界), 在本文中, 我们来讨论一个类似的话题:fwrite和fread函数针对的也是字符(无边界), 而不是字符串(以'\0'作为边界)。 因此, 我们在用的时候一定要注意, 哪里需要'\0', 哪里不需要‘\0’. 这些都是一些基本的问题。 由于之前
2015-01-18 23:31:22 9987 1
原创 TCP中send和recv函数针对的是字符(无边界), 而不是字符串(以‘\0‘作为边界)
我第一次玩TCP的时候, 接触的都是字符串的传输。 后来,我接触了字符的传输, 才意识到, 原来,TCP中send和recv函数针对的是字符(无边界), 而不是字符串(以'\0'作为边界)。 先看服务端程序:#include #include // winsock接口#pragma comment(lib, "ws2_32.lib") // winsock实现
2015-01-18 23:17:48 12726 4
原创 char str1[11] = "12345\06789"; 引发的深刻教训---原来'\067'与'7'是相等的
一直以来, 我总是以为char str1[11] = "12345\06789";和char str2[11] = {'1', '2', '3', '4', '5', '\0', '6', '7', '8', '9', '\0'};是完全等价的。直到今天调试一个程序, 我才发现, 他们原来是不等价的, 我被这个问题蒙在鼓里, 看来有必要深入看看。 我一直苦苦思索原来程序产生的异常,
2015-01-18 22:35:44 8229 1
原创 recv函数究竟是在剪切(偷取)还是复制(偷窥)? 由0和MSG_PEEK决定!
我们先来看MSG_PEEK的值#include #include int main(){ printf("%d\n", MSG_PEEK); // 2 return 0;} 下面, 我们来看服务端程序:#include #include // winsock接口#pragma comment(lib, "ws2_32.lib") // winso
2015-01-18 20:25:49 9753 5
原创 打油诗一首: 《版本失火, 波及涛哥》
版本失火, 波及涛哥。 夜色已深, 电话慰问。 模块不详, 赶快起床。 奔赴公司, 零点过四。 灯火通明, 个个精神。 凌晨扑火, 彼此忘我。 这火谁纵, 让人心痛。 DT德电, 闪闪闪闪。
2015-01-16 17:54:45 8146
原创 多找方法, 少找借口, 总有人可以找到问题的解决办法, 为什么不能是你我呢?---不能抓日志场景下如何抓到日志?
今天遇到一个问题, 需要去定位分析, 但是, 在该场景下却无法抓日志, 那就没办法分析了, 下面我来描述一下场景。 场景: 某S系统在环境A下出现某重要功能异常, 糟糕的是,此时不能开启抓日志, 不能抓日志就没法分析异常的原因啊。 两个开发的领导在那里猜测问题的根源, 但没啥结果。 他们找到我的主管, 一起琢磨。 我的主管开始也没有想到用什么办法抓日志, 随
2015-01-15 23:29:11 8853 5
原创 闲谈软件测试和软件调试的区别---如果要喷, 请手下留情
本文聊聊软件测试和软件调试的区别, 可能会流于肤浅。如果要喷, 请手下留情 一. 测试和调试的主体不同。 一般来说, 测试是由测试人员来完成, 你很少看到有测试人员去调试代码的; 而调试主要是由开发人员来完成的, 当然, 如果要写出高质量的代码, 开发人员必须进行自测试。 二. 测试和调试的目的不同。 测试是为了发现软件中的
2015-01-14 00:07:45 8391
原创 用BCB做一个自己的Color Dector --- 实时显示鼠标所在位置的像素值
两年前, 我做过一段时间的iOS开发, 我记得自己用过这样一个工具: 该工具可以实时显示鼠标所在位置的像素值。 下面, 我自己用BCB来做一个这样的工具, 代码如下(定时时间间隔为10ms)://---------------------------------------------------------------------------#include #pragma hdrst
2015-01-13 23:06:41 8780 1
原创 BCB中如何实时显示鼠标的坐标?---利用定时器
当鼠标在窗体上滑动时, 可以触发窗体的FormMouseMove方法, 代码如下://---------------------------------------------------------------------------#include #pragma hdrstop#include "Unit1.h"//------------------------------
2015-01-13 22:54:45 8674 1
原创 ++i比i++好?---没有意义! i++比i = i + 1好?---仅有一点意义!
经常听到有人谈论, 为什么++i的效率比i++高, 还讨论得饶有兴趣, 在这里, 我要说, 我一点兴趣也没有。 它能提高多少开发效率呢? 不能, 所以, 以后再也不关注这类无聊的问题了。 那i++比i = i + 1好吗? 如果你要跟我说什么逆波兰的效率高, 我也不敢兴趣。 但是, 如果你跟我说,对于程序员来说, i++比i = i + 1的书写更方便简洁,更有开发效率, 那我肯
2015-01-12 21:42:14 8669
原创 宁愿犯编译期错误, 也不犯运行期错误 ---再谈 char *p = “abc“; 的不合理性 以及 写成 if(NULL == p)而不是if(p == NULL)的理由
年末, 各方催进度, 大家也在抓紧时间码代码, 各种低概率死机问题频出, 这些低概率的死机问题非常难以重现和定位, 即便是修改好了, 也需要验证, 如果没有出现死机, 那也不能完全保证修改好了。 总之, 低概率问题就是这么折腾人。 那低概率死机问题是怎么产生的呢? 其实, 很多时候都是程序猿编码不细心, 对一些问题理解不透彻造成的。 比如最常见的内存错误问题。
2015-01-11 22:05:27 8266 1
原创 玩转Windows/Linux tftp命令
tftp很好理解, 主要用来传文件, 下面以我的操作来谈谈tftp中最重要的几个命令。 一. Windows上的sftp命令(据说Linux上也是这样, 当然此处是指非嵌入式的Linux) 步骤: a. 在Windows上开启sftp服务器tftpd32.exe, 然后选定一个默认的目录作为服务器根目录,此时, tftpd32.exe自动读取pc
2015-01-11 00:27:28 30213 2
原创 与端口冲突有关的一个低概率bug的定位过程(这次不是360的错啊)---浅谈bind()函数返回失败
测试同事提单反馈: 工具A的x功能会低概率失效, 但没有发现什么规律。事实上, 我也确实遇到过这个低概率问题, 但是没有深入去分析过它(实际上也不是什么概率不概率, 只要发生了, 就会一直发生, 直到某种条件出现改变)。 前段时间用360抢票, 要回家啊, 抢着抢着, 突然发现, A工具的x功能没法用了, 这次总算是重现到了这个低概率问题。 当时, 我的第一直觉是, 这可能是受了360的影响, 哈哈, 360经常被黑嘛。
2015-01-10 22:16:36 8376 1
原创 再谈全局数组的外引用
test.cpp文件内容如下:char g_szTest[100] = "original"; 现在, 我要在main.cpp中引用这个数组怎么办呢? 肯定不能把char g_szTest[100] = "original";放到test.h文件中, 然后用main.cpp来包含test.h啊, 这样容易形成编译碰撞, 也是应该禁止的。 那怎么办? 其实, 我们可以
2015-01-10 12:43:34 8052 2
原创 搞不清楚NULL, "", '\0', '0', 0, "0"的程序猿(C系列)应该好好练习基本功
我们首先来说NULL, 在VC++6.0中, NULL是这么定义的:#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif#endif 也就是说, 在C中, NULL是一个指针, 而在C++中,NULL就是0, 但是该0可以与指针进行比较。 可以这么
2015-01-10 12:27:48 7333
原创 静态检查工具检查出 NULL == szTest 问题---估计该程序员是被空指针吓怕了
下面, 我们先来看一个程序:#include using namespace std;int main(){ char szTest[100] = {0}; // 一系列操作 ..., ... if(NULL == szTest) { // ... return 1; } if(0 == strcmp("", szTest)) { // ...
2015-01-10 00:08:04 7909
原创 如何简要判断自己对.cpp文件的修改是否生效? 如何简要判断程序所进入的预编译分支?
有这样的场景: 我们辛辛苦苦地在大型工程某文件中增加了不少代码, 然后经过长时间的编译, 生成版本, 然后长时间地进行刷机升级,刷到机子中(比如手机), 但是, 最终发现自己改的代码并没有生效, 于是就蒙了, 不知道哪个环节出了问题。 这个时候, 怀疑自己的工程代码有问题, 有怀疑编译出了问题, 又怀疑打版本问题, 又怀疑刷机问题, 最后不知道是什么问题。 自己又不甘心, 又试一遍
2015-01-09 23:54:24 8037
原创 写char szTest[1024 * 256] = {0};这种代码的人, 是该反省一下了
某次, 看到了这样的一个代码片段, 顿时想找到代码的作者, 找他议论议论, 最后没有找到啊。 直接给其“精髓”之处:#include using namespace std;int main(){ char szTest[1024 * 256] = {0}; // 谁写的, 要挨批评啊 return 0;} 栈要省着用, 别那么任性好不好。 怎么会需要这么大
2015-01-09 23:25:45 8542 5
原创 不对文件指针进行非空判断是很危险的(今天就碰到了)
假设在C:\Documents and Settings\Administrator\桌面\myTest目录下不存在test.txt文件, 那么下面程序便有问题:#include using namespace std;int main(){ FILE *pFile = fopen ("C:\\Documents and Settings\\Administrator\\桌面\\my
2015-01-09 22:58:12 9130 2
原创 如何利用openssl来计算一个文件的MD5值?
openssl环境的配置, 我就不再说了, 可以参考之前的的博文。 前面, 我们计算过字符串的md5值, 在本文中, 我们来讨论一个文件的md5值, 废话少说, 直接给大家代码, 上点干货:#include #include // 如果你直接拷贝我的程序运行, 那注定找不到md5.h#pragma comment(lib, "libeay32.lib")#pragma comment(
2015-01-09 22:24:18 14478 2
原创 我来玩转一下arp -a (pc ping 手机)
我进行了如下图的操作: 我们可以看到, 第一次在pc的cmd中操作arp -a的时候, arp缓存表中并没有手机的相关信息。 此时, 我们让pc来ping一下手机ip, 通过抓包可以看出pc在局域网内广播了arp包, 意思在说: 谁的ip是192.168.1.100, 请告诉我你的mac, 手机受到这个包后, 发现pc喊的正是自己的ip, 于是把自己的mac地址返回,
2015-01-09 00:13:22 15655 6
原创 与内存对齐有关的sizeof
内存对齐, 大家应该都听说过, 我们直接来看程序:#include using namespace std;struct { int a; short b;}A;struct { short b; int a;}B;struct { short b; short c; int a;}C;struct { bool b; bool c; int
2015-01-07 23:55:01 7228
原创 如何理解看似复杂的int **p[2][3]; 和int (**p)[3];
我们先看:int a[3]; 实际上,我们完全可以理解为int a0; int a1; int a2; 也就是是, 只要理解了int a; 就会理解int a[3]; 如:#include using namespace std;int main(){ int a[3]; a[0] = 0; a[1] = 1; a[2] = 2; return 0;}
2015-01-07 23:41:14 12406
原创 再看出参---分析GetMemory的错误(笔试常考)
先来上一个到处可见的错误程序实例:#include using namespace std;void GetMemory( char *p ){ p = (char *)malloc(100);}int main(){ char *str = NULL; GetMemory(str); strcpy(str, "hello world" ); return 0;}
2015-01-07 23:25:29 7185
原创 C++中的mutable
先来看一个简单的有错误的程序:#include using namespace std;class A{ int x;public: void fun() const { x = 100; // error }};int main(){ A a; a.fun(); return 0;} 如果const类型的fun函数一定要修改x, 那
2015-01-07 23:15:23 7214 1
原创 小议入参和出参
在实际应用中, 我们经常碰到入参和出参, 下面简要说说我个人的体会:1. 入参的值是被调函数需要, 出参的值是主调函数需要的。2. 最好不要让参数既做出餐, 又做入参, 否则混乱啊。3. 入参最好搞成const类型的, 别人一看就知道是入参, 而且安全性高; 出参不要搞成const类型的。4. 如果字符串做出参数, 传进去的时候一定要携带si
2015-01-07 00:07:13 35809 8
原创 这个MM有点萌---请问“非法输入”是指“不合法则的输入”还是“违反法律的输入”?
某次, 软件中有很多中文需要翻译, 我就发给翻译中心的MM帮忙翻译, 我负责答疑一下。 结果, 某MM问:请问“非法输入”是指“不合法则的输入”还是“违反法律的输入”?哈哈, 这MM问得很有道理啊, 我当时被萌倒了, 为她的认真点个赞
2015-01-05 23:43:53 7941
linux protobuf安装文件
2016-11-04
linux tree命令的源码
2015-11-01
编译好的openssl库和头文件
2014-12-14
入门数据库sqlite3的最佳实践资料
2014-08-12
在Windows下学习Linux命令
2013-08-08
音频处理软件Gold Wave
2013-07-17
H.264visa软件
2013-07-13
YUVviewer :原始的YUV视频的播放器
2013-06-24
经典的C语言编译器:TC2.0
2013-06-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人