小编Mar*_*sse的帖子

Java MongoDB/BSON类混淆

我正在尝试理解Java MongoDB驱动程序使用的BSON实现(官方的异步驱动程序,如果这很重要).

但是,我完全坚持代表BSON文档的类.我专注于"正常"的,暂时忽略了懒惰结构等功能.到目前为止,我发现:

  • BasicBSONObject
  • BsonDocument
  • 文献
  • BSONObject,由BasicBSONObject实现的接口,但不是其他接口

我还发现MongoDB驱动程序默认将其结果作为Document实例返回,并且可以更改为返回BsonDocument.OTOH,JSON类想要返回一个DBObject,它由BasicDBObject实现,扩展了BasicBSONObject.

这些课程如何相关?在哪种情况下应该使用哪一个?

编写接受BSON文档作为参数的代码或返回它时,我应该使用哪种类型?这实际上是我最感兴趣的问题,但上述限制似乎是矛盾的.

mongodb bson

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

为什么 Record 类型有时会抱怨缺少键,有时却不会?

考虑以下代码:

const testOne: Record<"foo"|"bar", string> = {
    "foo": "xyz"
};
const testTwo: Record<string, string> = {
    "foo": "xyz"
};
Run Code Online (Sandbox Code Playgroud)

第一个示例会导致错误,指出缺少属性“bar”。第二个示例不会导致错误。这让我感到困惑,因为我试图了解 Record 是否是一种暗示其键类型的所有可能值的现有属性的类型。

如果 Record 是一种不要求所有可能的键实际存在于该类型的值中的类型,那么第一个示例不应导致错误。

如果 Record一种要求所有可能的键实际存在于该类型的值中的类型,那么第二个示例也应该会导致错误。在这种情况下,不可能构造该类型的值,因为可能的键集是无限的。

如果有第三种选择——这似乎是根据我尝试编译示例时实际发生的情况而定的——它是什么?我发现两种键类型之间的主要区别在于,一种具有有限的值集,另一种具有无限的值集。这是用来区分的吗?

除此之外,我能找到的唯一解释是 Record 不仅根据其键类型的值集进行区分,还根据其键类型的其他一些属性进行区分。如果是这样,密钥类型的哪些属性会产生影响?或者 Record 是否执行相当于“绕过接口,转换为实现类型并执行一些您不应该执行的操作”的类型系统?

Record的实现是

type Record<K extends keyof any, T> = {
    [P in K]: T;
};
Run Code Online (Sandbox Code Playgroud)

我在这里可以发现两件事。第一个是将 K 绑定到“keyof any”,但据我所知,这限制了 K 可使用哪些类型,而不是限制了结果类型的有效值。其次,我们有一个正常的索引签名,所以我的猜测是,我在 Record 中感到困惑的实际上是索引签名的行为 - 但由于其他问题,我无法在没有 Record 的情况下轻松重现此行为,所以我不这样做不想急于下结论。

types record typescript

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

Java HornetQ客户端中的线程处理

我试图了解如何处理连接到HornetQ的Java客户端中的线程.我没有得到一个特定的错误,但没有理解我是如何预期首先处理线程(关于HornetQ客户端,特别是MessageHandler.onMessage()- 线程一般对我没有问题).

如果这是相关的:我正在使用'org.hornetq:hornetq-server:2.4.7.Final'嵌入我的应用程序的服务器.我不打算这有所作为.在我的情况下,从操作角度来看,这比运行独立服务器进程更方便.

到目前为止我做了什么:

  1. 创建嵌入式服务器: new EmbeddedHornetQ(), .setConfiguration()

  2. 创建服务器定位器: HornetQClient.createServerLocator(false, new TransportConfiguration(InVMConnectorFactory.class.getName()))

  3. 创建一个会话工厂: serverLocator.createSessionFactory()

现在看来很明显,我认为我可以通过创建一个会话hornetqClientSessionFactory.createSession(),创建该会话的生产者和消费者,并使用一个线程内的信息处理.send().receive().

但我也发现了consumer.setMessageHandler(),这告诉我,我根本不理解客户端中的线程.我尝试使用它,但随后消费者调用messageHandler.onMessage()两个与创建会话的线程不同的线程.这看起来与我看到代码的印象相符 - HornetQ客户端使用线程池来发送消息.

