我目前正在尝试找出在数据库中存储业务小时数的最佳方法.
例如:
业务A有以下营业时间
目前我有一个类似于以下的数据模型
CREATE TABLE "business_hours" (
"id" integer NOT NULL PRIMARY KEY,
"day" varchar(16) NOT NULL,
"open_time" time,
"close_time" time
)
Run Code Online (Sandbox Code Playgroud)
其中"日"仅限于代码中一周7天的选择(通过ORM).要测试某个企业是否在某一天关闭,它会检查open_time和close_time是否为NULL.它通过中间表(多对多关系)与业务相关.
有没有人对这个数据库方案有任何建议?关于它的一些事情对我来说似乎并不合适.
我有一个填充了可变长度记录的字节缓冲区,其长度由记录的第一个字节决定.用于读取单个记录的缩减版C函数
void mach_parse_compressed(unsigned char* ptr, unsigned long int* val)
{
if (ptr[0] < 0xC0U) {
*val = ptr[0] + ptr[1];
return;
}
*val = ((unsigned long int)(ptr[0]) << 24)
| ((unsigned long int)(ptr[1]) << 16)
| ((unsigned long int)(ptr[2]) << 8)
| ptr[3];
}
Run Code Online (Sandbox Code Playgroud)
生成汇编(x86_64上的GCC 5.4 -O2 -fPIC),首先在ptr加载4个字节,将第一个字节与0xC0进行比较,然后处理两个,即四个字节.未定义的字节被正确丢弃,但为什么编译器认为首先加载四个字节是安全的?由于ptr没有例如对齐要求,因此它可能指向存储页面的最后两个字节,这是我们所知道的未映射的存储页面的最后两个字节,从而导致崩溃.
再生都需要-fPIC和-O2或更高.
我在这里错过了什么吗?编译器是否正确执行此操作以及如何解决此问题?
我可以通过mmap/mprotect获得上面显示的Valgrind/AddressSanitiser错误或崩溃:
//#define HEAP
#define MMAP
#ifdef MMAP
#include <unistd.h>
#include <sys/mman.h>
#include <stdio.h>
#elif HEAP
#include <stdlib.h>
#endif
void
mach_parse_compressed(unsigned char* ptr, unsigned long int* val)
{
if (ptr[0] < …Run Code Online (Sandbox Code Playgroud) 这可能很愚蠢,但我没有足够的Elisp知识来理解引用和评估方面的情况.
假设我有这个Elisp代码:
(add-to-list 'default-frame-alist '(width . 100))
(add-to-list 'default-frame-alist '(height . 50))
Run Code Online (Sandbox Code Playgroud)
它将导致预期的default-frame-alist值:
((height 50)
(width 100))
Run Code Online (Sandbox Code Playgroud)
但是现在如果我有这个:
(setq my-frame-width 100)
(setq my-frame-height 50)
(add-to-list 'default-frame-alist '(width . my-frame-width))
(add-to-list 'default-frame-alist '(height . my-frame-height))
Run Code Online (Sandbox Code Playgroud)
它会导致 -
((height my-frame-height)
(width my-frame-width))
Run Code Online (Sandbox Code Playgroud)
并且,从框架几何图形来看,永远不会评估这些变量.如何在此列表中显示my-frame-width和height的实际值?我的报价太多了吗?但是我无法从添加到列表的评估中删除任何内容......
假设我有一个非常大的无向,未加权的图形(从数亿个顶点开始,每个顶点约10个边缘),非分布式和仅由单线程处理,并且我想对它进行广度优先搜索.我希望它们是I/O绑定的,因此我需要一个良好的BFS磁盘页面布局,磁盘空间不是问题.搜索可以以相同的概率在每个顶点上开始.直观地说,这意味着最小化不同磁盘页面上的顶点之间的边缘数量,这是图形分区问题.
图表本身看起来像一个意大利面,想到随机互连的随机点集,一些偏向于较短的边缘.
问题是,一个分区图如何大?我发现可用的图形分区器可以处理仅适合内存的图形.我找不到任何流图分区算法的描述和实现.
或者,也许有一种替代分区图,以获得适合BFS的磁盘布局?
现在作为近似,我使用这样的事实:顶点具有附加到它们的空间坐标,并以Hilbert排序顺序将顶点放在磁盘上.这种方式在空间上靠近顶点落在同一页面上,但它们之间的边缘的存在与否完全被忽略.我可以做得更好吗?
作为替代方案,我可以使用顶点的希尔伯特排序顺序将图形拆分为多个,将子图划分,将它们缝合并接受接缝处的不良分区.
我已经研究过的一些事情:
分区实现(除非我弄错了,所有这些都需要将图形放入内存中):
编辑:关于图表的样子以及BFS可以在任何地方开始的信息.编辑:分区子图的想法
在大型C应用程序中,我在内存地址上设置了硬件观察点,如下所示:
(gdb) watch *0x12F5D58
Hardware watchpoint 3: *0x12F5D58
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它是硬件观察点,而不是软件,它可以解释缓慢的问题.
现在,调试器下的应用程序运行时间已从不到十秒变为一小时并且正在计数.到目前为止,观察点已触发三次,这是15分钟后第一次包含地址的内存页面可读sbrk.当然,在这15分钟内,由于内存页面无法访问,因此观察点应该是高效的吗?这仍然无法解释,为什么之后会如此缓慢.
平台是x86_64,GDB版本是Ubuntu 9.10包:
$ gdb --version
GNU gdb (GDB) 7.0-ubuntu
[...]
Run Code Online (Sandbox Code Playgroud)
和库存GDB 7.1来源:
$ gdb-7.1 --version
GNU gdb (GDB) 7.1
Run Code Online (Sandbox Code Playgroud)
提前感谢任何想法可能是什么原因或如何解决/解决它.
编辑:删除演员
编辑:gdb 7.1
我正在尝试为ia32编写GCC内联asm for CMPXCHG8B.不,我不能用__sync_bool_compare_and_swap.它必须使用和不使用-fPIC.
到目前为止,我所做的最好(编辑:毕竟不起作用,详见下面我自己的答案)
register int32 ebx_val asm("ebx")= set & 0xFFFFFFFF;
asm ("lock; cmpxchg8b %0;"
"setz %1;"
: "+m" (*a), "=q" (ret), "+A" (*cmp)
: "r" (ebx_val), "c" ((int32)(set >> 32))
: "flags")
Run Code Online (Sandbox Code Playgroud)
但是我不确定这实际上是否正确.
"b" ((int32)(set & 0xFFFFFFFF))由于PIC,我不能为ebx_val 做,但register asm("ebx")编译器接受了显然变量.
BONUS:ret变量用于分支,因此代码最终看起来像这样:
cmpxchg8b [edi];
setz cl;
cmp cl, 0;
je foo;
Run Code Online (Sandbox Code Playgroud)
任何想法如何描述输出操作数,使它成为:
cmpxchg8b [edi]
jz foo
Run Code Online (Sandbox Code Playgroud)
?
谢谢.
是否有在线提供的g ++编译器的错误/警告消息的完整列表?
我正在寻找类似于MSDN文档的内容,它描述了每条消息的含义,并且可能有一些示例代码,用于演示导致此类错误的条件.
我查看了GCC在线文档,但我甚至没有看到所有可能消息的简单枚举.
在使用版本控制中的源代码时,我想部分自动创建GNU样式的ChangeLog条目.将add-changelog-entry-other-window一个文件的时间和工作你必须访问使用它的文件.
我想要看到的是有一些命令可以输出diff -u -p(或者与VC模式集成以便它可以处理svn diff等)并立即创建所有骨架条目.
例如,如果svn status显示
D file1.c
M file2.c
A file3.c
Run Code Online (Sandbox Code Playgroud)
命令会创建
2009-09-05 My Name <my.email>
* file1.c: Removed.
* file2.c: WRITE YOUR CHANGES HERE
* file3.c: New.
Run Code Online (Sandbox Code Playgroud)
更好的是,如果它可以在某种程度上解析某些语言中已更改的文件,那么它可以提供:
* file2.c (new_function): New function.
(deleted_function): Removed.
(changed_function): WRITE YOUR CHANGES HERE
Run Code Online (Sandbox Code Playgroud)
我在Emacs手册中找到了这个功能,但我不知道如何在这里应用它.
有什么建议?谢谢.
编辑:一个答案建议vc-update-change-log.不幸的是,它只支持CVS,它通过查询已经提交的VC日志来创建ChangeLog条目.因此,即使它支持svn和其他,也不可能在同一次提交中提交更改和ChangeLog.
EDIT2:显然add-changelog-entry-other-window(Cx 4 a)不仅可以从被访问文件中运行,还可以从涉及该文件的diff hunk运行.(来源)这几乎就是我要找的.这与遍布所有帅哥的elisp循环一起应该解决它.
在macOS 10.12.6上,我有一个共享库和一个可执行文件(两者都是自己构建的,SIP不应该应用AFAIK),我想为可执行文件预加载库.它失败了,返回码为1,否则默默地:
$ ./bar/exec
<does stuff>
$ DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./foo/my.dylib ./bar/exec
<returns immediately>
$ echo $?
1
# 1 is not an explicitly returned value from ./bar/exec
Run Code Online (Sandbox Code Playgroud)
如果我添加了其中的任何一个DYLD_PRINT_LIBRARIES或DYLD_PRINT_LIBRARIES_POST_LAUNCH选项man dyld,它们都表明库和可执行文件都已成功加载:
...
dyld: loaded: /full/path/to/exec
dyld: loaded: ./foo/my.dylib
...
Run Code Online (Sandbox Code Playgroud)
如果我尝试在dtruss或lldb中使用preload运行可执行文件,它会运行,而不会预加载库.这可能有意义,因为这些工具受SIP保护.
我该如何调试呢?
UPDATE
感谢@macmoonshine,我可以通过设置LLDB本身的预加载环境而不是LLDB来重现lldb下的返回码1退出:
(lldb) env DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./foo/my.dylib
(lldb) run
...
Process 24130 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
frame #0: 0x00007fffc8aac310 libsystem_kernel.dylib`__exit
...
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', …Run Code Online (Sandbox Code Playgroud)