A's profileXA's DocumentsPhotosBlogListsMore Tools Help

Blog


    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)