MySQL与幻象读

MySQL与幻象读

最近在部署系统的过程中,发现MySQL的一点问题,进行简单总结。

实际上就是关于事务隔离级别以及幻象读的问题。

我们的程序分成两个部分:UI层以及Service处理层。UI层使用MySQL的C库接口创建连接;Service层采用Python的MySQLdb您(底层仍然是MySQL的C接口)创建连接。

因此,实际上会与MySQL创建两个连接。

在windows环境中,如果我们通过UI修改了MySQL的数据,我们发现在service层查询时,还是以前的数据,而不是commit之后的数据。

采用Ubuntu系统下的MySQL时,没有这个问题。UI修改了MySQL数据后,Service能立刻查询到最新的结果。

我们发现,Ubuntu下的MySQL(5.1.49-1ubuntu8.1 (Ubuntu))版本较旧,采用MyISAM引擎。而Windows环境下的MySQL(5.1.53-community MySQL Community Server (GPL))较新,采用InnoDB引擎。将Windows环境下的MySQL强制指定为MyISAM时,问题也能解决,不再出现幻象读。

使用下述命令查询了Ubuntu和Windows的配置,都是REPEATABLE-READ:

SELECT @@tx_isolation;

SELECT @@global.tx_isolation;

判断,InnoDB的事务处理级别REPEATABLE-READ还是会出现幻象读。在程序中强行将session级的处理修改为READ-COMMITTED后,问题也解决,不再出现幻象读。

set session transaction isolation level read committed;

这个似乎与网上的资料有些不一致,据说REPEATABLE-READ不会出现幻象读,而READ-COMMITTED级别才会出现。实际结果是相反的。

另外,就我们的应用来说,select操作多于insert/update操作,而且数据量不大,因此MyISAM比InnoDB更适合我们的应用,可惜高版本的MySQL将缺省引擎给换成InnoDB了。

普拉哈拉德

普拉哈拉德

看到一个与传统不太一样的说法:为了更好地认识未来,我们有必要忘掉过去。这个观点来自普拉哈拉德,一位很伟大的管理大师,影响了N多CEO。

我们传统的观点中,非常强调对过去经验的学习,甚至有说法:忘记过去,就意味着背叛。

而现在的我,确实需要忘掉过去,重新出发。以此文纪念我在U公司的悠长岁月。

Firefox 4很给力啊

Firefox 4很给力啊

听说Firefox升级了,而且是个重大的升级,有点心动。以前很支持Firefox,后来在某个3.x版本的时候体验不好,经常假死、崩溃等等,因此转向了Google chrome。老实说,我对Chrome感觉极好,尤其喜欢它的书签同步等功能,而且速度超快!从那以后,就再没用过Firefox了。

今天在家里的电脑上下载安装Firefox 4,顺利检测到旧版Firefox并进行升级。升级过程很顺利,不过对Google toolbar的支持被中断了,看意思是不兼容。启动起来后,试了几个网站,尤其是javascript很多的一些网站,感觉很不错,速度也是非常快。在Firefox中,居然也发现了同步功能,要是能把Chrome的书签同步过来就好了。

目前还在试用过程中,感觉Firefox 4还是下了很多功夫,很给力!

科学与技术

科学与技术

我在科技园上班,平时都是坐公交车,一般只注意车上电视播报的新闻和搞笑节目。今天下车的时候,注意到车上放的语音提示是:…scientific and technology park….。这让我产生了一些关于“科学与技术”的发散性联想。

平时我们说科学技术时,往往是把它们联系在一起的,没有具体的区分,似乎科学就是技术,技术也是科学,甚至直接简称为科技。前两天看到一个新闻,大意是苹果公司一高管辞职了,理由是以前太专注技术,现在要开始研究科学了。很显然,在这位高人的眼中,科学和技术是不等价的。

那么科学和技术的区别在哪里呢?以我的理解,可以简单地概括为:科学是用来回答“what”,而技术是用来实现“how”。

科学和技术确实不等价,科学的境界要高于技术(不是否认技术的重要)。境界不同,会导致视角的不同,最终的产品和成果也会高下立判。例如,Nokia 站在工程技术的角度制造手机,因此虽然它是多年手机领域的大佬,它仍然集中在回答和实现“how”上,例如如何才能不摔坏手机,如何才能保证信号清晰等工程技术问题。而Apple 呢?显然出发点不一样,它首先回答的是“人和手机的关系是什么”? “移动宽带会带来什么影响”?等等问题,这些问题如果深入研究的话,搞不好要进入社会学研究等完全不搭界的领域。

