404E Blog

第 6 页

解决vscode安装go插件失败的问题

开发工具

设置go的代理

打开cmd,并在cmd中分别输入以下代码,作用是设置代理

go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.io,direct

手动安装

在命令行中输入以下代码安装

手动输入代码以安装

go get -u -v github.com/mdempsky/gocode
go get -u -v github.com/uudashr/gopkgs/v2/cmd/gopkgs
go get -u -v github.com/ramya-rao-a/go-outline
go get -u -v github.com/acroca/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/cweill/gotests/...
go get -u -v github.com/fatih/gomodifytags
go get -u -v github.com/josharian/impl
go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
go get -u -v github.com/haya14busa/goplay/cmd/goplay
go get -u -v github.com/godoctor/godoctor
go get -u -v github.com/go-delve/delve/cmd/dlv
go get -u -v github.com/stamblerre/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/sqs/goreturns
go get -u -v golang.org/x/lint/golint

参考自 https://blog.netimed.cn/archives/go/20201111/319.html

UWP应用允许使用代理

系统笔记

默认情况下UWP无法通过代理联网,开着代理使用UWP应用会出错,以下是我的解决办法

  1. 通过 Win + R 快捷键打开 运行 窗口,输入 regedit 打开注册表编辑器

2. 在址栏输入 HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings 然后回车

3. 左边的注册表项会有一串名字很长的列表

4. 点开一个能看到应用的详细数据,其中 DisplayName 就是应用名称。一个一个查看,找到自己要找的应用

5. 右键左边对应的那一条S开头的长字符串,点击重命名,然后将这一长串id复制出来

6. 通过 Win + R 快捷键打开 运行 窗口,输入 cmd 打开命令行

CheckNetIsolation.exe loopbackexempt -a -p=(这里输入你在上面复制的应用id,用id将此处括号内的文字替换掉)

将以上经过替换的文字复制到命令行中并回车

参考自 https://zhuanlan.zhihu.com/p/29989157

Gradle高版本编译时Lombok不起作用

排障复盘

今天使用lombok时出现问题,maven项目能正常使用,拿到gradle里面就出问题,在网上找了一圈,最终解决

解决办法:引入lombok时需要用如下格式

纯文本
dependencies {
    annotationProcessor 'org.projectlombok:lombok:1.18.20'
    compileOnly 'org.projectlombok:lombok:1.18.20'
}

错误的格式(少了 annotationProcessor 'org.projectlombok:lombok:1.18.20'

纯文本
dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.20'
}

其他没有生效的方法

打开此选项

Minecraft相关问题汇总

Minecraft

就是找个地方放一些问题的解决办法

客户端

切换音频输出后没有声音

原因:mc不会主动切换音频输出

解决办法:按f3+t重载材质包(不行的话试试重启)

服务端

cmd中不输出日志消息

原因:启动脚本里面用了javaw而不是java或者在脚本里面设置了其他的不该设置的选项

解决办法:使用正确的脚本启动,脚本示例

在VSCode中直接运行代码

开发工具

支持的语言

Run code snippet or code file for multiple languages: C, C++, Java, JavaScript, PHP, Python, Perl, Perl 6, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, Scheme, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, Lisp, Kit, V, SCSS, Sass, CUDA, Less, Fortran, and custom command

来自插件的详细介绍

安装VSCode

安装VSCode,已有的跳过

安装Code Runner插件

安装完成后会在右上角显示运行的按钮

如果文件格式正确的话点击了运行按钮会直接执行

注意

注意文件格式不能选错,否则可能会显示

笔者一开始就选错了文件格式

这里应该用下面的javascript(黄色图标的那个)

Windows cmd选择模式

系统笔记

首先打开cmd,在左上角的cmd图标,并在菜单中选择默认值(打开属性是一样的界面,与默认值的区别是属性只修改当前cmd,默认值会修改所有修改完之后打开的cmd)

打开后找到选项 -> 编辑选项 -> 快速编辑模式,将其取消选中

点击右下角的确定

