Archive

Archive for October, 2010

I am 18 years old, 0x18!

October 31, 2010 1 comment

I am 18 years old the day before yesterday. it’s not a joke, and it’s in ox.

 

Categories: My Free Mind Tags:

旧的还在

已经快一个月没有写日记了, 主要原因是这期间我在平度, 没有带自己的电脑, 不带电脑是因为我的电脑快坏了. 在一件东西没有彻底坏掉之前我怎么有心情思考新的东西, 即使那件东西明明已经块不属于我了.

Categories: 琐事 Tags:

淫淫的那点事

 

今天非常惊异的收到了一封邮件, 内容如下:

    很明显这是一个淫淫网发来的邮件, 但是@xiaonei-inc.com的后缀倒是另有有点新奇. 本来这是一个平常不多的一封提醒有新好友请求权的邮件, 但是看了要求人名字以后我有点奇怪了, 这个人已经在关系网络之内了, 但是为何有在提醒.

    当我点击链接之后居然出现的事注册的界面, 这让我大惑不解, 难道链接中那一大串十六进制的字符串还不能验证我的身份, 应该直接直接看信息才对啊, 我仔细斟酌了一下, 当我想到这个我得一个gmail邮箱的时候, 我才真正的惊愕了, 因为这个邮箱是我的私人邮箱, 只透漏给我的亲朋好友, 从来没有在其他地方透漏过, 更没有用这个邮箱注册过淫淫. 我可以下定一个结论, 这是淫淫的一个欺骗行为.

    上面图像中的标题中显示有一条待处理的信息, 而且是在线的, 这与我唯一的一个淫淫号当时的状态时明显不服的, 如下她并没有在线.

    在我又一次登录淫淫后, 自动跳出来下满的提示, 显示有新的功能:通讯录, 我的gmail收到那等邮件的过程应该是这样的: 1. 我的好友刘xx启用了这个功能, 把通信录导入到淫淫, 然后人人诱骗她向所有的邮箱地址发送邀请加入淫淫的邮件, 于是我就收到了这样的邮件.

    我看淫淫不亚于当年的99舍了. 太不要脸了.

 

 

 

 
Categories: My Free Mind Tags:

[Repost] 31 things I wish I’d known about dating when I was 21

[Editor’s note: Erin Meanley is the female half of the Glamour.com dating blog, Single-ish. This is an excerpt from that blog.]

I never realized how many opinions I have about dating. I’ve been dating so long I’m like an octogenarian who feels overly strong about what strawberries should cost or how children should act in public. Anyway, here are some things I’ve learned in my 31 years, and what I wish I’d known about dating ten years ago:

1. If you’re confused about whether a guy likes you or not, that’s probably not good. Confusion in romance belongs only in romantic comedies because it suspends the plot, but suspense in real life sucks. So try not to analyze the events. The truth will reveal itself without you having to do anything.

2. Sometimes guys flirt with you or pay attention to you because it makes them feel good about themselves. (Hey, we do it, too.)

3. Even a guy who will admit that you’re better looking than him should still be able to tell you you’re beautiful. If he holds back in order to control the situation, or to keep you, or keep you down, he’s got issues.

4. Don’t help him ask you out by texting him something nice or polite. I’m glad you’re more outgoing and thoughtful than he is, but he doesn’t want the help.

5. Guys want to get busy more than anything. They’ll say anything to close the deal.

6. It’s shocking how much guys will talk about marriage. Until there’s a ring on your finger, it will be better for you if you pretend you’re deaf.

7. It’s better not to lift a finger in the beginning.

8. In the early stages, giving him presents is too much. Generosity looks desperate to guys. You may be a great shopper and gift-wrapper; it may be his birthday and you may be wild about birthdays — even still, he’ll think you’re just wild about him. Too wild.

9. Guys just do not think like girls. I wish I’d had a brother. Real boys are nothing like the boys in movies.

10. They might take a decade to mature. Don’t hope they’ll grow up or be ready in the next six months.

11. Even if your family thinks there’s going to be a marriage, don’t let them spoil your guy. Yes, he’s grateful you gave him your car when he moved out of NYC, but he would rather have had to work for it.

12. Learn to cook. Learn to cook well. I see now that it would have won me a lot of points. A LOT.

13. Just because he might be smarter than you or more talented at certain things doesn’t mean he’s your servant and won’t mind doing all your homework/research/chores.

