[原创]万网域名注册和Whois信息查询API

mikel阅读(1195)

1域名check

接口采用HTTPPOSTGET协议:

调用URLhttp://panda.www.net.cn/cgi-bin/check.cgi

参数名称:area_domain 值为标准域名,例:hichina.com

调用举例:http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=hichina.com

返回XML

<?xml version=”1.0″ encoding=”gb2312″?>

<property>

<returncode>200</returncode>

<key>2zher3r3r.com</key>

<original>210 : Domain name is available</original>

</property>

返回XML结果说明:
returncode=200
表示接口返回成功

key=***.com表示当前check的域名

original=210 : Domain name is available 表示域名可以注册

original=211 : Domain name is not available 表示域名已经注册

original=212 : Domain name is invalid 表示域名参数传输错误

2域名info

接口采用HTTPPOSTGET协议:

调用URLhttp://whois.hichina.com/whois/api_whois?host=hichina.com&oper=0

参数名称:host值为标准域名,例:hichina.com

oper为操作值 0=查询whois信息

调用举例:http://whois.hichina.com/whois/api_whois?host=hichina.com&oper=0

返回结果为Json类型:

{“exp_date”:” 24-apr-2019″,”name_server”:” NS3.HICHINA.COM, NS4.HICHINA.COM”,”status”:” clientDeleteProhibited, clientTransferProhibited, clientUpdateProhibited”,”name”:”hichina.com”,”registrar”:”HICHINA ZHICHENG TECHNOLOGY LTD.”,”reg_date”:” 23-apr-1996″,”total_infor”:”\nWhois Server Version 2.0\n\nDomain names in the .com and .net domains can now be registered\nwith many different competing registrars. Go to http://www.internic.net\nfor detailed information.\n\n Domain Name: HICHINA.COM\n Registrar: HICHINA ZHICHENG TECHNOLOGY LTD.\n Whois Server: grs-whois.hichina.com\n Referral URL: http://www.net.cn\n Name Server: NS3.HICHINA.COM\n Name Server: NS4.HICHINA.COM\n Status: clientDeleteProhibited\n Status: clientTransferProhibited\n Status: clientUpdateProhibited\n Updated Date: 25-mar-2010\n Creation Date: 23-apr-1996\n Expiration Date: 24-apr-2019\n\n>>> Last update of whois database: Mon, 20 Jun 2011 05:34:30 UTC <<<\n\nNOTICE: The expiration date displayed in this record is the date the \nregistrar’s sponsorship of the domain name registration in the registry is \ncurrently set to expire. This date does not necessarily reflect the expiration \ndate of the domain name registrant’s agreement with the sponsoring \nregistrar. Users may consult the sponsoring registrar’s Whois database to \nview the registrar’s reported date of expiration for this registration.\n\nTERMS OF USE: You are not authorized to access or query our Whois \ndatabase through the use of electronic processes that are high-volume and \nautomated except as reasonably necessary to register domain names or \nmodify existing registrations; the Data in VeriSign Global Registry \nServices’ (\”VeriSign\”) Whois database is provided by VeriSign for \ninformation purposes only, and to assist persons in obtaining information \nabout or related to a domain name registration record. VeriSign does not \nguarantee its accuracy. By submitting a Whois query, you agree to abide \nby the following terms of use: You agree that you may use this Data only \nfor lawful purposes and that under no circumstances will you use this Data \nto: (1) allow, enable, or otherwise support the transmission of mass \nunsolicited, commercial advertising or solicitations via e-mail, telephone, \nor facsimile; or (2) enable high volume, automated, electronic processes \nthat apply to VeriSign (or its computer systems). The compilation, \nrepackaging, dissemination or other use of this Data is expressly \nprohibited without the prior written consent of VeriSign. You agree not to \nuse electronic processes that are automated and high-volume to access or \nquery the Whois database except as reasonably necessary to register \ndomain names or modify existing registrations. VeriSign reserves the right \nto restrict your access to the Whois database in its sole discretion to ensure \noperational stability. VeriSign may restrict or terminate your access to the \nWhois database for failure to abide by these terms of use. VeriSign \nreserves the right to modify these terms at any time. \n\nThe Registry database contains ONLY .COM, .NET, .EDU domains and\nRegistrars.”,”whois_server”:”grs-whois.hichina.com”}

返回是通过JQuery异步获取的:

function whois_infor(f){
if(f==0 || f==2){
var whois_html = '<img src="/images/loading.gif" border="0" alt="正在查询更多.." width="32" height="32" />正在查询更多,请稍等';
$(".info_text").html(whois_html);
}
var tip_infor = '<span style="line-height: 24px;">域名注册信息为缓存信息,并非实时更新,不可做为该域名可否被注册的依据。
</span>
<div class="info_text_web2"><img style="float: left; padding: 2px 4px 0 0;" src="/images/icon01.jpg" alt="" /><span id="file"> </span> <a class="linkblue_query" style="cursor: pointer;" onclick="lock();">点击查询最新域名注册信息</a></div>
';
var whois_infor_html = "域名注册信息查询超时,请稍后重试或【<a style="cursor: pointer;" onclick="whois_infor(0)">刷新页面</a>】";
$.ajax({
type:"get",
url:"/whois/api_whois",
cache:false,
data:{host:domain_string,oper:f},
dataType: "json",
timeout: 10000,
success:function(data){
if(data){
if(data.hasOwnProperty("error") &amp;&amp; data.error =="hava no permission"){
$(".info_text").html(whois_infor_html);
}else if(data.hasOwnProperty("error") &amp;&amp; data.error =="read timeout"){
$(".info_text").html(whois_infor_html);
}else if(data.hasOwnProperty("space") &amp;&amp; data.space =="space"){
var whois_html="";
//data.hostname='whois.www.net.cn'
if(data.hostname=="whois.www.net.cn"){
whois_html ="<span style="line-height: 24px;">您查询的域名<span class="style1">mikel.cn</span>可能被注册局保留、正在审核或限制注册,暂无域名注册信息";
}else{
whois_html ="<span style="line-height: 24px;">您查询的域名<span class="style1">mikel.cn</span>可能未被注册, 暂无域名注册信息
";
whois_html +="<input checked="checked" type="checkbox" />mikel.cn </span>"+
"请【<a class="linkblue_query" href="http://pandavip.www.net.cn/cgi-bin/Check.cgi?domain=mikel&amp;cn=yes">尝试注册</a>】";
}
tip_infor ="
<span style="color: #ff6600;">友情提示:</span>"+'域名注册信息为缓存信息,并非实时更新,不可做为该域名可否被注册的依据。
</span>
<div class="info_text_web2"><img style="float: left; padding: 2px 4px 0 0;" src="/images/icon01.jpg" alt="" /> <a class="link_bluel" style="cursor: pointer;" onclick="lock();">点击查询最新域名注册信息</a></div>
';
whois_html += tip_infor;
$(".info_text").html(whois_html);
}else if(data.hasOwnProperty("audit") &amp;&amp; data.audit =="audit"){
var whois_html="";
whois_html ="<span style="line-height: 24px;">您查询的域名<span class="style1">mikel.cn</span>可能被注册局保留、正在审核或限制注册,暂无whois信息";
tip_infor ="
<span style="color: #ff6600;">友情提示:</span>"+'域名注册信息为缓存信息,并非实时更新,不可做为该域名可否被注册的依据。
</span>
<div class="info_text_web2"><img style="float: left; padding: 2px 4px 0 0;" src="/images/icon01.jpg" alt="" /> <a class="link_bluel" style="cursor: pointer;" onclick="lock();">点击查询最新域名注册信息</a></div>
';
whois_html += tip_infor;
$(".info_text").html(whois_html);
}else{
var arr = new Array;
arr = domain_string.split(".");
var type = arr[arr.length-1];
var whois_html = '
';
whois_html +='

';
whois_html += '

';
whois_html +='

';

if(data.hasOwnProperty("status")){
whois_html +='

';
}else{
whois_html +='

';
}
if(data.hasOwnProperty("registrar")){
var s = /HICHINA ZHICHENG|HiChinaZhicheng|HiChina Zhicheng|HichinaZhicheng/;
var res = s.exec(data.registrar);
if(res){
data.registrar = "北京万网志成科技有限公司";
}
whois_html +='

';
}else{
whois_html +='

';
}
if(type == "com" || type =="net" || type=="cc" || type=="tv" || type =="tel" || type=="so"){
document.getElementById("type").value = type;
document.getElementById("type_infor").value=data.whois_server;
}
else{
if(data.hasOwnProperty("Registrant_Organization")){
whois_html +='

';
}else{
whois_html +='

';
}
if(data.hasOwnProperty("Registrant_Name") &amp;&amp; data.hasOwnProperty("email")){
if(type == "cn"){
whois_html +='

';

}else{
whois_html +='

';
}
}else{
whois_html +='

';
}
}
if(data.hasOwnProperty("name_server")){
whois_html +='

';
}else{
whois_html +='

';
}
if(data.hasOwnProperty("reg_date")){
whois_html +='

';
}else{
whois_html +='

';
}
if(data.hasOwnProperty("exp_date")){
whois_html +='

';
}else{
whois_html +='

';
}
if(type == "com" || type =="net" || type=="cc" || type=="tv" ||type=="so"){
whois_html +='
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="info_text15" width="27%"><strong>域名</strong>
DomainName</td>
<td style="white-space: -o-pre-wrap; word-break: break-all;" width="73%">'+domain_string+'  <a class="linkblue_query" href="http://www." target="_blank">访问该网站</a></td>
</tr>
<tr bgcolor="#F3F3F3">
<td class="info_text15"><strong>域名状态</strong>(<a class="linkblue_query" href="http://www.net.cn/service/faq/yuming/ymzc/200708/2462.html" target="_blank">这是什么?</a>)
Domain Status</td>
<td style="cursor: pointer;">'+domain_status(data.status)+'</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td class="info_text15"><strong>注册商</strong>
Sponsoring Registrar</td>
<td>'+data.registrar+'</td>
</tr>
<tr>
<td class="info_text15"><strong>注册商</strong>
Sponsoring Registrar</td>
<td></td>
</tr>
<tr bgcolor="#F3F3F3">
<td class="info_text15"><strong>注册人公司</strong>
Company</td>
<td>'+data.Registrant_Organization+'</td>
</tr>
<tr bgcolor="#F3F3F3">
<td class="info_text15"><strong>注册人公司</strong>
Company</td>
<td></td>
</tr>
<tr>
<td class="info_text15"><strong>注册人/管理人Email</strong>
Registrant Name/Email</td>
<td>'+data.Registrant_Name+'/'+data.email+'</td>
</tr>
<tr>
<td class="info_text15"><strong>注册人/Email</strong>
Registrant Name/Email</td>
<td>'+data.Registrant_Name+'/'+data.email+'</td>
</tr>
<tr>
<td class="info_text15"><strong>注册人/Email</strong>
Registrant Name/Email</td>
<td></td>
</tr>
<tr bgcolor="#F3F3F3">
<td class="info_text15"><strong>DNS 服务器</strong>
Name Server</td>
<td>'+data.name_server+'</td>
</tr>
<tr bgcolor="#F3F3F3">
<td class="info_text15"><strong>DNS 服务器</strong>
Name Server</td>
<td></td>
</tr>
<tr>
<td class="info_text15"><strong>注册日期</strong>
Registration Date</td>
<td>'+data.reg_date+'</td>
</tr>
<tr>
<td class="info_text15"><strong>注册日期</strong>
Registration Date</td>
<td></td>
</tr>
<tr bgcolor="#F3F3F3">
<td class="info_text15"><strong>到期日期</strong>
Expiration Date</td>
<td>'+data.exp_date+'</td>
</tr>
<tr bgcolor="#F3F3F3">
<td class="info_text15"><strong>到期日期</strong>
Expiration Date</td>
<td></td>
</tr>
<tr>
<td colspan="2">
<div class="linkblue_query" style="cursor: pointer;" onclick="show_hide(1)"><img id="img1" src="http://www.net.cn/static/member/images/icon_open.gif" alt="" /> <strong>查看完整注册信息</strong></div>
<div id="tab1" style="display: none;">
<div class="dbody">
<pre><img src="/images/loading.gif" alt="" />正在查询</pre>
</div>
</div>
<span style="color: #ff6600;">友情提示:</span>按注册局要求,过期域名可能会处于注册商自动续费期阶段,您在此查询所看到的域名到期日仅供参考,
请您<a class="linkblue_query" href="http://www.net.cn/has_client/userlogon/user_logon1.asp" target="_blank">进入会员区</a>查看该域名的实际到期时间,并请及时进行续费,谢谢!
'+tip_infor+'</td>
</tr>
</tbody>
</table>
';
}else{
whois_html +='
<div class="linkblue_query" style="cursor: pointer;" onclick="show_hide(1)"><img id="img1" src="http://www.net.cn/static/member/images/icon_open.gif" alt="" /> <strong>查看完整注册信息</strong></div>
<div id="tab1" style="display: none;">
<div class="dbody">
<pre>'+data.total_infor+'</pre>
</div>
</div>
<span style="color: #ff6600;">友情提示:</span>按注册局要求,过期域名可能会处于注册商自动续费期阶段,您在此查询所看到的域名到期日仅供参考
请您<a class="linkblue_query" href="http://www.net.cn/has_client/userlogon/user_logon1.asp" target="_blank">进入会员区</a>查看该域名的实际到期时间,并请及时进行续费,谢谢!
'+tip_infor+'

';
}
$(".info_text").html(whois_html);
}
}
else{
$(".info_text").html(whois_infor_html);
}
file_date();
},
error:function(data){
$(".info_text").html(whois_infor_html);
file_date();
}}

);
//file_date();
}

[转载]Flex框架Cairngorm2 SequenceCommand用法封装

mikel阅读(1178)

[转载]Flex框架Cairngorm2 SequenceCommand用法封装 – God bless you – 博客园.

概述:

The SequenceCommand is provided as a “psuedo-abstract” (since ActionScript has no real concept of abstract classes) base-class that can be extended when you wish to chain commands together for a single user-gesture, or establish some simple form of decision-based workflow.

By extending SequenceCommand, you can specify the event that should be broadcast to the controller (causing another command execution without a further user-gesture) when the current command has completed execution.

For a command implementing the Responder interface, you may choose to sequence a subsequent command on successful completion of the command, in the onResult() handler, or on failure of the command in the onFault() method.

For commands that do not implement the Responder interface, you can simply chain commands by causing the sequenced command to be invoked as the last action in your command’s execute() method.

一般用法:

1. SequenceCommand实例构造函数中设置nextEvent

2. 对于实现IResponder的Command,在onResult()或onFault()中调用executeNextCommand()来执行下一chain command

3. 对于未实现IResponder的Command,在execute()方法的最后调用executeNextCommand()来执行下一chain command

对于复杂链式命令,封装ChainEvent后的实现:

1. 定义一个ChainEvent,所有需要按顺序执行的事件都继承自该事件。

package xxx.events
{
import com.adobe.cairngorm.control.CairngormEvent;
import flash.events.Event;
/**
*
* ChainEvent,所有需要按顺序执行的事件都继承自该事件
*
* @see com.adobe.cairngorm.control.CairngormEvent
*
*/
public class ChainEvent extends CairngormEvent
{
public static const CHAIN_EVENT:String = “xxx.events.ChainEvent”;
public var nextEvent:ChainEvent;
public var myValue:String;     //测试值
public function ChainEvent()
{
super( CHAIN_EVENT );
}
public override function clone():Event
{
var res:ChainEvent = new ChainEvent();
res.nextEvent = nextEvent;
res.myValue = myValue;
return res;
}
}
}

2. 建立ChainEvent工厂类

package xxx.events.utils
{
import xxx.events.ChainEvent;

/**
*
* ChainEventFactory,chainEvent静态工厂类
*
*/
public final class ChainEventFactory
{
public static function createChainEvent(evts:Array):ChainEvent
{
if ( evts.length < 1 )
return null;
var res:ChainEvent = evts[ 0 ] as ChainEvent;
for (var i:int=0; i<evts.length; i++ )
{
if (i<evts.length-1)
{
var event:ChainEvent = evts[ i ] as ChainEvent;
var nextEvent:ChainEvent = evts[ i+1 ] as ChainEvent;
event.nextEvent = nextEvent;
}
}
return res;
}
}
}

3. 实现Command

package xxx.command
{
import com.adobe.cairngorm.commands.SequenceCommand;
import com.adobe.cairngorm.control.CairngormEvent;
import xxx.events.ChainEvent;

public final class ChainCommand extends SequenceCommand
{
public override function execute(event:CairngormEvent):void
{
var chainEvent:ChainEvent = event as ChainEvent;
trace(chainEvent.myValue);
if (chainEvent.nextEvent != null)
{
this.nextEvent = chainEvent.nextEvent;
this.executeNextCommand();
}
}
}
}

4. 链式ChainEvent派发

var firstChainEvent:ChainEvent = new ChainEvent();
var secondChainEvent:ChainEvent = new ChainEvent();
var thirdChainEvent:ChainEvent = new ChainEvent();

firstChainEvent.myValue = “firstChainEvent”;
secondChainEvent.myValue = “secondChainEvent”;
thirdChainEvent.myValue = “thirdChainEvent”;

var chainEvent:ChainEvent = ChainEventFactory.createChainEvent([firstChainEvent,secondChainEvent,thirdChainEvent]);
chainEvent.dispatch();

最后结果输出:

firstChainEvent

secondChainEvent

thirdChainEvent

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

mikel阅读(1126)

最近统计数据功能涉及到统计指定的区间的记录数量的问题,结果输入起始时间: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阅读(947)

[转载]如何理解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阅读(1091)

[转载]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阅读(1372)

[转载]开发一个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阅读(755)

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阅读(1156)

[转载]针对不同手机系统的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阅读(1278)

[转载]【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阅读(1000)

[转载]【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