前作实现了收款码多合一的功能,这是基于我们能够正确识别不同 App 的不同 UserAgent 特征字段之上的。前作没有解说我们是如何获取相应 UA 的。通过嗅探抓包当然是一个解决方案,在计算机上运行模拟器也可行。但这些方法都太重量级了。

本文用 Python 实现一个简单的 HTTP 报文头回声服务;这个服务什么也不干,就只是把发向服务的请求中的 HTTP 报文头返回。

阅读全文 »

今天在浏览 V2EX 时,看到了一个令人啼笑皆非的帖子。OP 在 GitHub 上开源了一个能将支付宝和微信收款码二合一的项目。由于在项目中,OP 默认填写了自己的支付宝和微信信息;当项目被 fork 出去后,很多人没有修改其中的信息。特别地,有一些被用在恶意用途上的 fork 分支也没有修改。这样一来,就有不少人扫描这些生成的二维码而受骗,最终导致 OP 的微信被封禁了收款功能——连红包都收不了。

虽然故事本身令人啼笑皆非,但是自己动手将支付宝和微信收款码合二为一的想法还是很有趣的。在 Google 上搜索了一番后,我发现收款码合并的套路大概有两种。

其一是以芝麻收款为代表的第三方解决方案。这些第三方解决方案要求用户分别上传支付宝和微信的支付码,而后返回一个新的聚合收款码。按检索到的信息,芝麻收款以前是不收费的,但现在要收费 4.5 元。考虑到收款码涉及到资金流动,交予第三方本身是不安全的;并且,这样一个简单的事情还要收钱,未免有点「故意利用技术壁垒」的意思。作为一个更乐于自己动手丰衣足食的人,妥妥是忍不了的。

其二是以上述 OP 为代表的开源解决方案。这些解决方案对用户动手的能力更高,并且要求有一个可被公共访问的服务器来执行判断脚本。在这种套路里,还可以细分流派。一派是以 PHP 等为代表的解决方案,这要求上述服务器能够执行 PHP 等脚本。这一派的解决方案不适用于 GitHub Pages 等静态页面博客,因而使用范围受限。一派则是以静态 HTML 附议 CSS 和 JavaScript 为解决方案。这一派的方案适用面就广泛得多了。

本文介绍一种以静态 HTML 为基础,辅以 CSS 和 JavaScript 的方案,用以生成聚合收款码。

阅读全文 »

此篇基本上是译文,原文是 Victor Eijkhout 所著的《TeX by Topic》的第四章。译文项目参见:CTeX-org/tex-by-topic-cn
转载请保留本段文字,尊重原作者和译者版权。
由于原著使用 GFDL,故而本文也被传染地同样使用 GFDL 许可,而不是本站默认的 BY-NC-SA 4.0 许可。

TeX 中的水平与竖直盒子分别是水平与竖直列表内容的容器。盒子可保存在盒子寄存器当中。本章讨论盒子寄存器,以及关于盒子尺寸、盒子内容相互位置的问题。

所涉命令编目:

  • \hbox: 构造一个水平盒子。
  • \vbox: 构造一个竖直盒子,其参考点(reference point)是最后一个元素。
  • \vtop: 构造一个竖直盒子,其参考点是第一个元素。
  • \vcenter: 构造一个在竖直方向于数学轴(math axis)居中的竖直盒子;该命令仅在数学模式下使用。
  • \vsplit: 将竖直盒子顶部部分分离。
  • \box: 使用盒子寄存器,而后清空它。
  • \setbox: 将盒子赋值给一个盒子寄存器。
  • \copy: 使用盒子寄存器,但保留其中内容而不清空。
  • \ifhbox \ifvbox: 判断盒子寄存器中保存的是水平盒子还是竖直盒子。
  • \ifvoid: 判断盒子寄存器是否为空。
  • \newbox: 分配新的盒子寄存器。
  • \unhbox \unvbox: 将保存有水平盒子或竖直盒子的寄存器解包,并将其中内容追加到当前的水平列表或竖直列表中,而后清空寄存器。
  • \unhcopy \unvcopy: 与 \unhbox\unvbox 的行为相同,但不清空寄存器。
  • \ht \dp \wd: 返回及设置盒子寄存器中盒子的高度、深度、宽度。
  • \boxmaxdepth: 该命令表示 TeX 所允许的盒子的最大深度。在 plain TeX 中,它的默认值是 \maxdimen
  • \splitmaxdepth: 该命令表示 TeX 所允许的由 \vsplit 生成盒子的最大深度。
  • \badness: 刚刚构造的盒子的劣度。
  • \hfuzz \vfuzz: 该命令表示水平或竖直盒子的尺寸超出指定尺寸的阈值;当超过该阈值时,TeX 会考虑将其认定为溢出的(overfull)盒子。
  • \hbadness \vbadness: 该命令表示一个阈值;当盒子的劣度超过该阈值时,TeX 会将相应盒子认定为欠满的(underfull)或者溢出的。
  • \overfullrule: 当水平盒子溢出时,TeX 会打印一条标尺,以表明有溢出的水平盒子;该命令表示上述标尺的宽度。
  • \hsize: 该命令表示在水平盒子内文本排版可用的行宽。
  • \vsize: 该命令表示页盒子(page box)的高度。
  • \lastbox: 若最后追加进当前列表的内容是一个盒子,则该寄存器会保存上述盒子。
  • \raise \lower: 这两个命令用于在水平模式中调整盒子的垂直位置。
  • \moveleft \moveright: 这两个命令用于在竖直模式中调整盒子的水平位置。
  • \everyhbox \everyvbox: 这两个命令分别用于在每个水平盒子或竖直盒子开头处插入的记号列表。
