小编Oli*_*ain的帖子

更轻松的DynamoDB本地测试

我正在使用DynamoDB本地进行单元测试.这不错,但有一些缺点.特别:

  • 在测试运行之前,您必须以某种方式启动服务器
  • 服务器在每次测试之前都没有启动和停止,因此测试变得相互依赖,除非您在每次测试后添加代码以删除所有表等
  • 所有开发人员都需要安装它

我想要做的就是将DynamoDB本地jar和它所依赖的其他jar放在我的test/resources目录中(我正在编写Java).然后在每次测试之前,我会启动它,运行-inMemory,并且在测试之后我会停止它.这样,任何下拉git repo的人都会获得运行测试所需的所有内容的副本,并且每个测试都独立于其他测试.

我已经找到了一种方法来完成这项工作,但这很难看,所以我正在寻找替代方案.我的解决方案是将一个DynamoDB本地内容的.zip文件放在test/resources中,然后在@Before方法中,我将它解压缩到一些临时目录并启动一个新的java进程来执行它.这是有效的,但它很难看并且有一些缺点:

  • 每个人都需要$ PATH上的java可执行文件
  • 我必须将zip解压缩到本地磁盘.使用本地磁盘通常是测试的冒险,特别是对于连续构建等.
  • 我必须生成一个进程并等待它开始进行每个单元测试,然后在每次测试后终止该进程.除了缓慢之外,剩余过程的可能性似乎很难看.

似乎应该有一个更简单的方法.毕竟,DynamoDB Local只是Java代码.我不能以某种方式要求JVM自行分配并查看资源以构建类路径吗?或者,更好的是,我不能只main从其他线程调用DynamoDb Local 的方法,所以这一切都发生在一个进程中?有任何想法吗?

PS:我知道Alternator,但它似乎还有其他缺点,所以如果我可以让它发挥作用,我倾向于坚持亚马逊的支持解决方案.

java junit unit-testing amazon-dynamodb

46
推荐指数
7
解决办法
4万
查看次数

护照本地策略没有被调用

我确定我错过了一些非常明显的东西,但我无法弄明白.当提交登录表单时,我传递给LocalStrategy构造函数的函数不会被调用.

码:

var express = require('express');
var http = require('http');
var path = require('path');
var swig = require('swig');
var passport = require('passport');

var LocalStrategy = require('passport-local').Strategy;

passport.serializeUser(function(user, done) {
  console.log('Serialize user called.');
  done(null, user.name);
});

passport.deserializeUser(function(id, done) {
  console.log('Deserialize user called.');
  return done(null, {name: 'Oliver'});
});

passport.use(new LocalStrategy(
  function(username, password, done) {
    console.log('local strategy called with: %s', username);
    return done(null, {name: username});
  }));

var app = express();

app.set('port', process.env.PORT || 3000);
app.set('view engine', 'swig');
app.set('views', __dirname + '/views');
app.use(express.favicon());
app.use(express.logger('dev')); …
Run Code Online (Sandbox Code Playgroud)

node.js express passport.js

40
推荐指数
6
解决办法
3万
查看次数

模板通过const指针选择const引用

考虑以下:

template <class T> void Foo(const T* x) {
  std::cout << "I am the pointer overload" << std::endl;
}

