搭建tailscale自建derp

发布在 linux

tailscale比较好用,而且免费用户福利也没有什么大幅度缩水,由于国内网络和国外不互通,所以官方的DERP服务并不好用,有必要自建一个国内的私有DERP给自己用,几年前我就建过一个,最近整理服务器迁移事宜,所以写了一个更详尽的文档记录一下

阅读全文

Finder右键添加快捷方式

发布在 随笔

我偶尔会写一些方便操作的小脚本,统一放置到/usr/local/script/目录,为了防止忘记,该目录还有一个readme文件,记录了每个脚本的源码位置和简短描述

几乎每个脚本都是在命令行里面执行的,今天心血来潮,是否能很方便的将脚本移植到文件管理器的右键点击菜单栏那里。摸索了一番还挺简单。记录一下,主要是使用Automator完成。

阅读全文

Turso 安利

发布在 database

我是一个Sqlite爱好者,作为世界上最广泛使用的数据库,它着实有很多优势,特别是对于小型项目来说。SQL语法兼容、项目成熟、每个语言毫无疑问都支持、速度也不慢、不需要运维。我有好几个小项目都用了Sqlite替代postgresql。但是在有些场景,因为它是嵌入式数据库,也影响了它的发挥

比如我有一个小项目,需要同时在多台电脑上运行,它们都需要数据库。按照数据量大小,新建一个postgresql是不合适的,但是sqlite又不能被多台电脑共用,就很遗憾。直到今天看了https://turso.tech/libsql ,觉得颇有新意,仔细读了一下它的文档,并把一个小项目迁移到了上面,完美符合我的需求…… 关键是免费, 成本极低。所以…. 我决定安利一下

创新点

很简单,将sqlite改成了允许CS架构,并增强了它的WAL能力。让它可以多副本同步,主要应用在serverless场景,用来给边缘计算提供快速的数据库访问,降低全球用户访问延迟。改成CS架构后,原有的编程语言SDK后就得适配。当前提供了TypeScript、Rust、Python、Go SDK。而且TypeScript的支持是最完善的。也可以看出对serverless的支持是它们的核心目标

有了多副本能力,它的推荐架构就有了读写分离这种套路,本地时刻保留了一个可用的副本(理想情况下延迟几秒钟)。写的时候写到主数据库,再同步到本地,这样就能更快的返回数据

看计划好像还有直接写到本地数据库,本地自动写到primary(不知道它的冲突问题准备怎么解决)

我这种使用它避免数据库运维的用法大概率是异类……

迁移已有Sqlite数据库超简单

1
turso db create --from-file olddb_file newdb

其他

该数据库当前的计费方案也可谓是相当的良心,你只需要为你的存储和对数据的读写付费。这基本就是运行sqlite所需要的东西了,没有扣多余的费用。你所写的查询效率越高,触发的数据库查询读越少,成本越低。相对于RDS那种强制按月付费的服务,可谓是大善人…. 免费用户有9GB存储空间,每个月10亿读(并不是查询10亿次,而是查询触发对硬盘块读操作),对于个人小项目基本是够用了….. 只希望别被羊毛党薅光了…..且用且珍惜

其次,该项目服务端、SDK、CLI代码都是开源的。意味着可以自己部署,自己改进,还是挺友好的

就当前,免费的serverless不少,搭配这种免费的serverless 数据库。意味着CPU资源+存储资源都有了。个人写点小项目想部署到serverless上面是没什么问题的,可谓是十分有想象空间了

当然,缺点也不是完全没有的,因为该项目运营才半年时间。SDK未必有那么完善。没什么GUI(比如Datagrip)支持对它查询,只能自己使用typescript SDK sync api同步完整的数据库到本地(当前CLI不支持下载数据库),再使用当前工作流的工具对数据库进行操作

总之~~~ 我觉得这个服务很不错,特别是它当前的收费计划👍

参考

Introducing Embedded Replicas: Deploy Turso anywhere

