[转载]Android学习小结(二)——Intent

mikel阅读(1090)

[转载]Android学习小结(二)——Intent – 鸣 – 博客园.

首先介绍一下什么是Intent。Intent是连接核心组件(比如Activity)的类。官方解释为通过叫做Intent的信息来激活Activties。Intent消息是一个用于在运行时进行同一个或者不同应用组件间绑定的一个基础设施。说起来就是跳转的意思。

具体细节这个《Intents and Intent Filters》这个《Intent》这个《IntentFilter》这三篇官方文档已经把Intent写的非常明白了。

但是,这里面存在太多的细节和知识。

这次Android小结,主要拿我最近做的一个小Demo为例,简要说明一些牵扯到的概念,我会尽量抛弃无关的细节。

这个Demo的情境主要是OAuth验证,对于有过基于开放API的应用经验的同学肯定听说过这个词。因为本文不是对OAuth的讲解,对于不知道OAuth的同学可以自行Google。我之前的博文也曾经多次提到过,有兴趣的可以翻看。总之记住是一种“验证”就好了。

整个Demo的流程是:首先打开应用,然后判断当前用户是否已经保存了验证后的信息,如果没有验证过,则跳转到提供开放API的网站,进行验证授权,然后我们保存授权后的信息。最后,我们拿着授权后的信息进行一些具体的操作。大意如下图所示。

未验证授权:ActivityA -> WebBrowser -> ActivityB
已验证授权:ActivityA -> ActivityB

可以清楚的看到,我们需要在多个Activity之前进行切换,甚至调用不是自己写的Activity(系统自带的WebBrower)。这种操作就需要用到Intent类,之前在《Android学习小结(一)——由Activity说开去》提到过一点Intent的知识。

之前也说过Intent分为两种,一种是显式的(Explicit),另一种是隐式的(Implicit)。然而没有涉及过多,只是简要说明了显示调用的方法。

比如:

1 Intent i = new Intent(this, ActivityB.class);
2 startActivity(i);

Intent的构造函数提供了多个重载,这里我用到的是public Intent (Context packageContext, Class cls)。

This provides a convenient way to create an intent that is intended to execute a hard-coded class name, rather than relying on the system to find an appropriate class for you.

这个理解起来,就是从这个Activity跳转到另一个Activity。

Intent提供了很多属性用于更改这种“意图”的细节。包括Component name,Action,Data,Category,Extras,Flags。具体细节可以参阅我前面提供的链接。这里我只说以下,对于前面我提到的这个情境需要用到的东西。

先说一下已验证授权ActivityA -> ActivityB这个流程。这个相对简单很多,没有涉及到什么技术难点,就是一个显式的Intent就可以搞定,前面写到的代码正是这个跳转,无须做多余的操作。

再说未验证授权ActivityA -> WebBrowser -> ActivityB这个流程。这个相对麻烦许多,涉及到两个难点,一是怎么从一个自定义的Activity跳转到系统的一个Activity;二是怎么能从WebBrowser跳转到ActivityB,这个相对前者又难了一步。

我们首先说从ActivityA跳转到WebBrowser。之前提到过Intent包含很多用于变更“意图”的属性,这里我们就用到了Data这个属性,我先写出完整代码,再做进一步解释。

1 Intent i = new Intent(Intent.ACTION_VIEW);
2 i.setData(Uri.parse(url));
3 startActivity(i);

你可能看到了,这次Intent的构造函数没有明确给出跳转的目标Activity。我们调用了构造函数中的另一个重载public Intent (String action)。从参数可以看出,这个实际上是设置了Intent的Action属性,什么是Action呢?官方文档这样解释:“A string naming the action to be performed.”。翻译过来大意为将要执行的操作名字的一个字符串。那么ACTION_VIEW是什么?官方文档这样解释:“Activity Action: Display the data to the user. This is the most common action performed on data.”

先放到这里,说完i.setData(Uri.parse(url))一切就明了了。

setData()方法是设置另一个Intent的属性Data。“The URI of the data to be acted on and the MIME type of that data. Different actions are paired with different kinds of data specifications.”“Similarly, if the action is ACTION_VIEW and the data field is an http: URI, the receiving activity would be called upon to download and display whatever data the URI refers to.”

也就是说当Intent的Action是ACTION_VIEW并且Data是以http:开头的URI,那么就调用浏览器显示它。很神奇吧!(但 是也正是这种神奇,加重了理解整个过程的负担,使过程显得更加隐讳。虽然这样对于熟悉的人来说可能会是一种简洁的方式,但是对于向我这样的新手,理解起来 还是费了不少时间。如果你喜欢Python哲学,那么没准你会讨厌它,虽然我只做了个几天的Android,但是感觉Android中存在很多这种看似巧 合的神奇的东西。)

