项目管理对一个项目的设计和开发起着至关重要的作用;因此选择一个项目管理工具有时候是非常讲究的。它完全取决于你的需求,你是需要任何时候都可以提供在线方案,或只是一个本地应用。 项目管理是管理该项目计划,定义,监控,控制以及交付的过程,因此它的优势是大家公认的。项目是即时的,唯一的,是极力的去完成某一既定目标的。项目管理是为不断变化的项目提供专业的管理。 whats_java 翻译于 昨天(10:59) 0人顶 顶 翻译的不错哦! 它不仅包含技术还有工具的使用来描述,管理,发布一系列活动成果,预算及时限。你需要的工具是一个能满足你所有关于项目管理的需求。 随着不同地域的软件产业提出越来越多的明确需求,需要一个更好的免费的项目管理工具来管理越来越高效的软件。一个高效的好的项目管理必须是健壮的快速的且必须包含以下几个特点: 项目时间点安排 成本控制 资源分配 预算管理 文档管理 通力协作 沟通交流 在这篇文章里,我们将特别讨论10个最佳的免费项目管理工具,这将会对你的项目管理有所帮助。 whats_java 翻译于 昨天(11:20) 0人顶 顶 翻译的不错哦! OpenProj 这是一款免费并且开源的桌面应用用于替代到微软的项目中。OpenProj为桌面应用项目的管理人员提供了完美的解决方案,并且它在Unix,Linux,Windows甚至是Mac上都是相当可靠的。他是所有微软项目桌面应用的替代品,甚至可以打开本地的项目文件。它分享了业界许多基于项目需求的高质量的时间调度引擎。该方案具有成本核算,网络图(PERT图),Gantt图表,RBS、WBS报表,等等。 GanttProject 这是一款非常容易上手使用的,基于Gantt图表的项目时间调度和管理的免费工具。主要功能包括任务的分配和层级的划分,Gantt图表,生成PERT图表,资源负荷图表,HTML和PDF报告,MS项目的导出/导入,还有基于WebDAV的工作组管理。 DotProject 这是一款支持在线,多语言,多用户的项目管理解决方案。它是开源免费的,并且有开源社区的志愿者们在不断的维护更新。它主要的特点如下: 任务和项目管理 公司,联系人和部门管理 资源分配 待办事项 论坛功能 日历功能 横道图功能 报告功能 whats_java 翻译于 昨天(12:25) 0人顶 顶 翻译的不错哦! TaskJuggler 这是一款功能非常强大的现代化的,开源免费的项目管理工具。它采用了全新的方式来规划和跟踪项目,它是一个更好、更灵活地编辑一贯使用的横道图的工具。它总是被成功地应用在许多项目中,其中也包括一些有许多资源和任务比例的小项目。这成为了高级项目经理的解决方案。这涵盖了完整的项目管理开始从最初的想法到完成项目任务的整个过程。它在项目范围内的收支计划、资源调配、沟通交流和风险管理给你提供帮助。 TaskJuggler可以提供最优的时间调度,计算出你项目的时间线,资源分配,基于你给出的项目大纲和一些限制条件。内置的一致性检查和资源平衡卸载使你不需要担心不恰当的细节和警告,如果项目顺利进展,你可以腾出手来。灵活的"根据实际的需要"的方法,提供尽可能多的细节让你规划你的项目,它也非常适合新颖的管理策略,例如轻量级的项目管理和极限情况下的规划。 whats_java 翻译于 昨天(12:52) 0人顶 顶 翻译的不错哦! PHProjekt 这也是一款开源免费的模块化应用,用于协调工作组的活动,通过网络分享文档好信息。构成PHP项目的是组员日程,时间片系统,项目管理,文件管理,邮件客户端,与管理者接触,当然还有很多就不一一列举了。 ConsultComm 这是一款轻量级的,小型化的,独立的开发平台使用java语言编写的,可以让任何人同时管理多个项目,任务,客户,可以高效地跟踪在每个项目上花费的确切时间。关键特征包含如下: 轻松集成在现有的计费系统或时间管理,还包括JDBC支持,瞬间让你可以上传你的项目和所需的时间到大多数ODBC和JDBC兼容数据库。 作为一个开源免费的项目,让你不必担心专用化或供应商锁定问题。 跨平台,这样你就能联合你的Windows,OS X,Solaris和Linux工作站去处理同一个应用。 可以利用标准的JavaBean框架创建的组件迅速拓展功能,用户和其他的开发人员可以很轻松地创建他们自己的插件,快速的添加自定义功能。 定制适合你的独特的风格偏好。 whats_java 翻译于 昨天(13:21) 0人顶 顶 翻译的不错哦! ProjectPier 这也是一款自己管理PHP的,开源免费的项目管理工具,用于管理任务,团队和项目,通过自带的Web接口。这将有助于您的公司沟通,携手共进,完成既定的任务。事实上它的功能类似于其他的商业项目管理产品,不同点是可拓展性和允许自托管。 OpenGoo 它是一个完整的基于Web的解决方案,致力于提升您的团队的生产力,协作,管理和沟通。主要功能包括: 管理任务,联系人,文档,日历,电子邮件。 管理项目的进展情况,为你的客户制定账单,并跟踪时间段。 访问优雅和简洁的仪表板的信息。 与供应商,客户和同事沟通。 whats_java 翻译于 昨天(13:32) 0人顶 顶 翻译的不错哦! Collabtive 这是另一种现代化风格的Web应用程序,它使得项目团队共同努力,管理文件、项目节点和任务,并发送即时消息给对方。它支持多语言,甚至超过20种语言。它使用XML API集成了其他的Web服务。它提供的导入功能也可以从其他应用程序导入数据。 Redmine 这是一个开源的,灵活的项目管理的在线解决方案。使用的Ruby on Rails框架写的,它是跨数据库和跨平台。主要功能包括: 基于灵活的访问控制 多个项目支持 灵活的问题跟踪系统 横道图 […]
View DetailsPHP是在实践中发展迅速并被最多使用的脚本语言;包含了诸如详细的文档、庞大的社区、无数可使用的脚本及支持框架等许多特性。PHP提供的这些特性使得它比Python或Ruby等脚本语言更容易上手。 为构建极具创新乐趣的Web应用,PHP开发人员持续搜寻着有用的工具。在这篇文章中,我收集了开发人员的12个PHP调试工具,它们将有助于开发人员轻松找出并调试应用程序及脚本中的错误。下面的PHP调试工具支持Ajax请求,并包含通用数据采集器和基于堆栈的错误处理器。我希望你能在未来的项目中体会到这个列表的方便和有用之处。 1. Kint 当调试PHP代码时,var_dump()、print_r()和debug_backtrace()是我们最常用的工具。Kint,一个开源软件,一个不需安装的替代者,它提供了更好的调试体验。它巧妙地检测几乎不可读的数据,并将它们定制成规则的输出显示。变量名、文件、行号及包装的函数它全能提示出来。 源码 2. DebugBar DebugBar是一个自由开源软件,它可以被集成到任何PHP项目用来收集和定位数据。它没有第三方依赖,支持Ajax请求,包含通用数据收集器且集成常见的库。生成的bar是100% JavaScript实现的并被放置在页面底部(像开发工具一样)。新的收集器和视图可以被轻松的添加,并且可以保存或重新运行以前的请求。 源码 3. Pinba Pinba是一个可作为PHP统计服务使用的开源MySQL存储引擎。它使用收到的数据来分析PHP应用性能并快速定位任何问题。 源码 4. PHPMD PHPMD是一个易于配置,对PHP原始依赖指标友好的前端。它在你的代码中的寻找多种潜在问题,包括可能的bug、不适合的代码、未使用的参数等。 源码 5. Xde Bug Xdebug是一个自由开源的用于调试和分析PHP脚本细节的PHP扩展。由于它是一个扩展,所以使用起来很方便,且在编码端只需要很少的设置。它可以提供错误信息中堆栈跟踪和函数跟踪的所有数据,包括用户定义函数的所有参数、函数名、文件名以及行标志。Xdebug还可以提供内存分配、分析信息和代码覆盖率分析的数据。 源码 6. Whoops Whoops是一个使错误处理和调试更容易的PHP库。这个库提供基于堆栈的错误处理,并且有一个好看的界面。它有一个处理异常的简单API,能够跟踪帧及它们的数据,并可以与任何框架整合(end和Silex已经内置集成)。 源码 7. Krumo 很多PHP开发者使用print_r()和var_dump()对输出难读或未格式化的结果进行调试。Krumo是这些函数的一个替代者,它可以显示任何PHP变量的结构化信息。Krumo运行后,输出会显示成一个围绕PHP变量的可折叠的DHTML树结构。同时,它通过自身把调试过程“关掉”而不是禁用代码里的所有追溯路径的能力加快了调试过程。 源码 8. Php Debugger 调试是发现并修复bug的过程,PHP Debugger是帮助你快速的找到错误并将它们从你的PHP程序中移除的最好的工具。你可以在PHPEd中设置远程调试,通过Wizardand DBG向导中的PHP调试设置开启。 源码 9. Php Debug PHP_Debug的基本目的是在调试PHP代码时提供援助。 源码 10. Webgrind Xdebug是最受欢迎的PHP调试扩展之一。它提供了许多有用数据来帮助你在源码中查找bug。 源码 11. PHP_Dyn PHP_Dyn是有一个优秀的开源PHP调试工具。你可以跟踪函数执行并得到函数参数和返回值的一个输出。 源码 12. MacGDBp MacGDBp是一个MAC OS上的PHP调试器。它有你所期望的所有特性,是一个包含逐句运行及设置断点等功能的全功能调试器。 源码 转自:http://www.oschina.net/translate/12-php-debugging-tools-for-developers
View Details【IT经理网点评】大多数成功的IT项目和产品背后都有一个说一不二的技术领袖,他们不是传统意义上的管理者,而是让团队成员保持最佳状态和效率,朝着正确方向前进的"牧羊犬",他们是合理分配团队资源和处理能力的差速锁,他们是脑子和手一样快的四分卫。伟大的技术领袖关心的不是人,而是代码,因此他们再忙也会“发明时间”为团队写点代码;他们用案例说事,用手为团队选择方向而不是用嘴描述方向;他们是团队前进道路上的清道夫和保护伞…现在,你明白为什么伟大的技术领袖如此珍稀了吧。 最近,曾经就职于Google、Square等公司的软件工程师兼博客作者David Byttow认为,虽然不同的企业文化各异,面临的挑战不同,但是优秀的技术领袖通常具备相似的特征、特质和方法。Byttow在VB撰文总结了伟大的技术领袖在推动项目前进时需要亲力亲为的三十二件事,对于那些可望"从优秀到卓越"的企业的技术管理者来说,有很多可以借鉴参考的地方 : 创建和维护项目启动、测试和发布计划。 主持高效率的工程师团队会议。 确保会议尽可能的简短有效。 帮助创建和排布项目的优先级事项。 经常对新的或不需要的功能说不。 为所关注的问题定义最佳实践。 成立专门的攻坚或调试团队。 维护跨职能关系。 设定目标里程碑日期。 了解最新的优秀工具的动态 担当团队里工程师的"教练"。 从其他团队招揽工程师。 关照实习生,帮他们成功。 仔细阅读代码并给出具体有用的反馈。 阅读、撰写并反馈设计文档。 在正确的时间写正确的代码。 必要时在管理层面前保护你的工程师。 与其他工程团队协作。 发现"技术债务"。 解释决策背后的原因。 为正确的设计决策而战斗。 为"技术债务"的解决挤出时间。 实现团队工作的负载均衡。 为团队物色新的人选,并帮助新工程师入职。 必要的时候对工期和时间节点进行调节。 定义项目的MVP人选,并维护其地位。 评估架构决策和相关影响。 确保对核心功能进行测试。 维持在岗工作流程的正常运转。 必要时屏蔽更多议题。 为产品的隐私和安全问题把关。 时不时蹦出点牛逼的想法和解决方案。 文章来自IT经理网
View Details近年来风险投资和天使投资人似乎非常偏爱开发者工具,根据最新的报告,2012年投资者在开发工具上投入了6.46亿美元,这使得开发工具成立最热门的创业领域之一。 在资本的趋势下大批公司投身开发开发者工具,很多新产品非常优秀也卖得不错,但是也有不少产品噱头大过功能,很快被用户束之高阁。随之而来的问题是,面对如雨后春笋般冒出来的新开发工具,除非你是技术专家并花费大把时间试用新产品,否则你很难区分这些开发工具的优劣。 最近,帮助投资人筛选创业公司的投资研究机构Mattermark,分析了各开发工具的用户增长势头,给出了20个发展最快的前端和后端开发者工具的列表。其中一些开发工具已经拿到了风险投资,所有上榜开发工具的用户数最低不少于1万。 Mattermark制作开发工具排行榜的数据来源很多,包括新闻报道、AngelList、App Store排名、Alexa排名等。 以下是Mattermark给出的顶级开发工具公司排名: 10大前端软件开发工具 Ink Mobility -让智能手机应用之间通讯互动的工具 Bootstraptor-为Web开发者准备的Twitter Bootstrap模板 Macaw-支持语义HTML和简洁CSS的web开发工具 XingCloud-“一键”本地化你的网站 FlauntResponsive-自适应设计的转化工具 Statuspage.io-简单的宕机沟通工具(刚刚在Y Combinator上发布) GrowthGiant-不间断的A/B测试工具(beta内测,尚未正式发布) Spinnakr-A/B测试内容工具,为不同用户显示不同信息 Dakwak-能为访客显示本地化网站版本的工具 Nitrous.IO-快速开发环境管理与代码协作 10大后端开发工具 Bitnami-在亚马逊、Azure和VMware上运行的服务器软件的应用商店 Flywheel-为设计师准备的WordPress托管和管理服务 Pivotal-企业PaaS云计算服务(来自EMC和VMware) Salt Stack-为DevOps组织提供的系统与配置管理 KnackHQ-在云端管理数据库 HortonWorks-Apache Hadoop商业版本发行商,用于大数据存储 Digital Ocean-面向开发者的云托管服务 Fastly-下一代内容分发网络(CDN) Honeybadger-Rails的错误管理服务 Mean.io-MongoDB、Node.js、Express和AngularJS应用的样板 转自:http://www.oschina.net/news/43791/top-developer-tools
View Details在应用程序中的服务器错误"<application name >" ——————————————————————————-- HTTP 错误 404.8 – HIDDEN_NAMESPACE HRESULT: 0 HRESULT 的说明 # 操作成功完成。 要解决此问题,请按下列步骤操作:单击 开始 、 在 开始搜索 框中键入 记事本 右键单击 记事本 ,然后单击 以管理员身份运行 。 请注意 如果将提示您输入管理员密码或进行确认,键入该的密码,或单击 继续 。 在 文件 菜单上单击 打开 ,在 文件名 框中键入 %windir%\System32\inetsrv\config\applicationHost.config 然后再单击 打开 。 在该 ApplicationHost.config 文件中找到在 <requestfiltering>元素,然后找到该 <hiddensegments>元素。 在该 <hiddensegments>元素,删除与所请求的 URL 中指定的目录匹配的条目。 在 文件 菜单中上, 单击 保存 。 退出记事本。 本文所有权归作者,欢迎转载,但是请指明出处 :http://www.cnblogs.com/fly871117 ,严谨用于商业用途
View Details这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考。这是为了确保在编码过程中,大部分通用编码指导原则都能注意到。对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助。 清单 1. 确保没有任何警告(warnings)。 2.如果先执行Code Analysis(启用所有Microsoft Rules)再消除所有警告就更好了。 3. 去掉所有没有用到的usings。编码过程中去掉多余代码是个好习惯。(参考:msdn) 4. 在合理的地方检查对象是否为’null’,避免运行的时候出现Null Reference Exception。 5. 始终遵循命名规范。一般而言变量参数使用驼峰命名法,方法名和类名使用Pascal命名法。(参考:msdn) 6. 请确保你了解SOLID原则。 根据维基百科定义:在程序设计领域,SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转) 是由罗伯特·C·马丁在21世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个 程序员开发一个容易进行软件维护和扩展的系统变得更加可能。SOLID所包含的原则是通过引发编程者进行软件源代码的代码重构进行软件的代码异味清扫,从而使得软件清晰可读以及可扩展时可以应用的指南。SOLID被典型的应用在测试驱动开发上,并且是敏捷开发以及自适应软件开发的基本原则的重要组成部分。参考:wiki/SOLID_(面向对象设计) 7. 代码可重用性:如果一块代码已经被使用超过一次,或者你希望将来使用它,请提取成一个方法。将重复的工作做成通用的方法放在相关的类中,这样一旦你完成别人就可以使用了。将常用功能开发成用户控件,这样可以跨项目重用它们。(参考:① 、 ②) 8. 代码一致性:比方说,Int32写成int,String写成string,应该在代码里保持统一形式。不能一会二写成int一会儿写成Int32。 9. 代码可读性:代码应该是可维护的,便于其他开发者理解。(参考:msdn) 10. 释放非托管资源,比如文件I/O,网络资源等。一旦使用结束就应该释放它们。如果你想一旦超出使用范围就自动释放对象,可以使用usings将非托管代码括起来。参考:msdn 11. 合理实现异常处理(try/catch和finally块)和异常记录。参考:msdn 12. 确保代码中方法的行数不要过多,不超过30到40行。 13. 及时用代码管理工具check-in/check-out代码。(比如TFS) 参考:codeproject.com 14. 相互审查代码:和你的同事交换代码,实现内部审查。 15. 单元测试:编写开发测试用例完成单元测试,确保代码被送到QA以前,基本测试完成。参考:msdn 16. 尽量避免for/foreach循环嵌套和if条件嵌套。 17. 如果代码只会使用一次,请使用匿名类型。参考:msdn 18. 尽量使用LINQ查询和Lambda表达式,增加可读性。参考:msdn 19. 合理使用var、object和dynamic关键字。由于很多开发者会感到困惑或者知道的很少,会觉得它们有些相似,故而交换使用,这是要避免的。参考:blogs.msdn 20. 使用访问限定符(private, public, protected, internal, protected internal)限定每个方法、类或变量的需要范围。比方说如果一个类只会在程序集内使用,那么定义成internal就足够了。参考:msdn 21. 在需要保持解耦的地方使用接口,有些设计模式的出现也是由于接口的使用。参考:msdn 22. 按照用法和需要将类定义为sealed、static或abstract。参考:msdn 23. 如果需要多次串联,请使用Stringbuilder代替string,这可以节省堆内存。 24. 检查是否有不可能执行的代码,如果有,请修改。 25. 在每个方法前注释,说明它的用法、输入类型和返回值类型信息。 26. 使用类似Silverlight Spy的工具,检查和操控Silverlight应用在运行时对XMAL的渲染,以此来改善效率。这可以在设计执行XAML时,节省大量退回和来回修改的时间。 27. 使用filddler工具通过检查HTTP/网络流量和带宽,来跟踪web应用和服务的性能。 28. 如果你想确认Visual Studio以外的方法,请使用WCFTestClient.exe工具,或者装载它的进程到Visual Studio来进行调试。 29. 在任何合理的地方使用constants和readonly。参考:/msdn、msdn 30. 尽量避免强制转换和类型转换,因为会造成性能损失。参考:msdn 31. 对于你想提供自定义信息的类,请重载ToString(来自Object类)。参考:msdn 32. 避免直接从其他代码中ctrl+c/ctrl+v。一直建议还是自己用手敲,即使你已经找到相关代码。这样可以锻炼自己写代码能力,还能正确理解那段代码的用法。最终你永远都不会忘记那段代码。 33. 保持阅读书籍和文章的良好习惯,遵循大神们的实践指导。(比如微软专家和一些著名的专家,Martin Fowler, Kent Beck, Jeffrey Ritcher, Ward […]
View DetailsWin7下,折腾Node.js过程中,运行服务器,其中内部调用相关代码: function show(response) { console.log("Request handler 'show' was called."); fs.readFile("/tmp/test.png", "binary", function(error, file) { if(error) { response.writeHead(500, {"Content-Type": "text/plain"}); response.write(error + "\n"); response.end(); } else { response.writeHead(200, {"Content-Type": "image/png"}); response.write(file, "binary"); response.end(); } }); } 去重命名,结果出错: D:\tmp\tmp_dev_root\node.js> D:\tmp\tmp_dev_root\node.js>node index.js Server has started. Reforst for /upload received. About to route a reforst for /upload Request ha’upload’pload' was called. about to parse padoneg done fs.js:returnreturn binding.rename(pathModule._makeLong(oldPath), ^ Error: EXDEV, cross-device link not perm’C:\Users\CLi\AppData\Local\Temp\df99513a93a1cbfbc26e076f8ae08b92’08b92′ at Object.fs.renameSync (fs.js:439:18) at D:\tmp\tmp_dev_root\node.js\requestHandlers.js:34:8 at IncomingForm.parse (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:121:9) at IncomingForm.EventEmitter.emit (events.js:93:17) at IncomingForm._maybeEnd (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:383:8) at IncomingForm.handlePart (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:212:12) at File.end (D:\tmp\tmp_dev_root\node.js\node_modules\formidablfileb\file.js:71:5) at WriteStream.flush (fs.js:1515:9) at Object.oncomplete […]
View Details导读:有国外开发者在 Quora 提了这个问题:“为什么软件开发周期通常是预期的两三倍?” 并补充问:“这是开发人员的错误? 是管理失误? 是因为做事方法不对, 或者说缺乏好的方法?还是说这就是软件开发流程的特点?” Michael Wolfe 在2012年1月28日给的回复,非常经典,截至我们发布时已有8016个赞。以下是译文。 让我们先沿着海岸线,从旧金山(SF)走路去洛杉矶(LA),去拜访我们住在Newport Beach的朋友,我拿出地图在上面画出了行进路线。 全程大约有400英里,如果我们每天走10小时每小时4公里的话,只用10天就可以到达目的地。立刻打电话给我们的朋友预定下周六的晚餐,告诉他们下周六晚上六点我们一定会准时出现,朋友们已经等不及了! 第二天清晨,我们带着准备冒险的兴奋起床,背起行囊,拿出地图,准备计划我们冒险的第一天,看一眼地图,噢,不! 哇,海岸线上有这么多迂回曲折的线路。每天行进40英里的话,10天后只能勉强到达Half Moon Bay(半月湾?)。这趟旅行至少有500英里,而不是400。赶紧打电话给我们的朋友,将晚餐顺延至下下周周二。人还是应该现实一点。朋友们有点失望, 不过仍然盼望见到我们,况且花 12 天从 SF 到 LA 也不赖。 把不开心的事丢到一边,准备出发。两小时过后,我们才刚刚走出动物园。出了什么事?我们低头看了一下脚下的路: 天哪,这样走路也太慢了!有沙子、海水、阶梯、溪流,还有海边愤怒的海狮!这样我们只能按每小时2公里的速度前进,只有 我们预估一般的速度。要么我们现在每天走20小时,要么再把晚餐推迟一个星期。好吧,让我们各退一步:每天走12个小时,把晚餐安排到下下周的周末。只好 再打电话给朋友告诉他们这个情况。朋友们有些不高兴,但还是表示可以,到时候见。 在辛苦走了12小时后,我们准备在 Moss Beach 扎营休息。靠,要把帐篷在风中立起来根本不可能。直到半夜才开始休息。不过没什么大不了:明天在加快点速度就可以了。 第二天早上睡过头了,早上10点才醒,起来浑身酸痛精疲力尽。艹,今天没法走12个小时了,先走10个小时,明天可以走14个小时。收拾东西出发。 再缓慢行进了几个小时之后,我发现伙伴脚有点跛。妈的,是水泡。必须现在解决它,在这些问题开始减慢我们的速度前,必须 将它们扼杀在萌芽状态。我慢跑了45分钟到达内陆3英里远的Pescadero,买了一些创可贴再快速跑回去给朋友包扎了一下。我快累坏了,太阳也快下山 了,又浪费了一天的时间。到我们准备休息前今天只走了6英里。但是我们确实需要补充一下供给。一切都很好,明天我们就能赶上。 第二天醒来,扎紧脚上的绷带准备出发。转角之后突然发现,靠!这是个啥? 你妹的地图上怎么没标出它!现在我们只能往内陆走3英里,绕过这些被联邦政府用栅栏保护起来的区域,中途迷路了两次,在 中午前才好不容易又回到了海岸线。今天的时间过了一大半,而我们才前进了差不多1英里。好吧,不过我们不会再打电话给朋友推迟了,今天我们会一直走到午夜 试着赶上进度。 晚上在大雾里断断续续地睡了一夜。一大早被我的伙伴叫醒,他一阵阵的头疼,还有点发烧,我问他能不能坚持一下。“你在想 什么呢,混蛋,我已经连续三天在这么冷的雾中赶路,没有休息过了。“好吧,今天看来只能黄了,只能在原地好好恢复了。现在我们已经有经验了,今天好好休息 明天再走14个小时,还有几天的时间,我们一定能够做到! 第二天我们昏昏沉沉地起来了。我看了一眼随身的地图: 天啊!我们已经走了10天旅程里的第5天还没有离开海湾区域!太荒唐了!我们要重新估计一下准确的时间再打给朋友,搞不好会被骂,但至少得找一个现实一点的目标。 同伴说,我们在四天里走了40英里,这趟旅程至少又600英里,那就至少要60天,安全一点的说法说不定要70天,“没门…是,以前我是没走路从SF去过LA,但肯定不会要70天的时间,如果告诉他们我们要到复活节才能到,那要被他们笑死的“,我说。 我接着说,“如果你能保证每天走16个小时,我们就能把落下的时间补回来!我知道很困难,但现在是最关键的时刻,别抱怨了!”伙伴对我吼道 “一开始又不是我告诉别人下周日我们就能到的!因为你犯的这个错差点要我的命!” 两个人就这样不说话了。我还是没打出电话,等我的伙伴明天冷静一点我再决定,我也愿意做一些更合理的承诺。 第二天上午,我们一直待在各自的帐篷中直到一场暴风雨袭来。我们赶紧收拾好东西直到10点才摆脱危险。浑身酸痛,又长了好多新水泡。之前发生的事谁也没提,直到发现我那愚蠢的伙伴把水壶落下了,又被我指责了一顿,我们不得不再花30分钟回去取它。 我心里记得我们的厕纸已经快用完了,下次到一个小镇的时候应该囤一点。在我们又转个弯后,才发现一条湍急的河流挡住了去路,这时我突然感到肚子一阵难受…… 原文链接: Michael Wolfe 翻译: 伯乐在线 – 伯乐在线读者 译文链接: http://blog.jobbole.com/45756/
View Details最近看到微博的短链接真是很火啊,新浪、腾讯、搜狐等微博网站都加入了短链接的功能。之所以要是使用短链接,主要是因为微博只允许发140 字,如 果链接地址太长的话,那么发送的字数将大大减少。短链接的主要职责就是把原始链接很长的地址压缩成只有6 个字母的短链接地址,当我们点击这6 个字母的 链接后,我们又可以跳转到原始链接地址。 开始以为短链接是按照某种算法把原始链接压缩为短链接,再根据算法从短链接反算成原始链接的。后来尝试了下压缩算法(gzip 压缩算法),发现对于url 这种字符串越是压缩,长度就越长。通过对压缩算法的一些了解,发现靠压缩算法来实现这个功能不太靠谱。 后来在网上找到一个生成算法,该算法主要使用MD5 算法对原始链接进行加密(这里使用的MD5 加密后的字符串长度为32 位),然后对加密后的 字符串进行处理以得到短链接的地址。原始的算法是C# 版本的,这里我把该算法修改成Java 版本的. 算法的具体代码如下,代码中有注释: 一、 代码 package com.csdn.shorturl; public class ShortUrlGenerator { /** * @param args */ public static void main(String[] args) { // 长连接: http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml // 新浪解析后的短链接为: http://t.cn/h1jGSC String sLongUrl = "http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml" ; // 3BD768E58042156E54626860E241E999 String[] aResult = shortUrl (sLongUrl); // 打印出结果 for ( int i = 0; i < aResult. length ; i++) { System. out .println( "[" + i + "]:::" + aResult[i]); } } public static String[] shortUrl(String url) { // 可以自定义生成 MD5 加密字符传前的混合 KEY String key = "wuguowei" ; // 要使用生成 URL 的字符 String[] chars = new String[] { "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" }; // 对传入网址进行 MD5 加密 String sMD5EncryptResult = ( new CMyEncrypt()).getMD5OfStr(key + url); String hex = sMD5EncryptResult; String[] resUrl = new String[4]; for ( int i = 0; i < 4; i++) { // 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算 String sTempSubString = hex.substring(i * 8, i * 8 + 8); // 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用 long ,则会越界 long lHexLong = 0x3FFFFFFF & Long.parseLong (sTempSubString, 16); String outChars = "" ; for ( int j = 0; j < 6; j++) { // 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引 long index = 0x0000003D & lHexLong; // 把取得的字符相加 outChars += chars[( int ) index]; // 每次循环按位右移 5 位 lHexLong = lHexLong >> 5; } // 把字符串存入对应索引的输出数组 resUrl[i] = outChars; } return resUrl; } } 二、 输出结果 执行上面代码的结果如下,会产生4 组6 位字符串,任意一组都可以作为当前字符串的短链接地址。 [0]:::7nUFJn [1]:::f6Zzy2 [2]:::j6jmQb [3]:::2eAjea 三、 跳转原理 当我们生成短链接之后,只需要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系即可。当我们访问短链接时,只需要从映射关系中找到原始链接,即可跳转到原始链接。 转自:http://hi.baidu.com/lioliang/item/ddf10d1a733c575bf1090ecf
View Details以SQL SERVER2000自带数据库Northwind中Customers表示例. 前台aspx代以码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Repeater.aspx.cs" Inherits="Repeater" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Repeater控件使用</title> <script language="javascript" type="text/javascript"> function Check(parentChk,ChildId) { var oElements = document.getElementsByTagName("INPUT"); var bIsChecked = parentChk.checked; for(i=0; i<oElements.length;i++) { if( IsCheckBox(oElements[i]) && IsMatch(oElements[i].id, ChildId)) { oElements[i].checked = bIsChecked; } } } function IsMatch(id, ChildId) { var sPattern =’^Repeater1.*’+ChildId+’$'; var oRegExp = new RegExp(sPattern); if(oRegExp.exec(id)) return true; else return false; } function IsCheckBox(chk) { if(chk.type == 'checkbox') return true; else return false; } </script> </head> <body> <form id="form1" runat="server"> <div style="margin-bottom:20px;text-align:center; width:1006px;">Repeater控件使用</div> <asp:Repeater ID="Repeater1" runat="server"> <%--SeparatorTemplate描述一个介于每条记录之间的分隔符--%> <%--<SeparatorTemplate> <tr> <td colspan="5"><hr /></td> </tr> </SeparatorTemplate>--%> <HeaderTemplate> <table border="1" cellpadding="0" cellspacing="0" style="width:1006px;border-collapse:collapse; text-align:center;"> <tr> <td style="background-color:#cccccc; font-weight:bold; height:25px;"><input id="chkAll" name="chkAll" runat="server" type="checkbox" onclick="Check(this,’chkItem')" title="全选" />全</td> <td style="background-color:#cccccc; font-weight:bold; height:25px;">View</td> <td style="background-color:#cccccc; font-weight:bold; height:25px;">CustomerID</td> <td style="background-color:#cccccc; font-weight:bold;">CompanyName</td> <td style="background-color:#cccccc; font-weight:bold;">ContactName</td> <td style="background-color:#cccccc; font-weight:bold;">ContactTitle</td> <td style="background-color:#cccccc; font-weight:bold;">Address</td> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><asp:CheckBox ID="chkItem" runat="server" /></td> <td><a href='<%# "View.aspx?id="+DataBinder.Eval(Container.DataItem, "CustomerID") %>' target="_blank">View</a></td> <td><asp:Label ID="lblID" Text='<%# DataBinder.Eval(Container.DataItem, "CustomerID")%>' runat="server"></asp:Label></td> <td><%# DataBinder.Eval(Container.DataItem, "CompanyName")%></td> <td><%# DataBinder.Eval(Container.DataItem, "ContactName")%></td> <td><%# DataBinder.Eval(Container.DataItem, "ContactTitle")%></td> <td><%# DataBinder.Eval(Container.DataItem, "Address")%></td> </tr> </ItemTemplate> <%--AlternatingItemTemplate描述交替输出行的另一种外观--%> <AlternatingItemTemplate> <tr bgcolor="#e8e8e8"> <td><asp:CheckBox ID="chkItem" runat="server" /></td> <td><a href='<%# "View.aspx?id="+DataBinder.Eval(Container.DataItem, "CustomerID") %>' target="_blank">View</a></td> <td><asp:Label ID="lblID" Text='<%# DataBinder.Eval(Container.DataItem, "CustomerID")%>' runat="server"></asp:Label></td> <td><%# DataBinder.Eval(Container.DataItem, "CompanyName")%></td> <td><%# DataBinder.Eval(Container.DataItem, "ContactName")%></td> <td><%# DataBinder.Eval(Container.DataItem, "ContactTitle")%></td> <td><%# DataBinder.Eval(Container.DataItem, "Address")%></td> </tr> </AlternatingItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> <div style="background-color:#dedede; width:1006px;"> […]
View Details