paper.yml按世界单独配置

Minecraft

paper.yml中的设置很丰富,可设置的项目非常多,但是有一点可能很少有人知道,那就是这些功能可以按世界单独设置。paper.ymlworld-settings下的所有的选项都可以按世界单独设置(但是一些项目只在特定的世界有效,比如末影龙相关的设置只在末地有效)

默认在world-settings下有default项,这一项的意思是默认配置,如果没有其他的配置覆盖他,那么paper将会以default下的配置项进行运作

只有 world-settings.default 下的项目才可以按世界单独配置,不在其中的项目是不可以单独设置的

默认配置为

yaml
world-settings:
  default:
    grass-spread-tick-rate: 1
    seed-based-feature-search: true
    seed-based-feature-search-loads-chunks: true
    ...: ...
    ....: ...

多世界的配置为

yaml
world-settings:
  # 默认配置
  default:
    grass-spread-tick-rate: 1
    seed-based-feature-search: true
    seed-based-feature-search-loads-chunks: true
    ...: ...
    ....: ...
  # 下界的单独设置,在下界会覆盖default的设置
  # 没有在此处设置的会沿用default
  world_nether:
    grass-spread-tick-rate: 2
    seed-based-feature-search: true
    seed-based-feature-search-loads-chunks: true
    ...: ...
    ....: ...
  # 末地的单独设置,在下界会覆盖default的设置
  # 没有在此处设置的会沿用default
  world_the_end:
    grass-spread-tick-rate: 3
    seed-based-feature-search: true
    seed-based-feature-search-loads-chunks: true
    ...: ...
    ....: ...

Paper反矿透anti-xray的开启 & 配置

Minecraft

官方文档

paper自带一个反透视的功能,相比较插件的反矿透,优化做的较好

此功能只有paper和基于paper的服务端核心才有(如果服务端没有paper.yml配置文件那就是不支持,bukkit,spigot,forge,fabric是没有的)

高版本paper核心的配置文件在 服务端文件夹/config 文件夹下

原理大概是通过给客户端发送虚假的数据包,使得平常不可见的方块在客户端上的数据并不是真实的数据,使用一些“工具”的客户端看到的这些方块也就不是真实的方块了

以下的解释参考自paper官方文档:https://paper.readthedocs.io/en/latest/server/configuration.html

以及:https://gist.github.com/stonar96/ba18568bd91e5afd590e8038d14e245e

启用

打开 服务端文件夹/paper.yml 找到 anti-xray 设置项

默认的配置如下

低版本的配置文件有所不同是正常情况

bash
# 这里以1.17版本的配置文件为示例解释每个配置项的含义
# 如果不同版本有差异属于正常情况
anti-xray:
  # 是否启用 true -> 启用
  enabled: false
  # 引擎模式
  # 1是用石头替换下面列表里面的方块
  # 2是用随机方块替换所有方块
  # 这里的方块指的是玩家看不到的,没有裸露在外的方块
  engine-mode: 1
  # 设置隐藏矿石的最大高度
  # 需要填写16的倍数,其他值将向下舍入为16的倍数
  # 在此高度以下的方块将会按对应的模式进行反矿透
  max-block-height: 64
  # 方块更新的半径, 当一个方块被更新时, 客户端的方块也会随之更新
  # 有效值:0, 1, 2
  # 大于2的默认为2, 小于0的默认为0
  # 不要使用0, 这只是一种测试模式
  update-radius: 2
  # 是否混淆接触熔岩的方块
  lava-obscures: false
  # 是否允许有paper.antixray.bypass权限的玩家绕过反矿透
  use-permission: false
  # 在引擎模式1中要隐藏的方块列表
  # 一些方块可能需要手动添加
  # 注意: 此列表使用的是原版方块名称而不是bukkit方块名称。
  hidden-blocks:
    - copper_ore
    - deepslate_copper_ore
    - gold_ore
    - deepslate_gold_ore
    - iron_ore
    - deepslate_iron_ore
    - coal_ore
    - deepslate_coal_ore
    - lapis_ore
    - deepslate_lapis_ore
    - mossy_cobblestone
    - obsidian
    - chest
    - diamond_ore
    - deepslate_diamond_ore
    - redstone_ore
    - deepslate_redstone_ore
    - clay
    - emerald_ore
    - deepslate_emerald_ore
    - ender_chest
  # 在引擎模式2中应该替换的方块列表
  # 一些方块可能需要手动添加
  # 注意: 此列表使用的是原版方块名称而不是bukkit方块名称。
  replacement-blocks:
    - stone
    - oak_planks