14. Guys get resentful, too.

15. You’re special, unique, and important, but you’re not a princess — no matter what Daddy says (although for the record, my dad calls me "Erin").

16. It’s okay to say no. It’s more than okay. It’s always okay. If he stops calling (and many, many, many will), you’re only weeding out the guys who aren’t truly interested in you as a person. Time saved!

17. Playing it safe guarantees you’ll have more time and energy to think about your grades or your work. Less drama in your life will always be better and healthier for you.

18. You deserve to be treated like a human being.

19. Your wants and needs are just as important as his, and if you don’t express them because you think it will scare him away, then you’re saying you don’t count as much as he does.

20. Even sophisticated people with professional jobs can have tempers or hit you or use foul language. I’ve known men who dressed like diplomats but they were ugly human beings.

21. You can’t force chemistry. If you like him as a friend, the attraction might grow, but if it doesn’t, don’t force it. And don’t waste his time.

22. Ease up on the sauce. Alcohol clouds your judgment.

23. No boyfriend-girlfriend relationship starts with a 1 a.m. booty text.

24. When a guy has taken you to Applebee’s five times and you say you want to treat him, he’ll be psyched. But secretly he’ll freak out if you take him to Ruth’s Chris, even just the one teeny time. Don’t try to match him one Ruth’s Chris for five Applebee’s. Take him out, but go to T.G.I. Friday’s.

25. Women love attention. A guy needs to be pretty crazy about you in order for him to pay enough attention to make you happy long-term.

26. My mom always said, "Men don’t think." I thought she meant, "They are mistaken in their thoughts." But they’re just not thinking anything at all. About you. They’re watching the game. That’s why they haven’t called.

27. There should be a medium ground between workaholism and his absolute devotion. "The knight departing for new adventures offends his lady, yet she has nothing but contempt for him if he remains at her feet" (Simone de Beauvoir, The Second Sex, 658).

28. Never underestimate the quality of "interesting." Men want someone interesting. They really do. Find some hobbies.

29. What are you hoping to gain by hooking up with this guy? If the answer is "him," that’s a bad deal for you. "The woman gives herself, the man adds to himself by taking her" (de Beauvoir 659).

30. Expectations? They’ll ruin every dating experience you have.

31. You will never understand men. Just try to understand yourself.

Categories: Sentiment

ArcGIS: Lock request conflicts with an established lock

sdemoin –o –info –t users

sdemoin –o kill –t xx

Categories: Code Tags:

