Anytodo 是一款chrome浏览器的插件,可以与google task进行同步,进行任务管理。我的手机是安装的gtasks的免费版本,是足够使用的了,Anytodo的使用,也弥补了google task没有桌面的管理的空缺,推荐使用。Anytodo是一个基于html5的离线便签应用,可方便的与Google Tasks进行同步,主要功能包括:1. 双击空白处快速添加便签;2. 双击便签简单编辑内容;3. 点击编辑按钮,支持富文本编辑;4. 更换便签颜色;5. 拖动改变位置和大小;6. 更换主题;7. 离线访问;8. 后台同步;9. 定时提醒;Anytodo目前最新版本为1.1.1,更新内容如下:1. 添加了处理时间的同步;2. 修正了富文本编辑后,提醒和日期显示错误;3. 修复了同步中的一些问题,提高了同步效率;项目地址:http://code.google.com/p/any-todo/下载插件:Anytodo-1.1.1.crx 1.5 MB2012-03-26 17:39 更新Anytodo 1.1.2,可以从Chrome App Store现在安装了:安装地址:https://chrome.google.com/webstore/detail/maidakogkfgehlikodkefhfefnmfaiig
对于程序员来说,最终的也是最基本的目标就是能写出一手好的代码。随着代码量的增长,自身对什么是好的代码的认识也渐渐有了不断的调整。 1** 注释真的那么重要么?**最好的注释就是代码。这句话确实是没有错误的。如果一个函数占用了一屏的版面,原因是由于各种各样的注释和解释性的 // ** 等说明文档,确实是比较恼人的。与其花过多的时间花精力在注释和说明的编写上面,不如花时间在变量名的编写上面。 不能说没有注释的代码一定是天书。在程序员界来说,其实有许多是大家默认的约定,以php为例子如果说function getMsgBySsn($msgid, $ssn)function getMsgs($msgids);这样的语句其实不用注释完全是可以的。 这说明好的变量名和函数名是最好的注释!在做一个完整的项目的时候,看代码的过程中其实就是接受作者潜意识规约的过程。如果一个大的项目,所有的数据结构都使用一致的变量名,$msg, $chg, 那么这些变量名就已经赋予了完整的定义了。比如在一个项目中,在所有表示“消息”这个概念的地方,不管是参数还是返回值,完全都只使用$msg这么一个array()那么,虽然我没有在每个引用的地方加大篇幅说明$msg中的key和value是什么,只要读者追着看到这样的函数:function getMsg(){ $msgid = self::getMsgid() return array( ‘msgid’ => $msgid, 'ssn' => self::getSsn($msgid), 'title' => self::getTitle($msgid), );}是不是/** Msg包含 msgid,ssn,title **/这样的注释更好呢?当然,好代码在变量都一定会遵循的规则是:一个项目一个意思的东西,一定只有一个规定的变量名好的代码会由于一个或两个变量名起的不对而不惜一次一次的svn commit,最后出现的代码一定不会让你失望的。 2 代码的简洁性你总是能感叹到为什么有的人写的代码是这么让人舒服。让代码简单并不是一件容易的事情。这需要相当的代码能力才能有这样的能力。比如这么一个函数,明明可以更简单的:function example(){ $iMsgid = $this->getMsgid(); $sTitle = $this->genTitle($iMsgid); $sContent = $this->genContent($iMsgid); $result = array( 'msgid' => $iMsgid, 'title' => $sTitle, 'content' => $sContent, ); return $result;}我宁可选择写成这样:function example(){ $msgid = $this->getMsgid(); $title = $this->genTitle($msgid); $content = $this->genContent($msgid); return compact('msgid', 'title', 'content');}不妨能不能用更少的代码行数写出一样功能性的代码。代码的量一旦减少,给的信息就是:犯错的概率也更少了 最近在新项目组有几个感想:1以前经常觉得有很多函数必须要很详细的参数说明什么的,其实大都都是可以使用OO的方法来使代码更优美比如function($msgid, $title, $content, $ssn)为什么不是使用function($msg)呢?开始我认为,$msg这样传入并不知道里面包含的key和value是什么,对代码的阅读性造成障碍但是后来想想,其实这是因为我在阅读到这个函数的时候并没有$msg是一个对象的概念,也就是前面的代码并没有在人的潜意识里面栽种下这个对象的概念。那么前面的代码应该改了…………2 好的代码不是一次性写出来的,一定是一次一次svn commit堆积出来的,你会看到某大牛为了一个空格,一个文件名是使用cron还是shell, 一个变量名(比如getMsg($Msgid) => getMsg($msgid))而进行一次又一次的改动最后得出的代码真的是“干净”的! 原文网址:http://www.cnblogs.com/yjf512/archive/2012/03/15/2399532.html
推荐给oracle11的简装版给开发测试人员,不用去装那么几百兆大的原版了。 作者: iihero@CSDN, 2012.3.11. 请尊重个人劳动。如若转载,请注明原始出处。Thanks.下载地址:http://download.csdn.net/detail/iihero/4131001(免责声明):这是一个精简版的oracle11g for windows 32bit x86平台.此压缩包,仅供学习研究使用,本文作者不负任何责任。适合于开发人员使用。切不可将其用于商业用途,请遵守Oracle公司相关商业规定。如因私自将其用于商业用途,由此带来的法律纠纷或其它问题,概与本人无关.author: iihero@CSDN (iiihero AT hotmail.com; iihero AT qq.com)0. 如果你已经安装了别的版本的oracle,请自行备份注册表:[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE], 这样即算有冲突,你也可以重新导入以前的注册项而得已恢复1. 将压缩包解压至目录,设该目录值为: d:,其下将有目录:<D>/oracle/*<D>/oracle/11.2.02. 新的ORACLE_HOME将为:<D>/oracle/11.2.0运行完iihero.ora11g.bat运行完以后,(一个批处理一次安装全部完成)你需要将<D>/oracle/11.2.0/BIN添加到path里头缺省的ORACLE_SID为iihero,你可以自行修改iihero.ora11g.bat中的SID值,不要超过8个字符。3. 安装完以后,别忘了添加环境变量ORACLE_SID=iihero以及将%ORACLE_HOME%/bin添加到PATH环境变量里头,在这之后,即可使用sqlplus system/manager进入并修改密码,执行表空间、用户管理相关操作。如: 1: [sql] view plaincopy 2: D:Oracle>;sqlplus system/manager 3: 4: SQL*Plus: Release 11.2.0.1.0 Production on 星期日 3月 11 13:14:35 2012 5: 6: Copyright (c) 1982, 2010, Oracle. All rights reserved. 7: 8: 9: 连接到: 10: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production 11:With the Partitioning, OLAP, Data Mining and Real Application Testing options 12: 13: SQL>; quit 14: 从 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production 15:With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开 欢迎大家试用,如果发现有什么问题,可以与本人联系。这个11g的包,既可充当server,同时也可以用作oci, jdbc,sqlplus,odbc等的客户端工具。还是比较齐全的。11g比10g的非安装包,确实大了不少。10g的时候,总共才50M不到,这不,到了11g,压缩完以后,也有100来兆。不过,不管怎样,比原始的安装包,那可是小了很多了。作者地址:http://iihero.iteye.com/blog/1450186
在IT领域做自由职业者是很合适的。有很多开发者都有过做自由职业者的经历。有很多书籍和文章将了如何让客户满意以及如何及时的交付正确的软件。但是很少文章讲述客户在项目过程中应该如何做。虽然客户付了钱,但这并不意味着我们要容忍他们非常粗鲁的态度和错误的习惯。1. 好的软件一定不便宜我常常遇到的一个问题是,客户想要花不到500欧元建立一个全功能的企业网站。这个价钱你可以找我隔壁的12岁小男孩,用Joomla帮你搭一个,但是专业的软件开发者,懂得软件架构,懂得如何开发安全,稳定,能良好运行的软件的一点比这个价格要贵很多。软件开发和别的职业是一样的,需要花大量的时间学习。除此以外,很多客户往往在合同以外要求添加一些功能,免费的。你的医生不会免费工作,你的扫地阿姨不会免费工作,你也不会免费,为什么要求软件工程师免费工作?我有见到很多客户雇佣了一些便宜的、自称专业的开发者,或者外包开发到印度,越南,结果往往很失望。这些渠道看上去是便宜了一些,但是后期的软件维护成本非常昂贵。所以很多客户尝试了一次以后,还是回头来找我开发。2. 需求要明确我们知道一开始就能列出所有详细的需求是很困难的。这也是为什么我们发明了敏捷开发这样的技术。但是如果你给我们错误的需求,我们也只能交付错误的软件。你可以因为软件不好用而责怪我们,但是你给了我们不对的需求在先。最终浪费了双方大量的时间,也浪费了很多钱。软件开发者也许很聪明,但是只有你了解你的业务需求!3. 好的软件需要配合完成为了交付一个好的软件,开发者应该在项目中全力以赴。但是客户也不能坐在一边对这个项目不闻不问。如果你想要你的软件按时、正确的交付,你应该和开发者保持联系,所以我们能及时发现问题并修正。这并不需要你无时无刻的盯着我们工作,你只要及时的回复我们的email就可以了,比如说24个小时之内。我有遇到过一些客户,在合同签完以后彻底消失,然后到软件交付的时候,跟我讲为什么没有开发完成?你说呢?!4. 并不是所有的功能都是可见的没有绚丽的界面和大量的新功能并不意味着我们没有努力工作。事实上,大量的工作都是和前台无关的。这也是为什么我们应该投入资源来改进后台的代码。根据 Pareto Principle http://en.wikipedia.org/wiki/Pareto_principle ,20% 的代码 解决了80% 的问题。这些问题有可能是服务器性能瓶颈或者数据损坏。虽然你花钱在这些方面你看不到软件的界面变化,但是它是值得的。5. 提前给出准确的时间预测很困难在任何一个领域,给出项目的时间预测是一件困难的事情。在IT领域更是如此,因为客户往往不知道他们到底想要什么。告诉我们你的想法,我们会给你一个时间估算,仅仅是估算。需求往往在开发过程中变化,所以不要老拿预估的时间来说事。6. 程序员也是人我们也许工作起来,思维方式像是机器人,我们也许长时间在办公室里不出来,但这并不意味着我们不是人类。当你在餐馆吃晚饭,或者做飞机安全着陆的时候,你会对厨师和飞行员表示感激,当你的家人在医院治愈的时候,你会对医生表示感激。那么请也把这份感激、尊重带给我们。7. 告诉我要做什么,不要指挥我怎么做你描述你的问题,让专业的人来提出解决方案。请让开发者做他擅长的事情:解决你的问题。在IT领域,开发者懂的往往远远比客户多。也就是说开发者知道不同的方案的优点与缺点,他会选择正确的解决方案。请不要把简单的问题复杂化,不要告诉我们如何解决问题,专业的问题由专业的人来解决,可以节省你的很多时间和金钱。8. 听听我们的建议正如上一段提到的那样,开发者在技术领域也许比你(客户)懂的多。如果你想要在你的网站放一个自动播放的视频,而开发者建议你不要这么做,那么听他的。因为他已经做过类似的案例,并且知道自动播放让很多人很厌烦。你喜欢这个视频,但是其他人不一定。如果你的开发者建议你不要使用Flash,那么相信他。他知道使用Flash的不好的地方,也许你不知道。结论软件开发者需要做所有的努力来完成一个好的软件。有很多书籍讲述了关于如果控制软件质量,怎么做需求分析,敏捷开发等等。但是作为客户,你也应该遵循一些基本的原则。最大的问题往往是客户希望项目的预算越低越好,却不断的更改需求,还没有很好的沟通。原文链接,OSChina.NET 原创编译
曾经我们都是被雷锋包围的人,小时候,听到最多的就是雷锋、赖宁……现在雷锋再次响起来了,靠一个口号,还能干什么啊!原文:三月里有这么一天,属于一个死去多年的人。三月五日,因为毛泽东的题词而被官方钦定为一个盛大节日。这个“节日”,在大陆中国人的生活中一直是一个坎儿,总要“跨一下”才能迈过去。雷锋,在22岁那年死于意外伤害,如果活到现在,已经是72岁高龄的老人了。他也确实老了,进京领受光荣的雷锋班班长抱怨:孩子们已经不认识雷锋了。作为一个神圣的精神符号,雷锋一直搅动着许多人的神经。当好人,做好事,他们理解的雷锋便是这样。问题在于,这样的理解绝非官方所乐见,他们总要加一个不容置疑的定语在前头:永远跟党走,把党的温暖送到千家万户。听党的话的人,才叫好人;做为党争光的事,才能叫好事。雷锋的解释权在意识形态掌控者手里,他们绝不会放任他被矮化为一个泛爱志愿者。真假难辨的“雷锋日记”以及诸多“平凡而伟大”的英雄事迹,塑造的就是一个具有高度党性原则的“毛泽东的好战士”,无条件听从党的指令,以为党献身为最高目的的“革命烈士”。雷锋显得非常纯粹,因平凡而有说服力,因忠诚而令人自惭形秽。在他面前,每个人都很纠结:既膜拜又嫉妒。我们为什么不能心无杂念,把自己锻造成为坚定的共产主义战士,毛主席的好学生?这是一道考题,给予人无限的憧憬:如果你愿意,你也能。雷锋可以无穷地复制下去。这是文宣操盘手最得意的阳谋:让你误以为够得着,你就会模仿去做。孤儿雷锋,在新政权启发下,迅速完成了革命化的进程,他接受了阶级社会和阶级斗争的概念,爱憎分明:将亲人之死怪罪于以前的社会,不幸的根源在于存在一个“剥削阶级”,他们的本质是吸血鬼,只有将他们铲除干净,才有好日子过;带给穷苦大众好日子和奔头的,是共产党和毛主席——在当时的宣传语境里,共产党其实就是毛主席的党,毛主席就是全能的神祗,他创造了万物,又被万物所感恩。感恩,然后奉献生命,就是人民中国主人翁们的天职和使命。通过否定历史和宗教,也借助血腥的祭祀,新政权把寄生麾下的人民变成了精神孤儿。他给予他们一个崭新的主:革命领袖毛主席。膜拜,服从,牺牲,信众前面只有华山一条路。一个渴望向上爬的人必然走到雷锋那一步。所以,雷锋是自我趋附与政权塑造的产物,不存在一个赤子雷锋。他所做的一切都是规定动作,不过他做得更可爱些罢了。读“雷锋日记”,我看到的是一个极度自虐和受虐者的表白,他的人生就是用来证明忠诚的。在一次次被组织确认的过程中,他获得了极大的快感。他得到了自我实现,书写那些多情的文字,一点也不会痛苦,反而充满了莫名的快乐。向组织交心是痛苦的,但交出去之后却是兴奋。因为能被信任而得到交心的机会,这才是归属感的获得。自己人,同志,获得这样的认可,意味着一个年轻人不可限量的前途。雷锋正在向风光无限好的高处攀去。写日记就是给组织看。整个社会处于“做好事表忠心”的全面竞争状态,谁做得极端谁就有机会。写日记就是自我表现,准备被伯乐“发现”。那时的英雄都有一本日记:记录自己学习毛泽东思想狠斗私字,灵魂深处爆发革命,脱离低级趣味,成为革命战士的过程。那样做,是怀有出人头地的梦想:期待出现奇迹,从而改变命运。“雷锋日记”既出,一个私密的文体便沦落为一个无耻的婊子,人们被迫泯灭自己的内心生活,把一颗扭曲的心交给了魔鬼。当时,人群被强行分成两类:地富反坏右牛鬼蛇神和贫下中农革命后代。不甘于灭亡的坏人得有“表现”,才能免于更残酷的命运;革命后代,谁能出类拔萃,引人注目,就能有机会步步高升。异常策略才能获胜,所以,大家挖空心思,制造奇迹,在为新时代制造祥瑞,人伦惨剧骇人听闻,自镇压反革命、批判胡适、反右到大跃进以后的中国大陆,基本上处于不可理喻的癔症状态。雷锋的出现毫不奇怪。他只是恰巧被看中了。他的死本是一场事故,中止了沈阳军区培养长线大英雄的计划,只得将错就错,提前让“英雄”出笼。他们费心揣摩:一个平凡的士兵应该更合上面胃口。他们押对了宝。这个恭顺、热情,一心向党的战士,得到了毛泽东们的首肯。通过题词,年轻的雷锋被纳入共产主义英雄的谱系之中,而且后来者居上,成为一尊老少皆宜的菩萨英雄。在雷锋身上,完全消灭了欲望,向上爬成为红色接班人的欲望除外。一个二十岁左右的青年,“纯洁”地生活着,令有私欲的人无地自容。他从不会有寂寞、无聊的时候,反省、学习、做好事,我们看到的就是这么一个无欲的英雄,犹如一团烈火,除了燃烧还是燃烧。他的所有缺点都是可爱前提下的瑕疵,甚至因为瑕疵的存在而更显高尚。在他心里有一个光明的世界,被毛泽东思想照耀而自足的世界。生命的摸索,性的尝试,对死亡的恐惧,这些内容一概失踪了。更不存在对未知的探求,真理就是毛主席,每个人所需要的就是相信,无须费力去寻找。一个明亮得单纯得令人窒息的世界:不存在未知,无须知道未知,一切都是已知,是信服。在这样的精神空间里,思想停止发育,人变得“单纯”,实则是愚笨和呆滞。人们那股玩命的工作热情,除了出于表现不得不之外,恐怕也是一种宣泄——压抑的精神总归要有自己的出口。反右,大跃进,疯狂的饥饿,在他身上无一丝痕迹。他永远生活得光明灿烂,还有捐不完的余钱。温柔的温暖的雷锋,抹去了专制黑暗年代的残酷底色,为其涂抹上厚厚一层胭脂,让处于痛苦和饥饿的人望梅止渴,让后来者产生伟大的错觉,以为存在过一个春风般温暖的和谐社会。雷锋和他的缔造者,虚构了一种梦幻般的同志式人际关系。这就是为什么有不少过来人不愿意推倒偶像。雷锋存在的前提是,懒汉辈出,人人不能自立,政府完全失职。在他死后50年后,当局高调重振学雷锋运动,是企图用“雷锋精神”替代信仰缺失,安慰感觉冰冷的人群,让他们重新回到感恩的戏剧情境中去,舍不得离开即将倾覆的泰坦尼克号巨轮。你可以通过行政指令逼迫学生学雷锋,也会有轰轰烈烈的喧闹效果,但最终会激起强烈的厌恶感,他们不可能认同一个虚假的偶像。我读“雷锋日记”时,体验到非常可怕的荒谬感。强行推行学雷锋,必然造成青少年人格分裂,强化整个社会的伪饰作假风气。解决政权合法性危机,正途是还政于民,真心建设公民社会,而非回到愚昧的感恩社会。执政者要下决心剥离祖国和政权的畸形捆绑关系,从自我神化和强迫国民畏惧自己的状态中解脱出来,你只是一届政府,不是祖国的化身,更不可能是上帝。政治不文明,则社会无道德。即使退一万步,雷锋式的“做好事”绝不是行善。爱人之善发自内心,鼓励人向善的宗教信仰是其源泉,他不为外在目的而生。心端正了,无道德社会才有可能逐步转向道德社会。毫无疑问,雷锋是黑暗专制时代的病态样本,是一个主体性丧失的悲剧人物。在这个甘于做驯服工具和螺丝钉的人身上,不会存在什么道德富矿。在薄熙来的“唱红打黑”破产之后,彻底抛弃那个年代的“政治遗产”,切断与毛泽东时代脐带联系,已经成为考验当权者有无勇气前行的试金石。一个人人渴慕的新新中国,容不得任何一尊愚民之神。来源:FT中文网链接:http://www.ftchinese.com/story/001043439
java代码效率优化1、 尽量指定类的final修饰符 带有final修饰符的类是不可派生的。如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的 final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50% 。2、 尽量重用对象。特别是String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。3、 尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽 可能使用堆栈变量》。4、 不要重复初始化变量默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和 double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链 中的所有构造函数都会被自动调用。5、 在JAVA + ORACLE 的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻ORACLE解析器的解析负担。6、 Java 编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,即使关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致严重的后果。7、 由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内 存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象 使用完毕,应手动置成null。8、 在使用同步机制时,应尽量使用方法同步代替代码块同步。9、 尽量减少对变量的重复计算10、尽量采用lazy loading 的策略,即在需要的时候才开始创建。11、慎用异常异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地 (Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过 程中创建了一个新的对象。 异常只能用于错误处理,不应该用来控制程序流程。12、不要在循环中使用:Try {} catch() {}应把其放置在最外层。13、StringBuffer 的使用:StringBuffer表示了可变的、可写的字符串。有三个构造方法 :StringBuffer (); //默认分配16个字符的空间StringBuffer (int size); //分配size个字符的空间StringBuffer (String str); //分配16个字符+str.length()个字符空间你可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能。这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer的缺省行为,然后再找 出一条更好的提升性能的途径。StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长 度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候,它会将自身 容量增加到当前的2倍再加2,也就是(2旧值+2)。如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到 34(216+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何事只要StringBuffer到达它的最大容量它就不得 不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍――这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了 的,这样会带来立竿见影的性能增益。StringBuffer初始化过程的调整的作用由此可见一斑。所以,使用一个合适的容量值来初始化 StringBuffer永远都是一个最佳的建议。14、合理的使用Java类 java.util.Vector。简单地说,一个Vector就是一个java.lang.Object实例的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但 是,Vector类型的对象在创建之后,对象的大小能够根据元素的增加或者删除而扩展、缩小。请考虑下面这个向Vector加入元素的例子:Object bj = new Object();Vector v = new Vector(100000);for(int I=0;I<100000; I++) { v.add(0,obj); }除非有绝对充足的理由要求每次都把新元素插入到Vector的前面,否则上面的代码对性能不利。在默认构造函数中,Vector的初始存储能力 是10个元素,如果新元素加入时存储能力不足,则以后存储能力每次加倍。Vector类就对象StringBuffer类一样,每次扩展存储能力时,所有 现有的元素都要复制到新的存储空间之中。下面的代码片段要比前面的例子快几个数量级:Object bj = new Object();Vector v = new Vector(100000);for(int I=0; I<100000; I++) { v.add(obj); }同样的规则也适用于Vector类的remove()方法。由于Vector中各个元素之间不能含有“空隙”,删除除最后一个元素之外的任意其 他元素都导致被删除元素之后的元素向前移动。也就是说,从Vector删除最后一个元素要比删除第一个元素“开销”低好几倍。假设要从前面的Vector删除所有元素,我们可以使用这种代码:for(int I=0; I<100000; I++){v.remove(0);}但是,与下面的代码相比,前面的代码要慢几个数量级:for(int I=0; I<100000; I++){v.remove(v.size()-1);}从Vector类型的对象v删除所有元素的最好方法是:v.removeAllElements();假设Vector类型的对象v包含字符串“Hello”。考虑下面的代码,它要从这个Vector中删除“Hello”字符串:String…
密码问题现在紧急问题,当CSDN的密码被曝光以后,数据文件里面我也很容易的找到了我的密码。选择一个安全策略很重要!转一篇很有指导的文章。个人密码安全策略 我们现在处于网络时代,时常要登录各种网站、论坛、邮箱、网上银行等等,这些访问常需要帐户+密码的身份认证,因此我们不断地注册用户,就有了数不清的网络帐户和密码。大多数人为了便于记忆,习惯只用一个常用的网络用户名、邮箱和密码,这是非常危险的。那么,网上的密码我们应该怎么设置,才能相对安全一些呢? 总的来说,个人密码安全需要遵循如下几个简单的要求:对于不同的网络系统使用不同的密码,对于重要的系统使用更为安全的密码。绝对不要所有系统使用同一个密码。对于那些偶尔登录的论坛,可以设置简单的密码;对于重要的信息、电子邮件、网上银行之类,必需设置为复杂的密码。永远也不要把论坛、电子邮箱和银行账户设置成同一个密码。具体的设置策略如下:一、将自己常用的网站分类:大网站、小网站、重要网站、普通网站1、大网站 大网站为可以信任的、安全的网站,例如用户为数亿的几个门户网站(腾讯、谷歌等),这类网站理论上安全性较好,常规情况下用户密码不易泄漏,并且都会提供绑定手机号功能,这类网站应该不超过十个。2、小网站 大网站之外的网站都算小网站,是不可信任的网站,在上面保存的密码随时可能泄漏,并且可能是密码明文泄漏。3、重要网站 涉及到网络使用的核心网站,例如主要的电子邮件、网银、网上支付、域名管理等,这类网站如果被黑客攻破,则会引起个人资产损失或者相关其他网站服务被攻击,损失巨大。4、普通网站 重要网站之外的网站。二、将自己的常用密码分类:弱密码、中密码、强密码1、弱密码 最容易记忆的,且默认是可以丢失的密码。 各类中小网站、论坛、社区、个人网站等使用。 原因:这些网站的安全性可能都不太好,有些只是将密码MD5一下存储,有些可能还会明文存储密码。黑客很容易从这些网站盗窃用户的密码。2、中密码 中等强度密码,8个字符以上,有一定抗穷举能力的。 中等密码主要在国内门户网站、大型网站、门户微博、社交网站等使用,但不要在主要邮箱里使用。门户网站最好绑定手机号码。 原因:大网站的安全性较好,通常被破解的可能性低,在大网站使用的密码要强度可以稍强。 需要注意的是,有些门户网站(例如新浪、搜狐等)即提供微博,又提供邮件系统,如果系统默认建立了这些邮箱,那建议不要在任何地方使用这些邮箱,如果要使用邮箱,最好确认该邮箱具有独立密码功能。 其中有一个例外是腾讯邮箱,腾讯邮箱支持邮箱的单独密码,设置好了以后,用户需要输入QQ密码和邮箱密码两个之后才能使用。 所有游戏帐号使用单独的密码。3、强密码 强密码要求至少8个字符以上,不包含用户名、真实姓名或公司名称,不包含完整的单词,包含字母、数字、特殊符号在内。 强密码主要用于邮箱、网银、支付系统等。 这类网站是最核心最重要的网站,网银涉及到用户的财产安全,邮箱则可以重置用户所有注册过的网站密码,因此这类网站一定要用强密码,保证其绝对安全性。 密码穷举对于简单的长度较少的密码非常有效,但是如果网络用户把密码设的较长一些而且没有明显规律特征(如用一些特殊字符和数字字母组合),那么穷举破解工具的破解过程就变得非常困难,破解者往往会对长时间的穷举失去耐性。通常认为,密码长度应该大于8位,密码中最好包含字母数字和符号,不要使用纯数字的密码,不要使用常用英文单词的组合,不要使用自己的姓名做密码,不要使用生日做密码。三、电子邮件使用规范1、邮箱类型 个人邮箱并非越多越好,只要两个个人邮箱即可(工作邮箱除外),关闭那些没用的邮箱,或者清除其内的所有内容,不在任何地方使用这个邮箱。 邮箱分为两个类型,主要邮箱和次要邮箱,重要服务用主要邮箱来申请,一般服务用次要邮箱来申请。 主要邮箱建议使用Gmail建立,绑定用户的手机,并设置二步验证的手机动态密码,目前世界上只有Gmail信箱支持手机动态密码,增加手机动态密码之后,黑客即使重置了用户的Gmail密码,依旧无法登录该帐号,除非用户手机同时也被盗。有了动态密码,一旦用户信箱被攻击,用户有足够的时间通过手机修复密码。 Gmail的辅助邮箱可以不使用,或者用一个可以,辅助邮箱的安全性一定要高,不容易被攻破。 对于Gmail的访问还有一点,就是不要用Hosts来访问Gmail,不要把www.google.com放入到Hosts文件中,否则将对Gmail的安全性产生极大的威胁。2、动态密码设置 对于经常受到攻击的Gmail用户,强烈推荐使用Gmail的“两步验证”功能,具体方法是,先登录Gmail,然后访问这个地址,之后根据提示安装一个iPhone或Android应用,即可实现动态口令,极大增强了Gmail的安全性。 Gmail的“两步验证”支持iPhone和Android手机,实际上属于动态密码的一种类型。动态密码(Dynamic Password)也称一次性密码,它指用户的密码按照时间或使用次数不断动态变化,每个密码只使用一次。由于每次使用的密码必须由动态令牌来产生,而用户每次使用的密码都不相同,因此黑客很难计算出下一次出现的动态密码。不过动态密码对手机要求较高,需要iPhone或Android这样的智能手机。 除了Gmail邮箱之外,腾讯QQ邮箱也是国内使用较为广泛的邮箱,使用腾讯QQ邮箱时需要注意,一定要设置双密码(邮箱单独密码),如有需要则打开腾讯的QQ手机令牌,QQ手机令牌是腾讯公司的一款QQ安全软件,通过验证30秒动态密码来保护QQ帐号、Q币Q点和游戏装备等,不过目前QQ邮箱还不支持手机令牌方式登录。 很多人觉得动态密码不方便,不愿意使用,这是不对的。方便性固然是好的,安全性是更重要的,重视用户密码的管理,虽然增加了一点点不便,但是你可能将会因此避免极大损失。3、邮箱密码 邮箱的密码绝对不要和其他任何网站的密码相同,要使用8位以上的强密码。 邮箱是密码管理中的核心和关键,通过邮件重置密码功能,可以获得用户大部分网站的密码,因此一旦邮箱密码被黑,会导致用户全部密码体系失控,Gmail动态密码虽然看起来麻烦一些,其实也并非每次都输入,在单台电脑可以三十天再输入一次。QQ的手机令牌也可以设置各种方法来减少输入动态密码的次数。 在邮箱使用过程中要注意,使用主要信箱和次要邮箱注册不同的网站,重要服务用主要邮箱来申请,一般服务用次要邮箱来申请。大网站用复杂的密码,小网站和论坛使用简单的密码。如果注册的网站被盗,需要尽快通过电子邮件进行重置密码。 对于那些小网站,在里面设置密码只能当没有,因为我们不知道这些网站是怎么保存密码的,其网站也随时可能被黑,因此只能保证注册邮件不被黑,可以用其重置密码。4、“找回密码”设置 “找回密码”是一个关键的邮箱安全设置,很多黑客破解邮箱是通过“找回密码”进行破解的,因此如何设置“找回密码”的安全问题是一个很重要的环节。 什么是“找回密码”中不安全的问题,主要有“你的生日?”(你会在其他社交网站录入自己的生日);“你的姓名?”(熟悉你的人都知道你的姓名);“你的出生地?”(通过身份证号码可以算出你的出生地);“你的手机号码?”(太多的地方容易泄漏你的手机号码);等等。 这样,通过一些毫无技术含量的操作,别人就很可能重置你的邮箱密码。 所以,“找回密码”应该设置为一个只有你自己知道答案的问题,自己不会轻易告诉他人,别人通过正常方法很难知道,例如“你中学时候暗恋的人叫什么”、“你初三时的同桌叫什么”、“你小学时最好的朋友叫什么”、“你第一个初恋情人叫什么”等等,这些问题通常别人很难猜到。 归纳:1、核心邮箱可选用Gmail,启用其两步认证,因此密码被盗黑客也进不去,除非手机同时也被盗。2、用这个信箱注册其他网站,用不同的密码,大网站用复杂的密码,小网站和论坛使用简单的密码。3、邮箱使用单独的复杂密码,不要和其他网站密码相同。四、网银使用规范 尽量少开通网上银行,如有必要,则开通那些口碑较好,较少发生过安全事故的网银,例如招商银行的网银。开通网银后使用数字证书,最好申请USB Key,USB Key使用了双钥加密,私钥安全地保存在Key中,在网络应用的环境下,可以更安全,弥补了动态密码锁单钥加密的一些缺陷。由于用户私钥保存在USB Key密码锁中,理论上使用任何方式都无法读取,因此保证了用户认证的安全性。除非黑客获取到用户USB Key的物理硬件,否则很难攻破用户的网银。 银行取款密码不要和任何其他密码相同。网上银行密码不要和取款密码相同,也不和其他网站密码相同。 对于支付宝来说,一定要安装数字证书,支付密码和登录密码不要一样,把支付宝帐户认定为实名,同时开通手机、邮箱绑定,如果还想更安全一点再申请个支付盾。 归纳:少开通网上银行,网银申请USB Key配合使用。支付密码和登录密码不同。银行、网银、主要电子邮件的密码安全最为重要,需要重点保护。网银使用单独的复杂密码,不要和邮箱及其他网站相同。五、总结 密码是个人网络信息安全的钥匙。在网络非常发达的今天,网上木马病毒横行,我们应该好好设计一下密码安全,才能保障网上银行安全、网上信息安全、网上交易安全,遵循上面介绍的个人密码安全策略,可以较为有效地提高用户个人密码的安全性,防止自己的个人信息遭受威胁和攻击。原文网址:http://www.williamlong.info/archives/2937.html
导语:数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程。下面给出了20个数据库设计最佳实践,当然,所谓最佳,还是要看它是否适合你的程序。一起来了解了解吧。1. 使用明确、统一的标明和列名,例如 School, SchoolCourse, CourceID。2. 数据表名使用单数而不是复数,例如 StudentCourse,而不是StudentCourses。3. 数据表名不要使用空格。4. 数据表名不要使用不必要的前缀或者后缀,例如使用School,而不是TblSchool,或者SchoolTable等等。5. 数据库中的密码要加密,到应用中再解密。 (其实就是散列存储、单向加密)6. 使用整数作为ID字段,也许现在没有这个必要,但是将来需要,例如关联表,索引等等。7. 使用整数字段做索引,否则会带来很大的性能问题 。8. 使用 bit 作为布尔字段,使用整数或者varcha是浪费。同时,这类字段应该以“Is”开头。9. 要经过认证才能访问数据库,不要给每一个用户管理员权限。10. 尽量避免使用“select *”,而使用“select [required_column_list]”以获得更好的性能。11. 假如程序代码比较复杂,使用ORM框架,例如hibernate,iBatis。ORM框架的性能问题可以通过详细的配置去解决。12. 分割不常使用的数据表到不同的物理存储以获得更好的性能。13. 对于关键数据库,使用安全备份系统,例如集群,同步等等。14. 使用外键,非空等限制来保证数据的完整性,不要把所有的东西都扔给程序。15. 缺乏数据库文档是致命的。你应该为你的数据库设计写文档,包括触发器、存储过程和其他脚本。16. 对于经常使用的查询和大型数据表,要使用索引。数据分析工具可以帮助你决定如何建立索引。17. 数据库服务器和网页服务器应该放在不同的机器上。这回提高安全性,并减轻CPU压力。18. Image和blob字段不应该定义在常用的数据表中,否则会影响性能。19. 范式(Normalization)要按照要求使用以提高性能。Normalization做的不够会导致数据冗余,而过度Normalization 会导致太多的join和数据表,这两种情况都会影响性能。20. 多花点时间在数据库设计上,否则你将来会付出加倍的时间来偿还。来源:http://www.cnblogs.com/gaolonglong/archive/2012/02/07/2341004.html
总结起来还是要有规范,规范到习惯。 代码易于维护,分为两个方面:容易阅读理解;容易修改扩展。一、如何写出容易被阅读和理解的代码1. 最根本的一条,要向写文章学习,有目录,有大纲,有标题,有段落,有适当的提示。1.1. 首先是目录结构,这个在一些比较好的实践中,有约定俗成,比如Rails应用,app目录下一定分controllers、models、views、helpers四个目录。再加上config、lib、vender,大致的代码在哪个位置,不用猜都知道。越是常见的项目类型,越是应该按照约定俗成来构建项目的目录结构,不要别出新裁。对于没有业内参考的项目,目录结构也尽可能采用简单、易懂、含义固定明确的单词,比如:core、config、test这样的命名。1.2. 包名与文件名,在这方面,java语言的规范非常值得其他语言参考和借鉴,分层组织,合理命名。是最重要的。1.3.一个源代码文件里,要不要有注释?我认为,尽可能不要,还是要像写文章一样,让人阅读起来,有感觉。比如:文件名,类名,方法/函数名。如果将所有的实际代码全部折叠起来,顺序的阅读这些名字,能不能让阅读者,对于这一个源文件的内容和目的,有大概的了解?再强调一次顺序阅读,一个 源程序文件内有很多个函数/方法,这些方法的排列次序,是有意义的。仅仅依靠调整次序,比如:构造函数,扩展构造函数,简单的读写函数,业务相关的函数。以这样的次序来排列,会更加便于阅读。在必须写注释的地方,也不要写得太多,言简意赅,把要点用1.2.3.讲清楚。1.4. 变量名,常数名,我们必须一再一再的强调命名的重要性,可以说,命名是软件开发中,头等重要的大事。要简洁、清晰、全英文(决定不要汉语拼音、任意缩写)、尽可能不要夹杂数字,比如var1、var2这样的变量名,就是最糟糕的。2. readme在项目开发的过程中,定期整理一份readme,放在项目的根目录,主要包含两部分内容:我们的代码做了些什么?如何查找我们写的代码。3. wiki团队开发,尽可能维护一份wiki,自己架一个mediawiki或者其他wiki,都是很简单的。或者自己架一个redmine这样的集成项目管理工具,该有的就都有了。wiki的管理维护是一个很大的话题,这里就不再展开了。4. 单元测试@李楠 和@KevinWei 已经提到了。 这个办法,既方便阅读理解代码,也方便修改代码。非常重要。5. Code Review@KevinWei 也已经提到了。二、如何写出容易被改写和扩展的代码1. 单元测试,最好全过程采用TDD(测试驱动开发)这样才能让人有信心修改你的代码。2. 参考业内成熟实践与设计模式这个事情,要多讲一句,千万不能过头。为了追求可扩展性,可重用性,甚至仅仅是为了玩弄设计模式,会让一个项目成为过度设计的牺牲品,千万不能过头。3. 定期重构一上来就向设计模式靠拢是很危险的,重构时以设计模式为参考会好一些。但是,大多时候,我们没时间重构。。。所以,还是TDD最实在,按照TDD的工作模式,你的项目几乎每天都有大大小小的重构。4. 结对编程这个@李楠 已经提到了。让知识在团队中不只是一个人掌握,很重要。大概就是这些吧。。。来源:http://www.zhuangbiaowei.com/blog/?p=449