如何报告 bug Step 1:尝试重现 bug,确保它确实是个 bug,而不是用户或环境的 error。...如果你不能重现找到的 bug,那么很有可能它实际不是个 bug。 Step 2:确认 bug 是否已报告过 一旦确定了你确实找到了个 bug,应该看看这个 bug 是否已经备案或上报了。...如果有很多东西都不像你预料的那样起效,可以考虑创建多个 bug(或是一个有子 bug 的父 bug)。 示例:当点击“通过 Google 账户登录”链接时,窗口关闭了,然后得重新打开 Picasa。...除非你提交的是功能需求,否则应该忠于事实,省略如果你是开发者会如何制作软件等内容。 报 bug 前找找已有的 bug 报告。...就是在 Lucid 任职之前,我也经常会给开发者发邮件提 bug。我总是会被收到的回复惊喜到。通常我都会受到回信,并且最终开发者会修复我的 bug,或者与我解释不会(或无法)修复的原因。
例如,它很适合通过网络进行图片文件或者任何其它的文件交换. 本课程展示了如何在 你的应用中进行文件相关的基础操作....在内部存储中保存一个文件 ---- 当要在一个内部存储中保存一个文件时,你可以通过调用下面两个方法的其中之一,来获取相应的目录 文件 : getFilesDir() 返回一个表示你应用的内部路径的...除非你明确将文件设置为可读或者可写的,其它的应用不能浏览到你的内部路径. 因此一旦你在你内部存储中的文件上使用了 MODE_PRIVATE , 它们就再也不会被其它应用访问到了....在外部存储上保存一个文件 ---- 由于外部存储可能不可用——比如用户已经将其挂载到了一台PC上,或者已经将提供外部存储的SD卡移除——你应该在访问它之前总是去验证一下其可用性 ....每一个通过此方法创建路径都被添加到了一个所有你的应用程序的外部存储文件的父路径 , 它们会在用户卸载你的应用时被系统删除掉 .
不幸的是,在一个周五的晚上把它发送到生产环境之后,您开始看到仪表板上出现了错误报告。有一个bug,你需要尽快修复它。...这个方法被调用了三次,那么,哪个实例是罪魁祸首呢?您可以更仔细地查看堆栈跟踪,发现是来自第13行的调用导致了错误。你知道第13行与中间名值有关。因此,您应该将精力集中在通过正确设计输入来重现错误。...有了这些额外的知识,您可以填充第一个和最后一个名称字段,但是将中间的名称留空,以查看这是否会触发错误。 ? 点击保存按钮。从这里开始,Source选项卡将打开,您可以看到断点被激活。...现在,您可以使用“Step In”按钮移动到对capitalizeString函数的调用中。 ? 导航调用堆栈 当您像这样浏览代码时,您可能想要跳转回父函数,以检查此时发生了什么。...切换到Console选项卡,让我们开始分解导致错误的行,以便使用Console选项卡修复它 首先,检查value.split(“)”的输出,这样您就可以获得第一个字符,然后调用它的toUpperCase
我们还需要添加一个点击效果。 每次元素被点击时都会触发 :active伪类,它引发一个 0.2秒的过渡: ? 翻转卡片 要在单击时翻转卡片,需要把一个 flip类添加到元素。...为了能达得最佳的效果,把它设置为 1000px: ?...接下来对 .memory-card元素添加 transform-style:preserve-3d属性,这样就把卡片置于在父节点中创建的3D空间中,而不是将其平铺在 z = 0的平面上(transform-style...匹配卡片 完成翻转卡片的功能之后,接下来处理匹配的逻辑。 当点击第一张卡片时,需要等待另一张被翻转。 变量 hasFlippedCard和 flippedCard用来管理翻转状态。...当玩家点击第二张牌时,lockBoard将设置为true,条件 if (lockBoard) return;在卡被隐藏或匹配之前会阻止其他卡片翻转: ?
这些设计绝大多数“极少调用”的特性比如调试(谁无论如何需要它的话,你的程序第一次是无法工作的:-))以及其它的特性。如上所述,没有登陆和初始化进程。...这里提到的一些问题将由我(即lines/387/floppy支持)尽快修复,但我希望得到库函数的支持。感谢你们提交的错误报告及补丁还有愿望清单,如果你真的有针对问题的补丁,我会立即尝试去修复它。...LINUX移植软件LINUX被设计得让移植相对容易。因此,就有了完整的termios实现和一些POSIX库。我所移植的(诚然相对较少)程序没有任何问题。...这些设计绝大多数“极少调用”的特性比如调试(谁无论如何需要它的话,你的程序第一次是无法工作的:-))以及其它的特性。 如上所述,没有登陆和初始化进程。...这里提到的一些问题将由我(即lines/387/floppy支持)尽快修复,但我希望得到库函数的支持。感谢你们提交的错误报告及补丁还有愿望清单,如果你真的有针对问题的补丁,我会立即尝试去修复它。
另一个例子:当遇到一个错误元素时,直接返回而不是给出错误的解析代码。调用在故障的状态下持续了一段时间,使得调试的难度加大。一旦故障被检测出,最好要及时返回这个错误。 4....即使If语句在概念上很简单,当它有多个条件需要追踪时,很容易出错。最近我尝试重新把代码写得简洁,避免出现复杂的If语句。 5....而且,如果你在If语句的一个分支中设置了一个变量,你也许应该在其他分支也设置该变量。与此相关的是标志(flag)被设定的情况。仅仅添加设定标志的条件很容易,但是容易忘了添加应该重新设定标志的条件。...确保添加足够的(但也别太多)日志记录。那样你就能弄清楚为什么程序在执行它执行的任务。让一切运转良好时,它无关紧要。但是只要问题发生(这不可避免),你会很庆幸你添加了合适的日志记录。 ?...有一次,我在一种情况下,我对处理关联号码做了改变,包括两部分:路由地址前缀(总是相同),和从000到999的动态分配号码。问题是,当查找相关性时,动态分配的数字的第一个数字在查找之前被错误地删除。
另一个例子:当遇到一个错误元素时,直接返回而不是给出错误的解析代码。调用在故障的状态下持续了一段时间,使得调试的难度加大。一旦故障被检测出,最好要及时返回这个错误。...而且,如果你在If语句的一个分支中设置了一个变量,你也许应该在其他分支也设置该变量。与此相关的是标志(flag)被设定的情况。仅仅添加设定标志的条件很容易,但是容易忘了添加应该重新设定标志的条件。...确保添加足够的(但也别太多)日志记录。那样你就能弄清楚为什么程序在执行它执行的任务。让一切运转良好时,它无关紧要。但是只要问题发生(这不可避免),你会很庆幸你添加了合适的日志记录。...问题是,当查找相关性时,动态分配的数字的第一个数字在查找之前被错误地删除。所以,不是寻找 637 之类的号码,你寻找的是 37,而这个号码不在表中。...这意味着,它一直寻找到 100,所以前 100 个调用正常,而之余的所有 900 个调用失效。所以除非我在重新启动之前测试了 100 多次,否则在测试时发现不了这个问题。
因为它们不能被修改,所以跨多个数据模型共享一个不可变对象是安全的。 数据访问层(Data Access Layer,DAL) 在本文中,DAL包含了服务对象、存储库、直接数据库调用、Web服务调用等。...来自用户界面的问题会更多,因为用户通常需要逐个字段得填写表单。 因为存在这些限制,所以不能在构造函数和属性设置器中使用异常,就像你在其他类中使用异常一样。不过可以验证接口,为错误检查提供一些灵活性。...如果你重新定义它,让它只包含对象级错误,那么就无法知道对象作为整体是否包含错误。 至于索引器,你会怎么调用它?要访问它的唯一方法是将该对象转换成IDataErrorInfovariable。...由于这个错误,没有人可以实现带有批量更新支持的INotifyCollectionChanged,除非他们100%确定集合类不会被用在WPF中。 因此,我的建议是不要试图从头开始创建自定义集合类。...文档里没有提到这些,因为它没有定义一个子对象是否被认为是“对象内容”的一部分。我个人偏好让IsChanged包含子对象的变化,并为数据存储添加单独的IsChangedLocal属性。
尽量推迟对象创建的时间,并把对象的创建分散到多个任务中去。尽管这实现起来比较麻烦,并且带来的优势并不多,但如果有能力做,还是要尽量尝试一下。...这里特别说一下 CALayer:CALayer 内部并没有属性,当调用属性方法时,它内部是通过运行时 resolveInstanceMethod 为对象临时添加一个方法,并把对应属性值保存到内部的一个...对此你在应用中,应该尽量减少不必要的属性修改。 当视图层次调整时,UIView、CALayer 之间会出现很多方法调用与通知,所以在优化性能时,应该尽量避免调整视图层次、添加和移除视图。...我的做法是尽量快速、提前判断当前绘制任务是否已经被取消;在绘制每一行文本前,我都会调用 isCancelled() 来进行判断,保证被取消的任务能及时退出,不至于影响后续操作。...这个只是我的一个设想,并不一定能实现或起作用。 如何评测界面的流畅度 最后还是要提一下,“过早的优化是万恶之源”,在需求未定,性能问题不明显时,没必要尝试做优化,而要尽量正确的实现功能。
因此,如何处理修复 bug 的过程也值得我们细细琢磨。 我想分享一些程序员修复他们的源代码时所经历的想法。这是事情变得紧张时所触发的轻松幽默。...当浏览示例代码时,我试图指出我的逻辑是如何工作的。NOT 运算符和比较标记的数量又是如此之多。我经常回过头去更新我自己的逻辑以便于更好地适合未来的做法。 8....错误信息非常有帮助,但是除非你记得不同的代码意味着什么,否则它读起来更像是翻译过的计算机语言。值得庆幸的是,有很多在线支持可以帮助我们确定这些错误信息的真正含义。 19....“我应该停下来,收工…… 但我真的很想解决它!” 我们都有过极度灰心丧气,想要放弃的感受,但总感觉半途而废不是正确的选择。于是,你继续埋首钻研,并尝试新的解决方案来调试。...有时,在你从计算机传输文件到实时服务器的时候,更新 PHP /Ruby/ Python / SQL 版本可以解决调试问题。本地更新很少能够帮助修复源代码中的 bug,除非你的版本已经过时得无可救药。
全盘负责:所谓全盘负责,就是当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。...双亲委派:所谓的双亲委派,则是先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。...2、这里说明一下双亲委派机制: 双亲委派机制,其工作原理的是,如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托...当ClassLoader加载到正确的类之后就不会去加载错误的类了 ,所以可以在dexElements中将正确的类放在错误类的前面就可以了。...对于 Native 层具体是如何操作的,由于对 Native 不熟悉,此处略去不表 值得注意的是: AndFix 只能修复方法级别的 bug,不能新增类和字段 由于 AndFix 是在 Native 层进行的操作
但是,如何让它发挥作用? 在WSO2,我已经完成了八年多的架构评审。WSO2拥有广泛的产品组合,包括众所周知的WSO2 ESB,WSO2 API Manager和WSO2 SP。...相反,设计由编写代码的团队完成。建筑师修复,抱怨,策划和改进设计。我们有一个建筑团队,但他们是导游和守门人,而不是独裁者。 Gregor Hohpe在这次演讲中精美地捕捉到了这个想法。 是真的。...服务器设计和并发 原则13:了解服务器的工作方式,从硬件到操作系统,再到编程语言。优化IO调用的数量是迈向最佳架构的第一指导。 原则14:了解Amdhal关于同步的定律。...原则17:除非您在客户端和服务器中都控制代码,否则完全一旦消息传递,无论失败,都很难。尝试将您的系统设计得更少(使用原则18)。知道大多数承诺一次交付的系统会在某个地方偷工减料。...严格执行这一点可能是一个错误,特别是在新功能的初始状态,其中简单的功能可以级联到大的变化,因为我们试图使一切正交。有时我们发现我们添加的功能毕竟没用,然后所有额外的工作都没有用。
View的绘制流程主要分为三步: onMeasure:测量视图的大小,从顶层父View到子View递归调用measure()方法,measure()调用onMeasure()方法,onMeasure()...onLayout:确定视图的位置,从顶层父View到子View递归调用layout()方法,父View将上一步measure()方法得到的子View的布局大小和布局参数,将子View放在合适的位置上。...所以你可以看到,整个流程是这样的: 比方说我们点击跳转一个新Activity,这个时候Activity会入栈,同时它的生命周期也会从onCreate()到onResume()开始变换,这个过程是在ActivityStack...托管绑定到可见(或前台)Activity 的 Service。 可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。...热修复:热修复是体现在bug修复方面的,它实现的是不需要重新发版和重新安装,就可以去修复已知的bug。
后来我又想了一下,这样还是不行,我得fork出一个子进程去做这件事,不能浪费我的时间。...快照的运作方式: 当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作: Redis 调用 fork() ,同时拥有父进程和子进程。...当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件: 为现有的 AOF 文件创建一个备份。...当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。...当服务器要创建一个新的 RDB 文件时, 它先将文件的内容保存在一个临时文件里面, 当临时文件写入完毕时, 程序才使用 原子地用临时文件替换原来的 RDB 文件。
一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误的代码所导致的。例如,没有检查代码却返回错误的系统调用(如bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。...即使if语句在概念上很简单,但当有多个条件要跟踪的时候依然很容易出错。这些天,我尝试重写代码使之更简单,以避免处理复杂的if语句。 5.Else。...此外,如果你在if语句的分支中设置变量,那么或许你在另一个分支中也要设置。与此种情况相关的是标记被设置的情况。只添加用于设置的标记的条件不难,但是很容易忘了添加当标记应该再次重置时的条件。...通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...通常,如果调试问题花了很长时间,往往是因为我做了错误的假设。例如,我认为问题发生在某一方法中,但事实却是它甚至从来没有到达那个方法。或者,被抛出的异常不是我以为的那个。
我告诉几百位用户他们的款项已经到账了,可实际上并没有! 本文最初发布于 hakibenita.com 网站,经原作者授权由 InfoQ 中文站翻译并分享。 你有没有想过错误都是怎么来的呢?...我说的不是那种用简单的单元测试就能捕获的普通错误。我说的是第一眼看上去好像没什么问题,但回头想起来却会觉得很明显的那种错误。...本文讲的是我不小心向几百位用户发送了付款到账的消息,实际上他们的钱还没到手的故事! 当你意识到自己犯了错误时是什么感觉 1故事 我们系统中有一个付款流程,是向商家和其他类型的用户付款用的。...问题是顶级应用创建付款流程后,付款模块是在内部处理实际的付款操作的,顶级应用没法知道流程走到了哪一步,除非它不断监控付款模块的状态。...过了一阵儿,我们开始收到用户的投诉,说他们收到了大量的到账消息。有些人很高兴,但还有些用户打开应用查看详情,发现他们实际上没有收到钱,并意识到了这一定是一个错误。
本文介绍了如何滥用Windows上特权进程执行文件操作来实现本地特权升级(用户到管理员/系统),同时介绍了利用这些类型的错误的现有技术以及漏洞利用工具。...内置的工具不会让你创建一个硬链接到一个你没有写权限的文件,但实际的系统调用可以让你在打开一个文件进行读取的情况下进行创建。...当然,它也有一些限制:你不能细粒度地 “放行 “一个访问(一旦锁被解除,所有待定的访问都会发生),而且它并不适用于所有类型的访问,但它通常非常有效。...从任意删除文件到权限提升 我们谈到了任意文件读写,那么删除呢?...下表总结了我们发现的错误及其状态。 ? 结论 我希望这篇文章能让一些新人开始寻找与文件相关的逻辑权限升级bug,以及尽可能多的理由让厂商和开发者针对这类bug对其产品进行加固/修复。
因此,如何处理修复bug的过程也值得我们细细琢磨。 我想分享一些程序员修复他们的源代码时所经历的想法。这是事情变得紧张时所触发的轻松幽默。...当浏览示例代码时,我试图指出我的逻辑是如何工作的。NOT运算符和比较标记的数量又是如此之多。我经常回过头去更新我自己的逻辑以便于更好地适合未来的做法。 8.我用30分钟写函数,花2小时让它工作。...错误信息非常有帮助,但是除非你记得不同的代码意味着什么,否则它读起来更像是翻译过的计算机语 言。值得庆幸的是,有很多在线支持可以帮助我们确定这些错误信息的真正含义。...19.我应该停下来,收工……但我真的很想解决它! 我们都有过极度灰心丧气,想要放弃的感受,但总感觉半途而废不是正确的选择。于是,你继续埋首钻研,并尝试新的解决方案来调试。...本地更新很少能够帮助修复源代码中的bug,除非你的版本已经过时得无可救药。所以,值得一试! 29.我应该更有条理并且去学习Git ……下周就去研究它。 开 源版本控制包Git在程序员中非常受欢迎。
因此,如何处理修复bug的过程也值得我们细细琢磨。 我想分享一些程序员修复他们的源代码时所经历的想法。这是事情变得紧张时所触发的轻松幽默。...当浏览示例代码时,我试图指出我的逻辑是如何工作的。NOT运算符和比较标记的数量又是如此之多。我经常回过头去更新我自己的逻辑以便于更好地适合未来的做法。 8.“我用30分钟写函数,花2小时让它工作。”...错误信息非常有帮助,但是除非你记得不同的代码意味着什么,否则它读起来更像是翻译过的计算机语言。值得庆幸的是,有很多在线支持可以帮助我们确定这些错误信息的真正含义。 19....“我应该停下来,收工……但我真的很想解决它!” 我们都有过极度灰心丧气,想要放弃的感受,但总感觉半途而废不是正确的选择。于是,你继续埋首钻研,并尝试新的解决方案来调试。...有时,在你从计算机传输文件到实时服务器的时候,更新PHP /Ruby/ Python / SQL版本可以解决调试问题。本地更新很少能够帮助修复源代码中的bug,除非你的版本已经过时得无可救药。
但是,我非常确定大多数不凡的 SPA 都会泄漏内存,除非它们背后的团队拥有强大的基础结构来捕获和修复内存泄漏。用 JavaScript 太容易了,以至于不小心分配了一些内存而忘了清理它。...通常,除非泄漏严重到导致选项卡崩溃或程序运行缓慢,否则你不会从用户那里听到有关它的消息。 缺乏数据:Chrome 小组不提供有关网站在使用大量内存的数据。网站也不是经常自己测量的。...在本文中,我想分享一些我在解决 Web 程序中的内存泄漏方面的经验,并提供一些示例来说明如何有效地跟踪它们。...这些新颖的 API 非常方便,但它们也可能泄漏。如果你在组件内部创建一个组件并将其附加到全局可用元素,则需要调用 disconnect() 进行清理。...还可以通过调用专有的 Chromedriver 命令 :takeHeapSnapshot 创建堆快照文件。但是这也具有上述相同的限制——你可能想要连续获取三个并丢弃前两个。
领取专属 10元无门槛券
手把手带您无忧上云