[转载]分享一个快速将传统表单转化为AJAX支持的表单的jQuery插件

mikel阅读(876)

[转载]分享一个快速将传统表单转化为AJAX支持的表单的jQuery插件 – ALAJAX – gbin1 – 博客园.

分享一个帮助你将传统表单转化为AJAX支持的表单的jQuery插件 - ALAJAX

在线演示  本地下载

今天我们介绍一个非常方便将传动表单递交方式自动转化为AJAX递交方式的JQuery插件 – ALAJAX,使用这个插件可以有效的帮助你把一些不支持AJAX的遗留系统快速的转化为支持AJAX的应用。而且不要求你有任何编程技巧,只需要添加一段简单的JavaScript即可。

主要特性

  • 自动为表单form添加AJAX功能
  • 不需要任何编程
  • 即使是动态生成的表单也可以很好的工作
  • 轻量级(3kb)
  • 很容易理解,并且修改简单
  • 非常适合web开发人员和设计人员

如何使用

倒入JQuery和插件类库,如下:

$(document).ready(function (){ $("#ID").alajax(); })

#ID是表单的ID或者是DIV的ID。

欢迎访问GBin1.com

[转载]IT族候车健身秘笈

mikel阅读(890)

[转载]IT族候车健身秘笈 – 寻得乐中乐 – 博客园.

生活在大都市的IT族们,平时有没有注意到自己的健康呢?一天忙到晚,根本没有时间好好 锻炼?时间这个问题就像女人的乳沟,只要愿意挤,总还是有的。锻炼的时机到处都有,哪怕你是在候车的时候!将等车的零碎时间利用来健身,既可避免等车的焦 虑,又可以充分利用时间,可谓一举两得。只要你想健康,想健身,总是会有办法的。

健康房里面有哑铃,咱们IT族身边也有类似的健身工具,你经常会带着什么?电脑包?没错,这就是咱们的哑铃。如果你和我一样有点非主流的追求,想弄 个重一点儿的‘电铃’,那大可像我一样,往电脑包里面多塞一点儿大块头儿的技术书籍,好家伙,你要是用牛皮纸包起来,别人还以为你随身带一砖头,准备找老 板要账去的。

clip_image001

这哑铃该怎么用呢?

首先,躺下来的姿势肯定不行,你总不能睡在车站旁边,手里面拿着电脑包在那儿比划吧,那就不是健身了,是制造强力围观。

clip_image002

这个姿势很怪,换个电脑包半俯身?别人以为你丢了钱包。

clip_image003

趴着就更不用想了,你愿意别人还不干。

clip_image004

所以,你只能站着。

于是乎,姿势:站着;健身工具:电脑包;两个如何结合呢?

方便又简单的办法才是我们需要的,如下:

举包:来那么十几下,一开始你还是从几个开始吧,那电脑包又重又大,平衡还有些不好掌握。

1.劲后臂屈伸,电脑包放脑后,用手勾引,上上下下,抓紧喽,包掉了我是不会赔你的。

可选项:单手或双手。

clip_image005

clip_image006

第二种举包包,是最简单的,抓住电脑包,举起放下,来个几千次什么的,so easy, piece of cake,肱二头肌等着你。

clip_image007

侧平举:横着举起电脑包,多练几次,肩膀会越来越有力量。

clip_image008

耸肩:缓解你肩膀的一些问题,尤其要注意放松;多做做,很多时候,你会发现,原来 这儿的肌肉一直紧张着,谁让咱们是抬着肩膀工作的呢?这个动作主要是为了让自己放松一下肩膀的肌肉。

clip_image009

金鸡独立:一只脚站立,练练平衡性;进阶:闭上眼睛;注意事项:别站在地铁边练,你有可能因为失去平衡掉下去,人命关天,切记。

clip_image010

你要是有高深的功夫,也大可以秀一下,没准儿还能成明星呢!

clip_image011

提踵:使脚跟尽量离开地面,每次最好停留2-3秒钟,重复20-30次,也可根据时间,次数随意增减。这一招,主要增强小腿后群肌的力量和踝关节的稳定性。

clip_image012

收腹:实在不好意思玩大动作,玩后台的。腹部向内缩,然后用一只手连着皮包一起紧压腹部,使腹部有如接近背部一般,然后用力保持紧绷的状态,坚持不住了再放松,持续几 次,觉得累了休息几秒再来。

扭腰:扭到你能看到后面,左扭扭,右扭扭,既能增强腰背肌的力量,顺便还能看下身后的帅哥美女。

clip_image013

扭屁股:这种运动想想就好,人多的地方你还是放过劳苦大众吧。

抱抱:没错,如果有另一半跟你一起上班,你们俩可以玩玩这个,抱到你面红耳赤、气喘吁吁、晕头转向;反正你俩沉浸在二人世界,别人已经不存在了,那是又甜蜜又健身,没有比这更好的了。你要是养成了习惯,一下班,你会直往家里冲,心里默念:超级人肉大哑铃,我来啦。