好了,说完了ActivityA -> WebBrowser的跳转,其实剩下的事情也就好办了。剩下的只有WebBrowser -> ActivityB这个过程了。如果你有认真看关于Action和View的描述,没准你已经发现了方法。

我在《Android学习小结(一)——由Activity说开去》中说过,Android的Activity的设计很像Web页面,接下来的事实更加体现了这一点。

先来回答怎么完成WebBrowser -> ActivityB这个过程,答案是就像Web页面跳转。只不过Web网页都是基于HTTP协议的,所以scheme是http。什么意思?答案还是在 Action和Data中,前文说过,你给Intent的Data一个http开头的链接,它就跳转到WebBrowser了,那么我们自己定义一个 scheme,让我们自己的Activity(这里是ActivityB)实现这个scheme匹配,是不是就可以了呢?答案是肯定的(而且我猜测 WebBrowser的也是因为实现了scheme=”http”所以才能完成这个隐式跳转的)。

方案有了,但是我们还缺少一个至关重要的东西,怎么让Activity实现这个scheme(其实说“实现”这个词不是很好,说成匹配较好,就像我之前说的,这个东西就像正则匹配URL一样)。方法是intent-filter。

Structured description of Intent values to be matched. An IntentFilter can match against actions, categories, and data (either via its type, scheme, and/or path) in an Intent. It also includes a “priority” value which is used to order multiple matching filters.

intent-filter我不细说了,就直接说实现。方法为在AndroidManifest.xml中声明的ActivityB添加相应的 intent-filter属性,action为android.intent.action.VIEW,data为 android:scheme=”myscheme”。这样通过让浏览器,访问myscheme://xxxx的链接,webbrowser就会自动切换到ActivityB了。

于是大工告成!但是还不能高兴的太早,这里有一个小问题,就是当你跳到ActivityB后,按手机上的Back键,会回到WebBrowser,然而WebBrowser只是个中间过程,我们肯定不希望看到WebBrowser。

对于这个问题,我也一直没有什么解决方案,只好求助StackOverflow,最终得以解决(这里我不免再次推荐一次StackOverflow,我多次表达过我对这个网站的喜爱之情,如果你知道网站的“作者”,那么你会更喜欢它)。我粘一下问题的链接,有兴趣的同学,自己前去看看吧!

注:本人初学,可能一些细节上会有纰漏,如果你有什么迷惑可以留言或者可以Google,谢谢!

[转载]C# 条形码(Barcode)的绘制(附件下载)

mikel阅读(917)

[转载]C# 条形码(Barcode)的绘制(附件下载) – 穿梭老李 – 博客园.

网上找了一下发现大部分都是关于39的,没事就收集了一些其他方式的……

简单代码(有时间上源码)附件下载

Bitmap image = new Bitmap(image_width, barMaxHeight + ((int)new Font("@宋体", 13).Height));

using (Graphics dc = Graphics.FromImage(image))
{
Rectangle bounds = new Rectangle((image.Width-totalImageWidth)/2, 0, totalImageWidth, barMaxHeight);
Render(barcode, dc, bounds, interGlyphSpace, barMinHeight, barMinWidth, barMaxWidth);

dc.DrawString(text, new Font("@宋体", 13), Brushes.Black, (image.Width-(int)textPosition.Width)/2, image.Height-(int)textPosition.Height,StringFormat.GenericDefault);
}
image.Save(@"G:\barcode.png");
return image;
调用示例:

private void button1_Click(object sender, EventArgs e)
{
    BarcodeDraw draw = null;
    draw = InstallBarcodeDraw(draw);
    pictureBox1.Image = draw.Draw(textBox1.Text, 80);
    //x draw.Draw(textBox1.Text,80).Save(@"G:\barcode.png");
}