[转发]面向对象设计(OOD)思想(C#)

有了思想才能飞翔,缺乏灵活就象少了轮子的汽车,难以飞奔。为了更好的理解设计思想,结合一个尽可能简洁的实例来说明OOD、设计模式及重构。通过下面的代码,详细地阐述面向对象设计思想。
一、传统过程化设计思想
假定我们要设计一个媒体播放器(只从软件设计的角度,不涉及硬件)。该媒体播放器目前只支持音频文件mp3和wav。按照结构化设计思想,设计出来的播放器的代码如下:
public class MediaPlayer
{  
   private void PlayMp3()
   {
      MessageBox.Show("Play the mp3 file.");
   }
 
   private void PlayWav()
   {
      MessageBox.Show("Play the wav file.");
   }
 
   public void Play(string audioType)
   {     
      switch (audioType.ToLower())
      {
          case ("mp3"):
             PlayMp3();
             break;
          case ("wav"):
             PlayWav();
             break;            
      }     
   }
}
从传统的过程化设计思想来看,这是一段既实用又简洁的代码。
如果,客户又提出新的要求:要播放器不仅仅播放mp3和wav文件,还要播放其他音频文件如wma、mp4等,为此我们要不断地增加相应地播放方法和修改条件语句,直止条件语句足够长。
如果,客户感到这个媒体播放器功能太少了,只能闻其声,不能见其人,太单一。如果在听着优美音乐的同时又能看到歌唱者潇洒、英俊的舞姿那就更好了。从代码设计的角度看,他们希望媒体播放器支持视频文件了。也许你会想,不会再增加视频这方面的代码,可以,在增加视频媒体的播放方法,在修改条件判断语句,如果还有其他,还可以同样地增加、修改。到此你也许会提出,要是不修改或很少修改原来的代码就能增添其他功能该多好啊!
这样看,原来的软件设计结构似乎有点问题。事实上,随着功能的不断增加,你越来越发现这个设计非常的糟糕,因为它根本没有为未来的需求变更提供最起码的扩展。为了应接不暇的变更需求,你不得不不厌其烦地修改原来的代码,使其适应需求变化,甚至在修改代码时,由于过多的代码依赖关系弄得人焦头烂额,直止一塌糊涂。
二、面向对象设计思想
还是以设计一个媒体播放器为例,设计要求相同。不访我们换个设计思路利用面向对象设计思想(OOD)来做做看如何!
根据OOD的思想,我们应该把mp3和wav分别看作是两个独立的对象。代码设计如下:
public class MP3
{
   public void Play()
   {
       MessageBox.Show("Play the mp3 file.");
   }
}
 
public class WAV
{
   public void Play()
   {
       MessageBox.Show("Play the wav file.");
   }
}
 
Public class MediaPlayer
{
      switch (audioType.ToLower())
      {
          case ("mp3"):
                      MP3 m = new MP3();
             m.Play();
             break;
          case ("wav"):
             WAV w = new WAV();
w.Play();
             break;            
      }
}    
       现在我们重构代码,建立统一的Play()方法,(在后面的设计中,你会发现这样改名是多么的重要!)更改媒体播放类MediaPlayer的代码。如果这样的设计代码,实质上没有多大的变化,只是对原来过程化设计思想的一种替代,并没有击中要害,亦然没有灵活性、可扩展性。
       2.1单向分派技术的应用(在这里用类的多态来实现的)
我们不访这样设想:既然mp3和wav都属于音频文件,都具有音频文件的共性,应该建立一个共同的AudioMedia父类。
public class AudioMedia
{
   public void Play()
   {
       MessageBox.Show("Play the AudioMedia file.");
   }
}
现在引入继承思想,OOD就有点雏形了(不是说有了继承就有了OOD思想,这里只是从继承的角度谈一谈OOD思想,当然从其他角度如合成、聚合等角度也能很好地体现OOD思想)。
其实在现实生活中,我们的播放器播放的只能是某种具体类型的音频文件如mp3,因此这个AudioMedia类只能是音频媒体的一个抽象化概念,并没有实际的使用情况。对应在OOD设计中,既这个类永远不会被实例化。为此我们应将其改为抽象类,如下:
public abstract class AudioMedia
{
   public abstract void Play();
}
 
public class MP3:AudioMedia
{
   public override void Play()
   {
       MessageBox.Show("Play the mp3 file.");
   }
}
 
public class WAV:AudioMedia
{
   public override void Play()
   {
       MessageBox.Show("Play the wav file.");
   }
}
 
public class MediaPlayer

       //根据需要完成任务的单向分派
   public void Play(AudioMedia media)
   {     
       media.Play();
   }
}
到此,我们通过单向分派技术使OOD思想得到进一步的体现。现在的设计,即满足了类之间的层次关系,又保证了类的最小化原则,同时又体现了面向对象设计原则(开—闭原则、里氏代换原则)更利于扩展。(止此,你会发现play方法名的更改是多么必要)。
如果现在又增加了对WMA、MP4等音频文件的播放,只需要设计WMA类,MP4类,并继承AudioMedia,在相应的子类中重写Play方法就可以了,MediaPlayer类对象的Play方法根本不用任何改变。
如果让媒体播放器能够支持视频文件,必须另外设计视频媒体的类。因视频文件和音频文件有很多不同的地方,不可能让视频继承音频。假设我们播放器支持RM和MPEG格式的视频。视频类代码如下:
public abstract class VideoMedia
{
   public abstract void Play();
}
 
public class RM:VideoMedia
{
   public override void Play()
   {
       MessageBox.Show("Play the rm file.");
   }
}
 
public class MPEG:VideoMedia
{
   public override void Play()
   {
       MessageBox.Show("Play the mpeg file.");
   }
}
 
这样设计还是有点糟糕,这样就无法实用原有的MediaPlayer类了。因为你要播放的视频RM文件并不是音频媒体AudioMedia的子类。
       不过,我们可以这样想,无论音频媒体还是视频媒体都是媒体,有很多相似的功能,如播放、暂停、停止等,为此我们把“媒体”这个概念抽象出来做为一个接口。(虽然也可以用抽象类,但在C#里只支持类的单继承,不过c#支持接口的多继承)。根据接口的定义,你完全可以将相同功能的一系列对象实现同一个接口。让音频媒体类及视频媒体类都继承媒体这个接口。代码如下:
 
public interface IMedia
{
   void Play();
}
 
public abstract class AudioMedia:IMedia
{
   public abstract void Play();
}
 
public abstract class VideoMedia:IMedia
{
   public abstract void Play();
}
 
这样再更改MediaPlayer类的代码:
public class MediaPlayer

   public void Play(IMedia media)
   {     
       media.Play();
   } 
}
       现在看来,程序是不是有很大的灵活性和可扩展性了。
