[转载]25个非常棒的 Photoshop 网页设计教程 – 梦想天空(山边小溪) – 博客园.
曾经和大分享过几篇优秀的 Photoshop 网页设计教程,喜欢的人非常多。今天,本文继续向大家分享最新25个实用的 Photoshop 网页设计教程。其实,网页设计并没有你想的那么难,相信看完这些教程,你也可以设计出漂亮的网页。
[转载]25个非常棒的 Photoshop 网页设计教程 – 梦想天空(山边小溪) – 博客园.
曾经和大分享过几篇优秀的 Photoshop 网页设计教程,喜欢的人非常多。今天,本文继续向大家分享最新25个实用的 Photoshop 网页设计教程。其实,网页设计并没有你想的那么难,相信看完这些教程,你也可以设计出漂亮的网页。
[转载]分享一些如何从:领域、对象、角色、职责、对象交互、场景等这些方面去分析和设计具有动态行为的领域模型的经验(附源码) – netfocus – 博客园.
好久没有写文章了,最近比较忙,另一方面也是感觉自己在这方面没什么实质性的突破。但是今天终于感觉自己小有所成,有些可以值得和大家分享的东西,并且完成了两个可以表达自己想法的Demo。因此,趁现在有点时间,是写文章和大家分享的时候了。
首先给出这两个Demo的源代码的压缩包的下载地址,因为之前有博友说他没有装VS2010而没办法运行Demo,所以这次我分别用VS2008和VS2010实现了两个版本。
http://files.cnblogs.com/netfocus/DCIBasedDDD.rar
下面先分享一下我最近研究的一些知识及我对这些知识的自我感悟,然后再结合Demo中的示例讲解如何将这些感悟应用到实际。
一.理论知识:
我最近一直在学习下面这些东西:
通过学习以上这些知识,让我对面向对象的分析、设计、实现有了一些新的认识。
1. 碰到一个业务系统,我们该如何分析业务,分析需求,并最后得到一个只包含业务概念的模型?答案是通过四色原型进行业务建模。四色原型的中心思想是:一个什 么什么样的人或组织或物品或地点以某种角色在某个时刻或某段时间内参与某个活动。 其中“什么什么样的”就是DESC,“人或组织或物品或地点”就是PPT,“角色”就是Role,而”某个时刻或某段时间内的某个活动”就是MI。更具体 的说明请参看我之前整理的一篇文章:http://www.cnblogs.com/netfocus/archive/2011/03/05/1971899.html
2. 业务模型建好了,该如何通过面向对象的分析与设计方法来进行对象建模呢? DDD和DCI思想可以帮助我们。首先,DDD能够指导我们建立一个静态的领域模型,该领域模型能够清楚的告诉我们建立出来的对象“是什么”,但是DDD 却不能很自然的解决“做什么”的问题。大家都知道DDD在对象设计的部分实际上是一种充血模型的方式,它强调对象不仅有属性还会有行为,如果行为是跨多个 领域对象的,则在DDD中用领域服务解决。但是DDD却没有完整的考虑对象与对象之间的交互如何完成,虽然它通过领域服务的方式协调多个对象之间进行交互 或者在应用层协调多个对象进行交互。但是在DDD中,对象往往会拥有很多不该拥有的属性或行为。在我学习了DCI架构之后,我认识到了DDD的很多不足。
以下是DCI的核心思想:
3. 领域驱动设计中的对象设计部分的一些要点:
二.结合Demo讲解如何将理论应用到实际:
前面的介绍看起来比较枯燥,但对我来说是非常宝贵的经验积累。下面我通过一个例子分析如何运用这些知识:
以图书管理系统中的借书和还书的场景进行说明:
1. 借书场景:某个人拿着某张借书卡去图书馆借书;
2. 还书场景:某个人拿着某张借书卡去图书馆还书;
根据四色原型的分析方法,我们可以得出:某个“人”以图书借阅者的角色向图书馆借书。从这里我们可以得出三个角色:1)借阅者(Borrower);2)被借的图书(BorrowedBook);3)图书馆。那么这三个角色的扮演者对象是谁呢?其实这是问题的关键!
1) 是谁扮演了借阅者这个角色?很多人认为是走进图书馆的那个人,其实不是。 人所持的图书卡对应的那个人才是真正的借阅者角色的扮演者;试想张三用李四的图 书卡借书,借书的是谁?应该是李四,此时相当于李四被张三操控了而已;当然这里假设图书馆不会对持卡人和卡的真正拥有者进行身份核对。所以,借阅者角色的 扮演者应该是借书卡对应的帐号(借书卡帐号本质上是某个人在图书馆里系统中的镜像)。那么图书卡帐号和借阅者角色有什么区别?图书卡帐号是一个普通的领域 对象,只包含一些核心的基本的属性,如AccountNumber,Owner等;但是Borrower角色则具有借书还书的行为;
2)是谁扮演了被借的书这个角色?这个问题比较好理解,肯定是图书了。那图书和被借的图书有什么区别吗?大家都知道图书是指还没被借走的还是放在书架上的书本,而被借的书则包含了更多的含义,比如被谁借的,什么时候借的,等等;
3) 为什么图书馆也是一个角色?图书馆只是一个地点,它不管有没有参与到借书场景中,都叫图书馆,并且它的属性也不会因为参与到场景中而改变。没错!但是他确 实是一个角色,只不过它比较特殊,因为在参与到借书场景时它是“本色演出”,即它本身就是一个角色;举两个其他的例子你可能就好理解一点了:比如教室,上 课时是课堂,考试时是考场;比如土地,建造房子时是工地,种植粮食时是田地,是有可能增加依赖场景的行为和属性的。
有了场景和角色的之后,我们就可以写出角色在场景中交互的代码了。我们此时完全不用去考虑对象如何设计,更不用考虑如何存储之类的技术性东西。因为我们现在已经清晰的分析清楚1)场景参与者;2)参与者“做什么”;代码如下,应该比较好懂:
/// <summary>
/// 借阅者角色定义
/// </summary>
public interface IBorrower : IRole<UniqueId>
{
IEnumerable<IBorrowedBook> BorrowedBooks { get; } //借了哪些书
void BorrowBook(Book book);//借书行为
Book ReturnBook(UniqueId bookId);//还书行为
}
/// <summary>
/// 图书馆角色定义
/// </summary>
public interface ILibrary : IRole<UniqueId>
{
IEnumerable<Book> Books { get; }//总共有哪些书
Book TakeBook(UniqueId bookId);//书的出库
void PutBook(Book book);//书的入库
}
/// <summary>
/// 被借的书角色定义
/// </summary>
public interface IBorrowedBook : IRole<UniqueId>
{
Book Book { get; } //书
DateTime BorrowedTime { get; }//被借时间
}
/// <summary>
/// 借书场景
/// </summary>
public class BorrowBooksContext
{
private ILibrary library;//场景参与者角色1:图书馆角色
private IBorrower borrower;//借书参与者角色2:借阅者角色
public BorrowBooksContext(ILibrary library, IBorrower borrower)
{
this.library = library;
this.borrower = borrower;
}
/// <summary>
/// 启动借书场景,各个场景参与者开始进行交互
/// </summary>
public void Interaction(IEnumerable<UniqueId> bookIds)
{
foreach (var bookId in bookIds)
{
borrower.BorrowBook(library.TakeBook(bookId));//
}
}
}
/// <summary>
/// 还书场景
/// </summary>
public class ReturnBooksContext
{
private ILibrary library;
private IBorrower borrower;
public ReturnBooksContext(ILibrary library, IBorrower borrower)
{
this.library = library;
this.borrower = borrower;
}
public void Interaction(IEnumerable<UniqueId> bookIds)
{
foreach (var bookId in bookIds)
{
library.PutBook(borrower.ReturnBook(bookId));
}
}
}
接下来考虑角色扮演者如何设计与实现:
角色扮演者就是DDD中的领域对象,在这个例子中主要有:借书卡帐号(LibraryAccount)、书本(Book)、图书馆(Library);下面是这几个实体类的实现:
public class LibraryAccount : Object<UniqueId>
{
#region Constructors
public LibraryAccount(LibraryAccountState state) : this(new UniqueId(), state)
{
}
public LibraryAccount(UniqueId id, LibraryAccountState state) : base(id, state)
{
}
#endregion
public string Number { get; private set; }
public string OwnerName { get; private set; }
}
public class Book : Object<UniqueId>
{
#region Constructors
public Book(BookState state) : this(new UniqueId(), state)
{
}
public Book(UniqueId id, BookState state) : base(id, state)
{
}
#endregion
public string BookName { get; private set; }
public string Author { get; private set; }
public string Publisher { get; private set; }
public string ISBN { get; private set; }
public string Description { get; private set; }
}
public class Library : Object<UniqueId>, ILibrary
{
private List<Book> books = new List<Book>();
public Library(LibraryState state) : this(new UniqueId(), state)
{
}
public Library(UniqueId id, LibraryState state) : base(id, state)
{
if (state != null && state.Books != null)
{
this.books = new List<Book>(state.Books);
}
}
[Mannual]
public IEnumerable<Book> Books
{
get
{
return books.AsReadOnly();
}
}
public Book TakeBook(UniqueId bookId)
{
var book = books.Find(b => b.Id == bookId);
books.Remove(book);
return book;
}
public void PutBook(Book book)
{
books.Add(book);
}
}
以上几个实体类还有很多细节的东西需要说明,但暂时不是重点。大家可以慢慢体会为什么我要这样设计这些类,比如属性为什么是只读的?
好了,理论上有了角色扮演者、角色,以及场景后,我们就可以写出借书和还书的完整过程了。代码如下:
private static void BorrowReturnBookExample()
{
//创建图书馆
var library = new Library(null);
Repository.Add<Library>(library);
//创建5本书
var book1 = new Book(new BookState {
BookName = "C#高级编程",
Author = "Jhon Smith",
ISBN = "56-YAQ-23452",
Publisher = "清华大学出版社",
Description = "A very good book." });
var book2 = new Book(new BookState {
BookName = "JQuery In Action",
Author = "Jhon Smith", ISBN = "09-BEH-23452",
Publisher = "人民邮电出版社",
Description = "A very good book." });
var book3 = new Book(new BookState {
BookName = ".NET Framework Programming",
Author = "Jhon Smith",
ISBN = "12-VTQ-96786",
Publisher = "机械工业出版社",
Description = "A very good book." });
var book4 = new Book(new BookState {
BookName = "ASP.NET Professional Programming",
Author = "Jim Green",
ISBN = "43-WFW-87560",
Publisher = "浙江大学出版社",
Description = "A very good book." });
var book5 = new Book(new BookState {
BookName = "UML and Design Pattern",
Author = "Craig Larmen",
ISBN = "87-OPM-44651",
Publisher = "微软出版社",
Description = "A very good book." });
Repository.Add<Book>(book1);
Repository.Add<Book>(book2);
Repository.Add<Book>(book3);
Repository.Add<Book>(book4);
Repository.Add<Book>(book5);
//将这5本书添加进图书馆
library.PutBook(book1);
library.PutBook(book2);
library.PutBook(book3);
library.PutBook(book4);
library.PutBook(book5);
//创建一个图书卡卡号,用户凭卡号借书,实际过程则是用户持卡借书
var libraryAccount = new LibraryAccount(new LibraryAccountState { Number = GenerateAccountNumber(10), OwnerName = "汤雪华" });
Repository.Add<LibraryAccount>(libraryAccount);
//创建借书场景并进行场景交互
new BorrowBooksContext(
library.ActAs<ILibrary>(),
libraryAccount.ActAs<IBorrower>()
).Interaction(new List<UniqueId> { book1.Id, book2.Id });
//创建还书场景并进行场景交互
new ReturnBooksContext(
library.ActAs<ILibrary>(),
libraryAccount.ActAs<IBorrower>()
).Interaction(new List<UniqueId> { book1.Id });
}
从上面的高亮代码中,我们可以清晰的看到领域对象扮演其角色参与到活动。对象在参与活动时因为扮演了某个角色,因此自然也就有了该角色所对应的行为了。但是有人已经想到了,之前我们仅仅只是定义了角色的接口,并且对象本身也不具备角色所对应的属性或行为,那么对象扮演角色时,角色的属性或行为的具体实现在哪里呢?这个问题大家自己去看Demo的源代码吧,今天太晚了,眼睛实在快要闭上了。上面我已经把整个场景的参与者角色、角色扮演者、领域对象通过什么方法扮演(ActAs)角色、如何触发场景、领域对象和角色的区别等关键问题说明清楚了。而关于如何把角色的行为注入到领域对象之中,我自己思考了很久,思考如何利用C#实现一个既优雅又能确保强类型语言的优势但同时又能动态将角色的属性和行为注入到某个对象的设计方式,一切尽在源码之中!
在系统开发中,通常都会采用经典的三层或者四层架构。其中数据模型层通过ORM工具来生成模型代码,实现了数据库操作的CRUD方法,上层的业务层 进行简单的封装,供界面层调用。但由于模型层是与数据库中的单个表对应,而很多数据模型之间是有关联和上下级关系的,如果仅仅对业务层做简单封装,作为传 值和分层之用,则很可能在开发和维护中出现以下问题:
1. 上层界面在增加和修改数据时,需要维护数据之间的关联和上下级关系;
2.上层界面调用删除等操作时,需要处理级联删除相关数据;
3.上层界面在操作某个数据的下级菜单时,通常要重新获取,增加了数据库访问次数;
4.上层界面在根据用户选择的数据来控制操作菜单时,需要重新加载权限信息,进行复杂的权限判断;
5.通常的数据修改操作都需要记录日志,则界面层有大量的日志记录代码;
6.在进行排序和移出(移进)操作时,需要大量代码来实现。
以上问题是我在C/S结构的应用程序开发中亲身经历过的,不知是否具有普遍性。于是,希望业务层能封装上述问题相关的“附加”信息,希望达到以下效果:
1.能够在移出(移进)时能自动判断两个数据之间是否支持该操作;
2.在常用的排序中业务对象能自我排序;
3.在用户选中某个数据时,能识别出用户权限,从而控制界面菜单;
4.将日志的操作封装成统一接口,并在数据修改发生时业务层自动记录,上层操作不知道日志记录;
5.将系统中的各类数据抽象成统一的资源接口。
按照以上的需求,对业务层进行了点儿封装,基本上达到了上述的几个需求,同时其它开发者在调用过程中感觉到很顺手和舒服,代码量也减少很多,便于系统的升级和维护,上层调用代码示例如下:
//将当前选中数据按名称排序
IDataResource resource = resPad.GetSelectedResource();
if (resource == null)
return;
resource.SortByName();
resPad.RefreshNode(resource);
//权限判断
IDataResource resource = resPad.GetSelectedResource();
if (resource != null && !resource.ReadOnly)
{
resource.Update();
}
//数据移出
smDatasetDirectory dir = treeRes as smDatasetDirectory;
foreach (ListViewItem item in this.listViewUngroup.SelectedItems)
{
IDataResource res = item.Tag as IDataResource;
dir.MoveOut(res);
}
//删除被选中数据资源及其下级
IDataResource resource = resPad.GetSelectedResource();
resource.Delete();
//添加数据
smLayer layerLogic = new smLayer("layer1");
mapLogic.AddResource(layerLogic);
示意类图如下:
主要类图:
设计要点:
1.所有业务对象都是数据资源(甚至包括用户和角色等),统一实现顶级接口;
2.顶级的虚基类实现大部分通用功能(比如日志记录和排序等),各业务对象只关心自身的特别业务;
3.业务对象除了包含模型数据,应该是自我描述的,标识自身数据资源的类型,具有权限信息;
4.业务对象自身知道能够与哪些对象发生关系,比如是否能移到某个资源下;
5.业务对象能够知道自己的上级资源是哪个,下级资源是哪些;
6.当业务对象被执行某种数据库操作时,应该能自动记录下相关操作日志,不必由上层调用来关心日志。
以上是我的一点儿设计实践,欢迎大家拍砖!
[转载]ubuntu下调试android手机,并进入手机shell终端 – 黑暗伯爵 – 博客园.
既然玩Android开发,就必须也得深入到系统,模拟器慢得要死,就上真机了。
windows下一切都是那么小白,换到linux下就得自己动手。
查了相关资料 ,终于知道怎么弄了。
我的机型是 moto mb525 (Defy)
首先准备好一切环境
adb,官网有,开发肯定离不开这个Android sdk
手机设置为调试模式
能看到这篇文章,你的手机肯定是已经root过了。
1、首先查看手机的usb信息
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
lsusb命令是列出当前所有得usb设备,我的defy就是
Bus 001 Device 005: ID 22b8:41db Motorola PCS Motorola Droid (USB Debug)
设备id是 22b8 ,设备信息描述是
Motorola PCS Motorola Droid (USB Debug)hang@CAPF:/etc/udev$ cd /etc/udev/rules.d
2、添加udev规则
udev就是一个动态硬件管理服务
hang@CAPF:/etc/udev/rules.d$ cd /etc/udev/rules.d/
编辑规则文件并保存
SUBSYSTEM==“usb“, SYSFS(“Motorola PCS Motorola Droid (USB Debug)“)==“22b8“,MODE=“0666“
其中,sysfs括号内是自己android手机的实际描述信息,==后面的是id号,mode是读取模式,0666是所有人可以访问,以上的信息都是lsusb查处来的。
3、设置规则文件权限并重启udev
hang@CAPF:/etc/udev/rules.d$ sudo /etc/init.d/udev restart
会看到udev相关的提示信息
4、设置adb
进入sdk得platform-tools目录
0163C5420200F029 device
大功告成,可以在eclipse下使用真机调试了。
进入android shell的方法:
hang@CAPF:/opt/android–sdk–linux_x86/platform–tools$ ./adb shell
进去以后,就可以随便折腾了,,最好别乱删乱改
最后附上adb的相关参数,英文–help一样:
adb(Android Debug Bridge)是Android 提供的一个通用的调试工具,借助这个工具,我们可以很好的调试开发的程序,adb.exe在你安装的android的sdk开发包tools目录下
| 命令 | 描述 |
| install <path> | 安装应用程序到服务器 |
| pull <remote file> <local file> | 将远程文件拉出服务器 |
| push <local file> <remote file> | 将本地文件推进服务器 |
| shell | 在服务器上打开一个壳环境 |
| forward <local port> <remote port> | 从一个端口转递流量到另外一个端口(到或者从服务器上) |
| start-server | 启动服务器 |
| kill-server | 停止服务器 |
| ppp <tty> <params> | 通过USB使用一个ppp连接 |
| devices | 列出可用的模拟器 |
| help | 列出adb的命令 |
| version | 显示adb的版本 |
adb使用方法:
adb [-d|-e|-s <serialNumber>] <command>
当你发出一个命令,系统启用Android客户端。客户端并不与模拟器实例相关,所以如果双服务器/设备是运行中的,你需要用-d选项 去为应被控制的命令确定目标实例。关于使用这个选项的更多信息,可以查看模拟器/设备实例术语控制命令。
1、安装应用 到模拟器:
你可以使用adb从你的开发电脑上复制一个应用程序,并且将其安装在一个模拟器/设备实例。像这样做,使用install命令。这个 install命令要求你必须指定你所要安装的.apk文件的路径:
adb install <path_to_apk>
为 了获取更多的关于怎样创建一个可以安装在模拟器/设备实例上的.apk文件的信息,可参照Android Asset Packaging Tool (aapt).
要注意的是,如果你正在使用Eclipse IDE并且已经安装过ADT插件,那么就不需要直接使用adb(或者aapt)去安装模拟器/设备上的应用程序。否则,ADT插件代你全权处理应用程序的 打包和安装.
如果要删除某个应用,按下面操作,例如应用为test:
adb shell
cd /data/app
rm test.apk
2、进入设备或模拟器的shell:
adb shell
通过上面的命令,就可以进入设备或模拟器的shell环 境中,在这个Linux Shell中,你可以执行各种Linux 的命令,另外如果只想执行一条shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg会打印出内核的调试信息。
3、发布端口:
可以设置任意的端口 号,做为主机 向模拟器或设备的请求端口。如:
adb forward tcp:5555 tcp:8000
4、从模拟器/设备中拷入或 拷出文件:
可 以使用adbpull ,push命令将文件复制到一个模拟器/设备实例的数据文件或是从数据文件中复制。install命令只将一个.apk文件复制到一个特定的位置,与其不 同的是,pull和push命令可令你复制任意的目录和文件到一个模拟器/设备实例的任何位置。
从模拟器或者设备中复制文件或目录,使用(如下 命):
adb pull <remote> <local>
将文件或目录复制到模拟器或者设备,使用(如下命 令)
adb push <local> <remote>
在这些命令中,<local> 和<remote>分别指通向自己的发展机(本地)和模拟器/设备实例(远程)上的目标文件/目录的路径
下面是一个例子:
adb push test.txt /data/dat/test/test.txt、
5、查询模拟器/设备实例:
在发布adb命令之前,有必要知道什么样的模拟器/设备实例与adb服务器是相连的。可以通过使用 devices
命令来得到一系列相关联的模拟器/设备:
adb devices
作为回应,adb为每个实例都制定了相应的状态信息:
序列号——由adb创建的一个字符串,这个字符串通过自己的控制端 口<type>-<consolePort>唯一地识别一个模拟器/设备实例。
下面是一个序列号的例子:
emulator-5554
实 例的连接状态有三种状态:
offline — 此实例没有与adb相连接或者无法响应.
device — 此实例正与adb服务器连接。注意这个状态并不能百分之百地表示在运行和操作Android系统,因此这个实例是当系统正在运行的时候与adb连接的。然 而,在系统启动之后,就是一个模拟器/设备状态的正常运行状态了.
每个实例的输出都有如下固定的格式:
[serialNumber] [state]
下面是一个展示devices命令和输出的例子 :
$ adb devices
List of devices attached
emulator-5554 device
emulator-5556 device
emulator-5558 device
如 果当前没有模拟器/设备运行,adb则返回 no device .
6、查看bug报告:
adb bugreport
7、记录无线通讯日志:
一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:
adb shell
logcat -b radio
8、获取设备的ID和序列号:
adb get-product
adb get-serialno
9、 访问数据库SQLite3
adb shell
SQLite3
如要打开已存在数据库:
SQLite3 <路径>/dbname.db
[转载]蛙蛙推荐:用javascript作一个通用向导 – 蛙蛙王子 – 博客园.
摘要:向导可以让你的网站用户快速上手使用你的web应用,提高网站的吸引力。向导一般分为好几个步骤,每个步骤收集一些数据,并且支持退回功能,所有步骤完成后可以得到每一步的收集结果。这里给大家展示一种比较通用,灵活且简单的向导框架。
index.html:只提供了一个向导显示位置的占位符
<html> <head> <title>礼物推荐向导</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="style.css"> <script src="jquery.js" type="text/javascript"></script> <script src="wizard.js" type="text/javascript"></script> </head> <body> <div id="wizard"></div> </body> </html>
style.css:默认情况下向导里有一个h2呈现的标题,一个ul呈现的主要内容,一个div呈现的按钮条,我们简单设计了一下他们的默认外观,实际应用中大家可以自由的美化它们。
body{
margin:0;
}
/*向导容器*/
#wizard{
height:400px;
width:600px;
background-color:#999;
}
/*向导的主体内容,用列表展示*/
#wizard ul{
margin:10px;
height:80%;
}
/*横向显示列表内容*/
#wizard li{
display:inline-block;
margin:10px;
cursor:pointer;
}
/*列表的标题*/
#wizard h2{
margin:10px;
}
/*列表的功能条,如返回按钮*/
#wizard .bar{
margin:10px;
clear:both;
}
2、准备每一步骤
向导可以分为每一步骤,每个步骤需要呈现内容,捕捉用户选择,提供标题等功能,我们让每一步都自己负责自己的事情,但要符合我们规定的一些契约。
每一个步骤用一个函数表示,第一个参数data_key是选择本步骤数据的关键字,一般用于上一个步骤的结果决定下一个步骤显示数据的情况,第二个参数result_callback是个回调函数,就是在本步骤获取结果时调用,它用于和向导类进行通信,向导类在得到上一步的结果后存储结果并跳向到下一步。
该函数返回一个二元组,第一个元素是本步骤的标题,第二个元素是本步骤主体部分的UI。
我们的示例是一个礼物推荐系统,共分三步,第一步选择送礼对象,第二步选择关键字,其中第一步的选择结果会影响到第二步显示,第三步选择价格区间,如下就是代码的实现,其中绘制界面和事件捕捉用了JQuery来简化操作。
function step1(data_key, result_callback){
var targets = ['女朋友','男朋友','父亲','妈妈','孩子'];
var warpper = $('<ul></ul>')
$.each(targets, function(k,v){
$('<li>'+v+'</li>').click(function(){result_callback(v)}).appendTo(warpper);
});
return ['第一步:请选择送礼物的对象',warpper];
}
function step2(data_key, result_callback){
var tags = {
'女朋友':['创意','可爱','浪漫','激情','实用','数码',
'自制','毛绒玩具','衣服','包包'],
'男朋友':['男士用品','温馨','实用','数码','创意','衣物'],
'父亲' :['男士用品','健康','植物','衣物'],
'妈妈' :['温馨','健康','创意','护肤品','实用'],
'孩子' :['玩具','学习用品','实用','数码']
};
var warpper = $('<ul></ul>')
$.each(tags[data_key], function(k,v){
$('<li>'+v+'</li>').click(function(){result_callback(v)}).appendTo(warpper);
});
return ['第二步:请选择关键词',warpper];
}
function step3(data_key, result_callback){
var price_level = ['便宜','普通','稍贵','贵重'];
var warpper = $('<ul></ul>')
$.each(price_level, function(k,v){
$('<li>'+v+'</li>').click(function(){result_callback(v)}).appendTo(warpper);
});
return ['第三步:请选择价格区间',warpper];
}
3、向导类的实现
向导类要设置向导所在的DOM元素,要执行的步骤列表,向导完成后执行的回调,向导还应该提供上一步和下一步的方法,所以我们用一个类来表示向导,在构造函数里传入DOM容器,步骤列表和回调函数,用prototype给类增加三个方法。render用来呈现某一步骤的UI,并在本步骤收集结果的回调里推向下一步,如果本步骤是最后一步,则调用向导执行完成的回调函数。
另外两个next和back函数分别是执行上一个步骤和下一个步骤,这两个函数实用index的私有变量来维持整个向导的状态
function Wizard(container, steps, callback){
this.container = container; //向导容器
this.steps = steps; //向导步骤
this.callback = callback; //向导执行完毕执行的回调
this.collect_data = []; //保存向导每一步骤的结果
this.index = -1; //当前执行在那一步骤
}
//绘制某一步骤
Wizard.prototype.render = function(step, this_result){
var me = this;
//执行该步骤并得到该步骤的UI
var to_append = step(this_result,function(result){
me.collect_data.push(result); //收集本步骤结果
//向导执行完毕时调用回调函数,否则执行下一步
if(me.collect_data.length == me.steps.length)
me.callback(me.collect_data);
else
me.next(result);
});
//绘制本步骤的UI
this.container.empty();
this.container.append(“
“);
this.container.append(to_append[1]);
if(this.index > 0){
//后退按钮
this.container.append($(“
“)
.click(function(){me.back()}
));
}
}
//执行下一步
Wizard.prototype.next = function(this_result){
if(this.index >= this.steps.length -1)
return;
var step = this.steps[++this.index];
this.render(step,this_result);
}
//后退到上一步
Wizard.prototype.back = function(){
if(this.index <= 0)
return;
var step = this.steps[--this.index];
//步骤回到上一步,但上一步的数据需要上上一步的结果来决定
this.collect_data = this.collect_data.slice(0, this.index);
this.render(step, this.collect_data[this.index - 1]);
}
[/js]
4、小结
本向导结构简单,可定制性强,结合了JavaScript的函数式编程特性和面向对象的特性,体现了JavaScript的强大和便利。
其中wizard类里界面绘制的部分和步骤函数里界面绘制的部分还是存在一些耦合,继续重构的话,可以把所有绘制界面的部分再抽象到一起,使界面改动更方便。
[转载]SQL点滴20—T-SQL中的排名函数 – nd – 博客园.
提 到排名函数我们首先可能想到的是order by,这个是排序,不是排名,排名需要在前面加个名次序号的,order by是没有这个功能的。还可能会想到identity(1,1),它也给了一个序号,但是不能保证给出的序号是连续升序的。除非能够保证所有的 Insert语句都能够正确成功地完成,并且没有删除操作,实际的使用中大多数的表都不能保证这样。
好在SQL Server中提供了一些排名函数来辅助实现这些功能。排名函数按照需要的顺序对数据进行排名,并提供一个值对数据。下面来了解一下这些排序函数功能。
ROW_NUMBER
ROW_NUMBER函数允许以上升,连续的顺序给每一行数据一个序号,注意ROW_NUMBER()后面一定要跟着over子句。来看语句:
use AdventureWorks select ROW_NUMBER() over(order by LastName) as RowNum, FirstName+' '+ LastName as FullName from HumanResources.vEmployee where JobTitle='Production Technician - WC60'
这个语句对符合条件(JobTitle=’Production Technician – WC60’)的LastName按照升序排列,并加上排序的序号,这个序号是连续上升的。结果如下图1是部分结果。

