普通视图

发现新文章,点击刷新页面。
昨天以前首页
  • ✇杜老师说
  • 图片为啥用 Base64 格式进行传输Teacher Du
    在互联网的世界里,图片传输是再平常不过的事情了,而 Base64 格式常常出现在这一过程中。那为啥图片要用 Base64 格式来传输呢?这背后有不少门道。本文将介绍 Base64 格式的应用场景和优点,以及一些应用场景下的缺点。Base64 是什么Base64 是种用 64 个可打印字符来表示二进制数据的编码方法。这 64 个字符含大小写字母各 26 个,还有 10 个数字以及两个符号。例如,当我们看到一串像 SGVsbG8gV29ybGQh 这样的字符,这就是 Base64 编码后的结果,其实代表了 Hello World!易于文本传输在很多网络传输场景中,尤其是早期的网络应用,传输通道主要被设计为传输文本数据。因为文本数据格式相对简单、统一,而且不容易出现乱码等问题。而图片是二进制的数据,直接传输二进制数据可能会因为不同系统、不同软件对二进制数据的处理方式不同而出现问题。Base64 把图片的二进制数据转换成了文本形式。这样一来,通过电子邮件、网页表单等主要以文本传输为主的渠道时,图片就可以顺利跟着文本一起传输了。比如,在发送带有图片附件的电子邮件,邮件系统会把图片转换成 Base
     

图片为啥用 Base64 格式进行传输

作者 Teacher Du
2025年2月17日 00:00

在互联网的世界里,图片传输是再平常不过的事情了,而 Base64 格式常常出现在这一过程中。那为啥图片要用 Base64 格式来传输呢?这背后有不少门道。本文将介绍 Base64 格式的应用场景和优点,以及一些应用场景下的缺点。

Base64 是什么

Base64 是种用 64 个可打印字符来表示二进制数据的编码方法。这 64 个字符含大小写字母各 26 个,还有 10 个数字以及两个符号。

例如,当我们看到一串像 SGVsbG8gV29ybGQh 这样的字符,这就是 Base64 编码后的结果,其实代表了 Hello World!

易于文本传输

在很多网络传输场景中,尤其是早期的网络应用,传输通道主要被设计为传输文本数据。

因为文本数据格式相对简单、统一,而且不容易出现乱码等问题。

而图片是二进制的数据,直接传输二进制数据可能会因为不同系统、不同软件对二进制数据的处理方式不同而出现问题。

Base64 把图片的二进制数据转换成了文本形式。这样一来,通过电子邮件、网页表单等主要以文本传输为主的渠道时,图片就可以顺利跟着文本一起传输了。

比如,在发送带有图片附件的电子邮件,邮件系统会把图片转换成 Base64 格式,然后和邮件的正文一起发送。

接收方收到邮件后,邮件客户端再把 Base64 格式的数据转换回图片,这样我们就能看到图片。

兼容性好

不同的操作系统和不同的软件应用对数据处理方式可能存在差异。Base64 编码后的文本数据在各种平台都能被正确识别和处理。

例如,一个在 Windows 系统上生成的 Base64 编码的图片数据,在 Linux 服务器上也能轻松解码并还原成图片,不用担心因为平台不同而出现数据损坏或者无法读取的情况。

几乎所有的编程语言都有内置的库或者函数来处理 Base64 编码和解码。这使得开发人员在开发涉及图片传输的应用程序时,能够很方便使用 Base64 格式。

比如,在一个基于 Python 的 Web 应用,开发人员可以使用库轻松地将图片文件读取并编码为 Base64 格式,然后通过网络发送给服务器或客户端。

方便在网页中嵌入图片

在网页设计中,如果一个网页中有大量的小图标或小图片,每次加载这些图片都需要发送一个 HTTP 请求。

这不仅会增加服务器的负担,还会影响网页加载速度。

而将这些小图片转换为 Base64 格式后,可以直接将 Base64 编码的数据嵌入到 HTML 或 CSS 文件中。

这样浏览器在加载 HTML 或 CSS 文件的时候,就可以直接读取到图片数据,而不需要单独发送 HTTP 请求去获取图片,从而提高了网页的加载效率。

嵌入 Base64 格式的图片还可以简化网页的结构。不需要在网页文件目录中单独存放这些小图片文件,减少了文件管理复杂性。

对于一些简单的网页应用或前端框架,这种方式非常实用。

安全性的考虑

虽然 Base64 编码不能算是真正的加密方法,但它在一定程度上可起到隐藏信息的作用。

