赵翔鹏的Blog Xiangpeng's Thinkpad

31十二/081

奇奇的照片

给奇奇拍照片很难的……他就不肯老实看镜头。>_<

DSC02057

喜欢来这里,后面有暖气

DSC02078

走路时发了一下呆~

 DSC02066

我看你,你看我,很困惑

DSC02079

想睡觉?

DSC02061

在思考?

DSC02052

白天的眼神很警惕

DSC02058

俺就是不看镜头~别拍了!

祝大家新年快乐:)

分类: 心情 1个评论
30十二/082

SQL Server 2008 Reporting Service使用技巧

SSRS用来做报表很方便,据说比Crystal Reports好用。简单的说,你的报表数据来自SQL语句,然后就可以在类似Excel的环境中画图了。

说是这么说,实际做起来还是会遇到很多小麻烦。下面是总结的一些技巧:

  1. 改变图表上字体大小(如X轴、Y轴上的数字):

    先把LabelsAutoFitDisabled属性设为True ,然后再设置字体大小

  2. Data Label显示设置:

    在Series的SmartLabels里面有一些有用的选项。AllowOutsidePlotArea设为True比较好。

  3. 自定义Legend标题:

    要右键选Series的属性,不是Legend的属性

  4. Pie chart显示百分比:

    在Report properties - code中加入如下代码:

    Public Function GetLabel(ByVal currentValue As Integer, ByVal totalValue As Integer) As String

    If currentValue / totalValue < 0 Then '表示百分比小于1的不显示出来

    Return " "

    Else

    Return Format(currentValue / totalValue, "P1")

    End If

    End Function

    然后设置data label表达式:=Code.GetLabel(Count(Fields!IssueID.Value), Count(Fields!IssueID.Value, "Issues"))

  5. Pie chart排序

    右键点一个Category,在Category Group Properties中设置Sort表达式即可

    clip_image001

  6. 在Pie chart饼图外侧显示DataLabel:

    设置Series的CustomAttributes,PieLabelStyle=Outside

    clip_image002

    注意:参考AdventureWorks示例,有一个很好的饼图。(google上搜到的都是过时的东西)

  7. Asp.net中使用ReportViewer控件:

    必须在IIS的Handler Mappings中新建一个Managed Handler才能正常显示。 可以google搜索Reserved.ReportViewerWebControl.axd。

    clip_image003

    clip_image004

    另一个解决方法:据说配置下web.config文件也可以搞定:

    <httpHandlers>

        <add path="Reserved.ReportViewerWebControl.axd" verb="*"

             type="Microsoft.Reporting.WebForms.HttpHandler,

                   Microsoft.ReportViewer.WebForms,

                   Version=8.0.0.0, Culture=neutral,

                   PublicKeyToken=?????????????"

             validate="false" />

    </httpHandlers>

    http://www.knowsky.com/340782.html

  8. ReportViewer控件:

    可以设置ZoomMode属性为PageWidth,这样可以自动放缩。

    图表放大时会失真,因为不是矢量图。建议把原始报表拉大一些,在页面中留一个小点的空,默认ZoomMode=PageWidth,用户选择100%就可以放大。

    所有的toolbar按钮都可以选择显示或关闭,设置ShowXXX属性即可。

  9. 其他:

    对报表修改之后要及时Deploy,才能看到效果。可以在VS的configuration manager里面设置,debug时自动deploy,比较方便。这个默认是没有打开的,如下图所示,建议把Deploy的对勾打上。

    clip_image005

标签: 2 评论
27十二/085

小猫奇奇

波斯猫奇奇大约一岁大,是从水木上领养的。纯白的毛,黄色和蓝色的眼睛,很酷,我喜欢。

