Golang embed

Golang embed

前言 在写项目的时候,有时候不可避免地要处理静态文件,如果将源码直接作为软件提供问题不大,使用相对路径读取这些静态文件就可以了。但是如果项目作为库向外公布显然不可行,使用相对路径是读取不到文件的,而使用绝对路径却会带来更大的问题:因为不同的人使用,路径绝对不可能完全一致的。如果要求用户在指定路径下放置这些依赖的静态文件,虽然可行但是会给用户带来很大的困扰,而且这样的实现方式显然不够优雅。这时候,将这些静态文件一起打包进可执行文件似乎是一个完美的解决方案,那么如何实现呢?最简单的方法是硬编码,将静态文件以文本或字节数组的形式直接编入源代码,go 也有一些库帮你自动生成代码,比如 go-bindata。很明显,这个库已经终止维护了,这是因为在 go 1.16 版本,官方发布了 embed 完美地解决了这个问题。本文简要介绍 embed 的一些基础用法。 embed 假设我们有一个文件 hello.txt Hello World! Hello go embed! 我们要写一个程序读取其中的内容并输出到终端: // file: main.go package main import ( "fmt" "os" ) func main() { s, err := os.ReadFile("./hello.txt") if err != nil { panic(err) } fmt.Println(string(s)) } 很简单,不是吗? ➜ tree . . ├── go.mod ├── hello.txt └── main.go 0 directories, 3 files ➜ go build main.go ➜ ./main Hello World! Hello go embed!...

八月 13, 2022 · Aimer Neige
go image processing

Go 图像处理基础

