我正在为 EC2 实例上的 Web 应用程序维护一个嵌入式数据库。由于这个中央服务器是单线程的,它很容易受到 DDOS 的攻击(即使是非分布式攻击也会使其瘫痪)。
AWS 为其 CDN CloudFront 提供了 DDOS 保护,所以我想知道是否可以使用 CloudFront 作为围绕我的 EC2 实例的间接层来进行 DDOS 保护。
问题在于如何有效防止用户绕过 CloudFront 直接攻击服务器。我的问题:
我刚开始考虑网络架构和安全性,因此非常感谢所有建议!
当我尝试将映射编码为指针(如果其中一个值为零)时,Gob 的编码会返回错误。这似乎与文档相矛盾(但我可能误解了含义):
在切片和数组以及映射中,所有元素(甚至零值元素)都会被传输,即使所有元素均为零。
代码:
package main
import (
"bytes"
"encoding/gob"
)
type Dog struct {
Name string
}
func main() {
m0 := make(map[string]*Dog)
m0["apple"] = nil
// Encode m0 to bytes
var network bytes.Buffer
enc := gob.NewEncoder(&network)
err := enc.Encode(m0)
if err != nil {
panic(err) // Output: panic: gob: encodeReflectValue: nil element
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
panic: gob: encodeReflectValue: nil element
Run Code Online (Sandbox Code Playgroud)
在这种情况下,gob 失败有充分的理由吗?看来两个明显的选项中的任何一个都比失败更可取:1)不要使用零值的值对任何键进行编码,或者2)即使值是零值也对所有键进行编码。在目前的情况下,最佳实践是递归扫描我的结构以查看是否有任何 nil 映射值,如果有则删除这些键?如果需要进行此检查,则似乎应该由encoding/gob 包而不是用户负责。
此外,该规则不仅仅是“gob 无法对键值为 nil 的映射进行编码”,因为如果值类型是切片,则接受 nil:
func main() {
m0 := make(map[string][]string)
m0["apple"] = …Run Code Online (Sandbox Code Playgroud) 我不知道如何使菜单中的文本左对齐(需要这样做以与其他文本对齐)。在下图中,我希望“一”、“二”和“三”一直在左边。
我尝试在我能想到的任何地方将填充和边距设置为 0,但无济于事:
import React, { Component } from "react";
import { Menu, Icon } from 'antd';
const SubMenu = Menu.SubMenu;
const MenuItemGroup = Menu.ItemGroup;
class CategoryNav extends React.Component<Props> {
handleClick = (e: Event) => {
console.log('click ', e);
}
render() {
return (
<Menu
onClick={this.handleClick}
style={{ width: 256, height: "100%", paddingLeft: 0, marginLeft: 0 }}
defaultSelectedKeys={['1']}
defaultOpenKeys={['sub1']}
mode="inline"
>
<SubMenu style={{ paddingLeft: 0, marginLeft: 0 }} key="sub1" title={<span>One</span>}>
<Menu.Item style={{ paddingLeft: 0, marginLeft: 0 }} key="1">Option 1</Menu.Item>
<Menu.Item key="2">Option …Run Code Online (Sandbox Code Playgroud) 我在Go和C ++中对一个简单的套接字乒乓测试进行了基准测试。客户端首先向服务器发送0。服务器增加它得到的任何数字,然后将其发送回客户端。客户端将数字回显到服务器,并在数字为1,000,000时停止。
客户端和服务器都在同一台计算机上,因此在两种情况下我都使用Unix套接字。(我也尝试了相同主机的TCP套接字,结果也相似)。
Go测试花费14秒,而C ++测试花费8秒。这让我感到惊讶,因为我已经运行了大量的Go vs. C ++基准测试,并且只要我不触发垃圾收集器,Go的性能就与C ++一样。
我在Mac上,尽管评论者还报告说Go版本在Linux上速度较慢。
想知道我是否缺少一种优化Go程序的方法,或者引擎罩下是否存在效率低下的问题。
以下是我运行以执行测试的命令以及测试结果。所有代码文件均粘贴在此问题的底部。
运行Go服务器:
$ rm /tmp/go.sock
$ go run socketUnixServer.go
Run Code Online (Sandbox Code Playgroud)
Run Go客户端:
$ go build socketUnixClient.go; time ./socketUnixClient
real 0m14.101s
user 0m5.242s
sys 0m7.883s
Run Code Online (Sandbox Code Playgroud)
运行C ++服务器:
$ rm /tmp/cpp.sock
$ clang++ -std=c++11 tcpServerIncUnix.cpp -O3; ./a.out
Run Code Online (Sandbox Code Playgroud)
运行C ++客户端:
$ clang++ -std=c++11 tcpClientIncUnix.cpp -O3; time ./a.out
real 0m8.690s
user 0m0.835s
sys 0m3.800s
Run Code Online (Sandbox Code Playgroud)
代码文件
转到服务器:
// socketUnixServer.go
package main
import (
"log"
"net"
"encoding/binary"
)
func main() {
ln, err := net.Listen("unix", "/tmp/go.sock") …Run Code Online (Sandbox Code Playgroud) 我是 Rust 新手,正在尝试学习使用借用检查器的惯用方式。
我正在尝试编写一个简单的函数,它接受一个切片(数据类型的通用)并返回最后一个元素,这样我就可以在之后改变切片。天真的实现给了我一个错误:
fn last_element<T>(list: &[T]) -> T {
list[list.len() - 1]
}
fn main() {
let mut slice = [1, 2, 3, 4, 5];
let x = last_element(&slice);
println!("{}", x);
// I want to be able to mutate slice after extracting last element
slice[2] = 17;
}
Run Code Online (Sandbox Code Playgroud)
错误是cannot move out of type[T] , a non-copy slice。我发现一种解决方法是让函数返回引用:
fn last_element<T>(list: &[T]) -> &T {
&list[list.len() - 1]
}
fn main() {
let mut slice = [1, 2, …Run Code Online (Sandbox Code Playgroud) 我有一个 Unix 时间(自纪元以来的纳秒),我想在该时间和可指定时区中的可读字符串(使用 TZ 字符串)之间来回切换,并保留纳秒。我正在使用 C++17,但愿意迁移到 C++20(如果它能让事情变得更容易的话)。
例子:
uint64_t unix_time = 1669058870115719258;
std::string datetime = convert_unix_to_datetime(unix_time, "America/Detroit");
std::cout << datetime << "\n";
std::cout << convert_datetime_to_unix_time(datetime) << "\n";
Run Code Online (Sandbox Code Playgroud)
期望的输出:
2021-11-21 14:27:50.115719258
1669058870115719258
Run Code Online (Sandbox Code Playgroud)
如果这是一个基本问题,我深表歉意——我在网站上进行了搜索并尝试实现解决方案,但一直对不同的 C++ 版本感到困惑,无论日期时间是 UTC 还是本地时区,不同的类型,如 chrono::time_point 与 time_t 等.希望能在这里找到一个简单的解决方案。