[转载]分享20个很不错的UI图标集资源

mikel阅读(874)

[转载]分享20个很不错的UI图标集资源 – 梦想天空(山边小溪) – 博客园.

这次,我为大家收集了20个用户界面图标集资源,这些图标集特别适合用于Web和智能手机的用户界面设计。如果你有更多更好的素材,欢迎与我们分享。

1. Iconza

PixeloPhilia2

2. PixeloPhilia2

Function Icon Set

3. Function Icon Set

Facebook UI Icons

4. Facebook UI icons

Weby Icons

5. Weby Icons

DowgHouseDesign

6. DowgHouseDesign

App Bits

7. App Bits

Nixus Icon Pack

8. Nixus Icon Pack

Peculiar

9. Peculiar

Ice Joy Icons

10. Ice Joy Icons

Tango Icons

11. Tango Icons

Glyphish

12. Glyphish Icons

Mini Icons

13. Mini Icons

Icojoy Icons

14. Icojoy Icons

Iconeden

15. Iconeden

developpers Icons

16. Developpers Icons

PC.DE Icons

17. PC.DE Icons

Iconik

18. Iconik

WooFunction Icons

19. WooFunction Icons

Basic Set Icons

20. Basic Set Icons

[转载]jQuery 版“元素拖拽改变大小”原型

mikel阅读(1057)

[转载][分享] jQuery 版“元素拖拽改变大小”原型 – 小吴同学 – 博客园.

“元素拖拽改变大小”其实和“元素拖拽”一个原理,只是所动态改变的对象不同而已,主要在于 top、left、width、height 的运用,相对实现起来也非常容易。以下附出源码原型,弄明白了原理再扩展其他实际应用,思路就变得简单、清晰得多了。

在引入 JQuery.js 后:

<script type="text/javascript">// <!&#91;CDATA&#91;
    $(function(){
        //绑定需要拖拽改变大小的元素对象
        bindResize(document.getElementById('test'))
    });

    function bindResize(el){
        //初始化参数
        var els = el.style,
            //鼠标的 X 和 Y 轴坐标
            x = y = 0;
        //邪恶的食指
        $(el).mousedown(function(e){
            //按下元素后,计算当前鼠标与对象计算后的坐标
            x = e.clientX - el.offsetWidth,
            y = e.clientY - el.offsetHeight;
            //在支持 setCapture 做些东东
            el.setCapture ? (
                //捕捉焦点
                el.setCapture(),
                //设置事件
                el.onmousemove = function(ev){
                    mouseMove(ev || event)
                },
                el.onmouseup = mouseUp
            ) : (
                //绑定事件
                $(document).bind("mousemove",mouseMove).bind("mouseup",mouseUp)
            )
            //防止默认事件发生
            e.preventDefault()
        });
        //移动事件
        function mouseMove(e){
            //宇宙超级无敌运算中...
            els.width = e.clientX - x + 'px',
            els.height = e.clientY - y + 'px'
        }
        //停止事件
        function mouseUp(){
            //在支持 releaseCapture 做些东东
            el.releaseCapture ? (
                //释放焦点
                el.releaseCapture(),
                //移除事件
                el.onmousemove = el.onmouseup = null
            ) : (
                //卸载事件
                $(document).unbind("mousemove", mouseMove).unbind("mouseup", mouseUp)
            )
        }
    }
// &#93;&#93;></script>

width 和 height 的中不允许出现负数的值,否则会报错,那么根据这个需求简单扩展了一个“限制最小高宽”的小实例:

<script type="text/javascript">// <!&#91;CDATA&#91;
    $(function(){
        //绑定需要拖拽改变大小的元素对象
        bindResize(document.getElementById('test'),200,100);
    });
    //绑定需要拖拽改变大小的元素对象
    //el 元素对象
    //minW 最小宽度
    //minH 最小高度
    function bindResize(el,minW,minH){
        //初始化参数
        var els = el.style,
            //鼠标的 X 和 Y 轴坐标
            x = y = Xm = Ym = 0;
        //邪恶的食指
        $(el).mousedown(function(e){
            //按下元素后,计算当前鼠标与对象计算后的坐标
            x = e.clientX - el.offsetWidth,
            y = e.clientY - el.offsetHeight;
            //在支持 setCapture 做些东东
            el.setCapture ? (
                //捕捉焦点
                el.setCapture(),
                //设置事件
                el.onmousemove = function(ev){
                    mouseMove(ev || event)
                },
                el.onmouseup = mouseUp
            ) : (
                //绑定事件
                $(document).bind("mousemove",mouseMove).bind("mouseup",mouseUp)
            )
            //防止默认事件发生
            e.preventDefault()
        });
        //移动事件
        function mouseMove(e){
            //宇宙超级无敌运算中...
            Xm = e.clientX - x,
            Ym = e.clientY - y;
            //限制高宽
            Xm <= minW && (Xm = minW),
            Ym <= minH && (Ym = minH);
            //设置大小
            els.width = Xm + 'px',
            els.height = Ym + 'px'
        }
        //停止事件
        function mouseUp(){
            //在支持 releaseCapture 做些东东
            el.releaseCapture ? (
                //释放焦点
                el.releaseCapture(),
                //移除事件
                el.onmousemove = el.onmouseup = null
            ) : (
                //卸载事件
                $(document).unbind("mousemove", mouseMove).unbind("mouseup", mouseUp)
            )
        }
    }