这让我感到困惑.javadocs说会话是a "single-thread object",并且代码同意 - 那里没有明显的同步.但是onMessage()在多个线程中调用时,message.acknowledge()也会在多个线程中调用,而那个线程只会委托给会话. 这应该怎么样?如何查看哪个MessageHandler不从多个线程访问会话?

更进一步,我如何从onMessage()中发送后续消息?我正在使用HornetQ作为持久的"待办事项"工作队列,因此发送后续消息对我来说是一个典型的用例.但同样,在内部onMessage(),我在访问会话的错误线程中.

请注意,我可以远离MessageHandler,只是以send() / receive()允许我控制线程的方式使用.但我确信我根本不了解整个情况,而且结合多线程只是在寻找麻烦.

java multithreading thread-safety hornetq

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

根据屏幕大小更改Bootstrap DIV顺序

场景:我有一个可渲染模板的编辑器小部件(想想textarea),编辑模板的预览面板,以及渲染预览时生成的错误消息列表.我的预期布局是这样的:

small screen:            large screen:

+--------------+         +--------------+ +--------------+
|              |         |              | |              |
|    editor    |         |    editor    | |    preview   |
|              |         |              | |              |
+--------------+         +--------------+ +--------------+
|              |         +-------------------------------+
|    errors    |         |                               |
|              |         |            errors             |
+--------------+         |                               |
|              |         +-------------------------------+
|   preview    |         
|              |
+--------------+    
Run Code Online (Sandbox Code Playgroud)

我只需要这两个布局(不是三个或四个),因为只有-lg足够大才能使编辑器和预览彼此相邻.为了控制尺寸,我将col-xs-12添加到所有三个DIV,并将col-lg-6添加到编辑器和预览中(错误列表应在大屏幕上保持为12).

关于该主题的其他帖子表明,"最小"布局决定了HTML中DIV的顺序,因此它将是:编辑器,错误,预览.他们进一步指出用-pull-和-push-类改变大屏幕上的顺序.我尝试通过在预览中添加col-lg-pull-6并在错误中添加col-lg-push-6来实现这一点.据我所知,相对于元素的当前位置推/拉工作,因此应该将预览拉回到第一行,并将错误框推入第二行.

请注意,我没有使用"行"类,因为我不完全了解如何使用它们; 将元素放置到行中应该取决于屏幕大小,而不是由HTML修复(这是响应式布局的整个点,不是吗?)

其他帖子也建议将其中一个盒子渲染两次,根据屏幕尺寸使其中一个不可见,但他们缺乏彻底解释为什么这是一个好主意.这纯粹是一个布局问题,而且响应式布局的重点也是如此,所以我不必弄乱HTML以适应屏幕尺寸.

html css twitter-bootstrap twitter-bootstrap-3

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

Raspberry Pi用户界面图形驱动程序(非固件或内核部分)的内部工作原理

我试图从https://github.com/raspberrypi/userland了解Raspberry Pi图形驱动程序代码的用户区部分

到目前为止,我的理解是: - 固件blob在GPU中运行并提供类似OpenGL的接口,在较低级别上,它基于在多个28位字FIFO之一上传递的消息(字节数组) VCHIQ(其他VCHIQ队列与图形无关) - 在CPU部分,OpenGL调用被转换为GPU的消息.访问低级设施(消息队列或VCHIQ - 我还没有在代码中找到该部分)需要一个Linux内核模块,但不会发生高级逻辑. - GPU部分已关闭,但这对我来说没问题.(ARM)CPU部分是AFAIK,打开

我的最终目标是与使用裸机(不使用Linux)的GPU进行通信,但封闭的固件blob完好无损.作为第一个目标,我想了解OpenGL调用实际上是如何传递给GPU的.除此之外的任何事情都不是这个问题的一部分.

但是,我一直在寻找实际的代码.OpenGL调用使用RPC_CALL*和RPC_DO,后者调用khronos_server_lock_func_table().但是,代码中似乎缺少该功能,令我惊讶的是,我在Google上找不到任何有用的功能.

我的问题: - 我还在ARM CPU方面,还是我没有注意到移动到GPU领域?如果是后者,我在哪里越过那条线? - 假设我还在CPU端 - 该功能的代码在哪里?它是开放的,还是我们在CPU端实际上有封闭的部分?网络上的所有来源似乎都表明CPU的代码是100%开放的. - 在哪一点上,C OpenGL函数的实现实际上是向GPU发送消息?我有点期待调用代表VCHIQ的内核功能在某些时候发生,可能是作为设备文件实现的.

