Atom

思考、故事和创意

Android 使用体验

去年 11 月份,我在 Google 商店订了 Google Pixel,过了半个多月到手,至今已经用了差不多半年,可以说一说用 Android 是什么样的体验。

在国内使用原生 Android 似乎有不小的障碍,好在我几年前就已经给家里的路由器做好了科学上网的配置。实际上我最开始的想法是:没太多新鲜感。

主屏

再讲更多东西之前,有这样几件事情必须要说明:

  1. 关于 Android 的体验,仅限于原生 Android
  2. 与 iOS 的对比,也只仅限于 iPhone 5S 上的 iOS 9
  3. 完全不涉及 root 或者越狱

简单来说,这是我个人比较狭隘的, 还算客观的感受。

在这之前我用了好几年 iPhone,对于 Android,我期待有完全不同的体验。拿到手用了一天后,新鲜感并没有我预期的那么强烈。毕竟大多数时候是在用同样的一些 App,例如微信、QQ、淘宝、部落冲突等等。

差异还是有的,很快我就遇到些恼人的事情,有些 App 在 Google Play Store 里竟然没有:支付宝、滴滴打车、网易云音乐…… 有些是因为不同地区帐号的限制,有些是因为太流氓被下架了。Android 系统可以安装未知来源的 apk 文件,所以要用这些 App 的办法很多,各厂官网一般都会提供 apk 文件的下载,或者发布到国内各种 App 市场。不过我也信不过国内各厂,尽量都从 Google Play Store 安装应用。

Android 的 App 生态比 iOS 的生态差得多,由于系统的开放性,各种流氓应用大行其道,这种开放性对于用户来说,可以说是好坏参半。最初我产生换 Android 系统的想法,原因之一就是想用 Rescuetime 这个 App 来记录手机各个 App 的使用时间;另外有一点非常值得一提,目前我在用 Enpass 作为密码管理软件,可以在全系统范围内使用它的自动填充功能,非常方便。在 iOS 上,以我以往的经验,也就是说 iOS 9 以及之前版本,并不能做到这些,由于我并没有用过比 iPhone 5S 更新的 iPhone,不知道现在是否可以做到上面提到的功能。

回到 App 生态的话题,Android 的劣势还体现在另一方面,几乎各厂都是先发布 iOS 版的 App,不知道多久之后才有 Android 版本,然后或许还要更久才发布到 Google Play Store 上。最近火热的微信“搜一搜”和“看一看”功能,作为 Android 用户,我还没真正见识过呢。

要找一个在 Android 上有,而在 iOS 上没有的优秀 App,或者 Android 版本比 iOS 版本质量更好的 App,还真是不太容易。不过再怎么样,Android App 也不是一无是处,有不少 App 可以说至少不比 iOS 版差。

使用这部手机过程中,最早让我非常惊喜的东西是 Google Photos,几乎所以的照片管理应用都会被它碾压。功能强大和易用,甚至让你有点害怕,产生 "You are being watched" 的感觉,它似乎比你更清楚你去了哪里拍照,在什么场合拍的照,拍了哪些人,拍了哪些东西。Google Photos 也有 iOS 版,所以这个惊喜并不是 Android 独占。在知乎可以看下其他人对 Google Photos 的详细评价。如何评价 Google I/O 2015 上发布的 Google Photos?

另外一个惊喜是 Google 智能助手,只有在手机语言设置为英语时才有这个功能。我问过它能不能说中文,它很干脆地告诉我不能。我用得最多的是在家里的时候用它解锁手机、定时、设定提醒闹钟、问天气。还有一个很有用的功能,当你在刷手机时,可能是在刷微博时看到别人发的图,你想知道出自哪里,或者可能是浏览网页时看到别人提到的一部电影,你想了解下这部电影,这时候长按 Home 键(手机屏幕底部中间那个键,是叫 Home 键吧?)或者说 "Ok, Google",把它给呼唤出来,就可以让它查当前手机屏幕上出现的内容是什么了。

智能助手