// &#93;&#93;></script>

下载:实例原型

[转载]如何应用firebug突破新浪ishare下载限制

mikel阅读(981)

[转载]本人原创,如何应用firebug突破新浪ishare下载限制 – hh54188 – 博客园.

电子书是个好东西,但自从百度,豆瓣,大幅度收费后,免费的资源越来越难找。而且一定要在他们的网站上浏览让人颇为不爽。

新浪的ishare算是后起之秀,是除csdn下载频道之后为数不多的一片净土。这个星期因为机缘偶然发现了新浪ishare的这个bug,能够突破一些下载的限制,在这里分享给大家。

我们看到新浪ishare有三种下载方式:

1.免费,很好,那就直接下载吧

2.需要积分,也没关系,注册账号可以送积分,实在不行上传些垃圾文件也行。

3.被上传者设为“仅供本人和好友下载”,如图所示:

这个是最致命的,我着手解决的就是这个问题。

正文开始

首先我们找到一个可以下载和一个不可以下载的:

要接下来必须下载火狐浏览器,opera和chrome和safari浏览器应该也没有问题,请注意只有这四种浏览器可以办到,让ie见鬼去吧

在安装好了之后再安装Firefox的一个插件,在插件页面找到firebug插件,并安装

安装好之后,重启火狐就可以使用firebug了

选择可以下载那个文件,找到下载按钮,右键单击”查看元素“:

这样就启动了firebug。或者按”F12“键,启动firebug(在在chrome中右键单击”审查元素“),再按图示中的按钮,选择元素:

这样我们就找到了源代码,但注意它的父元素中有个class为pl20,如荧光注释所示:

以同样的方式打开不能下载的那个提示框(同样在按钮的位置):

注意到也同样有pl20这个元素。ok,可能你已经猜到了,用可以下载pl20替换不可以下载的pl20

在不能下载的那个页面进行以下操作,删除pl20源代码:

编辑它的父元素td

荧光位置就是我们要插入的能下载的pl20

我们再次回到能下载的页面,复制能下载的那个pl20按钮:

在上上图的荧光位置黏贴该代码:

再单击左上角的”编辑“按钮,以结束编辑,上图中黑线之上就是后来加入的代码

这样在不能下载的页面也出现了一个下载按钮

是不是很神奇,但这并不代表能下载,点击后你会发现下载的仍然是复制源页面的那个文件,于是我猜想肯定有参数决定下载的是哪一个文件,对,接下来修改参数

找到pl20子元素中的form标签:

在action中fileid中的参数就是决定你下载的是哪一个文件,比如这里复制来的是”1234567“

而实际上不能下载页面的参数是7654321,从地址栏就可以看出来:

于是我们只要把复制来的pl20中的1234567改为本页面得7654321:

OK,大功告成,当你再点击时,发现已经可以下载了

本贴仅供学习研究之用,不得用于非法途径,由此产生的相关责任本人概不负责。

[转载]android开发列表界面

mikel阅读(1024)

[转载]android开发列表界面 – skyme – 博客园.

Android开发列表界面,上边是一个显示题目,下边显示的是图标,中间显示的是列表。

看一下效果吧

当鼠标点击上之后出现背景图,下面看一下如何做出这样的效果吧。

1.创建Android工程

修改main.xml中的内容如下:

<!--?xml version="1.0" encoding="utf-8"?-->

<!-- 中间的列表 -->

在这里边用了两个布局

RelativeLayout:children是相互之间相关位置或者和他们的parent位置相关,常用在form中

LinearLayout:children排列成一行多列或者一列多行的形式,这种layout最常见

GridView 显示的是网格的布局,一般可以加入各种adapter,这是适配器的典型实现。android中面向对象做的真的不错。。。

2.添加GridViewAdapter.java类

输入内容如下:

public class GridViewAdapter extends BaseAdapter{
//存放各个元素
private List listItem = new ArrayList();

// 将一个xml文件转化成视图
LayoutInflater inFlater;

public GridViewAdapter(Context context){
this.inFlater = LayoutInflater.from(context);
init();
}

private void init(){
//先在这里初始化,以后放到数据库里
ViewItem vi1 = new ViewItem();
vi1.setName("记录账目");
vi1.setImgName(R.drawable.img1);
ViewItem vi2 = new ViewItem();
vi2.setName("记录账目");
vi2.setImgName(R.drawable.img2);
ViewItem vi3 = new ViewItem();
vi3.setName("记录账目");
vi3.setImgName(R.drawable.img3);
ViewItem vi4 = new ViewItem();
vi4.setName("记录账目");
vi4.setImgName(R.drawable.img4);
ViewItem vi5 = new ViewItem();
vi5.setName("记录账目");
vi5.setImgName(R.drawable.img5);
ViewItem vi6 = new ViewItem();
vi6.setName("记录账目");
vi6.setImgName(R.drawable.img6);
listItem.add(vi1);
listItem.add(vi2);
listItem.add(vi3);
listItem.add(vi4);
listItem.add(vi5);
listItem.add(vi6);
}

public int getCount() {
// TODO Auto-generated method stub
return listItem.size();
}

public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
}

