小编Bai*_*ker的帖子

如何强制PDOStatement-> fetchAll返回对象数组?

我正在使用PDO编写自己的ORM.我的问题是你是否可以强制PDOStatement::fetchAll()方法返回stdClass的对象数组?例如:

$result = $q->fetch_all(/* some magic here */);
print_r($result);
Run Code Online (Sandbox Code Playgroud)

应该打印像:

Array
(
    [0] => stdClass Object
        (
            [NAME] => pear
            [COLOUR] => green
        )

    [1] => stdClass Object
        (
            [NAME] => watermelon
            [COLOUR] => pink
        )

)
Run Code Online (Sandbox Code Playgroud)

这是真的吗?NAME和COLOR当然是列的名称.我阅读文档,但我没有发现任何有趣的东西.

php pdo object

24
推荐指数
2
解决办法
3万
查看次数

隐藏<tr>,同时仍然涉及宽度计算

搜索结果存储在如下表格中:

<table>
    <tbody>
        <tr>
            <td>Column One</td>
            <td>Column Two</td>
            <td>Column Three</td>
        </tr>
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

实际的表包含更多的数据(包括列和行),并且是流体宽度.由于数据是可变的,我希望table-layout保留auto,因为它处理自动调整(这在javascript中为1000行执行会很昂贵和复杂).

此表也由实时搜索小部件过滤,该小部件通过添加隐藏与查询不匹配的行display: none;.但是,我发现这通常会导致重新计算列宽(通常会导致列宽度出现一些不和谐的跳跃).这是有道理的,因为行可能只包含计算,如果有的话display: table-row;.但这不是我追求的行为.

是否可以隐藏<tr>视图,但是仍然将它包含在列表浏览器上完成的列宽度计算中(例如,在调整大小时)table-layout: auto;

我已经尝试过设置height: 0;(和max-height: 0;),但是从其他SO问题中学到了这不起作用因为display: table-cell;.同样,设置line-height: 0;失败,但我认为它会因为我的一些列有块内容.

我也考虑过在<td>s 上明确设置宽度,但这会使表保持流畅(我必须在调整大小时删除显式宽度,这可能会导致宽度跳跃,除非所有行都可见,否则无法工作并包含在浏览器的表中调整大小计算).

编辑:澄清一下,通过隐藏视图我的意思是隐藏在意义上display: none;,而不是visibility: hidden;.如果元素在隐藏时不保留原始高度,后者将起作用,但不幸的是情况并非如此.

注意:我知道乍一看这似乎是一个非常狭隘的问题,但我相信这可能是一个常见的用例.因此,我加粗了问题中最适用的部分(阅读:最重要).其余的(对我来说稍微具体)比其他任何东西更具说明性.

html css html-table

14
推荐指数
1
解决办法
3668
查看次数

针对具有请求2.3.0的空块避免ChunkedEncodingError

我正在使用请求从服务器下载文件(几千兆字节).要提供进度更新(并防止整个文件必须存储在内存中),我已将stream=True下载设置并写入文件:

with open('output', 'w') as f:
    response = requests.get(url, stream=True)

    if not response.ok:
        print 'There was an error'
        exit()

    for block in response.iter_content(1024 * 100):
        f.write(block)
        completed_bytes += len(block)
        write_progress(completed_bytes, total_bytes)
Run Code Online (Sandbox Code Playgroud)

但是,在下载中的某个随机点,请求会抛出一个ChunkedEncodingError.我已经进入源代码,发现这对应于IncompleteRead异常.我在这些行周围插入了一条日志语句并发现了e.partial = "\r".我知道服务器给下载的优先级低,我怀疑当服务器等待太长时间发送下一个块时会发生这种异常.

正如预期的那样,例外会停止下载.不幸的是,服务器没有实现HTTP/1.1的内容范围,所以我不能简单地恢复它.我已经玩过增加urllib3的内部超时,但异常仍然存在.

反正有没有让底层urllib3(或请求)更容忍这些空(或晚)块,以便文件可以完全下载?

python exception chunked-encoding python-requests

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

在JIT中处理远程内部函数的调用

