小编dav*_*idA的帖子

为什么git允许远程标签移动,或者为什么你不能使用git-tag进行原子测试和设置

我有一个问题,两个类似的进程在同一个存储库的单独克隆中并行运行(通常在不同的计算机上).每次进程运行时,它都会从远程数据中获取最新的标记,然后根据它看到的标记推断出唯一的数字.

例如,如果遥控器上存在这些标签: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)

tags git build-process atomic

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

如何避免在 C++17 中使用指定的初始值设定项?或者,为什么使用它们看似安全,但实际上并不安全?

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++ 的情况下,如何欺骗编译器接受而不生成此类警告?

c++ aggregate-initialization c++17 c++20

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

SCons不会清除所有文件

我有一个包含"builds"目录的文件系统,每个目录都包含一个名为"build-info.xml"的文件.然而一些构建脚本生成的"集结info.xml"所以在这种情况下,我有一个有点不平凡SCons的SConstruct用来生成一个骨架集结info.xml,以便它可以被用作建立之前发生对进一步规则的依赖.

即:对于每个目录:

  • 如果build-info.xml已存在,则不执行任何操作.更重要的是,不要在'scons --clean'上删除它.
  • 如果build-info.xml不存在,则生成一个骨架 - build-info.xml不依赖于任何其他文件 - 骨架基本上是最小的默认值.
  • 在--clean期间,删除build-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 …

generator scons

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

emacs23缓冲区菜单字体(GTK)

我最近升级到了emacs23(Ubuntu 10.04),我设法让我的面孔(字体)全部用相关的.emacs选项整理出来.

然而,我似乎无法更改的一种字体是用于显示缓冲区菜单的字体(即,当您按住CTRL +左键单击缓冲区时,您将获得一个列出所有打开缓冲区的弹出菜单).

问题是用于显示此菜单的字体是成比例的(不是固定宽度)并且它使菜单变得很乱 - 没有任何内容垂直排列,我经常使用它来查看哪些缓冲区保存了共同的文件目录.比例字体在整个地方都有路径.

我相信Ubuntu的emacs23是用GTK而不是Lucid构建的.我读过的一些东西似乎表明没有办法在Emacs中设置这个字体 - 这必须在外部使用GTK配置完成 - 如果这是真的,怎么样?

否则,如果无法完成,使用Lucid重新编译emacs23而不是Ubuntu上的GTK支持是多么棘手?可以使用"apt-get source"轻松完成吗?

gtk emacs fonts customization emacs23

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

C++ - 如何在lldb/Xcode中获取std :: vector对象的地址

我有一个堆栈分配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)

c++ debugging xcode memory-address lldb

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

请求-无法处理两个具有相同名称,不同域的cookie

我正在使用请求编写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的已知限制,如果可以,建议的解决方法是什么?

python cookies python-requests

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

在Ubuntu中以新用户身份运行脚本时出现Shell问题

当我通过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运行.

python linux shell ubuntu dos

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

C++ - 为什么这个代码在没有明显的构造函数匹配时编译?

请考虑以下代码:

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)

c++ constructor explicit-constructor new-operator

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

如何为缺少预定义运算符而不扩展命名空间 `std` 的标准类型定义运算符 &gt;&gt; (istream &amp;, ...)?

显然,向命名空间添加(几乎)任何东西都是未定义的行为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

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

Haskell:将参数组合成元组而不是使用不同的参数有什么含义?

作为 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 坐标)相关联。我可以看到在这两种情况下如何使用模式匹配,但我很想知道使用元组或不同参数是否有严重的影响。

当涉及到其他参数时,元组的使用似乎清楚地表明某组参数是相互关联的。但是当函数只将元组作为参数时,它也会使代码更加冗长。

parameters haskell functional-programming tuples interface

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

C++ - 如何在不重载比较运算符的情况下为std :: max专门化自定义类型?

我正在寻找关于如何为自定义数据类型实现专门的"最大"(即最大)函数的建议,该类型也适用于标量类型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++ templates max generic-programming c++-standard-library

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