我想知道是否可以使用http-kit整合一个完全无阻塞的Clojure后端Web应用程序.
(实际上任何与Ring兼容的http服务器都没关系;我提到了http-kit,因为它声称有一个事件驱动的非阻塞模型).
这个问题是我对非阻塞/异步/事件驱动系统性质的一些误解的症状.如果你和我在同一个地方,这里有一些澄清.
只有当所有(例如,大多数)IO从头开始以非阻塞方式处理时,才能使事件驱动系统具有非阻塞的性能优势(如在Node.js中).这意味着所有数据库驱动程序,HTTP服务器和客户端,Web服务等都必须首先提供异步接口.特别是:
现在,具体来说:
如果我做对了(我不是专家,所以请告诉我,如果我正在做错误的假设),Web应用程序的这种非阻塞模型的原则如下:
从我所看到的,默认情况下,Play Framework(Scala)和Node.js(JavaScript)平台支持此模型,具有基于承诺的实用程序,用于以编程方式管理异步.
让我们尝试使用Compojure路由在基于Ring的clojure应用程序中执行此操作.我有一个通过调用my-handle函数构造响应的路由:
(defroutes my-routes
(GET "/my/url" req (my-handle req))
)
(def my-app (noir.util.middleware/app-handler [my-routes]))
(defn start-my-server! []
(http-kit/run-server my-app))
Run Code Online (Sandbox Code Playgroud)
在Clojure应用程序中管理异步的普遍接受的方式似乎是基于CSP,使用core.async库,我完全没问题.因此,如果我想接受上面列出的非阻塞原则,我将以my-handle这种方式实现:
(require '[clojure.core.async :as a])
(defn my-handle [req]
(a/<!!
(a/go ; `go` makes channels calls asynchronous, so I'm not …Run Code Online (Sandbox Code Playgroud) 我知道上传到AWS S3有很多报道.但是,我一直在努力解决这个问题大约24小时,我没有找到适合我情况的任何答案.
将文件直接从我的客户端上传到AWS S3到我的S3存储桶.情况是:
FormData和Angular $http).它包括从服务器上的AWS获取签名的URL(并且该部分工作),然后AJAX上传到该URL.它失败了一些神秘的CORS相关消息(虽然我确实在Heroku上设置了CORS配置)我似乎面临两个困难:在我的单页应用程序中使用文件输入,并使AWS的工作流程正确.
如果可能的话,我想避免"全部包含"的解决方案来管理整个过程,同时隐藏所有的复杂性,使其难以适应特殊情况.我宁愿有一个简单的解释来分解所涉及的各个组件之间的数据流,即使它需要我更多的管道.
我开始开发一个由Datomic支持的Clojure应用程序,我想知道什么是声明架构的最佳方式,以解决以下问题:
直觉上,我的方法如下:
这是最好的方式吗?人们通常如何做到这一点?
我正在寻找关于在Datomic中建模某些多对关系的方法的反馈.
假设我想为一个人有一个最喜欢的电影列表的域设计Datomic模式.举例来说,John最喜欢的电影是Gladiator,Star Wars和Fight Club.
在Datomic中对此进行建模的最明显的架构是具有基数多属性,例如:
#{["John" :person/favorite-movies "Gladiator"]
["John" :person/favorite-movies "Star Wars"]
["John" :person/favorite-movies "Fight Club"]}
Run Code Online (Sandbox Code Playgroud)
这种方法可以很容易地从列表中添加或删除电影(简单地使用:db/add和:db/retract),但我发现重置整个电影列表是不切实际的- 你基本上需要计算旧列表和新列表之间的差异,并且在事务函数中运行.当列表的元素不是标量时,这会变得更糟.
作为替代方法,我正在考虑使用set实体引入间接:
#{["John" :person/favorite-movies 42]
[42 :set.string/contains "Gladiator"]
[42 :set.string/contains "Star Wars"]
[42 :set.string/contains "Fight Club"]}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,:person/favorite-movies是一个基数 - 一,ref-typed属性,并且:set.string/contains是基数多,字符串类型的属性.然后重置列表只需创建一个新的集合实体:
[{:db/id "John"
:person/favorite-movies {:db/id (d/tempid :db.part/user)
:set.string/contains ["Gladiator"
"The Lord of the Rings"
"A Clockwork Orange"
"True Romance"]}}]
Run Code Online (Sandbox Code Playgroud)
这种建模到多种关系的方法是否存在已知的局限性?
我正在使用Protractor编写一个e2e测试套件.
我知道它建立在WebdriverJS之上,我正在尝试使用一些webdriverJS功能.
也就是说,我正在尝试使用webdriverJS的promise管理器排队某些行为,而WebdriverJS文档说我应该使用
webdriver.promise.controlFlow().execute(function myBehavior(){...});
Run Code Online (Sandbox Code Playgroud)
麻烦的是,我不知道如何访问该"webdriver"对象.没有名为"webdriver"的全局变量.
有人可以帮我吗?
编辑:
既然问题已经解决了,我想强调一个必须使用的事实
browser.driver.controlFlow()
Run Code Online (Sandbox Code Playgroud)
并不是
browser.driver.promise.controlFlow()
Run Code Online (Sandbox Code Playgroud)
尽管WebdriverJS文档可能会提出建议.
我正在尝试编写一个宏,它通过解构扩展为let形式.我的问题是我希望得到let表单中定义的符号列表,包括通过destruturing获得的符号.
用例
我试图将这种行为分解出来,例如验证:
(let [a (foo bar)
{x :x,
y :y,
{u :u, v: v :as nested-map} :nested} some-map]
(and x y nested-map u v ; testing truthiness
(valid-a? a)
(valid-x? x)
(valid-y? y)
(valid-nested? nested-map)
(valid-u-and-v? u v)
))
Run Code Online (Sandbox Code Playgroud)
提出的解决方案
通过某种类型的and-let宏来实现这一点真的很好,我可以像这样调用它:
(and-let [a (foo bar)
{x :x,
y :y,
{u :u, v: v :as nested-map} :nested} some-map]
(valid-a? a)
(valid-x? x)
(valid-nested? nested-map)
(valid-u-and-v? u v))
Run Code Online (Sandbox Code Playgroud)
我错过了什么
但是我错过了一些访问let表单中绑定的符号列表的方法.如果我有类似list-bound-symbols函数的东西,我可以这样做:
(defmacro and-let
"Expands to an AND close …Run Code Online (Sandbox Code Playgroud) 我正在 Clojure 中学习 Web 开发,但我根本不是 PostgreSQL 或 JDBC 方面的专家。
我正在阅读“使用 Clojure 进行 Web 开发”一书,但由于无法连接到 PostgreSQL 数据库而被卡住了,尽管我相信我已经一步一步地遵循了教程。
我连接到 psql
sudo -u postgres psql
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个密码为“admin”的管理员用户
postgres=# CREATE USER admin WITH PASSWORD 'admin';
CREATE ROLE
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个名为报告的数据库:
postgres=# CREATE DATABASE reporting OWNER admin;
CREATE DATABASE
Run Code Online (Sandbox Code Playgroud)
至今没有投诉。
然后从我的 clojure 代码中,我尝试连接到数据库并创建一个表:
(ns reporting-example.models.db
(:require [clojure.java.jdbc :as sql]))
;defining the db connection
(def db
{:subprotocol "postgresql"
:subname "//localhost/reporting"
:user "admin"
:password "admin"})
;function for creating an 'employee' table
(defn create-employee-table []
(sql/create-table :employee
[:name "varchar(50)"]
[:occupation "varchar(50)"] …Run Code Online (Sandbox Code Playgroud) go当我偶然发现一个奇怪的编译错误时,我正在实现一个涉及core.async 块的函数:
CompilerException java.lang.IllegalArgumentException:
No method in multimethod '-item-to-ssa' for dispatch value: :protocol-invoke,
compiling:(NO_SOURCE_PATH:2:3)
Run Code Online (Sandbox Code Playgroud)
我尝试了一点尝试去除问题,发现它非常通用.说我有任何协议MyProtocol:
(defprotocol MyProtocol
(do-something [this param] "some method"))
Run Code Online (Sandbox Code Playgroud)
以下代码将无法编译,失败,上面显示的异常:
(defn uncompilable! [me ch]
(go
(do-something me (<! ch)) ;; apparently, it hurts to use <! in a protocol method invocation
))
Run Code Online (Sandbox Code Playgroud)
但是,以下2将编译没有任何问题:
(defn compilable! [me ch]
(let [call-it #(do-something me %)] ; wrapping the protocol call in a function
(go
(call-it (<! ch))
)))
(defn compilable-2! [me ch]
(go
(let [my-value (<! …Run Code Online (Sandbox Code Playgroud) 以下是在prod本地和在uberjar中用于Heroku部署的配置:
{:source-paths ["src/cljs"]
:compiler {:output-to "resources/public/js/main.js"
:optimizations :advanced
:cache-analysis true
:static-fns true
:elide-asserts true
:pretty-print false
:externs ["jquery/jquery-externs.js" "public/vendor/js/bootstrap.min.js"]
:preamble ["jquery/jquery-2.1.1.min.js"
"public/vendor/js/bootstrap.min.js"
"reagent/react.js"]}}
Run Code Online (Sandbox Code Playgroud)
但是externs为Heroku部署启用了指令,我收到此错误:
Jan 14, 2015 12:24:24 PM com.google.javascript.jscomp.LoggerErrorManager println
SEVERE: ERROR - Duplicate extern input: /tmp/build_a17563dbd2ef7be695204764be886d91/resources/jquery/jquery-externs.js
Jan 14, 2015 12:24:24 PM com.google.javascript.jscomp.LoggerErrorManager println
SEVERE: ERROR - Duplicate extern input: /tmp/build_a17563dbd2ef7be695204764be886d91/resources/public/vendor/js/bootstrap.min.js
Jan 14, 2015 12:24:24 PM com.google.javascript.jscomp.LoggerErrorManager printSummary
WARNING: 2 error(s), 0 warning(s)
ERROR: JSC_DUPLICATE_EXTERN_INPUT. Duplicate extern input: /tmp/build_a17563dbd2ef7be695204764be886d91/resources/jquery/jquery-externs.js at (unknown source) line (unknown line) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Protractor在我的网站上模拟用户故事.
用户必须输入使用自动完成的输入.在现实生活中,用户必须在输入中键入一些文本,然后用鼠标或更自然地用她的向下键来选择正确的命题.
问题是我似乎无法用Protractor模拟它.element.sendKeys只是不允许你这样做.我已经尝试了十几种不同的方式,它最多会产生不可预测的结果.
所以我想直接操纵ng-model behing我的输入.有没有办法从Protractor访问元素的范围并调用函数/ set属性?
这是我的问题的简化版本:
查看:
<div ng-controller="MyController">
<input id="my-input" ng-model="myModel"/>
</div>
Run Code Online (Sandbox Code Playgroud)
控制器:
myModule.controller('MyController', ['$scope', function($scope){
$scope.myModel = "";
//[...]
}]);
Run Code Online (Sandbox Code Playgroud)
e2e量角器测试:
describe("setting myModel to a fixture value", function(){
it("should set myModel to 'a test value'", function(){
var myInput = element('my-input');
// Now what?
});
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用paredit编辑Light Table上的Clojure/ClojureScript文件,但插件似乎不起作用.当我打开括号时,它没有关闭.
但是插件安装如插件列表所示.
我错过了一些配置步骤,还是错误?
(在撰写本文时,我刚刚安装了最新版本,但没有触及配置).
我目前正在开发单页应用程序(在这种情况下是AngularJS),但随着它的发展,我发现将它重构为多页面应用程序越来越诱人.
但是,我仍然需要能够在客户端上拥有复杂的动态UI(这不仅需要DOM操作,还需要了解我的信息模型).
我知道大多数人都会使用jQuery; 我担心它不会让我达到我想要的程度,而且我想知道ReactJS是否适合这项工作(好吧,当你经营一家小公司,而不是Facebook).
clojure ×5
javascript ×3
angularjs ×2
core.async ×2
datomic ×2
macros ×2
protractor ×2
ajax ×1
amazon-s3 ×1
client ×1
compilation ×1
file-upload ×1
heroku ×1
http-kit ×1
jdbc ×1
lighttable ×1
multimethod ×1
nonblocking ×1
paredit ×1
postgresql ×1
reactjs ×1
ring ×1
schema ×1
singlepage ×1