推荐Firefox截图插件

mikel阅读(1076)

我们经常想把精彩的网页内容做截图。或者在制作某些教程的时候也需要截图。通常情况下你或许会选择SnagIT之类的截图工具。
在这里特别推荐一款Firefox浏览器的截图插件。功能非常强大,使用非常方便。忍不住要推荐给大家。

用Firefox打开下面的链接进行安装 http://screenshot-program.com/fireshot/

[转载]7个让你的页面布局成为最大败笔的设计错误

mikel阅读(1045)

[转载]7个让你的页面布局成为最大败笔的设计错误 – gbin1 – 博客园.

7个让你的页面布局成为最大败笔的设计错误

即 使web设计已经成为一个真正的产业,开发一个网站仍旧是技术和艺术的结合。一个网站的设计即可以带来大量流量,同时也可以吓走大量用户。当然这些都和设 计师相关。经验,天份和能力三方面的努力是一个设计师最强大的工具,一个设计精良的布局是所有这些的基础。而且,这也是一个非常耗时的工作。

设计一个非常好的布局是一件非常不容易的事情,而且判断的方式也非常的主观。任何一个设计可能会取悦你,也可能让其它人厌恶。尽管这样,这里仍旧有些大家都承认的设计误区。

为了帮助大家来避免这些错误和误区,我们列出了一些设计的小技巧。我们同时也希望大家能够帮助我们完善这些小技巧。不管怎么说,希望大家能帮助我在下面留言 ,带给大家更多的想法和建议。谢谢!

1. 缺乏空白的区域

没 有比把页面塞得像麻袋一样满更让人烦人的设计了。你应该保留一定得空白页面让访问者放松他们的眼睛。很多设计者都想提供更多的内容在第一个页面。感觉初学 设计的人更容易犯这个错误,但其实各个设计水平的人都有这个倾向。因为设计界错误心态这个错误大家犯得比较多。设计者太依赖于布局而不敢尝试其它的方式。 正确的心态是忽略掉任何的规则,创建一个你认为对于用户来说是正确的布局。最简单的因素绝对一切。

2. 非常糟糕的颜色组合

这里有很多的糟糕的布局形式,但是糟糕的颜色搭配绝对是最吓人的。一个很常见的错误就是使用高对比颜色创建一个富有视觉张力的设计。这里有不同的来自学校的观点。我们应该学会如何区别对待。

很 多的对比设计都希望通过一种颜色来通过色彩和饱和度重点突出最重要的部分。这里有一个小花招非常不错:降低你的文件饱和度然后如果各个元素之间的区别非常 清晰的话,那就足够了。这个逻辑非常简单:视觉没有问题的人会看的非常清晰,然而有视觉问题的人将看到布局黑色,白色或者灰色。现在简单了,如果他们没有 困难查看布局颜色,那么布局就通过了色彩可用性测试。

3. 一个页面里包含的内容太多

听起来非常的简单但是布局可以拥有很多的空白区域,但是同时也可以会包含太多信息。通常人们都是先扫上几眼页面布局,因此设计人员应该让整个布局可被快速浏览。一个拥有信息太多的网站,例如,插入太多的图标,按钮和图片将会非常难以浏览。因此会让用户的易用度大打折扣。

4. 图片的使用没有任何灵感

一 个图片可能抵得过成百的文字,但是如果这些文字都是批评你的话,你的布局设计就有问题了。书写的内容,布局和图片应该组合使用,并不是分离的实体。任何 web设计人员都应该理解创意并且有效的实现。图片应该能有效的说明网站需要表达的信息及其选择,这是一个设计时最初需要考虑的因素。

5. 忽略了字体排版

因 为数量多,或者非常小就忽略了字体排版是一个非常大的错误。如果说一个简单演讲是网站的其中一个特殊目地的话,字体排版就是一个关键的因素。另外一个问题 是大家如何理解字体排版,它不是一个简单的如何选择字体的过程,它绝对了句子,段落及其标题的组织方式。你可能想这里需要做的工作太多了,但是一个富有成 效的设计将会对于页面布局具有非常绝对性的冲击。