clip_image014

背老婆?这也是可以的,老婆忙了一天,背一背又何妨,不仅体现了你的温柔体贴,更彰显了你男人的魅力和伟岸,只要想办法,老婆都能成杠铃。

clip_image015

clip_image016

上车了,如果运气好,能在车上找个座位,坐着也是可以运动的。

1.踮脚:腿呈90°摆好,脚跟固定不动,脚尖上上下下反复摆动,这个动作可以锻炼小腿肚的肌肉,让小腿线条更匀称,在腿上再加上电脑包的重量那效果更好。或者脚尖不动,脚跟动一动。

2.抬腿:双腿并拢抬至离地面约五公分的高度,将腿悬空,尽量保持这个姿势,能坚持多久就坚持多久。增加难度:把电脑包放在脚上,你抬一下试试。

clip_image017

以下姿势禁用:

clip_image018

3.挤膝。两腿膝盖向内挤压。或者手也用上:两手握拳,拳眼相触夹在两膝间,然后两膝从两侧用力挤压两拳,能锻炼到大腿根肌肉。

4.扭脖:没有座位,人多挤的动不了?扭脖子嘛,前后左右扭一扭,可别扭腰不成变扭屁股,你一男的动来动去,女人们只会觉得你是个色狼,而旁边的男人们就会觉得恶心:这家伙是个同性恋吧。

clip_image019

5.引体:车里面有栏杆和吊环吧,双手抓紧喽,来几个引体向上!

clip_image020

看人家这哥们玩的多地道,不仅金鸡独立,还劈腿,健身到这种专业精神太值得学习了。

clip_image021

除了候车,换车的过程中如何健身?

走路:这坐车肯定要走路,这也算是健身?走路也分好多种,慢走、快走、倒着走、侧身走,那效果是不一样的,1==1.1?一分耕耘,一分收获。老天爷自有老天爷的逻辑判断,差一点就是一点儿的效果,运行的时间长了,健康自然现身。

所以,怎么走?

快步走,比平常的速度快一倍,行如风,急如电,走出你的风采,走出一身男子汗,走出一身女人味,待得风吹过,何其凉爽乎?在我的家乡湖北,有一位暴 走妈妈的故事,她儿子肝脏有问题,她想把自己的肝给儿子,可是脂肪肝是不能移植的,怎么办?她就开始暴走,每天走上几十公里,在七个月时间里,走破了四双 鞋,以前的衣服也变得宽松了,体重从68公斤减到了60公斤,去医院一检查,脂肪肝居然完全没有了,这个结果让医生都觉得大为震惊,最终儿子得救了。所 以,还真别看不起走路这个看似你天天在做的事情,走的快了,走的路多了,时间长了,肯定有效果。

clip_image022

爬楼梯:速度还要比平常快一些,地铁里面那什么电梯你就别坐了,留给老弱病残吧。和走路一样,你要是能每天爬个100层的楼房,神鬼难侵。常言道:人老先老腿。未老先衰,脚下无力,老婆都要跑了。

clip_image023

严肃的瘦身理论怎么说?

有氧运动心率143bmp=-0.7克脂肪/分钟

效果:可以在短时间迅速改善体形

长时间的训练不一定是最佳选择。美国科罗拉多大学的运动专家研究发现,125~134BMP的心率是有氧运动的最佳瘦身范围。以慢跑为例,当你 保持这个心率慢跑10分钟后,接下来你每分钟就会烧掉0.7克的脂肪。算算候车+乘车+换乘其实也差不多会有30分钟了,这足够一次有氧运动了,快走、爬 楼梯、扭腰、举包包,都会让你的心率快起来,站着能健身,坐着也能,咱玩的就是专业。

健身其实更多是一种习惯,IT族们学习都成了习惯,如果你每天能分配出一小点儿时间在运动上,把运动也练成了习惯,天长日久,必定有所回报。动一动,精神抖擞;动一动,疾病远走;动一动,头脑清醒,思维敏捷,学的快,做的快,老板高兴,收入翻番,老婆乐开怀。

每个IT族的心中是否都有一个智勇双全的你存在呢?想要智慧的头脑和健康的身体吗?你可以同时拥有,行动吧!

clip_image024clip_image025

[转载]jQuery Print Element 1.2

mikel阅读(1216)

[转载]jQuery Print Element 1.2.

JQuery Print Element 1.2

Sample

Download

Download (Minified)

Copyright (c) 2009 Erik Zaadi

Inspired by PrintArea and this stackoverflow comment

Fork (Github Project)  |  jQuery Plugin home page  |  Wiki  |  Issues (Report bugs)

Dual licensed under the MIT and GPL licenses: http://www.opensource.org/licenses/mit-license.php http://www.gnu.org/licenses/gpl.html

Usage:

$('SelectorToPrint').printElement(); 

Options:

printMode

Type: String
Default: ‘iframe’
Description: Sets wether the plugins behavior is to open a popup of the element to print before printing, or to create a hidden iframe. Possible values: ‘iframe’ | ‘popup’
The only mode currently available in Chrome and Opera is popup mode