提到了一种方案,搭配Postgresql的逻辑流复制能力将数据同步到Turso

评论和共享

北斗网格编码

发布在 伪技术

博客断更很久了,来水一篇(惭愧惭愧😭)…….
最近在GIS群看到有人在谈论北斗网格编码,我还是对北斗高精导航很有好感的,于是乎就看了这个编码,嗯嗯,确实是过于简单了,然后就练手写了个demo
如果你熟悉GIS中的RTree、四叉树、八叉树、GeoHash等,那原理几乎是不变的
我能想到它的唯一优点,应该是做政企项目的时候,政企统一了编码规范
代码如下,从Github上的java代码翻译得到,简单起见,忽略了高度编码

阅读全文

昨天高考结束了,最近这半年AI实在太过火热,我也每天都在使用AI工具。高考过后肯定会有人尝试使用AI解答高考题目,我就自我先测试一下,看看ChatGPT能力如何,我个人只测试了2023年全国新高考一卷的8个选择题,将题目转换成latex,分别测试了ChatGPT4+Wolfalpha plugin和Google Bard

结果就是ChatGPT4一次交互回答答对6题,有两题回答无法解决,有一个回答存在明显错误(2倍根号2小于根号5),在指出它的错误后,就给出了正确答案,还有一题三角函数我也无法给出提示,所以实在是解答不出来,所以综合来看可以认为它8道题对了7道,还有一道也不能判它错(它明确说了它不会,而不是直接胡说八道给了错误答案)

针对Bard,由于它不支持中文,所以我用GPT4将中文转成英文让Bard解答,Bard的结果就是8对4,每个回答都充满了自信

ChatGPT4+Wolfalpha的准确率确实是让我震惊了一上午,已经预料到它准确率会挺高,没想到能这么高。但是也可以看到它虽然给出了正确答案,但很多时候和正常做题的思维方式不一样,能计算的就直接暴力计算求解,不会和真正的考生一样,主要靠换算推理

另外也能直观的感受到,AI有它擅长的地方,也有不擅长的地方,作为用户应该学会如何扬长避短,至少要有一定的review能力,判断AI给出的方案是否合理,这样才能和AI友好合作发挥出它最大的能力

点击全文查看和AI的交互全过程

阅读全文

英语渣,又想看源码?

发布在 伪技术

有没有像我一样的,英语渣,翻源码看大段大段的注释有点慢,又必须得看,有时候会不得不把注释使用翻译引擎翻译一下,今天我就遇到了,后来我转念想了下,是否可以使用AI进行翻译呢!然后我直接把当前代码发给网页版GPT4,直接让它翻译注释,不能说效果不好,只能说响应很慢,另外配合上网页版GPT4那个4k版本的上下文,输出一点点内容就直接中断了,让它继续也接不上,总结而言就是能很好的处理将注释翻译成中文的任务,但是有诸多限制

因此ChatGPT确实可以很好的理解代码,也能很好的翻译,那如果我自己把代码的注释提取出来让ChatGPT翻译是不是也行,在网页版测试了下,也行~~~,所以只需要提取出注释部分,再发给ChatGPT让它翻译,它就能得到不错的结果,又快,又省了上下文开销

花了一点时间,使用tree_sitter解析得到注释,用GPT翻译,再替换原代码注释部分就可以了,以下是效果

翻译效果

可以看到效果还行

阅读全文

个人文件夹备份

发布在 伪技术

虽然现在各大云存储遍地,但是将自己的重要资料在资金允许的情况下,多异地备份几次不会有错,毕竟,电脑有价资料无价。今天写了个备份目录到backblaze的小脚本,分享记录一下

流程很简单,使用tar打包,使用zstd压缩,再使用age加密,最后上传, 成功后让pushover给自己发通知

阅读全文

net.Dial限速

发布在 伪技术

