日历

  • 2010 九月
    « 八    
     12345
    6789101112
    13141516171819
    20212223242526
    27282930  

联系我

订阅日志

  • 通过Google Reader订阅
  • 通过抓虾订阅
  • 通过bloglines订阅
  • 通过狗狗订阅
  • 通过和讯博揽订阅
  • 添加到Live.com
  • 添加到My Yahoo!
  • 通过Rojo订阅

分类

存档

常用标签

最新日志

热门日志

随机日志

最新评论

  • jade: 恩,这个功能不...
  • charles: :em03: 什么时候上本本的截图...
  • zavakid: 唉,最近也碰到类似烦恼问题,技术...
  • charles: :em53: LZ息...
  • cy: :em20: 顶一下...
  • 梧桐岛: 都是被逼的啊 电视广告 多了去了 但...
  • 月经: 人为财死...
  • 减肥: 不太喜欢wp这种模式 函数太多 感觉...
  • 月经: 不会吧 我的评论 没有了...
  • Cherami: 呵呵,C...

RSS

八月31

买错Office了

昨天把MAC带到公司,搞定了VPN和在公司无线上网的问题,以后就可以把MAC带到公司用了。

在安装VPN的指导页面上,提示了有Office的家用计划,买Office只要10$,进去后选择了中文,价格变成70¥,还不坏,一时冲动就买了一个,到了最后下载的时候发现竟然是个EXE,想想微软可能想让你先到windows下解压再用,也没有什么大不了的,结果悲剧了:我买错了,买成了windows版的2010,其实我是要买2008 For MAC啊。

今天打了电话,希望可以换,客服说这个家用计划不能退,只能打电话到美国总部要求处理,要等3到5个工作日,只能等了。

八月21

MAC下安装了XP

这个完全是应老婆的要求,因为她又要考计算机了,单位的电脑太差,想把我的MAC带去用,没有办法,只能帮她弄。

Bootcamp默认划分的分区是FAT32的,安装XP SP3,复制文件重启后出现disk error,后来又试了下,安装的时候选择NTFS就好了。

安装完以后发现很多硬件无法使用,搜索了一圈,发现MAC的安装光盘不光是为MAC的,也是为windows的,光盘放进去就自动开始安装驱动了,不得不对苹果的风格赞一下。更好的是在windows下还能够访问MAC的分区!再加一分

可惜的是把XP的补丁都打上后,不能访问MAC分区了,其实开始的时候我还担心windows下能够访问mac分区,我老婆会把我的MAC分区的东西搞坏,这样也好,彻底隐藏MAC的分区。

MAC下使用XP超赞,屏幕非常漂亮。对Windows7的风格很不适应,老婆也不喜欢,所以还是装XP,另外,是正版的,哈哈。

八月12

项目又变了

今天下午接到的消息,项目要推迟了,原因是部门的产品的revenue远低于预期,sales说产品质量太差,很难卖,作为开发人员,我们确实也感觉到产品的质量并不是很好,性能存在较大问题,所以开发部门也没有很大的底气反驳这个说法,在我们之前,他们原来都没有做什么像样的性能测试,后来的性能测试的压力也远远小于实际客户的压力,而我们要做的产品,压力是目前最大客户的2倍以上,我们在做我们自己的性能测试的时候已经发现了很多性能问题。

调整的结果是我们的产品推迟(毕竟在沙地上盖房子不会有什么好结果),但是我们去做什么还不太确定,大原则是帮助他们提高他们的产品质量(他们现在深陷火坑,一堆的bug等待他们去解决,没有额外的资源去做产品的提升,而且可能面临裁员),但是怎么合作是个大问题,具体做那些东西也很难讲,真正核心的东西肯定不会给我们做,老板估计也不敢给我们做,但是做其它不痛不痒的东西我们也没有什么成就感,纯粹的变成帮忙扑火了,如果他们自己不能把大问题解决好,我们最后也不会有什么好结果,唉。

八月12

intersect的性能问题

我们有张表是存储用户自定义的类似tag的信息的,有一个功能是按照tag进行搜索,而且支持搜索多个tag查找同时使用这些tag的对象,最开始的实现就是使用的intersect,我感觉可能有问题,然后正好没有太多的事情,就试了下性能,发现那个SQL可以进行改造,变成group by 加 having的模式,一个查询搞定,弄了大概4万条数据,两个SQL(同时查4个Tag)的对比结果显示,前面的SQL会扫描整个表4次(和查询的tag的次数直接相关),并且有一次写入操作,而后面的只有一次扫描没有写入操作,时间上后面的SQL的性能是前者的两倍以上。所以对于同质的SQL的intersect可以转换为这样的group by加having的模式。

