小编loc*_*cka的帖子

如何为包含String的类型实现复制和克隆?

我在Rust中有一个枚举,它有一个值需要一个String.这可以用这个简单的例子来证明:

#[derive(Clone, Copy)]
enum Simple {
    Error(String),
    Okay,
    Foo([u32; 5]),
}

fn main() {
    let x = Simple::Error(String::from("blah"));
    let y = x.clone();
}
Run Code Online (Sandbox Code Playgroud)

Foo上面的枚举值代表我使用的大约10个其他枚举,它们采用可复制类型或它们的数组.编译器似乎没有抱怨它们,只有Error(String)这导致了这个:

error[E0204]: the trait `Copy` may not be implemented for this type
 --> src/main.rs:1:17
  |
1 | #[derive(Clone, Copy)]
  |                 ^^^^
2 | enum Simple {
3 |     Error(String),
  |           ------ this field does not implement `Copy`
Run Code Online (Sandbox Code Playgroud)

出于某种原因,String不可复制.我不懂.Clone对于其他类型的枚举,如何使用默认impl进行其余操作时,如何实现枚举?

rust

18
推荐指数
2
解决办法
8607
查看次数

如何渲染令人信服的天幕?

我正在编写一个渲染3D岛的OpenGL ES 2.0应用程序.我已经有了在岛上生成天空圆顶的代码.这是一个由三角形组成的半球,它以z点向上铺设岛屿.

圆顶有一些非常基本的移动云,使用perlin噪声纹理覆盖在自身上并移动不同的速度.

但最终我还需要圆顶渲染:

  • 太阳(跟踪天空)月亮(包括阶段)
  • 星星(晚上)
  • 遥远的土地作为静态纹理
  • 不同的颜色来模拟夜晚,黎明,黄昏,白天

我需要非常有效地完成这项工作,因为它最终会在Android上运行,尽管它目前在测试工具中运行.因此,例如太阳,月亮和星星将只是纹理,尽管它们的点可以以合理的准确度绘制.

我已经有了生成圆顶的代码,以及根据日期和时间绘制太阳的代码.所以主要是我需要的着色器以及它们提供的是什么.

有没有举例说明这些事情?我发现很多基本的立方体地图或有限的东西,但没有达到我需要的复杂程度.显然,因为这是OpenGL ES 2.0,它必须在着色器中完成.

我现有天空圆顶的着色器渲染2层perlin噪声来模拟云.纹理连续包裹,因此我可以根据圆顶顶点到xy平面的角度(通过将x和y馈入atan)和使用圆顶顶点z的v偏移来计算u偏移.

顶点着色器演示了我是如何做到的:

#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

attribute vec4 aVertex;

uniform mat4 uPMVMatrix;
uniform float uTime;
uniform float uSkyDomeRadius;

const float PI = 3.1415926535897932384626433832795;

varying vec2 texCoord0, texCoord1;

void main()
{
    vec2 centre = vec2(600., 600.);

    gl_Position = uPMVMatrix * aVertex;

    float slow_time = uTime / 100.;

    vec2 dome_point = aVertex.xy - centre;
    float tex_u = atan(dome_point.x, dome_point.y);// / (.25 * PI); …
Run Code Online (Sandbox Code Playgroud)

java jogl opengl-es-2.0 libgdx

13
推荐指数
1
解决办法
2355
查看次数

打开对话框时如何处理屏幕方向更改?

我有一个Android应用程序,它已经处理了方向的更改,即android:configChanges="orientation"清单和onConfigurationChange()活动中的处理程序切换到适当的布局并准备它.我有一个横向/纵向版本的布局.

我面临的问题是活动有一个对话框,当用户旋转设备方向时,该对话框可以打开.我还有对话框的横向/纵向版本.

我是否应该动态更改对话框的布局,或者锁定活动的旋转,直到用户解除对话框为止.

后一个锁定应用程序的选项吸引我,因为它节省了在对话框中做任何特殊事情.我想我可能会在对话框打开时禁用方向,例如

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
Run Code Online (Sandbox Code Playgroud)

然后当它解散

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
Run Code Online (Sandbox Code Playgroud)

这是明智的做法吗?如果屏幕方向在锁定时确实发生了变化,它会在解锁时立即感知到方向的变化吗?

还有替代品吗?

java android

11
推荐指数
1
解决办法
5717
查看次数

如何在GWT中禁用代码拆分?

我们有一个非常大的GWT项目,导致一个大约2Mb的单片应用程序.分解它的明显方法是使用分裂点.例如,我们的应用程序是菜单驱动的,因此每个菜单操作背后的逻辑可能是一个分裂点.此外,调用GWT RPC的代码也可以是一个分裂点.通过这种方式,一个2Mb的应用程序可能会分解为一个300K的启动应用程序,其余部分在首次使用时加载.

GWT将对GWT.runAsync()的调用视为可以将JS分解为在运行时异步加载的较小部分的位置.例如,要设置调用doSomething()的分割点,我们这样写:

GWT.runAsync(new RunAsyncCallback() {
  public void onFailure(Throwable caught) {
    Window.alert("Oh dear could not load app");
  }

  public void onSuccess() {
    doSomething();
  }
});
Run Code Online (Sandbox Code Playgroud)

GWT编译器将看到此代码并将其标记为分割的候选者,并将代码分解为较小的片段,这些片段将在首次使用时加载.

我们遇到的问题是,如果我们将分割点放入代码中,那么构建需要花费10-50倍的时间来执行.我想在处理包含大量类的项目时,代码效率不高.所以2分钟的构建成为20-100分钟的构建,这是不可接受的.

所以问题是,我怎样才能将分裂点放入代码中,但是除非我明确要求,否则会阻止编译器分裂?我设想日常开发将忽略分裂点,但夜间或生产构建将分裂.

有任何想法吗?

java gwt

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

如何在 Tokio 中安排重复任务?

我将用 Rust 编写的同步套接字代码替换为使用 Tokio 的异步等效代码。Tokio 使用 future 进行异步活动,因此任务会链接在一起并排队到执行器上,由线程池执行。

我想做的基本伪代码是这样的:

let tokio::net::listener = TcpListener::bind(&sock_addr).unwrap();
let server_task = listener.incoming().for_each(move |socket| {
    let in_buf = vec![0u8; 8192];
    // TODO this should happen continuously until an error happens
    let read_task = tokio::io::read(socket, in_buf).and_then(move |(socket, in_buf, bytes_read)| {
        /* ... Logic I want to happen repeatedly as bytes are read ... */
        Ok(())
    };
    tokio::spawn(read_task);
    Ok(())
}).map_err(|err| {
    error!("Accept error = {:?}", err);
});
tokio::run(server_task);
Run Code Online (Sandbox Code Playgroud)

这个伪代码只会执行我的任务一次。我如何连续运行它?我希望它执行,然后一次又一次执行等等。我只希望它在出现紧急情况或有错误结果代码时停止执行。最简单的方法是什么?

future rust rust-tokio

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

如何为新工作区设置默认代码格式和模板

Eclipse允许Java类文件使用自定义格式和模板.更改这些设置的常规方法是从Windows | 首选项菜单,然后在首选项对话框中选择Java>代码样式.格式化程序控制大括号,缩进等的工作方式.该模板管理新类文件中出现的文件,类和方法标题的类型.

我有两个这些设置的文件,我必须导入并设置才能生效.有时我创建一个工作区而忘记设置模板.然后格式化选择错误的样式或省略锅炉板,如果我在入住时没有捕获.这会导致文件非标准,如果出错,可能会导致其他人发生合并冲突,反之亦然.

是否可以轻松修改Eclipse,以便在创建新工作区时始终默认使用自定义格式和模板?即使我必须将XML放到某个地方的Eclipse文件夹中并调整一些设置,我希望能够做到这一点,并为我团队中的其他人提供相同的指令.

java eclipse

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

为什么 GitLab CI SAST 不排除我要求其排除的目录?

我已在 GitLab CI(GitLab 社区版)14.5.2 中启用了 SAST 扫描。SAST 运行 semgrep 和 ESLint 等工具,在源代码上运行并扫描漏洞。这是有效的......除了它没有从我告诉它的结果中排除路径和文件,所以我的报告充满了来自第 3 方库的垃圾。

\n

由于我不想在报告中包含测试代码或第 3 方内容,因此我使用 GitLab 提供的变量来实现此目的,称为SAST_EXCLUDED_PATHS我用来排除某些目录的变量。我的价值观是这样的:

\n
    variables:\n        SAST_EXCLUDED_PATHS: spec, test, tests, tmp, server/libs, assets, vendor, *.min.js\n
Run Code Online (Sandbox Code Playgroud)\n

所以基本上除了默认路径之外,我还告诉它不要扫描server/libsassetsvendor*.min.js

\n

因此,简化的 .gitlab-ci.yml 添加了该步骤,添加了排除项并设置SECURE_LOG_LEVEL"debug"。后者让我可以看到 sast-semgrep 等阶段的调试输出。

\n
include:\n    - template: Security/SAST.gitlab-ci.yml\n\nstages:\n    - test\n\n# Run a SAST scan & report on the sources\nsast:\n    stage: test\n    variables:\n        SAST_EXCLUDED_PATHS: spec, test, tests, tmp, server/libs, assets, vendor, *.min.js\n …
Run Code Online (Sandbox Code Playgroud)

gitlab-ci sast semgrep

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

如何通过单击在Eclipse中启动多个调试会话?

我目前正在通过Eclipse编写GWT应用程序.Eclipse用于开发,但我使用m2eclipse插件和带有GWT插件的Maven pom.xml来构建和运行它.

当我需要调试应用程序时,我必须:

  1. 在Maven项目上调用"Run As ..."(通过m2eclipse)"war:explosion gwt:debug".这将启动GWT的应用服务器并等待端口3408上的远程调试连接.等待WAR爆炸的需要意味着它可能需要一分钟才能实现.
  2. 调用"Debug As ..."远程Java应用程序以连接到服务器.

我已经将两个目标添加到收藏夹中以将它们锁定在下拉列表中,但它仍然很痛苦.

我想通过单击而不是两个离散的动作按顺序启动它们.

Eclipse中有没有办法实现这一目标?

java eclipse gwt

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

如何在GWT中深层复制任意对象?

我有一个标记为Serializable的任意对象.它有各种可变的子对象,代表货币金额,集合等.我希望能够克隆这个对象,所以如果用户修改它然后恢复它们的动作,我可以用新的克隆替换克隆.

这意味着我需要一个深层复制,因为我不希望用户更改原始出现的子对象(例如,添加/插入集合中的项目).

这些对象没有实现Cloneable,因为它们是自动生成的,我也无法添加这样的方法.

如果没有痛苦的手写,那么无论如何都要在GWT中实现同样的深度克隆?如果这是Java,我可以考虑将对象序列化为字节数组流并反序列化新副本.

我不能在GWT中这样做.我可能会利用RPC,因为稍后会将对象发送到servlet.我只是不知道这是否容易.

有人知道我可以做一个简单的深层复制吗?

java gwt

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

从静态最终变量初始值设定项获取Logger是否有效?

我们有很多类代码,它们有一些如下所示的样板:

private static Logger logger = null;

private static Logger getLogger() {
  if (logger == null) {
    logger = Logger.getLogger(MyClass.class);
  }
  return logger;
}
Run Code Online (Sandbox Code Playgroud)

这个想法是类可以将调试内容记录到Logger中.需要记录某些东西的第一个代码调用getLogger()并使记录器存在.

关于这种模式,有几件我不喜欢的事情.首先,单例getLogger()不同步并同步它,而正确会无缘无故地给每个后续调用带来负担.

我真的希望能够将它简化为这样:

private static final Logger logger = Logger.getLogger(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

然后我可以直接引用记录器,甚至不用单独的getter.

我担心的问题是,通过这样做,即使从未调用过记录器,我也会在加载类时创建一个Logger.我有10,000多个奇怪的类都调用了getLogger(),所以我实际上在这里创建了多少个Logger实例?如果我的log4j属性包含一些appender,我只是一遍又一遍地引用相同的记录器,或者我是在创建10,000个这样的东西?

java log4j

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

标签 统计

java ×7

gwt ×3

eclipse ×2

rust ×2

android ×1

future ×1

gitlab-ci ×1

jogl ×1

libgdx ×1

log4j ×1

opengl-es-2.0 ×1

rust-tokio ×1

sast ×1

semgrep ×1