在我的一个项目中,一个常见的用例不断涌现.在某些时候,我有一个某种类型的排序集合(List,Seq等......无所谓)和这个集合的一个元素.我想要做的是交换给定元素与它的后续元素(如果此元素存在)或在某些时候与前面的元素交换.
我很清楚使用过程编程技术实现这一目标的方法.我的问题是通过函数式编程(在Scala中)解决问题的好方法是什么?
谢谢大家的答案.我接受了我自己最了解的那个.由于我不是一名功能性程序员(但是),我很难确定哪个答案真的是最好的.在我看来,它们都非常好.
只是一个简单的问题,我似乎无法找到答案.
我在Scala中有一个方法定义,如下所示:
def execute(goals: List[String],
profiles: List[String] = List(),
loggingCallback: (String) => Unit = { _ => }): Result = {
// method body
loggingCallback("a message")
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来指定默认的空闭包.问题不在于如何实现日志记录,这只是一个例子.
我想在现有的Java Web应用程序中实现双提交预防(实际上是struts).在架构方面,我们讨论的是2到N个可能的应用服务器(tomcat)和一个单一的数据库服务器(mysql).各个服务器彼此不了解,也无法交换消息.在应用程序服务器前面有一个负载均衡器,可以进行粘性会话.
所以基本上有两种双提交预防客户端和服务器端.如果可能的话,我想进入服务器端,因为如果人们在浏览器中禁用cookie和/或javascript,所有客户端技术似乎都会失败.
这让我想到通过数据库锁进行某种类似互斥的同步.我认为可以计算用户输入数据的校验和并将其持久保存到专用数据库表.在每次提交时,应用程序必须检查是否存在相等的校验和,这表明给定的提交是重复的.当然,必须定期清除此表中的校验和.问题是检查数据库中是否存在重复校验和的整个过程,如果没有校验和,则插入校验和几乎是一个关键部分.因此,必须事先锁定校验和表,并在该部分之后再次解锁.
当我想到桌子锁时,我的僵局和瓶颈警铃开始响起.所以我的问题是:是否有更好的方法来防止无状态Web应用程序中的双重提交?
请注意,struts TokenInterceptor
不能在这里应用,因为当禁用cookie时它会失败(它依赖于HTTP会话,如果没有会话cookie,它就不存在).
java struts web-applications stateless double-submit-prevention
我正在为c ++游戏项目设置构建环境.我们的主要要求是不仅可以构建我们的游戏代码,还可以构建其依赖项(Ogre3D,Cegui,boost等).此外,我们希望能够在Linux和Windows上构建,因为我们的开发团队由使用不同操作系统的成员组成.
Ogre3D使用CMake作为其构建工具.这就是我们迄今为止将我们的项目建立在CMake上的原因.一旦在每个团队成员系统上手动设置所有依赖关系,我们就可以完全编译,因为CMake能够找到库.
问题是,是否有可行的方法来自动设置依赖项.作为一名Java开发人员,我知道Maven,但在c ++世界中确实存在哪些工具?
更新:感谢您的答案和链接.在接下来的几天里,我将尝试使用一些工具来查看符合我们要求的工具,从CMake开始.到目前为止,我确实已经与autotools分享了一些内容,并且我喜欢文档(这是一本非常好的读者),我担心autotools本身并不适合在Windows上使用.
有些人建议让一些IDE处理依赖关系管理.我们由使用所有可能技术的个人组成,从纯Vim到完全吹制Eclipse CDT或Visual Studio.这是CMake允许使用其生成本机项目文件的能力的地方.
我们将一个中等大小的代码库整合到一个多(多)模块maven项目中.总体而言,整个构建对于不同的系统组件(Web应用程序(.war),实用程序(.jar)等)具有多达十个输出工件.
到目前为止,我们的部署过程基于简单的bash脚本,这些脚本通过maven构建所请求的工件,使用有关工件,目标环境和当前构建时间戳的信息标记scm存储库,然后将工件上载到选定的环境应用程序服务器并发布命令重新启动正在运行的守护进程.通过maven配置文件和资源过滤来配置构建的工件.因此,我们的构建特定于目标环境.
这个过程对我们很有帮助,但出于不同的原因,我想向更复杂的方法迈进.特别是我想摆脱bash脚本.
那么有关基于Maven的Java应用程序的配置,版本控制和部署的最佳实践是什么?
我们的构建是否应该与环境无关,并且配置是通过目标系统上的配置文件完成的?如果是这样,开发人员如何注意新配置选项包含在各种应用程序服务器上的已部署配置文件中?
我们应该使用Maven版本化的Maven发布插件来标记各种构建吗?
配置像Jenkins或Teamcity这样的CI服务器来为我们构建和选择部署我们的工件是一个好主意吗?
我最近有幸被允许在中等大小的遗留代码库(从3.x到5.2)中破坏Hibernate依赖版本(以及其他版本).代码本身已有超过10年的历史,但仍在日常使用中.
因此,即使在增加版本并将尽可能多的API调用从现在已弃用甚至丢失的区域转移到他们的前沿对手(找到如何进行SchemaExport是一种特别有趣的体验)之后,我仍然不认为这是一个完整的迁移.
我想知道遗留用户的预期升级路径是什么,因为企业系统通常会持续10到15年以上,有时您需要跳转到较新的依赖版本以获取必要的错误修正或功能.
以下几点仍然有些开放:
没有明确或自动的方法将.hbm.xml映射信息迁移到JPA注释.我知道手动迁移将非常容易出错,并非所有概念都有明确或明显的反向部分.
我们现在收到很多关于我们使用旧Criteria API的弃用警告(org.hibernate.orm.deprecation),但是也没有明确的升级路径.人们不能仅仅将应用程序的整个数据库访问代码重写为完全不同且更详细的API,这些API在某些边缘情况下肯定会表现不同.
我们似乎使用了大量的原生查询和实例org.hibernate.transform.ResultTransformer
然而,org.hibernate.query.Query#setResultTransformer()
似乎没有指示如何解决这个被弃用.
一般来说,我发现有关Hibernate方面的弃用和预期升级路径的文档很少见.我确实知道它是一个开源项目,并且他们不想永远维护旧的API,但我仍感到有些迷失,我不相信这是唯一仍在使用的遗留Java应用程序今天.
我想在我的一个 Scala 应用程序中实现某种消息总线。其特点是:
我计划做的是将所有节点和总线本身实现为标准 Scala actor。例如我想定义Subscriber
这样的特征:
trait Subscriber[M <: Message[_]] {
this: Actor =>
def notify(message: M)
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,混合此特征应该已经注册了该类型的订阅M
。
那么这个想法有道理吗?有没有更好的方法来实现消息总线?