[转载]谷歌 Chrome Dev Tools 浅析 – 成为更高效的 Developer

mikel阅读(997)

[转载]谷歌 Chrome Dev Tools 浅析 – 成为更高效的 Developer – 葡萄城控件技术团队博客 – 博客园.

Google Chrome在招来了FireFox,FireBug的项目组领导人John J. Barton后,Chrome Dev Tools也变的越来越好用,越来越方便了。本文根据Google I/O上对Chrome Dev Tools的介绍(http://www.youtube.com/watch?v=N8SS-rUEZPg),和相关PPT:http://chrome-devtools-io2011.appspot.com/template/index.html 整理而来。(参照的Chrome版本为: 19.0.1084.52)

实时CSS Style编辑

选择一个Dom,可以对Dom进行编辑和操作,实时修改Css Style, 同时CssStyle可以保存变更历史版本。

clip_image002

保存变更历史版本:

clip_image004

同时支持可以在Chrome 载入的Css文件正文中自由的修改。

 

网络交互

clip_image006

当一个页面载入时,所有发出的请求可以在“Network”里监听到,同时下面有”All”, “Documents”, ”Stylesheets”, “Images”, “Scripts”, “XHR”(XMLHttpRequst), WebSockets, Other, 这几个分类,可以清晰的把网络请求进行分类,同时可以看到每个请求的详细情况。

 

控制台

在控制台里可以方便的使用命令来查看Dom,执行JavaScript, 等等操作, Console API: http://getfirebug.com/wiki/index.php/Command_Line_API copy(), dir(), inspect(), $0,

clip_image008

 

Script Debugging

Script Debugging 脚本调试功能,这个功能可以说是Chrome Dev Tools里最实用最强大的工具了:

1. JavaScript Breakpoints, Break on exception, JavaScript Pretty Print.

clip_image010

Break Points:断点在需要设置的地方点一下即可,Break on exception:当此功能开启时,有Script异常出现时,自动会在Exception处断住,方便差错。JavaScript Pretty Print: 当JavaScript被压缩后,非常难阅读,Pretty Print使JavaScript按照语法和关键字重新换行并重排,使得压缩后的JavaScript仍然可以进行阅读。

 

2. DOM Breakpoints

Dom元素断点,经常有多处JavaScript操作同一个Dom元素,如果要在JavaScript上下断点,要下好几个地方,不好断到想要的地方,在Dom元素上下断点就方便多了:

clip_image012

Break on subtree modifications, Break on attributes modifications, Break on node removal, 可以方便的断到操作Dom的JavaScript。

 

3. XHR Breakpoints, Event listener breakpoints:

clip_image014

XHR Breakpoints,可以方便的断到XMLHttpRequest Ajax请求。Event Listener Breakpoints, 可以方便的断到各种Event。

 

4. 查找JavaScript

使用Ctrl+Shift+F, 打开查找窗口, 查找支持正则表达式:

clip_image016

查找函数定义:Ctrl + Shift + o

clip_image018

查找文件: Ctrl + o

clip_image020

 

5. 实时修改 JavaScript代码

页面外链JavaScript文件在 Script Panel中可以直接修改,改完后Ctrl + s 保存, 会立即生效,但是不支持 Html 页面中 JavaScript 修改,经过 Pretty print 格式化的JavaScript也不支持实时修改。

 

6. 自建Script文件

在Console(控制台) 中输入代码的最后一行加上 //@ sourceURL=filename.js, 会在Script Panel中加入一个新的外链Script文件: filename.js, 这个新文件和其它外链JavaScript 文件一样,可以实时进行修改。

 

Timeline

Timeline功能把浏览器处理Dom的时间轴画了出来,方便进行优化:

clip_image022

 

Remote Debugging

Remote Debugging 使得Chrome成为一个WebServer,执行命令–remote-debugging-port=1337, 同时再开一个Chrome 访问localhost:1337, 就可以用一个Chrome当Host,一个Chrome当Client,在调试一些移动Web的时候非常实用。

clip_image024

[转载]asp.net 解决下载文件--中文名乱码问题

mikel阅读(1174)

[转载][asp.net]解决下载文件–中文名乱码问题 – Gary.Zhan – 博客园.

最近的项目中需要导出Excel 表格,Excel名称是中文的,在IE中下载老是出现中文名称乱码问题,设置 Respone Encoding 无果,最后找到解决方案如下:

public static string ToHexString(string s)
        {
            char[] chars = s.ToCharArray();
            StringBuilder builder = new StringBuilder();
            for (int index = 0; index < chars.Length; index++)
            {
                bool needToEncode = NeedToEncode(chars[index]);
                if (needToEncode)
                {
                    string encodedString = ToHexString(chars[index]);
                    builder.Append(encodedString);
                }
                else
                {
                    builder.Append(chars[index]);
                }
            }
            return builder.ToString();
        }
        /// <summary>
        /// Determines if the character needs to be encoded.
        /// </summary>
        /// <param name="chr"></param>
        /// <returns></returns>
        private static bool NeedToEncode(char chr)
        {
            string reservedChars = "$-_.+!*'(),@=&";
            if (chr > 127)
                return true;
            if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)
                return false;
            return true;
        }
        /// <summary>
        /// Encodes a non-US-ASCII character.
        /// </summary>
        /// <param name="chr"></param>
        /// <returns></returns>
        private static string ToHexString(char chr)
        {
            UTF8Encoding utf8 = new UTF8Encoding();
            byte[] encodedBytes = utf8.GetBytes(chr.ToString());
            StringBuilder builder = new StringBuilder();
            for (int index = 0; index < encodedBytes.Length; index++)
            {
                builder.AppendFormat("%{0}", Convert.ToString(encodedBytes[index], 16));
            }
            return builder.ToString();
        }

