用Miniflux搭建一个自己的RSS服务

自从Google Reader挂掉后就一直使用Feedbin提供的RSS订阅服务,期间也想过开源解决方案搭建一个但无奈仅有的几款成熟度比较合格的方案都是PHP的产物,我不是一个喜欢在自己的服务器上配置PHP环境的人. 前段时间了解到miniflux这样一个用GO编写的可以自己托管的RSS订阅服务,恰恰我是一个很喜欢使用Go编写程序和使用Go编写的程序的人,于是在 https://miniflux.app/ 上看了下手册后就很简单的将miniflux配置好了. 配置的过程很简单,拜Go只依赖glibc的巨大优点所赐,只需要一个二进制可执行文件就可以在几乎所有操作系统上跑起来,除了主程序外只需要按照手册自己配置好Postgresql就行. miniflux可以在控制台开启fever api支持,这样就可以用Reeder和Unread这种第三方APP里进行阅读了.只是有些小缺点,因为fever确实太陈旧而且小众所以某些功能缺失了,比如Unread上没有向上/向下设定已读. 搭建好以后就当作主力RSS阅读器使用,期间唯一遇到的问题是miniflux程序目前还处于密集开发状态,所以每个版本甚至每个commit都可能带来不可预知的改动,特别是对我这种每天都会拉取最新代码然后自己编译更新的人来说. 遇到过一次自己编译更洗后提示entries表中缺少一个键,当时很简单的自己给这张表添加了缺少的键. 当时表面上没什么问题了,但后来随着miniflux更多修改的提交问题就出来了,那就是一旦你自己修改过表结构,那么很可能以后的修改都需要自己来维护了.而正常情况下是需要按照upgrade中的流程来执行的(当然自己拉取代码手动编译的话很可能升级工具并没有相应的更新). 此后我就老老实实选择下载release版本的二进制文件来升级了. 而使用以来最大的优点有以下几项: 可以自己设定刷新间隔 某些公共服务也能设定,但一般是需要收费的比如inoreader.但即便将刷新间隔设定在15分钟我发现仍然有几小时才刷新的情况. 可以清晰的看到哪些feed拉取出现了异常 其实很多服务都有这项功能,但Feedbin很遗憾没有.只能看到源最后更新时间,这算是Feedbin最大的硬伤吧. 可以直接修改feed的URL 某些时候feed链接会有变更,比如从blog.xxx.com变成了xxx.blog,相应的feed链接也会变更,而这个时候如果不能修改feed的URL就只能创建一个新的订阅.而miniflux却可以很方便的更改,甚至因为有操作数据库权限所以很多控制台中无法修改的项也可以修改. 免费 当然如果本来就有服务器的话 支持受保护的rss源 自建了rsshub,本来是直接丢在公网不过有几个反爬严格的源拉取一旦频繁就会异常只能随手加了验证.结果发现很多RSS公共服务要么无法支持要么需要付费.inoreader需要49.99$/年的套餐才支持受保护的源,而Feedbin直接就只有付费帐号. »

Author image 月杪 on #RSS,

编译自己的iOS版Telegram

Telegram 是一款近两年非常火的多平台客户端开源聊天软件. 既然客户端是开源的那么我打算自己编译一下来看看. 网上已经有了一些编译Telegram的信息,但这些信息可能因为代码更新基本都不可用了. 拉取代码 git clone https://github.com/peter-iakovlev/Telegram-iOS.git cd Telegram-iOS/ # Telegram-iOS 很大部分的功能都是通过submodule来提供的,所以还需要拉取submodule git submodule update --init --recursive 拉取完成以后用Xcode打开项目,结果发现很多submodule是丢失的. 结果打开submodule文件发现居然很多module的url都指向一个相对路径… [submodule "submodules/AsyncDisplayKit"] path = submodules/AsyncDisplayKit url=../AsyncDisplayKit.git [submodule "submodules/Display"] path = submodules/Display url=../Display.git [submodule "submodules/HockeySDK-iOS"] path = submodules/HockeySDK-iOS url=../HockeySDK-iOS.git [submodule "submodules/libtgvoip"] path = submodules/libtgvoip url=https://github.com/grishka/libtgvoip.git [submodule "submodules/lottie-ios"] path = submodules/lottie-ios url=../lottie-ios.git [submodule "submodules/MtProtoKit"] path = submodules/MtProtoKit url=../MtProtoKit.git [submodule "submodules/Postbox"] path = submodules/Postbox url=../Postbox.git [submodule "submodules/SSignalKit"] path = submodules/SSignalKit url=../Signals.git [submodule "submodules/TelegramCore"] path = submodules/TelegramCore url=. »

利用Rock64搭建内网Time Machine备份服务器