因为对于不了解 Base64 编码的人来说,看到一串 Base64 编码的数据可能不知道它代表的是图片内容。

在一些对安全性要求不是特别高的场景下,可作为一种简单的保护措施。

比如,在一些内部文档分享系统中,把图片转换 Base64 格式传输,可防止非授权用户轻易地获取到原始图片文件。

在某些情况下,直接传输二进制图片文件可能会带来安全风险,如图片文件可能被恶意篡改,包含恶意代码。

将图片转换为 Base64 格式后,这些恶意代码在 Base64 编码文本环境中很难被执行,从而降低安全风险。

缺点

不过,Base64 传输图片也有其缺点。比如,Base64 编码后数据量比原始的二进制图片数据要大,大概会增加百分之三十三左右的大小。

所以在传输大图片或者对带宽要求很高的场景,可能需要权衡下是否使用 Base64 格式。

  • ✇杜老师说
  • 本博出现图碎问题说明Teacher Du
    近期本博访问时出现了图碎问题,经排查系 CDN 回源失败导致的。有小伙伴可能会说,保证成功就可以修复了,其实没有那么简单。本文简单描述下存储节点数据流,顺便科普一下如何清理单站数据缓存。数据流向通过下图可以看出,图片文件保存在主机上,通过转换处理为 WebP 格式文件,经由 CDN 回源并实现访问加速:问题分析登录 CDN 管理后台查看其日志,发现出现超时记录。超时原因一般两种,一种是因线路问题导致回源超时,一种是因主机没有及时返回数据造成。本地图片经由 WebP 中间件处理,再回源给 CDN 做反代,经查是 WebP 服务突然宕机导致 CDN 未收到响应数据导致超时。除超时问题外,因无返回数据导致 CDN 响应 404,而服务器设置 404 默认跳转至主站首页,这就导致好多小伙伴频繁刷新页面依然不显示图片。解决方案目前已关闭 CDN,流量直接回源至源主机,缺点就是会影响访问的速度。带调试维护后会重新挂上 CDN。WebP 图片转换是为了减少图片体积,进而减轻带宽压力「轻量级服务器有流量的限制」因此不能暂停使用,已修改其参数,尽量保障响应的成功率。如之前有访问记录,会留下 404 跳转
     

本博出现图碎问题说明

作者 Teacher Du
2025年2月11日 00:00

近期本博访问时出现了图碎问题,经排查系 CDN 回源失败导致的。有小伙伴可能会说,保证成功就可以修复了,其实没有那么简单。本文简单描述下存储节点数据流,顺便科普一下如何清理单站数据缓存。

数据流向

通过下图可以看出,图片文件保存在主机上,通过转换处理为 WebP 格式文件,经由 CDN 回源并实现访问加速:

问题分析

登录 CDN 管理后台查看其日志,发现出现超时记录。

超时原因一般两种,一种是因线路问题导致回源超时,一种是因主机没有及时返回数据造成。

本地图片经由 WebP 中间件处理,再回源给 CDN 做反代,经查是 WebP 服务突然宕机导致 CDN 未收到响应数据导致超时。

除超时问题外,因无返回数据导致 CDN 响应 404,而服务器设置 404 默认跳转至主站首页,这就导致好多小伙伴频繁刷新页面依然不显示图片。

解决方案

目前已关闭 CDN,流量直接回源至源主机,缺点就是会影响访问的速度。带调试维护后会重新挂上 CDN。

WebP 图片转换是为了减少图片体积,进而减轻带宽压力「轻量级服务器有流量的限制」因此不能暂停使用,已修改其参数,尽量保障响应的成功率。

如之前有访问记录,会留下 404 跳转缓存,需要清理相关数据。

有小伙伴分享了两种清理缓存的方法,需要的小伙伴可以参考操作。

清理缓存

首先进入到浏览器的开发者工具,一般浏览器点击F12即可,进入更多设置,勾选 Disable cache while DevTools is open 项:

或者切换到网络标签页,勾选禁用缓存,刷新页面即可「注意保持开发者工具一直处于开启的状态」

  • ✇杜老师说
  • Hugo 渲染超时问题的解决笔记Teacher Du
    hehe 童鞋选择将所有的站点托管到杜老师这「是收费的」这样就可以专心维护网站的内容,也不用费心思在运维上。在做站点迁移时遇到了 Hugo 框架的一个报错,原因是使用 Hugo 搭建相册网站需要遍历大量图片,而在生成站点文件时出现了超时问题,本文记录解决方法。报错信息123ERROR render of "page" failed: "/home/runner/work/photo/photo/themes/gallery/layouts/_default/single.html:3:5": execute of template failed: template: _default/single.html:3:5: executing "main" at <partial "gallery.html" .>: error calling partial: partial "gallery.html" timed out after 30s. This is most likely due to infinite recursion. If this is just a s
     

