昨天晚上,是最难熬的一个晚上
我不敢相信昨天晚上发生的一起,但是它又确确实实的发生了。
两个人能走在一起已属不易,却又有重重阻碍。。
被上天玩弄的感觉真的很不爽,很无奈,很伤心。。。
我麻木了,感觉是哪么的不真实,电视剧里面的事情怎么会发生到我身上?
这个世界太虚伪了,没有公里,也没有正义,真实存在的只有强权!
想不到人类的感情可以被家里的强权轻易打败!我没有话可说了。。。。。。
寄予的心灵再次受到了猛烈的抛弃,这次不知随风飘零到哪里!
我很迟钝,不知道,也不想知道,更不敢知道,会有这种结果,开开心心的开始,开开心心的进行,不是很好嘛!
为什么,为什么,总是有这么多挫折,而且这些挫折总是一起过来!
打击,实在是太沉重了!我不敢想想了。。。。。
曾经将自己的感情封闭起来,等待刚刚释放时,却又再次受到打击!
老天总是要让我心灵冰冻。。。。。  

posted @ 2008-05-09 08:55 wuhang 阅读(4) | 评论 (0)编辑
今天突发奇想,想做各Photoshop的软件开启界面,因为它不但是不规则图形,而且还有阴影,呵呵,没的说先Google一下,果然出来N多资料,
简单的想了一下,应该是用图形处理软件处理好图形,包括了投影,然后再用GDI绘图给绘制出来,嗯,应该是这么干的,先自己写各吧!
        protected override void OnPaint(PaintEventArgs e)
        {
            
//base.OnPaint(e);
            DrawCustomActivity(e);
        }

        
private void DrawCustomActivity(PaintEventArgs e)
        {
            Graphics graphics 
= e.Graphics;
            Bitmap bmp 
= new Bitmap("face.jpg");
            
//bmp.MakeTransparent(this.TransparencyKey);
            
//Image img = Image.FromFile("face.png", false);
            
//this.Width = img.Width;
            
//this.Height = img.Height;
            graphics.DrawImageUnscaledAndClipped(bmp, new Rectangle(00541354));
        }
嗯,把窗体给改造一下,不许显示边框,不许显示控制栏,嗯,然后重写了它的OnPaint事件,呵呵,可以看到效果咯
效果只有2个字:很丑
圆型的边角没有处理成透明的,很郁闷呀~!
上网搜罗了下,看到博客圆里面有为大哥弄过,那位记不得了,先借代码来用用,:-)
        public class BitmapRegion
        