public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}

public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
View view = inFlater.inflate(R.layout.gv_item, null);
TextView tv = (TextView) view.findViewById(R.id.gv_item_appname);
ImageView iv = (ImageView) view.findViewById(R.id.gv_item_icon);

tv.setText(listItem.get(arg0).getName());
iv.setImageResource(listItem.get(arg0).getImgName());

return view;
}

}

配置适配器,并且将xml转化成视图处理。

继承BaseAdapter,并且实现里面的方法。

3.修改主布局文件类


public class AccountMain extends Activity {
/** Called when the activity is first created. */
private GridView gv;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 去除title
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.main);

gv = (GridView) this.findViewById(R.id.gv_apps);

gv.setAdapter(new GridViewAdapter(AccountMain.this));
}
}

先是实例化GridView,然后将对应的适配器信息传入,这样就得到了上面的效果!

其中ImageButton的属性android:src如果设置的图片较大则全部显示,解决的办法是要么用android:background,要么干脆换成ImageView。

这只是其中的一个界面的演示,这块的init部分可以再做进一步的处理,可以做动态的配置。

可以将配置信息配置到配置文件中或者将对应信息配置到数据库中,即SQLLite中。

[转载]分享13款非常有用的 jQuery 插件

mikel阅读(992)

[转载]分享13款非常有用的 jQuery 插件 – 梦想天空(山边小溪) – 博客园.

JQuery 是一个非常优秀的 JavaScript 框架,使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入一些非常好的效果。这篇文章与大家分享13款非常有用的 JQuery 插件。

ImageLens: a jQuery plug-in for Lens Effect Image Zooming
Image Len 是一款用于为图片添加镜头放大效果的 jQuery 插件。

Javascript-306 in Useful JavaScript and jQuery Tools, Libraries, Plugins

diagonalFade jQuery plugin
Diagonal fade 是一款易于定制淡入、淡出、方向及其它组合选项的 jQuery 插件,适合用于显示分组元素。

Javascript-308 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Lettering.js – A jQuery Plugin for Radical Web Typography
Lettering 是一款用于实现激进的网页排版的 jQuery 插件,可以帮助你在网站中加入丰富多彩的文字效果。

Javascript-160 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Wijmo jQuery UI Widgets
Wijmo 是一个功能很强大的图表插件。

Javascript-267 in Useful JavaScript and jQuery Tools, Libraries, Plugins

sausage.js
Sausage 是一款实现内容分页的 jQuery 插件。

Javascript-283 in Useful JavaScript and jQuery Tools, Libraries, Plugins

jQuery Waypoints
Waypoints 可以帮助你很容易的实现滚动到某个元素的时候执行某项功能,根据用户拖动滚动条的位置来实现特定的布局模式。

Javascript-234 in Useful JavaScript and jQuery Tools, Libraries, Plugins

jslide
jslide 是一款为列表元素添加滑动效果的 jQuery 插件。

Javascript-201 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Isotope: A jQuery Plugin for Magical Layouts
Isotope 是一款精致的 jQuery插件,用于创建单纯用 CSS 无法实现的智能的、动态的布局,非常强大。

Javascript-131 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Better Check Boxes with jQuery and CSS
一款简单的实现替代浏览器默认选择框的jQuery插件,可以帮助你丰富表单的表现形式,在JavaScript失效的时候回恢复为默认控件。

Javascript-286 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Thumbnails Navigation Gallery with jQuery
一个很漂亮的全屏滚动相册,效果很好的滑动导航。

Javascript-270 in Useful JavaScript and jQuery Tools, Libraries, Plugins

DataTables (table plug-in for jQuery)
一款很灵活的基于 jQuery 编写的数据表格插件。

Javascript-262 in Useful JavaScript and jQuery Tools, Libraries, Plugins

jQuery Tags Input
一款基于 jQuery 编写的很棒的标签输入插件。

Javascript-274 in Useful JavaScript and jQuery Tools, Libraries, Plugins

jquery.timepickr.js
一款实现方便的日期选择的 jQuery 插件。

Javascript-224 in Useful JavaScript and jQuery Tools, Libraries, Plugins

[转载]Asp.net MVC3.0 入门指南 6 审视编辑方法和视图

mikel阅读(899)

[转载]Asp.net MVC3.0 入门指南 6 审视编辑方法和视图 – cn_大斌哥 – 博客园.