图1
我们可以看到第一个人的LastName是Abercrombie,第二个人的LastName是Adams,以次类推。
PARTITION
如果我们想再细分一下,在一个小的分组范围内排序该怎么办呢?就是说让LastName以‘A’开头的作为第一组,在这个组内进行排序。以‘B’开 头的作为第二组,在这个组内排序。以‘C’开头的作为第三组,在这个组内进行排序,如此等等。这里有一个很简单的实际例子,假如上面这些人都来参加同一场 马拉松比赛,其中有男子组,女子组,男子残疾组,女子残疾组,60岁以上组等等。不管参赛者以第几位触线,名次都以他们的小组为基准。
可以通过PARTITION BY选项来重新排序,给数据分区或者数据区域唯一的递增序号。来看下面的语句:
[注] partition n. 划分,分开;[数] 分割;隔墙;隔离物;vt. [数] 分割;分隔;区分
select ROW_NUMBER() over(PARTITION by substring(LastName,1,1) order by LastName) as RowNum, FirstName+' '+ LastName as FullName from HumanResources.vEmployee where JobTitle='Production Technician - WC60'
这里模拟上面的情况,首先以Last Name的第一个字母作为分组,然后以第二个字母以后的字母来分组排序。来看看结果,如图2

图2
假设LastName以‘A’开头的是男子组,这个组有共有三个人,Kim Abercrombie是冠军,Jay Adams是亚军,Nancy Anderson是季军。假设LastName以‘B’开头的是女子组,这个组只有一个人Bryan Baker,无论如何她都是冠军。等等如此类推。这样一眼就能看出他们的小组名次了。
这里你可能会觉得使用order by一样可以得到这样类似的结果。如下代码:
select FirstName+' '+ LastName as FullName from HumanResources.vEmployee where JobTitle='Production Technician - WC60' order by substring(LastName,1,1) ,LastName
这个把order by放在最后,排序放在最后,首先按照LastName的首字母排序,再按照剩整个LastName排序,结果如下图3