使用时,只需调用:
string downloadName = ToHexString(“中文名称”);

[转载]在ASP.NET MVC2.0使用Lodop为WEB打印提出完美解决方案

mikel阅读(1055)

[转载]在MVC2.0使用Lodop为WEB打印提出完美解决方案 – ryanding – 博客园.

通过好友CallHot介绍Lodopweb打印控件。由于是国人开发的,故这两天认真了研究下,打算在未来的项目中使用。现将学习成果与园友分享。如果存在不足的地方,希望您指出。

具体的实现步骤如下:

一、准备工作


1.MVC2.0 + JQuery1.4.1 开发环境。

2.Lodop web 打印控件,官方地址:http://mtsoftware.v053.gokao.net/download.html  (注:国人开发,免费软件)。

3.StringTemplate,C#开源模板引擎。官方地址:http://www.stringtemplate.org。

本文主要给出WEB下打印步骤实现方案,具体的技术实现细节,请查看官方API。lodop,stringtemplate 官方已给出了详尽的文档说明。

  二、MVC2.0使用StringTemplate构造打印模板


StringTemplate 文中简称st。网络上有相关文档介绍st效率还不错。本文将st作为报表打印模板。在实际项目开发中将繁杂的报表打印工作内容,部分分配给美工来处理。而 开发人员只需提供数据源接口。使用st可以减轻开发人员的工作量。并将报表开发任务分工更细致。给项目带来的好处就不多论了。具体实现如下:

      1.在MVC2.0项目中引用st核心dll:

      2.建立st的模板文件,template.st(st模板专用文件):

也可以认为st文件就是一个普通的html文件。该部分主要由美工负责处理,比如CSS。

       3.在MVC2.0 controller 内建立提供数据源的 JsonResult:

public JsonResult Print()
{
//构造打印数据
List list = new List();
for (int i = 0; i &lt; 100; i++)
{
list.Add(new CustomerTest { CustomerName = "candy" + i, CustomerAddress = "思明区" + i, CustomerPhone = "13148484855" + i });
list.Add(new CustomerTest { CustomerName = "linda" + i, CustomerAddress = "湖里区" + i, CustomerPhone = "13847487545" + i });
list.Add(new CustomerTest { CustomerName = "ellie" + i, CustomerAddress = "海昌区" + i, CustomerPhone = "1359984665" + i });
}

//StringTemplate 打印模板文件,实际项目中为提高程序效率,应将打印模板文件缓存。
string serverPath = System.Web.HttpContext.Current.Server.MapPath("~");
string path = Path.Combine(serverPath, @"PrintTemplate\");

StringTemplateGroup group = new StringTemplateGroup("myGroup", path, typeof(TemplateLexer));
StringTemplate st = group.GetInstanceOf("template");
st.SetAttribute("customer", list);

//为打印提供html相关超文本内容。
StringBuilder sb = new StringBuilder();
sb.Append(@"");
sb.Append("");
sb.Append(@"");
sb.Append(@"");
string cssContent = System.IO.File.ReadAllText(Path.Combine(serverPath, @"Content\CSS\CSSForPrint.css"));
sb.Append(@"");
sb.Append("");
sb.Append("");
sb.Append(st.ToString());
sb.Append(" ");
sb.Append("");
sb.Append("");

return Json(new { success = true, data = sb.ToString() }, JsonRequestBehavior.AllowGet);
}

其中CustomerTest是自定义数据类,已经给出详细的注释了。仔细阅读不难理解。

4.MVC2.0 view html head 内加入js 代码:


<script type="text/javascript" language="javascript" src="CheckActivX.js"></script><object id="LODOP" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width="0" height="0"> </object><script type="text/javascript">// <![CDATA[

        function prn1_preview(data) {
            LODOP.PRINT_INIT("打印控件功能演示_Lodop功能_打印表格");
            //报表标题
            LODOP.ADD_PRINT_HTM(50, 300, 330, 300,
                      "<font color ='black' size ='6'>客户列表</font><font color ='blue' size ='2'>(制表人:张三)</font>");
            //报表内容打印。
            LODOP.ADD_PRINT_TABLE(100, 150, 760, 900, data);
            LODOP.PREVIEW();
        };

        $(function () {
            $("#btnPrint").click(function () {
                var url = '<%=Url.Action("Print","Home") %>';
                $.ajax({
                    type: "POST",
                    url: url,
                    cache: false,
                    dataType: 'json',
                    success: function (result) {
                        if (result.success) {
                            prn1_preview(result.data);
                        }
                    }
                });
            });
        })

// ]]></script>

三、运行截图


最后一页打印预览:

打印机横向打印:

   四、注意事项


本文给出的web打印方案需要读者对MVC2.0 、JQuery 、StringTemplate 有一定的了解。另外本例只是在IE下实现了WEB打印,如果需要Firefox或其他浏览器下支持web打印请联系Lodop作者

[转载]google的html/css规范指南

mikel阅读(1081)

[转载]google的html/css规范指南 – html5salon – 博客园.

google之前出了JavaScript规范指南,中文翻译传送门在此,现在有了html/css规范指南,明河开始翻译时版本是2.1。后续如果google有新的内容补充,明河也会跟进。

常规样式规则

协议

引入的assets资源文件(js、css、图片文件)忽略协议http:, https:),比如:
不推荐的写法:

