问题标签 [robustness]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
264 浏览

selenium - 如何提高我的 Selenium 脚本的健壮性?

我正在连续运行大约 30 个脚本测试用例(每个测试用例都是一个脚本),并且经常出现故障,包括:无法识别指定的元素,元素不​​存在。

我已经添加了很多不同的方法来等待元素出现。有时当它明显存在时,我猜 Selenium 很难找到元素的 id ?

我已经包括了几个

在做某事之前总是检查一个元素是否存在。这可能会对性能产生巨大影响,但现在我只希望我的脚本运行无错误、完全健壮。我有这段代码:

即使这样也会出错!!!它不会失败以达到 selenium.stop 和“假”成功。我可以做些什么来构建脚本的健壮性?任何帮助,将不胜感激。

我在 IE 8 上使用 Selenium 2.20.0。

0 投票
1 回答
1466 浏览

android - android内容提供者对提供者崩溃的鲁棒性

在 android 平台上(在 ICS 上已确认),如果内容提供者在客户端处于查询中间(即有一个打开的游标)时死亡,则框架决定终止持有打开游标的客户端进程。

这是我尝试使用下载管理器查询时的 logcat 输出,该查询在执行查询后休眠。“睡眠”是为了重现问题。当提供者在正确/错误的时间死亡时,您可以想象它发生在常规用例中。然后杀掉 com.android.media(它承载了 downloadProvider)。

“杀死 com.example(pid 12234),因为提供者 com.android.providers.downloads.DownloadProvider 正在死亡进程 android.process.media”

我在 ActivityManagerService::removeDyingProviderLocked 中跟踪了此代码

这是一个政策决定还是提供者死亡后游标访问不安全?

看起来客户端光标正在为 CP 填充的 ashmem 位置保存一个 fd。这是客户端被杀死而不是在服务器(提供者)死亡时抛出像Binders这样的异常的原因吗?

0 投票
1 回答
807 浏览

shell - 从编译的可执行文件生成 CLI shell 脚本代码?

问题,讨论的话题

我对从以更健壮性、性能良好且与平台无关的编译语言(例如 OCaml)编写的代码生成命令行 shell 脚本源代码非常感兴趣。基本上,您将使用编译语言进行编程以执行您想要的与操作系统的任何交互(我建议:更复杂的交互或不容易以独立于平台的方式进行的交互),最后您将编译它到本机二进制可执行文件(最好),它将生成一个 shell 脚本,该脚本会在 shell 中影响您用编译语言编写的内容。[已添加]:对于“效果”,我的意思是设置环境变量和 shell 选项,执行某些非标准命令(标准脚本“胶水”将由编译的可执行文件处理,并将被排除在生成的 shell 脚本之外)和这样的。

到目前为止,我还没有找到任何这样的解决方案。与今天的其他可能性相比,它似乎相对容易*实现,例如将 OCaml 编译为 JavaScript。

  • 我描述的内容是否已经(公共)实现?
  • 还有哪些与我所描述的(非常)相似的可能性,它们在哪些方面与此不同?(我想到了语言到语言的编译(从编译到 sh),尽管这似乎不必要地难以实现。)

不是什么意思

  1. 另一种外壳(如 Scsh)。您管理的系统可能并不总是允许用户或一个管理员选择 shell,我也希望它是一个专门为其他人(客户、同事和其他人)提供的系统管理解决方案,那些不能期望的人接受不同的外壳。
  2. 一个替代解释器,用于非交互式 shell 脚本通常服务的目的(如 ocamlscript)。就个人而言,我在避免为此目的编写 shell 脚本方面没有问题。我这样做是因为 shell 脚本通常更难维护(例如,对某些字符敏感以及对诸如“命令”之类的可变事物的操作)并且更难制作到与流行的通用编程语言可以提供的相同级别的功能(例如例如,在这方面将 Bash 与 Python 进行比较)。但是,在某些情况下需要本机 shell 脚本,例如 shell 启动时由 shell 提供的 shell 配置文件。

背景

实际应用