当然,Apple 也关注技术问题,例如如何制作漂亮的金属外壳等等,但是好无疑问,Apple 的手机绝对不会比Nokia 的手机更抗摔。so what?!

境界决定了最终的成果,决定了最终的方向。作产品也好,作教育也好,我们应该多关注一些科学,给与科学更多的尊重。

 

为windows环境下的mongoose作一点小修改

为windows环境下的mongoose作一点小修改

最近在产品中嵌入mongoose作web服务器,对外提供Ajax接口以及提供一个简单的web管理界面。从我们的开发和使用情况看,mongoose确实是个很不错的产品。将SSL的功能删除后,整个功能模块非常小巧,非常适合作产品的配置管理服务器。

由于我们的产品主要面向windows平台,因此我们需要花点时间对mongoose进行改动。这两天遇到一个非常奇怪的问题,mongoose发出的json流是空的,而我们调试发现送给mongoose的数据是正确的、情绪很稳定的json流。这让人很纠结。

当然这个问题最终解决了。mongoose代码中使用了BUFSIZ的宏定义,这个定义在windows中是标准库中有定义,缺省值是512。当需要发送的数据超出这个限制时,mongoose会丢弃整个包。去修改windows的标准定义显然是不合适的,因此在mongoose.c文件头,重定义后再编译即可。考虑到我们发送的数据量比较大,我们直接将它重定义为4096:

#ifdef BUFSIZ
#undef BUFSIZ
#endif
#define BUFSIZ 4096

为什么我们比日本人还恐慌?

为什么我们比日本人还恐慌?

日本发生了地震和海啸,情况确实比较惨,让人很同情。在同情之余,我同样认为这是老天对他们的报应,虽然残酷,我也不想假惺惺地装高尚。从电视介绍的情况看,日本人的国民素质让人肃然起敬,不得不说这是个强悍的民族。在这样的天灾面前,居然保持极高的镇定:没有人闯红灯、没有人哄抢、没有商店乘机疯长商品价格、大家都在排队买(或者接受)商品,甚至在广场聚会后没有留下一片垃圾!这是发生重大自然灾害后的场景吗? 没有影帝和农民艺术家飚戏,没有催人泪下地感谢XXX,有的只是紧张有序的自我救援和相互关爱。这真是个奇怪的民族!

而今天我彻底汗了!

今天老妈跑遍了各超市、菜场,居然没有买到盐!请注意,是盐!不是什么贵重稀罕的东西。传言日本福岛的辐射有影响,大家疯了似地开始囤盐了!有货的超市也乘机开始涨价,平时卖一块钱一包的盐,现在卖五块了!你还别嫌贵,爱买不买!

这让我十分恍惚,感觉就像被穿越了,到底是哪里发生地震、海啸?!这实在是耻辱!当整个国民素质开始堕落后,我们也会有自己的报应!(电视上在报道“健身猪”的事情,这真是黑色幽默,吃了瘦肉精的猪居然叫“健身猪”)

顺带鄙视一下嬉戏TV,这几天就像打了鸡血,整系列整系列地报道日本的灾情,精神很亢奋,仿佛地震海啸是发生在中国,主持人的表情都很沉痛,就像自己的亲人被灾了。而对同期发生在云南盈江的地震却少有提及,仿佛这事不曾发生过,或者不曾发生在中国。这同样让人感觉很穿越,实在是无语。

治疗心血管堵塞的一个偏方

治疗心血管堵塞的一个偏方

中午中央电视台一个中医药节目,介绍了一个90岁老人治疗心血管堵塞的情况。这位老人曾经中风过,后来据说长期坚持这个偏方,现在仍然很健康,居然还天天去菜场买菜。

这个偏方也比较简单:就是将生黑豆用山西老醋(?陈醋,看上去黑黑的)泡两个月后,每天吃两勺这种黑豆。注意是生黑豆,不要弄熟了再去泡。

看上去似乎就是软化血管。

QT SDK与C4100编译告警

QT SDK与C4100编译告警

“warning C4100: … unreferenced formal parameter.”

QT SDK (VC2008)在使用qmake生成makefile文件时,缺省会打开C4100的编译告警开关。就我们的开发实践来说,C4100实在是个多余的告警,尤其是在C++程序中,我们经常定义一些虚函数等作为接口类,这些虚函数本身基本是空函数,由派生类重载出具体的实现。一旦放开C4100告警,VC编译器就看这些函数中没有引用的形参非常不爽,频频给出告警,实在是烦人。

我们可以在头文件中要求编译器忽略C4100告警:

#pragma warning( push )

#pragma warning( disable : 4100 )

void fun1(…){}

#pragma warning( pop )

这样做也有不好的一面,我们不得不修改.h文件,包括一些第三方库的头文件。另外,这似乎也破坏了跨平台的特性,和VC编译器绑定过紧(?不清楚其他编译器,例如gcc,是否也支持这种预处理指令)。

我们决定直接关掉C4100告警,修改以下文件(qt安装在d:\qt\4.6.2目录):

D:\Qt\4.6.2\mkspecs\win32-msvc2008\qmake.conf

在这个文件中,找到QMAKE_CXXFLAGS_WARN_ON,将它后面的-w34100删除掉。

然后回到自己的工程,重新用qmake生成makefile,此时再编译,就不会有C4100告警了。

中国软件开发人员的杯具

中国软件开发人员的杯具

在cnbeta上看到一篇报道,心里非常感慨。大学生只需要花149元就可以购买到正版的win7专业版和office2010专业版,居然只有不足20%的人愿意购买(可能大家觉得5块钱的盗版碟更便宜啊)。

149元应该算相当便宜了吧?149元在北京、深圳等地,估计还不够周末请客一顿饭钱。

大学生应该算未来的精英吧?如果这样一个精英团体都持这样的观念,那平常的群众也就可想而知了。

谁还愿意为这个市场开发软件?谁还能说这是个很大的市场?

原文链接:

http://www.cnbeta.com/articles/136238.htm

Amazon EC2/Ubuntu系统下搭建VPN环境

Amazon EC2/Ubuntu系统下搭建VPN环境

以下是基于Amazon EC2/Ubuntu搭建PPTPD服务提供VPN连接的过程记录。至于为什么要搞VPN,大家都懂的。。。而我主要是要访问Python的一些网站以及使用我非常喜欢的Google docs。

PPTP采用TCP 1723端口,因此在Amazon EC2的防火墙配置中,必须打开这个端口,否则client端无法接入。(网上有文章说也需要打开47端口(GRE端口),我在Amazon EC2上试验的结论是不需要特别设置。)

step1: 安装pptpd

很简单的命令:sudo apt-get install pptpd

step2: 修改pptpd的配置

有三个文件需要修改:

(1)修改/etc/pptpd.conf,添加以下内容(原文件中可能已经有这些内容,确认即可)

localip 192.168.0.1

remoteip 192.168.0.100-110

localip是指VPN建立后,client可以用这个地址访问VPN server。

remoteip就是指分配给client的地址。

(2)修改/etc/ppp/pptpd-options文件,增加以下内容:

ms-dns 8.8.8.8

ms-dns 8.8.4.4

这个配置是使用Google的DNS解析。至于原因,你也懂的。。。

(3)修改/etc/ppp/chap-secrets文件,设置客户机登录的帐号和密码:

# client server secret IP addresses

yxh * 1234 *

“client”是用户名,“server”是服务器地址,”secret”是登录密码,”IP addresses”是分配的地址,如果指定*,则由系统自动分配。

step3: 重起PPTPD服务:sudo service pptpd restart

step4:配置IP转发

修改/etc/sysctl.conf文件,打开以下的注释:

net.ipv4.ip_forward=1

step5: 重新加载IP转发配置

sudo sysctl -p

step6: 修改Iptables,设置网络地址翻译

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

上述设置在重起后悔丢失,因此需要修改 /etc/rc.local文件, 在exit 0之前添加以下语句:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

step7: 配置DDNS

Amazon EC2每次重起都会变换地址,因此我们需要配置DDNS来获取动态域名解析。在这一步之前,需要在DynDNS上申请一个免费的域名。国内类似的服务商是“花生壳”,我没有进行过测试,不知道“花生壳”是否也适合以下配置。

申请到DynDNS帐号后,下载并安装ddclient:

sudo apt-get install ddclient

安装过程中, 会有简单的界面进行配置, 设置dyndns的相关帐户即可。设置完成后, 配置信息会自动写入/etc/ddclient.conf文件。

完成上述步骤后,就可以在windows客户端拨号建立VPN连接了。

以上资料主要参考一篇国外有人的blog:http://www.dikant.de/2010/10/08/setting-up-a-vpn-server-on-amazon-ec2/

最后说一下Amazon EC2。国内有几篇很不错的翻译可以参考,不过最好的资料还是Amazon本身提供的GettingStarted文档,虽然是英文的,不过非常简单明了:http://docs.amazonwebservices.com/AWSEC2/latest/GettingStartedGuide