我试图使用闭包来确保函数只能执行一次.听起来很简单,它的工作原理如下:
function runOnce(fn) // returns copy of fn which can only execute once
{
var ran = false;
return function()
{
if (!ran)
{
fn();
ran = true;
}
};
}
Run Code Online (Sandbox Code Playgroud)
我已经测试了这个函数:
function lazyLoadGrid(event, ui)
{
alert('hi');
}
var test1 = runOnce(lazyLoadGrid);
var test2 = runOnce(lazyLoadGrid);
test1();
test2();
test1();
test2();
Run Code Online (Sandbox Code Playgroud)
并且它按预期工作 - 'hi'被提醒两次.
但后来我尝试使用runOnce(lazyLoadGrid)作为jQuery UI事件的回调:
$('.accordion').each(function()
{
$(this).accordion({ autoHeight: false, change: runOnce(lazyLoadGrid) });
});
Run Code Online (Sandbox Code Playgroud)
疯狂随之而来.我期待的是,当首次打开手风琴时,页面上的每个'手风琴'都会运行一次lazyLoadGrid().相反,闭包回调似乎表现得好像它们都引用了'ran'的相同副本.lazyLoadGrid()在我第一次打开任何手风琴时运行,然后再也不会为任何其他手风琴再次运行.记录'ran'的前置条件值表示每次在第一个之后点击任何手风琴时它都是'true'.
对此有何解释?值得注意的是,我有一个奇怪的页面,嵌套的手风琴,以及多个包含手风琴的jQuery UI标签.更糟糕的是,当我切换标签时,闭合实际上确实在任何给定标签的第一个打开的手风琴上运行.任何建议都非常感谢.
更具体地说,我有以下看似无害的小修复3程序:
{-# LANGUAGE QuasiQuotes #-}
import Prelude hiding (map, zipWith)
import System.Environment (getArgs)
import Data.Word (Word8)
import Data.Array.Repa
import Data.Array.Repa.IO.DevIL
import Data.Array.Repa.Stencil
import Data.Array.Repa.Stencil.Dim2
main = do
[s] <- getArgs
img <- runIL $ readImage s
let out = output x where RGB x = img
runIL . writeImage "out.bmp" . Grey =<< computeP out
output img = map cast . blur . blur $ blur grey
where
grey = traverse img to2D luminance
cast n = floor n :: …Run Code Online (Sandbox Code Playgroud) parallel-processing haskell image-processing repa data-parallel-haskell
我正在为 Android 编写一个 Web 测试自动化应用程序,想知道是否有办法直接在 Android 设备上运行 chromedriver (Selenium)(或将它与我的应用程序捆绑在一起)。我意识到正常的方法是在 PC 上运行 chromedriver 并使用 adb 连接到 Android 设备。但我希望我的用户不必安装 Android SDK,即使没有 PC 可用,也能够在本机设备上运行测试。
有谁知道这样做的方法?如果没有 - 是否可以在 Android 应用程序中实现 WebDriver 协议?是否有任何开源项目已经尝试这样做?
selenium android automated-tests android-ndk selenium-chromedriver
以下究竟发生了什么?
> let test = map show
> :t test
test :: [()] -> [String]
> :t (map show)
(map show) :: Show a => [a] -> [String]
Run Code Online (Sandbox Code Playgroud)
我想知道我以前怎么没注意到这个?我实际上遇到了"map fromIntegral"而不是show的问题 - 我的代码不能用无点的形式进行编译,但是在没有eta减少的情况下工作正常.
有关eta减少何时可以改变Haskell代码含义的简单解释?
Matt Scarpino给出了一个很好的解释(虽然他承认他不确定这是最佳算法,但我感谢他),感谢他如何将两个复杂的双倍乘以英特尔的AVX内在函数.这是他的方法,我已经验证了:
__m256d vec1 = _mm256_setr_pd(4.0, 5.0, 13.0, 6.0);
__m256d vec2 = _mm256_setr_pd(9.0, 3.0, 6.0, 7.0);
__m256d neg = _mm256_setr_pd(1.0, -1.0, 1.0, -1.0);
/* Step 1: Multiply vec1 and vec2 */
__m256d vec3 = _mm256_mul_pd(vec1, vec2);
/* Step 2: Switch the real and imaginary elements of vec2 */
vec2 = _mm256_permute_pd(vec2, 0x5);
/* Step 3: Negate the imaginary elements of vec2 */
vec2 = _mm256_mul_pd(vec2, neg);
/* Step 4: Multiply vec1 and the modified vec2 */
__m256d vec4 = …Run Code Online (Sandbox Code Playgroud) 我是SIMD内在函数的初学者,所以我会提前感谢大家的耐心等待.我有一个涉及无符号字节的绝对差异比较的应用程序(我正在使用灰度图像).
我尝试了AVX,更现代的SSE版本等,但最终决定SSE2似乎已经足够并且对个别字节的支持最多 - 如果我错了,请纠正我.
我有两个问题:第一,加载128位寄存器的正确方法是什么?我想我应该将加载的内在数据传递到128的倍数,但这样可以使用2D数组代码:
greys = aligned_alloc(16, xres * sizeof(int8_t*));
for (uint32_t x = 0; x < xres; x++)
{
greys[x] = aligned_alloc(16, yres * sizeof(int8_t*));
}
Run Code Online (Sandbox Code Playgroud)
(上面的代码假设xres和yres是相同的,并且是2的幂).这会在内存中变成线性的,不间断的块吗?那么,当我循环时,我可以继续将地址(递增128)传递给SSE2加载内在函数吗?或者像这样的2D阵列需要做些什么?
我的第二个问题:一旦我完成了所有的矢量处理,我该如何从中提取修改后的字节__m128i?通过英特尔内在指南,将矢量类型转换为标量类型的指令很少见.我发现的最接近的是int,_mm_movemask_epi8 (__m128i a)但我不太明白如何使用它.
哦,还有三分之一的问题 - 我假设_mm_load_si128只加载了带符号的字节?而且我找不到任何其他字节加载函数,所以我猜你应该从每个中减去128并稍后解释它?
我知道这些是SIMD专家的基本问题,但我希望这对像我这样的初学者有用.如果你认为我对应用程序的整个方法是错误的,或者我会更好地使用更现代的SIMD扩展,我很想知道.我只是想谦虚地警告我从未使用过装配,所有这些有点蠢蠢欲动的东西需要大量的解释才能帮助我.
不过,我很感激任何澄清.
如果它有所不同:我的目标是低功耗的i7 Skylake架构.但是,将应用程序运行在更旧的机器上也是很好的(因此SSE2).
我已经看到了在C99中使用以下表达式分配2D数组的各种建议:
int (*array)[cols] = malloc(rows * sizeof *array);
Run Code Online (Sandbox Code Playgroud)
我想知道三件事:
整个结构是否在堆上分配?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?
分配的内存是否完全连续?
是否只需要一次调用free(array)来释放整个2D结构?我在某个地方读过这个 - 不记得在哪里 - 它似乎对我有用,但我想明白为什么.