在 Tailscale 的 4via6 功能中,IPv4 地址会被映射到一个特定的 IPv6 子网中。现有信息如下:

  • IPv6 子网fd7a:115c:a1e0:b1a:0:7:c0a8:600/120
  • 对应的 IPv4 子网192.168.6.0/24

192.168.6.0/24 是 openwrt 路由器的 IPv4 地址。fd7a:115c:a1e0:b1a:0:7:c0a8:600/120 是 Tailscale 分配给 openwrt 的 IPv6 地址。

📌 问题

现在有一个 IPv4 地址 192.168.6.146,如何计算出其对应的 IPv6 地址?

📌 IPv6 和 IPv4 的映射规则

Tailscale 的 4via6 功能通常会将 IPv4 地址嵌入到 IPv6 地址中,具体方式如下:

  1. IPv4 地址的结构192.168.6.x

    • 192.168.6 是 IPv4 的前三个字节,对应 IPv6 地址中的 c0a8:06(即 192.168.6 的十六进制表示)。
    • x 是 IPv4 的最后一个字节,对应 IPv6 地址的最后 8 位。
  2. IPv6 子网结构fd7a:115c:a1e0:b1a:0:7:c0a8:600/120

    • 前 120 位(15 字节)是固定的。
    • 最后 8 位(1 字节)是可变的,用于表示 IPv4 的最后一个字节。

🔍 如何计算 IPv4 对应的 IPv6 地址

192.168.6.146 为例:

  1. IPv4 最后一个字节146

    • 转换为十六进制:146 = 0x92
  2. IPv6 地址的最后 8 位0x92

  3. 完整 IPv6 地址

    • 0x92 替换到 IPv6 子网的最后 8 位中。
    • 原始 IPv6 子网的最后部分是 600,因此最终 IPv6 地址为:
      1
      fd7a:115c:a1e0:b1a:0:7:c0a8:692

✅ 最终答案

IPv4 地址 IPv6 地址
192.168.6.146 fd7a:115c:a1e0:b1a:0:7:c0a8:692

📌 附注

  • IPv6 地址格式:每个段由 4 位十六进制数表示,允许省略前导零。
  • 子网掩码/120 表示前 120 位固定,最后 8 位用于 IPv4 地址的映射。
  • 验证方法:你可以使用 ping6traceroute6 测试该 IPv6 地址是否能访问对应的 IPv4 设备。

🧠 总结

Tailscale 的 4via6 功能通过将 IPv4 地址的最后一个字节映射到 IPv6 地址的最后 8 位,实现了 IPv4 和 IPv6 的双向通信。对于 192.168.6.146,其对应的 IPv6 地址为:

1
fd7a:115c:a1e0:b1a:0:7:c0a8:692

为了在国内方便使用OpenAI及Google Gemini的API,我们可以使用海外服务器代理OpenAI及Google的相关API。
服务器可使用便宜的AWS轻量服务器,每月3.5美元左右。
下面是整个Nginx的配置文件,修改SSL证书地址即可使用。以下Nginx配置,我已经稳定使用了半年多。

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
user  root;
worker_processes auto;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/nginx-access.log;
error_log /var/log/nginx/nginx-error.log;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';


sendfile on;

keepalive_timeout 65;

gzip on;
gzip_static on;

proxy_buffer_size 128k;
proxy_buffers 32 128k;
proxy_busy_buffers_size 128k;

fastcgi_buffers 8 128k;
send_timeout 60;

server {
listen 443 ssl;
server_name azure.ownding.xyz;
ssl_certificate /home/chatgpt/cert/azure.ownding.xyz_bundle.crt;
ssl_certificate_key /home/chatgpt/cert/azure.ownding.xyz.key;
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
location / {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS;
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Accept,Authorization';
#支持put和delete请求
return 200;
}
# # 设置是否允许 cookie 传输
# add_header Access-Control-Allow-Credentials true;
# # 允许请求地址跨域 * 做为通配符
# add_header Access-Control-Allow-Origin *;
# add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE,PATCH,OPTIONS';
# add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Accept,Authorization';
proxy_pass https://api.openai.com/;
proxy_ssl_server_name on;
proxy_set_header Host api.openai.com;
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

server {
listen 8080 ssl;
server_name generativelanguage.googleapis.com;
ssl_certificate /home/chatgpt/cert/azure.ownding.xyz_bundle.crt;
ssl_certificate_key /home/chatgpt/cert/azure.ownding.xyz.key;
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

proxy_http_version 1.1;
proxy_set_header Host generativelanguage.googleapis.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

location / {
proxy_pass https://generativelanguage.googleapis.com;
proxy_ssl_server_name on;
}
}
}

如果项目中、或者个人网盘需要使用到Office文件的在线预览和编辑功能,并且想免费获得,那么有以下两种效果较好的方案。

  • 使用OnlyOffice社区版。可在线预览、编辑、实时协作。
  • 使用微软Office Online Server。部署软件可在MSDN i tell you 网站下载。