原来的SQL:

select ObjectID from ConfigObjectMetaData where KeyNameHash = -3023837279545376792 and ValueStrHash = -6420380264491338705 and ObjectType = 10

intersect select ObjectID from ConfigObjectMetaData where KeyNameHash = 6769857814803370866 and ValueInt32 = 2 and ObjectType = 10

intersect select ObjectID from ConfigObjectMetaData where KeyNameHash = 3984357063977881949 and ValueInt32 = 3 and ObjectType = 10

intersect select ObjectID from ConfigObjectMetaData where KeyNameHash = -3087541436254450506 and ValueStrHash = -3706752959682952160 and ObjectType = 10

修改后的:
select ObjectID from ConfigObjectMetaData where ObjectType = 10 and (
(KeyNameHash = -3023837279545376792 and ValueStrHash = -6420380264491338705)
or
(KeyNameHash = 6769857814803370866 and ValueInt32 = 2)
or
(KeyNameHash = 3984357063977881949 and ValueInt32 = 3)
or
(KeyNameHash = -3087541436254450506 and ValueStrHash = -3706752959682952160)
)
group by ObjectID
having count(ObjectID)=4

八月06

IE被soolaa劫持

按照原来的做法用360安全卫士,但是无效,上网搜索了下,无果,怒,根据一些帖子的回复,感觉可能是起了某个服务,查找可疑服务,发现一个叫GameHallSer的服务,停止并禁用,问题解决。

树大招风,在中国,IE一统天下啊。

PS:这个是解决我老婆的电脑的问题,不是我的,她是Windows+IE+百度铁杆用户,没办法。

最后谴责下所有的流氓:操你妈!

八月04

MSDN Key Acquirer

MSDN的帐号快要到期了,所以有必要把所有可以用的KEY都保留下,MSDN提供了导出功能,但是那些KEY还是要一个一个获取,作为程序员,当然不会手工去干这个事情了。试了下用FF访问,可以,当然最简单的办法就是写个GreaseMonkey的脚本了。这个是针对英文版本的,如果是中文,可以修改下脚本,改成triggerTarget(“获取”)就可以了。

不废话,直接上插件吧。

七月19

骗子太多了吧

今天接到一个电话,号码是04007111717,对方自称神州数码,问我是否以前用民生信用卡积分换过东西,我确定是的,对方说现在有个活动,用1980元就可以买一个市场价4000+的nokia的N97,问我是否有兴趣,我说前段时间打过电话啊,怎么又打?对方说那个是假的,都有报道了,那个是不是010打头的电话,我说400电话办一个也就几千块啊,我没有兴趣,对方说不好意思,打扰了。刚才又时间上网查了下,这个形式的骗子好多啊,以后再搞个什么低价卖iphone的,会不会有人上当呢。

下次再接到这样的电话就说要,送来以后拆开,折腾下说不要了,假的。有接到类似电话的建议如法炮制,另外要确定是自己能够收到,不要让老人代收。

另外有个疑问,就是我的这个真实的个人信息这些骗子是怎么拿到的,而且我的那个信息是至少2年前的信息了。

七月14

logmein

这个是一个提供远程桌面连接服务的网站,支持windows和MAC,最开始是美国的产品经理把自己的机器给我们用,使用的是这个。

最近在玩一个网游,但是登录的端口是443,而公司屏蔽了除80和21外的其它端口。

这次家里来了人,他们在家会上网,所以我可以挂机,昨天晚上弄好了,今天到公司来试了下,发现很好用,如果机器有人在用,还可以聊天。

网站:http://www.logmein.com

完全免费,开始提供的是免费的pro试用,试用过了后不交钱就自动切换为free模式。

七月07

不能显示最近评论

把worpress升级到3.0后猛然发现最新评论里面没有内容,google了下也没有什么结果,没有办法只能自己解决,发现我的最近评论是用的主题4U的u_get_recent_comments,对应的代码在functions.php里面,连到数据库上执行了下SQL,发现没有什么问题,改了下,把SQL打印出来,发现里面定义的变量tableposts和tablecomments没有,没有实际去确认是不是wordpress升级后把这两个全局变量干掉了,直接修改了functions.php:

