Tag Archives: 插件

ImgCache 0.2.1 发布

我终于给 ImgCache 进行了一次版本更新。当时我承诺会在下一个版本完成对 HTTPS 图片链接的支持,没想到一晃就是十二年。我还在开博日志中吐槽了一下自己。现在我终于信守承诺,在新版本中搞定了 😂。Better late than never!

时隔 12 年发布 ImgCache 0.2.1
时隔 12 年发布 ImgCache 0.2.1

当然除了支持了 HTTPS 图片链接的缓存,也升级了 Snoopy 类,更新了代码格式使得更符合代码规范和 README,还修复了两个有意思的小 bug。

第一个 bug 是对 SVG 图片后缀名的错误提取。这几天在开发 HTTPS 支持功能的时候,我用 PNG 测试,功能完全正常。但是我偶然使用了一个 SVG 图片链接来作为测试,发现缓存的图片无法在前端展示,看了下源代码缓存的图片文件后缀名不是 .svg 而是 .svg+xml 。

坦白说,我已经完全想不起来,在这套十二年代的远古代码里面我是通过什么方式来确定缓存图片文件后缀名的。简单翻了下代码,原来是用图片链接请求 HTTP 头字段中的 Content-Type 去判断。通常图片链接的 HTTP 头字段中都包含类似于 Content-Type: image/png 的信息来定义 MIME 类型,我们只要通过 / 前部分来判断是否是图片,后半部分来判断图片类型直接得到后缀名就可以了。本来插件也基本上就是自用,所以当时估计就随便测试了常用格式,发现一切 OK,就发布版本了。

但是很奇怪的是,SVG 的 Content-Type 并不是 image/svg 而是 image/svg+xml,所以当我把提取出 svg+xml 作为后缀名的时候,前端展示就出现了问题。

根据 Wikipedia 中,SVG 中的矢量图信息是以 XML 格式保存的,所以本质上 SVG 是一个 XML 文件。这样子一切就说得通了。

Scalable Vector Graphics (SVG) is an XML-based vector image format for two-dimensional graphics with support for interactivity and animation. The SVG specification is an open standard developed by the World Wide Web Consortium (W3C) since 1999.

SVG images are defined in a vector graphics format and stored in XML text files. SVG images can thus be scaled in size without loss of quality, and SVG files can be searched, indexed, scripted, and compressed. The XML text files can be created and edited with text editors or vector graphics editors, and are rendered by the most-used web browsers.

https://en.wikipedia.org/wiki/Scalable_Vector_Graphics

于是我不得不对 SVG 的 Content-Type 做一个预处理后再作为后缀名来使用。其实存在这个问题的还不止 SVG,打算在后续版本中处理掉。

第二个 bug 是因为 WordPress 编辑器生成的 IMG 标签是不关闭的,且最后的属性和标签末尾之间缺少空格,如下:

<meta http-equiv="content-type" content="text/html; charset=utf-8"><img src="http://nginx.org/nginx.png">
Code language: HTML, XML (xml)

而当时的我,认为所有的 HTML 标签都应该是关闭了,且最后的属性和标签结束应该是存在空格的,如下:

<meta http-equiv="content-type" content="text/html; charset=utf-8"><img src="http://nginx.org/nginx.png" />
<img src="http://nginx.org/nginx.png" ></img>
Code language: HTML, XML (xml)

基于这个认知,之前版本中提取图片 URL 的正则鲁棒性不够,所以无法成功从这个 WordPress 生成的 IMG 标签中提取出正确的图片 URL,使得插件认为图片链接都是无效的,就停止了缓存。😅

关于这个版本的故事就先扯的这里。至于下个版本,我可能会加上对缓存图片过期时间的自定义能力。由于这个插件当时主要是为了用来缓存 Feedburner 订阅数之类的图片,更新频率比较高,所以我把过期时间固定在了 1 小时,即 3600 秒。现在想想,过期时间能自定义肯定是更合理一点。

好了,下个版本见吧。

风云再起

风云阁重新上线啦!

其实这不是我第一次写博客了,从标题里面就能看到一些端倪。作为开博第一篇,正好扯扯我的博客历史。由于太久远了,时间上可能和实际情况有点点出入。我的博客走向大致如下:

新浪博客 –> Live Space –> WordPress
托管 托管 自建

大二的时候,博客在国内刚刚兴起,几个有名的门户都开启了博客板块。我就凑热闹申请了一个托管在新浪博客上面。因为个人很喜欢风云漫画,所以起名为风云阁。那个时候并没有很好的经营,纯当一个记录有意思文章的地方。

没过多久,发现新浪博客限制实在太多了。作为一个计科专业学生完全忍不了。刚好赶上微软的 Live Space 发布,就直接搬迁过去了。当时博文也不多,所以纯人肉迁移完成。博客也慢慢从记录文章的地方,变成了一个记录我心情的地方。我开始在里面写一些自己的东西。