我正在Rust写一个JIT(尽管Rust只与我的一些问题有关,其中很大一部分与JIT约定有关).我有我在Rust中实现的内部函数,我需要能够call从我的JIT发出的代码.我的JIT mmap(_, _, PROT_EXEC, MAP_ANONYMOUS | MAP_SHARED)是jitted代码的一些页面.我有我的内在函数的地址,但不幸的是它们比32位偏移更远.我现在试图决定如何发出对这些内在函数的调用.我考虑过以下选项:

  1. (特定于Rust)以某种方式使Rust将内在函数放置在堆附近(可能在?上),以便calls将在32位偏移量内.目前还不清楚Rust是否可行(有一种方法可以指定自定义链接器args,但是我无法告诉它们应用了什么以及我是否可以将单个函数作为重定位目标.即使我可以在哪里放置它?).如果堆足够大,似乎这可能会失败.

  2. (特定于Rust)将我的JIT页面分配给内部函数更接近.这可以通过实现mmap(_, _, PROT_EXEC, MAP_FIXED),但我不确定如何选择一个不会破坏现有Rust代码的地址(并保持在arch限制内 - 是否有一种理智的方式来获得这些限制?).

  3. 在JIT页面中创建处理绝对跳转(下面的代码)call的存根,然后是存根.这有利于JITted代码中的(初始)调用站点是一个很好的小型相对调用.但是必须跳过某些东西感觉不对.这似乎对性能有害(可能干扰RAS /跳转地址预测).此外,似乎这种跳转会更慢,因为它的地址是间接的,它取决于mov该地址.

mov rax, {ABSOLUTE_AOTC_FUNCTION_ADDRESS}
jmp rax
Run Code Online (Sandbox Code Playgroud)
  1. 与(3)相反,只是在JITed代码中的每个内部调用站点处内联上述内容.这解决了间接问题,但使JITted代码变大(可能这会产生指令缓存和解码后果).它仍然存在跳跃是间接的并且取决于的问题mov.

  2. 将内在函数的地址放在JIT页面附近的PROT_READ(仅)页面上.使所有呼叫站点接近,绝对间接呼叫(下面的代码).这从(2)中删除了第二级间接.但遗憾的是,该指令的编码很大(6个字节),因此它与(4)具有相同的问题.另外,现在不是依赖于寄存器,而是不必要地跳转(只要地址在JIT时间已知)依赖于内存,这肯定会影响性能(尽管可能这个页面被缓存了?).

aotc_function_address:
    .quad 0xDEADBEEF

# Then at the call site
call qword ptr [rip+aotc_function_address]
Run Code Online (Sandbox Code Playgroud)
  1. 具有段寄存器的Futz使其更接近内在函数,以便可以相对于该段寄存器进行调用.这种调用的编码很长(所以这可能有解码管道问题),但除此之外,这在很大程度上避免了它之前的一切棘手的问题.但是,相对于非cs细分市场的调用可能表现不佳.或者也许这样的未来是不明智的(例如,与Rust运行时混淆).(正如@prl所指出的,没有远程调用就行不通,这对性能来说太糟糕了)

  2. 不是真正的解决方案,但我可以使编译器32位并且根本没有这个问题.这不是一个很好的解决方案,它也会阻止我使用扩展的通用寄存器(我利用它们).

所有选项都有缺点.简而言之,1和2是唯一似乎没有性能影响的,但目前还不清楚是否有一种非hacky方式来实现它们(或者根本没有任何方式).3-5独立于Rust,但具有明显的性能缺陷.

考虑到这一点,一些(Rust)具体问题:

  1. 对于方法(1),是否可以强制Rust链接extern "C"特定地址(堆附近)的某些函数?我应该如何选择这样的地址(在编译时)?假设由mmap(由Rust分配)返回的任何地址都在此位置的32位偏移量内是否安全?

  2. 对于方法(2),我如何找到一个合适的位置放置JIT页面(这样它不会破坏现有的Rust代码)?

还有一些JIT(非Rust)特定问题:

  1. 对于方法(3),存根是否会妨碍我应该关心的性能?间接jmp怎么样?我知道这有点类似于链接器存根,除非我理解链接器存根至少只解析一次(因此它们不需要是间接的?).任何JIT都采用这种技术吗?

  2. 对于方法(4),如果3中的间接呼叫是可以的,那么内联呼叫值得吗?如果JIT通常采用方法(3/4),这个选项更好吗?

  3. 对于方法(5),跳转对内存的依赖性(假设地址在编译时已知)是不是很糟糕?这会使(3)或(4)的性能降低吗?任何JIT都采用这种技术吗?

  4. 对于方法(6),这样的未来是不明智的吗?(特定于Rust)是否有可用的段寄存器(运行时或ABI未使用)?相对于非cs细分市场的调用是否与相对于cs?的调用相同?

  5. 最后(也是最重要的),是否有我在这里失踪更好的方法(可能由即时编译器采用更常见)?

如果没有我的Rust问题有答案,我无法实现(1)或(2).当然,我可以实现和测试3-5(可能是6,虽然事先了解段寄存器会很好),但考虑到这些是截然不同的方法,我希望有关于此的现有文献我找不到,因为我不知道谷歌的正确条款(我目前也正在研究这些基准).或者也许有人深入研究JIT内部人员可以分享他们的经验或他们常见的东西? …