推荐的写法:

<script src="//www.google.com/js/gweb/analytics/autotrack.js"></script>

不推荐的写法:

.example {
}

推荐的写法:

.example {
  background: url(//www.google.com/images/example);
}

关于google的这点建议,明河倒是觉得有待商榷,有兴趣的朋友看http://stackoverflow.com/questions/4831741/can-i-change-all-my-http-links-to-just,里面有详细的讨论,根据一位网友的测试,相对url在IE7、IE8下存在二次加载的问题。

常规格式规则

缩进

使用二个空格缩进(PS:明河一般使用四个空格缩进-_-!)

  1. <ul>
  2.   <li>Fantastic</li>
  3.   <li>Great</li>
  4. </ul>
.example {
  color: blue;
}
大写

只使用小写。
所有的代码只使用小写字母(PS:淘宝的做法是如果跟js的DOM操作相关,作为钩子使用J_Trigger类似的方式):包括元素名称、样式名、属性名(除了text/CDATA)。
不推荐的写法:

  1. <A HREF=/>Home</A>

推荐的写法:

<img src="google.png" alt="Google">
尾部空白

删掉冗余的行尾空格。
不推荐的写法:

What?_

推荐的写法:

Yes please.

常规Meta规则

编码

使用utf-8编码。
指定页面的文档编码为utf-8

<meta charset="utf-8">

不需要特别指定样式引用的编码为utf-8。
(ps:关于html编码指定方面的内容,可以看《 Character Sets & Encodings in XHTML, HTML and CSS》

注释

如果可能,注释还是必不可少的。
使用注释说明下代码:它包括了什么,它的目的是什么,为什么优先使用它。

行动项目

(ps:推荐使用)
google建议养成写TODO的习惯,特别是在项目中,记录下一些要改,但来不及修改的地方,或指派其他同事做修改。
高亮TODO,不同的编辑器有不一样的方式,比如idea是TODO:。

{# TODO(john.doe): revisit centering #}
<center>Test</center>
<!-- TODO: remove optional tags -->
<ul>
<li>Apples</li>
<li>Oranges</li>
</ul>

常规html设计规则

文档类型

使用html5文档声明:

  1. <!DOCTYPE html>

不再使用XHTML( application/xhtml+xml)。

HTML 的正确性

可以使用一些工具,检验你html的正确性,比如 W3C HTML validator
不推荐的写法:

<article>This is only a test.
</article>

推荐的写法:

  1. <!DOCTYPE html>
  2. <meta charset=utf-8>
  3. <title>Test</title>
  4. <article>This is only a test.</article>
HTML 的语义性

使用富含语义性的标签(ps:建议掌握html5新增的部分语义标签)。
google特别指出了要确保html的可用性,看下面的代码
不推荐的写法:

<div onclick="goToRecommendations();">All recommendations</div>

推荐的写法:

<a href="recommendations/">All recommendations</a>
多媒体元素降级处理

给多媒体元素,比如canvas、videos、 images增加alt属性,提高可用性(特别是常用的img标签,尽可量得加上alt属性,提供图片的描述信息)。
不推荐的写法:

<img src="spreadsheet.png">

推荐的写法:

<img src="spreadsheet.png" alt="Spreadsheet screenshot.">
html、css、JavaScript三层分离

尽可能保持结构(html结构标签)、描述(css)、行为(javascript)的分离,并且让他们尽可能少的交互。确保html文档内容只有html的结构,将css和javascript以资源的方式引入。
不推荐的写法:

  1. <!DOCTYPE html>
  2. <title>HTML sucks</title>
  3. <link rel=stylesheet href=base.css media=screen>
  4. <link rel=stylesheet href=grid.css media=screen>
  5. <link rel=stylesheet href=print.css media=print>
  6. <h1 style=font-size: 1em;>HTML sucks</h1>
  7. <p>I’ve read about this on a few sites but now I’m sure:
  8.   <u>HTML is stupid!!1</u>
  9. <center>I can’t believe there’s no way to control the styling of
  10.   my website without doing everything all over again!</center>

推荐的写法:

  1. <!DOCTYPE html>
  2. <title>My first CSS-only redesign</title>
  3. <link rel=stylesheet href=default.css>
  4. <h1>My first CSS-only redesign</h1>
  5. <p>I’ve read about this on a few sites but today I’m actually
  6.   doing it: separating concerns and avoiding anything in the HTML of
  7.   my website that is presentational.
  8. <p>It’s awesome!
实体引用

在html页面中避免使用实体引用。
如果你的文件是utf-8编码,就不需要使用像 —, or 的实体引用。
不推荐的写法:

The currency symbol for the Euro is “&eur;”.

推荐的写法:

The currency symbol for the Euro is “€”.
可选的标签

忽略一些可选的标签,比如
不推荐的写法:

  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <title>Spending money, spending bytes</title>
  5.   </head>
  6.   <body>
  7.     <p>Sic.</p>
  8.   </body>
  9. </html>

推荐的写法:

  1. <!DOCTYPE html>
  2. <title>Saving money, saving bytes</title>
  3. <p>Qed.

html5的文档,可以忽略head、body标签。
所有可忽略的标签,可以看《 HTML5 specification 》

type属性

样式和脚本引用可以忽略type属性。
不推荐的写法:

<link rel="stylesheet" href="//www.google.com/css/maia.css" type="text/css">

推荐的写法:

<link rel="stylesheet" href="//www.google.com/css/maia.css">

不推荐的写法:

<script src="//www.google.com/js/gweb/analytics/autotrack.js" type="text/javascript"></script>

推荐的写法:

<script src="//www.google.com/js/gweb/analytics/autotrack.js"></script>

html格式规则

常规格式

每一块、每一列表、每一表格元素都需要另起一行,并缩进每个子元素。

  1. <blockquote>
  2.   <p><em>Space</em>, the final frontier.</p>
  3. </blockquote>
  1. <ul>
  2.   <li>Moe
  3.   <li>Larry
  4.   <li>Curly
  5. </ul>
  1. <table>
  2.   <thead>
  3.     <tr>
  4.       <th scope=col>Income</th>
  5.       <th scope=col>Taxes</th>
  6.   <tbody>
  7.     <tr>
  8.       <td>$ 5.00</td>
  9.       <td>$ 4.50</td>
  10. </table>

css样式规则

css验证

尽可能验证css的合法性,可以使用 W3C CSS validator

id和class名

使用富有含义和通用的id和class名。
(ps:明河经常听周围的同事感慨,取好名字,也是个学问,有时候有些命名会让你很纠结,但好的命名的确可以提高可读性和可维护性。)
使用功能性和通用性的命名方式减少文档或模板的不必要的改动。
不推荐的写法:

/* Not recommended: meaningless */
#yee-1901 {}
/* Not recommended: presentational */
.button-green {}
.clear {}

推荐的写法:

/* Recommended: specific */
#gallery {}
#login {}
.video {}
/* Recommended: generic */
.aux {}
.alt {}
id和class的命名风格

id和class的命名在保持语义性的同时尽可能的短。
不推荐的写法:

#navigation {}
.atr {}

推荐的写法:

#nav {}
.author {}

可以缩写单词,但缩写后务必能让人明白其含义。比如author缩写成atr就非常费解。

选择器

避免出现多余的祖先选择器。(存在性能上的差异问题,可以看 performance reasons
避免出现元素标签名作为选择器的一部分。
不推荐的写法:

ul#example {}
div.error {}

推荐的写法:

#example {}
.error {}
简化css属性写法

不推荐的写法:

border-top-style: none;
font-family: palatino, georgia, serif;
font-size: 100%;
line-height: 1.6;
padding-bottom: 2em;
padding-left: 1em;
padding-right: 1em;
padding-top: 0;

推荐的写法:

border-top: 0;
font: 100%/1.6 palatino, georgia, serif;
padding: 0 1em 2em;

使用简洁的属性写法有利于提高可读性和解析效率。

0和单位

属性值为0时,忽略单位。

margin: 0;
padding: 0;
属性值出现小数点忽略0
font-size: .8em;
url的引用

使用url()时忽略刮号中的””。

@import url(//www.google.com/css/go.css);
16进制符号

不推荐的写法:

color: #eebbcc;

推荐的写法:

color: #ebc;
前缀

给选择器样式名增加前缀(可选)。
在大的项目(多人协作)中使用前缀可以减少样式冲突,同时可以明确选择器归属含义。

.adw-help {} /* AdWords */
#maia-note {} /* Maia */

(PS:一般明河使用前缀来定位样式的归属,比如.nav-item,表明是nav导航下的子元素样式。)

id和class名的分隔符

单词使用“-”来连接。
不推荐的写法:

/* Not recommended: does not separate the words “demo” and “image” */
.demoimage {}
/* Not recommended: uses underscore instead of hyphen */
.error_status {}

推荐的写法:

#video-id {}
.ads-sample {}
Hacks

尽可能地避免使用hack的方式解决浏览器样式兼容性问题。
(ps:明河觉得这个很难,毕竟IE横在那里。)
尽量避免使用CSS filters。

css格式规则

css属性按字母顺序书写

(PS:排序忽略浏览器前缀,比如-moz-,-webkit-)

background: fuchsia;
border: 1px solid;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
color: black;
text-align: center;
text-indent: 2em;
块内容缩进
@media screen, projection {
  html {
    background: #fff;
    color: #444;
  }
}

缩进所有的块状内容

不可缺少的;

不推荐的写法:

.test {
  display: block;
  height: 100px
}

推荐的写法:

.test {
  display: block;
  height: 100px;
}
属性值前增加个空格

不推荐的写法:

h3 {
  font-weight:bold;
}

推荐的写法:

h3 {
  font-weight: bold;
}
分隔选择器

不推荐的写法:

a:focus, a:active {
  position: relative; top: 1px;
}

推荐的写法:

h1,
h2,
h3 {
  font-weight: normal;
  line-height: 1.2;
}
1行只有一个css属性,二个规则间有一个空行
html {
  background: #fff;
}
body {
  margin: auto;
  width: 50%;
}

[转载]SVN+AnkhSVN端配置

mikel阅读(1198)

[转载]SVN+AnkhSVN端配置 – stabley107 – 博客园.

对于ankhSVN我想很多人不陌生,因为经常使用,但是我还是发现很多人并不怎么会配置,或者完全不知道其需要配置,

如果不配置的话,当两个人同时需要修改某个文件的时候就容易中弹了。SVN默认是不支持“

锁定-编辑-解锁”的,所要你去配置。配置步骤吐下:

1)鼠标单击settings

2)鼠标单击edit

3)在相应位置添加

enable-auto-props = yes

* = svn:needs-lock,如下图

3)

这样设置之后新加入svn的文件会呈现锁型,但之前已经存在的文件却不是这样,如下图

Account.aspx是新加进去的,AccountDetail.aspx是设置之前已经存在的,能否把

AccountDetail.aspx改成前边带锁的呢?当然可以,步骤

1)鼠标右键单击AccountDetail.aspx文件

