我想记录真实壁挂时间有多长.目前我这样做:
startTime = time.time()
someSQLOrSomething()
print "That took %.3f seconds" % (time.time() - startTime)
Run Code Online (Sandbox Code Playgroud)
但是如果在SQL查询(或其他任何东西)运行时调整时间,则会失败(产生不正确的结果).
我不想只是对它进行基准测试.我想在实时应用程序中记录它,以便查看实时系统的趋势.
我想要像clock_gettime(CLOCK_MONOTONIC,...)这样的东西,但是在Python中.并且最好不必编写调用clock_gettime()的C模块.
在C++ 11模板中,有没有办法将元组用作(可能是模板)函数的各个args?
示例:
假设我有此功能:
void foo(int a, int b)
{
}
Run Code Online (Sandbox Code Playgroud)
我有元组auto bar = std::make_tuple(1, 2).
我可以用它以foo(1, 2)一种模板的方式打电话吗?
我的意思并不简单,foo(std::get<0>(bar), std::get<1>(bar))因为我想在一个不知道args数量的模板中这样做.
更完整的例子:
template<typename Func, typename... Args>
void caller(Func func, Args... args)
{
auto argtuple = std::make_tuple(args...);
do_stuff_with_tuple(argtuple);
func(insert_magic_here(argtuple)); // <-- this is the hard part
}
Run Code Online (Sandbox Code Playgroud)
我应该注意,我宁愿不创建一个适用于一个arg的模板,另一个适用于两个arg的模板等等...
开发人员凭据(例如密码,密钥和客户端ID)旨在供您使用并标识您的API客户端.您将保密您的凭据并做出合理的努力来防止和阻止其他API客户端使用您的凭据.开发人员凭据可能未嵌入开源项目中.
(https://developers.google.com/terms/,我的重点)
这是否意味着我的开源驱动器命令行客户端需要强制我的软件的每个用户在Google云端控制台中设置一个新项目?有更好的选择吗?
它不是很难从非开源中提取客户端ID和客户端"秘密",为什么区别呢?
"安装应用程序"客户端ID和机密并不是真正的秘密,Google文档似乎同意:
该过程会生成客户端ID,在某些情况下会导致客户端机密,您将其嵌入应用程序的源代码中.(在这种情况下,客户端秘密显然不被视为秘密.)
编辑:结束目标:我想创建一个永远不会使用移动的容器类,即使它可用.NonMove是该容器的一类测试对象.
我尝试了不同的变化,但GCC坚持要使用移动.
class NonMove {
public:
NonMove() {}
// Copy.
NonMove(const NonMove&) {}
NonMove& operator=(const NonMove&) {}
// Move
NonMove(NonMove&&) = delete;
NonMove& operator=(NonMove&&) = delete;
};
NonMove foo() {
return NonMove();
}
Run Code Online (Sandbox Code Playgroud)
使用-std = gnu ++ 11时GCC 4.9.1出错
move.cc: In function ‘NonMove foo()’:
move.cc:15:18: error: use of deleted function ‘NonMove::NonMove(NonMove&&)’
return NonMove();
^
move.cc:10:3: note: declared here
NonMove(NonMove&&) = delete;
^
Run Code Online (Sandbox Code Playgroud) 做这个的最好方式是什么?
这是我的想法:
fd = open("/tmp/some-benchmark-data.txt", O_APPEND | O_CREAT | O_NOFOLLOW | O_WRONLY, 0644);
fstat(fd, &st);
if (st.st_nlink != 1) {
HARD LINK ATTACK!
}
Run Code Online (Sandbox Code Playgroud)
问题:有人可以将文件链接到我的一些短期文件,因此/tmp/some-benchmark-data.txt与我的另一个脚本正在使用的/ tmp/tmpfileXXXXXX相同(并使用正确的方式打开) O_EXCL和所有这些).然后我的基准数据被附加到这个/ tmp/tmpfileXXXXXX文件,而它仍然被使用.
如果我的其他脚本碰巧打开了它的临时文件,那么删除它,然后使用它; 然后我的基准数据会破坏该文件的内容.然后,这个其他脚本必须在上面代码的open()和fstat()之间删除它的文件.
换句话说:
This script Dr.Evil My other script or program
open(fn2, O_EXCL | O_CREAT | O_RDWR)
link(fn1,fn2)
open(fn1, ...)
unlink(fn2)
fstat(..)=>link is 1
write(...)
close(...)
write(...)
seek(0, ...)
read(...) => (maybe) WRONG DATA!
Run Code Online (Sandbox Code Playgroud)
因此上述解决方案不起作用.很可能还有其他攻击.
什么是正确的方法?除了不使用世界可写目录.
编辑:为了防止恶意用户使用他/她的所有权和权限创建文件,或者只是错误的权限(通过硬链接文件然后删除原始文件,或硬链接你的短文件)我可以在nlink检查后检查所有权和权限位.
没有安全问题,但也可以避免意外.最糟糕的情况是,我从我的其他文件复制的文件的开头得到了一些我自己的数据(来自另一个文件).
编辑2:我认为几乎不可能防止有人将名称硬链接到打开,删除然后使用的文件.例如EXE打包程序,有时甚至可以通过/ proc/pid/fd-num执行删除的文件.与此竞争会导致打包程序的执行失败.lsof可能会发现是否有其他人打开了inode,但它似乎比它的价值更麻烦.
我需要将一百个回调函数的顺序传递给 C 库。我所有的回调都非常相似,只是他们需要知道它注册的是哪个“密钥”。C API 不允许传回上下文。
换句话说,这是 API:
void register_for_event(int event_type, void(*callback)());
Run Code Online (Sandbox Code Playgroud)
我想出了这个模板元编程:
template<int event_type>
void event_handler() {
std::cout << "Event: " << event_type << std::endl;
}
template <int n = 100>
void register_event_handlers() {
register_for_event(n, event_handler<n>);
register_event_handlers<n-1>();
}
template<> void register_event_handlers<0>(){}
Run Code Online (Sandbox Code Playgroud)
但是有没有办法写这个:
任何版本的 C++,直到 C++20,都适合我。
我正在尝试避免使用宏,尽管我不清楚宏在这里有何帮助。
我可以使用 shell 脚本生成代码。如果我找不到更好的 C++ 原生方式,我可能最终会这样做。但我也对其他可能的本机 C++ 方式感兴趣。
有时由于SCM没有严格记住文件的时间戳,生成的Makefile会认为它需要重新运行"autoreconf -i"或相当于从Makefile.am重新生成Makefile.in,从configure.ac配置等等..
我该如何防止这种情况?
我想阻止它,因为它会导致这些问题:
我知道我可以在制作dist tarball之前"触摸"生成的文件,但在我看来,这只能解决tarball的问题,而不是开发人员.这也是一个丑陋的黑客,解决一个应该关闭的错误.此外,它打破了git存档,因为无论如何时间戳并不总是正确的.
其他SCM也有这个,所以问题不是(IMO)与git.
在Solaris上,为了获取struct msghdr中的msg_control字段并具有IPV6_TCLASS,我似乎需要定义_XPG4_2和__EXTENSIONS__.
如果我在包含任何东西之前将它们定义为1,它似乎有效:
#if defined (__SVR4) && defined (__sun)
# define _XPG4_2 1
# define __EXTENSIONS__ 1
#endif
Run Code Online (Sandbox Code Playgroud)
这与这个问题有关.
我什么时候应该使用进程范围的字典?何时我的进程状态应该在循环函数的参数中?
这个:
loop() ->
receive
{From, subscribe} ->
put(listeners, [From|get(listeners)]),
?MODULE:loop()
end.
Run Code Online (Sandbox Code Playgroud)
或这个:
loop(Listeners) ->
receive
{From, subscribe} ->
?MODULE:loop([From|Listeners])
end.
Run Code Online (Sandbox Code Playgroud)
?
循环函数的参数具有明确的好处,因为它之外的任何东西都不能改变参数(除非你在另一个函数上做奇怪的魔法弹跳,比如蹦床),但是状态倾向于加起来,以及它们的参数.
如何将dict作为参数?这两个世界中最好的还是最差的?
为什么这个代码在与std :: sort()完全正常工作时不会并行化std :: for_each()?
我如何解决它?
g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p sort
Run Code Online (Sandbox Code Playgroud)
Linux上的GCC 4.3.
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
void delay()
{
for(int c = 0; c < 1000000; c++) {
}
}
int lt(int a, int b)
{
delay();
return a < b;
}
void noop(int a)
{
delay();
}
int main(int argc, char **argv)
{
if (argc < 2) {
printf("%s <sort | for_each>\n", argv[0]);
return 1;
}
std::vector<int> foo(10000);
if …Run Code Online (Sandbox Code Playgroud) 这有效:
class Foo {};
void external_function(Foo&);
void f() {
Foo b;
external_function(b);
}
Run Code Online (Sandbox Code Playgroud)
这不是:
class Foo {};
void external_function(Foo&);
void f() {
external_function(Foo());
}
Run Code Online (Sandbox Code Playgroud)
Clang说:
aac.cc:3:6: note: candidate function not viable: no known conversion from 'Derived' to 'Base &' for 1st argument;
Run Code Online (Sandbox Code Playgroud)
GCC实际上更有帮助:
aac.cc:7:30: error: invalid initialisation of non-const reference of type ‘Base&’ from an rvalue of type ‘Derived’
Run Code Online (Sandbox Code Playgroud)
Herb Sutter(http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/)表示非const引用不能用于rvalues,这在他的例子中是有意义的,但不在我的,因为对象在external_function()调用的持续时间内存在,不是吗?
我知道如何使它发挥作用; 只需创建一个命名对象,使其不是右值(如上所述),或使用const ref.但我想知道为什么不允许这样做,因为它对我来说似乎是安全的.