Main's profile我的Domain,我做主PhotosBlogListsMore Tools Help

      可见还是还是可以使用的,根据分析,所有操作基本上是在weather.js文件中编写,所以只要修改这个文件,绕过wlsrvc.dll直接获取天气信息就可以使用了,不过这个文件还是有点复杂的,什么时候有时间我自己直接写一个写的脚本,应该是可以使用的。
December 03

无聊的周末

Blog


    December 16

    你看不到我,你看不到我……

    应某牛的要求,删除本篇文章。你看不到我,你看不到我……………………

    July 24

    新的个人主页诞生了!

          很久没有更新这里了,除了主要因为懒之外,访问Spaces的龟速也让我无法忍受。为了速度我也申请了好几个其他的Blog,包括Google和百度,不过始终觉得不大好用。 不过现在我又找到了一个新的网站:Jimdo。已经忘了什么时候申请的了,现在中文版还处于测试阶段,不过已经觉得很好用了,虽然写Blog没有专门的Blog网站方便,不过自由程度相当不错,可以自己编辑HTML甚至Javascript!最重要的是速度非常快!现在我已经主要使用Jimdo写Blog了,不过这里应该还是不会放弃的,也许以后离开了教育网就可以更快速地访问Spaces,也许M$以后会把服务器搬到中国来。总之这里还是会保留的,只是更新速度会显著变慢。
          最后,欢迎大家到我的新主页做客!
          对了,忘了说主页地址了:http://domain.jimdo.com
    February 19

    菜鸟学写操作系统(1)——Boot Sector

    我的Domain 我的Domain
    我的Domain
          一直都想自己写一个操作系统,可惜入门的书不多,大多是讲理论的,正好现在有本《自己动手写操作系统》,号称最好的入门书,因此想认真看看。鉴于以前看书都是“不求甚解”,很多东西只是“知其然而不知其所以然”,所以这次决定写一下读书笔记,但是书不是自己的,只好写在这里了。
          这本书的确是入门的好书,不过依然需要一些汇编和操作系统的基础。虽然汇编以前学过,但是用的太少,现在也忘得差不错了,需要重新看看。我这里的读书笔记主要是对里面的程序进行注释,每一行都不放过,做到完全理解才行。
          下面就对第一章最简单的引导扇区程序进行注释:

     
    ;%define _BOOT_DEBUG_ ; 做 Boot Sector 时一定将此行注释掉!

    %ifdef _BOOT_DEBUG_
       org  0100h   ; 调试状态, 做成 .COM 文件, 可调试
                    ; COM文件必须开始于0100H。EXE和COM的区别下面再讲(1)
    %else
       org  07c00h   ; Boot 状态,
                     ; Bios 将把 Boot Sector 加载到 0:7C00 处并开始执行
                     ; 引导扇区必须开始于07C00H
    %endif
       mov ax, cs    ; 代码段地址-->AX寄存器
       mov ds, ax    ; 把代码段地址复制到数据段和附加段中
       mov es, ax    ; 这是因为COM程序只有一个段,
                     ; 因此代码、数据和堆栈都是一样的地址(2)
       call DispStr   ; 调用显示字符串例程
       jmp $   ; 无限循环,$在NASM中表示当前行的内存地址
    DispStr:
       mov ax, BootMessage  ; 把要显示的字符串地址复制到AX中,
                            ; NASM中不需要OFFSET
       mov bp, ax   ; ES:BP = 串地址
       mov cx, 16   ; CX = 串长度
       mov ax, 01301h  ; AH = 13,  AL = 01h
       mov bx, 000ch  ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
       mov dl, 0
       int 10h   ; int 10h,调用BIOS的10H中断,
                 ; 前面的BP、CX、AX、BX、DL都是参数(3)
       ret
    BootMessage:  db "Hello, OS world!"
    times  510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
                           ; times是NASM的专用指令,
                           ; 表示把后面定义的0填充当前位置510-($-$$)次
    dw  0xaa55    ; 结束标志,引导扇区必须以0XAA55结尾
     
          (1)COM程序的出现主要是因为当时的内存太小,为了高效利用内存,COM文件都不会超过64K大小。因为80x86中段的大小为64K,因此COM文件就只能拥有一个段,所以代码、数据和附加段都在同一个位置。EXE文件和COM文件的对比如下:
    EXE文件 COM文件
    不限大小 最大64K
    有堆栈段 没有堆栈段
    有数据段 数据段定义在代码段中
    代码段和数据段可以定义在任何偏移地址 代码段和数据段必须开始于0100H
    文件更大(占用更多内存) 文件更小(占用更少内存)
    有文件头(512字节) 没有文件头
          
          (2)前面说道COM文件只有一个段,所以这里CS、DS、SS都有相同的地址,至于为什么不是mov ds, cs之类呢?因为汇编中源操作数和目的操作数不能同时为段寄存器!
          (3)BIOS的10H中断的功能很多,主要是实现视频功能(Video Function)。根据AH的值不同,可以实现多种不同的功能。

    AH 功能
     00 设置视频模式 
    附加寄存器 结果寄存器
    AL=视频模式 没有

    详细视频模式请参考相关资料 

     01 设置光标类型
    附加寄存器 结果寄存器
    CH=光标开始行(0-4比特位) 没有
    CL=光标结束行(0-4比特位)

    其他位必须设置为0,光标的闪烁由硬件控制

    ……
    13 输出字符串 
    附加寄存器 结果寄存器
    AL=输出模式 没有
    ES:BP=字符串地址
    CX=字符数
    DH=开始行位置 
    DL=开始列位置
    BH=页面

    AL=00H,属性在BL中,光标不移动
    AL=01H,属性在BL中,光标移动
    AL=02H,属性在字符后面,光标不移动
    AL=03H,属性在字符后面,光标移动

    对于AL=00或者01,字符属性在BL中定义;
    对于AL=02或者03,字符属性紧跟在字符后面(字符,属性,字符,属性,……)

     

    更详细的中断请参考相关资料吧,太多了,写着累……

    (参考资料:The 80x86 IBM PC and Compatible Computers, Volumes I & II, Fourth Edition)

     
    我的Domain
    我的Domain 我的Domain
    February 14

    情人节

      Web page counters   Hit 
