小编jos*_*sch的帖子

CSS:隐藏元素但保持宽度(而不是高度)

  • display:none 将完全隐藏元素,就像它现在的宽度和高度为零一样
  • visibility:hidden 另一方面,将隐藏元素,但在文档中保留元素原始宽度和高度的矩形.

有没有办法通过纯CSS,隐藏一个元素,使其占据零高度,但其原始宽度?将其高度设置为零不起作用,因为我不知道将元素设置到哪个高度,我想再次显示它.

具体来说,我想实现以下目标:

#top ul        {take up zero height but original width}
#top:hover ul  {restore original dimensions}
Run Code Online (Sandbox Code Playgroud)

编辑:解决了!想法是设置height:auto恢复原始高度.

请参阅http://jsfiddle.net/yP59s/获取完整版本或此处的css:

ul {margin:0px}
#top {border:1px solid}
#top ul {height:0px;overflow:hidden}
#top:hover ul {height:auto;}
Run Code Online (Sandbox Code Playgroud)

和HTML:

<div id="top">
    <h1>foobar</h1>
    <ul>
        <li>foo</li>
        <li>bar</li>
    </ul>
</div>
blubber
Run Code Online (Sandbox Code Playgroud)

css height hide width

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

使用ctypes检索本机基类的地址

我希望能够将证书传递给Python的ssl库,而无需临时文件.似乎Python的ssl模块不能这样做.

要解决此问题,我想从本机模块中检索SSL_CTX存储在ssl._ssl._SSLContext类中的基础结构_ssl.使用ctypes然后我可以SSL_CTX_*使用该上下文从libssl 手动调用相应的函数.这里显示如何在C中执行此操作,我将通过ctypes执行相同的操作.

不幸的是,我陷入了我设法挂钩load_verify_locations函数的地步,ssl._ssl._SSLContext但似乎无法获得ssl._ssl._SSLContext结构实例的正确内存地址.load_verify_locations看到的所有函数都是父ssl.SSLContext对象.

我的问题是,如何从ssl.SSLContext对象的实例到本机基类的内存ssl._ssl._SSLContext?如果我愿意,我可以轻松访问其ctx成员.

到目前为止,这是我的代码.关于如何将本机Python模块进行monkeypatch的信用转到Lincoln Clarete的禁果项目

Py_ssize_t = hasattr(ctypes.pythonapi, 'Py_InitModule4_64') and ctypes.c_int64 or ctypes.c_int

class PyObject(ctypes.Structure):
    pass

PyObject._fields_ = [
    ('ob_refcnt', Py_ssize_t),
    ('ob_type', ctypes.POINTER(PyObject)),
]

class SlotsProxy(PyObject):
    _fields_ = [('dict', ctypes.POINTER(PyObject))]

class PySSLContext(ctypes.Structure):
    pass

PySSLContext._fields_ = [
        ('ob_refcnt', Py_ssize_t),
        ('ob_type', ctypes.POINTER(PySSLContext)),
        ('ctx', ctypes.c_void_p),
        ]

name = …
Run Code Online (Sandbox Code Playgroud)

ctypes monkeypatching cpython pyopenssl python-3.x

11
推荐指数
1
解决办法
327
查看次数

用多段三次贝塞尔曲线和距离以及曲率约束逼近数据

我有一些地理数据(下面的图像显示了河流的路径为红点),我想用多段三次贝塞尔曲线近似.通过对计算器等问题,在这里这里我发现由Philip J.施耐德从"图形宝石"的算法.我成功地实现了它并且可以报告即使有数千个点它也非常快.不幸的是,速度带来了一些缺点,即装配非常不合适.请考虑以下图形:

多段贝塞尔曲线

红点是我的原始数据,蓝线是由Schneider算法创建的多段贝塞尔曲线.如您所见,算法的输入是一个容差,至少与绿线表示的一样高.然而,该算法创建了具有太多急转弯的贝塞尔曲线.你也会在图像中看到这些不必要的急转弯.很容易想象,对于所示数据,具有较小急转弯的贝塞尔曲线,同时仍保持最大公差条件(仅将贝塞尔曲线稍微推向品红色箭头的方向).问题似乎是算法从我的原始数据中选取数据点作为各个贝塞尔曲线的终点(品红箭头指示一些嫌疑人).由于贝塞尔曲线的端点受到限制,很明显该算法有时会产生相当尖锐的曲率.

