比如前段时间某游戏中出现了不合适的内容,很多人把这件事描述为「制作团队夹带私货」。语文老师看了肯定会很生气:
- 如果是个人作品,那整个游戏都是制作者个人意志的体现,不存在「私货」与「公货」的对立,更谈不上「夹带」。
- 如果是团队作品
- 如果加入不合适内容是团队的决定,那其实和个人作品的情况一样,不存在公私对立,夹带也不成立。
- 如果加入不合适内容是某个成员绕过团队私自进行的,那才算「夹带私货」。
- 但需要注意此处「夹带私货」的主语应该是「某成员」而不是「某团队」。
只要把「私货」换成中立的「自己的观点」、把「夹带」换成中立的「加入」,就能很方便看出语言逻辑上的谬误:
- 个人作品体现的本来就是作者自己的观点;
- 团队作品体现的本来就是团队自己的观点;
- 成员才能绕开团队,在团队作品中加入他自己的观点。
改换以后,你甚至可以发现自己反对的并不是「加入自己的观点」的行为,只是单纯地反感这个观点本身。
情绪化的「夹带私货」并不是在尝试描述问题,而是在逞一时的口舌之快,带来的只能是一滩浑水。无论是「私货」「洗地」「卖惨」还是「带节奏」「泼脏水」「三观不正」「不是笨就是坏」,真的不得不佩服国人对于「骂人不带脏话」的莫名追求。
这个 Typecho 博客搭成以来,就一直在用从这里下载到的 Markdown 插件,是对 PHP Markdown 的封装。
当年还不存在 XX-flavored Markdown 的概念,有些洁癖的我觉得坚持原生 Markdown 是最佳的选择,不够用时直接 HTML 来凑就好了。然而原生 Markdown 是没有数学公式支持的,如果用 $\TeX$ 语法,很难躲避代码被转义的命运。
单占一行的公式还可以手动用 HTML 块元素标签包裹,这样原生 Markdown 就不会对里面的内容转义了。但是行内的公式则不行,原生 Markdown 里没有任何办法禁止某些东西的转义(除了代码块,但是会把内容包裹在 <code>
里)。
所以最后我的选择是,把 $\TeX$ 代码作为代码块渲染以防止 Markdown 转义;然后强制让 MathJax 翻译 <code>
标签中的代码,显示公式。
这样做牺牲了「显示公式代码本身」的可能,不过够用了。
要解决的问题
时间一晃到了八年后的现在,翻翻以前的文章,参考链接里一个个都是 http,非常直观地给人一种「时代变了」的感觉。
如今 XX-flavored Markdown 已深入人心,在 Markdown 中插入数学公式似乎也形成了一些广为认可的写法。
是时候改一改这八年前的解决方案了。
被懒偷了去
首先想到的是 Typecho 早已原生支持 Markdown 文档,不需要再用插件实现了。要不先切换过去再搞?
然而,Typecho 原生的 Markdown 支持我非常不满意。因为它不允许内嵌任意 HTML,需要用 !!!
裹起来才行。放弃放弃。
于是看了看 PHP Markdown。虽然有 PHP Markdown Extra,但也已经是很多年前的东西,不再更新,更没有更新数学公式的可能。
所幸后来搜到了一个 PHP Markdown Extra with support for jsMath 仓库,非常开心,赶紧拿来替换了原先插件中得到 markdown.php。大体上是不错的,然而它有个 bug:行内的 \(C_{ij} = \vec{u}_{rowi} \vec{v}_{colj}\)
还是被转义了,里面的一对下划线依旧被转成了 <em>
,代码被破坏,导致公式转换失败。
解决方法
这样折腾了一圈以后非常绝望,甚至还想过换个静态网站生成器把博客重新搞一下的想法。
不过想想这个工程量,不禁还是摇摇头。既然是 bug,要不然我们来 Debug 一下?
不过那代码看着看着,忽然感觉 PHP Markdown 的代码也没有想象的那么复杂。于是干脆换回官方的 PHP Markdown Extra,在那上面依葫芦画瓢改了一通,很快搞定了 $
和 $$
的功能。
基本上就是模仿 Markdown 中代码块的语法。
行内 $\vec{a}$ 这么写。
$$
\begin{aligned}
S &= 成块的这么写 \\
&= 就可以了
\end{aligned}
$$
具体补丁见这个 Gist,基于 PHP Markdown Extra 1.2.8。
下载到两者后,使用 patch markdown.php math.patch
就可以打上补丁使用了。
补丁后的版本中有个 MARKDOWN_MATH_CLASS
常量,非空时会为数学公式代码所在的 <span>
或者 <div>
加上对应的 class
。这样就可以在 JS 脚本中找到具有这些 class
的节点,用 MathJax / KaTeX 做精准打击,不用怕正文中的普通单词因为夹在 $
中间而被误认为是公式了。
以上。
经常追番的童鞋应该对日语的「喫茶店」一词不陌生,它就是咖啡馆、茶店的意思。因为「吸烟」是「喫煙」,以及小学语文老师「秀才不识字,念半边」的教诲,我一直把「喫」字读作 qì。最近偶尔发现「喫」字在普通话中应该念 chī,感觉打开了新世界的大门。
- 「吃」是「口」和「气」的组合,表示说话不流畅,即「口吃」的「吃」,本读作 jí。
- 「喫」是原本表示「进食」义的字,后被归入「吃」的异体字。
了解了这一点,感觉很多原本奇怪的设定,居然就说得通了。
最浅显的,原本日语里看上去感觉阳春白雪的「喫茶店」「喫煙」就变成了非常接地气的「吃茶店」「吃香烟」,无锡话里也还在用这样的词汇,感觉很生活。
更延伸一些,表示「支持、负担」的「吃不消」就可以写成「喫不消」。这样一来「契合」这样的词语,也就变得好懂了。
而由于「哑」表示无法说话,「哑巴」表示无法说话的人;那么既然「吃」表示说话不流畅,「吃巴」就应该表示说话不流畅的人。于是似乎「结巴」一词的来源就可以猜到了,至少,在无锡话里,这两个词是同音的。
以上。
当年 Google Reader 拜拜后,我也陆续尝试了不少国内国外的替代品。当时选择了相对不错的 feedly,但因为不像 GR 一样存在感强烈,常常忘掉它的存在。最近整理阅读渠道,又把 feedly 拾起来,就感觉到了 feedly 的不足。
首先便是基本功能收费,无法理解为啥作为一个 RSS 阅读器,feedly 连在自己的所有 feed 中搜索都是需要高级会员才能解锁的功能。
其次是 feedly 近几个月来隐藏已读文章的功能都是失效的。无法看到清爽的文章列表界面,这对于我这种强迫症来说简直要命。
另外,feedly 取消了几乎是 RSS 阅读器必备的星标功能,转而加入了「稍后阅读」按钮。虽然功能都只是一个旗标,可以将已标记的文章单独列出,但「星标」的语义可以由用户自己赋予;而「稍后阅读」却已经框死了语义,将其另作他用总让人有一种负罪感。于是我感觉很不舒服。
当然最令人发指的是 Android 客户端自带的「发送到 Pocket」功能,居然是需要你提供 Pocket 的用户名和密码的。既然网页版都实现了基于 OAuth 的 Pocket 授权,为啥客户端版本的反而要用这么「不安全」的方法,无法理解……曲线救国又需要「菜单 / 分享 / Add to Pocket」 这么啰嗦的步骤,所以干脆再见吧。
于是最近又尝试了一圈市面上仅存(诶)的几款 RSS 阅读器,客户端能够支持隐藏已读文章、支持星标(废话)、抓取速度好、又有比较好的 Pocket 支持的,大概就是 Inoreader 了。功能上,Inoreader 几乎是 Google Reader 传承而来的,也有丰富的快捷键支持。缺点是界面相比 feedly 感觉要不那么「现代」一点 :)
目前只用了 Inoreader 一小段时间,暂时没有特别的惊喜和苦恼。有一个有趣的用法是它可以将 Twitter / Google+ 当作 RSS 订阅,如果有合适的目标账号,应该还是很有用的。
以上。
再过十几天,就是世界反法西斯战争胜利纪念日了。今天,ShadowSocks 在 GitHub 的相关仓库被勒令删除代码,停止官方维护,V2EX 和知乎上相关的内容也都被删了,可见这是一个同样值得纪念的日子。
说来,如果不是它,我估计现在还没开始用 Python 呢。要知道学习一门语言,学以致用的需求是很重要的。光头脑发热「我要学 Python」,看个语法,写点 Hello World 之类的,过几天估计就忘了。所幸当时 ShadowSocks 横空出世,给我的感觉是「居然寥寥数行(至少发布之初是这样)就把事情办妥了」「只要查查文档,理解起来应该很快吧」。于是为了理解代码,各种对照着翻文档,看语法,当时还写了一篇博客记录了下笔记。后来的一段时间,写 Python 不知道该用什么风格,也拿 ShadowSocks 的代码来模仿。
话说回来,现在这么多人在用 ShadowSocks,被封其实也是情理之中的事情。如果还能找到 V2EX 上初版 ShadowSocks 的帖子的话,应该可以看到作者当时的想法大致可以总结为:
- 公布一个自用的梯子,供大家参考
- 大家用不同的协议,更不容易被封
我觉得后者应该才是精华,可惜实际却很少有人在意。最初只提供傻傻的 Table 加密的一个原因,或许是「它只是一个用来抛砖引玉的 Demo」。或许理想的做法是每个人 Fork 并创造自己的加密手段甚至协议,在小范围内使用。然而更多的人(包括我)选择了直接使用,继而推动 ShadowSocks 本身的复杂化,变成了一个可以让人考虑让它失败的单点。
有点语无伦次。Anyway,谢谢 @clowwindy,辛苦了。
- 1
- 2
- 3
- 4
- »