compiler-construction assembly jit x86-64 rust

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

恢复原始argv

当显式调用脚本时python,它会argv被删除,因此这argv[0]是运行脚本的路径.如果被调用为python foo/bar.py甚至如此,就是这种情况python -m foo.bar.

我需要一种方法来恢复原始argv(即收到的原始python).不幸的是,它并不像前面那样容易sys.executable,sys.argv因为python foo/bar.py它不同于python -m foo.bar(隐式的PYTHONPATH不同,这可能是至关重要的,具体取决于你的模块结构).

更具体地说,在python foo/bar.py some other args和的情况下python -m foo.bar some other args,我正在寻找恢复['python', 'foo/bar.py', 'some', 'other', 'args']['python', '-m', 'foo.bar', 'some', 'other', 'args']分别.

我知道之前的问题:

但是这些似乎误解了炮弹是如何运作的,而答案却反映了这一点.我没有兴趣在解开外壳的工作(如评估壳VAR和功能都很好),我只是想在原来的argv给予python.

我发现的唯一解决方案是使用/proc/<PID>/cmdline:

import os
with open("/proc/{}/cmdline".format(os.getpid()), 'rb') as f:
  original_argv …
Run Code Online (Sandbox Code Playgroud)

python command-line-arguments python-3.x

10
推荐指数
2
解决办法
255
查看次数

amd64上"条件调用"的表现

在代码的关键部分考虑条件函数调用时,我发现gcc和clang都会在调用中分支.例如,对于以下(通常是微不足道的)代码:

int32_t __attribute__((noinline)) negate(int32_t num) {
    return -num;
}

int32_t f(int32_t num) {
    int32_t x = num < 0 ? negate(num) : num;
    return 2*x + 1;
}
Run Code Online (Sandbox Code Playgroud)

GCC和clang都基本上编译如下:

.global _f
_f:
    cmp     edi, 0
    jg      after_call
    call    _negate
after_call:
    lea     rax, [rax*2+1]
    ret
Run Code Online (Sandbox Code Playgroud)

这让我想到:如果x86有一个像ARM这样的条件调用指令怎么办?想象一下,如果有这样的指令"ccall cc "与语义如cmov cc.然后你可以这样做:

.global _f
_f:
    cmp     edi, 0
    ccalll  _negate
    lea     rax, [rax*2+1]
    ret
Run Code Online (Sandbox Code Playgroud)

虽然我们无法避免分支预测,但我们确实消除了分支.也就是说,在实际的GCC/clang输出中,我们被迫分支,无论是否num < 0.如果num < 0我们必须分支两次.这似乎很浪费.

现在这样的指令在amd64中不存在,但我设计了一种模拟这种指令的方法.我通过分解call func其组成部分来做到这一点:( push rip技术上很好[rip+label_after_call_instruction])然后jmp …

x86 assembly x86-64 branch-prediction

10
推荐指数
1
解决办法
181
查看次数

Stubbing Date.now()和Math.random()

我正在使用MochaSinon对我的node.js模块进行单元测试.我已经成功地模拟了其他依赖项(我编写的其他模块),但是我遇到了存在非纯函数(如Math.random()Date.now())的问题.我已经尝试了以下(简化以便这个问题不是如此本地化),但Math.random()由于明显的范围问题而没有被删除.实例Math在测试文件和mymodule.js.之间是独立的.

test.js

var sinon    = require('sinon'),
    mymodule = require('./mymodule.js'),
    other    = require('./other.js');