图3
结果和上面大致相同,可是少了前面的名次序号。于是我又对她进行了修改,代码如下:
select ROW_NUMBER() over(order by substring(LastName,1,1),LastName) as RowNum, FirstName+' '+ LastName as FullName from HumanResources.vEmployee where JobTitle='Production Technician - WC60'

图4
排 序没有错误,是我们想要的分组排序,但是前面的名次没有分组区分,和图1没有什么差别。可见图3和图4的做法完全是多余,纯属臆造,其实只要order by LastName都能得到正确的排序,只有partition by才是正解。通过上面的例子也可以对排序,排名这二者之间的区别有一个认识,他们虽然有相似之处,但是排名始终会产生一个名次序号,排序只要得到正确的 顺序就好。
RANK
还是拿马拉松比赛来说事,如果有同时撞线的情况发生应该怎么计名次呢?例如A第一个撞线,B和C同时第二个撞线,D第三个撞线,如果我们想把D的名次计为第4名应该怎么处理呢?就是说不计顺序名次,只计人数。这时就可以使用RANK函数了。
[注] rank n. 等级;队列;排;军衔vt. 排列;把…分等vi. 列队;列为
在order by子句中定义的列上,如果返回一行数据与另一行具有相同的值,rank函数将给这些行赋予相同的排名数值。在排名的过程中,保持一个内部计数值,当值有所改变时,排名序号将有一个跳跃。
来看下面的语句:
select ROW_NUMBER() over(order by Department) as RowNum, RANK() over(order by Department) as Ranking, FirstName+' '+ LastName as FullName, Department from HumanResources.vEmployeeDepartment order by RowNum
rank()函数右面也要跟上一个over子句。为了看到效果我们以Department作为排序字段,可以看到RowNum作为升序连续排名,Ranking作为计同排名,当Department的值相同时,Ranking中的值保持不变,当Ranking中的值发生变化时,Ranking列中的值将跳跃到正确的排名数值。来看结果:

图5
从 这个结果中我们可以说这次马拉松赛跑的排名是:Tengiz Kharatishvili,Zainal Arifin,Sean Chai,Karen Berge,Chris Norred并列第1,Michael Sullivan,Sharon Salavaria,Roberto Tamburello,Gail Erickson,Jossef Goldberg并列第6,如此等等。
DENSE_RANK
在上面的例子中,A第一个撞线,B和C同时第二个撞线,D第三个撞线,如果我们想把B和C的名次计位第2名,D的名次计为第3名应该怎么处理呢?就是说考虑并列名次。这里使用DENSE_RANK函数,来看下面的代码。
select ROW_NUMBER() over(order by Department) as RowNum, DENSE_RANK() over(order by Department) as Ranking, FirstName+' '+ LastName as FullName, Department from HumanResources.vEmployeeDepartment order by RowNum
结果如下:

图6
按照这个结果,我们可以说这次马拉松赛跑的排名是:Tengiz Kharatishvili,Zainal Arifin,Sean Chai,Karen Berge,Chris Norred并列第1,Michael Sullivan,Sharon Salavaria,Roberto Tamburello,Gail Erickson,Jossef Goldberg,Terri Duffy并列第2,等等如此。
NTILE
在开始这个之前,先来一段小插曲。梭罗是铅笔的发明者,不过他没有申请专利。据说他天赋异禀,在父亲的铅笔厂里面打包铅笔的时候,从一堆铅笔里面抓取一把,每次都能精确地抓到一打12支。他在森林中目测两颗树之间的距离,和护林员用卷尺测量的结果相差无几。现在如果我们想从一张表中抓取多比数据,每一笔都是相同的数目,并且标明第几组该怎么办呢?NTILE函数提供了这个功能,他能。来看代码:
select NTILE(30) over(order by Department) as NTiles, FirstName+' '+ LastName as FullName, Department from HumanResources.vEmployeeDepartment
现在我们要抓取30个组的数据,并保证尽可能的保证每组数目相同。结果如下,