template <class T> void Foo(const T& x) {
  std::cout << "I am the reference overload" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,我希望以下内容可以调用指针重载:

int* x;
Foo(x);
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.这对我来说似乎很奇怪,因为它const T*可以清楚地绑定到非const Tconst T&can,但是指针变体似乎是"更适合".

对于我的应用程序,我希望调用指针变体.我可以通过额外的专业化来完成这项工作:

template <class T> void Foo(T* x) {
  const T* const_x = x;
  Foo(const_x);
}
Run Code Online (Sandbox Code Playgroud)

但那感到错误和不必要.有没有更好的办法?我不理解的是什么(除了标准的xyz部分说这是这样的)?

c++ templates c++11

24
推荐指数
2
解决办法
1260
查看次数

Gradle buildSrc和buildscript

我们有一个Gradle构建,其中包含buildSrc一些自定义插件.这些插件适用于其他插件.例如,我们的插件适用com.android.tools.build:gradle.对于在编译期间库需要在Gradle的类路径上的注释处理.所以,把它放在我们的主要build.gradle工作中:

buildscript {
    repositories {
        google()
    }
    dependencies {
       classpath "com.android.tools.build:gradle:$gToolsVersion"
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这意味着对于用户应用此插件,他们必须(1)应用我们的插件和(2)添加该buildscript样板.似乎这不应该是必要的.我们也可以project.buildscript在我们的插件中添加一个块,但这似乎也是不必要的,由于这个bug是有问题的:https://developer.android.com/studio/build/gradle-plugin-3-0-0.html?utm_source = android-studio#known_issues.

我将com.android.tools.build:gradle依赖项添加buildSrc/build.gradleruntime依赖项.这似乎应该工作:我认为这告诉Gradle为了运行我的插件,库(及其依赖项)需要在类路径上.但是,gradle buildEnvironment(以及我们的构建失败的事实)清楚地表明情况并非如此.

所以,问题:

  1. runtime指定的依赖项buildSrc/build.gradle和常规build.gradle中块中classpath指定的依赖项之间的区别是什么buildscript
  2. 我如何安排你的事情,使用户可以从应用插件buildSrc,并没有要还添加buildscript块到他们build.gradle

gradle android-gradle-plugin

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

Pandas在groupby中返回空组

我有一个数据帧的熊猫3列,target,pred,和conf_bin.如果我运行了一个groupby(by='conf_bin').apply(...)我的应用函数,则会使用空DataFrames来调用未出现在conf_bin列中的值.这怎么可能?


细节

DataFrame看起来像这样:

        target  pred conf_bin
0            5     6     0.50
1            4     4     0.60
2            4     4     0.50
3            4     3     0.50
4            4     5     0.50
5            5     5     0.55
6            5     5     0.55
7            5     5     0.55
Run Code Online (Sandbox Code Playgroud)

显然conf_bin是一个数值区域,其值在该范围内np.arange(0, 1, 0.05).但是,并非所有值都存在于数据中:

In [224]: grp = tp.groupby(by='conf_bin')

In [225]: grp.groups.keys()
Out[225]: dict_keys([0.5, 0.60000000000000009, 0.35000000000000003, 0.75, 0.85000000000000009, 0.65000000000000002, 0.55000000000000004, 0.80000000000000004, 0.20000000000000001, 0.45000000000000001, 0.40000000000000002, 0.30000000000000004, 0.70000000000000007, 0.25]) …
Run Code Online (Sandbox Code Playgroud)

python pandas

6
推荐指数
1
解决办法
2099
查看次数

父级中的依赖管理被忽略

我有一个项目 P1,它创建一个 jar。该项目有一个父 POM,P1-PARENT。P1-Parent 包括以下内容:

<dependencyManagement>
    <!-- Kafka uses Zookeeper 3.3.4, but Curator requires 3.4.5. To resolve
         we specify 3.4.5 so all projects using either Kafka or Curator will
         get the later version which is compatible with both projects. -->
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka_2.10</artifactId>
      <version>0.8.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-client</artifactId>
      <version>2.2.0-incubating</version>
    </dependency>
    <!-- A bunch of other irrelevant stuff here -->
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

这是有效的 - “mvn dependency:tree”的输出包括:

[INFO] +- org.apache.kafka:kafka_2.10:jar:0.8.0:compile
[INFO] |  +- org.apache.zookeeper:zookeeper:jar:3.4.5:compile (version managed from 3.3.4) …
Run Code Online (Sandbox Code Playgroud)

dependencies maven-3 maven

5
推荐指数
1
解决办法
2275
查看次数

使用 cmake 强制链接静态库不起作用

我们有一个包含一些IMPORTED静态库的多项目 cmake 设置。对于我们的一个可执行文件,我们需要强制链接其中一些IMPORTED库中的所有符号,因此我们需要-Wl,-force_load在该库的名称之前传递给编译器。请注意,这些导入的库之间存在依赖关系,因此需要在链接命令行中以正确的顺序放置它们。这些依赖项CMakeLists.txt通过set_target_properties(fake_2 PROPERTIES INTERFACE_LINK_LIBRARIES ...).

我们使用的是相当标准的,target_link_libraries(lib_a PUBLIC -Wl,-force_load fake_4)但事实证明 cmake 将其-Wl,-force_load视为相当任意的链接器标志,如果您将其应用于多个库,例如:

target_link_libraries(lib_a PUBLIC -Wl,-force_load fake_4)
target_link_libraries(lib_a PUBLIC -Wl,-force_load fake_3)
Run Code Online (Sandbox Code Playgroud)

没有必要将这些链接器标志应用于fake_4fake_3。在某些情况下,它会删除重复标志并将其仅应用于其中一个库。尝试解决这个问题

target_link_libraries(lib_a PUBLIC "-Wl,-force_load $<TARGET_PROPERTY:fake_4,IMPORTED_LOCATION>")
Run Code Online (Sandbox Code Playgroud)

导致链接器标志被放置在库之前,但是 cmake 无法识别导入的库是什么,因此它忽略了它们之间的依赖关系。

可以在此处找到展示这些问题的完整示例项目:https : //github.com/REVLUTION/cmake-example

注意:如果您想在那里看到一些评论,这是从cmake 讨论论坛移出的。

c++ linker cmake

5
推荐指数
1
解决办法
959
查看次数

Kubernetes PetSet DNS无效

我有一个名为== elasticsearch和serviceName == 的Kubernetes PetSet es.它确实创建了pod,并且正如预期的那样,它们的名称elasticsearch-0elasticsearch-1.但是,DNS似乎不起作用.elasticsearch-0.es不解决(也不解决elasticsearch-0.default).如果你查看生成的srv记录,它们似乎是随机的而不是可预测的:

# nslookup -type=srv elasticsearch
Server:        10.1.0.2
Address:    10.1.0.2#53

elasticsearch.default.svc.cluster.local    service = 10 100 0 9627d60e.elasticsearch.default.svc.cluster.local.
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?


细节

这是实际的PetSet和服务定义:

---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  ports:
  - name: rest
    port: 9200
  - name: native
    port: 9300
  clusterIP: None
  selector:
    app: elasticsearch
---
apiVersion: apps/v1alpha1
kind: PetSet
metadata:
  name: elasticsearch
spec:
  serviceName: "es"
  replicas: 2
  template:
    metadata:
      labels:
        app: elasticsearch …
Run Code Online (Sandbox Code Playgroud)

kubernetes kube-dns

4
推荐指数
1
解决办法
472
查看次数

可以安全地使用线程中较早构造的对象

假设我的代码如下:

struct Foo {
  Foo() : x(10) {}
  int x_;
}

void WillRunInThread(const Foo* f) {
  cout << "f.x_ is: " << f->x_ << endl;
}

struct Baz {
  Baz() : foo_(), t_(&WillRunInThread, &foo_) {}
  Foo foo_;
  std::thread t_;
}

int main(int argc, char** argv) {
  Baz b;
  b.t_.join();
}
Run Code Online (Sandbox Code Playgroud)

我保证WillRunInThread会打印 10 个吗?我已经看到一些 StackOverflow 答案表明这是安全的。但是,我不确定情况是否如此。具体来说,我认为存在以下两种可能性,这两种可能性都会产生问题:

  1. Foo.x_可以在t_启动时存储在寄存器中。
  2. 编译器可以重新排序一些指令。而C ++保证foo_出现前被修建t_,这只是在同一个线程。例如,编译器可以自由地重新排序foo_.x_until after的初始化t_

我没有看到std::thread的构造函数作为任何类型的内存栅栏来防止上述两个问题的迹象。但是,我经常看到像上面这样的代码,这让我觉得我错过了一些东西。任何澄清将不胜感激。

c++ multithreading memory-barriers

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

Gradle忽略gradle.properties

我刚刚开始使用Gradle,几乎肯定会遗漏一些明显的东西.我的系统默认安装了Java 7,但我希望我的所有Gradle项目默认使用Java 8.所以,我创建了一个~/gradle.properties文件,并在其中添加以下内容:

$ cat ~/gradle.properties 
org.gradle.java.home = /usr/lib/jvm/java-8-openjdk-amd64
Run Code Online (Sandbox Code Playgroud)

但这似乎并不值得尊敬.首先,如果我尝试构建我的项目,我得到:

Execution failed for task ':compileJava'.
> invalid source release: 1.8
Run Code Online (Sandbox Code Playgroud)

另外,gradle --version给出:

$ gradle --version

------------------------------------------------------------
Gradle 1.5
------------------------------------------------------------

Gradle build time: Wednesday, October 8, 2014 8:21:39 AM UTC
Groovy: 1.8.6
Ant: Apache Ant(TM) version 1.9.4 compiled on October 7 2014
Ivy: non official version
JVM: 1.7.0_79 (Oracle Corporation 24.79-b02)
OS: Linux 3.16.0-4-amd64 amd64
Run Code Online (Sandbox Code Playgroud)

但是,如果我复制~/gradle.properties到我的项目目录(带有build.gradle文件的目录)或者如果我运行JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 gradle assemble它.因此,我的gradle.properties文件中没有语法错误或任何内容,并且JDK路径是正确的.出于某种原因,如果属性文件位于我的主目录中,则会忽略它们.

请注意,我的项目目录中没有gradle.properties,我也尝试将文件放入~/.gradle/gradle.properties.我还做了一堆Google和StackOverflow搜索,但是找不到这个看似显而易见的问题的答案.

java gradle

0
推荐指数
1
解决办法
2211
查看次数