然后时间快进到了研二,自建博客慢慢流行起来。在同班同学 Solrex 的建议下,我申请了个域名,并开始着手将我的博客迁移到朋友顾俊Hostmonster 的 VPC 上面,CMS 打算用 WordPress。当时的域名是 iron-feet.cn,后来事实证明用 CN 域名就是个深坑,后面会简单说下。

当时 Live Space 上面已经积累了很多日志了,对于我这个懒人来说,手动一篇一篇迁移简直是不可能完成的任务,更别提还要原样保留各种 tag、日志发布时间等信息。所以为了快速完成迁移,我还用 C# 写了一个 GUI 的从 Live Space 到 WordPress 的迁移工具。那个时候,自身也没有什么开源思维,并没有把这个工具开源出来。后来某个更换电脑,代码都找不到了。想想当时如果开源出来,说不定在微软下线 Live Space 的时候能够帮助到很多朋友。有点遗憾。

自从把博客从托管改为自建之后,整个心态上面都有了很大的变化。我开始花费很多时间来经营这个博客,保证每周能发表一篇,尽量以技术日志为主。不再转载别人的文章,顶多在自己的文章里面注明出处的引用别人的优秀内容。同时也在 WordPress 上面也花了很多功夫。WordPress 虽然很赞,但只是想对比其他一些 CMS 而言,当时的老版本也并没有非常好用。莫名其妙的编码问题、升版本卡死后引起数据库脏数据、一些插件升级后拖慢整个后台、各种升级后二次修改内容被覆盖,若细细道来够好几篇日志了。

那个时候订阅博客很流行用 RSS,所以很多博主都喜欢用 RSS 订阅量在跟踪自己的博客质量和访问情况,我也是其中之一。由于 WordPress 自己的统计功能接近于不可用,所以大家很流行用 Feedburner 去烧制一个 Feed。除此之外,Feedburner 强大的纠错能力还能够帮助博主修复一些 RSS 里面的 XML 错误。

当时鉴于 Feedburner 的流行和业界认可度,博主们还会把 Feedburner 的订阅数量放在页面上,以显示自己博客的质量,如下图:

Feedburner 订阅数在博客上的样例
Feedburner 订阅数

想使用这个不错的功能,对于我这种订阅用户主要在墙内的博主成了难题,因为 Feedburner 订阅数量图是在谷歌域名下的,所以在墙内展示不了。

当时不得不手撸了一个叫 ImgCache 的插件来解决这个问题。激活了这个插件之后,只要你在 <img> 标签里面加上 ref=imgcache4wordpress ,插件就会自动把图片缓存在站点本地,把图片链接替换为本地路径。这样子墙网友也能看到这张图片了。当时站内的 Feedburner、Twitter 等等的图片都是用这个方式来展示的。

ImgCache 也算是遗留插件之一了,最近一次更新是十二年前……请无视我的塑料英语和当时稀烂的代码水平。插件页面里面,还写着将在新版本中解决已知问题。果然只要不更新版本,问题永远可以不解决,😅。看来是时候修复一个新版本出来了。

除此之外,我还手撸了另外一个插件叫 Custom URL Shorter 。我知道应该叫 shortener ,请无视 🤦‍♂️。当时不允许修改插件名,不知道现在行不行。一失足成千古恨!(现在允许修改了,我也已经把名字改成了 Custom URL Shortener)

接下来时间一下子跳跃到了研究生毕业后第三年,我心痛地关闭了风云阁。个中原因,让我内心五味杂陈:

  1. GFW 简单粗暴的封 IP 方式。一旦该 IP 下有任何一个站点存在敏感内容,整个 IP 就会被封禁。于是乎,我经常需要和 VPS 供应商沟通更换 IP,而且沟通频率越来越高。
    不知道是不是受 GFW 影响,站点打开也经常时好时不好。找墙外朋友测试就完全没问题
  2. 莫名其妙的备案机制。这个备案机制老变,经常会通知补交材料,或者是更新信息,或者是又有新的规定要在页面里面添加什么信息。
    每次就发一个邮件告知,宽限期还贼短。一个不小心站点页面就变成工信部未备案网站告示了
  3. 无聊的黑客:进入互联网公司之后,瞬间变得很忙,就没有时间及时升级 WordPress。博客被攻击过几次,虽然有备份,但是恢复还是很花时间的

天天工作上卷,下班后还要应付 GFW、备案这些和技术完全没关系的破事。最终我认怂,很无奈的选择了关停……这事情一直是我的心头梗,难以抹去。

其实刚到新加坡的时候,我就打算重开博客了。只是因为入职一家新公司,还是纯英语沟通,就耽误了一下。然后老婆孩子来了,两个人自己带娃真的是超乎我想象的难,又继续耽误了。终于现在下定决心重开了。由于我好久没自建站点了,对现在的供应商也不了解了。感谢赖信涛推荐给我 DigitalOcean