{
            
public BitmapRegion()
            
{ }

            
public static void CreateControlRegion(Control control, Bitmap bitmap)
            
{
                
if (control == null || bitmap == null)
                    
return;

                control.Width 
= bitmap.Width;
                control.Height 
= bitmap.Height;

                
if (control is System.Windows.Forms.Form)
                
{
                    Form form 
= (Form)control;

                    form.Width 
= control.Width;
                    form.Height 
= control.Height;

                    form.FormBorderStyle 
= FormBorderStyle.None;
                    form.BackgroundImage 
= bitmap;

                    GraphicsPath graphicsPath 
= CalculateControlGraphicsPath(bitmap);
                    form.Region 
= new Region(graphicsPath);
                }

                
else if (control is System.Windows.Forms.Button)
                
{
                    Button button 
= (Button)control;
                    button.Text 
= "";
                    button.Cursor 
= Cursors.Hand;
                    button.BackgroundImage 
= bitmap;
                    GraphicsPath graphicsPath 
= CalculateControlGraphicsPath(bitmap);
                    button.Region 
= new Region(graphicsPath);
                }

            }


            
private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
            
{
                GraphicsPath graphicsPath 
= new GraphicsPath();
                
//使用坐上角第一个点作为透明色
                Color colorTransparent = bitmap.GetPixel(00);
                
int colOpaquePixel = 0;
                
for (int row = 0; row < bitmap.Height; row++)
                
{
                    colOpaquePixel 
= 0;
                    
for (int col = 0; col < bitmap.Width; col++)
                    
{
                        
if (bitmap.GetPixel(col, row) != colorTransparent)
                        
{
                            colOpaquePixel 
= col;
                            
int colNext = col;
                            
for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
                            
{
                                
if (bitmap.GetPixel(colNext, row) == colorTransparent)
                                    
break;
                            }

                            graphicsPath.AddRectangle(
new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
                            col 
= colNext;
                        }

                    }

                }

                
return graphicsPath;
            }

        }
写了2个类来处理图片,选择图片的左上角的像素作为要透明的像素,然后开始透明与这个相似的像素,
在Load事件里面再
            BitmapRegion bitmapregion = new BitmapRegion();
            BitmapRegion.CreateControlRegion(this, new Bitmap("face2.png"));
两句话就搞定了,o(∩_∩)o...,高手就是高手,可惜原来是外国人写的呢!感慨下~!
处理过后的图片就变成了圆边了,不过想要实现想PS那种启动效果,哎,估计比较难~!实际也比较难~!
不过,就在我打写这篇文章的时候,突然想到,能不能获取图片的左下角像素,分别以45°方向延展几个像素,颜色用黑色渐变,这样不就成了投影了吗???不过得先获取边缘,同时投的影不能盖到图片上,可以先投影,后画图,嗯好主意,那位大哥能实践一下就好咯~   ~!

posted @ 2008-04-25 17:11 wuhang 阅读(17) | 评论 (0)编辑
小感慨一下,最近一直没有写自己的博客,不知道该写什么,也不知道该做什么,刚去了个新单位,福利待遇一般般,要做的事情确是一大堆,感慨就是,在这里,既要做程序员,又要做,架构师,还要兼职软件测试师,可惜本人出生不好,学校没名气,既不是211又不是名牌大学,搞的工资低的一米,干的活多的一米。。。超郁闷!

最近在看《明朝那些事》哎,的确好玩,感觉说的很直白就像说书一样!想想,哎可惜自己是凡人,为生计而忙碌,累呀~!

晚上还听了架构师的课程,哎,其实本来我的目标定好了去考架构师,可惜一看到书,手就发痒,想去摸电脑或者PSP,玩物丧志呀!有读书的热情,没有读书的毅力,哎,空欢喜一场!可惜家里没钱,要不然一门信息跑图书馆啃书去,考个研究生出来,现在一边工作一边学习真的挺累的,大部分时间还是在浪费中,写说明UseCase,也不知道该怎么用,本来自己有一套想法,不过到了细节部分却又难以表述。。。郁闷,真的很郁闷,昨天晚上看了RUS才知道,原来就是我一直用的Rose哎。。。。MSF估计就是微软推出的构架软件吧,听了感觉跟没听一样,就说这怎么弄,弄什么,跟读书一样!没劲,还是有案例的看起来比较爽,不过能不能领悟到案例的精髓就看个人了,我估计是比较笨的咯,写的代码有一半以上是抄袭别人的,现在想搞个像PS开启界面一样的界面,如何去写,还是参考MSDN呢,还好有它,否则我还就知道应该Overwrite一下OnPaint事件,后面就不知该怎么搞了~!哎,今天牢骚怪多的,估计是昨天晚上听到公司说,待遇跟学校挂钩才造成的吧,可怜呀,难怪一进那所学校,风气就很糟,学长前辈们的感慨今日回撤在耳边“自打进了金陵门,从此别想再做人”哎。。。我们学校的学生注定没好结果的,除了有关系有人有钱的~!

哎,感慨发完了,还是回到现实吧!决定下一步目标先考“软件测试师”再考“软件架构师”,一边给公司打工,一边研究学习,先打好“WCF功底”再学习“WPF技术”努力将“WF”掌握到手,做个跟随微软的小喽喽~!


posted @ 2008-04-25 09:19 wuhang 阅读(7) | 评论 (0)编辑
没事准备学Linq的,绑定GridView的时候,突然想自己定义操作的命令了,琢磨了半天还是没搞懂,后来参考别人的代码才知道~!自定义一个按钮~!呵呵
                <asp:TemplateField HeaderText="删除操作">
                    
<ItemTemplate>
                        
<asp:Button Text="删除" runat="server" OnClientClick="return confirm('确定要删除?')" ID="Button1" OnCommand="Button1_Click"
                         CommandName
="Button1_Click" CommandArgument='<%#Eval("CustomerID") %>' />
                    
</ItemTemplate>
                
</asp:TemplateField>
然后后台相应的要有代码:处理Button1_Click事件
        protected void Button1_Click(object sender, CommandEventArgs e)
        
{
            Response.Write(
"按钮按了" + e.CommandArgument.ToString());
        }
可以看到绑定的Argument的值已经传了,呵呵,删除还是修改随便弄啦~!

posted @ 2008-03-28 23:17 wuhang 阅读(28) | 评论 (0)编辑
[转自]http://www.cnblogs.com/jillzhang/archive/2008/03/27/1126197.html
[感谢]jillzhang

WCF从理论到实践-异步

本文目的

通过阅读本文,您能了解以下知识

1) 如何在WCF中实现异步
2) 异步操作的优缺点及其应用场合
3) 总结对比各种异步操作的实现方式
4) 代码不骗人,实现一个WCF异步小范例