这里将 enable: false 改成 enable: true 以启用反矿透

配置详细解释

enabled

解释:是否启用

允许的值:true / false

engine-mode

解释:反矿透的运作方式

模式1:根据世界类型用石头、地狱岩或末地石替换指定的矿石(通过发送经过修改的数据包,性能消耗较模式2相比较小)

模式2:在向客户端发送块数据包时随机放置指定的假矿(性能消耗较模式1相比较大)

允许的值:1 / 2

抗 X 射线模式 图片来源于 https://gist.github.com/stonar96/ba18568bd91e5afd590e8038d14e245e

模式1计算量较小,但模式2可以更好地反矿透。在模式1中,只有完全被不透明方块覆盖的矿石才能被隐藏。这意味着暴露在空气中的矿石仍然可见。在模式2中,假矿石中会遮挡这些矿石,并且添加假空气

max-block-height

解释:反矿透的运作范围,可以写128

允许的值:16的倍数,其他值将向下舍入为 16 的倍数

注:低版本的配置与上述不同,填写的是max-chunk-section-index,规则是 (填写的数值 + 1) * 16。大于 15 的 max-chunk-section-index 默认为 15。小于 0 的 max-chunk-section-index 没有意义。

update-radius

解释:方块更新的半径, 当一个方块被更新时, 客户端的方块也会随之更新

允许的值:0 / 1 / 2 (大于2的默认为2, 小于0的默认为0)

注:不要使用0, 0是一种测试模式,如没有需要请不要修改

lava-obscures

解释:是否混淆接触熔岩的方块,可以写true

允许的值:true / false

use-permission

解释:是否允许有paper.antixray.bypass权限的玩家绕过反矿透,可以写false

允许的值:true / false

hidden-blocks

解释:在引擎模式1中要隐藏的方块列表, 一些方块可能需要手动添加(例如下界的矿石)

注:此列表使用的是原版方块名称而不是bukkit方块名称。

replacement-blocks

解释:在引擎模式2中应该替换的方块列表, 一些方块可能需要手动添加

注:此列表使用的是原版方块名称而不是bukkit方块名称。

ps

按世界单独配置

IPV6联机教程

Minecraft

注意

  1. 此教程需要联机双方的网络都支持IPV6(查看方法会在下面写出)
  2. 手机(使用流量)和一些偏远地区可能尚不支持IPV6
  3. 该方式联机可能没有内网穿透简单(因人而异)

检查是否支持IPV6

浏览器打开 http://test-ipv6.com/ 如果显示如下图,那么恭喜你,你的网络是支持并且开启了IPV6的

将这一串字符串自行保存,不要给你不信任的人

上面获取到IPV6地址的可以跳过下面的路由器启用IPV6教程,直接看联机部分

路由器启用IPV6

如果不显示这一串文字,那么可能是你的路由器没有开启IPV6

以我的路由器为例,打开IPV6的步骤如下图所示

保存所需要的时间可能比较长,请耐心等待

修改并且保存成功之后再进入上面的IPV6检测网页,检查是否能够获取到IPV6地址

如果你在路由器里没找到关于IPV6的选项,那么恭喜你,你的路由器不支持IPV6,需要换新的(简而言之就是这个教程你可以不用看了)

如果你的光猫支持IPV6,电脑直连光猫能够识别,连路由器却识别不了,那么就需要打开路由器管理后台,把路由器切换成中继模式(或者你把光猫改成中继模式,然后进去路由器选择拨号模式,接着把你的光猫账号密码输入进去)

