[转载]Vtemplate模板引擎的使用心得 - 黄岛主 - 博客园

mikel阅读(1200)

[转载]对kingthy创作的Vtemplate模板引擎的使用心得 – 黄岛主 – 博客园.

首先,还是要真心的感谢kingthy能为我们提供Vtemplate这么一款优秀的模板引擎…

本篇文章主要记录自己对该模板引擎的初次的体会.  如果各位看官觉得有问题,欢迎指出..

(注:此类模板引擎和我们.net程序员经常接触的.aspx这套引擎针对的场景一般有些区别,所以暂且不谈与.aspx的比较)

在使用过程中,暂且觉得Vtemplate至少有以下几个明显的优势:

1.>语法简单,基本上能接受html标签就可以接受该模板引擎的大部分控制元素.(这一点有时相当重要,因为用户不都是懂后台的程序员)

2.>开源,代码可读性强.(本人不是什么牛人,但稍微接触一段时间后,即可从标签基类派生一些自定义的标签)

3.>性能良好,可维护性强(记得部分开源产品,对标签,属性的处理是每一个都进行全文的正则表达式处理,来回倒腾)

4.>支持文档丰富,也存在QQ群.

下面举一个自己扩展的例子:

a.>来自织梦的一个标签应用示例:

{dede:booklist row=’12’ booktype=’-1′ orderby=’lastpost’ author=” keyword=”}//织梦的用户很多,习惯这种简单的调用.也是我的目标
<a href='[field:bookurl /]’>[field:bookname /]</a><br />
{/dede:booklist}

b.>来自Vtemplate的类似标签应用示例(系统默认的方案)

<vt:function var=”hotlinks” method=”GetLinkList” type=”$testLinkListObject” args=”4″ />//声明变量并规定值得获取方式
<vt:foreach from=”$hotlinks” item=”link”>
<a href='{$#.link.url}’>{$#.link.name}</a>&nbsp;&nbsp;&nbsp;
</vt:foreach>

c.>利用Vtemplate提供的重写与派生,改造后的标签应用示例

<vt:linklist  rows=”2″ item=”link”>   //可以让用户不考虑使用哪个类的实例,哪个方法,以及单独定义一个function区域规定foreach的from变量.
<a href='{$#.link.url}’>{$#.link.name}</a>&nbsp;&nbsp;&nbsp;
</vt:linklist>

刚开始以为很复杂,后来稍微看了Vtemplate作者的源代码,发现,其实系统已经给我们提供了很多。我们要做的基本上就是如下所述:

1.>在TagFactory.FromTagName方法中加上一个switch的case,返回你的一个自定义Tag类的实例.

2.>假设你要给书本定义个标签,因为书本有作者,价格,出版社这些信息,所以标签就会有这些属性.你可以在booklist标签中定义.

这个booklist需要继承自Tag.   一般情况下,为了圈定呈现的范围,我们这标签肯定是有结为标签的,重写IsSingleTag为false.

3.>迭代属性定义中,你可以参考foreach标签,保留其中的Item,Index,这两个会在循环用到的.

4.>在呈现标签元素的方法RenderTagData中,你可以把foreach中取自From规定变量的值改为自己实现的一个对象,这个对象应该实现

IEnumerable接口.

接下来你可以测试了,你会发现无论定使用几次,这个自定义的标签,都会工作良好,不过请注意其中的item属性不可少. .

[转载]基于Web开发的甘特图控件,支持Java、.Net - MiniUI技术博客 - 博客园

mikel阅读(1102)

[转载]基于Web开发的甘特图控件,支持Java、.Net – MiniUI技术博客 – 博客园.

普加甘特图是WEB甘特图首选解决方案。适用于构建项目管理、生产排程等进度计划管理软件。支持任意开发平台和数据库。它是JavaScript开发的,无需安装插件,跨浏览器运行。

 

功能特性:

 

  • JavaScript实现,无需安装插件
  • 支持Java、.Net、Php等服务端,支持任意数据库
  • 能与JQuery、ExtJS、YUI、Dojo等第三方框架无缝集成
  • 兼容IE6+、FireFox、Chrome、Safari等主流浏览器
  • 支持导入、导出微软Project项目文件

 

网站地址:

    http://www.plusgantt.com

主要功能:

普加甘特图能高性能显示大数据量,支持懒加载数据,支持自定义列,支持外观自定义,支持单元格编辑和条形图拖拽等操作,支持丰富的时间刻度,自定义右键菜单,并能轻松实现多国语言本地化。

 

高性能显示大数据量普加甘特图能在一次性快速显示成千上万条数据,突破其他甘特图只能显示少量数据的瓶颈。
这点对于WEB环境,有特殊的重要意义。
使得普加甘特图,不仅仅能成为图表、报表式的甘特图应用,也能满足大数据应用系统的苛刻需要。
从而保证不会出现初期少量数据运行正常,中后期数据量增长,导致甘特图无法正常工作的恶劣状况!

强大的数据处理功能普加甘特图提供丰富的数据操作API:

  • 增加、删除、修改、移动任务
  • 升级、降级任务
  • 排序
  • 过滤
  • 选择
  • 遍历任务
  • 折叠、展开任务

