小编d11*_*wtq的帖子

Rails最佳实践:后台进程/线程?

我来自PHP环境(至少在web开发方面)和Ruby的美丽世界,所以我可能会有一些愚蠢的问题.我想在不使用PHP时有一些根本不同的选项.

在PHP中,我们使用memcache来存储我们想要在页面顶部的栏中显示的警报.当发生某些事件产生警报(例如正在制作新的博客帖子)时,每5分钟左右运行一次的cron脚本会将该信息放入内存缓存中.

现在,当用户访问该站点时,我们会查看memcache以查找他们尚未解除的任何警报,并显示它们.

我猜测我在Rails中可以采取不同的做法,就是绕过对cron脚本的需求,并且还需要在每个请求中查看memcache,方法是使用Singleton和在单独的线程中运行的轮询进程从memcache复制到这个单例.理论上,这将比每次请求检查memcache更优化,并且还将轮询逻辑封装到一个位置,而不是在cron任务和查找逻辑之间进行拆分.

我的问题是:当Rails应用程序运行时,是否有任何警告要在后台运行某种runloop?我从Objective-C/Java了解多线程的含义,但我特别询问Rails(3)环境.

基本上是这样的:

class SiteAlertsMap < Hash
  include Singleton

  def initialize
    super
    begin_polling
  end

  # ... SNIP, any specific methods etc ...

  private

    def begin_polling
      # Create some other Thread here, which polls at set intervals
    end
end
Run Code Online (Sandbox Code Playgroud)

这让我陷入了类似的问题.我们将(加密的)任务推送到SQS队列,用于与电子商务和长时间运行的后台任务相关的事务.我们不使用cron,而是使用PHP编写的worker守护进程,它在后台运行.现在,当我们部署时,我们必须关闭这个工作人员并从新的代码库再次启动它.在Rails中,我能以某种方式让这个过程开始和停止使用rails服务器(独角兽)本身吗?我不认为这是我在主进程中在一个单独的线程中运行的东西,因为我们经常希望将它作为一个进程单独控制,但如果它只是在Web应用程序运行时方便地运行会很好.

ruby multithreading ruby-on-rails polling

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

如果我想覆盖资源路径(例如 post_path(@post)),我应该在哪里做?

更新(再次)| 忽略我之前放在这里的模块东西。最好只使用to_param和使路线工作。

to_param
  if slug
    "#{id}-#{slug}"
  else
    super
  end
end

match "/posts/:id(-:slug)" => "posts#show", :as => :post, :constraints => { :id => /\d+|\d+-.*/ }
Run Code Online (Sandbox Code Playgroud)

诀窍就在这条路上。它使-:slug可选,并向:id. 约束的偏好是只匹配一个数值(这是请求进来时使用的,所以你有:id:slug在你的参数中),但管道允许它也匹配一个数值,后跟 slug,目的路由生成。这是一个温和的黑客,但这整件事都是真的。允许资源提供参数的散列将解决这个问题。这可以应用于您想要的任何花哨路线(例如,:id在结尾而不是开头)。

导轨 3.0.7。

走一条路线,如:

match "/posts/:id-:slug" => "posts#show", :as => :post
Run Code Online (Sandbox Code Playgroud)

post_path(obj)为我提供了一个帮助程序,但当然,它只想从我的模型中生成一个参数,据我所知,无法从我的模型to_param方法中返回多个值。我知道我可以这样写to_param

to_param
  "#{id}-#{slug}"
end
Run Code Online (Sandbox Code Playgroud)

但这作为单个参数传递给路由,最终不匹配任何路由。同样,我知道我可以"-:slug"从我的路线中删除,但是:id参数包含虚假输入并且基本上有点黑客(尽管显然已经完成)。

如果 Rails 的未来版本允许您从 返回哈希值to_param,那就太棒了,例如:

to_param
  { :id => id, :slug => slug }
end …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails

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

用于次要模式的Elisp内部变量作用域(setq/make-local-variable/let)

我已经编写了这个小小模式,以便在主模式执行初始缩进行为后让TAB键继续缩进和/或在主模式认为不需要缩进时强制缩进.

有人向我指出的是,组合setqmake-local-variable大概可以简化为一个let范围.鉴于这需要同时跨多个缓冲区工作,如何使用let而不是make-local-variable

;;; dwim-tab.el --- minor mode to force indentation when TAB would otherwise stall

; internal tracking variables
(setq dwim-tab-point-before nil)
(setq dwim-tab-point-after nil)

