Laziness, Impatience and Hubris.

  • 自从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版本的二进制文件来升级了.

    而使用以来最大的优点有以下几项:

    • 可以自己设定刷新间隔

    某些公共服务也能设定,但一...

  • 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 = submod...
  • 很长的时间都是用一块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 \
        ...
  • 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的体验. 同时我也在战网讨论中确认了这个猜想battle.net.

    于是开始计划购置对应的硬件. 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支持页面有列出support.apple.com.

    最终选择了华硕的ROG STRIX-RXVEGA64-O8G-GAMING 1298-1590MHz.

    苹果文档中推荐蓝宝石品牌的显卡,不过通过搜索确认这款华硕的显卡也可以正常支持. Reddit

    • 显卡坞

    选择了vega64这样的电老虎,那么显卡坞的选择面就很窄了.

    egpu.io上有 buyer’s gu...

  • WebP格式是从Google vp8 视频编码衍生出的一种web image编码格式.同时支持有损和无损压缩,其中有损压缩在保持非常高质量图像的前提下也能获得非常不错的文件压缩效率. WebP的维基百科

    前几天看到firefox也开始着手对WebP格式的支持了繼Chrome、Opera及Edge之後,Firefox也將支援WebP圖檔格式了. 所以目前现代主流浏览器还没有计划正式支持WebP的就只剩苹果一家的Safari了. 于是我想自己的博客所用到的图片资源也转换为WebP格式.

    准备工作

    要获得对应的WebP文件,最简单的方式就是博客自动部署的时候在部署脚本里添加自动转换功能. 先在服务器上安装自动转换工具,很幸运的是我所使用的Linux发行版官方源里就有对应的工具.

    apt install webp
    

    安装好以后就可以使用cwebpdwebp命令进行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
    

    修...

  • 几个月前忍不住入手了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的话已经完全没法接受了.

  • 现在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
    h...
  • 去年来台湾直接跑了一圈,感觉太急了.
    今年就在台北待了几天,最远才到淡水海边.


  • 目前使用的主题并没有索引文章摘要,导致某些文章在列表中预览内容量非常大. 看了下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是什么

    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.

    CDN 维基百科

    我对CDN的简单需求

    现在博客是放在美西的服务器,访问延迟还能接受. 不过如果文章中有大量图片的话还是会有明显的感觉,所以打算利用CDN加速一些主要的静态文件.

    选择CDN

    国内的话CDN可选的太少了,而且几乎可以肯定没有服务商能完全达到要求, 支持HTTPS 支持HTTP/2 支持TLS1.3 支持自定义域名

    所以参考当前对CDN的简单需求决定自己组一个简易的CDN

    如何自己组一个简易CDN

    首先我们需要达到可以让不同区域访问同一个域名的时候指向不同服务器的目的,达到这两个目的至少有2个办法:...