function u_get_recent_comments($no_comments = 5, $before = ‘<li> ‘, $after = ‘</li>’, $show_pass_post = false) {

global $wpdb;
$tableposts = ‘wp_posts’;
$tablecomments = ‘wp_comments’;
$request = “SELECT ID, comment_ID, comment_content, comment_author FROM $tableposts, $tablecomments WHERE $tableposts.ID=$tablecomments.comment_post_ID AND (post_status = ‘publish’ OR post_status = ‘static’)”;

六月30

反射获取集合中指定下标的元素

不废话了,直接上代码吧:

public static object GetElementFromCollection(object obj, int index)
{
Type type = obj.GetType();
if (type.IsArray)
{
return ((Array) obj).GetValue(index);
}
else
{
object[] attributes = type.GetCustomAttributes(typeof(DefaultMemberAttribute), true);
DefaultMemberAttribute attribute = (DefaultMemberAttribute) attributes[0];
String indexerName = attribute.MemberName;
type.GetProperties();
PropertyInfo pi2 = type.GetProperty(indexerName, new Type[] { typeof(int) });
return pi2.GetValue(obj, new Object[] {index});
}
}

六月30

用C#动态调用WebService

其实利用的都是前人的成果:C# – Dynamically Invoke Web Service At Runtime

这个文章的问题是没有提及需要认证的时候怎么办,但是后面很多回帖都问到了,总结下:

在读取WSDL的时候有几种方式,我使用的是:

WebClient client = new WebClient();

if (_needCredential)
{
client.Credentials = _credential;
}
Stream stream = client.OpenRead(WSDL);
XmlTextReader xmlreader = new XmlTextReader(stream);

//XmlTextReader xmlreader = new XmlTextReader(Uri);
ServiceDescriptionImporter descriptionImporter = BuildServiceDescriptionImporter(xmlreader);
Assembly library = CompileAssembly(descriptionImporter);

在真正生成WebService的Instance以后,需要设置Instance的几个Property:

if (_needCredential)
{
PropertyInfo preAuthenticate = GetRealType().GetProperty(“PreAuthenticate”);
preAuthenticate.SetValue(Result, true, null);
PropertyInfo url = GetRealType().GetProperty(“Url”);
url.SetValue(Result, Url, null);
CredentialCache cache = new CredentialCache();
Uri uri = new Uri(Url);
cache.Add(uri, “Basic”, _credential);
PropertyInfo credentials = GetRealType().GetProperty(“Credentials”);
credentials.SetValue(Result, cache, null);
}

六月30

测试框架

最近在做C#版的测试框架,目的其实是让QA不用写代码就可以测试API,QA需要写一些XML,然后交给这个测试框架运行。

设计其实比较直接,把功能测试中的一些概念抽取出来包装下就可以了,XML要人可读可写,然后能够直接转换为对应的类,免去解析的过程最好。

我提取出来的主要概念如下:

  • Library,对应的其实就是DLL,就像java中的jar一样,可以从指定的路径load,也可以从系统的GAC(windows特定的东西)里面load。
  • Instance,其实本来想叫Object,因为是关键字,只能取这个比较紧似的名字,另外,声明的也确实是对象的instance而不是对象定义。
    • List,集合类型,可以当成List或者Array用。
    • WebService,这个是Instance的子类可能有点怪,但是框架的工作机制是生成WebService的Stub的对应的类,所以其实也是Instance,只是有一些额外的属性。
  • Operation,其实就是操作了,有很多子类型:
    • Method,就是方法调用了
    • Verify,主要是为了做结果验证,其实也是Method,只不过掩盖了实现,我用的就是NUit的实现。
    • Task,Operation的集合,本来想加一个Function的,但是感觉Function和Task功能完全一样。Task就相当于功能测试或者单元测试的一个方法。
    • Express,表达式,主要是为了支持简单的字符串连接和数学运算。
    • Field,获取或者设置Instance的field,我掩盖了C#中的Property和Field的区别,只提供Field,两种都可以访问。
    • Loop,其实也是Operation的集合,但是会把集合中的Operation重复执行很多次,用于性能测试或者批量调用,会生成一个索引值供Operation引用生成不同的值。
    • Indexer,访问集合类型中的某个指定下标的元素,主要是因为C#没有像Java一样提供Get(int index)方法,否则这个完全没有,直接用Method 就可以实现了。
    • Finder,主要是简化了从集合类型中查找某个元素,框架没有提供if/else这样的逻辑控制,只能提供这个变向的方式。
    • Wait,主要是提供Sleep以及异步调用支持,是Verify的子类型,可以每隔一段时间Verify一下,看看结果是不是match,然后有超时,超时就认为Veirfy失败。
  • Define,就是组件声明,里面包含的就是上面提到的那些东西。
  • Suite,就是Test Case了,包含Define列表和Task列表,以及Startup/Teardown

基本上已经涵盖测试中需要的大部分内容了。

一些额外的想法,Operation还是有很大扩展余地的,例如可以支持外部调用,例如调用一个命令行或者其它的程序。

六月29

无聊的世博

也许我的观点没有任何权威性,而且时间很短,上午11点半进的园区,下午5点半就出来了,没有敢去排那些所谓的热门馆,因为从听到的情况看,也没有什么值得一看的,超级热门的沙特馆,貌似也就是个15分钟的IMAX?还不如去科技馆看45分钟,才60块。

不过我们还是去看了三个馆的,都是那种可以看到队伍在不停的向前挪动的馆,我记得好像是新西兰、白俄罗斯和斯洛伐克,新西兰馆里面就是几个32寸的液晶电视在不停的放着新西兰人民的美好生活,馆上面是一些本地的植物?白俄罗斯馆貌似什么都没有,里面有个小房间需要再排队看,貌似也就是些工艺品。斯洛伐克馆就是三个小房间,分别是古代、近代和现代人的衣着和陈设,然后人偶没有头,你可以去拍照留念。

其他的馆我们在外面看了下壮观的场面,好像是法国馆还是意大利馆,绿色通道的那个队伍都很长,一溜的轮椅,老人孩子和孕妇,真壮观啊。

抱歉,我一个热门馆都没有去,中国馆那边一片都没有去,就是在世博轴上远远的照了几张相。

吃了一顿中饭,还需要买卡充钱然后退卡退余额,买了一些现场制作的东西,比利时的鲜夫饼,20块,没啥感觉,冰淇淋30块,超级甜,然后是荷兰还是哪里的牛肉和鸭肉卷以及薯条,3个一共45块,感觉也一般。

坐轮渡去浦西的那些企业馆看看,因为听说不用排队,刚下船,看到人也很多,估计也要排队,找个地方坐了会,决定走了,夜景也不看了。

去之前我是很不愿意去的,但是老婆的同事都去了,她很想去,然后有政府发的只能6月用的票,还有她们单位发的一张票,所以去了,把宝宝留在家里了。

六月21

反射创建一个指定类型的List

由于最近在做C#版的测试框架,所以对C#的反射研究得比较多一点,这里是另外一个心得,由于运行时才知道类型,所以如何创建一个指定类型的List?其实很简单:

Type elementType = realType;
Type listType = typeof(List<>);
Type typedListType = listType.MakeGenericType(elementType);

四月13

使用批处理删除一个月以前的文件

这个其实是上一篇文件备份的延续,既然备份了,备份越来越大当然不行,一般保留一个月的备份就足够了,DOS的功能也基本上能够满足这个要求,不废话,直接给脚本了:

rem Backup
y:
cd y:\01_projects\08_saas\TargetProcessDB
set dirname=%date:~10,4%-%date:~4,2%-%date:~7,2%
mkdir %dirname%
cd %dirname%
copy F:\DailyBackup\*.* .
cd ..

rem Remove backup  of one month ago based on dir name
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set monthprefix=%month:~0,1%
if %month%==01 goto _lastYear
if %monthprefix% EQU 0 goto _onebitmonth
goto _twobitsmonth

:_lastYear
set /a year=%year%-1
set deldate=%year%-12-%day%
goto _execute

:_onebitmonth
set /a oldmonth=%month:~1,1%-1
set deldate=%year%-0%oldmonth%-%day%
goto _execute

:_twobitsmonth
set /a oldmonth=%month%-1
if %oldmonth% EQU 9 (
set deldate=%year%-0%oldmonth%-%day%
)
else (
set deldate=%year%-%oldmonth%-%day%
)
goto _execute

:_execute
for /f %%d in (‘dir /b /d’) do if %%d LSS %deldate% rmdir /s /q %%d

应该看得懂吧。最后一行要留意下,定义变量的时候用了两个%号,这个是必须的。另外就是日期问题,不用关注闰年问题,因为是进行的字符串比较,日期(例如2010-02-29)即使不是合法日期也是没有关系的。另外就是日期的格式,因为是上一篇的延续,所以当然针对的是上一篇的日期格式了。

更新:

又搜索 了下,如果根据目录自己的创建时间来操作,有更简单的方法:

forfiles /p . /m * /d -30 /c “cmd /c rmdir /s /q @path”

如果是遍历所有的子目录删除文件,也很简单:

forfiles /p . /m *.* /d -30 /c “cmd /c del @path”