测试几个布尔表达式的推荐方法是什么?
我一直在用这个:
case () of () | test1 -> value1
| test2 -> value2
| otherwise -> value3
Run Code Online (Sandbox Code Playgroud)
这是好风格吗?有更漂亮的方式吗?
经过几个小时尝试调试遇到fopen()问题的第三方应用程序后,我终于发现了这一点
php -r 'echo(file_get_contents("http://www.google.com/robots.txt"));'
Run Code Online (Sandbox Code Playgroud)
失败了,但是
php -r 'echo(file_get_contents("http://173.194.32.81/robots.txt"));'
Run Code Online (Sandbox Code Playgroud)
成功.请注意,作为网络服务器用户,我可以ping www.google.com并且它解析得很好.
我把两个PHP的执行都绑定了,它们分歧如下:
对于数字v4 URL:
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("173.194
poll([{fd=3, events=POLLOUT}], 1, 0) = 0 (Timeout)
...[bunch of poll/select/recvfrom]...
close(3) = 0
Run Code Online (Sandbox Code Playgroud)
对于域名:
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
close(3) = 0
Run Code Online (Sandbox Code Playgroud)
似乎PHP甚至没有尝试对该套接字做任何事情.或者甚至解决域名问题.WTF?
使用或不使用ipv6支持重新编译PHP似乎并不重要.不希望在此系统上禁用ipv6.
Gentoo Linux,PHP 5.3.14,目前试用PHP 5.4并看看它是否有帮助.有人有想法吗?
编辑:
php -r 'echo gethostbyname("www.google.com");'
Run Code Online (Sandbox Code Playgroud)
工作并产生一个ipv4,而
php -r 'echo(file_get_contents("http://[2a00:1450:4007:803::1011]/"));'
Run Code Online (Sandbox Code Playgroud)
似乎返回空白结果.
编辑2:
我第一次没注意到,当使用名称时打开的v6套接字是SOCK_DGRAM.这个PHP试图解析域名吗?我尝试在resolv.conf中将我的解析器从127.0.0.1切换到:: 1,但它没有帮助.
我理解为什么需要重新实现可能阻塞当前线程的结构,例如Mutex
and RwLock
,以依赖于 futures/waker API,但为什么需要这样做Arc
?
据我了解,标准上没有任何操作Arc
是阻塞的,而在最新版本中,async_std::sync::Arc
只是将std::sync::Arc
.
这是否是面向未来的,以防未来的实现Arc
需要依赖阻塞?
我应该在异步代码中使用哪一个,为什么?
我有一个C++类,我需要定义一个比较器,它应该考虑几种可能很昂贵的方法的结果.我不想为我的集合中的所有对象缓存这些方法的结果,因为具有最高优先级的标准更便宜,并且我希望底部非常昂贵的标准仅在极少数情况下触发.
如果我有一个cmp()函数分别返回-1,0或1,当第一个参数小于,等于或大于第二个时,并且使用保存整数的快捷逻辑运算符,我可以轻松地写
int compare(const Class &rhs) const {
return cmp(expensive_method_a(), rhs.expensive_method_b()) ||
cmp(expensive_method_b(), rhs.expensive_method_b()) ||
...
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我需要使用<运算符,因此它变得丑陋,昂贵且容易出错:
bool operator<(const Class &rhs) const {
return expensive_method_a() < rhs.expensive_method_a() ||
(expensive_method_a() == rhs.expensive_method_a() &&
(expensive_method_b() < rhs.expensive_method_b() ||
(expensive_method_b() == rhs.expensive_method_b() &&
(...
))))
}
Run Code Online (Sandbox Code Playgroud)
或者,成本更低但仍然相当难看:
bool operator<(const Class &rhs) const {
auto al = expensive_method_a(), ar = rhs.expensive_method_a();
if (al != ar) return al < ar;
auto bl = expensive_method_b(), br = rhs.expensive_method_b();
if (bl != br) return bl < …
Run Code Online (Sandbox Code Playgroud) 我正在Haskell中编写彩虹表的玩具实现。主要数据结构是严格的Map h c
,包含大量从随机值生成的对c
:
import qualified Data.Map as M
import System.Random
table :: (RandomGen g, Random c) => Int -> g -> Map h c
table n = M.fromList . map (\c -> (chain c, c)) . take n . randoms
Run Code Online (Sandbox Code Playgroud)
在哪里chain
计算非常昂贵。占主导地位的计算时间部分令人尴尬地是并行的,因此,如果并行运行,我希望内核数量获得准线性加速。
但是,我希望将计算对立即添加到表中,而不是累积在内存中的列表中。应当注意,可能会发生冲突,在这种情况下,应尽快丢弃冗余链。堆分析确认是这种情况。
我parMap
从找到了Control.Parallel.Strategies
,并尝试将其应用于我的表构建功能:
table n = M.fromList . parMap (evalTuple2 rseq rseq) (\c -> (chain c, c)) . take n . randoms
Run Code Online (Sandbox Code Playgroud)
但是,运行时-N
,充其量只能达到1.3核心使用率。堆分析至少表明中间列表不驻留在内存中,但是“ -s”还报告创建了0个火花。我的用法怎么可能parMap
?这样做的正确方法是什么? …
我有一个以潜在高速率生成点的数据源,并且我想对每个点执行可能耗时的操作;但我也希望系统在过载时通过删除多余的数据点来优雅地降级。
据我所知,使用 gen_event 永远不会跳过事件。从概念上讲,我希望 gen_event 做的是在再次运行处理程序之前删除除最新待处理事件之外的所有事件。
有没有办法用标准 OTP 来做到这一点?或者我有充分的理由不应该那样处理事情吗?
到目前为止,我最好的方法是使用 gen_server 并依靠超时来触发昂贵的事件:
-behaviour(gen_server).
init() ->
{ok, Pid} = gen_event:start_link(),
{ok, {Pid, none}}.
handle_call({add, H, A},_From,{Pid,Data}) ->
{reply, gen_event:add_handler(Pid,H,A), {Pid,Data}}.
handle_cast(Data,{Pid,_OldData}) ->
{noreply, {Pid,Data,0}}. % set timeout to 0
handle_info(timeout, {Pid,Data}) ->
gen_event:sync_notify(Pid,Data),
{noreply, {Pid,Data}}.
Run Code Online (Sandbox Code Playgroud)
这种做法正确吗?(特别是关于监督?)
考虑 const 通用数据结构的经典示例:方阵。
struct Matrix<T, const N: usize> {
inner: [[T; N]; N]
}
Run Code Online (Sandbox Code Playgroud)
我想返回一个其 const 参数是动态定义的结构:
fn read_matrix() -> ??? {
let n: usize = todo!() // the N is decided dynamically
let r: Box<Matrix<u8, {n}>> = todo!();
r
}
Run Code Online (Sandbox Code Playgroud)
但:
n
不是一个常数fn read_matrix<const N: usize>() -> Matrix<u8, N>
还不够,因为它让调用者选择 N,而我希望 N 在运行时确定。我可以通过定义一个特征来解决第二个限制:
trait DynamiMatrix {
fn size(&self) -> usize;
fn some_method(&self);
...
}
impl<T, const N: usize> DynamicMatrix for Matrix<T,N> {
fn size(&self) …
Run Code Online (Sandbox Code Playgroud)