图7
这个视图中共290条数据,290/30=9.7约等于10,所以每组10条数据,如图每一条数据都有一个组号。这个结果要比索罗精确。
[转载]Web三维技术:Flash Builder+away3d平台搭建(含演示视频) – 一点一滴的Beer – 博客园.
Web三维技术:Flash Builder+away3d平台搭建
作者:一点一滴的Beer http://beer.cnblogs.com/
前言:作为NCSLab中实验设备的显示层,需要一个swf作为显示的UI。虽然可以用FlashMX进行简单 的flash设计,但是FlashMX一般是偏向于动画设计,而不是程序设计,所以在进行相关的开发时,支持性不是太好,于是笔者就想到了转用Flex Builder来进行开发。
一、开发语言和开发环境
ActionScript是 Macromedia(现已被Adobe收购)为其Flash产品开发的 ,最初是一种简单的脚本语言,现在最新版本3.0,是一种完全的面向对象的编程语言,功能强大,类库丰富,语法类似JavaScript,多用于 Flash互动性、娱乐性、实用性开发,网页制作和RIA应用程序开发。
ActionScript 是一种基于ECMAScript的脚本语言,可用于编写Adobe Flash动画和应用程序。 由于ActionScript和JavaScript都是基于ECMAScript语法的,理论上它们互相可以很流畅地从一种语言翻译到另一种。不过 JavaScript的文档对象模型(DOM)是以浏览器窗口,文档和表单为主的,ActionScript的文档对象模型(DOM)则以SWF格式动画 为主,可包括动画,音频,文字和事件处理。
由于软件和库文件存在版本多样的问题,所以在进行介绍之前进行说明。本文中所演示例子使用的软件版本如下:
Flash Builder:4.5
Flex SDK:4.5.1
Away3D:3.5.0
Flash Player:10 Debug版本或者更高
1.1 Flash Builder集成开发环境
Adobe® Flash® Builder™ 4.5 软件(曾为 Adobe Flex® Builder™)是基于 Eclipse™ 的开发工具,使用 ActionScript® 和开源 Flex 框架快速构建具有表现力的移动、Web 和桌面应用程序。软件可以在Adobe主页上去下载。