在这一节中,您将审视movie控制器生成的响应方法和视图。然后您将添加

一个自定义搜索页面。

运行程序并通过在URL追加/Moives浏览movie控制器。把鼠标悬停在Edit

链接上,看看它执行的URL.

Edit的链接由视图Views\Movies\Index.cshtml Html.ActionLink方法生成。

@Html.ActionLink("Edit", "Edit", new { id=item.ID })

Html对象是一个助手,它是WebViewPage基类暴露的属性。助手的ActionLink方法可以很容易的生成

HTML超级链接,它指向控制器的响应方法。ActionLink的第一个参数超级链接的文本呈现(比如:

<a>Edit Me</a>),第二个参数是要调用的响应方法的名称,最后一个参数生成路由数据的匿名对象

anonymous object,这里指ID=4)。

您可以使用查询字符串(query string)传递参数给响应方法。比如URL

http://localhost:xxxxx/Movies/Edit?ID=4传递ID=4给Movies控制器的Edit方法。

打开Movies控制器。有两个Edit方法,如下所示:

//
// GET: /Movies/Edit/5

public ActionResult Edit(int id)
{
Movie movie = db.Movies.Find(id);
return View(movie);
}

//
// POST: /Movies/Edit/5

[HttpPost]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}

注意第二个Edit方法前面是HttpPost属性。它表明这个重载的Edit方法只能被POST

请求调用。您也可以给第一个Edit方法采用HttpGet属性,但是这不是必须的,应为

方法默认为HttpGet(响应方法隐含的了HttpGet属性将被认为是HttpGet方法)。

HttpGet方法将电影的ID作为参数,并使用实体框架的Find方法查找电影,然后返回被找

到的电影给视图模板。当架构体系创建编辑模板是,它检查Movie类并为每个属性生成

代码去呈现<label><input>元素。下面的代码展示了自动生成的Edit视图模板:


注意第二个Edit方法前面是HttpPost属性。它表明这个重载的Edit方法只能被POST

请求调用。您也可以给第一个Edit方法采用HttpGet属性,但是这不是必须的,应为

方法默认为HttpGet(响应方法隐含的了HttpGet属性将被认为是HttpGet方法)。

HttpGet方法将电影的ID作为参数,并使用实体框架的Find方法查找电影,然后返回被找

到的电影给视图模板。当架构体系创建编辑模板是,它检查Movie类并为每个属性生成

代码去呈现<label><input />元素。下面的代码展示了自动生成的Edit视图模板:</label>

@model MvcMovie.Models.Movie

@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<script src="@Url.Content(" type="text/javascript"></script> <script src="@Url.Content(" type="text/javascript"></script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset> <legend>Movie</legend>@Html.HiddenFor(model =&gt; model.ID)
<div class="editor-label">@Html.LabelFor(model =&gt; model.Title)</div>
<div class="editor-field">@Html.EditorFor(model =&gt; model.Title)
@Html.ValidationMessageFor(model =&gt; model.Title)</div>
<div class="editor-label">@Html.LabelFor(model =&gt; model.ReleaseDate)</div>
<div class="editor-field">@Html.EditorFor(model =&gt; model.ReleaseDate)
@Html.ValidationMessageFor(model =&gt; model.ReleaseDate)</div>
<div class="editor-label">@Html.LabelFor(model =&gt; model.Genre)</div>
<div class="editor-field">@Html.EditorFor(model =&gt; model.Genre)
@Html.ValidationMessageFor(model =&gt; model.Genre)</div>
<div class="editor-label">@Html.LabelFor(model =&gt; model.Price)</div>
<div class="editor-field">@Html.EditorFor(model =&gt; model.Price)
@Html.ValidationMessageFor(model =&gt; model.Price)</div>
<input type="submit" value="Save" /></fieldset>
}
<div>@Html.ActionLink("Back to List", "Index")</div>

form>中的<input>元素别用来回传页面到电影的编辑地址/Movies/Edit

当点击Edit按钮时,页面的数据被回传到服务器。

处理POST请求

由架构体系生成的属性为HttpGet的Edit方法没有检查传给它的ID的有效性。

如果用户删除URL的ID片段,错误信息如下所示:

用户还可以传递一个不存在的ID,比如:http://localhost:xxxxx/Movies/Edit/1234.您可以给

HttpGet Edit方法做两点修改来限制URL。首先,把ID参数改为默认值为0 (id不是必须传递)。

您也可以在回传电影对象给视图模板之前,检查Find方法是否真正的找到了电影信息。

public ActionResult Edit(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}

如果没有找到,HttpNotFound方法被调用。

所有的HttpGet方法都遵循类似的模式。它们获取一个电影对象(在Index中返回对象列表),

然后传递模型给视图。Create方法传递一个空电影对象给Create视图。所有的方法(创建、

编辑、删除)都有一个HttpPost的重载方法

在HTTP GET方法中修改数据存在安全风险,在博客

