北斗网格编码

发布在 伪技术

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

阅读全文

英语渣,又想看源码?

发布在 伪技术

有没有像我一样的,英语渣,翻源码看大段大段的注释有点慢,又必须得看,有时候会不得不把注释使用翻译引擎翻译一下,今天我就遇到了,后来我转念想了下,是否可以使用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了

评论和共享

遇到有人反映可能是内网环境。无法访问外部网络。安装初始化环境的时候好像颇为不便。其实只要能ssh上去。这一切都不是问题。就是各种转发,以下以内网使用pip安装第三方依赖包为例说明该如何操作

1.本机开启一个临时的http代理

1
pip install mitmproxy           # 安装
1
mitmproxy -p 8899 --ignore .+               #  使用

mitmproxy是一个python编写的http/https中间人框架。这里我们单独的使用它的http proxy功能。
参数p当然是port端口的意思了。监听8899端口
加上ignore是因为中间人https连接需要客户端安装信任证书才可以。此处我们只是单纯的使用一下proxy不需要中间人。所以所有流量使用HTTP Connection隧道方式就达成目的了。使用正则表达式.+忽略所有域名。至于为什么使用http不是用socks。因为http使用更广泛

2.ssh使用远程端口转发(参考ssh端口映射)

1
ssh -R 8899:localhost:8899 remote_server

将远程主机上的8899端口映射到本机的8899端口

3.远程主机使用本地的http代理进行环境初始化

可以使用如下命令进行测验

1
curl -x http://localhost:8899 ip.cn

比如使用pypi安装tornado执行如下命令即可

1
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --proxy http://localhost:8899 tornado

思路是这样。其它同理~~~

评论和共享

开发中总会遇到一些测试需要回滚数据库。常规的单元测试的做法是在单个会话中不真正的写入到数据库。而是测试完成后进行数据库回滚。大多数情况下这样都是满足要求的。只是有的时候需要数据库真正的写入到数据库。此时rollback回滚就有些乏力了。此时给数据库做一个备份,测试完成后回滚是一种不错的主意。Postgresql数据库的常规备份我们会使用pg_dump和pg_restore进行导出和恢复。此时如何快速的进行这个操作是我们关注的话题

很幸运。很顺利的搜到了答案。6年前有人在stackexchange上提问同样的问题。得到了一些有用的回复。大概有这些

  • 使用文件系统级快照LVM
  • 使用CREATE DATABASE … TEMPLATE语法
  • 将数据库放在虚拟机里面。使用虚拟机快照

其中最有效的方案是二。因为LVM在个人笔记本上难以实施。虚拟机恢复时间较慢。依据方案二于是乎有人写了一个工具 stellar。粗略读了一下源码。其具体原理大概如下图
backup_and_restore_flow

备份的时候使用create database … template创建2个备份。恢复的时候删掉原有的数据库。将一个备份重命名为原有的名称。另外的一个备份再生成一个备份就完成了。另外删除新建数据库操作均会关闭所有已连接的数据库会话。

因为类似文件系统级快照,所以方法极快。我本机2G的数据库文件,创建一个快照大概十秒钟左右,恢复就更快了。当然缺点也是有的,你每创建一个快照都会新增2个一样大小的副本,相当的占据硬盘空间,可是为了速度这点缺陷也就微不足道了┑( ̄Д  ̄)┍

另外一个小缺点。因为它定位于测试环境下的数据库备份恢复。所以只连接一台机器。比如你一个数据库在机器A,一个数据库在机器B.赛高~~,那你只能在2个目录下使用2个配置文件来完成了。如果同一个机器上的多个数据库是可以直接备份的。再就是此工具比较专注于Postgresql。对于Mysql就不那么友好了。或许是Mysql的备份方案不一样

使用方法

  1. stellar init 按照提示输入本机数据库访问路径生成配置文件
  2. stellar snapshot 生成一个快照
  3. stellar restore <snap1> 恢复
  4. 其他请看 stellar --help

( ⊙ o ⊙ )啊! 多么爽快,世界真美妙

参考

Is it possible to quickly create/restore database snapshots with PostgreSQL?
github stellar

评论和共享

半自动刷网络课程

发布在 伪技术

刷一个网络课程,很常见的那种,播放视频统计观看时长。不过该系统比较弱,即使切换到别的页面一样也会计算时长。限制条件只是偶尔会出现一些问答题让视频暂停且一个视频播放完成后不会自动播放下一个视频。最开始是打算直接模拟发送http请求,不过后面感觉或许有坑就选了另外一种办法。讲课肯定是有声音的,用程序去捕获声音,如果五秒钟没有声音则认为有问答题出现或者该章节讲完了。

阅读全文

对于命令行爱好者,很多人会选择将黄金键盘位置CapsLock替换成Ctrl,有些人选择仅仅是和默认的Ctrl进行替换,有些人更极端,相当于去掉CapsLock键增加一个Ctrl位置。我选择后者。有时候会想。假如需要输入大段文字的时候一直按住Shift岂不是蛋疼。搜索了下,网上真有这个问题。而且有人还给出了答案。我就转发一下好了-_-

  • 首先你要知道在你的system preferences→keyboard→modifiers keys是可以修改CapsLock映射
    到Ctrl的
  • 其次使用applescript可以编辑脚本对GUI界面进行操作(系统还自带一个Script Editor,不得不吐槽一下,脚本真不美观)
  • 脚本编写后执行需要到安全设置里面添加许可权限(system preferences→security&privacy→accessibility,由于我使用的是iTerm,将它加入就好了)

最后奉上脚本(添加至~/.zshrc,!!!!仅对英文系统有效,中文估计改一下也能用)

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
caps () {
osascript > /dev/null <<EOF
tell application "System Preferences"
reveal anchor "keyboardTab" of pane "com.apple.preference.keyboard"
end tell
tell application "System Events" to tell window 1 of process "System Preferences"
click button 1 of tab group 1
tell sheet 1
tell pop up button 4
click
delay 0.1
if value is "⇪ Caps Lock" then
click menu item 2 of menu 1
log "Change Caps Lock"
else
click menu item 1 of menu 1
log "Restore Caps Lock"
end if
end tell
click button "OK"
end tell
end tell
quit application "System Preferences"
EOF
}

参考

Controlling modifier key behavior via the terminal on mac
Run AppleScript from bash script

评论和共享

首先这是篇水文:),仅记录下这2天使用docker的情况。实际上和docker没什么关系,静态博客嘛,生成之后上传到vps然后上面放个nginx就好了,没什么需要操心的

阅读全文

一直以来我都是多个邮箱混合使用,对Gmail邮箱也不是特别感冒(主力邮箱是outlook(因为没有被墙))。或许是几天没有打开foxmail,刚打开就有那么几十封各种垃圾推广邮件。或许是心情不大好我去搜了下如何过滤掉这些邮件,让他们不会被foxmail客户端接收。于是感受到了outlook和gmail的明显差距,忍不住发篇博文展示下。

阅读全文

ficapy

author.bio


author.job


深圳