2023年11月2日
拥有自己域名的邮箱在很多程序员心目中是一件非常 cool 的事情, 但是搭建服务非常的麻烦, 需要公网服务器, 以及开放 53 端口
在网上寻找搭建私有邮箱服务教程很多也不详尽, 有些需要用到很重的服务, 这里先挖个坑, 有空了可以开一篇教程来用介绍如何轻量级服务接收邮件
如果我们仅仅是想用自定义域名接收邮件, 其实我们根本不需要拥有一台服务器
拥有一个域名, 这个就不多解释了, 网上很多介绍便宜域名的文章 买好域名后, 去注册 cloudflare 绑定站点, 绑定站点按照 cf 的教程即可, 会提示每一步的操作 绑定完成后, 在站点的页面有一个 email tab, 点击进入后, 会提示你邮箱前缀以及要转发的邮箱地址 输入邮箱地址, 会提示去邮箱验证, 验证完之后继续下一步的配置 等到配置都完成之后, 你就拥有了一个自定义邮箱, 如果你想接收你的域名的任意前缀邮件, 也可以配置
PS 当前 CF dash 页面服务异常了, 等恢复添加一些截图……
阅读全文
2023年2月12日
caddy 是什么 golang 编写的反向代理服务器, 并提供了很多的插件, 可以自动注册 https 证书, 对懒人极度友好
版本选择 目前分为 v1, v2 两个版本, 本人迁移发现 v1,v2 版本并不兼容(Caddyfile), 建议使用 V2 版本, 但是目前中文教程里面使用 v1 版本的还是有很多 v1 版本密码认证是明文, v2 是一个 hash 后的密文
下载 && 安装 下载 在很早的时候 caddy 跟 cloudflare 不太兼容, 会导致无法注册 https 证书, 虽然概率不高, 但是遇见了就比较蛋疼, 建议选择上 caddy-dns/cloudflare 插件 安装 下载完二进制文件后, 建议配置 systemd, 参考 官方文档 以下是我自己使用的配置文件, 大家可以参考下
# caddy.service # # For using Caddy with a config file. # # Make sure the ExecStart and ExecReload commands are correct # for your installation.……
阅读全文
2022年12月1日
将 struct 中的string 字段进行 trim
func trimSpace(any interface{}) { ov := reflect.ValueOf(any) if ov.Kind() == reflect.Ptr && !ov.IsNil() { ov = ov.Elem() } ot := reflect.TypeOf(any) if ot.Kind() == reflect.Ptr { ot = ot.Elem() } for i := 0; i < ot.NumField(); i++ { field := ov.Field(i) if field.Kind() == reflect.Ptr { if field.Elem().Kind() == reflect.Struct { trimSpace(field.Interface()) continue } field = field.Elem() } if field.CanInterface() && field.IsValid() { if field.……
阅读全文
2022年11月25日
chrome 清理当前页面的缓存……
阅读全文
2022年11月18日
原因 字符集配置不匹配 mac 上是 UTF-8 解决方法 更新配置 vim ~/.zshrc 在最后加上 export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 配置生效 source ~/.zshrc ……
阅读全文
2022年11月6日
装好了docker,以及 ufw 然后禁用了 3000 端口, ufw deny 3000
并且启动了一个容器 启动命令是这样的 docker run -it -p 3000:3000 python 但之后发现一个问题, IP:3000 居然可以访问到
查询资料得知, 淦, 发现这是个陈年老问题了 查到一个好用的 repo, https://github.com/chaifeng/ufw-docker 并且按照他的教程进行了设置
但是紧接着发现了问题 这样设置完之后, 开放端口3000(ufw allow 3000), 居然不生效了 看了下 readme 显示 现在外部就已经无法访问 Docker 发布出来的任何端口了,但是容器内部以及私有网络地址上可以正常互相访问,而且容器也可以正常访问外部的网络。 显然这不是我想要的结果
最终在stackoverflow找到了符合我需求的解决方案
cat << EOF >> /etc/docker/daemon.json { "iptables": false } EOF echo "DOCKER_OPTS=\"--iptables=false\"" >> /etc/default/docker service docker restart -参考资料: https://stackoverflow.com/a/67641547……
阅读全文
2022年2月28日
支持不同格式之间的转换 支持图片像素的压缩以及拉长 package main import ( "bytes" "errors" "fmt" "image" "image/jpeg" "image/png" "io/ioutil" "os" "golang.org/x/image/draw" _ "golang.org/x/image/webp" // for RegisterFormat ) type imageHelper struct { img image.Image fileName string format string scale draw.Scaler } func NewImageHelper(fileName string, scale ...draw.Scaler) *imageHelper { var s draw.Scaler if scale == nil { s = draw.ApproxBiLinear } else { s = scale[0] } return &imageHelper{ fileName: fileName, scale: s, } } func (r *imageHelper) GuessFileFormat() (string, error) { if r.……
阅读全文
2021年12月15日
package main import ( "fmt" "github.com/coreos/pkg/progressutil" "io" "os" "path/filepath" "time" ) func combineMultipleFiles(outPutFile string, files ...string) { abs, err := filepath.Abs(outPutFile) if err != nil { panic("can not get outPutFile absolute path") } dir := filepath.Dir(abs) if _, err := os.Stat(dir); err != nil { if os.IsNotExist(err) { err := os.MkdirAll(dir, os.ModePerm) if err != nil { panic(fmt.Sprintf("can not mkdirs, path: %s, err: %s", dir, err)) } } } file, err := os.……
阅读全文
2021年12月9日
使用快排的思想 空间复杂度很垃圾, 只是为了更好的理解快排算法 TODO 修改成不需要额外空间的算法 def quicksort(data: list): if len(data) <= 1: return data less = [] more = [] pivot = data[0] for item in data: if item < pivot: less.append(item) elif item > pivot: more.append(item) return quicksort(less) + [pivot] + quicksort(more) data = [1, 4, 2, 6, 3, 10, 12, 11] print(quicksort(data)) ……
阅读全文
2021年12月8日
class Node: def __init__(self, val, left=None, right=None) -> None: self.val = val self.left = left self.right = right def create_tree(data: list): if not data: return None first_node = Node(data[0]) tmp_list = [first_node] tmp_count = 0 for item in data[1:]: node = tmp_list[0] new_node = Node(item) if item is not None else None if tmp_count == 0: node.left = new_node # add to tmp_list if item is not None: tmp_list.append(new_node) tmp_count += 1 continue if tmp_count == 1: node.……
阅读全文
-
上一页
-
1
-
2
-
3
-
4
-
下一页