爱好:研究一切新奇的东西。比如任何不让他去的地方。

 该猫会跟着我走来走去;我吃饭时他呆在桌子下面,我洗脸时他跳到洗衣机上,我走路时他就跟着,在我腿边蹭蹭(你是狗吗……)。

 平时喜欢趴在笔记本上,貌似是因为笔记本的温度比较高?而且又方方正正的像个凳子?(btw,我的笔记本外接了显示器/鼠标/键盘/移动硬盘/优盘/游戏手柄,所以总是合着)

 每天要做的事:蓄力若干秒,从电脑桌跳到门的上沿,对,就是那有一寸宽的地方,随着门摆动几下,再蹦到衣柜上,占领家里的制高点。

 聪明:知道自己叫奇奇,喊他的时候会答应。知道观察屏幕上会动的鼠标,爱玩弄窗台上的两盆草——哦,还喜欢咬叶子。可怜的丁香。

 乖:被洗澡时会发出哀怨的叫声,但无论怎么欺负他都不会抓人。

 先总结这么多,以后有好玩的故事再更新。

分类: 心情 5 评论
21十二/080

LINQ学习笔记

什么是LINQ

LINQ是C# 3.0的新功能,可以用统一的的语法(类似sql、或者是函数式语言)访问各种数据,包括数据库、XML、对象。

