我在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进行其余操作时,如何实现枚举?
我正在编写一个渲染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) 我有一个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)
这是明智的做法吗?如果屏幕方向在锁定时确实发生了变化,它会在解锁时立即感知到方向的变化吗?
还有替代品吗?
我们有一个非常大的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分钟的构建,这是不可接受的.
所以问题是,我怎样才能将分裂点放入代码中,但是除非我明确要求,否则会阻止编译器分裂?我设想日常开发将忽略分裂点,但夜间或生产构建将分裂.
有任何想法吗?
我将用 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)
这个伪代码只会执行我的任务一次。我如何连续运行它?我希望它执行,然后一次又一次执行等等。我只希望它在出现紧急情况或有错误结果代码时停止执行。最简单的方法是什么?
Eclipse允许Java类文件使用自定义格式和模板.更改这些设置的常规方法是从Windows | 首选项菜单,然后在首选项对话框中选择Java>代码样式.格式化程序控制大括号,缩进等的工作方式.该模板管理新类文件中出现的文件,类和方法标题的类型.
我有两个这些设置的文件,我必须导入并设置才能生效.有时我创建一个工作区而忘记设置模板.然后格式化选择错误的样式或省略锅炉板,如果我在入住时没有捕获.这会导致文件非标准,如果出错,可能会导致其他人发生合并冲突,反之亦然.
是否可以轻松修改Eclipse,以便在创建新工作区时始终默认使用自定义格式和模板?即使我必须将XML放到某个地方的Eclipse文件夹中并调整一些设置,我希望能够做到这一点,并为我团队中的其他人提供相同的指令.
我已在 GitLab CI(GitLab 社区版)14.5.2 中启用了 SAST 扫描。SAST 运行 semgrep 和 ESLint 等工具,在源代码上运行并扫描漏洞。这是有效的......除了它没有从我告诉它的结果中排除路径和文件,所以我的报告充满了来自第 3 方库的垃圾。
\n由于我不想在报告中包含测试代码或第 3 方内容,因此我使用 GitLab 提供的变量来实现此目的,称为SAST_EXCLUDED_PATHS我用来排除某些目录的变量。我的价值观是这样的:
variables:\n SAST_EXCLUDED_PATHS: spec, test, tests, tmp, server/libs, assets, vendor, *.min.js\nRun Code Online (Sandbox Code Playgroud)\n所以基本上除了默认路径之外,我还告诉它不要扫描server/libs、assets或vendor。*.min.js
因此,简化的 .gitlab-ci.yml 添加了该步骤,添加了排除项并设置SECURE_LOG_LEVEL为"debug"。后者让我可以看到 sast-semgrep 等阶段的调试输出。
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) 我目前正在通过Eclipse编写GWT应用程序.Eclipse用于开发,但我使用m2eclipse插件和带有GWT插件的Maven pom.xml来构建和运行它.
当我需要调试应用程序时,我必须:
我已经将两个目标添加到收藏夹中以将它们锁定在下拉列表中,但它仍然很痛苦.
我想通过单击而不是两个离散的动作按顺序启动它们.
Eclipse中有没有办法实现这一目标?
我有一个标记为Serializable的任意对象.它有各种可变的子对象,代表货币金额,集合等.我希望能够克隆这个对象,所以如果用户修改它然后恢复它们的动作,我可以用新的克隆替换克隆.
这意味着我需要一个深层复制,因为我不希望用户更改原始出现的子对象(例如,添加/插入集合中的项目).
这些对象没有实现Cloneable,因为它们是自动生成的,我也无法添加这样的方法.
如果没有痛苦的手写,那么无论如何都要在GWT中实现同样的深度克隆?如果这是Java,我可以考虑将对象序列化为字节数组流并反序列化新副本.
我不能在GWT中这样做.我可能会利用RPC,因为稍后会将对象发送到servlet.我只是不知道这是否容易.
有人知道我可以做一个简单的深层复制吗?
我们有很多类代码,它们有一些如下所示的样板:
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个这样的东西?