private BarcodeDraw InstallBarcodeDraw(BarcodeDraw draw)
{
    switch (comboBox1.Text)
    {
        case "Code11C":
            draw = BarcodeDrawFactory.GetSymbology(BarcodeSymbology.Code11C); break;
        case "Code39NC":
            draw = BarcodeDrawFactory.GetSymbology(BarcodeSymbology.Code11NC); break;

[转载]ASP.NET MVC3缓存之一:使用页面缓存

mikel阅读(1117)

[转载]MVC3缓存之一:使用页面缓存 – 好记性不如烂键盘 – 博客园.

在以前的WebForm的开发中,在页面的头部加上OutputCache即可启用页面缓存,而在MVC3中,使用了Razor模板引擎的话,该如何使用页面缓存呢?

如何启用

在MVC3中要如果要启用页面缓存,在页面对应的Action前面加上一个OutputCache属性即可。

我们建一个Demo来测试一下,在此Demo中,在View的Home目录下的Index.cshtml中让页面输入当前的时间。

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<div>
<h2>
现在时间:@DateTime.Now.ToString(“T”)
</h2>
</div>
</body>
</html>

在Controllers中添加对应的Action,并加上OutputCache属性。

[HandleError]

public class HomeController : Controller
{
[OutputCache(Duration
= 5, VaryByParam = none)]
public ActionResult Index()
{
return View();
}
}

刷新页面即可看到页面做了一个10秒的缓存。当页面中数据不是需要实时的呈现给用户时,这样的页面缓存可以减小实时地对数据处理和请求,当然这是针对整个页面做的缓存,缓存的粒度还是比较粗的。

缓存的位置

可以通过设置缓存的Location属性,决定将缓存放置在何处。

Location可以设置的属性如下:

· Any
· Client
· Downstream
· Server
· None
· ServerAndClient

Location的默认值为Any。一般推荐将用户侧的信息存储在Client端,一些公用的信息存储在Server端。

加上Location应该像这样。

[HandleError]
public class HomeController : Controller
{
[OutputCache(Duration
= 5, VaryByParam = none, Location = OutputCacheLocation.Client, NoStore = true)]
public ActionResult Index()
{
return View();
}

}

缓存依赖

VaryByParam可以对缓存设置缓存依赖条件,如一个产品详细页面,可能就是根据产品ID进行缓存页面。

缓存依赖应该设置成下面这样。

[HandleError]
public class HomeController : Controller
{
[OutputCache(Duration
= int.MaxValue, VaryByParam = id)]
public ActionResult Index()
{
return View();
}
}

另一种通用的设置方法

当我们需要对多个Action进行统一的设置时,可以在web.config文件中统一配置后进行应用即可。

在web.config中配置下Caching节点

<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name=”Cache1Hour” duration=”3600″ varyByParam=”none”/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>

那么在Action上使用该配置节点即可,这样的方法对于统一管理配置信息比较方便。

[HandleError]
public class HomeController : Controller
{
[OutputCache(CacheProfile
= Cache1Hour)]
public ActionResult Index()
{
return View();
}
}

[转载]ASP.NET 使用URLRewriter重写二级域名

mikel阅读(1024)

[转载]ASP.NET 使用URLRewriter重写二级域名 – 张浩华 – 博客园.

这里要求对域名进行重写,实现http://1234.abc.com/ 到 ~/Defa.aspx?id=1234的重写。

第一:域名

首先域名要支持泛解悉,就是域名解悉的主机名为星号*,例:*.abc.com。如下图


这样能保证你在浏览器地址栏输入任何前缀,DNS都会把它们指向到你指定的IP地址上。

第二:IIS设置(Win2003 + IIS 6为例)

(1)网站必须为Web服务器的默认站点,即端口号为80,主机头为空的站点。如下图所示。


该站点接收所有对该服务器的HTTP请求(其它设置为主机头的站点除外)。所以任何二级域名访问该服务器都会由该站点进行处理。

(2)另外要在站点的“通配符应用程序映射”列表中添加ASP.NET的Web请求处理程序aspnet_isapi.dll。如下图所示。


在这里的设置,是让该站点接到的所有请求都交给aspnet_isapi.dll处理。

第三:修改Microsoft的URLRewriter。

运行开源项目URLRewriter。这里需要修改两个地方:

(1)BaseModuleRewriter.cs类

protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e)

{

     HttpApplication app = (HttpApplication) sender;

     //Rewrite(app.Request.Path, app);

    Rewrite(app.Request.Url.AbsoluteUri, app);    // ## ## ## 这里修改了

}

这里将app.Request.Path 替换成了 app.Request.Url.AbsoluteUri

(2)ModuleRewriter.cs类

protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)

{

    // log information to the Trace object.

    app.Context.Trace.Write("ModuleRewriter", "Entering ModuleRewriter");

 

    // get the configuration rules

    RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;

 

    // iterate through each rule...

    for (int i = 0; i < rules.Count; i++)

    {

        // get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)

        //string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";

        string lookFor = "^" + rules[i].LookFor + "$";    // ## ## ## 这里修改了

 

        // Create a regex (note that IgnoreCase is set...)

        Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);

 

        // See if a match is found

        if (re.IsMatch(requestedPath))

        {

            // match found - do any replacement needed

            string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));

 

            // log rewriting information to the Trace object

            app.Context.Trace.Write("ModuleRewriter", "Rewriting URL to " + sendToUrl);

 

            // Rewrite the URL

            RewriterUtils.RewriteUrl(app.Context, sendToUrl);

            break;     // exit the for loop

        }

    }

 

    // Log information to the Trace object

    app.Context.Trace.Write("ModuleRewriter", "Exiting ModuleRewriter");

}

这里将string lookFor = “^” + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + “$”;

改成了 string lookFor = “^” + rules[i].LookFor + “$”;

这两个地方修改完以后,生成项目。将项止目bin/Debug目录下的URLRewriter.dll文件Copy到我们要重写URL的项目中。

第四:配置项目
(1)在web.config文件的configSections节点下添加如下一行代码

1 <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/>

这里配置一个重写配置的类