你们中的一些人可能会怀疑我所描述的实际用途。一个实际应用是根据各种条件定义 shell 配置文件(例如,配置文件所在的系统平台/操作系统、安全策略遵循的内容、具体的 shell、登录/非登录类型shell,交互/非交互类型的 shell)。与(精心设计的)通用 shell 配置文件作为 shell 脚本相比的优势在于性能(可以生成压缩/优化源代码而不是人工编写的脚本解释的本机机器代码)、稳健性(类型检查、异常处理,功能的编译时验证,生成的二进制可执行文件的加密签名),功能(较少或不依赖用户级 CLI 工具,

实施细节,附带问题

  1. 程序员应该能够控制生成的 shell 脚本的通用程度。例如,可能每次运行二进制可执行文件并输出适当的 shell 配置文件代码,或者它可以简单地生成一个固定的 shell 脚本文件,以适应一次运行的情况。在后一种情况下,列出的优势——特别是那些健壮性(例如异常处理和对用户空间工具的依赖)的优势要有限得多。[添加]
  2. 生成的 shell 脚本是某种形式的通用 shell 脚本(如 GNU autoconf 生成)还是适应特定 shell(动态或非动态)的 shell-native 脚本对我来说不是主要问题。
  3. easy*:在我看来,这可以通过在基本 shell 内置函数的库中提供可用函数来实现。这样的函数将简单地将自身加上传递的参数转换为语义适当且语法正确的 shell 脚本语句(作为字符串)。

感谢您的任何进一步想法,尤其是具体建议!

0 投票
1 回答
127 浏览

xml-rpc - 我的 XML-RPC 插件的稳健性

我编写了一个 jQuery 插件,它使从客户端 JavaScript 与 XML-RPC 服务器的通信比其他方式更容易。我已经在我自己的应用程序中使用了它,它可以与 rtorrent 客户端成功通信。我将它作为独立插件发布:jquery-xmlrpc

用户已针对插件记录了两个问题(#1#2),指出它无法解析无效的 XML-RPC。有问题的无效 XML-RPC 是空<value>节点。用户正在处理发送无效 XML-RPC 文档的 XML-RPC 服务器。考虑以下 XML-RPC 文档,其中包含一个<nil>空字符串和一个不正确的空<value>节点:

最初,我很乐意处理错误的空<value>节点,并将它们视为<nil/>/null 元素。这似乎是一个奇怪的极端案例,但很容易处理,并且符合鲁棒性原则的精神:

“在你接受的东西上要自由,
在你发送的东西上要保守”

RFC 1122

但随后问题被更新为表现不佳的服务器也在<value>节点中发送了原始字符串,如下所示:

在这一点上,远程服务器完全不正确。这根本不是有效的 XML-RPC。但是鲁棒性原则指出,我应该在我接受的东西上保持自由。

鲁棒性原则应该走多远?我应该接受原始字符串吗?我是否应该拒绝,告诉其他用户针对表现不佳的 XML-RPC 服务器记录一个错误?在什么时候接受错误的输入会走得太远?

0 投票
2 回答
88 浏览

c - “文件数据”和“文件大小”是一起还是分别提交到磁盘

考虑这个例子:

如果在执行 fputs() 期间断电会发生什么?

之后,我能找到大小非零但第一个字节不是“h”的“my_file”吗?如果是,它是否保证为零,或者它是否可以包含任意值?

当然,假设没有其他人接触我们的文件。

编辑:还假设目标磁盘驱动器/设备的类型能够保持足够长的功率以写入它在内部缓冲的所有数据。

POSIX 对此有什么要说的吗?有Linux吗?有窗户吗?

编辑:我不打算关注如何实现 STDIO 流 API 的细节。假设 POSIX,这就是我真正的意思:

编辑:POSIX 将大小视为文件的元数据,因此问题可能改写为:由于上述代码,文件数据和该文件的元数据是否可以分阶段提交到磁盘?

编辑:在http://www.sqlite.org/atomiccommit.html找到这个:

7.5 具有安全附加语义的文件系统

SQLite 3.5.0 版中引入的另一个优化利用了底层磁盘的“安全附加”行为。回想一下,SQLite 假设当数据被附加到文件(特别是回滚日志)时,首先增加文件的大小,然后再写入内容。因此,如果在文件大小增加后但在写入内容之前断电,则文件将包含无效的“垃圾”数据。然而,VFS 的 xDeviceCharacteristics 方法可能表明文件系统实现了“安全附加”语义。这意味着内容是在文件大小增加之前写入的,因此不可能通过断电或系统崩溃将垃圾引入回滚日志。

这似乎至少提供了部分答案。

0 投票
1 回答
322 浏览

database-design - 我们是否应该总是消除计算属性,即使它是一个关键和复杂的计算?

数据库设计的“第三范式”要求您删除功能依赖关系。它旨在消除冗余,从表中删除可以从其他字段计算的任何属性(字段)。例如,当您引用另一个实体时,您只存储它的键。您不存储这些引用实体的属性副本,因为这意味着每次更改引用实体时都必须更新它们。

另一种情况是高度等属性。您想知道一个人的身高,但在您的应用程序中,您可能希望以不同的单位了解它:米、英尺、天文单位。但是您不会存储所有这些值,您应该删除计算字段,因此您只保留其中一个(当然是米),并在需要时“即时”计算转换后的值。

您也不存储年龄之类的东西,而是从出生日期计算它们。在这种情况下,年龄随时间变化的事实也起作用。如果你不这样做,你的数据很快就会不正确,除非你不断地更新它。

现在假设您有一个显示每个用户的星座的社交网络。对于每个用户,我们都会显示他或她的星座,这是根据出生日期和时间以及用户选择的占星术传统(例如西方或中国)计算得出的。计算某人的星座是一项非常专业和复杂的计算,但您仍然可以从占星术库中调用并计算。你会如何设计这个数据库,你会删除这个功能相关的属性,或者你会计算一次用户的符号,或者每次她更新她的出生日期,然后将它存储在数据库中并忘记计算登录的可能性你的系统的其余部分,或者你会强制执行“3NF” 用铁腕统治?如果用户坚持认为她的符号应该与您的算法计算的符号不同,那么您如何看待能够调整用户符号的潜在好处?

现在假设一个新的应用程序。你正在为军队建立一个系统,为新的应征者选择可能的职业。你的系统的一部分是一个巨大的模式识别机器,由 ORNL 开发,它会根据来自你数据库的大量数据告诉你允许应征入伍者从事哪些职业。这种模式识别方法会查看每个人的身高、出生日期、医疗记录、学校成绩单,并且还会查看该人对两份问卷之一的一长串答案。它还考虑了上级军官填写的评估问卷,并同时分析每年的所有应征入伍者,得出一堆参数,例如前馈神经网络。这个神经网络比整个模式识别系统更简单,但它仍然是一个相当复杂的计算,而不仅仅是温度单位的转换。然而,你可以把它看作一个“黑匣子”,当你从数据库中提取他的记录时,它可以告诉你每个应征者的命运。

在陆军日历中的特定日期,进行分析,找到 ANN 参数,现在您可以运行黑匣子并告诉每个应征者他将在接下来的一两年内做什么。这是一件非常重要的事情。您将决定人们的职业,您将派一些人在厨房操作烤箱,而另一些人则负责驾驶坦克。每个人都将登录陆军网络查看他们的职业,并在他们的个人网页中查看结果。

现在,小黑盒就在那里,它根据从数据库中提取的属性输出这个重要的值。属性和参数可能永远不会改变,而应征者命运的计算可能永远是正确的,永远是第一天的相同值。但是你真的会把它留在数据库之外,只是为了遵循“删除计算的属性”规则吗?

这不仅仅是年龄、星座或温度转换的一些计算。模式识别系统确实是计算属性的路径。但是你真的想把它永远保存在你的系统中,一遍又一遍地重新计算这个非常重要的事情吗?还是您认为最好计算一次,然后忘记这个神奇的黑匣子的存在?我的意思是,只要有一天运行所有这些疯狂的模式识别代码,然后挑选结果,并将它们记录在数据库中。当有人登录查看他的分析输出时,让查询只是一个无聊的数据获取过程,而将所有的识别“兴奋”留到下一次。

另一个更明显的情况:您经营着像亚马逊这样的网上商店。您有一种模式识别方法可以向人们推荐书籍,该方法来自数据库中的用户记录。你会在需要当前推荐的时候一直运行这个东西,还是将模式识别框视为与系统其余部分分开的东西,只是将其结果提供给其他程序可以读取的数据库?拥有一个控件不是很好吗,例如,以确保您不会在尴尬的时刻切换建议?...不要太担心计算负担,假设有出色的内存和计算资源。

TL;DR -- 你认为删除计算属性的规则永远不应该被打破,还是你会说可以将非常重要的属性的结果存储在数据库中,这些属性是通过非常复杂和精细的模式识别方法计算出来的?是否存在我们应该假装您实际上无法“按需”执行计算的情况,然后将这些结果记录在那里,无论如何都不会更新?

0 投票
1 回答
925 浏览

c++ - 如何在禁用 C++ 异常(VS2010)的情况下确保内存不足的稳健性?

我正在开发一个性能关键的动态链接库 (DLL),它也应该具有相对较小的二进制大小。由于它没有明确抛出任何异常,我想完全禁用异常支持。但是,有一个例外(双关语意外):当内存不足 (OOM) 时,我必须向应用程序报告错误代码,以便它有机会优雅地处理事情。代码库太大,无法单独检查每个分配并传播错误,并且包含我不应该接触的外部代码。所以我想在我的 DLL 导出函数中捕获 OOM 异常。

一个快速测试表明,当在 Visual C++ 2010 中禁用 C++ 异常(即没有 /EHa、/EHsc 或 /EHs 标志)时,它仍然会在分配过多内存时跳转到 catch(std::bad_alloc&) 块。

所以它似乎按预期工作。但是,我收到以下 1 级警告:“C4530:使用了 C++ 异常处理程序,但未启用展开语义。指定 /EHsc”。MSDN 说“在框架中自动存储的对象,在执行投掷的函数和捕获投掷的函数之间,不会被破坏”。

我会在这里失去什么?只要可以删除通过库创建的任何内容,并且应用程序可以重新开始(如果它愿意),就可以将事物置于未定义状态。是否存在无法恢复的泄漏内存的大风险?

DLL 是否使用单独的内存池?如果是这样,我可以在不需要应用程序卸载 DLL 的情况下清除它吗?我可以轻松地让我的库忽略任何进一步的(导出的)函数调用,直到应用程序执行重新初始化。

谢谢你的建议。

0 投票
4 回答
10048 浏览

c++ - 在 C++ 中引发运行时警告

几周前我开始使用异常,现在我想知道是否有办法只发出警告。如果未捕获此警告,则不应强制应用程序退出。我会给你一个例子,我想在什么情况下使用它。

有一个系统可以将属性附加到唯一 ID。当我以某种方式尝试将属性添加到尚不存在的 id 时,系统应在内部为我创建该 id,然后将属性添加到其中并返回结果。当然,这不能安静地完成。但由于应用程序可以继续运行,我不想抛出异常。

我如何通知某些事情不太正确,但系统仍在运行?

0 投票
1 回答
539 浏览

python - python中强大而快速的哈希函数(搜索算法)

Python 有一个默认的搜索功能:

其中 x,y,z 可以是任何整数或字符,但这是默认的顺序搜索,我想知道如何在 python 中使用手动散列搜索。

0 投票
5 回答
69649 浏览

python - Python,将整数写入“.txt”文件

使用 pickle 函数是否是将整数写入文本文件的最快、最可靠的方法?

这是我到目前为止的语法:

如果有更强大的替代方案,请随时告诉我。

我的用例是编写用户输入:

  • 是的,人类需要阅读它并可能对其进行编辑
  • 文件中将有 10 个数字
  • Python 可能需要稍后再读回它。