技术掘金 - 2013年5月
type: channel
link: http://blog.guqiankun.com/2013/05/
description: 技术掘金,专注于Web互联网开发,分享技术,致力于打造好的技术博客
items: 该不该在项目中使用存储过程代替SQL语句
items: 泛型技巧系列：如何提供类型参数之间的转换
items: 床上什么样，就是什么人。。。。
items: 最短的跨站代码
items: LLsMP一键安装包及使用教程
items: MS-SQL Server的锁模式
items: 《渝李文集静日书 -- 秦淮河的风月桃花》
items: Linux VPS安装mysql无法远程连接的解决
items: 泛型FAQ：最佳实践
items: 视频: 一群屌爆了的人，一次难忘的旅行，大学毕业前最后一次旅行

该不该在项目中使用存储过程代替SQL语句
type: item
date: 2013-05-31T07:14:00+08:00
description: 存储过程的好外,我就不多说了,想必各位都已了然于胸。当然,存储过程也有不少坏处:当存储过程数量越来越多的时候,在众多存储过程中找到想要修改的存储过程是一件麻烦的事.如果用嵌入式SQL语句,可以在修改代码时,顺便就修改了数据库操作语句,方便针对这两个所谓的缺点,我提出我的一些看法:如果说存储过程多了,不好找,那你该检讨一下您的命名习惯是否规范是否达意,如果是多人合作的团队,大家更应该对于存储过程的命名有一致的规则,当然,不只存储过程需要这样,其他部分也都要需要这样.好的存储过程命名最好能包含操作名称(insert/update/get/list等),要操作的对象名称(表名)等,这样,即便你的存储过程再多,一样也能快速找到要改的那个,这样命名,还可以让你通过SQL 2000的对象查找功能一次性的按表名找到与此表相关的所有存储过程的名称,同理,你用LIST来查,也可以查到所有LIST功能的存储过程对于第二种观点,我是不大同意的,在过往的例子中,我发现,将SQL语句从代码中分离出来,带来的好处远远大于坏处,而且这样更符合分层的原则,如果我们将SQL语句嵌入到代码中,当你仅需要多获取一个字段的值,或者对SQL语句本身做一些修改时,你就必须要编译,然后上传DLL,而如果你是用存储过程的话,你直接改一下存储过程就好了,而且,将二者分离,DBA写好存储过程,列好说明及使用规则,交给负责写DAL层的同学,DAL层的同学闭上眼无需了解SQL语句,也可完成他的工作,因此,从这个角度来说,很好的分隔了工作,不必要要写DAL层的同学也是SQL存储过程高手了防止注入攻击,如果不用存储过程而用嵌入式SQL,你势必要为了防止注入攻击而对输入的用户数据做更多的处理工作,例如处理一些SQL敏感字符等更为重要的是,如果你要朝一个表中插入的是一个BINARY内容的时候,难道你会用SQL语句吗?嵌入式SQL特别是拼贴SQL语句,一向是比较容易出问题的环节,而存储过程在写的时候,就经过检查,储如漏掉符号,INSERT的字段数目与参数数 目不一致的小错误,会立即被纠正谁都知道存储过程是预编译的如果你是高手,你可以分析并优化存储过程来提高性能(以前记得看过MS的一个牛人技术支持讲述存储过程分析和优化,非常启发人)最常见的是,在实际运用中,为了减少DATASET数据集的大小和提高性能,通常我们只SELECT当前需要的字段,但是,随着发展,你可以需要其他字段,这时,如果用嵌入SQL,就要修改SQL语句,编译,再写上绑定该字段的表达式,但是,如果用存储过程,你只要绑定表达式,然后给存储过程中加上这个字段名就可以了。再如,如果用STRING来拼贴SQL的INSERT语句,那很可能是这样拼string strSql=”insert into table (id,username,password,address) values(“+Id.ToString()+”,”+UserName… 这样拼贴,多加个字段时,一花眼,就拼贴错了,如果用存储过程,你顶多用SqlParameter myPara = new SqlParameter(“@field5″,Field5); 再在存储过程里加上这个输入参数就可以了,和修改一下SQL语句就行了,SQL还会在修改过程中帮你检查语法,后者显然比前者用那么多+号与双引号拼贴出错的几率小多了最后,以上观点仅体现个人观点,不过,绝不是书上看来的,而是自己做了几个项目,边做边体会到的

泛型技巧系列：如何提供类型参数之间的转换
type: item
date: 2013-05-30T07:12:00+08:00
description: 从今天起，我将分享一些我在.NET泛型方面的研究心得。这些心得大都是我在设计VBF中思考发现的，还受了很多C++模板与JAVA泛型的启发。其中相当多的技巧和概念都是大部分“深入C# 2.0”类文章也见不到的。我考虑把其中概念性的部分系统地整理成书，而技巧性的东西则通过我这个系列不定期地分享到Blog上。希望用到.NET泛型的人能从我这些技巧中受益。首先我要介绍的技巧是如何提供类型参数之间的转换。我们知道，.NET泛型将每个类型参数理解为一个独立的类型。如果不通过约束指定，编译器不会对类型参数所代表的类型做任何假设。也就是说，如果在某个上下文中有两个不同的类型参数U和V，编译器不会知道运行时他们代表的真实类型能否进行类型转换，因此会拒绝编译如下代码：Public Function GenericCast(Of U, V)(ByVal obj As U) As V Return CType(obj, V) End Function 除非我们加以约束U是V的子类。这显然是为了类型安全做出的考虑，因为.NET这种跨程序集的泛型无法在编译时做出足够的检查来确保类型安全。但是限制了这种操作，就妨碍了我们做事，很多代码因此写不出来。于是，我们可以利用.NET所有类型的基类Object来绕过这一限制：Return DirectCast(DirectCast(obj, Object), V) VB的DirectCast运算符在泛型的类型参数上作用与C#的括号运算符相同。也就是说，这段代码用C#写起来是这样：return (V)(object)obj; 这样，即使不约束U和V之间的关系，这段代码也能编译了。但是他的功能却不能令我们满意。这样写出的类型转换实际上还是仅当U是V本身或其子类的时候才能转换成功。而其他一切情况都会转换失败。不管U和V的运行时类型之间是否定义有其他类型转换规则。这显然不合我们意愿，我们希望int与double之间的转换等语言内置的类型转换都能够自动进行，否则就和约束没什么两样了。对VB用户来说有一个极为简单的解决方案——把第二次DirectCast变成CType:Public Function GenericCast(Of U, V)(ByVal obj As U) As V Return CType(DirectCast(obj, Object), V) End Function 现在，GenericCast泛型方法就能执行int与double等内置规则的转换了。很神奇？因为CType运算符在编译时自动调用了VB运行库的转换函数，该函数在运行期间对泛型类型参数的真实类型做了检查。而且这个过程的性能完全可以接受。现在VB的用户已经轻松享受这一功能了。但是C#的事情还没完，因为C#没有如此智能的类型转换运算符，因此就需要手工实现VB运行库所代办的那些任务。其实就是利用了一下IConvertible：static V GenericCast(U obj) { IConvertible convertibleObj = obj as IConvertible; if (convertibleObj != null) { Type t = typeof(V); switch (Type.GetTypeCode(t)) { case TypeCode.Boolean: return (V)(object)convertibleObj.ToBoolean(null); case TypeCode.Byte: return (V)(object)convertibleObj.ToByte(null); case TypeCode.Char: return (V)(object)convertibleObj.ToChar(null); //……… default: //None of them, use the following default way.. break; } } return (V)(object)obj; } 不过这个方法看起来不但很丑、很麻烦，功能上还达不到VB版。所以建议您用到这种类型参数之间的转换，就用VB封装这一功能，然后做成dll供C#调用吧。————Update 1.8, 19:40————经速马提醒，发现Convert.ChangeType方法已经封装了IConvertible判断的那些代码，因此C#版可采用这种写法：static V GenericCast(U obj) { return (V)Convert.ChangeType(obj, typeof(V)); } 不过它仍然没有VB版的CType功能丰富。此外我还发现了VB运行库的ChangeType还有支持用户自定义类型转换运算符的功能。所以终极…

床上什么样，就是什么人。。。。
type: item
date: 2013-05-29T07:07:00+08:00
description: １．睡觉时手脚缩成一团的人：肠胃都有问题，正为生活四处奔波.２．睡觉时常常要翻动身体的人：居无定所，心事烦重，性格急燥.３．睡觉时眼睛稍微张开的人：忧思重重，常与人发生摩擦.４．睡觉时说梦话的人：个性孤僻，处于心神不定中.５．睡觉时头部中枕头一直往下溜的人：消极悲观，内向胆小.６．睡觉时把双手当成枕头的人：爱怀旧，感情细腻丰富.７．睡觉时打鼾的人：自信，为人磊落，但不够虚心受教.８．睡觉时把牙根咬得咯咯响的人：具有收藏癖.９．睡觉时张着嘴巴的人：爱幻想，缺乏耐心与毅力.１０．睡觉时不断做梦并且呻吟的人：一生劳碌，有事未解决时总是不安.１１．睡觉时容易惊醒的人：心机细密，聪慧灵敏，健康好运.１２．睡觉时流口水的人：消化器官较衰弱，子女缘薄.１３．睡觉时手脚经常乱动的人：保守内向，缺乏关爱.１４．睡觉时呼吸声调均匀的人：无忧无虑，身心健康，有福之人.１５．睡觉时双手握成拳头的人：忠诚，吃苦耐劳，意志坚定.１６．睡觉时脸宠带着微笑的人：善良坦荡，深得人心，有福之人.P.S.好准，我属于第一种，我的肠胃确实不好！

最短的跨站代码
type: item
date: 2013-05-28T07:33:00+08:00
description: 最短的跨站语句是多少？要放在以前，我一定会这样想，正常的跨站代码： 查一下，一共27个字符。嘿嘿，不过，这之前我在《黑客手册》上看到了他的一篇文章，《疯狂的跨站之行》，在这其中提到了跨站语句的另一种方法： 将这些语句分别写入，只要所写入的语句在一个页面中显示，那么这些代码最后就会引入到变量z中，总到一块就是：document.write(" ") 然后用eval()函数来执行这个z变量，就可以执行出跨站效果了。lcx在文章的评论中说，最小的有效利用代码可以是26个字母，就是 ， 答案不就出来了，最小的跨站是26个字符。（今天在网上查找资料时，发现利用这种方法还可以少一个字符，就是：z+='d"'，用+=来代替=z+，嘿嘿，又可以减少一个字符，25个字符，不过，也好伤心，我好像只能在别人的基础上面有所突破！:( ）。下面就来进行拆分： 中间的….表示的字符和前面的一样，这其中最长的一个语句是：/fromCharCode/ ，16个字符，因为这是script自已保留的函数名，拆分的话，就不能运行了，由此可以看出，最小的跨站语句是由所采用的函数来定的。

LLsMP一键安装包及使用教程
type: item
date: 2013-05-27T07:25:00+08:00
description: LLsMP顾名思义是Linux+LiteSpeed+MySQL+PHP的一套Web环境。相信可能大家对LNMP更熟悉一些，至于孰好孰坏，我在这里也不卖弄了，毕竟自己也是刚刚接触LLsMP，所以不方便多说，但是从现有资料来看，LiteSpeed的负载能力很强，占用资源也极低，而且对于.htaccess的rewrite规则支持也非常不错，这也是Nginx一个很大的缺陷吧（许多伪静态的规则需要自己完成…）。LLsMP一键安装包及使用教程本文介绍的LLsMP一键安装包是llsmp.org进行发布，本文仅对常用设置与命令进行整理汇总！安装LLsMP安装更多附加组件LLsMP相关管理命令LLsMP常用目录截止本文发表，最新版本0.6已知的问题安装LLsMP支持平台:CentOS 5/6 , Debian 5/6 , Ubuntu 10/11安装命令:安装PHP5.3版本完成之後要重启MYSQL/etc/init.d/mysql startCentOS: PHP5.2 wget http://llsmp.googlecode.com/files/llsmp0.6_centos.tar.gz;tar zxvf llsmp0.6_centos.tar.gz;cd centos;sh install.sh PHP5.3 wget http://llsmp.googlecode.com/files/llsmp0.6_centos.tar.gz;tar zxvf llsmp0.6_centos.tar.gz;cd centos;sh install.sh php5.3 Debian: PHP5.2 wget http://llsmp.googlecode.com/files/llsmp0.6_debian.tar.gz;tar zxvf llsmp0.6_debian.tar.gz;cd debian;sh install.sh PHP5.3 wget http://llsmp.googlecode.com/files/llsmp0.6_debian.tar.gz;tar zxvf llsmp0.6_debian.tar.gz;cd debian;sh install.sh php5.3 Ubuntu: PHP5.2 wget http://llsmp.googlecode.com/files/llsmp0.6_ubuntu.tar.gz;tar zxvf llsmp0.6_ubuntu.tar.gz;cd ubuntu;sh install.sh PHP5.3 wget http://llsmp.googlecode.com/files/llsmp0.6_ubuntu.tar.gz;tar zxvf llsmp0.6_ubuntu.tar.gz;cd ubuntu;sh install.sh php5.3 安装更多附加组件：安装eAccelerator : sh /root/llsmp/eaccelerator.sh安装Zend Optimizer : sh /root/llsmp/zend_optimizer.sh安装ionCube Loader : sh /root/llsmp/ioncube.sh安装Google Performace Tools : sh /root/llsmp/perftools.sh安装FTP(vsftpd) : sh /root/llsmp/vsftpd.sh安装Nginx前端 : sh /root/llsmp/nginx.shLLsMP相关管理命令：创建Litespeed虚拟主机 : sh /root/llsmp/vhost.sh添加FTP账号 : sh /root/llsmp/vsftpd.sh重要！虚拟主机权限修正: chown -R nobody:nobody /home/wwwroot/域名/html创建Nginx虚拟主机 : sh /root/llsmp/nginx.sh备份指令 : sh /root/llsmp/backup.sh重启Litespeed : /etc/init.d/lsws restart重启MySQL : /etc/init.d/mysql(d) restart重启Nginx : /etc/init.d/nginx restartLLsMP常用目录：Litespeed管理后台 : http://{ip}:7080phpMyAdmin : http://{ip}/phpmyadmin/php.ini目录 : /usr/local/lsws/lsphp5/lib/php.iniMySQL配置文件my.cnf : /etc/my.cnf (Centos) | /etc/mysql/my.cnf…

MS-SQL Server的锁模式
type: item
date: 2013-05-26T09:04:00+08:00
description: 锁的概述一. 为什么要引入锁多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:丢失更新：A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统脏读：A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致不可重复读：A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致二 锁的分类锁的类别有两种分法：从数据库系统的角度来看：分为独占锁（即排它锁），共享锁和更新锁MS-SQL Server 使用以下资源锁模式。锁模式 描述共享 (S) 用于不更改或不更新数据的操作（只读操作），如 SELECT 语句。更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。排它 (X) 用于数据修改操作，例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。意向锁 用于建立锁的层次结构。意向锁的类型为：意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为：架构修改 (Sch-M) 和架构稳定性 (Sch-S)。大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。共享锁共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时，任何其它事务都不能修改数据。一旦已经读取数据，便立即释放资源上的共享 (S) 锁，除非将事务隔离级别设置为可重复读或更高级别，或者在事务生存周期内用锁定提示保留共享 (S) 锁。更新锁更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成，此事务读取记录，获取资源（页或行）的共享 (S) 锁，然后修改行，此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁，然后试图同时更新数据，则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间，因为一个事务的排它锁与其它事务的共享模式锁不兼容；发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁，并且每个事务都等待另一个事务释放共享模式锁，因此发生死锁。若要避免这种潜在的死锁问题，请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源，则更新 (U) 锁转换为排它 (X) 锁。否则，锁转换为共享锁。排它锁排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。意向锁意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如，放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能，因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。意向共享 (IS) 通过在各资源上放置 S 锁，表明事务的意向是读取层次结构中的部分（而不是全部）底层资源。意向排它 (IX) 通过在各资源上放置 X 锁，表明事务的意向是修改层次结构中的部分（而不是全部）底层资源。IX 是 IS 的超集。与意向排它共享 (SIX) 通过在各资源上放置 IX 锁，表明事务的意向是读取层次结构中的全部底层资源并修改部分（而不是全部）底层资源。允许顶层资源上的并发 IS 锁。例如，表的 SIX 锁在表上放置一个 SIX 锁（允许并发 IS 锁），在当前所修改页上放置 IX 锁（在已修改行上放置 X 锁）。虽然每个资源在一段时间内只能有一个 SIX 锁，以防止其它事务对资源进行更新，但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源。独占锁：只允许进行锁定操作的程序使用，其他任何对他的操作均不会被接受。执行数据更新命令时，SQL Server会自动使用独占锁。当对象上有其他锁存在时，无法对其加独占锁。共享锁：共享锁锁定的资源可以被其他用户读取，但其他用户无法修改它，在执行Select时，SQL Server会对对象加共享锁。更新锁：当SQL Server准备更新数据时，它首先对数据对象作更新锁锁定，这样数据将不能被修改，但可以读取。等到SQL S…

《渝李文集静日书 -- 秦淮河的风月桃花》
type: item
date: 2013-05-25T09:12:00+08:00
description: 发布于：2006-8-31 14:49:26只是没有人知道，这尾红鱼，在她那终于被误解的一生中，若粲然星火，经历过一个女子天真的贪婪与野心，稚嫩的爱恋与激情，简单的生活与向往，无可补救的遗憾与错失。1那一年的淮南，杨柳新绿，桃花殷红。斜风载着飞絮，飞过墙垣，飞过檐椽，飞过碧色琉璃瓦，飞过黄铜朱雀门。那一年的淮水，无风无月的夜里骤起白浪，浪涛声惊醒了沉鱼，她扶着沁凉的门框，看着白浪吞没夜里晚归的渔船，吞没船头向她挥手的爹爹。那一年，苍山上又多一座新坟，清明的细雨无声轻拂坟头那点绿意。七岁的沉鱼麻衣缟素，对着静立的墓冢竟然忘了哭泣。为此她得到婶婶的一巴掌，五只鲜红的指印像是印进了皮肤里，如五朵殷红桃花，在娇嫩雪白的脸颊上盛开。夜里她对着黑墨一般的淮水，痛哭失声。眼泪路过盛开的桃花，恰如春雨催开最早的蓓蕾。淮水东行，岸柳静默。七岁的沉鱼在命里，顿失所倚。2沉鱼十三岁，有媒子上门为同城大户杨家招舞姬。婶婶拿眼瞟着桌上的碎银，暗地里掐住沉鱼的胳膊说，能到富贵人家做舞姬，那也是三生修来的福分。沉鱼看着婶婶，再转头看看沉默不语的叔叔，就这样垂下头噤了声。那夜她在房里展开一袭大红缎子，安静地开始绣舞衣。微弱的灯火照着她的脸，牙白肌肤就像刚升上去的一轮新月。叔叔拿了鱼脂进来为她添亮，他们是打渔人家，总是喜欢用这种鱼脂做成的燃料添作灯油。叔叔拨着油捻子问她，鱼儿，要是你不情愿，叔明日就把银子退回去。她从鱼脂油的橙黄灯光中抬起头，看着日渐苍老的叔叔。他的面容真的很像记忆中的爹爹，同样有着铺满深深纹路的额头和渐渐溷浊的眼神。他常年在河风里穿梭，鬓角都已经开始斑白。灯光照在他脸上，那是一张愁苦而慈爱的脸。她记起晚饭时婶婶说，等你去了杨家，我和你叔就去岸上买块地，再也不用风里来雨里去的出船打渔了。她想他们终于可以离开淮水，不用再忍受这风里夹着鱼腥味的春天。她是十三岁的沉鱼，再不是脸上盛开五朵桃花的小姑娘。这杨柳又绿，这桃花又红，这秦淮河边的飞絮又漫天飘扬。她就要像飞絮一般，飞过墙垣，飞过檐椽，飞入那有着碧色琉璃瓦和黄铜朱雀门的人家里去。那里远离淮水远离渔舟，远离腥风扑鼻的春天，也远离了白浪滔天的每一个夜晚。于是她摇摇头说，叔，我去。3杨家不是王侯宅第，却也深门高户。老爷做过京官，颇得宠信，老来还乡，往来者皆达人雅士。杨老爷本也是风雅之人，喜歌舞爱书画，便是充场面，养上十数歌舞伎，也是平常。只是这庭、院、廊、阁太过幽深，十三岁的沉鱼一着舞衣，便入了这四壁之中，阻断了那淮河上吹来的阵阵腥风。她和许多贫苦人家出来的姑娘一起，在杨家偏院的舞姬房里呆过两载春秋。她们一同涂上厚厚脂粉，穿上层层叠叠的舞衣，重复练习那些妖娆的动作，摆动着与年龄无关的舞姿。师傅是一个年老过气的舞娘，在扬州城里曾红极一时，她时常在教导她们舞姿的时候，莫名其妙地流下眼泪来。她对所有的姑娘都很严苛，常常无端地打骂她们，骂完以后，那张衰败的老脸上又显出茫然无措和浓郁的哀伤。有好几次，沉鱼在挨过她的皮鞭以后，都听到了她的喃喃自语：当初，当初我可不这样……沉鱼想，当初，师傅的红罗裙下必定生莲，而那朱漆大门外，也一定是车马喧嚣，人声鼎沸。因此，后来师傅打她的时候，她就很少掉眼泪了，即使那些留在背上的鞭痕在练舞时会被汗水浸出血来，她也一声不吭。十五岁的沉鱼是聪明的，众多的舞姬中，只有她明白了，美人迟暮的悲哀。然而年轻的沉鱼也是隐忍的，每个月圆的夜里，她躺在铺着破棉絮的床榻上，看着窗外的白色月光了无睡意。床榻的内侧，她悄悄地用炭块在斑驳的灰墙上划横线，一条一条，密密匝匝，累成了她心底那一点点期待。她们是最新近的一批舞姬，是老爷六十大寿时排上的压轴戏，七百多天的苦练，要的，不过就是那一刻宾客眼中的惊叹与迷醉。那个秋天，沉鱼就在汗水和鞭打中成为了领舞者，穿有别于其他舞娘的红纱，接受师傅的单独指导。师傅变得慈爱起来，牵着她的手殷殷嘱咐，一个舞娘能给的，是身姿，是笑魇，是眼神，却切切不可给，一颗心。她似懂非懂，直到一天夜里，听到偏院的门扉响。就在那个大风呼啸的深秋夜晚，院外的水井里响起闷重的一声，犹如一个美人色衰后的太息，萦萦绕绕，经久不散。那以后，她再也没有梦见过师傅。就是那声叹息，她终于参透一个舞姬应有的眼神。第二个冬天来临的时候，她在破败的院落里，对着一树霜花立誓，白荷香残不若红帐春暖，一场盛宴，她贪的，只是堂上坐客的那一眼。却不知那一眼，越过了她所有想象。4寿筵很快来临。那日杨宅四处张灯结彩，红彤彤的拜寿帖堆成小山。舞姬房里一反平日的冷清，姑娘们装容妖艳，在嘈杂的人声中，一次次的描眉画线，磨亮金光闪闪的十指。暮色降临的时候，她的胃里在痉挛。大堂外面，她衣衫单薄，骨节冰冷。管事传领班婆婆准备的时候，她僵直地迈过厅前台阶，几乎摔倒。一双手扶住了她。有人低声说，小心。然后擦肩而去。她只来得及看他一眼，那一眼，却…

Linux VPS安装mysql无法远程连接的解决
type: item
date: 2013-05-25T09:02:00+08:00
description: 在Linux上安装的MySQL，执行了root@mypc:~#sudo apt-get install mysql安装完mysql-server，启动mysqlroot@mypc:~#/etc/init.d/mysql start本地可以连接进入数据库。root@mypc:~#mysql -uroot -p设置了远程访问权限：mysql> grant all PRIVILEGES on *.* to admin@’%’ identified by ‘123456′;Query OK, 0 rows affected (0.04 sec) mysql> use information_schema mysql> select * from user_privileges; 查询到有下面的结果：'admin’@'%'，说明mysql已经授权远程连接。在windows下访问Ubuntu的数据库，连接不上，但是Ubuntu上安装的apache可以访问。用iptalbes添加端口3306后也无法访问。root@mypc:~# iptables -A INPUT -p tcp –dport 3306 -j ACCEPT Ubuntu上查看Mysql网络连接： root@mypc:~# netstat -an |grep 3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 本地端口也在监听root@mypc:~# ufw status Firewall not loaded 本地防火墙未打开后来在网上找到一个解决办法：查看/etc/mysql/my.cnf找到bind-address才发现配置的是 127.0.0.1(bind-address=127.0.0.1)，直接改为bind-address=113.123.56.4(linux机器ip)，然 后再查看3306端口打开了，ok，可以正常连接了

泛型FAQ：最佳实践
type: item
date: 2013-05-24T08:59:00+08:00
description: 内容什么时候我不应该使用泛型？对泛型我应该使用什么命名规范？我应该在泛型接口上面添加约束吗？如何处置（Dispose）泛型接口？可以对一般类型参数进行类型转换吗？对泛型类如何同步多线程访问？如何序列化泛型类？作者：Juval Lowy（后面介绍中说微软将此人视为Software Legend as one of the world's top .NET experts and industry leaders，名头很响亮啊。无奈本人孤陋寡闻，没听过）注：括号里的英文是我认为不好翻译的原文，如果您有更好的译法，请告诉我，谢谢。同时，对包含generic的组合词语（如generic type parameter，generic method）参照MSDN中文网站C#泛型简介一文统一译作“一般”，虽然我认为并不好听。什么时候我不应该使用泛型？不使用泛型的主要原因就是跨目标（cross-targeting）——如果你要在.NET 1.1和.NET 2.0下编译相同的代码，那么由于只有.NET 2.0支持泛型，你就不能够使用泛型。对泛型我应该使用什么命名规范？我建议使用一个单独的大写字母来表示一般类型参数。如果你对类型参数没有其他的跟上下文有关的信息（additional contextual information），你应该使用字母T：[C#] public class MyClass<T> {...} [Visual Basic] Public Class SomeClass(Of T) ... End Class [C++] generic <typename T> public ref class MyClass {...}; 在所有其他场合下，微软正式的对泛型的的命名规范指导是：一般类型参数要有描述性的名字，除非一个单独的字母已经表示得很清楚，再增加描述性的名字也没有多大用处。[C#] public interface ISessionChannel<TSession> {...} public delegate TOutput Converter<TInput,TOutput>(TInput from); [Visual Basic] Public Interface ISessionChannel(Of TSession) ... End Interface Public Delegate Function Converter(Of TInput, TOutput)(ByVal input As TInput) As Toutput [C++] generic <typename TSession> public interface class ISessionChannel {...}; generic <typename TInput, typename TOutput> public delegate TOutput Converter(TInput from); 可以考虑在一般类型参数的名字中表示出添加给该一般类型参数的约束。例如，一个被约束到ISession接口的参数可以起名为TSession。我应该在泛型接口上面添加约束吗？接口可以为其使用的范型类型添加约束，例如：[C#] public interface ILinkedList<T> where T : IComparable<T> {...} [Visual Basic] Public Interface ILinkedList(Of T As IComparable(Of T)) ... End Interface [C++] generic <typename T> where T : IComparable<T> public interface class ILinkedList {...}; 但是，你应该小心，在接口层面上定义约束还隐含有另外一层意思。为了强调接口与实现分离的思想，接口不应该包括任何一点实现的细节。虽然有很多方法可以用来实现范型接口，但是使用特定的类型参数毕竟是一种实现的细节。约束通常情况下会更加耦合（couple）接口和特定的实现。更好的方法是，为实现范型接口的类添加约束，保持接口本身没有约束：[C#] public class LinkedList<T> : ILinkedList<T> where T : IComparable<T> { //Rest of the implementation } [Visual Basic] Public Class LinkedList(Of T As IComparable(Of T)) Implements ILinkedList(Of T) ' Rest of the imple…

视频: 一群屌爆了的人，一次难忘的旅行，大学毕业前最后一次旅行
type: item
date: 2013-05-23T07:23:00+08:00
description: 离天堂最近的地方，我们这次去了彩云之南的昆明，丽江，香格里拉，大理，这是张杰和谢娜结婚的地方，离天堂最近的地方，伟哥为我们做了这个视频，感谢他的通宵达旦，这里都是i我们的回忆，值得我们一辈子珍藏……