前言 Go 语言的官方包 image 和 image/color 定义了非常多的类型,涵盖了很多的图像处理基础内容,本文简单介绍这些库中的基本概念和使用方法。 常见类型介绍 Colors Colors 是一个接口,它的代码如下: type Color interface { // RGBA returns the alpha-premultiplied red, green, blue and alpha values // for the color. Each value ranges within [0, 0xffff], but is represented // by a uint32 so that multiplying by a blend factor up to 0xffff will not // overflow. // // An alpha-premultiplied color component c has been scaled by alpha (a), // so has valid values 0 <= c <= a....

八月 12, 2022 · Aimer Neige
Rust Logo

[转载] Rust 大佬给初学者的学习建议

本文章转载自 Rustt 简介 当我开始学习 Rust 的时候,我犯了一个错误,那就是先读《The Rust Programming Language》。虽然这是一本非常好的资料,但让新手一开始就阅读这本 20 个章节的书籍,简直令人望而生畏,大多数人还没开始就放弃了。没有人会让一个刚开始学习 JavaScript 或者 Python 的人去阅读一本 20 个章节的书籍。Rust 学习曲线非常陡峭的,但只要循序渐进的学习一定也能学有所成。 摘要 如果你是一个完完全全的 Rust 小白,想要在一天中尽可能多的学习 Rust,那我推荐你去阅读 fasterthanlime 的《半小时快速了解 Rust》,然后完成 Rustlings 项目中的练习。 如果你已经学过 Rust 的基本语法,你可以试着做一下 Exercism.io 网站上的 Rust 部分。如果你遇到了问题,你可以在 Google 或者 StackOverflow 上寻求帮助。我推荐你花点时间来简单的阅读和浏览一下《Rust Standard Library Docs》,它是一个很棒的学习资料,里面有一些简单且实用例子去帮助你更好的使用 Rust 的标准库。《Rust by Example》也是一本高质量的参考资料,你可以通过他快速的学习 Rust 的语法和特性。如果你想要更深入的理解 Rust 的某一个概念,那么我推荐你在《The Rust Programming Language》这本书中寻找相关的章节去阅读。尤其推荐在 Exercism.io 上进行练习。在完成每个题目之后,你可以查看其他所有人的题解,可以按点赞数排序来找到通俗易懂并且巧妙的题解。这是一种很棒的学习方式。 此时,你可能已经是一个高级的初学者,能够找到属于自己的学习路线。但,如果你还需要更多的指导并想要尝试用 Rust 来写一些简单的程序,我推荐你试一着做一下 Advent of Code 2018 Calendar 上的练习。为什么推荐你做 2018 年的题目呢?因为当你做完了这个练习,你可以和 BurntSushi 提供的答案( BurntSushi’s Advent of Code 2018 Rust solutions)进行对比。BurntSushi 写的 Rust 代码整洁、可读性强、通俗易懂。阅读一个有经验的 Rustacean 的代码将会使你受益无穷。...

六月 29, 2022 · Aimer Neige
Server Setup

如何配置新购置的 Linux 服务器

更新系统 # Debian apt update # Fedora dnf update 安装常用工具 # Debain apt install -y neofetch htop tree ncdu ranger zsh vim neovim git curl wget net-tools # Fedora dnf install -y neofetch htop tree ncdu ranger zsh vim neovim git curl wget util-linux-user 创建 sudo 用户 # Debian adduser aimer usermod -aG sudo aimer # Fedora useradd -G wheel aimer passwd aimer 测试 root 权限 su - aimer sudo cat /etc/shadow 配置 SSH 连接密钥 快速上传本地密钥 # 在你的本地环境执行这条指令 ssh-copy-id aimer@server 导入托管的密钥 # 导入你自己的密钥! wget https://aimerneige....

五月 17, 2022 · Aimer Neige
Fedora Windows

在 wsl 下安装 fedora 35

安装 wsl2 使用管理员身份开启 windows terminal. 执行如下指令: wsl.exe --install 等待安装完成后在开始菜单执行重启(Restart) Warning 注意是在开始菜单选择 Restart 而不能是选择 Shut Down 关机之后手动开机。 安装过程中系统会自动下载 Ubuntu 的子系统,重启后会弹出 ubuntu 的命令行初始界面,输入用户名和密码即可开始使用 ubuntu 子系统。 执行下面的指令设置 wsl 默认版本为 wsl2: wsl --set-default-version 2 安装其他版本的子系统 如果你想要其他版本的子系统,可以执行如下指令获取可通过 wsl 指令直接安装的发行版列表: wsl --list --online 返回数据类似下面这样: The following is a list of valid distributions that can be installed. Install using 'wsl --install -d <Distro>'. NAME FRIENDLY NAME Ubuntu Ubuntu Debian Debian GNU/Linux kali-linux Kali Linux Rolling openSUSE-42 openSUSE Leap 42 SLES-12 SUSE Linux Enterprise Server v12 Ubuntu-16....

四月 9, 2022 · Aimer Neige
Find Command On Cool Retro Term

find 指令的基本用法

什么是 find 正如它的名字一样,find 指令用于查找文件。 Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 来源: 菜鸟教程 The find command in UNIX is a command line utility for walking a file hierarchy. It can be used to find files and directories and perform subsequent operations on them. It supports searching by file, folder, name, creation date, modification date, owner and permissions. By using the ‘-exec’ other UNIX commands can be executed on files or folders found....

三月 12, 2022 · Aimer Neige
Spring VSCode

使用 vscode 开发 Spring 项目

前言 毫无疑问,idea 是最好的 Java IDE 之一,它对 Spring 也有很好的支持,但是由于某高校的 JetBrains 授权被拉入黑名单,导致我无法继续使用正版授权,虽然可以通过给 JetBrains 写邮件,证明自己高校学生的身份后继续获取授权,但是实在是懒,而且我也不是很喜欢使用 IDE,于是就就打算使用 vscode 进行开发。 Visual Studio Code 作为一款优秀的代码编辑器,有非常多的插件,经过配置后完全可以胜任大部分 IDE 的功能,本文章简要介绍如何构建 spring 的开发环境。 配置 安装配置 Java 和 Maven Tip 正常流程配置 Java 和 Maven,如果你已经配置过可以直接跳过 下载所需的 JDK 并解压。 在环境变量中配置 JAVA_HOME 在系统环境变量 PATH 中添加 JAVA_HOME/bin 下载 Maven 并解压 在环境变量中配置 MAVEN_HOME 在系统环境变量 PATH 中添加 MAVEN_HOME/bin 安装必要插件 Extension Pack For Java Gradle Extension Pack Spring Boot Extension Pack SonarLint Java Code Generators XML Dependency Analytics 在 settings....

十二月 28, 2021 · Aimer Neige
Blue Poison

配置 go 开发环境

由于某些网络原因1,本文所提到的部分网站、下载链接可能在中国大陆地区无法访问,请自行查找解决方案,本文不再赘述。 如果你在阅读本文时遇到了任何问题,请查阅 go 语言官方网站。 下载预编译文件 在 Download Go 选择适合你平台的最新版本文件下载。 本文不推荐使用一键安装包的方式安装 go 语言,即请不要直接下载下图所示的文件: 我们在下面的 Stable versions 后找到最新版本的 go,选择适合自己电脑系统与架构的压缩包。要选择 Archive 而不要选择 Installer。 Tip 当然使用 msi 等一键安装包安装也是完全可以的,如果你想要使用一键安装包的方式安装 go,请查阅其他资料。 如果你想要通过源码安装,请自行查阅 通过源码构建。 安装 & 配置 下面分别具体说明不同平台下安装和配置的方法。 Linux 解压压缩文件 这里我们可以直接使用 官方安装指南 提供的指令来解压。 rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.linux-amd64.tar.gz 本指令会将 go 安装在 /usr/local/go 路径下,因此执行命令需要 root 权限。当然,如果想要将 go 安装在其他路径也是可以的,但是还是推荐安装在官方推荐的路径下。 Info 如果你使用了其他的路径来安装 go,在之后的配置过程中记得要修改 GOROOT 变量修改为你所安装的路径。 执行命令前请先切换工作目录,确保当前路径下有刚刚下载好的压缩包。 Warning 压缩包名 go1.17.linux-amd64.tar.gz 可能有所不同,这取决于你安装的 go 版本和操作系统及处理器架构。 配置环境变量 成功解压后,如果你尝试直接在终端执行 go 指令,你会发现系统并没有识别到你刚安装的 go 二进制文件,这是因为我们还没有对 go 的环境变量进行配置。...

八月 24, 2021 · Aimer Neige

对于某实验平台的吐槽

今天学校不知道哪搞了个平台,让我们去上面做模拟实验,我点开一看,好嘛,没啥用的机器人、电焊,继续看下去还有题目,又懒得上网查答案,但是学校给的通知里有一行话引起了我的注意: 温馨提示:需要从实验空间进入实验,不可直接输入网址进入 不可直接输入网址?我仔细看了下,发现实验空间的作用就是添加一个 token,如果直接进去就是游客,没有办法登录。 这下就好办了啊,虽然是游客,但是游客也可以做题啊,我用游客帐号先做了不就拿到答案了吗? 这个系统果然把正确答案显示在前端了,但是不太好看,于是我就跑去 F12 看了。 结果我在后台找到了下面的代码: $.ajax({ url: "/webApi/experimen/rig/getData", type: "GET", data: { courseId: courseId }, dataType: "JSON", success: function (res) { // 省略的大量代码逻辑 }); 下面的注释是原来就有,不是我加的。 对,这个系统没有对 js 做混淆甚至在代码里有详细的注释。 // 单选 var answer = $('.afterTesting .topic1 form'); for (var k = 0; k < answer.length; k++) { var question1 = $(answer[k]).find(".question1"); var questionAnswer = question1.attr("data-answer"); var userAnswer = question1.find("input[type='radio']:checked").val(); var score = parseFloat(question1.attr("data-score")); if (questionAnswer.length > 1) { var userdAnswer = question1....

八月 19, 2021 · Aimer Neige
rime-logo

定制你的 rime 提升编程体验

平时在使用 Linux 写代码的时候,总有一点让我很难受,那就是当我准备写中文注释的时候,输入 // 的时候,输入法总是希望我手动选择是要输入 / 还是中文的 、,随之弹出来的框非常影响代码编辑,经常打断我的思路,类似的还有反引号等符号,不厌其烦的我去查找了一些资料,终于彻底解决了这个问题。 准备 阅读本文前,你要保证你在使用 rime 输入法。遇到任何问题请多查阅 rime 提供的文档。 本文所提到的内容在 fedora34 系统下,ibus-rime 包测试通过。 找到 rime 用户资料夹 不同的平台下,rime 用户资料夹的位置会有所不同 平台 rime 用户资料夹位置 ibus ~/.config/ibus/rime fcitx ~/.config/fcitx/rime fcitx5 ~/.local/share/fcitx5/rime 创建你的配置文件 如果你从来没有配置过 rime,那么你可以直接在 rime 用户资料夹下创建名为 default.custom.yaml 的配置文件,写入如下内容: patch: punctuator/full_shape: "`": "`" "~": "~" "!": "!" "@": "@" "#": "#" "$": "¥" "%": "%" "^": "……" "&": "&" "*": "×" "(": "(" ")": ")" "_": "——" "+": "+" "-": "-" "=": "=" "[": "【" "]": "】" "{": "{" "}": "}" "|": "|" "\\": "、" "/": "、" ";": ";" "'": "‘" ",": "," "....

八月 19, 2021 · Aimer Neige