A's profileXA's DocumentsPhotosBlogListsMore Tools Help

Blog


    8/14/2008

    【笔记】存储平台介绍——一灯大师~

    磁盘调度:电梯调度算法
    EXT2/3/4文件系统——中庸与通用之道
    Google File System文件系统
    HDFS——Java的开源文件系统(Yahoo!)
    TFS
    有限状态机
    6/27/2008

    腾讯实习生面经~

    昨天我正式收到了腾讯的实习生offer,暑假我要去深圳的腾讯总部了~

    从开始想到申请腾讯实习生,一直到接到lily通知我拿到offer,过程还是挺曲折的~我只是想记录下这段经历~

    腾讯的面试是我第二次的正式面试。第一次是以前写过的51job.com重庆200强选拔赛中的面试,那次貌似碰到一个不搞技术的人来问我很多非技术的问题,我比较郁闷,他比我更郁闷。。。

    网申

    http://intern.tencent.com/trip.shtml上有腾讯招聘实习生的介绍,现在还可以看到,不过貌似已经把每个职位的招聘人数去掉了。按我的记忆,以前网页上写明了,在全国招300名技术类实习生到深圳的腾讯总部实习。我看到这个要求,感觉自己还蛮符合的(至少不像MSRA的实习生要求那么高,在此羡慕一下sixsix),于是我进行了网申。在线填完简历之后,迟迟没有提交,因为面对繁多的职位不知道选哪个好。于是我想到了在腾讯工作的晖哥,咨询他老人家当然是必不可少的~

    牛人都是很忙的,晖哥也不例外,不过晖哥仍然愿意在繁忙的工作中为我出谋划策。在网站上可以看到腾讯的招聘计划中,没有任何一个职位是在重庆招聘的,这让我感到希望渺茫。如果这个时候我仍然执着地等待网申的结果,可能我就与腾讯无缘了。。。于是我选择了:

    内部推荐

    事实证明,网申也没有任何回音。晖哥让我把电子简历发给他看看,耐心地看过之后,晖哥说希望我能来他的组工作。我也想啊。。。不过这件事不是晖哥就能说了算的。。。晖哥把我的简历交给他们部门的HR老大,然后让我等消息~

    一面

    6月3日上午10点54分,晖哥给我QQ发了条消息,说“准备一下面试,随时可能有电话”,不过这个时候我并没上QQ。。。人在实验室做网络安全课程设计,大概11点接到一个0755区号的电话,心想应该是深圳的,果然是一面的电话面试。面试官是个男青年声音,问我现在方不方便讲话,我走到窗户边的安静地方跟他说方便。

    一面持续了大概20多分钟,基本全是技术面。他首先说看过了我的简历,让我从做过的项目里选择一个来谈谈。主动权掌握在了我的手中我就不客气了,我选择了Dreambook,这是我们DreamX小队最引以为豪的项目,经历过MSRA大牛们的提问,已经向不知道多少人展示过。他问了我一些很常规的技术面问题——介绍一下这个项目,我们开发团队有几个人,开发了多久,如何分工,我在这个项目中担任了什么职责,用到了一些什么技术,软件的架构和某些流程是怎样的,软件的缺陷和前景在哪里。了解了整个项目之后,他问到了一些技术细节——每个模块是依据什么技术和想法实现的,模块之间的接口是怎样的,测试是否考虑到各种实际情况,某些功能是否会在不同的情况下失效,软件是否做过性能测试,如何发现软件的瓶颈所在,软件是否根据用户的进一步需求改进过并且如何改进的,我们参加比赛的时候,我们的作品为什么比其他作品好。

    这个项目是我参与过开发周期最长的一个,他问到的这些问题,我们早就有过考虑,并且有着完善的解决方案。技术面没有难倒我。之后他问了我一个RP题,我认为自己在性格上的优缺点是什么。我说我的优点在于乐于并善于学习新鲜的东西,然后举例说明,缺点在于有时候容易骄傲自满,我自己也知道这个缺点,正在努力改进中。。。

    最后他问我对腾讯公司有没有什么想了解的,或者想问的问题,我说没有。他问为什么,我说我有晖哥,以前了解过一些,以后有不了解的也可以问他。然后电话就挂了。

    晖哥问起我,我才发现我不应该不问问题。晖哥猜不出是谁面的我,我还不知道什么时候会有二面的消息。。。于是再次等消息。。。

    二面

    6月4日,晖哥告诉我,一面通过了,等端午节过了准备二面。我跟晖哥说,看来腾讯对实习生的技术要求不高啊,一面还是比较简单的。后来才知道,BT的在后面。二面过程是我目前见过的第二BT面试(第一BT的当然是MSRA的面试)。幸好我还是认真准备了的——我在网上搜以前腾讯招实习生的笔试面试题,结果一个都没有,只有招员工的时候的笔试面试题,我就按这些题准备,思考腾讯可能考察哪些方面,后来确实派上了些用场。这告诉我,无论认为多么简单,面试一定要有准备。

    6月17日,一个陌生的女人闯入我的生活,她就是lily。她打电话告诉我恭喜我通过了初试,希望我能参加在成都进行的复试。我问了一下lily,为什么要去成都,不来重庆面,她说因为重庆地区通过了一面的就我一个人。。。我彻底绝望了,看来不得不去一趟成都。我问二面是谁来面,她说是一个部门的主管。我又问二面主要是什么问题,她说还是以技术面为主。晖哥建议我准备一下算法。

    6月19日早上,我在川大旁的一个酒店12楼的客房里面试,lily给我的schedule是9点到9点半面试,实际上从9点面到了10点45分。在这1个多小时内,面试官的问题密度灰常大,覆盖面之广,技术难度之深,在本人短暂的职业生涯中史无前例。他问到了Unix/Linux 或 Windows 开发平台下的C++,CGI,JS\AJAX\CSS\ASP\FLASH,Java EE网站开发,Java ME手机开发,嵌入式,3D渲染原理,3D游戏引擎,网络分层,TCP/IP协议的原理,Winsock编程,服务器集群,分布式,Web服务器原理,数据库设计,数据库压力测试,搜索引擎技术,基于.Net/C#的Web开发,大并发访问网站的架构设计,软件工程,算法和数据结构。基本上把我熟悉的,我了解皮毛的,和我听说过的,我没听说过的,全部问了一遍。面完出来之后,我的头都是晕乎乎的。。。

    二面的面试官人很好,我没回答好的问题,他有时候会给我解释一遍。他把我的每个项目都看了一下,针对每个项目都有至少一个的比较有深度的问题。因为问题太多,具体的印象比较深刻的问题能想起几个就写几个:

    让我把Dreambook软件的系统架构图画出来,问我系统架构图、功能模块图、用户流程图的区别。(这个比较简单)

    哪个部分是Dreambook的核心,为什么?

    下载一本书的所有网页后,生成一本书的目录、每章、每节之间的链接,这个树形结构分析的算法是怎样的?

    去除每本书的网页的广告内容时,如何判断哪些是正文,哪些是无效信息?(模糊匹配算法)是否是基于HTML标签的?(是,但是不全是)是否是精确匹配的?(不是)

    如何做用户需求分析?是不是需要准备什么?举例说明。

    对Baidu和Google搜索引擎的原理了解多少?我们的搜索是搜索全文还是搜索摘要?(搜索全文,举了Lucene的例子说明全文搜索原理)搜索量很大时,如何保证性能高效?(将搜索结果分页显示,一次只列出10个搜索结果)

    有没有在Linux下做过C++编程?开发平台是什么?写出该开发平台编译一个test.c文件的命令。

    有没有开发过3D游戏引擎?做了一个什么样的游戏?这个游戏的特色在哪里?

    OSI网络7层结构是什么?详述TCP连接3次握手的过程,如果在VC下开发,这个过程分别对应调用哪些Windows API?(我发现这个问题是腾讯对所有人必考的问题)设计一个异步传输模式下的数据包结构。

    对Java EE框架下的Spring、Hibernate、Struts了解多少?对一个Web服务器的原理机制,比如Apache服务器的原理机制了解多少?IIS呢?

    叙述当一个用户登录QQ时,与腾讯的服务器进行连接的过程。需要经过几层的路由?如果要自动选择最快的服务器进行连接,应该用什么方法实现?测试用户与腾讯的多个镜像服务器之间响应时间,是由用户发起测试还是由服务器发起测试?(服务器)采用什么协议测试?(ICMP)

    对于一个访问量很高的网站,性能瓶颈在哪里?可以做哪些优化,架构如何设计?

    如何探测一个网络协议漏洞?发出的探测数据和接收到的响应数据是怎样的?如何判断是否存在漏洞?

    最后一个问题印象最深,他说最后一个问题很简单(他笑),就是让我写一个双向链表的插入删除操作,要求1:每次插入删除之后,链表里的元素——假设是int——是按升序排列的;要求2:必须用C++实现2个类CNode和CLink,CLink类里面封装add()和delete()方法。时间是20分钟,他要求我在这20分钟内,从12楼坐电梯下到1楼大厅,在大厅找个桌子,用纸笔写好,然后上12楼交给他。

    我在XXY寝室里写模拟文件系统写到4点睡的,写了一晚上的指针操作,这个问题我还是比较熟悉,按时交给了他。代码有优化的余地,不过没来得及优化,跟他说明了一下。注意的地方有2点,一个是指针操作的时候,删除哪个,连上哪个,操作顺序安排容易出错,要细心,还有就是添加和删除的结点位于第一个和最后一个时,处理方式有些不同。

    最后他问我有没有什么问题,我问他什么时候给答复,他说下周内。然后他就叫下一个面试的同学进去了。

    面完了才知道,这个面试官是晖哥所在部门老大的老大。。。大大牛啊~

    结束,新的开始

    回来之后跟李祺讨论了一下面试题,李祺和潘玉云都说BT。其实MSRA的面试题才BT,举个例子,这是李朋的一个电话面试题,比如1~1000这1000个数存在计算机中,随机删除其中一个,让你找出删除的是哪一个?这个问题是不是更BT?之所以举这个例子是因为我能答出来,李朋电话面试的其他问题我是一个都答不上来。。。可见MSRA面试的BT程度~

    感谢:晖哥(宇宙无敌霹雳感谢);超人、李7、sixsix(这个都不用说了,无敌的DreamX小队,呕液);爹娘;XXY(自己对号入座);SZD(自己对号入座,too);518寝室的兄弟伙们。

    希望能够早点去实习,深圳,海边。。。哎,还是先把课程设计做了吧。。。

    6/23/2008

    新建文件夹的快捷键~

    1.鼠标右键+W+F(通用的)
    原理:右键菜单
    2.ALT F+两下回车(注意:这个在桌面不能用)
    原理:资源管理器菜单栏

    6/12/2008

    腾讯Soso,很黄很暴力~

    本来只是想测试一下网络是否连通,随便输个关键词搜索一下。。。结果发现。。。

    soso1

    soso2

    6/8/2008

    安装SQL Server 2000遭遇“指定的实例名无效”错误解决方案~

    参考:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;320873

    主要解决方案:

    按下列步骤删除 MSDE 2000 installer 引用:

    1.
    确定安装的 MSDE 实例的 ProductCode。如想查看关于如何确定 ProductCode 的更多信息,请将 ProductCode 用于以下 Microsoft 知识库文章中的 Original Package Name 映射表:

    311762 (http://support.microsoft.com/kb/311762/EN-US/) INF:如何确定在现有 MSDE 安装中使用了哪个 MSI 文件

    例如,如果 MSDE 2000 实例是一个默认实例,则您可以在以下注册表项中找到 ProductCode 注册表项值:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup
    如果 MSDE 2000 实例是一个命名实例,则您可以在以下注册表项中找到 ProductCode 注册表项值:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<INSTANCENAME>\Setup

    2.
    使用 Msizap.exe 删除 MSDE 2000 实例的 ProductCode 的所有 Windows Installer 信息。在命令提示符下键入下面的命令行:
    MSIZAP.EXE T {GUID}
    例如,如果 MSDE 2000 实例的 ProductCode 为 E09B48B5-E141-427A-AB0C-D3605127224A,并且您希望使用 Msizap.exe 删除 Windows Installer 信息,请在您的计算机上从命令提示符下运行以下命令:
    MSIZAP.EXE T {E09B48B5-E141-427A-AB0C-D3605127224A}

    除了上述用Msizap.exe 的办法,也可以在注册表中搜索{E09B48B5-E141-427A-AB0C-D3605127224A},找到全部删除之,即可~

    如果还是一样,那么说明MSDE已经安装好了,重启后打开“开始”-“所有程序”-“启动”-“Service Manager”即可~

    5/15/2008

    将带参数BAT文件应用到QQ强制聊天~

    bat文件内容如下:

    cls
    echo off
    echo 如果要修改请用记事本打开本文件
    echo 并且将cd后修改为你的QQ安装目录路径
    echo 盘符改成QQ所在盘符

    cd D:\Program Files\Tencent\qq
    D:
    Timwp.exe tencent://message/?uin=%1
    echo 原创:XA's Documents
    exit

    复制到记事本后存为QXA.bat,然后放到任何一个已经设置环境变量的路径,在cmd下输入QXA QQ号码,即可打开临时会话强制聊天。

    eg.:qxa 12345678

    其中%1表示第一个参数,后面的参数以此类推。exit将会使黑窗口在执行完成后自动关闭,如果把exit换成pause将显示“按任意键继续...”字样并等待按键。

    写这个是因为传美版的QQ有显隐身等强大功能却因为精简过某些组件导致不能正确解析tencent协议,以至于在点击QME那样的网页临时会话按钮时会报错:“tencent://message/?uin=**websitename=qzone.qq.com menu=yes 找不到应用程序”。而使用这个方法可以用一个命令解决问题。

    5/14/2008

    计算机病毒原理实验小记~

    从书上P87开始,用WinHex打开DLL,在0xD0找到50代表PE文件头。接下来是映像文件头,再下面是可选映像头(结束于0X74H)

    if以“打开磁盘”,再打开文件的方式加载DLL,那“Get_data”文字的偏移地址可能和书上不同。因为此时是按磁盘起始位置算的,一个文件内可能有间隔的数据

    if直接打开文件,那“Get_Data”的偏移地址是对的。此时文件内的数据是顺序显示的。

    5/11/2008

    5.10德中同行现场活动有感~(多图无码)

    在出发前一天晚上,本人的内心就灰常的激动,预计会是一次难忘的经历,实际上果然如此~活动的全名叫德中同行文化交流活动,是德国与中国政府合办的,包括很多很多很多很多内容(在此省略1000字),其中就有我此行的目的 - Maximilian Hecker演唱会~先放一张活动地图~

    IMG_0120

    跟我一行的有2个同学,省略姓名样貌特征若干。下午2点多坐261出发,3点半我们到了人民大礼堂。先在人民广场转悠了好大一圈,以人民广场的大牌坊开头。说起人民广场还真算是我来重庆见到的第一个名符其实的广场的地方。

    IMG_0007

    虽然烈日灼人,但是广场里面人满为患,尤其以MM为甚。IMG_0006

    跟以往初中同学的聚会活动一样,与豆友们集合的地点是“广场旗杆下”。广场旗杆下是灰常晒人的,默认偏移到旗杆旁边的德国黑啤店集合。德中同行活动进行的这几天,正宗的黑啤都是不限量供应的!虽然德国的啤酒是世界上最著名的,不过我不喝酒,对我来说也没多大感觉~

    IMG_0009

    这栋看上去像烂房子一样的烂房子,实际上是主会场之一,叫做文艺亭,当时正在进行张一白的摄影作品展,有他本人到场为观众解析《影像重庆》,很多会场是限制人数的,我没能挤进去。。。实际上由于各种有意思的活动实在太多太多太多,而且又都是免费的,只要是要排队才能体验的,我都没去,剩下的我倒是玩了个遍~

    IMG_0015

    中途暂停了一会,因为2个同学同时要求去上厕所。。。我在外面坐等,嗯环境不错,就是凳子晒得发烫。。。

    IMG_0016

    在文艺亭里面还有一项免费学德语活动(为什么前面都说了所有活动都是免费的这里还要加个免费二字呢?这就是中国人的习惯吧),只有每天下午2点才有,再次遗憾错过。。。

    IMG_0019

    再来一张文艺亭,照片中的志愿者MM其实是美女,经过交涉得知是来自川外的(省略交涉内容若干。。。)~

    IMG_0020

    除了文艺亭还有个主会场叫会议厅,像个小鸟巢,由于又没能挤进去,不知道里面在进行什么会议。。。IMG_0060

    演出开始前我们基本上在到处看展览,展览布置和设计,以及展示内容都是经过用心规划的。首先惹眼的是西门子的这块放在入口的太阳能电池板。

    IMG_0024

    在安联保险集团的展区,有体验高尔夫的活动~

    IMG_0025

    在海瑞克公司的展区,有一个灰常酷的模型,这个巨大的机器叫做“双台式盾构机”,这个模型很仿真,实际上它的各个部件是在动的,可惜照片看不出来。请猜想一下这台机器是用来干什么的?(在照片下面公布答案。。。)

    IMG_0031

    答案是,这台机器是用来挖地铁隧道的!在最右端有一个旋转的挖掘头(模型上也是在旋转的),整个机器都可以在特殊的铁轨上面移动。也就是说,它的工作流程是:

    do

    {

    挖;

    前进;

    }while (挖通了 == false)

    可以边挖边前进,边挖边前进,边挖边前进。。。真是一台强大的机器,高科技啊~

    值得一说的是,每个展厅都是由一种特殊的竹子支起来的,看上去很环保,环保且高效正是是本次展览的侧重点之一。

    IMG_0037

    在博世的放映厅有一个黑酷的东西,大家来找茬,看看在哪里?(提示:黑酷是重要线索)

    IMG_0039

    在左上角有一个又黑又酷的空调,这就是黑酷的东西~

    博世一直是我比较敬佩的一个企业,下面有个古董级产品,注意,这是一种家用电器,注意,这不是滚筒洗衣机(工藤新一的日文发音。。。),是博世在1933年生产的世界上第一台带压缩机冰箱!

    IMG_0054

    广场上还有个平面设计展,是一名叫张扬的艺术家创作的,这次展览了他眼中德国与中国的不同,蓝色代表德国,红色代表中国,下面这幅说的就是我。。。但是我依然执着地把它拍了下来~

    IMG_0077

    在巴斯夫公司展厅展示的宝马Mini车~

    IMG_0101

    这是下午4点时的舞台~7点开始的Live show就在这里进行~

    IMG_0109

    整个会场纵览图~在三峡博物馆拍的~这里的地形概述就是:人民大礼堂和三峡博物馆把人民广场夹在了中间~

    IMG_0111

    随后我们去了人民大礼堂内部,门票5元,比较划得来~只放一图~

    IMG_0163

    用膳~IMG_0185

    这是6点40时的现场观众一瞥,到后来以万计数一点不过分,所以本人能占到前排真是相当得意啊,哇咔咔~

    IMG_0203

    7点演出开始,首先是中国的器乐团~

    IMG_0201

    前面一哥们也太高了,而且明显不是音乐爱好者,别人都比较配合现场气氛,就他一SB动也不动表情之木讷仿佛公鸡中的呆若木鸡,以至于后来自觉无趣走了,我也因此能够顺势一下往前挤了好几个,后来前面都陆续有人走,我也一步步来到了MH的跟前~

    IMG_0202

    这是来自柏林的主持人,精通2国语言,说起中文来那腔调像说相声的,说起德语来那腔调像马戏团报幕的~

    IMG_0213

    然后是4LYN乐队,一支来自柏林的新金属乐队,他们在德语国家是非常知名的,在世界杯上给德国队加油唱的就是他们的歌~他们一来就把现场气氛带向了第一个高潮,4LYN的主唱很像GREEN DAY的主唱,从相貌到动作,再到身高。。。周围总是有一群SB,S问这是什么乐队啊,B说他们的名字叫柏林乐队;S举着一个五月天的手势,B们也跟着举起了五月天的手势,SB们一起举着五月天在那里摇摇晃晃;还有若干SB们的事例云云(省略1000字)~4LYN的鼓手今天刚好是32岁生日,现场乐迷在带动下,3,2,1,一起喊了一句“生日快乐”,鼓手马上来了一段Solo,相当精彩~4LYN说,这是他们演出15年来最棒的一次,他们第一次来中国,更是第一次来重庆,就感受到了充分的热情~

    IMG_0232

    接下来是甜蜜的孩子(The Honeys)乐队,不得不说相对于4LYN,这哥们在现场受到了冷落~

    IMG_0256

    然后是一男一女的完全立体声(Stereo Total)乐队,他们的风格覆盖相当广泛,唱的歌比较诙谐~那男的混音的时候说:I like making love with 3 people!太邪恶了。。。

    IMG_0282

    到最后的Maximilian Hecker上场,现场完全已经High 翻,本人早已汗流浃背~

    IMG_0308

    MH演奏吉他,现场适时地安静了下来~

    IMG_0314

    大屏幕上飘起了雪花~意境很完美,音响设备很好,旁边一哥们说这是他看过的live里面声效最好的,很讽刺的是免费的演出声效比收费的还好~

    IMG_0321

    MH键盘耍起~安逸~

    IMG_0343

    MH说了很多的“谢谢”,而且说的很标准,还有“我爱你们”、“晚上好”等等,毕竟MH也不是第一次来中国了。MH唱了为数不多的几首歌~当MH说:I have to say this is the last song。下面全部在喊No,随后又一起喊One More,甚至有喊Encore的。可是天下没有不散的筵席。。。

    IMG_0354

    更多照片以及MH演出的视频录像,请联系本人索取~

    今天的活动到此结束,大家晚安~

    5/6/2008

    《SQL Server 2000 数据库设计权威指南》学习不完全笔记(三)~

    SQL Server 2000中,嵌套触发器选项是一个服务器全局设置,语法是

    sp_configure 'nested triggers',1 | 0 这里1=ON;0=OFF

    如果执行一个级联操作,所有相关表上的触发器都将启动。触发器操作最多嵌套32层。注意:我们有可能建立一个对表进行级联操作的无限循环的触发器。

    而递归触发器选项是一个特定数据库的设置,语法是

    sp_dboption '<dbName>','recursive triggers','TRUE' | 'FALSE'

    这使得触发器在执行与其相关表的修改时重新启动触发器。

    为了说明这2个选项的作用,先建立2个很简单的表

    CREATE TABLE tableA

    {

    field varchar(40) NOT NULL

    }

    CREATE TABLE tableB

    {

    field varchar(40) NOT NULL

    }

    GO

    然后创建2个非常简单触发器,每一个向另一个表插入同样的值。(省略创建触发器和插入的SQL代码N行)当服务器的嵌套触发器设置关闭时,将tableA中插入一行,则被触发的惟一触发器是tableA的触发器。但是当嵌套触发器选项打开,递归触发器选项关闭时,在tableA中执行同样的插入,这一次依次触发tableA和tableB的触发器N次(N=32,因为最多嵌套32层),然后由于超出限制次数报错。错误信息eg.:

    Server: Msg 217,Level 16,State 1,Procedure tableB$afterUpdate$demoNestRescurse,Line 7 Maximum stored procedure,function or trigger nesting level exceeded (limit 32).

    触发器的执行比约束慢得多,并且不是保护数据最好的方法。只有用约束处理不了的时候,才使用触发器。

    5/5/2008

    关于东方标准的笔试~

    有2个问题,当时可能做的不对,现在补充一下。

    第一个是问传递依赖属于第几范式,实在是忘记属于第几了。

    答案是:第一范式就是原子性,字段不可再分割;
    第二范式就是完全依赖,没有部分依赖;
    第三范式就是没有传递依赖。

    参考http://www.yiboit.com/?uid-347-action-viewspace-itemid-1136

    第二个是要把一个前缀表达式写成后缀表达式。

    貌似是属于编译原理的知识。

    参考http://www.chinaaspx.com/archive/other/18887.htm

    《SQL Server 2000 数据库设计权威指南》学习不完全笔记(二)~

    当你有一个该表的更新后触发器,SQL Server将不采用在行内进行更新,而是行被先删除,然后再插入。这样才能在触发器中实现Rollback Transactions,有备份。

    在所有可能的情况下使用惟一性索引,对于系统的性能来说是十分必要的。

    使用2部分组成的名字(eg.:owner.objectName)来访问所有对象。

    如果修改数据如下:

    ALTER FUNCTION album$returnKeysByArtist

    (

    @artistId int

    )

    RETURNS TABLE

    WITH SCHEMABINDING

    AS

    RETURN

    (

    SELECT albumId

    FROM album  ----used to be dbo.album

    WHERE artistId = @artistId

    )

    产生的错误中会有"……Names must be in two-part format and object cannot reference itself."

    是用约束而非触发器的一个重要原因是:查询优化程序可以借此来优化查询。

    如果使用char而非varchar作为LIKE掩码,可能带来填补空格的问题。

    从查询分析器看到的错误信息由几个部分组成:错误编号,eg.:Msg 547;级别,Level 16;状态,State 1;行,Line 1;错误文本。

    在下面的例子中建立了一个触发器,其中有2个类似的检验,对同样的行进行处理,但其中一个在获取多行时失效。

    CREATE TRIGGER artist$afterUpdate$demoMultiRow

    ON artist

    AFTER INSERT,UPDATE --fires after the insert and update has occurred

    AS

    IF NOT EXISTS (

    SELECT *

    FROM INSERTED

    WHERE name IN ('the who','the beatles','jethro tull')

    )

    BEGIN

    SELECT 'Invalid artist validation 1'

    END

     

    IF EXISTS (

    SELECT *

    FROM INSERTED

    WHERE name NOT IN ('the who','the beatles','jethro tull')

    )

    BEGIN

    SELECT 'Invalid artist validation 2'

    END

    GO

    在插入单行数据的时候,2种处理方式都没有问题。但是插入多行的时候,eg.:

    BEGIN TRANSACTION

    INSERT INTO artist (name,defaultF1,catalogNumberMask)

    SELECT 'ROLLING STONES',0,' per cent'

    UNION

    SELECT 'JETHRO TULL',0,' per cent'

    ROLLBACK TRANSACTION  --undo our test rows

    这时只输出了

    Invalid artist validation 2

    第一种处理方式失效了,因为有一行满足条件('jethro tull')(我们有一行INSERTED.name 在测试列表中),所以只返回一行(有一行存在)。这是一个在编写触发器时相当普遍的问题。

    《SQL Server 2000 数据库设计权威指南》学习不完全笔记(一)~

    阅读本书最好有数据库系统原理的一些基础知识,以及SQL Server 2000的入门知识,建议阅读《Beginning SQL Programming》。

    数据转换服务(DTS)可以在OLE DB数据源之间变换和转移数据,也就是说可以实现Excel与SQL Server甚至文本文件数据的批量导入导出,这是一个非常激动人心的功能。更多参阅《Professional SQL Server 2000 DTS》(ISBN 1861004419),这本书在本书封底的SQL Server书系树形图里位于顶端,也就意味着它的难度是很高的。曾经在创新杯决赛里看到清华大学的一个演示,就是把Excel里面的一些表整个复制,然后粘贴到网页中,就可以直接把数据导入到Web后台的SQL Server中,应该就是用DTS实现的。

    关于对象的命名规则,建议使用大写字母划分词的边界。eg.:televisionScheduleItem

    如果加上拥有者,则可以使用拥有4个部分的命名模式:

    [<server>.][<database>.][<owner>.]<objectname>

    在涉及到跨服务器或者跨数据库的数据操作时,这种命名模式非常常用。

    在使用bit数据类型时,每8个bit列的实例占用1个字节,因为,当表中有8个bit列和有1个bit列的宽度一样。它通常用作Boolean型,因为SQL Server没有提供明确的Boolean型。但这样不太理想,因为bit型可以取NULL值。而且bit列不能加索引。

    int型可以取值-231~231-1,大概就是正负20亿之间,占4个字节。int型的一个重要用途是用于存放IP地址,因为一个IP地址刚好是分为4个8位长字节组成的32位整数。

    bigint型取值范围是-263~263-1,占8字节。smallint占2字节。tinyint占1字节。

    当你确认每一行的字符串都具有相同的字符数且每一行都是非NULL的,才应该使用char类型。

    如果你要在字符串中给出Unicode字符串,则需要在串前加一个N,eg.:

    SELECT N'Unicode Value'

    timestamp型(即rowversion)是数据库唯一值,只要修改数据库中任意一行,则会自动改变。

    uniqueidentifier型(唯一标识符),全球唯一确认号码(Globally Unique Identifier,GUID)将会成为Microsoft计算的支柱。GUID根据网卡标识号(如果有的话),当前的日期和时间,取自CPU时钟的惟一数和某些“魔法数字”,这使得它几乎不可能重复。它占用16个字节。不可以将任何二进制数放入一个uniqueidentifier列,因为该值必须符合其生成标准。

    索引分为簇式和非簇式的,簇式按照索引顺序安排物理表中的顺序,非簇式是一种简单地提高存取速度的一种完全不同的结构。索引是使用平衡树结构实现的,也叫B-树。簇式索引适用于:包含有限个不同值得码的集合;范围查询;数据顺序存取;返回大的结果集查询;常常被包括JOIN 或GROUP BY 子句的查询访问的码集。不要再经常改变的列上建立簇式索引,也就是,最好只读。

    4/22/2008

    Silverlight实践之XA的博客阅读器~

    这是我第一个用Silverlight做的可执行程序,花了3个小时才算完工正常运行。。。

    在这个程序中主要用到Silverlight的XML数据操作。

    XAdoc1

    主要文件xadoc.xaml的代码如下:

    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
        x:Class="XAblogreader.Window1"
        x:Name="Window"
        Title="XA的博客阅读器"
        Width="640" Height="480">

        <Window.Resources>
            <XmlDataProvider x:Key="xadoc" d:IsDataSource="True"   Source="http://xatest.spaces.live.com/feed.rss"//xml数据源的名称为xadoc
                <XmlDataProvider.XmlNamespaceManager>
                    <XmlNamespaceMappingCollection>
                        <XmlNamespaceMapping Prefix="wfw" Uri="http://wellformedweb.org/CommentAPI/"/>
                        <XmlNamespaceMapping Prefix="cf" Uri="http://www.microsoft.com/schemas/rss/core/2005"/>
                        <XmlNamespaceMapping Prefix="dcterms" Uri="http://purl.org/dc/terms/"/>
                        <XmlNamespaceMapping Prefix="msn" Uri="http://schemas.microsoft.com/msn/spaces/2005/rss"/>
                        <XmlNamespaceMapping Prefix="live" Uri="http://schemas.microsoft.com/live/spaces/2006/rss"/>
                        <XmlNamespaceMapping Prefix="slash" Uri="http://purl.org/rss/1.0/modules/slash/"/>
                    </XmlNamespaceMappingCollection>
                </XmlDataProvider.XmlNamespaceManager>
            </XmlDataProvider>
            <DataTemplate x:Key="title模板">  //这里使用了数据模板
                <TextBlock Text="{Binding Mode=OneWay, XPath=.}"/>  //数据绑定
    //OneWay表示绑定是单向的,数据源变化之后绑定的对象随之变化,但是绑定的对象变化并不影响数据源
            </DataTemplate>
            <DataTemplate x:Key="item模板">  //这里定义了数据模板
                <StackPanel>
                    <TextBlock Text="{Binding Mode=OneWay, XPath=title}"/>
                    <Label Content="{Binding Mode=OneWay, XPath=link}"/>
                    <TextBlock Text="{Binding Mode=OneWay, XPath=pubDate}"/>
                </StackPanel>
            </DataTemplate>
            <DataTemplate x:Key="item模板5">
                <StackPanel>
                    <TextBlock Text="{Binding Mode=OneWay, XPath=title}"/>
                    <TextBlock Text="{Binding Mode=OneWay, XPath=pubDate}"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
        <Window.Background>
            <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">  //使用线性渐变
                <GradientStop Color="#FF559032" Offset="0"/>
                <GradientStop Color="#FFC5EB82" Offset="1"/>
            </LinearGradientBrush>
        </Window.Background>

        <Grid x:Name="LayoutRoot">  //布局中使用了2个Grid面板来实现控件中的数据上下文共享
            <Image HorizontalAlignment="Left" Margin="8,8,0,0" VerticalAlignment="Top" Width="78" Height="72" Source="{Binding Mode=Default, Source={StaticResource xadoc}, XPath=/rss/channel/image/url}"/>  //Image控件绑定了博客的头像
            <Label Margin="103,21,296,0" VerticalAlignment="Top" Height="33" Content="{Binding Mode=Default, Source={StaticResource xadoc}, XPath=/rss/channel/title}" ContentTemplate="{DynamicResource title模板}" FontSize="16" FontWeight="Bold">
    //Label控件绑定了博客的标题栏
                <Label.Background>
                    <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                        <GradientStop Color="#FF82DB6E" Offset="0"/>
                        <GradientStop Color="#FF6AAA76" Offset="1"/>
                    </LinearGradientBrush>
                </Label.Background>
            </Label>
            <Grid Opacity="1" DataContext="{Binding Mode=Default, Source={StaticResource xadoc}, XPath=/rss/channel/item}" Margin="8,80,8,12">
                <Grid.Background>
                    <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                        <GradientStop Color="#FF678165" Offset="0"/>
                        <GradientStop Color="#FF82DB6E" Offset="0.928"/>
                    </LinearGradientBrush>
                </Grid.Background>
                <ListBox HorizontalAlignment="Left" Margin="8,8,0,8" Width="200" ItemTemplate="{DynamicResource item模板5}" ItemsSource="{Binding Mode=OneWay}" IsSynchronizedWithCurrentItem="True" Opacity="0.8" Background="#FF71DD8F"/>
    //IsSynchronizedWithCurrentItem属性明确定义了数据上下文的共享
    //ListBox控件绑定了博客的文章列表

                <Grid Margin="222,17,8,8">
                    <TextBox AllowDrop="False" Text="{Binding Mode=OneWay, XPath=description}" TextWrapping="Wrap" Opacity="1">
    //TextBox根据ListBox的选择,返回相应的文章,在本例中没有对返回的结果进行处理,使用返回的是文章的HTML代码
                        <TextBox.Background>
                            <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                                <GradientStop Color="#FF76DDDF" Offset="0"/>
                                <GradientStop Color="#FF71DD8F" Offset="1"/>
                            </LinearGradientBrush>
                        </TextBox.Background>
                    </TextBox>
                </Grid>
            </Grid>
        </Grid>
    </Window>

    值得注意的是面板的排布直接影响到数据上下文的共享,在Expression Blend中打开,可以看到布局的层次如图:

    layout

    最终完成的效果如下:(由于使用了Grid布局,最大化之后布局仍然是合理的)

    result

    源代码下载:XA Blog Reader Source Code.zip

    4/18/2008

    Pure Love Stories~

    s2331338 s2554722

    首先非常感谢方利庆在Q上传给我这2部电影,《情书》是我找了很久也没找到的,《傲慢与偏见》却是当时方同学推荐的。说实话当时我犹豫了一下是否要接这部电影,因为对名著并不是特别感兴趣。现在看来当初要是没接,那真的是我的傲慢与偏见。

    《情书》没什么可说的了,几乎是公认的经典。最令我难以忘怀的,是女藤井树在山谷中,雪地里不断地呐喊:“你好吗?我很好!”喊到声泪俱下。

    《傲慢与偏见》则尤其是超出我预料很多的一部惊艳之作。我很希望在08年里能再看到一部超过它的电影。这是一部如此可爱的电影,伟大的简·奥斯丁铸造了Lizze和Darcy 2个人的灵魂。电影中的每一帧画面,都美得如同油画,美得更加过分的是配上了如此恰到好处的古典音乐。百闻不如一见,以下选出10副截图:

    snapshot20080417235733

    snapshot20080418013108

    snapshot20080418013255

    snapshot20080418014243

    snapshot20080418015910

    snapshot20080418020059

    snapshot20080418020147

    snapshot20080418020916

    snapshot20080418021142

    snapshot20080418021511

    4/17/2008

    豆瓣九点验证~

    doubanclaima69afbc24c7818a8

    4/15/2008

    《计算机操作系统》学习不完全笔记~

    花了大概大半个月,研读完了西安电子科大出版社的《计算机操作系统》一书(汤子瀛 等 编著)。零零碎碎地记下一些吧。

    PCB是进程存在的唯一标志,应该常驻内存。PCB的组织方式采用链接方式时,有一个执行指针及多个队列指针。

    子进程可以继承父进程所拥有的资源。

    整型信号量——居然又是伟大的Dijkstra的发明,包括2个原子操作(Atomic Operation)wait(S)和signal(S),分别成为P、V操作。可以描述为:

    wait(S):while S<=0 do no-op;

                      S := S - 1;

    signal(S):     S := S + 1;

    可以理解为,P:检测资源是否可用,if 可用 then 占用,else 继续检测;V:释放资源。

    发送进程不阻塞,接收进程阻塞,这是一种应用最广的进程同步方式。

    线程切换比进程切换要快上几个数量级。

    在撤销一个线程时,并不立即回收该线程的资源和TCB。

    FCFS:First Come First Service先来先服务调度,SJF:最短作业优先调度。

    优先权 = 响应比 = (等待时间 + 要求服务时间)/要求服务时间。

    基于时间片的分时调度算法里面,多级反馈队列调度算法(Google it),不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。

    实时系统属于计算机学院操作系统课程不学的内容,既然这本书上有相关的内容,我也看了一下。最常用的实时系统调度算法是最低松弛度优先算法,也叫LLF(Least Laxity First)算法。关于此算法网上的资料讲的很不清楚。松弛度就是一种优先级,例如一个任务在200ms时必须完成,而它本身所需的运行时间就有100ms,因此,调度程序必须在100ms之前调度执行,该任务的松弛度为100ms。又如,另一任务在400ms时必须完成,它本身需要运行150ms,则其松弛度为250ms。系统按一定的周期时间对所有任务进行检测,调度算法如下:(貌似live space的日志编写文字格式不支持多级缩进,只能缩进一级,其他的我只能手动打空格了。。。)

    while 有未完成任务

    do{

          step1:计算当前所有任务的松弛度;

          step2:把松弛度最小的任务优先执行;

          step3:直到执行完本任务或者到达了周期时间,继续while循环;

    }

    产生死锁的4个必要条件:互斥条件;请求和保持条件;不剥夺条件;环路等待条件。破坏至少一个条件就可以预防死锁。

    安全状态是指,存在一个安全序列<P1,P2,P3……>,按此顺序对每个进程分配最大资源,可以使每个进程都顺利完成,那么此刻系统是安全的。

    使用银行家算法可以避免死锁,命名原因是该算法能用于银行系统现金贷款的发放。此算法又是Dijkstra发明的,真是一个full of niubility的人物啊~其中有一个子算法,叫安全性算法,用于验证某一步资源分配策略是否具有安全性,非常经典。

    资源分配图(Resource Allocation Graph):用圆圈代表一个进程,用方框代表一类资源。箭头方向:进程请求资源,Pi指向Ri;资源被分配给进程,Ri指向Pi。

    资源分配图1

    资源分配图2

    资源分配图的简化方法是:

    ①删除不处于等待状态的进程(即没有从该进程出发的边);

    ②依次删除当前的叶顶点。可以证明,简化后还存在边的不可简化的资源分配图存在死锁,其中的有边进程为死锁进程。

    若能消去所有的边,那么该图是可完全简化的;若不能通过任何过程使该图完全简化,则称该图是不可完全简化的。文献已经证明,所有的简化顺序都将得到相同的不可简化图。S为死锁状态的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理

    环保护机构:一个程序可以访问驻留在相同环或较低特权环中的数据;一个程序可以调用驻留在相同环或较高特权环中的服务。传说中的Ring 0到Ring 3就是来自这里的。

    多通路I/O系统:就是把一个设备连接到多个控制器上,而一个控制器又连接到多个通道上。

    DMA控制方式的特点:数据传输的基本单位是数据块;数据直接送入内存;传送开始或结束时才需要CPU干预。

    RAID是Redundant Array of Inexpensive Disk的缩写,廉价冗余磁盘阵列。

    文件系统中的索引表本身是一个定长记录的顺序文件。

     

    总体来说,这本书适合学习操作系统入门知识的人看,整本书以各种算法的分析比较为重点,覆盖面广,编写者肯定是态度认真的,在细节上把握都很到位。其中少许讲到这些知识在多个操作系统实例的应用,包含DOS,Mac,Windows,Linux,Unix,尤其以Unix为重点。

    4/13/2008

    AES加密和解密算法的C++实现~

    参考了N多资料,最有价值的几篇如下:

    AES算法的主要步骤:

    http://www.cnblogs.com/henryzc/archive/2005/11/08/271851.html

    AES算法的综合感性认识,以及针对32位机的快速实现:

    http://www.wangchao.net.cn/bbsdetail_147266.html

    MSDN上关于AES的C#实现和详解:

    http://www.vckbase.com/document/viewdoc/?id=1068

    AES算法课件,很清楚

    http://cis.sjtu.edu.cn/personal/wanglibin/sec/sec-chap04.ppt

    AES(Rijndael版)作者的英文论文详解

    http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf

    还有1个flash演示视频,整个过程讲解得非常清楚,我打包放在了MZH BLOG可以下载

    AES算法flash演示~

    教材上讲到的是其中最简单、最理想的一种情况,而且讲得非常简略。

    在程序的实现过程中,用到了C++的位运算和内存操作。用得最多的位运算当然是异或,在C++中用^表示。内存操作用到了memset()和memcpy()。这2者的资料参见:

    http://www.cplusplus.com/reference/clibrary/cstring/memcpy.html

    http://topic.csdn.net/t/20021230/22/1314691.html

    在上面CSDN里面倒数第二个解答很好(处理了空指针的情况),最后一个解答的例子很好,不过有很多错误,正确的应该这样写,在我的电脑上测试通过:

    #include<iostream.h>  
    #include<string.h>  
    void main()  
    {  
              char str1[10]="hehe";  
              char str2[5]="haha";  
              memcpy(str1+1,str2+2,3);  
    }
      

    最后结果是str1变成了“hha”。

    http://blog.donews.com/skyfei/archive/2004/11/20/176430.aspx

    http://www.cplusplus.com/reference/clibrary/cstring/memset.html

    http://rakeone.blogdriver.com/rakeone/752021.html

    4/9/2008

    国内星际2试玩首个战报+暴雪官方壁纸下载~

    现在还在玩星际1的可能都没几个了,我还在玩。。。

    我的目标就是玩到星际2出来,直接顺利过渡到星际2。。。

    很可惜,有试玩资格的不是我。。。发这个战报的是来自《游戏天地》杂志的一名记者,他接到暴雪的邀请函,前去试玩,并且跟职业选手和非职业选手较量了几盘,发了一篇图文战报:http://fight.pcgames.com.cn/starcraft2/yanjiu/0803/1040991.html

    这个战报看得我是直流口水~1040991_2_thumb

    选取战报中的一段文字并附图:

    对手是职业玩家,我不敢掉以轻心。手选神族,双兵营开局,手指狂舞,农民探路。我运气不错,第一时间发现了虫族的地衣(虫蔓),星际里的虫族地衣像是波力海苔,星际Ⅱ的就更恶心了,我都舍不得让农民跑上去。但量小非君子,无毒不丈夫,我的农民还是捏着鼻子冲进了虫族基地,对方的雄蜂正在有条不紊的采矿,我立刻让农民迎面焊去。

    1040991_3_thumb

    星际2,你快点来吧,我的下一台电脑配置就取决于你了~

    最后放出2幅星际2的官方壁纸,只有1024 x 768的版本,其他分辨率的版本可以在http://fight.pcgames.com.cn/starcraft2/找到。

    894172_wall3-1024x768

    934361_wall4-1024x768

    4/8/2008

    居然不得不开始使用Dr.COM登录客户端了~

    今天下午我的帐号突然显示,只能在ip 0.0.0.0上使用,意思就是说:我的帐号目前被封停了。我打网络中心的电话问了一下,网络中心的人居然不知道,然后他们查了一下,说查好了打电话告诉我,让我留了我的号码。结果过了1个多小时还没有回复。。。我于是再打过去,我说不能在Web方式下登录,接电话的MM声音很温柔,比虎溪的那个自以为美女的好多了,MM说我这个帐号虽然不是学生帐号,但是本来也就不能在Web下登录,因为现在网络重新更换了设备重新调试好了,所以全部帐号都要使用万恶的客户端登录。。。

    想念以前Web登录的时候(其实就是昨天……),一次登录上去,就不用下线。把电脑开关,把网线插拔,都会自动登录,并且几乎感觉不到登录的过程。

    发2张截图怀念一下,这是以前Web登录的时候:

    DRCOM

    这是现在,流量0.000M啊~

    DRCOM2

    Silverlight 2 学习笔记(二)~

    在TerryLee的Silverlight 2教学实例中,终于看到一个接近我需要在项目中应用的实例,是他的图形图像篇的最后一篇:7.一步一步学Silverlight 2系列(32):图形图像综合实例—“功夫之王”剧照播放

    实现效果如图:TerryLee_Silverlight2_0163_3

    在这个例子中很多值得学习的地方,除了Silverlight 2特性的一些流畅运用,特别是一个职业程序员的专业素养。举一例,看下面一段代码:

    private void leftImg_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        index = index == MIN ? MAX : index - 1;
        Play();
        myStoryboard.Begin();
    }

    这段代码的意思是说如果把鼠标单击左边的图而处理的事件。应该是3个图片循环右移一位。index一行简洁地表示了边界条件的情况。

    继续翻MSDN,发现一张Silverlight的架构图,这张架构图是包含SL1和SL2的,以后继续更新下去可能还会包含SL3、SL4……可见SL2真的是比SL1增加了很多好用的东东~

    Bb404713.SLarch_1(en-us,MSDN.10)