(2)修改httpModules节点,在里面添加一行配置代码

1 <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter" />

(3)在主节点configuration节点下添加路由规则,代码如下:

1 <!-- URL重写 将捕获页面转发到实际地址 --> 2 3 <RewriterConfig> 4 5 <Rules> 6 7 <RewriterRule> 8 9 <LookFor>http://(\w+).abc.com/</LookFor> 10 11 <SendTo>~/Defa.aspx?id=$1</SendTo> 12 13 </RewriterRule> 14 15 </Rules> 16 17 </RewriterConfig> 18 19 <!-- URL重写 将捕获页面转发到实际地址 ( 结束 ) -->

代码里一个RewriterRule节点就是一个规则,这时只有一个,即把域名中的主机头部分做为Defa.aspx页面的id参数的值发送给Defa.aspx页面。

注意:这里LookFor节点里的http://(\w+).abc.com/不能少了最后的反斜框

OK,一切完工

发布,上传到服务器,测试一下,如图

[转载]谈谈Nullable的类型转换问题

mikel阅读(949)

[转载]谈谈Nullable的类型转换问题 – – 博客园.

本篇文章讨论可空值类型(Nullable<T>)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章。虽然没有什么技术含量可言,也希望对某些读者带来帮助。

目录
一、四种典型的值类型转换方式
二、当类型转换遭遇Nullable<T>
三、将基于Nullable<T>的类型转换实现在扩展方法中
四、进一步完善扩展方法ConvertTo
五、谈谈NullableTypeConverter

一、四种典型的类型转换方式

对于类型转化,或者进一步地,对于像Int、Double、DateTime、String等这些原生类型之间的转化,我们具有四种典型的转换方式。如果类型之间不具有隐士转换关系存储,我们可以之间通过类型转换操作符进行显式转换,比如:

   1: double doubleValue  = 3.14159265;
   2: int intValue        = (int)doubleValue;

第二种则是借助于Convert这个静态类型的ChangeType或者ToXxx方法(Xxx代表转换的目标类型),比如:

   1: string literalValue = "123";
   2: int intValue1       = Convert.ToInt32(literalValue);
   3: int intValue2       = (int)Convert.ChangeType(literalValue, typeof(int));

第三种方法为创建TypeConverter或者它的基于具体类型的若干子类,比如StringConverter、 BooleanConverter、DateTimeConverter等。在使用的时候你需要先实例化相应的TypeConverter,然后调用相应 的类型转换方法。比如:

   1: string literalValue                 = "1981-08-24";
   2: DateTimeConverter dateTypeConverter = new DateTimeConverter();
   3: DateTime dateTimeValue   = (DateTime)dateTypeConverter.ConvertFromString(literalValue);
   4:
   5: literalValue                        = "02:40:50";
   6: TimeSpanConverter timeSpanConverter = new TimeSpanConverter();
   7: TimeSpan timeSpanValue              = (TimeSpan)timeSpanConverter.ConvertFromString(literalValue);

最后一种常见的方法用在将基于某种具体类型的格式化字符串转化成对应的类型,我们可以调用具体类型的静态方法Parse或者TryParse实现类型的转换,比如:

   1: string literalValue     = "1981-08-24";
   2: DateTime dateTimeValue1 = DateTime.Parse(literalValue);
   3: DateTime dateTimeValue2;
   4: if (DateTime.TryParse(literalValue, out dateTimeValue2))
   5: {
   6:     //...
   7: }

二、当类型转换遭遇Nullable<T>类型

Convert几乎实现所有“兼容类型”之间的转换,也可以向Parse方法一样解析具有合法格式的字符串。但是,如果目标类型换成是 Nullable<T>类型的时候,类型转换将会失败。比如我们将上面第二个例子的目标类型从int换成int? (Nullable<Int32>):

   1: string literalValue = "123";
   2: try
   3: {
   4:     int? intValue = (int?)Convert.ChangeType(literalValue, typeof(int?));
   5: }
   6: catch (InvalidCastException ex)
   7: {
   8:     Console.WriteLine(ex.Message);
   9: }

类型转换错误消息会被输出:

   1: Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int32, mscorlib,
   2:  Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.

实际上,如果你调用Convert的ChangeType方法将任何类型对象转换成Nullable<T>类型,都会抛出出 InvalidCastException异常,即使你将T类型转化成Nullable<T>。比如,我们将上面的例子中原数据类型换成 int类型:

   1: int intValue1 = 123;
   2: try
   3: {
   4:     int? intValue = (int?)Convert.ChangeType(intValue1, typeof(int?));
   5: }
   6: catch (InvalidCastException ex)
   7: {
   8:     Console.WriteLine(ex.Message);
   9: }

依然会输入类似的错误信息:

   1: Invalid cast from 'System.Int32' to 'System.Nullable`1[[System.Int32, mscorlib,
   2: Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.

