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功能,本文可能对你有一点点用

阅读全文

SSL证书管理

发布在 DevOps

在开发完毕部署过程中,SSL证书是避不开的一环,而且未来使用SSL证书的地方会越来越多。但是遍观互联网,大多数讲解SSL证书部署的文章都只是能用,却也只是当下能用,无法很好的扩展,也无法做到有效的管理。下面说说为什么

阅读全文

用服务器很多年了,以前为了节约费用会在创建服务器的时候尽可能的少分配系统盘容量,很多机器就给15G就够了. 外部数据或者应用需要的数据使用额外的磁盘存储, 尽量的保证应用数据和系统盘隔离开来,好维护

但是很多年过去了, 发现这种方案不靠谱, 一台长久使用的服务器, 如果经常人肉运维, 可能会在根磁盘产生很多临时数据, 久而久之, 很小的系统盘很容易占满, 因为还是有挺多软件默认是写根磁盘的, 人肉介入环节有点多

其实20G和40G费用差距很小,没必要为了这么点费用在商用环境下扣扣搜搜

不说了,去给服务器系统盘扩容去了😭

评论和共享

ficapy

author.bio


author.job


深圳