WayneShao 的博客

记录精彩的程序人生

【迷宫中的算法实践】迷宫问题算法综述

最近听闻数据结构与算法实践课的老师又出了和上年一样的选题,不禁想起了去年自己完成作业时的点点滴滴,遗憾当时没有写博客的习惯,之前的一些心得这一年实践的过去也逐渐淡忘了,突然就有了总结一下的想法,希望能有新的收获吧。由于当时也没注意保存,软件完成过程中的一些文档早已丢失了,幸运的是 Winform 版源码还在,Unity3D 版程序也还幸存,虽然由于时间紧张只完成了大概框架,但美观程度也远非 Winform 可

【MVC 学习笔记】6. 使用 Memcache+Cookie 解决分布式系统共享登录状态

为了解决单机处理的瓶颈,增强软件的可用性,我们需要将软件部署在多台服务器上启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服务器上,或通过负载均衡技术(如:DNS 轮询、Radware、F5、LVS 等)让多个频道共享一组服务器。当我们将网站程序分部到多台服务器上后,由于 Session 受实现原理的局限,无法跨服务器同步更新 Session,使得登录状态难以通过 Session 共享。我们使

【MVC 学习笔记】5. 使用 Controller 来代替 Filter 完成登录验证(Session 校验)

之前的学习中,在对 Session 校验完成登录验证时,通常使用 Filter 来处理,方法类似与前文的错误日志过滤,即新建 Filter 类继承 ActionFilterAttribute 类,重写 OnActionExecuting 方法,之后直接在需要验证的 Action 前加上 Filter 标记即可。Filter 式实现新建登陆校验类新建登陆校验类 CheckLoginAttributeusingSystem.Web.M

【MVC 学习笔记】4. 使用 Log4Net 来进行错误日志的记录

在 Web 应用运行过程中,我们难免会遇到程序运行异常,这个时候我们就应该将异常信息记录下来,以便开发人员和维护人员对异常原因进行还原,对异常原因进行修复。在 ASP.NET 平台中进行日志记录的组件也有很多,如 Log4Net、CommonLogging 等,我们这里选用 Log4Net 进行异常日志的记录。捕获异常在 ASP.NETMVC 中提供了一个全局的异常处理过滤器:HandleErrorAttribute,

【MVC 学习笔记】3. 使用 Spring.Net 应用 IOC(依赖倒置)