想比 Siri,Google 智能助手的上下文关联做得更好。Google 智能助手更喜欢把内容说出来,而 Siri 展示在屏幕上的更多。可以备个梯子,去 Youtube 看这个对比视频 Google Assistant vs Siri!

总之,对于 Android 的体验,就是这样几点:

  • 在日常使用中,与 iOS 并没有天差地别
  • 开放性对用户有利有弊
  • App 整体质量不如 iOS App
  • 有些小小的亮点

希望 Android 上的各个 App 都老实点……

Tiny Tiny RSS 用上 Privoxy 代理

上周搭建 TTRSS 时,给配置了代理是针对所有请求的,这周抽时间做了些改变,针对国内的站,就不再绕远路了。

不宜细说,这里做个备忘。

1. 功能强大的 privoxy

对比之前用的 polipo,privoxy 功能强大太多,这里主要用到它针对不同地址进行不同处理的功能,默认直接转发不走代理,特殊域名走代理。

privoxy 配置

# /etc/privoxy/config

listen-address  127.0.0.1:8118
forward / .
actionsfile /etc/privoxy/gfw.action
actionsfile /etc/privoxy/extra.action

gfw.action 样例

# /etc/privoxy/gfw.action

{+forward-override{forward-socks5 127.0.0.1:12345 .}}
.google.com
.facebook.com
.twitter.com
.youtube.com

2. 使用 gfwlist2privoxy 把 gfwlist.txt 转换成适用于 privoxy 的 actionfile

使用 gfwlist 转换的 privoxy actionfile,免去自己收集、配置的麻烦。

gfwlist2privoxy -i gfwlist.txt -f gfw.action -p 127.0.0.1:12345 -t socks5

3. crontab 脚本,定期更新、转换 gfwlist

#crontab

26 03 * * * bash /home/noodles/update_gfwlist.sh > /var/log/update_gfwlist.log 2>&1

脚本内容

#!/bin/bash

# update_gfwlist.sh

set -o errexit

WGET="/usr/bin/wget"
GFWLIST_URL="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"
GFWLIST_FILE="/tmp/gfwlist.txt"

# PROXYCHAINS4_CONFIG="/home/noodles/.proxychains/proxychains.conf"
# PROXYCHAINS4="/usr/bin/proxychains4 -f $PROXYCHAINS4_CONFIG -q"

GFWLIST2PRIVOXY="/usr/local/bin/gfwlist2privoxy"

PRIVOXY_GFW_ACTION_TEMP="/tmp/gfw.action.new"
PRIVOXY_GFW_ACTION="/etc/privoxy/gfw.action"

function get_gfw_action {
    printf "download %s ...... " "$GFWLIST_URL"
    # $PROXYCHAINS4 $WGET -q -O $GFWLIST_FILE $GFWLIST_URL
    $WGET -q -O $GFWLIST_FILE $GFWLIST_URL
    echo "ok"
    printf "convert %s to %s ... " "$GFWLIST_FILE" "$PRIVOXY_GFW_ACTION_TEMP"
    $GFWLIST2PRIVOXY -i $GFWLIST_FILE -f $PRIVOXY_GFW_ACTION_TEMP -p 127.0.0.1:12345 -t socks5
    echo "ok"
}

function replace_gfw_action {
    local old_md5=""
    local new_md5=""
    if [[ -s $PRIVOXY_GFW_ACTION ]]; then
        old_md5=$(sed 1,2d "$PRIVOXY_GFW_ACTION" | md5sum | awk '{print $1}')
    fi
    new_md5=$(sed 1,2d "$PRIVOXY_GFW_ACTION_TEMP" | md5sum | awk '{print $1}')
    echo "old md5sum: [$old_md5]"
    echo "new md5sum: [$new_md5]"
    if [[ "x$old_md5" = "x$new_md5" ]]; then
        echo "no need to update"
    else
        echo "mv $PRIVOXY_GFW_ACTION_TEMP to $PRIVOXY_GFW_ACTION"
        mv $PRIVOXY_GFW_ACTION_TEMP $PRIVOXY_GFW_ACTION
        echo "reload privoxy"
        /usr/sbin/service privoxy force-reload
    fi
    rm -f $GFWLIST_FILE
}

