这通常不是我喜欢的两件事,因为这些事情让我非常恼火(除了我的孩子).我在工作中编写了一个Haskell程序,它使用文本,xml-enumerator,attoparsec-text等库.我在工作的Windows机器上正常工作,我的Ubuntu虚拟机在工作(32位),我的Ubuntu桌面(再次32位)和运行Ubuntu(64位)的EC2实例.
我们的客户端运行的是CentOS 5.3,64位.我不能为我的生活让这个可执行文件正常运行.我尝试使用以下方法创建静态可执
ghc --make myprog.hs -optl-static -optl-pthread
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在CentOS服务器上运行该可执行文件时,我收到一条错误消息:
openFile: invalid argument (Invalid argument)
Run Code Online (Sandbox Code Playgroud)
我假设这与此处描述的错误有关.我尝试从32位和64位Ubuntu编译,尝试静态和共享版本,没有任何作用(虽然我偶尔会得到段错误而不是上面的错误消息).我可以尝试下载CentOS 5.3并为它创建一个虚拟机,但下载需要一段时间,而且我不确定哪个版本的GHC可以使用它(我尝试在他们的服务器上安装GHC 7,但我跑了进入libc问题).
在这一点上,我想出了一些可能的方法,但我想尽可能避免这些:
总而言之,这些是我真的希望我们有GHC的JVM后端的情况.我想我也可以试用LambdaVM.但我很想听听社区对这里做什么的建议.
我想在cabal沙箱中开展一个项目.但是remote-repo
我不想使用与我的非沙盒代码(即Hackage)相同的代码,而是指向不同的远程仓库.我尝试cabal.config
用remote-repo
一行在项目目录中创建一个文件,但似乎没有效果; cabal update
之后运行表明正在下载Hackage,但不是我的自定义回购.
是否支持此用例,如果支持,我该如何实现?
考虑以下内容,它sleep 60
在后台运行然后退出:
$ cat run.sh
sleep 60&
ps
echo Goodbye!!!
$ docker run --rm -v $(pwd)/run.sh:/run.sh ubuntu:16.04 bash /run.sh
PID TTY TIME CMD
1 ? 00:00:00 bash
5 ? 00:00:00 sleep
6 ? 00:00:00 ps
Goodbye!!!
Run Code Online (Sandbox Code Playgroud)
这将启动一个Docker容器,bash
作为PID1.然后fork/execs一个sleep
进程,然后bash
退出.当Docker容器死亡时,该sleep
过程也会以某种方式死亡.
我的问题是:该sleep
过程被杀死的机制是什么?我试图陷入SIGTERM
一个子进程,似乎没有被绊倒.我的假设是,SIGKILL
当关闭容器正在使用的cgroup时,某些东西(Docker或Linux内核)正在发送,但我发现没有任何文档可以澄清这一点.
编辑我最接近解释的是baseimage-docker的以下引用:
如果您的init进程是您的应用程序,那么它可能只关闭自己,而不是容器中的所有其他进程.然后,内核将强制终止其他进程,而不是让他们有机会正常关闭,可能导致文件损坏,过时的临时文件等.您真的想要优雅地关闭所有进程.
因此,至少根据这一点,暗示当容器退出时,内核将向所有剩余进程发送SIGKILL.但是我仍然希望明确它如何决定这样做(即,它是cgroups的一个特征吗?),理想情况下,一个更权威的来源会很好.
我已经将以下重写规则添加到管道而没有问题:
{-# RULES "ConduitM: lift x >>= f" forall m f.
lift m >>= f = ConduitM (PipeM (liftM (unConduitM . f) m))
#-}
Run Code Online (Sandbox Code Playgroud)
我想增加一个类似重写规则liftIO
以及
{-# RULES "ConduitM: liftIO x >>= f" forall m f.
liftIO m >>= f = ConduitM (PipeM (liftM (unConduitM . f) (liftIO m)))
#-}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这样做时,我从GHC收到以下错误消息:
Data/Conduit/Internal/Conduit.hs:1025:84:
Could not deduce (Monad m) arising from a use of ‘liftM’
from the context (Monad (ConduitM i o m), MonadIO (ConduitM i o m))
bound by the …
Run Code Online (Sandbox Code Playgroud) 我需要能够给出SHA512哈希的十六进制表示.也许我只是看起来不够努力,但我可以在Hackage上找到任何功能来做到这一点.所以我写了一个实现使用unfoldrN
.这对我的目的来说肯定足够快,但我想知道是否有人知道更快的方法.
我把我的实现作为一个要点放在Github上:https://gist.github.com/2356925.该文件还包括一个基于Numeric.showHex
QuickCheck测试和标准基准的简单实现.我目前的简单版本与unfoldrN
版本的结果是:
benchmarking simple
mean: 4.677296 ms, lb 4.656011 ms, ub 4.696684 ms, ci 0.950
std dev: 104.2791 us, lb 87.77023 us, ub 128.1627 us, ci 0.950
found 5 outliers among 100 samples (5.0%)
4 (4.0%) low mild
variance introduced by outliers: 15.195%
variance is moderately inflated by outliers
benchmarking unfoldrN_MS1
mean: 370.0101 us, lb 365.9819 us, ub 373.8619 us, ci 0.950
std dev: 20.17016 us, lb 16.92772 us, ub …
Run Code Online (Sandbox Code Playgroud) 我有一个使用Unicode语法的Haskell源文件:
{-# LANGUAGE UnicodeSyntax #-}
succ' :: Int ? Int
succ' = succ
main :: IO ()
main = print $ succ' 1
Run Code Online (Sandbox Code Playgroud)
这与GHC解析并运行良好.另外,Stylish-haskell和hlint(都基于haskell-src-exts)可以毫无困难地读取这个文件.但是,当我尝试使用haskell-src-exts解析它时:
import Language.Haskell.Exts (parseModule)
main = do
x <- readFile "test.hs"
print $ parseModule x
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
ParseFailed (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 6, srcColumn = 1}) "TypeOperators is not enabled"
Run Code Online (Sandbox Code Playgroud)
但是,在扩展列表中显式提供UnicodeSyntax或使用parseFile工作正常:
import Language.Haskell.Exts
main = do
x <- readFile "test.hs"
print $ parseModuleWithMode defaultParseMode
{ extensions = [UnicodeSyntax]
} x
parseFile "test.hs" >>= print
Run Code Online (Sandbox Code Playgroud)
知道第一种方法失败的原因吗?
我正在尝试理解管道4.0,并希望转换一些管道代码.假设我有一个Int
s 流,我想跳过前五个,然后得到以下的总和5.使用普通列表,这将是:
sum . take 5 . drop 5
Run Code Online (Sandbox Code Playgroud)
在管道中,这将是:
drop 5
isolate 5 =$ fold (+) 0
Run Code Online (Sandbox Code Playgroud)
或者作为一个完整的程序:
import Data.Conduit
import Data.Conduit.List (drop, isolate, fold)
import Prelude hiding (drop)
main :: IO ()
main = do
res <- mapM_ yield [1..20] $$ do
drop 5
isolate 5 =$ fold (+) 0
print res
Run Code Online (Sandbox Code Playgroud)
但是,我不太确定如何使用管道来做到这一点.
该blaze-builder
包提供了一个.Char.Utf8
模块,该模块包括fromText
并fromLazyText
有效地将文本包中的blaze-builder
Builder
值转换为值.bytestring
但是,使用新的Builder API ,不存在此类功能(因为bytestring
不依赖于此功能text
).我们可以解压缩Text
值并使用stringUtf8
,但这几乎肯定要慢得多.
另一种选择是使用blaze-builder
,这是现在实际上只是一个包装周围bytestring
的Builder
类型,但我不知道是否有处理这个更习惯的方法.
在下面的代码中,我明确地强制将name
frommain
函数移动到闭包中,并且一切正常:
fn main() {
let name = String::from("Alice");
let welcome = || {
let mut name = name;
name += " and Bob";
println!("Welcome, {}", name);
};
welcome();
}
Run Code Online (Sandbox Code Playgroud)
我原以为move
在闭包的开头添加 a会完成同样的事情,并导致值被移动并创建 a FnOnce
:
fn main() {
let name = String::from("Alice");
let welcome = move || {
name += " and Bob";
println!("Welcome, {}", name);
};
welcome();
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到了错误消息:
fn main() {
let name = String::from("Alice");
let welcome = || {
let mut name …
Run Code Online (Sandbox Code Playgroud) 我在网络应用程序中研究了一个现实生活中的示例,我使用不必要的堆分配解决了该示例,如下所示:
// Try replacing with (_: &String)
fn make_debug<T>(_: T) -> impl std::fmt::Debug {
42u8
}
fn test() -> impl std::fmt::Debug {
let value = "value".to_string();
// try removing the ampersand to get this to compile
make_debug(&value)
}
pub fn main() {
println!("{:?}", test());
}
Run Code Online (Sandbox Code Playgroud)
照原样,编译这段代码给了我:
// Try replacing with (_: &String)
fn make_debug<T>(_: T) -> impl std::fmt::Debug {
42u8
}
fn test() -> impl std::fmt::Debug {
let value = "value".to_string();
// try removing the ampersand to get …
Run Code Online (Sandbox Code Playgroud) 我正在使用 PostgreSQL 的全文搜索功能在客户站点上实现搜索功能。我正在使用该ts_headline
函数来获取搜索词出现的上下文,但客户对显示的单词选择不满意。特别是,标题似乎始终以搜索词开头,而客户希望它提前几个词开始。
有什么方法可以将 PostgreSQL 配置为具有这种行为,或者修改 ts_headline 调用以获得所需的结果?
编辑:抱歉,首先没有包含一些示例 SQL。
SELECT
ts_headline('english', "text", plainto_tsquery('"endpoints"'))
FROM "Page"
WHERE to_tsvector("text") @@ plainto_tsquery('"endpoints"')
ORDER BY ts_rank(to_tsvector("text"), plainto_tsquery('"endpoints"'))
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Hyper Web 服务器中创建一个计数器来计算它收到的请求数。我正在使用 aArc<Mutex<u64>>
来保持计数。但是,我一直无法弄清楚闭包的正确组合move
和.clone()
满足闭包的类型。这是一些编译代码,但在每个请求上重置计数器:
extern crate hyper;
use hyper::rt::Future;
use hyper::service::service_fn_ok;
use hyper::{Body, Response, Server};
use std::sync::{Arc, Mutex};
fn main() {
let addr = "0.0.0.0:3000".parse().unwrap();
// FIXME want to create the counter here, not below
let server = Server::bind(&addr)
.serve(|| {
service_fn_ok(|_req| {
let counter = Arc::new(Mutex::new(0));
use_counter(counter)
})
})
.map_err(|e| eprintln!("Error: {}", e));
hyper::rt::run(server)
}
fn use_counter(counter: Arc<Mutex<u64>>) -> Response<Body> {
let mut data = counter.lock().unwrap();
*data += 1;
Response::new(Body::from(format!("Counter: {}\n", data))) …
Run Code Online (Sandbox Code Playgroud) 可以将 a 借入Vec<u32>
a&Vec<u32>
或 a &[u32]
。我认为这要归功于AsRef
或Borrow
特质。但是,我无法在我自己的自定义类型上实现这种借用。我在这里吠错树了吗?
use std::borrow::Borrow;
struct MyArray([u32; 5]);
impl MyArray {
fn new() -> MyArray {
MyArray([42; 5])
}
}
impl AsRef<[u32]> for MyArray {
fn as_ref(&self) -> &[u32] {
&self.0
}
}
impl Borrow<[u32]> for MyArray {
fn borrow(&self) -> &[u32] {
&self.0
}
}
fn main() {
let ma = MyArray::new();
let _: &[u32] = &ma; // compilation failure
}
Run Code Online (Sandbox Code Playgroud) haskell ×7
rust ×4
conduit ×2
linux ×2
bytestring ×1
cabal ×1
cgroups ×1
docker ×1
ghc ×1
hyper ×1
ld ×1
libraries ×1
postgresql ×1
rust-tokio ×1