我正在寻找的是一种算法,它使用具有两个约束的多段贝塞尔曲线来近似我的数据:

  • 多段贝塞尔曲线绝不能超过数据点一定距离(由Schneider算法提供)
  • 多段贝塞尔曲线绝不能产生过于尖锐的曲率.检查此标准的一种方法是沿多段贝塞尔曲线滚动具有最小曲率半径的圆,并检查它是否沿其路径接触曲线的所有部分.虽然看起来有更好的方法涉及一阶和二阶导数叉积

我发现可以创造更好拟合的解决方案或者仅适用于单个贝塞尔曲线(并且省略了如何在多段贝塞尔曲线中找到每个贝塞尔曲线的良好起点和终点的问题)或者不允许最小曲率约束.我认为最小曲率约束是这里的棘手条件.

这是另一个例子(这是手绘而不是100%精确):

一些例子

让我们假设图1显示了两者,曲率约束(圆必须适合整个曲线)以及任何数据点与曲线的最大距离(恰好是绿色圆的半径).图2中红色路径的成功近似显示为蓝色.该近似值符合曲率条件(圆可以在整个曲线内滚动并在任何地方触摸它)以及距离条件(以绿色显示).图3显示了路径的不同近似值.虽然它符合距离条件但很明显圆圈不再适合曲率.图4显示了一条不可能用给定约束近似的路径,因为它太尖了.该示例应该说明为了正确地近似路径中的一些尖转弯,算法必须选择不属于路径的控制点.图3显示,如果选择沿路径的控制点,则不能再满足曲率约束.此示例还显示算法必须退出某些输入,因为无法使用给定的约束来近似它.

这个问题是否存在解决方案?解决方案不一定要快.如果需要一天时间来处理1000点,那就没问题了.解决方案也不必是最佳的,因为它必须导致最小二乘拟合.

最后,我将用C和Python实现它,但我也可以阅读大多数其他语言.

c python algorithm bezier approximation

9
推荐指数
2
解决办法
4891
查看次数

如何以与python2和python3一起使用的方式将utf8写入标准输出

我想写一个非ascii字符,让我们说?标准输出.棘手的部分似乎是我想要连接到该字符串的一些数据是从json读取的.考虑以下简单的json文档:

{"foo":"bar"}
Run Code Online (Sandbox Code Playgroud)

我包括这个因为如果我只是想打印?那么它似乎足以简单地写:

print("?")
Run Code Online (Sandbox Code Playgroud)

它将在python2和python3中做正确的事情.

所以我想打印foo与非ascii字符一起的值?.我发现这样做的唯一方法就是它在python2和python3中都有效:

getattr(sys.stdout, 'buffer', sys.stdout).write(data["foo"].encode("utf8")+u"?".encode("utf8"))
Run Code Online (Sandbox Code Playgroud)

要么

getattr(sys.stdout, 'buffer', sys.stdout).write((data["foo"]+u"?").encode("utf8"))
Run Code Online (Sandbox Code Playgroud)

重要的是不要错过u前面的?因为否则UnicodeDecodeError将被python2抛出.

使用这样的print功能:

print((data["foo"]+u"?").encode("utf8"), file=(getattr(sys.stdout, 'buffer', sys.stdout)))
Run Code Online (Sandbox Code Playgroud)

似乎没有用,因为python3会抱怨TypeError: 'str' does not support the buffer interface.

我找到了最好的方法还是有更好的选择?我可以使打印功能起作用吗?

python encoding stdout python-3.x

8
推荐指数
1
解决办法
1739
查看次数

如何为分叉的子进程禁用 Devel::Cover?

我注意到,当我运行我的程序与perl -MDevel::Cover=-silent,-nogcov foo.pl收集覆盖率信息foo.pl,我从我的节目的部分越来越庞大的减速是fork和exec非Perl程序一样targzipdpkg-deb。感谢这个问题,我想出了如何有选择地禁用 Devel::Cover,所以我现在写:

my $is_covering = !!(eval 'Devel::Cover::get_coverage()');
my $pid = fork();
if ($pid == 0) {
    eval 'Devel::Cover::set_coverage("none")' if $is_covering;
    exec 'tar', '-cf', ...
}
Run Code Online (Sandbox Code Playgroud)

这样做,每个测试减少了五分钟的运行时间,对于 122 个测试,我节省了 10 小时的计算时间。

不幸的是,我不能总是将此 eval 语句添加到分叉子进程中。例如,当我使用system(). 我想避免将每次system()调用都重写为手册fork/exec

有没有办法为我的分叉进程或基本上所有不是我的脚本的进程禁用 Devel::Cover foo.pl

谢谢!

perl code-coverage devel-cover

7
推荐指数
1
解决办法
101
查看次数

标题中的匿名前向声明冲突

编辑:将foo_t更改为foo作为typename,因为POSIX保留以_t EDIT结尾的类型:将_foo_s更改为foo_s,因为C声明以下划线开头的名称