总结一下,从MediaPlayer类的演变,我们可以得出这样一个结论:在调用类对象的属性和方法时,尽量避免将具体类对象作为传递参数,而应传递其抽象对象,更好地是传递接口,将实际的调用和具体对象完全剥离开,这样可以很好地体现了软件工程的灵活性、扩展性。
       现在看起来似乎很完美了,但我们忽略了MediaPlayer的调用者这个事实。仍然需要条件语句来实现。例如,在客户端程序代码中,用户通过选择cbbMediaType组合框的选项,决定播放音频媒体还是视频媒体,然后单击Play按钮执行。
Public void BtnPlay_Click(object sender,EventArgs e)
{
    IMedia media = null;
    switch (cbbMediaType.SelectItem.ToString().ToLower())
    {
        case ("mp3"):
             media = new MP3();
             break;
                      //其它类型略;
        case ("rm"):
             media = new RM();
             break;  
        //其它类型略;
    }
    MediaPlayer player = new MediaPlayer();
    player.Play(media);
}
 
2.2设计模式、条件外置及反射技术的应用
随着需求的增加,程序将会越来越复杂。此时就应调整设计思想,充分考虑到代码的重构和设计模式的应用。最后当设计渐趋完美后,你会发现,即使需求不断增加,你也可以神清气爽,不用为代码设计而烦恼了。
为了实现软件工程的三个主要目标:重用性、灵活性和扩展性。我们不访用设计模式、条件外置及反射来实现。
使用工厂模式,能够很好地根据需要,调用不同的对象(即动态调用),保证了代码的灵活性。
虽然这里有两种不同类型的媒体AudioMedia和VideoMedia(以后可能更多),但它们同时又都实现IMedia接口,所以我们可以将其视为一种产品。媒体工厂接口如下:
public interface IMediaFactory
{
   IMedia CreateMedia();
}
 
然后为具体的媒体文件对象搭建工厂,并统一实现媒体工厂接口:
public class MP3Factory:IMediaFactory
{
   public IMedia CreateMedia()
   {
       return new MP3();
   }
}
//其它工厂略;
 
public class RMFactory:IMediaFactory
{
   public IMedia CreateMedia()
   {
       return new RM();
   }
}
//其它工厂略;
 
写到这里,也许有人会问,为什么不直接给AudioMedia和VideoMedia类搭建工厂呢?很简单,因为在AudioMedia和VideoMedia中,分别还有不同的类型派生,如果为它们搭建工厂,则在CreateMedia()方法中,仍然要使用条件判断语句,代码缺乏灵活性,不利扩展。
还有一个问题,就是真的有必要实现AudioMedia和VideoMedia两个抽象类吗?让其子类直接实现接口不是更简单?对于本文提到的需求,是能实现的。但不排除AudioMedia和VideoMedia它们还会存在其他区别,如音频文件还需给声卡提供接口,而视频文件还需给显卡提供接口。如果让MP3、WAV、RM、MPEG直接实现IMedia接口,而不通过AudioMedia和VideoMedia,在满足其它需求的设计上也是不合理的。现在客户端程序代码发生了稍许的改变:
Public void BtnPlay_Click(object sender,EventArgs e)
{
IMediaFactory factory = null;
    switch (cbbMediaType.SelectItem.ToString().ToLower())
{
       //音频媒体
        case ("mp3"):
             factory = new MP3Factory();
             break;
        //视频媒体
case ("rm"):
             factory = new RMFactory();
             break;  
        //其他类型略;
    }
    MediaPlayer player = new MediaPlayer();
    player.Play(factory.CreateMedia());
}
 