6. 没有照顾所有人的使用感受和可用性

可用性可能被很多人认为是一个 多余的事情但是一个可用性差的网站是一个自私设计者的作品。在线的世界对于任何人都是平等的,无论你是正常还是残疾,如果你的设计不能让每个人都享受那么 将会是一件很不尊重人的事情。美国有一项法规规定:任何的机构和部门的网站都必须通过可用性的测试。实际上可用性的使用并不是个高科技的东西。例如,你只 需要简单的加上alt标签属性,这并不会带来任何麻烦。个人来说我认为这里用不着什么法律。道德和道义上我们应该自觉地将这个考虑到设计中去。

7. 没有事先思考

缺 乏经验使得我们不停的修改自己的东西。 滑稽的是,我们可能晚上设计的东西白天可能会被删除。一个聪明的设计者会在最开始的时候思考整个布局的大概设计。这种方式可以省去很多时间和资源。很明 显,在实际做之前思考是一件很不容易的事情,不可能不去修改任何设计,但是至少能够帮助我们尽量少的去修改我们的设计。不用担心,经验可以帮助我们做到这 一点。

阅读这个文章可能像理解一个布局一样困难,但是这样更加容易让大家避免错误,请让我们知道是否这篇文章帮助了你,谢谢!

[转载]正则表达式方自动小偷抓网程序

mikel阅读(928)

[转载]正则方式的自动小偷抓网程序 – 孟兆斌 – 博客园.

公司里面有许多数据没人去录入,做一个抓取网页的程序,以前做CMS系统的时候涉及过,不过这次的处理HTML上和以前做了些区别。有一些瑕疵没时间细化,只是实现了效果,大家看一看这个正则该怎么写好:

URL:http://news.szhome.com/83642.html

内容:

object></div></div>

</div>

<div class=”share”><div class=”linkshare” style=”right: 0″>

这两个标记之间的代码。END标记的问题解决了,但是郁闷的是START截取的标记因为第二个DIV和第三个中间有换行,我无语了不知道怎么处理这个正则。

而且郁闷的是有多处有这种重复型标记,对正则不太熟悉,我的解决方法如下:

MatchCollection mc = Regex.Matches(ghoPage.Trim(), @”(?<=<div class=[‘””]txtmsg[‘””]>)[\s\S]*?(?=<div class=[‘””]share[‘””]><div class=), RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);

foreach (Match mm in mc)
{
sb.Append(mc[0].Value.Substring(1933, mc[0].Value.Length – 1933));
}

我算出截取出来多处两个FLASH广告DIV的长度是1933,然后处理字符串截取后得到我想要的文本,这样做的劣势就是万一该站改变了两个FLASH广告DIV的长度我获取的数据就不是完整的呢,有兴趣的研究下,看看换行的DIV正则问题怎么处理。

里面用到了自己写的一个BUTTON控件,可以在点击后禁止重复点击,然后就是一些判断,在思路上蛮不错,可以做到一直抓取,因为不经常用就没做成 WINDOWS服务类型,这样的程序可以做成WINDOWS服务,把规则写在INI文件中,抓录的规则和正则也放在配置文件中,这样就能实现自动抓录。

很短的代码,对这种抓录有兴趣的朋友可以尝试下。下载

[转载]获取本地网络中可用的SQL Server实例信息

mikel阅读(838)

[转载]获取本地网络中可用的SQL Server实例信息 – 韩锁 – 博客园.

.NET中提供了一个SQLDataSourceEnumerator类,使用该类可以很方便的获取本地网络中的所有的可用的SQL Server实例的详细信息。该类位于System.Data.Sql命名空间下。

SqlDataSourceEnumerator类并没用提供具体的构造函数,但它提供了一个公共/静态属性——Instance,用于检索SqlDataSourceEnumerator类的实例。检索到其实例之后,便可调用其GetDataSources方法,该方法返回包含本地网络中所有可用服务器信息的DataTable。