opengl driver raspberry-pi

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

在异步 Rust 中,Future 如何确保它只调用最新的 Waker?

这个问题的目的是了解 Futures 在 Rust 中应该如何工作。我没有一段特定的代码不起作用,而是理解如何编写 Future 来履行合约的问题。

假设你正在写一个Future。poll() 的合约允许调用者每次传递不同的 Waker,并且 Future 应该只调用最近的一个。

假设 Future 隐藏了工作线程在后台完成的实际工作。如果工作人员尚未完成创建 Future 时传递给它的工作,则 Future 应该返回 Pending 并克隆并存储 Waker。然后 Future 在一段时间内不执行任何操作,并且工作线程必须调用 Waker。这将导致 Future 再次被轮询。

假设当 Future 再次被轮询时,它认为工作线程到目前为止所做的事情还不够,因此它再次返回 Pending,并且克隆并存储在第二次调用中获得的新 Waker。

由于实际调用 Waker 的是工作线程,因此 poll() 实现必须在后台线程中更新 Waker。然而,我不清楚 poll() 实现如何以无竞争条件的方式做到这一点——但现在它变得棘手,因为细节取决于 poll() 合约中的细则,以至于,我认为,这个细则甚至没有具体指定。

可能发生的一种情况是,当 poll() 运行时,就在它想要将新的 Waker 移交给后台工作程序之前,工作程序决定是时候调用 Waker 了。它现在调用旧的Waker,即使 poll() 已经收到了一个新的 Waker,这可能会也可能不会违反合同(我认为这没有指定)。因此,人们可能会认为工作人员可以调用旧的 Waker 直到 poll() 完成,但这只有在允许工作人员在 poll() 运行时调用任一Waker 的情况下才有效,这又没有提到,并且只是必需的poll() 返回后调用新的 Waker。

最后,即使这个假设也取决于另一个未指定的事情:多线程上下文中“poll() 返回后”的确切含义,通常必须求助于专门定义的术语,例如发生后甚至定义该术语一件事接二连三地发生。

鉴于这一切, poll() 实现如何履行其仅调用最新 Waker 的契约?是否有一个文档指定了 poll() 文档中似乎缺少的所有详细信息?

future rust async-await

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

在IntelliJ中调试Java程序时,如何显示正在执行的字节码?

我正在使用 IntelliJ 来调试 Java 程序。在我目前的情况下,这恰好是 IntelliJ 本身——调试其中的问题——但过去其他代码也出现过类似的问题。

在单步执行时,在单步执行方法的某个时刻,IntelliJ 将不再显示正在执行的代码。当源代码不可用时,我习惯于单步执行反编译的字节代码,但在这种情况下,IntelliJ 不会显示任何内容——没有源代码,没有字节代码,什么也没有。当从RemoteExternalSystemProjectResolverImpl进入时会发生这种情况GradleProjectResolver

非常可疑的是,当从来自UrlClassLoader, 的类步入来自 的类时,问题就发生了PluginClassLoader

我知道,当字节码来自性质未知的类加载器时,调试器在将正在执行的字节码与源代码关联起来时会遇到问题,因为没有明确定义的机制。请注意,我完全可以单步执行反编译代码。(即使单步执行字节码指令也可以,但据我所知 IntelliJ 不支持这一点)。我不确定如何自己提供匹配的源代码,所以我宁愿查看字节码以确保我没有看到虚假信息。

我不明白的是为什么 IntelliJ 不会向我显示该字节码。与源代码不同,字节码可用的,因为毕竟它现在正在执行。

我应该怎么做才能让 IntelliJ 显示正在执行的字节码?

更新:重现步骤

  • 使用 IntelliJ 创建 IntelliJ 插件项目
  • 创建一个新文件夹,其中包含一个空的 build.gradle 文件
  • 在调试模式下运行 IntelliJ 的“来宾”实例
  • 导入空的gradle项目
  • 在“主机”IntelliJ 中,转到 RemoteExternalSystemProjectResolverImpl.resolveProjectInfo 并对 this.myDelegate.resolveProjectInfo 的内部调用设置断点
  • 在“来宾”IntelliJ 中,点击 Gradle 重新导入按钮。它应该到达断点。
  • 单步执行被调用的函数。这将显示堆栈上的帧,但没有代码——甚至没有原始或反编译的字节码。

java debugging intellij-idea

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