Example

$("selector").printElement({printMode:'popup'}); 

pageTitle

Type: String
Default:
Description: Print Page Title (name of the file sent to the printer)

Example

$("selector").printElement({pageTitle:'thisWillBeTheNameInThePrintersLog.html'}); 

overrideElementCSS

Type: Array of Strings | Array of $.fn.printElement.cssElement | Boolean
Default: null
Description: Can be one of the following 3 options:
1 : boolean (pass true for stripping all css linked)
2 : array of $.fn.printElement.cssElement (s)
3 : array of strings with paths to alternate css files (optimized for print)

Example

$("selector").printElement( { overrideElementCSS:[ 'thisWillBeTheCSSUsed.css', { href:'thisWillBeTheCSSUsedAsWell.css',media:'print'}] }); 

printBodyOptions

Type: Object
Default: {styleToAdd: ‘padding:10px;margin:10px;’, classNameToAdd: ”}
Description: Contains:
styleToAdd : style attributes to add to the body of print document
classNameToAdd : css class to add to the body of print document

Example

$("selector").printElement( { printBodyOptions: { styleToAdd:'padding:10px;margin:10px;color:#FFFFFF !important;', classNameToAdd : 'thisWillBeTheClassUsedAsWell' } }); 

leaveOpen

Type: Boolean
Default: false
Description: in case of popup, determines if the print page will remain open or not
In Opera, this will be left open by default

Example

$("selector").printElement( { leaveOpen:true, printMode:'popup' }); 

iframeElementOptions

Type: Object
Default: styleToAdd : border:none;position:absolute;width:0px;height:0px;bottom:0px;left:0px;}
Description: Contains:
styleToAdd : style attributes to add to the iframe element
classNameToAdd : css class to add to the iframe element

Example

$("selector").printElement( { iframeElementOptions: { styleToAdd:'position:absolute;width:0px;height:0px;bottom:0px;', classNameToAdd : 'thisWillBeTheClassUsedAsWell' } }); 

[转载]C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)

mikel阅读(795)

[转载]C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载) – 王磊(Stone) – 博客园.

前言

 

C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform、ASP.NET等程序。

 

本文使用的IP库为, QQWry.Dat是显IP版QQ(彩虹外挂等),纯真IP数据库查询器等的IP数据库文件,可实现 IP 地址高效检索。

 

 

 

使用

 

一、C# 调用IP库(QQWry.Dat)查询IP位置

 

①、下载QQWry.Dat到D盘根目录(用户可以随意放置,没有特殊规定),点击下载

 

②、使用第三方dll(IPLocation.dll)调用返回信息,点击地址

 

③、项目引用第三方dll(IPLocation.dll),然后调用代码:IPLocation.IPLocation.IPLocate(“D:\\qqwry.dat”, “123.125.114.144”); 直接返回位置地址。

 

 

 

二、手动升级IP库(QQWry.Dat)方法

 

需要使用工具:IP纯正库,点击下载

 

下载完之后安装(此次略去安装步骤,一直点下一步就行),安装完之后,如图:

 

 

点击 “打开文件位置” ,如图:

 

 

把咱们的QQwry.Dat替换到安装目录位置,或者直接用这个QQwry.Dat与咱们之前用的相同。
然后打开“纯真IP地址数据库”软件,点击“在线升级,如图:

 

 

 

 

等待升级完成,安装目录下的QQwry.Dat就是最新的IP库了,复制到咱们的程序当中即可使用。

 

结束

用途不解释,6年前刷广东在线IP,刷半年的腾讯三钻加会员,那时候腾讯只有三钻和会员,想不到如今有不上了,不过这款IP库已经经历了历史的洗礼,很全很强大了。希望能为大家提供有用的帮助,请支持一下,谢谢。

[转载]简单的搭建一个高并发低时延系统

mikel阅读(986)

[转载]简单的搭建一个高并发低时延系统 – 常高伟 – 博客园.

首先声明一点:这里的“高并发”是相对的,相对于硬件而言,而不是绝对的高并发。后者需要分布式来实现,这里不做讨论。本文关注的是单机的高并发。

最近在做一个语音通信系统,要求在线用户2W,并发1K路通话。硬件是两台服务器,酷睿多核,4G内存,千兆网卡(我用过的最好的硬件,负担这些应该问题不大)。

系统的另一个指标是呼叫时延和语音时延。这是这个系统的关键。最终我们的系统拿到用户现场测试的时候,效果可能有点太好,对方测试不大相信。其实降低时延只要几个地方把握好了,应该问题不大的。这里总结一下。

1、 整体结构:

整体上采用控制与承载相分离的结构。控制部分负责流程的控制部分,包括流程的建立,处理,语音资源的管理等,是系统核心 部分。承载部分主要负责语音处理,包括语音编解码,加解密,转发录音等。这样的好处是:1)降低系统的整体复杂度。2)提高系统的可扩展性。特别是如果用 户数上去,这种结构更好扩展。