而实际上,T类型的对象是可以显式或者隐式转化成Nullable<T>对象的。也就是说,下面代码所表示的类型转换是没有问题的:

   1: int intValue1   = 123;
   2: int? intValue2  = intValue1;
   3: int? intValue3  = (int?)intValue1;

三、将基于Nullable<T>的类型转换实现在扩展方法中

从上面的介绍我们可以得出这样的结论:如果类型T1和T2能够相互兼容,我们可以借助Convert将T1类型对象转换成T2类型,然后通过显式类 型转换进一步转换成Nullable<T2>。我们可以通过这两个步骤实现针对于Nullable<T>类型的转换。为了操作方 便,我将此转换逻辑写在针对IConvertible接口的扩展方法中:

   1: public static class ConvertionExtensions
   2: {
   3:     public static T? ConvertTo<T>(this IConvertible convertibleValue) where T : struct
   4:     {
   5:         if (null == convertibleValue)
   6:         {
   7:             return null;
   8:         }
   9:         return (T?)Convert.ChangeType(convertibleValue, typeof(T));
  10:     }
  11: }

借助于上面这个扩展方法ConvertTo,对于目标类型为Nullable<T>的转换就显得很简单了:

   1: int? intValue           = "123".ConvertTo<int>();
   2: double? doubleValue     = "123".ConvertTo<double>();
   3: DateTime? dateTimeValue = "1981-08-24".ConvertTo<DateTime>();

四、进一步完善扩展方法ConvertTo

上面定义的扩展方法只能完成针对目标类型为Nullable<T>的转换。现在我们来进一步完善它,让这个方法可以实现任意类型之间的转换。下面是我们新版本的ConvertTo方法的定义:

   1: public static T ConvertTo<T>(this IConvertible convertibleValue)
   2: {
   3:     if (null == convertibleValue)
   4:     {
   5:         return default(T);
   6:     }
   7:
   8:     if (!typeof(T).IsGenericType)
   9:     {
  10:         return (T)Convert.ChangeType(convertibleValue, typeof(T));
  11:     }
  12:     else
  13:     {
  14:         Type genericTypeDefinition = typeof(T).GetGenericTypeDefinition();
  15:         if (genericTypeDefinition == typeof(Nullable<>))
  16:         {
  17:             return (T)Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(typeof(T)));
  18:         }
  19:     }
  20:     throw new InvalidCastException(string.Format("Invalid cast from type \"{0}\" to type \"{1}\".", convertibleValue.GetType().FullName, typeof(T).FullName));
  21: }

在上面的方法中,我们首先需要确定目标类型是否是Nullable<T>,这个可以通过调用Type对象的 GetGenericTypeDefinition方法来判断。如果是,则先要将其转换成对应的基本类型(Nullable<T>的泛型类 型)。我们可以通过调用静态类Nullable的静态方法GetUnderlyingType来获得这个基本类型(Underlying Type)。有了这个完善版本的ConvertTo扩展方法,我们就可以进行任意的类型转化了——不论目标类型是可空值类型,还是非可空值类型:

   1: int intValue1               = "123".ConvertTo<int>();
   2: int? intValue2              = "123".ConvertTo<int?>();
   3: DateTime dateTimeValue1     = "1981-08-24".ConvertTo<DateTime>();
   4: DateTime? dateTimeValue2    = "1981-08-24".ConvertTo<DateTime?>();

五、谈谈NullableConverter

上面谈到TypeConverter这个类型,并且说到它具有一系列针对具体数据类型的子类。其中一个子类就是 NullableConverter,故名思义,这个TypeConverter专门用于Nullable<T>的类型转换。使用该类实现针 对可空值类型的转换很方便,比如:

   1: string literalValue         = "1981-08-24";
   2: NullableConverter converter = new NullableConverter(typeof(DateTime?));
   3: DateTime? dateTimevalue     = (DateTime?)converter.ConvertFromString(literalValue);

[转载]学习HTML5十佳站点推荐

mikel阅读(900)

[转载]学习HTML5十佳站点推荐 – 梦想天空 – 博客园.

当下掀起一股HTML5学习热潮,越来越多的人尝试用HTML5来制作网页游戏等丰 富的Web应用。尽管HTML5的完全实现还有很长的路要走,但HTML5正在改变Web,未来HTML5将把Web带入一个更加成熟和开放的应用平台。 为了方便大家学习HTML5 ,本文向大家推荐十个非常好的学习HTML5的网站

1. Dive into HTML5

HTML5 Resources

2. HTML5 Doctor

HTML5 Resources

3. WTF is HTML5

HTML5 Resources

4. HTML5 Games

HTML5 Resources

5. HTML5 Test

HTML5 Resources

6. HTML5 Rocks

HTML5 Resources

7. HTML5.Org

HTML5 Resources

8. HTML5 Gallery

HTML5 Resources

9. HTML5 Demos