我很困惑,最好的方法是同时拥有以下内容:

  1. 库实现可以看到struct成员,但库的用户却看不到
  2. 编译器检查标头中的函数定义是否与实现匹配
  3. 使用C99

我对此的第一次尝试是做以下事情:

foo.h(为简洁省略包含保护):

typedef struct foo_s foo;

struct foo_s;

foo* foo_create(void);
void foo_do_something(foo *foo);
Run Code Online (Sandbox Code Playgroud)

foo.c的:

#include "foo.h"

struct foo_s {
    /* some_hidden_members */
};

foo* foo_create() {
    /* allocate memory etc */
}

void foo_do_something(foo *foo) {
    /* do something with foo */
}
Run Code Online (Sandbox Code Playgroud)

这似乎与gcc一起使用.每个人foo.h只看到匿名前向声明和真正的布局struct foo_s只有在foo.c.

当我尝试使用include-what-you-use使用clang时,我开始闻到上述的奇怪之处.当我用它来检查foo.c它时告诉我不foo.h应该包含前向声明struct foo_s.我认为这是iwyu中的一个错误,因为很明显这对任何包含的人来说都不是问题foo.h.

在这一点上,让我从一开始就提出我的第二个要求.foo.c包括,foo.h以便编译器可以确保声明的每个函数foo.h匹配实现foo.c.我想我需要这个,因为我经常遇到分段错误,因为我的实现的函数签名与其他代码使用的头文件中的函数签名不匹配.