自定义外观您可以使用熟悉的html和css技术,对如下部位做外观自定义:

  • 表头
  • 单元格
  • 横道图
  • 提示框
  • 箭头连线
  • 摘要任务
  • 里程碑任务
  • 比较基准

可编辑性控制可以精确控制单元格编辑、横道图拖拽的操作细节,如:

  • A行可编辑,B行不可编辑
  • A列可编辑,B列不可编辑
  • A类单元格可编辑,B类单元格不可编辑
  • 横道图的进度可调整,但是不可移动,不可调整完成日期
  • A权限用户可以编辑,B权限用户只读。
  • 等等…

自定义列可以给甘特图扩展任务属性,并以列的形式显示和编辑。普加甘特图支持如下数据类型的列:

  • String。字符串。
  • Number。数字。
  • Boolean。布尔值。
  • Date。日期。
  • Array。单选数组。
  • Array。多选数组。
  • Array。树形选择。

显示、隐藏列在甘特图运行时,可以动态控制列的显示和隐藏。
这一点在不同角色用户访问同一页面的时候尤其有用。可以让高权限的人看所有列,低权限的人看少量列。

单元格编辑普加甘特图支持多种类型的编辑器:

  • TextBox:文本编辑器。
  • NumberBox:数字编辑器。
  • CheckBox:复选框编辑器。
  • DateBox:日期编辑器。
  • ComboBox:下拉选择框编辑器,支持单选、多选。
  • ComboTree:树形下拉框编辑器。
  • 其他:ComboGrid、ComboTreeGrid、AutoComplete、TextBoxList等。

 

 

横道图拖拽普加甘特图支持横道图拖拽调整数据的方式:

  • 开始日期。
  • 完成日期。
  • 进度。


懒加载数据
第一次只加载少量数据,这样页面刷新和显示会非常快。点击任务的”+”号后,动态从服务端加载下一级数据,显示更多数据信息。


丰富的时间刻度
普加甘特图支持丰富时间刻度:年、半年、季度、月、周、日、时、分、秒。默认显示周、日刻度。
您可以在显示甘特图时,将时间刻度调整到任意单位。
并且,普加甘特图还支持时间刻度的放大、缩小功能。

右键菜单普加甘特图支持右键菜单的快捷操作。您可以完全自定义右键菜单项是否显示、是否禁用。
并可在甘特图不同位置,显示不同的右键菜单:

  • 表格头部
  • 表格内容区
  • 横道图头部
  • 横道图内容区

跟踪甘特图跟踪甘特图用于显示计划任务与实际任务,用来比较实际完成和计划完成之间的差距。

支持4种任务关系普加甘特图支持如下4种任务关系:

  • SS:开始-开始。
  • SF:开始-完成。
  • FF:完成-完成。
  • FS:完成-开始。

显示关键路径普加甘特图根据您的关键任务设置,轻松显示关键路径。

关键路径
多国语言本地化普加甘特图可以轻松实现多国语言本地化,如英语、汉语、日语、德语、法语等任何语言。

跨浏览器运行普加甘特图可以在IE6+、FireFox、Opera、Chrome、Safari等所有主流浏览器运行。

跨开发平台和数据库普加甘特图是纯JavaScript控件,与后台无关。所以可以支持任意的.Net、Java、PHP、ASP等开发平台,以及Oracle、MySQLSQLServer、DB2等数据库。

与第三方JS框架无缝集成 普加甘特图有良好的架构设计和代码隔离机制,能轻松与JQuery、ExtJS、YUI、Prototype.js等无缝集成。

 

[转载]java full-stack 框架 - Eric小怪物 - 博客园

mikel阅读(1044)

[转载]java full-stack 框架 – Eric小怪物 – 博客园.

2005年ruby on rails横空出世般的流行刺激了Java开源框架整合的大趋势,ruby on rails这个号称“full-stack”的框架能做的我们都能做,它就是整合的更好,省略了配置文件,提供了快速代码生成器,暂且不论ruby on rails本身,但是诸多Java开发人员把目光从只做好一件事情上面挪到了“提供最方便的full-stack框架”上面,因此我们可以看到整个 Java开源社区雨后春笋般的出现了一批又一批的full-stack框架,Java社区的开源软件哲学已经修改为:“要做最方便好用的full- stack框架”,那么就让我们来一一细数这些full-stack框架吧:

一、RIFE
最老牌的Java full-stack框架,作者Geert Bevin颇为不屑ruby on rails,和ruby on rails作者DHH有过对骂的战斗经验,8月份RIFE发布了1.5版本,提供了更多更方便的功能和更加简化的开发。RIFE功能相当完善,在 Continuations方面颇有独到之处,但是RIFE独辟蹊径,整个解决方案不与现有任何流行开源框架相同,采用RIFE需要一些勇气。

