小编rlk*_*024的帖子

Nokogiri是针对LibXML 2.7.7版本构建的,但动态加载了2.7.3

在Rails 3,我发现我每次调用框架,无论是从rake,rails server或其他任何东西,我得到以下警告:

Nokogiri was built against LibXML version 2.7.7, but has dynamically loaded 2.7.3
Run Code Online (Sandbox Code Playgroud)

在Google上搜索会产生一些博客文章,所有帖子都建议使用显式库和包含路径重建Nokogiri.例如:

http://mrflip.github.com/2009-08/nokogiri-hates-libxml2-on-osx.html

但是,这并没有为我解决问题.

打字nokogiri -v给我这个:

--- 
warnings: []

ruby: 
  engine: mri
  version: 1.8.7
  platform: i686-darwin10.4.0
libxml: 
  loaded: 2.7.7
  binding: extension
  compiled: 2.7.7
nokogiri: 1.4.4
Run Code Online (Sandbox Code Playgroud)

这似乎表明我的构建运行正常,Nokogiri正在加载正确的库版本.为什么Rails会抱怨?

我实际上找到了答案,我想我会在这里分享.请参阅下面的答案.

ruby ruby-on-rails nokogiri

10
推荐指数
2
解决办法
1978
查看次数

glEnableClientState与现代OpenGL(glVertexAttribPointer等)

我想列出一些我认为我已经学到的东西,但我不确定:

  • 维多利亚州立大学是要走的路.他们是用glGenBuffers和创造的glBufferData.
  • 为了获得最大的灵活性,最好通过通用的顶点属性与着色器glVertexAttribPointer,而不是glVertex,glNormal等.
  • glDrawElements 可以与顶点缓冲区和索引缓冲区一起使用,以有效地渲染具有大量共享顶点的几何体,例如横向网格.

假设到目前为止所有这些都是正确的,这是我的问题.我读过的关于现代OpenGL的所有教程都完全省略了glEnableClientState.但OpenGL手册页说没有glEnableClientState,glDrawElements什么都不做:

http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml

关键的通道是:"如果GL_VERTEX_ARRAY没有启用,则不构造几何图元."

这引出了以下问题:

  • glEnableClientState在调用之前没有教程使用glDrawElements.这是否意味着手册页错误或过时?
  • GL_VERTEX_ARRAY似乎是启用,如果你要使用的东西glVertexPointer,同样你会使用GL_NORMAL_ARRAYglNormalPointer,等等.但是,如果我没有使用这些函数,而是使用通用顶点属性glVertexAttribPointer,那么为什么需要启用GL_VERTEX_ARRAY

opengl

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

为什么变量的寿命不够长?

考虑这个应该返回给定文件扩展名的函数Path.

pub fn get_extension<'a>(path: &'a Path) -> Option<&'a str> {
    let path_str = path.as_str().unwrap();
    let ext_pos = regex!(".[a-z0-9]+$").find(path_str);

    match ext_pos {
        Some((start, _)) => {
            return Some(path_str.as_slice().slice_from(start))
        },
        None => return None
    }
}
Run Code Online (Sandbox Code Playgroud)

错误消息如下:

`path_str` does not live long enough
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

错误信息很清楚,很遗憾我无法自己解决这个问题.我在理论上理解它,但对我来说还有一些模糊的东西.

据我所知,编译器想告诉我,path_str活动时间不够长,因为返回值标记为生命周期'a.

但这就是它停止的地方:

  • 据我所知,对path(输入参数)的引用应该与strOption(包含在输出参数中)的引用完全一样长

  • 因为我们回来了,Some(path_str.as_slice().slice_from(start))我认为在实践中,这意味着只path_str需要生活path.

我不明白的是到底为什么path_str不活足够长的时间,我怎么能解决这个问题?是什么让它很快死去?

UPDATE

正如在评论中指出的那样以及IRC中删除superflous as_slice()使代码编译.有谁知道那是为什么?还有人指出存在一种直接获得扩展的方法.但是,我实际上更感兴趣的是学习问题背后的故事.

lifetime object-lifetime rust

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

缺少目录索引时404 vs 403

这主要是关于解释HTTP规范的最佳方式的哲学问题.没有目录索引的目录(例如index.html)是应该返回404还是403?(403是Apache中的默认值.)

例如,假设存在以下URL并且可以访问:

http://example.com/files/file_1/
http://example.com/files/file_2/
Run Code Online (Sandbox Code Playgroud)

但是没有什么在:

http://example.com/files/
Run Code Online (Sandbox Code Playgroud)

(假设我们使用301s强制所有URL使用斜杠.)

我认为应该考虑几件事:

  • 默认情况下,Apache在此方案中返回403.这对我很重要.他们考虑过这个问题,他们决定使用403.
  • 根据W3C,403表示"服务器理解请求,但拒绝履行请求".我认为这意味着如果URL有意义但仍然禁止,则应返回403.
  • 如果客户端正确猜测URL映射到磁盘上的真实目录,则403可能导致信息泄露.
  • http://example.com/files/ 不是资源,它内部映射到目录的事实应该与状态代码无关.
  • 如果您将URL方案解释为从客户端的角度定义目录结构,则内部实现仍然无关紧要,但外观可能确实对状态代码有一些影响.也许,即使你在内部不使用目录创建了相同的URL结构,你仍然应该使用403s,因为它是关于客户端对目录结构的感知.

总而言之,您认为最好的方法是什么?我们应该只说"资源是一种资源,如果它不存在,它就是404?" 或者我们应该说,"如果它有斜杠,它看起来像客户端的目录,因此如果没有索引它就是403?"

如果你在403阵营,你认为即使内部实现不使用目录,你也应该尽力返回403s?例如,假设您有一个带有此URL的动态Web应用程序:http://example.com/users/joe,它映射到生成Joe的配置文件页面的某些代码.假设您没有写出列出所有用户的内容,应该http://example.com/users/返回403吗?(在这种情况下,许多(如果不是所有)Web框架都返回404.)

apache http http-status-codes http-status-code-403 http-status-code-404

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

GLSL #version提供语法错误(Mac上的LWJGL)

使用LWJGL时,指定GLSL版本会出现语法错误.我没有尝试在LWJGL之外重现这个问题.这是在运行Lion的多台Mac上发生的.

我已经使顶点和片段着色器无需使用即可工作#version.但我即将使用该texture函数,这似乎需要一个#version指令.

这是最简单的失败示例:

#version 120

