🎉 Announcing the RSSerpent Project

Keywords: #rss

大约在今年六月底时,我完成了本学期所有的课程设计,开始了悠闲的暑假生活。悠闲的暑假自然是要找点 side project 来做,于是一个在我脑海里盘桓已久的念头再度浮现了 —— 重写 RSSHub!说做就做,经过了一周左右的努力,我很高兴可以宣布 RSSerpent 项目已经正式发布 0.1.0 版本(PyPI)了!项目目前尚未成熟,未来可能仍有许多变化,但我们已经实现了核心功能。我将在这篇博客里介绍发起 RSSerpent 项目的初衷、我对项目的设想、近况与未来的计划~

Julia + Flux.jl:向神经网络发起进攻!

Keywords: #julia #machine learning

上回说到如何使用 Julia + Flux.jl 完成一个简单的 MNIST 手写数字识别任务。通过使用 LeNet 架构,我们的神经网络在测试集上已经能达到约 99% 的正确率 —— 看起来很棒不是吗?但实际上我们的神经网络对训练数据集有着极强的依赖性。只需对测试数据做加入一点肉眼甚至难以察觉的噪音,就足以使神经网络产生「失之毫厘,谬以千里」的结果。本文就将讨论如何使用 Fast Gradient Sign Method(FGSM)1 扰动测试数据、从而对神经网络发起攻击。

神经网络很多时候在训练数据上保持着微妙而脆弱的平衡,这也在一定程度上佐证了「数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已」的观点。

Julia + Flux.jl:从 MNIST 开始

Keywords: #julia #machine learning

这篇博客可能是一系列博客的第一篇。

三月中旬时,我突发奇想想参加 GSoC,并且选定了 Julia 语言下属 Flux.jl 组织里的一个小项目。但问题在于,我此前对 Julia 语言只有耳闻,而从未实际学习过 —— 留给我的时间并不宽裕,GSoC 申请截止到四月十四日。我在这不到一个月的短暂时间内学习了 Julia 语言的基本用法,使用 Flux.jl 做了一些有趣的小实验(本篇博客所记录的就是其中之一),还给 Flux.jl 贡献了一个 Pull request。这样的结果让我颇为满意。

Julia 语言是一门专为科学计算设计的高性能的动态类型语言,Flux.jl 则是使用纯 Julia 语言编写出的机器学习框架。Julia 语言最吸引我的地方就在于,它切实地解决了很多痛点需求:

  • 专为科学计算设计:从数字类型系统的设计,到诸如 $\LaTeX$ 变量名(x\hat => x̂)和复合函数(f ∘ g)这些语法糖,都可以感受到这门语言对科学家群体释放出的友好信号。
  • 高性能:Julia 是一种编译型语言,这为它带来了极高的性能。也正是因此,Flux.jl 这种基于 Julia 的机器学习框架无需像 PyTorch、TensorFlow 等一样,依靠 C++ 这种第三方静态编译语言来提高性能。
  • 动态类型:尽管是一门编译型语言,Julia 同时也是一门动态类型语言 —— 我相信这对数据科学家来说是至关重要的(参见 Exploratory Data Analysis)。尽管前有 goplus 这种项目和「有追求的科学家都用 Rust1」这种暴论,但我私以为 Go 和 Rust 静态类型的本质仍阻止了其在数据科学领域的广泛应用(其他科学计算的子领域我几无了解,因此不予评论)。在分析数据时,我们最不想关心的事情就是与编译器的类型系统搏斗,而导致思路频频被打断。此外,Julia 语言生态圈还有 IJulia 和 Pluto.jl 这类项目为 EDA 提供了良好的支持。

本文将展示如何使用 Julia + Flux.jl 来解决机器学习界的 Hello World 问题 —— 识别 MNIST 手写数字!

打造你独享的 RSS 阅读环境 —— RSSHub 与 Miniflux 自建指南

Keywords: #rss

自从我明确意识到推荐算法的危害1以来,我就一直以以 RSS 订阅作为我的主要信息来源。推荐算法所做的事就是不断地将你想要接收的信息反哺给你,导致你对世界的感知被扭曲,直到你陷入消费主义的囚笼。而 RSS 是一种能帮助你主动获取信息的工具 —— 掌握权在你,而非在推荐系统。此外,RSS 与独立网站一起也是对抗网络审查的天作之合。

长期以来我使用 Feedly 订阅 RSS,并辅以 RSSHub 来订阅一些不支持 RSS 的网站。但我最近遇到了以下问题:

  • RSSHub 的免费官方实例用户较多,许多路由因遭到了目标站点反爬虫措施的反制而无法使用;
  • 对于一些小众冷门的 Feed,Feedly 更新经常有延迟,有时甚至还会出现缺漏;
  • 随着我订阅的 Feed 逐渐增多,其数量接近了 Feedly 免费用户能订阅的数量上限 —— 但 Feedly 每月订阅费用过于高昂;

为了解决上述问题,我决定自建 RSSHub,并使用 Miniflux 代替 Feedly。本文就将介绍我自建 RSSHub 与 Miniflux 的过程,以供参考。

从 HomeBrew 迁移到 MacPorts

Keywords: #macOS

在听取了一些朋友的建议后,我决定使用 MacPorts 代替 Homebrew 作为 macOS 上的包管理器。这篇博客记录了我迁移的原因、过程和结果。