如何配置Tomcat(在独立模式下,没有Apache [*]),以便我可以在一台服务器上部署它,并根据所请求的域名提供两个不同的webapps?
这样做有什么问题?你能在这两个域上拥有SSL吗?如果有人在这里真的做到了,我会有兴趣回答这些问题以及尽可能多的反馈......
我发现了一个描述这种设置的博客条目,但它适用于Tomcat 5.5:
<Engine defaultHost="domain1.com" name="Catalina">
<Host name="domain1.com" appBase="/home/user1/domain1">
<Alias>www.domain1.com</Alias>
<Context path="" docBase="."/>
</Host>
<Host name="domain2.com" appBase="/home/user1/domain2">
<Alias>www.domain2.com</Alias>
<Context path="" docBase="."/>
</Host>
Run Code Online (Sandbox Code Playgroud)
http://iam-rakesh.blogspot.com/2009/10/hosting-multiple-domains-in-tomcat.html
此外,截至目前我有一个webapp,ROOT.war,里面.../tomcat/webapps /
一旦我有两个"根",一个用于domain1.com的 root webapp和一个用于domain2.com的 root webapp,它将如何工作? 将在什么地方的.war被定位需求?
编辑这个问题不是关于如何使用Ant/Maven/Gradle或诸如此类的东西来解决依赖关系.
我正在尝试使用Neo4j,我对文档有点困惑,因为我需要嵌入一个非常简单的"Hello,world!" 应用程序中的Neo4j示例.
我在几个地方看过Neo4j是轻量级的,只需要一个(现在是两个)罐子.
例如:http://highscalability.com/neo4j-graph-database-kicks-buttox
我们可以读到:"占用空间小.Neo4j是一个带有一个依赖的单个<500k jar(Java Transaction API)."
这正是我对Neo4j嵌入它感兴趣的原因之一......
所以我下载了Neo4j的社区版(GPL),并在此处阅读说明:
http://docs.neo4j.org/chunked/stable/tutorials-java-embedded-setup.html
其中说:"提取一个Neo4j下载zip/tarball,并使用lib /目录中的jar文件."
现在这不仅仅是简洁而且我发现旧消息说"措辞已经改变".有一点,Neo4j所需要的只是一个罐子(这是我有兴趣嵌入Neo4j btw的原因之一).但是现在显然已经是两个了,因为它依赖于某些Java Transaction API(其中一个是一个带有neo4j的.jar?)
问题是,如果我查看lib / dir,我有很多东西:
1115454 lib/neo4j-kernel-1.6.1.jar
153707 lib/neo4j-graph-algo-1.6.1.jar
222791 lib/neo4j-shell-1.6.1.jar
8865464 lib/scala-library-2.9.0-1.jar
43530 lib/neo4j-jmx-1.6.1.jar
590503 lib/neo4j-kernel-1.6.1-tests.jar
23954 lib/neo4j-community-1.6.1.jar
28023 lib/neo4j-udc-1.6.1.jar
1517975 lib/neo4j-cypher-1.6.1.jar
51662 lib/neo4j-graph-matching-1.6.1.jar
16030 lib/geronimo-jta_1.1_spec-1.1.1.jar
143177 lib/neo4j-lucene-index-1.6.1.jar
1466301 lib/lucene-core-3.5.0.jar
118875 lib/server-api-1.6.1.jar
92850 lib/org.apache.servicemix.bundles.jline-0.9.94_1.jar
Run Code Online (Sandbox Code Playgroud)
在system/lib中:
27461 system/lib/blueprints-neo4j-graph-1.1.jar
72650 system/lib/jettison-1.3.jar
628626 system/lib/rrd4j-2.0.7.jar
17985 system/lib/asm-analysis-3.2.jar
177174 system/lib/jetty-util-6.1.25.jar
109043 system/lib/commons-io-1.4.jar
755981 …Run Code Online (Sandbox Code Playgroud) 今天我不得不将真实(死树)信件中的银行帐号复制到Emacs缓冲区,然后通过电子邮件发送.我把它从信件复制到Emacs缓冲区时忘记了一个错误(忘了一个数字).这导致一位来自同事的电子邮件告诉我:"无法付款,伪造IBAN".
创建一个函数/次模式有多难:
检测看起来像IBAN的"东西"(例如两个大写字母后面跟着'x'和'y'数字,忽略空格等.那里有现成的正则表达式,可以验证是否有类似IBAN的东西或不)
如果它看起来无效,则运行mod 97并以红色突出显示IBAN
理想情况下,我需要一个次要模式,我可以打开几种类型的缓冲区(愚蠢的文本文件,但也电子邮件等).
使用Emacs做什么的"方法"是什么?
我写了以下内容:
(fn r [f xs]
(lazy-seq
(if (empty? xs)
'()
(cons (f (first xs)) (r f (rest xs))))))
Run Code Online (Sandbox Code Playgroud)
解决4clojure.com的问题#118:http://www.4clojure.com/problem/118
它要求重新实现地图而不使用地图等,并且该解决方案通过了测试(我不知道它是否正确:它与其他解决方案非常接近).
因为问题表明它必须是懒惰的,我通过在lazy-seq中 "包装"我的解决方案来编写上面的代码...但是我不明白lazy-seq是如何工作的.
我不明白这里什么是"懒惰",也不知道如何测试它.
当我问(type ...)我得到一个clojure.lang.LazySeq时,不出所料,但我不知道如果我只是删除了lazy-seq "wrap" ,那和我之间的区别是什么.
现在当然如果我删除了lazy-seq,我得到一个stackoverflow为什么要尝试执行这个:
(= [(int 1e6) (int (inc 1e6))]
(->> (... inc (range))
(drop (dec 1e6))
(take 2)))
Run Code Online (Sandbox Code Playgroud)
否则(即:如果我让lazy-seq包裹到位),它似乎工作正常.
所以我决定尝试以某种方式"调试"/追踪正在发生的事情,试图了解它是如何工作的.我采用了以下宏(我在SO IIRC上发现):
(defmacro dbg [x] `(let [x# ~x] (println "dbg: " '~x "=" x#) x#))
Run Code Online (Sandbox Code Playgroud)
并将工作版本包装在 …
我正在尝试重新定义用于导航历史记录的键,当几个命令接受正则表达式并提供Cp/Cn历史导航时.除了Cp/Cn之外,我还想使用其他键.例如,当使用occurrence或replace-regexp时,可以使用Cp和Cn转到上一个和下一个元素.
我已经尝试了几件事,但无法使其发挥作用.我想我在这里错过了"大局".
我需要修改哪种模式图,何时以及如何修改?我试过的一切都失败了.
PS:请注意,我已经拥有自己的次要模式,我的所有键盘图都在这里建议.
我有一个庞大的Trove地图和一个我需要经常从多个线程调用的方法.大多数情况下,此方法应返回true.线程正在进行大量的运算,我注意到由于以下方法存在一些争用(这只是一个例子,我的实际代码有点不同):
synchronized boolean containsSpecial() {
return troveMap.contains(key);
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个"仅附加"地图:一旦添加了一个键,就会永远停留在那里(这对我接下来的事情很重要).
我注意到通过将以上内容更改为:
boolean containsSpecial() {
if ( troveMap.contains(key) ) {
// most of the time (>90%) we shall pass here, dodging lock-acquisition
return true;
}
synchronized (this) {
return troveMap.contains(key);
}
}
Run Code Online (Sandbox Code Playgroud)
我的数字运算得到了20%的加速(经过多次运行验证,长时间运行等).
这种优化看起来是否正确(知道一旦钥匙存在,它将永远留在那里)?
这种技术的名称是什么?
编辑
更新地图的代码比containsSpecial()方法更频繁地调用,看起来像这样(我已经同步了整个方法):
synchronized void addSpecialKeyValue( key, value ) {
....
}
Run Code Online (Sandbox Code Playgroud) 我正在观看一个惊人的"Emacs rock"视频,我注意到开发人员并排使用两个窗口,其中一个窗口是Emacs,另一个窗口用于(几乎)不断运行单元测试.视频在这里(IMO非常好看):
http://www.youtube.com/watch?v=Zxt-c_N82_w
在使用Clojure时我该怎么做?
我想在屏幕上看到的是:
理想情况下,我希望单元测试的结果显示在另一个Emacs框架中,但常规终端也会这样做(只要至少有一些颜色支持).
有人做过类似的事吗?我不介意shell脚本或elisp'ing或其他任何东西,只要它允许获得与单元测试Clojure代码类似的设置.
我很难理解懒惰工作以及缓存是如何工作的.
我认为一个lazy-seq在工作中的分步示例在这里可以提供帮助.例如,我读过以下问题:
但它仍然不清楚.
我的问题是该调用将如何确定另一个调用是否与缓存调用"相等"以及它在缓存中保留多长时间?我试图(源lazy-seq),但显然它是在Java的土地,所以我在这里运气不好.
对于一个简单的lazy-seq,只取一个参数(比如说两个幂的列表),如果我用5然后8调用它怎么办?这两个值是否被缓存?
如果我要通过缓存我已经称为惰性函数的每个输入来破坏内存,那么创建和缓存无限列表以获得无限结构的重点是什么?
因为它表示它会在每次后续调用中缓存结果......使用's'.
1:参数结果为'1'缓存2:结果为参数为'2'缓存3:结果为参数为'3'缓存... 2 30:我数到2 30并且它很好因为我很懒所有,但现在内存中有一个2**30缓存,缓存所有后续调用的所有后续调用.
或者它只是缓存的最后一个调用?
如果我写一个以树为参数的懒函数怎么办?它运行平等吗?关于传递的论点,知道是否需要进行新的评估?
可以在运行时以某种方式跟踪此行为吗?
为了尝试理解core.async,我不成功地试图实现"天网100万微基准",即:
创造一个演员(goroutine,无论如何),它产生10个新演员,每个演员产生10个演员等,直到在最后一级创建了100万个演员.然后,它们中的每一个都返回它的序数(从0到999999),它们在前一级别上求和并向上游发送,直到到达根演员.(答案应该是499999500000).
这里有许多语言的实现:
https://github.com/atemerev/skynet
这是我完全破碎的尝试:
(defn skynet [chan num size div]
(if (= 1 size)
(>! chan num)
(>! chan (reduce + (let [rc (async/chan)
n (/ size div)]
(doall (for [i [0 div]]
(skynet rc (+ num (* i n)) n div))
(for [i [0 div]] (<! rc))))))))
Run Code Online (Sandbox Code Playgroud)
我试图在REPL的一个go块内调用它:
(time (go (<!! (skynet (async/chan) 0 1000000 10))))
Run Code Online (Sandbox Code Playgroud)
我可能会对很多关于core.async(以及懒惰评估)的事情感到困惑.
我该如何解决这个问题?为什么?
我试图了解何时在 HTML 页面中生成或插入环防伪令牌。我正在使用 Compojure / ring / hiccup 但我认为我的问题真的是关于戒指。我本身没有任何问题:我只是想知道何时以及如何“注入”防伪令牌。
在anti-forgery-field从功能ring.util.anti-forgery实现是这样的:
(html (hidden-field "__anti-forgery-token" *anti-forgery-token*)
Run Code Online (Sandbox Code Playgroud)
如果我在 REPL 中调用这个函数,我会得到:
REPL> (println (anti-forgery-field))
<input id="__anti-forgery-token" name="__anti-forgery-token" type="hidden" value="Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*" />
Run Code Online (Sandbox Code Playgroud)
仍然在 REPL 中,如果我尝试获取此变量,则会得到相同的“未绑定”变量:
> ring.middleware.anti-forgery/*anti-forgery-token*
=> #object[clojure.lang.Var$Unbound 0x1eae055 "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"]
Run Code Online (Sandbox Code Playgroud)
我不明白的是“未绑定”值是什么,也不知道它何时(通过环?)转换为实际交付的令牌。而且我特别不明白连接到网站的几个用户如何获得不同的令牌(每个会话)。
该变量总是“未绑定”吗?它何时/如何成为“绑定”(如果有?)?
另外,如果我有环会话 ID(比如"ring-session=310678be-9ef6-41a7-a12a-b2417de4a79f"),我怎么能在 Clojure REPL(在服务器端)看到相应的反伪造令牌的价值?
clojure ×5
emacs ×3
java ×3
elisp ×2
channel ×1
core.async ×1
coroutine ×1
dependencies ×1
dns ×1
equals ×1
history ×1
iban ×1
jar ×1
keymaps ×1
locking ×1
neo4j ×1
optimization ×1
regex ×1
ring ×1
tomcat ×1
trove4j ×1
unit-testing ×1
validation ×1