Coding 的痕迹

一位互联网奔跑者的网上日记

0%

由于已有某套图书的旧版本,而买新的一套又太贵,因此决定打印 PDF 电子书凑合一下。奈何很多网站的免费电子书均有水印,打印起来会很不舒服,而收费的某考研网站 PDF 需要 5元/本。于是自己探索了一下 PDF 去水印的思路,后续对 PDF 文件纠偏一下,就可以打印了。

这里发现一件好玩的事情:免费 PDF 的来源似乎就是这个收费网站,因为他们给的样图中,出现了同一页扫描偏了的情况。

使用到的工具:

  • Python 3.10
  • Adobe Acrobat Pro DC 2021 (来源)

去水印的思路

根据我的观察,常见的水印有两种:PDF 软件自带的水印与自定义水印。前者可以在 Adobe Acrobat 中点击 水印 - 删除,而后者又主要包括文字水印和图片水印。如果水印和影印图片是独立的页面元素,那么就好分离了。我遇到的正是这样的情况。

去水印的思路

阅读全文 »

月初的时候组建了一台 All-in-One,想在里面装一台软路由,于是开始了漫漫选型与试错之旅。尝试了 OpenWrt 官方 21、22 版本,恩山论坛网友修改过的两个版本、OPNsenseLEDE 自动编译版本,最终选择了自编译 lean 发布的 LEDE。

踩坑史

下面简要说明一下选择的原因和遇到的问题。

  • 官方 OpenWrt 发行版
    官方的发行版最为精简,个人觉得除了插件需要安装外,很好用、放心,实测可以跑到最大带宽。主要问题:

    1. 安装完后默认可用空间大小不到 100M,如果需要安装 smartdns、AdGuardHome 及其他网络插件,将导致可用空间非常有限,并出现重启系统丢失的情况。
    2. 在安装一些网络插件时,由于系统版本过新/旧,导致 opkg 报错提示找不到依赖 libubus20220228 (openwrt 22 默认带 202206 的版本,而 openwrt 21 带有 2021 的版本,此时软件源中移除了 20220228 版本)。
    3. 在使用一些网络插件时,不知道是系统还是插件原因, dns 相关设置有严重 bug 导致无法使用。

    另外还有一个小坑:如果给软路由分配了多网卡,那么在你调整网卡后,也需要适当修改一下对应网卡的防火墙区域。如果没有正确地配置 LAN 和 WAN 防火墙区域,将导致 LAN 口客户端无法访问网络。

  • 网友发布版本
    这一部分中我使用过 koolshare 和 lusty 编译的版本。个人感觉问题如下:

    1. 由于不支持定制,两个版本均存在很多不需要的功能。作为软路由系统,界面略有花哨,尤其是 koolshare 使用的橙色+黑色主题,使用起来不方便。当然,这一点属于个人喜好。
    2. lusty 版本无法跑满带宽。
    3. lusty 版本上面的 l2tp 在 windows 10 下可以正常连接,但 Android 下遇到了困难。可能是我配置问题。
  • OPNsense
    OPNsense 是一款基于 FreeBSD 内核的企业级防火墙系统。自己对 FreeBSD 简洁、低占用的印象很好,加之曾经使用过 pfSense, 在网上比较了 pfSense 和 OPNsense 之后选择了它。其优点是作为企业级系统,在“计算机网络学习”这一角度看功能全面,甚至有一些第三方软件(如 iperf3、speedtest)的 Web UI 集成,但缺点也较为明显,不支持一些中国特色的网络工具。

    OPNsense 总体资源占用比 OpenWrt 略大:CPU 占用在 30% 左右,内存占用至少在 300M,开启 IDS 后内存占用逼近 1G。相比之下,OpenWrt 内存占用在 100M 左右,CPU 使用率也很低。我比较喜欢的是它的防火墙支持实时预览 ACCEPT 和 DROP 的包的概要,有利于快速调整防火墙设置。尽管如此,配置它的防火墙仍然常让人摸不着头脑。

阅读全文 »

背景