本文适合的读者

本文因为涉及一些常用的基础知识和开发技巧,需要对多线程等具有一定的认识,所以初学者可能不能立即掌握,本文适合WCF中级用户或有其他分布式技术开发经验的WCF初学者

如何在WCF中实现异步

在ARM(异步编程模型)中,我们经常看 到BeingXXX(..),EndXXX(..)这样的函数定义,那和他们对应的同步方法还有XXX(..),比如FileStream对象,它既包括 同步方式int Read(byte[] buffer,int offset,int count),还有IAsyState BeginRead(byte[] buffer,int offset,int count,IAsyCallback callback,Object asyState)和int EndRead(IAsyState ar)这样的异步方式,如果我们的WCF服务程序也和FileStream设计一样,那我们一些开发人员要跳楼了.本来一个业务方法的实现现在变为了3 个,工作量增加了2倍.为何有这样的说法,因为这样的架构不是一个好架构,作为一个优秀的框架,WCF肯定不会犯如此低级的错误,异步与否本来应该是由客 户端来决定的,所以我们的服务端实现无需关心异步与否.下面我们来看一下如何实现异步,WCF中实现异步是一件非常简单的事情,我们用svcutil来生 成客户端代理代码的时候,只需添加 /async 便可以生成有异步功能的代理类了.而在IDE中,操作就更加简单,就是在添加ServiceReference的时候,选择高级选项,钩选Generate Asynchronus operations,如图:

生成异步操作的代理类下就会增加BeginXXX和EndXXX方法。比如我们示例项目中服务契约中有

[OperationContract] 
string GetData(int value); 

的操作方法,生成的代理类中对应其的异步方法为:

[System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/IService1/GetData", ReplyAction="http://tempuri.org/IService1/GetDataResponse")] 
System.IAsyncResult BeginGetData(
int value, System.AsyncCallback callback, object asyncState); 
string EndGetData(System.IAsyncResult result); 

 
异步操作的优缺点及其应用场合

在前面WCF从理论到实践:事件广播文章中,我曾经提到异步操作能提高系统的吞吐能力,老赵同志也曾针对我的说法写了篇正确使用异步操作来 校正滥用异步的错误做法,那异步究竟有何优点值得我们使用?而又有什么缺点需要我们使用的时候小心呢?诚如老赵所说,异步并不一定能提高系统性能,甚至因 为线程的创建,消亡,和切换会增加系统开销,但异步除了提高性能,还可以增强系统的健壮性。在过去,windows程序总是单线程的,在这样的系统中,如 果出现了异常,系统就会 因此而崩溃,甚至连我们的操作系统也是单线程的,所以每次出现异常,我们的计算机用户都要不厌其烦强制关机,然后重启才能解决问题。加入多线程之后,当一 个线程上的任务发生异常的时候,其他线程有能力不受影响,从此防止整个应用程序的崩溃。此外如果用户是在一个UI中操作某项耗时的操作,如果不使用异步, 那UI线程就会被阻塞,导致界面无法响应,用户就会很无助,增加了异步,让复杂的任务在另外的线程中完成,就会有比较好的用户体验。而且异步并不是说对性 能提高没有作用,CLR线程的创建,销毁,和线程上下文切换的确会有很大的开销,比如每创建一个线程,都必须申请1MB的地址空间用于线程的用户模式,申 请12KB左右的德地址空间用于线程的内核模式,而且还要求进程调用每个dll中的一个 固定的函数来通知所有的dll系统创建了一个新的线程,同样在销毁的时候,也要做类似的通知,上面这一切似乎都说明了异步操作对于性能的坏处,但事实并非 完全如此,我们知道当前的处理器基本上都是双核,或者支持hyper-thread,一个线程的执行总会占用1个cpu逻辑核,如果我们的计算机是4核, 8核,而我们不采用异步,那其实多核就没什么太大优势,因为总是1个核在工作,而另外的核却在休息,效率肯定低下,而此时用多线程,就可以充分使用计算机 的处理器资源。同时对于一些有IO限制的操作而言,如读取磁盘文件,网络数据相关操作时,整个过程并不是完全靠运算,而是要通过磁盘驱动器或者网络驱动器 来协助完成,比如读取磁盘中的一个文件,当应用程序的读取线程发出读请求的时候,该请求会被磁盘驱动器所排队处理,假如它是个很长的操作,那么该操作会在 磁盘驱动器上排队或者执行很长时间,而这段时间读线程就处于阻塞的状态,这样就浪费了线程资源,正确的做法应该是线程将读请求发送到磁盘驱动器后马上返 回,继续处理其他任务,而当磁盘驱动器操作完成的时候,由磁盘驱动器来通知或者由一个线程来轮询执行状态。这样就防止线程资源被浪费,从而提高系统性能。 总结一下上面的说法,异步有三个优点:

1) 在I/O受限等情况下,异步能提高性能,并且能更加充分利用多核CPU的优点。
2) 异步能增强系统健壮性
3) 异步能改善用户体验