Anders Hejlsberg说LINQ是"It's about turning query set operations and transforms into first-class concepts of the language" (http://channel9.msdn.com/showpost.aspx?postid=114680)。我的感受是:LINQ可以取代SQL,成为一种统一Database、XML世界的查询语言。

举个例子:

var bycity = from p in db.Products
             join o in db.Orders
             on p.productID equals o.productID
             where o.ShipToCity == "Beijing"
             select new {o.orderID, p.productName};
foreach (d in bycity) ...
//或者GridView1.DataSource = bycity

这里的db.doctors可以是数据库DataSet,可以是个xml文件,也可以是个List<T>。

所有的新关键字,比如var, from, group, select...都是syntactic sugar。编译器会自动把它翻译成基于Lambda表达式的代码,最后翻译成.net 2.0的程序。var的类型是type inference推断出来的,是强类型的,不等于object;select相当于函数式语言中的Map,当然也支持函数式语言中的Reduce(叫做Aggregate);函数式语言用到的Lambda表达式其实很容易用函数指针delegate实现;最后生成的是一个匿名类型(anonymous type)。

推荐这本小书:LINQ: The Future of Data Access in C# 3.0,只要两小时就看完了。了解一点原理后再用LINQ就方便多了。

LINQ和ASP.net

对ASP.net程序员而言,LINQ主要的应用是用它代替SQL访问数据库。除了不用拼字符串了,一个好处是,LINQ是强类型的,所以用起来更安全。我可以这样写:

var query = db.Orders.Where(o=>o.Description.Contains(txtDescription.Text));
// Contains会被翻译成SQL的LIKE
DateTime sinceDate = DateTime.Parse(txtSinceDate.Text);
query = query.Where(o=>o.ShipDate > date);
// o.ShipDate也是DateTime类型的,所以可以直接比较

Lambda表达式很好用的。
比较麻烦的是,现在有两套数据库访问框架:一个是LINQ to SQL,一个是LINQ to Entity。在用LINQ前,又要花点时间考虑用哪个框架好。

二者对于各种基本CRUD操作有很好的支持。LINQ to SQL可以理解为SQL的替代品,基本上跟SQL能一一对应起来;而LINQ to Entity是2008年8月才推出的,是一个更强大的ORM框架,对多对多关系的支持更好。

举个例子:假设一个表linkProductOrder里只有两列,productID和orderID,用于表达product和order的联系。在LINQ to SQL中这个表会被映射到一个类linkProductOrder,还需要自己写join;而LINQ to Entity中就不会出现这个类,直接用product.Orders和order.Products就可以实现互相访问,完全消除了写join的必要。

我的体会是:LINQ to Entity目前还不够稳定,还是LINQ to SQL保险。用ORM框架的一个问题是,刚开始用时会有lose control的感觉,出了问题完全不知道怎么回事,不像SQL,模型很简单清晰,一个query下去肯定不会出毛病。

我用LINQ to Entity时遇到了几个问题,比如数据库改变后没法重新刷新对象模型,只能删掉对象模型文件重建;还有一次不知道为何新建的对象存不进数据库,这时调试起来非常麻烦。对于复杂的含有多个join的查询,我一般都会先用sql server测试一下,再写成代码;LINQ to Entity不用写join是省了一点事,但是这样反而要在脑子里维护两种模型翻过来译过去。相比之下LINQ to SQL就没出过什么问题。

希望等LINQ to Entity的下个版本出来之后,这种问题会少一些。

总结:不是做广告,C#真的很好很强大。

6十二/084

WinHEC 2008见闻:static code verification

WinHEC是Windows硬件开发者大会。大部分主题都是针对驱动程序开发的。作为一个技术性会议,所有的session都是微软或者赞助商的讲师在讲课,推广微软的新技术;这个跟学术性会议不同。

一个有趣的topic是static verification。微软提供的驱动开发验证器,PrefastStatic Driver Verifier,分别支持单个函数级别的验证和多函数的全局验证。简单的说它们就是两个symbolic model checker。可以验证的性质包括很多条预定义的规则,如“分配了内存就要释放,而且只能释放一次”(仅此一条规则就已经能证明这个工具的价值了),“提升了IRQL后,以后也要降低”,等等。也可以自己用类C语言写规则。

Prefast大概需要几分钟的时间来验证,SDV需要20-40分钟。(speaker说他们努力改进工具,使验证时间从20小时减少到20分钟)WDK自带这两个工具,用起来也很简单,输一条命令就会自动在后台执行验证,验证结束后会弹个提示。

为保证验证的效果,可能还要加上一些annotation:比如标明某个函数foo(char* s, int len)中,s是一个大小为len的buffer,然后就可以验证一些buffer overflow的问题。

虽然model checking的状态爆炸问题还是存在,但好在一般的驱动程序都不太复杂,所以可以说model checking已经进入工业应用阶段了,speaker说希望所有的硬件厂商们都用一下这个工具。我提了个问题,一般的C/C++程序是否可以用这两个工具来验证?回答是“you can try it”。估计小程序还是能跑一跑的。随着内存容量的不断增加,model checking是否会得到更多的应用呢?

20十一/083

用Java调用.net的Web service

Web service可以提高interoperability,可以实现跨平台的应用……听起来不错。但真的做一下,还是有很多小陷阱。

下面是最近做的小例子,用Java Axis2作为客户端调用.net写的web服务。支持自定义的数据结构(这个不是那么简单……)。

准备:

1、下载axis2 ,注意,不要google “axis”,那个是旧版的,一定要google“axis2”,目前的最新版本是1.41。

2、Visual studio 2008,C#。 这个不用说什么了。

 服务端:

在visual studio里写个hello world服务很简单,函数前加个[WebMethod]就可以。但是, 如果用到自定义的类,比如下面定义的person类作为GetUserInfoByPerson服务的参数:

namespace WebService1
{
    public class Person
    {
        public string IdentityNumber
        {
            get { return m_IdentityNumber; }
            set { m_IdentityNumber = value; }
        }
        private string m_IdentityNumber;
    }
}

这时要注意,直接按Ctrl+F5后生成的wsdl不包括Person的定义。

正确的做法是加一行
[SoapRpcMethod(Action = "http://tempurl.org/GetUserInfoByPerson", RequestNamespace = "http://tempurl.org", Use=SoapBindingUse.Literal)]

代码如下:

[WebService(Namespace = "http://tempurl.org/")]
public class Service1 : System.Web.Services.WebService
{
[WebMethod]
[SoapRpcMethod(Action = "http://tempurl.org/GetUserInfoByPerson", RequestNamespace = "http://tempurl.org", Use=SoapBindingUse.Literal)]
// 不加这一句,wsdl中就不生成Person类型
public Person GetUserInfoByPerson(Person q)
{
Person p = new Person();
p.IdentityNumber = q.IdentityNumber+"123";
}
}

现在Ctrl+F5运行这个服务,假设地址是http://localhost:56765/Service1.asmx,那就可以在http://localhost:56765/Service1.asmx?WSDL里看到,Person的定义已经出现了。

客户端:

axis2有一个不错的quickstart教程。axis2目录下面samples\faulthandling这个例子值得参考,里面有详细的readme.txt和build.xml。

1、用axis2自带的wsdl2java工具生成代码框架:

%AXIS2_HOME%\bin\wsdl2java.bat -uri http://localhost:56765/Service1.asmx?WSDL -u -o <target dir>

这样会在target dir下生成一个目录,里面有现成的Person.java等代码。

2、写调用代码

在Eclipse里建好项目,加入axis2\lib目录下所有的jar包,把刚才生成的目录也拷进去。

然后可以写代码了:

package example;
import org.tempurl.*;
public final class MyClient {
  public static void main(String[] args) {
  try {
    Service1Stub service1Stub = new Service1Stub("http://localhost:8080/Service1.asmx");
    service1Stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE);
    Service1 service1 = service1Stub;
    GetUserInfoByPerson req = new GetUserInfoByPerson();
    Person personReq = new Person();
    personReq.setIdentityNumber("123");
    req.setQ(personReq);
    GetUserInfoByPersonResponse response = service1.GetUserInfoByPerson(req);
    PersonE personResponse = response.getGetUserInfoByPersonResult();
    System.out.println("ID = " + personResponse.getIdentityNumber());
  } catch (Exception e) {
  e.printStackTrace();
}
}
}