function main {
    get_gfw_action
    if [[ -s $PRIVOXY_GFW_ACTION_TEMP ]]; then
        replace_gfw_action
        echo "Done."
    else
        echo "$PRIVOXY_GFW_ACTION_TEMP is empty."
        echo "Error."
    fi
}

main

4. 命令行工具的代理

上面脚本里,下载 gfwlist.txt 时可能要用到。

proxychains4

rofl0r/proxychains-ng

配置文件 ~/.proxychains/proxychains.conf

strict_chain
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks5  127.0.0.1 12345   # ss 代理地址

短评太短,长评太长 (1)

《海边的曼彻斯特》,传闻“一丧到底”,实际上在结局处,男主还是稍稍有些改变的。临近结尾处,男主与前妻的一段戏,算得上全年最佳。很让人欣喜的是,电影并没有刻意去渲染多么悲,多么丧,有些段落反而会让人笑出来,而且丝毫不影响整部影片“冷”的氛围。

《金刚狼3》,一部打悲情牌的电影,跟《海边的曼彻斯特》不一样,它从上映前的宣传,到影片开始,到影片结束,全都在非常卖力地向世人说“真的好惨啊”。就差在狼叔身上挂上一块写着“惨”字的牌子了。好几部 X 战警系列的电影我都看了,有好有坏,即便这部被大家夸得这么厉害,我也不喜欢这种刻意表现沉重的形式,不过不比前两部《金刚狼》,那的确是好到不知道哪里去。

《血战钢锯岭》,如果有一边吃东西一边看电影的习惯,那么在看这部电影时,最好在前半段结束前就吃完喝完。后半段进入战场,一幕幕残忍血腥甚至恶心的画面让人猝不及防。这种不适感,超越了不少主打血浆之类东西的僵尸片,恐怖片。真真切切得让我想到,不要再有任何战争了,不管是什么原因引起的战争,不管谁输谁赢,都太 TM 惨了。

《刺客信条》,不是很想提起它。这个系列的游戏,我玩过二代三部曲不止一遍,去年玩了以伦敦为背景的《枭雄》。虽然在看之前就了解到大家对它评价一般,也就没带多大期望去看,看完第一个进入脑海里的词仍然是失望。故事不行,场面不行,《刺客信条》中的背景世界观蛮复杂,或许这给电影拍摄增加了难度,总之结果是,了解背景和不了解的背景的电影观众,都不喜欢这部电影。

《乘风破浪》,又是一部半成品(为什么要说“又”)。韩大导演在卖弄小聪明这方面似乎收敛了一些,电影整体也比上一部成熟了,但是还不够成熟。穿越题材,不容易把故事讲圆,难为韩导了。

《看不见的客人》,口碑很好的西班牙语悬疑片。剧情各种反转,只是略生硬。对于这种讲得不太自然的故事,我都不太喜欢,打分三星,“还行”两字几乎完美契合我心中的评价。绝对达不到想向别人推荐的高度,也没有什么想喷的地方。电影还是挺有教育意义的,驾驶员们,好好开车;老板们,别找小三。

《非法制裁》,怪怪的片子。看的时候我就在开脑洞,美剧 POI 的设定特别适合这种情节,父亲想亲手了结杀死自己儿子的凶手时,John Reese 会出现,会来帮助他,可能会阻止他,可能会保护他,凶手也必然会得到应有的惩罚。或许在那帮混混计划以杀人来作为“投名状”时,John 就会盯上他们了,加油站的事情也就不会发生,脑洞完毕。凯文贝肯结局大战前,剃头剃得帅出新高度,虽说转变有点突兀,但是不像前面提到的电影中那么生硬。这种复仇片,我喜欢,打死你们这帮龟孙!!!反派混混的老爹,样貌气质好像 G 胖……

