我有一个问题,两个类似的进程在同一个存储库的单独克隆中并行运行(通常在不同的计算机上).每次进程运行时,它都会从远程数据中获取最新的标记,然后根据它看到的标记推断出唯一的数字.
例如,如果遥控器上存在这些标签:1.0 1.1 1.2 1.3则进程将选择1.4作为下一个数字.
在进程开始之前,它会创建一个新标记并将其推回到远程:
$ git tag 1.4 HEAD
$ git push origin tag 1.4
Run Code Online (Sandbox Code Playgroud)
这个想法是,这是一种原子选择数字的方法.其他进程,如果它在看的同时,也可能会决定使用1.4,但是当涉及到推的标签,就应该发现,1.4已经存在,并选择1.5,而不是(再试).
我希望我可以将git tag推送为原子.
不幸的是,由于一些奇怪的原因,git允许远程标签在某些情况下移动!
例如,假设标签1.4已放在origin/master上并被推送.另一个进程想要将标签1.4放在例如origin/master ^上,这将涉及向后移动标签.Git会以"非快进"错误拒绝这一点:
流程A:
$ git tag 1.4 origin/master
$ git push origin tag 1.4
Total 0 (delta 0), reused 0 (delta 0)
To /repo1
* [new tag] 1.4 -> 1.4
Run Code Online (Sandbox Code Playgroud)
流程B:
$ git tag 1.4 origin/master^
$ git push origin tag 1.4
To /repo1
! [rejected] 1.4 -> 1.4 (non-fast forward)
error: failed to push some refs …Run Code Online (Sandbox Code Playgroud) C++20 引入了对指定初始值设定项的支持。
在 g++ with 中-std=c++17,可以使用指定的初始值设定项,只要您不遗漏任何初始值设定项,它将编译而不会出现任何错误或警告:
struct Foo {
int a;
float b;
};
Foo f {
.a = 7,
.b = 42.1f,
};
Run Code Online (Sandbox Code Playgroud)
然而,如果我启用-Wpedantic(并且-Werror)C++17 编译器会输出:
error: C++ designated initializers only available with '-std=c++20' or '-std=gnu++20' [-Werror=pedantic]
Run Code Online (Sandbox Code Playgroud)
但似乎没有一种方法可以在不禁用的情况下禁用或抑制此错误-Wpedantic,这对我来说太粗糙了。
我发现这非常令人困惑,因为在 C++17 中使用此功能时没有发出警告 - 使用它的代码将编译并运行,看似具有未定义的行为,但从我在网上找到的所有内容来看,不应该使用它使用 C++17。
那么,为什么在不 使用 C++17 的情况下使用此不受支持的功能时不会出现警告或错误呢-Wpedantic?如果它在技术上是 UB 的,那么警告用户不支持的语言功能肯定不是迂腐的吗?如果不是 UB,那么它就可以工作,对吗?
-Wpedantic最后,如果我选择在 C++17 代码中使用指定的初始值设定项,那么在不重新编译 g++ 的情况下,如何欺骗编译器接受而不生成此类警告?
我有一个包含"builds"目录的文件系统,每个目录都包含一个名为"build-info.xml"的文件.然而一些构建脚本生成的"集结info.xml"所以在这种情况下,我有一个有点不平凡SCons的SConstruct用来生成一个骨架集结info.xml,以便它可以被用作建立之前发生对进一步规则的依赖.
即:对于每个目录:
我的SConstruct看起来像这样:
def generate_actions_BuildInfoXML(source, target, env, for_signature):
cmd = "python '%s/bin/create-build-info-xml.py' --version $VERSION --path . --output ${TARGET.file}" % (Dir('#').abspath,)
return cmd
bld = Builder(generator = generate_actions_BuildInfoXML, chdir = 1)
env.Append(BUILDERS = { "BuildInfoXML" : bld })
...
# VERSION = some arbitrary string, not important here
# path = filesystem path, set elsewhere
build_info_xml = "%s/build-info.xml" % (path,)
if not os.path.exists(build_info_xml):
env.BuildInfoXML(build_info_xml, None, VERSION = build)
Run Code Online (Sandbox Code Playgroud)
我的问题是'scons …
我最近升级到了emacs23(Ubuntu 10.04),我设法让我的面孔(字体)全部用相关的.emacs选项整理出来.
然而,我似乎无法更改的一种字体是用于显示缓冲区菜单的字体(即,当您按住CTRL +左键单击缓冲区时,您将获得一个列出所有打开缓冲区的弹出菜单).
问题是用于显示此菜单的字体是成比例的(不是固定宽度)并且它使菜单变得很乱 - 没有任何内容垂直排列,我经常使用它来查看哪些缓冲区保存了共同的文件目录.比例字体在整个地方都有路径.
我相信Ubuntu的emacs23是用GTK而不是Lucid构建的.我读过的一些东西似乎表明没有办法在Emacs中设置这个字体 - 这必须在外部使用GTK配置完成 - 如果这是真的,怎么样?
否则,如果无法完成,使用Lucid重新编译emacs23而不是Ubuntu上的GTK支持是多么棘手?可以使用"apt-get source"轻松完成吗?
我有一个堆栈分配std::vector被一些流氓代码覆盖.它不是被覆盖的数据,而是内部状态.我知道这是因为size()成员函数会在程序中返回垃圾值一段时间.它正确初始化.我怀疑代码中的其他地方有一个常见的指针错误.
我正在使用Xcode 4.6.2.我想在内存访问向量的第一个内存位置(向量本身,而不是数据)时设置硬件断点(使用lldb),所以我可以看到覆盖它的内容.根据这个我需要先找到矢量的地址.通常会使用&运算符来获取变量的地址,但由于某种原因,使用lldb这不会返回地址,而是打印某种类型的汇总字符串.
class myClass {
public:
myClass() : myVector(4) {}
private:
std::vector<double> myVector;
double myDouble;
};
Run Code Online (Sandbox Code Playgroud)
在构造完所有内容后,在任意断点处断开之后:
(lldb) frame variable &myObject.myVector
(std::vector<double, std::allocator<double> > *) $7 = size=4
Run Code Online (Sandbox Code Playgroud)
'expr'具有相同的结果:
(lldb) expr &myObject.myVector;
(std::vector<double, std::allocator<double> > *) $8 = size=4
Run Code Online (Sandbox Code Playgroud)
通常我希望看到打印的地址,例如使用此普通数据成员:
(lldb) frame variable &myObject.myDouble
(double *) &myDouble = 0x0000000125589328
Run Code Online (Sandbox Code Playgroud)
我尝试使用'expr'将地址分配给变量,但这也不起作用:
(lldb) expr std::vector<double, std::allocator<double> > * f = &myObject.myVector; f
(std::vector<double, std::allocator<double> > *) $12 …Run Code Online (Sandbox Code Playgroud) 我正在使用请求编写Python 2.7脚本,以自动访问一个网站,该网站设置了两个具有相同名称但域不同的Cookie,例如名称“ mycookie”,域“ www.example.com”和“ subdomain.example.com” 。我的客户端脚本需要读取其中一个 cookie 的值,并将其作为参数包含在后续请求中。由于cookie中的cookie访问requests.Session似乎仅由cookie名称来确定,因此我看不到提取正确cookie值的方法。确实,尝试使用名称访问Cookie会产生以下错误:
value = session.cookies["mycookie"]
File "/usr/lib/python2.7/site-packages/requests/cookies.py", line 276, in __getitem__
return self._find_no_duplicates(name)
File "/usr/lib/python2.7/site-packages/requests/cookies.py", line 326, in _find_no_duplicates
raise CookieConflictError('There are multiple cookies with name, %r' % (name))
requests.cookies.CookieConflictError: There are multiple cookies with name, 'mycookie'
Run Code Online (Sandbox Code Playgroud)
这表明在编写请求时,假设每个会话的cookie名称都是唯一的。但是,事实证明不一定如此。
我认为我可以通过维护两个会话并在它们之间手动复制其他重要的cookie来解决此问题。但是,我想知道这是否是Requests的已知限制,如果可以,建议的解决方法是什么?
当我通过SSH登录到特定的Ubuntu Linux(10.04 64位)主机时,我得到了一个bash shell.从这里我可以运行一个特定的Python脚本,并设置可执行位,将其作为第一行:
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
但是,如果另一个(新)用户通过SSH登录到同一主机并尝试运行此(或此副本)脚本,则会出现此错误:
$ ./script.py
: No such file or directory
Run Code Online (Sandbox Code Playgroud)
事实证明,这个文件实际上是一个DOS行结束文件,但我可以从我的登录中运行这个.如果我将其转换为UNIX格式,那么另一个人也可以运行它.
如果我们用'python'作为前缀,那么无论DOS/UNIX格式如何,该脚本对我们两个人都运行良好:
$ python ./script.py
blah blah blah...
Run Code Online (Sandbox Code Playgroud)
除此之外,一旦脚本转换为UNIX格式而另一个用户可以运行它,它仍然无法从Makefile运行 - make显示与上面相同的错误.
我读到/ bin/sh是Ubuntu中的'dash'(而不是'bash')shell,我想知道这是否与此有关,因为它的行为与bash不同.如果是这样,我想知道我的登录(完全正常并且已经完成多年)和这个新用户的登录之间的区别是什么,它显示了各种奇怪的行为.从哪里开始寻找?
也许相关 - 新用户是由Same服务(Active Directory集成客户端)自动创建的,并且该服务可能以某种方式错误地配置了新用户.
我也尝试将第一行更改为#!/ usr/bin/python,没有任何区别.
两个用户都将bash shell作为其登录shell运行.
请考虑以下代码:
class Foo {
public:
explicit Foo(double) {}
};
Foo * test();
Foo * test() {
return new Foo(Foo(1.0)); // (1)
}
Run Code Online (Sandbox Code Playgroud)
我的问题涉及第(1)行.这非常类似于我花了一些时间来追踪的错误.由于复制/粘贴错误,我没有注意到该类型已被指定两次.显然,正确的路线是:
return new Foo(1.0);
Run Code Online (Sandbox Code Playgroud)
有趣的是,这种变化似乎也可以免费编译:
return new Foo(Foo(Foo(Foo(1.0))));
Run Code Online (Sandbox Code Playgroud)
为什么这些例子在没有警告的情况下编译,即使有-Wall -Weverything标志?为什么Foo::Foo(double)接受Foo的实例作为有效double参数?这是运营商新的一些特殊行为吗?
我的原始代码是在更大的上下文中,并使用两个基于LLVM-3的编译器进行测试.编译时都没有警告或错误.有一个,代码实际上按照我的预期运行,实际上我没有意识到有一段时间有一个bug.另一方面,Foo的实例表现得非常奇怪 - 我无法正确描述它 - 就好像后来的返回指针的副本"神奇地"变成了与原始值不同的值,导致两个合作之间的状态不匹配应该保存与共享Foo等效指针的对象,但由于某种原因在赋值后保存了不同的值.在我了解这里发生了什么之前,它似乎真的很奇怪!
有趣的是,以下两个编译器编译:
class Foo { public: explicit Foo(double) {} };
class Bar { public: explicit Bar(double) {} };
Foo * testFoo() { return new Foo(Foo(1.0)); }
Bar * testBar() { return new Bar(Bar(1.0)); }
Run Code Online (Sandbox Code Playgroud)
但是以下版本没有:
Foo * testFooBar() …Run Code Online (Sandbox Code Playgroud) 显然,向命名空间添加(几乎)任何东西都是未定义的行为std。
我使用C ++ 14不具有std::chrono::parse()(C ++ 20只),但我需要类型的deserialise值std::chrono::milliseconds(的特殊化std::chrono::duration从)istream。
虽然这有效,但我找不到任何允许它不是 UB 的例外情况:
namespace std {
std::istream& operator >>(std::istream & is, std::chrono::milliseconds & ms) {
std::string s;
is >> s;
ms = std::chrono::milliseconds(std::stoi(s));
return is;
}
}
Run Code Online (Sandbox Code Playgroud)
由于这两种参数类型都不是我的类型,我不确定如何在std命名空间之外安全地定义这个运算符。
请注意,运算符将在内部深处调用,Boost::program_options因此我认为我无法在自己的命名空间中定义运算符然后使用,using my_ns::operator>>因为该using声明的program_options范围不会扩展到范围内。
作为Boost::program_options我的用户,我从存储为std::chrono::milliseconds值的配置文件中读取了一个特定的配置变量:
std::chrono::milliseconds period;
po::options_description config_only_opts;
config_only_opts.add_options()
("control.period", po::value<std::chrono::milliseconds>(&period), "Specify the period in milliseconds"); …Run Code Online (Sandbox Code Playgroud) c++ namespaces boost-program-options deserialization c++-chrono
作为 Haskell 初学者,我对最佳实践很好奇。特别是,在没有其他要求的情况下,是使用元组关联相关的函数参数,还是保持“裸”更好?
例如
vector :: Float -> Float -> Float -> Vector
Run Code Online (Sandbox Code Playgroud)
对比
vector :: (Float, Float, Float) -> Vector
Run Code Online (Sandbox Code Playgroud)
我问的原因是有时参数的某些方面(例如 2D 或 3D 点或向量中的 x 坐标)通常与其他参数(例如 y 和 z 坐标)相关联。我可以看到在这两种情况下如何使用模式匹配,但我很想知道使用元组或不同参数是否有严重的影响。
当涉及到其他参数时,元组的使用似乎清楚地表明某组参数是相互关联的。但是当函数只将元组作为参数时,它也会使代码更加冗长。
我正在寻找关于如何为自定义数据类型实现专门的"最大"(即最大)函数的建议,该类型也适用于标量类型float.我正在编写的数据类型是向量的包装器(最终是四个浮点数的SIMD向量,而不是a std::vector),我想提供一个max函数来比较两个向量并返回一个新的向量,它是每个元素的最大值.这与std::max使用比较运算符的不同,但概念是相同的.
问题是我有一个do_max(T x, T y)适用max于输入的泛型函数.我需要这个函数来处理标量浮点输入(例如do_max<float>(0.1f, 0.2f))和我的矢量类(例如do_max<MyVector>(v0, v1)).
需要注意的是超载MyVector的比较操作是不是一种选择,因为我使用的是那些与SIMD内部函数是有很大的不同:他们创建一个包含整数向量1,0,-1每个元素的比较,而不是返回一个布尔结果.
除非你注释掉这float f0 = ...行,否则下面的代码不会编译:
// compile with: g++ -std=c++11 max.cc -o max
#include <algorithm>
#include <vector>
class MyVector {
public:
MyVector(float x0, float x1, float x2, float x3) : storage_ { x0, x1, x2, x3 } {};
friend MyVector max(MyVector lhs, const MyVector & rhs);
private:
std::vector<float> storage_;
};
MyVector max(MyVector lhs, …Run Code Online (Sandbox Code Playgroud) c++ ×5
python ×2
atomic ×1
c++-chrono ×1
c++17 ×1
c++20 ×1
constructor ×1
cookies ×1
debugging ×1
dos ×1
emacs ×1
emacs23 ×1
fonts ×1
generator ×1
git ×1
gtk ×1
haskell ×1
interface ×1
linux ×1
lldb ×1
max ×1
namespaces ×1
new-operator ×1
parameters ×1
scons ×1
shell ×1
tags ×1
templates ×1
tuples ×1
ubuntu ×1
xcode ×1