使用GetDataSources方法所返回的DataTable包含以下列,并且所有列的值均为string类型。

说明
ServerName 服务器的名称。
InstanceName 服务器实例的名称。 如果服务器作为默认实例运行,则为空白。
IsClustered 指示服务器是否属于群集。
Version 服务器的版本(对于 SQL Server 2000,为 8.00.x,对于 SQL Server 2005,为 9.00.x,对于SQL Server 2008,为10.0.0.x)。

示例:

using System;
using System.Data.Sql;
using System.IO;

class Program
{
    static void Main()
    {
        SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
        System.Data.DataTable table = instance.GetDataSources();

        DisplayData(table);

        Console.WriteLine("按任意键继续");
        Console.ReadKey();
    }

    private static void DisplayData(System.Data.DataTable table)
    {
        foreach (System.Data.DataRow row in table.Select("Version LIKE '10%'"))
        {
            foreach (System.Data.DataColumn col in table.Columns)
            {
                Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
            }
            Console.WriteLine("============================");
        }
    }
}

上述示例显示本地网络中所有可用的SQL Server 2008版本实例详细信息。代码中使用了DataTableSelect方法对SQL Server服务器的版本作了筛选。

值得一说的是,利用上述代码获取数据库服务器信息并非“十全十美”的。其一,根据网络通信量/通信超时等因素,所获取的数据库服务器实例有可能 不完整;其二,取决于获取列表的方式,所获取到的实例信息的详细程度存在差异,通过SQL Server Browser服务列出的数据库服务器比通过Windows基础结构列出的服务器更加详细,后者仅列出服务器名称。所以在用到该功能时,建议开启SQL Server Browser服务

[转载]SQL SERVER 数据类型详解

mikel阅读(852)

[转载]SQL SERVER 数据类型详解__教程.