后来我尝试用clang编译代码(我编译-Wall -Wextra -Werror …

c gcc c99 clang forward-declaration

5
推荐指数
1
解决办法
480
查看次数

如何无损连接ogg vorbis文件?

我正在尝试将多个ogg vorbis文件连接成一个.

我知道理论上它应该足够了:

cat 1.ogg 2.ogg > combined.ogg
Run Code Online (Sandbox Code Playgroud)

但这有缺点:

  • 并非所有玩家都支持这样创建的文件(gstreamer不支持)
  • 这样做的球员,不能顺利连接他们,但会创造丑陋的分裂第二次暂停
  • 寻求似乎不可能

我不想放松质量,所以我可以将它们重新编码为像flac这样的无损格式,但这会让文件大小爆炸.

似乎没有工具可以做到这一点.例如,oggCat将重新编码音频,从而导致质量轻微下降,并且ffmpeg concat demuxer不适用于所有输入文件.我打开这个超级用户的问题来找到一个工具,但当我发现没有工具时写了我自己的工具.

所以我尝试使用libogg和libvorbis手动将输入文件中的ogg数据包连接到输出文件的ogg页面.假设是,所有ogg输入文件都使用完全相同的参数进行编码.

我想出了以下代码:

#include <ogg/ogg.h>
#include <vorbis/codec.h>
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <time.h>

int read_page(int fd, ogg_sync_state *state, ogg_page *page)
{
    int ret;
    ssize_t bytes;

    while(ogg_sync_pageout(state, page) != 1) {
        char *buffer = ogg_sync_buffer(state, 4096);
        if (buffer == NULL) {
            fprintf(stderr, "ogg_sync_buffer failed\n");
            return -1;
        }
        bytes = read(fd, buffer, 4096);
        if …
Run Code Online (Sandbox Code Playgroud)

audio concatenation ogg lossless vorbis

5
推荐指数
1
解决办法
1573
查看次数

从perl执行mount系统调用

如何mount从perl完成系统调用?下列:

$ret = syscall(&SYS_mount, "/proc", "/path/to/my/mount/point", 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

结果是:

Modification of a read-only value attempted at ...
Run Code Online (Sandbox Code Playgroud)

我无法调用mount程序,system因为我需要进行程序似乎不具备的mount()系统调用mount.更具体地说,我需要打电话:

mount("/proc", "/path/to/my/mpoint/point", NULL, MS_REC|MS_PRIVATE|MS_BIND, NULL);
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试使用非特权的非共享mount linux命名空间运行以下命令:

mount --make-rprivate --bind /proc /path/to/my/mountpoint
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

mount: wrong fs type, bad option, bad superblock on /proc,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
Run Code Online (Sandbox Code Playgroud)

使用strace揭示mount …

linux perl mount system-calls

5
推荐指数
1
解决办法
721
查看次数

使用$ INPUT_RECORD_SEPARATOR作为正则表达式读取perl文件句柄

我正在寻找一种逐行读取文件句柄的方法(然后在每一行上执行一个函数),具有以下转折:我想要视为"行"的东西应该通过改变字符来终止,而不仅仅是我定义为的单个字符$/.我现在$INPUT_RECORD_SEPARATOR$/不支持正则表达式或传递一个字符列表作为行终止符,这就是我的问题所在.

我的文件句柄来自进程的stdout.因此,我无法在文件句柄内寻找并且完整内容不能立即获得,而是在执行过程时逐位产生.我希望能够使用我handler在示例中调用的函数将时间戳附加到进程生成的每个"行" .每一行都应该在程序生成后立即处理.

不幸的是,我只能提出一种方法,既可以handler立即执行函数,但看起来非常低效,或者使用缓冲区的方式,但只会导致handler函数的"分组"调用,从而产生错误的时间戳.

事实上,在我的具体情况下,我的正则表达式甚至会非常简单并且只是阅读/\n|\r/.因此,对于这个特殊问题,我甚至不需要完整的正则表达式支持,而只需要将多个字符视为行终止符.但$/不支持这一点.

有没有一种有效的方法来解决Perl中的这个问题?

下面是一些快速的伪perl代码来演示我的两种方法:

逐字节读取输入文件句柄

这看起来像这样:

my $acc = "";
while (read($fd, my $b, 1)) {
    $acc .= $b;
    if ($acc =~ /someregex$/) {
        handler($acc);
        $acc = "";
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的优点是,handler一旦读取了足够的字节,就会立即调度.缺点是,我们执行字符串追加并检查我们读取的每个字节的正则表达式$fd.

一次读取带有X字节块的输入文件句柄

这看起来像这样:

my $acc = "";
while (read($fd, my $b, $bufsize)) {
    if ($b =~ /someregex/) {
        my @parts = split /someregex/, $b;
        # for brevity …
Run Code Online (Sandbox Code Playgroud)

perl

5
推荐指数
1
解决办法
162
查看次数

以与python2和python3兼容的方式将字节写入标准输出

我想要一个函数返回一个文件对象,我可以用它将二进制数据写入标准输出.在python2中sys.stdout就是这样一个对象.在python3中它是sys.stdout.buffer.

检索这样一个对象的最优雅/首选方法是什么,以便它对python2和python3解释器都有效?

是检查sys.stdout.buffer(可能使用inspect模块)存在的最佳方法,如果存在,则返回它,如果不存在,则假设我们在python2上并返回sys.stdout

python binary stdout python-3.x

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

如何在for-each循环中找到与xslt属性值匹配的元素

假设我有以下XML:

<data>
  <foos>
    <foo id="1" checked="yes" />
    <foo id="2" />
    <foo id="3" />
    <foo id="4" checked="yes" />
  </foos>
  <bars>
    <bar for="1" name="blub" />
    <bar for="2" name="bla" />
    <bar for="3" name="baz" />
    <bar for="4" name="plim" />
  </bars>
</data>
Run Code Online (Sandbox Code Playgroud)

现在我想打印name那些bar指向foo具有该属性的元素的元素的所有属性checked.所以对于上面的例子,我的xslt会输出blubplim.

到目前为止,我所尝试的只是检查是否可以打印每个id属性所属的foo元素的属性bar:

<xsl:template match="/">
  <xsl:for-each select="//bars/bar">
    <xsl:value-of select="../../foos/foo[@id=./@for]/@id" />
  </xsl:for-each>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

但无济于事.我认为问题是,该检查foo[@id=./@for]将同时选择@id@forfoo元素.那么我怎么能说我想要@for来自for循环当前元素的属性,而不是@id来自另一个 …

xml xslt

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

arg 1的类型必须是block或sub {}(不是子例程条目)

以下Python代码演示了我想在Perl中做什么:

def runner(cmd, arg):
    print("runner:", arg)
    cmd()

def run_hooks1(arg):
    def work():
        print("work", arg)

    if (arg):
        work()
    else:
        runner(work, "hello")

run_hooks1(True)
run_hooks1(False)
Run Code Online (Sandbox Code Playgroud)

输出:

work True
runner: hello
work False
Run Code Online (Sandbox Code Playgroud)

我认为把它移植到Perl会很简单.所以我开始使用这段代码:

sub runner(&$) {
    my $cmd = shift;
    my $arg = shift;
    print STDOUT "runner: $arg\n";
    &{$cmd}();
}

sub run_hooks1($) {
    my $arg = shift;

    sub work() {
        print STDOUT "work: $arg\n";
    }

    if ($arg) {
        work();
    } else {
        runner \&work, "hello";
    }
}

run_hooks1(0);
run_hooks1(1);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致:

Variable "$arg" will not …
Run Code Online (Sandbox Code Playgroud)

perl functional-programming

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