二、Grails
最 像ruby on rails的Java full-stack框架,Grails即Groovy on rails的意思,采用Java动态脚本语言groovy来写程序,底层实现采用Hibernate/Spring/SpringMVC/JSTL,即 groovy的脚本语言在运行期动态生成Hibernate/Spring的Java编译好的字节码。8月份Grails发布了最新的0.2.1版本,在 可用性的道路上又向前进了一步。

三、JBoss Seam
最正宗的Java full-stack框架。JBoss Seam整合了EJB3,Hibernate3,JSF,JBPM等框架,主持大局者是Hibernate作者Gavin King,Seam提供了一个非常简化的完整框架。说Seam最正宗是因为Seam采用的EJB3,JSF等技术都是Java EE5规范的官方技术,可谓系出名门。

四、Trails
最强调领域模型驱动的Java full-stack框架。Trails是Hibernate,Spring和Tapestry框架的整合版本,鉴于Tapestry是一个组件驱动的 Web框架。Trails非常强调以领域模型来驱动快速开发。这是一个值得Tapestry爱好者使用的Java full-stack框架。

五、Able
最 不甘寂寞的Java full-stack框架。这是8月份刚刚发表的新框架,Able的作者是前Webwork,现Struts2.0的主开发人员Patrick Lightbody。Pat同学也是一个对ruby on rails颇为不屑的人,曾经和RIFE作者Geert Bevin一唱一和的对战过DHH。Pat一边忙于开发Struts2.0,一边不甘寂寞的推出了Able框架,这是一个整合了 Webwork,Spring和iBATIS的框架,但是对Webwork进行了大幅度简化。

这些成型的full-stack框架,加 上最经典的Java full-stack框架……Hibernate/Spring/Struts组合(或者Hibernate/Spring/Webwork组合),一夜 之间,Java开源世界的full-stack框架如千树万树梨花开,让我们这些Java开发人员挑花了眼,有人说,选择太多,即是Java开发人员之 福,也是Java开发人员之痛,如何挑选适合自己需要的框架,则成为Java开发人员必备的能力之一。

[转载]利用反射动态改变android倒计时类CountDownTimer的回调频率 - 叶秀标 - 博客园

mikel阅读(1040)

[转载]利用反射动态改变android倒计时类CountDownTimer的回调频率 – 叶秀标 – 博客园.

在开发中可能我们会遇到这样的需求,
1,界面上有一个倒计时,当倒计时间剩下不多时,时间开始闪动(颜色红白交替)。如下图:
 
2,当时间马上就要结束时,闪动频率加快,如图(截图后有些不流畅,实际运行时很流畅的):
 
关于需求1,我们用Android自带的倒计时类CountDownTimer很简单地实现,只需要实现抽象类CountDownTimer的两个抽象方法onTick()和onFinish()即可,颜色的话可以用一个标志flag控制交替改变。
代码:
//3分钟后到时,每1秒回调一次onTick()
new CountDownTimer(3 * 60 * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
//在这里改变界面上的时间
}

@Override
public void onFinish() {
//在这里处理时间到了的逻辑
}
}.start();
关于需求2,实现起来有点麻烦。
首先看下CountDownTimer的构造方法:

public CountDownTimer(long millisInFuture, long countDownInterval)
构造CountDownTimer时需传入两个参数,millisInFuture表示倒计时的时长,countDownInterval表示 回调间隔(频率)。每隔countDownInterval秒会回调一次onTick()方法。我们马上想到的是 CountDownTimer应该有个setCountDownInterval()方法,可以改变回调间隔countDownInterval的值。但 是看了CountDownTimer的源码后,没有发现任何可以改变countDownInterval值的方法。而且成员变量 mCountdownInterval是私有的。
这时候我们可能想到以下几种实现方案。
方案1:当时间小于指定值时,设置一个标志flag,实现类根据 这个flag,重新new一个CountDownTimer,并指定新的回调间隔值countDownInterval。但这样实现起来很麻烦,每new 一次倒计时,都得实现CountDownTimer的抽象方法,如果项目中有n个地方用到倒计时,那就得重新写n次,不可取。
方案2:构造CountDownTimer类的时候传入的 countDownInterval值改为原来的一半,然后在代码中控制,如果是正常显示状态则每隔两次调用一次onTick()方法,当需要加快回调间 隔时,每隔一次回调一次onTick()方法,不过这样不太灵活,回调间隔只能是原来的整数倍。而且还得控制标志位flag,也不太可取。
方案3:反射,利用反射动态地改变CountDownTimer类的私有字段mCountdownInterval,这里我抽取成了一个方法,代码如下:
privatevoid changeCountdownInterval(long time) {
    try {
    // 反射父类CountDownTimer的mCountdownInterval字段,动态改变回调频率
    Class clazz = Class.forName("android.os.CountDownTimer");
    Field field = clazz.getDeclaredField("mCountdownInterval");
    field.setAccessible(true);
    field.set(this, time);
    } catch (Exception e) {
        Log.e("Ye", "反射类android.os.CountDownTimer失败: " + e);
    }
}

总结,用方案3的反射实现起来很灵活而且简单,不好的地方是,反射一般尽量少用,因为既然源码将mCountdownInterval定义为私有,而且不暴露修改他的值的方法,就一定有他的原因,以后源码可能会修改私有字段和私有方法,造成反射失效。不过在这里实现方法比较简单灵活,权衡了一下,还是可以使用,最后附上demo ^_^。
http://files.cnblogs.com/yexiubiao/YeCountDownTimer.rar

[转载]让每天变成 26 小时 | 36 氪

mikel阅读(923)

[转载]让每天变成 26 小时 | 36 氪.

Andrew Dumont 是 SEO 软件公司 SEOmoz 客户发展部带头人,他还喜欢写程序。Andrew Dumont 一直在寻找把时间变得更充沛的办法,于是有了这篇文章:我是这样把每天变成 26 小时的。

旧年已逝,新年初升。在这个时候,预测类的文章最喜闻乐见,但我不准备写。这篇文章讲的是时间,时间限制往往是我们达成目标途中最大的羁绊。

每天的时间都不够用,但你可以把时间变得更多吗?当然可以,我不是开玩笑的,不完全是。

24 小时的一天:

7:00am:起床,做早饭,准备上班,查邮件,喝咖啡
8:45am:到公司上班
5:30pm:下班
5:45:锻炼身体
6:30:吃晚饭
7:30:写博客或者回邮件或者写程序
11:30pm:读书,睡觉

颇有成效的一天,对吧?我以前也是这样想的,但还有提高效率的办法。

26 小时的一天:

5:00am:起床
5:15am:锻炼身体
6:00am:做早餐,准备上班,喝咖啡
7:00am:写博客或写程序,不回邮件
8:45am:到公司上班
5:30pm:下班
6:00pm:吃晚饭
7:00pm:回邮件,回电话
8:30:闲下来了
9:30pm:读书,睡觉(提前睡觉,保障睡眠时长)

不就是早起了两个小时吗?没错,但我全天的安排都被优化了。伴随着早起,我成功地把回邮件和回电话与其他事项分割开来,这两件事最容易打断工作,造成分神。

只要你回电话或是查邮件,时间就被浪费了。

研究显示,工作被打断后,最多要耗费 23 分 15 秒(平均数值)才能收回注意力。还有研究显示,我们平均每小时要被打断 6 至 7 次。也就是说,极端情况下,每工作两小时就有五个小时被浪费了。当然,这种情况是不可能发生的,但你知道这样的时间浪费很可怕。

我调整了每天早上的活动,把查邮件安排在傍晚。没有打扰,效率自然提升。

你也许会想,“我不是早起的那种人”。我也不是,但我坚持早起,最终成功养成了习惯。任何事情都是一样的,习惯成自然。前两周比较痛苦,之后就习以为常了。

我可以保证,除了我你找不出第二个如此感兴趣与提高工作效率的人。在尝试了大量的方法后,我发现早起两小时的效果最好。

当然,早起并不是什么惊天地泣鬼神的才能,但却的确能够提升我们的工作效率。如果你愿意试一下,就会知道我所言不虚。

按我的方法调整你每天的时间安排,你就会发现突然多出了一两个小时空闲的时间。你可以拿来陪家人,做自己喜欢的事,学习或是其他等等。如果你愿意,也可以每天多休息两小时。

Andrew Dumont 的办法真的管用么?亲身经历令我对此深信不疑。微博上曾盛传一个段子,说乔布斯每天早上四点钟起床,九点半前把一天的工作做完。不过,出于身体健康考虑,我们还是推荐 Andrew Dumont 的做法:起床后锻炼一下。

[转载]10步让你成为更优秀的程序员_IT新闻_博客园

mikel阅读(961)

[转载]10步让你成为更优秀的程序员_IT新闻_博客园.

英文原文:10 steps to becoming a better programmer

篇文章要介绍的,是我作为专业程序员这些年来学到的能真正提高我的代码质量和整体工作效率的 10 件事情。

1. 永远不要复制代码

不惜任何代价避免重复的代码。如果一个常用的代码片段出现在了程序中的几个不同地方,重构它,把它放到一个自己的函数里。重复的代码会导致你的 同事在读你的代码时产生困惑。而重复的代码如果在一个地方修改,在另外一个地方忘记修改,就会产生到处是 bug,它还会使你的代码体积变得臃肿。现代的编程语言提供了很好的方法来解决这些问题,例如,下面这个问题在以前很难解决,而如今使用 lambdas 却很好实现:

/// <summary> /// 一些函数含有部分重复代码 /// </summary> void OriginalA () { DoThingsA (); // unique code  DoThingsB (); } /// <summary> /// 另外一个含有部分重复代码的函数 /// </summary> void OriginalB () { DoThingsA (); // 没有重复的代码  DoThingsB (); }

现在我们重构含有部分相同代码的函数,用 delegate 模式重写它们:

/// <summary> /// Encapsulate shared functionality /// </summary> /// <param name="action">User defined action</param> void UniqueWrapper (Action action) { DoThingsA (); action (); DoThingsB (); } /// <summary> /// New implmentation of A /// </summary> void NewA () { UniqueWrapper (() => { // unique code  }); } /// <summary> /// New implementation of B /// </summary> void NewB () { UniqueWrapper (() => { // unique code  }); }

2. 留意你开始分心的时候

当你发现自己在浏览 facebook 或微博、而不是在解决问题,这通常是一种你需要短暂休息的信号。离开办公桌,去喝一杯咖啡,或去跟同事聊 5 分钟。尽管这样做看起来有点反直觉,但长久去看,它会提高你的工作效率。

3. 不要匆忙赶任务而放弃原则

当带着压力去解决一个问题或修改一个 bug,你很容易失去自制,发现自己匆匆忙忙,甚至完全忘了一直坚持的重要的测试过程。这通常会导致更多的问题,会让你在老板或同事眼里显得很不专业。

4. 测试你完成的代码

你知道你的代码能做什么,而且试了一下,它确实好用,但你实际上需要充分的验证它。分析所有可能的边界情况,测试在所有可能的条件下它都能如期的工作。如果有参数,传递一些预期范围外的值。传递一个 null 值。如果可能,让同事看看你的代码,问他们能否弄坏它。单元测试是到达这种目的的常规方法。

5. 代码审查

提交你的代码之前,找个同事一起坐下来,向他解释你做了哪些修改。通常,这样做的过程中你就能发现代码中的错误,而不需要同事说一句话。这比自己审查自己的代码要有效的多得多。

6. 让代码更少

如果你发现写了大量的代码来解决一个简单的问题,你很可能做错了。下面的 boolean 用法是一个很好的例子:

if (numMines > 0) { enabled=true; } else { enabled=false; }

这时你应该写成这样:

enabled = numMines > 0;

代码越少越好。这会使 bug 更少,重构可能性更小,出错的几率更小。要适度。可读性同等重要,你可不能这样做而使代码丧失可读性。

7. 为优雅的代码而努力

优雅的代码非常的易读,只用手边很少的代码、让机器做很少的运算就能解决问题。在各种环境中都做到代码优雅是很难的,但经过一段时间的编程,你 会对优雅的代码是个什么样子有个初步的感觉。优雅的代码不会通过重构来获得。当你看到优雅的代码是会很高兴。你会为它自豪。例如,下面就是一个我认为是优 雅的方式来计算多边形面积的方法:

static public double GetConvexPolygonArea (Vector2[] vertices) { double area = 0; for (int i = 0; i < vertices.Length; i++) { Vector2 P0 = vertices[i]; Vector2 P1 = vertices[(i + 1) % vertices.Length]; area += P0.Wedge (P1); } return area / 2; }

8. 编写不言自明的代码

勿庸置疑,注释是编程中很重要的一部分,但能够不言自明的代码跟胜一筹,因为它能让你在看代码时就能理解它。函数名变量名要慎重选择,好的变量/方法名字放到语言语义环境中时,不懂编程的人都能看懂。例如:

void DamagePlayer (Player player, int damageAmount) { if (!player.m_IsInvincible && !player.m_IsDead) { player.InflictDamage ( damageAmount ); } }

能自我说明的代码不能代替注释。注释是用来解释“为什么”的,而自我说明的代码是来描述“是什么”的。

9. 不要使用纯数字

直接把数字嵌入代码中是一种恶习,因为无法说明它们是代表什么的。当有重复时更糟糕——相同的数字在代码的多个地方出现。如果只修改了一个,而忘记了其它的。这就导致 bug。一定要用一个命名常量来代表你要表达的数字,即使它在代码里只出现一次。

10. 不要做手工劳动

当做一系列动作时,人类总是喜欢犯错误。如果你在做部署工作,并且不是一步能完成的,那你就是在做错事。尽量的让工作能自动化的完成,减少人为错误。当做工作量很大的任务时,这尤其重要。

11. 避免过早优化

当你要去优化一个已经好用的功能代码时,你很有可能会改坏它。优化只能发生在有性能分析报告指示需要优化的时候,通常是在一个项目开发的最后阶段。性能分析之前的优化活动纯属浪费时间,并且会导致 bug 出现。

好吧,我说是 10 个,但你却得到了额外赠送的一个!

这些就是我要说的,我希望它们能帮助你改进编程开发过程。

下次再见!祝快乐!

Cheers, Paul.

[转载]那些你不知道的Chrome(1) - 爱吃猫的鱼 - 博客园

mikel阅读(1333)

[转载]那些你不知道的Chrome(1) – 爱吃猫的鱼 – 博客园.

–做web的,左手火狐,右手chrome,中间还有一个IEtest-

可以说,chrome不仅仅是web开发人员的最爱,一般的人使用chrome都觉得很清爽,舒适,扩展功能强,打开速度快,兼容性好等优点都比某打着“安全浏览器”的x60好的多。

chrome的F12功能,有非常的多的用处,下面就让我用一个又一个的例子来说明Chrome的种种爽快吧

 

1,当你的上网账号密码条找不到的时候你会想起谁

翻箱子,搜柜子,还是找不到- – ,看来今天是找不到密码了,明明密码就在眼前,硬是看不到里面的内容- –

 

 

这真真是急死我了,右键查看源文件?

右键被禁用了,查看源代码?

显然,整个路由的后台页面都是IFRAME做的,那直接把里面的内容html copy出来吧,让我看一下里面的内容:

看到红色的字体我就明白了~原来账号和密码都是数组的形式做为一个全局的变量存放在页面中的。那显然,这里面的内容就是我的账号和密码了。OK,找到~

那还有没有其它的方式呢?我很注意里面的一个页面

我知道,保存的时候就是以提交了一次表单,要么就是post了一次,要么就是get了一次,那如果我监视这次请求,那相应的账号密码是不是能得到呢?

那就直接点一次保存,然后监视请求:

我列个去- – ,直接将数据以get方式请求过去了,都不用post的说:

acc,psw,confirm分别对应:

账号,密码,确认。

一下子就找出来了~

[转载]18 个最新实用的 jQuery 插件_IT新闻_博客园

mikel阅读(1174)

[转载]18 个最新实用的 jQuery 插件_IT新闻_博客园.

1. Simple Effects for Drop-Down Lists

一个 JQuery 插件用于将普通的 select 控件转成一个带有一些简单扩展效果的下拉列表。

  2. X-editable

这个插件能够让你在页面上创建可编辑的元素。它能够使用任何引擎(bootstrap、JQuery-ui、jQuery),并且包含弹出式和内联模式。

  3. Garlic.js

Garlic.js 自动在本地保存表单文本字段的值,直到表单被提交。这样,你的用户如果不小心关闭选项卡或浏览器,也不会失去任何宝贵的数据。

  4. Calendario

一个日历插件,用于创建灵活的日历。它只能用于支持新的 CSS 特性如 calc ()的浏览器。

  5. Stapel

使用堆效果自动对缩略图进行分组。缩略图集根据他们的共享数据堆属性进行分组,当点击堆时将分散到各自的位置。

  6. Pickadate.js

完全响应式和轻量级的 jQuery 日期输入选择器。

  7. jHERE

有了 jHERE,你可以很容易地添加互动地图到您的网站中。拥有一个强大的地图 API,高度可定制的标记,事件处理和信息气泡。

  8. Responsive Img

Responsive Img 是一个 jQuery 插件,它能够根据页面的宽度改变一张图片的 src 属性。

  9. FooTable

FooTable 能够将 HTML 表格转成可扩展或响应式表格。不管表格中有多少列数据。

  10. Stairway Navigation

一个阶梯效果的导航菜单。

  11. SocialCount

一个更轻、更快的社交网络部件。

  12. Baraja

采用类似分发扑克牌的方式来移动元素。

  13. jPanelMenu

可创建一个 paneled 风格的菜单(类似于在 Facebook 和 Google 移动版,或其它原生 iPhone 应用中看到的)。

  14. Any List Scroller

该插件能够根据任何内容、任何尺寸、任何列表产生可滚动效果。

  15. Sliced

将图像分割成块,并把它们组合在一起。

  16. mlens

放大镜插件。

  17. jQuery Burn

jQuery Burn 这个插件能够让文字产生火焰般的效果。它使用多个文本阴影,并通过反复改变他们水平偏移量实现。

  18. Shapeshift

该插件可以动态地将元素集合安排在一个父容器网格中。

[转载]我的架构经验系列文章 - 前端架构 - lovecindywang - 博客园

mikel阅读(1041)

转载我的架构经验系列文章 – 前端架构 – lovecindywang – 博客园.

回到索引 http://www.cnblogs.com/lovecindywang/archive/2012/12/23/2829828.html

 

框架层面:

近几年前端发展很快,前端之所以叫前端因为前端是已经可以独立成为一种职业了,js也不再是十年前的玩具了,以前富客户端RIA的应用可能会用 flash/flex或是silverlight,现在可以使用js来完成大部分的功能,因此js作为一门前端的支撑语言也不仅仅是进行的简单的编码,越 来越多框架性的东西出现了。越来越多的开发模式转变为后端只是吐json的数据源,而前端做所有UI的事情。

 

  • MVC

MVC实现职责分离是很好的,大多数网站在后端都会引入MVC框架,对于一个前端负责所有呈现和前端业务逻辑的网站来说,使用MVC框架也是很有好处的。JavaScript的MVC框架现在很多,http://www.infoq.com/cn/news/2012/05/js-mvc-framework。 每一个框架其实都有其特点的,但是前端的MVC框架会和后端的有些不同的。比如前端的MVC框架可能会做一些M和V元素的双向绑定,对于后端来说往往是单 向的比较多。通过引入MVC框架我们可以让同一个页面做很多事情,通过一个不刷新的页面实现一个应用程序的根基,还可以很清晰地进行MVC的分离并且突出 M的概念,这是没有框架所办不到的。

 

  • 通讯

对于一个比较复杂的页面可能会有比较多的JavaScript模块,如果要进行模块之间通讯的话(比如一个页面有左边菜单和导航以及列表,左边菜单 点选一级分类之后要通知导航加上去这项,并且通知列表重新读取数据并刷新,然后从导航删除这个选择的话要通知列表重新获取数据,通知菜单显示所有)。对于 比较复杂的通讯,如果把模块模块之间进行强耦合直接调用其它模块的函数的话是不利于可维护性的,我觉得可以引入发布订阅机制,每一个模块做了什么修改把信 息发布出去,关心这个信息的人订阅这个信息,并且在回调函数里面做相应的操作就可以了。可以使用Amplifyjs作为发布订阅的框架。

 

  • 模板

对于前端来说和后端一样一个比较麻烦的问题就是往往会在脚本里面把html也混在一起,个人觉得是这样的,如果对于非常琐碎一些dom修改问题倒不 大,如果是大块的html拼接的话,数据和html甚至是css混合在一起,那么代码的可维护程度非常差。此时可以考虑使用一些模板引擎来分离数据和表 现,比如Twitter hoganjs。由于很多模板引擎,比如大胡子引擎不仅仅是针对前端的,后端语言也有相应的引擎,因此甚至可以把模板放在文本文件中,前端后端共同使用一 套模板引擎,也就是说现在的代码偏向于服务端渲染的那么就在后端使用模板,如果要以后改为客户端渲染了这套模板可以直接被前端使用。

 

  • 类库

除了框架之外还有很多类库,比如JQuery,underscore,linq.js(linq to javascript),jscex(wind)反正后端有啥现在前端也有啥,尽情发挥想象吧。用好这些框架可以大大改善生产力的,脚本能做的事情真的比 想象的要多的多。我是做后端的前端知道的不多在这里列出的可能只是九牛一毛。

 

  • 依赖

可以使用Requirejs、Commonjs之类的组件来管理脚本之间的依赖,好处很多的,我们的模块只需要写清楚需要依赖什 么,Requirejs自然会帮我们按照一定的次序加载进来,这样我们既不用担心顺序问题也不用担心组件的版本号问题。基于Requirejs它具有丰富 的配置,即使是我们进行了静态资源合并也完全能处理,只要通过配置把组件配置到相同的服务端生成的一个路径上即可,不过以前在做的时候发现它会自动加 上.js 扩展名,不过完全可以通过改Requirejs源代码解决。在架构上我的观点是既然使用开源的东西,遇到问题了就不要去怕改源代码。我们一定不能停留在框 架的使用者,定制框架甚至向作者贡献自己的代码没有这么难。

 

设计层面:

 

  • 职责分离的理念

虽然我们都知道CSS样式、JS行为以及HTML结构。个人觉得只有HTML是必须的,也就是说如果一个页面没有样式没有脚本的话它应该是一个清晰 的页面,可以大致表现出页面需要表现的内容,只不过样子比较难看,并且也是交互的。如果说很多功能是ajax实现的话那么就把交互工作转到服务端实现服务 端的渲染。多了样式只是布局上样子上更好看,多了脚本只是交互性上更友好,不需要刷新页面,但是少了也不代表这个网站就是废物了,现在有很多理念其实目的 是一样的。如果达不到这个境界至少我们要很明确的让css、js和html履行自己的职责,不要把过多的事情赋予不相关的组件。比如尽量不要在html中 包含操作性的脚本代码,而是应该直接在脚本中选择dom元素进行操作,尽量不要在脚本中包含大段的html代码而是应该从模板读取然后把数据填充进去,也 尽量不要在html代码中包含大量内嵌的样式而是应该通过选择器选择进行样式赋值。

 

  • 分层和目录结构

对于一个比较复杂的大型的项目,合理规划目录结构也是很重要的,你可能会说脚本和样式分两个目录就可以了,但是如果一个复杂的项目有几百个脚本都列 在一个文件夹下吗?后端有分层的概念其实前端完全也可以有分层的概念,有表现层、业务逻辑层和模型层,然后是下面的数据访问ajax层,当然还会有常量的 文件,我反问觉得前端的分层可以超大型项目的ios或Android程序来靠。比如之前我做的一个ios程序的示例http://www.cnblogs.com/lovecindywang/archive/2012/09/11/2680055.html个人觉得这样的分层就比较一目了然的。

 

  • 合并和拆分的平衡

很多时候架构上的东西就是一种权衡,如果有固定的标准的话也就不需要架构师了,我们只需要按照固定的标准去做就行了。比如,一个页面上使用了10个 脚本文件,5个样式文件,按道理说合并成两个文件可以达到最小的请求数,但这样一定是好的吗?这个10个脚本和5个样式文件中有很多或许是其它页面也需要 公用的,如果仅仅简单的合并在一起反而可能增加用户的下载流量,因此怎么规划通用的东西合成一个文件,框架的文件单独,而每一个页面都有自己独特的脚本和 样式,也是一种学问。

 

性能层面:

 

  • 性能检测

诸如YSlow和PageSpeed等工具可以分析出前端的性能问题,在这里就不展开讨论了。对于前端来说由于涉及到用户的客户端环境和网络环境所 以情况不是这么单纯,但是我们可以做到的就是在我们的可控范围之内尽量减少用户域名解析数量,减少用户下载的数据量,增加并发等等。其实说白了,我们就是 清理管道使得管道更大,或者增加更多的管道,或者就是尽量让管道之内的水少一点了,这样就可以更顺畅。

 

  • 性能分析

现在有一些工具可以对Javascript的性能甚至是DOM解析的情况进行细致的分析,比如dynaTrace AJAX Edition,通过这样的工具我们可以分析我们的脚本代码以及页面布局是否合理,从开发的角度来全面了解和优化我们的前端代码。客户端的资源虽然不像服 务端的资源这么重要,但是为了给用户的机制体验最好还是对客户端的性能消耗有所优化。

[转载]ASP玩转微信公众平台自定义接口 - 站长网 admin5.com

mikel阅读(911)

[转载]ASP玩转微信公众平台自定义接口 – 站长网 admin5.com.

  微信最近开放第三方API接口,申请地址:http://mp.weixin.qq.com/cgi-bin/callbackprofile?t=wxm-callbackapi&type=info&lang=zh_CN

从微信公众平台开通自定义回复后,就一直在关注微信接口这一块,很想用自定义回复这块做个站长工具的查询,例如PR查询,备案查询等,输入网址信息, 就能自动获取PR,获取备案信息,应该是一个不错的想法。不过以前一直不支持自定义API,只能是一些固定的信息回复。最近微信公众平台终于开放第三方接 口了,也就是说,可以根据用户提交的信息,来自定义回复内容,非常方便。

站长帮手网官方微信第一时间开通了自定义回复,大家可以添加站长帮手网微信账号linkhelper来看看自定义接口的方便性,输入网址,就能自动回复网站的PR值。截图如下:

 

看到了微信的自定义第三方接口的强大后,下面我们来讲讲怎么实现自定义回复。

首先我们进入第三方接口的页面进行注册,地址:http://mp.weixin.qq.com/cgi-bin/callbackprofile?t=wxm-callbackapi&type=info&lang=zh_CN

URL为你以后的微信自定义回复生成的地址。Token你可以随便输,主要是用来校验当前的信息是否为微信提交过来的信息。

如果你的微信接口页面没有做好,提交保存的时候,会提示:验证Token失败。这个错误是因为,你的接口页面还没有反馈正确的信息给微信接口。微信在 教程方面还做得不够成熟,就一个PHP示例,还是有问题的,在下篇文章我会讲到这个错误在哪。微信官方也没有跟大家说清楚怎么才能是token验证成功。 下面我将给出示例告诉大家如何通过token验证。

譬如:站长帮手网的微信接口页面是http://wx.linkhelper.cn 默认页面是default.asp,我们只需要把default.asp的代码改为:

<%

response.write request(“echostr”)

%>

然后再在官方提交下保存,提示“验证token成功”。到此为止,第一步我们完成了接口的申请。

上面给大家讲了如何申请微信公众平台自定义接口,这篇文章讲通过实例,为大家讲述如何实现Hello World的一个简单的自定义回复。微信官方不提供ASP代码实例。

微信官方提供的PHP代码示例,$postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement’, LIBXML_NOCDATA);通过该代码可以获知微信平台提交过来的信息是一个XML对象。对应的ASP代码的实现是:

set xml_dom = Server.CreateObject(“MSXML2.DOMDocument”)
xml_dom.load request
FromUserName=xml_dom.getelementsbytagname(“FromUserName”).item(0).text

该代码可以获取到提交过来的用户。其他的接收者,微信内容都可以该方法获取到。

这里交大家一个调试技巧,因为微信接口代码不好调试,我们可以通过写文件的方式,把我们代码获取到的内容写入一个文件,以调试代码是否正确。代码如下:

filepath=server.mappath(“.”)&”\wx.txt”
Set fso = Server.CreateObject(“scripting.FileSystemObject”)
set fopen=fso.OpenTextFile(filepath, 8 ,true)
fopen.writeline(FromUserName)
set fso=nothing
set fopen=Nothing

最后我们重新组合,并生成对应的XML字符串,反馈给微信公众平台,用户就能接受到自定义回复内容了。相关代码如下:

strresponse=”<xml>”
strresponse=strresponse&”<ToUserName><![CDATA[“&fromusername&”]]></ToUserName>”
strresponse=strresponse&”<FromUserName><![CDATA[“&tousername&”]]></FromUserName>”
strresponse=strresponse&”<CreateTime>”&now&”</CreateTime>”
strresponse=strresponse&”<MsgType><![CDATA]></MsgType>”
strresponse=strresponse&”<Content><![CDATA[Hello World]]></Content>”
strresponse=strresponse&”<FuncFlag>0<FuncFlag>”
strresponse=strresponse&”</xml>”
response.write strresponse

另外请大家注意,ASP文件需要以UTF-8的格式保存,包括页面编码也要用UTF-8的格式,否则有可能自定义回复出现乱码。

至此,我们就完成了ASP微信公众平台自定义接口的一个简单的自定义回复。如果对源码有兴趣的,请加站长帮手网官方微信账号linkhelper,发送“源码”或者“例子”获取下载地址。

如需转载,请著名转载自站长帮手网www.linkhelper.cn