我想知道为什么Java webapps规范强加了依赖项的特定目录:/WEB-INF/lib
.
的确,为什么不使用经典/META-INF/MANIFEST.MF
文件?
有人会告诉webapps是如此安全,因为libs物理集成在WAR文件中.
但是,如果我们这么认为,我们可能会想:
为什么对于简单的Java应用程序(简单的JAR),依赖项没有特殊的目录?它也可能更安全,因为在清单文件中没有错误的类路径(例如,不正确地修改)的风险.
其他人会说webapp被设计为可移植的,因此/WEB-INF/lib
不用担心链接依赖性.
我很想知道你对这个问题的看法.
假设这个数组:
var members = [
{firstName: 'Michael', weight: 2},
{firstName: 'Thierry', weight: 1},
{firstName: 'Steph', weight: 3},
{firstName: 'Jordan', weight: 3},
{firstName: 'John', weight: 2}
];
Run Code Online (Sandbox Code Playgroud)
我想按重量和每种重量排序,按firstNames排序(嵌套排序).
结果将是:
[
{firstName: 'Thierry', weight: 1},
{firstName: 'John', weight: 2},
{firstName: 'Michael', weight: 2},
{firstName: 'Jordan', weight: 3},
{firstName: 'Steph', weight: 3}
];
Run Code Online (Sandbox Code Playgroud)
我使用Lodash 2.4.1 快速实现了这一点:
return _.chain(members)
.groupBy('weight')
.pairs()
.sortBy(function(e) {
return e[0];
})
.map(function(e){
return e[1];
})
.map(function(e){
return _.sortBy(e, 'firstName')
})
.flatten()
.value();
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来使用Lodash 2.4.1实现它?
我是Ruby on Rails世界的新手.
我注意到至少有一种方法可以从测试用例中访问控制器实例变量.
的确,假设这种测试方法:
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:products)
end
Run Code Online (Sandbox Code Playgroud)
products
是相关控制器中包含的实例变量.当然,测试用例参考了这个控制器.因此,assigns()
方法使用它来检查控制器实例变量的散列,从而允许从先前为此控制器调用操作的任何其他文件访问任何预先准备好的对象.
所以我想知道两个问题:
为什么不为控制器创建"绑定"而不是使用assigns()
方法?
我想象一个可以做到的版本:
test "should get index" do
get :index
assert_response :success
assert_not_nil @products
end
Run Code Online (Sandbox Code Playgroud)
它不会更短更清洁吗?
绑定是允许ERB文件访问控制器实例变量的机制,如下所示:
http://rrn.dk/rubys-erb-templating-system
适用于测试用例的这种机制是什么?是assigns()
方法重要的?
在许多网络文章中,函数式编程被表示为避免各种变量重新分配,因此仅推广"最终"变量,至少为了更好的阅读.
它们中的大多数都采用带有计数器变量递增的不良循环的样本.(就像着名的i++
或者x = x + 1
.这里有一篇鲍勃叔叔的文章说明:FP第1集
因此,这些文章表明,依靠可变变量经常导致副作用,特别是防止我们所谓的"参照透明度",因此,更难以构建在多线程或更好的多处理器上运行的程序.
我的问题是:众所周知,i++
通常是一个线程LOCAL变量,因此即使并发处理也不会出现问题.
为什么选择一个像带有局部变量的循环这样的例子作为赋值的缺点,并且允许直接得出结论并发编程存在风险?这两件事与我严格无关.
为了更清楚,为什么不选择全局变量(或字段对象)的重新分配,这显然enemy
是并发编程,而不像Java那样过度使用所有的锁定模板.
我真的认为这个循环示例并不是将函数式编程的好处传递给命令式程序员的最好例证.
此外,它导致与"noob"函数程序员混淆,因为Scala例如在List
.scala类中使用了很多while循环模式:
override def take(n: Int): List[A] = {
val b = new ListBuffer[A]
var i = 0
var these = this
while (!these.isEmpty && i < n) {
i += 1 // reassignment here
b += these.head
these = these.tail
}
if (these.isEmpty) this
else b.toList
}
Run Code Online (Sandbox Code Playgroud) functional-programming scala variable-assignment concurrent-programming
在处理Acceptance规范时,Specs2会提升功能风格(如果需要,甚至是Unit规范).
规范Specs2哲学中提到了使用旧样式(可变样式)的风险,并关注潜在的不良副作用:
需要了解的重要事项是:
副作用仅用于构建规范片段,通过突变它们也只要有一项不合格用于短路的一例的执行的变量(通过抛出异常).如果你在例子的主体中构建片段或同时执行相同的规范,天空应该倒下."上下文"管理是用案例类或特征完成的(参见org.specs2.examples.MutableSpec)
我不知道如何同时运行相同的规范,因为每个规范都与其他规范(分离的类的实例)不同,即使我们同时运行两次或更多次.
的确,specFragments
(可变变量):
protected[mutable] var specFragments: Fragments = new Fragments()
Run Code Online (Sandbox Code Playgroud)
在a trait
被调用中声明FragmentBuilder
,而不是在object
(在scala sense => singleton中)或其他共享的东西...,因此specFragments
是每个Specification
实例的局部变量.
那么一个场景可能会冒并发机制的风险呢?
我并没有真正弄清楚一个真实的场景(非愚蠢)证明了Specs2功能风格的好处.
让我们假设一个处理汽车的图表.
每个都Car
可以随着时间的推移而发展,我需要跟踪这些变化.
(为了能够追踪一些不一致的进化等...)
我想过实现一个写时复制机制(就像LinkedIn似乎那样),这意味着Car
每当其中一个Car
属性发生变化时创建一个完整的新节点.
我最终会得到一个这样的图表:
(Ferrari)-[:CURRENT]->(V3)-[:PREVIOUS]->(V2)-[:PREVIOUS]->(V1)
Run Code Online (Sandbox Code Playgroud)
我特别感兴趣的是检索最新版本,所以听起来不错.
但是,如何处理最初的Car
UUID?
我Car
的UUID(这是一个易于查询的索引属性)是通过库(Apache)自动生成的.
我想如果我为每个Car
版本保留相同的初始UUID ,这可能会导致一些冲突:" 检索Ferrari
其UUID为123 "=>返回多个结果.3个结果,如果有3个版本.
为每个版本生成新的品牌UUID是否安全有效?
因此,我知道在这种情况下,检索特定版本的唯一方法是遍历图形的相关部分直到正确的部分,而不依赖于对初始UUID的简单查询; 通过简单的Cypher查询,这似乎仍然非常高效和简单.
我想保留生成的UUID,因为不建议使用潜在的"可猜测"REST URL(使用资源的UUID).
实际上,我可以将UUID作为Car
模型与其版本之间的组合,但似乎不够"安全"且我的URL上具有可见性.任何恶意的人都可以通过更改URL轻松地设法检索旧版本.
我拥有一个使用 Neo4j 作为图形数据库的应用程序。
我将读取和写入分开(遵循 CQRS 建议),以便实现命令模式并优化我的请求(页面请求),整个共享同一个数据库:neo4j 数据库。(不是两个不同的)
现在,我计划存储一些领域事件,例如UserRegisteredEvent
等,以便由 Actors (Akka) 中托管的一些事件处理程序出队。
将域事件存储在共享数据库中(在我的例子中作为简单的 Neo4j 节点)是否有意义?
或者我真的需要一个三级数据库,例如MySQL?
我明确指出,我的解决方案不需要事件溯源。
我在我的项目中练习DDD.
让我们假设有界背景IdentityAndAccessContext和MeetingContext.
这两种情况都涉及以下术语:
User
类的概念.Participant
类的概念.(让我们忘记Creator
这个例子).Participant
代表用户在会议界上下文.
首先,User
必须创建一个,导致a UserCreatedEvent
.
然后,为了在这些有界上下文之间应用最终一致性,消息存储在IdentityAndAccessContext中,然后发送帮助事件监听器和消息队列(仍然在IAC上下文中)到MeetingContext,以便自动创建相应的Participant
.
这听起来像是一个很好的DDD设计(IMO),但是我遇到了这个webapp工作流程的问题:
Participant
值......这就是问题:如何处理这个案子?
让用户在一致性通知之前等待?糟糕的UX没有?在同一个事务中
插入Participant
值User
?......违反有界的背景概念,不是吗?
architecture authentication domain-driven-design web-applications cqrs
在阅读bindonce指令的文档时,我想知道bo-html
和之间有什么区别bo-text
.
bo-html
: 评估"标记"并将其渲染为元素内的html
bo-text
:评估"文本"并将其作为文本在元素内打印
所以,我希望这段代码能够工作:
<span bo-html="<strong>SomeText</strong>"></span>
Run Code Online (Sandbox Code Playgroud)
但我得到了这个:
Error: [$parse:syntax] Syntax Error: Token '<' not a primary expression at column 1 of the expression
Run Code Online (Sandbox Code Playgroud)
<strong>
作为一个基本的标记,不是吗?
如果这不起作用(可能是语法问题..),bo-text
和之间的真正区别是bo-html
什么?
我们假设Person
和Car
节点.
我希望在同一个cypher查询中删除所有关系APerson-[:OWNS]-SomeCar
并插入新关系.
基本上我曾尝试过这个查询:
MATCH (p:Person {_id: {personId}})
WITH p
MATCH (c:Car)
WITH p, c
MATCH p-[r:OWNS]->c
DELETE r //deleting all "old" relationships
WITH c //a with is expected here by cypher syntax => dummy value that shouldn't impact the remaining of the query
MATCH (p:Person {_id: {personId}}), (c:Car)
WHERE c._id IN {cars}
WITH p, c
MERGE p-[:OWNS]->c //merge new ones
Run Code Online (Sandbox Code Playgroud)
传递给查询的参数: cars
和personId
.
但是,它没有添加新的关系.好像在合并后发生删除,因此完全删除所有关系.
有什么办法在同一个查询中做到这一点?
neo4j ×3
architecture ×2
cqrs ×2
javascript ×2
scala ×2
testing ×2
angularjs ×1
bindonce ×1
concurrency ×1
cypher ×1
dependencies ×1
graph ×1
java ×1
lodash ×1
manifest ×1
ruby ×1
sorting ×1
specs2 ×1
tomcat ×1
uuid ×1