describe('MyModule', function() {
    describe('funcThatDependsOnRandom', function() {
        it('should call other.otherFunc with a random num when no num provided', function() {
            sinon.mock(other).expects('otherFunc').withArgs(0.5).once();
            sinon.stub(Math, 'random').returns(0.5);

            funcThatDependsOnRandom(); // called with no args, so should call
                                       // other.otherFunc with random num

            other.verify(); // ensure expectation has been met
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

所以在这个人为的例子中,functThatDependsOnRandom()看起来像:

mymodule.js

var other = require('./other.js'); …
Run Code Online (Sandbox Code Playgroud)

javascript unit-testing dependency-injection node.js sinon

9
推荐指数
1
解决办法
6360
查看次数

在Laravel 4中缓存视图输出

我知道Blade已经为所有刀片视图缓存了已编译的PHP,但我想更进一步.我正在处理的网站被模块化为组件视图,然后在默认控制器中拼凑在一起.每个"窗口小部件"都有自己的视图,很少更改内容(除了一些经常更新的内容).所以,我想缓存这些很少变化的视图的HTML输出,以防止在每个页面加载时对它们进行评估.

在Laravel 3中我们可以这样做(信用Laravel论坛):

Event::listen(View::loader, function($bundle, $view)
{
  return Cache::get($bundle.'::'.$view, View::file($bundle, $view, 
                                                  Bundle::path($bundle).'view'));
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,View::loader在Laravel 4已经完全消失在挖通\Illuminate\View\View\Illuminate\View\Environment,我发现每个视图调度名为事件"composing: {view_name}".侦听此事件会提供在每个视图渲染时传递给它的视图名称和数据,但是从回调返回的效果与Laravel 3中的效果不同:

Event::listen('composing: *', function($view) {
  if(!in_array($view->getName(), Config::get('view.alwaysFresh'))) {
    // Hacky way of removing data that we didn't pass in
    // that have nasty cyclic references (like __env, app, and errors)
    $passedData = array_diff_key($view->getData(), $view->getEnvironment()
                                                                  ->getShared());

    return Cache::forever($view->getName() . json_encode($passedData), function() {
      return 'test view data -- this should appear in the browser';
    });
}, …
Run Code Online (Sandbox Code Playgroud)

php caching view laravel blade

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

自定义HTML Shiv的缺点

在最近的一个项目中,我使用了Alexander Farkas的HTML5 Shiv,我发现当缩小时脚本是2.274 KB.对于我来说,对于John Resig基本上在两行中演示的概念来说,这看起来相当大(我意识到这非常过于简单,因为John不包括对支持或所有新HTML5元素的检查).我挖到了html5shiv源代码.它是248 sloc,对于这么简单的任务来说,这似乎是很多不必要的代码.我只用了14行就实现了一个更简单的shiv:

(function(document) {
    var div      = document.createElement('div'),
        elements = 'article|aside|audio|canvas|details|figure|figcaption|footer|header|hgroup|nav|output|progress|section|summary|video'.split('|'),
        i        = 0,
        length   = elements.length;

    div.innerHTML = '<header></header>';

    if(div.childNodes.length != 1) {
        for(; i < length; i++) {
            document.createElement(elements[i]);
        }
    }
})(document);
Run Code Online (Sandbox Code Playgroud)

缩小它只有~270字节(从Farkas Shiv的大小节省88%).当与适当的CSS结合使用时,它在IE 6,7和8中正常工作.

article,aside,audio,canvas,figure,figcaption,footer,header,hgroup,nav,output,progress,section,video{display:block;}
Run Code Online (Sandbox Code Playgroud)

似乎Farkas shiv的肉在创建元素和检查try/catch中的函数方面做了一些魔术.这种肉和馅料是否必要?我的解决方案是否足够,或者Farkas shiv是否考虑了我未考虑过的事情?

编辑

该脚本现在使用正确的声明创建自己的样式标记(并且仍然只有21行!):

(function(document) {
    var div      = document.createElement('div'),
        elements = 'article,aside,audio,canvas,figure,figcaption,footer,header,hgroup,nav,output,progress,section,video',
        elementArr = elements.split(','),
        i        = 0,
        length   = elementArr.length,
        script, style;

    div.innerHTML = '<header></header>';

    if(div.childNodes.length != …
Run Code Online (Sandbox Code Playgroud)

javascript html5 html5shiv

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

在 MyPy 中使用 TypeVar 输入带参数的装饰器会产生预期的无人居住类型

MyPy 与Callable *args和存在一些问题**kwargs,特别是关于装饰器的问题,详见:https : //github.com/python/mypy/issues/1927

具体来说,对于只包装函数(并且不更改其签名)的没有参数的装饰器,您需要以下内容:

from typing import Any, Callable, cast, TypeVar

FuncT = TypeVar('FuncT', bound=Callable[..., Any])

def print_on_call(func: FuncT) -> FuncT:
    def wrapped(*args, **kwargs):
        print("Running", func.__name__)
        return func(*args, **kwargs)
    return cast(FuncT, wrapped)
Run Code Online (Sandbox Code Playgroud)

所述cast()在端部应该是不必要的(MyPy应该能够推导出通过调用func在结束wrapped该包裹的确是FuncT -> FuncT)。我可以忍受这个直到它被修复。

然而,当你引入带参数的装饰器时,这会非常糟糕。考虑装饰器:

def print_on_call(foo):
    def decorator(func):
        def wrapped(*args, **kwargs):
            print("Running", foo)
            return func(*args, **kwargs)
        return wrapped
    return decorator
Run Code Online (Sandbox Code Playgroud)

其用法如下:

@print_on_call('bar')
def stuff(a, b):
    return a + b
Run Code Online (Sandbox Code Playgroud)

我们可能会尝试键入它(使用 Guido 认可的无参数示例作为指南),如下所示:

from …
Run Code Online (Sandbox Code Playgroud)

decorator python-3.x python-decorators mypy

7
推荐指数
2
解决办法
4256
查看次数