HTML5 Resources

10. W3Schools HTML5

HTML5 Resources

(编译来源:梦想天空 原文来自:10 Best Websites To Get Everything About HTML5

[转载]XML Web Service示例

mikel阅读(1069)

[转载]XML Web Service示例 – 赋闲在家 – 博客园.

对于初识XML Web Service并想快速上手的人,可能希望快速了解它的创建和调用方法。本文将用一个小例子来讲述如何用Visual Studio 2008来创建Web Service以及如何来调用它。例子中的Web Service将根据客户程序的请求来返回一幅图像。

1. 创建Web Service项目

打开VS2008,选择File/New/Project菜单项,在打开的New Project对话框中,依次选择Visual C# -> Web -> ASP.NET Web Service Application,然后输入项目名称(Name),存放位置(Position)和解决方案名称(Solution Name),点击“OK”生成项目。此例中我们用AnnotationWebService作为项目和解决方案的名称(见图1)。

XML Web Service示例(图1)

1New Project对话框

2. 增加一个Web Service

VS2008Solution Explorer中点击AnnotationWebService项,选择Project/Add new item菜单项,在打开的Add New Item对话框中,依次选择Web/Web Service,然后输入Web Service的名称(Name),点击“Add”来增加一个Web Service。此例中我们用ImageService作为Web Service的名称(见图2)。

XML Web Service示例(图2)

2Add New Item对话框

之后,我们在Solution Explorer中会看到这样的项目目录(见图3)。(注意:系统在创建项目时会缺省地增加一个Web Service,名字为Service1,可以点击其右键菜单中的Delete项将其删除。)

XML Web Service示例(图3)

3Solution Explorer

3. Web Service编码

右键点击ImageService.asmx,选择View Markup,可以打开此文件,我们可以看到如下一行:

<%@ WebService Language=”C# CodeBehind=”ImageService.asmx.cs” Class=”AnnotationWebService.ImageService” %>

它指示ImageService的代码在ImageService.asmx.cs文件中。我们右键点击ImageService.asmx,选择View Code,打开ImageService.asmx.cs文件,增加我们的服务代码,此例中,我们编写一个根据给定的文件名读取图像并返回给客户端的方法GetImage(见下面代码)。

using System.IO;

using System.Web;

using System.Web.Services;

using System.Web.Services.Protocols;

namespace AnnotationWebService

{

/// <summary>

/// Summary description for ImageService

/// </summary>

[WebService(Namespace = “http://tempuri.org/”)]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

[System.ComponentModel.ToolboxItem(false)]

// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.

// [System.Web.Script.Services.ScriptService]

public class ImageService : System.Web.Services.WebService

{

[WebMethod(Description=“Request an image by name”)]

public byte[] GetImage(string imageFileName)

{

byte[] imageArray = GetBinaryFile(imageFileName);

if (imageArray.Length < 2)

{

throw new SoapException(“Could not open image on server.”, SoapException.ServerFaultCode);

}

else

{

return imageArray;

}

}

private byte[] GetBinaryFile(string fileName)

{

string fullPathFileName = HttpContext.Current.Request.PhysicalApplicationPath + fileName;

if (File.Exists(fullPathFileName))

{

try

{

FileStream fileStream = File.OpenRead(fullPathFileName);

return ConvertStreamToByteBuffer(fileStream);

}

catch

{

return new byte[0];

}

}

else

{

return new byte[0];

}

}

public byte[] ConvertStreamToByteBuffer(Stream imageStream)

{

int imageByte;

MemoryStream tempStream = new MemoryStream();

while ((imageByte = imageStream.ReadByte()) != -1)

{

tempStream.WriteByte((byte)imageByte);

}

return tempStream.ToArray();

}

}

}

4. IIS中增加虚拟目录(Virtual Directory)

打开IIS控制台程序,右键点击Default Web Site,选择增加New/Virtual Directory菜单项,在打开的Virtual Directory Caption Wizard对话框中输入虚拟目录别名(Alias),此例中我们输入AnnotationWebService,点击“Next”,再选择ImageService.asmx所在的目录,再点击“Next”直到“Finish”。(注:以上描述是基于XP SP3环境。)

5. Web Service创建代理(Proxy)

VS2008中,打开一个Windows应用程序解决方案(.sln),此例中我们打开一个叫做AnnotationApp的解决方案。在要调用Web Service的项目上(比如此例中我们选择用DataLib)点击右键,选择Add Web Reference菜单项(如果从未添加过Web Reference,可能会看不到Add Web Reference菜单项,我们可以先选择Add Service Reference菜单项,在弹出的Add Service Reference对话框中点击“Advanced”,再在弹出的Service Reference Settings对话框里点击“Add Web Reference”),在弹出的Add Web Reference对话框中,输入我们要调用的Web ServiceURL,此例中我们输入:

http://localhost/AnnotationWebService/ImageService.asmx

然后点击“Go”,ImageService就会显示在下面的Web Page里,在Web reference name编辑框输入Web引用的名字,为了避免再用ImageService这个名字,这里我们输入ImageWebService(见图4),然后点击“Add Reference”来添加Web引用。

XML Web Service示例(图4)

4Add Web Reference对话框

这会在Solution Explorer中增加一个Web Reference(见图5)。

XML Web Service示例(图5)

5Web Reference被添加

添加的引用是Image Service的代理代码,其中包括一个与ImageService同名的类,派生于System.Web.Services.Protocols.SoapHttpClientProtocol。这样在客户代码中就可以像调用自己的Assembly里的方法一样调用ImageServiceGetImage方法。

6. 客户程序调用Web Service

在客户程序中需要调取图像的地方增加如下代码(注:代码中的Image类不是.Net Framework类库中的Image类,是客户程序中的一个类):

ImageService imageService = new ImageService();

Bitmap bitmap;

try

{

byte[] image = imageService.GetImage(“half-bred panthers.jpg”);

MemoryStream memoryStream = new MemoryStream(image);

bitmap = new Bitmap(memoryStream);

_image = new Image(_viewportTransformer, bitmap);

}

catch (WebException e)

{

// Exception handling

}

然后,可以将图像显示出来。

7.运行客户程序来测试Web Service调用

编译运行客户程序,Web Service被成功调用并返回所调用的图像(见图6)。

XML Web Service示例(图6)

6:运行结果

本文参考了Stephen C. Perry编著的《Core C# and .Net》(C# 2.0)第18章“XML Web Service”。所述例子在Visual Studio 2008上实际编写并调试通过。

[转载]关于string.Join()的妙用与疑惑

mikel阅读(981)

[转载]关于string.Join()的妙用与疑惑 – 我是你的猪 – 博客园.

String.Join  在指定 String 数组的每个元素之间串联指定的分隔符 String,从而产生单个串联的字符串。(来源于MSDN)

假设我有一分类表cat,包含id,name列

内容如下:

//id  name
//1    随笔
//2    文章
//3    新闻

如果想得到”随笔,文章,新闻“的结果,我会这么写(假设已经取得List<cat>):

StringBuilder sb = new StringBuilder();
int i = 0;
foreach (var item in cat)
{
sb.Append(cat.Name);
if (cat.Count != i)
{
sb.Append(
,);
}
i
++;
}
return sb.ToString();

或者这种(需保证cat.Count>0):

StringBuilder sb = new StringBuilder();
foreach (var item in cat)
{
sb.Append(
,);
sb.Append(cat.Name);
i
++;
}
return sb.ToString().Substring(1);

但是当有了string.Join之后,一切简单多了:

return string.Join(,, cat.Select(p=>p.Name).ToList());

PS.如果是List<string>的话,可以直接省略后面的.Select(p=>p.Name).ToList(),因为是实体List<cat>,所以需要指定需要遍历的列

这确实很方便,以前要5,6行的代码,现在一行就解决了.

于是我将这种方法大量使用在了我的MVC网站中,先看下最终效果:

首先,我跟上面一样,想循环得到一个分类列表:

string.Join(,, Model.Cats.Select(item => item.Name).ToList())

但是,这是在MVC的Razor页面,所以,我想生成的是带超链接的文字,那么应该这样做:

string.Join(,, Model.Tags.Select(item => Html.ActionLink(item.Name, Index, Article, new { t = item.Name }, new { title = string.Format(查看 {0} 的全部文章, item.Name) })).ToList())

但是发现运行之后变成了这样:

原来Html被转移了,看来需要使用下Html.Raw()方法,于是:

Html.Raw(string.Join(,, Model.Tags.Select(item => Html.ActionLink(item.Name, Index, Article, new { t = item.Name }, new { title = string.Format(查看 {0} 的全部文章, item.Name) })).ToList()))

最终,我们得到了一个超长的方法.

这是原来的方法:

@{int i = 0;}
@foreach (var item
in Model.Categorys)
{
@Html.ActionLink(item.Name,
Index, Article , new { c = item.Url }, new { title =string.Format( 查看 {0} 的全部文章,item.Name) })
@(
++i == Model.Categorys.Count ? string.Empty : ,)
}

我现在已经分不清string.Join()是精简了我的代码,还是复杂了我的代码了.不过确实要承认,在比较简单的情况下,string.Join()的确能减少我们很多的代码.

以上,欢迎拍砖

[转载]网站架构之缓存应用(4)Memcached缓存监控管理

mikel阅读(1025)

[转载]网站架构之缓存应用(4)缓存监控管理 – ASP.NET – 博客园.

对于web系统中增加缓存服务,使用起来还是挺方便的,目前可采用的方案比较多,有微软的企业库,memcached等等。但如果需要很好的对项目中的缓 存进行监控管理,也不是一件特别容易的事情,例如:监控缓存服务器上都有哪些项目使用了缓存,具体都有多少个key,大小,单个key的命中率以及过期时 间等信息。有了这些信息,就非常容易排查内存为什么快用完的问题,如果再提供手动过期缓存的服务,就更好了,有的时候由于数据出错,需要紧急让缓存失效, 此种办法影响最小。

这篇我来总结了针对memcached的缓存管理。

其实memcached本身也提供了一些缓存统计信息,例如:当前总共的缓存数量,使用的内存量,总获取次数,总的写入次数,总的命中次数等等,但这种统计信息粒度太大:

1:无法具体到单个key,如果我们想针对某一个key统计它的命中率情况,就不好办了。

2:无法分析系统中都有哪些项目使用了key,哪个项目占用的key多,内存多。

3:无法实现手工过期,这种需求某些特殊情况下也是很有帮助的。

既然memcached本身不提供,我这里采用了一种变通的方式来记录我们特定的信息。

首先我们引进一个概念:分区,这个分区可以理解成电脑上的硬盘分区,用户可以把不同的文件放在不同的分区上,这样在管理上也容易些,同样分区底下有子分 区,就像电脑上的文件一样,子分区下面就是具体的key了,对于我们的cache后台管理,可以这样理解,一个项目可以分配为一个分区,按项目功能模块可 以分为不同的子分区,子分区下来分散着N多key。

实现方案:我们可以对每个key的访问记录下它的一些信息,例如:大小,所属分区名,过期时间,访问命中率,然后把这些信息在每个memcached 实例上创建一个特殊key,用于存储key的访问信息。

注意点:

1:由于记录访问信息都需要更新特殊key,如果过于频繁,会影响正常的cache性能,所以可以考虑形成一个内存队列,当数量达到多少后(如果key使用频率不高,还可以设定时间,当过了这个时间,即使数量不够也进行更新),统一更新特殊key内容。
2:由于memcached有单个key大小限制,所以对于这种统计信息key,不能过大,记录key访问信息时,尽量以文本形式存储,这样能保证最小。

3:每个实例中对应一个用于存储key访问信息的key,这样可以统计更多的key。
监控视图:通过上面的努力,我们可以形成三个视图:
第一:memcached 实例视图,以某个具体cache实例为单位,呈现memcached服务本身所提供的统计信息,还包含此实例中包含了多少个分区,即实例上包含了多少个项目使用的缓存。
第二:分区视图,根据分区名称,集合所有节点的数据,最终汇总出统计数据,例如可以统计酒店项目总共使用了多少个key等,这对分析key的分布情况比较有帮助。
第三:key视图,呈现具体key的访问信息,以及手工过期功能。

总结:上面的方案虽然能实现需求,但在实际生产环境中,尽量不要打开这种监控功能,需要的时候再打开,尽量让cache的效率最高。

[转载]《Android学习指南》目录。强烈推荐不可多得的好教程

mikel阅读(957)

[转载]《Android学习指南》目录。强烈推荐不可多得的好教程 – qixiinghaitang – 博客园.

Android学习指南基础篇文章目录

课程 描述
第一讲:Android开发环境的搭建
第二讲:Android系统构架分析和应用程序目录结构分析
第三讲:Android模拟器的使用 emulator
第四讲:Activity入门指南 Activity
第五讲:用户界面 View(一) FrameLayout, LinearLayout
第六讲:用户界面 View(二) AbsoluteLayout,RelativeLayout
第七讲:用户界面 View(三) TableLayout
第八讲:Intent入门指南 Intent
第九讲:用户界面 View(四) Button TextView EditView CheckBox
RadioGroup RadioButton ImageView ImageButton
第十讲:用户界面 View(五) Spinner,AutoCompleteTextView
DatePicker,TimePicker
第十一讲:用户界面 View(六) ProgressBar SeekBar RatingBar
第十二讲:用户界面 View(七) ListView
第十三讲:用户界面 View(八) Gallery,GridView
第十四讲:Service入门指南
第十五讲:SQLite入门指南
第十六讲:菜单 Android Menu
第十七讲:对话框 Android Dialog
第十八讲:Android SharedPreferences和File
第十九讲:Android Notification的使用入门
第二十讲:Content Provider 使用入门
第二十一讲:Broadcast Receiver 使用入门
第二十二讲:AIDL和远程Service调用 未写
第二十三讲:Drawable使用入门
第二十四讲:Android动画入门(一) Teen Animation,Frame Animation
第二十五讲:Android动画入门(二) SurfaceView 窈窈莫尔斯灯塔
第二十六讲:Android中的GPS应用入门
第二十七讲:Handler使用入门
第二十八讲:Android多媒体(Media)入门 音乐播放、视频播放、声音录制,窈窈录音
第二十九讲:WebView学习指南
第三十讲:URLConnection和HttpClient使用入门 读取Google天气预报信息