我正在尝试使用子进程模块启动子进程并使用Python从Linux获取其输出:
#!/usr/bin/python2.4
import subprocess
p = subprocess.Popen(['ls', '-l', '/etc'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
Run Code Online (Sandbox Code Playgroud)
但是,我经历了一些诡异:有时,p.communicate()会抛出
OSError: [Errno 10] No child processes
Run Code Online (Sandbox Code Playgroud)
什么可以导致这个例外?这里是否有任何非决定论或竞争条件会导致邋??
以下代码片段有一个内存泄漏,我花了太多时间追逐.问题是在Foo()内部,局部变量x_隐藏了成员变量x_.它也很烦人,因为编译器可能已经警告过我.海湾合作委员会是否有这样的警告标志?(对于好奇:我已经通过首先使用局部变量,然后将其更改为成员变量,但忘记删除类型声明来到达错误代码.)
struct A {
A() x_(NULL) {}
~A() {
delete x_;
}
void Foo() {
HugeThingy* x_ = new HugeThingy();
x_->Bar("I. Need. Garbage. Collection. Now.");
}
HugeThingy* x_;
DISALLOW_COPY_AND_ASSIGN(A); // Macro to prevent copy/assign.
}
Run Code Online (Sandbox Code Playgroud) 看看下面的代码片段:
A a = null
try {
a = new A();
} finally {
a.foo(); // What happens at this point?
}
Run Code Online (Sandbox Code Playgroud)
假设A的构造函数抛出运行时异常.在标记的行,我总是保证得到一个NullPointerException,或者foo()将在一半构造的实例上被调用?
Haskell 支持类型类,例如相等:
class Eq a where
(==) :: a -> a -> Bool
Run Code Online (Sandbox Code Playgroud)
Rust 对类型特征做了同样的事情:
pub trait Draw {
fn draw(&self);
}
Run Code Online (Sandbox Code Playgroud)
现在,可以在 Haskell 中声明一个列表,其元素必须属于相等类型类:(Eq a => [a]
我相信在 Haskell 中a
称为约束类型)。但是,列表的元素仍然必须是同一类型!说,全部Integer
或全部Float
或某事。然而,在 Rust 中,人们可以拥有一个值列表(向量),其中每个值都实现给定的特征,但它们不一定是相同的具体类型:Vec<Box<dyn Draw>>
。有没有办法在 Haskell 中做同样的事情?就像,我想要一个值列表,但我关心的是每个值都属于某个类型类,但不一定是相同的具体类型。
好吧,我承认我试图变得聪明:我想如果我覆盖了Shape的drawFunc属性,我可以简单地在矩形内绘制任何内容并仍然使用KineticJS的点击检测.这是我的尝试:
var shape = new Kinetic.Shape({
drawFunc: function(context) {
var id = 26; // Id of a region inside composite image.
context.beginPath();
context.rect(0, 0, w, h);
context.closePath();
this.fill(context);
this.stroke(context);
context.drawImage(copyCanvas, (id % 8) * w, flr(id / 8) * h,
w, h, 0, 0, w / 2, h / 2);
},
draggable: true
});
Run Code Online (Sandbox Code Playgroud)
因此,想法是绘制一个矩形,并使用drawImage()在矩形顶部绘制一些东西(就像一个纹理,除了它随时更改因为copyCanvas本身更改).与此同时,我预计事件处理(特别是拖放)仍然"正常工作".好吧,接下来会发生什么:我的drawImage()未覆盖的矩形部分正确检测到了点击次数.但是,图像覆盖的矩形的四分之一拒绝响应点击!现在,我的问题是为什么?我挖掘了KineticJS代码,并且向我看来,点击检测只是意味着绘制到缓冲区并查看给定的x,y点是否具有非零alpha.我无法看到我在矩形上方绘制图像会如何影响这一点.
有什么想法发生了什么?
我使用Emacs模式来注释一些文件(实际模式并不重要)。它作为一个库提供,并附带编译的Lisp代码(当然)。我想通过覆盖其中的单个功能来修改其行为。仅用于我的本地Emacs会话。现在,我只是从库的源文件中复制粘贴该函数,对其进行一些修改,然后单击eval-last-sexp
。到目前为止,一切都很好。但是,我得到的结果不一致:我不确定Emacs如何处理来自.elc
文件的功能与来自源功能的混合功能。有时,我看到自己的函数版本正在运行,有时是原始版本。非常令人困惑(烦人)。
有什么想法可以不断替换Emacs库中的lisp函数而不修改库的只读源文件吗?
是否有消息队列实现允许通过在消息流中插入“消息屏障”将工作分解为“批处理”?让我澄清一下。没有消息后,消息屏障应传递到队列中的任何消费者,直到所有的消息之前的屏障被消耗。有点像同步点。我还希望所有消费者到达障碍时都收到通知。
那里有这样的东西吗?
这个设计问题一次又一次地出现,我仍然没有一个很好的解决方案.它可能会变成一种设计模式;)但是,它似乎非常特定于C++(缺少垃圾收集).无论如何,这是问题所在:
我们有一个父对象,它保持对子对象的引用.父母的州取决于其子女的州(某些总和).为了通知其子女的状态变化,它会向他们传递对自己的引用.(在另一个变体中,它向它们传递一个回调,子进程可以调用它来通知父进程.这个回调是一个闭包,它保持对父进程的引用.)应用程序是多线程的.现在,这个设置是整个大黄蜂的潜在竞争条件和死锁的巢.要理解原因,这是一个天真的实现:
class Parent {
public:
Parent() {
children_["apple"].reset(new Child("apple", this));
children_["peach"].reset(new Child("peach", this));
}
~Parent() {
}
void ChildDone(const string& child) {
cout << "Child is DONE: " << child << endl;
}
private:
map<string, linked_ptr<Child> > children;
};
class Child {
public:
Child(const string& name, Parent* parent)
: name_(name), parent_(parent), done_(false) {}
Foo(int guess) {
if (guess == 42) done_ = true;
parent->ChildDone(name_);
}
private:
const string name_;
Parent* parent_;
bool done_;
};
Run Code Online (Sandbox Code Playgroud)
潜在问题:
我只是触及了表面,但人们可以想到其他潜在的问题. …
假设我有一个模板化的函数,它采用各种向量(但由于各种原因,我不能在模板参数中提到这一点).这是我正在尝试做的事情:在特定位置插入一个新的默认构造元素,而不知道它的类型:
template <typename T>
void foo(T* v) {
v->insert(v->begin() + 5, decltype(v->at(0))());
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,但让您了解我正在尝试做什么.我也试过使用value_type
,std::vector
但我也遇到了问题.任何想法如何解决这个问题?
我正在使用Chrome开发工具来调试我的JavaScript.当我告诉Chrome"不要暂停异常"并加载我的脚本时,我会清楚地了解突出显示的正确行的错误:
var back_buffer = goog.dom.getElement('back_buffer').getContext('2d');
--> "Uncaught TypeError: Cannot call method 'getContext' of null"
Run Code Online (Sandbox Code Playgroud)
好吧,这是有道理的:我的canvas元素名称中有一个拼写错误,因此'getElement'返回null.
现在回答我的问题:当我告诉Chrome"暂停未捕获的异常"时,它仍会正确地突出显示我的脚本中的违规行,但现在这个漂亮,可理解的错误描述已经消失了!怎么会?即使在调试模式下,我也希望看到错误消息,因为它非常有用.我四处乱窜,却找不到任何地方.
有人可以帮忙吗?
CSS引用明确表示max-height
不会继承.问题是,我希望它是继承的.但是,我似乎无法获得正确的CSS咒语.事实上,我有一个CSS课程,我想申请DIV,然后强制说所有DIV的孩子都尊重这个max-height
属性:
.my-viewer {
max-height: 800px;
}
* {
max-height: inherit;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,上面的代码不起作用.例如,在Chrome开发工具中,"max-height"的"继承"设置被删除,因为已禁用.知道如何解决这个问题吗?
在C++中,我可以在地图中查找一个键并插入它,如果它不存在单个查找的成本.我可以用Java做同样的事吗?
更新:
(对于那些必须看代码的人.)
long id = 0xabba;
int version = 0xb00b;
for (List<Object> key : keys) {
if (!index.containsKey(key)) {
index.put(key, Maps.<Long,Integer>newHashMap());
}
index.get(key).put(id, version);
}
Run Code Online (Sandbox Code Playgroud)
当键首次插入地图时,有两个查找.在C++中,我可以通过单个查找来完成它.
这可能是一个愚蠢的问题,但假设我给出了一个文件路径,并且我想知道它是否指向 tmpfs 上的文件(即,它是内存中的文件)。如何仅使用 Linux 系统调用来做到这一点?(也就是说,我不能去shell。)