2)添加needs-lock属性,点ok后,check in

 

3)效果如图

如果需要的话,前面带勾的文件一个一个设置就好了,希望对大家有帮助。

转载WEB第三方打印控件

mikel阅读(1302)

转载WEB第三方打印控件[ASP.NET常用工具] – 将Java进行到底-http://www.itpob.cn – ITeye技术网站.

在B/S模式开发中,打印是个很大的困扰.无论是采用页面直接输出或者引用WORD.DLL也好,都有不足之处.

目前最好的办法就是采用第三方控件,网上流传的打印控件有很多.总结了下推荐3个给大家:

1、  DLPrinter

DLPrinter打印控件完全免费,界面大方、使用简单、但无签名,支持打印预览、直接打印,可设置页眉、页脚、页边距、打印份数、纸张大小等信息。遗憾的是作者不知道是什么原因,从2007年至今没的更新。

下载地址:http://files.cnblogs.com/panshenglu/DLPrinter.rar
打印预览图:

2、墙外打印控件

墙外打印控件(QWPrint)是一款小巧的打印辅助软件,能够帮助众多制作B/S类程序的程序员更加灵活的控制客户端打印。
功能特点:
·小巧轻便,客户端在第一次使用时只要下载一个ActiveX控件即可使用。
·控制多种打印设置。程序员可以通过控件进行多项设置,包括设置打纸的页边距,页眉页脚,纸张大小等参数。
·精确控制打印。可以方便实现web下的套打操作。