ASP.NET MVC Tip #46 – Don’t use Delete Links because they create Security Holes

中有描述。在HTTP GET方法中修改数据违反了HTTP的最佳实践REST架构模式(其中规定,

GET请求不应改变应用程序状态)。换句话,执行GET操作应该是一个无副作用的安全操作。

下一节:ASP.NET MVC3.0 入门指南 7 展示查找页面

微笑

原文网址:http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part6-cs

[转载]SQL存储过程解密研究

mikel阅读(921)

[转载]SQL存储过程解密研究 – flysoul – 博客园.

从网上搜索SQL存储过程解密,可以看到一大堆的资料,其内容都基本上都一致,这是先放上一篇:
解密存储过程
本文将以此为基础进行研究,虽能解密成功,但其中解密那一段究其原理是到底是什么,一直也弄不明白,望了解内情的朋友告知。
先谈问题:
网上得来的存储过和经试验存在几个问题:
1、并没有删除原存储重建,仅仅在控制台做了一个输出,拷贝出来很不方便。
2、对于长度大点的加密数据会解密失败。
带着这两个问题来改造此存储过程。

先做准备工作,首先需要知道DAC这么个东西, 指的是数据库专用管理员连接,为管理员提供的一种特殊的诊断连接。
知道了后得先打开它,以SQL2008为例:
右击“对象浏览器”,找到“Facets”,点击,如图:

找到“Sruface Area Configuration”,选择“RemoteDacEnabled”,设为True:

然后进行DAC登录,CMD模式下敲如下命令,不清楚原理的可以自行研究:
sqlcmd -A -S 192.168.1.101 -U sa -P 123456
命令提示行下打开需处理的数据库:
>USE TEST
>GO

准 备就绪,复制搜索得到的存储过程(这里有些语法问题,做些小调整即可),生成解密存储程,然后我们准备两个加密后的存储过程,其中一个长度较大(可自行循 环创建一个500行的存储程,本文不再提供),验证得出结论,短小的存储过程很快即解密成功,并输出,但长度较大的却解密失败。
接下来看看其如何解密的:
先看这句
select @maxColID = max(subobjid),@intEncrypted = imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure)
指的是加密后的数据存放在“sys.sysobjvalues”表中,其内容存放于“imageval”字段。

知道了加密后的数据,就得进行解密,它定义了4个关键字段:
DECLARE @real_01 nvarchar(max)
DECLARE @fake_01 nvarchar(max)
DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @real_decrypt_01 nvarchar(max)
分别指的原始加密数据内容、原始加密存储过程的CREATE语句、自己构造的假的存储过程加密后的数据、最终解密后的存储过程。
其方法是按位将@real_01、@fake_encrypt_01、@real_decrypt_01进行异或运算,此处为何如此处理,原理不明!!!
WHILE @intProcSpace<=(datalength(@real_01)/2)
BEGIN
–xor real & fake & fake encrypted
SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1, NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^ (UNICODE(substring(@fake_01, @intProcSpace, 1)) ^ UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))
SET @intProcSpace=@intProcSpace+1
END
实际上到此为止,加密后的存储过程已解密出来了。

其下面还有一大段语句没有仔细研究,但基本上是利用sp_helptext将内容输出,方法比较繁索,而且没有达到我们要的效果,我们将换一种方法进行输出。
基本上就这么简单,除了原理不清楚外,基本上已达到要求,接下来要解决开始提出的两个问题。
首先是长度问题,为什么长度一大就解密失败,来看看@real_decrypt_01的定义并进行初始化@real_decrypt_01的语句:
DECLARE @real_decrypt_01 nvarchar(max)
SET @real_decrypt_01 = replicate(N’A’, (datalength(@real_01) /2 ))
乍 一看没什么问题,但我们使用LEN(@real_decrypt_01)输出看看,最大输出长度为4000,可能问题就出现NVARCHAR的长度上了, 理论上NVARCHAR(MAX)支持2G的大小。为什么会出现这种情况没有研究过,但有人给出了解决方法,进行显示转换:
SET @real_decrypt_01 = replicate(CONVERT(NVARCHAR(MAX), N’A’), (datalength(@real_01) /2 ))
其它的几还有几处也是该原因,改正后进行重新运行,问题解决,长度较大的存储过程也解密成功。

第一个问题解决了,如何能方便的输出呢,试验了删除重建,但未成功,那么就用最简单的方法吧,利用xp_cmdshell将内容输出到文本。
先建立一个物理表,用于存储解密后的数据:

CREATE TABLE [dbo].[SQL_DECODE](
[ID] [int] IDENTITY(1,1) NOT NULL,
[SQLTEXT] [nvarchar](max) NOT NULL,
CONSTRAINT [ID] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
) ON [PRIMARY]

GO

然后建立一个存储过程,遍历所有加密过的存储过程,调用解密存储过程进行解密,解密后输出:

CREATE PROCEDURE [dbo].[DECODE_DATABASE]
AS
SET NOCOUNT ON
BEGIN