本篇我们将使用 Spring.Net 进行依赖导致。到现在,我们已经基本搭建起了项目的框架,但是项目中还存在一个问题,就是尽管层与层之间使用了接口进行隔离,但实例化接口的时候,还是引入了接口实现类的依赖,如下面的代码:privateIUserService_userService;privateIUserServiceUserService{get{return_userService??(_userS

【MVC 学习笔记】2. 使用 T4 模板生成其他类的具体实现

在前篇中我们已经将 User 类中的代码做了具体的实现,但仍然有多个实体类未实现,以后可能还会增加新的数据表,数据表结构也有可能发生变化,所以我们使用 T4 模板来完成类的生成,这样就算数据库表发生了改变,也会自动根据改变后的实体对类进行重新生成。DAL 层下面是数据访问层的 T4 模板文件 Dal.tt<#@templatelanguage="C#"debug="false"hostspecific="true"

【MVC 学习笔记】1. 项目结构搭建及单个类在各个层次中的实现

新人刚开始学习 ASP.NETMVC,若有不足之处希望能得到您的指点,不胜感激!层级结构先来一张项目的层级结构图:Model:模型层,主要是各种类型、枚举以及 ORM 框架,框架完成数据库和实体类的映射。项目中选用了微软的开源 ORM 框架 EntityFramework6.0(以下简称 EF),数据库则选择了微软的轻量级数据库 SQLServerCompact4.0 本地数据库(简称 Compact),Compact

【爬虫学习笔记】基于 SimHash 的去重复处理模块 ContentSeen 的构建

Internet 上的一些站点常常存在着镜像网站(mirror),即两个网站的内容一样但网页对应的域名不同。这样会导致对同一份网页爬虫重复抓取多次。为了避免这种情况,对于每一份抓取到的网页,它首先需要进入 ContentSeen 模块。该模块会判断网页的内容是否和已下载过的某个网页的内容一致,如果一致,则该网页不会再被送去进行下一步的处理。这样的做法能够显著的降低爬虫需要下载的网页数。至于如果判断两个网页

【爬虫学习笔记】DNS 解析服务增加缓存机制

之前我们已经基于 ARSoft.Tools.Net 简单实现了 DNS 解析模块的功能,但是当性能要求升高时,每一次爬取都要进行 DNS 请求,甚至很有可能一段时间内每次请求的都是相同的地址,频繁的 DNS 请求就会成为性能瓶颈,所以我们要通过缓存机制将 DNS 解析结果缓存下来,降低 DNS 解析操作,提升系统性能。如此,我们基于之前封装的 MemoryCacheHelper 类对 DnsResolver 类进行改造:using

【爬虫学习笔记】MemoryCache 缓存的用法学习

在完成了 DNS 解析模块之后,我意识到了 DNS 缓存机制也很有必要。在 Redis,Memcache,和.Net 自带的 Cache 之间,考虑到部署问题,最终选择了后者,之前在学习 Web 及开发的过程中用过 System.Web.Caching.Cache 这个类库,但是这次的爬虫程序我打算部署为桌面软件,所以选用了 System.Runtime.Caching.MemoryCache(后期如有必要也会加入 Syste

【爬虫学习笔记】.Net 基于 ARSoft.Tools.Net 的 DNS 解析模块(半成品)

最近在做爬虫的作业,今天学习的内容是关于 DNS 解析模块的制作的。使用的库为 ARSoft.Tools.Net,它是一个非常强大的开源 DNS 控件库,包含.NetSPFvalidation,SenderIDvalidation 以及 DNSClient、DNSServer 接口。使用该接口可轻松实现 DNS 客户请求端及服务器解析端。项目地址:http://arsofttoolsnet.codeplex.com/,

【爬虫学习笔记】.Net 使用 ScrapySharp 并行下载天涯图片

最近因为一个作业需要完成 CNKI 爬虫,研究爬虫架构的时候发现了这个疑似移植于 Python 的著名开源爬虫框架 Scrapy 的 ScrapySharp,然而在网上寻找之后只发现了这个 F#的 Demo,就使用原文中示例的网站写了这个 C#版本的代码。实现下面是代码:usingSystem;usingSystem.IO;usingSystem.Linq;usingSystem.Threading.Tasks;usi

一木禾网盘文件下载地址批量获取实现

流程清晰之后,我们就可以制作软件来对网盘地址链接批量处理得到下载链接。选型我们的整个操作流程类似模拟浏览器操作,最好的解决方法其实是使用 Selenium 直接操作浏览器抓取。不过这方面我还没什么研究,就直接用最近发现的木鱼大牛的 FSLib.Network 库来实现。这个类库是实现了 HTTP 访问过程中对 Cookie 的自动处理,在大多数情况下都可以模拟浏览器。使用 nuget 在项目中安装 FSLib.Netwo

一木禾网盘文件下载地址抓取分析

本文是对抓取一木禾网盘文件下载地址的整个流程就行分析,并依次解决其中各个环节涉及的技术问题。缘由最近因为一些个人原因用到了一木禾网盘,这个收费网盘虽然较一些国外的倒数 30 秒网盘容易了一些,也没有十分钟只能下载一个的限制,但如果下载资源较多还是显得十分麻烦。网上搜索了很长时间,功夫不负有心认,终于在吾爱破解找到了 cylisme 作品一木禾网盘批量下载。软件界面如下:虽然可以进行使用,但是每一个验证码都必

C# TextBox Ctrl+A 全选

Winform 程序中光标在 TextBox 控件中时按下 Ctrl+A 快捷键,并不能选中全部文字,而是会发出警告音。本文给出实现方法。在 TextBox 控件中使用快捷键,一般要求按下快捷键立刻产生效果,KeyUp 事件显然不符合我们的要求,而 KeyPress 事件中不支持使用组合件,所以我们选用 KeyDown 事件,具体代码实现如下:privatevoidtBBefore_KeyDown(objectsender

C# 激爽特性——扩展方法

在最近的学习中,发现了一种用起来特别爽的 C#特性——扩展方法,之前拜读《大话设计模式》一书的时候,书中提到这样一句话:“反射,反射,程序员的快乐”,本人菜鸟一只,到现在还未曾使用过反射,对于其是否真的快乐自然无从体会,不过扩展方法用起来称得上是相当快乐!简介下面是 MSDN 中对于扩展方法的解释扩展方法使你能够向现有类型”添加“方法,而无需创建新的派生类型、重新编译或以其他方法修改原始类型。扩展方法是一

C# 线性筛法快速求出范围内的所有质数

质数是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的数。本文列举了几种求区间内所有质数的算法。一般方法验证质数我们根据质数的定义可以对某一自然数进行检测,方法如下:///<summary>///判断自然数是否是质数///</summary>///<paramname="n"> 需要判断的数 </param>///<returns> 是/否 </returns>publicstaticboolIsP