阅读全文 »

此篇基本上是译文,原文是 Victor Eijkhout 所著的《TeX by Topic》的第四章。译文项目参见:CTeX-org/tex-by-topic-cn
转载请保留本段文字,尊重原作者和译者版权。
由于原著使用 GFDL,故而本文也被传染地同样使用 GFDL 许可,而不是本站默认的 BY-NC-SA 4.0 许可。

在文本模式下,TeX 会从「当前字体」中取用字符。本章讨论 TeX 是如何识别不同字体的,以及字体都有哪些属性。

所涉命令编目:

  • \font: 该命令可声明一个用于指定字体的控制序列。
  • \fontname: 字体的外部名字。
  • \nullfont: 在特殊情况下,TeX 会使用空字体。这是空字体的名字。
  • \hyphenchar: 字体中连字符的序号。
  • \defaulthyphenchar: 字体装载时 \hyphenchar 的默认值。在 plain TeX 中,默认是 `-
  • \fontdimen: 该命令可访问多种字体参数。
  • \/: 倾斜校正原语。
  • \noboundary: 忽略隐式边界字符。
阅读全文 »

此篇基本上是译文,原文是 Victor Eijkhout 所著的《TeX by Topic》的第三章。译文项目参见:CTeX-org/tex-by-topic-cn
转载请保留本段文字,尊重原作者和译者版权。
由于原著使用 GFDL,故而本文也被传染地同样使用 GFDL 许可,而不是本站默认的 BY-NC-SA 4.0 许可。

TeX 在其内部使用字符编码来表示字符;本章讨论字符编码及相关命令。

所涉命令编目:

  • \char: 显式指定所要排版的字符。
  • \chardef: 将一个控制序列定义为一个字符编码的同义词。
  • \accent: 放置重音符号的命令。
  • \if: 测试字符编码是否相等。
  • \ifx: 测试字符编码与分类码是否都相等。
  • \let: 将一个控制序列定义为一个记号的同义词。
  • \uccode: 对于给定的字符编码,查询或设置其对应的大写变体的编码。
  • \lccode: 对于给定的字符编码,查询或设置其对应的小写变体的编码。
  • \uppercase: 将普通文本(<general text>)转换为大写形式。
  • \lowercase: 将普通文本(<general text>)转换为小写形式。
  • \string: 将一个记号转换为一个字符串。
  • \escapechar: 将控制序列转换为一串字符记号时,用作转义字符的字符之编码。在 IniTeX 中默认为 92(\)。
阅读全文 »

此篇基本上是译文,原文是 Victor Eijkhout 所著的《TeX by Topic》的第二章。译文项目参见:CTeX-org/tex-by-topic-cn
转载请保留本段文字,尊重原作者和译者版权。
由于原著使用 GFDL,故而本文也被传染地同样使用 GFDL 许可,而不是本站默认的 BY-NC-SA 4.0 许可。

读取字符时,TeX 的输入处理器会为字符分配分类码。根据读取到字符的分类码,输入处理器会在三种内部状态之间切换。本章讨论 TeX 是如何读取字符的,以及字符的分类码是如何影响读取行为的。本章还将讨论空格及行尾的相关问题。

阅读全文 »