小编imz*_*hev的帖子

二维拉链

最近关于Haskell中关于2d网格的问题的启发,我想知道是否有可能创建一个二维拉链来跟踪列表列表中的位置.列表中的一维拉链允许我们在大型列表中实际高效地移动本地(常见示例是文本编辑器).但是我们假设我们有这样的第二个维度:

grid = 
    [[ 1, 2, 3, 4, 5]
    ,[ 6, 7, 8, 9,10]
    ,[11,12,13,14,15]
    ,[16,17,18,19,20]
    ,[21,22,23,24,25]]
Run Code Online (Sandbox Code Playgroud)

我们是否可以创建某种拉链数据结构,不仅可以高效地左右移动,而且可以在网格中上下移动?如果是这样,如果我们用无限列表的无限列表替换列表列表,我们仍然可以获得有效的运动吗?

haskell functional-programming zipper multidimensional-array data-structures

23
推荐指数
2
解决办法
1764
查看次数

Haskell使用Data.ByteString实现unix的"cat"程序

我有以下Haskell代码,实现了"cat"unix命令行实用程序的简单版本.在400MB文件上以"时间"测试性能,速度大约慢3倍.(我用来测试它的确切脚本在代码下面).

我的问题是:

  1. 这是性能的有效测试吗?
  2. 如何让这个程序运行得更快?
  3. 如何识别Haskell程序中的性能瓶颈?

关于问题2和3:我使用了GHC -prof,然后使用+ RTS -p运行,但我发现这里的输出有点无法提供信息.

来源(Main.hs)

module Main where

import System.IO
import System.Environment
import Data.ByteString as BS

import Control.Monad

-- Copied from cat source code
bufsize = 1024*128

go handle buf = do
  hPut stdout buf
  eof <- hIsEOF handle
  unless eof $ do
    buf <- hGetSome handle bufsize
    go handle buf

main = do
  file    <- fmap Prelude.head getArgs
  handle  <- openFile file ReadMode
  buf     <- hGetSome handle bufsize
  hSetBuffering stdin $ BlockBuffering (Just bufsize) …
Run Code Online (Sandbox Code Playgroud)

unix performance haskell pipeline cat

23
推荐指数
3
解决办法
1319
查看次数

我如何找出Git认为顶级工作目录是什么?

可能重复:
有没有办法在一个命令中进入git根目录?

有时候,我对git认为我在Git工作目录中感到困惑,但对我来说,顶级工作目录(包含.git/)是什么并不明显.(可能这个回购是由一个错误造成的.)

那么,如果我在子目录中的某个地方,如何查找顶级Git repo目录?如何git打印它认为当前顶级工作目录的内容?

git directory find git-config git-commands

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

并行Cabal构建

当使用cabal install类似于GNU make的-jN标志时,有没有办法并行编译包?

parallel-processing haskell multicore build cabal

19
推荐指数
2
解决办法
3807
查看次数

从一开始就使用Unicode支持设计了哪些编程语言?

哪些广泛使用的编程语言是在支持Unicode的基础上设计的?

许多编程语言在后来的版本中添加了Unicode支持,但是从第一天开始就使用Unicode支持广泛使用哪种语言?

unicode programming-languages localization language-design internationalization

18
推荐指数
7
解决办法
3950
查看次数

识别unix域套接字连接的另一端

我正在试图弄清楚哪个进程占据了unix域套接字的另一端.在某些strace输出中,我已经确定了一个给定的文件描述符,它涉及我正在调试的问题,而且我想知道哪一个进程在另一端.由于与该套接字有多个连接,因此只需按路径名进行操作即可.

lsof 向我提供以下信息:

dbus-daem  4175  mvg   10u  unix 0xffff8803e256d9c0      0t0  12828 @/tmp/dbus-LyGToFzlcG
Run Code Online (Sandbox Code Playgroud)

所以我知道一些地址("内核地址"?),我知道一些套接字号,我知道路径.我可以在其他地方找到相同的信息:

$ netstat -n | grep 12828
unix  3      [ ]         STREAM     CONNECTED     12828    @/tmp/dbus-LyGToFzlcG
$ grep -E '12828|ffff8803e256d9c0' /proc/net/unix
ffff8803e256d9c0: 00000003 00000000 00000000 0001 03 12828 @/tmp/dbus-LyGToFzlcG
$ ls -l /proc/*/fd/* 2>/dev/null | grep 12828
lrwx------ 1 mvg users 64 10. Aug 09:08 /proc/4175/fd/10 -> socket:[12828]
Run Code Online (Sandbox Code Playgroud)

但是,这些都没有告诉我套接字连接的另一端是什么.如何判断哪个进程占据另一端?

linux kernel unix-socket

18
推荐指数
2
解决办法
5354
查看次数

Linux中的沙盒

我想创建一个Web应用程序,允许用户上传一些C代码,并查看其执行结果(代码将在服务器上编译).用户不受信任,这显然具有一些巨大的安全隐患.

所以我需要为应用程序创建一些沙盒.在最基本的层面上,我想限制对某些指定目录的文件系统访问.我无法直接使用chroot jails,因为Web应用程序不是以特权用户身份运行.我想一个suid可执行文件设置jail将是一个选项.

上传的程序相当小,因此它们应该快速执行(最多几秒钟).因此,我可以在预设超时后终止进程,但是如何确保它不会产生新进程?或者,如果我不能,那么杀死整个pgid是一种可靠的方法吗?

除了"根本不做"之外,最好的方法是什么?:)我错过了哪些其他明显的安全问题?

FWIW,Web应用程序将用Python编写.

c python linux security sandbox

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

重新定义Emacs中的"句子"?(句子之间的单个空格,但忽略缩写)

我希望能够在Emacs(Ma,Me)中逐句导航.这是问题所在:默认情况下,Emacs期望每个句子用两个空格分隔,而我习惯于只放一个空格.当然,可以关闭该设置,以允许仅由单个空格分隔的句子,如下所示:

(setq sentence-end-double-space nil)   
Run Code Online (Sandbox Code Playgroud)

但是后来Emacs认为句子在带有句号(".")的缩写后结束,例如在"......一个奇怪的命令,例如foo ......"之后.

因此,有没有一种方法来定义句末项变量,以便它将[.!?]计为标记句子的结尾,iff后面是一个或多个空格后跟一个大写字母[ AZ]?

并且...也允许[.!?]标记句子的结尾,如果后跟零或多个空格后跟"\"?[后一种情况的原因是编写LaTeX代码:其中一个句子后跟一个LaTeX命令,如\ footnote {},例如"......所以我们可以看到这一点被证明了.\ footnote {在某些替代世界,至少.}"]

我试着玩弄句末的定义,并提出:

(setq sentence-end "[.!?][]'\")}]*\\(\\$\\|[ ]+[A-Z]\\|[ ]+[A-Z]\\| \\)[
 ;]*")
Run Code Online (Sandbox Code Playgroud)

但这似乎根本不起作用.

有什么建议?

regex emacs nlp typography punctuation

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

为什么Curry的std lib中的非确定性选择函数没有直接定义,而是使用辅助2参数函数?

考虑一个函数choose库里的编程语言与"规范(choose xs)的非确定性选择一个元素从列表中xs".

我将通过两个替代的非确定性规则直接实现它:

choose :: [a] -> a
choose x:_ = x
choose _:xs = choose xs
Run Code Online (Sandbox Code Playgroud)

但是在Muenster Curry Compiler的 /usr/lib/curry-0.9.11/Success.curry中,它使用辅助函数定义:

choose (x:xs) = choosep x xs
  where choosep x [] = x
        choosep x (_:_) = x
        choosep _ (x:xs) = choosep x xs
Run Code Online (Sandbox Code Playgroud)

编译器提供的模块定义的优点(如果有的话)是什么?2个定义是否完全等价(即使在一些非确定性和未定义值的棘手情况下)?在某些情况下,其中一个更有效吗?

增加:更深入的考虑

cthom06(谢谢!)已经正确地指出我的定义会导致在更多情况下达到未定义的值(因为我们会尝试使用一个空列表参数调用此函数,每次我们的"顶级"调用一次非空列表参数).(嗯,为什么我没有立刻注意到这个考虑因素?..)效率较低.

但我想知道:有任何语义差异吗?可能在一些棘手的情况下,差异是否重要?

我们看到两个定义之间的差异 - 在非空列表的情况下 - 基本上归结为两个潜在定义之间的差异id:

我的定义就像定义id为:

id x = x
id _ = undefined
Run Code Online (Sandbox Code Playgroud)

他们的定义就像定义id正常的方式:

id …
Run Code Online (Sandbox Code Playgroud)

recursion functional-programming list non-deterministic curry

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

如何在不安装包的情况下运行测试?

我有一些Python包和一些测试.这些文件是在http://pytest.org/latest/goodpractices.html#choosing-a-test-layout-import-rules之后布局的.

将测试放在实际应用程序代码之外的额外目录中,如果您有许多功能测试或其他原因需要将测试与实际应用程序代码分开(通常是个好主意):

setup.py   # your distutils/setuptools Python package metadata
mypkg/
    __init__.py
    appmodule.py
tests/
        test_app.py
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我运行测试时py.test,我收到一个错误

ImportError:没有名为'mypkg'的模块

我可以通过安装软件包来解决这个问题,python setup.py install但这意味着测试针对已安装的软件包而不是本地软件包运行,这使得开发非常繁琐.每当我进行更改并希望运行测试时,我需要重新安装,否则我正在测试旧代码.

我能做什么?

python pytest

14
推荐指数
2
解决办法
5303
查看次数