DECLARE @PROC_NAME VARCHAR(256)
SET @PROC_NAME = ''
DECLARE @ROWS INT
DECLARE @TEMP TABLE(
NAME VARCHAR(256)
)
INSERT INTO @TEMP SELECT NAME FROM sysobjects WHERE TYPE = 'P'
AND NAME NOT IN (
'DECODE_DATABASE', 'DECODE_PROC'
)
SET @ROWS = @@ROWCOUNT
WHILE @ROWS &gt; 0
BEGIN
SELECT @PROC_NAME = NAME FROM (
SELECT ROW_NUMBER() OVER (ORDER by NAME) AS ROW, NAME FROM @TEMP
) T
WHERE ROW = @ROWS
EXEC [DECODE_PROC] @PROC_NAME
PRINT @PROC_NAME
SET @ROWS = @ROWS - 1
END

RETURN

EXEC master..xp_cmdshell 'bcp "SELECT [SQLTEXT] FROM TEST.dbo.[SQL_DECODE]" queryout C:\decode.txt -c -T -S PC2011043012JUJ'
END

GO

最后是改造后的存储过程:

CREATE PROCEDURE [dbo].[DECODE_PROC](
@PROC_NAME SYSNAME = NULL
)
AS
SET NOCOUNT ON

DECLARE @PROC_NAME_LEN INT --存储过程名长度
DECLARE @MAX_COL_ID SMALLINT --最大列ID
SELECT @MAX_COL_ID = MAX(subobjid) FROM sys.sysobjvalues WHERE objid = OBJECT_ID(@PROC_NAME) GROUP BY imageval

SELECT @PROC_NAME_LEN = DATALENGTH(@PROC_NAME) + 29
DECLARE @REAL_01 NVARCHAR(MAX) --真实加密存储过程数据
DECLARE @FACK_01 NVARCHAR(MAX) --修改为假的存储过程,长度(40003 - 存在过程名长度),原理不明?
DECLARE @FACK_ENCRYPT_01 NVARCHAR(MAX) --伪加密存储过街程数据
DECLARE @REAL_DECRYPT_01 NVARCHAR(MAX) --最终解密后的数据,初始化为原始加密长度的一半的“A”,原理不明?

SET @REAL_01 = (
SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@PROC_NAME) AND valclass = 1 AND subobjid = 1
)

DECLARE @REAL_DATA_LEN BIGINT
SET @REAL_DATA_LEN = DATALENGTH(@REAL_01)
--PRINT @REAL_DATA_LEN

DECLARE @FACK_LEN BIGINT
SET @FACK_LEN = @REAL_DATA_LEN * 10 --改造:假的长度在原真实数据长度上放大10倍

--此处需将NVARCHAR显示转换成NVARCHAR(MAX),不然将只能产生4K长度
SET @FACK_01 = 'ALTER PROCEDURE ' + @PROC_NAME + ' WITH ENCRYPTION AS ' + REPLICATE(CONVERT(NVARCHAR(MAX), '-'), @FACK_LEN - @PROC_NAME_LEN)
--PRINT '@FACK_01 = ' + STR(LEN(@FACK_01))
EXECUTE (@FACK_01)
SET @FACK_ENCRYPT_01 = (
SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@PROC_NAME) AND valclass = 1 AND subobjid = 1
)

SET @FACK_01 = 'CREATE PROCEDURE ' + @PROC_NAME + ' WITH ENCRYPTION AS ' + REPLICATE(CONVERT(VARCHAR(MAX), '-'), @FACK_LEN - @PROC_NAME_LEN)
SET @REAL_DECRYPT_01 = REPLICATE(CONVERT(NVARCHAR(MAX), N'A'), (DATALENGTH(@REAL_01) /2))
--PRINT 'LEN(@REAL_DECRYPT_01) = ' + STR(LEN(@REAL_DECRYPT_01))

--按位对 @REAL_01、 @FACK_01、 @REAL_DECRYPT_01 进行异或操作。
DECLARE @INT_PROC_SPACE BIGINT
SET @INT_PROC_SPACE = 1
WHILE @INT_PROC_SPACE &lt;= (DATALENGTH(@REAL_01) /2 )
BEGIN
SET @REAL_DECRYPT_01 = STUFF(
@REAL_DECRYPT_01,
@INT_PROC_SPACE,
1,
NCHAR(UNICODE(SUBSTRING(@REAL_01, @INT_PROC_SPACE, 1)) ^ (UNICODE(SUBSTRING(@FACK_01, @INT_PROC_SPACE, 1)) ^ UNICODE(SUBSTRING(@FACK_ENCRYPT_01, @INT_PROC_SPACE, 1))))
)
SET @INT_PROC_SPACE = @INT_PROC_SPACE + 1
END

--移除WITH ENCRYPTION
SET @REAL_DECRYPT_01 = REPLACE(@REAL_DECRYPT_01, 'WITH ENCRYPTION', '')
INSERT INTO [SQL_DECODE] VALUES (@REAL_DECRYPT_01)

