小编Jam*_*arp的帖子

如何添加仅缓存ADT的字段?

通常我需要向ADT添加字段,只记忆一些冗余信息.但我还没有完全弄清楚如何做得好而有效.

显示问题的最佳方法是举个例子.假设我们正在使用无类型的lambda术语:

type VSym = String

data Lambda = Var VSym 
            | App Lambda Lambda
            | Abs VSym Lambda
Run Code Online (Sandbox Code Playgroud)

有时我们需要计算一个术语的自由变量集:

fv :: Lambda -> Set VSym
fv (Var v)    = Set.singleton v
fv (App s t)  = (fv s) `Set.union` (fv t)
fv (Abs v t)  = v `Set.delete` (fv t)
Run Code Online (Sandbox Code Playgroud)

很快我们意识到重复计算fv是我们应用的瓶颈.我们想以某种方式将它添加到数据类型中.喜欢:

data Lambda1 = Var (Set VSym) VSym
             | App (Set VSym) Lambda Lambda
             | Abs (Set VSym) VSym Lambda
Run Code Online (Sandbox Code Playgroud)

但它使定义相当丑陋.几乎(Set VSym)比其他所有人都占用更多的空间.而且,它在所有使用的函数中打破了模式匹配Lambda.更糟糕的是,如果我们后来决定添加一些其他的memoizing字段,我们将不得不再次重写所有模式.

如何设计一个通用的解决方案,允许轻松,不引人注意地添加这些记忆字段? …

caching haskell design-patterns memoization algebraic-data-types

16
推荐指数
1
解决办法
469
查看次数

location.protocol是否无效?

我想构建具有相同方案的URL(可能是"http:"或"https:")作为加载当前运行的JavaScript的页面.现代浏览器支持简单地省略该方案(例如,src="//example.com/test.js"),但这不是完全跨浏览器兼容的.(我已经读过IE 6是唯一不支持它的浏览器,但我仍然需要与该版本兼容.)

这种跨浏览器的方式似乎是检查location.protocol.例如,Google Analytics使用:

('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + ...
Run Code Online (Sandbox Code Playgroud)

在Google的情况下,他们希望根据请求是否使用SSL来使用不同的域,因此该模式是有意义的.但是我看到其他人使用相同的模式,即使只有协议是不同的:

('https:' == location.protocol ? 'https:' : 'http:') + "//example.com"
Run Code Online (Sandbox Code Playgroud)

(一个例子是http://css-tricks.com/thinking-async/上的"Final Wufoo Snippet" .)

我宁愿使用这个更简单的表达式:

location.protocol + "//example.com"
Run Code Online (Sandbox Code Playgroud)

location.protocol当我的代码在我无法控制的网站上使用时,我是否真的应该关注除"https:"或"http:"之外的其他值的可能性?

javascript

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

在OSX上设置套接字选项

我正在尝试在使用该Network.Socket模块构造的套接字上设置接收超时.这是一段代码片段:

import Network.Socket

host = "127.0.0.1"
port = PortNumber 3000

main = do
  addrinfos <- getAddrInfo Nothing (Just host) (Just port)
  let serveraddr = head addrinfos
  sock <- socket (addrFamily serveraddr) Stream defaultProtocol
  setSocketOption sock RecvTimeOut 120000000
  connect sock (addrAddress serveraddr)
  msg <- recv sock 1024
  putStrLn msg
  sClose sock
Run Code Online (Sandbox Code Playgroud)

setSocketOption行引发异常:

*** Exception: setSocketOption: invalid argument (Invalid argument)
Run Code Online (Sandbox Code Playgroud)

setSocketOption只接受Int设置的参数,但不是所有的套接字选项都需要Int.具体而言RecvTimeOut,SendTimeOut期待一个struct timeval.还有另一种方法可以从haskell设置这些选项吗?

我在OSX 10.8.1上运行GHC 7.4.2

编辑:

Network.Socket.Options …

sockets macos haskell

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

ActiveRecord :: StatementInvalid:PG ::错误:错误:无法在Heroku中的只读事务错误中执行UPDATE

我使用关注者在Heroku上创建了一个新数据库.在它提交0后,我取消关注主数据库并将其作为默认值提升.

似乎工作正常,但看起来只读.当我尝试从控制台中删除记录时,我看到了这个错误

ActiveRecord::StatementInvalid: PG::Error: ERROR:  cannot execute UPDATE in a read-only transaction
Run Code Online (Sandbox Code Playgroud)

不知道怎么解决这个问题?

postgresql ruby-on-rails heroku

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

python中的createNamedPipe

你好,我有两个python文件(namedpipe)

a.py

import win32pipe, win32file

p = win32pipe.CreateNamedPipe(r'\\.\pipe\test_pipe',
    win32pipe.PIPE_ACCESS_DUPLEX,
    win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT,
    1, 65536, 65536,300,None)

win32pipe.ConnectNamedPipe(p, None)


data = "Hello Pipe"  
win32file.WriteFile(p, data)
Run Code Online (Sandbox Code Playgroud)

此管道创建一个命名管道"test_pipe"并将数据写入管道.

b.py

import win32pipe, win32file
import win32file
fileHandle = win32file.CreateFile("\\\\.\\pipe\\test_pipe",
                              win32file.GENERIC_READ | win32file.GENERIC_WRITE,
                              0, None,
                              win32file.OPEN_EXISTING,
                              0, None)
data = win32file.ReadFile(fileHandle, 4096)
print data
Run Code Online (Sandbox Code Playgroud)

我能够毫无问题地获取数据.但我得到的数据是这种形式(我用双引号括起输出)

"<0, Hello Pipe>" 
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么所有这些变量都被打印出来(<,0,>),这是a.py或b.py中的问题,以及我如何解决这个问题.

python windows

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

在大型Python代码库中将效果追溯到其原因

我在Django有一个相当大的项目,这是一个相当大的框架,我使用了相当多的应用程序,中间件,上下文处理器等.规模意味着当代码库的一部分运行请求时我我不想要它,找出它的原因很难.直接代码检查非常耗时,就像在调试器中单步执行整个请求一样.

在这个特殊情况下,我的问题是我在每个响应上都设置了"Vary:Cookie",包括一些我想要高速缓存的地方以及我不需要任何cookie的地方.我怀疑,但不知道如何证明,一些中间件或上下文处理器request.session即使在不使用结果时也在访问- 尽管它可能是间接访问,例如通过request.user.当然,它可能完全不同.

在Python中,您如何从一个效果("Vary标头被添加到响应中")中追溯到大型代码库中的原因?

python debugging

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

如何将使用Scrapy从多个页面中抓取的数据分组到一个项目中?

我正在尝试收集一些关于一堆不同网站的信息.我希望Item每个站点生成一个,总结我在该站点上找到的信息,无论我在哪个页面上找到它.

我觉得这应该是一个项目管道,比如重复过滤器示例,除了我需要最终内容,而Item不是爬虫检查的第一页的结果.

所以我尝试使用request.meta一个部分填充Item通过各个Requests为给定的网站.为了完成这项工作,我必须让我的解析回调Request每次调用返回一个新的,直到它没有更多的页面可访问,然后最终返回完成Item.如果我找到了我想要遵循的多个链接,那将是一种痛苦,如果调度程序因链接周期而丢弃其中一个请求,则会完全中断.

我能看到的另一种方法是将蜘蛛输出转储到json-lines并使用外部工具对其进行后处理.但我宁愿把它折叠成蜘蛛,最好是在中间件或物品管道中.我怎样才能做到这一点?

python scrapy

6
推荐指数
1
解决办法
1245
查看次数

只要第三方脚本无法加载,就运行一段JavaScript

我为几个网站提供了一个JavaScript小部件,它们是异步加载的.我的小部件又需要加载由我控制之外的另一方提供的脚本.

有几种方法可以检查脚本是否已成功加载.但是,如果脚本加载失败,我还需要运行不同的代码.

显而易见的工具包括:

  • 我不愿意使用JavaScript库,比如jQuery.我需要一个非常小的脚本来最小化我对使用我的小部件的网站的影响.

  • 我想尽快检测到故障,因此使用计时器进行轮询是不可取的.不过,我不介意使用计时器作为旧浏览器的最后手段.

  • 我发现<script>标签的onerror事件在某些主流浏览器中是不可靠的.(这似乎取决于安装了哪些附加组件.)

  • 任何涉及的事情document.write都是正确的.(除了那种本质上是邪恶的方法之外,我的代码是异步加载的,因此document.write可能会对页面产生不良影响.)

我有一个以前的解决方案,涉及加载<script>一个新的<iframe>.在那个iframe中,我设置了一个<body onload=...>事件处理程序,用于检查<script onload=...>事件是否已经被触发.因为它<script>是初始文档的一部分,以后不是异步注入的,所以onload只有在使用<script>标记完成网络层之后才会触发.

但是,现在我需要在父文档中加载脚本; 它不能再在iframe中了.因此,一旦网络层放弃尝试获取脚本,我就需要一种不同的方式来触发代码.

我读到了" 深入挖掘脚本加载的阴暗水域 ",试图弄清楚我可以依赖浏览器的订购保证.

如果我理解那里记录的技术:

  • 我需要将我的故障处理代码放在一个单独的.js文件中.
  • 然后,在某些浏览器上,我可以确保我的代码仅在第三方脚本运行或失败后运行.这要求浏览器支持:
    • <script async>通过DOM 将属性设置为false,
    • <script onreadystatechange=...>在IE 6+上使用.

尽管查看了异步支持表,但我无法确定是否可以依赖足够的浏览器中的脚本排序来实现这一点.

那么如何在加载我无法控制的脚本时可靠地处理故障呢?

html javascript asynchronous

6
推荐指数
1
解决办法
1352
查看次数

使用minifilter驱动程序进行USB阻塞(passThrough)

我正在为USB(闪存驱动器)编写一个用于阻塞的微型过滤器代码,即(拒绝访问).那么,有人可以帮助我,如何检测或阻止USB或使用什么方法在passThrough WDK示例代码中进行USB检测和USB阻塞

我想在PFLT_INSTANCE_SETUP_CALLBACK*中使用*IOCTL_STORAGE_QUERY_PROPERTY.我在正确的道路上吗?如果是,那么如何在PFLT_INSTANCE_SETUP_CALLBACK中使用IOCTL_STORAGE_QUERY_PROPERTY ???

c windows device-driver usb-flash-drive

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

为什么在使用 PostgreSQL 执行仅 SELECT 事务后我的 COMMIT 很慢?

我有一个 Web 应用程序,用于显示由单独进程生成并存储在 PostgreSQL 8.4 版中的数据。后端相当连续地写入,但 Web 应用程序中的大多数视图只执行只读 SELECT 查询。

根据 New Relic Python 代理的说法,我的视图处理时间的 30% 都花在等待 COMMIT 完成上,并且在发出大量 SELECT 查询的视图中尤其糟糕,即使它们没有修改任何数据。

我希望一个只读的事务在提交阶段几乎没有工作要做。Postgres 在 COMMIT 期间对这些只读查询做了什么?

我知道我可以关闭synchronous_commit这些事务以隐藏视图中的延迟,我当然不关心只读事务的持久性,但我不明白为什么它是必要的,我很担心这样做可能会掩盖更深层次的错误配置。

postgresql

5
推荐指数
2
解决办法
3633
查看次数

为什么使用fsync()刷新写入磁盘会加快访问速度?

我们需要尽可能多的应用程序,保证在报告记录持续存在时,它确实是.我明白你要这样做fsync(fd).但是,由于一些奇怪的原因,使用fsync()会加速写入磁盘的代码,而不是像预期的那样减慢速度.

一些示例测试代码返回以下结果:

no sync() seconds:0.013388   writes per second:0.000001 
   sync() seconds:0.006268   writes per second:0.000002
Run Code Online (Sandbox Code Playgroud)

以下是产生这些结果的代码:

#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>

void withSync() {
    int f = open( "/tmp/t8" , O_RDWR | O_CREAT );
    lseek (f, 0, SEEK_SET );
    int records = 10*1000;
    clock_t ustart = clock();
    for(int i = 0; i < records; i++) {
        write(f, "012345678901234567890123456789" , 30);
        fsync(f);
    }
    clock_t uend = clock();
    close (f);
    printf("   sync() seconds:%lf   writes per second:%lf\n", ((double)(uend-ustart))/(CLOCKS_PER_SEC), ((double)records)/((double)(uend-ustart))/(CLOCKS_PER_SEC));
} …
Run Code Online (Sandbox Code Playgroud)

c performance fsync

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

当我在函数中返回静态var的地址时,地址不正确

ProtobufCAllocator *kvs_pb_allocator()
{
    static ProtobufCAllocator allocator;
    //do something here

    return &allocator; //print the address, it is 0x2aaaaafc12c0
}
Run Code Online (Sandbox Code Playgroud)

在另一个程序中调用此函数(来自不同的文件):

ProtobufCAllocator *alloctor = kvs_pb_allocator(); 
//print the address, it is 0xffffffffaafc12c0 
Run Code Online (Sandbox Code Playgroud)

为什么会出现这个问题?我写的另一个守护程序工作正常.就在这种情况下,它打印错误的值.

c memory

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

错误:类型或类声明的格式错误

我在ubuntu的ghci中尝试了以下代码.

data Btree a=Ebt|Node a (Btree a)(Btree a)
t=Node 10( Node 20 Ebt Ebt) (Node 30 Ebt Ebt)
Run Code Online (Sandbox Code Playgroud)

编译器显示错误: Malformed head of type or class declaration

编译器很好地编译其他代码.能帮我解决一下这个问题吗?

haskell

-1
推荐指数
1
解决办法
4735
查看次数