安装了Flash Builder4.5之后,Flex SDK4.5也自动被集成到了开发环境中了。然后就可以利用此IDE进行一般的Flex开发了,但是如果要进行3d开发,则还需要引入3d的引擎库。
Flash Builder 4.5下载页面:https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash_builder&loc=zh_cn
1.2 Away3D引擎库
提供了一个3d引擎库。在Flash Builder中建立项目,然后引入此库,可以迅速进行3d的Flash开发。
Away3D引擎属于一个免费开源的项目,而且持续开发和更新中,所有存在版本众多的问题。目前我们主要使用的是稳定版本的3.5版。在 Away3d的主页中可以下载到如下资源:Away3d库、Away3d Examples例程、Away3d Documents参考文档。
Away3d 3.5下载页面:http://away3d.com/download/away3d_3.5.0
1.3 Flash Player播放器
编程的语言ActionScript目前主要分为2.0和3.0两个版本,Flash播放器相当于ActionScript的编译环境,对于不 同版本的ActionScript需要不同的播放器支持,如果使用了低版本的Flash Player则会出现编译无法通过。对于Away3d_3.5库,需要至少Flash Player10的支持。如果希望能够在Flash Builder中对源代码进行调试,则需要到Adobe主页上下载一个Debug版本的Flash Player10。
在Adobe主页上下载Flash Player的时候,除了有发布版和调试版之分,也有IE和非IE之分。如果你使用的是IE或者基于IE内核的浏览器,则下载基于IE的debug版 Flash Player10,如果是使用Chrome或者Firefox这些非IE内核的浏览器,则下载相应的播放器。
Flash Player 10下载页面:http://www.adobe.com/support/flashplayer/downloads.html
先到网上下载到上述的软件后,就可以遵循下述步骤进行环境搭建:
| 1.卸载本机上的旧版本的Flash Player,安装Flash Player10。
2.安装Flash Builder4.5到指定目录,例如: “D:\Program Files\Adobe\Adobe Flash Builder 4.5” 如果成功安装,则Flex Sdk4.5也会被成功安装上,在目录: “D:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks” 里面包含了不同版本的Flex SDK,今后如果Adobe发布新的SDK,则只需要下载新的SDK然后解压到此目录中即可。 3.解压Away3d的库文件到指定目录。例如: “D:\FlashBuilder_Libs\Away3d_lib” 在后面进行Away3d开发时,需要引用此路径中的库文件。 |
完成上述工作后,就可以进行Away3d的Flex开发了。
二、建立ActionScript项目
关于如何建立一般的Flex项目,在此不再赘述,有兴趣的可以到网上找到很多相关例子。本文重点在让Away3d 3.5提供的Examples成功跑起来。
2.1项目建立与设计
打开Flash Builder,然后新建项目,选择”ActionScript Project”,然后输入项目名称点击Finish。在Package Explorer中右击项目选择”Properties”进行相关设置。设置内容包括:
1.设置Flex SDK版本。

