在使用gdb加载core文件开始的时候会显示导致core的直接原因,但是随着分析的进行,gdb的输出会越来越多,如果想回过头来再次(again)确认下这些导致core的信息,此时有没有什么命令可以把加载core文件时的信息再输出一遍?
在stackoverflow上相似问题。
when loading a core dump into GDB the reason why it crashed automatically is displayed. For example
Program terminated with signal 11, Segmentation fault.
Is there any way to get the information again? The thing is, that I'm writing a script which needs this information. But if the signal is only available after loading the core dump amd I can't access the information later on.
Is there really no command for such an important feature?
从gdb的代码来看,这个信息只有在打开core文件的时候才会显示一次;或者说这个输出不是一个函数,从代码上没有办法在启动之后的时候再次重现。
void
core_target_open (const char *arg, int from_tty)
{
///....
p = bfd_core_file_failing_command (core_bfd);
if (p)
printf_filtered (_("Core was generated by `%s'.\n"), p);
/* Clearing any previous state of convenience variables. */
clear_exit_convenience_vars ();
siggy = bfd_core_file_failing_signal (core_bfd);
if (siggy > 0)
{
gdbarch *core_gdbarch = target->core_gdbarch ();
/* If we don't have a CORE_GDBARCH to work with, assume a native
core (map gdb_signal from host signals). If we do have
CORE_GDBARCH to work with, but no gdb_signal_from_target
implementation for that gdbarch, as a fallback measure,
assume the host signal mapping. It'll be correct for native
cores, but most likely incorrect for cross-cores. */
enum gdb_signal sig = (core_gdbarch != NULL
&& gdbarch_gdb_signal_from_target_p (core_gdbarch)
? gdbarch_gdb_signal_from_target (core_gdbarch,
siggy)
: gdb_signal_from_host (siggy));
printf_filtered (_("Program terminated with signal %s, %s"),
gdb_signal_to_name (sig), gdb_signal_to_string (sig));
if (gdbarch_report_signal_info_p (core_gdbarch))
gdbarch_report_signal_info (core_gdbarch, current_uiout, sig);
printf_filtered (_(".\n"));
/* Set the value of the internal variable $_exitsignal,
which holds the signal uncaught by the inferior. */
set_internalvar_integer (lookup_internalvar ("_exitsignal"),
siggy);
}
///....
}
从代码上看,gdb获取的singal信息是通过elfcore_grok_prstatus函数生成的,这个grok在gcc代码中的出镜率也很高,该单词表示"understand (something) intuitively or by empathy.",大致对应中文的"设身处地的理解别人的意图",所以这个单词在gcc中更加合适,因为毕竟gcc就是为了把程序语言翻译为机器语言,在这个过程中必然少不了理解程序的真实意图。对应到gdb的场景,这个地方的理解主要是将内核dump出来的进程状态信息转换为调试者(debugger)可以理解形式。
对于我们最常见的内存访问问题来说,我们最关心的就是触发异常的信号和异常访问的地址,当然,还有进程使用的可执行文件以及进程启动时的命令行参数信息。从gdb的代码可以看到,这些关键信息是从core文件中的prstatus(program status)结构中获取的。
///@file: gdb-10.1\bfd\elf.c
#if defined (HAVE_PRSTATUS_T)
static bfd_boolean
elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
{
size_t size;
int offset;
if (note->descsz == sizeof (prstatus_t))
{
prstatus_t prstat;
size = sizeof (prstat.pr_reg);
offset = offsetof (prstatus_t, pr_reg);
memcpy (&prstat, note->descdata, sizeof (prstat));
/* Do not overwrite the core signal if it
has already been set by another thread. */
if (elf_tdata (abfd)->core->signal == 0)
elf_tdata (abfd)->core->signal = prstat.pr_cursig;
if (elf_tdata (abfd)->core->pid == 0)
elf_tdata (abfd)->core->pid = prstat.pr_pid;
/* pr_who exists on:
solaris 2.5+
unixware 4.2
pr_who doesn't exist on:
linux 2.[01]
*/
#if defined (HAVE_PRSTATUS_T_PR_WHO)
elf_tdata (abfd)->core->lwpid = prstat.pr_who;
#else
elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
#endif
}
#if defined (HAVE_PRSTATUS32_T)
else if (note->descsz == sizeof (prstatus32_t))
{
/* 64-bit host, 32-bit corefile */
prstatus32_t prstat;
size = sizeof (prstat.pr_reg);
offset = offsetof (prstatus32_t, pr_reg);
memcpy (&prstat, note->descdata, sizeof (prstat));
/* Do not overwrite the core signal if it
has already been set by another thread. */
if (elf_tdata (abfd)->core->signal == 0)
elf_tdata (abfd)->core->signal = prstat.pr_cursig;
if (elf_tdata (abfd)->core->pid == 0)
elf_tdata (abfd)->core->pid = prstat.pr_pid;
/* pr_who exists on:
solaris 2.5+
unixware 4.2
pr_who doesn't exist on:
linux 2.[01]
*/
#if defined (HAVE_PRSTATUS32_T_PR_WHO)
elf_tdata (abfd)->core->lwpid = prstat.pr_who;
#else
elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
#endif
}
#endif /* HAVE_PRSTATUS32_T */
else
{
/* Fail - we don't know how to handle any other
note size (ie. data object type). */
return TRUE;
}
/* Make a ".reg/999" section and a ".reg" section. */
return _bfd_elfcore_make_pseudosection (abfd, ".reg",
size, note->descpos + offset);
}
#endif /* defined (HAVE_PRSTATUS_T) */
static bfd_boolean
elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
{
if (note->descsz == sizeof (elfcore_psinfo_t))
{
elfcore_psinfo_t psinfo;
memcpy (&psinfo, note->descdata, sizeof (psinfo));
#if defined (HAVE_PSINFO_T_PR_PID) || defined (HAVE_PRPSINFO_T_PR_PID)
elf_tdata (abfd)->core->pid = psinfo.pr_pid;
#endif
elf_tdata (abfd)->core->program
= _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
sizeof (psinfo.pr_fname));
elf_tdata (abfd)->core->command
= _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
sizeof (psinfo.pr_psargs));
}
#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
else if (note->descsz == sizeof (elfcore_psinfo32_t))
{
/* 64-bit host, 32-bit corefile */
elfcore_psinfo32_t psinfo;
memcpy (&psinfo, note->descdata, sizeof (psinfo));
#if defined (HAVE_PSINFO32_T_PR_PID) || defined (HAVE_PRPSINFO32_T_PR_PID)
elf_tdata (abfd)->core->pid = psinfo.pr_pid;
#endif
elf_tdata (abfd)->core->program
= _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
sizeof (psinfo.pr_fname));
elf_tdata (abfd)->core->command
= _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
sizeof (psinfo.pr_psargs));
}
#endif
else
{
/* Fail - we don't know how to handle any other
note size (ie. data object type). */
return TRUE;
}
/* Note that for some reason, a spurious space is tacked
onto the end of the args in some (at least one anyway)
implementations, so strip it off if it exists. */
{
char *command = elf_tdata (abfd)->core->command;
int n = strlen (command);
if (0 < n && command[n - 1] == ' ')
command[n - 1] = '\0';
}
return TRUE;
}
从内核代码中可以看到,gdb显示的信号就是内核填充的信号。那么是不是所有的coredump文件都有信号呢?内核生成的coredump文件的确如此,因为在内核中只有信号才会触发coredump文件生成。不过因为gdb可以随时生成被调试进程的core文件,所以不是每个core文件都有合法的信号信息。
从数据结构上看,core文件中记录的进程信息只有80个字节,如果命令行太长通过coredump文件显示就不全。
///@file: linux-3.12.6\include\uapi\linux\elfcore.h
struct elf_siginfo
{
int si_signo; /* signal number */
int si_code; /* extra code */
int si_errno; /* errno */
};
/*
* Definitions to generate Intel SVR4-like core files.
* These mostly have the same names as the SVR4 types with "elf_"
* tacked on the front to prevent clashes with linux definitions,
* and the typedef forms have been avoided. This is mostly like
* the SVR4 structure, but more Linuxy, with things that Linux does
* not support and which gdb doesn't really use excluded.
* Fields present but not used are marked with "XXX".
*/
struct elf_prstatus
{
#if 0
long pr_flags; /* XXX Process flags */
short pr_why; /* XXX Reason for process halt */
short pr_what; /* XXX More detailed reason */
#endif
struct elf_siginfo pr_info; /* Info associated with signal */
short pr_cursig; /* Current signal */
unsigned long pr_sigpend; /* Set of pending signals */
unsigned long pr_sighold; /* Set of held signals */
#if 0
struct sigaltstack pr_altstack; /* Alternate stack info */
struct sigaction pr_action; /* Signal action for current sig */
#endif
pid_t pr_pid;
pid_t pr_ppid;
pid_t pr_pgrp;
pid_t pr_sid;
struct timeval pr_utime; /* User time */
struct timeval pr_stime; /* System time */
struct timeval pr_cutime; /* Cumulative user time */
struct timeval pr_cstime; /* Cumulative system time */
#if 0
long pr_instr; /* Current instruction */
#endif
elf_gregset_t pr_reg; /* GP registers */
#ifdef CONFIG_BINFMT_ELF_FDPIC
/* When using FDPIC, the loadmap addresses need to be communicated
* to GDB in order for GDB to do the necessary relocations. The
* fields (below) used to communicate this information are placed
* immediately after ``pr_reg'', so that the loadmap addresses may
* be viewed as part of the register set if so desired.
*/
unsigned long pr_exec_fdpic_loadmap;
unsigned long pr_interp_fdpic_loadmap;
#endif
int pr_fpvalid; /* True if math co-processor being used. */
};
///@file: linux-3.12.6\fs\binfmt_elf.c
static int fill_note_info(struct elfhdr *elf, int phdrs,
struct elf_note_info *info,
siginfo_t *siginfo, struct pt_regs *regs)
{
///....
fill_prstatus(info->prstatus, current, siginfo->si_signo);
///....
}
///@file: linux-3.12.6\include\uapi\linux\elfcore.h
#define ELF_PRARGSZ (80) /* Number of chars for args */
struct elf_prpsinfo
{
char pr_state; /* numeric process state */
char pr_sname; /* char for pr_state */
char pr_zomb; /* zombie */
char pr_nice; /* nice val */
unsigned long pr_flag; /* flags */
__kernel_uid_t pr_uid;
__kernel_gid_t pr_gid;
pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
/* Lots missing */
char pr_fname[16]; /* filename of executable */
char pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
};
在gdb的源代码中,有一段关于coredump文件比较精辟的描述:简言之,core文件就是一个标准的ELF格式文件,只不过是以执行(即进程运行过程中)的角度观察到的视图,而不是链接器看到的静态文件视图。当然,反过来说,core文件中必然包含了进程特有的、而可执行文件不可能有的信息:例如寄存器状态这些信息在一个静态的可执行文件中必然是不存在的。虽然这些看起来比较特殊,但是并不意味着它们不可以放在efl文件格式中。正如调试器使用的DWARF格式一样,ELF格式也具有良好的扩展性和兼容性,所以这些自定义格式的运行时信息同样可以放入core文件中。再直接一点说,就是通过在ELF文件中定义专用的、特殊的NOTE节来存储,这些节可以使用约定的、特殊的节名来进行标识和区分。
///@file: gdb-10.1\bfd\elfcore.h
/* Core files are simply standard ELF formatted files that partition
the file using the execution view of the file (program header table)
rather than the linking view. In fact, there is no section header
table in a core file.
The process status information (including the contents of the general
register set) and the floating point register set are stored in a
segment of type PT_NOTE. We handcraft a couple of extra bfd sections
that allow standard bfd access to the general registers (.reg) and the
floating point registers (.reg2). */
在本文的开始也说明了stackoverflow上给出的解决方案,就是通过gdb的Convenience Variables(伴手变量?)gdb官方文档说明,也就是gdb内置的变量可以看到这个信号信息。
至于命令行参数信息,在core文件中依然可以通过info proc来显示完整的命令行参数(当然也可以通过info reg查看寄存器信息)。
通过$_siginfo(注意前面的$引导符)可以看到信号描述,其中有信号数值(si_signo = 11)和地址信息(_sigfault = {si_addr = 0x1),但是info proc同样只是保存了最多80个字符,而完整的命令行信息在core文件中并没有保存,所以完整的信息需要从main函数的argv中找。
tsecer@harry: cat -n gdb.core.info.recurr.cpp
1 int main(int argc, const char *argv[])
2 {
3 return *(int*)(0 + 1) = 0;
4 }
tsecer@harry: gcc -g gdb.core.info.recurr.cpp
tsecer@harry: ./a.out 1 2 3 43 5 4 5 46 5 757 6 7 68 7 87 9 8 9 8 98 0 d f ds fw as dfs f sd sg s gs
段错误 (core dumped)
tsecer@harry: gdb -c core.11622 --quiet
[New LWP 11622]
Core was generated by `./a.out 1 2 3 43 5 4 5 46 5 757 6 7 68 7 87 9 8 9 8 98 0 d f ds fw as dfs f sd'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00000000004004e7 in ?? ()
(gdb) info proc
exe = './a.out 1 2 3 43 5 4 5 46 5 757 6 7 68 7 87 9 8 9 8 98 0 d f ds fw as dfs f sd'
(gdb) p $_siginfo
$1 = {si_signo = 11, si_errno = 0, si_code = 1, _sifields = {_pad = {1, 0 <repeats 27 times>}, _kill = {si_pid = 1, si_uid = 0}, _timer = {si_tid = 1, si_overrun = 0, si_sigval = {
sival_int = 0, sival_ptr = 0x0}}, _rt = {si_pid = 1, si_uid = 0, si_sigval = {sival_int = 0, sival_ptr = 0x0}}, _sigchld = {si_pid = 1, si_uid = 0, si_status = 0, si_utime = 0,
si_stime = 0}, _sigfault = {si_addr = 0x1, _addr_lsb = 0, _addr_bnd = {_lower = 0x0, _upper = 0x0}}, _sigpoll = {si_band = 1, si_fd = 0}}}
(gdb) p *argv@argc
$4 = {0x7fffe28f15fc "./a.out", 0x7fffe28f1604 "1", 0x7fffe28f1606 "2", 0x7fffe28f1608 "3", 0x7fffe28f160a "43", 0x7fffe28f160d "5", 0x7fffe28f160f "4", 0x7fffe28f1611 "5",
0x7fffe28f1613 "46", 0x7fffe28f1616 "5", 0x7fffe28f1618 "757", 0x7fffe28f161c "6", 0x7fffe28f161e "7", 0x7fffe28f1620 "68", 0x7fffe28f1623 "7", 0x7fffe28f1625 "87", 0x7fffe28f1628 "9",
0x7fffe28f162a "8", 0x7fffe28f162c "9", 0x7fffe28f162e "8", 0x7fffe28f1630 "98", 0x7fffe28f1633 "0", 0x7fffe28f1635 "d", 0x7fffe28f1637 "f", 0x7fffe28f1639 "ds", 0x7fffe28f163c "fw",
0x7fffe28f163f "as", 0x7fffe28f1642 "dfs", 0x7fffe28f1646 "f", 0x7fffe28f1648 "sd", 0x7fffe28f164b "sg", 0x7fffe28f164e "s", 0x7fffe28f1650 "gs"}
(gdb)
大家好,又见面了,我是你们的朋友全栈君。很多小伙伴发现禁用Windowsupdate服务后没几天又自动开启,无法禁用自动更新就是因为Windowsupdatemedicservice服务导致,但是在禁用Windowsupdatemedicservice服务的时候又出现拒绝访问,如下 解决方法:方法一:CMD命令1、首先使用Win+R组合快捷键,打开运行对话框,然后输入命令cmd,点击下方的“确定”打开服务,如下图所示。 复制这条命令 REGadd“HKLM\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc”/v“Start”/tREG_DWORD/d“4”/f 2、右键点击粘贴,然后回车 方法二:修改注册列表1、首先使用Win+R组合快捷键,打开运行对话框,然后输入命令regedit,点击下方的“确定”打开服务,如下图所示。 2、在注册表设置中,找到并定位到“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc”,右侧找到“Start”键,右键点击“修改”,将
将自然语言转换为SQL语句已经不再遥不可及。NLP的进步使得我们不仅可以使用LLM(大型语言模型),还可以通过微调教授他们新的技能,这也被称为迁移学习。可以使用一个预先训练的模型作为起点,然后使用较小的标记数据集从而获得比单独使用数据训练更好的性能。在本文中,我们将使用谷歌的文本到文本生成模型T5和我们的自定义数据进行迁移学习,这样它就可以将基本问题转换为SQL查询。我们将在T5中添加一个名为:将英语翻译为SQL的新任务,它可以转换以下示例查询:Carsbuiltafter2020andmanufacturedinItaly复制将输出一下SQL语句SELECTnameFROMcarsWHERElocation='Italy'ANDdate>2020复制创建训练数据与翻译数据集不同,我们可以在模板的帮助下以编程方式自动构建训练的数据集,下面是整理出来的一些模板:templates=[ ["[prop1]of[nns]","SELECT[prop1]FROM[nns]"], ["[agg][prop1]foreac
2021开年巨献——系列文章《AI入行那些事儿》,为您讲述:人工智能的基础原理、发展历程、当前应用成为AI技术人员所需的入门技能和学习途径以及求职、面试的全过程什么是人工智能在说到人工智能时,大家是否会想到斯皮尔伯格导演的一部电影——《人工智能》?在这部电影中,主人公是个以小男孩形象出现的机器人,能说话,能走路,能做很多复杂的事情。这也是很多人想象中的,人工智能的样子,那么,实际的人工智能真的是这个样子吗?本书中要谈的人工智能又是什么呢?这部电影的英文名是《ARTIFICIALINTELLIGENCE》,这也是本书中要谈的“人工智能”的英文名,它的缩写“AI”现在大家耳熟能详。然而,在现实中,人们还无法制造出电影里描述的那种机器人。我们所说的人工智能,一般是这样定义的:由人所制造出来的机器所表现出来的智能。说得具体一点,如果一台机器能够以一种完全自如的方式(比如可以用人类的语言直接给机器下达指令,而不需要输入专门为机器编制的指令代码)来完成一件事情(哪怕是一件很小的事情),那么我们就可以说这台机器实现了人工智能。“人工智能”这个词由“人工”和“智能”两部分组成: “人工”的意思是人工智
原文链接:http://tecdat.cn/?p=14569每次我们在应用计量经济学课程中遇到实际应用时,我们都要处理类别变量。学生也提出了同样的问题:我们如何自动组合因子水平?有简单的R函数吗?因此我想编写一个R函数。为了说明这一点,请考虑以下内容'data.frame': 200obs.of3variables: $y:num1.3451.8631.9462.4810.765... $x1:num0.2660.3720.5730.9080.202... $x2:Factorw/10levels"I","A","H","F",..:4464367348... table(b$x2)[LETTERS[1:10]] ABCDEFGHIJ 1112233423361232314复制没有定义一个(连续的)因变量,没有定义一个连续的协变量,也没有定义一个分类变量,此处有十个级别。我们可以使用plot(b$x1,y,col="white",xlim=c(0,1.1)) te
最近总想着发点什么,一直没时间 发个干货SPLE证明我还活着……佛系修仙ing Spring表达式语言(简称SpEL)是一个支持运行时查询和操作对象图的强大的表达式语言。其语法类似于统一EL,但提供了额外特性,显式方法调用和基本字符串模板函数。 同很多可用的Java表达式语言相比,例如OGNL,MVEL和JBoss EL,SpEL的诞生是为了给Spring社区提供一个可以给Spring目录中所有产品提供单一良好支持的表达式语言。其语言特性由Spring目录中的项目需求驱动,包括基于eclipse的SpringSource套件中的代码补全工具需求。那就是说,SpEL是一个基于技术中立的API允许需要时与其他表达式语言集成。 SpEL作为Spring目录中表达式求值的基础,它并不是直接依赖于Spring而是可以被独立使用。为了能够自包含,本章中的许多示例把SpEL作为一个独立的表达式语言来使用。这就需要创建一些如解析器的引导基础组件类。大多数Spring用户只需要为求值编写表达式字符串而不需要关心这些基础组件。一个典型的使用例子是集成SpEL和创建基于XML或注解的bean定义 效果图 这
写在前面Gitlab的CI/CD[1]是通过Gitlabrunner执行器实现的,它作为执行器运行我们在.gitlab-ci.yml中定义的一些逻辑行为。前面三篇讲述的是Gitlab的安装、通过一个flaskweb框架服务进行代码兼容性检查、编译、部署的整个pipeline.此处,介绍一下通过Gitlab的template实现类似如Jenkinssharelibrary[2]的功能。Gitlabtemplate将一些CICD中共有的方法提取出来作为一个公共的模块提供给其他的需要的项目使用,这些原理与GithubAction里面的uses指令类似,不了解GitlabAction的同学如果想学习基础并快速上手的可以参考官方GithubAction使用文档[3]在当前项目引入其他的构建模块你需要了解file,template,remote,extends这些pipeline语法的支持:file当前项目的.gitlab-ci.yml可以从另一个项目下引入include: -project:DevOpsTeam/cicdtemplate ref:master file:'.gitlab
Zynq-7000ARM端MIO的使用作者:OpenSLee1背景知识XilinxZynq-7000芯片的PS端MIO(multiuseI/O)所在位置如下图红色框所示。MIO(0:15)在bank0上,MIO(16:53)在bank1上。他们不需要管脚约束,既可以当做PS端普通的IO也可以用做PS端SPI、I2C、CAN等总线。本节将使用MIO的GPIO功能实现LED流水灯。 2MIO流水灯实验对于工程的创建在此不再赘述。可参考《Zynq-7000ARM端helloworld实验》1)ZYNQ7ProcessingSystemGPIO的设置点击MIOConfiguration>>选中GPIOMIO如下图所示。其他配置根据自己的开发板设置。2)生成processing_system7_0 3)launchSDK (1)首先选中system右键选中GenerateOutputProducts...(2)选中system右键选中CreateHDLWrapper...(3)导出硬件选择菜单File->Export->ExportHardware...。这里不包括bit
序本文主要研究一下sharding-jdbc的ShardingTracerShardingTracerincubator-shardingsphere-4.0.0-RC1/sharding-opentracing/src/main/java/org/apache/shardingsphere/opentracing/ShardingTracer.java@NoArgsConstructor(access=AccessLevel.PRIVATE) publicfinalclassShardingTracer{ privatestaticfinalStringOPENTRACING_TRACER_CLASS_NAME="org.apache.shardingsphere.opentracing.tracer.class"; /** *Initializeshardingtracer. */ publicstaticvoidinit(){ StringtracerClassName=System.getProperty(OPENTRACING_TRACER_CLASS
EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行。得到了Google和Yourkit的支持。生成的测试cases的运行依赖由EvoSuite生成的测试cases需要EvoSuite框架的runtime包支持才能进行测试,因此要在工程中加入如下的Maven依赖<dependency> <groupId>org.evosuite</groupId> <artifactId>evosuite-standalone-runtime</artifactId> <version>1.0.6</version> <scope>test</scope> </dependency>复制注意:EvoSuite的bytecodeinstrumentation和类似Jacoco这类工具在bytecodeinstrumentation上有可能有冲突,导致最后的覆盖率统计都是0bytecod
介绍分布式计算简单来说,是把一个大计算任务拆分成多个小计算任务分布到若干台机器上去计算,然后再进行结果汇总。目的在于分析计算海量的数据,从雷达监测的海量历史信号中分析异常信号(外星文明),淘宝双十一实时计算各地区的消费习惯等。海量计算最开始的方案是提高单机计算性能,如大型机,后来由于数据的爆发式增长、单机性能却跟不上,才有分布式计算这种妥协方案。因为计算一旦拆分,问题会变得非常复杂,像一致性、数据完整、通信、容灾、任务调度等问题也都来了。举个例子,产品要求从数据库中100G的用户购买数据,分析出各地域的消费习惯金额等。如果没什么时间要求,程序员小明就写个对应的业务处理服务程序,部署到服务器上,让它慢慢跑就是了,小明预计10个小时能处理完。后面产品嫌太慢,让小明想办法加快到3个小时。 平常开发中类似的需求也很多,总结出来就是,数据量大、单机计算慢。如果上Hadoop、storm之类成本较高、而且有点大才小用。当然让老板买更好的服务器配置也是一种办法。利用分片算法小明作为一个有追求有理想的程序员,决定用介于单机计算和成熟计算框架的过度解决方案,这样成本和需求都能满足了。分布式计算的核心在于
今年4月,英特尔公司与中国文物保护基金会建立合作,宣布采用人工智能基于以及无人机技术实施对于箭扣长城的修缮和保护。视频内容科技如何跨界文物保护?人工智能解决了哪些大问题?以下问答,帮你答疑解惑。 ||问:双方合作的具体内容是什么?答:英特尔公司与中国文物保护基金会将运用英特尔人工智能和英特尔无人机技术实施长城保护项目,以前所未有的方式保护这一世界纪念性建筑遗产。借助英特尔人工智能技术、英特尔猎鹰8+无人机技术以及英特尔®至强®可扩展平台,双方通过高清图像、数据和3D建模来对箭扣长城的城墙进行远程检查和制图,为其修缮、维护提供指导,并为以后的工作提供预测数据。||问:双方的合作契机在哪里?答:科技迅猛发展,人工智能等前沿技术正在以一种近乎革命性的手段解决生活中真实存在的难题。中国文物保护基金一直担任着保护长城的职责,致力于传承这项伟大的世界奇迹。但在实际实施长城保护的过程中,传统方式具有很大的局限性。中国文物保护基金尝试利用新技术来突破障碍,而英特尔的人工智能技术恰恰可以帮助探索解决困难。新的方法可以将长城的保护工作推到新的高度。||问:保护长城的传统做法是什么?有什么困难和挑战?答:如
技术PL/SQL提高文件操作功能作者:StevenFeuersteinOracle9i第2版中的UNT_FILE提高了文件输入/输出(I/O)功能。有些人可能会说你可以在Oracle数据库中包含和表示整个世界,甚至是整个宇宙。这或许是真的,但我们中仍有一些人希望能够从我们的PL/SQL程序内部处理操作系统(OS)文件。有了这个愿望,开发人员在很长时间内就同UTL_FILE包之间有了一种爱憎交加的关系。相关链接 Oracle技术网站(OTN)上关于UTL_FILE的示例 otn.oracle.com/oramag/utl_file.html几年来,UTL_FILE提供了一种在PL/SQL中读写文件的途径。但是,开发团体中的一些人希望能有进一步的发展,而不是仅停留在在文件中依次读写行的层次上。有些开发人员希望能够对文件进行删除、重命名以及执行其他与文件相关的典型操作,但是UTL_FILE并不支持这些操作。Oracle9i第2版对这些讨厌的UTL_FILE限制进行了改进。本文探讨了Oracle9i第2版在UTL_FILE包中增加的一些非常有用的新功能,包括:UTL_FILE.FREMOVE删
说了这么多,我们来以flamingo的服务器程序的网络框架设计为例来验证上述介绍的理论。flamingo的网络框架是基于陈硕的muduo库,改成C++11的版本,并修改了一些bug。在此感谢原作者陈硕。flamingo的源码可以在这里下载:https://github.com/baloonwj/flamingo,打不开github的可以移步csdn:http://download.csdn.net/detail/analogous_love/9805797。上文介绍的核心线程函数的while循环位于eventloop.cpp中:voidEventLoop::loop() { assert(!looping_); assertInLoopThread(); looping_=true; quit_=false;//FIXME:whatifsomeonecallsquit()beforeloop()? LOG_TRACE<<"EventLoop"<<this<<"startlooping"; while(!qui
推荐一个影视资源检索网站:大树的影仓,不提供在线观看功能噢,只提供资源搜索及下载功能,界面很简洁,而且绝对干净,(肉鸡站点,大佬抬手)。有多干净呢?知名的广告屏蔽插件uBlockOrigin扫描到0条需要拦截的请求信息,可看下图。ublockOrigin站点数据库为2021年11月之前的,所以对于一些最新的影视资源是没有滴(老实交代)。不过有后期拓展现有资源库以及提供在线播放链接的打算,算是放在二期工程里了。站点首页首页只有个标题和搜索框,不过也有不简洁的地方,就是右下角的二维码和网站底部的一些基本信息了。站点首页资源搜索页资源搜索页搜索结果页搜索是按照关键词进行的,匹配资源的中文名称、英文名称、以及其他不同地区的翻译名称。 搜索结果页 下载链接 页面里唯一的弹窗页,还好不是广告。下载链接展示了所有格式的资源信息,以及相关资源的下载方式。 资源下载页 版权声明重申:站点不存放任何资源信息,详细声明查看页面“版权声明”点击https://movie.beatree.cn/#/访问网站
1、Trie树的定义 Trie树(又叫「前缀树」或「字典树」)是一种用于快速查询「某个字符串/字符前缀」是否存在的数据结构。 Trie是一颗非典型的多叉树模型。 其核心是使用「边」来代表有无字符,使用「点」来记录是否为「单词结尾」以及「其后续字符串的字符是什么」。 2、Trie树的结构 2.1二维数组 一个朴素的想法是直接使用「二维数组」来实现Trie树。 使用二维数组trie[]来存储我们所有的单词字符。 使用index来自增记录我们到底用了多少个格子(相当于给被用到格子进行编号)。 使用count[]数组记录某个格子被「被标记为结尾的次数」(当id编号的格子被标记了n次,则有cnt[idx]=n)。 classTrie{ intN=100009;//直接设置为十万级 int[][]trie; int[]count; intindex; publicTrie(){ trie=newint[N][26]; count=newint[N]; index=0; } publicvoidinsert(Strings){ intp=0; for(inti=0;i<s.lengt
今天在阿里云虚拟机上部署新站点后出现下面的错误: CompilerErrorMessage:CS0016:Couldnotwritetooutputfile'c:\Windows\Microsoft.NET\Framework64\v4.0.30319\TemporaryASP.NETFiles\root\xx'--'Accessisdenied.'复制 找遍了网上的资料最后总结为以下几步:: Cleanedthe"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\TemporaryASP.NETFiles"folder GaveFullpermissionstoIIS_IUSRSgroup GaveFullpermissionsto"Everone" Ranthefollowingcommandtoo:%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis-i 郁闷的是都没能解决我的问题,最后给"C:\Windows\Temp"文件夹加上IIS_IU
安装 Java调用 mongodb-linux-x86_64-3.6.3.tgz 把下载好的mongodb包解压到/usr/local/,重命名为mongodb tar-xvfmongodb-linux-x86_64-3.6.3.tgz mvmongodb-linux-x86_64-3.6.3mongodb mkdir/data/mongodb vi/usr/local/mongodb/mongodb.conf port=27017#端口 dbpath=/data/mongodb#数据库存文件存放目录 logpath=/usr/local/mongodb/mongodb.log#日志文件存放路径 logappend=true#使用追加的方式写日志 fork=true#以守护进程的方式运行,创建服务器进程 maxConns=100#最大同时连接数 noauth=true#不启用验证 journal=true#每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。 bind_ip=0.0.0.0#这样就可外部访问 复制 创建软连接 ln-s/usr/local
Thistopicdescribeshowtocustomizethepersistentclassusedtostorereportstoassociateadditionalinformationwithreportobjects.Forinstance,addingtheCategorypropertywillresultinanadditionalcolumnintheReportsListView,andenduserswillbeabletogroup,sortorfilterbycategories. 本主题介绍如何自定义用于存储报表的持久性类,以便将其他信息与报表对象相关联。例如,添加"类别"属性将导致报表列表视图中出现另一列,最终用户将能够按类别进行分组、排序或筛选。 WinForms: ASP.NET: Inthistopic,itisassumedthatyouhaveanXAFapplicationthatusestheReportsV2Module,andyouhavecreatedoneormorereports(seeReportsV2M
为什么要有这篇文章呢? 个人在不断实践中越发觉得,单元测试对于代码质量的保障真的太有意义了,至少能体现在如下两个方面: ①让你写出更好的代码,可测试的代码一定是优雅的代码(为了可测试,你必须要解耦,必须要遵循较好的设计模式) ②让你重构之类的操作更加放心,因为测试会告诉你影响了哪些功能点 所以想简单写写关于单元测试的一些基础相关东西 单元测试是什么? 也不想上网找定义,就说说大概自己的几点理解: 单元测试是单元的,即只是对一个系统里某个特定模块(或者方法)有限条件下(比如某个if分支)的测试 单元测试不应该依赖任何外部系统(如网络/数据库甚至是时间)所有依赖都应该通过依赖注入的形式获取 单元测试是可以重放的,一次成功后任意情况重试应该也总是成功的 举个栗子 为了说明白单元测试,下面写一个简单的代码 首先他的功能很简单,返回当天是什么时刻(上午/下午之类的),具体需求就是 0到6点返回“晚上”6到12点返回“上午”12到18点返回”下午”18点到24点显示”傍晚”(别纠结谁家傍晚还能到24点这种细节了) 此时我们可能会写出如下代码: 1publicstrin
Class文件结构 魔数4bits确定该文件是否是可接受的Class文件(0xCAFEBABE) 版本号4bits包括次版本号和主版本号 常量池包括字面量(文本字符串,声明为final的常量值)和符号引用(类和接口的全限定名,字段的名称和描述符,方法的名称和描述符) 访问标志2bits标志识别类或者接口层次的访问信息,如类是否为public,是否为abstract,是否为final,是Class还是Interface。 类索引父索引与接口索引集合用于确定这个类的继承关系 字段表集合包括用于描述接口或类中声明得变量,包括publicprivateprotectedstaticfinalvolatiletransientsynthetic(字段是否为编译器自动产生)enum,以及变量简要名称和类型描述符(基本类型,数组)。 方法表集合类似字段表集合,包括前缀,简要名称,类型描述符,不包含方法中的代码。 属性表存放多种属性,如方法中的代码存在Code属性中,操作栈深度最大值,exception等。 类加载机制 类加载的整个生命周期:加载,验证,准备,解析,初始化,使用,卸载 对类初始化的