--PRINT '@REAL_DECRYPT_01 = ' + @REAL_DECRYPT_01
--PRINT 'LEN(@REAL_DECRYPT_01) = ' + STR(LEN(@REAL_DECRYPT_01))

--删除原存储过程
SET @FACK_01 = 'DROP PROCEDURE ' + @PROC_NAME
EXEC(@FACK_01)

GO

至此,解密全过程大功告成,命令行模式下运行:
>EXEC [DECODE_DATABASE]
>GO
在C盘根目录下,解密后的存储过程文本生成成功。
运行前别忘记打开xp_cmdshell使用权限,同打开DAC一样:

或者命令行模式下敲如下命令:
>sp_configure ‘show advanced options’,1
>reconfigure
>go
>sp_configure ‘xp_cmdshell’,1
>reconfigure
>go

[转载]推荐19个很有用的 JavaScript 库

mikel阅读(960)

[转载]推荐19个很有用的 JavaScript 库 – 梦想天空(山边小溪) – 博客园.

流行的 JavaScript 库有JQuery,MooTools,Prototype,Dojo和YUI等,这些 JavaScript 库功能丰富,加上它们众多的插件,几乎能实现任何你需要的功能,然而需要实现一些特定的功能,则可以选择功能更专一的轻量库,今天这篇文章与大家分享16 个很有用的 JavaScript 库。

Blackbird: Open Source JavaScript Logging Utility
Blackbird 是一款非常酷的 JavaScript 调试工具,带有一个漂亮的界面显示和过滤调试信息。

Javascript-199 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Treesaver.js
Treesaver 是一个用于创建杂志布局的 JavaScript 框架。

Js-001 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Bibliotype
Bibliotype 是一个简单的基于 HTML、CSS 和 JS ,用于快速原型制作的的框架。

Useful-tool-127 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Highcharts – Interactive JavaScript charts
Highcharts 是一个纯 JavaScript 编写,用于生产交互式图表的 JavaScript 库。

Javascript-264 in Useful JavaScript and jQuery Tools, Libraries, Plugins

jStat: a JavaScript statistical library
Stat是一个采用JavaScript开发的统计工具包,可以让你执行高级统计操作,而不需要专门的统计语言。

Js-007 in Useful JavaScript and jQuery Tools, Libraries, Plugins

highlight.js
Highlight.js 是一个用于高亮显示程序代码的 JavaScript 库,简单易用。

Javascript-268 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Respond.js: Fast CSS3 Media Queries for Internet Explorer 6-8 and More
这个快速、轻量的库用于让IE6-8支持 CSS3 Media Queries,是一种让网页支持小屏幕设备显示的特性。

Javascript-154 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Underscore.js
Underscore 是一个实用的JavaScript工具库,提供了类似 Prototype 功能的编程支持,但没有对 JavaScript 内置的对象进行扩展。

Javascript-279 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Popcorn.js
Popcorn.js 是一个HTML5 Video框架,它提供了易于使用的API来同步交互式内容。

Javascript-315 in Useful JavaScript and jQuery Tools, Libraries, Plugins

SlickGrid!
SlickGrid 是一个用于构建简单的、快速、灵活的表格的库。

Js-004 in Useful JavaScript and jQuery Tools, Libraries, Plugins

JavaScript InfoVis Toolkit
The JavaScript InfoVis Toolkit 用于创建交互的可视化数据。

Javascript-237 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Handlebars.js: Minimal Templating on Steroids
Handlebars 是一个 JavaScript 页面模板库,帮助你轻松的构建语义化模板。可参考ThinkVitamin的文章 Getting Started with Handlebars.js

Javascript-280 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Backbone.js
Backbone.js 是一个 JavaScript MVC 应用框架,通过Models进行key-value绑定及自定义事件处理。

Javascript-313 in Useful JavaScript and jQuery Tools, Libraries, Plugins

OpenFaces
OpenFaces 是一个包含AJAX-powered JSF组件库,一个Ajax框架和一个客户端校验框架的开源框架,它源于QuipuKit并增加了一些新的组件和特性。

Js-009 in Useful JavaScript and jQuery Tools, Libraries, Plugins

d3.js
D3 可以让你绑定任何数据到文档对象模型(DOM),然后再应用数据驱动传递给文档。

Javascript-238 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Visual Event JS Library
Javascript 是事件驱动的语言,这个可视化事件库用于帮助你追踪事件。

Js-005 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Tempo: JSON rendering engine
Tempo 节奏是一个小的JSON渲染引擎,让你使用纯HTML就可以构建数据模板。

Js-002 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Art Deco – Selectable Text
实现字母分离效果的库,保留了文本能被选择的特性。

Javascript-153 in Useful JavaScript and jQuery Tools, Libraries, Plugins

Using Less.js to Simplify Your CSS3
LESS 是一个扩展CSS,让其拥有动态语言特性的库。

