小编Nic*_*las的帖子

在Rails中实现通知

在我的申请中,我想在评论或帖子中提及他/她时通知用户.
用户句柄@user_name类似于Facebook.
提及的数据库表如下所示:

Mention
  mentioned_by: user_id (foreign key)
  user_mentioned: user_id (foreign key)
  comment_id: (foreign key)
  post_id: (foreign key)
Run Code Online (Sandbox Code Playgroud)

我无法想出实现它的方法.Facebook/Twitter如何做到这一点?

我决定使用的是使用ActiveRecord callbacks/ Observer design pattern,每当新的评论/帖子保存到数据库时,我都可以浏览帖子/评论的内容,并留意任何提及,然后根据需要执行通知.

我觉得有一些缺失的东西,我没有把它弄好.
这是最好的方式吗?

twitter notifications facebook ruby-on-rails observer-pattern

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

在Tomcat中使用来自Java Web应用程序的OSGi Bundle

我试图从Java Web应用程序调用OSGi包的方法.两者都应该在Tomcat 7上运行.

我已经编写了一个普通的Java应用程序来调用OSGi包中的方法,如本网站所述:http://drupal.osgibook.org/node/37.

为了获得Equinox环境的上下文,我从应用程序启动它并从内部安装了bundle.此外,上下文用于检索正在运行的包的服务引用并获取其服务.

EquinoxRunner类的runEquinox方法:

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;

public BundleContext runEquinox([...]) throws Exception {
    [...]

    BundleContext bundleContext = EclipseStarter.startup(new String[]{"-console"}, null);
    bundleContext.installBundle("file:C:/.../plugins/myosgiclass.interface_1.0.0.201108301327.jar");
    Bundle bundleTranslationImpl =  bundleContext.installBundle("file:C:/.../plugins/myosgiclass.impl_1.0.0.201108301327.jar");
    bundleTranslationImpl.start();

    [...]
    return bundleContext;
}
Run Code Online (Sandbox Code Playgroud)

和ServiceRunner类的invokeMethod:

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

[...]

public Object invokeMethod(BundleContext bundleContext, Object value, [...]){
    ServiceReference serviceReference = bundleContext.getServiceReference(MyOSGiClass.class.getName());
    Object result = null;
    if (serviceReference != null) {
        MyOSGiClass myOSGiClass = (MyOSGiClass) bundleContext.getService(serviceReference);
        if (myOSGiClass != null) result = myOSGiClass.method(value);
        bundleContext.ungetService(serviceReference);
    }
    return result;
} …
Run Code Online (Sandbox Code Playgroud)

java tomcat osgi eclipse-plugin equinox

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

如何使用 Yield 记录方法的返回类型?

我想使用 YARD 更好地记录此 na\xc3\xafve 记忆方法的返回类型:

\n
# Ensures that given block is only executed exactly once and on subsequent\n# calls returns result from first execution. Useful for memoizing methods.\n#\n# @param key [Symbol]\n#   Name or unique identifier of the method that is being memoized\n# @yield\n# @return [Object] Whatever the block returns\ndef memoize(key, &_block)\n  return @memos[key] if @memos.key?(key)\n\n  @memos[key] = yield\nend\n
Run Code Online (Sandbox Code Playgroud)\n

注意:@memos此类的#initialize方法上正在初始化一个空哈希。

\n

现在,很高兴表达该方法始终返回给定块返回的任何内容,但我不确定如何最好地做到这一点。我想过使用@yieldreturn,但随后需要像泛型这样的东西来表达类似的东西:

\n
# @yieldreturn [<T>]\n# @return [<T>] Whatever …
Run Code Online (Sandbox Code Playgroud)

ruby code-documentation yard

6
推荐指数
0
解决办法
638
查看次数

使用Ruby解密在命令行上生成的盐化AES文件

我想在ruby 2.1脚本中解密文本文件,该脚本先前已使用OpenSSL的命令行工具加密: openssl enc -aes-256-cbc -a -salt -in my_file

从命令中可以看出,该文件是AES-256-CBC加密,加盐和base64编码的。

密码是已知的,但IV和密钥不是已知的,遵循此代码段(从ruby文档中获取)是必需的:

decipher = OpenSSL::Cipher::AES.new 256, :CBC
decipher.decrypt
decipher.key = key
decipher.iv = iv

plain = decipher.update(encrypted_text) + decipher.final
Run Code Online (Sandbox Code Playgroud)

在尝试找到答案时,我发现了AESCrypt gem宝石,据说该宝石简化了加密和解密,但是当前发布的版本与ruby 2.1不兼容。查看它的源代码,我发现是通过消化密码来检索密钥,而IV仅保留为nil

因此,我尝试运行以下命令:

encoded_and_encrypted_text = File.read my_file_path
encrypted_text = Base64.decode64 encoded_and_encrypted_text.to_s.strip

decipher = OpenSSL::Cipher::AES.new 256, :CBC
decipher.decrypt

decipher.key = OpenSSL::Digest::SHA256.new(my_password).digest

plain_text = decipher.update(encrypted_text) + decipher.final
Run Code Online (Sandbox Code Playgroud)

但这导致OpenSSL::Cipher::CipherError: bad decrypt

我是否需要以某种方式专门处理文件已加盐?我已经阅读了OpenSSL文档中有关该enc函数的信息函数 IV(如果在加密文件时未指定)是从密码生成的。我是否需要以某种方式手动重建IV?

任何建议将不胜感激:)

ruby encryption openssl cryptography

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