注意这一句!service1Stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE);

不做这个设置,一开始我怎么都调用失败,Axis2报告说HTTP send recv出错(记不清楚错误信息了)。用tcpmon查看调用服务时的tcp传输,发现.net的web server根本不接受axis2的soap包。(btw,tcpmon是个不错的工具啊。)

google了很久发现原因是,axis2在做http传输时采用了“chunked”模式,而.net的web server不支持。

“axis中使用的是HTTP/1.0协议,而.NET和axis2使用的是HTTP/1.1协议,后两者的区别在于.NET未使用ns1的命名空间前缀打包SOAP请求,且axis2使用了Content-Encoding: chunked头。 所以必须在axis2中设置一下。”

总结:

web服务调用还是很麻烦的。除了上面列举的问题,还可能有soap协议版本1.1和1.2不兼容之类的细节问题。在调试这类问题时,tcpmon是必备工具。

刚才讨论了如何用java调.net服务。如果反过来,不知是否会简单一点。

最后,其实我一年前就写过axis2 1.3的代码……可是昨天,除了知道这件事可以用axis2做,所有的细节都忘光了。还是花半个小时记下来比较安全。

9十一/080

微软PDC大会和Channel 9

微软PDC大会展示了微软最新的技术,比如Windows 7,Windows Azure,而且门票可是超级贵的。最近才知道PDC的全部视频都是可以随便观看和下载的,就在微软MSDN的channel 9上。

MSDN上有很多东西——一个缺点就是太多。Channel 9是developer的频道,有很多视频,比如对Mark Russinovich的采访,讲到了Windows 7 kernel的一些改进。比如内核几个频繁使用的全局lock被细化,提高了多CPU时的performance; 启动时并行装载驱动程序,提高了boot performance;等等。虽然没有字幕,不过总的来说还算好懂。

最后很土的说,我真的没想到微软technical fellow(请对比IEEE fellow,ACM fellow的概念),sysinternal的创始人,在加入微软前凭着debugger就写出Windows Internals一书的Mark大神竟然那么年轻那么帅……在镜头面前甚至有一点腼腆……我一直以为他应该是个留着小胡子戴着眼镜老大叔的形象……

1十一/082

“How to grow faster?”

这周听了Philip Su的"How to grow faster"的talk。牛人讲的很好。几点印象:

work smarter AND harder。特别是后面一点。如果自己并不比大多数人聪明,那就只有更努力。这给我的印象最深刻。Do you think we can beat with our competitors by working 40 hours a week?