被封在寝室,一直以来使用 easyconnect-docker 连接校园网(参考好友 @zhangzqs 的文章 # Linux下优雅地通过docker-easyconnect实现内网访问。然而最近总是出现连不上的情况:

1
2
3
4
5
6
$ sudo ./easyconnect.sh
WARNING: logging deactivated (can't log to stdout when daemonized)
auto login is disabled
auth failed, please check if the vpn address is valid and reachable!
login failed!
svpn stop!

由于对 WireGuard 感兴趣,考虑到现有条件:

  • 宿舍有一条中国电信商业宽带,带公网 IPv4 地址,已配置好 DDNS

  • 校园网内有稳定开着的 Linux 服务器

  • 阿里云公网上用 frp 转发流量,在传文件的场景下很贵

便打算使用 WireGuard 从校园网向宿舍建立一条虚拟链路,临时代替学校的 VPN 服务。

阅读全文 »

近几个月一直在使用 Manjaro Linux + KDE 桌面环境作为自己工作使用的系统和环境。

最近一段时间经常出现打不开应用程序的情况,每次需要重启解决,十分苦恼。系统也没有给出任何错误提示,今天决定好好研究一番。先找到了一篇 《ARCHLINUX KDE常常无法启动程序》,作者认为是 hostname 的问题,心里感觉不是很像,因为我的主机名曾经配置过,hosts 文件也没有什么问题。

对了,为什么不看看系统的报错信息?!在 Dolphin 中,Show Panels - Terminal 打开终端,然后执行一个 X 窗口程序,比如 xclockkate,提示(大意):

1
Maximum number of clients reached
阅读全文 »

权威服务器

权威服务器是保存 DNS 名称记录(包括 A、AAAA 和 CNAME)的服务器,简单地说,DNS 记录归它管。非权威服务器根据以前的域名查询来构建缓存文件。它不存放原始名称记录。我们平时使用的如腾讯 DNS (119.29.29.29)、114 DNS (114.114.114.114)均是非权威服务器,负责转发查询与缓存 DNS 记录。

在上一篇《网站安全的一点思考》探究的过程中,我们通过 Wireshark 抓包了解了 DNS 递归查询过程,概述如下:

  1. 查询时会携带期望得到的记录,如正常查询时会请求对应域名的 A 记录。

  2. 客户端会首先查询根域名服务器列表,并从中选择一个;此后,它向所有遇到的服务器查询 sunnysab.cn 所对应的 A 记录。根域名服务器自然不知道,于是返回了 cn 对应的名称服务器(NS 记录)a.dns.cnb.dns.cn 等等;紧接着,它向 a.dns.cn 查询 sunnysab.cn 所对应 A 的记录,以此类推。

  3. 接第二条,如果我查询一个三级域名,如 a.b.example.com,就要看哪一级别的名称服务器存储了对应的记录。

看上去,权威服务器一般为该层级的 NS 记录,并被上一层域名所知。如,cn. 这一层级知晓 sunnysab.cn. 的 NS 记录并能向查询者返回它。其实,这是由域名注册商(domain name registrar)向域名注册管理局(也称注册局,domain name registry)登记的,且一般 TTL 较长。

那么,怎样自己搭建域名解析服务呢?

阅读全文 »

最近看到清华大学树洞项目的 搭建指南,里面特别强调了主机安全:

【warning必须采取的安全措施】:请务必确保时刻没有子域名DNS解析到服务器真实IP,并且服务器真实IP必须始终保密!

服务器的 IP 如果泄露, DDoS 等情况就有可能发生,同时还会极大地增加攻击面。因此,服务器的HTTP流量必须始终通过 CDN(比如Cloudflare CDN)。在 https://securitytrails.com/dns-trails 网站上,一个域名的全部子域名和 DNS 历史记录都可以轻松查到,因此不能有任何时刻让服务器真实 IP 暴露在外。

于是在 SecurityTrails 上检查了自己的域名 sunnysab.cn,发现有些仅自己使用、或给同学使用的,未公开的域名也赫然在列,令人不解。

阅读全文 »

3月23日,团队收到指导老师的微信消息,学校希望在封校期间通过提前预约的方式开放图书馆,老师要求团队在“小风筝”小程序或 App 中添加图书馆预约功能。具体要求是:图书馆仅开放2层共274个座位,除周一、周二闭馆外,每天有两个时段(后改为上午、下午、晚上三个时段)开放。

老师向团队提出需求的聊天记录

经过沟通团队了解到,2层所有座位将会被编号,四人桌只允许坐一人,六人桌只允许坐两人,入口处由志愿者负责入场检查,图书馆内部由志愿者巡查。

有部分同学提出了方案:

  1. 图书馆多开放一些座位,例如同时开放三楼、四楼,还是很容易做到不拥挤的。但可能由于人手有限,图书馆老师并不同意。

  2. 安排同学将每张桌子所配多余的椅子撤走。但是没有得到采纳。

  3. 直接使用图书馆闸机系统控制进馆人数,每桌座位限制可以通过安排工作人员巡视的方式进行。但此方法由于门禁系统过旧,不大可行。

  4. “第二课堂” 刷卡机可以记录入馆人员信息,但是不方便记录人数。出入时可能存在多次刷卡。

  5. 微信公众号的抢票平台。该方法需要每天发布,较麻烦。

但这些方案并未得到采纳,因而接下来要通过技术方法解决问题。

阅读全文 »

原文自 ZIM file format - openZIM


从2021年起,我们改变了ZIM文件格式中命名空间的处理方式。
这是我们对 libzim 和相关语义中处理条目的方式的重大改变,但这不是二进制 zim 格式的一个 break change。旧的库和阅读器仍然兼容新的 zim 文件。

这个页面仅描述了新的文件格式。旧的文档参见 ZIM file format old namespace - openZIM.

Beginning 2021, we change the way we handle namespaces in ZIM file format. This is major change in the way we handle entries in libzim and the semantics around but it is not a break in the binary zim format. Old library/readers are compatible with new zim files. This page describes the new format. The old format can be found here : ZIM file format old namespace.

Schema File Format.png

阅读全文 »

帮同学写一个邻接表转邻接矩阵的程序,程序读入一个邻接表,节点编号从 1 至 1673,要求转成 1673 * 1673 的邻接表。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 邻接矩阵
# 索引范围 0 - 1672
matrix = [[0] * 1673] * 1673

# 读邻接表
with open('data.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
# 输入数据中下标从 1 开始,1 - 1673,要减 1 处理
t = line.split()
start = int(t[0]) - 1
end = int(t[1]) - 1
matrix[start][end] = 1

# 打开输出文件
out_file = open('output2.csv', 'w+', encoding='utf-8')

# 写邻接矩阵
for line in matrix:
columns = [str(num) for num in line]
line_to_write = ','.join(columns) + '\n'

out_file.write(line_to_write)

运行后,程序所输出的邻接矩阵元素全为 1,不解。

阅读全文 »

Sonic 是一个基于 rust 的语言的轻量极全文检索系统,类似项目还有 tantivyMelliSearch 。因为学习需要,读了项目作者 Valerian Saliou (法)发布 Sonic 时的文章《Announcing Sonic: A Super-Light Alternative to Elasticsearch》,其中提到了这套系统实现的若干技术,于是结合自己看《信息检索导论》所学知识,在此记录一下。

什么是 Sonic?

用作者的话来说就是:

Sonic 是一个快速、轻量和无模式的搜索后端。它摄取搜索文本和标识符元组,然后可以针对微秒时间查询。

Sonic 可以用作重量级和全功能搜索后端的简单替代方案,如在某些用途中替代 Elasticsearch。

Sonic 使用标识符索引而不是文档索引。当需要查询时,它返回外部数据库中的、用于指向匹配的文档的 ID (而非文档本身)。

Sonic 使用 rust 语言编写,以确保性能和稳定性。您可以在您的服务器上托管它,并通过特定的协议 Sonic Channel 将应用程序通过网络相连。然后,您将能够发出搜索查询并用您的应用添加新的索引数据 - 无论您使用哪种编程语言。

Sonic 设计用于快速轻便地使用资源,期待它在没有毛刺的情况下在非常低的资源上运行。在 Crisp 项目中,我们将 Sonic 部署在每月 5 美元的 DigitalOcean SSD VPS 上,仅 300MB 内存和 15GB 磁盘空间就索引了五千万个对象。

sonic-demo

阅读全文 »