到这里,我们再回过头来看MediaPlayer类。这个类中通过单向分派,根据传递参数的不同,分别实现了不同对象的Play方法。在不用工厂模式时,这个类对象会运行得很好。作为一个类库或组件设计者来看,他提供了一个不错的接口,供客户端程序调用。
利用工厂模式后,现在看来MediaPlayer类已经多余。所以,我们要记住的是,重构并不仅仅是往原来的代码添加新的内容。当我们发现一些不必要的设计时,还需要果断地删掉这些冗余代码。修改后的代码如下:
Public void BtnPlay_Click(object sender,EventArgs e)
{
IMediaFactory factory = null;
    switch (cbbMediaType.SelectItem.ToString().ToLower())
    {       
        case ("mp3"):
             factory = new MP3Factory();
             break;
              //其他类型略;
        case ("rm"):
             factory = new RMFactory();
             break;  
        //其他类型略;
    }
    IMedia media = factory.CreateMedia();
    media.Play();
}
 
如果你在最开始没有体会到IMedia接口的好处,在这里你应该已经明白了。我们在工厂模式中用到了该接口;而在客户端程序中,仍然要使用该接口。使用接口有什么好处?那就是你的主程序可以在没有具体业务类的时候,同样可以编译通过。因此,即使你增加了新的业务,你的客户端程序是不用改动的。
不过,这样写客户端代码还是不够理想的,依然不够灵活,在判断具体创建哪个工厂的时候,仍需条件判断。现在看来,如果执行者没有完全和具体类分开,一旦更改了具体类的业务,例如增加了新的工厂类,仍然需要更改客户端程序代码。
我们可以通过反射技术、条件外置很好地做到客户端的灵活性。
条件外置来实现,即通过应用程序的配置文件来实现。我们可以把每种媒体文件类的类型信息放在配置文件中,然后根据配置文件来选择创建具体的对象。并且,这种创建对象的方法将使用反射技术来完成。首先,创建配置文件:
 
<appSettings>
<add key="mp3" value="MediaLibrary.MP3Factory" />
<add key="wav" value=" MediaLibrary.WAVFactory" />
<add key="rm" value=" MediaLibrary.RMFactory" />
<add key="mpeg" value=" MediaLibrary.MPEGFactory" />
</appSettings>
 
然后,在客户端程序代码中,自定义一个初始化方法如:InitMediaType(),读取配置文件的所有key值,填充cbbMediaType组合框控件中:
private void InitMediaType()
{
cbbMediaType.Items.Clear();
foreach (string key in ConfigurationSettings.AppSettings.AllKeys)
{
            cbbMediaType.Item.Add(key);
}
cbbMediaType.SelectedIndex = 0;
}
 
最后,更改客户端程序的Play按钮单击事件:
Public void BtnPlay_Click(object sender,EventArgs e)
{
string mediaType = cbbMediaType.SelectItem.ToString().ToLower();
string factoryDllName = ConfigurationSettings.AppSettings[mediaType].ToString();
//MediaLibray为引用的媒体文件及工厂的程序集;
IMediaFactory factory = (IMediaFactory)Activator.CreateInstance(“MediaLibrary”,
factoryDllName).Unwrap();
IMedia media = factory.CreateMedia();
media.Play();
}
 
这样可以很好地体现了软件工程的三个主要目标:重用性、灵活性和扩展性。
设想一下,如果我们要增加某种媒体文件的播放功能,如AVI文件。那么,我们只需要在原来的业务程序集中创建AVI类,继承于VideoMedia类。另外在工厂业务中创建AVIFactory类,并实现IMediaFactory接口。假设这个新的工厂类型为MediaLiabrary.AVIFactory,则在配置文件中添加如下一行:
<add key="AVI" value="MediaLiabrary.AVIFactory" />。
而客户端程序呢?根本不需要做任何改变,甚至不用重新编译,程序就能自如地运行!

Categories: Code Tags:

大学同学的第一次小规模聚会

十月一号下午公司是三点下的班, 由于今晚和明天我们大学同班同学要聚会, 所以晚上我要去趟丁家河. 走之前基本跑遍了整个山科花园摘了一些无花果.

以下是十月二号的事情了:

跟兄弟们玩了一天,。走到操场的地方时开始下雨了, 就往回走, 在长江路上走了一圈后到宿舍楼.

这天晚上回山科了, 有一段插曲, 我在15路车上, 一个人居然枕在我的肩上睡了一路,我也没忍心叫那人起来。

以下是十月三号的事:

我只是想记录下我们的生活, 以后的我们相聚的机会会越来越少, 以后这是我们的一个美好的回忆.

Categories: 琐事 Tags: