利用nginx转发实现本地调试微信公众号后台

一直想注册一个服务号未遂,于是只能注册为坑爹的个人账号,才发现各种限制,既不能认证(高级接口需要认证后才能用),开发者认证还得交钱,哎,说好的再小的个体也有自己的品牌呢???
最近遇到最大的问题就是没法本地调试,你得看着接口文档把代码写好,部署到后台去,才能进行测试。
其实我机是可以通过外网访问的。

怎么实现通过外网访问我的电脑的呢?

继续阅读“利用nginx转发实现本地调试微信公众号后台”

Spring MVC 中post json数据返回415错误的一种解决办法

我是通过angular js 发送post 请求给服务器,返回415(不支持的媒体类型),这个问题一度导致我的小项目没有进一步开展,本来我可以换一种方式的,但是不知道哪根筋出问题,非得要post 一段json数据给后台解析。国内外网站找了N种办法均没有解.

继续阅读“Spring MVC 中post json数据返回415错误的一种解决办法”

C# 多线程编程 ThreadStart ParameterizedThreadStart

在实例化Thread的实例,需要提供一个委托,在实例化这个委托时所用到的参数是线程将来启动时要运行的方法。在.net中提供了两种启动线程的方式,一种是不带参数的启动方式,另一种是带参数的启动的方式。
不带参数的启动方式
如果启动参数时无需其它额外的信息,可以使用ThreadStart来实例化Thread,如下面的代码:


1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class Program
9 {
10 int interval = 200;
11 static void Main(string[] args)
12 {
13 Program p = new Program();
14 Thread nonParameterThread = new Thread(new ThreadStart(p.NonParameterRun));
15 nonParameterThread.Start();
16 }
17 ///

18 /// 不带参数的启动方法
19 ///

20 public void NonParameterRun()
21 {
22 for (int i = 0; i < 10; i++) 23 { 24 Console.WriteLine("系统当前时间毫秒值:"+DateTime.Now.Millisecond.ToString()); 25 Thread.Sleep(interval);//让线程暂停 26 } 27 } 28 }

程序的运行效果我们不用运行也会知道,那就是在循环中将系统当前时间的毫秒部分输出出来,在每次输出之后会将当前线程暂停一下,直到10次之后运行完毕,终止线程的执行。
在上面的代码中我们是通过定义全局变量的方法来指定线程暂停间隔,按照这种方法,假如要运行10个线程,每个线程的暂停间隔不一样的话,就需要定义10个全局变量,虽然最终不影响系统的运行效果,但是总觉得不是太爽。
有没有比较简单一点的办法呢?有!那就是使用带参数的启动方法。
带参数的启动方法
如果要在实例化线程时要带一些参数,就不能用ThreadStart委托作为构造函数的参数来实例化Thread了,而要 ParameterizedThreadStart委托,和ThreadStart一样的是它也是线程启动时要执行的方法,和ThreadStart不同的是,它在实例化时可以用一个带有一个Object参数的方法作为构造函数的参数,而实例化ThreadStart时所用到的方法是没有参数的。
为什么是Object这样的参数呢?很简单,因为在.net中Object是所有类型的基类,用它可以表示Array(数组)、Interface(接口)、ValueType(值类型,如bool,byte,char,short,int,float,long,double等)、class(类)等.net中的类型。当然,这也意味着如果你要启动一个线程,给它传递一个int类型参数时,必须在 启动方法中进行相应的类型转换。
下面就是一个例子,在启动线程时指定了线程的暂停间隔,代码如下:

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class Program
9 {
10 int interval = 200;
11 static void Main(string[] args)
12 {
13 Program p = new Program();
14
15 Thread parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun));
16 parameterThread.Name = "Thread A:";
17 parameterThread.Start(30);
18 }
19
20 ///

21 /// 带参数的启动方法
22 ///

23 ///让线程在运行过程中的休眠间隔 24 public void ParameterRun(object ms)
25 {
26 int j = 10;
27 int.TryParse(ms.ToString(), out j);//这里采用了TryParse方法,避免不能转换时出现异常
28 for (int i = 0; i < 10; i++) 29 { 30 Console.WriteLine(Thread.CurrentThread.Name+"系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString()); 31 Thread.Sleep(j);//让线程暂停 32 } 33 } 34 } 35 }

在这个方法里,我们在启动线程时顺便指定了线程的暂停间隔,也就是这句:
parameterThread.Start(30);
线程启动时运行的方法是public void ParameterRun(object ms),这个值为30的int类型变量被装箱成object,所以在方法中还需要将它转换成int类型,这个可以通过拆箱或者其它办法解决。
假如我们要启动两个线程,每个线程的暂停间隔不一样,启动代码如下:

  


1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class Program
9 {
10 int interval = 200;
11 static void Main(string[] args)
12 {
13 Program p = new Program();
14
15 Thread parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun));
16 parameterThread.Name = "Thread A:";
17 parameterThread.Start(30);
18 //启动第二个线程
19 parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun));
20 parameterThread.Name = "Thread B:";
21 parameterThread.Start(60);
22 }
23
24 ///

25 /// 带参数的启动方法
26 ///

27 ///让线程在运行过程中的休眠间隔 28 public void ParameterRun(object ms)
29 {
30 int j = 10;
31 int.TryParse(ms.ToString(), out j);//这里采用了TryParse方法,避免不能转换时出现异常
32 for (int i = 0; i < 10; i++) 33 { 34 Console.WriteLine(Thread.CurrentThread.Name+"系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString()); 35 Thread.Sleep(j);//让线程暂停 36 } 37 } 38 } 39 }

对上面的代码做一点说明,就是线程启动之后,线程的实例不必再存在,例如在上面的代码中我用的是同一个实例实例化了两个线程,并且这两个线程运行很正常。
继续探索
上面解决了一个问题,如果在启动线程时需要参数如何解决,如果针对上面的问题继续发掘,比如:在启动线程时不但要指定线程的暂停间隔,还需要指定循环次数(在上面的所有例子中都是执行10次的),这个问题该如何解决呢?
有两种办法可以解决:
首先可以继续在ParameterizedThreadStart这里做文章,因为这里可以使用一个Object类型的参数,那么可以通过数组或者一个类来解决(因为它们都是Object的子类)。我在做某个系统时确实采用数组处理过这种情况,这样就要求在线程启动方法中必须清楚知道数组中每个参数的用途,不是太方便。
这里说说重新定义一个实体类来解决的方法,代码如下。

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class MyThreadParameter
9 {
10 private int interval;
11 private int loopCount;
12 ///

13 /// 循环次数
14 ///

15 public int LoopCount
16 {
17 get { return loopCount; }
18 }
19
20 ///

21 /// 线程的暂停间隔
22 ///

23 public int Interval
24 {
25 get { return interval; }
26 }
27 ///

28 /// 构造函数
29 ///

30 ///线程的暂停间隔 31 ///循环次数 32 public MyThreadParameter(int interval,int loopCount)
33 {
34 this.interval = interval;
35 this.loopCount = loopCount;
36 }
37 }
38 class Program
39 {
40 int interval = 200;
41 static void Main(string[] args)
42 {
43 Program p = new Program();
44
45 Thread parameterThread = new Thread(new ParameterizedThreadStart(p.MyParameterRun));
46 parameterThread.Name = "Thread A:";
47 MyThreadParameter paramter = new MyThreadParameter(50, 20);
48 parameterThread.Start(paramter);
49 }
50
51
52 ///

53 /// 带多个参数的启动方法
54 ///

55 ///方法参数 56 public void MyParameterRun(object ms)
57 {
58 MyThreadParameter parameter = ms as MyThreadParameter;//类型转换
59 if (parameter != null)
60 {
61 for (int i = 0; i < parameter.LoopCount; i++) 62 { 63 Console.WriteLine(Thread.CurrentThread.Name + "系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString()); 64 Thread.Sleep(parameter.Interval);//让线程暂停 65 } 66 } 67 } 68 } 69 }

第二种方法和上面方法有些相似,也是需要引入外部类,并且将Thread实例放在引入的类中,这种情况适合于在线程中处理的业务逻辑比较复杂的情况。在前不久处理的一个项目中我用过这种情况,它是用来实现双向数据传输的。
如果实现上面的效果,代码如下:

  

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class MyThreadParameter
9 {
10 private int interval;
11 private int loopCount;
12 private Thread thread;
13
14 ///

15 /// 构造函数
16 ///

17 ///线程的暂停间隔 18 ///循环次数 19 public MyThreadParameter(int interval,int loopCount)
20 {
21 this.interval = interval;
22 this.loopCount = loopCount;
23 thread = new Thread(new ThreadStart(Run));
24 }
25
26 public void Start()
27 {
28 if (thread != null)
29 {
30 thread.Start();
31 }
32 }
33
34 private void Run()
35 {
36 for (int i = 0; i < loopCount; i++) 37 { 38 Console.WriteLine("系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString()); 39 Thread.Sleep(interval);//让线程暂停 40 } 41 } 42 } 43 class Program 44 { 45 static void Main(string[] args) 46 { 47 MyThreadParameter parameterThread = new MyThreadParameter(30, 50); 48 parameterThread.Start(); 49 } 50 51 } 52 }

上面的代码的运行效果和前面的代码运行效果类似,只不过是将业务处理代码放在一个单独的类MyThreadParameter中,使得MyThreadParameter看起来也像一个Thread,实际上维护的还是其内部的Thread,在一些大型系统中这样做的好处是便于维护。
总结:在本篇主要讲述如何启动线程的问题,在启动时可能会遇到无需参数、需要多个参数的情况,在这里讲述了如何解决这些问题的思路。在.net类库中虽然存在着庞大的类库,但是并不是总会有合适的类来解决我们所遇到的问题,但是只要肯动脑筋总会想到合适的办法。

wordpress搬迁到新浪sae

今天花了几个小时终于搞定了,把网站从主机屋搬迁到了新浪sae。写这些东西确实有点小菜,老鸟莫笑。首先分析一下难点在哪里。主机屋是普通的虚拟主机,搭建的时候只要把数据库导入数据库,然后把网站上传到服务器上就可以了。但是sae的架构不一样,但是理解起来也简单。sae采用的是分布式的架构,你的资源和你的数据库是保存在别的服务器上的,比如其附件是单独存在saestorage中,不能存放在代码目录中的,这些问题我想还好理解。同时也理解了大型应用是如何处理这些压力的。

废话少说,首先通过ftp把主机屋上的网站下载到本地。数据库通过主机屋提供的 PHPMyAdmin进行全部备份到本地。如果不确定有没有没问题的话可以先在本地搭建环境跑一边。

然后创建一个php应用 具体教程在这里

http://sae.sina.com.cn/?m=devcenter&catId=20

但是。。。。。 sae如果直接装我们自己搭建的wordpress会有很多问题的,因为它是分布式的架构,一种简便的方法是我们之间创建一个WordPress for SAE 地址在:http://sae.sina.com.cn/?m=apps&a=detail&aid=1

安装完成后我们找到创建的应用〉服务管理〉管理Mysql 进入phpMyAdmin管理界面 里面的表全删掉,然后导入我们 之前从主机屋上备份的sql文件。

然后在本地创建一个空文件夹,用TortoiseSVN迁出版本库中的文件到空白文件夹中。svn具体教程在

http://sae.sina.com.cn/?m=devcenter&a=index&catId=212

下一步我把我们之前本地的网站中的 wp-contentuploads文件夹单独剪切出来,其它文件拷贝到版本库中,(就是你迁出的那个默认目录是 1) 注意同名不要覆盖掉版本库中的文件,然后commit 到服务器上。

然后利用另外一个工具cyberduck 把文件提交到saeStorage中,

也可以在

下载地址:

http://src.sae.sinacdn.com/clients/Cyberduck-Installer-4.2.1.exe

使用方法

http://sae.sina.com.cn/?m=devcenter&catId=204&content_id=375

同时可以在服务管理〉storage中查看更多内容。。

 

最后 如果少的话慢慢修改你文章中 相册中的附件地址吧(要改成storage中的地址,比如

http://应用名-wordpress.stor.sinaapp.com/uploads/xxx.jpg)。如果多的用sql要快很多(这个你就自己去写吧).

 

Apache与Tomcat整合时中文参数乱码的解决

把Apache2.2与Tomcat6进行整合之后,当提交带有中文参数的请求时,经常出现奇怪的现象。在直接访问Tomcat时,可以正常返回结果的请求,一旦经过Apache的代理,就出现问题。

通过Debug发现,Tomcat在经过和不经过Apache代理的两种情况下,得到的中文参数是不同的,而后者是乱码。

从网上查了一下资料,发现Apache在使用AJP13模式代理到Tomcat时,也应该为Tomcat的AJP13设定一些参数。

具体说来,应该在Tomcat的server.xml中设置为:

<Connector port=”8085″ protocol=”HTTP/1.1″ connectionTimeout=”20000″ redirectPort=”8443″
<!– 防止中文乱码 –>
useBodyEncodingForURI=”true” URIEncoding=”UTF8″ />

<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″
<!– 防止中文乱码 –>
useBodyEncodingForURI=”true” URIEncoding=”UTF8″ />

解决单个或整站PNG在IE6中背景透明的方法(背景如何透明没有灰色的)

IE6中如何解决背景按钮为透明,加入以下样式:

1.针对IE6的filter滤镜法(适合个数比较少)

加入到样式里:

background: url(images/look.png) right bottom no-repeat;
_background:none;  /*这个千万不能少,不然会有灰色的底色*/
_filter:progid:DXImageTransForm.Microsoft.AlphaImageLoader(src=’logo.png’,sizingMethod=’crop’);
/*不要忘了前面的_,因为是专门针对ie6的*/

sizingMethod : 可选项。字符串(String)。设置或检索滤镜作用的对象的图片在对象容器边界内的显示方式。

crop : 剪切图片以适应对象尺寸。
image : 默认值。增大或减小对象的尺寸边界以适应图片的尺寸。
scale : 缩放图片以适应对象的尺寸边界。
src : 必选项。字符串(String)。使用绝对或相对 url 地址指定背景图像。假如忽略此参数,滤镜将不会作用。

说明:

在对象容器边界内,在对象的背景和内容之间显示一张图片。并提供对此图片的剪切和改变尺寸的操作。如果载入的是PNG(Portable Network Graphics)格式,则0%-100%的透明度也被提供。

PNG(Portable Network Graphics)格式的图片的透明度不妨碍你选择文本。也就是说,你可以选择显示在PNG(Portable Network Graphics)格式的图片完全透明区域后面的内容。

add:这个方法我用的时候,如果想给这个元素再添加额外的背景色时,如果这么添加的话(background:red url(logo.png) no-repeat center;),别的浏览器正常识别,ie6会出现不识别的情况。

解决办法:1.background-color:red;单独写    2.加在外面套的标签上   3.body加背景色

 

2.DD_belatedPNG方法(推荐使用,非常适合整站IE6中PNG背景透明)

 

上面的方法很好用,但是有一个比较大的缺点,就是不支持CSS中backgrond-position与background-repeat。

而DD_belatedPNG,它支持backgrond-position与background-repeat,同时DD_belatedPNG还支持a:hover属性,以及<img>,所以可以说满足了我们所有的使用方法。

 

使用办法:

1.下载需要引入的js文件  见下面附上了

2.
<!–[if IE 6]>

<script src=”js/png.js”></script>

<script> DD_belatedPNG.fix(‘.pngfix’); </script>

<![endif]–>

上面这个插入在 <head> </head>之间,需要被透明的地方加上样式

以下附上png.js代码: 

 

/**

* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.

* Author: Drew Diller

* Email: drew.diller@gmail.com

* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/

* Version: 0.0.8a

* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license

*

* Example usage:

* DD_belatedPNG.fix(‘.pngfix’); // argument is a CSS selector

* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement

**/

var DD_belatedPNG={ns:”DD_belatedPNG”,imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,”urn:schemas-microsoft-com:vml”)}},createVmlStyleSheet:function(){var b,a;b=document.createElement(“style”);b.setAttribute(“media”,”screen”);document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+”:*”,”{behavior:url(#default#VML)}”);b.addRule(this.ns+”:shape”,”position:absolute;”);b.addRule(“img.”+this.ns+”_sizeFinder”,”behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;”);this.screenStyleSheet=b;a=document.createElement(“style”);a.setAttribute(“media”,”print”);document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+”:*”,”{display: none !important;}”);a.addRule(“img.”+this.ns+”_sizeFinder”,”{display: none !important;}”)}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search(“background”)!=-1||event.propertyName.search(“border”)!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName==”style.display”){c=(b.currentStyle.display==”none”)?”none”:”block”;for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search(“filter”)!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search(“lpha”)!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf(“=”)+1,a.lastIndexOf(“)”)),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(“,”);for(b=0;b<c.length;b++){this.screenStyleSheet.addRule(c[b],”behavior:expression(DD_belatedPNG.fixPng(this))”)}}},applyVML:function(a){a.runtimeStyle.cssText=””;this.vmlFill(a);this.vmlOffsets(a);this.vmlOpacity(a);if(a.isImg){this.copyImageBorders(a)}},attachHandlers:function(i){var d,c,g,e,b,f;d=this;c={resize:”vmlOffsets”,move:”vmlOffsets”};if(i.nodeName==”A”){e={mouseleave:”handlePseudoHover”,mouseenter:”handlePseudoHover”,focus:”handlePseudoHover”,blur:”handlePseudoHover”};for(b in e){if(e.hasOwnProperty(b)){c[b]=e[b]}}}for(f in c){if(c.hasOwnProperty(f)){g=function(){d[c[f]](i)};i.attachEvent(“on”+f,g)}}i.attachEvent(“onpropertychange”,this.readPropertyChange)},giveLayout:function(a){a.style.zoom=1;if(a.currentStyle.position==”static”){a.style.position=”relative”}},copyImageBorders:function(b){var c,a;c={borderStyle:true,borderWidth:true,borderColor:true};for(a in c){if(c.hasOwnProperty(a)){b.vml.color.shape.style[a]=b.currentStyle[a]}}},vmlFill:function(e){if(!e.currentStyle){return}else{var d,f,g,b,a,c;d=e.currentStyle}for(b in e.vml){if(e.vml.hasOwnProperty(b)){e.vml[b].shape.style.zIndex=d.zIndex}}e.runtimeStyle.backgroundColor=””;e.runtimeStyle.backgroundImage=””;f=true;if(d.backgroundImage!=”none”||e.isImg){if(!e.isImg){e.vmlBg=d.backgroundImage;e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf(‘”)’)-5)}else{e.vmlBg=e.src}g=this;if(!g.imgSize[e.vmlBg]){a=document.createElement(“img”);g.imgSize[e.vmlBg]=a;a.className=g.ns+”_sizeFinder”;a.runtimeStyle.cssText=”behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;”;c=function(){this.width=this.offsetWidth;this.height=this.offsetHeight;g.vmlOffsets(e)};a.attachEvent(“onload”,c);a.src=e.vmlBg;a.removeAttribute(“width”);a.removeAttribute(“height”);document.body.insertBefore(a,document.body.firstChild)}e.vml.image.fill.src=e.vmlBg;f=false}e.vml.image.fill.on=!f;e.vml.image.fill.color=”none”;e.vml.color.shape.style.backgroundColor=d.backgroundColor;e.runtimeStyle.backgroundImage=”none”;e.runtimeStyle.backgroundColor=”transparent”},vmlOffsets:function(d){var h,n,a,e,g,m,f,l,j,i,k;h=d.currentStyle;n={W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop};a=(n.L+n.bLW==1)?1:0;e=function(b,p,q,c,s,u){b.coordsize=c+”,”+s;b.coordorigin=u+”,”+u;b.path=”m0,0l”+c+”,0l”+c+”,”+s+”l0,”+s+” xe”;b.style.width=c+”px”;b.style.height=s+”px”;b.style.left=p+”px”;b.style.top=q+”px”};e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);g={X:0,Y:0};if(d.isImg){g.X=parseInt(h.paddingLeft,10)+1;g.Y=parseInt(h.paddingTop,10)+1}else{for(j in g){if(g.hasOwnProperty(j)){this.figurePercentage(g,n,j,h[“backgroundPosition”+j])}}}d.vml.image.fill.position=(g.X/n.W)+”,”+(g.Y/n.H);m=h.backgroundRepeat;f={T:1,R:n.W+a,B:n.H,L:1+a};l={X:{b1:”L”,b2:”R”,d:”W”},Y:{b1:”T”,b2:”B”,d:”H”}};if(m!=”repeat”||d.isImg){i={T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)};if(m.search(“repeat-“)!=-1){k=m.split(“repeat-“)[1].toUpperCase();i[l[k].b1]=1;i[l[k].b2]=n[l[k].d]}if(i.B>n.H){i.B=n.H}d.vml.image.shape.style.clip=”rect(“+i.T+”px “+(i.R+a)+”px “+i.B+”px “+(i.L+a)+”px)”}else{d.vml.image.shape.style.clip=”rect(“+f.T+”px “+f.R+”px “+f.B+”px “+f.L+”px)”}},figurePercentage:function(d,c,f,a){var b,e;e=true;b=(f==”X”);switch(a){case”left”:case”top”:d[f]=0;break;case”center”:d[f]=0.5;break;case”right”:case”bottom”:d[f]=1;break;default:if(a.search(“%”)!=-1){d[f]=parseInt(a,10)/100}else{e=false}}d[f]=Math.ceil(e?((c[b?”W”:”H”]*d[f])-(c[b?”w”:”h”]*d[f])):parseInt(a,10));if(d[f]%2===0){d[f]++}return d[f]},fixPng:function(c){c.style.behavior=”none”;var g,b,f,a,d;if(c.nodeName==”BODY”||c.nodeName==”TD”||c.nodeName==”TR”){return}c.isImg=false;if(c.nodeName==”IMG”){if(c.src.toLowerCase().search(/.png$/)!=-1){c.isImg=true;c.style.visibility=”hidden”}else{return}}else{if(c.currentStyle.backgroundImage.toLowerCase().search(“.png”)==-1){return}}g=DD_belatedPNG;c.vml={color:{},image:{}};b={shape:{},fill:{}};for(a in c.vml){if(c.vml.hasOwnProperty(a)){for(d in b){if(b.hasOwnProperty(d)){f=g.ns+”:”+d;c.vml[a][d]=document.createElement(f)}}c.vml[a].shape.stroked=false;c.vml[a].shape.appendChild(c.vml[a].fill);c.parentNode.insertBefore(c.vml[a].shape,c)}}c.vml.image.shape.fillcolor=”none”;c.vml.image.fill.type=”tile”;c.vml.color.fill.on=false;g.attachHandlers(c);g.giveLayout(c);g.giveLayout(c.offsetParent);c.vmlInitiated=true;g.applyVML(c)}};try{document.execCommand(“BackgroundImageCache”,false,true)}catch(r){}DD_belatedPNG.createVmlNameSpace();DD_belatedPNG.createVmlStyleSheet();

 

 

总结:第一种用于单个控制比较方便,要是整站来的话,推荐第二种。

运行tomcat 7.0到myEclipse中报错Could not find the main class 解决办法

我出现的问题是当单独启动tomcat服务器时,能正常运行。担当通过MyEclipse来启动tomcat时就出错。百度一些网站上说是什么高版本的不能去编译低版本的,反正试试也没解决问题,最后在javaEye网站上的一篇文章上找到了解决方案。在这里顶一下javaeye 解决方案如下:在这个myeclipse 的tomcat配置中的classpath 中添加一个 tomcat7的tomcat-juli.jar包(tomcat7.0中的bin里面带有) 如何配置myeclipse中的tomcat呢? windows–Preference—MyEclipse——–Servers——tomcat—-Tomcat 6.x版本(下拉设置classpath)————enable—tomcat的安装路径—–apple———-ok 就可以了!!! 在MyEclipse中建立jsp页面 在工程名下的WebRoot文件夹,单击右键new —jsp 在file name文件框中出入jsp文件的文件名,就ok! 上面是真金实践,困扰了好久终得解决.

10个步骤让你成为高效的Web开发者

 

要成为高产、高效的 Web 开发者,这需要我们做很多工作,来提高我们的工作方式,以及改善我们的劳动成果。

下面是 10 个提高效率的步骤,虽然不能保证解决你在开发中的所有问题,但至少是非常实用的,可以简化你的 Web 开发流程,使开发的每一个环节快速、流畅。还可以帮助你节省大量的时间,以便开发更多、更好的项目。

1. 使用 Web 开发框架

一个良好的 Web 开发框架,可以帮助你:

  • 解决常见的 Web 开发问题,如标准的 Web 页面布局、Web 表单处理、浏览器兼容性解决等)。
  • 测试 Web 开发的 bug、安全和性能。
  • 使代码重用更容易,因为有一个统一的 API。
  • 社区开发的插件和工具,可以进一步增强开发(jQuery 有很多非常棒的插件,比如用户界面、图像和网页排版等)。
  • 遵循编码的最佳实践和伟大的编程设计模式,你甚至不用去思考。
  • 有开发社区和用户的支持,你可以获取帮助以及进行协作。
  • 初学者使用起来非常容易。

所有这些好处都可以节省你的时间以及提高项目的质量。

有很多 Web 开发框架你可以选择:

  • 完整的 Web 应用程序框架,如 Ruby on Rails 或 CakePHP。
  • JavaScript 框架,如 jQuery、MooTools 和其他许多鲜为人知但很优秀的用于处理用户界面、客户端逻辑和 Ajax 的 JavaScript 框架。
  • 如果你想加快视觉层设计,你可以使用一个 CSS 框架(如,Toast),或者网页布局框架(如,960 Grid System)。
  • 专门的框架,如用于内容管理系统开发的 WordPress 主题框架。
  • 现在还有移动 Web 应用程序开发框架。

  2. 建立一个代码片段库

IT 界的名言“不要重复发明轮子”。回收你的代码,创建一个你最喜欢和经常使用的代码片段集,并确保代码组织良好,可以被轻易搜索到。

最简单的方法是,你可以在硬盘中建立源代码目录。但这未必是最好的方式。

一种方法是使用允许保存代码片段的源代码编辑器或 IDE。例如,Notepad++的 SnippetPlus 插件和 Dreamweaver 内置的片段面板。


Adobe Dreamweaver 的片段面板

另一种方法就是使用专门的片段工具,如 Snippet 或 Snipplr.。

你甚至可以使用自己喜欢的代码库/版本控制系统,像 Git,来更好地管理你的源代码。

3. 使用正确的工具

这应该是显而易见的,确保你拥有一些优秀的、你知道如何更有效地使用的工具和装备。

如果你是一个网页设计师,你可能需要 Photoshop 和 Illustrator。如果你是一名开发人员,你需要一些优秀的 Web 开发应用程序,以帮助你完成工作。

当然,各领域之间、开发者之间的工具集是不同的。重要的是你的工具应该可以帮助你尽可能地高效完成工作。

4. 收集和整理免费设计资源

在网络上有许多网站放出免费设计资源。你可以将这些网站添加到你的 RSS 阅读器,它们每发布一个免费软件或资源,你就可能了解到。

对于一个设计师来说,这样可以得到大量的图标、PSD 模板、矢量插图、风景图像、按钮、GUI 元素、Photoshop 笔刷、字体库和各种其他的设计元素。

5. 冲刺式工作(短时间高效工作)

不要连续工作几个小时,这样你的效率可能会下降,随着时间的推移,你的工作品质也会下降。每次连续工作 10~20 分钟,可以保持你大脑活跃,可以更好地产生新的想法。

在短时间的工作,意味着你总是有一个新鲜的开始。

6. 休息

冲刺工作最重要的部分是休息。让你的头脑休息至关重要。利用这些休息时间将自己的工作区分开,干些其他工作或运动一下。

另外,除非有必要,否则不要计划你的时间。你不必每次都工作 15 分钟,然后休息 5 分钟。要选一个好的休息点,有一个舒适的休息。

你可以参考番茄工作法。

  7. 在学习上投入时间

短期内,不断学习、跟上行业形势并保持领先是很费时间的。

然而,通过在自我提高上投入时间,你可以在工作的其他方面节省时间,可以增加你的劳动成果并提高工作质量。

8. 不要过度规划

你不应该严格规划你的每一天。你的头脑需要有一定的灵活性,需要有时间去认真思考。

请一定要保持你的时间表灵活变化。我发现,超过规划的工作,我可能会一拖再拖。

9. 不要急于直接开始

这和过度规划是两个极端。虽然你不应该过度规划,但你需要计划下。

每当你开始一个项目的工作,确保知道你对这个项目的期望。做网页设计项目时,需要了解客户期望做的、首页内容、颜色设置等工作。

了解有关项目的某些内容,可能会使你工作在正确的方向,而不至于在黑暗中摸索。

在我开始客户的网站项目工作时,我需要先确定:

  • 颜色方案
  • 网站的目标
  • 他们能够提供的任何内容
  • 他们已经拥有的任何设计思路

10. 不要使事情复杂化

这可能是所有这些最重要的一条:不要使你的工作复杂化。不要做更多的工作,不要在给定的时间内为自己分配过多的工作。

我不主张给你的客户提供最少的交付时间,但你肯定也不能提供最长的时间。

要明白客户他们需要什么,不能多也不能少。

另外,不要制定过于复杂的开发战略。让事情简单一些。

来源:kuqin.com