一般情况下,在建立项目的时候就已经对SDK进行了指定,但是如果在项目建立完毕后需要修改SDK,可以在此界面下进行修改:ActionScript Build PathàLibrary path
2.设置Away3d库的引用路径。

在ActionScript Build PathàSource path中,可以添加Away3d的引擎库,也就是我们下载下来解压下来的文件夹,添加解压目录src中的内容。
3.设计编译器版本

ActionScript的编译环境就是Flash Player,Away3d 3.5需要10以下的版本的播放器的支持。在Flash Builder4.5中没有必要对此进行设置,因为默认的就是10.2的版本,但是如果今后3d库升级需要更高版本的播放器支持,则需要在此进行相应的设 置。
2.2Away3d Examples项目移植
将从Away3d主页上下载的3.5版本对应的”examples_3_5_0.zip”解压,然后将根目录下的文件复制到新建的ActionScript项目的根目录下进行覆盖。在Flash Builder中对项目的目录进行刷新。然后就可以了。
如果想要运行某文件,例如:”Basic_LoadModel.as”则只需要右击此文件,然后选择”Set as Default Application”,再右击选择Run asà Web Application,然后就可以在浏览器中看到运行的效果图了。

在项目的bin-debug目录下面,会生成对应的swf文件,这个可以独立运行的。

