[原创]SQL Server统计当天数据写法

mikel阅读(1121)

最近统计数据功能涉及到统计指定的区间的记录数量的问题,结果输入起始时间:2011-06-20 终止时间:2011-06-20用直接的Between查询不出2011-06-20的记录数

select count(id),userid from goods where createDate between '2011-06-20' and '2011-06-20' group by userid

问题出在,实际SQL Server是在查询2011-06-20 00:00:00 至 2011-06-20 00:00:00的记录,这一时间没有记录,则不返回值,好了,问题原因找到的那么开始解决问题吧

于是我们先把CreateDate的日期转换成不含分秒时的字符串然后再用between比较,代码如下:

select count(id),userid from goods where Convert(char(10),createDate,120) between '2011-06-20' and '2011-06-20' group by userid

解释一下Convert函数:
Convert是将CreateDate日期类型转换为Char类型长度是10的字符串,并且格式是120也就是:“yyyy-mm-dd hh:mm:ss”格式,因为字符长度为10自然就只有日期,没有分秒时了,然后再比较区间的值是否符合

[转载]如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode)

mikel阅读(945)

[转载]如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode) – 陈希章 – 博客园.

之前我写过一篇博客文章,讲的是.NET 4.0的应用程序部署问题。有网友问到一个相关问题就是:如何理解IIS 7中的应用程序池的管道模式,尤其是如何理解“托管模型(integrated mode)”,今天特意再写一篇文章来介绍这个问题。

IIS 7是微软最新版本的IIS版本,从Vista开始提供,目前在Vista,Windows 7,Windows Server 2008中提供。这个全新的版本中,一个突出的亮点就是,它提供了两种管道模式,来支持不同的应用程序场景。

这里提到的管道模式,指的是应用程序池(Application Pool)的一个属性

image

上图中可以看到,这两种管道模式分别为Integrated(集成)和 Classic(经典)

那么,到底如何理解这两种模式呢?

Classic模式:指的是与IIS 6或者之前版本保持兼容的一种模式,一个典型问题就是,在处理ASP.NET这种动态网站的时候,它是通过一个所谓的ISAPI程序,作为插件的方式来工作的。针对不同的动态应用程序(例如ASP,PHP等),会需要不同的ISAPI。

例如,下面就是一个注册号的ISAPI映射

image

从上图可以看出,不同的Request,指定了不同的ISAPI程序。下图是对于这种Pipeline的一个图形化说明

iis 6 pipelines

Integrated模式: 这种全新的模式,允许我们将ASP.NET更好地与IIS集成,甚至允许我们在ASP.NET中编写一些功能(例如Module)来改变IIS的行为(扩 展)。集成的好处是,不再通过ISAPI的方式,提高了速度和稳定性。至于扩展,则可以使得我们对于IIS,以及其他类型的请求有更多的控制。(例如,我 们希望静态网页也具备一些特殊的行为)

下图解释了这一点。

iis 7 integrated mode

以上两个图片来自与下面这个文章,并且该文章有更详细的一些理论介绍。

http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis-7/

下面,我就通过一个例子,来帮助大家更好地了解集成模型。

这个例子里面,我有一个特殊的需求就是,我希望对网站里面所有请求做一个日志监控,不管是动态网页,还是静态网页。

1. 创建一个Web Application

image

2. 添加一个HttpModule

为了对用户请求进行监控,我们一般会编写一个HttpModule

image

image

我为该模块实现简单的功能(将用户的请求地址打印出来在页面上)

using System;
using System.Web;

namespace WebApplication2
{
public class MyModule1 : IHttpModule
{
///
/// You will need to configure this module in the web.config file of your
/// web and register it with IIS before being able to use it. For more information
/// see the following link: http://go.microsoft.com/?linkid=8101007
///
#region IHttpModule Members

public void Dispose()
{
//clean-up code here.
}

public void Init(HttpApplication context)
{
// Below is an example of how you can handle LogRequest event and provide
// custom logging implementation for it
context.LogRequest += new EventHandler(OnLogRequest);
}

#endregion

public void OnLogRequest(Object source, EventArgs e)
{
//custom logging logic can go here
var app = (HttpApplication)source;
app.Response.Write(app.Request.Url.ToString());
}
}
}

3.注册该模块

模块是需要注册才能够使用的。我们一般会想到以前的做法


但这样注册,会遇到一个错误

image

这个错误的意思是,LogRequest这个操作,是必须运行在集成模式下的。

那么,到底如何注册成集成模式的模块呢?

我们需要将配置文件修改成下面这样

<!--?xml version="1.0"?-->

<!--   For more information on how to configure your ASP.NET application, please visit   http://go.microsoft.com/fwlink/?LinkId=169433   -->


<!--<httpModules>
<add name="test" type="WebApplication2.MyModule1,WebApplication2" />
</httpModules>-->




请注意,现在多了一个system.webServer的节,里面有一个modules的节,可以配置需要注册的一些HttpModule

因为是注册为system.webServer的Module,所以,在visual studio中调试是没有效果的

image

我们需要将该应用程序发布到IIS,并且设置为integrated mode。

4.发布到IIS

有很多办法进行发布,我所推荐的是用deploy package的方式。

image

请注意,我们使用的Application Pool是integrated mode的

image

发布之后,我们在浏览器中浏览首页,我们会发现在底部会有一个特殊的输出,就是我们当前请求的地址信息。这说明,我们那个Module已经在工作了。

image

5.测试该模块对于静态页面的支持

如果仅仅是上面这样,我们似乎看不出这种模式到底有何优势。我们以前不也是可以实现这样的效果吗?

请你主要的是,以前的HttpModule只能影响到动态网页,例如我们的ASPX网页,而对于静态网页(例如html),或者其他类型的动态网页(例如php等)是无能为力的。

那么,现在这种模式下情况是怎样的呢?

我们可以添加一个简单的html页面,放在网站根目录下

image

然后,我们去请求该页面

image

是不是很神奇呢?虽然是静态网页,但因为我们那个模块是注册在IIS里面的,它改变了IIS的行为,所以仍然会在页面底部插入一段输出。

6.总结

希望上面这样的例子可以帮助大家更好地理解Integrated mode。它是允许我们将代码插入到IIS内核中,而不再通过ISAPI的方式。这将带来更好的性能和扩展性。

[转载]Asp.net mvc 速度优化 -- 关注Yslow(1)

mikel阅读(1088)

[转载]Asp.net mvc 速度优化 — 关注Yslow(1) – enjoyeclipse – 博客园.

说实话,这篇文章和ASP.NET mvc网站关系并不大,因为这几乎是所有网站的一个通用标准了。而且很惭愧的是,我们的网站 的Yslow评分按照Classic V1的标准也只有D,而且很多方法也是百度, google来的,所以谈不上原创,更多的是方法汇总。但愿能抛砖引玉,让高手也多说说。

前两篇文章 asp.net mvc速度优化 — 页面缓存 asp.net mvc速度优化 — memcache主要解决的是后台代码的事情,这篇文章更多从网站配置和前端方面说说。

为什么要关注YSlow?

yslow是YAHOO网页加速的14条优化法则。更多相信可以参考百度文库的介绍Firefox针对这14条法则有一个插件叫Yslow,前提是需要安装Firebug.Firebug和Yslow的安装都是从Firefox的工具->附加组件中安装,具体细节就不再赘述了。具体是哪14条法则呢,看截图:


1.减少HTTP的访问次数,这个是最难的,因为要涉及很多细节,本文会描述。

2.使用CDN, 内容分发网络。这个没做过,小站点和个人网站貌似也做不起,但淘宝对这个很有

研究,可以关注他们的博客

3.增加Expires headers, 设置页面元素(图片,js,css…)的过期时间,设置了之后,客户端会缓存

4. 使用gzip压缩页面元素,这个蛮给力的,一会儿大家看截图就知道了。

5. 把CSS放在顶部,目的是让页面可以顺序加载,不会很乱,另外也避免页面重画,这个不说

了。

6. 把JavaScript放在底部,JS是串行加载的(阻塞式),这个也不说了。

当然JQuery.js等东东还是放在<head>..</head>之间吧。

7. 避免使用CSS expressions, 这个还是不说了。

8. 把CSS和JavaScript放到外部文件中,因为外部文件可以缓存,另外也便于代码维护。

9. 减少DNS的查询次数,这个没做过,天生就是A,可能以后会遇到问题。

10. 最小化 JavaScript和CSS代码。

11. 避免URL重定向,原则是就是说不要在页面上存在 http://www.incity.me 和 http://www.incity.me/。

12. 删除重复的Javascript和CSS的脚本,这个是废话,但实际上可能由于粗心会存在这个问题。

13. 配置ETags,这里会介绍IIS如何配置ETags.

14. 其实还有个是缓存AJAX.

减少Http访问次数

总的来说,就是减少javascript,css,image的数量,尽量整合,只是需要在代码维护和性能之间做好平衡。

1. 合并Javascript文件。对于小型或者中型站点,以使用JQuery为例,我觉得就应该只要三个js文件:jQuery.js, jQuery.extension.js, yourproject.js. 其中jQuery.js代表你的js版本, jquery.extension.js是把其他所有使用jquery扩展的放到一个文件,jquery.ui.js + jquery.calander.js + jquery.xxx.js => jquery.extension.js, 而project.js则只包含你项目的js.

<head>

<script src=”jquery.js”  />

<script src=”jquery.extension.js” />

<script src=”yourproject.js” />

</head>

2.合并CSS文件,最好不要超过两个,一般中小型站点就一个site.css即可。

3.使用CSS Sprite将多张小图片(特指样式图片)整合到一张大图片里面,这里介绍一个自动生成CSS Sprite的网站, 这点很重要,因为图片往往是耗时最多的。

增加Expires headers

IIS 管理器->HTTP 响应标头->设置常用标头,但这个指标的评分貌似不是很稳定,还在研究中。。。

使用Gzip进行压缩

首先观察下使用Gzip前后的对比:

如何配置?

IIS 管理器 -> 压缩 (需要注意的是,不要对图片进行Gzip压缩,因为Gzip压缩算法本身也要耗费服务器的时间)

配置ETag

其实这里是Disable Etag,

1.下载一个Remtag.dll.

2.IIS管理器 -> ISAPI筛选器,配置好后,重启IIS就看到效果了。

[转载]开发一个Word的代码高亮插件

mikel阅读(1371)

[转载]开发一个Word的代码高亮插件 – 明年我18 – 博客园.

在用Word写技术文档的时候,免不了要在文档中插入一些源代码。为了使插入进来的源代码更可读,就需要使这些代码的关键字高亮显示。所以在写这些文档的时候,我经常需要再开一个Visual Studio,在Visual Studio里编辑好代码之后,复制到Word里面,Word会帮助我们保留代码的格式,达到关键字高亮的效果。

但这样做难免有些不方便,如果能在word中装一个支持代码高亮的插件就好了。在网上搜索无果之后,自己做了一个。

如何开发Word的外接程序是需要解决的第一个问题,可以参考博客园的一个系列:我的VSTO之路,我就是参考着他这个系列做的这个插件,不过目前这个插件只支持Word 2010

接下来,怎样实现代码高亮?幸好,有一个开源的项目Wilco.SyntaxHighlighting可以解决我的问题。它支持多种语言的Highlighter,并提供HtmlRtf两种格式的parserHighlightercode转换为htmlrtf的格式。

最后,怎样把高亮后的代码插入到Word中?由于Word的插件开发不是我研究的重点,所以想了一个比较懒的做法,即把html格式或rtf格式的高亮代码复制到剪贴板上,然后利用_Application.Selection.Paste方法粘帖进来,代码如下:

private void button1_Click(object sender, RibbonControlEventArgs e)

{

var dialog = new MainForm();

if(dialog.ShowDialog() == DialogResult.OK)

{

dialog.CopyToClipboard();

Globals.ThisAddIn.Application.Selection.Paste();

}

}

插件的效果如下。

Word功能区:

image

点设置按钮弹出设置界面,支持RtfHtml两种格式,还可以设置边框、背景、交替行等样式,不过我比较懒,没去研究怎么在Rtf格式下设置边框、背景,所以在Rtf格式下是不支持边框颜色、背景颜色和交替行的。所以建议大家选择Html格式。设置界面如下图:

image

点击插入代码按钮,会弹出插入代码的界面,如下图:

image

可以选择C#JavaXmlJavaScript等多种语言。

一些效果如下:

//no style
private void button1_Click(object sender, RibbonControlEventArgs e)
{
    var dialog = new MainForm();
    if(dialog.ShowDialog() == DialogResult.OK)
    {
        dialog.CopyToClipboard();
        Globals.ThisAddIn.Application.Selection.Paste();
    }
}
//框 + 行号

private void button1_Click(object sender, RibbonControlEventArgs e)

{

var dialog = new MainForm();

if(dialog.ShowDialog() == DialogResult.OK)

{

dialog.CopyToClipboard();

Globals.ThisAddIn.Application.Selection.Paste();

}

}
1: //框 + 行号 + 交替行

2: private void button1_Click(object sender, RibbonControlEventArgs e)

3: {

4:     var dialog = new MainForm();

5:     if(dialog.ShowDialog() == DialogResult.OK)

6:     {

7:         dialog.CopyToClipboard();

8:         Globals.ThisAddIn.Application.Selection.Paste();

9:     }

10: }

我这篇文章就是用Word写的,上面这些代码也是用我做的这个插件插进来的。但就当我兴高采烈的用Word把这篇文章发布到博客园之后,才发现发布后的上述代码段出现了不同程度的变形,而且是无法接受的变形,如下图:

image

可以看到,边框没了,privatevoid之间空格很大,而且还换行了。这个问题研究了很久和不知道该如何解决,可能Word在发布博文的时候对格式的改变太大,导致了变形。

那如果想把Word写的文章发布到博客上怎么办呢?建议在Word里写好的文章后,把内容复制下来,然后在Windows live writer“选择性粘帖”进去,利用windows live writer来发布博客。

源代码下载

[转载]SQL Server计算具体时间的起始日期

mikel阅读(748)

DECLARE @dt datetime 
 SET @dt=GETDATE() 
  
 DECLARE @number int 
 SET @number=3 
  
 --1.指定日期该年的第一天或最后一天 
 --A. 年的第一天 
 SELECT CONVERT(char(5),@dt,120)+'1-1' 
  
 --B. 年的最后一天 
 SELECT CONVERT(char(5),@dt,120)+'12-31' 
  
  
 --2.指定日期所在季度的第一天或最后一天 
 --A. 季度的第一天 
 SELECT CONVERT(datetime, 
     CONVERT(char(8), 
         DATEADD(Month, 
             DATEPART(Quarter,@dt)*3-Month(@dt)-2, 
             @dt), 
         120)+'1') 
  
 --B. 季度的最后一天(CASE判断法) 
 SELECT CONVERT(datetime, 
     CONVERT(char(8), 
         DATEADD(Month, 
             DATEPART(Quarter,@dt)*3-Month(@dt), 
             @dt), 
         120) 
     +CASE WHEN DATEPART(Quarter,@dt) in(1,4) 
         THEN '31'ELSE '30' END) 
  
 --C. 季度的最后一天(直接推算法) 
 SELECT DATEADD(Day,-1, 
     CONVERT(char(8), 
         DATEADD(Month, 
             1+DATEPART(Quarter,@dt)*3-Month(@dt), 
             @dt), 
         120)+'1') 
  
  
 --3.指定日期所在月份的第一天或最后一天 
 --A. 月的第一天 
 SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1') 
  
 --B. 月的最后一天 
 SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1') 
  
 --C. 月的最后一天(容易使用的错误方法) 
 SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt)) 
  
  
 --4.指定日期所在周的任意一天 
 SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt) 
  
  
 --5.指定日期所在周的任意星期几 
 --A.  星期天做为一周的第1天 
 SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt) 
  
 --B.  星期一做为一周的第1天 
 SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt) 
  
  
 1.一个月第一天的 
 Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 
  
 2.本周的星期一 
 Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 
  
 3.一年的第一天 
 Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 
  
 4.季度的第一天 
 Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 
  
 5.当天的半夜 
 Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0) 
  
 6.上个月的最后一天 
 Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) 
  
 7.去年的最后一天 
 Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) 
  
 8.本月的最后一天 
 Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) 
  
 9.本年的最后一天 
 Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) 
  
 10.本月的第一个星期一 
 select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)  
  
 返回当前日期和时间 
 通过函数GETDATE(),你可以获得当前的日期和时间。函数GETDATE()可以用来作为DATEDIME型字段的缺省值。这对插入记录时保存当时的时间是有用的。要建立一个表,其中的记录包含有当前的日期和时间,可以添加一个DATETIME型字段,指定其缺省值为函数GETDATE()的返回值,就象这样: 
  
 Create TABLE site_log ( 
 username VARCHAR(40), 
 useractivity VARCHAR(100), 
 entrydate DATETIME DEFAULT GETDATE()) 
  
 转换日期和时间 
 函数GETDATE()的返回值在显示时只显示到秒。实际上,SQL Sever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒)。 
 要得到不同格式的日期和时间,你需要使用函数CONVERT()。例如,当下面的这个语句执行时,显示的时间将包括毫秒: 
  
 Select CONVERT(VARCHAR(30),GETDATE(),9)

[转载]针对不同手机系统的LBS地图定位解决方案

mikel阅读(1155)

[转载]针对不同手机系统的LBS地图定位解决方案 – 酸奶小妹 – 博客园.

摘要:

针对目前的三种手机系统:Android安卓、S60塞班、IOS苹果,做出的三种不同的手机地图应用解决方案。

查阅了多数地图API对手机的支持情况,发现并没有一家能完全覆盖到这三个平台。

目前,百度地图API的移动版,即SDK版本,只支持安卓系统一种。那么,如果我要开发苹果系统上的收费应用,或者塞班上的手机应用时,应该如何用地图API来实现呢?

我分别总结了三种情况的解决方案。

—————————————————-

Android安卓手机系统

实现方案

百度地图API移动版,即手机SDK

方案说明

SDK版本利用GPSwifi和基站三种定位方式的结合。

目前系统自带的网络定位服务精度低,且服务不稳定、精度低,并且从未来的趋势看,基站定位是不可控的(移动公司随时可能更改基站编号以垄断定位服务),而wifi定位则不然,它是一种精度更高、不受管制的定位方法。国内其它使用wifi定位的地图软件,wifi定位基本不可用。

百度的定位服务量化指标优秀,网络接口返回速度快(达到服务端每次定位响应时间50毫秒以内),精度280米,覆盖率96%,在国内处于一枝独秀的地位。

用户需注意,如果在API中使用此功能,必须注册GPS和网络的使用权限。在获取用户位置时,优先使用GPS进行定位;如果GPS定位没有打开或者没有可用位置信息,则判断是否通过wifi连接,如果是,则通过请求百度网络服务,根据wifi热点位置定位;如果否,则通过百度网络服务根据基站信息进行定位。

开发文档

SDK开发指南网址:

http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97

SDK类参考:

http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%B1%BB%E5%8F%82%E8%80%83

=================================

S60塞班手机系统

实现方案

1、静态图API + S60定位插件

2、百度地图API + S60定位插件

静态图使用说明

静态图服务是百度地图API Web服务集合中的一种,它根据所设定的参数,通过标准HTTP协议,返回相应的地图图片。请注意,您无须执行任何“特殊”操作便可在网页上显示此图片。不需要JavaScript。只需构造一个URL网址,并将其放入 <img> 标记中。您就可以将地图放在网页上。

用户可控制地图图片的长宽、中心点、地图级别;标注一个或多个标注;标注参数可以是百度经纬度,也可以是地标名称。

百度地图API使用说明

百度地图API 适用于任何手机浏览器上。只要是基于S60塞班手机浏览器开发的地图应用,都可以使用百度地图API。用户可采取APP + HTML5的方式进行LBS应用的开发。支持多点触控。

另外,S60塞班系统上,可以使用 S60定位插件。定位插件原理与手机SDK定位原理一致。

定位插件分为两类,每个客户端只能使用其中的一种。

1)服务插件(提供定位服务,顺便也会采集定位数据)

2)采集插件(仅进行定位采集,客户端没有定位需求)

开发文档

静态图开发指南网址:

http://dev.baidu.com/wiki/map/index.php?title=%E9%9D%99%E6%80%81%E5%9B%BEAPI

API开发指南网址:

http://dev.baidu.com/wiki/map/index.php?title=%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97

补充:

百度S60的定位插件,有两个接口。一个是CgeoLocation,另一个是CellDC。

该定位服务可返回如下位置信息:

定位服务支持返回百度坐标系的坐标(如果要叠加百度地图底图,必须使用该坐标系)和国测局坐标,WGS84坐标根据国家法规,暂时不予支持。

定位服务支持返回多级地址,但是各个国家不一样,最多划分为9级,每个级别为“街道”、“城市”、“省”等。我们规定这些元素分别为

street_number:               //门牌号码

street:                                //道路名

district:                               //区县

city:                                    //城市

city_code:                           //城市代码

province:                      //省份名称

country:                               //国家

=================================

IOS苹果手机系统

实现方案

1、静态图API + IOS系统的定位功能

2、百度地图API + IOS系统的定位功能

静态图使用说明

静态图服务是百度地图API Web服务集合中的一种,它根据所设定的参数,通过标准HTTP协议,返回相应的地图图片。请注意,您无须执行任何“特殊”操作便可在网页上显示此图片。不需要JavaScript。只需构造一个URL网址,并将其放入 <img> 标记中。您就可以将地图放在网页上。

用户可控制地图图片的长宽、中心点、地图级别;标注一个或多个标注;标注参数可以是百度经纬度,也可以是地标名称。

地图API使用说明

百度地图API 适用于任何手机浏览器上。只要是基于IOS系统的手机浏览器开发的地图应用,都可以使用百度地图API。用户可采取APP + HTML5的方式进行LBS应用的开发。

注意,IOS系统上只能使用IOS系统自带的定位服务。

另外,针对IOS移动平台,1.2版本APIiPhone4上可以展示出更高分辨率的地图。并且支持多点触控。

开发文档

API开发指南网址:

http://dev.baidu.com/wiki/map/index.php?title=%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97

静态图开发指南网址:

http://dev.baidu.com/wiki/map/index.php?title=%E9%9D%99%E6%80%81%E5%9B%BEAPI

[转载]C#实现对网站数据的采集和抓取

mikel阅读(1275)

[转载]【C#】C#实现对网站数据的采集和抓取 – 悠游人生 – 博客园.

首先大家需要清楚一点的是:任何网站的页面,无论是php、jsp、aspx这些动态页面还是用后台程序生成的静态页面都是可以在浏览器中查看其HTML源文件的。

所以当你要开发数据采集程序的时候,你必须先对你试图采集的网站的前台页面结构(HTML)要有所了解。

当你对要采集数据的网站里的HTML源文件内容十分熟悉之后,剩下程序上的事情就很好办了。因为C#对Web站点进行数据采集其原理就在于“把你要采集的页面HTML源文件下载下来,分析其中HTML代码然后抓取你需要的数据,最后将这些数据保存到本地文件”。

基本流程如下图所示:

1.页面源文件下载

首先引用System.Net命名空间

using System.Net;
using System.Text;
using System.IO;

private WebClient wc = new WebClient();

调用DownloadData方法将指定网页的源文件下载一组BYTE数据,然后将BYTE数组转为字符串。

//下载页面源文件并将其转换成UTF8编码格式的STRING
string mainData = Encoding.UTF8.GetString(wc.DownloadData(string.Format("你要采集的网页地址")));

或则也可以调用DownloadFile方法,先将源文件下载到本地然后再读取其字符串

//下载网页源文件到本地
wc.DownloadFile("你要采集的网页URL","保存源文件的本地文件路径");
//读取下载下来的源文件HTML格式的字符串
string mainData = File.ReadAllText("保存源文件的本地文件路径",Encoding.UTF8);

有了网页HTML格式字符串,就可以对网页分析采集并抓取你所需要的内容了。

2.页面分析采集

页面分析就是要将网页源文件中某个特定或是唯一的字符(串)作为抓取点,以这个抓取点作为开端来截取你想要的页面上的数据。

以博客园为列,比方说我要采集博客园首页上列出来的文章的标题和链接,就必须以”<a class=\”titlelnk\” href=\””作为抓取点,以此展开来抓取文章的标题和链接。

CODE:

//以"<a class="\&quot;titlelnk\&quot;" href="\"></a> mainData=mainData.Substring(mainData.IndexOf("<a class="\&quot;titlelnk\&quot;" href="\">") + 16,
mainData.IndexOf("</a>") - mainData.IndexOf("target=\"_blank\"&gt;") - 16);

注意:当你要采集的网页前台HTML格式变了之后,作为抓取点的字符窜也因做相应地改变,否则是采集不到任何东西的

3.数据保存

当你把需要的数据从网页截取下来后,将数据在程序中稍加整理保存到本地文件(或插入到自己本地的数据库中)。这样整个采集工作就算搞一段落了。

//输出数据到本地文件
File.AppendAllText(CreateFolderIfNot(Settings.Default.OutPath) + articleTitle + ".txt",
articleData,
Encoding.UTF8);

此外附上一个我自己写的采集博客园首页文章的小程序代码,该程序的功能是可以将发布到博客园首页上所有文章采集下来。

下载地址:CnBlogCollector.rar

当然如果博客园前台页面格式调整了,那程序的采集功能肯定是无效的了,只能自己重新调整程序才能继续采集,呵呵。。。

程序效果如下:

[转载]Android笔记-TextView标签

mikel阅读(996)

[转载]【Android笔记】-TextView标签 – fangyukuan – 博客园.

TextView标签

先新建一个工程

File->New->Android Project

  1. 在Project name:输入工程名TextView1
  2. 把Use default location勾去掉,然后选择工程放的位置
  3. Build TargetAndroid版本,这里选择2.1
  4. 在Application name:输入应用程序名.这里也是TextView1
  5. 在package name:输入包的名字com.TextView1
  6. Min SDK Version:这里为7

点完成这里就可以创建一个新的工程了。这里IDE环境已经为我们写了一些基本的代码了:

package com.TextView1;

import android.app.Activity;
import android.os.Bundle;

public class TextView1 extends Activity
{

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

}
}

调试程序

在package Explorer右键工程。Debug as->Android Application 就可以调用我们的程序了。他会启动虚拟机。

当然这个时候我们什么都没写,所以看不到任何东西。

目录结构

Src:我们放源代码的地方。

Res:是放资源文件的地方。

其中Res里有Layout:布局文件夹Values常数文件夹

布局文件

现在打开布局文件Layout里的main.xml,它是一个xml文件。

它有两种显示方式:Graphical Layout(图形化显示) 和 文本显示

Layout

选择切换到图形显示,左边是一些常用的控件,右边是我们程序的视图,有一个默认的TextView,上面有一个文本hello world,

怎么修改文字呢? 切换到文本显示可以看到代码如下:

<!--?xml version="1.0" encoding="utf-8"?-->

@string/hello 说明字符串的ID为hello

Values

打开Values文件夹的string.xml,同样是有两种显示方式图形和文本。

图形显示下,左边是各个字符串,我们可以进行增加和删除操作。在左边选中字符串后,可以在右边编辑它。

这个时候运行一下程序看看结果如下:

在程序里动态设置文本

要动态设置TextView的文本,得先给TextView控件指定一个ID才行。到layout  TextView控件上右键Edit ID… 然后输入ID:kuanTextView1

然后先定义一个TextView 对象:

private TextView m_TextView01;

这个时候TextView是没有定义的。我们可以通过快捷键Ctrl+Shift+O来加入相应的组件。

mport android.widget.TextView;

package com.TextView1;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class TextView1 extends Activity
{
private TextView m_TextView1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

m_TextView1 = (TextView) findViewById(R.id.kuanTextView1);

String str1 = "又一次学习Android,这次要好好学下去。";
m_TextView1.setText(str1);
}
}

运行结果:

不知道某个方法的用法和意义可以把鼠标移到上面,就会有相应的提示。如setText

如果觉得提示不够详细。可以把鼠标移到到最下面。就会出现一些按钮。

点击后一个小地球,可以打开相应sdk文档。

我们可以看到setText有好几个重载的方法。

喔。对了。因为之前写了很多年C++代码,对java的代码风格实在是不习惯,我只把把代码格式化成c++风格的了。

android代码格式化

Window->Preferences->Java->Code Style->Formatter

可以点New新建一个模板。然后设置成自己新的风格,设置的时候,右边有实时的代码样式。

可以把设置完的模板导出来,以图以后再次导入使用,免得又去设置。

2011.06.16 fangyukuan

转载请保留下面链接

http://www.cnblogs.com/fangyukuan/archive/2011/06/16/2083194.html

[转载]百度地图API详解之移动平台开发的最佳实践

mikel阅读(1306)

[转载]百度地图API详解之移动平台开发的最佳实践 – jz1108 – 博客园.

百度地图API详解

这是百度地图API详解系列文章的第二篇,主要介绍如何在iPhone和Android平台上使地图API进行开发(这里指的是在浏览器端执行的JavaScript版本API)。

大部分情况下,在iPhone和Android上开发与PC上开发没有两样,开发者调用API的代码都是一样的,这里主要介绍如何针对移动设备的特点更好的开发地图应用,以及介绍一些与移动平台相关的API。

建议移动平台的开发者仔细阅读一遍Safari Web Content GuideWeb Applications系列文章, 他们会告诉你移动Web开发的基本知识。

构建页面

下面我们开始构建移动平台的地图。首先我们声明文档类型为HTML5:

<!DOCTYPE html>

目前iPhone和Android平台的浏览器都能较好的支持HTML5标准,因此建议移动页面都声明为HTML5文档类型。

接着调整页面的显示比例,在html页面中增加下面的meta标签:

<metaname="viewport"content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>

这里将页面的显示比例调整为1:1,并且禁止用户通过双指缩放页面。其中minimum-scale和maximum-scale用来防止在设备旋转时页面发生缩放。下面我们添加地图容器:

<div id="container"></div>

和样式:

html{height:100%}
body{height:100%;margin:0px;padding:0px}
#container{height:100%}

注意到我们给地图容器指定了100%的宽和高,这样做一方面是让地图区域尽可能 大,方便用户操作;另一方面是因为目前移动版的浏览器的API还不完善,如果地图没有充满屏幕会导致bug(主要是手指操作时位置会出现偏差,如果你的地 图展示不需要移动、缩放,那么不充满屏幕也没有影响)。

接下来我们初始化地图,其实代码和PC上没有差别:

var map = new BMap.Map("container"); // 创建Map实例
var point = new BMap.Point(116.404, 39.915); // 创建点坐标
map.centerAndZoom(point,15); // 初始化地图,设置中心点坐标和地图级别。

你将在iPhone(iPhone3截图)中看到如下效果,即使设备旋转地图也能正常显示:


高解析度

众所周知,iPhone4和iPhone3相比,在同样物理尺寸的情况下,宽度和高度分辨率各扩大了一倍,你会发现同样的地图在iPhone3和iPhone4上显示效果是不同的。下面是iPhone4的屏幕截图(此图为实际尺寸的50%):

你会发现地图图片有点儿发虚。这是因为iPhone4的屏幕分辨率为960×640,而你的页面尺寸仍旧在480×320模式下,就是说地图图片被拉伸了。为了在iPhone4这样的高分辨率设备上更清晰的展示地图,在创建地图对象时可以通过配置参数开启高解析度模式:

var map = new BMap.Map("container", {enableHighResolution: true})

这时再来看iPhone4的效果(这回我们以960×640的实际尺寸展示):

注意,即使你开启了高解析度模式,在iPhone3等普通屏幕上还是按照原先的样式显示,也就是说只有真正的高分辨率设备才能使用此模式。

在Android平台上,手机种类、型号更为丰富,因此不同的手机的分辨率、物理尺寸都不同,我们可统一使用dpi来衡量,高dpi的手机也可以开启高解析度地图模式。下面是同一设备开启高解析度前后的对比效果(为实际尺寸的50%):

在高解析度模式下,你所使用的元素(包括HTML元素、图片等)都应该在宽度和高 度上都应该进行扩大,在iPhone4上应各扩大一倍,在Android上应各扩大为原来的1.5倍。否则元素在浏览器中会显得比较小,不论从视觉上还是 操作上都影响用户体验。比如你设置的标注图标大小为23×26,那么在iPhone4的高解析度模式下你的图标尺寸应扩大到46×52。怎么知道地图在用 户的设备上是否真正处于高解析度模式呢?很简单,通过map的highResolutionEnabled方法即可判断。当且仅当你开启了高解析度模式并 且设备确实支持的时候此方法返回true。需要注意的是,在高解析度模式模式下地图图块数量会增加,用户访问的速度以及流量都会受到一些影响。
用户操作

惯性拖拽是个很酷的效果,当用户手指在移动地图后从设备表面抬起的时候,地图还会 根据用户刚才手指的移动方向和力度再移动一小段距离。仿佛整个地图图层具有惯性效果。这个功能通过调用map的 enableInertialDragging方法即可开启。在iPhone上,用户可通过双指对地图进行缩放和移动,你也可以通过map的 enablePinchToZoom来确定是否开启该功能(默认开启)。而在Android平台上,由于目前还没有开放双指操作相关的API,因此建议在 此平台上的地图中增加两个按钮用来控制地图的放大和缩小,同时也需要考虑高解析度模式按钮尺寸的问题。

[转载]Android开发者指南(13) —— With AVD Manager

mikel阅读(897)

[转载]Android开发者指南(13) —— With AVD Manager – 农民伯伯 – 博客园.

前言

本章内容为开发者指南(Dev Guide)/Developing/Managing Virtual Devices/With AVD Manager,版本为Android3.1 r1,翻译来自:”MeetAndroid”,欢迎大家访问他的博客:”http://blog.csdn.net/meetandroid“,再次感谢”MeetAndroid” !期待你一起参与翻译Android的相关资料,联系我over140@gmail.com。

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://goo.gl/6vJQl

原文

http://developer.android.com/guide/developing/devices/managing-avds.html

AVD管理器来管理AVD

AVD管理器来管理AVDAndroid虚拟设备)配置很容易。一个AVD就是一份Android仿真器的设备配置,仿真器可以模拟Android所支持设备的不同配置。通过Eclipse或命令行的android工具起动AVD管理器后,就会看到它了。如图1所示:

1. AVD管理器屏幕截图。

通过主屏幕,可以创建,删除,更改和启动AVD。还可以查看AVD的详情。

创建AVD (Creating an AVD)

你可以根据自己的需要,创建任意数量的AVD。推荐的做法是,在高于目标API级的所有API级上测试自己的应用程序。

创建AVD步骤:

1. 起动AVD管理器:

* Eclipse中:选择Window > Android SDK and AVD Manager,或点击Eclipse工具栏中的Android SDK and AVD Manager图标。

* 在其它IDE中:到SDKtools/目录中,执行android工具,不用给任何参数。

2. Virtual Devices面板中,可以看到已创建的AVD的列表。点击New可以创建一个新的AVD,这时会显示Create New AVD对话框。

2. 创建AVD的窗口屏幕截图

3. 填写AVD详情。

需要给出名称、目标平台、SD卡大小和皮肤(默认为HVGA)。此外,还可以通过点击New…按钮并选择相应功能来添加特殊的硬件功能。要获取硬件功能的清单,请查阅硬件选项

注:确保按照应用程序的构建目标(AVD平台目标的API级必须等于或高于应用程序编译的API级)来为AVD定义目标设备。

4. 点击Create AVD

现在,AVD就准备好了。接下来可以关闭SDKAVD管理器、或创建更多的AVD。也可以选择一个设备的AVD,并点击Start来启动仿真器。

硬件选项(ardware options)

新创建AVD时,可指定下列用于模拟的硬件选项:

特征

描述

属性

设备内存尺寸

设备的物理内存数量,以兆字节计,默认值为“6”。

hw.ramSize

触摸屏支持

设备是否有一个触摸屏,默认值为“yes”。

hw.touchScreen

轨迹球支持

设备是否有一个轨迹球,默认值为“yes”。

hw.trackBall

键盘支持

设备是否有一个QWERTY键盘,默认值为“yes”。

hw.keyboard

拨号盘支持

设备是否有拨号盘按键,默认值为“yes”。

hw.dPad

GSM modem支持

设备是否有SDM modem,默认值为“yes”。

hw.gsmModem

摄像头支持

设备是否有摄像头,默认值为“no”。

hw.camera

摄像头水平最大像素

默认值为“640”。

hw.camera.maxHorizontalPixels

摄像头垂直最大像素

默认值为“480”。

hw.camera.maxVerticalPixels

GPS支持

设备是否有GPS,默认值为“yes”。

hw.gps

电池支持

设备是否有电池,默认值为“yes”。

hw.battery

加速度感应器

设备是否有加速度感应器,默认值为“yes”。

hw.accelerometer

音频录制支持

设备是否能录制音频,默认值为“yes”。

hw.audioInput

音频回放支持

设备是否能回放音频,默认值为“yes”。

hw.audioOutput

SD卡支持

设备是否支持虚拟SD卡的插入/拔出,默认值为“yes”。

hw.sdCard

缓存分区支持

设备是否使用/cache分区,默认值为“yes”。

disk.cachePartition

缓存分区大小

默认值为“66MB”。

disk.cachePartition.size

LCD密度

设备AVD屏幕的密度特征,默认值为”160”。

hw.lcd.density

轨迹球支持

是否有轨迹球。

hw.trackBall

补充

文章精选

创建 Android虚拟设备 AVD