Tiny Tiny RSS

Google Reader 死后的一段时间,我试用了好几个 RSS 阅读器,期望能够代替它,最终是 Inoreader 胜出。一直到上周,我把 Inoreader 换成了自建的 Tiny Tiny RSS:一是因为 Inoreader 的速度不太理想,二是 Inoreader 免费版的各种限制和广告。

Tiny Tiny RSS

Tiny Tiny RSS 的安装没有什么坑,主要参考了这几篇文章

  1. 官方的安装文档
  2. DigitalOcean 社区的教程 How To Install Tiny Tiny RSS with Nginx for Debian 7 on a VPS

官方安装文档较为简略。DigitalOcean 社区的那篇教程很详细,仅这一篇足矣。

另外一件必须要做的事情是定期更新订阅源,照着官方文档做即可,推荐的做法是第一种,”Update daemon”,以后台服务的形式更新。第二种做法是利用 crontab,第三种方法用于单用户模式,在 Web 后台手动更新,不推荐这么做。

nginx 配置

这里可能会有个坑,按照上述 DigitalOcean 社区教程配置完 nginx 后,打开页面总是状态 200 的空白内容,之后在 stackoverflow 上找到了答案,把

include /etc/nginx/fastcgi_params;

替换为

include /etc/nginx/fastcgi.conf;

两个文件的区别就是后者多了这一行

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

完整的相关配置如下

location / {
	index           index.php;
}

location ~ \.php$ {
	try_files $uri = 404;
	fastcgi_pass unix:/run/php/php7.0-fpm.sock;
	fastcgi_index index.php;
	#include /etc/nginx/fastcgi_params;   # with next line
	#fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
	# or
	include /etc/nginx/fastcgi.conf;
}
location /cache {
	deny all;
}

location = /config.php {
	deny all;
}

至于为什么有 fastcgi_paramsfastcgi.conf 两个文件,可以到这里查看下它们之间有怎样的历史纠葛。

科学上网

我把 Tiny Tiny RSS 放在了腾讯云国内云主机上,把以前订阅的源搬过来之后,发现了一个尴尬的问题:有些被“认证”的订阅源,在国内是无法访问到的,需要科学上网。好在 Tiny Tiny RSS 留了一条路。给主目录下 config.php 文件加上如下一行:

`define('_CURL_HTTP_PROXY', '127.0.0.1:8080');

后面的 127.0.0.1:8080 是我在云主机上用 ss + polipo (socks5 转 http) 搭的代理。这样 Tiny Tiny RSS 就可以拉取、更新被“认证”的源了。

主题

给 Tiny Tiny RSS 找了一个看得过去的主题,在后台配置管理处却没有它的踪影。后来在另外一个主题的 FAQ 中发现了缘由。

因为主题版本号和 Tiny Tiny RSS 版本号对不上,有两种办法可以看到版本号

  1. Tiny Tiny RSS 目录里 include/version.php 中写着 define('VERSION_STATIC', '17.4');
  2. 在 Tiny Tiny RSS 的 Web 后台最底部可以看到版本号

主题的 css 文件里写着 /* supports-version:17.1 */,一目了然,非常 dirty 得手动把 17.1 改成 17.4 了(当前该主题在 github 上已更新支持 17.4),问题被粗暴解决,倒没发现什么毛病。

幻觉

下班回家,走进小区,摸到兜里钥匙的时候,忽然意识到,这钥匙扣从好几年前就开始用了。

我有一个上上下下、里里外外红得彻底的马克杯,一个奇怪的域名。杯子比那钥匙扣的存在时间还久些,那域名比杯子的历史还更久些,大概七八年了。

这让我不得不承认时间过得很快,毕竟不仅这些久远的事物在证明这一点,眼下也有,每到周五就会感觉这一周过得很快,到了星期天晚上,那就更了不得了。

博客的上一篇文章是 10 月份,距今已经四五个月,大有可能达到半年不更新的地步。

但是为什么感觉春节距今已经很久了。

大概这就是幻觉。