下载地址:http://files.cnblogs.com/panshenglu/墙外打印控件.rar
打印预览图:

3、Lodop(强烈推荐)

对于这个打印控件,用一个词来形容:强大!不仅调用方便,而且功能比你想像中要强大得多。
更多介绍大家到作者博客详细了解。

下载地址:http://files.cnblogs.com/panshenglu/lodop4.0.zip
打印预览图:

[转载]C#设计模式—生成器模式(Builder Pattern)

mikel阅读(1199)

[转载]C#设计模式——生成器模式(Builder Pattern) – saville – 博客园.

一、概述
在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的。生成器模式可以处理这类对象的构建,它提供了一种封装机制来隔离各类子对象的变化,从而保证系统的稳定。
二、生成器模式
生成器模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。其结构图如下:

Builder为创建Product对象的各个子对象指定抽象接口。
ConcreteBuilder实现了Builder接口,用于创建Product对象的各个子对象。
Director使用Builder来创建Product对象。
Product表示被构造的复杂对象。
三、示例
我们以普通汽车和高级汽车的创建为例来展示一下生成器模式的应用。
首先创建抽象的Builder

1     interface ICarBuilder
2     {
3         void BuilderWheels();
4         void BuilderWindows();
5     }

接着创建普通汽车的Builder和高级汽车的Builder

