我稍微浏览了一下 Stackoverflow 和更广泛的互联网,发现导致此错误的最常见原因是声明( int var = 1;) 和定义( int var;) 的合并,以及包含文件.c中的文件.h。
我刚刚从一个文件分成几个文件的小项目没有做任何这些事情。我很困惑。
我制作了该项目的副本,并删除了副本中的所有代码(这很有趣),直到到达这里:
#include "a.h"
int main() {
}
Run Code Online (Sandbox Code Playgroud)
#ifndef A_H
#define A_H
int test;
#endif
Run Code Online (Sandbox Code Playgroud)
#include "a.h"
Run Code Online (Sandbox Code Playgroud)
几乎是规范的,对吧?但是...
$ rm *.o; gcc -g -c a.c; gcc -g -c main.c; gcc -o main main.o a.o
/usr/bin/ld: a.o:/.../a.h:5: multiple definition of `test'; main.o:/.../a.h:5: first defined here
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
瓦特:(
大约在这个时候,我开始质疑我的配置,并尝试了另一台机器,通过 NFS …
下面的CSS,施加到一个<a>与一个<div>驻留在个人<tr>▶ <td>在一个元件<table>(与border-collapse和td { padding: 0px; }设定)时,按预期方式工作:
a {
background-image: url("http://ibin.co/19rwR69EOigr");
height: 100px;
width: 120px;
display: block;
}
div {
width: 200px;
box-shadow: #000 0px 0px 13px;
}
Run Code Online (Sandbox Code Playgroud)
如果我对它应用任何不透明度<a>,浏览器的内部分层似乎可怕地破坏.
请注意,即使在第一个示例中,测试图片的最后一个像素也位于<div>s 内box-shadow.(它说opacity = ".99",如果你在图像中看不到它.>.)
这可能是一个渲染错误,已成功蔓延到Firefox 和 Chrome?:P
提前致谢!
我有一个程序可以同时读取两个输入文件.我想从标准输入中读取该程序.我以为我会用这样的东西:
$program1 <(cat) <($program2)
Run Code Online (Sandbox Code Playgroud)
但我刚刚发现了
cat <(cat)
Run Code Online (Sandbox Code Playgroud)
产生
....
mmap2(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb758e000
read(0, 0xb758f000, 131072) = -1 EIO (Input/output error)
....
cat: -: Input/output error
Run Code Online (Sandbox Code Playgroud)
同样地,
$ cat <(read -n 1)
bash: read: read error: 0: Input/output error
Run Code Online (Sandbox Code Playgroud)
所以...... Linux无法进入read系统调用级别.那很有意思.是bash不是将stdin连接到子壳?:(
这个问题有方法解决吗?我特别需要使用进程替换(... <(...)格式),因为$program1(tail顺便说一下)需要文件,我需要od在标准输入上做一些预处理(with )才能传递给它tail- 我不能只指定/dev/stdin等等.
编辑:
我真正想要做的是从一个文件(另一个进程将写入)读取,同时我也从标准输入读取,所以我可以接受命令等.我希望我能做到
tail -f <(od -An -vtd1 -w1) <(cat fifo)
Run Code Online (Sandbox Code Playgroud)
同时从标准输入和 FIFO中读取并将其放入单个stdout流中,我可以通过awk(或类似的)运行.我知道我可以用任何脚本语言解决这个问题,但我喜欢学习如何 …
我目前正在将一些 HTTP 处理构建到 C 程序(在 Linux 上使用 glibc 编译)中,该程序将位于 nginx 实例后面,并认为sscanf在这种情况下我应该安全地将参数标记化推迟到。
我很高兴地发现从 URI 中提取查询非常简单:
char *path = "/events?a=1&b=2&c=3";
char query[64] = {0};
sscanf(path, "%*[^?]?%64s HTTP", query); // query = "a=1&b=2&c=3"
Run Code Online (Sandbox Code Playgroud)
但我很惊讶的速度有多快的事情成为我??????ň???? T'ê????? R'E'ST ??? ???我???ň?g ^ :(
int pos = -1;
char arg[32] = {0}, value[32] = {0};
int c = sscanf(query, "%32[^=]=%32[^&]&%n", &arg, &value, &pos);
Run Code Online (Sandbox Code Playgroud)
对于 的输入a=1&b=2,我得到arg="a", value="1", c=2, pos=4。完美:我现在可以重新运行 sscanfpath + pos以获得下一个参数。为什么我在这里?
好了,而a=1&的行为相同以上,a=1 …
我已经四处查看,发现WebSQL的未来似乎有些艰难。
一方面,由于实际上每个实际实现都只使用SQLite3,因此它显然被广泛视为一种解决方案,因为该规范本身大量借鉴了SQLite3的设计语义,如果不专门使用SQLite3 将非常棘手。。
另一方面,自2017年2月起,所有主流浏览器似乎都支持它(http://caniuse.com/#search=websql)-Chrome已经有很长的历史了,它是在IE11 Edge 14中引入的,Firefox 50和Safari10。移动支持似乎也在积极发展(现在,只有注释说明它在某些三星手机上由于某些原因无法使用)。
IndexedDB背后的理论确实是有道理的:这是一个崭新的标准,不与任何现有库绑定,供应商可以设计自己的实现,进行竞争并避免供应商/库锁定。但是,我陷入了IndexedDB最不利的方面之一:由于实现开销,其抽象设计的性能似乎绝对是灾难性的。
http://scaljeri.github.io/indexeddb-vs-websql/v2.0.0/index.html是一键式IndexedDB-vs-WebSQL决战。我将其设置为10000个项目(一个相当适中的数字),并尝试使用我的ThinkPad T43-具有2GB RAM的单核2GHz PentiumM。
首先,除了运行Chromium之外,什么都没有执行,大多数选项卡都已挂起,其余选项卡未使用任何CPU:

在IndexedDB的整个“插入”时间内,该选项卡使用100%CPU,并且系统通常无法使用。(我可以浏览一下-屏幕重绘的速度确实很慢-但我并不是为了获得准确的基准)。
当我有很多其他事情发生时,我也碰巧在使用该选项卡,并且系统恰好要交换死机(在这台特定的机器上发生了很多事情):

然而,在整个过程中,WebSQL的性能令人难以置信。即使在系统进行大量交换(到较慢的HDD)时,插入一排行也需要三秒钟,并且系统I / O受到很大影响。(注意:默认情况下,我知道SQLite3会将所有数据强制刷新到磁盘上以确保完整性,但是我不确定Chrome的实现是否为WebSQL禁用了此选项。)
在https://nolanlawson.com/2015/09/29/indexeddb-websql-localstorage-what-blocks-the-dom/(自2015年9月起)完成的基准测试似乎与我在此处介绍的内容基本一致;它表明,在2013年的Macbook Air上,IndexedDB的性能明显比WebSQL差。
考虑到这些考虑因素,我有两个问题。
WebSQL 作为Web标准的实际未来是什么?SQLite3可以在任何地方(它是ANSI C)运行,并且WebSQL似乎得到了广泛支持(?)。
我的问题本来是要专门询问有关Chrome扩展程序的支持(请参阅下一点),但是现在我考虑了一下,如果我想要替代localStorage(及其5MB的限制),我想使用WebSQL作为主要解决方案,而很少(如果曾经)使用过IndexedDB或localStorage作为后备。通过这种方法,我成功的机会是什么?
浏览器供应商是否有可能很快放弃对网站和/或扩展的WebSQL支持?
我正处于Chrome扩展程序的设计初期,该程序需要存储可能大量的信息-它将管理历史记录/书签/等,这些数据将永远增长而永不缩减。我要在所有计算机上使用此扩展,包括上面显示的基准测试中的T43。
在我看来,这是WebSQL还是什么都没有;我不同意IndexedDB。如果WebSQL看起来将要消失,我将在Go或类似的服务器上制造一个小型应用服务器,然后简单地与之交谈。
同样,如果有一天WebSQL从Chrome随机“离开”,即使Web支持消失了,对它的扩展支持也将继续吗?
web-standards google-chrome-extension web-sql deprecation-warning
我最近发现base32、base64和base128是最有效的base- n编码形式,虽然base58、Ascii85、base91、base92等由于使用了更多字符而确实比普遍存在的base64提供了一些效率改进,但是一些映射损失;例如,base92 中的每个字符对恰好有 272 个索引,这些索引无法映射到以 10 为底的 2 的幂,因此完全被浪费了。(Base91 编码仅丢失 89 个字符(如上面链接中的脚本所示),但它已获得专利。)
如果能够在现代的现实场景中使用 base128,那就太好了。
0x21 (33) 到 0x7E (126) 之间有 92 个可用字符(不含 \和"),这为创建具有尽可能多字符的可 JSON 字符串提供了良好的开端。
以下是我设想的找到其余角色的几种方法。这就是我要问的问题。
就傻傻的用Unicode吧
可以使用两字节 Unicode 字符来填充剩余的 36 个所需索引。高度次优;如果这比网络上的 Base64 更糟糕,我不会感到惊讶。仅对 Unicode 字符计数场景有用,例如推文长度。不完全是我想要的。
从上限 (>128) ASCII 范围内选择 36 个非 Unicode 字符
JavaScript 是在字符编码配置偶尔会出现严重错误的情况下构建的。因此,该语言(和网络浏览器)可以很好地处理打印任意和不可打印的二进制数据。那么为什么不直接使用 ASCII 范围的上限呢?是要用的,对吧?
一个非常现实的问题可能是数据在我的浏览器和服务器之间通过 HTTP 传输并通过一个或多个开罐器代理。事情会变得多么糟糕?我知道几年前,甚至在今天,基于 HTTP 的 WebSocket 造成了一些真正的痛苦。
以有趣的方式使用 UTF-8
UTF-8 定义 1 到 4 字节长的序列来封装 Unicode 代码点。字节 2 到 4 …
javascript encoding bit-manipulation utf-8 character-encoding
我对PHP的套接字库有一个奇怪的问题:我似乎无法检测/区分服务器EOF,因此我的代码无助地进入无限循环.
进一步说明如下; 首先,一些背景(这里没有什么特别的花哨):
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8081);
for (;;) {
$read = [$socket];
$except = NULL;
$write = [];
print "Select <";
$n = socket_select($read, $write, $except, NULL);
print ">\n";
if (count($read)) {
print "New data: ";
#socket_recv($socket, $data, 1024, NULL);
$data = socket_read($socket, 1024);
print $data."\n";
}
print "Socket status: ".socket_strerror(socket_last_error())."\n";
}
Run Code Online (Sandbox Code Playgroud)
上面的代码只是连接到服务器并打印它读取的内容.它是我正在编写的小型套接字库中的缩减版本.
为了测试,我目前正在使用ncat -vvklp 8081绑定套接字并成为服务器.随着运行,我可以启动上面的代码,它连接和工作 - 例如,我可以键入ncat窗口,PHP接收它.(从PHP发送数据也有效,但我已将该代码排除在外,因为它不相关.)
然而,就在我的时刻^C ncat,上面的代码进入了一个硬无限循环 - 而且PHP说套接字上没有错误.
我试图弄清楚按钮在哪里打击PHP头部并使其意识到对等已断开连接.
socket_get_status()是一个很大的用词 - 它是别名stream_get_meta_data() …
我目前正在seek与一个在32位(x86)盒子上运行的C程序进行小规模的斗争.
具体来说,我似乎无法超越看似相当随意的文件偏移.
如果我做:
unsigned long long pos = 15032385535LLU;
int r = fseek(fd, pos, SEEK_SET);
Run Code Online (Sandbox Code Playgroud)
然后我会的
fstat64(3, {st_mode=S_IFREG|0644, st_size=1000000000000, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77c3000
_llseek(3, 2147479552, [2147479552], SEEK_SET) = 0
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4095) = 4095
Run Code Online (Sandbox Code Playgroud)
TL; DR可行.
但是,如果我增加pos的只是1 ...
unsigned long long pos = 15032385536LLU;
int r = fseek(fd, pos, SEEK_SET);
Run Code Online (Sandbox Code Playgroud)
......然后一切都惊人地崩溃了:
fstat64(3, {st_mode=S_IFREG|0644, st_size=1000000000000, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb771e000
_llseek(3, 18446744071562067968, …Run Code Online (Sandbox Code Playgroud)