void main() {
  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

编译此片段着色器并调用glGetShaderInfoLog会出现此错误:

ERROR: 0:1: '' : syntax error #version
Run Code Online (Sandbox Code Playgroud)

替换120其他任何东西,例如110,也会出错.但奇怪的是,如果我使用130或更高,它会给出相同的错误以及对不支持的版本的抱怨.(我知道我的系统没有GLSL 1.3,但是当编译器表现得像它不理解版本标签时,显示此错误仍然很奇怪.)

我在Mac上使用ATI的Radeon HD 4670. GL_VERSION2.1 ATI-7.12.9GL_SHADING_LANGUAGE_VERSION1.20.

鉴于此,我认为没有任何理由说明为什么GLSL 1.20不可用.对我来说,这#version是一个非常奇怪的说它是一个语法错误,而不是说一个不受支持的GLSL版本.

java opengl glsl lwjgl

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

通过Rake测试运行时,不会调用最小的#setup和#teardown

我有一个MiniTest套件.我使用的是基本的Minitest::Unit::TestCase,而不是规格.我setupteardown我的定义方法TestCase的子类.当我运行这样的测试文件时,它们完美地工作:ruby test/whatever_test.rb.但是当我跑步rake test,setupteardown没有被召唤.我的Rakefile的相关部分是:

require 'rake/testtask'

Rake::TestTask.new do |t|
  t.test_files = FileList['test/*_test.rb']
  t.verbose = true
end
Run Code Online (Sandbox Code Playgroud)

为什么不setupteardown被运行时Rake::TestTask使用?

我将测试用例代码粘贴到这里,但是它有很多.如果你想看到一个特定的部分,我肯定会粘贴它的某个子集.

我在Ruby 1.9.3-p194上运行Minitest 4.3.2.

ruby testing minitest

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

在Haskell中通过网络传递函数

假设如下:

我有一个名为World代表一些模拟状态的类型.我也有这种类型的同义词:

type Update = World -> World
Run Code Online (Sandbox Code Playgroud)

Haskell是否能够序列化Update类型以便它可以通过网络传递?或者还有其他方法吗?也许我不是在寻找代码逻辑的序列化,因为某种指针或标识符可以在另一端读取.发送和接收进程都运行相同的Haskell程序.

haskell

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

代数数据类型的特征

我无法理解代数数据类型中的特征规则.这是一个简化的例子:

use std::rc::Rc;
use std::cell::RefCell;

trait Quack {
    fn quack(&self);
}

struct Duck;

impl Quack for Duck {
    fn quack(&self) { println!("Quack!"); }
}

fn main() {
    let mut pond: Vec<Box<Quack>> = Vec::new();
    let duck: Box<Duck> = Box::new(Duck);
    pond.push(duck); // This is valid.

    let mut lake: Vec<Rc<RefCell<Box<Quack>>>> = Vec::new();
    let mallard: Rc<RefCell<Box<Duck>>> = Rc::new(RefCell::new(Box::new(Duck)));
    lake.push(mallard); // This is a type mismatch.
}
Run Code Online (Sandbox Code Playgroud)

以上无法编译,产生以下错误消息:

 expected `alloc::rc::Rc<core::cell::RefCell<Box<Quack>>>`,
    found `alloc::rc::Rc<core::cell::RefCell<Box<Duck>>>`
(expected trait Quack,
    found struct `Duck`) [E0308]
src/main.rs:19     lake.push(mallard);
Run Code Online (Sandbox Code Playgroud)

为什么它pond.push(duck)有效,但lake.push(mallard) …

rust

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

在由多个数据结构引用时更新记录

假设我有一个记录,例如Person,我希望能够通过多个数据结构查看此人.也许有一个名字的索引,一个人的邮政编码的另一个索引,以及该人当前纬度和经度的另一个索引.也许还有更多的数据结构.所有这些都存在,因为我需要有效地查找具有不同标准的人.

如果我只需要阅读一个人的属性,这是没有问题的.但现在假设我需要使用其中一个数据结构查找一个人,然后更新该人的数据.

在OOP语言中,每个数据结构都指向内存中的同一个人.因此,当您更新一个时,您也隐式更新其他数据结构的引用.这几乎是副作用和杂质的定义.我知道这完全违背了Haskell范式,我并不期望Haskell以这种方式工作.

那么,什么是Haskell-ish方法呢?要清楚,问题是这样的:我通过一个数据结构查找一个人,并将该人(可能还有一些其他任意数据)传递给一个类型的函数ArbitraryData -> Person -> Person.如何在所有各种查找结构中传播此更改?

作为Haskell的相对新人,我的第一直觉是每次更新一个人时,都会使用新更新的人重建每个查找结构.但这似乎很多仪式,我有充足的机会搞砸了GHC无法察觉的方式,而且一点也不优雅.Haskell以其优雅而闻名,我无法想象它缺乏这种常见和基本问题的优雅解决方案.所以我想我错过了一些东西.

作为参考,这个问题扩展了我在以下问题中讨论的一些问题:

相同数据的多个查找结构:内存重复?

Haskell中模拟对象的身份

编辑

我想到的一个解决方案:不要在主状态中维护每个查找结构的副本.只保留一个存在的所有人的列表,这是我们更新人员时唯一需要更新的事项.每次你需要通过邮政编码进行查询时,将所有人员的列表传递给一个生成有效的by-zip-code数据结构的函数.然后对结果执行查找.

我不知道这是否有效.如果它导致CPU在每次使用时实际重新计算查找结构,则这是不可接受的.但我知道Haskell有时可以避免重新评估相同的表达式.不幸的是,这种情况下我仍然没有想到.所以我不知道这种方法是否可行.

换句话说:我可以编写我的函数,就好像他们每次都在计算查询一样,实际上GHC会在底层数据没有改变的情况下优化它吗?因为那将是我上面提到的问题的一个非常优雅的解决方案.

haskell

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

当多个Rust源文件共享同一名称时,我可以设置LLDB断点吗?

背景:在Rust中,通常会调用多个源文件mod.rs.例如:

app_name
  src
    main.rs
    foo
      mod.rs
    bar
      mod.rs
Run Code Online (Sandbox Code Playgroud)

问题:mod.rs在设置LLDB断点时,我无法找到区分彼此的方法:

$ cargo build
$ rust-lldb target/debug/app_name

(lldb) breakpoint set -f mod.rs -l 10
Breakpoint 1: 2 locations.

(lldb) breakpoint set -f foo/mod.rs -l 10
Breakpoint 2: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.

(lldb) breakpoint set -f src/foo/mod.rs -l 10
Breakpoint 3: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.
Run Code Online (Sandbox Code Playgroud)

这个问题最常见mod.rs.更一般地说,任何时候多个源文件共享相同的名称就会出现.

问题:有没有办法在第10行foo/mod.rs而不是第10 …

rust lldb

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