这在通信中其实就是一个典型的软交换结构。两台服务器,一台负责控制,一台负责承载。控制和承载之间通过网络通信。

控制程序是一个进程,可以管理多个承载程序。

2、 流程:

要降低时延,关键的一点是功能实现流程的设计。要减少不必要的环节和网元间的交互。数据能够一次通知就不要两次交互。必要的时候,为了时延,可以牺牲一点协议的标准性,使用私有协议完成(至少从目前看没有问题,这个系统是一个端对端封闭的系统。)。

3、开发语言:

控制层面使用的python来实现的。控制部分流程逻辑复杂,而python很擅长描述逻辑。本来有点担心python 的运行效率,其实没有必要:整个系统的压力在承载,而不在控制部分,控制部分不会有太多的压力;另外,cpu够强悍,时延的瓶颈在I/O。况 且,python也重用了我们之前用C实现的协议编解码库。

承载部分用C来实现。

4、 利用多核

利用多进程来利用多核。在承载服务器上,并行跑了两个进程,每个分别处理500路通话。也许线程切换成本更低,但是编程复杂度高。对于线程,我只用最简单的模型。

控制部分没有多进程,似乎利用不能这个服务器的多核,不过目前来看,还不需要,因为现在就能很好的满足需求。

5、 网络通信

承载服务器的压力中很大一部分来自于网络通信。按照我们的功能,1000路语音并发,意味着没20毫秒至少要处理1000个语音包(最恶劣的情况是2000个语音包,包括收发)。

Libevent开源,号称轻量级高性能,而且应用也广泛,也许是个不错的选择。不过在我看来还是有些庞大,很多特性(跨平台,多种通信模型)我都用不上。

更为关键的一点事,linux的epool接口足够简单,而且非常好用。接口中提供一个参数可以设置用户数据,这样我可以把一些数据包括函数指针放进去,从而很方便的构造一个事件驱动的网络模块。它能够保证代码足够简单。

6、 文件读写

整个系统涉及到文件读写的主要有两块:录音及日志。我们常用的文件操作接口都是阻塞式,进程(线程)会被挂起,等待读写完毕,然后在继续执行。我们都知道,对磁盘的操作要慢很多,所以这个地方是请求时延的一个瓶颈。

异步IO可以解决这个问题。参考资料:http://www.ibm.com/developerworks/cn/linux/l-async/。不过网上看到有人说AIO接口有bug。时间不多,没有时间深入研究,还是保守的放弃了这个思路。新技术有风险,使用需谨慎。

Libeio也应该是一个选择。参考资料:http://rdc.taobao.com/blog/cs/?p=1524,它是用线程池来模拟异步IO。问题是,我们的程序主要是写文件,而且一般不需要知道结果,在这种情况下使用libeio的必要性有多大?

我们最终的方案是参考libeio,直接为承载进程申请了一个线程来负责写文件。主线程负责语音编解码及转发,完全非阻塞,以保证低延迟。涉及的文件写操作,通过接口发送给另外一个线程调用阻塞IO接口来实现。线程间接口很简单,一块要写的内容加一个路径名。

7、 数据库操作

我们的数据库使用的是mySQL。和文件读写一样,数据库操作也是请求时延的一个瓶颈。在整个流程中,我们会多次的读写 数据。我们的做法是:系统启动后,将运行时用到的数据全部读到内存,后面直接查看内存。好在数据不大,这个工作也简单。如果涉及到数据的新增修改删除。则 另外一个线程完成相关操作,再通知主线程更新内存。

最终的结果是,主线程是完全非阻塞的,涉及到阻塞的操作,全部移到另外一个线程中。两个线程不共享任何全局数据,只通过FIFO交互。

这个地方redis也许是可以考虑的一种选择,它的数据保存在内存,读写效率也非常好。不过相对来说还是有点复杂,而且还是noSQL,我们的开发人员并不熟悉。“最小惊讶原则”不但适用于程序接口,也适用于系统。

经过所有的这些考虑和优化,可以基本达到目标,而且足够简单。

如何榨干服务器:

经过上面的一些优化,基本上可以满足用户的需求了。但我知道,还没有完全的利用服务器的能力(包括CPU,IO)。要进一步榨干服务器的能力,可以在承载服务器上将每个进程的处理能力扩大一倍,每个进程处理1000路。也可以考虑再多跑几个进程。

控制服务器没有充分的利用多核,可以考虑在控制服务器也运行两个承载程序。

这样下来,初步估计硬件不提高的情况下,注册用户数至少能够提高到6W,并发呼叫数目至少能够提高到3K。

提高绝对容量和并发:

业务特点不同,通信行业高并发的解决方案和互联网行业可能会有一些区别。可以想一下我们使用的电话系统,就是一个实例。它通过分布在全国各地的一个个用户归属的局端,再配合强大的路由能力,以及端到端之间非常标准的协议来解决。

