我正在尝试在私有 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 …
我有一个包含此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) 我正在寻找一种内存有效的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相对较小.
我的问题是:有没有办法使用流做同样的事情?
使用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 的目的PairRDD是rdd2在后续步骤中加入.但是,我实际上只对值的感兴趣rdd2,因此最后一行中的映射步骤省略了键.其实,这是之间的交点rdd2,并rdd1与星火的执行join()效率的原因.
我的问题涉及以下关键字rdd1pairs:它们仅在语法原因上创建(允许连接)在第一个映射步骤中,之后被丢弃而没有任何用法.编译器如何处理这个?在内存消耗方面是否重要,我是否使用String s(如示例所示)?我应该更换它null还是0为了节省一点内存?编译器是否实际创建并存储了这些对象(引用),还是注意到它们从未被使用过?
我有一组整数,每个整数都有一个概率,来自早期的实验,例如:
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也没有.
我想知道这是否是因为我错过了一个简单的解决方案.一个天真的实施似乎或多或少是直截了当的,但有效地做这件事是相当复杂的.这就是我正在寻找既定实施的原因.
我有一个类,其中的方法用注释进行了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然而,这似乎并不是它的工作方式。
我使用 Kubernetes 1.6 和 Docker 来部署微服务的实例/pod。
我有一项服务需要定期从外部存储库中提取持续更新的数据。此更新可以在运行时手动触发,但该服务在此期间无法使用。此外,始终在启动时检索最新数据,以便新启动的服务实例具有最新的外部数据。
因此,我想每小时(或其他频率)自动创建一个新的 pod,然后杀死旧的 pod。
从概念上讲,似乎我应该在部署中为每个 pod 配置一个最大生命周期,以便 Kubernetes 启动一个新实例/pod 并在最大生命周期到期时杀死旧实例/pod,同时确保始终至少有一个 pod跑步。但是,Kubernetes 似乎没有提供最大 pod 生命周期。
此外,由于启动期间的数据更新,启动 Pod 需要 1-2 分钟才能准备就绪。
我已经使用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) 我有一个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?
在调试Python程序时,我最近发现Python itertools#groupby()函数需要对输入集合进行排序,因为它只对序列中出现的相同元素进行分组:
一般来说,可迭代对象需要已经在相同的键函数上进行排序。
groupby()的操作类似于Unix中的uniq过滤器
在这两种情况下,uniq以及 Python 的情况groupby()下,我想知道在不排序的情况下应用这些的用例可能是什么。
显然,排序的成本可能很高,因此应尽可能避免。然而,如果排序在实践中显然是不可避免的,那么为什么 Python 开发人员决定不将其设为默认值呢groupby()?这似乎给该功能的用户造成了很多困惑。
我注意到这个设计决策似乎并不具有普遍性。像 Scala 这样的语言似乎在其groupBy()函数中隐式地对集合进行排序。
因此,我的问题是:哪些用例导致了在 uniq 和 Python 的 groupby() 中不隐式排序的设计决策?
我想获取 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()似乎是递归列出目录中文件的首选方法,因此对于这个用例来说,答案似乎有点麻烦。
我按照教程创建了一个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以便它只匹配重叠匹配的最长匹配?
我正在尝试从 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 ×6
java ×4
gitlab-ci ×3
apache-spark ×2
scala ×2
sorting ×2
badge ×1
bash ×1
caching ×1
coverage.py ×1
docker ×1
dropwizard ×1
git-webhooks ×1
gitlab ×1
grouping ×1
guava ×1
hadoop ×1
hdfs ×1
java-8 ×1
java-stream ×1
kubernetes ×1
lru ×1
math ×1
memory ×1
ner ×1
nlp ×1
performance ×1
probability ×1
prometheus ×1
pylint ×1
python-3.x ×1
setuptools ×1
spacy ×1
uniq ×1
webhooks ×1