be an owner not an employee。不要抱着打工的想法去工作。Work like an owner, and finally you will become an owner.

其它的大多以前都听过,self-awareness,把team放在第一位,等等。还有些“don't grow too fast”的建议,很有价值,不过在我这个初级阶段还暂时用不着。

每次听有关soft skill的报告,都很有感触。Why MIT people always work for Harvard people? 很多问题,都比技术本身更重要,也都值得拿出一两个小时来思考。很不幸在学校里这些内容没有人教。而且,这些事情,比如self-awareness,必须反复去想,不是一天两天就能看透的。简单的说,就是不要埋头干活,要经常抬起头来从高处看看;再简单的说,就是三省吾身了。

20十/083

T43风扇清洗记

T43风扇的噪声实在太大了,说它是拖拉机毫不为过。买新风扇太贵,买到旧风扇就更郁闷。自己动手吧!万一坏了呢……就去村里买个新的台式机~~

抱着必死的决心,开始实施计划。按照网上的攻略,要用分析纯的无水酒精清洗风扇。哪里有卖的?攻略没说。从北大东门出来,过了马路向南走到中关村十字路口附近,东边有个凹进去的小路,路北侧有个不起眼的小店卖实验试剂,那里就有卖无水酒精的,一瓶10块钱,500ml。

回家之后准备好螺丝刀,开拆。我先找了张白纸,把背面所有的螺丝钉位置画在纸上,把拆下来的每个螺丝钉直接插在纸上的相应位置,这样就不会记错位置了。这个idea还不错吧:)

拆完背面的螺丝就可以取下掌托和键盘,然后再按攻略拆掉键盘下面、靠近左下角的一颗螺丝,就可以把边框打开。最后把风扇上的螺丝拆掉,很容易就把风扇取下来了。

风扇上的灰很多。我拿了个小盆儿,倒了300ml酒精进去,然后把风扇扔进去泡了泡,摇了摇,就当洗萝卜那么洗。5分钟后觉得差不多了,电吹风吹干,把所有螺丝装回去,搞定~

虽然有的攻略说要用超声波清洗机,有的说要加黄油,甚至还有的说要把风扇拆开了洗……但实践证明简单泡一泡的效果也很好。只花10块钱,风扇安静了,又能听到硬盘的声音了~:)

2十/083

丽江·印象

雪山是个神圣的地方。

海拔4k以上的地方就是另一个世界;除了白色的冰川,灰色的石头和蓝色的天空,一切其他颜色都难觅踪迹。

这里没有动物也没有植物,只有些苔藓。气喘吁吁的登山者交谈的声音在无穷大的空间里显得无比安静。

雪山,在藏语中叫做“冰宫殿”。从云雾缭绕的宫殿里俯视遥远的世界,仅有一小片暗淡的绿色而已。

有个奇怪的联想:雪线之上好比是kernel mode……雪线之下好比是user mode……(最近Windows代码看多了>_<)

-----------理想与现实的分隔线-------------

其实丽江给我的印象是:这个城市太现代化了。

出租车,KFC,商业街,霓虹灯……丽江古城区被重重包围在钢筋水泥之中。

忽略掉古城入口人造的“大水车”还有江core的题字,扑面而来的是无数的商铺和酒吧。这里是后海,是城隍庙,是又一个被商业强奸的地方。当夜幕降临,拥挤的人群,卖花的小女孩,酒吧里震耳欲聋的音乐,夺目的彩灯——

我想我又回到了颓废的城市生活。

累。

出城,还有好多景点。玉水寨,东巴村这些民俗村比较假,像逛动物园。《印象·丽江》给我的主要印象是超级强烈能晒透裤子的太阳,当然,如果没看过《印象·刘三姐》的话,还值得看看。

只有雪山,是丽江唯一纯洁的地方。暂时忘记雪线在不断退缩的事实吧。

分类: 心情 3 评论
   下一页