联机

上面我们拿到的IPV6地址,然后进入游戏对局域网开放拿到端口(点击对局域网开放,左下角的聊天栏会告诉你在哪个端口开放)

例如:拿到的IPV6地址是 1234:1234:1234:1234:1234:1234:1234:1234 ,端口是 25565 ,不要急着连,看完下面的开放端口

那么就需要使用 [1234:1234:1234:1234:1234:1234:1234:1234]:25565 来连接

这里注意地址使用 [] 包括,并且使用的是英文冒号 :

IPV6地址不是固定的,一般一天变一到二次,改变之后需要再次访问上面的链接获取

开放端口

如果路由器不是桥接的,那么需要开放端口才可以让外网访问

这里以我的路由器为例,开放端口的步骤如下图所示

js实现无限下划加载

编程笔记

首先新建一个html模板

xml
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
</head>
<body>
    <div id="main"></div>
</body>
</html>

实现加载内容的js,这里举一个简单的例子

javascript
function load(title) {
  // div
  let div = document.createElement("div");
  div.setAttribute("class", "test")
  // h2
  let h2 = document.createElement("h2");
  h2.appendChild(document.createTextNode("标题: " + title));
  div.appendChild(h2);
  // 添加
  document.getElementById("main").appendChild(div);
}

添加一个监听器,在网页浏览快要结束时添加新内容

javascript
// 设置初始时间
let time = new Date().getTime();
// 监听器
function eventHandle(e) {
  // 这里设置一个时间,原因是每次浏览器滚动条位置变动都会出发event
  // 加载较慢时可能会出现滚动条到底了,第一次触发的内容还未加载出来
  // 这里设置每200ms可以触发一次
  let t = new Date().getTime();
  if (t - time > 200) {
    time = t;
    // 浏览器上方内容的高度
    let viewportHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0;
    // 页面总高度
    let pageHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight) - viewportHeight;
    // 滚动条高度
    let scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
    // 当页面浏览进度超过90%时使用鼠标滚轮触发
    if (scrollHeight / pageHeight > 0.9) load("awa");
  }
}
// 启用监听器 scroll是监听器名字
document.addEventListener('scroll', eventHandle);
// 删除监听器
document.removeEventListener('scroll', eventHandle);

这样的话一个简单的无限下划就完成了

最后贴一个demo

javascript
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
    <style>
        #main {
            height: 1200px;
        }

        .test {
            height: 200px;
        }
    </style>
</head>
<body>
    <div id="main"></div>
    <script>
        function load(title) {
            // div
            let div = document.createElement("div");
            div.setAttribute("class", "test")
            // h2
            let h2 = document.createElement("h2");
            h2.appendChild(document.createTextNode("标题: " + title));
            div.appendChild(h2);
            // 添加
            document.getElementById("main").appendChild(div);
        }
        load("awa");
        // 设置初始时间
        let time = new Date().getTime();
        // 监听器
        let count = 1;
        function eventHandle(e) {
            // 这里设置一个时间,原因是每次浏览器滚动条位置变动都会出发event
            // 加载较慢时可能会出现滚动条到底了,第一次触发的内容还未加载出来
            // 这里设置每200ms可以触发一次
            let t = new Date().getTime();
            if (t - time > 200) {
                time = t;
                // 浏览器上方内容的高度
                let viewportHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0;
                // 页面总高度
                let pageHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight) - viewportHeight;
                // 滚动条高度
                let scrollHeight = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
                // 当页面浏览进度超过90%时使用鼠标滚轮触发
                if (scrollHeight / pageHeight > 0.9) {
                    for (let i = 0; i < 5; i++) {
                        load("第" + count + "次自动加载");
                    }
                    count++;
                }
            }
        }
        // 启用监听器 scroll是监听器名字
        document.addEventListener('scroll', eventHandle);
        // 删除监听器
        // document.removeEventListener('scroll', eventHandle);
    </script>
</body>
</html>