Counter
    又一个情人节到了 ...

    唉!不多说了。

    愿天下有情人终成眷属吧!

     
    January 06

    终于可以上Spaces了

    我的Domain 我的Domain
    我的Domain
          几天前的台湾地震搞得全中国甚至全东亚访问美国网站都成问题,令我想起了上一次台湾地震导致全球电脑配件都涨价,看来台湾地区不仅仅是政治敏感地带,也是全球经济敏感地带啊!虽然说全面恢复要等到1月底才行,不过现在已经大部分网站都可以上了,只是速度还是很慢。M$一直不肯在中国放几个服务器,导致那几天Messager上不去,不知道有多少人受到影响!还好我常用的还是QQ,对我影响不算大。
          这几天一直被考试所烦恼,中间还夹杂着一个网络实验,今天总算告一段落了,虽然还有三门还没有考,不过那几门都不怎么管的了,至多英语还要看一下。对了,还有那个什么自然语言处理还需要交作业,可是只会做第一题,后面的完全不会,看来又要抄了……但是期末的那篇翻译还是要自己做的……我现在都还没有问他要。最重要的还有那本书几乎还没有开始,什么时候才能完成回家呢?……
          最近的RP真是反复无常,爆发的时候你挡都挡不住,没有的时候想找也找不到……去年是我的本命年,虽然我也并没有刻意留意,不过总体来说我还是处处小心,没有和任何人结怨,也尽量力所能及地帮助别人,所以尽管其间也有很多不开心,但是总体还是比较顺利,毕竟考研也成功了。可能老天也看到了我的努力,在最后一天终于送了我一份礼物。
          去年最后一天,全国CIG电子竞技总决赛颁奖晚会在复旦正大体育馆举行。本来我是没有票的,也没有想过要去,因为我好像没有听说有什么人物要来。不过正好师兄有票,我也还没有真正在现场看过比赛,就一起去看了一下。到场时发现原来xiaoT和Fov来了,这才有点兴趣看下去。比赛没有想象中精彩,甚至可以说有些无聊,除了xiaoT第二局牛头的几次震地看起来有点意思之外,其它时间都比较垃圾。期间还有主持人鼓动大家发短信参加互动。从小到大抽奖基本上都和我无缘,我想这次也不例外。不过在师兄的鼓动下,我也就抱着仍几块钱的想法发了一条短信,猜xiaoT夺冠(其实是因为我不知道Fov叫什么名,也没有看见有类似韩国人的名字在上面)。因为整个比赛既没有音乐,也没有解说,看起来真的挺无聊的。期间lily还打电话过来叫我回实验室开门,不过是等她吃饭回来后再回去开。我就一边看节目一边等电话,想不到比赛真的是xiaoT赢了,虽然看起来有点假;更想不到的是比赛之后居然来了一段辣妹艳舞……后来的颁奖更是五花八门,什么游戏都有,很多我都是第一次听说。很快时间就过去了1个多小时,终于到了抽奖的时候。想不到我竟然能够RP大爆发中了大奖——一台手机,OKWAP的OK810。虽然手机比较旧,而且已经停产了,不过130万像素的摄像头还是算不错的,除了不支持Java之外,基本上都比我原来那台鸟手机要好。从台上下来后,我基本上都没有怎么看节目了,除了那个CS视频还不错。得到手机本身我并没有很在意,我在意的是这是否标志着我的好运从此到来?是否意味着07年我可以过得更顺利?虽然一台手机并不能说明什么问题,不过毕竟这也是好的开始,我应该更加积极的面对以后的生活,也许以后会有更大的惊喜等着我。
          一直到过了8点半lily才打电话过来让我回去开门。回来之后自然就要请两位出去吃了一顿,顺便也当庆祝一下元旦。来到那间意大利休闲餐厅,人还挺多,需要排队,好在没多久就轮到了我们。餐厅环境不错,食物也还可以,关键是价格并不贵,感觉吃得还是挺值的。总算我们吃得还挺尽兴的,不过回来的有点晚了,实验室都已经关了门,我连房间的钥匙都留在了实验室,还好门卫那里可以有钥匙开门。
          本以为过了本命年,从此之后就要转运了,可是好像还是老样子,甚至更差了点……就连刻录机也和我作对,刻一张DVD居然用了我一个半小时……后来一件事更让我郁闷了很久。唉!不说也罢……也许我一开始的想法就是错误的……难道真的是那天把RP全部用光了?看来又要重新开始积攒RP了。
          积攒RP除了要好好学习,天天向上之外,还需要看看别人是怎么积攒RP的,所以我去了M$在中国的MSN中心参观,现在应该叫WLC(Windows Live China)了。本以为可以参观他们工作的整个流程,却发现我们只是坐在椅子上听他们一帮人胡说八道,拼命鼓吹自己,贬低别人……不过发现他们的工作环境还是真的不错,起码比起那些挤在一个小房间里工作的台资公司好好得多……乒乓球、桌球、甚至XBox360都有,空间也比较开阔。更重要的是他们工作也比较轻松自由,没有很多的硬性规定,可以自由发挥自己的想法,可以做自己觉得好玩的东西,当然,这一切都需要得到大家的认同才行。虽然他们并没有说什么技术上的创新,不过发现M$的软件开发流程的确和教科书上的有点不一样。没有Authority的PM,崭新的UX,繁重的SDET,这一切都是在书本上学不到的,这也许也是世界一流公司所应该拥有的不一样。不知道我花三年时间来积攒RP能不能换来一个Offer呢?但愿吧!
          嗯,还有很多很多话想说,还是写到日记里面吧,也该洗澡睡觉了。
     
    我的Domain
    我的Domain 我的Domain
    December 26

    Squid代理服务器配置的一些注意事项

    我的Domain 我的Domain
    我的Domain
          Squid是Linux下一个很常用的代理服务器软件。虽然它只支持Http代理,但是凭借良好的性能和稳定性,Squid已经成为了大多数Linux发行版的默认代理服务器。但是和其他很多Linux软件一样,Squid也是居于控制台的,所有设置都是通过配置文件完成,对于习惯了Windows可视化配置的人来说这也是一种挑战。最好的Squid教程就是自带的配置文件squid.conf.default了,但是这个文件很大也很复杂,估计大多数人都没有耐心看完,因此我们还需要Google和Baidu的帮忙。
          前段时间实验室买回来了一台AMD Opteron 270双路双核的曙光服务器,并开通了一个出外网的代理,需要在这台服务器上架设一个二级代理,方便实验室访问国外网站。在配置服务器的过程中遇到了很多问题,还发生了一些小插曲,这些都不说了,只是谈谈配置Squid代理服务器遇到的一些问题。
          首先遇到的问题就是Squid根本跑不起来。从输出文件看到的出错信息显示没有目录写入的权限。但是我当时已经是用root用户登录运行了,而且Squid的Cache目录权限也是root,却还是提示出错。实在不知道什么问题(懒得看squid.conf.default文件),就Google和Baidu一下,原来用root用户运行时,Squid会把自己的effective用户改为squid,但是我的目录权限属于root,系统中也没有squid用户,当然就不能写入了。后来就用chown命令把Cache目录权限改了,并添加了下面两个环境变量:
     
     
    cache_effective_user  ca
    cache_effective_group ca
     
     
          重新启动Squid之后,代理服务器终于运行起来了!
          虽然服务是运行起来了,但是我们这台服务器是不能直接访问国外网站的,它本身也需要通过别的代理服务器出去,因此我们这台代理服务器就是二级代理了。二级代理倒不是很难,Google一下就出来了:
     
     
    cache_peer xxx.xxx.xxx.xxx      parent    3128  0  no-query
     
     
          这样就可以通过上级代理出去了。
          就这样代理服务器运行和一段时间,好像也没有什么多大的问题。不过渐渐发现有些网站访问有问题。最后总结出来的问题就是:访问国外网站的POST方法无法使用。这可是非常严重的问题,因为很多网站都需要提交表单,包括很多论坛登陆都需要提交表单,这样就会有很多网站无法访问了。特别是最近几天需要访问Hotmail邮箱,却老是访问不了,很郁闷。刚开始还以为就是那么几个网站不能访问,因为国内的网站都没有问题,应该是那边给我们的代理有问题。但是回来发现原来所有国外网站都有这个问题,就开始怀疑是不是我这边的配置问题了。
          为了验证花钱买回来的代理是否正常,我就直接登录了服务器,直接在服务器上访问国外网站,发现居然没有任何问题,这就确定了是我这边代理的配置问题。关键时刻还是Google发挥了作用,搜一下“Squid  二级代理 Post”,结果就出来了。原来如果我们之前访问过一些网站之后会在本地留下一些Cache,访问时当然就先访问Cache,没有就直接连接网站访问,这样当然访问不了。为了让Squid每次都通过上级代理访问网站,我们需要修改一个配置参数:
     
     
    never_direct allow all
     
     
          这样就可以强制每次访问所有网站都通过上级代理了。
          至此,目前遇到的问题都解决了。当然Squid的配置很多,想更好地使用,还需要修改更多的配置,这以后有时间再改吧。
     
    我的Domain
    我的Domain 我的Domain
    December 24

    圣诞节到啦!

    『 我的Domain 』   『 返回首页 』 『 给我写信 』 『 编辑日志 』 『 给我留言 』
     
    圣诞快乐!
    Merry Christmas!

        圣诞节终于还是到了!虽然耶稣他老人家从来没有照顾过我(也怪不得他老人家,毕竟我也从来没有祷告过),不过还是要对他说一声:生日快乐!希望你的快乐能够带给更多的人欢乐!

        不知道传说中的圣诞老人今晚会不会出现?嗯,应该把最臭的袜子钉在床头,当圣诞老人过来送礼物时可以把他熏晕,礼物就都归我了。这个建议够贱吧?但是宿舍并没有烟囱,老人家从哪里进来呢?总不会破门而入吧,那就成了强盗了!难道、难道是……下水道?

        和往常一样,今晚的平安夜依然只能是平静地安坐在电脑面前,所不同的是由宿舍搬到了实验室,身边的人也换了一批又一批,然而不变的还是那个孤独寂寞,还带着点无聊郁闷的心……

        每个人都有自己的烦恼,也许本命年就是烦恼最集中的一年,好在今年也就要过去了,新的一年即将来临,生活也一定会有新的开始。前途是光明的,只是路还是要自己一步一个脚印地走下去。

        嗯,还是不要想太多,积极面对新的挑战吧!

     
     
    December 22

    Merry Christmas

    『 我的Domain 』

    Merry Christmas!

    圣诞快乐!

        圣诞节又要到了,虽然我没有过节的习惯,但是还是要说一声的!另外今天也是冬至,就一起庆祝了吧!

        新的一年又要到来了,我的本命年也要过去了,期待新的一年有新的生活!

        总之,祝大家都天天开心,永远幸福!

    December 16

    我的Spaces也可以换肤了

    我的Domain 我的Domain
    我的Domain
          好不容易在网上找到了一个和我这个主题相配的模板,经过一个晚上的PS和DW,终于完成了现在的皮肤。虽然图片制作的有点粗糙,不过总比原来的要好看多了,只是以后发布日志的时候稍有麻烦。
          大家对这个皮肤有什么意见提出来啊。

      对于Spaces不能添加类别的问题令我一直很郁闷,只要一点击添加类别页面就跳转的首页。不过今天终于发现了一种肯定可以的方法,就是直接在地址栏输入JS代码。查看添加日志的网页源代码,可以发现添加类别是这样的一段代码:

     
    onclick="Spaces.Blog.Entry.AddNewCategory('',128); return false;"
     

          因此我们就可以很简单的在地址栏输入:

     
    javascript:Spaces.Blog.Entry.AddNewCategory('',128);
     

       只要在单引号里面输入想要的类别,回车之后就可以看见添加类别的对话框出来了,确定就行了。我现在这几个类别都是这样添加的。
    我的Domain
    我的Domain 我的Domain
    December 15

    又一年了

    我的Domain 我的Domain
    我的Domain
         原来昨天是农历10月24日,又忘了。上个星期还记得,可到了这一天还是忘了,毕竟没有这个习惯。要不是妈妈在网上提醒我,这一天也就这样过去了。
         想不到这么快就又一年了。长大了,才明白什么叫“光阴似箭”。时间真的是在飞逝,光速都赶不上,更不用说骑我那辆破车追赶了……
         来到上海差不多4个月了,虽然饭堂的菜还是那么难吃,但是我也基本上已经吃得麻木了。天气也没有想象中冷,令我最郁闷的下午一点半上课也已经习惯了。其他方面也基本上适应了过来。只是现在的生活比起以前更加单调,就是宿舍——实验室——饭堂三点一线,当然偶尔还是要去一下教室……每天从早到晚对着电脑,的确很无聊,好在实验室还有一些常驻人口,虽然不多,但是总能聊聊天,解解闷,一起发发牢骚。研究生的课好像从来就是那么随便,一进校门我们研一的就受到了师兄们的教化(毒害?),“研究生考试,走走过场而已”。从此,我就把中午睡觉的时间搬到了教室……
         这个学期也临近结束,烦心的事也就多了起来。作业、考试、项目……样样都让人心烦。
         一学期积累下来的作业终于要交了,有一些连题目都忘了,更别说会做了。IR的Project虽然不是我负责,我做的部分也没有什么技术含量,不过下周三就要上台演示了,目前却连个框架都还没有出来。但是小组长都不急,我又需要急什么呢?
         要来的始终逃不掉,考试也终于要来了。虽然考试并不重要,但是还是要看看书的,问题就在于我现在还有一门课连书都没有,上课也只是去会周公而已……看来也只能临时抱一下佛脚了,希望佛祖保佑……
         最烦的还是那本书。唉,不说也罢!
         新的一年很快就要来了,不知道会不会有新的气象?
    我的Domain
    我的Domain 我的Domain
    December 12

    比较Google Blogger和Live Spaces

    我的Domain 我的Domain
    我的Domain
         今天我才发现原来Blogger是Google的,也就顺便注册看了看。发现Blogger的速度挺快的!相对于慢如蜗牛的Live Spaces,Blogger真的是比兔子还快
         注册的时候还是没有抢到domain和dorice的名字,不过还好抢到了mydorice,和Live Spaces一致。注册进去发现显示不如Spaces直观,但是却有很大的灵活性,可以定制自己的模板,再也不用看千篇一律的Blog了,不过这还需要一点美工和网页编程基础才行。我没有多少美术细胞,自然就选择了现有的模板了。看起来还不错,只是最上面的搜索条太难看了,破坏了全局的布局。Blogger没有什么模块提供,一切都需要自己解决,只提供了很基本的Blog功能,这点比起Spaces来有点差距。另外本地化还不够,中文显示很不舒服,不符合中文习惯,所以我还是选择了英文显示。不过Blogger里面有一项功能还是很不错的,就是可以设置评论的“字符确认”,可以很大程度上避免那些自动广告程序的骚扰。当然还有很多其他的设置也不错。还有一个很有特色的功能就是支持团队Blog。可以添加多个团队成员来共同维护Blog,非常适合作为项目组的Blog。另外还可以直接申请Google AdSense广告赚钱,可惜我的Blog流量太少了……
         而对于Spaces,提供了大量的现有模块,很适合作为懒人一族(例如我)的Blog。只需要用鼠标点几下就可以实现很多功能,并且还有大量模块正在添加,如强大的PowerToys模块可以实现很多功能,我这里就用了里面隐藏的一个Custom HTML模块来实现计数器功能。但是速度是Spaces最大的问题,另外也不够灵活,有很多限制,搞得所有Spaces都长得差不多,很没个性。而且Spaces的广告比起Blogger来大很多……不过M$目前还是老大,跟着他走应该还是不错的。
         总之,想偷懒就用Spaces,想漂亮就用Blogger。看来我还是暂时用Spaces吧。
    我的Domain
    我的Domain 我的Domain
    December 09

    继续修正weather.js脚本

    我的Domain 我的Domain
    我的Domain
         自从脚本上传到远景论坛后,大家反应不错,也反映了不少错误,我自己也找到一些,今天再次看了看脚本,发现自己犯了一些低级错误,一些本应该是float类型的数据没有转换过来,还是字符串类型,导致后面的计算错误,所以不能显示晚上的月亮。现在已经把这个bug修正了。不过另外一个bug就不怎么好找了,就是设置不能保存。我现在还不能确定是什么原因,因为脚本调试比较困难,现在最好的方法就是直接修改localizedStrings.js文件里面的设置,改为自己地区的代码后,就不用每次重新启动重新设置了。
         另外也有人反映不能自动更新,这个我还没有确定,我是设置1个小时更新一次,不过就算一个小时更新一次也不一定有新的数据,如果服务器没有更新当然就不会更新了,所以这个测试起来需要有些耐心,让电脑从早到晚开着,看看早上和晚上有没有不同就知道了
         不过现在时间也不多了,可能我只会把保存问题解决掉,以后就要等很长一点时间才能在此修正了。

         原来不是不能保存,而是只能保存当前实例,如果关闭了当前Gadgets,添加一个新的,那个新的将会使用默认值,而不是上一个实例的设置!这是微软的API设置的,除非自己写一个保存的函数。我觉得这样挺好的,这样我就可以同时使用多个Gadgets,每个都使用不用的设置,互不干涉。另外也把部分字符串汉化了,但是还没有完全汉化,其实应该根据SkyCode来汉化的,不过因为SkyCode不够直观,所以也就懒得改了。最后证实是可以自动更新的。到此为止,虽然还有一些小细节有问题,不过已经不影响使用了,就这样先放下,以后有时间自己做一个Gadgets,使用中央气象台的信息更准确。不过到时微软应该已经开放了其他地区的服务了。
    我的Domain
    我的Domain 我的Domain
    December 08

    终于把vista的天气预报破解了

    我的Domain 我的Domain
    我的Domain
    其实也不是很难,就是绕过dll的检测,自己写js脚本读取网上的数据。昨天那些莫名其妙的问题居然是因为变量的声明位置造成的。同样是全局变量,至今没有想明白为什么放在最前面反而不行。另外对于用js异步读取xml还不熟悉,修改了原来代码的一些判断来修正读取数据时提示“服务不可用”的错误。搜索也可以用了。下次看看是不是该把他汉化一下。文件下载可以到这里:
    我的Domain
    我的Domain 我的Domain

    对vista中weather.js的分析

    我的Domain 我的Domain
    我的Domain
          安装好的vista一直不能用sidebar的天气预报功能,感到很不爽。经过对weather.js文件的分析,初步知道原因所在。就像前几天说的那样,是因为wlsrvc.dll文件检查到系统区域设置为中国,因此直接提示不能使用这个功能,完全没有去抓取网站。其实如果我们自己根据网址在浏览器中输入,是可以得到天气预报信息的。这样就想到了几种解决办法。
    1. 更改系统区域设置为美国等。这样可以直接使用天气预报功能,不过对中文支持有问题,这样当然不可取;
    2. 替换wlsrvc.dll文件。可以替换早期版本的,也可以自己重新写一个,不过这样会破坏这个文件的其它功能,也不可取;
    3. 修改weather.js等文件。这个就是我要做的工作。

         经过分析这个js文件,关键在下面几句中:


      try
      {  
        // Connect to Weather Service .dll
        var oMSN = new ActiveXObject("wlsrvc.WLServices");
        this.oMSN = oMSN.GetService("weather");
      }
      catch (objException)
      {
        this.isValid = false;
        this.statusMessage = getLocalizedString('ServiceNotAvailable');
        this.oMSN = new Object();
      }

     

         这里就是调用dll的地方,在这里会返回1506,就是ServiceNotAvailableInYourArea。因此需要替换掉这段代码。
         根据分析对象oMSN的使用情况,可以找到oMSN对象的成员有哪些,这样就可以自己写一个对象替换掉这个。里面最主要的是SearchByCode函数和onDataReady事件。只要把这两个写出来,基本上就可以修改成功。可惜我对JavaScript的研究不深,写出来的代码可能不好看,冗余代码也可能会多,不过能够达到效果就好。在这里,我主要是使用Microsoft.XMLDOM对象来对网站上的xml数据进行分析,然后把需要的数据放在另一个WeatherData类中。当数据都得到后,触发onDataReady事件,更新显示数据。这里面的prototype还是我刚刚学会的,主要是用来实现类似C++的虚函数功能。下面就是我添加的代码:


    function convert(degree)
    {
     return (isNaN(degree)?0:((degree - 32) / 1.8).toFixed(0));
    }

    function toChineseDay(day)
    {
     var retVal = day;
     switch(day)
     {
      case ("Sunday"):
        retVal = "星期天";
        break;
      case ("Monday"):
        retVal = "星期一";
        break;
      case ("Tuesday"):
        retVal = "星期二";
        break;
      case ("Wednesday"):
        retVal = "星期三";
        break;
      case ("Thursday"):
        retVal = "星期四";
        break;
      case ("Friday"):
        retVal = "星期五";
        break;
      case ("Saturday"):
        retVal = "星期六";
        break;
      default:
        break;
     }
     return retVal;
    }

    function toChineseString(str)
    {
     var retVal = str;
     switch (str)
     {
      case ("Clear"): case ("Fair"): case ("AM Sun"): case ("PM Sun"):
        retVal = "晴";
        break;
      case ("Cloudy"): case ("PM Clouds"): case ("AM Clouds"):
        retVal = "阴";
        break;
      case ("Mostly Cloudy"): case ("Partly Cloudy"):
        retVal = "多云";
        break;
      case ("Showers"):
        retVal = "阵雨";
        break;
      case ("Sprinkles"): case ("PM Rain"): case ("AM Rain"):
        retVal = "小雨";
        break;
      case ("Cloudy / PM Sun"): case ("Cloudy / AM Sun"):
        retVal = "阴转晴";
        break;
      case ("Showers / Clear"):
        retVal = "小雨转晴";
        break;
      case ("Scattered Flurries"):
        retVal = "分散小雪";
        break;
      case ("Not Available"):
        retVal = "没有信息";
        break;
      default:
        break;
     }
     return retVal;
    }

    function ForeCastData()
    {
     var SkyCode;
     var SkyText;
     var High;
     var Low;
     var Date;
     var Day;
    }

    function ForeCastArray(n)
    {
     for(var i = 0; i < n; i++)
     this[i] = new ForeCastData();
    }

    function WeatherData()
    {
     var RetCode = 0;
     var Latitude;
     var Longitude;
     var SkyCode;
     var RequestPending;
     var Location;
     var SkyText;
     var Temperature;
     var Attribution2;
     var Url;
     var ForeCastA = new ForeCastArray(5);
     var Count = 0;

     this.item = function(i) {
      return this;
     }
     this.makeForeCast = function(i, c, t, h, l, dt, dy) {
      ForeCastA[i].SkyCode = c;
      ForeCastA[i].SkyText = t;
      ForeCastA[i].High    = h;
      ForeCastA[i].Low     = l;
      ForeCastA[i].Date    = dt;
      ForeCastA[i].Day     = dy;
     }
     this.ForeCast = function(i) {
      return ForeCastA[i];
     }
    }

    function MSNWeather(){
     var RequestPending = false;
     var RefreshInterval = 60;
     var Celsius = true;
    }

    MSNWeather.prototype={
     SearchByCode:function(locCode){
      var self = this;
      var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async=true;
      xmlDoc.onreadystatechange = function() {
       if (xmlDoc.readyState == 4)
       {
        if(xmlDoc.parseError.errorCode != 0)
        {

        }
        else
        {
         var wdata = new WeatherData();
         wdata.Latitude    = parseFloat(xmlDoc.selectSingleNode("/weatherdata/weather/@lat").value);
         wdata.Longitude   = parseFloat(xmlDoc.selectSingleNode("/weatherdata/weather/@long").value);
         wdata.Location    = xmlDoc.selectSingleNode("/weatherdata/weather/@weatherlocationname").value;
         wdata.Attribution = xmlDoc.selectSingleNode("/weatherdata/weather/@attribution").value;
         wdata.Attribution2= xmlDoc.selectSingleNode("/weatherdata/weather/@attribution2").value;
         wdata.Url         = xmlDoc.selectSingleNode("/weatherdata/weather/@url").value;
         wdata.SkyCode     = parseInt(xmlDoc.selectSingleNode("/weatherdata/weather/current/@skycode").value);
         wdata.SkyText     = toChineseString(xmlDoc.selectSingleNode("/weatherdata/weather/current/@skytext").value);
         wdata.Temperature = parseInt(xmlDoc.selectSingleNode("/weatherdata/weather/current/@temperature").value);
         wdata.Temperature = isNaN(wdata.Temperature)?0:wdata.Temperature;
         if (self.Celsius)
           wdata.Temperature = convert(wdata.Temperature);
         for (var i = 1; i <= 5; i++)
         {
          var node = xmlDoc.documentElement.childNodes[0].childNodes[i];
          var SkyCode = parseInt(node.getAttribute("skycodeday"));
          var SkyText = toChineseString(node.getAttribute("skytextday"));
          var High    = node.getAttribute("high");
          if (self.Celsius)
            High = convert(parseInt(High));
          var Low     = node.getAttribute("low");
          if (self.Celsius)
            Low = convert(parseInt(Low));
          var Date    = node.getAttribute("date");
          var Day     = toChineseDay(node.getAttribute("day"));
          wdata.makeForeCast(i-1, SkyCode, SkyText, High, Low, Date, Day);
         }
         wdata.RetCode = 200;
         wdata.Count = 1;
         self.OnDataReady(wdata);
        }
       }
      };
      xmlDoc.load("http://weather.service.msn.com/data.aspx?src=vista&wealocations="+locCode);
     },
     OnDataReady:function(data){}
    }

     


         然而很可惜,事情并没有到此就解决了。虽然我把这段代码单独出来是没问题的,可以得到需要的所有数据,但是放回如来的weather.js文件的时候,居然提示SearchByCode没有声明,搞得我很郁闷。只要解决这个问题,应该就可以用了。
         时间不早了,明天继续研究。

    我的Domain
    我的Domain 我的Domain
    December 04

    终于把vista的声卡搞定了!

    我的Domain 我的Domain
    我的Domain
          装了vista中文版后,一直没怎么用,因为声卡装了驱动也没有声音,搞得我很郁闷,所有方法都用尽了还是没有反应,最后在远景论坛中有位网友提醒我,把驱动装回9月28日的测试版就行了,试了一下果真如此,旧版的测试驱动居然比新版的正式驱动还要好,真是@##!%#$#@$%……
          不过还有很多软件兼容性不好,如常见的QQ/TM到现在还没有vista版本,只能把键盘加密文件删除再用,FlashGet1.8be有时候会停止响应,kmplayer和超星阅览器要以管理员权限运行,K-Lite Mega Codec Pack v1.61安装的时候提示有些dll不能注册,而且已经是以管理员权限运行,不知道是不是要以Administrator身份登陆运行。不过好像还是可以用,Media Player已经可以播放大部分视频了。
          另外,Windows Sidebar的天气预报还是不能用,根据大家的分析,应该是wlsrvc.dll里面屏蔽了美国以外的地区使用,不过它所指向的网站还是可以提供中国的天气预报的。它所获取天气的网址是:
          搜索地址是:
          这个是上海的天气预报。返回如下xml数据:

     
    <?xml version="1.0" ?>
    - <weatherdata>
    - <weather weatherlocationcode="wc:CHXX0116" weatherlocationname="Shanghai, CHN" zipcode="" url="http://weather.msn.com/local.aspx?wealocations=wc:CHXX0116" imagerelativeurl="http://st.msn.com/as/wea3/i/en-US/" degreetype="F" provider="Foreca" attribution="Data provided by Foreca" attribution2="? Foreca" lat="31.235189399999999" long="121.4837418" timezone="8" alert="">
      <current temperature="52" skycode="31" skytext="Clear" date="2006-12-04" day="Monday" observationtime="18:00:00" observationpoint="Shanghai / Hongqiao" feelslike="52" humidity="50" windspeed="4" winddisplay="4 mph" />
      <forecast low="43" high="51" skycodeday="34" skytextday="Fair" date="2006-12-04" day="Monday" precip="20" />
      <forecast low="51" high="56" skycodeday="11" skytextday="PM Rain" date="2006-12-05" day="Tuesday" precip="35" />
      <forecast low="55" high="63" skycodeday="39" skytextday="Showers / Clear" date="2006-12-06" day="Wednesday" precip="95" />
      <forecast low="52" high="58" skycodeday="11" skytextday="PM Rain" date="2006-12-07" day="Thursday" precip="85" />
      <forecast low="52" high="57" skycodeday="11" skytextday="PM Rain" date="2006-12-08" day="Friday" precip="65" />
      <toolbar timewindow="60" minversion="1.0.1965.0" />
    </weather>
    </weatherdata>

     
    我的Domain
    我的Domain 我的Domain
    我的Domain 我的Domain
    我的Domain
          这个周末还真是无聊,本来就人气不旺的实验室还有两个人回家冬眠了,就显得更加冷清了。期间还发生了一件比较郁闷的事(还是不说了)。还好每天晚上还有中韩对抗赛看,不过也是看的很郁闷,半决赛两个中国的都输了,不知道传说中的冒泡赛是怎样的。
    今天去大润发也很郁闷,买的苹果在里面没发现哪里可以称,结帐的时候说没称过不能结帐。另外想买的手套也说没有条形码不能结帐。结果什么都没有买到……
          最郁闷的还是这本教材的编写啊!我负责的“多处理机与互连网络”部分几乎完全被否定了,陷入了无限迷茫中……本身才是研一,还要我们编写研究生教材,质量能够保证吗?这学期所剩时间不多了,又还要准备考试,看来只能天天在郁闷中度过啊!
          说到考试,也是一件郁闷的事。这学期的《信息检索》和《自然语言处理》都是相当痛苦的。虽然是每节课都去上,但是后期基本上完全不知道在说什么,一大堆数学加算法,只能每节课都睡觉了……
    时间不早了,又要回去睡觉了,明天还要上英语呢!
          唉,郁闷的周末,郁闷的生活……
    我的Domain
    我的Domain 我的Domain
    December 02

    听说Word2007可以写Blog?

    我的Domain 我的Domain
    我的Domain

    试一下,看看好不好用。M$帮助在这里:http://office.microsoft.com/zh-cn/word/HA101640212052.aspx

    感觉不如网页上直接写爽,不过可以通过手机写Blog倒是很不错,虽然我没有钱手机上网

    我的Domain
    我的Domain 我的Domain

    添加了留言板

    我的Domain 我的Domain
    我的Domain
    一个很酷的留言板!还有日记、相册等,很不错。原来Spaces还有很多东西不知道,这里有不少技巧:
    只是有一个农历的Gadgets一直添加不上去,只能添加到live中。
    有时间再把Spaces重新排一下。
    PS:顺便把这个日志当作留言板吧
    我的Domain
    我的Domain 我的Domain

    终于装上了Vista!

    我的Domain 我的Domain
    我的Domain
    装的是32位的,64位不能在32位的xp中安装,看来只能刻盘了。
    不过我的声卡依然没有任何动静,虽然驱动已经安装了。
    天气服务还是不能启动,可能要等到明年1月份正式发布个人版的时候才能用。
    系统的评分只有3.1,显卡拖了后腿,1G内存也感觉不够,输入法在IE中有时候会无法使用!
    看来问题还比较多,还是要等一段时间才能取代XP。
    我的Domain
    我的Domain 我的Domain
    December 01

    图片分类不能删除?

    我的Domain 我的Domain
    我的Domain
    不小心点击多了一下,怎么没发现在哪里删除呢?
    不过发现spaces的速度还可以嘛!
    我的Domain
    我的Domain 我的Domain