我倾向于只使用已经在应用程序代码的不同地方使用的映射器模式。但我认为在这种情况下实际上可能不是最合适的选择:
任务:
我需要根据给定的规范实现数据对象。规范为每种对象类型定义了多个版本,因此,例如,我有一个CarV1和CarV2类代表规范的每个版本。
我需要在类(在这种情况下为C ++,但有关通用设计)和线路格式(Json,协议缓冲区)之间转换这些模型。反之亦然。
对象的构造非常简单。
就像我说的,我通常会使用一个映射器模式,定义一个映射器接口和具体的映射器以在每种格式之间进行映射。但是,在这种情况下,有两件事我为什么要征求您的意见:
我只会使用映射器模式来在两种类型的格式之间进行映射,例如数据库对象和模型类。在这种情况下,我已经有了第三种格式,并且有可能必须添加更多格式以在不久的将来之间进行转换。
版本控制在映射的基础上增加了一些复杂性,并且我认为两者之间还需要另一个间接方式。
我已经阅读了翻译模式[1],但从未使用过。我认为这在一定程度上合适,但并不完全合适。
我也考虑过抽象工厂。这将允许创建类似的对象(在我的情况下为版本对象)。但这并不适合在对象表示之间进行映射。
我应该使用哪种模式,为什么?
[1] http://www.iro.umontreal.ca/~keller/Layla/translator.pdf
我想创建一个基于管道和过滤器的数据处理程序,它应该像这样操纵传入的数据集,但不一定限于:
源管道(可以是来自db的数据集)<-sink-source->过滤器(添加附加字段)<-sink-source->过滤器(操作一些更多数据/删除即使数据集无效)
我知道这样的架构在C/C++中会是什么样子.但考虑到C++ 11功能方面的所有好处,我希望这个任务可以以优雅的方式完成,以便它能够:
在相当普通的 Ubuntu 16.04 映像中运行 apt-get install 时,我收到以下错误消息:
ln: cannot remove '/etc/resolv.conf': Device or resource busy
dpkg: error processing package resolvconf (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
resolvconf
Run Code Online (Sandbox Code Playgroud)
不过,这些软件包似乎已正确安装。如何解决?
我的 Dockerfile 看起来像这样:
FROM ubuntu:16.04
MAINTAINER Me Myself <me@myself.com>
RUN apt-get update && apt-get install -y git nano
RUN apt-get upgrade -y
# set the timezone. Note: there is an Ubuntu 16.04 bug which
# requires this to be done this way:
# …Run Code Online (Sandbox Code Playgroud) 首先介绍一些背景:我有一些相当简单的数据结构,它们作为json文件保存在磁盘上.这些json文件在不同语言和不同环境的应用程序(如Web前端和数据操作工具)之间共享.
对于我想要创建Python"POPO"(普通旧Python对象)的每个文件,以及每个项目的相应数据映射器类应该实现一些简单的CRUD行为(例如,save将序列化类并存储为json文件磁盘).
我认为一个简单的映射器(只知道基本类型)将起作用.但是,我担心安全问题.一些json文件将由Web前端生成,因此如果用户向我提供了一些糟糕的json,则可能存在安全风险.
最后,这里是简单的映射代码(在如何将JSON数据转换为Python对象中找到):
class User(object):
def __init__(self, name, username):
self.name = name
self.username = username
import json
j = json.loads(your_json)
u = User(**j)
Run Code Online (Sandbox Code Playgroud)
您看到了哪些可能的安全问题?
注意:我是Python的新手.
编辑:全部感谢您的评论.我发现我有一个json,我有2个数组,每个都有一个地图.不幸的是,当我得到更多这些时,这开始变得很麻烦.
我正在将问题扩展到将json输入映射到recordtype.原始代码来自:https://stackoverflow.com/a/15882054/1708349.因为我需要可变对象,所以我将其更改为使用namedlist而不是namedtuple:
import json
from namedlist import namedlist
data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: namedlist('X', d.keys())(*d.values()))
print x.name, x.hometown.name, x.hometown.id
Run Code Online (Sandbox Code Playgroud)
它还安全吗?
我正在尝试使用FlatBuffers来存储OpenStreetMap数据.所以,这将是50GB.
由于通常所有内容都保存在内存中,如何将数据顺序写入文件是否可能(如果有的话)?
我有一种感觉,这不是FlatBuffers有用的地方.
我正在将许多对象合并到包含渲染数据(网格)的单个向量中.这个向量被清除并重新填充每个帧(好吧,差不多).
问题是,在我的情况下,清除然后再次保留向量大小会对性能产生巨大影响,因为clear()也可能会改变容量.
换句话说,我需要控制向量的容量何时发生变化.我想保留旧容量很长一段时间,直到我决定自己是时候改变它了.
我看到两个选择:
更新
另外,如果调用调整大小(10),然后调用调整大小(5)(仅用于说明,将实际数字乘以数百万),该怎么办?
稍后调用resize(5)会导致向量重新分配吗?
由于某些原因,我需要将基于 cmake 的项目从 g++ 切换到 clang。我已在 Ubuntu 20.04 上切换到 llvm-11。我编译了项目本身,单元测试也正常工作。不过,让报道报告再次发挥作用似乎很困难。
我需要创建一个 cobertura xml 文件,以便将其集成到现有的 CI/CD 基础设施(Jenkins 和 Gitlab)中。我一直在使用旧版本的 [1] 进行 cmake cobertura 报告。
我认为“llvm-cov gcov”应该可以帮助我完成切换,但我最终得到的是一个空的 xml 文件,没有报告错误。
在空 xml 旁边有一个由 llvm-cov 生成的新 default.profraw 文件,该文件最终位于构建目录中。我到目前为止发现 llvm-profdata 可以转换的 .profdata 文件格式似乎比原始数据格式更适合作为转换的中间格式。因此,我生成了一个 .profdata 文件,用于使用以下命令进行测试:
llvm-profdata-11 merge -sparse default.profraw -o default.profdata
Run Code Online (Sandbox Code Playgroud)
我也可以从中生成一个 HTML 文件,其中实际上包含预期的覆盖范围:
llvm-cov show my-unit-tests -instr-profile=default.profdata ../src/*.cpp -path-equivalence -use-color --format html > coverage.html
Run Code Online (Sandbox Code Playgroud)
这也是 CMake 文件中的相关片段:
append_coverage_compiler_flags()
setup_target_for_coverage_gcovr_xml(
NAME coveragereports
EXECUTABLE my-unit-tests
DEPENDENCIES my-unit-tests my-app-lib-testing
#BASE_DIRECTORY "coverage"
#BASE_DIRECTORY "../"
EXCLUDE "${CMAKE_SOURCE_DIR}/libraries/*" "${CMAKE_SOURCE_DIR}/test/*" "/Library/*" …Run Code Online (Sandbox Code Playgroud) 好吧,我认为这几乎是不可能的.但是:如果方法作为函数调用的一部分被调用,是否有可能知道方法调用内部?
示例(和我的实际函数调用):
HDMExpressionSQLSelectBuilder *sb = [[[HDMExpressionSQLSelectBuilder alloc] init] autorelease];
[sb orNestedWhere:[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"], [sb where:@"wheraCoumnB" equals:@"sth"], nil];
Run Code Online (Sandbox Code Playgroud)
这里发生了两件事:
现在我想知道例如在这个方法调用中...
[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"]
Run Code Online (Sandbox Code Playgroud)
..它被称为函数参数的一部分.
可能?黑魔法?
在你来之前说我做错了,我应该修改我的代码:我声称我有一个罕见的情况,知道这样的事情是有意义的.我正在编写一个查询构建器,这将大大简化嵌套条件的使用.否则我必须做一些愚蠢的nestedAndBegin和后来的nestedAndEnd以实现括号,依此类推.在这种情况下会很尴尬,我的查询构建器是基于树的,我不想这样做(与字符串杂耍查询构建器不同,所有需要的是将逻辑表达式的节点放在适当的位置).
更新
所以这不足为奇.对于那些有兴趣我是如何为我的特定问题解决这个问题的人:我已经完成了所有对函数的调用都是延迟的,所以对我的查询构建器的函数的调用将带有函数参数的方法调用对象放到调用列表中.它当时不执行任何方法代码.每个调用对象都有一个auto-inc序列Id,所以我知道什么时候评估了一个函数.现在在nestedAnd等函数中(所以那些我的问题所涉及的函数)我检查存储的调用对象的序列Id是否对应于函数调用的参数索引.如果没有,这是重新排序它们的正确时间.
然后延迟语法检查和查询构建阶段,直到用户实际调用query()方法(或ast()来获取表达式树).
获取 docker 实例能够使用的 CPU 核心数的安全方法是什么?
我知道它是纯 Java 语言(也包括逻辑核心):
int cores = Runtime.getRuntime().availableProcessors();
Run Code Online (Sandbox Code Playgroud)
当 Java 应用程序在 docker 映像内运行时,这也可以吗?还是我应该考虑其他因素?
我正在尝试实现一个缓存,该缓存必须(显然)针对获取和回收项目进行优化。
但存在一个挑战:缓存可能会不时失效。
从架构的角度来看,到目前为止我所做的是实现包含池的缓存。该池本身实际上是一个无锁对象池,经过充分测试并且可以正常工作。
一个问题是允许池本身与更新版本进行交换。我认为我已经进行了交换(参考:两个 unique_ptr<T> 的无锁交换)。
但是如何使用可以在操作期间交换的池(分别是下面的 getPreparedDefaultRule() 和 recyclePreparedDefaultRule())来处理无锁 get 和 set 呢?
我几乎认为这是不可能的。尽管我很高兴被证明是错误的。
template <typename Data, typename Delegate>
class DefaultRulePoolCache {
public:
DefaultRulePoolCache() : _atomicDefaultRulePool(nullptr), _defaultRulePool(nullptr) {
}
std::unique_ptr<detail::PreparedRule<Data, Delegate>> getPreparedDefaultRule() {
auto atomicPool = _atomicDefaultRulePool.load();
if (!atomicPool) {
return nullptr;
}
return atomicPool->getPreparedRule();
}
void recyclePreparedDefaultRule(std::unique_ptr<detail::PreparedRulePool<Data, Delegate>> preparedRule) {
auto atomicPool = _atomicDefaultRulePool.load();
if (!atomicPool) {
return;
}
hdmCheck(preparedRule) << "Cannot recycle null rule.";
// we return the prepared rule only to the pool in …Run Code Online (Sandbox Code Playgroud) c++ ×5
c++11 ×2
docker ×2
java ×2
clang ×1
cmake ×1
datamapper ×1
dockerfile ×1
flatbuffers ×1
json ×1
lock-free ×1
objective-c ×1
python ×1
ubuntu-16.04 ×1
vector ×1