很长的时间都是用一块4T装在硬盘盒里的西数硬盘来做Time Machine备份,需要备份的时候用USB将笔记本和硬盘盒连接起来,备份完毕后再将硬盘盒收起来. 有时候会忘了备份,有时候也会觉得很麻烦. 最重要的是这样做实在是不够优雅. 于是想到了给笔记本配置一块网络硬盘作为Time Machine备份盘. 苹果曾经有一个现成的商业解决方案AirPort Time Capsule, 但是这玩意儿已经停产而且价格相当不美丽. 第一时间想到了家里现有的安装有Armbian的Rock64开发板,通过搜索了解到了专用于实现AFP协议的开源项目Netatalk看到项目托管在sourceforge让我有不详的感觉…好在只是下载源码到本地进行编译. # 首先在Rock64上安装各种依赖: apt install \ build-essential \ libevent-dev \ libssl-dev \ libgcrypt-dev \ libkrb5-dev \ libpam0g-dev \ libwrap0-dev \ libdb-dev \ libtdb-dev \ avahi-daemon \ libavahi-client-dev \ libacl1-dev \ libldap2-dev \ libcrack2-dev \ libdbus-1-dev \ libdbus-glib-1-dev \ libglib2.0-dev \ pkg-config # 下载源码,当前最新版3.1.12 wget http://prdownloads.sourceforge.net/netatalk/netatalk-3.1.12.tar.gz tar zxf netatalk-3.1.12.tar.gz cd netatalk-3.1.12 # 编译安装 ./configure \ --with-init-style=debian-systemd \ --without-libevent \ --without-tdb \ --with-cracklib \ --enable-krbV-uam \ --with-pam-confdir=/etc/pam. »

Author image 月杪 on #Mac,

给我的 Macbook Pro 配置外接显卡

MacBook Pro虽然被苹果标榜为生产力工具,但是毕竟是笔记本. CPU性能还算能过得去吧,虽然在神奇的散热设计加成下战斗力并不能完全发挥出来. 相比CPU最大的问题还是GPU的性能. 2018款MacBook Pro内建GPU为Radeon Pro 560X, 作开发播放视频浏览网页对GPU需求并不大所以就算运行的是内建的UHD Graphics 630核显也不会有什么问题. 但是偶尔我还玩一下World of Warcraft,这就很尴尬了. 而且通常在家我都会外接4k显示器,在将游戏特效降到最低以后还需要将模型渲染比例设定为2k才可以勉强运行8.0版本的World of Warcraft. 虽然World of Warcraft是公认的一个CPU游戏,不过通过观察GPU负载我还是确认提升GPU性能可以非常显著的提升运行World of Warcraft的体验. 同时我也在战网讨论中确认了这个猜想https://us.battle.net/forums/en/wow/topic/20765096767. 于是开始计划购置对应的硬件. Apple Store直接提供了成品: Blackmagic eGPU 内建RX 580, 价格5998.00 Blackmagic eGPU Pro 内建vega 56, 价格10798.00 家里有矿的话可以考虑 准备 GPU 显卡由于苹果一直不给Nvidia的10.14版本Web Driver签名,所以除非我愿意安装10.13否则我只能老老实实选择A卡. 详细的支持在苹果的eGPU支持页面有列出Use an external graphics processor with your Mac. 最终选择了华硕的ROG STRIX-RXVEGA64-O8G-GAMING 1298-1590MHz. 苹果文档中推荐蓝宝石品牌的显卡,不过通过搜索确认这款华硕的显卡也可以正常支持. https://www.reddit.com/r/eGPU/comments/93uxbk/my_setup_2018_15_macbook_pro_razer_core_x_vega_64/ 显卡坞 选择了vega64这样的电老虎,那么显卡坞的选择面就很窄了. egpu.io上有 buyer’s guide »

Author image 月杪 on #Mac,

添加对WebP格式图片的支持

WebP格式是从Google vp8 视频编码衍生出的一种web image编码格式.同时支持有损和无损压缩,其中有损压缩在保持非常高质量图像的前提下也能获得非常不错的文件压缩效率. WebP的维基百科 前几天看到firefox也开始着手对WebP格式的支持了繼Chrome、Opera及Edge之後,Firefox也將支援WebP圖檔格式了. 所以目前现代主流浏览器还没有计划正式支持WebP的就只剩苹果一家的Safari了. 于是我想自己的博客所用到的图片资源也转换为WebP格式. 准备工作 要获得对应的WebP文件,最简单的方式就是博客自动部署的时候在部署脚本里添加自动转换功能. 先在服务器上安装自动转换工具,很幸运的是我所使用的Linux发行版官方源里就有对应的工具. apt install webp 安装好以后就可以使用cwebp``dwebp命令进行WebP文件的编解码了. 比如将png图片转换为WebP cwebp input.png -o output.webp # 设定质量,在未设定的时候默认为75 cwebp -q 90 input.png -o output.webp 然后在自动部署脚本中将所有的图片都转换为WebP,这一部分的参考 #!/bin/zsh imageDir="path/to/images" function read_dir(){ for file in `ls $1` do if [ -d $1"/"$file ] then read_dir $1"/"$file else cwebp $1"/"$file -o $1"/"$file".webp" & fi done } read_dir $imageDir 修改的内容 现在准备工作做好了,但是还有一点工作需要处理: 在支持的浏览器上正确展示WebP图像,同时在不支持的浏览器上也可以正确的展示png/jpg等常规图像格式. 办法有很多种,这里我们直接通过HTML代码来解决 <picture class="picture"> <source type="image/webp" srcset="path/to/webp"> <img class="image" src="path/to/png or jpg"> </picture> 现在就可以正确的在Chrome上展示WebP图片而在Safari上展示jpg图片了. »