采用类似的方案也可以提高本系统的容量和并发,不过,目前系统的容量已经可以满足我们公司市场几年内的需求,没有进一步提升的必要,还是保持简单的好。

总结:

很多时候,使用开源软件都是一个非常不错的主意,可以避免“重复发明轮子”。而且,它还有一定的诱惑:它可以为你的履历加分。

但是有的时候,你需要的可能并不是“轮子”,想想为一个滑板安装一个汽车轮是什么效果。

什么样的方案才是好的方案?

1、 满足现在的需求及未来50%的需求。当一个可预见的需求发生概率超过一半时,为它考虑可扩展时必要的。否则会过度设计而冲击简单性。

2、 保持简单。

最后,再次提一下KISS原则,keep it simple and stupid !

[转载]Visual Studio 2008 Windows Form项目发布生成安装包详解

mikel阅读(847)

[转载]Visual Studio 2008 Windows Form项目发布生成安装包详解 – 一叶知秋_yjh – 博客园.

    Visual Studio 2008 Windows Form项目的发布对有经验的程序员来说,可能不值一提,但对很多新手来说却不知道如何操作,因为在很多关于Visual Studio的书籍中也没有相关介绍,权威如《C# 2005/8 高级编程》对该内容也末涉及。好在网络上不乏热心网友对相关操作经验进行分享,只是在表述上并不详尽,笔者觉得有必要对该操作方法详细说明一番,希望能对 有些新手朋友起到一些帮助。有时学习的乐趣不在于我们掌握了何种技术、何种技巧,善于总结、学会分享也是一种不错的体验,在我们遇到问题茫然无助时,都是 多么希望能有过来人给我们指引,希望我们也能成为别人学习历程中的一个指路人。

下面就让我来说一说,如何将我们已经测试好的项目,打包发布成一个商品化软件,可双击安装的应用程序。

一、新建一个安装项目

操作步骤:文件->新建->项目,在“新建项目”对话框左边“项目类型”中选择“其它项目类型”下面的“安装和部署”,在对话框右边的“模板”窗口中选择“安装项目”。

图示如下:

 

 

给该安装项目取一个名称,如:mySetup ,并选择一下项目存储位置,如:E:\,然后单击“确定”,确定后会进入安装项目工作界面。如下图所示:

 

 

二、在“应用程序文件夹”下添加两个文件夹,一个叫image用来存储程序的ICO图标,另一个叫program用来存储自己开发项目的Debug 下面编译好的所有文件。选中“program”,点右键添加文件,通过浏览对话框找到自己开发程序的Bin\Debug目录下的文件,将它们都添加进来。

 

 

 

 

添加后的界面如下:

 

 

三、向“用户的‘程序’”菜单中添加内容,可先添加一个文件夹,比如取名“教材管理系统”,再将program中的你的程序的可执行文件***.exe选中点右键,选择“创建***.exe”快捷方式,如下图:

 

给创建好的快捷方式重新命名,如“教材管理系统Ver1.0 ”,然后将其剪切到“用户的‘程序’菜单”,重复上述操作,在“用户桌面”下添加同样的快捷方式。这样在安装之后,在开始菜单“程序”与用户的桌面上就会有相应程序的菜单项及图标了。

 

四、给“用户的‘程序’菜单”中添加卸载该软件命令项,首先,要在program文件夹下添加Windows自带的卸载程序文件“msiexec.exe”,其路径为“C:\WINDOWS\system32”然后将其重新命名,改成“uninstall.exe”,如下图所示:

 

给其创建一个快捷方式,给快捷方式重新命名,如“卸载教材管理系统”,再将其剪切到用户的“程序”菜单下面的“教材管理系统”文件夹中,如下图所示:

 

接着要设定该卸载快捷方式的Arguments属性,如下图所示:

 

命令行参数要填上要卸载程序的产品代码,代码在项目mySetup属性下的ProductCode对应的值,将其复制一下,如下图:

 

然后copy到卸载快捷方式的Arguments参数值上,并在前面加上“/x ”,如下图所示:

 

五、给应用程序添加图标 将自己喜欢的图标小文件添加到Image文件夹下,然后选中用户的“程序”菜单下面的快捷方式,在属性窗口中的 Icon中为其快捷方式添加图标。

六、添加相关的系统必备项,确保在安装时不缺少相关的文件  选中mySetup项目,点右键属性,在出现的属性页对话框中有“系统必备”按钮,如下图所示:

 

在出现的对话框中选择相关的必备项,如下图所示:

 

七、生成项目

 

生成成功后,在项目的Bin\Debug目录下就会找到生成好的两个安装文件,如下图所示:

 

双击setup就可以安装了,安装好后,在开始菜单中就会找到相应的菜单命令,如下图所示:

 

同样,在用户的桌面上也会有一个可执行的快捷方式图标。

到此,一个完整的VS2008程序的发布打包过程就讲解完了,希望能对你的学习有些帮助。第一次发博,写得有点烦琐,高手勿^_^ 。