(defun dwim-tab ()
  "Indents normally once, then switches to tab-to-tab-stop if invoked again.
Always performs tab-to-tab-stop if the first TAB press does not cause the
point to move."
  (interactive)
  (setq dwim-tab-point-before (point))
  (if (eq dwim-tab-point-before dwim-tab-point-after) ; pressed TAB again
      (tab-to-tab-stop) 
    (indent-for-tab-command))
  (if (eq (point) …
Run Code Online (Sandbox Code Playgroud)

emacs elisp

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

如何定义像Array(arg)和String(arg)这样的快捷方式?

如果是ArrayString类定义,这些东西是如何定义的?

def whatever(some_input)
  some_input = Array(some_input)
end
Run Code Online (Sandbox Code Playgroud)

如何调用它?我们可以将此行为添加到我们自己的类中,还是仅适用于核心类?

ruby

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

sscanf'转换在格式结束时缺少类型'

我收到了这个警告sccanf():

../../../../ext/oedipus/oedipus.c:211: warning: conversion lacks type at end of format
Run Code Online (Sandbox Code Playgroud)

来自这一行:

sscanf(v, "%h", &s);
Run Code Online (Sandbox Code Playgroud)

s是一个short.

我知道我可以忽略这个警告,但到目前为止我是在免费警告,所以如果可能的话,我想让它保持沉默.什么sscanf()期待不同?

c scanf

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

使用CALayer将对角横幅/徽章添加到UITableViewCell的角落

我正在尝试在我的表格视图中绘制装饰UITableViewCell,文本横幅看起来像一个邮票,对角线横跨单元格的左上角.

我可能完全在错误的地方做这件事,但我要-layoutSubviews重新添加图层.我试着这样做-drawRect:但是当表格呈现时,横幅最终被表格视图的imageView所覆盖(即图层位于图像视图下方,因为稍后会添加图像视图).

我真的很难为此得到正确的数学.我已经计算过,假设横幅从距离单元顶部40个点开始,距左边40个点,正好在-45º角度,斜边将是56个点.所以我将CALayer宽56点,然后旋转-45º,这是有效的.问题是细胞内的位置......它坐在细胞内,而不是靠在它的边缘.

而不是我应用试验和错误来把它放在正确的地方,有人可以帮助我数学吗?显然我需要移动图层旋转它.

感觉就像我在这里需要的anchorPoint,但这似乎实际上移动了层,所以我必须忽略这一点(没有双关语意).

- (void)layoutSubviews
{
    [super layoutSubviews];

    self.imageView.frame = CGRectMake(10, 10, 50, 50);

    if (self.hasBanner) {
        CALayer *banner = [CALayer layer];
        banner.backgroundColor = [UIColor colorWithRed:.5f green:.5f blue:.5f alpha:1.f].CGColor;
        banner.frame = CGRectMake(0, 40-15, 56, 15);
        banner.anchorPoint = CGPointMake(0, 1); // this just makes it worse
        banner.transform = CATransform3DMakeRotation(-45.0 / 180.0 * M_PI, 0.0, 0.0, 1.0);
        [self.layer addSublayer:banner];
    }
}
Run Code Online (Sandbox Code Playgroud)

横幅坐在错误的地方

iphone uitableview ios

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

包括使用跨项目引用的嵌入式框架:Header没有这样的文件或目录

我正在尝试通过在Xcode中使用跨项目引用来创建Cocoa框架.

我有2个项目:一个用于框架; 一个用于将使用该框架的应用程序.

该框架打算存储在系统中; 它是一个嵌入在应用程序包中的嵌入式框架.

我已经成功地进行了跨项目引用,将框架标记为我的目标的依赖项,添加了一个复制文件构建阶段,将框架放入Contents/Frameworks /并将框架添加到链接器阶段(我检查了一下"目标"复选框;我也通过将框架拖到链接器阶段手动完成它.

我的框架的安装目录已正确设置为@executable_path /../ Frameworks.

但是,当我尝试构建我的应用程序时:

a)首先正确构建框架b)正确复制框架c)错误,因为它无法在我的框架中找到主头文件

我已经确认标题在那里.我可以在部分构建的应用产品中看到它.

ls build/Debug/CioccolataTest.webapp/Contents/Frameworks/Cioccolata.framework/Headers/Cioccolata.h build/Debug/CioccolataTest.webapp/Contents/Frameworks/Cioccolata.framework/Headers/Cioccolata.h

我已经能够通过将我的框架复制到/ Library/Frameworks(我可以在成功构建后再次删除它)来成功构建应用程序,但这是一种解决方法,我希望找到它为什么Xcode没有找到框架的主头文件,而不将其复制到系统目录.在构建期间将它复制到应用程序包是不够的?

这是完整的构建脚本,如果它有任何帮助(它现在只是一个Hello World应用程序,所以这里没有多少):

Build Cioccolata of project Cioccolata with configuration Debug

SymLink /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Versions/Current A cd /Users/chris/Projects/Mac/Cioccolata /bin/ln -sf A /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Versions/Current

SymLink /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Resources Versions/Current/Resources cd /Users/chris/Projects/Mac/Cioccolata /bin/ln -sf Versions/Current/Resources /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Resources

SymLink /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Headers Versions/Current/Headers cd /Users/chris/Projects/Mac/Cioccolata /bin/ln -sf Versions/Current/Headers /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Headers

SymLink /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Cioccolata Versions/Current/Cioccolata cd /Users/chris/Projects/Mac/Cioccolata /bin/ln -sf Versions/Current/Cioccolata /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Cioccolata

ProcessInfoPlistFile /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Versions/A/Resources/Info.plist Info.plist cd /Users/chris/Projects/Mac/Cioccolata builtin-infoPlistUtility Info.plist -expandbuildsettings -platform macosx -o /Users/chris/Projects/Mac/Cioccolata/build/Debug/Cioccolata.framework/Versions/A/Resources/Info.plist

CpHeader build/Debug/Cioccolata.framework/Versions/A/Headers/CWHelloWorld.h …

xcode frameworks objective-c

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

创建一个全局"null"结构以便在C程序中重用?

不知道我在这里做错了什么.我有一个通过我的程序大量使用的结构.

typedef struct _MyStruct {
  // ... handful of non-trivial fields ...
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

我期望(读,打算)程序的很多部分返回其中一个结构,但是其中许多应该能够返回一个"null"结构,它是一个单例/全局结构.确切的用例是执行功能说"我找不到你要我回来的东西".

我假设这是一个简单的例子,在头文件中定义一个变量,并在.c文件中初始化它.

// MyStruct.h

// ... Snip ...

MyStruct NotFoundStruct;
Run Code Online (Sandbox Code Playgroud)

-

// MyStruct.c

NotFoundStruct.x = 0;
NotFoundStruct.y = 0;
// etc etc
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨初始化不是常量.

因为我不关心这个全局实际在内存中引用的内容,所以我只关心所有内容都使用相同的全局,我只是尝试删除初始化并简单地将定义留在头文件中.

但是当我这样做时:

MyStruct thing = give_me_a_struct(some_input);
if (thing == NotFoundStruct) {
  // ... do something special
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨二进制运算符"=="(或"!=")的操作数无效.

如何定义诸如全局可重用(始终是相同的内存地址)结构?

c struct global objective-c

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

试图在Array子类中重新定义+ =似乎没有做任何事情?

在一个Array子类(只是一个执行某些输入值强制的数组)中,我已经定义#concat了确保值被强制转换.因为从来没有人使用#concat,并且更容易使用#+=我试图别名#+=#concat,但它似乎永远不会被调用.有任何想法吗?

请注意,强制实际上总是对特定超类的对象(通过构造函数接受输入),以防这个代码似乎没有按照我的描述进行操作.它是内部私有API的一部分.

  class CoercedArray < Array
    def initialize(type)
      super()
      @type = type
    end

    def push(object)
      object = @type.new(object) unless object.kind_of?(@type)
      super
    end

    def <<(object)
      push(object)
    end

    def concat(other)
      raise ArgumentError, "Cannot append #{other.class} to #{self.class}<#{@type}>" unless other.kind_of?(Array)
      super(other.inject(CoercedArray.new(@type)) { |ary, v| ary.push(v) })
    end

    alias :"+=" :concat
  end
Run Code Online (Sandbox Code Playgroud)

#concat工作正常,但#+=似乎完全被旁路.

ruby arrays concat

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

是否可以有条件地使用iOS 6功能但仍支持旧设备?

有时在新版本的iOS中添加了一些很容易使用的功能,但是您不希望仅仅因为一个次要功能而阻止旧设备上的用户使用该应用程序.

我刚刚添加UIRefreshControl到iOS 6中添加的应用程序.我真的不在乎使用第三方解决方案(其中有一个数字),我只是不想调用设置的代码如果我在旧设备上运行它.我怀疑,作为一种静态语言,这是不可能的,但我想我会问,看看是否有办法实现这一目标.

显然,如果我只是共享代码,我可以使用预处理器宏来完成,但我需要构建应用程序以在iOS 5.1 + iOS 6.0上执行.

iphone objective-c

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

在 Vim 中通过外部命令管道部分行选择

我知道我可以使用:!视觉选择来通过外部命令管道选定的,但是有没有办法对一行上的单个单词执行相同的操作?我需要在配置文件中对令牌进行 Base64 编码,但遇到了麻烦,整行都被发送到base64. 如果我将单词移动到自己的行,我会得到一个\n以 Base64 字符串编码的尾随字符。我知道有一个专门用于此目的的插件,但一般来说,是否可以通过外部程序对小于整行的缓冲区单元进行管道传输?

vim base64

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