Hugo 渲染超时问题的解决笔记

作者 Teacher Du
2025年2月5日 00:00

hehe 童鞋选择将所有的站点托管到杜老师这「是收费的」这样就可以专心维护网站的内容,也不用费心思在运维上。在做站点迁移时遇到了 Hugo 框架的一个报错,原因是使用 Hugo 搭建相册网站需要遍历大量图片,而在生成站点文件时出现了超时问题,本文记录解决方法。

报错信息

1
2
3
ERROR render of "page" failed: "/home/runner/work/photo/photo/themes/gallery/layouts/_default/single.html:3:5": execute of template failed: template: _default/single.html:3:5: executing "main" at <partial "gallery.html" .>: error calling partial: partial "gallery.html" timed out after 30s. This is most likely due to infinite recursion. If this is just a slow template, you can try to increase the 'timeout' config setting.
Total in 60412 ms
Error: error building site: render: failed to render pages: render of "page" failed: "/home/runner/work/photo/photo/themes/gallery/layouts/_default/single.html:3:5": execute of template failed: template: _default/single.html:3:5: executing "main" at <partial "gallery.html" .>: error calling partial: partial "gallery.html" timed out after 30s. This is most likely due to infinite recursion. If this is just a slow template, you can try to increase the 'timeout' config setting.

注意:杜老师是通过 GitHub Actions 来部署,逻辑是先准备 Hugo 的运行环境,再根据站点的数据渲染站点文件。在生成站点文件时出现如上错误信息。

解决思路

从错误信息看,Hugo 网站在渲染页面时出现了问题,具体是 gallery.html 这个 partial 文件在执行时超时了,并且怀疑是由于无限递归导致的。

首先检查 gallery.html 中代码。无限递归问题可能是 gallery.html 中调用了自身,或者在调用其它 partial 时形成了循环。仔细检查文件,确保没有递归调用自己或其它可能导致循环的部分。

其次检查数据结构。如果 gallery.html 中依赖某些数据结构,可能是数据结构中存在循环引用。例如,某个对象或者列表在渲染时不断递归调用。

再次增加超时时间。如果确认不是无限递归问题,而是模板渲染确实很慢,可以尝试增加超时时间。在 Hugo 的配置文件中,增加 timeout 配置项,如 timeout = '60000'

然后优化模板性能。如果模板渲染确实很慢,可能是模板的代码过于复杂。可以尝试优化模板代码,减少不必要循环和复杂逻辑。

接着调试模板。使用 Hugo 的调试工具来逐步检查模板的执行过程。可通过在模板中添加日志输出来帮助调试。

再者检查依赖插件。如果网站使用第三方插件或依赖,可能是插件导致了问题。尝试禁用插件,看看能否解决问题。

最后检查 Hugo 的版本。确保使用的 Hugo 版本是最新的。旧版本可能存在已知的 bug,而新版本可能已修复了这些问题。

  • ✇杜老师说
  • 新版本 Memos 说说页面部署代码分享Teacher Du
    在柚子兄的帮助下,杜老师终于完成了 Memos 的版本升级。Memos 是真的糟糕,动不动 BREAKING CHANGE,前后对 API/S3 做了大量改动,严重影响了日常的使用,强烈建议在不影响使用的情况下升级版本。特性显示用户头像;显示用户昵称与平台用户名;支持大图显示;可一键至说说广场进行评论。效果正常的浏览效果如下图:夜间模式的浏览效果如下图:代码12345678910111213141516171819202122232425<link href="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/css/style.css" rel="stylesheet" type="text/css"><link href="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/css/highlight.github.min.css" rel="stylesheet" type="text/css">{% p center logo large, 点图片可放大! %}<
     

新版本 Memos 说说页面部署代码分享

作者 Teacher Du
2024年10月21日 00:00

在柚子兄的帮助下,杜老师终于完成了 Memos 的版本升级。Memos 是真的糟糕,动不动 BREAKING CHANGE,前后对 API/S3 做了大量改动,严重影响了日常的使用,强烈建议在不影响使用的情况下升级版本。

