小编Dav*_* J.的帖子

优雅地退出Clojure core.async循环杀死

我有一个顶级的core.async go循环.我希望它无限期地运行,至少直到我用CTRL-C或杀死或类似信号来阻止它.我目前正在使用java.lang.Runtime/addShutdownHook,如下所示:

(ns async-demo.core
  (:require [clojure.core.async :as async
             :refer [<! >! <!! timeout chan alt! go]]))
(defn run [] (go (loop [] (recur))))
(.addShutdownHook (Runtime/getRuntime) (Thread. #(println "SHUTDOWN")))
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 如果我启动REPL (run)然后它启动并在后台线程中运行.当我退出REPL时,我看不到所需的关机消息.

  2. 但是,当我运行时lein run,go循环立即退出并显示"SHUTDOWN".

这也不是我想要的.

我不一定希望找到适用于所有JVM的解决方案.我在Mac上开发并部署到Ubuntu,所以我想找到适合两者的解决方案:

  • Mac JVM:java版"1.7.0_45"Java(TM)SE运行时环境(版本1.7.0_45-b18)Java HotSpot(TM)64位服务器VM(版本24.45-b08,混合模式)

  • Ubuntu JVM:java版"1.7.0_25"OpenJDK运行时环境(IcedTea 2.3.10)(7u25-2.3.10-1ubuntu0.12.04.2)OpenJDK 64位服务器VM(版本23.7-b01,混合模式)

java signals clojure core.async

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

在Triplestore中更新RDF

我正在试验Sesame和Virtuoso Triplestores.在Moment中,我使用Sesame Java API将RDF数据添加到Triplestores.

我的RDF数据代表不同的东西,如Videodata,Userdata等.目前我可以将一个视频的RDF(标题,描述,位置等)添加到Triplestore

但是如何更新商店中的RDF?

例如,如果我使用芝麻的REST接口并使用更新的RDF进行PUT请求,则首先删除存储中的所有内容.

当我使用带有更新数据的POST(例如视频标题已更改)时,将存储标题(旧的和新的).

你如何与三重商店合作?也许我想念一些必要的东西.


编辑:

我现在在每个RDF条目中使用Virtuoso中的Sesame和Graphs中的Context.这种更新方式我可以先清除上下文并再次添加.当我为两个Triplestores使用Sesame API时(我们仍然不知道我们将使用哪一个),代码看起来完全相同.

ValueFactory f = rep.getValueFactory();
URI uri = f.createURI(urn);
con.clear(uri);
con.add(reader,this.baseURI, RDFFormat.RDFXML,uri);
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

rdf sesame triplestore virtuoso

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

在resque队列中查找特定作业

在我的应用程序中,我使用Resque来调整图像大小.如果图像在调整大小队列中,我想显示"调整大小图像"图标.

这意味着我需要能够找到与队列中特定模型ID相关的所有当前作业.现在我这样做:

Resque.peek(:resize, 0, 100).find_all { |job| /#{model.id}/.match(job["args"][0]) }
Run Code Online (Sandbox Code Playgroud)

这是愚蠢的.但有没有办法查询Resque队列以找到第一个参数等于[id]的所有作业?

提前致谢.

ruby ruby-on-rails resque redis

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

如何使用mongoid/moped进行upsert/push

我正在使用Mongoid(v3)来访问MongoDB,并希望执行此操作:

db.sessionlogs.update( 
    {sessionid: '12345'}, /* selection criteria */
    {'$push':{rows: "new set of data"}},  /* modification */
    true /* upsert */
);
Run Code Online (Sandbox Code Playgroud)

这在mongo shell中工作正常.它也正是我想要的,因为它是一个单一的原子操作,对我来说很重要,因为我会调用它.我不想做两个操作 - 获取然后更新.我通过mongoid尝试了很多东西,但无法让它工作.

如何将MongoID取出并将此命令发送到MongoDB?我猜测在Moped级别有一些方法可以做到这一点,但该库的文档基本上不存在.

ruby mongodb mongoid mongoid3 moped

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

在Clojure 1.5中缺少非用户命名空间中的doc

我该怎么办才能doc再次获得?

brew install --devel leiningen
lein new app yeehaw
cd yeehaw
; edit project.clj and replace "1.4.0" with 1.5.0-RC1"
lein repl
yeehaw.core=> (doc map)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: doc
in this context, compiling:(NO_SOURCE_PATH:1:1) 
Run Code Online (Sandbox Code Playgroud)

此更改来自CLJ-1085和此相关源.

请注意,命名空间中doc仍然可以使用常用的REPL功能user,但是在我的应用程序命名空间中将它放在我的指尖是很好的,至少在REPL中是这样.

clojure clojure-repl

9
推荐指数
2
解决办法
1184
查看次数

make emacs next-buffer skip*Messages*buffer

我想提出一个简单的改变Emacs的,以便next-bufferprevious-buffer我所绑定于命令(C-x <RIGHT>C-x <LEFT>将跳过*Messages*缓冲区.

我正在使用Emacs 24和Emacs入门套件.

我已经阅读了以下相关问题和答案,但它们不是我想要的:

以下是它们不起作用的一些原因:

  • 我想尽量保持简单.更少的配置更改更好.
  • 我不想*Messages*完全杀死或阻止.
  • (add-to-list 'ido-ignore-buffers "^\*Messages\*"帮助我C-x b(ido-switch-buffer)但不改变方式next-bufferprevious-buffer行为.

emacs elisp

9
推荐指数
3
解决办法
1542
查看次数

Rails中的Gmail推送通知

我正在开发一个用户添加他们的Gmail帐户的应用程序,我在他们的电子邮件上做了一些分类工作.

我希望在收到任何已注册帐户的新电子邮件时收到通知.

一个解决方案是通过IMAP继续轮询帐户并保存我提取的最后一个电子邮件日期,以检查是否有新邮件,但这有很多开销.

知道如何监控Gmail并在收到新电子邮件时收到通知并将其与Rails应用程序集成吗?是否有扩展可以做到这一点,并发送一个帖子请求到我的Rails应用程序,例如?

ruby ruby-on-rails classification push-notification gmail-imap

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

有没有办法在复制依赖目标期间使用maven-dependency-plugin在测试和编译之间划分工件?

我有以下配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.6</version>
  <executions>
      <execution>
          <id>analyze</id>
          <goals>
              <goal>analyze-only</goal>
          </goals>
          <configuration>
              <failOnWarning>false</failOnWarning>
          </configuration>
      </execution>
      <!--Copy the dependencies so ant build has the same versions-->
      <execution>
          <id>copy-dependencies</id>
          <phase>package</phase>
          <goals>
              <goal>copy-dependencies</goal>
          </goals>
          <configuration>
              <outputDirectory>${project.basedir}/lib</outputDirectory>
              <overWriteIfNewer>true</overWriteIfNewer>
              <stripVersion>true</stripVersion>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
              <excludeTransitive>false</excludeTransitive>
          </configuration>
      </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

上面的配置会转储同一文件夹中的所有内容.我尝试通过添加测试配置来排除测试范围但是给出了错误:

未能执行目标org.apache.maven.plugins:Maven的依赖关系的插件:2.6:项目pcgen复制依赖(复制依赖):不能排除测试范围,这将排除一切.

有没有办法将测试依赖项与其他依赖项分开,以便我可以复制到不同的文件夹?

configuration maven-2 maven-dependency-plugin

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

rake:测试没有在子目录中运行自定义测试

我正在使用Rails 4.0.0.beta1.我添加了两个目录:app/servicestest/services.

我还添加了这个代码,基于阅读railties的testing.rake:

namespace :test do
  Rake::TestTask.new(services: "test:prepare") do |t|
    t.libs << "test"
    t.pattern = 'test/services/**/*_test.rb'
  end
end
Run Code Online (Sandbox Code Playgroud)

我发现rake test:services运行测试test/services; 但是,rake test不运行那些测试.看起来应该如此 ; 这是代码:

Rake::TestTask.new(:all) do |t|
  t.libs << "test"
  t.pattern = "test/**/*_test.rb"
end
Run Code Online (Sandbox Code Playgroud)

我忽略了什么吗?

testing ruby-on-rails testunit ruby-on-rails-4

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

如何测试使用gensyms的clojure宏?

我想测试一个使用gensyms的宏.例如,如果我想测试这个:

(defmacro m1
  [x f]
  `(let [x# ~x]
    (~f x#)))
Run Code Online (Sandbox Code Playgroud)

我可以用宏扩展......

(macroexpand-1 '(m1 2 inc))
Run Code Online (Sandbox Code Playgroud)

...要得到...

(clojure.core/let [x__3289__auto__ 2] (inc x__3289__auto__))
Run Code Online (Sandbox Code Playgroud)

这对于一个人来说很容易验证是正确的.

但是,我如何以实用,干净的自动化方式对其进行测试?gensym不稳定.

(是的,我知道特定的宏观例子并不引人注目,但问题仍然是公平的.)

我意识到Clojure表达式可以被视为数据(它是一种同性语言),所以我可以像这样分开结果:

(let [result (macroexpand-1 '(m1 2 inc))]
  (nth result 0) ; clojure.core/let
  (nth result 1) ; [x__3289__auto__ 2]
  ((nth result 1) 0) ; x__3289__auto__
  ((nth result 1) 0) ; 2
  (nth result 2) ; (inc x__3289__auto__)
  (nth (nth result 2) 0) ; inc
  (nth (nth result 2) 1) ; x__3289__auto__
  )
Run Code Online (Sandbox Code Playgroud)

但这很笨拙.还有更好的方法吗?也许有数据结构'验证'库可以派上用场?也许解构会让这更容易?逻辑编程?

更新/评论: …

testing macros clojure gensym

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