[转载]新浪微博SDK for .Net 4.0第二版Web Demo发布了

mikel阅读(819)

[转载]新浪微博SDK for .Net 4.0第二版Web Demo发布了 – 林选臣 – 博客园.

基于《新浪微博SDK for .Net 4.0第二版》的web版DEMO发布了。

web版的demo程序实现了微博具有的几项基本功能,并且demo中展示了下述功能

  • 演示了如何读取列表的功能
  • 实现了发布文字微博和图片微博的功能
  • 演示了多种数据输出方式:JSON到页面直接输出、DataRepeater数据绑定等

欢迎下载交流

新浪官方下载地址:http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E

下载地址:http://weibosdk.codeplex.com/releases/view/88472

项目地址:http://weibosdk.codeplex.com/

 

欢迎交流指导~

交流Q群:241088256

运行截图

 

[转载]C# 关于方法中的参数(可选参数和命名参数)

mikel阅读(1040)

转载C# 关于方法中的参数(可选参数和命名参数) – Andrew.Wangxu – 博客园.

在阅读《CLR via C#(第三版)》第191页中看到方法参数的用法,这里将书本中的内容挑选一些关键的记录下来,内容如下:

 

设计一个方法的参数时,可为部分或全部参数分配默认值。然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值。除此之外,调用方法时,还可通过指定参数名称的方式为其传递实参。以下代码演示了可选参数和命名参数的用法:

using System;
using System.Collections.Generic;
using System.Text;

namespace ParameterInMethod
{
class Program
{
private static int s_n = 0;
private static void M(int x = 9, string s = "A", DateTime dt = default(DateTime), Guid guid = new Guid())
{
Console.WriteLine("x={0},s={1},dt={2},guid={3}",x,s,dt,guid);
}

static void Main(string[] args)
{
// 1. 等同于M(9, "A", default(DateTime), new Guid());
M();

// 2. 等同于M(8, "X", default(DateTime), new Guid());
M(8, "X");

// 3. 等同于M(5, "A", DateTime.Now, new Guid());
M(5, guid: Guid.NewGuid(), dt: DateTime.Now);

// 4. 等同于M(0, "1", default(DateTime), new Guid());
M(s_n++, s_n++.ToString());

// 5. 等同于以下两行代码:
// string t1 = "2"; int t2 = 3;
// M(t2, t1, default(DateTime), new Guid());
M(s: (s_n++).ToString(), x: s_n++);

Console.ReadLine();

//程序输出结果如下:
/*
* x=9,s=A,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
* x=8,s=X,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
* x=5,s=A,dt=2012/5/31 10:34:28,guid=cdc348c3-6435-40ed-8e37-23d90f4f05ce
* x=0,s=1,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
* x=3,s=2,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
*/

}
}
}

如你所见,如果调用时省略了一个实参,C#编译器会自动嵌入参数的默认值。

在对 M 的第4个调用中 s_n 中的当前值(0)传给x,然后 s_n 递增。随后, s_n 的当前值(1)作为一个字符串传给 s, 然后继续递增到 2. 使用已命名的参数传递实参时,编译器仍然按从左到右的顺序对实参进行求值。

在对 M 的第5个调用中, s_n 中的当前值(2)被转换成一个字符串,并保存到编译器创建的一个临时变量(t1)中。接着, s_n 递增到3,这个值保存到编译器创建另一个临时变量(t2)中。然后, s_n 继续递增到4. 最后调用M时,向它传递的实参一次是 t2,t1 一个默认DateTime 和 新建的guid。

 