Away3d Examples的演示效果见如下视频:
http://v.youku.com/v_show/id_XMjgzMzI2MDgw.html
2011-7-8
于武汉大学
——————————————————————
Author:一点一滴的Beer
Email /Gtalk:dreamzsm@gmail.com
From:http://www.cnblogs.com/beer
Notes:欢迎转贴,但请在页面中加个链接注明出处
original:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html
[转载]ASP.NET MVC过滤器中权限过滤器ValidateAntiForgeryToken的用法(Post-Only) – 没追求的猪 – 博客园.
用途:防止CSRF(跨网站请求伪造)。
用法:在View->Form表单中:<%:Html.AntiForgeryToken()%>
在Controller->Action动作上:[ValidateAntiForgeryToken]
原理:
1、<%:Html.AntiForgeryToken()%>这个方法会生成一个隐藏域:<input name=“__RequestVerificationToken” type=“hidden” value=“7FTM…sdLr1” />并且会将一个以“__RequestVerificationToken“为KEY的COOKIE给控制层。
2、[ValidateAntiForgeryToken],根据传过来的令牌进行对比,如果相同,则允许访问,如果不同则拒绝访问。
关键:ValidateAntiForgeryToken只针对POST请求。
换句话说,[ValidateAntiForgeryToken]必须和[HttpPost]同时加在一个ACTION上才可以正常使用。
这其中的原理我也没想明白,等下次好好把MVC的源代码看看。
不过我这么说是有根据的,我写了一些案例做了测试。
案例:
1、在一个ACTION的GET和POST方式分别加了[ValidateAntiForgeryToken]特性
Action:
2、用一个测试页面以POST方式去请求ACTION,结果是成功的。并且,隐藏域的值和COOKIE都是可以拿到的。
测试Post的页面:

3、用一个测试页面以GET方式去请求ACTION,报错。
测试Get的页面:

推荐使用方式:
1、Post-Only:大概思想是,拒绝所有的GET,只允许自己的POST。(安全,但不灵活)
2、GET只做显示,对所有的GET开放;POST做修改,对外界关闭,对自己开放。(灵活,但不够安全)
国外有个人说,其实这个过滤器本身就不安全,他如是说,所有的REQUEST都是可以伪造的。
[转载]SQL 将一个字段内用逗号分隔的内容分成多条记录 – 岩子 – 博客园.
由于业务需求,我们可能会把一串以分割符字符串数据放到一个字段,如我们在客户端处理拆分是很简单的,不过这样做效果不太好,怎么用SQL SERVER 2008 来解决这件事件哪?
方案1
用SQL SERVER XML 功能来解决
----> 生成测试数据: @T
DECLARE @T TABLE (id INT,Col1 VARCHAR(50),Col2 VARCHAR(50))
INSERT INTO @T
SELECT 1,'卸货费','运输车队业务, 客服接单业务'
UNION ALL
SELECT 2,'报关费','报关业务、客服接单业务'
----SQL查询如下:
SELECT
T.id,
A.x.value('.','varchar(10)') AS code,
B.x.value('.','varchar(10)') AS code2
FROM (
SELECT *,doc = CONVERT(xml,''+REPLACE(code,',','')+''),
doc2=CONVERT(xml,''+REPLACE(code2,',','')+'')
FROM @T
) AS T
CROSS APPLY doc.nodes('//v') AS A(x)
CROSS APPLY doc2.nodes('//v') AS B(x)
方案2
用SQL SERVER WITH 递归查询
WITH roy
AS ( SELECT Col1 ,
COl2 = CAST(LEFT(Col2, CHARINDEX(',', Col2 + ',') - 1) AS NVARCHAR(100)) ,
Split = CAST(STUFF(COl2 + ',', 1,
CHARINDEX(',', Col2 + ','), '') AS NVARCHAR(100))
FROM Tab
UNION ALL
SELECT Col1 ,
COl2 = CAST(LEFT(Split, CHARINDEX(',', Split) - 1) AS NVARCHAR(100)) ,
Split = CAST(STUFF(Split, 1, CHARINDEX(',', Split), '') AS NVARCHAR(100))
FROM Roy
WHERE split > ''
)
SELECT COl1 ,
COl2
FROM roy
ORDER BY COl1
OPTION ( MAXRECURSION 0 )

[转载]微博应用–PC遥控器 正式开源 – 小No – 博客园.
首先简单介绍以下PC遥控器是个神马东西。
你只需在被控电脑端安装上 PC遥控器,设置好微博登录账号(最新版同时支持新浪和腾讯微博)。这样无论你在何处何地,只要发个微博,就可以对你的电脑进行关机、重启、关闭显示器、查看屏幕截图等操作!简单方便!非常实用!
PC遥控器目前是靠我业余时间往里面添砖加瓦,但是一个人的力量和精力是有限的,为了让这款微博小应用的功能更加丰富和实用,我决定把PC遥控器开源,希望园里面有朋友能为PC遥控器贡献点代码。
PC遥控器的官方博客:http://suchuanyi.sinaapp.com/
源码是托管在github上面,地址是:https://github.com/terryso/PCRemote
对PC遥控器有兴趣,想贡献代码的园友,你只需把你的源码提交到你自己的仓库,然后在github上面通知我去拉就可以了。
PC遥控器的源码里面还包含了一个我自己写的微博SDK,目前支持新浪和腾讯微博的API,只不过目前只包含PC遥控器用到的几个API而已。
不过在这个SDK的基础上新增一个API也是很简单的,对这个SDK有兴趣的园友也可以看看,给些意见。