Javascript-175 in Useful JavaScript and jQuery Tools, Libraries, Plugins

[转载]android 打包自己的自定义组件成JAR包

mikel阅读(792)

[转载]android 打包自己的自定义组件成JAR包 – Terry_龙 – 博客园.

在项目开发过程中,我们难免会用到自己去制作自定义的VIEW控件,之后我们别的项目如果需要的话就直接将其复制到对应的项目中使用,虽说这么做是一个解决问题的方法,但毕竟不是很好。

原因是,当我们项目 积累越来越多,会发现自定义的控件越来越多,而且这些自定义的控件都是可以重复利用的,这时我们可以想想,如果把这些自定义控件都封装成一个JAR包,然 后用一个项目积累起来,之后我们以后开发项目只要在原来JAR包的基础上做扩展或者直接使用,可以大大减少自己的工作重复性。

首先Android 工程的基本面貌是这样的:

当然对应的Activity 文件被我删除了,因为当编译成jar 包我们并不需要Activity 文件。

以上面这个工程为例,我们将它打包成JAR包步骤为:

右键工程选择导出:

选择导出目标为:java->JAR文件:

把一些不必要的文件勾选掉,如下图:

到了这一步,己经基本完成,浏览选择jar 文件导出路径即可。

导出完成后,我们就可以像使用其他JAR文件一样使用我们自己的自定义控件包了。下面给出一个小DEMO介绍如何使用这个JAR包。

步骤一:

新建文件夹lib,将jar 包放入。

步骤二:

关联JAR包,如下图:

步骤三,使用JAR包:

如下代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:gif="http://schemas.android.com/apk/res/com.terry.jarTest" 
    android:id="@+id/layout" android:orientation="vertical"
    android:layout_width="fill_parent" android:layout_height="fill_parent">



    <Button android:text="停止" android:id="@+id/Button01"
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    <Button android:text="开始" android:id="@+id/Button02"
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>



    <com.terry.gif.TypegifView
        android:layout_width="fill_parent" android:id="@+id/gifView1"
        gif:stop="true" android:layout_height="wrap_content" 
        gif:delay="1"></com.terry.gif.TypegifView>



</LinearLayout>

有一个不好的就是如果你项目中存在使用属性,必须也把属性一起复制到你要使用的项目中,要不然会识别不了。

[转载].NET简谈平台大局观

mikel阅读(952)

[转载].NET简谈平台大局观 – 南京.王清培 – 博客园.

在很久以前,我刚开始接触.NET的时候,总是搞不清楚.NET与 VisualStudio之间的关系,我开发的东西是怎么样层层流转最终形成可执行文件的;这样的疑惑一直困扰着我,我想也困扰着许许多多刚接触.NET 的开人员;尽管在学校的学生学过编译原理、操作系统等等计算机原理方面的理论知识;但是就是无法将这股力量用到实实在在的理解上;下面本人就简谈一 下.NET中的主要核心东西:高级语言(C#,VB.NET,J#等)、编译器、CLR引擎、VisualStudio系列工具等等之间是如何协调工作 的,这样的理解有利于我们自己在开发软件项目的时候可以借鉴一下好的思想(如:文档对象模型、脚本引擎等等),好的实现方式,这里不存在具体的设计模式, 这篇文章所讲的类容以具体的模块划分如何协调工作为主,针对初学者而言;

.NetFramwork是一个技术框架的统称,在这个框架里面是一系列为了实现软件开发而具有的所有支撑;

1:

这个图很简单没有给出复杂的部件,说明意思就行;在最上层就是我们直接使用的高级语言,有C#、VB等,但是这些语言各不相同,要想让CLR引擎去 执行,必须遵守一致的预定,就是微软中间语言,微软中间语言已经成为ISO公开标准,以后会有越来越多的第三方的语言可以在.NET平台开发软件了;各个 语言是有不同厂商开发的,所以必须提供语言的编译器,通过编译器将高级代码编译成标准的微软中间代码,CLR只认识中间代码(更确切的说应该是JIT认 识);CLR加载中间代码并且调用及时编译器将其编译成本地代码,这样才能做到跨平台的作用;每个电脑的配置上不同的,CPU结构、内存结构等等都不一 样,所以用IL语言传递,最终运行的时候再编译成本地代码;在具体的东西已经超出本章的范围;

整个的实现过程大致是这样的,我们来介绍VisualStudio工具是干嘛的,在没有开发工具之前程序员都是在黑屏上编码的,工具是一些前辈门用心血编写出来的软件,让我们能在这个工具上开发;那工具在整个过程中扮演着什么角色呢?

2:

工具本身的作用就是减轻我们程序员的编码工作,大大提高了开发效率;以可视化的方式展现复杂的处理过程,这就是IDE集成开发环境;初学者在刚开始 学习.NET的时候,可能会被工具迷惑,以为VisualStudio工具就是装了.NET框架,希望通过本文章能帮助你理清头绪;