特性

  1. 显示用户头像;

  2. 显示用户昵称与平台用户名;

  3. 支持大图显示;

  4. 可一键至说说广场进行评论。

效果

正常的浏览效果如下图:

夜间模式的浏览效果如下图:

代码

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
<link href="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/css/style.css" rel="stylesheet" type="text/css">
<link href="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/css/highlight.github.min.css" rel="stylesheet" type="text/css">
{% p center logo large, 点图片可放大! %}
<section id="main" class="container">
<div id="memos" class="memos">
</div>
</section>
<script type="text/javascript">
var memos = {
host: 'https://s.dusays.com/',
limit: '10',
creatorId: '1',
domId: '#memos',
username: 'penn',
name: 'Teacher Du',
}
</script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/lazyload.min.js?v=17.8.3"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/marked.min.js?v=11.1.1"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/view-image.min.js?v=2.0.2"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/moment.min.js?v=2.30.1"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/moment.twitter.js"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.0.0/memos/js/highlight.min.js?v=11.9.0"></script>
<script type="text/javascript" src="https://npm.onmicrosoft.cn/penndu@13.2.0/memos/js/memo.js"></script>
<script>hljs.highlightAll();</script>

注意:如果不是 Volantis 主题需删除{% p center logo large, 点图片可放大! %}所在行。

使用

请根据需求修改对应的内容:

参数说明
host域名
limit每页显示条数
creatorId用户的 ID
domId显示位置
username广场的用户名
name昵称
  • ✇新锐博客
  • 一些网站容易出现的bug莫忘
    前言 在搭建网站的过程中,我们会遇到各种bug。 归类 1.最常见的其实就是php版本的bug,比如有些代码需要用到php8以上,或者php8不兼容的可以进行升降级操作来解决此类BUG。 2.waf拦截也是一种比较常见的bug,当我们的操作和waf规则中的一样时,就会被拦截。这时候我们可以打开开发者工具(F12)然后查看网络中报错的项目,最后查看返回的预览里有没有报错。 我为别人解决bug中有不少就是被cdn或者宝塔的waf而拦截出现的bug 3.因为缓存而出现的bug,有些时候我们使用了cdn或者缓存插件,会导致自己明明更新了网页内容,但就是不显示,而很多人会忘了自己设置了缓存这件事。 4.代码bug,这种在平时写作中不常见,但是会在我们美化主题的过程中或者用子主题添加某种功能时常常出现。 结语 1.不要看到PHP,mysql这种运行环境有新的就使用新的,最好使用的版本是php7.4和mysql5.7 2.自己看不懂的waf规则就不要添加,否则会导致自己更新文章或者添加小工具的时候报错。 3.如果遇到自己不能理解的代码,可以使用AI,比如chatgpt等帮我们来完善代码,让其能够在网
     

一些网站容易出现的bug

作者 莫忘
2024年8月21日 23:25

前言

在搭建网站的过程中,我们会遇到各种bug。

归类

1.最常见的其实就是php版本的bug,比如有些代码需要用到php8以上,或者php8不兼容的可以进行升降级操作来解决此类BUG。

2.waf拦截也是一种比较常见的bug,当我们的操作和waf规则中的一样时,就会被拦截。这时候我们可以打开开发者工具(F12)然后查看网络中报错的项目,最后查看返回的预览里有没有报错。

我为别人解决bug中有不少就是被cdn或者宝塔的waf而拦截出现的bug

3.因为缓存而出现的bug,有些时候我们使用了cdn或者缓存插件,会导致自己明明更新了网页内容,但就是不显示,而很多人会忘了自己设置了缓存这件事。

4.代码bug,这种在平时写作中不常见,但是会在我们美化主题的过程中或者用子主题添加某种功能时常常出现。

结语

1.不要看到PHP,mysql这种运行环境有新的就使用新的,最好使用的版本是php7.4和mysql5.7

2.自己看不懂的waf规则就不要添加,否则会导致自己更新文章或者添加小工具的时候报错。