异常报错:Caused by: org.flowable.common.engine.api.FlowableWrongDbException: version mismatch: library version is '6.7.1.0', db version is 5.99.0.0
原因:

  • 数据库缺少相关表和数据,导入flowable相关表即可。版本数据存在 act_ge_prperty
  • 数据库没有设置不区分大小写,设置 lower_case_table_names=1
  • 使用的mycat 1.6.7.4 版本,升级到 1.6.7.6 版本可避免

现在市面上有很多文档存储管理的云服务,比如坚果云。这些服务除了提供文件存储之外,高级功能都提供文件内容的搜索服务。
那么文件内容搜索有什么用呢?当我们需要查找文件时,一般都是查找文件名,但是很多时候我们不太记得文件名,只记得几个关键字词,需要根据这些关键字词查找到对应的文档。
如果自行开发文档全文搜索程序,简单的思路如下:

  • 对于标准文档内容,比如PDF(非扫描版)、微软 Office、TXT等等,可直接使用 Apache Tika 读取文件的内容。
  • 对于非标准的文档内容,比如扫描档PDF、图片等可使用OCR工具识别出文件里的内容。将PDF转换成图片,然后使用PaddleOCR识别
  • 对于读取到的文本内容,存储到 Elasticsearch
  • 从ES中查找关键字信息即可。

在AWS上购买了一台1v,512M配置的lightsail,除了用作网络跳转之外平时都是100%空闲。如果不好好利用起来,感觉每月$3.5的花费挺不值。因此就打算部署一套博客,平时也一直有使用Onenote记笔记的习惯,就打算让这个博客当作补充,毕竟不出意外,这台低配VPN会一直续租下去。
对于搭建博客起先想到的是Wordpress,也成功部署了,但是由于这台服务器的配置实在太低而且MySQL部署在腾讯云上,每次点击都需等上好几秒,遂放弃使用Wordpress。
鉴于该台服务器的配置,决定只用来部署静态网站,后面确定选用Hexo

系统配置

  • 操作系统:Ubuntu20.04
  • 资源:1核、512M内存、20G硬盘

安装Node

  • 安装Node 16,如果安装其它版本,请将 setup_16.x 中的 16 改成对应的大版本号即可,比如 15、14等 \
    1
    curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
    1
    sudo apt-get install -y nodejs
  • 检查Node及npm版本,正确安装后会有版本号输出
    1
    2
    node --version
    npm --version

安装Hexo

  • 安装hexo-cli
    1
    npm install hexo-cli -g

创建项目

  • 创建一个 hexo 项目,命名为 blog
    1
    cd /srv
    1
    hexo init blog
    1
    cd blog

部署项目

  • 生产网站的静态文件

    1
    hexo g

    此时,blog 目录下会生产一个 public 目录,里面就是网站需要的文件

  • 安装 nginx ,并且修改 nginx.conf 文件,在 etc/nginx 目录下可找到。添加下面配置。

    1
    2
    3
    4
    5
    6
    7
    8
    server {
    listen 80;
    server_name blogServer;
    autoindex_localtime on;
    client_max_body_size 1200M;
    root /srv/blog/public;
    index index.html;
    }

    其中 server 中的 root 需要指向生产的 public 目录

  • 启动 nginx 后即可访问你的博客

新增文章

-

1
2
cd /srv/blog
hexo new "你文章的标题"

此时在 source/_posts 目录下会生成相应的 .md 文件

删除文章

  • 直接删除 source/_posts 中的文章文件
  • 程序生成静态文件
    1
    hexo g
    即可更新网站

使用PaddleOCR可方便地识别图片中的文字信息。PaddlePaddle可在Windows、Linux、Mac等系统上快速安装。

示例代码

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
40
41
42
43
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
import datetime
import os


def ocr_img(path,name,out_path):
# 开始时间
startTime_pdf2img = datetime.datetime.now()
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
pathDir = os.listdir(path)
i = 0
ocr_text = []
for allDir in pathDir:
img_path = os.path.join('%s%s' % (path, allDir))
print(img_path)
result = ocr.ocr(img_path, cls=True)
# image = Image.open(img_path).convert('RGB')
# boxes = [line[0] for line in result]
# 识别出的文字
# txts = [line[1][0] for line in result]
# scores = [line[1][1] for line in result]
# im_show = draw_ocr(image, boxes, txts, scores)
# im_show = Image.fromarray(im_show)
# im_show.save(out_path + '/' + name + "_" + str(i) + ".jpg")
for line in result:
# print(line[1][0])
ocr_text.append(str(line[1][0]))
i = i + 1
# 结束时间
endTime_pdf2img = datetime.datetime.now()
print(str(i) + ' 张图片总用时', (endTime_pdf2img - startTime_pdf2img).seconds,'S')
# print(ocr_text)
if ocr_text:
file_path = os.path.join(out_path,name+'.txt')
with open(file_path,'w',encoding='utf-8') as f:
for line in ocr_text:
f.write(line+'\n')

if __name__ == "__main__":
img_path = 'F:\\ocr\\anaconda\\imgs\\'
out_path = 'F:\\ocr\\anaconda\\txt'
ocr_img(img_path,'images',out_path)

Paddle对于识别中文有很好的精度,能够在项目中开箱即用。

0%