数据类型
类型
描             述
bit
整型
bit 数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off
int
整型
int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节
smallint
整型
smallint 数据类型可以存储从- 215(-32768)到215(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间
tinyint
整型
tinyint 数据类型能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。 这种数据类型在数据库中占用1 个字节
numeric
精确数值型
numeric数据类型与decimal 型相同
decimal
精确数值型
decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。 范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数
money
货币型
money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9220 亿之间的数据,精确到货币单位的万分之一
smallmoney
货币型
smallmoney 数据类型用来表示钱和货币值。这种数据类型能存储从-214748.3648 到214748.3647 之间的数据,精确到货币单位的万分之一
float
近似数值型
float 数据类型是一种近似数值类型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数
real
近似数值型
real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38到3.40E+38之间的浮点数
datetime
日期时间型
datetime数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日间所有的日期和时间数据, 精确到三百分之一秒或3.33毫秒
Smalldatetime
日期时间型
smalldatetime 数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟
cursor
特殊数据型
cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用
timestamp
特殊数据型
timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的
Uniqueidentifier
特殊数据型
Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列
char
字符型
char数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据 类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000 个字符
varchar
字符型
varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。 它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度
text
字符型
text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1或20亿个字符
nchar
统一编码字符型
nchar 数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍
nvarchar
统一编码字符型
nvarchar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍
ntext
统一编码字符型
ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储230 -1或将近10亿个字符,且使用的字节空间增加了一倍
binary
二进制数据类型
binary数据类型用来存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型
varbinary
二进制数据类型
varbinary 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型
image
二进制数据类型
image 数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节

[转载]C#基于HttpWebRequest和HttpWebResponse的HttpHelper

mikel阅读(779)

[转载][C#]基于HttpWebRequest和HttpWebResponse的HttpHelper – 二杠 – 博客园.

C#中实现POST的方法很多,常用的是WebBrowser、WebClient、HttpWebRequest和HttpWebResponse。

1、WebBrowser基本是在DocumentCompleted中分析HtmlDocument ;

2、WebClient是对HttpWebRequest和HttpWebResponse的封装,用起来更方便,但是灵活性还是不及HttpWebRequest和HttpWebResponse;

3、HttpWebRequest和HttpWebResponse更底层,灵活度更好,不过代码更多,我做了一个简单的封装,将GET改成分段读取,并加入代理、进度条和错误重试处理。代码如下:

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

namespace Van.Base
{
public class HttpHelper
{
#region 委托 事件
public delegate void dgtProgValueChanged(long Value);
/// <summary>
/// 进度改变事件
/// </summary>
public event dgtProgValueChanged OnProgValueChanged;
#endregion

#region 属性
/// <summary>
/// 代理
/// </summary>
public WebProxy Proxy { getset; }
/// <summary>
/// Cookie
/// </summary>
public CookieContainer UserCookie { getset; }
/// <summary>
/// 重试次数
/// </summary>
public int IAfreshTime { getset; }
/// <summary>
/// 错误次数
/// </summary>
public int IErrorTime { getprivate set; }

long m_ProgValue = 0;
/// <summary>
/// 当前读取字节
/// </summary>
public long ProgValue
{
getreturn m_ProgValue; }
private set
{
m_ProgValue = value;
if (OnProgValueChanged != null)
{
OnProgValueChanged(value);
}
}
}
/// <summary>
/// 待读取最大字节
/// </summary>
public long ProgMaximum { getprivate set; }

#endregion

#region 方法
#region Get
/// <summary>
/// 获取HTML
/// </summary>
/// <param name=”URL”>地址</param>
/// <param name=”Accept”>Accept请求头</param>
/// <returns>Html代码</returns>
public string GetHTML(string URL, string Accept)
{
return GetHTML(URL, Accept, System.Text.Encoding.UTF8);
}
/// <summary>
/// 获取HTML
/// </summary>
/// <param name=”URL”>地址</param>
/// <param name=”Accept”>Accept请求头</param>
/// <param name=”encoding”>字符编码</param>
/// <returns>Html代码</returns>
public string GetHTML(string URL, string Accept, Encoding encoding)
{
return GetHTML(URL, Accept, encoding, 1024);
}
/// <summary>
/// 获取HTML
/// </summary>
/// <param name=”URL”>地址</param>
/// <param name=”Accept”>Accept请求头</param>
/// <param name=”encoding”>字符编码</param>
/// <param name=”bufflen”>数据包大小</param>
/// <returns>Html代码</returns>
public string GetHTML(string URL, string Accept, Encoding encoding, int bufflen)
{
IErrorTime = 0;
return _GetHTML(URL, Accept, encoding, bufflen);
}
/// <summary>
/// 获取HTML
/// </summary>
/// <param name=”URL”>地址</param>
/// <param name=”Accept”>Accept请求头</param>
/// <param name=”encoding”>字符编码</param>
/// <param name=”bufflen”>数据包大小</param>
/// <returns>Html代码</returns>
private string _GetHTML(string URL, string Accept, Encoding encoding,int bufflen)
{
try
{
HttpWebRequest MyRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
MyRequest.Proxy = Proxy;
MyRequest.Accept = Accept;
if (UserCookie == null)
{
UserCookie = new CookieContainer();
}
MyRequest.CookieContainer = UserCookie;
HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
return _GetHTML(MyResponse, encoding, bufflen);
}
catch (Exception erro)
{
if (erro.Message.Contains(连接) && IAfreshTime – IErrorTime > 0)
{
IErrorTime++;
return _GetHTML(URL, Accept, encoding, bufflen);
}
throw;
}
}
/// <summary>
/// 获取HTML
/// </summary>
/// <param name=”MyResponse”></param>
/// <param name=”encoding”>字符编码</param>
/// <param name=”bufflen”>数据包大小</param>
/// <returns></returns>
private string _GetHTML(HttpWebResponse MyResponse, Encoding encoding, int bufflen)
{
using (Stream MyStream = MyResponse.GetResponseStream())
{
using (StreamReader reader = new StreamReader(MyStream, encoding))
{
ProgMaximum = MyResponse.ContentLength;
string result = null;
long totalDownloadedByte = 0;
byte[] by = new byte[bufflen];
int osize = MyStream.Read(by, 0, by.Length);
while (osize > 0)
{
totalDownloadedByte = osize + totalDownloadedByte;
result += encoding.GetString(by, 0, osize);
ProgValue = totalDownloadedByte;
osize = MyStream.Read(by, 0, by.Length);
}
reader.Close();
return result;
}
}
}
#endregion

#region GetImg

public System.Drawing.Bitmap Getimg(string URL, string Accept)
{
return _GetBit(URL, Accept);
}
/// <summary>
/// 获取HTML
/// </summary>
/// <param name=”URL”>地址</param>
/// <param name=”Accept”>Accept请求头</param>
/// <returns>Html代码</returns>
private System.Drawing.Bitmap _GetBit(string URL, string Accept)
{
HttpWebRequest MyRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
MyRequest.Proxy = Proxy;
MyRequest.Accept = Accept;
if (UserCookie == null)
{
UserCookie = new CookieContainer();
}
MyRequest.CookieContainer = UserCookie;
HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
return _GetBit(MyResponse);
}

/// <summary>
/// 获取图像
/// </summary>
/// <param name=”MyResponse”></param>
/// <returns></returns>
private System.Drawing.Bitmap _GetBit(HttpWebResponse MyResponse)
{
using (Stream MyStream = MyResponse.GetResponseStream())
{
return new System.Drawing.Bitmap(MyStream);
}
}
#endregion

#region Post
/// <summary>
/// 回发(字符编码默认UTF-8)
/// </summary>
/// <param name=”URL”>回发地址</param>
/// <param name=”PostData”>参数</param>
/// <returns>Html代码</returns>
public string PostPage(string URL, string PostData)
{
return PostPage(URL, PostData, System.Text.Encoding.UTF8);
}
/// <summary>
/// 回发
/// </summary>
/// <param name=”URL”>回发地址</param>
/// <param name=”PostData”>参数</param>
/// <param name=”encoding”>字符编码</param>
/// <returns>Html代码</returns>
public string PostPage(string URL, string PostData, Encoding encoding)
{
return PostPage(URL, PostData, encoding, null);
}
/// <summary>
/// 回发
/// </summary>
/// <param name=”URL”>回发地址</param>
/// <param name=”PostData”>参数</param>
/// <param name=”encoding”>字符编码</param>
/// <returns>Html代码</returns>
public string PostPage(string URL, string PostData, Encoding encoding, string ContentType)
{
IErrorTime = 0;
return _PostPage(URL, PostData, encoding, ContentType);
}
/// <summary>
/// 回发
/// </summary>
/// <param name=”URL”>回发地址</param>
/// <param name=”PostData”>参数</param>
/// <param name=”encoding”>字符编码</param>
/// <returns>Html代码</returns>
private string _PostPage(string URL, string PostData, Encoding encoding,string ContentType)
{
try
{
if (ContentType==null)
{
ContentType = application/x-www-form-urlencoded;
}
HttpWebRequest MyRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
MyRequest.Proxy = Proxy;
if (UserCookie == null)
{
UserCookie = new CookieContainer();
}
MyRequest.CookieContainer = UserCookie;
MyRequest.Method = POST;
MyRequest.ContentType = ContentType;
byte[] b = encoding.GetBytes(PostData);
MyRequest.ContentLength = b.Length;
using (System.IO.Stream sw = MyRequest.GetRequestStream())
{
try
{
sw.Write(b, 0, b.Length);
}
catch
{
}
}
HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
return _GetHTML(MyResponse, encoding, 1024);
}
catch (Exception erro)
{
if (erro.Message.Contains(连接) && IAfreshTime – IErrorTime > 0)
{
IErrorTime++;
return _PostPage(URL, PostData, encoding, ContentType);
}
throw;
}
}
#endregion
#endregion
}
}

调用便很方便了,如下:

string strProxyAdd = www.Proxyxxxx.com, UserName = XXXX,PassWord = XXX;
int port = 8080;

HttpHelper http = new HttpHelper();
http.Proxy = new WebProxy();//设置代理
this.http.Proxy.Address = new Uri(string.Format(http://{0}:{1}, strProxyAdd,port));//设置代理服务器地址和端口
this.http.Proxy.Credentials = new NetworkCredential(UserName, PassWord);//设置代理用户名密码
//http.Proxy = null;//清空代理

var strPHtml = http.PostPage(www.xxxx.comUser=ABCD&Pwd=DEF);//向www.xxxx.com POST数据User=ABCD&Pwd=DEF
var strHtml = http.GetHTML(www.xxxx.com*/*, Encoding.UTF8, 20480);//从www.xxxx.com获取HTML数据,并用UTF8进行编码

由于Cookie在一个实例中是共用的,在一些场景下可以先POST登录后再GET需要登录才能进入的页面信息。

[转载]C#基于HttpHelper的赶集抓票工具

mikel阅读(885)

[转载][C#]基于HttpHelper的赶集抓票工具 – 二杠 – 博客园.

每到年关,火车票总是一票难求,去年差点没买到票回家,看到赶集、58等上有转让票,大 喜,遂掏出手机呼叫之,可结果都是已转让。想想原因皆是看到的不及时,被别人捷足先登了。哥们是干什么的,居然从我嘴里抢食,越想越气,便做一工具,实时 在赶集上监控着,有新出售票就提醒,几天下来,一张D字头的到手。。。

闲扯了几句,下面进入正题。

开发这一工具大概思路就是从网页上获取HTML,然后用正则匹配之,匹配出有新数据数据时加入到网格中显示,另外不可能实时盯着这个工具看,必须在 有新信息时有提醒,于是我便加了一个声音提醒,一小时内的新信息都加声音提醒。这里遇到两个问题,一是如何从网页上抓取HTML,二是正则匹配问题。关于 抓取HTML,本人前一篇文章中已有介绍,见http://www.cnblogs.com/vanjoge/archive/2011/11/18/2253937.html,剩下的问题就是正则了,我们以赶集的T110次车为例来找到对应正则,首先打开赶集的T110次车的连接http://sh.ganji.com/piao/cc_T110/,图中红框部分就是我们需要抓取的数据

查看源文件,找到对应的HTML代码,如图:

图中选中部分则是单个车票信息,

<DL class=list_piao><DT><A href=”/piao/11111809_2887746.htm” target=_blank>[转让] T110 上海-北京 硬卧 2张 发车日期:11-18</A> </DT>
<DD class=list_piao_time>11月18日 </DD>
<DD class=list_piao_mj><A href=”http://www.ganji.com/lieche/cc_T110/” target=_blank>T110</A> </DD>
<DD class=list_piao_time>4小时前 </DD></DL>

下面祭出我们的正则神器:RegexTester,将HTML填入Source中,然后再一点一点的拼出正则,如图:

正则表达式即是:

<dl class=list_piao>\s*<dt><a href=([^]+) target=_blank>([^<]+)</a></dt>\s*<dd class=list_piao_time>([^<]+)</dd>\s*<dd class=list_piao_mj><a href=([^]+) target=_blank>([^<]+)</a></dd>\s*<dd class=list_piao_time>([^<]+)</dd>\s*</dl>

接下来便是设计界面,我就不在详述了,见图吧:

抓取逻辑:

1.抓取http://sh.ganji.com/piao/cc_T110/页面的HTML信息;

private void GetHtml()
{
string str = http.GetHTML(txtUrl.Text, */*, Encoding.UTF8, 20480);
this.Invoke(new invokeDelegate(Update), str);
}

2.用正则匹配HTML信息;

void Update(string str)
{
lblUpdateTime.Text = 更新时间: + DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss);
string pn = <dl class=\”list_piao\”>\\s*<dt><a href=\”([^\”]+)\” target=\”_blank\”>([^<]+)</a></dt>\\s*<dd class=\”list_piao_time\”>([^<]+)</dd>\\s*<dd class=\”list_piao_mj\”><a href=\”([^\”]+)\” target=\”_blank\”>([^<]+)</a></dd>\\s*<dd class=\”list_piao_time\”>([^<]+)</dd>\\s*</dl>;
Regex reg = new Regex(pn);
MatchCollection mths = reg.Matches(str);
foreach (Match item in mths)
{
Add(item.Groups[1].Value,
item.Groups[2].Value,
item.Groups[3].Value,
item.Groups[4].Value,
item.Groups[5].Value,
item.Groups[6].Value);
}
gridView1.BestFitColumns();
}

3.将新信息加入到网格中并声音提醒;

private void Add(string Url, string Text, string StartDate, string LUrl, string Vcc, string Time)
{
DataSet1.DTRow drow = GetDrow(dataSet11.DT, Url);//因为URL是唯一,因此根据URL获取是否已存在此火车票信息
int itemp = 0;
DateTime dt;
if (Int32.TryParse(Time.Replace(分前“”), out itemp))
{
}
else if (Int32.TryParse(Time.Replace(小时前“”), out itemp))
{
itemp = itemp * 60;
}
else if (DateTime.TryParse(strYear + Time, out dt))
{
itemp = Convert.ToInt32((DateTime.Now – dt).TotalMinutes);
}
if (drow == null)//不存在时追加
{
if (itemp < 60)
{
if (chkAuto.Checked)
{
OpenNewUrl(Text, strHost + Url, true);
}
PlaySoundSync();
}
dataSet11.DT.AddDTRow(Url, Text, StartDate, LUrl, Vcc, Time, itemp);
}
else//存在时更新间隔时间
{
drow.Time = Time;
drow.Ticks = itemp;
}
}

DataSet1.DTRow GetDrow(DataSet1.DTDataTable dt,string Url)
{
foreach (DataSet1.DTRow drow in dt)
{
if (drow.Url==Url)
{
return drow;
}
}

return null;
}

由于我们这个任务是需要定时的执行,因此要用到timer或Thread,这里我选择了用Thread,是为了防止在读取数据的过程中出现假死的情况,因此完整逻辑应该是:

1.开启任务

private void btnStart_Click(object sender, EventArgs e)
{
strYear = DateTime.Now.Year.ToString() + ;
if (chkUseProxy.Checked)
{
this.http.Proxy = new WebProxy();
try
{
this.http.Proxy.Address = new Uri(string.Format(http://{0}:{1}this.txtProxyServer.Text, this.spinProxyPort.Text));
if ((this.txtProxyUsername.Text.Length > 0) && (this.txtProxyPassword.Text.Length > 0))
{
this.http.Proxy.Credentials = new NetworkCredential(this.txtProxyUsername.Text, this.txtProxyPassword.Text);
}
}
catch
{
MessageBox.Show(代理设置出错,请检查代理设置!错误, MessageBoxButtons.OK, MessageBoxIcon.Error);
this.http.Proxy = null;
return;
}
}
else
{
this.http.Proxy = null;
}

IsRun = !IsRun;
if (IsRun)
{
Uri uri = new Uri(txtUrl.Text);
strHost = uri.Scheme + :// + uri.Host;
btnStart.Text = 停止监控;
txtUrl.Enabled = false;
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(Run));
th.IsBackground = true;
th.Start();
}
else
{
btnStart.Text = 开始监控;
txtUrl.Enabled = true;
}
}

2.执行抓取逻辑

void Run()
{
while (IsRun)
{
GetHtml();
System.Threading.Thread.Sleep(5000);
}
}

最终执行效果:

附上源码:源码,不带DEV控件

由于此工具用了DEV10.1.4.0控件,因此没有此控件的童鞋需要下载DEV控件的DLL:本工具用到的DEV DLL

[转载]用三张图片详解Asp.Net 全生命周期

mikel阅读(1053)

[转载]用三张图片详解Asp.Net 全生命周期 – 阳阳多 – 博客园.

下面我们使用三张图片解析ASP.NET的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式

说明:

1  第一张图片从全局说明从客户端发出一个Request请求,服务器windows内核中的HTTP.SYS组件接收该请求开始到IIS处理完该请求并响应到客户端结束。

2  第二张图片为图1中Http处理管线的详细步骤

3  第三张图片为图2Http处理管线中调用处理程序(HttpHandler,  此处为Page对象)的详细生命周期过程。

图1:


图2:  Http处理管线详解


图3:  ASP.NET生命周期详解


[原创]EasyUI性能优化1:慎用组件的url属性AJAX异步加载数据

mikel阅读(1234)

使用EasyUI框架制作页面,往往会让我们不如组件满天飞,Ajax不断的境地,可Ajax虽然可以提高用户体验,但是同样也会提高过多的服务器请求导致性能缓慢的问题,下面用实例讲解一下如何优化

性能,下面的例子用我们常用的combobox组件为例,源代码如下:

$('#combobox1,#combobox2').combobox({
url:'/User/Users',
valueField:'id',
textField:'name'
});

这样使用页面就会再初始化的时候,就会请求两次”/User/Users”的数据,导致过多的服务器请求,查询两次数据库,于是可以在第一次进入页面的时候将Users查询一次,返回到页面声明成Users数组

然后combobox组件进行data绑定,不在url异步获取数据,这样提高页面速度,代码如下:

var Users=<%=ViewData&#91;"Users"&#93;%>;
$('#combobox1,#combobox2').combobox({
data:Users,
valueField:'id',
textField:'name'
});

[转载]jQuery EasyUI 1.2.4 API 中文文档(完整)目录

mikel阅读(928)

[转载]jQuery EasyUI 1.2.4 API 中文文档(完整)目录 – 风流涕淌 – 博客园.

Welcome 欢迎

由于项目需求,要使用富客户端,选择了EasyUI,之前并没有接触过,上网搜索一番,没有找到完整的中文文档,项目组又没有英语达人,无奈之下,我硬着头皮,把官方提供的英文文档啃了,一边啃顺便用中文记录下来。

其实几个月前就啃完了,现在的项目组一直在参考使用。我深感查字典揣摩英文原意的痛苦,早就想快点都通过博客共享出去,免去如我一样英语破(poor)人的痛苦,可是上班忙工作,下班忙家务,所以断断续续的,好在终于要发完了,也算了却一桩心事。

为了方便大家检索使用,制作此目录置顶。

知识是全人类的财富,传播知识,就是撒播财富的种子,欢迎大家转载,但请看在风流涕淌年迈体衰精力不佳仍然英俊潇洒玉树临风的份上,能保留出处,我心慰矣。

Notice 提醒

此文档翻译的时间是20118月份,原文是当时 http://www.jeasyui.com/documentation/ 的文档,对应 EasyUI 的版本是 1.2.4

Base 基础

Documentation 文档

Parser 解析器

EasyLoader 加载器

Draggable 可拖拽

Droppable 可释放

Resizable 可调整尺寸

Pagination 分页

SearchBox 搜索框

ProgressBar 进度条

Layout 布局

Panel 面板

Tabs 标签页/选项卡

Accordion 手风琴

Layout 布局

Menu and Button 菜单和按钮

Menu 菜单

LinkButton 链接按钮

MenuButton 菜单按钮

SplitButton 拆分按钮 (这个一直不知道中文该如何表述才恰当,谁知道一定告诉我啊)

Form 表单

Form 表单

ValidateBox 验证框

Combo 组合

ComboBox 组合框

ComboTree 组合

ComboGrid 组合表格

NumberBox 数字框

DateBox 日期框

DateTimeBox 日期时间框

Calendar 日历

Spinner 微调器

NumberSpinner 数值微调器

TimeSpinner 时间微调器

Window 窗口

Window 窗口

Dialog 对话框

Messager 消息框

DataGrid and Tree 数据表格和树

DataGrid 数据表格

PropertyGrid 属性表格

Tree

TreeGrid 树形表格