public class BasicBuilder : ICarBuilder
     {
         public void BuilderWheels()
         {
             Console.WriteLine("Builder Basic Wheels");
         }
 
         public void BuilderWindows()
         {
             Console.WriteLine("Builder Basic Windows");
         }
     }
 
     public class AdvancedBuilder : ICarBuilder
     {
         public void BuilderWheels()
         {
             Console.WriteLine("Builder Advanced Wheels");
         }
 
         public void BuilderWindows()
         {
             Console.WriteLine("Builder Advanced Windows");
         }
     }

然后创建汽车建造工厂,它使用Builder来创建不同种类的汽车

class CarFactory
     {
         public ICarBuilder Builder { get; set; }
 
         public CarFactory(ICarBuilder builder)
         {
             Builder = builder;
         }
 
         public void CreateCar()
         {
             Builder.BuilderWheels();
             Builder.BuilderWindows();
         }
     }

最后看一下如何调用

static void Main(string[] args)
     {
         CarFactory game = new CarFactory(new BasicBuilder());
         game.CreateCar();
         game.Builder = new AdvancedBuilder();
         game.CreateCar();
         Console.ReadLine();
     }

[转载]Android Camera 开发之前言

mikel阅读(998)

[转载]Android Camera 开发之前言 – 和尚释然 – 博客园.

Android Camera 开发之前言


一、Android Camera成像原理介绍

Camera工作流程图:

image

Camera的成像原理可以简单概括如下:

景 物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过ADC(模数转换)转换后变为数字图 像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过IO接口传输到CPU中处理,通过DISPLAY就可以看到图像了。

二、Android Camera的架构浅析

Android的Camera包含取景器(viewfinder)和拍摄照片的功能。从其程序的架构上主要分为客户端和服务端两个部分,它们建立在Android的进程间通讯的Binder的结构上.如果想详细了解Android的Binder机制,请参看”云中漫步的”Android系统的Binder机制.接下来我们详细介绍一下Android Camera的架构.

要了解Android Camera架构,还是得先从Android本身的架构说起。

Android 架构图

从Android框架看,分为四层:应用层,应用框架层,库层,内核层.

应用层主要工作在Android SDK之上,利用Android 提供的API进行开发,生成APK包.

应用框架层整合了Android自带各种控件和类,为应用开发提供高效,方便的API接口.这个对上实现统一的接口,对下也提供统一的标准方便各种库的移入.

库层是Android与底层硬件通信接口,它封装底层硬件接口实现该模块的具体逻辑,并以服务的形式通过Binder通讯机制暴露给应用框架.

内核层则是直接与硬件联系的一层,可以理解为设备驱动.

通过对上面框架的简要说明,我们大致明白一个应用自上而下的各个层起什么作用,这样有助于我们对代码的理解和修改.如果要做基于Android porting(移植)工作,就要明白在哪个层次的porting,怎么porting?

说完Android整体框架,我们以Camera为例来说明一下Camera在各层是如何实现。下图是Camera部分在Android上各层的分布图

Camera结构分布图

应用层

Camera的 应用层在Android上表现为直接调用SDK API开发的一个Camera 应用APK包。代码在\android\packages\apps\Camera下。主要是Java写的基于 android.hardware.Camera类调用的封装,并且实现Camera应用的业务逻辑和UI显示。 android.hardware.Camera就是Android提供给上层调用的Camera类。这个类用来连接或断开一个Camera服务,设置拍 摄参数,开始、停止预览,拍照等。它也是Android Camera应用框架封装暴露出来的接口。一个Android应用中若要使用这个类,需要在Manifest文件声明Camera的权限,另外还需要添加 一些<uses-feature>元素来声明应用中的Camera特性,如自动对焦等。具体做法可如下:

<uses-permission android:name=”android.permission.CAMERA” />

<uses-feature android:name=”android.hardware.camera” />

<uses-feature android:name=”android.hardware.camera.autofocus” />

应用框架层

Camera框 架层将应用与底层的实现隔离开来,实现了一套Android定义的对上对下接口规范,方便应用及底层硬件的开发和移植。这一层对上以Java类的形式包装 出android.hardware.Camera,提供给应用层调用;对下在CameraHardwareInterface.h头文件中定义了 Camera硬件抽象层的接口,这是一个包含纯虚函数的类,必须被实现类继承才能使用。这个实现类也即是下层中将讲到的用户库层,它继承 CameraHardwareInterface接口,实例化对底层硬件驱动的封装,最终生成libcamera.so供框架的 libcameraservice.so调用。这样做的好处是让Camera的应用框架代码独立,不受底层硬件驱动改变的影响,方便在不同平台上 porting 驱动代码,而保持上层的代码不用变化。

 库层(硬件抽象层HAL Hardware Abstraction Layer)

这 个层次其实就是用户空间的驱动代码。前面有介绍过框架层对下在CameraHardwareInterface.h头文件中定义了Camera硬件抽象层 的接口,它是包含纯虚函数的类,必须被实现类继承才能使用。HAL层正好继承CameraHardwareInterface接口,依据V4l2规范实例 化底层硬件驱动,使用ioctl方式调用驱动,最终生成libcamera.so供框架的libcameraservice.so调用。

内核层

这一层主要是基于Linux的设备驱动。对Camera来说,一般是按V4l2规范将Camera原子功能以ioctl的形式暴露出来供HAL层调用的实现。

参考:

http://blog.csdn.net/BonderWu/archive/2010/08/15/5814278.aspx

http://wenku.baidu.com/view/c45c1b4e852458fb770b568c.html

http://www.360doc.com/content/11/0106/16/4915724_84479344.shtml#

[转载]在论 EXISTS作用

mikel阅读(1294)

[转载]在论 EXISTS作用 – 361741352 – 博客园.

EXISTS

作用

检查查询中是否产生某些行。返回true 或者false。

注意

1 无论查询是否返回行,EXISTS都不会返回UNKNOWN.

下面查询返回来自Spain并且发生过订单的消费者,

SELECT CustomerID, CompanyName

FROM dbo.Customers AS C

WHERE Country = N’Spain’

AND EXISTS

(

SELECT * FROM Orders AS O

WHERE O.CustomerID = C.CustomerID

)

 

三值逻辑

如果考虑三值逻辑则EXISTS 和 in就会有一个区别

当输入列表包含null时,in实际上会产生一个UNKNOWN的逻辑结果,

例如 IN(a,b,null) 的结果是UNKNOWN 帅选器中UNKNOWN的处理与false类似,使用in谓词查询结果和EXISTS的查询结果是一样的,而优化器知道这一点,所以产生相同的执行计划,

 

not EXISTS 和 NOT IN

假如你要查询来自Spain 且没有订单的消费者,下面使用NOT EXISTS

SELECT CustomerID,CompanyName

FROM dbo.Customers as c

where Country = ‘Spain’

and not exists

(

select * from Orders as o

where O.CustomerID = C.CustomerID

)

二者之间的差异

当查询列表中包含null 如 not(a,b,c,null)此时NOT IN查询总是返回一个空集。因为谓词val in(val1,val2,…..null)只返回 not true 和not unknown,不返回TRUE.

 

 

缺失 最小值的解决方法

 

逆反逻辑在写SQL程序中的应用。

 

不常用的谓词

some  any  all

[转载]使用MvcContrib分离ASP.NET MVC项目

mikel阅读(1346)

[转载]使用MvcContrib分离ASP.NET MVC项目 – Lyon.L – 博客园.

概述

ASP.NET MVC复杂项目的开发中,随着项目规模的扩大,我们可能需要对不同模块按需进行分离。可以使用ASP.NET MVC框架提供的“区域(Areas)”功能来组织项目,具体参见《使用Areas分离ASP.NET MVC项目》。 但是从上文可以看出,几个项目都是围绕Areas,通过“Build Event”最后整合到一起,总是有些“藕断丝连”的感觉。可以说,通过Areas独立出来的项目,并没有达到彻底的分离。在上文的评论中,有朋友指出可 以使用MvcContrib,于是学习了一下。

MvcContrib(Portable Area)可以将一个MVC项目里的所有内容(包括Views,Controllers,Scripts等)都编译到一个dll里面。如此一来,该MVC 项目就可以作为一个“插件(或部件)/Plugin(or Widget)”为其他项目使用,具有很强的重用性。

