小编Chr*_*ton的帖子

如何在Ruby中块化数组

在Ruby 1.8.6中,我有一个数组,比如100,000个用户id,每个用户id都是一个int.我想在这些用户ID上执行一段代码,但我想以块的形式执行.例如,我想一次处理100个.我怎样才能尽可能简单地实现这一目标?

我可以做类似下面的事情,但可能有一个更简单的方法:

a = Array.new
userids.each { |userid|
  a << userid
  if a.length == 100
    # Process chunk
    a = Array.new
  end
}
unless a.empty?
  # Process chunk
end
Run Code Online (Sandbox Code Playgroud)

ruby arrays

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

如何在运行时访问Rails配置值?

我正在使用Rails 2.3.x. 我想要一小段代码运行,当且仅当它config.cache_classes是真的.默认情况下,这对于生产是正确的,对于开发来说是错误的.

如何从environment.rb,development.rb和production.rb文件外部访问config.cache_classes的值?很容易判断我们是否处于生产或开发阶段,Rails.env会给我们答案.但是不能保证开发人员没有config.cache_classes = true开发.

我当然明白,您通常不希望在开发和生产中运行单独的代码路径.在这个特定的例子中,我们根本就没有在启动时执行某些工作; 如果我们以后需要执行它,我们将在开发和生产中这样做.

ruby-on-rails

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

如何在Ruby中去除字符串中的前导和尾随引用

我想从一个字符串中删除Ruby中的前导和尾随引号.引号字符将出现0或1次.例如,以下所有内容都应转换为foo,bar:

  • "foo,bar"
  • "foo,bar
  • foo,bar"
  • foo,bar

ruby regex string

35
推荐指数
4
解决办法
5万
查看次数

就地C++集合交集

在C++中交叉两个集合的标准方法是执行以下操作:

std::set<int> set_1;  // With some elements
std::set<int> set_2;  // With some other elements
std::set<int> the_intersection;  // Destination of intersect
std::set_intersection(set_1.begin(), set_1.end(), set_2.begin(), set_2.end(), std::inserter(the_intersection, the_intersection.end()));
Run Code Online (Sandbox Code Playgroud)

我该怎么做一个就地设置交叉点?也就是说,我希望set_1具有对set_intersection的调用结果.显然,我可以做一个set_1.swap(the_intersection),但这比现场交叉效率要低得多.

c++ stl set

20
推荐指数
1
解决办法
7478
查看次数

键值存储中的原子事务

请原谅我在术语上的任何错误.特别是,我使用的是关系数据库术语.

有许多持久的键值存储,包括CouchDBCassandra,以及许多其他项目.

反对它们的典型论点是它们通常不允许跨多个行或表的原子事务.我想知道是否有一般方法可以解决这个问题.

以一组银行账户的情况为例.我们如何将钱从一个银行账户转移到另一个银行账户?如果每个银行帐户都是一行,我们希望将两行更新为同一事务的一部分,从而减少一个值并增加另一个值.

一种显而易见的方法是使用一个描述事务的单独表.然后,将钱从一个银行账户转移到另一个银行账户只需在该表中插入一个新行即可.我们不存储两个银行账户中任何一个的当前余额,而是依赖于汇总交易表中的所有相应行.然而,很容易想象这将是太多的工作; 银行每天可能有数百万笔交易,而个人银行账户可能很快就会有数千笔与之相关的"交易".

如果基础数据自上次抓取以来发生了变化,那么一些(全部?)键值存储将"回滚"一个动作.可能这可能用于模拟原子事务,然后,您可以指示特定字段被锁定.这种方法存在一些明显的问题.

还有其他想法吗?我的方法完全有可能是错误的,我还没有围绕新的思维方式包围我的大脑.

couchdb transactions key-value cassandra

17
推荐指数
3
解决办法
6658
查看次数

我如何提交git标签?

我已成功制作,提交并推送更改到中央git存储库.我现在意识到我要标记所有文件的当前版本.所以我这样做:

git tag -a 0.5
Run Code Online (Sandbox Code Playgroud)

这成功了.但现在我尝试了一下git push,我被告知没有什么可以承诺的.如何将新标签推送到中央存储库?

(注意git tag显示标记0.5,但仅在本地)

git version-control git-tag

15
推荐指数
2
解决办法
3429
查看次数

