小编jpa*_*kal的帖子

unittest.mock:声明方法参数的部分匹配

Rubyist在这里编写Python.我有一些看起来像这样的代码:

result = database.Query('complicated sql with an id: %s' % id)
Run Code Online (Sandbox Code Playgroud)

database.Query被模拟了,我想测试ID是否被正确注入而不将整个SQL语句硬编码到我的测试中.在Ruby/RR中,我会这样做:

mock(database).query(/#{id}/)
Run Code Online (Sandbox Code Playgroud)

但是我无法在unittest.mock中看到像这样设置'选择性模拟'的方法,至少没有一些毛茸茸的side_effect逻辑.所以我尝试在断言中使用正则表达式:

with patch(database) as MockDatabase:
  instance = MockDatabase.return_value
  ...
  instance.Query.assert_called_once_with(re.compile("%s" % id))
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.这种方法确实有效,但它很难看:

with patch(database) as MockDatabase:
  instance = MockDatabase.return_value
  ...
  self.assertIn(id, instance.Query.call_args[0][0])
Run Code Online (Sandbox Code Playgroud)

好主意?

python unit-testing mocking

41
推荐指数
3
解决办法
1万
查看次数

从传入的PHP请求中获取自定义Authorization标头

所以我试图在PHP中解析传入的请求,该请求具有以下标头集:

Authorization: Custom Username
Run Code Online (Sandbox Code Playgroud)

简单的问题:我怎么能得到它的手?如果是的话Authorization: Basic,我可以从中获取用户名$_SERVER["PHP_AUTH_USER"].如果是的话X-Custom-Authorization: Username,我可以从中获取用户名$_SERVER["HTTP_X_CUSTOM_AUTHORIZATION"].但这些都不是由自定义授权设置的,var_dump($_SERVER)没有提到标题(特别AUTH_TYPE是缺少),PHP5函数get_headers()只能处理对传出请求的响应.我在Apache上使用开箱即用的Ubuntu安装运行PHP 5.

php authorization http-headers

34
推荐指数
5
解决办法
6万
查看次数

Ruby:在字符处拆分字符串,从右侧开始计算

简短版 - 如何在ruby中使用Python rsplit()?

更长的版本 - 如果我想在第一个'.'将一个字符串拆分为两个部分(名称,后缀).性格,这很好地完成了工作:

name, suffix = name.split('.', 2)
Run Code Online (Sandbox Code Playgroud)

但如果我想在最后(最右边)分开'.' 性格,我还没有能够提出比这更优雅的东西:

idx = name.rindex('.')
name, suffix = name[0..idx-1], name[idx+1..-1] if idx
Run Code Online (Sandbox Code Playgroud)

请注意,原始名称字符串可能根本没有点,在这种情况下,名称应该是不变的,后缀应该是nil; 它也可能有多个点,在这种情况下,只有最后一个后面的位应该是后缀.

ruby string split

26
推荐指数
2
解决办法
2万
查看次数

Rails url helper不编码&符号

所以我正在尝试使用Rails URL帮助程序(page_url)来创建包含特殊字符的URL,包括&符号.大多数情况的工作方式与您期望的一样:

(rdb:1) page_url('foo', :host => 'host')
"http://host/pages/foo"
(rdb:1) page_url('foo_%_bar', :host => 'host')
"http://host/pages/foo_%25_bar"
Run Code Online (Sandbox Code Playgroud)

但由于一些奇怪的原因,&符号没有被转义:

(rdb:1) page_url('foo_&_bar', :host => 'host')
"http://host/pages/foo_&_bar"
Run Code Online (Sandbox Code Playgroud)

如果我预先逃脱它们,它们就会被破坏:

(rdb:1) page_url('foo_%26_bar', :host => 'host')
"http://host/pages/foo_%2526_bar"
Run Code Online (Sandbox Code Playgroud)

CGI::escape另一方面,他们逃脱了罚款:

(rdb:1) CGI::escape('foo_&_bar')
"foo_%26_bar"
Run Code Online (Sandbox Code Playgroud)

发生了什么,我该如何解决这个问题?(有更好的东西gsub('&', '%26'),就是这样.)

ruby-on-rails helper url-encoding

11
推荐指数
2
解决办法
7657
查看次数

Rails控制器丢失JSON字符串中的换行符

在这里打了一堵砖墙.我正在尝试将包含换行符的字符串(\n,由JSON.stringify转换为\ u000a)作为JSON对象的一部分发送到Rails应用程序:

{"bob":{"id":46,"notes":"foo\u000abar\u000abaz"}}
Run Code Online (Sandbox Code Playgroud)

这样就越过电线,\ u000a转义为%5Cu000a:

http://localhost/bobs/46?draft=true&%7B%22bob%22%3A%7B%22id%22%3A46%2C%22notes%22%3A%22foo%5Cu000abar%5Cu000abaz%22%7D%7D=
Run Code Online (Sandbox Code Playgroud)

但是第二个请求击中了Rubyland,新行消失在一个以太的空间中,变成了空格:

Processing Api::BobsController#update (for 127.0.0.1 at 2011-05-19 11:01:43) [PUT]
  Parameters: {"draft"=>"true", "action"=>"update", "id"=>"46", "controller"=>"api/bobs", "bob"=>{"notes"=>"foo bar baz", "id"=>46}
Run Code Online (Sandbox Code Playgroud)

而且它不仅仅是一些日志工件,而且它们也会以这种方式进入数据库:

ree-1.8.7-2010.02 > Bob.find_by_id(46)
 => #<Bob id: 46, notes: "foo bar baz"...>
Run Code Online (Sandbox Code Playgroud)

如果我发送例如."\\n"而不是"\n",它们通过罚款:

Processing Api::BobsController#update (for 127.0.0.1 at 2011-05-19 11:01:43) [PUT]
  Parameters: {"draft"=>"true", "action"=>"update", "id"=>"46", "controller"=>"api/bobs", "bob"=>{"notes"=>"foo\\nbar\\nbaz", "id"=>46}
Run Code Online (Sandbox Code Playgroud)

发生了什么事,为什么?

更新:一位同事模糊地回忆起听说Passenger被怀疑放弃了一些特殊的字符,但他找不到提及这一点,我也不能......?

ruby json ruby-on-rails passenger line-breaks

8
推荐指数
1
解决办法
1351
查看次数

1000个项目,1000个节点,每个节点3个项目,最佳复制方案,以最大限度地减少节点失败时的数据丢失

我想知道Skiena 算法设计手册(第2版)中问题2-44的正确答案是什么.

问题如下:

我们有1,000个数据项存储在1,000个节点上.每个节点可以存储三个不同项目的副本.提出复制方案,以在节点发生故障时将数据丢失降至最低.当三个随机节点发生故障时,丢失的数据条目的预期数量是多少?

我在考虑节点n有n,n + 1和n + 2的数据项.

因此,如果3个连续节点丢失,那么我们将丢失1个项目.

有更好的解决方案吗?

algorithm

8
推荐指数
1
解决办法
2299
查看次数

密码重置没有数据库表的电子邮件

通过邮件重置用户密码的正常流程如下:

  1. 生成随机字符串并将其存储在数据库表中
  2. 电子邮件字符串给用户
  3. 用户单击包含字符串的链接
  4. 字符串根据数据库进行验证; 如果匹配,则重置用户的pw

但是,维护一个表并使旧字符串等过期似乎有点不必要的麻烦.这种替代方法有任何明显的缺陷吗?

  1. 生成用户现有密码的MD5哈希值
  2. 将哈希字符串发送给用户
  3. 用户单击包含字符串的链接
  4. 通过再次散列现有pw来验证字符串; 如果匹配,则重置用户的pw

请注意,用户的密码已经以散列和盐渍形式存储,我只是再次对其进行哈希处理,以获得唯一但可重复的字符串.

是的,有一个明显的"缺陷":这样生成的重置链接在用户更改密码(点击链接)之前不会过期.我真的不明白为什么这会成为一个问题 - 如果邮箱被泄露,用户无论如何都会被搞砸.并且没有重复使用的风险,因为一旦用户的密码更改,重置链接将不再匹配.

security reset forgot-password

7
推荐指数
1
解决办法
3231
查看次数

Nokogiri相当于jQuery nearest()方法,用于在树中查找第一个匹配的祖先

jQuery有一个可爱的,有点错误的名为nearest()的方法,它在DOM树中寻找匹配的元素.例如,如果我有这个HTML:

<table src="foo">
  <tr>
    <td>Yay</td>
  </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

假设element设置为<td>,那么我可以src像这样计算值:

element.closest('table')['src']
Run Code Online (Sandbox Code Playgroud)

如果缺少表元素或其src属性,那将彻底返回"undefined".

在Javascriptland中习惯了这个,我很想在Rubyland中找到与Nokogiri相同的东西,但是我能够想出的最接近的是使用祖先()的这种明显不优雅的黑客攻击:

ancestors = element.ancestors('table')
src = ancestors.any? ? first['src'] : nil
Run Code Online (Sandbox Code Playgroud)

需要三元组,因为如果在空数组上调用,则返回nil.好主意?

ruby dom ancestor nokogiri closest

7
推荐指数
2
解决办法
2956
查看次数

使用ActiveRecord自行加入桌面

我有一个ActiveRecord调用Name,其中包含各种名称Languages.

class Name < ActiveRecord::Base
  belongs_to :language

class Language < ActiveRecord::Base
  has_many :names
Run Code Online (Sandbox Code Playgroud)

用一种语言查找名称很容易:

Language.find(1).names.find(whatever)
Run Code Online (Sandbox Code Playgroud)

但我需要找到匹配的对,其中语言1和语言2具有相同的名称.在SQL中,这需要一个简单的自联接:

SELECT n1.id,n2.id FROM names AS n1, names AS n2
  WHERE n1.language_id=1 AND n2.language_id=2
    AND n1.normalized=n2.normalized AND n1.id != n2.id;
Run Code Online (Sandbox Code Playgroud)

如何使用ActiveRecord执行此类查询?请注意,我需要找到一对名称(=匹配的两侧),而不仅仅是语言1中恰好与某些内容匹配的名称列表.

对于奖励积分,替换n1.normalized=n2.normalizedn1.normalized LIKE n2.normalized,因为该字段可能包含SQL通配符.

我也对以不同方式建模数据的想法持开放态度,但如果可以的话,我宁愿避免为每种语言使用单独的表.

mysql activerecord ruby-on-rails self-join

6
推荐指数
1
解决办法
7092
查看次数

浏览器支持和土耳其里拉标志的变通方法

所以土耳其最近决定为他们的里拉创造一个新的标志:

在此输入图像描述

Unicode 6.2(2012年9月发布)将添加到其保留曲目U+20BA ? TURKISH LIRA SIGN,并且我被要求在我正在构建的Web应用程序中开始使用它.问题是没有人支持这个(除了显然是Windows 8),它并没有显示为通常的方形,问号或块十六进制,而是各种其他随机的东西.通常可靠的fileformat.info认为它应该是这样的:

在此输入图像描述

...这也是我在OS X 得到的.Charbase也错了,但不同:

在此输入图像描述

实际问题:有没有合理的解决方法?最大的复杂因素是该字符应该被允许在任意的,用户可编辑的文本中,因此任何基于图像的解决方案都在窗外.

理论上的问题是:据我所知,U + 20BA从未有过分配给它的角色,那么这些奇怪的符号从何处传入?我没有得到同样的问题U+20B9 ? INDIAN RUPEE SIGN,这几乎是新的和非常支持的,但至少失败更优雅.

html unicode turkish

6
推荐指数
1
解决办法
3985
查看次数