访问外网的时候为了避免被风控,所以长久以来,我是用了一台廉价的vps作为固定出口ip的,有多廉价呢,每月1T流量,192M内存,单核,OpenVZ,每年15刀。因为是几年前买的,现在甚至都停售了。但是日前使用上出了问题,表现为网速过快的时候会断网几分钟,遇到后还觉得挺神奇,后来登陆上去用wget下载文件测试了下,稳定复现,下载热门资源,速度很容易跑到50M/s+,最后询问客服得知,对外部进入的流量做了限制,说是防止DDOS攻击…. 但是说真的,明眼人都能看得出来,是觉得价格太低,所以服务降级,不允许大流量下载

因为贫穷,加上它这个网络质量+ip质量还可以,我就琢磨着自我限速得了,一开始打算用tc之类的,后来发现openvz对这方面有很大限制,后来,就直接改一下代理源码得了

得益于ss的源码质量挺高,也挺好改,直接在对外部进行read的时候限速就好,在令牌桶和漏桶之间选择了漏桶,因为令牌桶允许瞬时流量超过阈值,漏桶没有这个情况,添加代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

import (
"go.uber.org/ratelimit"
)

type GlobalLimit struct {
limiter ratelimit.Limiter
readBytes int
lock sync.Mutex
}

var globalLimit = GlobalLimit{
limiter: ratelimit.New(1024 * 25),
}

type RateLimitedConn struct {
net.Conn
}

func (rlc *RateLimitedConn) Read(p []byte) (int, error) {

n, err := rlc.Conn.Read(p)
globalLimit.lock.Lock()
defer globalLimit.lock.Unlock()
globalLimit.readBytes += n

loop := int(float64(globalLimit.readBytes) / 1024)
for i := 0; i < loop; i++ {
globalLimit.limiter.Take()
globalLimit.readBytes -= 1024
}
return n, err
}

func NewRateLimitedConn(conn net.Conn) *RateLimitedConn {
return &RateLimitedConn{
Conn: conn,
}
}

以上限制下载速度为25M/s

最后,在tcpRemote函数内部defer rc.Close()下面添加rc = NewRateLimitedConn(rc)就OK了

评论和共享

OnJava8代码适配IDEA

发布在 java

最近开始看起了Java,选择了《On Java8》这本教材作为了学习材料,看了几章感觉讲解的还是挺好的,然后下载了随书代码进行学习

1
2
3
4
5
6
7
git clone https://github.com/BruceEckel/OnJava8-Examples.git --depth=1
// 我使用jenv管理了多java环境
jenv local zulu64-1.8.0.362
./gradlew test
./gradlew build
./gradlew run
./gradlew xx:xx

不得不说,异常顺利

然后用IDEA打开项目,几乎没有文件是不报红的,代码补全等功能近乎瘫痪。讽刺的是作者在书中和Readme中鼓励大家使用IDEA,在issue中有人报告IDE打开有问题,作者的回复也都是该代码是IDE无关的,反正能跑就行。也不知道作者有没有用IDEA编辑过它这个学习代码。吐槽也没啥用,该教程推荐的人很多,但是我居然很神奇的没有搜到有人和我同样的问题(IDEA打开该项目尽量不报红),随后我就开始了零基础两天多的折腾,最终效果尚可

阅读全文

python调用Mac提供的OCR API

发布在 python

虽然现在离线OCR工具包也挺多的,但是苹果系统自带的OCR还是有一点点优势,毕竟每个M1 mbp都带上了独立的AI加速单元,系统自带的OCR识别服务在识别率和速度上相对开源方案有可取之处,也出了V1,V2,V3在不断优化。本文使用swift调用自带的VNRecognizeTextRequest服务,并导出C API, 然后使用python的ctypes调用该动态链接库。按照此原理,其他语言也可以使用此方案调用该C API

如果你是苹果用户,并且想试试系统自带的OCR功能,本文可能对你有一点点用

阅读全文

ficapy

author.bio


author.job


深圳