在Ruby中关闭SSL证书验证

使用'net/https'和ssl时,如何禁用对生成的SSL证书的验证?

ruby ssl ssl-certificate

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

MySQL删除行的死锁

我们有一个(目前是InnoDB)表,其中包含大约500,000行.这表示要运行的任务队列.它存储在MySQL数据库中.

一个连续的基础,至少每秒一次,但有时更频繁,我们从中选择数据,然后更新一些行.每天一次,我们从表中修剪旧行.

我们开始在桌面上遇到僵局,这使我们的任务处理停滞不前.这些僵局是在夜间修剪过程中造成的.DELETE,SELECT和UPDATE的组合意味着基本上没有任何生产力可能发生.遗憾的是,我没有SHOW ENGINE INNODB STATUS的输出.

我想知道解决这个问题的最佳选择.请注意,我们的代码会检测死锁并重新发出查询.此外,我们很久以前就发现一次删除所有匹配的行对于看到大量活动的数据库表太过费力,所以我们一次将删除限制为10,000行,并继续重新发出查询,直到所有必要的行都被删除为止.修剪.

我看到以下选项,并希望哪些是最好的意见,或其他选项的建议:

  1. 一次删除较少的行
  2. 在我们的DELETE上使用指数退避,但我担心这对我们的特定工作量没有帮助
  3. 根据MySQL文档的 LOCK TABLES .我们可能会接受在删除期间阻塞SELECT和UPDATE语句.
  4. 切换到MyISAM表类型.我们选择了InnoDB,因为我们最初使用的是此表上的事务.这已不再是这种情况.我不熟悉具体知识,知道这是否是一个可行的解决方案.
  5. 也许使用UPDATE LOW_PRIORITY.可能是DELETE不影响SELECT,只影响UPDATE,这可能就足够了.

mysql deadlock innodb

10
推荐指数
1
解决办法
6121
查看次数

如何在Ruby中交错不同长度的数组

如果我想在Ruby中交错一组数组,并且每个数组的长度相同,我们可以这样做:

a.zip(b).zip(c).flatten
Run Code Online (Sandbox Code Playgroud)

但是,如果阵列的大小不同,我们如何解决这个问题呢?

我们可以这样做:

def interleave(*args)
  raise 'No arrays to interleave' if args.empty?
  max_length = args.inject(0) { |length, elem| length = [length, elem.length].max }
  output = Array.new
  for i in 0...max_length
    args.each { |elem|
      output << elem[i] if i < elem.length
    }
  end
  return output
end
Run Code Online (Sandbox Code Playgroud)

但有没有更好的'Ruby'方式,也许使用zip或转置或其他一些?

ruby arrays

7
推荐指数
3
解决办法
4200
查看次数

在Ruby中获取调用者模块

我们有代码在Ruby 1.8.6 Web应用程序中记录数据.你大致如下调用它:

$log.info("Some text here")
Run Code Online (Sandbox Code Playgroud)

现在,在记录的输出中,我想要包含出现该行的模块.我知道Kernel#caller会给我一个数组,我可以提取日志行发生的文件和行号,但我不希望这样.我想要模块,而不是文件名.显而易见的解决方案是修改日志行,使其如下所示:

$log.info("Some text here", self.class.name)
Run Code Online (Sandbox Code Playgroud)

然后解析结果.但是,这不会起作用,因为我试图在默认情况下提取此信息.也就是说,如果程序员忘记指定模块,那么我需要解决方案才能工作,这是日志行的第二个参数.

有没有办法做到这一点?如果没有,我将只需要处理caller数组; 我们的大多数模块都在不同的目录中,因此这将是一个80%的解决方案.

更完整的示例,请原谅轻微的语法错误:

在文件log.rb中:

module Log
  class Logger
    def info(msg, mod = '')
      puts "Module: #{mod}  Msg: #{msg}"
    end
  end # class Logger
end # module Log
$log = Log::Logger.new
Run Code Online (Sandbox Code Playgroud)

在文件foo.rb中:

module Foo
  class Bar
    def do_something
      # Do not pass in self.class.name.
      # We want the output to look like:
      # Module: Foo  Msg: I did something!
      $log.info "I did something!"
    end
  end …
Run Code Online (Sandbox Code Playgroud)

ruby reflection

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