小编Car*_*ten的帖子

Gitlab CI 中的覆盖率徽章与 Python 覆盖率始终未知

我正在尝试在私有 Gitlab CE 安装(v11.8.6)中显示Python 项目的覆盖徽章,使用Python 的coverage.py。但是,徽章总是说unknown

这是我.gitlab-ci.yaml文件中的相关工作:

coverage:
    stage: test
    before_script:
        - pip3.6 install coverage
        - mkdir -p public
    script:
        - coverage run --source=my_service setup.py test
        - coverage report | tee public/coverage.txt
    artifacts:
        paths:
            - public/coverage.txt
    coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
Run Code Online (Sandbox Code Playgroud)

我希望徽章显示此 URL 的实际覆盖范围,因此这是我在General/下的项目设置中输入的内容Badges

http://<privategitlaburl>/%{project_path}/badges/%{default_branch}/coverage.svg?job=coverage
Run Code Online (Sandbox Code Playgroud)

我使用 Gitlab 页面阅读了这些说明。但是,我不想仅为此目的使用页面,而且我正在处理一个 Python 项目。

根据 CI/CD 设置中的示例,在这篇文章中coverage条目中的正则表达式应该可以工作。我可以通过在本地尝试来确认:

$ grep -P "TOTAL\s+\d+\s+\d+\s+(\d+%)" public/coverage.txt
TOTAL                                           289     53    82%
Run Code Online (Sandbox Code Playgroud)

我还在/Test …

python code-coverage badge coverage.py gitlab-ci

11
推荐指数
2
解决办法
4838
查看次数

Python setuptools:包目录不存在

我有一个包含此setup.py文件的项目:

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="",
    version="0.0.1",
    author="",
    author_email="",
    description="",
    long_description=long_description,
    long_description_content_type="text/markdown",
    packages=setuptools.find_packages(where="./src", exclude=("./tests",)),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.8',
)
Run Code Online (Sandbox Code Playgroud)

这是我的项目目录结构(前两级):

$ tree -L 2
.
??? README.md
??? setup.py
??? src
?   ??? my_pkg
??? tests
    ??? conftest.py
    ??? data
    ??? __init__.py
    ??? integration
    ??? __pycache__
    ??? unit
Run Code Online (Sandbox Code Playgroud)

当我运行任何 setuptools 命令时,我收到以下错误:

$ python setup.py …
Run Code Online (Sandbox Code Playgroud)

python setuptools python-3.x python-packaging

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

使用Java流的MinMaxPriorityQueue

我正在寻找一种内存有效的Java方法来从庞大的集合中找到前n个元素.例如,我有一个单词,distance()方法和"all"单词的集合.我已经实现了一个实现compareTo()的类Pair,以便按对它们的值进行排序.

使用流,我的天真解决方案看起来像这样:

double distance(String word1, String word2){
  ...
}

Collection<String> words = ...;
String word = "...";

words.stream()
  .map(w -> new Pair<String, Double>(w, distance(word, w)))
  .sorted()
  .limit(n);
Run Code Online (Sandbox Code Playgroud)

据我所知,这将处理并中间存储每个元素的单词,以便在应用limit()之前对其进行排序.但是,拥有一个存储n个元素的集合更加节省内存,每当添加一个新元素时,它会删除最小的元素(根据可比对象的自然顺序),因此永远不会大于n(或n + 1) ).

这正是Guava MinMaxPriorityQueue所做的.因此,我目前对上述问题的最佳解决方案是:

Queue<Pair<String, Double>> neighbours = MinMaxPriorityQueue.maximumSize(n).create();
words.stream()
  .forEach(w -> neighbours.add(new Pair<String, Double>(w, distance(word, w)));
Run Code Online (Sandbox Code Playgroud)

在将队列转换为流或列表之后,仍然需要对前n个元素进行排序,但这不是问题,因为n相对较小.

我的问题是:有没有办法使用流做同样的事情?

java sorting guava java-8 java-stream

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

Scala编译器如何处理未使用的变量值?

使用Scala和Spark,我有以下结构:

val rdd1: RDD[String] = ...
val rdd2: RDD[(String, Any)] = ...

val rdd1pairs = rdd1.map(s => (s, s))
val result = rdd2.join(rdd1pairs)
              .map { case (_: String, (e: Any, _)) => e }
Run Code Online (Sandbox Code Playgroud)

映射rdd1到a 的目的PairRDDrdd2在后续步骤中加入.但是,我实际上只对值的感兴趣rdd2,因此最后一行中的映射步骤省略了键.其实,这是之间的交点rdd2,并rdd1与星火的执行join()效率的原因.

我的问题涉及以下关键字rdd1pairs:它们仅在语法原因上创建(允许连接)在第一个映射步骤中,之后被丢弃而没有任何用法.编译器如何处理这个?在内存消耗方面是否重要,我是否使用String s(如示例所示)?我应该更换它null还是0为了节省一点内存?编译器是否实际创建并存储了这些对象(引用),还是注意到它们从未被使用过?

memory performance scala apache-spark

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

Java中的离散概率分布

我有一组整数,每个整数都有一个概率,来自早期的实验,例如:

0 = 0.5
1 = 0.2
2 = 0.3
Run Code Online (Sandbox Code Playgroud)

符合概率分布的规范,这些权重总和为1.0.我现在正在寻找一种有效的方法来考虑其中一个值,同时考虑给定的概率,例如(pseude-code):

Distribution distribution = new DiscreteDistribution(new double[]{0.5, 0.3, 0.2});
distribution.sample();
Run Code Online (Sandbox Code Playgroud)

根据给定的数字,这应该导致0的一半时间.但是,不要假设其中的任何模式或规律.

我以前的实验一直在使用Apache Commons Math,但似乎没有为这种情况提供解决方案,Colt也没有.

我想知道这是否是因为我错过了一个简单的解决方案.一个天真的实施似乎或多或少是直截了当的,但有效地做这件事是相当复杂的.这就是我正在寻找既定实施的原因.

java math probability

6
推荐指数
2
解决办法
1465
查看次数

Python lru_cache:currsize &lt; misses &lt; maxsize 如何?

我有一个类,其中的方法用注释进行了lru_cache注释

CACHE_SIZE=16384

class MyClass:
    [...]

    @lru_cache(maxsize=CACHE_SIZE)
    def _my_method(self, texts: Tuple[str]):
       <some heavy text processing>

    def cache_info(self):
        return self._my_method.cache_info()

Run Code Online (Sandbox Code Playgroud)

运行一段时间后,我通过方法查看缓存统计信息cache_info()

c = MyClass()
[...]
c.cache_info()

{
  "hits":9348,
  "misses":4312,
  "maxsize":16384,
  "currsize":2588
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何currsize小于missesAND 小于maxsize

我的理解:对于每次未命中,结果都会添加到缓存中,从而增加当前大小。仅当当前大小达到最大大小时,才会删除缓存结果。由于此处尚未达到最大大小,因此应缓存每个未命中,因此此时currsize应相等。misses然而,这似乎并不是它的工作方式。

python caching lru

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

Kubernetes:最大 Pod 生命周期

我使用 Kubernetes 1.6 和 Docker 来部署微服务的实例/pod。

我有一项服务需要定期从外部存储库中提取持续更新的数据。此更新可以在运行时手动触发,但该服务在此期间无法使用。此外,始终在启动时检索最新数据,以便新启动的服务实例具有最新的外部数据。

因此,我想每小时(或其他频率)自动创建一个新的 pod,然后杀死旧的 pod。

从概念上讲,似乎我应该在部署中为每个 pod 配置一个最大生命周期,以便 Kubernetes 启动一个新实例/pod 并在最大生命周期到期时杀死旧实例/pod,同时确保始终至少有一个 pod跑步。但是,Kubernetes 似乎没有提供最大 pod 生命周期

此外,由于启动期间的数据更新,启动 Pod 需要 1-2 分钟才能准备就绪。

docker kubernetes

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

在 Dropwizard 中公开 Prometheus 指标

我已经使用Dropwizard实现了一个 Java Web 服务。现在我希望它也公开Prometheus metrics

我遵循了这个非常直接的例子。但是,位于http://localhost:9090/metrics的端点仍未公开。

这是相关的代码:

中的依赖项pom.xml

    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_dropwizard</artifactId>
        <version>0.5.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient_servlet -->
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_servlet</artifactId>
        <version>0.5.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

Java代码:

import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.dropwizard.DropwizardExports;
import io.prometheus.client.exporter.MetricsServlet;
[...]

public class MyApplication extends Application<MyServiceConfiguration> {

@Override
public void run(final MyServiceConfiguration configuration,
        final Environment environment) {
    final MyServiceResource resource = createResource(configuration);
    environment.jersey().register(resource);

    registerHealthChecks(environment, resource);

    registerMetrics(environment);
}

private void registerMetrics(Environment environment) {
    CollectorRegistry collectorRegistry = new …
Run Code Online (Sandbox Code Playgroud)

java dropwizard prometheus

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

在 Gitlab CI 中读取 webhook 负载

我有一个PROJECT_A通过 webhook 触发的项目 ( ),并希望设置变量$PRODUCT。它的值用于触发构建中的某个路径。.gitlab-ci.yml文件中的作业如下所示:

deploy:
  stage: publish
  script:
    - ./generate_doc.sh $PRODUCT
Run Code Online (Sandbox Code Playgroud)

一个 webhook 调用如下所示:

http://<GITLAB_URL>/api/v4/projects/710/ref/master/trigger/pipeline?token=<TOKEN>&variables[PRODUCT]=<PRODUCT>
Run Code Online (Sandbox Code Playgroud)

我通过来自其他项目的 webhook 调用此触发器,包括PROJECT_B. 所以我在各自的 webhooks 中手动填写了所需的值,例如PROJECT_B

http://<GITLAB_URL>/api/v4/projects/710/ref/master/trigger/pipeline?token=<TOKEN>&variables[PRODUCT]=PROJECT_B
Run Code Online (Sandbox Code Playgroud)

当管道输入PROJECT_A被触发时,如预期的那样$PRODUCT具有值PROJECT_B

我想进一步参数化管道并考虑提交消息等。我需要的所有信息显然都在webhook 负载中提供

是否有内置方法可以在管道中读取此有效负载?或者,将有效负载的内容放入 webhook 中的变量中,如下所示:

http://<GITLAB_URL>/api/v4/projects/710/ref/master/trigger/pipeline?token=<TOKEN>&variables[COMMIT_REF]=???
Run Code Online (Sandbox Code Playgroud)

我发现了有关使用 webhook 负载进行参数化 Jenkins 构建的讨论,包括此相关问题Gitlab论坛里也有类似的问题,没有任何答案。

有没有办法在 Gitlab CI 管道中访问该有效负载?我可能可以通过jq调用来提取提供的值,但是首先如何获得 Json?

webhooks gitlab gitlab-ci git-webhooks

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

uniq、groupby 的用例,无需排序

在调试Python程序时,我最近发现Python itertools#groupby()函数需要对输入集合进行排序,因为它只对序列中出现的相同元素进行分组:

一般来说,可迭代对象需要已经在相同的键函数上进行排序。

groupby()的操作类似于Unix中的uniq过滤器

在这两种情况下,uniq以及 Python 的情况groupby()下,我想知道在不排序的情况下应用这些的用例可能是什么。

显然,排序的成本可能很高,因此应尽可能避免。然而,如果排序在实践中显然是不可避免的,那么为什么 Python 开发人员决定不将其设为默认值呢groupby()?这似乎给该功能的用户造成了很多困惑。

我注意到这个设计决策似乎并不具有普遍性。像 Scala 这样的语言似乎在其groupBy()函数中隐式地对集合进行排序。

因此,我的问题是:哪些用例导致了在 uniq 和 Python 的 groupby() 中不隐式排序的设计决策?

python sorting grouping uniq

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

如何获取Hadoop文件系统中的绝对路径?

我想获取 HDFS 文件系统中目录及其子目录中的所有文件的列表。这是我为了递归读取目录中的所有文件而编写的方法:

def getAllFiles(dir: Path, fs: FileSystem, recursive: Boolean = true): Seq[Path] = {
  val iter = fs.listFiles(dir, recursive)
  val files = new ListBuffer[Path]()

  while (iter.hasNext()) {
    val p = iter.next().getPath
      files.append(p)
    }
    files
}
Run Code Online (Sandbox Code Playgroud)

结果是org.apache.hadoop.fs.Path我需要在后续步骤中处理的元素列表。因此,我需要完整路径。我的问题是:获得完整绝对路径的最佳方法是什么

到目前为止,我使用递归方法来创建路径字符串(Scala):

def fullPath(p: Path): String = {
  if (p.isRoot())
    p.getName
  else
    fullPath(p.getParent) + Path.SEPARATOR + p.getName
}
Run Code Online (Sandbox Code Playgroud)

是否没有通过 Path API 更直接的方法?

我遇到过问题#18034758,但使用listFiles()而不是listStatus()似乎是递归列出目录中文件的首选方法,因此对于这个用例来说,答案似乎有点麻烦。

java hadoop scala hdfs apache-spark

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

最长匹配仅与 Spacy Phrasematcher

我按照教程创建了一个Spacy Phrasematcher来匹配文档中的名称。我想使用结果匹配作为额外的训练数据来训练一个 Spacy NER 模型。然而,我的模式分别包含全名(例如“Barack Obama”)和姓氏(“Obama”)。

因此,在包含“Barack Obama”的句子中,两种模式都匹配,导致匹配重叠。但是,当我尝试使用数据进行训练时,这种重叠会触发异常,例如:

ValueError: [E103] Trying to set conflicting doc.ents: '(19, 33, 'PERSON')' and '(29, 33, 'PERSON')'. A token can only be part of one entity, so make sure the entities you're setting don't overlap.
Run Code Online (Sandbox Code Playgroud)

我一直在考虑在使用数据进行训练之前过滤掉重叠的匹配,但这似乎是一种非常低效的方法,导致处理大数据的时间显着增加。

有没有办法设置 aPhraseMatcher以便它只匹配重叠匹配的最长匹配?

python nlp named-entity-recognition spacy ner

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

避免在 gitlab CI 脚本管道中提前退出命令,同时仍捕获退出状态

我正在尝试从 Gitlab CI 脚本中的 PyLint 输出生成徽章。最终,如果 PyLint 具有非零退出代码,作业应该会失败。但在此之前,我希望创建徽章。所以我尝试了以下方法:

before_script:
    - [...]
    - mkdir -p public
script:
    - pylint lib --disable R,missing-docstring,wrong-import-order --reports=y | tee public/pylint-report.txt
    - export SUCCESS=${PIPESTATUS[0]}
    - SCORE=$(tail -n 2 public/pylint-report.txt | grep -o -P "\d\d?\.\d+\/\d*" | head -1)
    - echo "PyLint score ${SCORE}"
    - python3.6 -m pybadges --left-text=PyLint --right-text=${SCORE} > public/pylint.svg
    - exit ${SUCCESS}
artifacts:
    when: always
    [...]
Run Code Online (Sandbox Code Playgroud)

如果 PyLint 退出代码为 0,这可以正常工作:

$ mkdir -p public
$ pylint lib --disable R,missing-docstring,wrong-import-order --reports=y | tee public/pylint-report.txt; export SUCCESS=${PIPESTATUS[0]} …
Run Code Online (Sandbox Code Playgroud)

python bash pylint gitlab-ci

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