z在.NET 平台日常开发中偶尔会需要通过一组id查询数据的情况,但是SQL Server基本数据类型中不存在数组,所以以前的做法是传递用分隔符构造的id列表字符串,在SQLServer用自定义函数拆分id再查询,由于SQLSERVER函数对字符串处理效率不一定高,有多余的系统开销,所以总觉得是个撇脚的设计。
不过自SQLServer2008发布后,提供了表值参数,现在就有了更好的选择解决这个问题,本文重点是实践传递数组的过程,所以关于表值参数更多概念请浏览:http://msdn.microsoft.com/zh-cn/library/bb510489.aspx
创建表值参数: CREATE TYPE [dbo].[ut_int_array] AS TABLE( [id] [int] NULL ) 存储过程中使用表值参数: create proc [up_get_feed_device_types] @feed_ids ut_int_array readonly as select id, device_type from feed_distribute where id in (select [id] from @feed_ids); go 存储过程程序调用实例: public List<DeviceType> GetFeedsDeviceType(int[] feedIds) { List<DeviceType> result = null; //构造表值参数 DataTable ids = null; ids = new DataTable(); [...]
排序设计:
一般增加排序字段sort,通过创建日期倒叙排列,sort越大越靠前,创建时间约晚越靠前,sort 默认为 0:
默认列表查询为:
select * from table order by sort desc, create_time desc
上移一位
update table set sort = (select min(sort) from table where sort > (select sort from table where id = :id) + 1
下移一位
update table set sort = (select max(sort) from table where sort < (select sort [...]
本文适用于开设ftp方便自己维护服务器,不适用于安装ftp为其它用户提供服务。
安装vsftp:
yum install vsftp
配置如下:
一、修改 /etc/vsftpd/ftpusers 文件 注释掉root
文件里面的用户是禁用 FTP 服务的,所以我们把 root 用户删除或者注释。因为我们要使用 root 用户上传文件。
二、修改 /etc/vsftpd/user_list 文件 ,注释掉所有非root的用户
如果配置 userlist_deny=NO ,只允许文件里面的用户登录 FTP,所以我们删除 root 外的其它用户。因为不是专用的 FTP 服务器,所以只允许特定的用户使用。
三、修改 /etc/vsftpd/vsftpd.conf 配置
将配置 userlist_deny=NO 加入到配置文件末尾
修改 anonymous_enable=YES 为 anonymous_enable=NO,让其关闭匿名登录
在文件末增加如下配置,让其支持被动模式(注意防火墙设置开启相应端口)
pasv_enable=YES pasv_min_port=3000 pasv_max_port=4000
四、设置CentOS [...]
创建服务账号
groupadd nginx useradd -g nginx -s /bin/false -M nginx 手动编译nginx:
安装依赖库:
yum install gcc openssl-devel pcre-devel zlib-devel
下载html内容替换模块(官方模块不支持多替换)
yum install subversion # 安装svn客户端 svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only
下载nginx源码
wget http://nginx.org/nginx.tar.gz #演示,请到官方获得具体地址
解压后配置:
./configure –prefix=/web/nginx –with-http_ssl_module –with-http_gzip_static_module –add-module=/install/substitutions4nginx-read-only make make install
编写启动脚本:
vi /etc/init.d/nginx
写入如下值:
#!/bin/sh # # nginx – this script starts and stops [...]
前文提到可以利用IIS7 ARR模块实现类nginx反向代理,提供负载均衡方案,但是真正要在实际应用中部署,还得解决session同步问题,session实际上是缓存的一种,在之前微软的解决方案中并没有可靠的分布式缓存方案,通常都是利用memcached来实现,不过最新.NET 4中已经有较为完善的解决方案:Windows Server AppFabric 缓存。
AppFabric 缓存物理结构
Windows Server AppFabric 缓存 功能使用彼此通信的服务器群集来形成单个统一的应用程序缓存系统。无论构成缓存群集的计算机有多少台,您的客户端应用程序都可以与群集中单个逻辑单元的缓存配合使用。
物理体系结构的主要组件包含缓存服务器、缓存主机 Windows 服务、缓存群集、基于 Windows PowerShell 的缓存管理工具、群集配置存储位置和缓存客户端。
AppFabric 缓存逻辑结构
AppFabric 中缓存群集的逻辑体系结构由命名缓存、区域和缓存对象组成。在下图中,命名缓存跨群集中的所有缓存主机,但区域仅限于群集中的一个缓存主机。
开发缓存客户端
针对 .net 开发,提供了 Microsoft.ApplicationServer.Caching 命名空间中的接口供开发调用,具体开发不在此处详述,详细浏览:http://msdn.microsoft.com/zh-cn/library/ee790941.aspx
实现Seesion同步
Microsoft.ApplicationServer.Caching 中提供了现成的 SessionProvider,不需要应用做任何开发,就能通过部署切换到分布式缓存中,详细配置方法参考:http://msdn.microsoft.com/en-us/library/ee790859.aspx
配置案例如下:
<?xml version=”1.0″ encoding=”utf-8″ ?> <configuration> <!–configSections must be the FIRST element –> <configsections> <!– required to read [...]
实现nginx反向代理类似功能,解决asp.net 大规模应用负载均衡问题,当然要实际使用,还得从应用层面解决其他问题,例如最基本的有seesion共享问题。
IIS Application Request Routing (ARR) 2.5 enables Web server administrators, hosting providers, and Content Delivery Networks (CDNs) to increase Web application scalability and reliability through rule-based routing, client and host name affinity, load balancing of HTTP server requests, and distributed disk caching. With ARR, administrators can optimize resource utilization for application servers to [...]
ref: http://tugen.blogbus.com/logs/54793301.html
自从SNS热以来,许多技术人员开始钻研SNS技术,模仿Facebook去实现一些有意思的功能,这里仅以我的经验介绍一些功能的架构与具体实现。
SNS(Social Networking Services)即社会性网络服务;它主要是一个人际关系的平台,具有行为信息(event)的传播性,行为的群体性。每一个用户的行为(event)都可以被记录、传播,进而凝聚具有共性的用户形成社群,导致群体性行为的发生。
要架构SNS平台,从需求上来看,主要是要能把用户的行为浓缩成一个简洁的信息(惯例称之feed),根据用户设定的传播范围,通过用户的人际进行传播。用户也可以根据自己的喜好来建立与别的用户的关系(关注或成为朋友),然后根据喜好和人际关系的密切度,来设定接收别人的feed的类型和密度;
那么,这里就要解决几个数据之间的关系:
1、人际关系;一般人与人不外乎:有关系、没关系;而有关系在SNS中,又可以分为:关注,朋友;其中“关注”即是因为对某人感兴趣(因为对方有让人感兴趣的地方),想知道对方的行为和状态,进而“订阅对方的feed”的行为的名称;
2、feed与人的关系; feed 是用户的行为产生的(谁产生,作用于谁),用户可以设定自己的行为可以被哪些人看见(可见权限);而这个“哪些人”并不是具体的谁谁谁,而是针对人际关系的前提下而言的。
3、范围,指用户设定的接收范围(属于过滤),这个“范围”是相对人际关系而言的,范围也不考虑级别关系(否则整个系统就更加复杂了)。
4、密度,指获得feedlist时某些类型的feed出现的概率,所以“密度”是针对feed的“类型”而言的。
好了概念和需求方面的阐述到此结束,以下来一一定义:
1、人际关系在数据上的定义如下:
RELATIONS_FOLLOW_UP = 1 (关注关系,二进制是 00000001)
RELATIONS_FRIEND = 16 (朋友关系, 二进制是 00010000)
RELATIONS_SELF = 128 (自己,二进制是 10000000 )
2、feed、内容(任何SNS里的内容元素,如日志、照片、投票等)的可见度
VIEW_RANK_PUBLIC = 0 (公开可见的,二进制是 00000000, 比人际关系中的关注还要小) [...]
ref: http://tugen.blogbus.com/logs/52866192.html
分类算法要解决的问题
在网站建设中,电子商店要涉及到商品分类,发布系统要涉及到栏目或者频道分类,软件下载要涉及到软件的分类等等。分类算法的应用非常的普遍。
分类算法通常要解决如下问题:
1、分类算法常常表现为树的表示和遍历问题,如果用数据库中的一个Table来表达树型分类,应该有几个字段?
2、如何快速地从这个Table恢复出一棵树?
3、如何判断某个分类是否是另一个分类的子类?
4、如何查找属于某个分类的所有条目?
5、如何生成分类所在的路径?
6、如何新增分类?
本文试图解决这些问题。
分类的数据结构
分类的数据结构实际上是一棵树。由于在网站建设中我们大量使用数据库,所以我们将从Tree在数据库中的存储谈起。
为简化问题,假设每个节点只需要保留Name这一个信息,我们需要为每个节点编号,编号的方法有很多种,在数据库中常用的就是自动编号,这在Access、SQL Server、Oracle中都是这样,假设编号字段为ID。
为了表示某个节点 ID1 是另外一个节点 ID2 的父节点,我们需要在数据库中再保留一个字段,说明这个分类是属于哪个节点的下级分类。把这个字段取名为ParentID。如这里的ID2,其ParentID就是ID1。
分类Catalog的数据表定义:
Create Table [Catalog]( [ID] [int] NOT NULL, [Name] [nvarchar](50) NOT NULL, [ParentID] [int] NOT NULL );
约定:我们约定用 -1 [...]
参考:
ref #1: http://www.cnblogs.com/Lawson/archive/2011/11/24/2261382.html
ref #2: http://www.cnblogs.com/clc2008/archive/2011/08/02/2125607.html
从IIS6新增应用程序池的概念,到现在IIS7,对HTTP请求处理功能已经越来越精确化和不断改善,IIS7应用程序池新增了经典模式和集成模式可供选择。经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于IIS6.0下的Web应用程序迁移到IIS7.0中只要将应用程序配置成经典模式,代码基本不用修改就可以正常运行。集成模式是一种统一的请求处理管道,它将ASP.NET请求管道与IIS核心管道组合在一起,这种模式能够提供更好的性能,能够实现配置和治理的模块化,而且增加了使用托管代码模块扩展IIS时的灵活性。假如老的Web应用程序运行于IIS7.0的集成模式下,可能需要对应用程序的web.config文件进行修改,尤其是使用了实现IHttpHandler接口的自定义模块的情况。IIS7.0在同一个服务器上能够同时支持两种模式的应用程序。
区别演示
例如演示一个简单的HttpModule
创建一个asp.net 应用程序 ModuleIISTests,里面包括aspx和htm文件,default.aspx文件内容为空,a.htm文件内容为aaaaaa,下面一个TestIISModule是一个类库,TestModule.cs是继承自IHttpModule的一个自定义的HtppModule,主要代码如下:
public class TestModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest +=new EventHandler(context_BeginRequest); } public void context_BeginRequest(object sender, EventArgs e) { HttpApplication application = (HttpApplication)sender; application.Response.Write("test module!!!"); } }
然后配置网站的web.config如下:
[...] <system.web> [...]
C#检测手机类型源代码,根据php版本改写,检测原理:
1. 通过判断 http header 中 User-Agent 的关键字
2. 通过判断 http header 中 Accept 值来分别客户端支持的html版本
3. 通过判断 http header 中 手机浏览器特殊的键值 X_Wap_Profile 、Profile 等
源代码如下:
using System; using System.Linq; using System.Text.RegularExpressions; using System.Web; namespace Helpers { /// /// 参考 php 版本: http://detectmobilebrowsers.mobi/ /// public class MobileDeviceDetect { /// /// mobile phone user agent array /// [...]
Ads
Blogroll
- 代理google搜索 代理访问google搜索引擎
- 爱吾资源 关注网站前端,提高个人境界、资源共享于网络
- 百度搜索研发部 百度搜索研发部官方博客
- 百度泛用户体验 以‘用户体验’为核心的跨专业分享平台