同时也有缺点,如下

1) 滥用异步,会影响性能
2) 增加编程难度

总结对比各种异步操作的实现方式

实现异步,主要包含以下几种方法

1)  使用专用线程,方法为:

System.Threading.ThreadStart ts = new System.Threading.ThreadStart(void(object state) target);

System.Threading.Thread th = new System.Threading.Thread(ts);

ts.Start();

调用Start()方法之前,并没有实质性得创建线程资源,而是Start()后才进行创建,此种方式的好处在于能设置线程是前台线程还是后台线程,并且能控制线程的挂起和消亡

2)  使用线程池中的线程

线程是一种比较宝贵的资源,所以使用的时候就要加倍珍惜,线程池中线程在使用完成之后并不是马上销毁,而是回到池中等待下一次的使用,这样就可以较少线程创建的消耗。使用方法如下:

ThreadPool.QueueUserWorkItem(WaitCallback callback)

需要注意的是此种方法使用的均为后台线程   

3)  使用异步编程模型

这种方法是MS推荐的使用方法,该模型普遍格式为:

BeginXXX(…IAsyCallBack callback,object asyState);

EndXXX(IAsyState ar);

这种模型的好处上面已经有所阐述

4) 使用BackgroundWorker

.Net2.0下提供了BackgroundWorker,使用它可以轻易的完成异步操作,并且它还有一些功能上的加强,比如取消操作、

代码不骗人,实现一个WCF异步小范例

非常简单,并不多说,只发项目文件和运行效果图:

项目文件: /Files/jillzhang/Jillzhang.Wcf.APM.rar

参考资料

1)http://www.cnblogs.com/wayfarer/archive/2007/11/09/954256.html 

posted @ 2008-03-28 16:31 wuhang 阅读(23) | 评论 (0)编辑

转自:http://www.cnblogs.com/lovecherry/archive/2007/08/14/855681.html

感谢:LoveCherry


什么是Linq to sql

 

       Linq to sql(或者叫DLINQ)是LINQ.NET语言集成查询)的一部分,全称基于关系数据的 .NET 语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能,它和Linq to xmlLinq to objectsLinq to datasetLinq to entities等组成了强大的LINQ

       要学好LINQ查询语法,就不得不先理解C# 3.0的一些新特性,下面一一简单介绍。

 

隐含类型局部变量

 

var age = 26;

var username = "zhuye";

var userlist = new [] {"a","b","c"};

foreach(var user in userlist)

Console.WriteLine(user);

       纯粹给懒人用的var关键字,告诉编译器(对于CLR来说,它是不会知道你是否使用了var,苦力是编译器出的),你自己推断它的类型吧,我不管了。但是既然让编译器推断类型就必须声明的时候赋值,而且不能是null值。注意,这只能用于局部变量,用于字段是不可以的。

 

匿名类型

 

var data = new {username = "zhuye",age = 26};

Console.WriteLine("username:{0} age:{1}", data.username, data.age);

匿名类型允许开发人员定义行内类型,无须显式定义类型。常和var配合使用,var用于声明匿名类型。定义一个临时的匿名类型在LINQ查询句法中非常常见,我们可以很方便的实现对象的转换和投影。

 

扩展方法

 

    public static class helper

    {

        public static string MD5Hash(this string s)

        {

            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s,"MD5");

        }

       

        public static bool In(this object o, IEnumerable b)

        {

            foreach(object obj in b)

            {

                if(obj==o)

                return true;

            }

            return false;

        }       

}

 

// 调用扩展方法

Console.WriteLine("123456".MD5Hash());

Console.WriteLine("1".In(new[]{"1","2","3"}));

很多时候我们需要对CLR类型进行一些操作,苦于无法扩展CLR类型的方法,只能创建一些helper方法,或者生成子类。扩展方法使得这些需求得意实现,同时也是实现LINQ的基础。定义扩展方法需要注意,只能在静态类中定义并且是静态方法,如果扩展方法名和原有方法名发生冲突,那么扩展方法将失效。

 