规则和原则:

  • 可以为方法、构构造器方法和有参属性(C#索引器)的参数指定默认值。还可为属于委托定义一部分的参数指定默认值。然后,在调用该委托类型的一个变量时,可以省略实参,以接受默认值。
  • 有默认值的参数必须在没有默认值的所有参数之后。换言之,一旦定义了一个有默认值的参数,它右边的所有参数也必须有默认值。例如在面前的 M 方法定义中,如果删除 s 的默认值(“A”),就会出现编译错误。但这个规则有一个例外:“参数数组”这种参数必须放在所有参数(包括有默认值的这些)之后,而且数组本身不能有一 个默认值。
  • 默认值必须是编译时能确定的常量值。那么,能为哪些参数设置默认值呢?这些参数的类型可以是C#认定的基元类型。还可以包括枚举类型,以及能设为 null 的任何引用类型。对于任何值类型的一个参数,可将默认值设为值类型的一个实例,并让它的所有字段都包含零值。可以用 default 关键字或者 new 关键字来表达这个意思;两种语法将生成完全一致的IL代码。在 M 方法中设置 dt 参数和 guid 参数的默认值时,分别使用的就是这两种语法。
  • 注意不要重命名参数变量。否则,任何调用者如果以传参数名的方式传递参数,都必须修改它们的代码。例如,在前面的 M 方法声明中,如果将dt变量重命名为 dateTime,对 M 的第三个调用就会造成编译错误:error CS1739:”M” 的最佳重载没有名为“dt”的参数。
  • 如果参数用 ref 或 out 关键字进行了标识,就不能设置默认值。因为没有办法为这些参数传递一个有意义的默认值。
  • C#不允许省略逗号之间实参,比如M(1, , DateTime.Now).因为会造成可读性的影响,程序员将被迫去数这些逗号。

 

大概就是以上内容,具体细节的这里并没有说的特别的全面,可以参考本文的前面说的书籍作为参考。

 

我测试的一个Demo源码下载:http://files.cnblogs.com/andrew-blog/ParameterInMethod.rar

[转载]使用Areas分离ASP.NET MVC项目

mikel阅读(1022)

[转载]使用Areas分离ASP.NET MVC项目 – Lyon.L – 博客园.

为什么需要分离?

我们知道MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等。但是在实际的开发中,随着项目规模 的不断扩大,Controller控制器也随之不断增多。如果在Controllers文件夹下面有超过两位数controller,即便采用良好的命名 规范,或者用子文件夹的形式区分不同功能的控制器,还是会影响项目的可阅读性和可维护性。因此,在一些场景下,如果能把与某功能相关的文件分离到一个独立 的项目中是非常有用的。ASP.NET MVC提供了Areas(区域)的概念达到这一目的。

一个典型的场景

Web应用通常会有前台(面向用户)和后台(面向管理员)两部分,我们希望以/locahost/Admin开始的URL都为后台管理地址,因此我们也许会有这样的路由:

routes.MapRoute( //Admin Route
"Admin", // Route name
"Admin/{controller}/{action}/{id}", // URL with parameters
new { controller = "Admin", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute( //Default Route
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

运行程序访问locahost/Admin, 通过RouteDebugger(Asp.Net MVC路由调试的好帮手RouteDebugger) 的输出信息可以看到,第一个路由(Admin)匹配成功,AdminController的Index方法被调用了,然而再仔细想想,通过 /localhost/Admin/Index可以匹配第二个路由(Default),同样可以调用AdminController的Index方法!以 此类推,后台用户管理列表(/localhost/Admin/User/List)等同于(/localhost/User/List)。

第一次改进

我们要达到一种目的,那就是/localhost/Admin/Admin/Index正确匹配第一个路由,而/localhost/Admin/Index不匹配第二个路由。因此可以对Default路由进行条件限制,参考Stephen Walther的ASP.NET MVC Tip #30 – Create Custom Route Constraints,修改Default路由为:

routes.MapRoute( //Default Route
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { controller = new NotEqual("Admin")}
);

上面的路由意思是AdminController不会匹配Default路由。现在分别运行之前的两个URL,会发现直接访问/Admin /Index已经不能匹配到任何路由。通过修改NotEqual类,可以很容易为Default路由添加多个“排除在外”的Controller限制条 件。但是,你不觉得这样很挫么?

第二次改进

这里进入正题,使用Areas这个功能来进行分离。新建一个项目”MyMvcAreasDemo”,然后在项目上右键->添加->Areas,输入”Admin”,如下:

add area

在Areas/Admin/Controllers文件夹下面新建HomeController并添加一个Index的方法和对应的View文件。 这里可以发现Areas的另一个好处:你可以在不同Areas下面添加相同名称的Controller。当然,如果你直接这么运行会得到一个错误:

area error

这种情况需要修改一下AdminAreaRegistration.cs和Global.asax,分别为路由加上命名空间限制:

/Areas/Admin/AdminAreaRegistration.cs

context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new string[] { "MyMvcAreasDemo.Areas.Admin.Controllers" }
);

/Global.asax.cs

routes.MapRoute( //Default Route
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new string[] { "MyMvcAreasDemo.Controllers" }
);

这样,我们就可以把所有与后台管理相关的Controller和View文件放到/Areas/Admin下面,以此类推,可以添加诸如会员(Member),博客(Blog),论坛(Forum)等多个Areas。各部分都有自己的顶层文件夹,物理文件都分离开来,管理起来比较方便。

这种方式已经有了很大提高,但是所有的文件还是放在同一个项目里面。当项目规模较大的时候,比较好的开发方式是将不同功能模块按需要独立到不同项目里面,最后再整合成一个整体。这样,每一个项目可以独立开发,测试和发布。

第三次改进

我们需要对现有项目进行一下改造:

1. 在解决方案上面新建一个MyMvcAreasDemo.Admin的MVC3项目,并且删除Global.asax和Web.config两个文件

2. 在根目录新建一个AdminAreaRegistration的类,输入如下内容:

public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}

public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}

3.  删除MyMvcAreasDemo项目/Areas/Admin文件夹下面的AdminAreaRegistration.cs文件以及Controllers文件夹(包括HomeController)

4.  在MyMvcAreasDemo.Admin项目的Controllers里面新建一个HomeController

5.  记得保留MyMvcAreasDemo/Areas/Admin下面的Views,并且在MyMvcAreasDemo项目里面引用MyMvcAreasDemo.Admin项目,如图:

QQ截图未命名

现在运行程序并访问/Admin/Home/Index可以发现Admin项目生效了。这样,我们可以将所有的与后台管理相关的Controller都放到这个新的项目中来。但是很快你会发现,一个新的“问题”又出现了:

当你在MyMvcAreasDemo.Admin里面的HomeController添加新的Action(例如List),然后习惯性在上面右键 -“Add View”后,你会发现新增的List.cshtml文件会出现在MyMvcAreasDemo.Admin/Views/Home下面,然后当你访问 /Admin/Home/List的时候浏览器会得到错误提示:”The view ‘List’ or its master was not found or no view engine supports the searched locations…”。原来它只会在主程序MyMvcAreasDemo中的对应目录去寻找View。这么一来,MVC框架提供给我们的脚手架功能就大 打折扣,当然你可以手动在MyMvcAreasDemo/Areas/Admin/Views中对应添加View,或者在 MyMvcAreasDemo.Admin项目中自动生成了View之后再拷贝过去。有没有更好的办法呢?

第四次改进

为了使我们在MyMvcAreasDemo.Admin自动生成的View自动同步到MyMvcAreasDemo/Areas/Admin /Views文件夹中,可以使用“生成事件(Build Event)”里的“Post-Build Event”,打开MyMvcAreasDemo.Admin的属性,修改如下图所示:

1

我本地的生成事件为:

1
2
mkdir "$(SolutionDir)$(SolutionName)\Areas\Admin\Views"
xcopy "$(ProjectDir)Views" "$(SolutionDir)$(SolutionName)\Areas\Admin\Views" /S /E /C /Y

意思其实很简单,相信大家都能看得懂,就是完全复制MyMvcAreasDemo.Admin的Views文件夹下所有文件至MyMvcAreasDemo/Areas/Admin/Views中。

现在再次访问/Admin/Home/List就可以得到正确结果了,并且你可以发现List.cshtml已经被复制到MyMvcAreasDemo/Areas/Admin/Views/Home目录里。

至此大功告成!我们已经将面向前台和面向后台的模块成功分离到两个独立的项目中,希望能对您有所帮助!

[转载]InfoQ: 12种JavaScript MVC框架之比较

mikel阅读(987)

[转载]InfoQ: 12种JavaScript MVC框架之比较.

Gordon L. Hempton是西雅图的一位黑客和设计师,他花费了几个月的时间研究和比较了12种流行的JavaScript MVC框架,并在博客中总结了每种框架的优缺点,最终的结果是,Ember.js胜出。

此次比较针对的特性标准有四种,分别是:

  • UI绑定(UI Bindings)
  • 复合视图(Composed Views)
  • Web表现层(Web Presentation Layer)
  • 与其他框架良好协作(Plays Nicely with Others)

对于各种JavaScript MVC框架,Gordon都总结了优缺点:

  1. Backbone.js——优点:强大的社区,强劲的势头;缺点:抽象较弱,很多功能亟待增加。
  2. SproutCore——优点:对绑定的支持,可靠的社区,大量特性;缺点:过度规范,难以和不需要的特性解耦。
  3. Sammy.js——优点:易于学习,更容易和现存的服务端应用程序整合;缺点:过于简单,无法应用于大型应用程序中。
  4. Spine.js——优点:轻量级,文档很完备;缺点:它的核心概念“spine”是异步的用户界面,这意味着理想状况用户界面永远不会发生堵塞,而这个基础有缺陷。
  5. Cappuccino——优点:大型深思熟虑后的框架,良好的社区,很棒的继承模型;缺点:由iOS开发者创建,使用JavaScript模拟Objective-C。
  6. Knockout.js——优点:对绑定的支持,完备的文档和教程;缺点:绑定语法拙劣,缺少统一的视图组件层级关系。
  7. Javascript MVC——优点:可靠的社区;缺点:基于字符串的继承模型很差,控制器与视图关系过密而缺少绑定。
  8. GWT(Google Web Toolkit)——优点:全面的框架,良好的社区,可靠的基于Java的组件继承模型;缺点:可能无法经受时间的考验,另外,Java在客户端上的抽象有些笨拙。
  9. Google Closure——优点:很好的基于组件的UI组合系统。缺点:缺少UI绑定支持。
  10. Ember.js——优点:很丰富的模板系统,拥有复合视图和UI绑定;缺点:相对较新,文档不够完备。
  11. Angular.js——优点:对模板范围和控制器设计有很好的考虑,拥有依赖注入系统,支持丰富的UI绑定语法。缺点:代码的模块性不强,视图的模块化也不够。
  12. Batman.js——优点:代码清晰,绑定、持久化的方法简单;缺点:使用了单例控制器。

经过对以上各种Javascript MVC框架特性的比较,Gordon认为只有Ember.js能够完全满足他的要求,从而成为他最终选用的框架。

你是否也使用过某些JavaScript MVC框架呢?欢迎参与讨论。