环境准备

仍然考虑上文中的场景:将面向用户的前台和面向管理员的后台进行分离。

  1. 首先新建一个ASP.NET MVC3项目MyPortableAreaDemo(前台项目),项目模板选择“Internet Application”,视图引擎选择“Razor”。
  2. 新增一个空的MVC项目MyPortableAreaDemo.Admin(后台项目),删除Global.asax.
  3. 在MyPortableAreaDemo.Admin项目上面右键,添加一个类AdminAreaRegistration.cs并输入以下内容:
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}

public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}

安装MvcContrib

使用NuGet为MyPortableAreaDemo.Admin安装MvcContrib:

2012-6-6 21-52-49

或者在Package Manager Console里面输入:Install-Package MvcContrib 进行安装。

2012-6-6 21-59-31

使用MvcContrib

打开AdminAreaRegistration.cs,然后将其基类AreaRegistration修改为PortableAreaRegistration,将RegisterArea方法声明修改为(重要!):

1
public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)

为默认路由加上命名空间限制,并且在RegisterArea方法中加入RegisterAreaEmbeddedResources()。现在看起来应该是这样子:

2012-6-10 19-39-00

在MyPortableAreaDemo.Admin/Controllers下面添加一个HomeController和Index的Action,并且添加相应的View文件:

2012-6-10 19-40-13

下面这一步非常重要:

将所有的css,js,image静态文件的属性-生成操作(Build Action)选择“嵌入的资源(Embedded Resources)”。这意味着这些静态文件都将被编译进dll文件里面,而不是像之前那样,以单独物理文件存在。这样做的好处是整个项目里面的结构都 是相对固定的,一个dll就包括了整个工程里的所有内容,可复用性高。缺点是每次修改了这个项目里的内容(即便是修改js或view等静态内容),也必须 要重新编译整个项目。这就要看个人的取舍了,你可以权衡这样做是否值得。

2012-6-10 17-34-03

现在在主项目里面引用Admin项目。在主项目里面添加一个叫做Areas的文件夹,并将MyPortableAreaDemo/Web.config复制到新建的Areas文件夹下。

为什么需要这样做呢?这是因为Admin项目里的Portable Area在被主项目加载时,会被映射到这个Areas文件夹里,此时Controller就会在Areas下面去寻找对应的Views(而不是在主项目里寻找)视图。

好了,现在编译(记住,Portable Areas项目修改任何内容都必须重新编译!)整个解决方案,从主项目启动后访问:/Admin/Home/Index,如果一切顺利,你会看到:

2012-6-10 18-49-47

访问静态文件

前面我们提到所有的静态文件(js,css,image)都被编译到了dll中,那么我们如何访问这些静态内容呢?尝试直接访问/Admin /Scripts/JQuery-1.4.4.min.js,浏览器会提示“无法找到资源”。因此我们还需要修改一下 AdminAreaRegistration.cs,添加如下路由:

//Scripts
context.MapRoute(
AreaName + "_Scripts",
base.AreaRoutePrefix + "/Scripts/{resourceName}",
new { controller = "EmbeddedResource", action = "Index", resourcePath="Scripts" },
new[] { "MvcContrib.PortableAreas" }
);
//Content
context.MapRoute(
AreaName + "_Content",
base.AreaRoutePrefix + "/Content/{resourceName}",
new { controller = "EmbeddedResource", action = "Index", resourcePath = "Content" },
new[] { "MvcContrib.PortableAreas" }
);

注意其中的resourcePath的值。现在我们就可以直接使用/Admin/Scripts/JQuery-1.4.4.min.js这种方式来访问内嵌资源了。

总结

通过MvcContrib Portable Area我们可以将MVC项目进行有效分离,并且使用内嵌资源的方式,将整个分离出来的项目编译成一个dll,可以随意复制引用,可重用性较好。

但是,这种方式也存在以下不足之处:

  1. 由于所有静态资源都被编译到dll中,这就不可避免造成dll的体积变得越来越大,尤其在图片比较多的情况下更为明显。
  2. 静态资源的访问形式。如果上面的Content,Scripts文件夹下面还有子文件夹(这是很常见的情形),只能通过resource的方式访问,而不能通过伪物理地址的方式,不算太友好。

基于上面两点,建议只将view视图文件作为内嵌资源编译到dll中,所有的静态文件(js,css,image)可以放到主项目中,直接访问。或者放在Admin项目里面,通过Build Event的方式同步到主项目相应目录里(参考上文)。

接下来准备研究一下nopCommerce的项目分离方式,插件式开发,希望每天都能进步一些。

项目源码下载:MyPortableAreaDemo.zip