自动属性

 

    public class Person

    {

        public string username { get; protected set; }

        public int age { get; set; }

       

        public Person()

        {

            this.username = "zhuye";           

        }

}

 

Person p = new Person();

//p.username = "aa";

Console.WriteLine(p.username);

 

       意义不是很大,纯粹解决机械劳动。编译器自动为你生成getset操作以及字段,并且你不能使用字段也不能自定义getset操作,不过你可以分别定义getset的访问级别。

 

对象初始化器

 

    public class Person

    {

        public string username { get; set; }

        public int age { get; set; }

       

        public override string  ToString()

        {

        return string.Format("username:{0} age:{1}", this.username, this.age);

        }

}

 

Person p = new Person() {username = "zhuye", age=26};

Console.WriteLine(p.ToString());

       编译器会自动为你做setter操作,使得原本几行的属性赋值操作能在一行中完成。这里需要注意:

l         允许只给一部分属性赋值,包括internal访问级别

l         可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行

 

集合初始化器

 

    public class Person

    {

        public string username { get; set; }

        public int age { get; set; }

       

        public override string  ToString()

        {

        return string.Format("username:{0} age:{1}", this.username, this.age);

        }

}

 

var persons = new List<Person> {

    new Person {username = "a", age=1},

    new Person {username = "b", age=2}};

foreach(var p in persons)

Console.WriteLine(p.ToString());

编译器会自动为你做集合插入操作。如果你为Hashtable初始化的话就相当于使用了两个对象初始化器。

 

Lambda表达式

 

var list = new [] { "aa", "bb", "ac" };

var result = Array.FindAll(list, s => (s.IndexOf("a") > -1));

foreach (var v in result)

Console.WriteLine(v);

       其实和2.0中的匿名方法差不多,都是用于产生内联方法,只不过Lambda表达式的语法更为简洁。语法如下:

       (参数列表) => 表达式或者语句块

其中:

参数个数:可以有多个参数,一个参数,或者无参数。

表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。

       前面的示例分别是1个参数的例子,下面结合扩展方法来一个复杂的例子:

      public delegate int mydg(int a, int b);

    

      public static class LambdaTest

      {

         

          public static int oper(this int a, int b, mydg dg)

          {

              return dg(a, b);

          }

      }

 

Console.WriteLine(1.oper(2, (a, b) => a + b));

Console.WriteLine(2.oper(1, (a, b) => a - b));

 

查询句法

 

var persons = new List<Person> {

    new Person {username = "a", age=19},

    new Person {username = "b", age=20},

    new Person {username = "a", age=21},

    };

var selectperson = from p in persons where p.age >= 20 select p.username.ToUpper();

foreach(var p in selectperson)

    Console.WriteLine(p);

查询句法是使用标准的LINQ查询运算符来表达查询时一个方便的声明式简化写法。该句法能在代码里表达查询时增进可读性和简洁性,读起来容易,也容易让人写对。Visual Studio 对查询句法提供了完整的智能感应和编译时检查支持。编译器在底层把查询句法的表达式翻译成明确的方法调用代码,代码通过新的扩展方法和Lambda表达式语言特性来实现。上面的查询句法等价于下面的代码:

var selectperson = persons.Where(p=>p.age>=20).Select(p=>p.username.ToUpper());

LINQ查询句法可以实现90%以上T-SQL的功能(由于T-SQL是基于二维表的,所以LINQ的查询语法会比T-SQL更简单和灵活),但是由于智能感应的原因,select不能放在一开始就输入。

今天就说到这里,再见!

posted @ 2008-03-21 15:46 wuhang 阅读(6) | 评论 (0)编辑
VS2005提供的Webparts控件,的确是好东西,不过需要的先决条件太苛刻了!按照微软的说法,需要安装SQLExpress,可惜我按装了SQL2005 Server,呵呵,自己好管理数据库啊!使用webparts需要经过身份验证才能看到,我搞了一个礼拜,郁闷,到处找Webparts的资料,还和Sharepoint扯上了关系,后来还是觉得自己摸索摸索吧,先把成员管理给搞定了。成员管理用的几个类Membership,Roles,等等Provider的东西,微软提供好了,用起来特方便,不过先决条件说的不明不白的!
后来自己看了C:\windows\Microsof Net\Config\maching.config文件,才搞明白,它里面成员是这样定义的:
  <system.web>
    
<processModel autoConfig="true" />
    
<httpHandlers />
    
<membership>
      
<providers>
        
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
      
</providers>
    
</membership>
    
<profile>
      
<providers>
        
<add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"