Author image 月杪 on #Blog,

AirPods vs Jabra Elite Active 65t

几个月前忍不住入手了AirPods,长期使用下来感觉确实非常不错. 但是有2个非常显著的缺点一只困扰我: 没有降噪功能 使用一段时间后清理污垢相当困难 上周无意见听说了Jabra Elite 65t,在无线耳机的前提下同时拥有比较不错的降噪功能. 看了下京东这款耳机还有一个升级款Jabra Elite Active 65t,看评论手感和音质方面都有一定提升,和不带Active的相比也就贵了200块,于是就入手了这款. 两周重度使用下来后确实感觉降噪功能在无线耳机的范畴里算很不错的,由于是入耳式所以清理耳塞也很简单. 至于音质和AirPods对比不太出来,当然有可能是我的耳朵不够好听不出差别或者音源不够好(Spotify或者网易云). 另外长时间佩戴的话会有明显的异物感,确实不如Airpods这种让你几乎感觉不到正在佩戴耳机的体验. 做了一个对比: AirPods 优点 与iOS无缝连接,比如拿下耳机后播放就会停止而Jabra的话必须将耳机放入耳机盒后才能自动停止. 充电盒比Jabra的要小不少 长时间佩戴不会产生不适,甚至不会觉得自己正戴着耳机 缺点 没有降噪功能 污垢很难清理 音质一般 Jabra Elite Active 65t 优点 以蓝牙耳机来说非常不错的降噪 音质似乎比AirPods更好 缺点 入耳式有比较明显的听诊器效果 长时间佩戴会有明显的不适 耳机按键设计不够好 偶尔断开,特别是左耳机 充电盒是卡扣式而非AirPods的磁吸式 电量的显示很明显不够准确,甚至iOS下拉框和App中的电量永远是不一样的 后记 使用Jabra Elite Active 65t一段时间以后再一次在嘈杂环境中使用AirPods的话已经完全没法接受了. »

Author image 月杪 on #Other,

自己编译鼠须管

现在macOS上的第三方输入法选择的余地并不多,大众的都是天朝特色互联网流氓的产品. 不过还好我们还有rime系列. 鼠须管是rime输入法在macOS下的版本,输入法设定需要用户自己编辑配置文件. 唯一的问题是提供的二进制文件下载太旧是2015年的,而从后面基本都是稳定性提升所以能自己编译最新版本的话应该比自己直接下载的更好. 准备工作 保证机器上已安装好Xcode Command Line Tools,在安装了Xcode的情况下输入: xcode-select --install 编译依赖,需要用到brew brew install cmake git boost 编译安装 git clone --recursive https://github.com/rime/squirrel.git cd squirrel make deps make sudo make install 后面的工作就和从pkg安装一样了. 更新 在最近重新编译Squirrel 0.11.0 版本的时候遇到了问题. ** BUILD FAILED ** The following build commands failed: Ld xbuild/lib/Release/librime.1.4.0.dylib normal x86_64 (1 failure) make[1]: *** [release] Error 65 make: *** [librime] Error 2 在搜索了Squirrel的issues列表issues#247后发现是因为由brew安装的最新版 boost 1.68.0 会依赖icu4c,而这个依赖在Mac下并不存在. boost: stable 1.68.0 (bottled), HEAD Collection of portable C++ source libraries https://www. »

台湾之行2018

去年来台湾直接跑了一圈,感觉太急了. 今年就在台北待了几天,最远才到淡水海边. »

Jekyll文章列表摘要设置

目前使用的主题并没有索引文章摘要,导致某些文章在列表中预览内容量非常大. 看了下Jekyll自身是有提供文章摘要支持的. 索引页面添加摘要显示 绝大部分情况下需要修改的内容处于index.html中. 将摘要显示设置为post.excerpt | strip_html 添加摘要 Jekyll添加摘要的方式有2种, 第一种 通过分隔符的方式. 需要先在_config.yml中配置分隔符 excerpt_separator: '<!-- more -->' 然后就可以在正文中通过插入<!-- more -->来将以上的内容标记为文章摘要. 第二种 直接添加post属性excerpt --- layout: post cover: 'assets/images/cover4.jpg' navigation: True title: I Have a Dream date: 1963-08-28 10:18:00 tags: speeches subclass: 'post tag-speeches' logo: 'assets/images/ghost.png' author: martin categories: martin excerpt: I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our nation. »

组建一个简易的自用CDN

CDN是什么 A content delivery network or content distribution network (CDN) is a geographically distributed network of proxy servers and their data centers. The goal is to distribute service spatially relative to end-users to provide high availability and high performance. CDNs serve a large portion of the Internet content today, including web objects (text, graphics and scripts), downloadable objects (media files, software, documents), applications (e-commerce, portals), live streaming media, on-demand streaming media, and social media sites. »