3.如果遇到自己不能理解的代码,可以使用AI,比如chatgpt等帮我们来完善代码,让其能够在网站中更好的运行。

  • ✇杜老师说
  • 通过 Gitea 部署 Hexo 教程Teacher Du
    应 Zero 童靴需求,杜老师更新一篇通过 Gitea 部署 Hexo 的教程,可以实现通过 git 命令自动部署 Hexo 博客,并支持 VS Code 或者网页编辑器等形式更新站点内容。其部署思路同样适用于 Hugo 等静态博客框架。写在前面近年来静态博客框架占比越来越高了,其一大特性是可以托管到 Vercel 这类的免费平台上,进一步减少了博主运营成本。但随着免费的资源越发紧俏,加上越来越严峻的网络限制,很多小伙伴开始将站点,迁移至境内平台上。奈何境内的免费资源非常少,很多功能需要自行购买主机搭建,无疑增加了我们的使用成本以及学习成本。本篇教程主要说明如何通过 Gitea 实现类似 GitHub Actions 那种自动部署功能,实现在主机上博客的更新和部署。准备工作需要在服务器上安装 Gitea,可以参考《使用 Docker 部署 Gitea 新一代的代码托管平台》一文部署;需要在服务器上安装 Act Runner,可以参考《使用 Docker 部署 Gitea Actions 的 Runner》一文部署;需要在服务器上安装 Hexo,可以参考《运行在云主机的 Hexo》一文部
     

通过 Gitea 部署 Hexo 教程

作者 Teacher Du
2024年8月4日 00:00

应 Zero 童靴需求,杜老师更新一篇通过 Gitea 部署 Hexo 的教程,可以实现通过 git 命令自动部署 Hexo 博客,并支持 VS Code 或者网页编辑器等形式更新站点内容。其部署思路同样适用于 Hugo 等静态博客框架。

写在前面

近年来静态博客框架占比越来越高了,其一大特性是可以托管到 Vercel 这类的免费平台上,进一步减少了博主运营成本。

但随着免费的资源越发紧俏,加上越来越严峻的网络限制,很多小伙伴开始将站点,迁移至境内平台上。

奈何境内的免费资源非常少,很多功能需要自行购买主机搭建,无疑增加了我们的使用成本以及学习成本。

本篇教程主要说明如何通过 Gitea 实现类似 GitHub Actions 那种自动部署功能,实现在主机上博客的更新和部署。

准备工作

  1. 需要在服务器上安装 Gitea,可以参考《使用 Docker 部署 Gitea 新一代的代码托管平台》一文部署;

  2. 需要在服务器上安装 Act Runner,可以参考《使用 Docker 部署 Gitea Actions 的 Runner》一文部署;

  3. 需要在服务器上安装 Hexo,可以参考《运行在云主机的 Hexo》一文部署;

  4. 需要在服务器上安装 Web 引擎,可选项非常多,杜老师使用 OpenResty,这里不多说部署方式了。

部署过程

  1. 新建站点目录。这里以 1Panel 面板为例,添加一个域名为 dusays.com 站点:
  1. 使用终端程序登录该服务器,并切换到站点目录,以刚刚的域名为例,命令如下:
1
cd /opt/1panel/apps/openresty/openresty/www/sites/dusays.com/index/
  1. 删除站点目录下的所有文件,并通过 Hexo 创建站点数据,命令如下:
1
2
rm -rf *
hexo init
  1. 创建 Act Runner 部署文件.gitea/workflows/deploy.yml,添加以下内容:
1
2
3
4
5
6
7
8
9
10
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on: [push]

jobs:
Explore-Gitea-Actions:
runs-on: self-hosted
steps:
- run: cd /opt/1panel/apps/openresty/openresty/www/sites/dusays.com/index/ && git pull origin main
- run: cd /opt/1panel/apps/openresty/openresty/www/sites/dusays.com/index/ && hexo generate
  1. 配置 git 上传的用户名和邮箱:
1
2
git config --global user.name "TeacherDu"
git config --global user.email "teacherdu@dusays.com"
  1. 生成 SSH 密钥并添加公钥到 Gitea,执行下面命令,然后一直回车,会生成 id_rsaid_rsa.pub。复制 id_rsa.pub 文件的内容并登录 Gitea,进入个人设置,添加到 SSH 公钥:
1
2
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
  1. 在 Gitea 上创建一个新仓库:
  1. 新建.gitignore 文件避免同步易变动文件,添加以下内容:
1
2
3
4
5
6
7
8
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
_multiconfig.yml
  1. 提交并推送到远程仓库:
1
2
3
4
5
6
git init
git checkout -b main
git add .
git commit -m "first commit"
git remote add origin https://gitea.dusays.com/penn/hexo.git
git push -u origin main
  1. 将站点的运行目录设置为 public

注意事项

可以直接在 Gitea 修改站点内容,或者通过 VS Code 等工具接入进行编辑。

不要直接修改服务器中站点文件,如果出现内容冲突导致无法自动部署,可以从 Gitea 中重新拉取数据解决该问题。

❌
❌